linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...
本系列前幾篇文章鏈接如下:
《LINUX設備驅動模型分析之一 總體概念說明》
《LINUX設備驅動模型分析之二 總線(BUS)接口分析》
《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-bus-driver結構體間的關聯
上面介紹了device項目的結構體,下面我們介紹這些結構體與bus、driver模塊的關聯,以下為device、bus、driver三個模塊相關結構體之間的關聯圖,我們下面詳細說明下這三個模塊之間的關聯情況。
device間的關聯
此處主要用于說明已創建的設備變量是如何關聯的。它們之間通過鏈表進行鏈接這些設備通過device->p中的klist_children、knode_parent實現父子設備之間的關聯操作。它們的關聯圖如下所示。
device、xxx_device、kobject、sysfs之間的關聯
在之前我們介紹driver模塊的時候,我們也說過driver模塊一般嵌入到更大的結構體中xxx_driver,實現具體類型驅動相關結構體的成員。針對device也是一樣,一般也是嵌入到更大的結構體中(此處我們命名為xxx_device,如spi_device、pci_dev、i2c_client等)。
如下圖即為這幾個模塊間的結構體之間的關聯。我們具體以幾個方面說明:
以上即是device模塊內部結構體以及device、driver、bus、kobject、sysfs之間的關聯。其實針對device相關的創建以及注冊,也就是建立上述所說模塊間的關聯(上面沒有說明與class模塊的關聯,另外此處沒有說明sysfs系統中文件是如何訪問的,感興趣的可參考該文章LINUX SYSFS文件系統分析之四 文件處理及相關系統調用分析)。
device模塊初始化
由之前的分析我們知道,所有注冊的設備是匯聚至devices_kset變量的list鏈表下的,而devices_kset是一個全局變量,因此其應該是在設備模塊初始化中進行創建。下面我們來分析下device模塊的初始化接口,該接口名稱為devices_init,該接口主要實現如下功能(流程圖如下):
以上內容即為device模塊的初始化接口,其完成創建了devices_kset,以便鏈接所有device的kobject,同時在sysfs文件系統下完成/dev、/dev/block、/dev/char、/devices目錄。其中/dev/block、/dev/char目錄下主要用于創建鏈接目錄的,其均是鏈接至/devices目錄下相應device。
執行完devices_init接口后,dev_kobj、sysfs_dev_block_kobj、sysfs_dev_char_kobj
這三個變量的關聯如下所示。
device的注冊與注銷接口分析
以上我們完成了相關結構體的介紹以及結構體之間的關聯介紹,此處我們介紹device的注冊與注銷接口。
device注冊接口device_register分析
該接口主要通過調用device_initialize、device_add接口實現device的初始化以及device的添加操作,我們下面分析下這兩個接口。這三個函數的調用關系如下,可以看到設備注冊的主要工作由device_add接口實現。
device_add接口分析
device_add接口實現的功能即是上述結構體之間的關聯,具體內容包括:
以上即是device_add、device_register這兩個接口的主要內容(電源管理等一些內容此處未做深入說明)。
device注銷接口device_unregister分析
device的注銷過程即是device注冊的反過程,執行的操作無非是刪除創建的文件及目錄、取消設備驅動的綁定、取消設備與總線的關聯、取消設備與class的關聯等,此處不再細說。
至此完成device相關接口的分析。
總結
以上是生活随笔為你收集整理的linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wpf开发仿真3d软件_web 3d 与
- 下一篇: 第二代捅破天技术加持!华为P60系列海报