海思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/EAV,BT.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.3V,IT6801的输出电压可通过寄存器配置(通常为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-receiver@4a { 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设备(如
- 绑定数据源:这是关键一步,告诉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 信号完整性与抗干扰设计
对于高清视频(如1080p60),148.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处理能力。
选择IT6801+Hi3531D的组合,是在成本、开发周期、性能和集成度之间取得的一个很好平衡,特别适合嵌入式视频处理设备。
6.3 长期运行稳定性测试
产品化过程中,稳定性测试至关重要。
- 压力测试:让系统连续采集不同分辨率(720p, 1080p)的视频源,持续运行24小时甚至更长时间,监控是否有死机、内存泄漏、图像卡顿或丢帧。
- 热插拔压力测试:频繁地插拔HDMI线缆,模拟用户不规范操作,测试系统是否能快速、稳定地重新检测并恢复图像。
- 温湿度测试:在高低温环境下运行,检查低温启动和高温长时间运行的稳定性。高温下芯片发热可能影响信号质量。
- 多源兼容性测试:使用不同品牌、不同型号的HDMI源设备(电脑、游戏机、摄像机、机顶盒)进行测试,确保兼容性良好。
调试这类视频接口,示波器和逻辑分析仪是最得力的助手。尤其是带有协议分析功能的逻辑分析仪,可以直接解码出BT.1120的数据和同步信号,直观地对比发送端(IT6801)和接收端(Hi3531D VI采样点)的数据是否一致,能极大提升排查效率。整个项目下来,最深的一点体会就是:硬件设计是根基,必须扎实;软件配置是桥梁,必须精确;而调试的过程,就是拿着原理图和示波器,不断验证设想、定位偏差、直至两者严丝合缝对接上的过程。当屏幕上终于稳定出现清晰的采集画面时,那种成就感就是对之前所有折腾的最好回报。
