海思3559A SDK 2.0.3.1 实战:手把手教你配置BT656视频输入(附完整代码)

海思3559A SDK 2.0.3.1 实战:手把手教你配置BT656视频输入(附完整代码)
海思3559A SDK 2.0.3.1实战BT656视频输入配置全流程解析当开发者拿到海思3559A芯片时往往会遇到一个尴尬的情况官方SDK中竟然没有提供BT656视频输入的示例代码。这就像给你一把高级瑞士军刀却找不到开瓶器的那个刀片。本文将带你从硬件原理到代码实现彻底解决这个痛点。1. 硬件基础与寄存器配置海思3559AV100的硬件设计决定了BT656接口的特殊性。与常见的MIPI接口不同BT656使用并行数据总线这需要开发者对硬件连接有清晰认识。1.1 引脚复用与时钟配置通过查阅《Hi3559AV100_PINOUT_CN》手册可以发现VI CMOS2接口与MIPI RX Port2/Port3共用引脚。这意味着硬件设计时需要特别注意接口选择通过时钟使能实现不需要直接配置引脚复用寄存器关键寄存器配置位于PERI_CRG650x12010104需要设置bit[11:9]为111来使能VI CMOS2时钟。实际操作中可以通过两种方式实现// 直接写入寄存器值 devmem 0x12010104 32 0xCEBEDB或者修改驱动代码中的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. 驱动层关键修改SDK中的sensor_config函数负责传感器初始化但原始代码对BT656支持不完善。我们需要深入分析驱动层实现。2.1 传感器类型判断在sysconfig.c中is_coms函数用于判断接口类型static int is_coms(char *name) { unsigned int len SENSOR_NAME_LEN; if ((0 strncmp(bt1120, name, len)) || (0 strncmp(bt656, name, len)) || (0 strncmp(bt601, name, len))) { return 1; } return 0; }这个函数告诉我们当传感器名称包含bt656时系统会将其识别为并行接口设备。2.2 Makefile配置在sample/Makefile.param中需要修改传感器类型配置SENSOR0_TYPE ? BT656_HX_TEST SENSOR1_TYPE ? BT656_HX_TEST SENSOR2_TYPE ? BT656_HX_TEST SENSOR3_TYPE ? BT656_HX_TEST3. 应用层代码实现应用层需要新增BT656相关的枚举和结构体定义这是整个配置的核心。3.1 枚举类型扩展在sample_comm.h中新增BT656枚举typedef enum hiSAMPLE_SNS_TYPE_E { // ...其他传感器类型 BT656_HX_TEST, SAMPLE_SNS_TYPE_BUTT, } SAMPLE_SNS_TYPE_E;3.2 设备属性配置BT656的设备属性配置与MIPI传感器有很大不同主要区别在于配置项BT656设置MIPI典型设置输入模式INPUT_MODE_BT656INPUT_MODE_MIPI数据格式DATA_TYPE_YUV422_8BITDATA_TYPE_RAW_12BIT扫描方式VI_SCAN_PROGRESSIVEVI_SCAN_PROGRESSIVE像素格式PIXEL_FORMAT_YVU_SEMIPLANAR_422PIXEL_FORMAT_RGB_BAYER_12BPP具体实现代码如下combo_dev_attr_t MIPI_BT656_ATTR_HX { .devno 2, .input_mode INPUT_MODE_BT656, .data_rate DATA_RATE_X1, .img_rect {0, 0, 720, 576}, .mipi_attr { DATA_TYPE_YUV422_8BIT, HI_MIPI_WDR_MODE_NONE, {0, 1, 2, 3, -1, -1, -1, -1} } }; 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_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL, VI_HSYNC_NEG_HIGH, VI_VSYNC_VALID_SINGAL, VI_VSYNC_VALID_NEG_HIGH, { 0, 720, 0, // hsync_hfb, hsync_act, hsync_hhb 0, 576, 0, // vsync0_vhb, vsync0_act, vsync0_hhb 0, 0, 0 // vsync1_vhb, vsync1_act, vsync1_hhb } }, VI_DATA_TYPE_YUV, HI_FALSE, {720, 576}, { {{720, 576}}, {VI_REPHASE_MODE_NONE, VI_REPHASE_MODE_NONE} }, {WDR_MODE_NONE, 576}, DATA_RATE_X1 };3.3 管道和通道配置管道(Pipe)和通道(Chn)的配置也需要相应调整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, HI_FALSE, { PIXEL_FORMAT_YVU_SEMIPLANAR_422, DATA_BITWIDTH_8, VI_NR_REF_FROM_RFR, COMPRESS_MODE_NONE }, HI_FALSE, {-1, -1} }; VI_CHN_ATTR_S CHN_BT656_ATTR_HX { {720, 576}, PIXEL_FORMAT_YVU_SEMIPLANAR_422, DYNAMIC_RANGE_SDR8, VIDEO_FORMAT_LINEAR, COMPRESS_MODE_NONE, 0, 0, 1, {-1, -1} };4. 功能函数扩展为了让系统能够识别和处理BT656输入需要在各个功能函数中添加对应的case分支。4.1 输入模式判断在SAMPLE_COMM_VI_GetSnsInputMode函数中新增case BT656_HX_TEST: enInputMode INPUT_MODE_BT656; break;4.2 属性结构体拷贝对于每个需要根据传感器类型返回不同配置的函数都需要添加BT656的处理逻辑HI_S32 SAMPLE_COMM_VI_GetComboAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, combo_dev_t MipiDev, combo_dev_attr_t* pstComboAttr) { switch (enSnsType) { // ...其他case case BT656_HX_TEST: hi_memcpy(pstComboAttr, sizeof(combo_dev_attr_t), MIPI_BT656_ATTR_HX, sizeof(combo_dev_attr_t)); break; // ... } } 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; // ... } }4.3 分辨率与帧率设置BT656通常使用标准分辨率如720x576PAL或720x480NTSC帧率一般为25fps或30fpsHI_S32 SAMPLE_COMM_VI_GetSizeBySensor(SAMPLE_SNS_TYPE_E enMode, PIC_SIZE_E* penSize) { switch (enMode) { // ...其他case case BT656_HX_TEST: *penSize PIC_D1_PAL; break; // ... } } HI_S32 SAMPLE_COMM_VI_GetFrameRateBySensor(SAMPLE_SNS_TYPE_E enMode, HI_U32* pu32FrameRate) { switch (enMode) { // ...其他case case BT656_HX_TEST: *pu32FrameRate 25; break; // ... } }5. 调试技巧与问题排查即使按照上述步骤配置完成后仍然可能遇到图像无法显示的问题。这时候需要系统性地排查硬件检查确认电源、时钟、复位信号正常检查并口线连接高速信号对布线有严格要求测量时钟频率是否满足要求软件调试查看VI日志确认中断计数是否增长检查帧率是否稳定确认图像数据是否有丢失后续处理VI调试成功后需要绑定VPSS进行图像处理最后通过VENC进行编码可以通过RTSP拉流或本地保存验证图像质量注意BT656只支持逐行输入如果源是隔行视频如PAL需要先用芯片转换为逐行再接入。通过以上完整的配置流程开发者可以成功在海思3559A平台上实现BT656视频输入功能。这套方案在实际项目中已经验证可行能够稳定接收并处理标准BT656视频信号。