You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:52:51