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