设备树的语法构成

设备树的语法构成是其核心设计的基础,用于以结构化的方式描述硬件信息。以下是设备树语法的详细构成及关键要素,按模块化分类呈现:


一、设备树文件的基本结构

设备树文件(.dts)以树状结构组织,包含根节点、子节点和属性,语法规则严格遵循以下形式:

/ {  // 根节点
    [属性列表]
    子节点1 {
        [属性列表]
        子子节点 {
            [属性列表]
        }
    }
    子节点2 {
        [属性列表]
    }
};

二、语法要素详解

1. 节点(Node)
  • 定义:描述硬件设备或总线,格式为 标签: 节点名@地址 { ... }
    • 标签:可选,用于引用节点(如 i2c0: i2c@fe002000)。
    • 节点名:硬件类型(如 i2cmemory)。
    • 地址:可选,设备在总线上的地址(如 0xfe002000)。
  • 示例

    i2c0: i2c@fe002000 {  // 标签i2c0指向节点i2c@fe002000
        compatible = "fsl,imx28-i2c";
    };
2. 属性(Property)
  • 定义:键值对,格式为 属性名 = 属性值;
  • 常见属性类型
    • 字符串compatible = "vendor,model";
    • 整数(32位)reg = <0xfe002000 0x1000>;
    • 整数数组interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
    • 二进制数据local-mac-address = [00 01 02 03 04 05];
    • 空值status = "disabled";
3. 属性值语法
  • 整数表示
    • 十进制:123
    • 十六进制:0xfe002000
    • 符号化常量:GIC_SPI(需在头文件中定义)
  • 数组格式:用尖括号 < > 包裹,元素用空格分隔:
    reg = <0xfe002000 0x1000>; // 起始地址+长度
  • 字符串格式:用双引号包裹,可包含转义字符(如 \"):
    model = "My Custom Board";
4. 特殊节点
  • /(根节点):描述系统级信息,如:

    / {
        compatible = "vendor,my-board";
        model = "My Custom Board";
    };
  • aliases 节点:为常用节点提供别名:

    aliases {
        ethernet0 = &eth0;  // eth0是节点标签
    };
  • chosen 节点:传递启动参数(如 bootargs):

    chosen {
        bootargs = "console=ttyS0,115200";
    };
5. 引用(Phandle & Referencing)
  • Phandle:为节点分配唯一标识符(由编译器自动生成),用于跨节点引用。
  • 引用语法&标签,如:

    i2c0: i2c@fe002000 {
        status = "okay";
    };
    
    temp_sensor: temp@48 {
        compatible = "vendor,temp-sensor";
        i2c-bus = &i2c0;  // 引用i2c0节点
    };
6. 注释
  • 单行注释:// 注释内容
  • 多行注释:/* 注释内容 */

三、设备树语法规则总结

  1. 缩进与层级
    • 子节点需缩进(通常2/4空格),层级关系清晰。
    • 示例:

      / {
          cpu0: cpu@0 {
              device_type = "cpu";
          };
      };
  2. 分号与逗号
    • 属性声明以分号结尾(;)。
    • 数组元素用空格分隔(非逗号)。
  3. 标签与引用
    • 标签用于引用节点,避免重复定义。
    • 引用需用 & 符号(如 &i2c0)。
  4. 头文件与宏
    • 可通过 #include 引入公共定义(如寄存器地址)。
    • 示例:
      #include "my-board-defs.dtsi"

四、语法示例:完整设备树片段

/ {
    compatible = "vendor,my-board";
    model = "My Custom Board";

    memory {
        device_type = "memory";
        reg = <0x80000000 0x20000000>;  // 512MB内存
    };

    i2c0: i2c@fe002000 {
        compatible = "fsl,imx28-i2c";
        reg = <0xfe002000 0x1000>;
        interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
        status = "okay";

        temp_sensor: temp@48 {
            compatible = "vendor,temp-sensor";
            reg = <0x48>;
        };
    };
};

五、关键点总结

  1. 树状结构:通过节点嵌套描述硬件拓扑。
  2. 属性驱动:所有硬件配置通过属性定义。
  3. 引用机制:通过标签和 & 符号实现节点复用。
  4. 标准化格式:严格遵循键值对、数组、字符串等语法规则。

设备树的语法设计旨在平衡灵活性与可读性,使硬件描述既可被编译器解析,又易于人工维护。掌握这些语法规则是开发嵌入式Linux设备驱动的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值