???万字长文玩转总线设备驱动platform_device与platform_

文章目录二、总线设备里面含有什么结构体? 1.2与结合1.与 如何进行关联1.3.1比对规则1.4 匹配成功后 三.代码示范
前言
总线设备驱动的引入是主要解决资源和驱动的问题,简称分离的思想,如果我们在开发引脚时,只需要更换资源就行了,驱动方面则不需要太大的变动,Linux内核提供了/这个个结构体来进行关联,一个是平台设备,一个是平台驱动,本文章的目的是深究资源与驱动具体是如何进行关联的 。
【???万字长文玩转总线设备驱动platform_device与platform_】一、Linux总线的重要函数 1.1注册与销毁函数
首先,要先了解有什么函数去进行连接之后才能一步步的进行分析
int ster(*pdev)
void (*pdev)
这是两个注册与销毁的函数,我们使用总线设备时需要先进行注册,使用完毕后在进行销毁
1.2获得资源
truct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num)
该函数的作用是返回该dev(平台资源)中某类型(type)资源中的第几个(num):
1.3获得中断
int platform_get_irq(struct platform_device *dev, unsigned int num)
功能:获取该dev用到的第几个中断
1.4通过名字获得资源或者中断
struct resource *platform_get_resource_byname(struct platform_device *dev,unsigned int type,const char *name)int platform_get_irq_byname(struct platform_device *dev, const char *name)
顾名思义,可以通过名字来获取到你想要的那个资源或者中断,至于name是什么,可以后面在介绍
1.5同时注册多个dev
int platform_add_devices(struct platform_device **devs, int num)
通过二维数组存储多个dev,然后一一进行注册
二、总线设备里面含有什么结构体? 1.1从 开始
可以看到,里面有很多属性,重点关注上面几个,这个就是存储资源的结构体,那么,他的结构体存储在哪里呢,在里面 。
1.1.2资源存储
比如我们可以把引脚号放在start里,中断放在flags里面
static struct resource resources[] = {{.start = GROUP_PIN(3,1),.flags = IORESOURCE_IRQ,},{.start = GROUP_PIN(5,8),.flags = IORESOURCE_IRQ,},}
1.2与结合
1.与 如何进行关联
可以说上面这个结构体是连接他们两个的桥梁,通过这个函数来进行比对,继续深入
看到了把,回到我们熟悉的C语言逻辑了,通过这几个变量来进行对比
在这之前要先关注平台驱动里的 结构体
1.3.1比对规则
最先比较:. 和..name
可以设置的,强制选择某个
然后比较:. name和.[i].name
.是“”指针,表示该drv支持若干个,它里面列出了各个的{.name, .},其中的“name”表示该drv支持的设备的名字,是些提供给该的私有数据 。
最后比较.name和..name
.可能为空,
这时可以根据..name来寻找同名的 。
1.4 匹配成功后
当有匹配的时,它的probe函数就会被调用 。
当进行设备卸载后函数则会被调用,我们可以在里面做自己想多的事
三.代码示范 3.1平台设备案例
#include #include #include #include #include #include #include #include #include #include #include #include #include