最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

【Leo的手記】Linux設備驅動程序手記4-平臺設備驅動

2023-07-14 12:36 作者:神棍技術宅Leo  | 我要投稿

1.平臺設備驅動

對于通用的設備驅動程序,將業(yè)務邏輯和具體的硬件資源分開是一個很方便且整潔的設計思想。在Linux系統(tǒng)內核源碼的設計中,提供了一套被稱為平臺設備的設備類型,該類型并不對應于某一類物理設備,而是對系統(tǒng)設備的一類抽象。平臺設備驅動分為platform_driver和platform_device兩大類實現(xiàn)并統(tǒng)一掛載于platform設備總線上,以實現(xiàn)對業(yè)務邏輯和硬件資源的分離。其思路為,platform_driver提供了對于邏輯操作的實現(xiàn),platform_device由著具體的硬件實現(xiàn)在使用時加載注冊到系統(tǒng)之中。platform_device中提供對所需硬件資源的描述,該platform_device將被platform設備總線在其加載時匹配到對應的platform_driver并觸發(fā)platform_driver的probe方法,并提供一類方法能使得platform_driver能夠獲得當前所觸發(fā)的platform_device中的相關資源描述信息。最終實現(xiàn)硬件初始化與具體操作。

在Linux系統(tǒng)內核源碼中,platform_device和platform_driver的定義均以結構體的形式所確定。如下

platform_device結構體

platform_driver結構體

其中,device_driver結構體定義如下

2.平臺設備總線如何匹配platform_device和platform_driver

平臺設備總線使用著兩個鏈表,分別為用于存儲設備的dev和用于存儲驅動的drv,在注冊platform_device或platform_driver時,會被分別放入對應的鏈表。在platform_device或者platform_driver進行注冊時,會對對方鏈表中的成員進行一一比較。如果匹配成功,則會調用平臺設備驅動中的probe方法。而匹配規(guī)則如下:

  • 先使用platform_device中的driver_override成員去匹配platform_driver中的driver成員中的name成員。

  • 再使用platform_device中的name成員去匹配platform_driver中的id_table成員。

  • 最后匹配platform_device中的name成員去匹配platform_driver中的driver成員中的name成員。

3.注冊平臺設備和平臺設備驅動

分別實現(xiàn)platform_device和platform_driver結構體,按照匹配規(guī)則對相應的結構體成員進行賦值。最后通過platform_device_register和platform_driver_register方法向系統(tǒng)注冊平臺設備和平臺設備驅動。需要注意的是,由于平臺設備所提供的分離特性便于復用驅動代碼,所以最好是將platform_device和platform_driver的實現(xiàn)編譯為不同的內核模塊。

platform_device示例代碼如下

該代碼僅僅包含了注冊平臺設備的過程,沒有實現(xiàn)任何資源的定義。

對應的平臺設備驅動如下

分別編譯兩份內核模塊。

編譯完成后,分別加載模塊并查看內核日志。為了驗證平臺設備的匹配過程,我們分別以先驅動后設備以及先設備后驅動的加載方式加載兩模塊。


先加載平臺設備驅動后加載平臺設備

可以看到,平臺設備驅動程序先注冊成功,然后在加載注冊平臺設備時,先觸發(fā)了設備探針,執(zhí)行了probe方法,然后提示平臺設備注冊完成。

先加載平臺設備后加載平臺設備驅動

可以看到,先是在加載平臺設備后內核日志輸出平臺設備注冊成功,在加載平臺驅動時,觸發(fā)了設備探針。這便是平臺設備與驅動之間互相匹配的過程。而在日志中我們可以看出,在卸載平臺設備驅動或卸載設備時,remove方法會被調用。事實上,當platform_driver存在于內核并卸載與其匹配的platform_device時,會觸發(fā)對應驅動程序的remove方法,而在platform_device未被卸載而卸載platform_driver時,將會卸載每一個platform_device。

4.平臺設備資源的傳遞

對于platform_device,通常是需要指定一些資源描述信息,用以提供給platform_driver進行有針對性的初始化操作。因此如何將資源的描述與定義內置到相應的驅動中,并傳遞到對應的平臺設備驅動,則是一個需要處理的問題。

在Linux平臺設備驅動框架下,platform_device可以通過其resource成員來定義所使用的硬件資源。 其resource成員是struct resource類型的數(shù)組,struct resource定義如下

通常,我們關注它的start,end和flags成員,分別表示資源起始值,結束值和資源類型。start和end的具體含義隨flags的不同具有不同的確切定義。如下

  • flags為IORESOURCE_MEM時,start和end表示設備所占據(jù)的內存的起始地址與結束地址。

  • flags為IORESOURCE_IRQ時,start和end表示設備所使用的中斷號的開始值和結束值(左閉右閉)

而在platform_driver中,可以使用platform_get_resource方法進行資源的獲取。其函數(shù)原型如下

  • dev:指向platform_device結構的指針,表示平臺設備。

  • type:資源的類型,如IORESOURCE_MEM

  • index:資源的索引

我們在上一個代碼中進行修改,添加資源。代碼如下

platform_device代碼

platform_driver代碼

編譯后,運行結果如下

運行結果1
運行結果2

可以看到,平臺設備驅動在匹配時,通過probe方法傳參得到的platform_device句柄獲取了其資源。

5.平臺設備其他信息的傳遞

在驅動程序對設備進行操作時,其所需的資源并非只是對于硬件資源的一些定義,另有譬如一些額外的配置信息需要傳遞,這一類的數(shù)據(jù)可以借用resource進行表示但其語義性差。Linux平臺設備結構中提供了platform_data的支持。其可由驅動進行自定義。在使用時可以只存放一個結構體指針。解析時根據(jù)指針進行解析。該成員位于platform_device的device成員中的driver_data成員。該成員是void類型的指針。

我們可以在上一個例子的基礎上通過driver_data傳遞一些額外的數(shù)據(jù),示例代碼如下

以上代碼定義了一個自定義的結構體,封裝為一個頭文件leotest.h被platform_device和platform_driver所包含。

在platform_device中,添加對應數(shù)據(jù)的定義。

而在platform_driver中,通過成員的引用獲取其地址。

運行結果如下

6.通過平臺設備總線創(chuàng)建字符設備

我們可以通過平臺設備實現(xiàn)對于字符設備的動態(tài)注冊。在此我們實現(xiàn)一組平臺設備及其驅動。在驅動中管理和維護設備號,在設備中實現(xiàn)對資源的定義。

在此實現(xiàn)一種暫時不需要定義資源的字符設備的實現(xiàn),代碼如下

platform_driver實現(xiàn)

platform_device實現(xiàn)

將platform_device復制一份,并修改其name成員,作為第二個platform_device。

將platform_driver和兩個platform_device交叉編譯后放入SD卡,插入F1c200s核心板中,加載platform_driver。如下圖

可以看到,內核模塊得到了正確的加載,但是相應的class并沒有創(chuàng)建,然后加載第一個platform_device

發(fā)現(xiàn)class得到了創(chuàng)建,同時在/dev目錄下也出現(xiàn)了leotest63的設備,加載第二個platform_device后,系統(tǒng)中創(chuàng)建了第二個leotest設備

當我們卸載platform_driver時,所有的設備和設備類都會被銷毀

由此可以實現(xiàn)通過平臺設備總線實現(xiàn)對設備的管理。


【Leo的手記】Linux設備驅動程序手記4-平臺設備驅動的評論 (共 條)

分享到微博請遵守國家法律
涿州市| 汤阴县| 鹤庆县| 德安县| 甘洛县| 东山县| 海阳市| 敖汉旗| 杭州市| 青田县| 抚顺市| 昌邑市| 崇义县| 淮北市| 宁乡县| 聂拉木县| 临洮县| 广德县| 哈密市| 平遥县| 肇州县| 米泉市| 巴中市| 定边县| 永州市| 郸城县| 砀山县| 镇原县| 资源县| 澄迈县| 襄城县| 鄢陵县| 疏勒县| 息烽县| 安阳县| 金溪县| 五台县| 大丰市| 吴旗县| 钦州市| 内黄县|