王曉君 王星 李玉瑩
摘要:如今的驅動程序已經無法滿足越來越多的高度集中的片上系統SOC的要求。本文主要敘述了基于嵌入式 Linux的platform驅動程序的設計方法和應用開發過程。在platform總線架構下溫濕度采集驅動設計的基礎上,詳細闡述了嵌入式 Linux下platform總線驅動設計中的platform總線、platform設備及platform驅動注冊和卸載等,并驗證設備驅動的正確性。
關鍵詞:platform總線;platform設備;platform驅動
中圖分類號:TP316文獻標識碼:A
Platform的管理是在Linux基礎之上完成。platform 在Linux 設備模型中管理外設資源和系統的外圍設備。引入platform之后更加便于管理。platform驅動架構有利于這些設備驅動的改寫、維護與擴展,提高設備驅動開發[1]的效率。因而,在此基礎上完成了驅動設計的溫度和濕度采集的實驗。
1 platform總體設計
Linux設備驅動負責設備的維護和實現,如:電源管理、熱插拔、對象生命周期、用戶空間和內核空間[2]的交互等。設備驅動主要是用于驅動程序的編寫和管理,但是實現相對復雜。總線、設備、驅動就是設備驅動模型的三個主要部分,[35]其組織關系總結為:
(1)devices:描述了設備如何連接系統;
(2)drivers:系統中可用的驅動;
(3)buses:負責匹配設備與驅動,連接到每個總線上;
(4)classes:設備功能類。
1.1 platform總線
platform 總線在內核中用platform_bus_type 結構表示,其實platform_bus_type就是一個關于platform的實例,platform總線啟動時由platform_bus_init()進入,具體調用函數的流程如下。
圖1 platform總線流程圖
Fig.1 platform bus flow processes
1.2 platform設備與platform驅動
分析設備使用platform_device 和驅動使用platform_driver,并在此基礎上對其進行詳細的分析和闡述。
其中針對platform_device,首先在需要包含頭文件platform_device.h的頭文件,然后設計一個命名為platform_device的結構體。結構體中必須包含設備平臺的名稱name,設備所需要的id號,并且需要一個用于設置相關項的內置的結構體,還需要結構體包含大的數量和資源指針,以及驅動設備的相關的匹配列表id_table表。
其中針對platform_driver,也必須包含頭文件platform_device.h,然后設計一個命名為platform_driver的結構體。結構體中必須包含設備平臺中platform的探測函數probe,與之相反的就是卸載platform的函數remove,platform需要對電源進行管理,包括電源的的設備和狀態的選擇,并且需要一個用于設置相關項的內置的結構體,還需要結構體包含大的數量和資源指針,以及總線設備的相關的列表id_table表。
2 platform總線架構下溫濕度驅動實現
2.1 設備平臺資源
在tiny4412相關的硬件設備中對其進行驅動程序的開發和設計,從而進一步的調試和完善platform總線架構的溫濕度采集驅動。溫度傳感器采用DHT11直接外接到嵌入式GPB4引腳上,通過溫度采集驅動控制外圍設備,控制臺實現溫濕度的采集。Platform總線架構需要一整套系統的的設計開發過程:首先需要對總線platform bus進行初始化,將 platform_device注冊到內核,然后再把 platform 設備掛到 platform bus(虛擬總線)上。最后注冊并編寫 platform 的驅動程序,實現兩者的綁定。
2.2 實現platform設備
platform 設備是注冊到 platform 總線的,使用 struct platform_device 定義平臺設備,通過platform_device_alloc()初始化函數中調用 platform_device_add()完成設備向內核注冊,設備注冊成功后,platform 總線會有 tiny4412dht11 的設備。platform設備定義及注冊核心代碼如下:
static int __init platform_dev_init(void)
{int ret;
my_dht11_dev=platform_device_alloc("platform_dht11",1);
ret = platform_device_add(my_dht11_dev);
if(ret) platform_device_put(my_dht11_dev);
return ret;
}
2.3 實現platform驅動
platform驅動定義結構體xing_dht11_drv,核心代碼如下所示:
struct platform_driverdevice_dht11_drv = {
.probe =xing_dht11_probe,
.remove =xing_ dht11_remove,
.driver = {
.owner =the_module,
.name = "platform_dht11",
},
};
在tiny4412_dht11_driver中tiny4412_dht11_probe()主要完成查詢系統中是否有相應設備,如果檢測到相應設備,則說明初始化完成。溫濕度采集驅動采用register_chrdev()向內核注冊驅動,實現溫濕度采集的open(),read()等功能,在read()函數中實現溫濕度的讀取。tiny4412_dht11_probe()核心代碼為:
驅動,并能與platform_dht11設備建立連接,能在控制臺上打印溫濕度采集結果。結果如圖2所示:
圖2 溫濕度采集結果
Fig.2Temperature and humidity collection results
3 結語
基于嵌入式Linux的platform驅動設計與應用中實現了在API上獲取設備中的信息,將SOC上的設備添加到虛擬總線上,使得總線到設備到驅動的順序模式到更加廣泛的使用,驅動代碼的編寫和放置位置可以與其他硬件代碼的隔離開來。溫濕度采集中關于驅動程序的設計和調試,證明了platform驅動的移植性良好,而且具有很高的可拓展性。
參考文獻:
[1]李樺,高飛,孫磊.嵌入式Linux設備驅動程序研究[J].微計算機信息,2010,26(14):6870.
Linux中用戶空間與內核空間的通信實現[J].微機發展,2005(05):7576+130.
[2]宋寶華.Linux 設備驅動開發詳解[M].人民郵電出版社,2008.0824.
[3]趙波,高真香子,項伯陽,等.Linux platform驅動架構的解析與應用[J].大連工業大學學報,2013,32(01):7174.
[4]周德榮,夏齡.Linux platform驅動架構實現機制研究與應用[J].赤峰學院學報(自然科學版),2010,26(10):2830.
[5]李建文,李外云,劉宏博,等.基于TinyOS2.x的溫濕度傳感器的底層驅動與應用[J].單片機與嵌入式系統應用,2013,13(07):2831.
作者簡介:王曉君(1973),男,河北張家口人,教授。
*通訊作者:王星