2023/05/31 12:21
假设要分配6M给M4使用,
修改文件路径:
MA35D1_Buildroot/output/build/linux-custom/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi
在reserved-memory里面增加m4_share_mem配置如下:
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
m4_share_mem:m4_share_mem@0 {
reg = <0x0 0x85000000 0x0 0x600000>; /* 6MiB */
no-map;
}
display_buf: display_buf@0 {
reg = <0x0 0x8C800000 0x0 0x3000000>; /* 48MiB */
no-map;
};
vc8k_buf: vc8k_buf@0 {
reg = <0x0 0x8A800000 0x0 0x2000000>; /* 32MiB */
no-map;
};
gc520l_buf: gc520l_buf@0 {
reg = <0x0 0x8A000000 0x0 0x800000>; /* 8MiB */
no-map;
};
rproc_buf: rproc_buf@0 {
reg = <0x0 0x80020000 0x0 0x60000>; /* 384KB */
no-map;
};
};
Linux通过rpmsg 与M4通信握手,然后linux侧对分配的区域读写信息/M4对分配的区域读写信息。这个区域就是上面分配的6M空间。图示如下:
握手后M4和linux可以如下方式使用(假设前面0x200给rpmsg,剩余DDR用来传递数据)
:
1、M4这边可以给约定的空间写值,写值测试参考如下:
#define TEST_BASE (0x85000200UL)
for(i=0;i<180000;i=i+4){
outp32((void *)(TEST_BASE+i), 0x0);
}
读可以用函数inp32((void *)(TEST_BASE))
2、Linux下在用户空间可以使用mem来操作物理空间:
fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd) {
printf("Success to open /dev/mem fd=%08x\n", fd);
}
else {
printf("Fail to open /dev/mem fd=%08x\n", fd);
}
map_base = mmap(0, ALLOC_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x85000200);
……do what you want……
close(fd);
munmap(map_base, ALLOC_SIZE);