第一部分:裝置驅動模型
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,device資料資訊是在核心啟動的時候自動註冊(由驅動工程師提供);
第三步:寫驅動的人負責提供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
linux驅動之 led驅動
練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...
linux驅動之塊裝置驅動
塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...
Linux驅動開發之DRM驅動
qq群 852283276 b站 主頁 drm 驅動程式開發 開篇 drm 驅動程式開發 vkms 最簡單的drm應用程式 single buffer drm 驅動是如何建立 fb device 的 linux中的drm 介紹 linux graphic dri 顯示子系統 介紹1 xilinx d...