设备的大管家class
- 使用
class对硬件设备进行分类管理 class与用户空间守护进程udev/mdev协作,自动创建设备文件
设备驱动模型框图
- Linux内核启动的过程中会调用
classes_init()函数在sysfs文件系统中创建一个名为class的文件夹。 - 我们在驱动中调用
class_create()函数,在class文件夹下创建一个指定名称的分类文件夹(比如指定分类名为xxx)。 - 我们继续在驱动中调用
device_create()函数,在指定的分类中又创建一个表示设备的文件夹(比如指定设备名为yyy)。调用这个函数的时候,我们会传入设备号,所以这个设备文件夹下会生成一个名为dev的设备属性文件存放设备号。 device_create()函数除了创建/sys/class/xxx/yyy这个设备目录,还会调用kobject_uevent()函数给用户空间的udev/mdev守护进程发送一个新增设备的消息。udev/mdev收到这个消息后,会去读取/sys/class/xxx/yyy/dev属性文件中的设备号,然后调用mknod()函数在/dev目录下创建一个名为yyy的设备节点。
相关函数
创建一个class
class_create宏
include/linux/device.h
#defineclass_create(owner,name)\({\staticstructlock_class_key__key;\__class_create(owner,name,&__key);\})structclass*__class_create(structmodule*owner,constchar*name,structlock_class_key*key);- owner:一般设置为
THIS_MODULE - name:
kobject对象的名字,也即是目录的名称 struct class里面间接继承了kobject对象
在class下添加kobject对象
device_create()函数
include/linux/device.h
structdevice*device_create(structclass*class,structdevice*parent,dev_tdevt,void*drvdata,constchar*fmt,...);- class:新构建的
class - parent:新
kobject对象的上一层节点,一般为NULL - dev_t:属性文件记录该设备号
- drvdata:私有数据,一般为
NULL - fmt:变参参数,一般用来设置
kobject对象的名字