Linux设备驱动模型框架分析(四)——LDDM的高层视图class

类是一个设备的高层视图,抽象出了底层的实现细节。类允许用户空间使用设备所提供的功能,而不关心设备是如何连接的,和它们是如何工作的。类子系统是向用户空间导出信息的最好方法

类的核心数据结构是class,在分析device中介绍过,这个class不如busdevicedriver好理解,我理解它的主要功能是一是设备管理,二是抽象出一类设备的公共属性。

前面分析subsys_private时说过,classbus_type很类似,我们在设备总线驱动模型中创建设备时,要指定它所属的bus,那么在创建类设备的时候也需要指定它所从属的类,class也离不开kobject,因此如果你了解总线设备驱动模型,你就会发现,其实真的都是差不多的东西。

设备驱动一般在注册的时候都会调用此类class的一些函数,主要作用就是在sys目录里面创建一些节点,比如cd/sys/class下面可以看到这一类的设备,如


前面提到过子系统的概念,一个class就是一个subsystem,具象的就是如上图中的inputttyrtc等。进入子系统,子系统下面会有设备,如:


就是一些指向devices目录下的链接,这个有什么用呢?一是如前面所说,提供给用户空间导出信息的方法,例如想找fb0pci总线下是这样的:


不知所云。

devices下是这样的:



还是不知所云。显然class是更方便查找的。

二是udev/mdev使用class可以自动管理设备文件,例如,自动生成/dev下设备节点了,重命名设备节点等。

对于一个新设备,可以注册进一个class也可以不注册进去,如果存在对应class的话注册进去更好。

class



nameclass的名称,会在“/sys/class/”目录下体现。

class_atrrs,该class的默认attribute,会在class注册到内核时,自动在“/sys/class/xxx_class”下创建对应的attribute文件。

dev_groups,该class下每个设备的attribute,会在设备注册到内核时,自动在该设备的sysfs目录下创建对应的attribute文件。

dev_kobj,表示该class下的设备在/sys/dev/下的目录,现在一般有charblock两个,如果dev_kobjNULL,则默认选择char

dev_uevent,当该class下有设备发生变化时,会调用classuevent回调函数。

class_release,用于release自身的回调函数。

dev_release,用于release class内设备的回调函数。在device_release接口中,会依次检查DeviceDevice Type以及Device所在的class,是否注册release接口,如果有则调用相应的release接口release设备指针。

p,见subsys_private


class_attribute


这个类没有什么可说的。见后边对于sysfs的分析。

 

class_interface

当设备添加或移除的时候,调用class_interface预先设置好的回调函数。

node,连入subsys_privateinterfaces的节点。

class,接口所属class

add_dev,设备添加到所属class时调用的回调函数

remove_dev,设备删除时调用的回调函数

将设备从子系统加入或删除时,会遍历subsys_privateinterfaces中的所有class_interface,并调用add_dev/remove_dev


classclass_interfacekobject族的关系





猜你喜欢

转载自blog.csdn.net/chqsy/article/details/80932439