首先你需要為soc的各個功能部分定義他的一些資源.例如可用於訪問的暫存器位址.中斷號,dma什麼的。然後將這些資源(resource) 作為 platform 的dev .通過platform_add_devices函式將你定義的paltform_device變數註冊到系統的dev裡面.。或者你可以象我這樣將你需要的驅動新增:
static struct platform_device *smdk2410_devices __initdata = ;
這樣你的硬體的資訊和資源就會註冊到系統中.
說了半天,這回該說這有什麼用了。
你編寫的驅動或者移植別人的驅動,一般在驅動裡有這樣的**,例如:
static struct platform_driver s3c2410sdi_driver = ,
};看到 .name= "s3c2410-sdi",這條關鍵的語句沒有??,它和我在上面註冊的&s3c_device_sdi,裡的device的名稱是一致的.我這裡展開我的s3c_device_sdi,的內容 :
/* sdi */
static struct resource s3c_sdi_resource = ,
[1] = ,
[2] = };
struct platform_device s3c_device_sdi = ;
在驅動程式裡的init**大致如下:
static int __init s3c2410sdi_init(void)
用platform_driver_register 向系統註冊這個驅動程式.而這個函式會在s3c2410sdi_driver的資訊裡提取name為搜尋內容,搜尋系統註冊的device中有沒有這個 platform_device。 如果有註冊,那麼接著會執行platform_driver 裡probe函式.在這裡顯然是s3c2410sdi_probe函式在probe函式裡,用的最多和剛才platform_device有關的語句是platform_get_resource,這條語句用於獲取 platform_device裡的resource資料.例如對映的io位址,中斷等.剩下等得就是ioremap,和 request_irq等的事情了
******************************==
從2.6版本開始引入了platform這個概念,在開發底層驅動程式時,首先要確認的就是裝置的資源資訊,例如裝置的位址,在2.6核心中將每個裝置的資源用結構platform_device來描述,該結構體定義在kernel/include/linux/platform_device.h中,
struct platform_device ;
該結構乙個重要的元素是resource,該元素存入了最為重要的裝置資源資訊,定義在kernel/include/linux/ioport.h中,
struct resource ;
下面舉個例子來說明一下:
在kernel/arch/arm/mach-pxa/pxa27x.c定義了
tatic struct resource pxa27x_ohci_resources = ,
[1] = ,
};這裡定義了兩組resource,它描述了乙個usb host裝置的資源,第1組描述了這個usb host裝置所占用的匯流排位址範圍,ioresource_mem表示第1組描述的是記憶體型別的資源資訊,第2組描述了這個usb host裝置的中斷號,ioresource_irq表示第2組描述的是中斷資源資訊。裝置驅動會根據flags來獲取相應的資源資訊。
有了resource資訊,就可以定義platform_device了:
static struct platform_device ohci_device = ,
.num_resources = array_size(pxa27x_ohci_resources),
.resource = pxa27x_ohci_resources,
};有了platform_device就可以呼叫函式platform_add_devices向系統中新增該裝置了,這裡的實現是
static int __init pxa27x_init(void)
這裡的pxa27x_init必須在裝置驅動載入之前被呼叫,可以把它放到
subsys_initcall(pxa27x_init);
驅動程式需要實現結構體struct platform_driver,參考kernel/driver/usb/host/ohci-pxa27.c,
static struct platform_driver ohci_hcd_pxa27x_driver = ,
};在驅動初始化函式中呼叫函式platform_driver_register()註冊platform_driver,需要注意的是ohci_device結構中name元素和ohci_hcd_pxa27x_driver結構中driver.name必須是相同的,這樣
在platform_driver_register()註冊時會對所有已註冊的所有platform_device中的name和當前註冊的platform_driver的driver.name進行比較,只有找到相同的名稱的platfomr_device才能註冊
成功,當註冊成功時會呼叫platform_driver結構元素probe函式指標,這裡就是ohci_hcd_pxa27x_drv_probe。
當進入probe函式後,需要獲取裝置的資源資訊,獲取資源的函式有:
struct resource * platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);
根據引數type所指定型別,例如ioresource_mem,來獲取指定的資源。
struct int platform_get_irq(struct platform_device *dev, unsigned int num);
獲取資源中的中斷號。
struct resource * platform_get_resource_byname(struct platform_device *dev, unsigned int type, char *name);
根據引數name所指定的名稱,來獲取指定的資源。
int platform_get_irq_byname(struct platform_device *dev, char *name);
根據引數name所指定的名稱,來獲取資源中的中斷號。
詳解platform device 系列函式
platform device 系列函式,實際上是註冊了乙個叫platform的虛擬匯流排。使用約定是如果乙個不屬於任何匯流排的裝置,例如藍芽,串列埠等裝置,都需要掛在這個虛擬匯流排上。driver base platform.c platform裝置宣告 struct device platfor...
platform device記憶體,中斷,時鐘
platform device記憶體資源使用步驟 1.res platform get resource pdev,ioresource mem,0 platform get resource 返回資源物件 2.request mem region res res end res start 1,d...
關於platform device一些講解
從2.6版本開始引入了platform這個概念,在開發底層驅動程式時,首先要確認的就是裝置的資源資訊,例如裝置的位址,在2.6核心中將每個裝置的資源用結構platform device來描述,該結構體定義在kernel include linux platform device.h中,struct ...