一開接觸設(shè)備樹,我就不知道設(shè)備樹與驅(qū)動(dòng)的關(guān)系,設(shè)備樹是在內(nèi)核3.0以后才有的。不過3.0以前的和3.0以后的驅(qū)動(dòng)其實(shí)變化不大。
驅(qū)動(dòng)的開發(fā)方法可以分為三種:傳統(tǒng)方法,總線方法,設(shè)備樹方法。這篇文章圍繞點(diǎn)亮一顆LED來說明這三種方法。
驅(qū)動(dòng)流程分為5個(gè)部分:
1、分配
2、設(shè)置
3、注冊(cè)file_operation
4、入口
5、出口
一、傳統(tǒng)方法
傳統(tǒng)方法就是簡單粗暴方法,就是將IO設(shè)置,驅(qū)動(dòng)放在同一個(gè)文件(drv.c)。
drv.c:定義引腳信息
drv.c:驅(qū)動(dòng)中的open函數(shù)
drv.c:驅(qū)動(dòng)中的close函數(shù)
drv.c:file_operations結(jié)構(gòu)體
為上層應(yīng)用提供open(),write(),read(),close()。
drv.c:入口函數(shù)-申請(qǐng)?jiān)O(shè)備號(hào),創(chuàng)建設(shè)備節(jié)點(diǎn)
其中register_chrdev():申請(qǐng)?jiān)O(shè)備號(hào)。
class_create():創(chuàng)建一個(gè)設(shè)備類。
device_create():創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn),路徑:/dev/led
drv.c:出口函數(shù)-注銷設(shè)備,注銷設(shè)備節(jié)點(diǎn)
其中unregister_chrdev():通過主設(shè)備號(hào),注銷設(shè)備號(hào)
device_destroy():注銷設(shè)備節(jié)點(diǎn)
class_destroy():注銷設(shè)備類
傳統(tǒng)方法:
優(yōu)點(diǎn):操作簡單
缺點(diǎn):不易擴(kuò)展,每次修改需要重新編譯驅(qū)動(dòng)
二、總線方法
在kernel 3.0之前都是采用總線的方法實(shí)現(xiàn)驅(qū)動(dòng)與設(shè)備之間的聯(lián)系。把驅(qū)動(dòng)跟設(shè)備分開。
其主要理解幾個(gè)結(jié)構(gòu)體:
①跟設(shè)備有關(guān)的結(jié)構(gòu)體:structplatform_device{};
②跟驅(qū)動(dòng)有關(guān)的結(jié)構(gòu)體:structplatform_driver{};
還要理解其中包含的兩個(gè)結(jié)構(gòu)體:
-> struct device_driver{};
-> structplatform_device_id{};
要記住一句話:在match的時(shí)候:優(yōu)先匹配id_table的name,不匹配。再匹配driver的name
其中
dev.c:進(jìn)行設(shè)備的引腳定義,定義resouce結(jié)構(gòu)體,供驅(qū)動(dòng)獲取資源。
dev.c:注冊(cè)platform_device結(jié)構(gòu)體
dev.c:入口函數(shù)-注冊(cè)設(shè)備
其中platform_device_register():在總線上注冊(cè)一個(gè)設(shè)備。
dev.c:出口函數(shù)-注銷設(shè)備
其中platform_device_unregister():在總線上注銷一個(gè)設(shè)備。
對(duì)于驅(qū)動(dòng)來說,需要稍微修改一下:
drv.c:增加probe函數(shù)和remove函數(shù),其中:
probe()函數(shù):充當(dāng)傳統(tǒng)方法的init函數(shù)
remove()函數(shù):充當(dāng)傳統(tǒng)方法的exit函數(shù)
platform_get_resource():獲取設(shè)備中資源,比如引腳定義。
drv.c :入口函數(shù)和出口函數(shù)修改
將傳統(tǒng)方法的file_operations{};結(jié)構(gòu)體改為platform_driver{};結(jié)構(gòu)體
其中platform_driver_register():向總線注冊(cè)一個(gè)設(shè)備。
platform_driver_unregister():向總線注銷一個(gè)設(shè)備。
platform總線中的match()函數(shù)是設(shè)備與驅(qū)動(dòng)匹配的函數(shù),我們看看這個(gè)函數(shù)的實(shí)現(xiàn),就是匹配設(shè)備與驅(qū)動(dòng)的名字一不一致。函數(shù)如下:
總線方法:
優(yōu)點(diǎn):易擴(kuò)展
缺點(diǎn):代碼冗余多,需要重新編譯設(shè)
三、設(shè)備樹方法
在kernel 3.0以及之后的版本,都是采用設(shè)備樹的方法實(shí)現(xiàn)驅(qū)動(dòng)與設(shè)備之間的聯(lián)系。將總線方法的設(shè)備改為設(shè)備樹實(shí)現(xiàn),解決了總線方法中代碼冗余多的問題。
設(shè)備樹方法只需要在總線方法的基礎(chǔ)上稍微修改一下。
dts:添加設(shè)備節(jié)點(diǎn):
drv: probe修改,其中通過函數(shù)of_property_read_s32()獲取設(shè)備樹的資源。
設(shè)備樹:
優(yōu)點(diǎn):易擴(kuò)展,不需要重新編譯(替換設(shè)備樹),無冗余代碼
缺點(diǎn):稍微復(fù)
最多技術(shù)干貨內(nèi)容請(qǐng)穩(wěn)步到“電子發(fā)燒友網(wǎng)”公眾號(hào),回復(fù)資料即可免費(fèi)獲取一份技術(shù)資料,在這里每天可以獲取最專業(yè)、最前沿的電子技術(shù)。
-
DIY
+關(guān)注
關(guān)注
176文章
891瀏覽量
351188 -
Linux驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
43瀏覽量
10149
原文標(biāo)題:【分享】DIY愛好者倒騰LED時(shí),總結(jié)了幾點(diǎn)Linux驅(qū)動(dòng)開發(fā)方法
文章出處:【微信號(hào):elecfans,微信公眾號(hào):電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
找ARM嵌入式linux學(xué)習(xí)愛好者
歡迎加電子、LED愛好者群299238480
【職業(yè)電子愛好者】(群號(hào)256099730),電子愛好者 DIY電子高手群
電子愛好者的苦惱!
無線電愛好者叢書-穩(wěn)定電源

評(píng)論