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