Hi3519A 接入 BT1120或BT656视频

前言: hi3519A和hi3559a的sdk例子是没有提供BT1120和BT656视频接入的,但实际上硬件是可以支持接入的。不过前提是只支持逐行方式输入,不支持隔行视频,如果想输入PAL制式的隔行视频,请先用芯片转成逐行再接入。

下文只用HI3519A做例子,HI3559A是类似的过程。

  1. 首先从手册上可以看到,对于HI3519A来说,只能在dev3上配置BT1120, 而BT656可以配置dev3和dev4两路,如下图

在这里插入图片描述

这里很重要,因为很快要在加载ko的脚本中用到这个dev了。比如我们现在配置了前面的dev0用mipi或者lvds,后面的dev3用sensor,此时加载load3519a.sh的时候,要指定参数:-sensor0 imx290 -sensor3 bt1120。不过,此时你会发现还是采集不到bt1120的数据,因为海思给的驱动有问题,你需要单独把这个寄存器改了,看下图:

在这里插入图片描述

这里要改成cmos0/cmos1才能采集数据。

  1. 第一步工作准备完成后,后面就简单了,改sample_common_vi.c里面的配置即可,看下图:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

好了,上面就是四个主要的配置项了,实际上要注意的是,代码中使用dev的时候,BT1120只能用0,BT656可以用0/1,其他没什么要注意的了。

  1. 实际在写程序的时候,mipi和bt1120不分先后,哪个先初始化都是可以的,只要cmos那一项配置对了就行了。

  2. 另外还有个lane mode也需要配置,不过要根据自己的板子情况作配置,如果按照上面的还是出不了图,那放心大胆的去叫硬件人员检查去吧。


版权声明:本文为CSDN博主「Keith-Yang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:《用 HI3559A / Hi3519A 接入 BT1120或BT656视频》

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
HI3519是海思半导体推出的一款高性能视频处理器,支持多种数字视频接口标准,包括BT1120。下面是一段示例代码,用于在HI3519上输出1080p30分辨率的视频数据: ```c #include "hi_comm_video.h" #include "hi_common.h" #include "hi_comm_sys.h" #include "mpi_sys.h" #include "mpi_vb.h" #include "mpi_vb2.h" #include "mpi_vi.h" #include "mpi_isp.h" #include "mpi_venc.h" #define FRAME_WIDTH 1920 #define FRAME_HEIGHT 1080 #define FRAME_RATE 30 int main(int argc, char *argv[]) { // 初始化系统 HI_S32 s32Ret = HI_MPI_SYS_Init(); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_SYS_Init failed with error code %#x.\n", s32Ret); return -1; } // 初始化视频缓存 VB_CONFIG_S stVbConf; memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 128; HI_MPI_VB_SetConf(&stVbConf); HI_MPI_VB_Init(); // 初始化视频输入 VI_DEV ViDev = 0; VI_CHN ViChn = 0; VI_ATTR_S stViAttr; memset(&stViAttr, 0, sizeof(VI_ATTR_S)); stViAttr.enIntfMode = VI_MODE_BT1120_1080P; stViAttr.enScanMode = VI_SCAN_PROGRESSIVE; stViAttr.enDataPath = VI_PATH_ISP; stViAttr.enInputDataType = VI_DATA_TYPE_YUV; stViAttr.stSynCfg.stTiming.u32Pck = 1; stViAttr.stSynCfg.stTiming.u32Vs = 5; stViAttr.stSynCfg.stTiming.u32Hs = 200; stViAttr.stSynCfg.stTiming.u32Vact = 1080; stViAttr.stSynCfg.stTiming.u32Hact = 1920; stViAttr.stSynCfg.stTiming.u32Vb = 5; stViAttr.stSynCfg.stTiming.u32Hb = 44; stViAttr.stSynCfg.stTiming.u32Vfb = 5; stViAttr.stSynCfg.stTiming.u32Hfb = 44; stViAttr.stSynCfg.stTiming.u32Phase = 0; s32Ret = HI_MPI_VI_SetDevAttr(ViDev, &stViAttr); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VI_SetDevAttr failed with error code %#x.\n", s32Ret); return -1; } s32Ret = HI_MPI_VI_EnableDev(ViDev); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VI_EnableDev failed with error code %#x.\n", s32Ret); return -1; } s32Ret = HI_MPI_VI_SetChnAttr(ViChn, &stViAttr); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VI_SetChnAttr failed with error code %#x.\n", s32Ret); return -1; } s32Ret = HI_MPI_VI_EnableChn(ViChn); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VI_EnableChn failed with error code %#x.\n", s32Ret); return -1; } // 初始化视频输出 VO_DEV VoDev = 0; VO_CHN VoChn = 0; VO_PUB_ATTR_S stVoPubAttr; memset(&stVoPubAttr, 0, sizeof(VO_PUB_ATTR_S)); stVoPubAttr.u32BgColor = 0x00000000; stVoPubAttr.enIntfType = VO_INTF_BT1120; stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30; stVoPubAttr.enIntfMode = VO_MODE_MASTER; stVoPubAttr.stSyncInfo.enVpssSync = VO_OUTPUT_1080P30; stVoPubAttr.stSyncInfo.enIntfSync = VO_OUTPUT_1080P30; s32Ret = HI_MPI_VO_SetPubAttr(VoDev, &stVoPubAttr); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VO_SetPubAttr failed with error code %#x.\n", s32Ret); return -1; } s32Ret = HI_MPI_VO_Enable(VoDev); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VO_Enable failed with error code %#x.\n", s32Ret); return -1; } VO_CHN_ATTR_S stVoChnAttr; memset(&stVoChnAttr, 0, sizeof(VO_CHN_ATTR_S)); stVoChnAttr.stDispRect.s32X = 0; stVoChnAttr.stDispRect.s32Y = 0; stVoChnAttr.stDispRect.u32Width = FRAME_WIDTH; stVoChnAttr.stDispRect.u32Height = FRAME_HEIGHT; stVoChnAttr.u32Priority = 0; stVoChnAttr.bDeflicker = HI_FALSE; s32Ret = HI_MPI_VO_SetChnAttr(VoChn, &stVoChnAttr); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VO_SetChnAttr failed with error code %#x.\n", s32Ret); return -1; } s32Ret = HI_MPI_VO_EnableChn(VoChn); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VO_EnableChn failed with error code %#x.\n", s32Ret); return -1; } // 开启视频输入 s32Ret = HI_MPI_VI_EnableChn(ViChn); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VI_EnableChn failed with error code %#x.\n", s32Ret); return -1; } // 开启视频输出 s32Ret = HI_MPI_VO_EnableChn(VoChn); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VO_EnableChn failed with error code %#x.\n", s32Ret); return -1; } // 开启视频处理 while (1) { HI_MPI_SYS_MmzAlloc_Cached(&pUserPageAddr[0], &pUserPhyAddr[0], "User", NULL, FRAME_WIDTH * FRAME_HEIGHT * 2); s32Ret = HI_MPI_VI_GetFrame(ViChn, &stViFrameInfo, HI_TRUE); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VI_GetFrame failed with error code %#x.\n", s32Ret); break; } s32Ret = HI_MPI_VO_SendFrame(VoChn, &stViFrameInfo); if (HI_SUCCESS != s32Ret) { printf("HI_MPI_VO_SendFrame failed with error code %#x.\n", s32Ret); break; } HI_MPI_VI_ReleaseFrame(ViChn, &stViFrameInfo); } // 关闭视频处理 HI_MPI_VO_DisableChn(VoChn); HI_MPI_VI_DisableChn(ViChn); HI_MPI_VO_Disable(VoDev); HI_MPI_VI_DisableDev(ViDev); HI_MPI_VB_Exit(); HI_MPI_SYS_Exit(); return 0; } ``` 这段代码假设视频输入采用BT1120接口,分辨率为1080p30,输出采用BT1120接口,分辨率为1080p30,输出画面不做任何处理直接传输。注意,这只是一个示例,实际的代码可能需要根据具体的硬件平台和应用场景进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值