linux驅動之platform匯流排
第一部分:裝置驅動模型
1、匯流排:bus_type結構體,關鍵函式是match函式和uevent函式;
匯流排將裝置和驅動繫結,在系統每註冊一個裝置的時候,會尋找與之匹配的驅動,相反,在系統每註冊一個驅動的時候,會尋找與之匹配的裝置,而匹配由匯流排完成。
2、裝置:struct device結構體,硬體裝置在核心驅動框架中的抽象;
(1)device_register用於向核心驅動框架註冊一個裝置
(2)通常device不會單獨使用,而是被包含在一個具體裝置結構體中,如struct usb_device
(3)mach-x210.c檔案裡面提供了s5Pv210開發板所有的平臺裝置(device)資訊,資訊存放在結構體指標陣列(smdkc110_devices)中,裝置資訊中包含有資料,通過platform_add_devices將裝置資訊新增到總線上,做移植的時候需要關心這一部分。
3、驅動:struct device_driver是驅動程式在核心驅動框架中的抽象;
(1)對應於驅動端的leds-s5pv210.c檔案,通過platform_driver_register來註冊一個驅動裝置。
第二部分:platform裝置
1、platform匯流排介紹
platform匯流排是區別於實體匯流排USB、 I2C、SPI 、PIC匯流排的虛擬匯流排,指擴充套件到CPU的32位地址線的定址空間裡面的一類裝置。平臺匯流排對應地址匯流排式連線裝置,也就是SoC內部整合的各種內部外設。
linux核心platform驅動框架的設計思想:首先資料(裝置提供的結構體)和驅動是分開的,同類裝置有共性的部分,不同的部分,不同的部分在初始化的即被設定好;共性的部分核心工程師以及設定好;然後在通過一個匹配函式如果核心連結串列的裝置與驅動連結串列的驅動匹配,則會自動安裝驅動,否則不會安裝驅動;
(1)平臺匯流排體系的工作流程
第一步:系統啟動時在bus系統中註冊platform匯流排(系統自動進行);
第二步:核心移植的人負責提供platform_devices(由驅動工程師提供);
第三步:寫驅動的人負責提供platform_driver(由驅動工程師提供);
第四步:plat_form的match函式發現driver和device匹配後,呼叫driver的probe函式來完成驅動的初始化和安裝,然後裝置就工作起來了(系統自動進行)。
補充:platform_match函式就是平臺匯流排的匹配方法。該函式的工作方法是:如果有id_table就說明驅動可能支援多個裝置,所以這時候要去對比id_table中所有的name,只要找到一個相同的就匹配上了不再找了,如果找完id_table都還沒找到就說明每匹配上;如果沒有id_table或者每匹配上,那就直接對比device和driver的name,如果匹配上就匹配上了,如果還沒匹配上那就匹配失敗。
匹配過程:在系統已經註冊過裝置之後,系統在註冊對應的驅動時,驅動和對應的裝置通過platform_match函式匹配成功之後呼叫probe函式(用來註冊平臺匯流排中的裝置,對應非平臺匯流排中的Init函式),之後應用層就可以通過open/read/write來操作裝置。
(2)platform匯流排的優點
a:可以通過platform匯流排,可以遍歷所有的platform匯流排裝置;platform本質其實也是kset、kobject,具有kobject的特性;
b:實現裝置與驅動的分離,通過platform匯流排,裝置與驅動是分開註冊的,通過platform匯流排的probe來隨時檢測與裝置匹配的驅動,如匹配上即進行這個裝置的驅動註冊;
c:由於上面這個優勢,一個驅動可以供同類的幾個裝置使用;
(3)平臺匯流排的管理
platform工作體系都定義在drivers/base/platform.c中
platform匯流排的兩個結構體platform_device和platform_driver
platform匯流排的兩個介面platform_driver_register(系統註冊platform成功成功之後,在sys/bus/platform/devices目錄下可以找到註冊的裝置) 和 platform_driver_unregister