Zynq板PetaLinux环境下无法写入AXI DMA部分寄存器求助
问题描述
我有一块运行PetaLinux的Zynq板,通过.xsa文件配置的AXI DMA实现处理系统(PS)与可编程逻辑(PL)间的数据传输。现在在VITIS中编写验证应用,需要对S2MM_DMACR、S2MM_DMASR、S2MM_DA、S2MM_LENGTH等寄存器写入对应值。当前能正常写入S2MM_DMACR,但S2MM_DA和S2MM_LENGTH始终写不进去——写入后读取验证,这两个寄存器值始终为0,且我确认使用了正确的寄存器偏移地址。
补充说明:通过mmap访问uio0地址来操作寄存器,预期写入S2MM_DA和S2MM_LENGTH后能读取到设置的值,但实际始终为0。FPGA设计基于AXI DMA的标准实现流程。
排查与解决步骤
1. 确认S2MM通道的空闲状态
AXI DMA的S2MM_DA和S2MM_LENGTH寄存器仅在通道处于空闲(Idle)状态时可写入。如果S2MM通道正在运行(比如DMACR中的Run位已置1),这两个寄存器会被硬件锁定,无法修改。
- 操作步骤:先读取S2MM_DMASR寄存器,确认
Idle位(通常为第0位)为1;若通道处于忙碌状态,先通过设置DMACR的Reset位重置通道,等待Idle位置1后再写入DA和LENGTH寄存器。
2. 验证mmap映射的有效性
- 检查映射范围:AXI DMA的S2MM寄存器组偏移至少覆盖0x20(S2MM_DA偏移0x18,S2MM_LENGTH偏移0x20),确保
mmap时指定的长度足够(建议至少映射0x100字节),避免因范围不足导致写操作失效。 - 确认映射权限:
mmap时必须指定PROT_READ | PROT_WRITE权限,无写权限时内核会静默丢弃写入操作。
3. 检查UIO设备树配置
- 确认设备树中uio0节点正确映射AXI DMA的物理地址范围,节点需包含
compatible = "xlnx,axi-dma-1.00.a",且reg属性正确填写DMA的物理基地址与地址长度,无地址重叠或配置错误。 - 检查设备权限:运行程序时需使用root权限,或提前给
/dev/uio0配置普通用户可读写的权限。
4. 确保寄存器写入的对齐与位宽匹配
- S2MM_DA(地址寄存器)和S2MM_LENGTH(长度寄存器)均为32位(或64位,取决于DMA配置),写入时必须按对应位宽对齐:32位寄存器需按4字节对齐写入,禁止使用字节或半字写入操作。
- 用户空间中建议使用
writel()函数进行32位寄存器写入,避免通用write()函数带来的位宽或对齐问题。
5. 硬件层面验证
- 检查DMA配置:在Vivado中确认S2MM通道的地址宽度、数据宽度与软件配置一致,例如若DMA配置为64位地址,软件需写入64位地址值。
- 抓取AXI总线信号:使用Vivado的ILA工具抓取PS到PL的AXI HP总线信号,检查写入DA和LENGTH寄存器时的总线事务是否正常,排查硬件连接或总线错误。
内容的提问来源于stack exchange,提问作者Creator
相关产品推荐
相关产品推荐

