驱动进化之路:设备树的引入及简明教程

简介: 驱动进化之路:设备树的引入及简明教程

驱动进化之路:设备树的引入及简明教程

设备树的基本概念和产生背景

问题1:

以LED为例,当要更换LED所用的GPIO引脚时,需要修改驱动程序源码,重新编译驱动,重新加载驱动。

问题2:

由于芯片种类繁多,里面包含了各种各样的芯片所有包含了许多用不着的C代码。

根据上面两个问题:引入设备树

设备树只是用来给内核里的驱动程序,指定硬件的信息。比如 LED 驱动,在

内核的驱动程序里去操作寄存器,但是操作哪一个引脚?这由设备树指定。


设备树的语法

d262253d75ee442189812a1be67ce4c5.png

我们需要编写设备树文件(dts: device tree source),它需要编译为

dtb(device tree blob)文件,内核使用的是 dtb 文件。


fd11014f10b04fe6a1e9b6ee1402729e.png

内核对设备树的处理过程

21e63a3f02cc47d08d5bd5b8283dac4d.png

1.dts在PC机上被编译为dtb文件

2.u-boot把dtb文件传给内核

3.内核解析dtb文件,把每个节点都转化为device_node结构体

4.对于某些device_node结构体,会被转换为platform_device

dtb中的每一个节点都被转换为device_node结构体

5634f00ab1c948989ff0f39503310fbc.png

根节点被保存在全局变量of_root中,从of_root开始可以访问到任意节点


哪些设备树节点会被转换为platform_device

1.根节点下含有 compatile 属性的子节点

2.含有特定 compatile 属性的节点的子节点

如果一个节点的 compatile 属性,它的值是这 4 者之一:“simplebus”,“simple-mfd”,“isa”,“arm,amba-bus”, 那 么 它 的 子结点 ( 需 含

compatile 属性)也可以转换为 platform_device。

3.总线 I2C、SPI 节点下的子节点:不转换为 platform_device

某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为 platform_device。

b59ae405bb73471b9fda4260284c6362.png


⚫/mytest 会被转换为 platform_device, 因为它兼容"simple-bus";

它的子节点/mytest/mytest@0 也会被转换为 platform_device

⚫ /i2c 节点一般表示 i2c 控制器, 它会被转换为 platform_device, 在内核

中有对应的 platform_driver;

⚫ /i2c/at24c02 节点不会被转换为 platform_device, 它被如何处理完全由

父节点的 platform_driver 决定, 一般是被创建为一个 i2c_client。

⚫ 类似的也有/spi 节点, 它一般也是用来表示 SPI 控制器, 它会被转换为

platform_device, 在内核中有对应的 platform_driver;

⚫ /spi/flash@0 节点不会被转换为 platform_device, 它被如何处理完全由

父节点的 platform_driver 决定, 一般是被创建为一个 spi_device。


怎么转换为 platform_device

内核处理设备树的函数调用过程,这里不去分析;我们只需要得到如下结论:

◼ platform_device 中含有 resource 数组, 它来自 device_node 的

reg, interrupts 属性;

◼ platform_device.dev.of_node 指向 device_node, 可以通过它获

得其他属性


platform_device 如何与 platform_driver 配对

从设备树转换得来的 platform_device 会被注册进内核里,以后当我们每

注册一个 platform_driver 时,它们就会两两确定能否配对,如果能配对成功

就调用 platform_driver 的 probe 函数。

626fc641a51447379604bed9779e0b63.png


1.最先比较:是否强制选择某个driver

platform_device.driver_override 和 platform_driver.driver.name

可以设置 platform_device 的 driver_override,强制选择某个 platform_driver


2.然后比较:设备树信息

platform_device.dev.of_node 和 platform_driver.driver.of_match_table。

由设备树节点转换得来的 platform_device 中,含有一个结构体:of_node

结构如下:

7c0c92caf39c4ee688aa0c8f41bf8696.png

如果一个 platform_driver 支 持 设 备 树 , 它 的

platform_driver.driver.of_match_table 是一个数组,类型如下

2313f184c8dc41f8b2db9c495851ce87.png

首先,如果 of_match_table 中含有 compatible 值,就跟 dev 的 compatile

属性比较,若一致则成功,否则返回失败;

其次,如果 of_match_table 中含有 type 值,就跟 dev 的 device_type 属性

比较,若一致则成功,否则返回失败;

最后,如果 of_match_table 中含有 name 值,就跟 dev 的 name 属性比

较,若一致则成功,否则返回失败。

而设备树中建议不再使用 devcie_type 和 name 属性,所以基本上只使用设

备节点的 compatible 属性来寻找匹配的 platform_driver。


接下来比较platform_device_id

比较 platform_device. name 和 platform_driver.id_table[i].name,

id_table 中可能有多项。

platform_driver.id_table 是“platform_device_id”指针,表示该 drv

支持若干个 device,它里面列出了各个 device 的{.name, .driver_data},

其中的“name”表示该 drv 支持的设备的名字,driver_data 是些提供给该

device 的私有数据。


最后比较

platform_device.name 和 platform_driver.driver.name

platform_driver.id_table 可能为空,

这 时 可 以 根 据 platform_driver.driver.name 来 寻 找 同 名 的

platform_device。

9ebff2fa5f264376bc818651b0a337bf.png


有些节点不会生成 platform_device,怎么访问它们

内核会把 dtb 文件解析出一系列的 device_node 结构体,我们可以直接访

问这些 device_node。


目录
相关文章
|
存储 Java C++
Python 教程之控制流(9)Python 中的 Switch Case(替换)
Python 教程之控制流(9)Python 中的 Switch Case(替换)
672 0
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
813 0
深入理解InnoDB索引数据结构和算法
|
1月前
|
Kubernetes Cloud Native 持续交付
Docker:轻量级容器化技术解析
Docker:轻量级容器化技术解析
|
Ubuntu Linux
内核实验(六):使用misc框架,实现简单字符设备驱动
本文介绍了如何使用Linux的misc框架来实现一个简单的字符设备驱动程序,包括编写驱动源码、编译、部署以及在Qemu虚拟机中测试驱动程序,展示了如何动态分配次设备号并手动创建设备文件以进行测试。
282 0
内核实验(六):使用misc框架,实现简单字符设备驱动
|
Ubuntu Linux Shell
使用ramdisk启动ubuntu文件系统(pivot_root)
使用ramdisk启动ubuntu文件系统(pivot_root)
|
SQL 关系型数据库 Linux
PostgreSQL基础之psql的使用
PostgreSQL基础之psql的使用
613 0
|
存储 安全 数据安全/隐私保护
iOS App 上架App Store及提交审核详细教程
前四布我们之前都做了,详见这篇博客: 利用Appuploader在window上申请IOS开发所需要的证书及描述文件,我们主要看后面几步。
|
监控 Linux 定位技术
Linux应用开发基础知识——串口应用编程(十一)
Linux应用开发基础知识——串口应用编程(十一)
450 0
Linux应用开发基础知识——串口应用编程(十一)
|
Linux 编译器 C语言
Linux环境下gcc编译过程中找不到名为pthread_create的函数的定义:undefined reference to `pthread_create‘
Linux环境下gcc编译过程中找不到名为pthread_create的函数的定义:undefined reference to `pthread_create‘
521 0
|
网络协议 网络安全 Android开发
公网使用SSH远程连接安卓手机Termux - Android手机服务器
使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不过我们可以开启ssh,使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在安卓手机termux上安装SSH,在电脑上通过SSH远程连接Termux。同时在Termux上做内网穿透,用cpolar创建安全隧道映射22端口,实现在外也可以SSH远程连接Termux,无需公网IP,也不用设置路由器 ,这里使用国产内网穿透工具cpolar简单实现。
326 1
公网使用SSH远程连接安卓手机Termux - Android手机服务器