目录
设备树存放路径
编译dts方法
属性
添加节点例子
在已经添加的节点上外加属性例子
linux内核匹配设备步骤
结合下面这个文章看
linux驱动:(16)在设备树添加自定义节点_linux设备树自定义字段-CSDN博客
设备树存放路径
- 在linux源码中的 arch/arm/boot/dts 目录底下
编译dts方法
- 编译所有的dts:make dtbs
- 编译指定的dts:make xxx.dtb
属性
- compatible 属性
- 用于将设备和驱动绑定起来,一个字符串列表
- model 属性
- 描述设备模块信息,一个字符串
- status 属性
- 设备的 状态信息,一个字符串
- “okay”:表明设备是可操作的
- “disabled”:表明当前是不可操作的
- “fail”:表明设备不可操作
- “fail-sss”:表明设备不可操作并检测到错误内容
- #address-cells 和#size-cells 属性
- 可以用在任 何拥有子节点的设备中,用于描述子节点的地址信息
- #address-cells 属性值决定了子节点 reg 属 性中地址信息所占用的字长(32 位)
- #size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)
- 都是无符号 32 位整形
- reg 属性
- 用于描 述设备地址空间资源信息,一般是(address,length)对
- reg = <address1 length1 address2 length2 address3 length3……>
- 每个“address length”组合表示一个地址范围
- address 是起始地址,length 是地址长 度
- #address-cells 表明 address 这个数据所占用的字长
- #size-cells 表明 length 这个数据所占用 的字长
- 也就是说reg受#address-cells 和#size-cells 属性影响
- ranges 属性
- 一个地址映射/转换表
- 每个项目由子地址、父地址和地址空间长度 这三部分组成
- (child-bus-address,parent-bus-address,length)
- child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址 所占用的字长
- parent-bus-address:父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物 理地址所占用的字长
- length:子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长
- 如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换
- name 属性
- 用于记录节点名字,一个字符串
- device_type 属性
- 只能用于 cpu 节点或者 memory 节点,描述设备的 FCode,一个字符串
添加节点例子
/{test1:test{ //别名为test1,节点名称为testcompatible = "test";//匹配的名字#address-cells = <1>;#size-cells = <1>;reg = <0x20ac000 0x0000004>;//寄存器地址};
};
在已经添加的节点上外加属性例子
&test1{compatible = "test1";//匹配的名字status = "okay";
};
linux内核匹配设备步骤
- 要使用DT_MACHINE_START 宏,定义在文件 arch/arm/include/asm/mach/arch.h 里面
- 打开 arch/arm/xxx/xxx.c xxx为自己的芯片和板子查找上面的宏
- 可以看到machine_desc 结构体中有个.dt_compat 成员变量,此成员保存着本设备兼容属性
- 只要某个设备 ( 板子 ) 根节点“ / ”的 compatible 属性值与 imx6ul_dt_compat 表中的任何一个值相等,那么就表示 Linux 内核支持此设备
- 具体代码匹配步骤为
- start_kernel()----setup_arch()---setup_machine_fdt()---of_flat_dt_match_machine()
- setup_machine_fdt 函数来获取匹配的 machine_desc,参数是dtb文件首地址,返回值就是最匹配的machine_desc
- of_flat_dt_match_machine 来获取匹配的 machine_desc,参数 mdesc_best 是默认的 machine_desc,参数 arch_get_next_mach 是个函数,用设备树根节点的 compatible 属性值和 Linux 内核中 machine_desc 下.dt_compat 的值比较,看看那个相等,arch_get_next_mach 函数的工作就是获取 Linux 内核中 下一个 machine_desc 结构体
- start_kernel()----setup_arch()---setup_machine_fdt()---of_flat_dt_match_machine()