文章目录
1) 引言
Linux作为当前流行的操作系统,其在驱动的架构上面也是不断的进步和完善。在早期的Linux内核和ARM架构中并没有采用设备树, 因此Liunx驱动代码中包括大量冗余代码来描述对应平台的板信息,尤其是ARM架构平台。随着移动智能设备的迅猛发展,ARM架构芯片每年推出数百款,从而造成Linux内核板信息过多,使得linux内核虚胖。
当 Linux之父 linus看到 ARM社区向 社区向 Linux内核添加了大量“无用”、冗余的板级信息文件,不禁发出了一句“ This whole ARM thing is a f*cking pain in the ass”。从此以后 ARM社区就引入了PowerPC等架构已经采用的设备树(Flattened Device Tree)来解决这个问题。
2) 设备树官方信息
官网: https://www.devicetree.org/
截止当前规范版本:v0.3
3) DAY4 笔记
2.3.6 寄存器(reg)
属性名称: reg
属性值: 编码为专用值(address,length)对
描述:
寄存器属性描述设备资源的地址,其位于父总线定义的地址空间内。通常情况为内存映射I/O寄存器块的偏移和长度,但在不同总线表示异议不同。根节点定义地址空间中的地址为CPU实际地址。
值为一个,包含一个专用的地址和长度值对
示例:
假设一个soc上的外设有两个寄存器块,一个32字节块偏移0x3000,另外一个256节块偏移地址为0xFE00。寄存器属性将编码如下(假设#address-cells和#size-cells值为1)。
reg = < 0x3000 0x20 0xFE00 0x100>;
2.3.7 virtual-reg
属性名称: virtual-reg
值类型:
描述:
virtual-reg属性设置虚拟地址,其映射到设备节点寄存器属性指定的第1个物理地址。该属性使得启动程序提供映射好的虚拟-物理地址给客户端程序。
2.3.8 ranges
属性名称: ranges
值类型: 或 编码为任意3个数(子总线地址,父总线地址,长度)。
描述:
范围属性提供了一种方式,其定义了总线节点(父总线地址)和总线地址空间间的映射或转换。范围属性的值个数是一个任意3个数(child-bus-address, parent-bus-address,length)。
• child-bus-address是子总线地址空间内的物理地址。代表地址的单元总线是基于总线的,而且可被这个节点的#address-cells决定。
• parent-bus-address是父总线地址空间内的物理地址。表示父地址的单元数量是基于总线的,且可被#size-cells决定。
• length设置子地址空间的范围大小。标识大小的单元数有#size-cellss设定。
如果该属性定义为,它设定父,子地址空间相同,地址无需转换。
如果属性在总线节点中不存在,即假设父节点,子节点间无映射。
soc {
compatible = “simple-bus”;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x0 0xe0000000 0x00100000>;
serial@4600 {
device_type = “serial”;
compatible = “ns16550”;
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <0xA 0x8>;
interrupt-parent = <&ipic>;
};
};
soc节点指定一个属性范围:
<0x0 0xe0000000 0x00100000>;
属性值设定了1024KB的地址空间范围,一个子节点物理地址0x0映射到父物理地址0xe0000000。在该映射,串口设备节点通过在地址0xe0004600直接寻址,
2.3.9 dma-ranges
属性名称: dma-ranges
值类型: 或编码为任意3个数<child-bus-address, parent-bus-address, length)。
描述:
dma-ranges属性用于描述DMA结构,其属于内存映射总线,它的设备树父可被源于该总线的DMA操作访问。
它提供了一种方式,其可定义总线的物理地址空间和父总线地址空间间的映射或转换。
dma-ranges属性的值格式是一个任意3个数(child-bus-address,parent-bus-address,length). 每3个任意数描述一个连续的DAM地址范围。
• child-bus-address是位于子总线地址空间的物理地址。标识地址的单元数量取决于总线可由#address-cells设定。
• parent-bus-address是父总线地址空间内的物理地址。代表父地址的单元数取决于总线且其由节点的#address-cells属性设定
2.3.10 name(过期)
2.3.11 device_type(过期)
属性名称: device_type
直类型;
描述:
device_type属性在IEEE1275中使用,用于描述设备的FCode编程模型。因为DTSpec没有FCode, 该属性以过期。它只可被包含在cpu和momery节点,以保持兼容IEEE 1275派生的设备树。
4) 关注我
****我的公众号****