MA35D1-如何自定义分配内存给M4和A35之间共享内存传输数据

qwang |浏览298次
收藏|2023/05/31 11:45

满意回答

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);  

 

 


蔡芳芳

其他回答(0)
0人关注该问题
+1
 加载中...