一、用到的rk3328好像使用了设备树
设备树我知道的有三种文件类型,dtbs是通过指令make dtbs编译的二进制文件,供内核使用。
基于同样的软件分层设计的思想,由于一个SoC可能对应多个machine,如果每个machine的设备树都写成一个完全独立的.dts文件。
那么势必相当一些.dts文件有重复的部分,为了解决这个问题,Linux设备树目录把一个SoC公用的部分或者多个machine共同的部分提炼为相应的.dtsi文件。
这样每个.dts就只有自己差异的部分,公有的部分只需要"include"相应的.dtsi文件, 这样就是整个设备树的管理更加有序。
二、韦山东的设备树教程
如果知道设备树需要填写哪些内容呢:
1.看文档,在内核Documentation/devicetree/bindings/目录下有各种厂家的资料,源码和文档有些都是对应的:
使用指令,居然找出来好多rockchip的文档:
find Documentation/devicetree/bindings/ -name "*rockchip*"
2.参考同类型单板的设备树文件
3.网上搜索
4.研究源码
2.1 设备树的规范DTS格式
(1)语法:
DTS文件布局(layout): /dts-v1/; [memory reservations] // 格式为: /memreserve/ <address> <lenght>; / { // 根节点 [property definitions] [child nodes] }; 红色部分,如下: Property格式1: [label:] property-name = value; 这个value有三种取值类型:<32位数据> "字符串" [16进制表示的1个/多个byte,一个byte必须用2位表示,byte之间的空格可省略]
第四种是多种组合,之间用逗号分开
Property格式2(没有值): [label:] property-name; Devicetree node格式: [label:] node-name[@unit-address] { [properties definitions] [child nodes] };
示例:
a. Arrays of cells : cell就是一个32位的数据
interrupts = <17 0xc>;
b. 64bit数据使用2个cell来表示:
clock-frequency = <0x00000001 0x00000000>;
c. A null-terminated string (有结束的字符串):
compatible = "simple-bus";
d. A bytestring(字节序列):
local-mac-address = [00 00 12 34 56 78]; // 每个byte使用2个16进制数来表示
local-mac-address = [000012345678]; //每个byte使用2个16进制数来表示
e.可以是各种值的组合,用逗号隔开:
compatible = "ns16550", "ns8250";
example = <0xf00f0000 19> "a strange property format";