LT9611UXC MIPI/CSI 转 HDMI 桥接芯片固件代码分析
·
LT9611UXC MIPI/CSI 转 HDMI 桥接芯片固件代码分析
概述
LT9611UXC是一款高性能的MIPI DSI/CSI转HDMI 2.0桥接芯片,支持高达4K@60Hz的视频转换。本文分析的固件代码实现了芯片的完整驱动功能,包括MIPI输入检测、视频格式识别、时序配置、HDMI输出等核心功能。
代码架构
文件结构
LT9611UXC_Sample_Code_V4.2_Release/
├── User/
│ ├── config.c/h # 视频时序配置
│ ├── edid.c/h # EDID读写功能
│ ├── globalV.c/h # 全局变量定义
│ ├── i2c_master.c/h # I2C通信驱动
│ ├── include.h # 头文件包含
│ ├── interrupt.h # 中断处理
│ ├── lt9611ux.c/h # 主驱动逻辑
│ ├── main.c/h # 程序入口
│ ├── register.c # 寄存器定义
│ └── uart.h # 串口调试
核心数据结构
视频时序配置
struct video_timing {
u16 hfp; // 水平前沿
u16 hs; // 水平同步
u16 hbp; // 水平后沿
u16 hact; // 水平有效像素
u16 htotal; // 水平总像素
u16 vfp; // 垂直前沿
u16 vs; // 垂直同步
u16 vbp; // 垂直后沿
u16 vact; // 垂直有效行数
u16 vtotal; // 垂直总行数
u8 framerate; // 帧率
u8 vic; // 视频识别码
};
MIPI配置
struct mipi_format {
u8 mipi_mode; // MIPI模式:DSI/CSI
u8 mipi_port; // 输入端口
u8 lane_num; // 通道数
};
核心功能模块
1. 系统初始化
芯片识别与初始化
void LT9611UX_SystemInit(void)
{
LT9611UX_SystemClk(); // 系统时钟配置
LT9611UX_GPIOInit(); // GPIO初始化
LT9611UX_ChipID(); // 读取芯片ID
LT9611UX_SysIntInit(); // 中断系统初始化
LT9611UX_ModeSelect(); // 工作模式选择
}
工作模式配置
支持多种工作模式:
- MIPI模式:DSI或CSI输入
- 输入端口:PortA、PortB或双端口
- 通道数:1/2/4通道配置
2. MIPI输入检测与处理
MIPI时钟检测
u8 LT9611UX_MipiClkDetect(void)
{
if(mipi_setting.mipi_port == 2) {
BK85_50_REG = 0x22; // 检测PortB时钟
} else {
BK85_50_REG = 0x20; // 检测PortA时钟
}
delay1ms(50);
return (BK85_58_REG & BIT_6) ? 1 : 0;
}
视频格式识别
代码支持丰富的视频分辨率,包括:
标准分辨率:
- 640x480@60Hz
- 720x480@60Hz
- 720x576@50Hz
- 1280x720@30/50/60Hz
全高清分辨率:
- 1920x1080@25/30/60Hz
- 1920x1200@60Hz
4K超高清:
- 3840x2160@30/60Hz
- 4096x2160@30/60Hz
自动端口检测
void LT9611UX_PhyAutoCheck(void)
{
// 检测PortA输入时钟
BK85_50_REG = 0x20;
delay1ms(50);
if(BK85_58_REG & BIT_6) {
video_format.mipi_port++;
}
// 检测PortB输入时钟
BK85_50_REG = 0x22;
delay1ms(50);
if(BK85_58_REG & BIT_6) {
video_format.mipi_port++;
}
}
3. 视频处理流程
PCR(像素时钟恢复)稳定化
u8 LT9611UX_MipiPcr(struct Video_Format *video_format)
{
// 配置PCR参数
BKD0_2D_REG = 0x4F; // 上限限制
BKD0_31_REG = 0x20; // 下限限制
BKD0_26_REG = 0x3d; // M设置
BKD0_27_REG = 0x8B; // K值
// 复位PCR
BK81_1D_REG = 0x1f;
BK81_1E_REG = 0x00;
delay1ms(10);
BK81_1E_REG = 0xe0;
BK81_1D_REG = 0xff;
// 等待PCR稳定
for(loopx = 0; loopx < 200; loopx++) {
delay1ms(10);
if(BKD0_97_REG & 0x30) {
return 1; // PCR稳定
}
}
return 0; // PCR不稳定
}
色彩空间转换
支持多种色彩空间转换:
- YUV422转RGB
- YUV420转RGB
- RGB888直通
void LT9611UX_Csc_Set(void)
{
if((video_format.mipi_colorspace == 3) ||
(video_format.mipi_colorspace == 14)) {
// YUV转RGB
BK85_AE_REG = 0x08;
BK85_AF_REG = 0xe0; // 全范围
} else {
// 直通模式
BK85_AE_REG = 0x00;
BK85_AF_REG = 0x00;
}
}
4. HDMI输出配置
TX PLL配置
根据像素时钟配置HDMI发射器的PLL:
void LT9611UX_TxPLL_Set(struct Video_Format *video_format)
{
// 配置PLL频率
BK87_87_REG = 0x10 | ((u8)((video_format->pclk_khz/2) >> 16));
BK87_88_REG = ((u8)((video_format->pclk_khz/2) >> 8));
BK87_89_REG = ((u8)(video_format->pclk_khz/2));
// 根据像素时钟范围选择PLL参数
if((video_format->pclk_khz < 100000) &&
(video_format->pclk_khz > 10000)) {
BK82_A2_REG = 0x0b;
} else if((video_format->pclk_khz < 200000) &&
(video_format->pclk_khz > 100000)) {
BK82_A2_REG = 0x0a;
}
// ... 更多频率范围配置
}
HDMI模式自动检测
根据像素时钟自动选择HDMI 1.4或HDMI 2.0模式:
if(video_format.pclk_khz > 550000) {
print("\r\n HDMI 2.0");
flag_hdmi_20_mode = 1;
} else {
print("\r\n HDMI 1.4");
flag_hdmi_20_mode = 0;
}
SCDC(状态和控制数据通道)配置
HDMI 2.0必需的SCDC配置:
void LT9611UX_TX_SCDC_Set(SCDC_Status Status)
{
if(Status) {
BKC0_06_REG = 0x30; // 使能scramble和时钟选择
HDMI_WriteI2C_Byte(0x20, 0x03); // 配置SCDC
} else {
BKC0_06_REG = 0x00;
HDMI_WriteI2C_Byte(0x20, 0x00);
}
}
5. EDID管理
EDID读取与验证
u16 LT9611UX_Read_EDID(void)
{
// 读取EDID Block 1
for(loop=0; loop<TXDDC_READ_TIMES; loop++) {
HDMI_ReadI2C_ByteN(loop*TXDDC_PREREAD_NUM,
&edid_block12_buf[loop*TXDDC_PREREAD_NUM],
TXDDC_PREREAD_NUM);
}
// CRC校验
for(loop=0; loop<EDID_BLOCK_SIZE; loop++) {
crc_sum += edid_block12_buf[loop];
}
if((crc_sum%256) != 0) {
return 0; // CRC错误
}
return EDID_BLOCK_SIZE;
}
6. 中断处理
支持多种中断类型:
- HPD热插拔检测
- 视频格式变化检测
- MIPI输入稳定性中断
- EDID读取完成中断
void LT9611UX_SysIntInit(void)
{
BK85_05_REG = 0x7C; // 使能HPD和视频检查中断
BK85_0D_REG = 0xFF;
BK85_0D_REG = 0x7C;
Global_Interrupt(Enable);
}
主循环流程
void LT9611UX_MainLoop(void)
{
if(flag_mipi_chg) {
// MIPI输入变化处理
LT9611UX_Video_Check();
if(video_format.flag_resolution_get != 0) {
LT9611UX_TxPLL_Set(&video_format);
if(LT9611UX_MipiPcr(&video_format) == 1) {
// MIPI稳定,启动HDMI输出
LT9611UX_TXPhy_Set();
LT9611UX_TXDigital_Set();
LT9611UX_Csc_Set();
LT9611UX_TX_Set(Enable);
}
}
}
// HPD状态处理
if(flag_hdmi_hpd_state) {
LT9611UX_HPD_Check();
if(video_format.hdmi_hpd_state) {
LT9611UX_Get_EDID();
LT9611UX_Set_SCDC();
}
}
// 与SoC通信
LT9611UX_Talk_To_Soc();
delay1ms(5);
}
关键技术特性
1. 自适应输入检测
- 自动检测MIPI输入端口
- 动态识别视频格式和时序
- 支持端口自动切换
2. 高兼容性
- 支持广泛的视频分辨率
- 兼容HDMI 1.4和HDMI 2.0
- 支持多种色彩空间
3. 稳定性保障
- PCR稳定化机制
- 多重CRC校验
- 自动重试机制
4. 调试支持
- 丰富的调试信息输出
- 寄存器状态监控
- 实时状态报告
应用场景
该固件代码适用于:
- 移动设备投屏:手机/平板MIPI输出转HDMI
- 嵌入式显示:工业设备视频输出
- 视频转换器:MIPI到HDMI的信号转换
- 监控系统:摄像头CSI信号转HDMI显示
总结
LT9611UXC固件代码展示了完整的视频桥接解决方案,具备高度的自动化和稳定性。通过精密的时钟管理、自适应输入检测和完整的HDMI协议支持,实现了高质量的MIPI到HDMI视频转换功能。代码结构清晰,模块化设计良好,为各种视频转换应用提供了可靠的基础。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)