宋宝华《linux设备驱动开发详解》——platform设备驱动(12.2)
以下读书笔记,整理于宋宝华《linux设备驱动开发详解》一书。
1、piatform总线出现的原因
- 在SOC集成的独立外设控制器、挂接在soc内存空间的外设不依附与此类总线(PCI、USB、I2C、SPI等),因此linux发明了一种虚拟的总线,成为platform总线。
- 相应的设备称为platform_device,驱动称为platform_driver。
2、结构体定义
3、填写platform_device和注册
- 对于linux2.6而言,对platform_device的定义通常在BSP的板文件中实现,即把platform_device归纳为一个数组,由platform_add_devices()函数统一注册;
- 对于linux3.x之后,人们舍弃以编码的方式去填写platform_device和注册,而倾向于根据设备树中的内容自动展开platform_device。
4、将globalfifo作为platform设备步骤
(1)将globalfifo移植为platform驱动;
- 给驱动套一层platform_driver的外壳。
(2)在板文件中添加globalfifo这个platform设备。
- 需要在板文件arch/arm/mach-<soc名>/mach-<板名>.c中添加相应的代码。
- 最终通过类似于platform_add_devices函数将此platform_device注册进系统。
5、platform设备资源和数据
(1)结构体定义
(2)对resource的定义一般在BSP的板文件中进行,而具体的设备驱动中通过platform_get_resourcr()来获取。
(3)除了可以在BSP中定义资源外,还可以附加一些数据信息,放在platform_data中。
- platform_data的形式由每个结构体自定义。可以是结构体,也可以是其他。
- http://blog.****.net/oqqhutu12345678/article/details/78507455中可知,它是void* 类型的。
6、在设备驱动中引入platform概念的好处
(1)符合linux2.6以后内核的设备模型,使得配套的sysfs节点、设备电源管理成为可能;
(2)隔离BSP和驱动。
(3)使得一个驱动支持多个设备实例。