Linux驅動模型 裝置

2021-08-21 10:03:17 字數 3994 閱讀 6191

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的屬性 三 三大元件 匯流排 裝置 驅動 匯流排...