海思3559A SDK 2.0.3.1实战BT656视频输入全流程解析与源码改造指南当工程师第一次拿到海思3559A开发板和官方SDK时往往会发现一个尴尬的现实——虽然芯片规格明确标注支持BT656视频输入但SDK中却找不到任何相关示例代码。本文将彻底解决这个痛点从硬件接口原理到SDK源码改造提供一套完整的BT656接入方案。1. 硬件基础与接口原理在开始代码修改前我们需要明确几个关键硬件特性引脚复用关系Hi3559AV100的VI CMOS2接口与MIPI RX Port2/Port3共用物理引脚时钟配置必须通过PERI_CRG65寄存器的bit[11:9]使能VI CMOS2时钟信号类型仅支持逐行输入如需接入PAL等隔行信号需外接转换芯片硬件连接示意图如下信号类型物理引脚复用控制寄存器BT656VI CMOS2PERI_CRG65[11:9]MIPI RXPort2/3同左提示实际硬件设计中建议用示波器检查BT656的时钟信号27MHz和数据信号是否稳定这是后续软件调试的基础。2. SDK源码深度改造2.1 时钟配置的两种实现方式在SDK 2.0.3.1版本中我们发现有两条路径可以配置BT656所需的时钟方法一直接寄存器操作# 通过devmem工具直接配置CRG寄存器 devmem 0x12010104 32 0xCEBEDB方法二修改驱动源码需要修改sysconfig.c中的coms_clock_config函数static void coms_clock_config(int index) { if(0 index) { reg_write32(0x5 15, 0x7 15, (unsigned long)reg_crg_base0x0104); } else if(1 index) { reg_write32(0x6 21, 0x7 21, (unsigned long)reg_crg_base0x0104); } else if(2 index) { reg_write32(0x7 9, 0x7 9, (unsigned long)reg_crg_base0x0104); } }两种方法对比方法优点缺点适用场景寄存器操作快速验证重启失效前期调试驱动修改永久生效需要重新编译正式产品2.2 VI模块关键结构体配置BT656配置的核心在于三个关键结构体1. VI_DEV_ATTR_S设备属性VI_DEV_ATTR_S DEV_BT656_ATTR_HX { VI_MODE_BT656, VI_WORK_MODE_1Multiplex, {0x00FF0000, 0}, // 注意掩码与官方手册差异 VI_SCAN_PROGRESSIVE, { -1, -1, -1, -1}, VI_DATA_SEQ_YUYV, { /* 时序参数 */ }, VI_DATA_TYPE_YUV, HI_FALSE, {720 , 576}, /* 其他参数 */ };2. VI_PIPE_ATTR_S管道属性VI_PIPE_ATTR_S PIPE_BT656_ATTR_HX { VI_PIPE_BYPASS_NONE, HI_FALSE, // UV skip enable HI_TRUE, // ISP Bypass 720, 576, PIXEL_FORMAT_YVU_SEMIPLANAR_422, COMPRESS_MODE_NONE, DATA_BITWIDTH_8, /* 其他参数 */ };3. VI_CHN_ATTR_S通道属性VI_CHN_ATTR_S CHN_BT656_ATTR_HX { {720, 576}, PIXEL_FORMAT_YVU_SEMIPLANAR_422, DYNAMIC_RANGE_SDR8, VIDEO_FORMAT_LINEAR, /* 其他参数 */ };关键参数说明掩码设置au32ComponentMask[0] 0x00FF0000与官方文档建议不同像素格式必须使用PIXEL_FORMAT_YVU_SEMIPLANAR_422ISP旁路设置bIspBypassHI_TRUE以跳过ISP处理2.3 传感器类型枚举扩展在sample_comm.h中新增BT656枚举类型typedef enum hiSAMPLE_SNS_TYPE_E { // 原有传感器类型... BT656_HX_TEST, SAMPLE_SNS_TYPE_BUTT, } SAMPLE_SNS_TYPE_E;2.4 配置加载逻辑改造需要修改多个获取属性的函数以SAMPLE_COMM_VI_GetDevAttrBySns为例HI_S32 SAMPLE_COMM_VI_GetDevAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, VI_DEV_ATTR_S* pstViDevAttr) { switch (enSnsType) { // 其他传感器case... case BT656_HX_TEST: hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), DEV_BT656_ATTR_HX, sizeof(VI_DEV_ATTR_S)); break; default: // 默认处理 } return HI_SUCCESS; }类似修改还需要应用于SAMPLE_COMM_VI_GetPipeAttrBySnsSAMPLE_COMM_VI_GetChnAttrBySnsSAMPLE_COMM_ISP_GetIspAttrBySns3. 编译配置与系统集成3.1 Makefile配置修改在sample/Makefile.param中指定传感器类型SENSOR0_TYPE ? BT656_HX_TEST SENSOR1_TYPE ? BT656_HX_TEST SENSOR2_TYPE ? BT656_HX_TEST SENSOR3_TYPE ? BT656_HX_TEST3.2 内核模块加载保持原有的ko加载顺序不变insmod sysconfig.ko insmod hi_osal.ko # 其他模块加载...4. 调试技巧与问题排查当配置完成后仍无图像输出时建议按照以下流程排查硬件检查电源电压特别是1.8V和3.3V27MHz时钟信号质量数据线对地阻抗软件日志分析cat /proc/umap/vi重点关注中断计数是否增长帧率是否稳定图像尺寸是否正确信号测量使用逻辑分析仪检查BT656的SAV/EAV码测量行同步和场同步信号数据通路验证// 在驱动中添加调试打印 printk(VI buffer addr: %p, size: %d\n, pstFrame-addr, pstFrame-size);常见问题解决方案现象可能原因解决方法无中断时钟未配置检查PERI_CRG65寄存器图像错位时序参数错误调整HSYNC/VSYNC参数色彩异常像素格式不匹配确认YUV顺序5. 进阶应用与VPSS/VENC集成完成VI配置后典型的视频处理流水线如下graph LR BT656输入--VI--VPSS--VENC--输出关键绑定代码示例HI_MPI_VPSS_BindVi(VPSS_GRP, VI_PIPE); HI_MPI_VENC_BindVpss(VENC_CHN, VPSS_GRP);配置建议VPSS组号与VI管道号保持一致对于720x576分辨率建议VPSS使用默认缩放模式VENC配置为H.264 Baseline Profile6. 性能优化技巧内存带宽优化// 在VI属性中启用压缩 stViDevAttr.enCompressMode COMPRESS_MODE_SEG;中断优化# 设置VI中断CPU亲和性 echo 1 /proc/irq/xx/smp_affinity低延迟配置stViPipeAttr.enBypassMode VI_PIPE_BYPASS_NONE; stViChnAttr.u32Depth 2; // 减少缓冲区数量实测性能指标720x57625fps指标数值测量条件CPU占用5%单核运行延迟80msVI到VENC全通路内存带宽120MB/s无压缩通过本文的详细配置和优化开发者可以充分发挥海思3559A的BT656接口能力构建稳定高效的视频采集系统。
海思3559A SDK 2.0.3.1 实战:手把手教你搞定BT656视频输入(附源码修改详解)
发布时间:2026/6/12 4:40:59
海思3559A SDK 2.0.3.1实战BT656视频输入全流程解析与源码改造指南当工程师第一次拿到海思3559A开发板和官方SDK时往往会发现一个尴尬的现实——虽然芯片规格明确标注支持BT656视频输入但SDK中却找不到任何相关示例代码。本文将彻底解决这个痛点从硬件接口原理到SDK源码改造提供一套完整的BT656接入方案。1. 硬件基础与接口原理在开始代码修改前我们需要明确几个关键硬件特性引脚复用关系Hi3559AV100的VI CMOS2接口与MIPI RX Port2/Port3共用物理引脚时钟配置必须通过PERI_CRG65寄存器的bit[11:9]使能VI CMOS2时钟信号类型仅支持逐行输入如需接入PAL等隔行信号需外接转换芯片硬件连接示意图如下信号类型物理引脚复用控制寄存器BT656VI CMOS2PERI_CRG65[11:9]MIPI RXPort2/3同左提示实际硬件设计中建议用示波器检查BT656的时钟信号27MHz和数据信号是否稳定这是后续软件调试的基础。2. SDK源码深度改造2.1 时钟配置的两种实现方式在SDK 2.0.3.1版本中我们发现有两条路径可以配置BT656所需的时钟方法一直接寄存器操作# 通过devmem工具直接配置CRG寄存器 devmem 0x12010104 32 0xCEBEDB方法二修改驱动源码需要修改sysconfig.c中的coms_clock_config函数static void coms_clock_config(int index) { if(0 index) { reg_write32(0x5 15, 0x7 15, (unsigned long)reg_crg_base0x0104); } else if(1 index) { reg_write32(0x6 21, 0x7 21, (unsigned long)reg_crg_base0x0104); } else if(2 index) { reg_write32(0x7 9, 0x7 9, (unsigned long)reg_crg_base0x0104); } }两种方法对比方法优点缺点适用场景寄存器操作快速验证重启失效前期调试驱动修改永久生效需要重新编译正式产品2.2 VI模块关键结构体配置BT656配置的核心在于三个关键结构体1. VI_DEV_ATTR_S设备属性VI_DEV_ATTR_S DEV_BT656_ATTR_HX { VI_MODE_BT656, VI_WORK_MODE_1Multiplex, {0x00FF0000, 0}, // 注意掩码与官方手册差异 VI_SCAN_PROGRESSIVE, { -1, -1, -1, -1}, VI_DATA_SEQ_YUYV, { /* 时序参数 */ }, VI_DATA_TYPE_YUV, HI_FALSE, {720 , 576}, /* 其他参数 */ };2. VI_PIPE_ATTR_S管道属性VI_PIPE_ATTR_S PIPE_BT656_ATTR_HX { VI_PIPE_BYPASS_NONE, HI_FALSE, // UV skip enable HI_TRUE, // ISP Bypass 720, 576, PIXEL_FORMAT_YVU_SEMIPLANAR_422, COMPRESS_MODE_NONE, DATA_BITWIDTH_8, /* 其他参数 */ };3. VI_CHN_ATTR_S通道属性VI_CHN_ATTR_S CHN_BT656_ATTR_HX { {720, 576}, PIXEL_FORMAT_YVU_SEMIPLANAR_422, DYNAMIC_RANGE_SDR8, VIDEO_FORMAT_LINEAR, /* 其他参数 */ };关键参数说明掩码设置au32ComponentMask[0] 0x00FF0000与官方文档建议不同像素格式必须使用PIXEL_FORMAT_YVU_SEMIPLANAR_422ISP旁路设置bIspBypassHI_TRUE以跳过ISP处理2.3 传感器类型枚举扩展在sample_comm.h中新增BT656枚举类型typedef enum hiSAMPLE_SNS_TYPE_E { // 原有传感器类型... BT656_HX_TEST, SAMPLE_SNS_TYPE_BUTT, } SAMPLE_SNS_TYPE_E;2.4 配置加载逻辑改造需要修改多个获取属性的函数以SAMPLE_COMM_VI_GetDevAttrBySns为例HI_S32 SAMPLE_COMM_VI_GetDevAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, VI_DEV_ATTR_S* pstViDevAttr) { switch (enSnsType) { // 其他传感器case... case BT656_HX_TEST: hi_memcpy(pstViDevAttr, sizeof(VI_DEV_ATTR_S), DEV_BT656_ATTR_HX, sizeof(VI_DEV_ATTR_S)); break; default: // 默认处理 } return HI_SUCCESS; }类似修改还需要应用于SAMPLE_COMM_VI_GetPipeAttrBySnsSAMPLE_COMM_VI_GetChnAttrBySnsSAMPLE_COMM_ISP_GetIspAttrBySns3. 编译配置与系统集成3.1 Makefile配置修改在sample/Makefile.param中指定传感器类型SENSOR0_TYPE ? BT656_HX_TEST SENSOR1_TYPE ? BT656_HX_TEST SENSOR2_TYPE ? BT656_HX_TEST SENSOR3_TYPE ? BT656_HX_TEST3.2 内核模块加载保持原有的ko加载顺序不变insmod sysconfig.ko insmod hi_osal.ko # 其他模块加载...4. 调试技巧与问题排查当配置完成后仍无图像输出时建议按照以下流程排查硬件检查电源电压特别是1.8V和3.3V27MHz时钟信号质量数据线对地阻抗软件日志分析cat /proc/umap/vi重点关注中断计数是否增长帧率是否稳定图像尺寸是否正确信号测量使用逻辑分析仪检查BT656的SAV/EAV码测量行同步和场同步信号数据通路验证// 在驱动中添加调试打印 printk(VI buffer addr: %p, size: %d\n, pstFrame-addr, pstFrame-size);常见问题解决方案现象可能原因解决方法无中断时钟未配置检查PERI_CRG65寄存器图像错位时序参数错误调整HSYNC/VSYNC参数色彩异常像素格式不匹配确认YUV顺序5. 进阶应用与VPSS/VENC集成完成VI配置后典型的视频处理流水线如下graph LR BT656输入--VI--VPSS--VENC--输出关键绑定代码示例HI_MPI_VPSS_BindVi(VPSS_GRP, VI_PIPE); HI_MPI_VENC_BindVpss(VENC_CHN, VPSS_GRP);配置建议VPSS组号与VI管道号保持一致对于720x576分辨率建议VPSS使用默认缩放模式VENC配置为H.264 Baseline Profile6. 性能优化技巧内存带宽优化// 在VI属性中启用压缩 stViDevAttr.enCompressMode COMPRESS_MODE_SEG;中断优化# 设置VI中断CPU亲和性 echo 1 /proc/irq/xx/smp_affinity低延迟配置stViPipeAttr.enBypassMode VI_PIPE_BYPASS_NONE; stViChnAttr.u32Depth 2; // 减少缓冲区数量实测性能指标720x57625fps指标数值测量条件CPU占用5%单核运行延迟80msVI到VENC全通路内存带宽120MB/s无压缩通过本文的详细配置和优化开发者可以充分发挥海思3559A的BT656接口能力构建稳定高效的视频采集系统。