跳转至

总线设备驱动模型

在 Linux 中, 将每一个外设的驱动程序分为三个部分: 总线, 设备和驱动 对于同一类别但有细微差别的设备, 提取出公共的驱动部分, 具有差别的部分作为每个设备的设备部分, 而总线则负责驱动与设备之间的匹配 image.png Linux 设备或驱动都会挂载在一种总线上, 如 USB, SPI 等等, 但嵌入式系统中大多外设没有特定的总线, 因此设计了一种虚拟的总线--平台总线 image.png

平台设备与平台驱动

平台设备

每一个外设驱动都被分为一个平台设备和一个平台驱动 其中, 平台设备使用 platform_device 结构体表示, 但现在一般使用设备树文件表示 image.png 其中的 resource 结构体描述了每个外设独有的数据或资源, 如寄存器所在的内存区域, 对应的中断号等等 image.png

平台驱动

平台驱动使用结构体 platform_driver 结构体表示 image.png 当平台设备与平台驱动成功匹配时候, 这个平台驱动的 probe 函数会被调用, 主要用于执行设备的初始化任务, 当系统移除设备时候, 会调用相应平台驱动的 remove 函数, 用于执行清除工作

设备与驱动的匹配 - 平台总线

在编写完成设备驱动和平台驱动后, 需要进行匹配才能够正常工作, 匹配的规则为 platform_device.nameplatform_driver.driver.name 一致 负责匹配工作的就是总线 image.png

设备树

设备树可以描述硬件信息和配置, 用来代替 platform_device 中的代码 设备树拥有独立的文件格式和编译工具, 可以与 linux 内核代码分离, 若修改了设备信息, 只需要重新编译和替换设备数, 而无需重新编译内核 - DTS (Device Tree Source): 设备树源代码, 以 .dts 作为文件扩展名的文本文件 - DTB (Device Tree Blob): 设备数的二进制表示形式, 是 DTS 经过编译得到的输出文件 - DTC (Device Tree Compiler): 设备数编译器, 将 DTS 编译成 DTB 或进行反编译 - DTSI (Device Tree Source Include): 设备数源代码的包含文件, 包含设备数源代码的公共部分

基本语法

是一个树形结构, 每一个设备对应一个节点, 每个属性使用键值对的形式表示 image.png image.png

设备树与驱动的匹配

这里的设备树取代了上面的设备 匹配规则: platform_driver.driver 中的 of_match_table 中含有 compatible 属性与设备树一致的元素 image.png

设备树操作函数

在内核初始化时候, 会将 DTB 转换成可以被内核使用的结构 struct device_node 获得设备树中节点的方式: image.png 获得节点后, 就可以通过 struct property 获得节点中的属性或者直接通过 device 直接获得节点中的各种属性