一個現實的linux裝置和驅動通常需要掛接在一種匯流排上,對於本身依附於PCI/USB/IIC/SPI等的裝置而言,這自然不是問題。但是在嵌入式系統裡面,SOC系統中整合的獨立的外設控制器、掛接在SOC記憶體空間的外設等確不依附於此類匯流排。基於這一背景,linux發明了一種虛擬匯流排,稱為platform匯流排,相應的裝置稱為platform_device,而驅動成為 platform_driver.這樣就本所有的驅動都統一採用了匯流排、裝置、驅動的架構思想,無論是有匯流排(IIC/USB/PCI...)掛載的裝置驅動,還是沒有的,都可以使用一個裝置驅動模型。
注意:所謂的platform_device並不是與字元裝置、塊裝置、網路裝置並列的概念,而是Linux系統提供的一種附加手段,例如,在s3c6410處理器中,把內部整合的IIC/RTC/SPI/LCD、看門狗等控制器都歸納為platform_device,而它們本身就是字元裝置。
裝置驅動中引人platform的概念至少有如下兩大好處:
1、使得裝置被掛接在一個匯流排上,因此,符合linux2.6的裝置模型。其結果是,配套的sysfs結點、裝置電影管理都成為了可能。
2、隔離的BSP和驅動。在BSP中定義Platform裝置和裝置使用的資源、裝置的具體配置資訊,而在驅動中,只需要通過通用API去擷取資源和資料,做到了板相關的代碼和驅動代碼的分離,使得驅動具有更好的可擴充性和跨平台性。
platform_driver結構體的定義如下:
struct platform_driver {<br />int (*probe)(struct platform_device *);<br />int (*remove)(struct platform_device *);<br />void (*shutdown)(struct platform_device *);<br />int (*suspend)(struct platform_device *, pm_message_t state);//主要用於電源的管理<br />int (*suspend_late)(struct platform_device *, pm_message_t state);<br />int (*resume_early)(struct platform_device *);<br />int (*resume)(struct platform_device *);//主要用於電源的管理<br />struct pm_ext_ops *pm;<br />struct device_driver driver;<br />};
platform_device結構體的定義如下:
struct platform_device {<br />const char* name;<br />intid;<br />struct devicedev;<br />u32num_resources;<br />struct resource* resource;//資源的管理<br />};