在 Device Tree 中,可描述的信息包括(原先这些信息大多被 hard code 到 kernel 中):
CPU 的数量和类别
内存基地址和大小
总线和桥
外设连接
中断控制器和中断使用情况
GPIO 控制器和 GPIO 使用情况
所以,virt machine 和 milk-v duo 的区别也就在这些部分
AMP
Asymmetric Multiprocessing.
非对称多处理器。
Computer available CPUs are partitioned into groups, each running a distinct operating system image.
计算机中的 CPUs 中被划成组,每个组运行不同的系统镜像。
The CPUs may or may not be identical.
CPUs 不一定是相同的。
这个是不是就是俗称的大小核?目标板好像也是大小核的
boot CPU
The first CPU which a boot program directs to a client program’s entry point.
运行引导程序跳转到客户端程序入口的 CPU。
cell
A unit of information consisting of 32 bits.
由 32 位组成的信息单位。
DTS
Devicetree syntax.
设备树语法。
A textual representation of a devicetree consumed by the DTC.
被 DTC 使用的设备树的文本表示形式。
See Appendix A Devicetree Source Format (version 1).
请参阅附录 A 设备树源格式(版本 1)。
effective address
Memory address as computed by processor storage access or branch instruction.
由处理器存储访问或分支指令计算的内存地址。
physical address
Address used by the processor to access external device, typically a memory controller.
处理器用于访问外部设备(通常是存储器控制器)的地址。
interrupt specifier
A property value that describes an interrupt.
描述中断的属性值。
Typically information that specifies an interrupt number and sensitivity and triggering mechanism is included.
通常包括指定中断号、灵敏度和触发机制的信息。
secondary CPU
CPUs other than the boot CPU that belong to the client program are considered secondary CPUs.
属于客户端程序的引导 CPU 以外的 CPU 被视为辅助 CPU。
SMP
Symmetric multiprocessing.
对称多处理。
A computer architecture where two or more identical CPUs can share memory and IO and operate under a single operating system.
一种计算机体系结构,其中两个或多个相同的 CPU 可以共享内存和 IO,并在单个操作系统下运行。
SoC
System on a chip.
片上系统。
A single computer chip integrating one or more CPU core as well as number of other peripherals.
集成一个或多个 CPU 内核以及许多其他外设的单个计算机芯片。
quiescent CPU
A quiescent CPU is in a state where it cannot interfere with the normal operation of other CPUs.
休眠的 CPU 处于无法干扰其他 CPU 正常运行的状态。
nor can its state be affected by the normal operation of other running CPUs.
其状态也不会受到其他正在运行的 CPU 正常运行的影响。
except by an explicit method for enabling or re-enabling the quiescent CPU.
除非通过显式方法启用或重新启用静态 CPU。
该设备树由 OpenFirmware,OpenPOWER 抽象层(OPAL),Power Architecture Platform Requirements(PAPR)和独立的扁平设备树(FDT)形式使用。
具有 x86 体系结构的个人计算机通常不使用设备树,而是依靠各种自动配置协议(例如 ACPI)来发现硬件。使用设备树的系统通常会将静态设备树(可能存储在 ROM 中)传递给操作系统,但也可以在启动的早期阶段生成设备树。
U-Boot 可以在启动新操作系统时传递设备树。
Device Tree 文件的格式为 dts,包含的头文件格式为 dtsi,dts 文件是一种人可以看懂的编码格式。
但是 U-Boot 和 Linux 不能直接识别,他们只能识别二进制文件,所以需要把 dts 文件编译成 dtb 文件。
dtb 文件是一种可以被 Kernel 和 U-Boot 识别的二进制文件。
把 dts 编译成 dtb 文件的工具是 dtc。
Linux 源码下 scripts/dtc 目录包含 dtc 工具的源码。
除了使用在 Linux 的 scripts/dtc 目录下提供 dtc 工具外,也可以自己安装 dtc 工具。
比如,在 Ubuntu 下可执行如下命令安装 dtc:
$ sudo apt install device-tree-compiler
dtc 包中还提供了一个 fdtdump 的工具,可以反编译 dtb 文件。
设备树 Blob(DTB)格式是设备树数据的扁平二进制编码。也就是.dtb文件,在启动操作系统时,固件会将 DTB 传递给操作系统内核。 它由一个小报头和三个变长的部分组成:内存保留块、结构体块和字符串块。 devicetree 的报头布局被定义为以下 C 结构体。
DTS文件是一个以ASCII文本格式为主要描述语言的设备树。一个.dts对应一个ARM设备,类似于C语言的.C文件。 由于设备较多此时共用的部分提取成为.dtsi,类似于C语言的头文件,他们可以相互包含。
.dtsi 文件一般用于描述 SOC 的内部外设信息,比如 CPU 架构、主频、外设寄存器地址范围,比如 UART、 IIC 等等。
在设备树中节点命名格式如下:
node-name@unit-address
node-name: 是设备节点的名称,为ASCII字符串,节点名字应该能够清晰的描述出节点的功能,比如“uart1”就表示这个节点是UART1外设; unit-address: 一般表示设备的地址或寄存器首地址,如果某个节点没有地址或者寄存器的话 “unit-address” 可以不要; 注:根节点没有node-name 或者 unit-address,它被定义为 /。
带标签的设备节点名称 PIC: pic@10000000 { interrupt-controller; }; another-device-node { interrupt-parent = <&PIC>; // 使用label来引用上述节点, // 使用lable时实际上也是使用phandle来引用, // 在编译dts文件为dtb文件时, 编译器dtc会在dtb中插入phandle属性 }
compatible 属性也叫做 “兼容性” 属性,这是非常重要的一个属性! compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。
model 属性值也是一个字符串,一般 model 属性描述设备模块信息
phandle属性为devicetree中唯一的节点指定一个数字标识符,节点中的phandle属性,它的取值必须是唯一的(不要跟其他的phandle值一样)
status 属性看名字就知道是和设备状态有关的, status 属性值也是字符串,字符串是设备的状态信息
#address-cells 和 #size-cells的值都是无符号 32 位整型,可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位), #size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。 #address-cells 和 #size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度
reg 属性的值一般是 (address, length) 对,reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。
ranges属性值可以为空或者按照 (child-bus-address,parent-bus-address,length) 格式编写的数字矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成: child-bus-address: 子总线地址空间的物理地址,由父节点的 #address-cells 确定此物理地址所占用的字长。 parent-bus-address: 父总线地址空间的物理地址,同样由父节点的 #address-cells 确定此物理地址所占用的字长。 length: 子地址空间的长度,由父节点的 #size-cells 确定此地址长度所占用的字长。
每个设备树文件只有一个根节点,其他所有的设备节点都是它的子节点,它的路径是 /
对于我来说,这个设备树就这么点东西是很让人惊讶的,okok自己整一个定制版dts有点不太现实
感觉这个文档应该不是一般人能写的,有点难的,小问题是,要是有的外设我不用,我可以直接不添加这个模块吗?
.dts文件是可以省略外设的,ok,要是有闲空可以自己写个简单的,官方那个有点逆天
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。