剛剛過完春節,想問各位適齡男女小青年們:你們被媽媽,爸爸,三大姨,二大姑各種親戚催婚了嗎?有沒有被逼著去相親?反正我是沒去。不過話說回來,“沒吃過豬肉還沒見過豬跑嗎?”。按照慣例,春節這幾天,好多父母趁著自己的兒女都回家過年的時間,趕忙給張羅親事,去年過年回家的時候見著俺村的媒婆張,帶著鳳凰男小李去白富美小美家去相親,這緣分來了啊,擋都擋不住,倆人“王八瞅綠豆”,還真對眼了。隔了沒幾天就閃婚,這結了婚啊,鳳凰男把自己全部家當上交給白富美,白富美每天就是瀟灑的買買買,哪成想這小日子還沒過多久,這瘋狂男就起了外心了,在外面勾搭了一個小三,跟人跑了。結果白富美倒也爽快,離婚!到這兒GAME OVER......
本文引用地址://www.einuk.cn/emb/Column/7560.html
那么剛才的《相親》跟咱們今天的platform模型有啥關系呢?那關系大老鼻子了,聽我細細道來。Platform模型是設備總線驅動模型中的一種,首先咱們先說一下設備總線驅動模型所描述的三個對象?你們大家會說,哪三個對象啊?自然是設備、總線、驅動、他們三個。那么它在platform中的具體化的就是加上個前綴platform,即:
platform驅動模型三個對象:platform總線、platform設備、platform驅動。
----------->明確角色,不管是媒婆張,鳳凰男還是白富美都會有屬于自己的描述信息,都得把屬于自己的必要的信息填充上,才能進行合法的注冊登記。
(1) 媒婆張(平臺總線)platform_bus_type、鳳凰男(平臺設備)、platform_device、白富美(平臺驅動)platform_driver
[1]平臺總線結構體
struct bus_type platform_bus_type = {
.name = "platform", //平臺總線的名稱
.match = platform_match, //設備匹配時調用
.uevent = platform_uevent, //產生事件時調用
};
[2]平臺設備結構體
struct platform_device {
const char *name; //平臺驅動的名字
int id; //設備id,用于在該總線上同名的設備進行編號,如果只 //有一個設備,則為-1
struct device dev; //設備結構體
u32 num_resources; //資源的數量
struct resource *resource;//資源結構體
const struct platform_device_id *id_entry;//平臺設備數組表
};
struct device {
struct bus_type *bus; //總線類型
dev_t devt; //設備號
struct device_driver *driver; //設備驅動
void (*release)(struct device *dev);//刪除設備驅動
};
struct resource {
resource_size_t start; //資源開始
resource_size_t end; //資源結束
unsigned long flags; //資源類型
};
Start與end的含義會隨著flags的不同而不同,例如:常用的flags:IORESOURCE_MEM表示內存,start,end分別表示內存起始及終止;IORESOURCE_IRQ表示中斷號,start,end分別表示中斷號的起始及終止。
[3]平臺驅動結構體
struct platform_driver {
int (*probe)(struct platform_device *); //設備驅動結合函數
int (*remove)(struct platform_device *); //設備驅動分離卸載函數
struct device_driver driver;
const struct platform_device_id *id_table; //平臺設備表
};
struct device_driver {
const char *name; //驅動名稱
struct bus_type *bus; //總線名稱
struct module *owner; //模塊計數
const struct of_device_id *of_match_table;//用于設備樹匹配
struct driver_private *p; //其私有數據
};
------------->登記:男生(或女生)找到紅娘,說給我登記下看看有沒有合適的女生(或男生)
(2) 驅動platform_register_driver();或設備platform_register_device();的注冊,當然注冊的前提是男生女生有自己相應的軟硬件條件,譬如男生有自己的車,房,工資卡等,女生有賢良淑德等,這就需要男女生不斷的進步豐富自己,這就涉及到了對于struct platform_device(男生),struct platform_driver(女生)結構體的成員的填充了,填充完再進行相應的注冊。
[1]int platform_device_register(struct platform_device *pdev);
功能:注冊平臺設備驅動
參數:pdev:平臺設備驅動結構體
返回值:成功:0
失敗:錯誤碼
[2] int platform_driver_register(struct platform_driver*pdrv);
功能:注冊平臺設備驅動
參數:pdrv:平臺設備驅動結構體
返回值:成功:0
失敗:錯誤碼
------------->紅娘撮合:紅娘查看以前登記過的男男女女,看看有沒有合適的八字(name);
(3)struct bus_type中的match函數執行匹配工作;
跟蹤match的源碼,查看源碼實現:
------------->八字合適,男女自行交往,談婚論嫁
(4)進行設備驅動的匹配,執行struct platform_driver中的probe函數匹配;
[1]int (*probe)(struct platform_device *pdev);
功能:設備驅動匹配函數
參數:pdev:平臺設備結構體
返回值:成功:0
失敗:錯誤碼
------------->雙方結婚,男生上交各種資源包含工資及財產
(5)platfrom_get_resource();獲取設備struct platfrom_device中的struct resource資源;
[1]struct resource *platform_get_resource(struct platform_device *dev,
unsigned int type, unsigned int num);
功能:獲取設備資源
參數:dev:平臺驅動
type:獲取的資源類型
num:獲取的資源的編號
返回值:成功:資源結構體首地址
失敗:NULL
------------->男生婚后出軌,跟小三跑路,女生自動離婚(remove),之后男生再進行收尾工作(release)
(6)平臺設備卸載,平臺驅動執行struct platform_driver中的remove成員函數;至此一拍兩散
[1]int (*remove)(struct platform_device *pdev);
功能:移除平臺驅動
參數:pdev:平臺設備結構體
返回值:成功:0
失敗:錯誤碼
三者關系圖: