海思Hi3531D平台HDMI视频采集:IT6801桥接芯片驱动与BT.1120接口调试实战

📅 2026/7/30 9:50:03
海思Hi3531D平台HDMI视频采集:IT6801桥接芯片驱动与BT.1120接口调试实战
1. 项目概述与核心需求最近在折腾一个基于海思Hi3531D的视频处理项目核心需求是要把一路标准的HDMI视频信号实时地采集到Hi3531D的视频输入VI模块中进行处理。听起来是个很常见的需求对吧但真上手了才发现从HDMI到海思芯片的BT.1120数字视频接口中间缺一个关键的“翻译官”。Hi3531D本身并不直接支持HDMI输入它的VI模块通常接收的是并行的数字视频信号比如BT.656、BT.1120或者RAW DATA。而HDMI信号是串行的、带有时钟嵌入和多种数据包的复杂协议。这就需要一个桥接芯片来完成协议转换和解码我选用的就是IT6801。IT6801是一颗非常经典的HDMI接收芯片它能将HDMI信号解码成标准的24位RGB或者YCbCr数字视频信号并输出并行时钟和数据正好可以对接像BT.1120这样的接口。这个“调试手记”系列就是记录我把IT6801成功驱动起来并稳定地将HDMI视频流送入Hi3531D VI通道的整个过程。如果你也在做类似的海思平台视频采集或者任何需要将HDMI接入嵌入式处理器的项目这里面的硬件设计、驱动配置和软件调试的坑或许能帮你省下不少时间。整个链路可以简单理解为HDMI Source比如电脑、相机 - IT6801解码、转换 - BT.1120并行信号 - Hi3531D VI采集、处理。目标就是打通这条链路实现稳定、低延迟的视频采集。2. 硬件设计要点与接口对接硬件是这一切的基础如果硬件连接有问题软件调试会变得异常痛苦甚至徒劳。IT6801与Hi3531D的对接核心在于理解两者的引脚定义和时序要求。2.1 IT6801关键引脚与模式配置IT6801的引脚功能非常丰富我们需要重点关注以下几组视频数据输出VD[23:0]这是24位的数据总线用于输出RGB888或YCbCr 4:4:4格式的视频像素数据。在对接BT.1120时我们通常使用YCbCr 4:2:2格式这时只需要用到其中的16位比如VD[15:0]对应Y、Cb、Cr分量交错排列。同步与时钟信号DE数据有效信号高电平期间表示数据总线上的数据是有效的视频像素。HSYNC行同步信号。VSYNC场同步信号。PCLK像素时钟输出由IT6801根据输入的HDMI信号频率产生。I2C配置接口IT6801的工作模式、输出格式、中断等全部通过I2C总线配置。需要连接到一个可用的I2C控制器比如Hi3531D的I2C0。中断引脚INT用于向主机通知事件如HDMI热插拔检测HPD、音频时钟恢复锁频等。连接到Hi3531D的GPIO配置为中断输入模式。热插拔检测HPD这是一个双向引脚。IT6801可以检测到HDMI源端的5V电源从而感知插拔事件同时主机也可以通过控制此引脚为低电平来“告诉”HDMI源端断开连接。通常需要设计一个由GPIO控制的开关电路。模式配置IT6801支持多种输出模式通过I2C寄存器设置。对于BT.1120我们需要将其配置为“输出DE、HSYNC、VSYNC同步信号”的模式以及“输出YCbCr 4:2:2 16位”的数据格式。具体的寄存器地址和值需要查阅IT6801的数据手册。2.2 BT.1120接口标准与Hi3531D VI对接BT.1120是ITU-R BT.1120标准定义的一种并行数字视频接口广泛应用于专业视频设备。它主要包含时钟CLK像素时钟由发送端IT6801提供接收端Hi3531D VI采样。数据DATA[15:0]16位数据总线在YCbCr 4:2:2模式下每个时钟周期传输一个Y分量和一个Cb或Cr分量顺序为Cb0, Y0, Cr0, Y1, Cb2, Y2, Cr2, Y3...行场同步信号可以是单独的HSYNC/VSYNC也可以嵌入在数据中SAV/EAVBT.656格式。我们采用独立同步信号模式更直观。与Hi3531D VI的硬件连接时钟连接将IT6801的PCLK引脚连接到Hi3531D目标VI通道的VI_CLK输入引脚。这是最关键的一根线时钟不对齐一切数据都是错的。数据连接将IT6801的VD[15:0]连接到Hi3531D VI通道的VI_DATA[15:0]。注意数据位序最好原理图设计时就一一对应。同步信号连接将IT6801的DE、HSYNC、VSYNC分别连接到Hi3531D VI的VI_HSYNC、VSYNC。海思VI也支持DE信号但通常用行场同步即可DE可以不用或作为辅助验证。电源与地确保两芯片的IO电压匹配。Hi3531D的VI接口电压可能是1.8V或3.3VIT6801的输出电压可通过寄存器配置通常为3.3V。如果不一致需要电平转换或选择兼容的电压档位。注意在绘制PCB时要特别注意这些并行信号线的等长处理尤其是时钟线。CLK到各个数据线的长度差应尽可能小以减少建立时间和保持时间的违例风险确保在高速像素时钟下如148.5MHz for 1080p60数据采样的稳定性。3. 软件驱动框架与初始化流程硬件准备就绪后就需要让软件“认识”并驱动这颗IT6801芯片。在海思的SDK环境中这通常涉及驱动层和应用层两个部分。3.1 Linux内核驱动集成理想情况下IT6801应该有现成的内核驱动。我们可以尝试在SDK的drivers/video/目录下寻找或者从芯片原厂获取。如果没有就需要基于I2C设备框架和V4L2子系统编写一个简单的驱动。驱动核心任务包括I2C设备注册在设备树dts文件中声明IT6801的I2C从地址通常为0x48或0x4A并关联一个驱动。探头Probe函数驱动加载时初始化芯片软复位、配置I2C从地址、设置输出格式如1080p60 YCbCr 4:2:2、使能中断等。这些操作都是通过I2C读写一系列寄存器完成的。V4L2子设备注册将IT6801注册为一个V4L2子设备v4l2_subdev这样上层的VI模块就可以通过标准的V4L2接口来获取它的能力如支持的分辨率、格式并控制它。中断服务程序处理热插拔事件。当HDMI线插入或拔出时IT6801会拉低INT引脚驱动应在中断服务程序中读取状态寄存器并通过v4l2_subdev向VI核心上报V4L2_EVENT_SOURCE_CHANGE事件。一个简化的设备树节点示例i2c0 { status okay; clock-frequency 400000; /* 400kHz */ it6801: hdmi-receiver4a { compatible ite,it6801; reg 0x4a; /* I2C地址 */ interrupt-parent gpio0; interrupts 5 IRQ_TYPE_EDGE_FALLING; /* GPIO0_5 作为中断引脚 */ pinctrl-names default; pinctrl-0 it6801_pins; /* 可添加复位引脚等配置 */ }; };3.2 应用层VI通道配置驱动使能后在应用程序中我们需要通过海思的MPP媒体处理平台API来配置VI通道以接收来自IT6801的数据。主要步骤系统初始化调用HI_MPI_SYS_Init()。VI设备与通道初始化确定使用哪个VI设备如VI_DEV_0和哪个物理通道如VI_CHN_0。配置VI设备属性VI_DEV_ATTR_S设置输入模式为“BT.1120 progressive”逐行时钟边沿数据位宽等。配置VI通道属性VI_CHN_ATTR_S设置采集分辨率、像素格式如PIXEL_FORMAT_YVU_SEMIPLANAR_422即YUV422SP、压缩模式等。调用HI_MPI_VI_SetDevAttr()和HI_MPI_VI_SetChnAttr()应用配置。最后调用HI_MPI_VI_EnableDev()和HI_MPI_VI_EnableChn()使能设备和通道。绑定数据源这是关键一步告诉VI通道数据从哪里来。我们需要将IT6801对应的MIPI_RX或VI_DEV具体看海思SDK的管线绑定说明与我们的VI通道绑定。命令可能是HI_MPI_SYS_Bind(src, dst)。配置VI设备属性时有几个参数需要与IT6801的实际输出严格匹配viDevClkEdge像素时钟的采样边沿上升沿或下降沿需要与IT6801输出一致。viDataEdge数据变化的边沿通常与时钟边沿相反。viDataSeq数据位序是Y/Cb/Cr交错顺序需要根据IT6801的配置和硬件连接来确定。4. 关键调试步骤与问题排查理论配置完成后真正的挑战才开始。下面是我在调试中遇到的核心问题及解决方法。4.1 I2C通信与芯片状态确认首先必须确认主控能通过I2C与IT6801正常通信。检查设备树与引脚复用确认i2c0已使能且对应的SDA、SCL引脚没有被其他功能复用。检查IT6801的I2C地址是否正确。使用i2c-tools调试在Linux系统启动后使用i2cdetect -l查看I2C总线然后用i2cdetect -y 0假设是i2c-0扫描总线上所有设备。你应该能看到IT6801的地址例如0x4a被识别出来。读写测试寄存器IT6801有器件ID寄存器如0x1A。使用i2cget和i2cset命令尝试读取看返回值是否符合手册预期。这是验证通信链路是否畅通的最直接方法。实操心得如果I2C通信失败首先用示波器或逻辑分析仪抓取SDA和SCL波形。检查是否有ACK信号。常见问题包括上拉电阻缺失或阻值过大、总线被其他设备占用、地址错误等。4.2 视频时序获取与VI参数校准IT6801成功解码HDMI信号后我们需要知道它具体输出了什么样的时序分辨率、帧率、像素时钟以便精确配置VI。读取IT6801状态寄存器IT6801有寄存器可以报告当前检测到的视频模式如0x0A, 0x0B寄存器。通过I2C读取这些值可以知道是720p、1080p还是其他格式。使用示波器测量这是最可靠的方法。用示波器测量PCLK的频率、HSYNC和VSYNC的周期和脉宽。例如1080p60的像素时钟是148.5MHz行同步周期约29.63us。配置VI时序参数在VI_DEV_ATTR_S中需要设置viTiming结构体包括hSyncWidth,vSyncWidth行、场同步脉冲宽度。hBackPorch,vBackPorch行、场后肩。hActiveWidth,vActiveHeight有效图像区域即分辨率。hFrontPorch,vFrontPorch行、场前肩。hTotalWidth,vTotalHeight总行/场周期。这些参数必须与IT6801输出的时序完全一致否则VI无法正确锁定图像会出现错位、撕裂、抖动等问题。最准确的方式是从IT6801的寄存器中直接读取这些时序参数如果支持或者根据标准视频格式如CEA-861查表获得并用示波器验证。4.3 图像异常问题分析与解决即使通信和时序都对了采集到的图像也可能出现各种异常。问题现象可能原因排查思路与解决方法无图像VI获取帧超时1. 时钟未连接或错误。2. VI通道未使能或绑定错误。3. 同步信号极性配置错误。1. 示波器查PCLK是否送到VI_CLK引脚频率是否正确。2. 检查HI_MPI_VI_EnableChn返回值用cat /proc/umap/vi查看通道状态。3. 尝试在VI配置中反转HSYNC或VSYNC的极性viHsyncPol,viVsyncPol。图像错位、撕裂1. VI时序参数前后肩等设置不准确。2. 数据与时钟相位不匹配。1. 精确测量并重新计算所有时序参数特别是hBackPorch和hActiveWidth。2. 调整viDevClkEdge和viDataEdge的组合。图像色彩异常1. 像素格式不匹配。2. 数据位序错误。3. IT6801输出色彩空间未配置为YCbCr。1. 确认IT6801配置为YCbCr 4:2:2输出VI配置为对应的YUV422SP格式。2. 检查viDataSeq尝试更换Y/Cb/Cr的顺序如YUV, YVU...。3. 用读取寄存器方式确认IT6801色彩输出模式。图像闪烁、不稳定1. 信号完整性差时钟抖动数据线干扰。2. 电源噪声大。3. HDMI源端输出不稳定。1. 检查PCB布线确保时钟和数据线等长远离干扰源。2. 测量IT6801和Hi3531D的电源纹波必要时增加去耦电容。3. 更换一个稳定的HDMI源如测试图案发生器进行对比。热插拔不响应1. IT6801中断引脚未配置或连接错误。2. 驱动中断服务程序未正确编写或注册。3. HPD电路设计有问题。1. 用万用表或示波器检查插入HDMI时INT引脚是否有跳变。2. 检查驱动中request_irq是否成功中断处理函数是否被调用。3. 检查HPD引脚电路确保主机可以控制其输出。一个具体的调试案例我曾遇到采集1080p图像时右侧总有几列像素是绿色的花屏。排查后发现是hActiveWidth设置比实际有效像素少了几十个时钟周期。VI在行有效结束后仍然在采集后续时钟周期的数据而这些数据可能是消隐期的残留值或下一行的开头导致色彩错乱。通过精确测量一行中DE信号高电平的持续时间即有效像素区间并换算成像素时钟数修正hActiveWidth后问题解决。5. 性能优化与稳定性提升当基本功能调通后下一步就是追求稳定和低延迟。5.1 降低采集延迟视频采集的端到端延迟由多个环节构成IT6801内部处理延迟这颗芯片本身会有几行的缓冲延迟这是固定的无法改变。VI模块帧缓冲海思VI通常会有至少2-3帧的缓冲用于防止丢帧。可以通过调整VI通道属性中的u32Depth缓冲区深度来减少缓冲帧数但设置过小如1在系统繁忙时容易导致丢帧。需要在稳定性和延迟间权衡对于实时性要求高的应用可以尝试设置为2。获取帧策略调用HI_MPI_VI_GetChnFrame获取视频帧。使用BLOCK阻塞模式比NOBLOCK非阻塞模式延迟更可控。可以创建一个高优先级的专用线程来循环获取帧避免被其他任务抢占。内存访问确保视频缓冲区内存是物理连续的并且已映射到内核空间供VIPP视频输入预处理等后续模块直接访问避免不必要的拷贝。5.2 处理多分辨率与EDID一个实用的采集系统需要能自适应不同的HDMI输入源分辨率。监听分辨率变化如前所述依靠IT6801的热插拔和中断功能。当驱动检测到SOURCE_CHANGE事件后应用程序应重新读取IT6801的新时序参数。动态重配置VI在应用层收到分辨率变化事件后需要先HI_MPI_VI_DisableChn和HI_MPI_VI_DisableDev然后根据新的分辨率、帧率、时序重新设置VI_DEV_ATTR_S和VI_CHN_ATTR_S再重新使能。这个过程会有短暂的中断。EDID模拟IT6801可以支持EDID扩展显示识别数据的模拟。你可以通过I2C预先烧写一段EDID数据到IT6801的EEPROM或通过寄存器模拟告诉HDMI源端你的系统支持哪些分辨率如只支持1080p和720p从而引导源端输出你期望的格式避免不兼容的分辨率出现。5.3 信号完整性与抗干扰设计对于高清视频如1080p60148.5MHz的像素时钟已经属于高频信号必须重视信号完整性。阻抗匹配BT.1120并行总线应尽可能做到阻抗控制。虽然不像高速串行信号那么严格但保持大致相同的走线长度和特性阻抗有助于减少反射。等长布线PCLK到所有DATA线的长度差尽量控制在几十mil以内。HSYNC、VSYNC、DE也应做等长处理。电源去耦在IT6801和Hi3531D的每个电源引脚附近放置一个0.1uF的陶瓷电容并在电源入口处放置一个10uF的钽电容。这是抑制电源噪声的常规且有效的方法。地平面保证完整、连续的地平面为高速信号提供最短的回流路径。6. 进阶功能与扩展思考基础采集稳定后可以探索一些更进阶的功能来完善系统。6.1 音频流的同步提取IT6801在解码视频的同时也能提取HDMI中的音频数据I2S或SPDIF格式。如果你需要同步采集音频需要硬件连接将IT6801的I2S输出引脚BCK, LRCK, DATA连接到Hi3531D的I2S或AIO音频IO输入引脚。软件配置配置IT6801的音频输出寄存器使能音频提取并设置正确的格式采样率、位数。同时在Hi3531D端配置AIO模块来接收I2S流。音视频同步这是一个复杂的课题。可以利用IT6801输出的音频时钟MCLK作为参考或者使用时间戳PTS在应用层进行同步。海思的MPP通常提供音视频绑定的机制。6.2 与其他视频输入方案的对比IT6801方案成熟稳定但并非唯一选择。在项目选型初期我也对比过其他方案专用HDMI RX芯片如ADI的ADV7611、TI的TFP401等。性能更强大支持HDCP但价格更高电路更复杂。FPGA方案使用FPGA直接解码HDMI灵活性最高可以定制任何输出格式并能实现超低延迟。但开发难度大成本高适合量产后对成本不敏感或有特殊需求的项目。USB HDMI采集卡方案通过USB将采集盒连接到主控。优点是免驱动开发兼容性好。缺点是延迟高通常100ms且需要主控有强大的USB和CPU处理能力。选择IT6801Hi3531D的组合是在成本、开发周期、性能和集成度之间取得的一个很好平衡特别适合嵌入式视频处理设备。6.3 长期运行稳定性测试产品化过程中稳定性测试至关重要。压力测试让系统连续采集不同分辨率720p, 1080p的视频源持续运行24小时甚至更长时间监控是否有死机、内存泄漏、图像卡顿或丢帧。热插拔压力测试频繁地插拔HDMI线缆模拟用户不规范操作测试系统是否能快速、稳定地重新检测并恢复图像。温湿度测试在高低温环境下运行检查低温启动和高温长时间运行的稳定性。高温下芯片发热可能影响信号质量。多源兼容性测试使用不同品牌、不同型号的HDMI源设备电脑、游戏机、摄像机、机顶盒进行测试确保兼容性良好。调试这类视频接口示波器和逻辑分析仪是最得力的助手。尤其是带有协议分析功能的逻辑分析仪可以直接解码出BT.1120的数据和同步信号直观地对比发送端IT6801和接收端Hi3531D VI采样点的数据是否一致能极大提升排查效率。整个项目下来最深的一点体会就是硬件设计是根基必须扎实软件配置是桥梁必须精确而调试的过程就是拿着原理图和示波器不断验证设想、定位偏差、直至两者严丝合缝对接上的过程。当屏幕上终于稳定出现清晰的采集画面时那种成就感就是对之前所有折腾的最好回报。