一.海思Hi3516ev100视频输入(VI)模块--结合例程理解

一.海思Hi3516ev100视频输入(VI)模块*

1. vi简介
视频输入(VI)模块实现的功能:通过 ITU-R BT656/601/1120 接口或 Digital Camera接口、 MIPI Rx(含 MIPI 接口、 LVDS 接口和 HISPI 接口)接收视频数据。
两种工作模式:
当工作在离线模式时,将接收到的数据存入到指定的内存区域。(DDR)
当工作在在线模式时, VI 会将数据直接送给 VPSS。在此过程中, VI 可以对接收到的原始视频图像数据进行裁剪(Crop)等处理,并实现一路原始视频图像输入,输出一路视频图像功能。

2. 重要概念

视频输入设备

 视频输入设备支持若干种时序输入,负责对时序进行解析。

在线模式与离线模式

离线模式:是指 VI 写出数据到 DDR,然后与之绑定的模块从 DDR 读取数据。
在线模式:在线是指 VI 与 VPSS 之间的在线数据流传输,在此模式下 VI 不会
		 写出到 DDR,而是直接把数据流送给 VPSS。

视频物理通道

视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将
数据输出到 DDR 之前,它可以实现裁剪等功能,具体功能见各芯片的详细描述。

掩码

掩码用于指示 VI 设备的视频数据来源。

镜头畸变校正(LDC)

镜头畸变校正,一些低端镜头容易产生图像畸变,需要根据畸变程度对其图像进
行校正。

DCI

Dynamic Contrast Improvement,动态对比度调节。对图像进行动态的对比度调
节,即在增强图像暗区亮度时而不使亮区过亮,或降低亮区亮度时而不使暗区过暗。

DIS

DIS 模块通过比较当前图像与前两帧图像采用不同自由度的防抖算法计算出当前图
像在各个轴方向上的抖动偏移向量,然后根据抖动偏移向量对当前图像进行校正,
从而起到防抖的效果。

视频输入硬件单元的功能图

在这里插入图片描述

通道功能框图

Hi3516A VI 通道功能框图
在这里插入图片描述

Hi3518EV200 VI 通道功能框图
在这里插入图片描述
Hi3519V100 VI 通道功能框图
在这里插入图片描述

视频输入设备
Hi3516A/Hi3518EV200/Hi3519V100 芯片只有一个 VI 设备,即 Dev0。 Dev0 支持BT.656、 BT.601、 DC、 MIPI Rx(MIPI、 LVDS、 HISPI 接口)输入。 Dev0 不支持非连续 pixel clock 时序。

视频物理通道
Hi3516A/Hi3518EV200/Hi3519V100 VI 硬件单元仅包含 1 个 VI 视频物理通道,即Chn0。不存在次通道,但支持扩展通道。

Hi3516A 物理通道支持的典型分辨率如 720p@30、 1080p@30、 1080p@60、20481536@30、 25921944@30 等。
Hi3518EV200 物理通道支持的典型分辨率如 720p@30、 1080p@30。
Hi3519V100 物理通道支持的典型分辨率如 1080P@120、 20481536@60、25921944@60、 38402160@30、 46083456@15。
视频扩展通道
扩展通道是物理通道的扩展,主要实现缩放功能,其数据来源于物理通道。Hi3516A/Hi3518EV200/Hi3519V100 最多支持 16 个扩展通道。

绑定关系
Hi3516A/Hi3518EV200/Hi3519V100 VI 的物理通道与所对应的设备固定绑定,不允许改变它们的绑定关系。

掩码配置
掩码的高 12bit 对应着硬件线路的 12 个 pin 脚连接(D0 到 D15 之间的任意连续 12 个pin 脚即可,例如 D4~D15),用户需要根据实际连接情况设置恰当的掩码配置,掩码的最高比特位对应的 pin 为 D15,例如 10bit 输入的 Sensor 连接的 pin 为 D6~D15,掩码配置为 0xFFC00000;同理如果是 14bit 输入时,对应的掩码配置为 0xFFFC0000。

1 路 5M 或 1080p 图像输入场景(12bit 输入)
1 路 5M 或 1080p 图像输入场景下,设置 VI 设备属性时,可根据表 3-1 配置掩码。
1 路 5M 或 1080p 场景下的掩码配置( 12bit)
在这里插入图片描述
设备号 掩码 0 掩码 1
0 0xFFF00000 0x0
1 路 BT.1120 高清输入场景(16bit 输入)
1 路 BT.1120 高清图像输入场景下,设置 VI 设备属性时,可根据表 3-2 配置掩码。
1 路 BT.1120 图像输入场景下的掩码配置( 16bit)
在这里插入图片描述
设备号 掩码 0 掩码 1
0 0xFF000000 0x00FF0000
1 路 D1 图像输入场景(8bit 输入)
1 路图像输入场景下,设置 VI 设备属性时,可根据表配置掩码。
1 路 D1 图像输入场景下的掩码配置( 8bit)
在这里插入图片描述
设备号 掩码 0 掩码 1
0 0xFF000000 0x0
DIS 软件流程
调用 DIS 接口前必须使能 VI 通道。 DIS 的使用流程如图所示:=
Hi3519V100 DIS 使用流程
在这里插入图片描述
DIS 只支持离线模式,只支持在物理通道上运行。
当前 DIS 支持的典型分辨率有 38402160@30、 1080p@60、 720p@120;其他分辨率(如 32642448、 4608*3456 等)效果暂未验证。
DIS 视频输入图像格式只支持 Semiplanar420,单分量,只支持非压缩图像。
为了保证 DIS 的性能,请使用 Hi3519V100 的 big-little 环境,如果要运行多业务场景,建议将 A17 CPU 升频到 1.15GHz,且将 DIS 线程绑定到 A17 上运行。
另外 DIS 处理过程中需要使用 VGS/FishEye 模块,如果多个模块调用 VGS、鱼眼功能,可能因 VGS、鱼眼性能不足而导致 DIS 出现丢帧的现象。

主要做了下面的工作:
设置了mipi,摄像头用的是MIPI,应用层只需要用open打开MIPI,用ioctl设置
注册sensor和isp,和设置3A
运行isp线程
设置VI的属性,并使能VI
设置通道属性,和开启通道

调用图谱


		SAMPLE_COMM_VI_StartVi(step3)//start vi dev & chn to capture
			IsSensorInput
			SAMPLE_COMM_VI_StartIspAndVi
				SAMPLE_COMM_VI_StartMIPI(1)//mipi configure
					SAMPLE_COMM_VI_SetMipiAttr
						fd = open("/dev/hi_mipi", O_RDWR);
						ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)
				SAMPLE_COMM_ISP_Init(2)
					sensor_register_callback
					HI_MPI_AE_Register
					HI_MPI_AWB_Register
					HI_MPI_AF_Register
					HI_MPI_ISP_MemInit
					HI_MPI_ISP_SetWDRMode
					HI_MPI_ISP_SetPubAttr
					HI_MPI_ISP_Init
				SAMPLE_COMM_ISP_Run(3)
					pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL)
						Test_ISP_Run
							HI_MPI_ISP_Run
										SAMPLE_COMM_VI_StartDev(4)
					HI_MPI_VI_SetDevAttr
					HI_MPI_ISP_GetWDRMode
					HI_MPI_VI_SetWDRAttr
					HI_MPI_VI_EnableDev
				SAMPLE_COMM_VI_StartChn(5)
					HI_MPI_VI_SetChnAttr
					HI_MPI_VI_SetRotate
					HI_MPI_VI_EnableChn	

``

sample:

stViConfig.enViMode   = SENSOR_TYPE;  //APTINA_AR0130_DC_720P_30FPS
stViConfig.enRotate   = ROTATE_NONE;  //旋转多少度
stViConfig.enNorm     = VIDEO_ENCODING_MODE_AUTO;  //编码模式自动
stViConfig.enViChnSet = VI_CHN_SET_NORMAL; //是否开启镜像
stViConfig.enWDRMode  = WDR_MODE_NONE; //没有WDR
/******************************************
 step 1: 配置mipi
******************************************/
HI_S32 fd;
combo_dev_attr_t *pstcomboDevAttr = NULL;

/* mipi reset unrest */
fd = open("/dev/hi_mipi", O_RDWR);
if (fd < 0)
{
    printf("warning: open hi_mipi dev failed\n");
    return -1;
}
pstcomboDevAttr = &MIPI_CMOS3V3_ATTR;
if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr))
{
    printf("set mipi attr failed\n");
    close(fd);
    return HI_FAILURE;
}
close(fd);

/*****************************************
*step 2: 注册sensor and ISP (include WDR mode).
*note: you can jump over this step, if you do not use Hi3516A interal isp. 
******************************************/
s32Ret = SAMPLE_COMM_ISP_Init(pstViConfig->enWDRMode);
if (HI_SUCCESS != s32Ret)
{
    SAMPLE_PRT("%s: Sensor init failed!\n", __FUNCTION__);
    return HI_FAILURE;
}
/******************************************
*step 3: run isp thread 
*note: you can jump over this step, if you do not use Hi3516A interal isp.
******************************************/
s32Ret = SAMPLE_COMM_ISP_Run();
if (HI_SUCCESS != s32Ret)
{
    SAMPLE_PRT("%s: ISP init failed!\n", __FUNCTION__);
    /* disable videv */
    return HI_FAILURE;
}
/******************************************
*step 3: run isp thread 
*note: you can jump over this step, if you do not use Hi3516A interal isp.
******************************************/
s32Ret = SAMPLE_COMM_ISP_Run();
if (HI_SUCCESS != s32Ret)
{
    SAMPLE_PRT("%s: ISP init failed!\n", __FUNCTION__);
    /* disable videv */
    return HI_FAILURE;
}
/******************************************************
*step 4 : config & start vicap dev
******************************************************/
s32Ret = SAMPLE_COMM_VI_StartDev(0, enViMode);
if (HI_SUCCESS != s32Ret)
{
    SAMPLE_PRT("%s: start vi dev[%d] failed!\n", __FUNCTION__, i);
    return HI_FAILURE;
}
/******************************************************
* Step 5: config & start vicap chn (max 1) 
******************************************************/
RECT_S stCapRect;
SIZE_S stTargetSize;
ViChn = 0;
stCapRect.s32X = 0;
stCapRect.s32Y = 0;
stCapRect.u32Width = 1280;
stCapRect.u32Height = 720;

stTargetSize.u32Width = stCapRect.u32Width;
stTargetSize.u32Height = stCapRect.u32Height;
//通道使能
s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig);
if (HI_SUCCESS != s32Ret)
{
    SAMPLE_COMM_ISP_Stop();
    return HI_FAILURE;
}

``

注意点总结:

根据sensor型号,设置MIPI接口。

   /* 1. reset mipi */
    ioctl(fd, HI_MIPI_RESET_MIPI, &stcomboDevAttr.devno);

    /* 2. reset sensor */
    ioctl(fd, HI_MIPI_RESET_SENSOR, &stcomboDevAttr.devno);

    /* 3. set mipi attr */
    if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, &stcomboDevAttr))
    {
        printf("set mipi attr failed\n");
        close(fd);
        return HI_FAILURE;
    }

    /* 4. unreset mipi */
    ioctl(fd, HI_MIPI_UNRESET_MIPI, &stcomboDevAttr.devno);

    /* 5. unreset sensor */
    ioctl(fd, HI_MIPI_UNRESET_SENSOR, &stcomboDevAttr.devno);

    close(fd);

配置vi dev时注意的参数:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这里采用的是DC模式

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值