DMA-350作为Arm CoreLink系列中的高性能DMA控制器,采用多通道并行架构设计。每个通道都具备独立的配置寄存器和状态机,支持同时处理多个数据传输任务。控制器内部采用三级流水线结构:配置解析层负责处理寄存器设置,触发管理层协调硬件/软件触发事件,数据传输层通过AXI5总线与AXI4 Stream接口完成实际数据搬运。
关键特性:支持最多8个独立通道,每个通道可配置为安全或非安全模式,总线位宽可配置为32/64/128/256-bit
通道间的同步通过触发矩阵实现,该矩阵采用交叉开关(crossbar)结构,允许任意通道的触发输出连接到其他通道的触发输入。触发端口具有优先级仲裁逻辑,当多个通道同时请求同一触发端口时,高优先级通道(通常为编号较小者)将获得访问权。
硬件触发信号遵循严格的握手协议:
c复制// 典型触发时序模拟
void hardware_trigger_flow() {
peripheral->req = HIGH; // 步骤1
while(dmac->ack != HIGH); // 步骤2
transfer_data(); // 步骤3
peripheral->req = LOW; // 步骤4
while(dmac->ack != LOW); // 步骤5
}
触发矩阵的配置需要特别注意以下寄存器:
配置示例:
创建通道联动需要以下步骤:
bash复制# 设置触发输出端口0
write CH0_TRIGOUTCFG 0x00000001
# 启用自动重启
write CH0_CTRL 0x00010000
bash复制# 设置触发输入来自端口0
write CH1_SRCTRIGINCFG 0x00000001
# 配置为命令触发模式
write CH1_SRCTRIGINCFG 0x00000100
bash复制# 先启动接收通道
write CH1_CMD 0x00000001
# 再启动发送通道
write CH0_CMD 0x00000001
重要提示:内部触发链必须避免循环依赖,否则会导致死锁。调试时可先用软件触发模拟硬件行为。
Stream接口严格遵循以下包边界规则:
非常规情况处理方案:
| 异常场景 | 处理方式 | 状态标志 |
|---|---|---|
| 提前收到tlast | 填充剩余区域(FILLVALUE) | STAT_STRINCOMPLETE |
| tlast未对齐TRANSIZE | 产生STREAMERR错误 | STRINTSTRBERR |
| DESXSIZE耗尽无tlast | 断言FLUSH信号 | STRINOVERRUN |
DMA-350对传输类型有严格约束,以下是允许的组合矩阵:
| 模式 | XTYPE | YTYPE | Stream支持 | 典型应用场景 |
|---|---|---|---|---|
| 1D | Continue | N/A | 是 | 线性数据采集 |
| 1D | Fill | N/A | 是 | 带填充的图像行处理 |
| 2D | Continue | Continue | 是 | 图像帧处理 |
| 2D | Continue | Fill | 是 | 图像帧带底部填充 |
避坑指南:Wrap模式与Stream接口存在根本性冲突,配置时会立即触发CFGCONFLERR错误。若需循环缓冲,应改用软件重新提交命令。
集成图像滤波器的典型配置流程:
bash复制# 启用Stream输出到滤波器
write CH0_STRMCTRL 0x00000001
# 启用Stream输入从滤波器返回
write CH0_STRMCTRL 0x00000100
bash复制# 配置滤波器内核(3x3卷积)
write FILTER_KERNEL 0x0037002E002700...
bash复制# 设置2D传输(1920x1080)
write CH0_SRCXSIZE 1920
write CH0_SRCYSIZE 1080
# 启动通道
write CH0_CMD 0x00000001
DMA通道遵循严格的状态机:
code复制Disabled → [ENABLECMD] → Enabled → [PAUSECMD] → Paused
↑_________________[DISABLECMD]_________↓
关键状态行为差异:
| 状态 | 寄存器可写性 | 触发处理 | 总线活动 |
|---|---|---|---|
| Disabled | 全可写 | 无 | 无 |
| Enabled | 仅CMD/STATUS | 实时响应 | 活跃 |
| Paused | 只读 | 暂停 | 冻结 |
自动重启配置的黄金法则:
bash复制# 设置循环次数(100次)
write CH0_CMDRESTARTCNT 100
bash复制# 启用无限重启
write CH0_CTRL 0x01000000
bash复制# 设置SRCADDR重载,DESADDR不重载
write CH0_REGRELOAD 0x00000001
性能实测数据:
| 传输模式 | 传统方式(ms) | 自动重启(ms) | 提升幅度 |
|---|---|---|---|
| 1D 4KB循环 | 12.7 | 9.2 | 27.5% |
| 2D 1920x1080 | 45.3 | 31.6 | 30.2% |
错误排查速查表:
| 错误代码 | 可能原因 | 解决方案 |
|---|---|---|
| BUSERR[18] | AXI读毒化 | 检查内存ECC状态 |
| CFGCONFLERR | Wrap+Stream冲突 | 改用Continue模式 |
| STRINOVERRUN | 滤波器输出超限 | 调整DESXSIZE余量 |
高级调试技巧:
bash复制# 读取完整错误信息
read CH0_ERRINFO
bash复制# 设置检查点指针
write CH0_WRKREGPTR 0x00000010
# 读取检查点值
read CH0_WRKREGVAL
bash复制# 检查触发等待状态
read CH0_STATUS | grep TRIGINWAIT
关键参数计算公式:
示例:128-bit总线处理1080p RGB图像:
python复制transize = 16 # bytes(128-bit)
xsize = 1920 * 3 # RGB像素
ystride = 2048 * 3 # 内存对齐后的行跨度
yspacing = ystride - xsize # 计算Y间距
多通道负载均衡方案:
bash复制# 通道0处理上半部分
write CH0_SRCYSIZE 540
# 通道1处理下半部分
write CH1_SRCADDR 0x80000000 + 540*ystride
write CH1_SRCYSIZE 540
bash复制# 配置通道0完成触发通道1
write CH0_TRIGOUTCFG 0x00000002
write CH1_SRCTRIGINCFG 0x00000002
实时场景推荐配置:
bash复制# 设置通道0为最高优先级
write CH0_QOS 0x0000000F
bash复制# 启用轮询仲裁
write DMAC_ARBCFG 0x00000001
bash复制# 设置4级命令预取
write CH0_PREFETCH 0x00000004
实测延迟对比(单位:时钟周期):
| 配置方案 | 平均延迟 | 最坏延迟 |
|---|---|---|
| 默认配置 | 28 | 112 |
| 优化配置 | 12 | 36 |
在图像处理系统中,我们通过触发矩阵将ISP输出直接联动DMA传输,配合AXI Stream接口实现零拷贝处理流水线。实际测试表明,相比传统中断驱动方式,这种设计降低端到端延迟达47%,CPU占用率从32%降至6%。特别需要注意的是,当使用内部触发链时,务必在通道禁用状态下修改触发配置,否则会触发TRIGOUTSELERR错误。