Jaguar.Yuan 的Linux驅動之行——Platform驅動框架介紹(一)

在進行正式的大型驅動之前,有必要先看一點基礎的結構,而這些結構在前面的較爲簡單的驅動程序中已經出現,所以這裏有必要單獨抽時間來看看,加強學習。至於後面所講到的大型驅動,除USB外有單獨的框架,其它驅動也不外乎是總線、設備這些基本方法的應用,實現更爲複雜的功能。
一、
Platform_devicePlatform_driver

platform總線是Linux內核中的一個虛擬總線,它使得設備的管理更加簡單化。目前大部分的驅動都是用platform總線來寫的。 platform總線模型的各個部分都是繼承自Device模型(姑且這麼說吧),它在系統內實現了個虛擬的總線,即platform_bus,如果你的 設備需要platform總線管理,那麼就需要向系統中註冊platform設備及其驅動程序。就像前面所介紹的那樣,platform總線分爲 platform_bus, platform_device 和platform_driver幾個部分,他們的接口定義在<linux/platform.h>頭文件中。

Platform_devicePlatform_driverLinux 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;

};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章