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平台总线工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: platform驱动开发套路、DM900
- 下一篇: 《大师谈游戏设计——创意与节奏》【笔记二