总线设备驱动模型
在 Linux 中, 将每一个外设的驱动程序分为三个部分: 总线, 设备和驱动 对于同一类别但有细微差别的设备, 提取出公共的驱动部分, 具有差别的部分作为每个设备的设备部分, 而总线则负责驱动与设备之间的匹配 Linux 设备或驱动都会挂载在一种总线上, 如 USB, SPI 等等, 但嵌入式系统中大多外设没有特定的总线, 因此设计了一种虚拟的总线--平台总线
平台设备与平台驱动
平台设备
每一个外设驱动都被分为一个平台设备和一个平台驱动
其中, 平台设备使用 platform_device
结构体表示, 但现在一般使用设备树文件表示
其中的 resource
结构体描述了每个外设独有的数据或资源, 如寄存器所在的内存区域, 对应的中断号等等
平台驱动
平台驱动使用结构体 platform_driver
结构体表示
当平台设备与平台驱动成功匹配时候, 这个平台驱动的 probe
函数会被调用, 主要用于执行设备的初始化任务, 当系统移除设备时候, 会调用相应平台驱动的 remove
函数, 用于执行清除工作
设备与驱动的匹配 - 平台总线
在编写完成设备驱动和平台驱动后, 需要进行匹配才能够正常工作, 匹配的规则为 platform_device.name
与 platform_driver.driver.name
一致
负责匹配工作的就是总线
设备树
设备树可以描述硬件信息和配置, 用来代替 platform_device
中的代码
设备树拥有独立的文件格式和编译工具, 可以与 linux 内核代码分离, 若修改了设备信息, 只需要重新编译和替换设备数, 而无需重新编译内核
- DTS (Device Tree Source): 设备树源代码, 以 .dts
作为文件扩展名的文本文件
- DTB (Device Tree Blob): 设备数的二进制表示形式, 是 DTS 经过编译得到的输出文件
- DTC (Device Tree Compiler): 设备数编译器, 将 DTS 编译成 DTB 或进行反编译
- DTSI (Device Tree Source Include): 设备数源代码的包含文件, 包含设备数源代码的公共部分
基本语法
是一个树形结构, 每一个设备对应一个节点, 每个属性使用键值对的形式表示
设备树与驱动的匹配
这里的设备树取代了上面的设备
匹配规则: platform_driver.driver
中的 of_match_table
中含有 compatible
属性与设备树一致的元素
设备树操作函数
在内核初始化时候, 会将 DTB 转换成可以被内核使用的结构 struct device_node
获得设备树中节点的方式:
获得节点后, 就可以通过 struct property
获得节点中的属性或者直接通过 device
直接获得节点中的各种属性