日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...

發布時間:2023/12/19 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的關聯(包括與父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鏈表,實現結構體間的關聯。
  • 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等)。

    如下圖即為這幾個模塊間的結構體之間的關聯。我們具體以幾個方面說明:

  • 通過全局變量devices_kset,將所有創建的device變量,通過其對應的kobject鏈接至devices_kset中;
  • device對應的kobject通過sysfs_dirent結構體的關聯,實現為該device在sysfs文件系統下創建對應的目錄、子目錄、子文件等內容,同時通過kobj_type實現對該device屬性的讀寫操作(show/store)
  • 通過指針實現xxx_device、device之間的關聯。
  • 以上即是device模塊內部結構體以及device、driver、bus、kobject、sysfs之間的關聯。其實針對device相關的創建以及注冊,也就是建立上述所說模塊間的關聯(上面沒有說明與class模塊的關聯,另外此處沒有說明sysfs系統中文件是如何訪問的,感興趣的可參考該文章LINUX SYSFS文件系統分析之四 文件處理及相關系統調用分析)。

    device模塊初始化

    由之前的分析我們知道,所有注冊的設備是匯聚至devices_kset變量的list鏈表下的,而devices_kset是一個全局變量,因此其應該是在設備模塊初始化中進行創建。下面我們來分析下device模塊的初始化接口,該接口名稱為devices_init,該接口主要實現如下功能(流程圖如下):

  • 調用kset_create_and_add創建kset類型的全局變量devices_kset,并在sysfs文件系統的根目錄下創建devices目錄,并設置其kobj_type為kset_ktype;
  • 調用kobject_create_and_add創建kobject類型的全局變量dev_kobj,并根據對應的kobject,在sysfs文件系統的根目錄下創建dev目錄;
  • 調用kobject_create_and_add在dev_kobj下創建子kobject類型的全局變量sysfs_dev_block_kobj,并根據對應的kobject,在sysfs文件系統的dev/目錄下block子目錄
  • 調用kobject_create_and_add在dev_kobj下創建子kobject類型的全局變量sysfs_dev_char_kobj,并根據對應的kobject,在sysfs文件系統的dev/目錄下char子目錄
  • 以上內容即為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的私有變量(即device_private類型的變量,用于與bus、driver等進行關聯)
  • 設置device的名稱
  • 調用kobject_add實現在sysfs的devices目錄下創建該設備對應kobject對應的目錄以及kobj_type的設置等;
  • 為設備的屬性,在sysfs中創建對應的文件(屬性包括該設備私有屬性,該設備所屬class定義的通用設備默認屬性、該設備所屬bus定義的通用設備默認屬性);
  • 若該設備存在設備號,則在sysfs文件系統下的/dev目錄下創建與該設備的鏈接,并調用devtmpfs_create_mknod,為該設備創建設備文件(若devtmpfs被編譯進內核的情況)。若devtmpfs未被編譯進內核,則在該接口調用kobject_uevent,將該設備對應kobject添加的事件發送給應用層后,應用層的udev/mdev接收后,則會根據該設備的設備id屬性,為其創建設備文件(通過mknod系統調用)
  • 若該設備屬于某一個class,則完成class與設備間的kobject的鏈接操作;
  • 調用bus_add_device接口,完成設備與總線間通過內嵌鏈表成員與鏈表頭的關聯,同時完成設備與總線的kobject互相鏈接。
  • 調用bus_probe_device,為該添加的設備,在已注冊的驅動鏈表中進行匹配與綁定操作,這一部分的操作與上一篇介紹的driver添加時的綁定類似(不同點為driver添加時,是遍歷所有已注冊的設備,而device添加時,是遍歷所有已注冊的驅動),本章不再贅述,讀者可自行跟蹤代碼查看。
  • 以上即是device_add、device_register這兩個接口的主要內容(電源管理等一些內容此處未做深入說明)。

    device注銷接口device_unregister分析

    device的注銷過程即是device注冊的反過程,執行的操作無非是刪除創建的文件及目錄、取消設備驅動的綁定、取消設備與總線的關聯、取消設備與class的關聯等,此處不再細說。

    至此完成device相關接口的分析。

    總結

    以上是生活随笔為你收集整理的linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。