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