Petalinux 2021.1 + Vivado 2021 实战:手把手教你为Zynq板卡移植Linux并搞定AXI DMA驱动
Zynq平台Linux移植与AXI DMA驱动开发全流程实战指南(2021版)
在嵌入式系统开发领域,Xilinx Zynq系列SoC凭借其ARM处理器与FPGA的完美结合,成为高性能嵌入式应用的理想选择。本文将基于Petalinux 2021.1和Vivado 2021工具链,详细讲解如何为Zynq开发板(以ALINX系列为例)从零构建定制Linux系统,并实现AXI DMA驱动的完整开发流程。不同于简单的步骤罗列,本指南将聚焦于版本特异性问题和实战避坑技巧,帮助开发者快速搭建可用的高速数据传输系统。
1. 开发环境准备与工程创建
在开始之前,确保已正确安装以下工具:
- Vivado 2021.1(包含Vitis)
- Petalinux 2021.1
- Ubuntu 18.04/20.04 LTS(推荐)
环境变量配置要点:
source /opt/Xilinx/Vivado/2021.1/settings64.sh source /opt/Xilinx/petalinux/2021.1/settings.sh创建Petalinux工程时,模板选择至关重要:
petalinux-create -t project --template zynq -n ALINX-ZYNQ提示:工程路径不要包含空格或中文字符,否则可能导致后续编译异常
2. Vivado硬件设计关键配置
AXI DMA IP核的配置直接影响系统性能,以下是必须注意的参数:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| Width of Buffer Length Register | ≥24 | 确保DMA能处理大容量数据 |
| Enable Scatter Gather | 关闭 | 简化初始调试 |
| Memory Map Data Width | 64/128位 | 根据FPGA资源选择 |
Block Design连接规范:
- Zynq Processing System IP必须首先配置DDR控制器和时钟
- AXI DMA的
S_AXI_LITE接口连接到Zynq的GP端口 M_AXI_MM2S和M_AXI_S2MM连接到HP端口(高性能端口)
# 生成比特流后导出硬件 write_hw_platform -fixed -include_bit -force ALINX_ZYNQ.xsa3. Petalinux工程配置与设备树定制
导入硬件描述文件后,需特别注意以下配置:
petalinux-config --get-hw-description ../hdf关键配置项:
- Root filesystem type → ext4
- Image Packaging Configuration → 关闭TFTP自动拷贝
- Subsystem AUTO Hardware Settings → 确认DDR容量匹配开发板
设备树修改是DMA驱动正常工作的核心,常见错误包括:
- 节点引用符号
&与名称间缺少空格 - 通道ID未正确分配
- 兼容性字符串拼写错误
/* 正确示例 */ &axi_dma_0 { dma-channel@40400000 { xlnx,device-id = <0x0>; }; dma-channel@40400030 { xlnx,device-id = <0x1>; }; };注意:修改后必须执行清理再编译
petalinux-build -c device-tree -x cleansstate petalinux-build -c device-tree4. 内核配置与驱动适配
针对Petalinux 2021.1的内核配置调整:
必须修改的参数:
- Library routines → Size in Mega Bytes → 25
- General setup → 关闭Stack Protector buffer overflow detection
- Device Drivers → DMA Engine support → 启用Xilinx AXI DMA支持
驱动源码适配要点(基于xilinx_axidma开源驱动):
// 关键修改示例 // axidma_chrdev.c - of_dma_configure(dev->device, NULL); + of_dma_configure(dev->device, NULL, true); // axidma_dma.c - struct siginfo sig_info; + struct kernel_siginfo sig_info;驱动编译配置模板:
CROSS_COMPILE = arm-linux-gnueabihf- ARCH = arm KBUILD_DIR = $(PROJECT)/build/tmp/work/zynq_generic-xilinx-linux-gnueabi/linux-xlnx/5.10+gitAUTOINC+568989d441-r0/linux-zynq_generic-standard-build5. 系统集成与测试验证
完整的镜像生成流程:
petalinux-build petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf \ --fpga images/linux/system.bit \ --u-bootSD卡分区方案建议:
- FAT32分区(≥100MB):存放BOOT.BIN, image.ub, boot.scr
- ext4分区(剩余空间):根文件系统
测试DMA性能的实用命令:
# 加载驱动 insmod axidma.ko # 运行基准测试 ./axidma_benchmark -t 2 -s 1024 -r 1024 -i 1000典型问题排查指南:
- DMA初始化失败 → 检查设备树节点地址是否匹配硬件设计
- 数据传输超时 → 确认HP端口带宽配置
- 驱动加载报错 → 检查内核版本与驱动API兼容性
6. 进阶优化与性能调优
提升DMA传输效率的几种方法:
缓存策略优化:
// 在驱动中设置合适的缓存属性 dma_attrs_set_attribute(&attrs, DMA_ATTR_NON_CONSISTENT, 1);中断优化方案:
- 使用多通道轮询减少中断开销
- 调整DMA中断亲和性
带宽计算参考公式:
实际带宽 = (数据量 × 传输次数) / 耗时 × (1 - 协议开销)在Zynq-7000平台上,通过合理配置可以达到:
- 单HP端口理论带宽:1.6GB/s
- 实际测量带宽:1.2-1.4GB/s(含协议开销)
7. 替代方案与扩展应用
当标准AXI DMA不满足需求时,可以考虑:
VDMA方案对比:
| 特性 | AXI DMA | AXI VDMA |
|---|---|---|
| 视频流支持 | 否 | 是 |
| 帧缓冲 | 不支持 | 支持 |
| 内存占用 | 较低 | 较高 |
自定义IP集成示例:
- 在Vivado中创建AXI4-Lite接口的IP
- 通过DMA将数据传输到自定义IP
- 在驱动中实现ioctl控制接口
// 驱动中典型的IOCTL实现 long axidma_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case AXIDMA_START_XFER: // 启动传输逻辑 break; case AXIDMA_GET_STATUS: // 返回状态信息 break; default: return -ENOTTY; } return 0; }在实际项目中,我们通常会遇到需要同时处理多个DMA通道的情况。这种情况下,建议采用生产者-消费者模式,配合环形缓冲区管理数据传输,可以有效提升系统吞吐量。
