正点原子ZYNQ7010 Petalinux2019.2 问题
no label “phy1”
在进行petalinux-build
时出现报错:没有“phy1”这一标签,经过查找发现其对应为ethernet1,该ip在vivado中被勾选,但是在设备树中未被调用,不知道为什么在使用petalinux2019.2编译时就会报错。(有大佬知道的话请指教TAT)
因此在vivado中取消ethernet1的勾选:
再次进行在vivado中进行综合以及实现,生成.xsa文件(vivado2019.2中生成.xsa文件),进行petalinux-config
以及petalinux-build
编译成功。
PS:之前编译出现问题可以使用petalinux-build -x mrproper -f
将之前编译结果清除
设备树
What is 设备树?
设备树DTS(Device Tree Source):一种描述硬件的数据结构,实现驱动代码与设备信息相分离。采用树形结构描述板级设备,例如CPU数量、内存地址、iic接口等。.dtsi文件类似于C语言中的.h头文件,可以使用include来包含.dtsi文件。
对于ZYNQ7010,描述文件为“arch/arm/boot/dts/system-top.dts”,由petalinux自动生成。除此之外还有pl.dtsi、pcw.dtsi以及zynq-7000.dsti。
- zynq-7000.dtsi 文件中的内容是 zynq-7000 系列处理器相同的硬件外设配置信息(PS 端的);
- pl.dtsi 的内容是我们在 vivado 当中添加的 pl 端外设对应的配置信息;
- pcw.dtsi 表示我们在 vivado 当中已经使能的 PS 外设;
pl.dtsi 与 pcw.dtsi都是由 petalinux 根据 hdf 硬件描述自动生成的,不需要我们去编写。
dts语法
设备树简单结构
/{ // 根节点
node1{ // node1 节点
property1=value1; // node1 节点的属性 property1
property2=value2; // node1 节点的属性 property2
...
};
node2{ // node2 节点
property3=value3; // node2 节点的属性 property3
...
node3{ // node2 的子节点 node3
property4=value4; // node3 节点的属性 property4
...
};
};
}
- “/” 表示设备树的根节点(root node);
- node1 象征着SoC上的控制器,eg:I2C
- node3 象征着挂载在控制器下的某个设备,eg:eeprom、RTC等
定义节点
[label:]node-name[@unit-address] {
[properties definitions]
[child nodes]
};
- “node-name”是节点名字,为 ASCII 字符串,节点名字应该能够清晰的描述出节点的功能,比如“uart1”就表示这个节点是 UART1外设;
- “unit-address”一般表示设备的地址或寄存基地址,如果某个节点没有地址或者寄存器的话“unit-address”可以不要,比如“cpu@0”、“interrup-tcontroller@00a01000”
属性的值的类型
- 字符串
"arm,cortex-a9"
- 32 位无符号整形数据
<1000>
- 二进制数据
[00 0a 35 00 1e 53]
- 字符串数组
"n25q512a","micron,m25p80";
- 混合值
"a string", [0x01 0x23 0x45 0x67], <0x12345678>
- 节点引用
<&clkc 3>
表示引用”clkc”这个节点,clkc为”label”
标准属性
- compatible 属性
“兼容性”属性,值可以是一个字符串,也可以是一个字符串列表;一般该字符串使用”<制造商>,<型号>”这样的形式进行命名,目的是为了指定一个确切的设备,并且包括制造商的名字,以避免命名空间冲突
compatible = "xlnx,zynq-7000";
compatible = "xlnx,xuartps", "cdns,uart-r1p8";
- model 属性
一个字符串描述信息,它指定制造商的设备型号,model 属性一般定义在根节点下,一般就是对板子的描述信息 - status 属性
和设备状态有关
值 | 描述 |
---|---|
okay | 表明设备是可操作的。启动设备(默认) |
disabled | 表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。 |
fail | 表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。 |
fail-sss | 含义和“fail”相同,后面的 sss 部分是检测到的错误内容。 |
- #address-cells 和#size-cells 属性
是无符号 32 位整形,#address-cells
和#size-cells
可以用在任何拥有子节点的设备节点中,用于描述子节点的地址信息。#address-cells
用来描述子节点"reg"属性的地址表中首地址 cell 的数量;#size-cells
,用来描述子节点"reg"属性的地址表中地址长度 cell 的数量。
reg = <address1 length1 address2 length2 address3 length3……>
为reg属性,每个“address length”
组合表示一个地址范围,其中 address 是起始地址,length 是地址长度,#address-cells
表明 address 字段占用的字长,#size-cells
表明 length 这个字段所占用的字长 - reg 属性:ug585-Zynq-7000-TRM.pdf
一般是(address,length)对,用于描述设备地址空间资源信息,一般都是描述某个外设的寄存器地址范围信息、flash 设备的分区信息等。ranges 属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵。
child-bus-address : 子 总 线 地 址 空 间 的 物 理 地 址 , 由 ranges 属 性 所 在 节 点 的#address-cells 属性确定此物理地址占用的字长。
parent-bus-address:父总线地址空间的物理地址,由 ranges 属性所在节点的父节点#address-cells 属性确定此物理地址所占用的字长。
length:子地址空间的长度,由 ranges 属性所在节点的#address-cells 属性确定此地址长度所占用的字长。 - ranges 属性
地址转换表,其中的每个项目是一个子地址、父地址以及在子地址空间的大小的映射 - device_type 属性
字符串,表示节点的类型。一般用于 cpu 节点或者 memory 节点