1、问题的由来:
我们在使用SoC时,不可避免的使用了AXI-HP通道以完成FPGA和ARM的交互,这个交互如果定义在内存区域,那么就需要将这一片内存区域保护起来,防止linux调用。
2、zynq与zynqMP的内存管理方式不同

3、对于zynq 7000系列的设备只需要写设备树的保护即可
bash
/include/ "system-conf.dtsi"
/ {
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
pl_buffer: buffer@2000000 {
reg = <0x02000000 0x00000100>;
no-map;
compatible = "shared-dma-pool";
};
ps_buffer: buffer@2010000 {
reg = <0x02010000 0x00000100>;
no-map;
compatible = "shared-dma-pool";
};
};
};
4、对于zynqMP系列,需要配置内核+设备数的原则
(1)配置内核,使得ddr可以通过 /dev/mem/ 被读写
bash
#配置内核
petalinux-config -c kernel
#输入"/"进入搜索界面
#搜索:DEVMEM,并配置下述两个选项
DEVMEM=y
STRICT_DEVMEM=n
(2)编写设备树
bash
/include/ "system-conf.dtsi"
/ {
#address-cells = <2>;
#size-cells = <2>;
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
pl_buffer: buffer@02000000 {
reg = <0x0 0x02000000 0x0 0x00000100>;
no-map;
compatible = "shared-dma-pool";
};
ps_buffer: buffer@02010000 {
reg = <0x0 0x02010000 0x0 0x00000100>;
no-map;
compatible = "shared-dma-pool";
};
};
};
注意:必须是<2>,ARM64 内核需要这样才能正确解析 64-bit 地址,否则就报 unsupported node format