日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux设备驱动模型3——platform平台总线工作原理

發布時間:2023/12/20 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux设备驱动模型3——platform平台总线工作原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。


四、platform平臺總線工作原理1

1、何為平臺總線?

(1)屬于總線中的一種,相對于usb、pci、i2c等物理總線來說,platform總線是虛擬的、抽象出來的。

(2)CPU與外部通信的2種方式:地址總線式連接和專用接口式連接(比如nand和cpu的連接)

  • 平臺總線對應地址總線式連接設備(也就是SoC內部集成的各種內部外設)。

(3)思考:為什么要有平臺總線?

  • 為了管理上的方便和統一。

2、平臺總線下管理的2員大將

(1)platform工作體系都定義在drivers/base/platform.c中。

(2)兩個結構體:platform_device和platform_driver。

struct platform_device {const char * name; // 平臺總線下設備的名字int id;struct device dev; // 所有設備通用的屬性部分u32 num_resources;// 設備使用到的resource(IO或者中斷號等)的個數struct resource* resource;// 設備使用到的資源數組的首地址const struct platform_device_id* id_entry;// 設備ID表,很多個類似的同系列的產品,可以用同一個驅動/* arch specific additions */struct pdev_archdata archdata;// 自留地,用來提供擴展性的,表示設備的一些屬性 };

struct platform_driver {int (*probe) (struct platform_device *);// 驅動探測函數int (*remove) (struct platform_device *);// 去掉一個設備void (*shutdown)(struct platform_device *);// 關閉一個設備int (*suspend) (struct platform_device *, pm_message_t state);//掛起int (*resume) (struct platform_device *);//喚醒struct device_driver driver;// 所有設備共用的一些屬性const struct platform_device_id *id_table;// 設備ID表,表示支持哪些設備 };

(3)兩個接口函數

  • platform_device_register(一般不使用這個,而是使用platform_driver_register中的probe函數?有待深入研究),在系統啟動時(見五1(2)),用來注冊設備。
  • platform_driver_register,用來注冊驅動。



五、platform平臺總線工作原理2

1、平臺總線體系的工作流程

(1)第一步:系統啟動時,在bus系統中注冊platform(使得在/sys/bus/目錄有platform)。


(2)第二步:內核移植(把硬件的信息寫到軟件里)的人負責提供platform_device;(即提供板文件,文件里有設備信息。比如Mach-x210.c)



(3)第三步:寫驅動的人負責提供platform_driver;(主要是填充結構體并register)



(4)第四步:platform的match函數發現driver和device匹配后(通過name來匹配),調用driver的probe函數來完成驅動的初始化和安裝,然后設備就工作起來了。(這個是自動的)



2、代碼分析:platform總線本身注冊

? ? ?





(1)每種總線(不光是platform,usb、i2c那些也是)都會帶一個match方法,用來對總線下的device和driver進行匹配。

  • 理論上每種總線的匹配算法是不同的,但是實際上一般都是看name的。

(2)platform_match函數就是平臺總線的匹配方法。

  • 如果有id_table,則說明驅動可能支持多個設備;
  • 這時候要去對比id_table中所有的name,只要找到一個相同的就匹配上了不再找了,如果找完id_table都還沒找到就說明沒有匹配上。
  • 如果沒有id_table或者沒有匹配上,那就直接對比device和driver的name,如果還沒匹配上那就匹配失敗。

(3)上面完成了第一步。下面完成第二第三步。(見六)


六、platform平臺總線工作原理3

1、platform設備和驅動的注冊過程(參考leds-s3c24xx.c文件)

(1)platform_driver_register,驅動部分:




(2)platform_device_register,設備部分

  • 如何找設備部分?即在板文件定義的設備信息?
  • 通過名字,即搜索名字。舉個例子如下(某個設備的信息):


  • 眾多設備組成一個數組,然后逐個注冊。(不能有一個出錯!)
  • 對于linux2.6 arm平臺而言,對platform_device的定義通常在bsp的板文件中實現。
  • 板文件將設備歸納為一個數組,最終通過platform_add_devices()函數統一注冊



2、platform_data怎么玩



? ??


  • platform_data其實就是設備注冊時提供的、與設備有關的一些數據(譬如設備對應的gpio、使用到的中斷號、設備名稱……);
  • 這些數據在設備和驅動match之后,會由設備方轉給驅動方(probe的第一句代碼)
  • 驅動拿到這些數據后,通過這些數據得知設備的具體信息,然后來操作設備。
  • 這樣做的好處是:驅動源碼中不攜帶數據,只負責算法(對硬件的操作方法)。
  • 現代驅動設計理念就是算法和數據分離,這樣最大程度保持驅動的獨立性和適應性。
  • 注意:leds-s3c24xx是驅動文件,是不會有設備信息的,設備信息在板文件中定義。

3、match函數的調用軌跡


4、probe函數的功能和意義


總結

以上是生活随笔為你收集整理的Linux设备驱动模型3——platform平台总线工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。