处理器 | 架构 |
---|---|
ZYNQ 7000 | 双核ARM-Cortex A9 CPU |
ZYNQ UltraScale+ MPSoC | 四核ARM-Cortex A53 CPU、双核Cortex-R5 RPU、Mali-400 GPU(一个Geometry核,两个像素核)、PL逻辑以及视频编解码器Codec核 |
在之前的文章中,介绍了使用Xilinx的git 库上的通用Linux源码编译了一个支持AMP的Linux,运行的FreeRTOS,本文也可以按照上面自己编译一个Linux,也可以取个巧通过PetaLinux生成Linux。本文计时通过PetaLinux完成Linux系统的生成的。
需要注意的两点:
我们需要Linux支持AMP,就需要在配置petalinux-config -c kernel的时候添加amp的支持。
[*] Enable loadable module support --->
Device Drivers --->
Remoteproc drivers --->
[*] Support for Remote Processor subsystem
<*> ZynqMP_r5 remoteproc support
Rpmsg drivers --->
<*> RPMSG device interface
我们需要在设备树中,预留给RPU的RAM空间这里可以参考这里,因为这里仅仅开启了RPU0, 所以只用设置RPU0的部分。
注意:!!
需要注意的是APU以RPU不能同时访问同一个外设,此工程中RPU0访问的外设有UART0, IIC0,因为此工程使用的是黑金的ZU3EG,PS端仅仅接了uart0接口,所以APU端就通过ssh去访问系统,同时在设备树中禁止UART0、IIC0。
修改project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
如下
/include/ "system-conf.dtsi"
/ {
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
rproc_0_reserved: rproc@3ed00000 {
no-map;
reg = <0x0 0x3ed00000 0x0 0x1000000>;
};
};
power-domains {
pd_r5_0: pd_r5_0 {
#power-domain-cells = <0x0>;
pd-id = <0x7>;
};
pd_tcm_0_a: pd_tcm_0_a {
#power-domain-cells = <0x0>;
pd-id = <0xf>;
};
pd_tcm_0_b: pd_tcm_0_b {
#power-domain-cells = <0x0>;
pd-id = <0x10>;
};
};
amba {/*您需要将固件内存指定为“mmio-sram”。*/
r5_0_tcm_a: tcm@ffe00000 {
compatible = "mmio-sram";
reg = <0 0xFFE00000 0x0 0x10000>;
pd-handle = <&pd_tcm_0_a>;
};
r5_0_tcm_b: tcm@ffe20000 {
compatible = "mmio-sram";
reg = <0 0xFFE20000 0x0 0x10000>;
pd-handle = <&pd_tcm_0_b>;
};
elf_ddr_0: ddr@3ed00000 {
compatible = "mmio-sram";
reg = <0 0x3ed00000 0x0 0x40000>;
};
test_r50: zynqmp_r5_rproc@0 {
compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
reg = <0x0 0xff9a0100 0 0x100>, <0x0 0xff9a0000 0 0x100>;
reg-names = "rpu_base","rpu_glbl_base";
dma-ranges;
core_conf = "split0";
srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
pd-handle = <&pd_r5_0>;
interrupt-parent = <&gic>;
interrupts = <0 29 4>;
} ;
};
};
&i2c1 {
clock-frequency = <400000>;
status = "disabled";
};
&uart0 {
status = "disabled";
};
&i2c0 {
/* clock-frequency = <400000>;*/
status = "disabled";
};
/* SD */
&sdhci1 {
disable-wp;
no-1-8-v;
};
/* USB */
&dwc3_0 {
status = "okay";
dr_mode = "host";
};
通过petalinux-config -build 后,我们将系统通过jtag下载到板子上,当然也可以根据需求使用SD卡启动,这个需要在config中设置root filesystem type 为SD卡,此工程使用默认的INITRAMFS
petalinux-boot --jtag --u-boot --fpga
关于ThreadX的系统移植部分,可以参考这里,与ZYNQ7000的套路一样,但是需要注意的是,需要在库如tx库、nxd库、fx库中都要开启浮点fpv的支持:
在Properities->Settings->C/C++ Build->Miscellaneous中添加 -mfloat-abi=hard -mfpu=vfpv3-d16
别的套路都相同了,这里不再做介绍。
这个工程中就访问了IIC上的温度传感器:参考黑金手册 ZYNQ MPSoC 开发平台 VITIS 应用教程第六章即可。
注意的是:在ld Available Memory Regions中,psu_r5_ddr_0_MEM_0的基地址和大小一定要与设备树中设置的一样:
启动好Linux后,我们在文件系统的\lib 下创建firmware文件夹,然后通过scp 将threadx.elf文件拷贝到\lib\firmware 文件夹。
通过ssh 执行:
echo threadx.elf> /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state
剩下的就是在串口中happy的查看温度信息了.
echo stop > /sys/class/remoteproc/remoteproc0/state