
教程前言在Zynq嵌入式视觉开发中单摄像头采集已经无法满足双目检测、图像对比、全景拍摄等项目需求。本文基于米联客2024版官方FDMA双摄像头方案适配H3-CZ08P-7100Zynq7100工业开发板完整实现双OV5640摄像头同步采集、FDMA数据搬运、VDMA帧缓存输出、屏幕实时显示全套功能。本方案区别于传统VDMA单路图像采集依托FDMA专用数据搬运内核实现两路摄像头数据并行传输不占用PS核心资源帧率更高、延迟更低非常适合嵌入式机器视觉、双目测距、工业图像采集场景。全程复刻官方demo流程零基础可直接复刻落地。✅ 全套开发环境硬件平台米联客 H3-CZ08P-7100Zynq7100 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中断对应硬件中断号121Linux系统中断号 121 - 32 89CAM0中断对应硬件中断号122Linux系统中断号 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 Textfdma_fun_0:fdma_fun80010000{compatiblefdma demo;reg0x0 0x80010000 0x0 0x10000;interrupt-parent gic;interrupts 0 89 4;mem_addr0x10000000;mem_size0x1800000;};节点compatible字段与内核驱动fdma_function.c精准匹配保证平台驱动正常加载。3.3 双路I2C与摄像头节点配置由于两路摄像头硬件安装方向不同需独立挂载两路GPIO模拟I2C总线i2c2、i2c3分别配置参数适配画面方向。3.3.1 第一路摄像头i2c2Plain Texti2c2:i2c0{statusokay;compatible i2c-gpio;#address-cells1;#size-cells0;i2c-gpio,delay-us2;sda-gpios CAM_gpio_sccb 1 0 GPIO_ACTIVE_HIGH;scl-gpios CA_gpio_sccb 0 GPIO_ACTIVE_HIGH;ov5640_0:camera3c{compatibleinit-ov5640;reg0x3c;reset-gpios gpio_rstn GPIO_ACTIVE_HIGH;5640,xsize 640;5640,ysize480;5640,flip0x46;5640,mirror0x07;};};3.3.2 第二路摄像头i2c3Plain Texti2c3:i2c1{statusokay;compatible i2c-gpio;#address-cells1;#size-cells0;i2c-gpio,delay-us2;sda-gpiosCAM1_gpio_sccb 1 0 GPIO_ACTIVE_HIGH;scl-gpios CAM1_gpio_sccb 0 GPIO_ACTIVE_HIGH;ov5640_1:camera3c{compatibleinit-ov5640;reg0x3c;reset-gpios gpio_rstn 0 0 GPIO_ACTIVE_HIGH;5640,xsize640;5640,ysize480;5640,flip0x40;5640,mirror0x01;};};通过flip、mirror参数修正两路摄像头画面方向解决子卡摄像头反向安装导致的画面倒置问题。四、系统镜像完整编译流程4.1 前置文件部署必须使用uisrc-lab-xlnx20220601版本开发包版本不匹配会导致驱动加载失败可前往米联客官网下载对应版本。将Vitis生成的fsbl.elf、system_wrapper.bit放入指定目录同时将修改好的设备树分别放入kernel-dts、uboot-dts文件夹注意uboot设备树仅支持zynq-mz7x.dts单文件。4.2 一键编译脚本执行进入开发包脚本目录依次执行官方编译脚本Plain Textcd /uisrc-lab-xlnx/scriptssource mz7xcfg.sh./move_files.sh./make_uboot.sh./make_kernel.sh./create_image.sh4.3 SD卡分区与烧录Plain Text./make_parted.sh./deploy_image.sh输入SD卡设备盘符sdb并确认自动完成分区格式化与系统烧录执行sync命令同步数据。五、应用程序编译与板级测试5.1 程序文件部署将官方demo中的camx2_fdma_hdmi文件夹完整拷贝至SD卡根目录/home/uisrc下。5.2 开发板上电与登录硬件接线插入双OV5640摄像头、DP/HDMI显示器、串口、电源拨码设置H3-CZ08P-7100切换为SD卡启动模式登录账号uisrc / 密码root5.3 本地编译应用程序Plain Textcd camx2_fdma_hdmi/gcc show_windows.c -o show编译完成后生成show可执行文件为双摄像头显示主程序。5.4 运行测试Plain Textsudo ./show程序运行后显示器同步输出双路OV5640实时画面两路摄像头独立采集、同步渲染功能正常。 补充说明若出现画面红蓝反色属于FPGA图像数据时序适配问题可通过修改Vivado工程信号时序修正不影响核心采集功能。六、常见问题排查汇总摄像头无画面、无数据中断号配置错误、设备树未更新、FDMA节点冲突、I2C总线初始化失败单路摄像头工作另一路黑屏对应I2C总线配置异常、摄像头复位引脚失效、画面翻转参数不匹配程序编译报错开发包版本不匹配、系统库缺失、文件拷贝不完整画面倒置/镜像异常修改设备树中flip、mirror参数适配摄像头安装方向七、方案总结与项目拓展本方案基于FDMA实现了Zynq7100双摄像头并行采集显示相比传统单路VDMA采集CPU占用率更低、实时性更强是嵌入式机器视觉项目的基础核心工程。基于本工程可快速拓展双目测距算法移植、图像灰度处理、画面叠加、动态帧率调节、工业图像抓拍存储等高级功能广泛适配工业检测、智能监控、嵌入式视觉终端等项目场景。