教程前言
在Zynq嵌入式视觉开发中,单摄像头采集已经无法满足双目检测、图像对比、全景拍摄等项目需求。本文基于米联客2024版官方FDMA双摄像头方案,适配H3-CZ08P-7100(Zynq7100)工业开发板,完整实现双OV5640摄像头同步采集、FDMA数据搬运、VDMA帧缓存输出、屏幕实时显示全套功能。
本方案区别于传统VDMA单路图像采集,依托FDMA专用数据搬运内核,实现两路摄像头数据并行传输,不占用PS核心资源,帧率更高、延迟更低,非常适合嵌入式机器视觉、双目测距、工业图像采集场景。全程复刻官方demo流程,零基础可直接复刻落地。
✅ 全套开发环境
- 硬件平台:米联客 H3-CZ08P-7100(Zynq7100)+ CEP X3子卡 + 双OV5640摄像头
- 开发工具:Vivado 2021.1、Vitis 2021.1
- 系统环境:Win10 64位 + 虚拟机Ubuntu 18.04
- 开发包版本:uisrc-lab-xlnx20220601(官方适配版本,必须对应)
- 核心技术栈:FDMA数据搬运、OV5640摄像头驱动、VDMAFB帧缓存、Linux设备树适配
一、方案整体原理与架构
1.1 功能实现流程
双OV5640摄像头通过CEP X3子卡完成硬件接入,采集的图像数据经由FDMA内核搬运至PS端DDR内存,Linux应用程序处理图像数据后,通过VDMA帧缓存驱动输出至DP/HDMI显示接口,最终实现双路摄像头画面同步显示。
1.2 三大核心驱动分工
- OV5640摄像头驱动:基于I2C总线完成摄像头参数初始化、分辨率配置、画面翻转/镜像调节,适配两路不同方向的摄像头硬件安装姿态。
- FDMA输入驱动:通过平台设备树匹配,依托字符驱动+ioctl接口实现DMA数据读取,支持poll阻塞IO,高效搬运双路图像数据流。
- VDMAFB显示驱动:管理Framebuffer显存,将DDR中缓存的双路图像数据输出至显示终端,完成画面渲染。
二、Vivado工程硬件解析(关键参数)
本文不重复基础工程搭建,重点讲解Linux开发必须掌握的硬件核心参数,直接适配H3-CZ08P-7100板卡。
2.1 BD工程核心通路
工程内部完成双摄像头数据通路、FDMA、VDMA、AXI总线、PL-PS中断通路的固化连接,保证两路图像数据独立传输、互不干扰。
2.2 中断号计算(重中之重)
两路摄像头中断接入PL-PS中断组,根据Xilinx官方手册UG1085寄存器规范计算:
- CAM1中断对应硬件中断号121,Linux系统中断号 = 121 - 32 =89
- CAM0中断对应硬件中断号122,Linux系统中断号 = 122 - 32 =90
该中断号为后续设备树配置核心参数,填写错误会导致摄像头无数据、FDMA卡死。
2.3 寄存器地址说明
FDMA、摄像头I2C、复位引脚、VDMA相关寄存器地址,可由Vitis导出硬件参数自动生成,无需手动计算,仅需在设备树中精准匹配即可。
三、设备树深度适配(核心实操)
⚠️ 新手禁止盲目自定义修改,优先使用官方demo自带设备树,本节详解官方标准配置逻辑与修改要点。
3.1 预处理pl.dtsi自动生成节点
Vitis自动生成5个PL硬件节点:CAM0_gpio_sccb、CAM0_uifdma_dbuf_0、CAM1_gpio_sccb、CAM1_uifdma_dbuf_0、gpio_rstn。
关键操作:注释掉CAM0_uifdma_dbuf_0、CAM1_uifdma_dbuf_0两个默认FDMA占位节点,避免与自定义FDMA驱动冲突。
3.2 新增FDMA设备树节点
手动添加FDMA匹配节点,绑定驱动、寄存器、中断与内存地址,完整配置如下:
Plain Text |
节点compatible字段与内核驱动fdma_function.c精准匹配,保证平台驱动正常加载。
3.3 双路I2C与摄像头节点配置
由于两路摄像头硬件安装方向不同,需独立挂载两路GPIO模拟I2C总线(i2c2、i2c3),分别配置参数适配画面方向。
3.3.1 第一路摄像头(i2c2)
Plain Text |
3.3.2 第二路摄像头(i2c3)
Plain Text |
通过flip、mirror参数修正两路摄像头画面方向,解决子卡摄像头反向安装导致的画面倒置问题。
四、系统镜像完整编译流程
4.1 前置文件部署
必须使用uisrc-lab-xlnx20220601版本开发包,版本不匹配会导致驱动加载失败,可前往米联客官网下载对应版本。
将Vitis生成的fsbl.elf、system_wrapper.bit放入指定目录,同时将修改好的设备树分别放入kernel-dts、uboot-dts文件夹(注意:uboot设备树仅支持zynq-mz7x.dts单文件)。
4.2 一键编译脚本执行
进入开发包脚本目录,依次执行官方编译脚本:
Plain Text |
4.3 SD卡分区与烧录
Plain Text |
输入SD卡设备盘符(sdb)并确认,自动完成分区格式化与系统烧录,执行sync命令同步数据。
五、应用程序编译与板级测试
5.1 程序文件部署
将官方demo中的camx2_fdma_hdmi文件夹完整拷贝至SD卡根目录/home/uisrc下。
5.2 开发板上电与登录
- 硬件接线:插入双OV5640摄像头、DP/HDMI显示器、串口、电源
- 拨码设置:H3-CZ08P-7100切换为SD卡启动模式
- 登录账号:uisrc / 密码:root
5.3 本地编译应用程序
Plain Text |
编译完成后生成show可执行文件,为双摄像头显示主程序。
5.4 运行测试
Plain Text |
程序运行后,显示器同步输出双路OV5640实时画面,两路摄像头独立采集、同步渲染,功能正常。
💡 补充说明:若出现画面红蓝反色,属于FPGA图像数据时序适配问题,可通过修改Vivado工程信号时序修正,不影响核心采集功能。
六、常见问题排查汇总
- 摄像头无画面、无数据:中断号配置错误、设备树未更新、FDMA节点冲突、I2C总线初始化失败
- 单路摄像头工作,另一路黑屏:对应I2C总线配置异常、摄像头复位引脚失效、画面翻转参数不匹配
- 程序编译报错:开发包版本不匹配、系统库缺失、文件拷贝不完整
- 画面倒置/镜像异常:修改设备树中flip、mirror参数,适配摄像头安装方向
七、方案总结与项目拓展
本方案基于FDMA实现了Zynq7100双摄像头并行采集显示,相比传统单路VDMA采集,CPU占用率更低、实时性更强,是嵌入式机器视觉项目的基础核心工程。
基于本工程可快速拓展:双目测距算法移植、图像灰度处理、画面叠加、动态帧率调节、工业图像抓拍存储等高级功能,广泛适配工业检测、智能监控、嵌入式视觉终端等项目场景。