1. 面向对象分离硬件资源驱动思想

背景<span class=<h-char class=
在早期的嵌入设备和计算机系统中<span class=<h-char class=
思想<span class=<h-char class=
- 模块化<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 将硬件相关的代码从系统的其他部分中分离出来<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 形成独立的模块<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ 驱动模块<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ 。 - 抽象层<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 引入硬件抽象层<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ HAL<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 使得上层软件可以不直接操作硬件<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 而是通过一层抽象的接口来进行<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 封装<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 使用面向对象的编程思想<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 将硬件的操作封装成类或对象<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 这样可以更容易管理和重用代码<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
技术细节<span class=<h-char class=
- 使用类的继承和多态来实现不同硬件的抽象和具体实现<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 提供统一的接口来访问硬件资源<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 降低了对具体硬件的依赖<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
例子<span class=<h-char class=
- 模块化<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 创建一个独立的LED驱动模块<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 而不是将LED操作代码直接嵌入到应用层代码中<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 抽象层<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 定义一个抽象的LED类<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 包含打开<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 、 关闭等方法<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
|
2. Platform Device 平台总线模型

随着硬件设备的复杂性增加<span class=<h-char class=
通过这种模型<span class=<h-char class=
思想<span class=<h-char class=
- 平台设备<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 将硬件设备抽象为平台设备<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ Platform Device<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 这些设备通过平台总线<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ Platform Bus<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 连接到系统中<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 平台驱动<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 相应地<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 驱动程序也被抽象为平台驱动<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ Platform Driver<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 它们通过平台总线匹配到相应的设备<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
技术细节<span class=<h-char class=
- 在Linux内核中<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , struct platform_device和struct platform_driver是关键数据结构<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 设备和驱动通过设备树或者是硬编码的方式注册到平台总线上<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 使用总线驱动框架<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ 如I2C<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 、 SPI等<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 来进一步抽象硬件接口<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
|
例子<span class=<h-char class=
- 平台设备<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 定义一个平台设备来代表这个LED<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
|
- 平台驱动<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 编写一个平台驱动来操作这个LED<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
|
技术细节<span class=<h-char class=
- 通过平台设备和平台驱动<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 系统可以自动匹配设备和驱动<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 led_probe函数在匹配成功后初始化LED<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , led_remove函数在设备卸载时清理资源<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
匹配过程
平台设备与驱动的匹配过程大致如下<span class=<h-char class=
设备注册<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 当内核启动或模块加载时<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 平台设备<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ ( struct platform_device<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 被注册到平台总线<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ ( platform_bus<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 上<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 当内核启动或模块加载时<span class=<h-char class=
驱动注册<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 平台驱动<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ ( struct platform_driver<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 也需要注册到平台总线上<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 平台驱动<span class=<h-char class=
设备树解析<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 如果使用设备树<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 内核会解析设备树文件<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ .dts或.dtb<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 从中获取设备信息<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 并创建相应的平台设备实例<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 如果使用设备树<span class=<h-char class=
匹配尝试<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 内核尝试将注册的驱动与平台总线上的设备进行匹配<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 匹配过程主要遵循以下顺序<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 设备树匹配<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 优先尝试使用设备树匹配规则<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 检查设备的compatible属性与驱动的of_match_table是否匹配<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - ID匹配<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 如果设备树匹配失败<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 尝试使用设备ID匹配<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 名称匹配<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 最后<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 尝试使用驱动和设备的名称匹配<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 设备树匹配<span class=<h-char class=
- 内核尝试将注册的驱动与平台总线上的设备进行匹配<span class=<h-char class=
成功匹配<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 一旦找到匹配的设备和驱动<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 内核会调用驱动的probe方法<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 probe方法将接收到匹配的struct device<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ 实际上是一个( struct platform_device<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 驱动可以在这个方法中初始化设备<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 一旦找到匹配的设备和驱动<span class=<h-char class=
资源分配<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 在
probe方法中<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 驱动可以访问设备的资源<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ 如IO内存<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 、 IRQ等<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 这些资源通常是通过设备树或平台设备注册时提供的<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 在
设备绑定<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 如果
probe方法成功<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 设备将绑定到驱动<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 设备现在可以正常工作<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
- 如果
失败处理<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : - 如果匹配失败或
probe方法失败<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 内核会记录错误信息<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 驱动将不会绑定到设
- 如果匹配失败或
3. 设备树<span class=<h-char class=“ bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >( Device Tree<span class=<h-char class=“ bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >)

背景<span class=<h-char class=
随着SoC<span class=<h-char class=
思想<span class=<h-char class=
- 解耦硬件描述<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 将硬件的描述从内核代码中分离出来<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 形成独立的设备树描述文件<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ .dts, .dtsi<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ 。 - 动态配置<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 设备树提供了一种动态的<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 、 可配置的方式来描述系统硬件<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
技术细节<span class=<h-char class=
- 设备树使用一种类似JSON的格式来描述硬件结构<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 包括节点<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ nodes<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 表示设备<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 属性<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ properties<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 表示设备的特性<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 内核中的设备树编译器<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ dtc<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) 将设备树源文件编译成二进制格式<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ >“ DTB<span class=<h-char class=( bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ ) <h-char class= bd bd-beg“ >“ , 内核启动时加载DTB来配置硬件<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 驱动程序通过设备树中的信息来获取设备的地址<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 、 IRQ等信息<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 实现即插即用<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
例子<span class=<h-char class=
设备树描述<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" highlight dts" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" code" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" title class_" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >/" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >{" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" title class_" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >leds" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >{" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" attr" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >compatible" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" operator" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >=" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" string" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >"gpio-led"" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >;" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" attr" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >gpios" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" operator" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >=" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" params" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" ><" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" variable" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >&gpio" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" number" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >17 GPIO_ACTIVE_HIGH>" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >;" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" comment" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >// 假设LED连接到GPIO17" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" attr" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >label" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" operator" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >=" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" string" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >"led"" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >;" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >};" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" line" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" punctuation" " bd bd-beg >" bd-box" bd bd-beg" >" >" bd bd-beg" >" >};" 驱动代码<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 现在驱动可以从设备树中获取LED的配置信息<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
|
设备树描述了硬件配置<span class=<h-char class=
进化意义<span class=<h-char class=
- 从面向对象到平台总线模型<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 再到设备树的演变过程中<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 硬件资源的管理变得越来越抽象和灵活<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 每个阶段都使得驱动开发和维护更加高效<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 减少了对具体硬件的依赖<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 增强了系统的可移植性和可维护性<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 通过LED点灯这个简单的例子<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 我们可以看到这种进化带来的实际好处<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ : 从最初的硬编码<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 到设备树的动态配置<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 使得系统对硬件变化的适应性大大增强<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 从面向对象到平台总线模型<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 再到设备树<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 硬件资源的管理和配置变得越来越抽象和通用<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 减少了对具体硬件的依赖<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 提升了系统的可移植性和可维护性<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。 - 设备树的引入大大简化了内核的硬件描述方式<span class=<h-char class=
bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ , 使得硬件支持的添加和修改变得更加灵活和高效<span class=<h-char class= bd bd-beg“ >“ bd-box<h-char class=“ bd bd-beg“ >“ ><h-char class=“ bd bd-beg“ >“ 。
这个过程展示了操作系统在面对越来越复杂的硬件环境时<span class=<h-char class=