linux 設備樹與驅動的關系


https://blog.csdn.net/jiaFANluo/article/details/92796366

 

  一開接觸設備樹,我就不知道設備樹與驅動的關系,設備樹是在內核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之前都是采用總線的方法實現驅動與設備之間的聯系。把驅動跟設備分開。

其主要理解幾個結構體:

①跟設備有關的結構體:struct platform_device{};

②跟驅動有關的結構體:struct platform_driver{};

    還要理解其中包含的兩個結構體:struct device_driver{};      struct platform_device_id{};

要記住一句話:在match的時候:優先匹配id_table的name,不匹配。再匹配driver的name

 

其中

dev.c:進行設備的引腳定義

 

dev.c:注冊platform_device結構體

 

dev.c:入口函數-注冊設備

 

dev.c:出口函數-注銷設備

 

對於驅動來說,需要稍微修改一下:

drv.c:增加probe函數和remove函數,其中函數platform_get_resource()就是過去設備中資源,比如引腳定義。

 

drv.c :入口函數和出口函數的修改

 

platform總線中的match()函數是設備與驅動匹配的函數,我們看看這個函數的實現,就是匹配設備與驅動的名字一不一致。函數如下:

 

總線方法的優點:易擴展

                  缺點:代碼冗余多,需要重新編譯設備

三、設備樹方法

在kernel 3.0以及之后的版本,都是采用設備樹的方法實現驅動與設備之間的聯系。將設備改為設備樹實現,解決了總線方法中代碼冗余多的問題。

設備樹方法只需要在總線方法的基礎上稍微修改一下。

dts:添加設備節點:

 

drv: probe修改,其中通過函數of_property_read_s32()獲取設備樹的資源。

 

總線方法的優點:易擴展,不需要重新編譯(替換設備樹),無冗余代碼

                  缺點:稍微復雜
————————————————
版權聲明:本文為CSDN博主「飯仔DIY」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiaFANluo/java/article/details/92796366


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM