platform裝置驅動

2021-09-24 12:59:42 字數 4560 閱讀 5882

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 ...