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