Zynq UltraScale Linux A53和裸机 R5共享内存通信
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Zynq UltraScale Linux A53和裸机 R5共享内存通信,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2554字,纯文字阅读大概需要4分钟。
内容图文
![Zynq UltraScale Linux A53和裸机 R5共享内存通信](/upload/InfoBanner/zyjiaocheng/941/af6c180766344e9f898b5be57027fe27.jpg)
环境
Petalinux2019.1
ubuntu16.04
ZCU106开发板
开始
接着上一篇文章,主要实现一个共享DDR,A53可以读写数据且不被 Linux system Ram占用,裸机也可以读写。
一、开始,修改petalinux config Memory size修改为5fffffff,然后修改设备树,
/include/ "system-conf.dtsi"
/include/ "pl.dtsi"
/ {
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
reserved: buffer@0 {
no-map;
reg = <0x0 0x60000000 0x0 0x20000000>;
};
};
reserved-driver@0 {
compatible = "xlnx,reserved-memory";
memory-region = <&reserved>;
};
};
&roi_get_axi_dma_0 {
status = "disabled";
};
&axi_uartlite_0 {
status = "disabled";
};
注意这里从0x60000000开始,大小是0x20000000,注意后面从0x70000000开始是R5的256M内存地址,不能乱用,只有0x6000000~0x6ffffffff这段256M空间是共享的。
二、我试过直接用dev/mem去读写,结果发现不对,可能因为cache的原因,所以这里直接写驱动,在探测时直接ioremap入下,这样就不会cache了,应该有更好的方法,但我比较菜,不会。。。
share_mem_dev.mem_start = 0x60000000;//regdata[1];
share_mem_dev.mem_end = 0x6fffffff;//regdata[1] + regdata[2];
if (!request_mem_region(share_mem_dev.mem_start,
share_mem_dev.mem_end - share_mem_dev.mem_start + 1,
DRIVER_NAME)) {
printk("Couldn't lock memory region at %p\n",
(void *)share_mem_dev.mem_start);
//rc = -EBUSY;
}
share_mem_dev.base_addr = ioremap(share_mem_dev.mem_start, share_mem_dev.mem_end - share_mem_dev.mem_start + 1);
if (!share_mem_dev.base_addr) {
printk("share-mem-drv: Could not allocate iomem\n");
}
setup_cdev();
printk("memstart %x, end %x, vaddr %x\r\n", share_mem_dev.mem_start, share_mem_dev.mem_end, share_mem_dev.base_addr);
return 0;
然后read、write就是读写了
三、测试
R5程序如下:
for(i = 0; i < 100; i++){
shared_mem_write_int(i, i);
}
for(i = 0; i < 100; i++){
if(shared_mem_write_read(i) != i)
xil_printf("mem test err : %d !!\r\n", i);
}
xil_printf("shared Mem write finished!! \r\n");
while(1){
Xil_DCacheFlushRange(0x60000000, 0x10000000);
sleep(2);
xil_printf("0x60000000 val %d\r\n", shared_mem_write_read(0));
xil_printf("0x60000004 val %d\r\n", shared_mem_write_read(1));
xil_printf("0x60000008 val %d\r\n", shared_mem_write_read(2));
xil_printf("0x6000000C val %d\r\n", shared_mem_write_read(3));
}
Linux下程序如下:
int main(int argc, char* argv[])
{
//char *data = argv[1];
//if(!data) printf("no data input\r\n");
int data[100];
int fd = open("/dev/shared-mem-drv", O_RDWR);
read(fd, data, 100*4);
for(int i = 0; i < 20; i++){
printf("data[%d]: %d\r\n", i , data[i]);
}
for(int i = 0; i < 100; i++){
data[i] = 200 - i;
}
write(fd, data, 100*4);
close(fd);
return 0;
}
然后开机,成功探测到驱动,Linux端:
R5端读写测试
在linux下执行读写测试app:
此时R5端
END
内容总结
以上是互联网集市为您收集整理的Zynq UltraScale Linux A53和裸机 R5共享内存通信全部内容,希望文章能够帮你解决Zynq UltraScale Linux A53和裸机 R5共享内存通信所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。