设备树基本知识

1.设备树

1.1dts

        .dts文件是设备树源文件,用于描述硬件设备和系统架构的结构,每一款硬件平台可以单独写一份 xxxx.dts,所以在 Linux 内核源码中存在大量.dts 文件,对于 arm 架构可以在 arch/arm/boot/dts 找到相应的 dts。

1.2dtsi

        .dtsi文件是设备树包含文件,用于在设备树源文件中包含共享的硬件描述信息。.dtsi文件通常用于定义多个设备树文件之间的共用部分,方便管理和复用。dtsi和dts文件语法各方面都是一样的,但是不能直接编译一个.dtsi文件,只有dts文件可以用于编译。

1.3dtb

        .dtb 文件是设备树二进制文件,用于将设备树的描述信息以二进制格式存储,以便于操作系统(如 Linux 内核)读取和解析。这种文件格式可以有效地描述系统中的硬件结构和配置。

2.设备树语法

2.1设备树结构

        设备树是一种数据结构,用于描述硬件设备及其属性,主要用于嵌入式系统和 Linux内核。设备树的结构通常采用树形结构,以节点和属性的形式组织信息。

2.2节点与属性

        节点代表系统中的一个硬件设备或组件,比如 CPU、内存、外设等。节点的名称通常使用斜杠(/)开头的字符串表示。

        属性是节点的特性或配置选项,通常以键值对的形式表示。每个属性用于描述节点的某一特定方面,如地址、型号、时钟频率等。

2.3注释

        可使用“/* */”符号的多行注释内容,也可以使用“//”进行单行注释;这一点与 C 语言风格类似。

2.4属性

2.4.1Compatable 属性

        compatible 属性也叫做“兼容性”属性,一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设备树中的节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动。
2.4.2status属性
        status 属性看名字就知道是和设备状态有关的, device tree 中的 status 标识了
设备的 状态,使用 status 可以去禁止设备或者启用设备,看下设备树规范中的 status 可选值:
                okay 表明设备是可操作的。 
                disabled 表明设备当前是不可操作的,但是在未来可以变为可操作的。
                fail 表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
                fail-sss 含义和“fail”相同,后面的 sss 部分是检测到的错误内容
        注意如果节点中没有添加 status 属性,那么它默认就是“status = okay”
2.4.3#address-cells 和 #size-cells
   
        #address-cells,用来描述子节点"reg"属性的地址表中首地址 cell 的数量;
        #size-cells,用来描述子节点"reg"属性的地址表中地址长度 cell 的数量。
        #address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值,一般reg属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, 有了这两 个属性,子节点中的"reg"属性就可以描述一块连续的地址区域了; reg 属性的格式一般为:
        reg = <address1 length1 address2 length2 address3 length3……>
        每个“address length”组合表示一个地址范围,其中 address 是起始地址,length 是地址长度, #address-cells 表明 address 字段占用的字长, #size-cells 表明 length这个字段所占用的字长。
2.4.4aliases 节点
        
        单词 aliases 的意思是“别名”,因此 aliases 节点的主要功能就是定义别名,定义别名的目的就是为了方便访问节点。 但是需要注意的是,这里说的方便访问节点并不是在设备树中访问节点,例如前面说到的使用“&label”的方式访问设备树中的节点,而是内核当中方便定位节点,例如在内核中通过 ethernet0 就可以定位到 gem0 节点(&gem0 引用的节点),再例如内核通过 serial0 就可以找到 uart0 节点。
2.4.5chosen 节点
        chosen 节点一般会有两个属性, “bootargs”和“stdout-path” 。
        在 chosen 节点当中, 属性 stdout-path = “serial0:115200n8” ,表示标准输出设备使用串口 serial0,在 system-top.dts 文件当中, serial0 其实是一个别名,指向的就是 uart0;“115200”则表示串口的波特率为 115200,“n”表示无校验位,“8”则表示有 8 位数据位,相信大家都明白这些是什么意思。
        一个非常值得注意的地方是,chosen 节点里面也有一个 bootargs 属性,看到这个你是不是想到了 u-boot 环境变量里面也有一个 bootargs?Linux 启动过程中既会用到 u-boo 环境变量,也会用到设备树 dtb 文件,那么内核究竟使用的是哪个 bootargs 呢?很好的问题!
        如果仔细研究了 u-boot 这块的源码就会发现。U-boot 环境变量里面的 bootargs 相比
于设备树 dtb文件中的 bootargs,有更高的优先级。即如果 u-boot 环境变量定义了 bootargs,
则在 linux 内核启动的时候,会覆盖原有的 dtb 文件中的 bootargs;如果 u-boot 环境变量
没有定义 bootargs,则 linux 内核会继续使用 dtb 文件中的 bootargs 启动。
2.4.6memory 节点
        memory 节点描述了系统内存的基地址以及系统内存大小,“reg = <0x100000
0x3ff00000>;”就表示系统内存的起始地址为 0x100000,大小为 0x3ff00000,也就是
1023MB;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值