不要修改dtsi,修改自己板子的dts,通过 &label 语句修改子文件里已经存在的节点

本文介绍DTS(Device Tree Source)中OF(Open Firmware)设备节点的配置方法,特别是如何在不修改基本模板文件的情况下,为特定硬件平台(如imx6q)配置I2C从设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://blog.youkuaiyun.com/ruanjianruanjianruan/article/details/61624510
dts里的of_device节点的属性都是分开写的,这样是为了降低耦合,比如imx6q的i2c的节点,它的compatible 属性是放在最经常被包含的imx6qdl.dtsi文件中的,如:

i2c1: i2c@021a0000 {
   #address-cells = <1>;
   #size-cells = <0>;
   compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
   reg = <0x021a0000 0x4000>;
   interrupts = <0 36 0x04>;
   clocks = <&clks 125>;
   status = "disabled";
};

而自己的板子上挂了i2c slave芯片,那么针对自己的板子的dts文件里添加这个子节点,而不是在最初的imx6qdl.dtsi文件中。

在自己板子的dts文件中添加方法是:

&i2c1 {
   clock-frequency = <100000>;
   pinctrl-names = "default";
   pinctrl-0 = <&pinctrl_i2c1_2>;
   status = "okay";

   eeprom0:qom,eeprom@2b{
      .....
      .....
   }
};

这样,原来经常被包含的文件dtsi就不用被改动了。
1,如果有相同的属性,根据语句的先后顺序,则后者会把前者的属性覆盖掉。
2,其中 i2c1 是一个标签,&i2c1 操作就表示设备节点 i2c@021a0000 的地址,表示的是对 i2c@021a0000 的操作。

### 如何通过 DTSI 覆盖修改节点属性 在设备树源文件(Device Tree Source, DTS)体系结构中,DTSI 文件通常用于提供通用的芯片级硬件描述。为了保持其通用性和可维护性,建议优先在 DTS 文件中进行板级定制化操作[^1]。然而,在某些情况下可能需要直接修改 DTSI 文件来覆盖或调整节点属性。 #### 使用 `/delete-property/` 删除现有属性 如果目标是删除某个特定属性,则可以使用 `/delete-property/` 指令。该指令允许开发者明确指定要移除的属性名称。例如: ```dts /delete-property/ clock-frequency; ``` 上述代码片段会从当前作用域中的节点移除 `clock-frequency` 属性[^2]。 #### 利用 DTS 文件覆盖或新增节点属性 对于大多数场景而言,推荐的方式是在 DTS 文件中重新定义或扩展节点属性,而不是直接修改 DTSI 文件。这种方式能够有效减少对基础架构的影响并提高系统的可维护性。假设原始 DTSI 定义如下: ```dts oscillator@1 { compatible = "fixed-clock"; reg = <1>; clock-frequency = <0>; clock-output-names = "xusbxti"; #clock-cells = <0>; }; ``` 可以通过以下方法在对应的 DTS 文件中覆盖部分属性: ```dts &oscillator@1 { clock-frequency = <12000000>; /* 新频率 */ status = "okay"; /* 启用此节点 */ }; ``` 在此示例中,`clock-frequency` 的值被更新为新的数值 `<12000000>`,而其他未提及的属性则保留原有设置[^4]。 #### 特殊情况下的 DTSI 修改指导原则 尽管不鼓励直接编辑 DTSI 文件,但如果确实存在必要条件(如频繁使用的全局配置变更),应当遵循严格的管理流程以确保清晰度和一致性。具体措施包括但不限于: - **充分的理由说明**:每次改动都应附带详细的文档解释为何必须影响到共享资源。 - **版本控制与注释**:利用版本控制系统跟踪每一次提交的历史记录;同时添加详尽的内部备注帮助未来团队成员理解意图。 以下是针对兼容性字段的一个实际例子展示如何分离不同平台间的差异点: ```dts /* imx6qdl.dtsi 中的基础声明 */ compatible = "fsl,imx6q"; /* 板级 dts 扩展 */ &i2c1 { pinctrl-names = "default", "sleep"; pinctrl-0 = <&pinctrl_i2c1_default>; pinctrl-1 = <&pinctrl_i2c1_sleep>; status = "okay"; }; ``` 这展示了如何将 IMX6Q 平台特有的 I2C 控制器初始化逻辑集中放置于专用区域而非混入公共头文件之中[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值