基于Altera MM Mailbox IP的Arria V HPS与Nios处理器通信疑问
基于Arria V HPS与Nios通过MM Mailbox IP通信的DS-5侧实现方案
关于DS-5是否需要引入额外邮箱库的问题
不需要额外引入专用邮箱库。Nios IDE里的altera_avalon_mailbox_simple.h是Altera专门为Nios软核封装的HAL层适配库,DS-5是面向HPS硬核的裸机/Linux应用开发环境,本身就不提供针对Nios的适配库,你直接手动操作邮箱IP的寄存器即可完成通信,无需额外找适配库。
关于邮箱地址映射的问题
你完全可以复用现有mmap_fpga_peripherals的逻辑完成邮箱地址映射,操作步骤如下:
- 先将
sopc-create-header-files生成的头文件导入DS-5项目的代码目录,在对应源码中引入该头文件 - 在
mmap_fpga_peripherals函数中新增邮箱地址映射逻辑即可,参考修改后的代码:
// 提前定义全局邮箱访问指针 volatile void *fpga_mailbox; void mmap_fpga_peripherals() { h2f_lw_axi_master = mmap(NULL, h2f_lw_axi_master_span, PROT_READ | PROT_WRITE, MAP_SHARED, fd_dev_mem, h2f_lw_axi_master_ofst); if(h2f_lw_axi_master == MAP_FAILED) { printf("ERROR: h2f_lw_axi_master mmap() failed.\n"); printf(" errno = %s\n", strerror(errno)); close(fd_dev_mem); exit(EXIT_FAILURE); } fpga_buttons = h2f_lw_axi_master + BUTTONS_0_BASE; fpga_hex_displays[0] = h2f_lw_axi_master + HEX_0_BASE; fpga_hex_displays[1] = h2f_lw_axi_master + HEX_1_BASE; fpga_hex_displays[2] = h2f_lw_axi_master + HEX_2_BASE; fpga_hex_displays[3] = h2f_lw_axi_master + HEX_3_BASE; fpga_hex_displays[4] = h2f_lw_axi_master + HEX_4_BASE; fpga_hex_displays[5] = h2f_lw_axi_master + HEX_5_BASE; // 新增邮箱地址映射 fpga_mailbox = h2f_lw_axi_master + MAILBOX_SIMPLE_0_BASE; }
注意:上述
mmap逻辑仅适用于HPS跑Linux用户态应用的场景,如果HPS跑的是裸机程序,不需要走mmap映射,直接用HPS侧H2F LW AXI总线的物理基址加上MAILBOX_SIMPLE_0_BASE的偏移,直接操作对应指针即可访问寄存器。
邮箱寄存器操作逻辑
Altera MM Mailbox Simple IP的寄存器偏移是固定的,你直接通过映射后的指针操作即可:
- 偏移0x0:命令寄存器,写入数据即为向Nios发送命令,读取可判断邮箱是否为空
- 偏移0x4:响应寄存器,读取数据即为获取Nios返回的响应,写入可判断邮箱是否为满
你只需要和Nios侧的通信逻辑对齐收发规则,就能完成双向通信,不需要额外做库移植。
内容的提问来源于stack exchange,提问作者techno
相关产品推荐
相关产品推荐

