.net 建网站苏州建设企业网站

当前位置: 首页 > news >正文

.net 建网站,苏州建设企业网站,广告设计论文,win7支持wordpress四十三、Linux设备树 43.1 DTS、DTB 和 DTC DTS 是设备树源码文件 DTB 是将DTS 编译以后得到的二进制文件。 DTC 工具将.dts 编译为.dtb 43.2 DTS语法 43.2.1 .dtsi 头文件 在.dts 设备树文件中#xff0c;可以通过“#include”来引用.h、.dtsi 和.dts 文件。 …四十三、Linux设备树 43.1 DTS、DTB 和 DTC DTS 是设备树源码文件 DTB 是将DTS 编译以后得到的二进制文件。 DTC 工具将.dts 编译为.dtb 43.2 DTS语法 43.2.1 .dtsi 头文件 在.dts 设备树文件中可以通过“#include”来引用.h、.dtsi 和.dts 文件。                                        一般.dtsi 文件用于描述 SOC 的内部外设信息比如 CPU 架构、主频、外设寄存器地址范围比如 UART、IIC 等等。 43.2.2 设备节点 设备树是采用树形结构来描述板子上的设备信息的文件每个设备都是一个节点叫做设 备节点每个节点都通过一些属性信息来描述节点信息属性就是键 —值对。

设备树模板

/ {aliases {can0 flexcan1;};cpus {#address-cells 1;#size-cells 0;cpu0: cpu0 {compatible arm,cortex-a7;device_type cpu;reg 0;};};intc: interrupt-controller00a01000 {compatible arm,cortex-a7-gic;#interrupt-cells 3;interrupt-controller;reg 0x00a01000 0x1000,0x00a02000 0x100;}; } “/”是根节点每个设备树文件只有一个根节点。aliases、cpus 和 intc 是三个子节点在设备树中节点命名格式如下 label: node-nameunit-address 其中“node-name”是节点名字为 ASCII 字符串节点名字应该能够清晰的描述出节点的功能比如“uart1”就表示这个节点是 UART1 外设。         “unit-address”一般表示设备的地址或寄存器首地址如果某个节点没有地址或者是寄存器的话“unit-address”可以不要比如“cpu0”、“interrupt-controller00a01000”。“”前面的是节点标签(label)。引入 label 的目的就是为了方便访问节点可以直接通过label 来访问这个节点比如通过cpu0 就可以访问“cpu0”这个节点而不需要输入完整的节点名字。 每个节点都有不同属性不同的属性又有不同的内容属性都是键值对值可以为空或任 意的字节流。设备树源码中常用的几种数据形式如下所示 ①、字符串 compatible arm,cortex-a7; 上述代码设置 compatible 属性的值为字符串“arm,cortex-a7”。 ②、32 位无符号整数 reg 0; 上述代码设置 reg 属性的值为 0reg 的值也可以设置为一组值比如reg 0 0x123456 100; ③、字符串列表 属性值也可以为字符串列表字符串和字符串之间采用“,”隔开如下所示 compatible fsl,imx6ull-gpmi-nand, fsl, imx6ul-gpmi-nand; 上述代码设置属性 compatible 的值为“fsl,imx6ull-gpmi-nand”和“fsl, imx6ul-gpmi-nand”。 43.2.3 标准属性 节点是由一堆的属性组成节点都是具体的设备不同的设备需要的属性不同用户可以 自定义属性。除了用户自定义属性有很多属性是标准属性Linux 下的很多外设驱动都会使用 这些标准属性本节我们就来学习一下几个常用的标准属性。 1、compatible 属性 compatible 属性也叫做“兼容性”属性。compatible 属性的值是一个字符串列表compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序compatible 属性的值格式如下所示 manufacturer,model 其中 manufacturer 表示厂商model 一般是模块对应的驱动名字。         一般驱动程序文件都会有一个 OF 匹配表此 OF 匹配表保存着一些 compatible 值如果设 备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等那么就表示设备可以使用这个 驱动。 2、model 属性 model 属性值也是一个字符串一般 model 属性描述设备模块信息比如名字什么的比如 model wm8960-audio; 3、status 属性 status 属性看名字就知道是和设备状态有关的status 属性值也是字符串字符串是设备的状态信息可选的状态如表 43.3.3.1 所示 表 43.3.3.1 status 属性值表 值描述“okay”表明设备是可操作的。“disabled”表明设备当前是不可操作的但是在未来可以变为可操作的比如热插拔设备 插入以后。至于 disabled 的具体含义还要看设备的绑定文档。“fail”表明设备不可操作设备检测到了一系列的错误而且设备也不大可能变得可 操作。“fail-sss”含义和“fail”相同后面的 sss 部分是检测到的错误内容。 4、#address-cells 和#size-cells 属性 这两个属性的值都是无符号 32 位整形#address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属 性中地址信息所占用的字长(32 位)#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。#address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值一般 reg 属性都是和地址有关的内容和地址相关的信息有两种起始地址和地址长度reg 属性的格式一为 reg address1 length1 address2 length2 address3 length3…… 每个“address length”组合表示一个地址范围其中 address 是起始地址length 是地址长度#address-cells 表明 address 这个数据所占用的字长#size-cells 表明 length 这个数据所占用 的字长比如:

示例代码 43.3.3.2 #address-cells 和#size-cells 属性

spi4 {compatible spi-gpio;#address-cells 1;#size-cells 0;gpio_spi: gpio_spi0 {compatible fairchild,74hc595;reg 0;}; };aips3: aips-bus02200000 {compatible fsl,aips-bus, simple-bus;#address-cells 1;#size-cells 1;dcp: dcp02280000 {compatible fsl,imx6sl-dcp;reg 0x02280000 0x4000;}; }; 第 34 行节点 spi4 的#address-cells 1#size-cells 0说明 spi4 的子节点 reg 属性中起始地址所占用的字长为 1地址长度所占用的字长为 0。         第 8 行子节点 gpio_spi: gpio_spi0 的 reg 属性值为 0因为父节点设置了#address- cells 1#size-cells 0因此 addres0没有 length 的值相当于设置了起始地址而没有设置地址长度。         第 1415 行设置 aips3: aips-bus02200000 节点#address-cells 1#size-cells 1说明 aips3: aips-bus02200000 节点起始地址长度所占用的字长为 1地址长度所占用的字长也为 1。         第 19 行子节点 dcp: dcp02280000 的 reg 属性值为0x02280000 0x4000因为父节点设置了#address-cells 1#size-cells 1address 0x02280000length 0x4000相当于设置了起始地址为 0x02280000地址长度为 0x40000。 5、reg 属性 reg 属性前面已经提到过了reg 属性的值一般是(addresslength)对。reg 属性一般用于描 述设备地址空间资源信息一般都是某个外设的寄存器地址范围信息比如在 imx6ull.dtsi 中有 如下内容

示例代码 43.3.3.3 uart1 节点信息

uart1: serial02020000 {compatible fsl,imx6ul-uart,fsl,imx6q-uart, fsl,imx21-uart;reg 0x02020000 0x4000;interrupts GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH;clocks clks IMX6UL_CLK_UART1_IPG,clks IMX6UL_CLK_UART1_SERIAL;clock-names ipg, per;status disabled; }; 上述代码是节点 uart1 uart1 节点描述了 I.MX6ULL 的 UART1 相关信息重点是 reg 属性。其中 uart1 的父节点 aips1: aips-bus02000000 设置了#address-cells 1、#size-cells 1因此 reg 属性中 address0x02020000 length0x4000。查阅《I.MX6ULL 参考手册》可知I.MX6ULL 的 UART1 寄存器首地址为 0x02020000但是 UART1 的地址长度(范围)并没有 0x4000 这么多这里我们重点是获取 UART1 寄存器首地址。 6、ranges 属性 ranges 属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵ranges 是一个地址映射/转换表ranges 属性每个项目由子地址、父地址和地址空间长度 这三部分组成        child-bus-address子总线地址空间的物理地址由父节点的#address-cells 确定此物理地址所占用的字长。        parent-bus-address父总线地址空间的物理地址同样由父节点的#address-cells 确定此物理地址所占用的字长。        length子地址空间的长度由父节点的#size-cells 确定此地址长度所占用的字长。         如果 ranges 属性值为空值说明子地址空间和父地址空间完全相同不需要进行地址转换 对于我们所使用的 I.MX6ULL 来说子地址空间和父地址空间完全相同因此会在 imx6ull.dtsi中找到大量的值为空的 ranges 属性如下所示

示例代码 43.3.3.4 imx6ull.dtsi 文件代码段soc {#address-cells 1;#size-cells 1;compatible simple-bus;interrupt-parent gpc;ranges;

…… } 第 142 行定义了 ranges 属性但是 ranges 属性值为空。         ranges 属性不为空的示例代码如下所示

示例代码 43.3.3.5 ranges 属性不为空

soc {compatible simple-bus;#address-cells 1;#size-cells 1;ranges 0x0 0xe0000000 0x00100000;serial {device_type serial;compatible ns16550;reg 0x4600 0x100;clock-frequency 0;interrupts 0xA 0x8;interrupt-parent ipic;}; }; 第 5 行节点 soc 定义的 ranges 属性值为0x0 0xe0000000 0x00100000此属性值指定了一个 1024KB(0x00100000)的地址范围子地址空间的物理起始地址为 0x0父地址空间的物 理起始地址为 0xe0000000。         第 10 行serial 是串口设备节点reg 属性定义了 serial 设备寄存器的起始地址为 0x4600 寄存器长度为 0x100。经过地址转换serial 设备可以从 0xe0004600 开始进行读写操作0xe00046000x46000xe0000000。 7、name 属性 name 属性值为字符串name 属性用于记录节点名字name 属性已经被弃用不推荐使用 name 属性一些老的设备树文件可能会使用此属性。 8、device_type 属性 device_type 属性值为字符串IEEE 1275 会用到此属性用于描述设备的 FCode但是设备树没有 FCode所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。imx6ull.dtsi 的 cpu0 节点用到了此属性内容如下所示

示例代码 43.3.3.6 imx6ull.dtsi 文件代码段

cpu0: cpu0 {compatible arm,cortex-a7;device_type cpu;reg 0; …… }; ……………….待续