LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析
sinye56 2024-11-10 11:27 12 浏览 0 评论
本系列前几篇文章链接如下:
《LINUX设备驱动模型分析之三 驱动模块相关(DRIVER)接口分析》
本系列文章涉及sysfs文件系统的内容,如需要了解sysfs的内容,请参考之前写的sysfs相关的文档。
我们已经完成了总线、驱动模块相关接口的分析,本章我们主要对设备模块进行分析。在上面几章的分析中,我们知道注册在总线上的驱动模块对应的kobject是通过bus->p->drivers_kset汇聚至一起,且drivers_kset对应kobject是该总线上注册驱动模块的父kobject或者祖先kobject。而针对device-kobject而言,虽然其依附的bus变量定义device_kset变量(kset类型),但device_kset->kobject与device->kobject两者之间是通过链接方式,实现两者kobject之间的绑定操作。如下为device、bus模块间kobject变量的关联,这两者之间通过sysfs link模式实现kobject的关联。
与之前两章类似,本章也分别从相关数据结构、device模块初始化、device的注册与注销接口分析这三个部分分析device模块。
device模块相关数据结构体分析
Device相关的结构体包括struct device、struct device_private、struct device_type这三个结构体,我们接下来分析这三个结构体
struct device_private结构体分析
该结构体为device结构体的私有变量,该结构体定义如下,该结构体主要实现与bus、driver、父device、所有子device的关联。
struct device_type结构体分析
该结构体为device类型相关的结构体,包含类型的名称、类型对应属性组、该类型的uevent接口、release接口、电源管理相关ops等。如iic_client类型设备,其type为i2c_client_type,而iic_adapter类型的设备,其type为i2c_adapter_type,还有usb_device_type等类型定义。该结构体标识一个设备的类型。
struct device结构体分析
该结构体标识一个设备,其包括几方面的内容:
- 与device的关联(包括与父device、子device的关联,通过链表关联)
- 与class的关联(实现device与class的互相关联)
- 与bus的关联(实现device与bus的互相关联)
- 与driver的关联(实现device与driver的互相关联,包括两个结构体变量的关联以及两个结构体中kobject成员变量的关联)
- 与of模块的关联(主要是存储of的设备节点信息,用于设备树相关的内容)
- 存放platform相关的设备信息(主要供platform模块使用)
device-bus-driver结构体间的关联
上面介绍了device项目的结构体,下面我们介绍这些结构体与bus、driver模块的关联,以下为device、bus、driver三个模块相关结构体之间的关联图,我们下面详细说明下这三个模块之间的关联情况。
- bus与device之间的关联包括两部分:
- bus、device通过klist_devices,实现两个结构体通过内嵌的链表变量实现关联
- bus、device对应的kobject之间互相建立sysfs的kobject的链接,实现kobject之间的关联
- device与driver的关联,device与driver通过内嵌的klist节点以及klist_devices链表,实现结构体间的关联。