1.总线驱动模型简介
- 在Linux2.6的设备驱动模型中,关心总线、设备和驱动三个实体。总线将设备和驱动绑定。
- 在嵌入式系统里,SOC系统中集成的独立的外设控制器、挂接在SOC内存空间的外设等却不依附于此类总线。基于该背景,Linux发明了一种虚拟总线,称为platform总线,相应的设备称为platform_device, 而驱动程序称为platform_driver。
2.特点
- 分层结构,将驱动程序分成了平台设备和平台驱动
- 平台设备将设备本身的资源注册进内核,可以由内核统一管理
- 统一了设备驱动模型,使只能电源管理更容易实现
- 可移植性,通用性更好
3.platform设备层编程
- 需要实现结构体struct platform_device
* 初始化struct resource结构变量
* 初始化struct platform_device结构变量
* 向系统注册设备,使用platform_device_register函数
- 设备层API
* platform_device_register:向内核注册一个平台设备
* platform_device_unregister:从内核删除
* platform_add_devices:把devs数组中的num个平台设备结构注册到内核中
4.platform驱动层编程
- 需要实现结构体 struct platform_driver
* 编写探测函数probe
* 编写探测函数remove
* 填充struct platform_driver下struct device_driver driver成员的子成员name, name的值需要和device的name相同
* 调用platform_driver_register函数进行注册
- proble函数框架
* 获取平台设备私有数据
* 获取平台设备占用的物理资源
* 如果是内存资源,则向内核申请物理内存资源,若为中断资源,则进行中断函数注册
* 硬件初始化
* 注册用户空间的接口
- remove函数框架
与probe函数为反过程,注销probe函数注册的资源
- 核心数据结构
struct device_driver
- 核心API
* platform_driver_register:向内核注册一个平台驱动结构
* platform_driver_unregister:把指针的平台设备从内核删除
* platform_get_resource:获取物理资源结构地址
* platform_get_irq:从平台设备指针的资源中获取中断号