一、 Platform_device和Platform_driver
platform總線是Linux內核中的一個虛擬總線,它使得設備的管理更加簡單化。目前大部分的驅動都是用platform總線來寫的。 platform總線模型的各個部分都是繼承自Device模型(姑且這麼說吧),它在系統內實現了個虛擬的總線,即platform_bus,如果你的 設備需要platform總線管理,那麼就需要向系統中註冊platform設備及其驅動程序。就像前面所介紹的那樣,platform總線分爲 platform_bus, platform_device 和platform_driver幾個部分,他們的接口定義在<linux/platform.h>頭文件中。
Platform_device和Platform_driver是從Linux 2.6起引入了一套新的驅動管理和註冊機制,在現在的Linux中大部分的設備驅動,都可以使用這套機制, 設備用Platform_device表示,驅動用Platform_driver進行註冊。而我們在現在的內核中(我下載的是2.6.35的內核中已經用這種方式實現),而我們常見的module_init()卻不是那麼常見,不說遠了,回到主題。
platform driver機制和傳統的device driver 機制(通過driver_register函數進行註冊)相比,一個十分明顯的優勢在於platform機制將設備本身的資源註冊進內核,由內核統一管理,在驅動程序中使用這些資源時通過platform device提供的標準接口進行申請並使用。這樣提高了驅動和資源管理的獨立性,並且擁有較好的可移植性和安全性(這些標準接口是安全的)。
內核中platform設備用結構體platform_device定義在kernel\include\linux\platform_device.h中,
struct platform_device {
const char * name;//設備名,雖然是一個名,但很重要,device和driver是通過這個name進行匹配。
u32 id;
struct device dev;//由這裏可以看出來,platform是dev的拓展
u32 num_resources;//可用資源數
struct resource * resource;//platform所需要的資源
};
該結構一個重要的元素是resource,存入了最爲重要的設備資源信息,定義在kernel\include\linux\ioport.h中,
struct resource {
const char *name;
unsigned long start, end;
unsigned long flags;
struct resource *parent, *sibling, *child;
};