1、裝置描述
linux
系統中的每個裝置由乙個
struct device
描述。};
2、裝置註冊、登出
int device_register(struct device * dev);
void device_unregister(struct device * dev);
一條匯流排也是個裝置,也必須按裝置註冊。
3、裝置屬性
裝置屬性由
struct
device_attribute
描述。struct device_attribute ;
建立屬性
int __must_check device_create_file(struct device *device,
struct device_attribute * entry);
刪除屬性
void device_remove_file(struct device * dev, struct device_attribute * attr);
4、參考例項
#include
#include
#include
#include
#include
static void my_dev_release(struct device *dev)
struct device my_dev = ;
static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf)
static device_attr(
dev, s_irugo, mydev_show, null);
static int __init my_device_init(void)
static void my_device_exit(void)
module_init(my_device_init);
module_exit(my_device_exit);
module_license("dual bsd/gpl");
makefile
ifeq ($(kernelrelease),)
kerneldir ?= /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
all:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
$(make) -c $(kerneldir) m=$(pwd) clean
else
obj-m := device.o
endif
驗證結果:
在/sys/devices目錄下建立my_dev目錄。
test@ubuntu2018:/sys/devices/my_dev$ ls -l
total 0
-r--r--r-- 1 root root 4096 jul 13 09:59 dev (屬性檔案)
drwxr-xr-x 2 root root 0 jul 13 09:59 power
-rw-r--r-- 1 root root 4096 jul 13 09:59 uevent
test@ubuntu2018:/sys/devices/my_dev$ cat dev
this is my device!
解除安裝該核心模組時,執行release所對應的函式。
5、參考例項
1)#include
#include
#include
#include
#include
static char *version = "revision: 1.0";
static int my_match(struct device *dev, struct device_driver *driver)
static void my_bus_release(struct device *dev)
struct device my_bus = ;
struct bus_type my_bus_type = ;
export_symbol(my_bus);
export_symbol(my_bus_type);
static ssize_t show_bus_version(struct bus_type *bus, char *buf)
static bus_attr(version, s_irugo, show_bus_version, null);
static int __init my_bus_init(void)
static void my_bus_exit(void)
module_init(my_bus_init);
module_exit(my_bus_exit);
module_license("dual bsd/gpl");
makefile
ifeq ($(kernelrelease),)
kerneldir ?= /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
all:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
$(make) -c $(kerneldir) m=$(pwd) clean
else
obj-m := bus.o
endif
2)#include
#include
#include
#include
#include
extern struct device my_bus;
extern struct bus_type my_bus_type;
static void my_dev_release(struct device *dev)
struct device my_dev = ;
static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf)
static device_attr(
dev, s_irugo, mydev_show, null);
static int __init my_device_init(void)
static void my_device_exit(void)
module_init(my_device_init);
module_exit(my_device_exit);
module_author("andy lau");
module_license("dual bsd/gpl");
makefile
ifeq ($(kernelrelease),)
kerneldir ?= /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
all:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
$(make) -c $(kerneldir) m=$(pwd) clean
else
obj-m := device.o
endif
Linux裝置驅動模型
核心版本 2.6.29 裝置驅動模型框架是linux驅動程式設計的基礎。它通過kobject,kset,ktype等底層資料結構將bus type,device,device driver 等高層資料結構組織起來,形成乙個層次 分類清晰的驅動模型。優點如下 1.重用。將物件抽象為匯流排 驅動 裝置三...
linux驅動模型 裝置
thebasic device structure see the kerneldoc for the struct device.programminginte ce 檢測到裝置的匯流排驅動使用如下函式將裝置註冊到核心 int device register struct device dev 匯...
Linux裝置驅動模型
一 裝置驅動模型 驅動模型提供硬體的抽象,核心可以使用該抽象完成很多重複的工作。這些抽象主要有 電源管理,即插即用裝置支援,與使用者空間的通訊 二 核心資料結構 kobject 通過它可以以樹狀結構來管理裝置 kobj type 用來表示kobject的屬性 三 三大元件 匯流排 裝置 驅動 匯流排...