platform_bus是一種虛擬匯流排,作用就是將裝置資訊和驅動程式進行分離,platform_bus會維護兩條線,一條是裝置,一條是驅動。當乙個裝置被註冊到匯流排上面的時候,匯流排會去搜尋對應的驅動,反之如果驅動被註冊到匯流排,匯流排也會去找對應的驅動。描述裝置資訊的方式有2種,一種是通過手動填充paltform_device結構體的方式進行,另一種是通過裝置樹的方式進行。
platform_device是描述裝置資訊的物件,當我們描述裝置資訊的時候需要做的就是對應進行填充,其結構資訊如下:
//include/linux/platform_device.h
struct platform_device
;
結構體中比較重要的資訊是name,這是和驅動匹配的重要資訊,具體的匹配方式後文會說明。還有就是num_resources描述的是裝置資源數量,resource描述的是裝置資源資訊,下面先介紹這2個成員的具體資訊。
裝置資訊 resource
//include/linux/ioport.h
struct resource
;
通過填充結構體成員的資訊,來描述乙個硬體資源,例如:
//io資源資訊
struct resource res=
;//中斷資源資訊
struct resource res =
;
在ioport.h中也有定義巨集,通過巨集也可填充資源描述資訊
//io資源資訊巨集定義描述
//#define define_res_mem(_start, _size)
struct resource res =
define_res_mem
(0x10000000
,1024);
//中斷資源嘻嘻巨集定義描述
//#define define_res_irq(_irq)
struct resource res =
define_res_irq(10
);
如果存在多個資源,可以通過寫成陣列的方式進行描述
struct resource res=
,[1]
=,[2
]=define_res_irq(11
);}
platform_device的註冊和登出
int
platform_device_register
(struct platform_device *pdev)
;/* 註冊 */
void
platform_device_unregister
(struct platform_device *pdev)
;/* 登出 */
裝置樹(device tree)是一種描述裝置資訊的資料結構,每乙個裝置在裝置樹中是以乙個節點的形式進行表現,linux核心會將裝置樹中的裝置資訊自動構造成platform_device結構,具體的裝置樹格式和含義後續再談,我們先假設有裝置樹檔案如下:
&soc
;/* *** */
};
為何單要留下compatible屬性呢?因為compatible是用來繫結裝置驅動的關鍵所在!
描述驅動方法的物件是platform_driver,其具體結構如下:
//include/linux/device.h
struct platform_driver
;
device_driver結構資訊如下:
//include/linux/device.h
struct device_driver
;
裝置和驅動匹配的方式一共有三種,乙個驅動是可以匹配多個裝置的,platform_bus使用不同的成員來進行匹配以達到對應的匹配資訊能力
1、of_match_table
其結構如下:
//include/linux/mod_devicetable.h
struct of_device_id
;
我們在寫驅動的時候,通過填充of_device_id結構體,裝置樹載入之後就可以與驅動進行匹配了,填充方法如下:
struct of_device_id of_tbl=
,,,}
;
注意:最後的{},是一定要加的,這個是核心判斷陣列已經結束的標誌!!!
2、id_table
對於使用struct resource編寫的裝置資訊,使用id_table進行匹配,其結構如下:
struct platform_device_id
;
填充方法如下:
static
struct platform_device_id demo=
,,,}
;
3、name
如果platform_driver和struct resource編碼的platform_device是一一匹配的,我們還可以使用device_driver中的name來進行匹配
platform_driver的註冊和登出
int
platform_driver_register
(struct platform_driver *drv)
;/* 註冊 */
intplatform_driver_unregister
(struct platform_driver *drv)
;/* 登出 */
ps:3種匹配方式的優先順序
///drivers/base/platform.c
struct bus_type platform_bus_type =
;export_symbol_gpl
(platform_bus_type)
;static
intplatform_match
(struct device *dev,
struct device_driver *drv)
從中不難看出優先順序of_match_table > id_table > name
在建立乙個簡單的字元裝置的**基礎上,編寫2個驅動分為platform_device和platform_driver。
platform_device.c
#include
#include
#include
module_license
("gpl");
static
struct resource csdn_resource=
,};static
void
csdn_device_release
(struct device *dev)
static
struct platform_device csdn_device =
;static __init int
csdn_device_init
(void
)static __exit void
csdn_device_exit
(void
)module_init
(csdn_device_init)
;module_exit
(csdn_device_exit)
;
platform_driver.c
/* ohters code */
static
intcsdn_probe
(struct platform_device *csdn_driver)
result =
csdn_cdev_add()
;if(result <0)
result =
csdn_device_create()
;if(result <0)
return result;
}static
intcsdn_remove
(struct platform_device *csdn_driver)
struct platform_driver csdn_driver=,}
;static __init int
csdn_driver_init
(void
)static __exit void
csdn_driver_exit
(void
)/* ohters code */
platform裝置驅動框架
這裡簡單總結下platform匯流排的裝置驅動 的框架。1 建立資料夾platform 2 在資料夾下編寫裝置檔案device.c include include include include include include module author wjb module license dua...
linux驅動之platform裝置驅動實驗
platform機制 把硬體相關的 固定的,如板子的網絡卡 中斷位址 和驅動 會根據程式作變動,如點哪乙個燈 分離開來,即要編寫兩個檔案 dev.c和drv.c platform裝置和platform驅動 platform會存在 sys bus 裡面,如下圖所示,platform目錄下會有兩個檔案,...
platform裝置驅動之LED(misc裝置)
一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 3 核心版本 linux 2.6.35 4 交叉編譯工具鏈 arm none linux gnueabi 二 詳細 led device.c include include include include include ...