使用的linux版本是2.6.18
1、概念與重要的資料結構
sysfs是乙個虛擬的檔案系統,這個檔案系統的目錄結構實質上就是核心物件模型樹。
kobject:核心物件,是模型樹中的基本組成單位
53struct kobject ;
kset:物件集合
127struct kset ;
ktype:描述kobject的屬性,可通過對屬性的操作來作一些資訊的獲取或更改
96 struct kobj_type ;
subsystem:子系統,實則上是乙個kset,在高層次的概念
176struct subsystem ;
2、結構圖
《參見ldd3的sysfs部分》關於kset與kobject之間的關係圖。
從該圖可以看出,結構的組成,主要就是kset和kobject來組成各種高層次的結構。
3、bus子系統基本結構
38struct bus_type ;
bus_type內嵌了乙個subsystem subsys,所以bus_type可以看作是乙個類子系統,實則上就是乙個子系統。
通過分析i2c匯流排的註冊過程和對應在sysfs中的目錄結構來看。
bus_type– i2c_bus_type
在/sys/目錄下,看到目錄實際上對應乙個子系統。而我們要在這些子系統下新建一些子系統,對於i2c匯流排,我們要在bus子系統下掛接我們的i2c子系統。通過bus_register(&i2c_bus_type)來完成這一操作。具體的操作實際上就是插入乙個kobject。
(1)對i2c的sub_sys的kobject設定名稱,唯一的名稱,這個名稱會在/sys/bus/下看到。
kobject_set_name(i2c_bus_type.sub_sys.kset.kobject);
(2)然後就是設定這個子系統的父結點,也就是設定這個子系統的父子系統。所有匯流排的父子系統都是
bus_subsys。
i2c_bus_type.sub_sys.kset.kobject.kset= bus_subsys.kset
(3)最後將
i2c_bus_type子系統加入到
bus_subsys集合內的子系統鍊錶中。
i2c_bus_type.sub_sys.kset.kobject.parent= bus_subsys.kset.kobject
add_list_tail(i2c_bus_type.sub_sys.kset.kobject.entry,
bus_subsys.kset.list)
以上的操作,基本上把i2c_bus_type對應的子系統加入到bus_subsys下面了,在/sys/bus/下面可以看到i2c目錄。
在bus_type中可以看到有兩個kset,drivers和devices。這兩個kset屬於i2c子系統下的兩個集合。所以將這兩個kset掛接到i2c子系統下面。
(4)掛接devices到i2c子系統下面,完成後可在/sys/bus/i2c下看到devices目錄
kobject_set_name(devices.kobject,「devices」);
devices.subsys= &i2c_bus_type.sub_sys;
devices.kobject.parent= i2c_bus_type.sub_sys.kset.kobject
add_list_tail(devices.kobject,i2c_bus_type.sub_sys.kset.list);
(5)同理,掛接drivers到i2c子系統下面,完成後可在/sys/bus/i2c下看到drivers目錄
kobject_set_name(devices.kobject,「devices」);
devices.subsys= &i2c_bus_type.sub_sys;
devices.kobject.parent= i2c_bus_type.sub_sys.kset.kobject
add_list_tail(devices.kobject,i2c_bus_type.sub_sys.kset.list);
4、
bus子系統的裝置與驅動
394struct device ;
120struct device_driver ;
註冊驅動程式:
driver_register(&i2c_adapter_driver);
i2c_adapter_driver內嵌了乙個
kobject,也就是說它將以乙個
kobject的模型掛接在系統的模型樹里,在
sysfs中,作為乙個目錄節點。
kobject_set_name(i2c_adapter_driver.kobject,i2c_adatpter_driver.name)
i2c_adapter_driver.kobject.kset= i2c_adapter_driver.bus->sub_sys.kset
add_list_tail(i2c_adapter_driver.kobject,i2c_adapter_driver.kobject.kset.klist)
Linux裝置驅動模型(sysfs)
匯流排模型概述 隨著技術的發展,系統的拓撲結構也越來越複雜,對熱插拔。跨平台移植性的要求越來越高,從linux2.6核心開始提供全新的裝置模型。將所有的驅動掛載到計算機的匯流排上 比如 usb匯流排 當有裝置連線到匯流排上的時候,匯流排能夠感知到,這時系統就會把掛載到匯流排上是所有驅動和裝置匹配。通...
Linux下的sysfs與udev的關係是什麼?
sysfs sysfs 把連線在系統上的裝置和匯流排組織成為乙個分級的檔案,它們可以被從使用者 的空間訪問到。簡單介紹sysfs檔案系統,您可能想知道 sysfs 是怎麼認出系統中存在的裝置以及應 該使用什麼裝置號。對於已經編入核心的驅動程式,當被核心檢測到的時候,會直接 在 sysfs 中註冊其物...
《驅動學習 sysfs檔案系統的編寫》
1.sysfs檔案系統 sysfs檔案系統可以把核心空間的資料 屬性 鏈結等輸出到使用者空間。反過來,使用者也可以通過sysfs檔案系統,往對應的核心空間傳遞資料。例如 echo 1 sys class gpio gpio64 value,就是改變gpio64的值。cat sys class gpi...