Linux设备驱动模型3——platform平台总线工作原理
以下內(nèi)容源于朱有鵬嵌入式課程的學(xué)習(xí),如有侵權(quán),請(qǐng)告知?jiǎng)h除。
四、platform平臺(tái)總線工作原理1
1、何為平臺(tái)總線?
(1)屬于總線中的一種,相對(duì)于usb、pci、i2c等物理總線來(lái)說(shuō),platform總線是虛擬的、抽象出來(lái)的。
(2)CPU與外部通信的2種方式:地址總線式連接和專用接口式連接(比如nand和cpu的連接)。
- 平臺(tái)總線對(duì)應(yīng)地址總線式連接設(shè)備(也就是SoC內(nèi)部集成的各種內(nèi)部外設(shè))。
(3)思考:為什么要有平臺(tái)總線?
- 為了管理上的方便和統(tǒng)一。
2、平臺(tái)總線下管理的2員大將
(1)platform工作體系都定義在drivers/base/platform.c中。
(2)兩個(gè)結(jié)構(gòu)體:platform_device和platform_driver。
struct platform_device {const char * name; // 平臺(tái)總線下設(shè)備的名字int id;struct device dev; // 所有設(shè)備通用的屬性部分u32 num_resources;// 設(shè)備使用到的resource(IO或者中斷號(hào)等)的個(gè)數(shù)struct resource* resource;// 設(shè)備使用到的資源數(shù)組的首地址const struct platform_device_id* id_entry;// 設(shè)備ID表,很多個(gè)類似的同系列的產(chǎn)品,可以用同一個(gè)驅(qū)動(dòng)/* arch specific additions */struct pdev_archdata archdata;// 自留地,用來(lái)提供擴(kuò)展性的,表示設(shè)備的一些屬性 };
struct platform_driver {int (*probe) (struct platform_device *);// 驅(qū)動(dòng)探測(cè)函數(shù)int (*remove) (struct platform_device *);// 去掉一個(gè)設(shè)備void (*shutdown)(struct platform_device *);// 關(guān)閉一個(gè)設(shè)備int (*suspend) (struct platform_device *, pm_message_t state);//掛起int (*resume) (struct platform_device *);//喚醒struct device_driver driver;// 所有設(shè)備共用的一些屬性const struct platform_device_id *id_table;// 設(shè)備ID表,表示支持哪些設(shè)備 };
(3)兩個(gè)接口函數(shù)
- platform_device_register(一般不使用這個(gè),而是使用platform_driver_register中的probe函數(shù)?有待深入研究),在系統(tǒng)啟動(dòng)時(shí)(見(jiàn)五1(2)),用來(lái)注冊(cè)設(shè)備。
- platform_driver_register,用來(lái)注冊(cè)驅(qū)動(dòng)。
五、platform平臺(tái)總線工作原理2
1、平臺(tái)總線體系的工作流程
(1)第一步:系統(tǒng)啟動(dòng)時(shí),在bus系統(tǒng)中注冊(cè)platform(使得在/sys/bus/目錄有platform)。
(2)第二步:內(nèi)核移植(把硬件的信息寫(xiě)到軟件里)的人負(fù)責(zé)提供platform_device;(即提供板文件,文件里有設(shè)備信息。比如Mach-x210.c)
(3)第三步:寫(xiě)驅(qū)動(dòng)的人負(fù)責(zé)提供platform_driver;(主要是填充結(jié)構(gòu)體并register)
(4)第四步:platform的match函數(shù)發(fā)現(xiàn)driver和device匹配后(通過(guò)name來(lái)匹配),調(diào)用driver的probe函數(shù)來(lái)完成驅(qū)動(dòng)的初始化和安裝,然后設(shè)備就工作起來(lái)了。(這個(gè)是自動(dòng)的)
2、代碼分析:platform總線本身注冊(cè)
? ? ?
(1)每種總線(不光是platform,usb、i2c那些也是)都會(huì)帶一個(gè)match方法,用來(lái)對(duì)總線下的device和driver進(jìn)行匹配。
- 理論上每種總線的匹配算法是不同的,但是實(shí)際上一般都是看name的。
(2)platform_match函數(shù)就是平臺(tái)總線的匹配方法。
- 如果有id_table,則說(shuō)明驅(qū)動(dòng)可能支持多個(gè)設(shè)備;
- 這時(shí)候要去對(duì)比id_table中所有的name,只要找到一個(gè)相同的就匹配上了不再找了,如果找完id_table都還沒(méi)找到就說(shuō)明沒(méi)有匹配上。
- 如果沒(méi)有id_table或者沒(méi)有匹配上,那就直接對(duì)比device和driver的name,如果還沒(méi)匹配上那就匹配失敗。
(3)上面完成了第一步。下面完成第二第三步。(見(jiàn)六)
六、platform平臺(tái)總線工作原理3
1、platform設(shè)備和驅(qū)動(dòng)的注冊(cè)過(guò)程(參考leds-s3c24xx.c文件)
(1)platform_driver_register,驅(qū)動(dòng)部分:
(2)platform_device_register,設(shè)備部分
- 如何找設(shè)備部分?即在板文件定義的設(shè)備信息?
- 通過(guò)名字,即搜索名字。舉個(gè)例子如下(某個(gè)設(shè)備的信息):
- 眾多設(shè)備組成一個(gè)數(shù)組,然后逐個(gè)注冊(cè)。(不能有一個(gè)出錯(cuò)!)
- 對(duì)于linux2.6 arm平臺(tái)而言,對(duì)platform_device的定義通常在bsp的板文件中實(shí)現(xiàn)。
- 板文件將設(shè)備歸納為一個(gè)數(shù)組,最終通過(guò)platform_add_devices()函數(shù)統(tǒng)一注冊(cè)
2、platform_data怎么玩
? ??
- platform_data其實(shí)就是設(shè)備注冊(cè)時(shí)提供的、與設(shè)備有關(guān)的一些數(shù)據(jù)(譬如設(shè)備對(duì)應(yīng)的gpio、使用到的中斷號(hào)、設(shè)備名稱……);
- 這些數(shù)據(jù)在設(shè)備和驅(qū)動(dòng)match之后,會(huì)由設(shè)備方轉(zhuǎn)給驅(qū)動(dòng)方(probe的第一句代碼)。
- 驅(qū)動(dòng)拿到這些數(shù)據(jù)后,通過(guò)這些數(shù)據(jù)得知設(shè)備的具體信息,然后來(lái)操作設(shè)備。
- 這樣做的好處是:驅(qū)動(dòng)源碼中不攜帶數(shù)據(jù),只負(fù)責(zé)算法(對(duì)硬件的操作方法)。
- 現(xiàn)代驅(qū)動(dòng)設(shè)計(jì)理念就是算法和數(shù)據(jù)分離,這樣最大程度保持驅(qū)動(dòng)的獨(dú)立性和適應(yīng)性。
- 注意:leds-s3c24xx是驅(qū)動(dòng)文件,是不會(huì)有設(shè)備信息的,設(shè)備信息在板文件中定義。
3、match函數(shù)的調(diào)用軌跡
4、probe函數(shù)的功能和意義
總結(jié)
以上是生活随笔為你收集整理的Linux设备驱动模型3——platform平台总线工作原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: platform驱动开发套路、DM900
- 下一篇: Linux 设备文件的创建和mdev