14.linux-platform机制实现驱动层分离(详解) - 诺谦 - 博客园
Platform机制_小跃_进击-CSDN博客_platform机制
有些设备,特别是嵌入式系统里的设备,是没有总线的,但是按照设备驱动的模型,有个bus好管理很多,所以就虚拟了一个platform的总线,就像设备没爹妈,就给他安排一个爹妈,这个爹妈提供match等函数管理设备。
把硬件资源相关的代码(固定的,如板子的网卡、中断地址)和驱动逻辑(会根据程序作变动,如点哪一个灯)拆分成两部分,用platform总线把两者匹配连接。修改移植的时候只需要动对应的部分,另一部分不需要动。
1) device设备
挂接在platform总线下的设备, platform_device结构体类型,name是匹配的关键
通过platform_device_register()函数把用户定义的platform_device结构体注册到总线中的device链表中
2) driver驱动
挂接在platform总线下,是个与某种设备相对于的驱动, platform_driver结构体类型
通过platform_driver_register()函数把用户定义的platform_driver结构体放到总线的driver链表中.
name是匹配的关键,如果匹配成功,则会调用prob函数
3) platform总线
是个全局变量,为platform_bus_type,属于虚拟设备总线,通过这个总线将设备和驱动联系起来,属于Linux中bus的一种。该platform_bus_type的结构体定义如下所示(位于drivers/base):
match通过两者的name来判断是否匹配
适用platform机制的流程,用户要把device和drive两部分都要做出来
device 部分:
第一步:分配一个platform_device结构体
第二步:设置分配的platform_device结构体,name是必须的、resource是硬件资源需要填入、release为释放函数,需要用户提供
第三步:适用platform_device_register()把platform_device结构体注册进总线
退出时不要忘记删掉注册的资源
第四步:使用module_init()修饰init函数,作为入口
drive部分:
第一步:分配一个platform_drive结构体
第二步:设置结构体,填充probe和remove函数。probe为匹配上就会自动调用的函数,remove为退出自动调用的函数。probe函数内用户想做什么都可以,例子是一个字符设备驱动的建立。最主要是通过platform_get_resource()函数把device部分的资源获取。
退出时用remove函数 把所有注册的资源删掉
第三步:用platform_driver_register()函数把分配的platform_driver()结构体注册进总线
退出时不要忘记删掉注册的资源
第四步:使用module_init()修饰init函数,作为入口
使用的时候,用insmod命令分别安装device和drive两个模块即完成,两者不分先后。