linux驱动之platform总线
第一部分:设备驱动模型
1、总线:bus_type结构体,关键函数是match函数和uevent函数;
总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动,相反,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。
2、设备:struct device结构体,硬件设备在内核驱动框架中的抽象;
(1)device_register用于向内核驱动框架注册一个设备
(2)通常device不会单独使用,而是被包含在一个具体设备结构体中,如struct usb_device
(3)mach-x210.c文件里面提供了s5Pv210开发板所有的平台设备(device)信息,信息存放在结构体指针数组(smdkc110_devices)中,设备信息中包含有数据,通过platform_add_devices将设备信息添加到总线上,做移植的时候需要关心这一部分。
3、驱动:struct device_driver是驱动程序在内核驱动框架中的抽象;
(1)对应于驱动端的leds-s5pv210.c文件,通过platform_driver_register来注册一个驱动设备。
第二部分:platform设备
1、platform总线介绍
platform总线是区别于实体总线USB、 I2C、SPI 、PIC总线的虚拟总线,指扩展到CPU的32位地址线的寻址空间里面的一类设备。平台总线对应地址总线式连接设备,也就是SoC内部集成的各种内部外设。
linux内核platform驱动框架的设计思想:首先数据(设备提供的结构体)和驱动是分开的,同类设备有共性的部分,不同的部分,不同的部分在初始化的即被设置好;共性的部分内核工程师以及设置好;然后在通过一个匹配函数如果内核链表的设备与驱动链表的驱动匹配,则会自动安装驱动,否则不会安装驱动;
(1)平台总线体系的工作流程
第一步:系统启动时在bus系统中注册platform总线(系统自动进行);
第二步:内核移植的人负责提供platform_devices(由驱动工程师提供);
第三步:写驱动的人负责提供platform_driver(由驱动工程师提供);
第四步:plat_form的match函数发现driver和device匹配后,调用driver的probe函数来完成驱动的初始化和安装,然后设备就工作起来了(系统自动进行)。
补充:platform_match函数就是平台总线的匹配方法。该函数的工作方法是:如果有id_table就说明驱动可能支持多个设备,所以这时候要去对比id_table中所有的name,只要找到一个相同的就匹配上了不再找了,如果找完id_table都还没找到就说明每匹配上;如果没有id_table或者每匹配上,那就直接对比device和driver的name,如果匹配上就匹配上了,如果还没匹配上那就匹配失败。
匹配过程:在系统已经注册过设备之后,系统在注册对应的驱动时,驱动和对应的设备通过platform_match函数匹配成功之后调用probe函数(用来注册平台总线中的设备,对应非平台总线中的Init函数),之后应用层就可以通过open/read/write来操作设备。
(2)platform总线的优点
a:可以通过platform总线,可以遍历所有的platform总线设备;platform本质其实也是kset、kobject,具有kobject的特性;
b:实现设备与驱动的分离,通过platform总线,设备与驱动是分开注册的,通过platform总线的probe来随时检测与设备匹配的驱动,如匹配上即进行这个设备的驱动注册;
c:由于上面这个优势,一个驱动可以供同类的几个设备使用;
(3)平台总线的管理
platform工作体系都定义在drivers/base/platform.c中
platform总线的两个结构体platform_device和platform_driver
platform总线的两个接口platform_driver_register(系统注册platform成功成功之后,在sys/bus/platform/devices目录下可以找到注册的设备) 和 platform_driver_unregister