1. 项目背景与核心需求拆解1.1 为什么要在RK3568上做HDMI-IN转MIPI-CSIRK3568这颗芯片在工业网关、边缘计算盒子、商显主板里出镜率极高四核A55加独立NPU的配置接口也够丰富。但有个很现实的问题它的原生视频输入通路主要靠MIPI-CSI而很多场景下客户要求接入的是HDMI信号源——比如把外部摄像机的HDMI输出、机顶盒画面、工业相机的HDMI接口直接喂给主板做编码推流或者AI分析。这时候就需要一颗桥接芯片把HDMI信号转成MIPI-CSIRK628D就是瑞芯微自家生态里最顺手的选择。RK628D这颗芯片本质上是一个视频桥接器支持HDMI输入转MIPI-CSI输出也支持MIPI-CSI输入转HDMI输出双向都能走。我们这里用的是HDMI-IN到MIPI-CSI这个方向。选它而不是选别的桥接方案核心原因有三个第一瑞芯微原厂SDK里有现成驱动内核版本匹配度高不用自己从零写第二DTS配置有参考模板虽然坑不少但至少有路可循第三芯片供货相对稳定工业客户能接受。这个方案适合谁呢如果你正在用RK3568做视频采集、直播编码、AI视觉分析这类项目需要接入HDMI信号源那这套配置就是你要走的路。前提是你得有一定的设备树基础能看懂I2C、MIPI-CSI、V4L2这些概念不然光调DTS就能卡住好几天。1.2 整体方案的核心思路整个链路的信号流向是这样的HDMI信号源 → RK628D的HDMI RX端口 → RK628D内部做格式转换 → RK628D的MIPI-CSI TX端口 → RK3568的MIPI-CSI RX控制器 → V4L2视频节点 → 上层应用。这里面RK628D对RK3568来说就是一个I2C从设备加一个MIPI-CSI信号源。RK3568通过I2C总线配置RK628D的寄存器控制它初始化HDMI接收、设置输出分辨率、启动MIPI输出。同时RK3568的MIPI-CSI控制器要配置成能接收RK628D输出的MIPI信号包括lane数、时钟频率、数据格式这些。方案选型上有个关键决策点RK628D的MIPI输出是走几lane。RK3568的MIPI-CSI控制器支持最多4 lane但实际用几lane取决于你的带宽需求。1080p60的RGB888数据量大概是1920×1080×60×24 ≈ 2.98Gbps加上消隐区大概3.2Gbps左右。如果用4 lane MIPI每lane跑800Mbps就够了如果用2 lane每lane要跑1.6Gbps对信号完整性要求更高。实测下来4 lane更稳走线也好处理。另一个决策点是I2C地址。RK628D的I2C地址由硬件引脚决定常见的是0x50或者0x51。这个必须和硬件原理图对上不然驱动probe都过不去。2. 硬件连接与关键细节2.1 硬件连线检查清单在动DTS之前先把硬件确认一遍。我见过太多人DTS写对了但硬件没接好调了半天以为是软件问题。电源部分RK628D需要1.8V和3.3V供电有些设计还需要1.2V给内核。用万用表量一下每个电源引脚确认电压正常。特别注意HDMI RX的5V检测引脚这个信号用来检测HDMI是否插入如果没接对驱动会认为没有信号源。I2C连线RK628D的SCL和SDA要接到RK3568的某组I2C上同时确认上拉电阻有没有。一般4.7k上拉到1.8V或3.3V具体看你的电平匹配。如果I2C总线上还挂了其他设备注意地址不要冲突。MIPI-CSI连线这是最容易出问题的地方。RK628D的MIPI TX差分对要接到RK3568的MIPI CSI RX差分对上注意P/N不能接反。时钟lane和数据lane的对应关系也要对一般RK628D输出的是1 clock lane 4 data lane。走线要求等长差分阻抗100欧姆这些是PCB设计阶段就要保证的。HDMI接口HDMI的HPD、DDC、TMDS差分对都要接对。HPD是热插拔检测DDC是EDID读取通道这两个信号不对的话信号源不会输出画面。复位和中断RK628D一般有一个复位引脚接到RK3568的某个GPIO上。中断引脚可选如果要用中断方式检测热插拔就接上。2.2 硬件排查的实操心得上电之前先做静态检查用万用表蜂鸣档量一下电源对地有没有短路I2C有没有对地短路MIPI差分对有没有对地短路。这一步能救回不少板子。上电之后先别急着加载驱动先用i2cdetect扫一下总线看RK628D的地址能不能被识别到。命令是i2cdetect -y -r 3假设挂在I2C3上。如果扫不到地址先查电源和I2C连线别往下走。扫到地址之后可以用i2cget读一下芯片ID寄存器确认芯片是活的。RK628D的芯片ID寄存器地址和预期值可以查数据手册读出来对不上说明芯片可能没正常工作。注意有些RK628D模块出厂时I2C地址是0x50有些是0x51还有的是0x50但7位地址左移了一位变成0xA0。i2cdetect显示的是7位地址如果显示0x50那就是0x50如果显示0xA0那说明驱动里要用0xA0。这个细节很容易搞混。3. DTS配置完整解析3.1 I2C节点下的RK628D设备节点先看RK628D作为I2C从设备的配置。这段代码放在对应的I2C控制器节点下面i2c3 { status okay; clock-frequency 400000; rk628d: rk628d50 { compatible rockchip,rk628d; reg 0x50; status okay; reset-gpios gpio3 RK_PA0 GPIO_ACTIVE_LOW; interrupt-parent gpio3; interrupts RK_PA1 IRQ_TYPE_LEVEL_HIGH; power-supply vcc_1v8_s0; // 如果有多个电源域分别列出 // hdmi_rx_1v8-supply vcc_1v8_s0; // hdmi_rx_3v3-supply vcc_3v3_s0; ports { #address-cells 1; #size-cells 0; port0 { reg 0; rk628d_in: endpoint { remote-endpoint hdmi_in; }; }; port1 { reg 1; rk628d_out: endpoint { remote-endpoint mipi_csi2_input; >mipi_csi2 { status okay; ports { #address-cells 1; #size-cells 0; port0 { reg 0; mipi_csi2_input: endpoint { remote-endpoint rk628d_out; >cif { status okay; }; cif_mipi_in { status okay; }; rkcif_mipi_lvds { status okay; port { cif_mipi_in: endpoint { remote-endpoint mipi_csi2_output; >hdmi_in { status okay; // EDID相关配置 // hpd-gpios gpio3 RK_PA2 GPIO_ACTIVE_HIGH; };不过RK628D的HDMI RX部分很多时候是驱动内部处理的DTS里不一定需要单独配置。具体要看驱动实现。4. 内核驱动配置与编译4.1 内核config选项RK628D的驱动在瑞芯微SDK里一般是现成的但需要确保内核config里打开了CONFIG_VIDEO_RK628y CONFIG_VIDEO_ROCKCHIP_CIFy CONFIG_VIDEO_ROCKCHIP_MIPI_CSIy CONFIG_VIDEO_V4L2_SUBDEV_APIy CONFIG_MEDIA_CONTROLLERy CONFIG_VIDEOBUF2_DMA_CONTIGy如果用的是make menuconfig在Device Drivers → Multimedia support → Rockchip Video Capture Devices下面能找到这些选项。RK628的驱动可能在V4L2 subdev或者I2C drivers下面。编译之前先确认驱动源码在不在。一般在drivers/media/i2c/rk628.c或者drivers/media/platform/rockchip/rk628/下面。如果找不到说明SDK版本不对需要找瑞芯微要对应的补丁。4.2 驱动加载顺序与依赖RK628D驱动依赖I2C子系统和V4L2子系统加载顺序上一般没问题因为内核会处理依赖。但要注意的是如果RK628D驱动probe的时候MIPI CSI控制器还没初始化好可能会probe失败。这种情况可以在DTS里调整status的顺序或者用deferred probe机制让内核自动重试。实测中遇到过一个情况RK628D驱动probe成功但video节点没出来查了半天发现是CIF驱动没加载。后来在DTS里把CIF的status改成okay重新编译就正常了。4.3 编译与烧录DTS改完之后编译命令一般是make ARCHarm64 rk3568-evb1-ddr4-v10.img -j$(nproc)或者单独编译dtbmake ARCHarm64 rockchip/rk3568-evb1-ddr4-v10.dtb烧录的时候注意boot.img和dtb都要更新只更新一个可能不生效。用瑞芯微的烧录工具选择对应的分区烧录。提示调试阶段建议用TF卡启动或者网络启动这样改DTS之后不用每次都烧录重启就能生效效率高很多。5. 调试与验证全流程5.1 系统启动后的检查步骤系统起来之后按这个顺序检查第一步看I2C设备有没有被识别i2cdetect -y -r 3如果0x50位置显示UU说明驱动已经绑定了这个地址。如果显示50说明设备在但驱动没绑定。如果什么都不显示说明硬件或I2C配置有问题。第二步看内核日志里RK628D的probe信息dmesg | grep -i rk628正常应该能看到类似rk628d 3-0050: rk628d probed successfully的日志。如果有报错根据错误码排查。第三步看video设备节点ls /dev/video* v4l2-ctl --list-devices应该能看到一个或多个video节点对应的driver name里包含rk628或者rkcif。第四步看media controller拓扑media-ctl -p这个命令会打印出整个media pipeline的拓扑结构能看到RK628D、MIPI CSI、CIF之间的连接关系。如果拓扑不对说明DTS里的endpoint配置有问题。5.2 视频流抓取测试拓扑确认没问题之后就可以抓流了。先用v4l2-ctl查看支持的格式v4l2-ctl -d /dev/video0 --list-formats-ext应该能看到YUYV、NV12、RGB888之类的格式。然后设置格式并抓帧v4l2-ctl -d /dev/video0 --set-fmt-videowidth1920,height1080,pixelformatNV12 --stream-mmap --stream-count10 --stream-totest.nv12如果抓到了数据test.nv12文件大小应该是1920×1080×1.5×10 ≈ 31MB左右。用ffmpeg播放一下ffplay -f rawvideo -pixel_format nv12 -video_size 1920x1080 test.nv12能看到画面就说明链路通了。5.3 分辨率与帧率适配RK628D支持多种HDMI输入分辨率但输出给MIPI CSI的分辨率需要和输入匹配。如果输入是1080p60输出也配成1080p60如果输入是4K30输出也要相应调整。这个一般在驱动里会根据EDID自动协商但有时候需要手动指定。如果抓流时报错VIDIOC_STREAMON: Invalid argument大概率是格式没设对。先用--list-formats-ext看清楚支持哪些格式再设置。帧率不对的话检查一下MIPI的时钟频率。RK628D输出的MIPI时钟和分辨率、帧率、lane数都有关系。公式是MIPI clock (width hblank) × (height vblank) × fps × bpp / lane数 / 2比如1080p60RGB8884 lanehblank和vblank按典型值算MIPI clock大概在400MHz左右。如果时钟设低了帧率上不去设高了可能不稳定。6. 常见问题与排查技巧实录6.1 驱动probe失败问题汇总现象可能原因排查方法i2cdetect扫不到地址电源没供上、I2C线接反、上拉电阻缺失万用表量电压、检查原理图扫到地址但驱动不绑定compatible不匹配、驱动没编译进内核查驱动of_match_table、查.configprobe报-ENODEV复位GPIO没配好、时钟没使能查DTS的reset-gpios和clocksprobe报-EPROBE_DEFER依赖的驱动还没加载查dmesg里的deferred probe列表video节点没出来CIF没使能、media pipeline没连上查DTS的status和endpoint6.2 抓流失败问题排查抓流失败最常见的原因是media pipeline没配好。用media-ctl -p看拓扑如果RK628D的output endpoint没有连到MIPI CSI的input endpoint那肯定抓不到流。另一个常见问题是格式不匹配。RK628D输出的格式和CIF期望的格式不一致时STREAMON会失败。这时候需要用media-ctl --set-v4l2手动设置格式media-ctl -d /dev/media0 --set-v4l2 rk628d 3-0050:0[fmt:UYVY8_2X8/1920x1080] media-ctl -d /dev/media0 --set-v4l2 rockchip-mipi-csi2:0[fmt:UYVY8_2X8/1920x1080]格式设置对了再抓流。6.3 画面异常问题画面花屏、绿屏、撕裂一般是MIPI信号完整性问题。先降lane数或者降分辨率试试如果降下来正常了说明是信号速率太高导致误码。检查PCB走线是否等长、差分阻抗是否匹配、有没有过孔太多。画面颜色不对比如红蓝互换是RGB顺序问题。在DTS或者驱动里调整>hpd-gpios gpio3 RK_PA2 GPIO_ACTIVE_HIGH; interrupts RK_PA2 IRQ_TYPE_EDGE_BOTH;这样插拔HDMI时会产生中断驱动可以响应。7. 性能优化与稳定性调优7.1 MIPI时钟与带宽优化MIPI CSI的时钟频率直接影响带宽和稳定性。RK3568的MIPI CSI控制器支持的最高时钟频率有限制具体值查芯片手册。如果RK628D输出的时钟超过限制要么降分辨率要么降帧率要么增加lane数。实测中1080p60用4 lane是最稳的配置。如果非要上4K建议用2 lane跑4K30或者用4 lane跑4K30但降低帧率到15fps。7.2 内存带宽与DMA优化CIF抓取视频数据到内存走的是DMADDR带宽要留够。1080p60 NV12的数据率大概是1920×1080×1.5×60 ≈ 186MB/s加上读写开销大概要400MB/s的DDR带宽。如果系统里还有其他大带宽模块比如GPU、NPU要合理分配。可以在DTS里给CIF分配专用的DMA通道或者调整DDR的仲裁优先级。瑞芯微SDK里有rockchip,grf相关的配置可以调。7.3 长时间运行稳定性测试调通之后别急着交付先跑个24小时压力测试。用v4l2-ctl循环抓流同时用dmesg -w监控内核日志看有没有报错。重点关注MIPI误码、DMA超时、I2C通信失败这些。如果跑几个小时就挂大概率是散热问题。RK628D功耗不大但也会发热摸一下芯片温度烫手的话加个散热片。8. 实操心得与避坑总结8.1 DTS配置的三个致命坑第一个坑是>gst-launch-1.0 v4l2src device/dev/video0 ! video/x-raw,formatNV12,width1920,height1080,framerate60/1 ! fakesink如果用的是FFmpeg可以用-f v4l2输入ffmpeg -f v4l2 -input_format nv12 -video_size 1920x1080 -i /dev/video0 -c:v copy output.mp4如果要做AI分析可以把抓到的帧送给NPU做推理。RK3568的NPU支持RKNN用RKNN-Toolkit2转换模型用librknn_runtime推理。8.4 一个容易被忽略的细节RK628D的HDMI RX和MIPI TX是独立工作的但内部有FIFO做缓冲。如果HDMI输入的分辨率变了MIPI输出也要跟着变。有些驱动版本不支持动态分辨率切换需要重新初始化。如果客户要求支持多种分辨率热切换要确认驱动版本是否支持不支持的话可能要打补丁。我在实际项目中遇到过客户从1080p切到720p画面直接卡死。后来查驱动发现是分辨率切换时FIFO没复位打了个补丁在切换时复位FIFO就好了。这个补丁后来反馈给瑞芯微新版本SDK里已经合入了。最后再分享一个小技巧调试阶段可以在DTS里把RK628D的status先设成disabled等系统起来之后再通过echo写sysfs节点手动绑定驱动。这样改配置不用重新编译DTS效率高很多。具体路径是/sys/bus/i2c/drivers/rk628d/下面有bind和unbind节点。