刚刚过完春节,想问各位适龄男女小青年们:你们被妈妈,爸爸,三大姨,二大姑各种亲戚催婚了吗?有没有被逼着去相亲?反正我是没去。不过话说回来,“没吃过猪肉还没见过猪跑吗?”。按照惯例,春节这几天,好多父母趁着自己的儿女都回家过年的时间,赶忙给张罗亲事,去年过年回家的时候见着俺村的媒婆张,带着凤凰男小李去白富美小美家去相亲,这缘分来了啊,挡都挡不住,俩人“王八瞅绿豆”,还真对眼了。隔了没几天就闪婚,这结了婚啊,凤凰男把自己全部家当上交给白富美,白富美每天就是潇洒的买买买,哪成想这小日子还没过多久,这疯狂男就起了外心了,在外面勾搭了一个小三,跟人跑了。结果白富美倒也爽快,离婚!到这儿GAME OVER...... 那么刚才的《相亲》跟咱们今天的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 失败:错误码 三者关系图: 更多好内容可关注:华清远见 微信公众号,关注即送价值 399 的嵌入式相关电子书!
|