Zynq新增AXI DMA调用ioread32触发imprecise external abort故障
Zedboard openwifi新增SG模式AXI DMA触发内核崩溃排查方案
故障根因
你遇到的Unhandled fault: imprecise external abort (0x406)是ZYNQ平台CPU访问外设寄存器时收到总线错误应答的典型表现,故障点出在ioread32读寄存器阶段,说明驱动映射的虚拟地址对应的物理地址不可访问,具体原因集中在以下几类:
- 地址配置不匹配:Vivado块设计中实际分配给新增AXI DMA的寄存器基地址、地址空间大小和设备树中填写的
reg属性不一致,驱动ioremap映射到了不存在的物理地址区间,CPU读操作无外设应答触发错误。 - 地址空间冲突:新增DMA分配的
0x80420000 ~ 0x8042FFFF区间和其他已挂载外设的地址段重叠,实际访问到了不支持32位寄存器读操作的其他IP。 - 硬件连线/时钟/复位异常:AXI DMA的S_AXI_LITE寄存器接口接错端口(比如误接PS的HP口而非GP口)、时钟频率和GP口时钟不匹配、复位引脚处于有效状态导致外设未正常上电,都会导致寄存器访问无应答。
- IP配置与设备树/驱动不匹配:
- 开了Scatter Gather模式但设备树未填写对应的SG属性,或compatible字段和Vivado中使用的DMA IP版本不对应,驱动按错误的寄存器偏移访问未实现的地址段
- Vivado中仅使能了单方向通道(比如只开S2MM用于FPGA传数据到PS),但驱动默认初始化MM2S和S2MM两个通道,读取未实现的通道寄存器触发错误
- 设备树中填写的中断号、通道数量等参数和硬件实际配置不符,初始化流程跑飞访问非法地址。
排查与解决步骤
- 核对硬件地址配置
打开Vivado块设计的Address Editor页面,确认新增AXI DMA的S_AXI_LITE接口分配到的基地址确实为0x80420000、空间大小0x10000,地址段无冲突告警。确认后重新导出XSA硬件文件,基于新的XSA生成设备树,不要手动硬改地址参数。 - 修正设备树节点
参考openwifi原生工程已有的两个DMA节点写法,补全新增DMA的所有必填属性,SG模式单S2MM通道的参考配置如下:axi_dma_2: dma@80420000 { compatible = "xlnx,axi-dma-v7_1"; // 字段和你Vivado中DMA IP的版本严格对应 reg = <0x0 0x80420000 0x0 0x10000>; interrupt-parent = <&intc>; // 与工程使用的中断控制器节点一致 interrupts = <0 31 4>; // 中断号与Vivado中连线到IRQ_F2P的端口号匹配,4代表高电平触发 dma-channels = <1>; xlnx,include-sg = <1>; xlnx,sg-length-width = <23>; // 与DMA IP配置中SG传输长度位宽一致 xlnx,include-mm2s = <0>; // 禁用未使用的MM2S通道,避免驱动访问不存在的寄存器 #dma-cells = <1>; }; - 核对硬件连线
逐一确认块设计中以下连接正确:- DMA的
s_axi_lite接口接PS的M_AXI_GP端口,不要接AXI HP端口 s_axi_lite_aclk时钟与PS GP口时钟同源,通常为100MHzaxi_resetn复位引脚接PS输出的低有效外设复位信号,不要悬空- DMA的中断引脚正确连接到PS的IRQ_F2P端口,中断号与设备树配置一致
- DMA的
- 硬件访问验证
系统启动后先不加载xilinx_dma驱动,用devmem命令直接读取DMA的版本ID寄存器验证硬件通路:
如果执行该命令就触发崩溃,说明是硬件连线/地址配置问题,和驱动无关;如果能正常读出数值,再排查设备树和驱动版本匹配问题即可。devmem 0x80420000
内容的提问来源于stack exchange,提问作者Aaron3219
相关产品推荐
相关产品推荐

