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