platform平台总线
随笔--platform平台总线
何为平台总线--为了方便管理扩展到CPU32位地址空间的设备
总线只是一种机制,一种管理方式,真正的起关键作用的是LED驱动框架
关键点:
- platform平台总线的目的、意义
- platform自己本身的构建和工作原理
- 如何使用平台总线来组织设备和驱动
platform平台总线介绍
####何为平台总线
(1)相对于usb、pci、i2c等物理总线来说,platform总线是虚拟的、抽象出来的
(2)CPU与外部通信的2种方式:地址总线式连接(LED 串口 DM9000等可以直接通过寄存器操控)和专用接口式连接(USB Nand等)。 平台总线对应地址总线式连接设备
专用接口其实就是对应usb、pci、i2c等物理总线,就是通过这些物理总线跟外部连接的。那么扩展到CPU32位地址空间的设备
怎么办?扩展到CPU32位地址空间的设备是不对应具体的一种的这种物理总线,所以我们就给他发明了平台总线
思考:为什么要有平台总线?总线其实就是为了USB、I2C、PCI这些设备设计的,扩展到CPU32位地址空间的设备其实是没有总线这种概念的。但是为了避免有一部分设备有总线有一部分设备没有总线的管理不便,所以干脆一罐子全部打倒,给所有的设备都规定都有总线。平台总线的发明其实就是为了给那些本来不需要总线的设备来连接
####平台总线下的两个主要结构体
(1)platform工作体系都定义在drivers/base/platform.c
中
(2)两个结构体:platform_device
和platform_driver
(3)两个接口函数:platform_device_register
和platform_driver_register
platform平台总线工作原理
第一、系统启动时在bus系统中注册platform,主要内容是platform_bus_type中的match方法的注册;
第二、我们注册写好的设备和驱动;
第三、platform的match函数发现driver和device匹配后,调用driver的probe函数来完成驱动的初始化和安装
####启动时注册platform总线
platform总线的注册是由platform_bus_init函数完成的,主要的内容是注册一个bus_type结构体类型的变量
![)
详细分析点击这里系统启动时在bus系统中注册platform
(1)每种总线(不光是platform,usb、i2c那些也是)都会带一个match方法,match方法用来对总线下的device和driver进行匹配
理论上每种总线的匹配算法是不同的,但是实际上一般都是看name的
(2)platform_match
函数就是平台总线的匹配方法。该函数的工作方法是:如果有id_table
就说明驱动可能支持多个设备。所以这时候要去对比id_table
中所有的name,只要找到一个相同的就匹配上了不再找了,如果找完id_table
都还没找到就说明每匹配上;如果没有id_table或者每匹配上,那就直接对比device和driver的name,如果匹配上就匹配上了,如果还没匹配上那就匹配失败
可能先有驱动再有设备,也有可能先有设备再装的驱动
platform设备和驱动的注册过程
以led为例
两个主要结构体:
(1)platform_device
(2)platform_driver
两个主要函数:
(1)platform_device_register
(2)platform_driver_register
platform设备注册过程:
(1)platdata:平台设备的特有平台数据,其实就是设备注册时提供的设备有关的一些数据(譬如设备对应的gpio、使用到的中断号、设备名称等)
(2)这些数据在设备和驱动match之后,会由设备方转给驱动方。驱动拿到这些数据后,通过这些数据得知设备的具体信息,然后来操作设备
(3)这样做的好处是:驱动源码中不携带数据,只负责算法(对硬件的操作方法)。之前写的驱动可以单独运行是因为单独的驱动就包含了硬件信息,这是不适宜的。现代驱动设计理念就是算法和数据分离,这样最大程度保持驱动的独立性和适应性
platform驱动注册过程:
到代码实践环节中再分析
(1)match函数
(2)probe函数
总结(1)
- 从意义上看,platform总线的发明为了便于管理扩展到CPU32位地址空间的设备,也为了能够统一管理系统中的所有设备(总线其实就是为了USB、I2C、PCI这些设备设计的,扩展到CPU32位地址空间的设备其实是没有总线这种概念的)
- 从代码层次上看,platform总线是以kset和kobject为代表的设备驱动模型底层构建起来的的上层,对应的结构体为platform_bus_type,platform_device和platform_driver
- 如何实现:platform平台总线工作原理
platform平台总线代码实践
照猫画虎,以自带的leds-s3c24xx.c为猫
添加led设备和平台设备特有平台数据:
根据前面platform设备注册过程的分析添加设备抽象
分析并移植leds-s3c24xx.c(即led驱动):
程序框架:
暂略,也可以理解了之后自己回顾
leds-s5pv210.c
s5pv210_led_probe:
总结(2)
- 写驱动需要熟悉设备驱动模型,熟悉各种数据结构的成员变量和成员方法的意义,以及各种东西之间的关联。还有就是如果接触到一种新的驱动,要能够分析源代码找到要编写的这个驱动所涉及到的驱动框架是怎么样的,这是需要具备的能力
- 理解并使用数据和算法分离的思想
- 总线这种方式虽然重要,但是它只是一种机制,一种管理方式。真正的起关键作用的是LED驱动框架(就是内核实现一部分,驱动实现一部分)