跳到主要内容

7.3.4 视频输入

概述

视频输入(VIN)实现的功能:通过 MIPI Rx接口接收视频数据。VIN将接收到的数据给下一个模块VPS,同时也可存入到指定的内存区域,在此过程中,VIN可以对接收到的原始视频图像数据进行处理,实现视频数据的采集。

概念

视频输入设备 视频输入设备主要是指sif,图像数据接口,主要功能接收摄像头模组输出的图像数据,经过offline或者online直接输出到ISP模块进行图像处理。

  • 视频输入设备

​ 视频输入设备主要是指sif,图像数据接口,主要功能接收摄像头模组输出的图像数据,经过offline或者 online直接输出到ISP模块进行图像处理。

  • 视频输入 PIPE

​ 视频输入 PIPE (ISP)绑定在设备后端,负责图像处理,硬核功能配置,支持Multi context。

  • 镜头畸变校正(LDC)

​ 主要负责矫正图像,有时因为镜头曲面造成的图像变形,一些低端镜头容易产生图像畸变,需要根据畸变程 度对其图像进行校正。

  • DIS

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

  • DWE

​ DWE主要是将LDC和DIS集成在一起,包括LDC的畸变矫正和DIS的统计结果。

功能描述

VIN在软件上划分4个部分,如下图所示。

image-20220329195124946

视频输入设备

sif主要功能接收摄像头模组输出的图像数据,经过offline或者online直接输出到ISP模块进行图像处理。Mipi:支持RAW8/RAW10/RAW12/RAW14/RAW16 or YUV422 8bit/10bit。DVP interface: RAW8/RAW10/RAW12/RAW14/RAW16 or YUV422 8bit/10bit。最多支持8路sensor接入。

视频输入PIPE

Isp主要负责图像处理,硬核功能配置,支持Multi context,最多支持8路接入。主要是对图像数据进行流水线处理,输出YUV 图像格式给通道。同时PIPE也包括DIS、LDC的功能。

视频物理通道

VIN的PIPE 包含 2 个物理通道,物理通道0是指isp处理后的数据到ddr,或者是通过ddr给到下一级模块VPS。物理通道1是指isp处理后的数据online到VPS,VIN和VPS的绑定关系请参考“系统控制”章节。

绑定关系

VIN和VPS之间的绑定关系请参考“系统控制”章节 HB_SYS_SetVINVPSMode

API参考

int HB_MIPI_SetBus(MIPI_SENSOR_INFO_S *snsInfo, uint32_t busNum);
int HB_MIPI_SetPort(MIPI_SENSOR_INFO_S *snsInfo, uint32_t port);
int HB_MIPI_SensorBindSerdes(MIPI_SENSOR_INFO_S *snsInfo, uint32_t serdesIdx, uint32_t serdesPort);
int HB_MIPI_SensorBindMipi(MIPI_SENSOR_INFO_S *snsInfo, uint32_t mipiIdx);
int HB_MIPI_SetExtraMode(MIPI_SENSOR_INFO_S *snsInfo, uint32_t ExtraMode);
int HB_MIPI_InitSensor (uint32_t DevId, MIPI_SENSOR_INFO_S *snsInfo);
int HB_MIPI_DeinitSensor (uint32_t DevId);
int HB_MIPI_ResetSensor(uint32_t DevId);
int HB_MIPI_UnresetSensor(uint32_t DevId);
int HB_MIPI_EnableSensorClock(uint32_t mipiIdx);
int HB_MIPI_DisableSensorClock(uint32_t mipiIdx);
int HB_MIPI_SetSensorClock(uint32_t mipiIdx, uint32_t snsMclk);
int HB_MIPI_ResetMipi(uint32_t mipiIdx);
int HB_MIPI_UnresetMipi(uint32_t mipiIdx);
int HB_MIPI_SetMipiAttr(uint32_t mipiIdx, MIPI_ATTR_S mipiAttr);
int HB_MIPI_Clear(uint32_t mipiIdx);
int HB_MIPI_ReadSensor(uint32_t devId, uint32_t regAddr, char *buffer, uint32_t size);
int HB_MIPI_WriteSensor (uint32_t devId, uint32_t regAddr, char *buffer, uint32_t size);
int HB_MIPI_GetSensorInfo(uint32_t devId, MIPI_SENSOR_INFO_S *snsInfo);
int HB_MIPI_SwSensorFps(uint32_t devId, uint32_t fps);
int HB_VIN_SetMipiBindDev(uint32_t devId, uint32_t mipiIdx);
int HB_VIN_GetMipiBindDev(uint32_t devId, uint32_t *mipiIdx);
int HB_VIN_SetDevAttr(uint32_t devId, const VIN_DEV_ATTR_S *stVinDevAttr);
int HB_VIN_GetDevAttr(uint32_t devId, VIN_DEV_ATTR_S *stVinDevAttr);
int HB_VIN_SetDevAttrEx(uint32_t devId, const VIN_DEV_ATTR_EX_S *stVinDevAttrEx);
int HB_VIN_GetDevAttrEx(uint32_t devId, VIN_DEV_ATTR_EX_S *stVinDevAttrEx);
int HB_VIN_EnableDev(uint32_t devId);
int HB_VIN_DisableDev (uint32_t devId);
int HB_VIN_DestroyDev(uint32_t devId);
int HB_VIN_SetDevBindPipe(uint32_t devId, uint32_t pipeId);
int HB_VIN_GetDevBindPipe(uint32_t devId, uint32_t *pipeId);
int HB_VIN_CreatePipe(uint32_t pipeId, const VIN_PIPE_ATTR_S * stVinPipeAttr);
int HB_VIN_DestroyPipe(uint32_t pipeId);
int HB_VIN_StartPipe(uint32_t pipeId);
int HB_VIN_StopPipe(uint32_t pipeId);
int HB_VIN_EnableChn(uint32_t pipeId, uint32_t chnId);
int HB_VIN_DisableChn(uint32_t pipeId, uint32_t chnId);
int HB_VIN_SetChnLDCAttr(uint32_t pipeId, uint32_t chnId,const VIN_LDC_ATTR_S *stVinLdcAttr);
int HB_VIN_GetChnLDCAttr(uint32_t pipeId, uint32_t chnId, VIN_LDC_ATTR_S*stVinLdcAttr);
int HB_VIN_SetChnDISAttr(uint32_t pipeId, uint32_t chnId, const VIN_DIS_ATTR_S *stVinDisAttr);
int HB_VIN_GetChnDISAttr(uint32_t pipeId, uint32_t chnId, VIN_DIS_ATTR_S *stVinDisAttr);
int HB_VIN_SetChnAttr(uint32_t pipeId, uint32_t chnId);
int HB_VIN_DestroyChn(uint32_t pipeId, uint32_t chnId);
int HB_VIN_GetChnFrame(uint32_t pipeId, uint32_t chnId, void *pstVideoFrame, int32_t millSec);
int HB_VIN_ReleaseChnFrame(uint32_t pipeId, uint32_t chnId, void *pstVideoFrame);
int HB_VIN_SendPipeRaw(uint32_t pipeId, void *pstVideoFrame,int32_t millSec);
int HB_VIN_SetPipeAttr(uint32_t pipeId,VIN_PIPE_ATTR_S *stVinPipeAttr);
int HB_VIN_GetPipeAttr(uint32_t pipeId, VIN_PIPE_ATTR_S *stVinPipeAttr);
int HB_VIN_CtrlPipeMirror(uint32_t pipeId, uint8_t on);
int HB_VIN_MotionDetect(uint32_t pipeId);
int HB_VIN_InitLens(uint32_t pipeId, VIN_LENS_FUNC_TYPE_ElensType,const VIN_LENS_CTRL_ATTR_S *lenCtlAttr);
int HB_VIN_DeinitLens(uint32_t pipeId);
int HB_VIN_RegisterDisCallback(uint32_t pipeId,VIN_DIS_CALLBACK_S *pstDISCallback);
int HB_VIN_SetDevVCNumber(uint32_t devId, uint32_t vcNumber);
int HB_VIN_GetDevVCNumber(uint32_t devId, uint32_t *vcNumber);
int HB_VIN_AddDevVCNumber(uint32_t devId, uint32_t vcNumber);
int HB_VIN_SetDevMclk(uint32_t devId, uint32_t devMclk, uint32_t vpuMclk);
int HB_VIN_GetChnFd(uint32_t pipeId, uint32_t chnId);
int HB_VIN_CloseFd(void);
int HB_VIN_EnableDevMd(uint32_t devId);
int HB_VIN_DisableDevMd(uint32_t devId);
int HB_VIN_GetDevFrame(uint32_t devId, uint32_t chnId, void *videoFrame, int32_t millSec);
int HB_VIN_ReleaseDevFrame(uint32_t devId, uint32_t chnId, void *buf);

HB_MIPI_SetBus

【函数声明】

int HB_MIPI_SetBus(MIPI_SENSOR_INFO_S *snsInfo, uint32_t busNum)

【功能描述】

设置sensor的总线号

【参数描述】

参数名称描述输入/输出
snsInfosensor的配置信息输入
busNumbus号输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_SetPort

【函数声明】

int HB_MIPI_SetPort(MIPI_SENSOR_INFO_S *snsInfo, uint32_t port)

【功能描述】

设置sensor的port,取值范围 0~7

【参数描述】

参数名称描述输入/输出
snsInfosensor的配置信息输入
port当前sensor的port号,0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_SensorBindSerdes

【函数声明】

int HB_MIPI_SensorBindSerdes(MIPI_SENSOR_INFO_S *snsInfo, uint32_t serdesIdx, uint32_t serdesPort)

【功能描述】

设置sensor绑定到哪个serdes上

【参数描述】

参数名称描述输入/输出
snsInfosensor的配置信息输入
serdesIdxserdes的索引0~1输入
serdesPortserdes的port号954 01 960 03输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_SensorBindMipi

【函数声明】

int HB_MIPI_SensorBindMipi(MIPI_SENSOR_INFO_S *snsInfo, uint32_t mipiIdx)

【功能描述】

设置sensor绑定哪一个mipi上

【参数描述】

参数名称描述输入/输出
snsInfosensor的配置信息输入
mipiIdxmipi_host的索引 0~3输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor举例

HB_MIPI_SetExtraMode

【函数声明】

int HB_MIPI_SetExtraMode(MIPI_SENSOR_INFO_S *snsInfo, uint32_t ExtraMode);

【功能描述】

设置sensor在DOL2或DOL3下的工作模式

【参数描述】

参数名称描述输入/输出
snsInfosensor的配置信息输入
ExtraMode选择以何种工作模式1. 单路DOL2,值为0
2. DOL2分为两路linear,一路值为1,另一路值为2
3. 单路DOl3,值为0
4. 一路DOl2(值为1)+一路linear(值为4)
5. DOL3分为三路linear,一路为2,一路为3,一路为4

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_InitSensor/HB_MIPI_DeinitSensor

【函数声明】

int HB_MIPI_InitSensor (uint32_t DevId, MIPI_SENSOR_INFO_S  *snsInfo);
int HB_MIPI_DeinitSensor (uint32_t DevId);

【功能描述】

sensor的初始化和释放初始化产生的资源

【参数描述】

参数名称描述输入/输出
devId通路索引,范围0~7输入
snsInfoSensor 信息输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

    MIPI_SENSOR_INFO_S  snsInfo;
MIPI_ATTR_S mipiAttr;
int DevId = 0, mipiIdx = 1;
int bus = 1, port = 0, serdes_index = 0, serdes_port = 0;
int ExtraMode= 0;

memset(snsInfo, 0, sizeof(MIPI_SENSOR_INFO_S));
memset(mipiAttr, 0, sizeof(MIPI_ATTR_S));
snsInfo.sensorInfo.bus_num = 0;
snsInfo.sensorInfo.bus_type = 0;
snsInfo.sensorInfo.entry_num = 0;
snsInfo.sensorInfo.sensor_name = "imx327";
snsInfo.sensorInfo.reg_width = 16;
snsInfo.sensorInfo.sensor_mode = NORMAL_M;
snsInfo.sensorInfo.sensor_addr = 0x36;

mipiAttr.dev_enable = 1;
mipiAttr.mipi_host_cfg.lane = 4;
mipiAttr.mipi_host_cfg.datatype = 0x2c;
mipiAttr.mipi_host_cfg.mclk = 24;
mipiAttr.mipi_host_cfg.mipiclk = 891;
mipiAttr.mipi_host_cfg.fps = 25;
mipiAttr.mipi_host_cfg.width = 1952;
mipiAttr.mipi_host_cfg.height = 1097;
mipiAttr.mipi_host_cfg->linelenth = 2475;
mipiAttr.mipi_host_cfg->framelenth = 1200;
mipiAttr.mipi_host_cfg->settle = 20;

HB_MIPI_SetBus(snsInfo, bus);
HB_MIPI_SetPort(snsinfo, port);
HB_MIPI_SensorBindSerdes(snsinfo, sedres_index, sedres_port);
HB_MIPI_SensorBindMipi(snsinfo, mipiIdx);
HB_MIPI_SetExtraMode (snsinfo, ExtraMode);
ret = HB_MIPI_InitSensor(DevId, snsInfo);
if(ret < 0) {
printf("HB_MIPI_InitSensor error!\n");
return ret;
}
ret = HB_MIPI_SetMipiAttr(mipiIdx, mipiAttr);
if(ret < 0) {
printf("HB_MIPI_SetMipiAttr error! do sensorDeinit\n");
HB_MIPI_SensorDeinit(DevId);
return ret;
}
ret = HB_MIPI_ResetSensor(DevId);
if(ret < 0) {
printf("HB_MIPI_ResetSensor error! do mipi deinit\n");
HB_MIPI_DeinitSensor(DevId);
HB_MIPI_Clear(mipiIdx);
return ret;
}
ret = HB_MIPI_ResetMipi(mipiIdx);
if(ret < 0) {
printf("HB_MIPI_ResetMipi error!\n");
HB_MIPI_UnresetSensor(DevId);
HB_MIPI_DeinitSensor(DevId);
HB_MIPI_Clear(mipiIdx);
return ret;
}
HB_MIPI_UnresetSensor(DevId);
HB_MIPI_UnresetMipi(mipiIdx);
HB_MIPI_DeinitSensor(DevId);
HB_MIPI_Clear(mipiIdx);

HB_MIPI_ResetSensor/HB_MIPI_UnresetSensor

【函数声明】

int HB_MIPI_ResetSensor(uint32_t DevId);
int HB_MIPI_UnresetSensor(uint32_t DevId);

【功能描述】

sensor数据流的打开和关闭,sensor_start/sensor_stop

【参数描述】

参数名称描述输入/输出
devId通路索引,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_EnableSensorClock/HB_MIPI_DisableSensorClock

【函数声明】

int HB_MIPI_EnableSensorClock(uint32_t mipiIdx);
int HB_MIPI_DisableSensorClock(uint32_t mipiIdx);

【功能描述】

打开和关闭,sensor_clk

【参数描述】

参数名称描述输入/输出
mipiIdxMipi host 索引号,范围0~3输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

使用此接口需去掉子板的晶振

【参考代码】

暂无

HB_MIPI_SetSensorClock

【函数声明】

int HB_MIPI_SetSensorClock(uint32_t mipiIdx, uint32_t snsMclk)

【功能描述】

设置sensor_mclk 一共有4个sensor_mclk,目前用到得是sensor0_mclk和sensor1_mclk, mipi0连接在sensor_mclk1, mipi1连接在sensor_mclk0,硬件连接关系在dts里面定义。

【参数描述】

参数名称描述输入/输出
mipiIdxMipi host 索引号,范围0~3输入
snsMclk单位HZ输入,比如24MHZ,snsMclk为24000000

【返回值】

返回值描述
0成功
非0失败

【注意事项】

使用此接口需去掉子板的晶振

【参考代码】

初始化时:

先设置sensor_mclk然后再去使能 HB_MIPI_SetSensorClock(mipiIdx, 24000000); HB_MIPI_EnableSensorClock(mipiIdx);

退出时:

HB_MIPI_Clear(mipiIdx); HB_MIPI_DeinitSensor(devId); HB_MIPI_DisableSensorClock(mipiIdx);

HB_MIPI_ResetMipi/HB_MIPI_UnresetMipi

【函数声明】

int HB_MIPI_ResetMipi(uint32_t  mipiIdx);
int HB_MIPI_UnresetMipi(uint32_t mipiIdx)

【功能描述】

mipi的start和stop

【参数描述】

参数名称描述输入/输出
mipiIdxMipi host 索引号,范围0~3输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_SetMipiAttr

【函数声明】

int HB_MIPI_SetMipiAttr(uint32_t  mipiIdx, MIPI_ATTR_S  mipiAttr)

【功能描述】

设置mipi的属性,host和dev的初始化。

【参数描述】

参数名称描述输入/输出
mipiIdxMipi host 索引号输入
mipiAttrMipi总线属性信息输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_Clear

【函数声明】

int HB_MIPI_Clear(uint32_t  mipiIdx);

【功能描述】

清除设备相关的配置,mipi host/dev 的deinit,和接口HB_MIPI_SetMipiAttr对应。

【参数描述】

参数名称描述输入/输出
mipiIdxMipi host 索引号,范围0~3输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_MIPI_InitSensor/HB_MIPI_DeinitSensor举例

HB_MIPI_ReadSensor

【函数声明】

int HB_MIPI_ReadSensor(uint32_t devId, uint32_t regAddr, char *buffer, uint32_t size)

【功能描述】

通过i2c读取sensor。

【参数描述】

参数名称描述输入/输出
devId通路索引,范围0~7输入
regAddr寄存器地址输入
buffer,存放数据的地址输出
size读取的长度输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

必须在HB_MIPI_InitSensor接口调用后才能使用

【参考代码】

不同的sensor不一样,以imx327为例:

    int i;
char buffer[] = {0x34, 0x56};
char rev_buffer[30] = {0};
printf("HB_MIPI_InitSensor end\n");
ret = HB_MIPI_ReadSensor(devId, 0x3018, rev_buffer, 2);
if(ret < 0) {
printf("HB_MIPI_ReadSensor error\n");
}
for(i = 0; i < strlen(rev_buffer); i++) {
printf("rev_buffer[%d] 0x%x \n", i, rev_buffer[i]);
}
ret = HB_MIPI_WriteSensor(devId, 0x3018, buffer, 2);
if(ret < 0) {
printf("HB_MIPI_WriteSensor error\n");
}
ret = HB_MIPI_ReadSensor(devId, 0x3018, rev_buffer, 2);
if(ret < 0) {
printf("HB_MIPI_ReadSensor error\n");
}
for(i = 0; i < strlen(rev_buffer); i++) {
printf("rev_buffer[%d] 0x%x \n", i, rev_buffer[i]);
}

HB_MIPI_WriteSensor

【函数声明】

int HB_MIPI_WriteSensor (uint32_t devId, uint32_t regAddr, char *buffer, uint32_t size)

【功能描述】

通过i2c写sensor寄存器

【参数描述】

参数名称描述输入/输出
devId通路索引,范围0~7输入
regAddr寄存器地址输入
buffer存放数据的地址输入
size写的长度输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

必须在HB_MIPI_InitSensor接口调用后才能使用

【参考代码】

请参见HB_MIPI_ReadSensor举例

HB_MIPI_GetSensorInfo

【函数声明】

int HB_MIPI_GetSensorInfo(uint32_t devId, MIPI_SENSOR_INFO_S *snsInfo)

【功能描述】

获取sensor相关配置信息

【参数描述】

参数名称描述输入/输出
devId通路索引,范围0~7输入
snsInfosensor信息输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

必须在HB_MIPI_InitSensor接口调用后才能使用

【参考代码】

    MIPI_SENSOR_INFO_S *snsinfo = NULL;
snsinfo = malloc(sizeof(MIPI_SENSOR_INFO_S));
if(snsinfo == NULL) {
printf("malloc error\n");
return -1;
}
memset(snsinfo, 0, sizeof(MIPI_SENSOR_INFO_S));
ret = HB_MIPI_GetSensorInfo(devId, snsinfo);
if(ret < 0) {
printf("HB_MIPI_InitSensor error!\n");
return ret;
}

HB_MIPI_SwSensorFps

【函数声明】

int HB_MIPI_SwSensorFps(uint32_t devId, uint32_t fps)

【功能描述】

切换sensor的帧率

【参数描述】

参数名称描述输入/输出
devId通路索引,范围0~7输入
fpssensor的帧率输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

必须在HB_MIPI_InitSensor接口调用后才能使用

【参考代码】

暂无

HB_VIN_SetMipiBindDev/HB_VIN_GetMipiBindDev

【函数声明】

int HB_VIN_SetMipiBindDev(uint32_t devId, uint32_t mipiIdx)
int HB_VIN_GetMipiBindDev(uint32_t devId, uint32_t *mipiIdx)

【功能描述】

设置mipi和dev的绑定,dev使用哪一个mipi_host

【参数描述】

参数名称描述输入/输出
devId对应通道索引号,范围0~7输入
mipiIdxmipi_host的索引输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_SetDevAttr/HB_VIN_GetDevAttr

【函数声明】

int HB_VIN_SetDevAttr(uint32_t devId,  const VIN_DEV_ATTR_S *stVinDevAttr)
int HB_VIN_GetDevAttr(uint32_t devId, VIN_DEV_ATTR_S *stVinDevAttr)

【功能描述】

设置和获取dev的属性

【参数描述】

参数名称描述输入/输出
devId对应通道索引号,范围0~7输入
stVinDevAttrdev通道属性输入,调用HB_VIN_GetDevAttr为输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

DOL3拆分成多路时,多进程情况:第一个进程要先于第二个进程运行1秒即可。 另外目前不支持HB_VIN_DestroyDev之后重新HB_VIN_SetDevAttr。

出现SIF_IOC_BIND_GROUT ioctl failed报错,一般是前一次pipeid的调用没有退出,又重新调用。

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_SetDevAttrEx/HB_VIN_GetDevAttrEx

【函数声明】

int HB_VIN_SetDevAttrEx(uint32_t devId,  const VIN_DEV_ATTR_EX_S *stVinDevAttrEx)
int HB_VIN_GetDevAttrEx(uint32_t devId, VIN_DEV_ATTR_EX_S *stVinDevAttrEx)

【功能描述】

设置何获取dev的扩展属性

【参数描述】

参数名称描述输入/输出
devId对应通道索引号,范围0~7输入
stVinDevAttrExdev的扩展属性输入,调用HB_VIN_GetDevAttr为输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

该接口暂不支持

【参考代码】

暂无

HB_VIN_EnableDev/HB_VIN_DisableDev

【函数声明】

int HB_VIN_EnableDev(uint32_t devId);
int HB_VIN_DisableDev (uint32_t devId);

【功能描述】

dev模块的使能和关闭

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_DestroyDev

【函数声明】

int HB_VIN_DestroyDev(uint32_t devId)

【功能描述】

dev模块的销毁,资源释放

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_SetDevBindPipe/HB_VIN_GetDevBindPipe

【函数声明】

int HB_VIN_SetDevBindPipe(uint32_t devId, uint32_t pipeId)
int HB_VIN_GetDevBindPipe(uint32_t devId, uint32_t *pipeId)

【功能描述】

设置dev的chn输出和pipe的chn输入的绑定 设置pipe的chn输入和pipe输出的chn绑定。

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入
pipeId对应每路输入,同上输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

HB_VIN_GetDevBindPipe接口暂未实现

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_CreatePipe/HB_VIN_DestroyPipe

【函数声明】

int HB_VIN_CreatePipe(uint32_t pipeId, const VIN_PIPE_ATTR_S * stVinPipeAttr);
int HB_VIN_DestroyPipe(uint32_t pipeId);

【功能描述】

创建pipe、销毁pipe

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
stVinPipeAttr描述pipe属性的指针输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

    VIN_DEV_ATTR_S  stVinDevAttr;
VIN_PIPE_ATTR_S stVinPipeAttr;
VIN_DIS_ATTR_S stVinDisAttr;
VIN_LDC_ATTR_S stVinLdcAttr;
MIPI_SNS_TYPE_E sensorId = 1;
MIPI_SENSOR_INFO_S snsInfo;
MIPI_ATTR_S mipiAttr;
MIPI_SNS_TYPE_E sensorId = 1;
int PipeId = 0;
int DevId = 0, mipiIdx = 1;
int ChnId = 1, bus = 1, port = 0, serdes_index = 0, serdes_port = 0;

memset(snsInfo, 0, sizeof(MIPI_SENSOR_INFO_S));
memset(mipiAttr, 0, sizeof(MIPI_ATTR_S));
memset(stVinDevAttr, 0, sizeof(VIN_DEV_ATTR_S));
memset(stVinPipeAttr, 0, sizeof(VIN_PIPE_ATTR_));
memset(stVinDisAttr, 0, sizeof(VIN_DIS_ATTR_S));
memset(stVinLdcAttr, 0, sizeof(VIN_LDC_ATTR_S));
snsInfo.sensorInfo.bus_num = 0;
snsInfo.sensorInfo.bus_type = 0;
snsInfo.sensorInfo.entry_num = 0;
snsInfo.sensorInfo.sensor_name = "imx327";
snsInfo.sensorInfo.reg_width = 16;
snsInfo.sensorInfo.sensor_mode = NORMAL_M;
snsInfo.sensorInfo.sensor_addr = 0x36;

mipiAttr.dev_enable = 1;
mipiAttr.mipi_host_cfg.lane = 4;
mipiAttr.mipi_host_cfg.datatype = 0x2c;
mipiAttr.mipi_host_cfg.mclk = 24;
mipiAttr.mipi_host_cfg.mipiclk = 891;
mipiAttr.mipi_host_cfg.fps = 25;
mipiAttr.mipi_host_cfg.width = 1952;
mipiAttr.mipi_host_cfg.height = 1097;
mipiAttr.mipi_host_cfg->linelenth = 2475;
mipiAttr.mipi_host_cfg->framelenth = 1200;
mipiAttr.mipi_host_cfg->settle = 20;
stVinDevAttr.stSize.format = 0;
stVinDevAttr.stSize.width = 1952;
stVinDevAttr.stSize.height = 1097;
stVinDevAttr.stSize.pix_length = 2;
stVinDevAttr.mipiAttr.enable = 1;
stVinDevAttr.mipiAttr.ipi_channels = 1;
stVinDevAttr.mipiAttr.enable_frame_id = 1;
stVinDevAttr.mipiAttr.enable_mux_out = 1;
stVinDevAttr.DdrIspAttr.enable = 1;
stVinDevAttr.DdrIspAttr.buf_num = 4;
stVinDevAttr.DdrIspAttr.raw_feedback_en = 0;
stVinDevAttr.DdrIspAttr.data.format = 0;
stVinDevAttr.DdrIspAttr.data.width = 1952;
stVinDevAttr.DdrIspAttr.data.height = 1907;
stVinDevAttr.DdrIspAttr.data.pix_length = 2;
stVinDevAttr.outIspAttr.isp_enable = 1;
stVinDevAttr.outIspAttr.dol_exp_num = 4;
stVinDevAttr.outIspAttr.enable_flyby = 0;
stVinDevAttr.outDdrAttr.enable = 1;
stVinDevAttr.outDdrAttr.mux_index = 0;
stVinDevAttr.outDdrAttr.buffer_num = 10;
stVinDevAttr.outDdrAttr.raw_dump_en = 0;
stVinDevAttr.outDdrAttr.stride = 2928;
stVinDevAttr.outIpuAttr.enable_flyby = 0;

stVinPipeAttr.ddrOutBufNum = 8;
stVinPipeAttr.pipeDmaEnable = 1;
stVinPipeAttr.snsMode = 3;
stVinPipeAttr.stSize.format = 0;
stVinPipeAttr.stSize.width = 1920;
stVinPipeAttr.stSize.height = 1080;
stVinDisAttr.xCrop.rg_dis_start = 0;
stVinDisAttr.xCrop.rg_dis_end = 1919;
stVinDisAttr.yCrop.rg_dis_start = 0;
stVinDisAttr.yCrop.rg_dis_end = 1079
stVinDisAttr.disHratio = 65536;
stVinDisAttr.disVratio = 65536;
stVinDisAttr.disPath.rg_dis_enable = 0;
stVinDisAttr.disPath.rg_dis_path_sel = 1;
stVinDisAttr.picSize.pic_w = 1919;
stVinDisAttr.picSize.pic_h = 1079;
stVinLdcAttr->ldcEnable = 0;
stVinLdcAttr->ldcPath.rg_h_blank_cyc = 32;
stVinLdcAttr->yStartAddr = 524288;
stVinLdcAttr->cStartAddr = 786432;
stVinLdcAttr->picSize.pic_w = 1919;
stVinLdcAttr->picSize.pic_h = 1079;
stVinLdcAttr->lineBuf = 99;
stVinLdcAttr->xParam.rg_algo_param_a = 1;
stVinLdcAttr->xParam.rg_algo_param_b = 1;
stVinLdcAttr->yParam.rg_algo_param_a = 1;
stVinLdcAttr->yParam.rg_algo_param_b = 1;
stVinLdcAttr->xWoi.rg_length = 1919;
stVinLdcAttr->xWoi.rg_start = 0;
stVinLdcAttr->yWoi.rg_length = 1079;
stVinLdcAttr->yWoi.rg_start = 0;

ret = HB_VIN_CreatePipe(PipeId, pipeInfo);
if(ret < 0) {
printf("HB_VIN_CreatePipe t error!\n");
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_VIN_SetMipiBindDev(pipeId, mipiIdx);
if(ret < 0) {
printf("HB_VIN_SetMipiBindDev error!\n");
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_VIN_SetDevVCNumber(pipeId, deseri_port);
if(ret < 0) {
printf("HB_VIN_SetDevVCNumber error!\n");
return ret;
}
ret = HB_VIN_SetDevAttr(DevId, devInfo);
if(ret < 0) {
printf("HB_VIN_SetDevAttr error!\n");
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_VIN_SetPipeAttr (PipeId, pipeInfo);
if(ret < 0) {
printf("HB_VIN_SetPipeAttr error!\n");
HB_VIN_DestroyDev(DevId);
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_VIN_SetChnDISAttr(PipeId, ChnId, disInfo);
if(ret < 0) {
printf("HB_VIN_SetChnDISAttr error!\n");
HB_VIN_DestroyDev(DevId);
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_VIN_SetChnLDCAttr(PipeId, ChnId, ldcInfo);
if(ret < 0) {
printf("HB_VIN_SetChnLDCAttr error!\n");
HB_VIN_DestroyDev(DevId);
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_VIN_SetChnAttr(PipeId, ChnId );
if(ret < 0) {
printf("HB_VIN_SetChnAttr error!\n");
HB_VIN_DestroyPipe(PipeId);
return ret;
}
HB_VIN_SetDevBindPipe(DevId, PipeId);

HB_MIPI_SetBus(snsInfo, bus);
HB_MIPI_SetPort(snsinfo, port);
HB_MIPI_SensorBindSerdes(snsinfo, sedres_index, sedres_port);
HB_MIPI_SensorBindMipi(snsinfo, mipiIdx);
ret = HB_MIPI_InitSensor(devId, snsInfo);
if(ret < 0) {
printf("HB_MIPI_InitSensor error!\n");
HB_VIN_DestroyPipe(PipeId);
return ret;
}
ret = HB_MIPI_SetMipiAttr(mipiIdx, mipiAttr);
if(ret < 0) {
printf("HB_MIPI_SetMipiAttr error! do sensorDeinit\n");
HB_MIPI_SensorDeinit(sensorId);
HB_VIN_DestroyPipe(PipeId);
return ret;
}

ret = HB_VIN_EnableChn(PipeId, ChnId );
if(ret < 0) {
printf("HB_VIN_EnableChn error!\n");
HB_MIPI_DeinitSensor(DevId );
HB_MIPI_Clear(mipiIdx);
HB_VIN_DestroyDev(pipeId);
HB_VIN_DestroyChn(pipeId, ChnId);
HB_VIN_DestroyPipe(pipeId);
return ret;
}
ret = HB_VIN_StartPipe(PipeId);
if(ret < 0) {
printf("HB_VIN_StartPipe error!\n");
HB_MIPI_DeinitSensor(DevId );
HB_MIPI_Clear(mipiIdx);
HB_VIN_DisableChn(pipeId, ChnId);
HB_VIN_DestroyDev(pipeId);
HB_VIN_DestroyChn(pipeId, ChnId);
HB_VIN_DestroyPipe(pipeId);
return ret;
}
ret = HB_VIN_EnableDev(DevId);
if(ret < 0) {
printf("HB_VIN_EnableDev error!\n");
HB_MIPI_DeinitSensor(DevId );
HB_MIPI_Clear(mipiIdx);
HB_VIN_DisableChn(pipeId, ChnId);
HB_VIN_StopPipe(pipeId);
HB_VIN_DestroyDev(pipeId);
HB_VIN_DestroyChn(pipeId, ChnId);
HB_VIN_DestroyPipe(pipeId);
return ret;
}
ret = HB_MIPI_ResetSensor(DevId );
if(ret < 0) {
printf("HB_MIPI_ResetSensor error! do mipi deinit\n");
HB_MIPI_DeinitSensor(DevId );
HB_MIPI_Clear(mipiIdx);
HB_VIN_DisableDev(pipeId);
HB_VIN_StopPipe(pipeId);
HB_VIN_DisableChn(pipeId, ChnId);
HB_VIN_DestroyDev(pipeId);
HB_VIN_DestroyChn(pipeId, ChnId);
HB_VIN_DestroyPipe(pipeId);
return ret;
}
ret = HB_MIPI_ResetMipi(mipiIdx);
if(ret < 0) {
printf("HB_MIPI_ResetMipi error!\n");
HB_MIPI_UnresetSensor(DevId );
HB_MIPI_DeinitSensor(DevId );
HB_MIPI_Clear(mipiIdx);
HB_VIN_DisableDev(pipeId);
HB_VIN_StopPipe(pipeId);
HB_VIN_DisableChn(pipeId, ChnId);
HB_VIN_DestroyDev(pipeId);
HB_VIN_DestroyChn(pipeId, ChnId);
HB_VIN_DestroyPipe(pipeId);
return ret;
}

HB_MIPI_UnresetSensor(DevId );
HB_MIPI_UnresetMipi(mipiIdx);
HB_VIN_DisableDev(PipeId);
HB_VIN_StopPipe(PipeId);
HB_VIN_DisableChn(PipeId, ChnId);
HB_MIPI_DeinitSensor(DevId );
HB_MIPI_Clear(mipiIdx);
HB_VIN_DestroyDev(DevId);
HB_VIN_DestroyChn(PipeId, ChnId);
HB_VIN_DestroyPipe(PipeId);

HB_VIN_StartPipe/HB_VIN_StopPipe

【函数声明】

int HB_VIN_StartPipe(uint32_t pipeId);
int HB_VIN_StopPipe(uint32_t pipeId);

【功能描述】

启动和停止pipe

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_EnableChn/HB_VIN_DisableChn

【函数声明】

int HB_VIN_EnableChn(uint32_t pipeId, uint32_t chnId);
int HB_VIN_DisableChn(uint32_t pipeId, uint32_t chnId);

【功能描述】

对pipe的chn使能和关闭

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId输入1即可输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_SetChnLDCAttr/HB_VIN_GetChnLDCAttr

【函数声明】

int HB_VIN_SetChnLDCAttr(uint32_t pipeId, uint32_t chnId,const VIN_LDC_ATTR_S *stVinLdcAttr);
int HB_VIN_GetChnLDCAttr(uint32_t pipeId, uint32_t chnId, VIN_LDC_ATTR_S*stVinLdcAttr);

【功能描述】

设置和获取LDC的属性

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId输入1即可输入
stVinLdcAttrldc的属性信息输入,获取属性的时候为输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

LDC有调整送往IPU数据时序的功能,在VIN_ISP与VPS模块是在线模式的情况下,必须要通过该接口配置LDC参数,否则VPS会出异常。VIN_ISP与VPS模块是离线模式LDC参数配置与否都不影响。

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_SetChnDISAttr/HB_VIN_GetChnDISAttr

【函数声明】

int HB_VIN_SetChnDISAttr(uint32_t pipeId, uint32_t chnId, const VIN_DIS_ATTR_S *stVinDisAttr);
int HB_VIN_GetChnDISAttr(uint32_t pipeId, uint32_t chnId, VIN_DIS_ATTR_S *stVinDisAttr);

【功能描述】

设置和获取DIS的属性

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId输入1即可输入
stVinDisAttrdis的属性信息输入,获取属性的时候为输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_SetChnAttr

【函数声明】

int HB_VIN_SetChnAttr(uint32_t pipeId, uint32_t chnId);

【功能描述】

设置chn的属性

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId输入1即可输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

LDC和DIS的属性真正设置是在这个接口里面,HB_VIN_SetChnLDCAttr和HB_VIN_SetChnDISAttr只是给属性赋值。这个chn是指isp的其中一个输出chn,值固定为1。

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_DestroyChn

【函数声明】

int HB_VIN_DestroyChn(uint32_t pipeId, uint32_t chnId)

【功能描述】

销毁chn

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId输入1即可输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

目前不支持HB_VIN_DestroyChn之后重新HB_VIN_SetChnAttr

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_GetChnFrame/HB_VIN_ReleaseChnFrame

【函数声明】

int HB_VIN_GetChnFrame(uint32_t pipeId, uint32_t chnId, void *pstVideoFrame, int32_t millSec);
int HB_VIN_ReleaseChnFrame(uint32_t pipeId, uint32_t chnId, void *pstVideoFrame);

【功能描述】

获取pipe chn后的数据

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId输入0即可输入
pstVideoFrame数据信息输出
millSec超时参数 millSec
设为-1 时,为阻塞接口;
0 时为 非阻塞接口;
大于 0 时为超时等待时间,
超时时间的 单位为毫秒(ms)
输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

此接口是获取ISP处理之后的图像

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_GetDevFrame/HB_VIN_ReleaseDevFrame

【函数声明】

int HB_VIN_GetDevFrame(uint32_t devId, uint32_t chnId, void *videoFrame, int32_t millSec);
int HB_VIN_ReleaseDevFrame(uint32_t devId, uint32_t chnId, void *buf);

【功能描述】

获取sif chn处理后的数据,chn为0

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入
chnId输入0即可输入
videoFram数据信息输出
millSec超时参数 millSec
设为-1 时,为阻塞接口;
0 时为 非阻塞接口;
大于 0 时为超时等待时间,
超时时间的 单位为毫秒(ms)
输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

此接口是获取SIF处理之后的图像,sif –offline-isp得时候可以dump raw图, 适用场景:

VIN_OFFLINE_VPS_ONLINE VIN_OFFLINE_VPS_OFFINE VIN_SIF_OFFLINE_ISP_OFFLINE_VPS_ONLINE

另外sif-online-isp 同时sif到ddr也可以dump raw图,适用场景:

VIN_SIF_ONLINE_DDR_ISP_DDR_VPS_ONLINE VIN_SIF_ONLINE_DDR_ISP_ONLINE_VPS_ONLINE

【参考代码】

    typedef struct {
uint32_t frame_id;
uint32_t plane_count;
uint32_t xres[MAX_PLANE];
uint32_t yres[MAX_PLANE];
char *addr[MAX_PLANE];
uint32_t size[MAX_PLANE];
} raw_t;
typedef struct {
uint8_t ctx_id;
raw_t raw;
} dump_info_t;
dump_info_t dump_info = {0};
hb_vio_buffer_t *sif_raw = NULL;
int pipeId = 0;
sif_raw = (hb_vio_buffer_t *) malloc(sizeof(hb_vio_buffer_t));
memset(sif_raw, 0, sizeof(hb_vio_buffer_t));

ret = HB_VIN_GetDevFrame(pipeId, 0, sif_raw, 2000);
if (ret < 0) {
printf("HB_VIN_GetDevFrame error!!!\n");
} else {
if (sif_raw->img_info.planeCount == 1) {
dump_info.ctx_id = info->group_id;
dump_info.raw.frame_id = sif_raw->img_info.frame_id;
dump_info.raw.plane_count = sif_raw->img_info.planeCount;
dump_info.raw.xres[0] = sif_raw->img_addr.width;
dump_info.raw.yres[0] = sif_raw->img_addr.height;
dump_info.raw.addr[0] = sif_raw->img_addr.addr[0];
dump_info.raw.size[0] = size;
printf("pipe(%d)dump normal raw frame id(%d),plane(%d)size(%d)\n",
dump_info.ctx_id, dump_info.raw.frame_id,
dump_info.raw.plane_count, size);
} else if (sif_raw->img_info.planeCount == 2) {
dump_info.ctx_id = info->group_id;
dump_info.raw.frame_id = sif_raw->img_info.frame_id;
dump_info.raw.plane_count = sif_raw->img_info.planeCount;
for (int i = 0; i < sif_raw->img_info.planeCount; i ++) {
dump_info.raw.xres[i] = sif_raw->img_addr.width;
dump_info.raw.yres[i] = sif_raw->img_addr.height;
dump_info.raw.addr[i] = sif_raw->img_addr.addr[i];
dump_info.raw.size[i] = size;
}
if(sif_raw->img_info.img_format == 0) {
printf("pipe(%d)dump dol2 raw frame id(%d),plane(%d)size(%d)\n",
dump_info.ctx_id, dump_info.raw.frame_id,
dump_info.raw.plane_count, size);
}
} else if (sif_raw->img_info.planeCount == 3) {
dump_info.ctx_id = info->group_id;
dump_info.raw.frame_id = sif_raw->img_info.frame_id;
dump_info.raw.plane_count = sif_raw->img_info.planeCount;
for (int i = 0; i < sif_raw->img_info.planeCount; i ++) {
dump_info.raw.xres[i] = sif_raw->img_addr.width;
dump_info.raw.yres[i] = sif_raw->img_addr.height;
dump_info.raw.addr[i] = sif_raw->img_addr.addr[i];
dump_info.raw.size[i] = size;
}
printf("pipe(%d)dump dol3 raw frame id(%d),plane(%d)size(%d)\n",
dump_info.ctx_id, dump_info.raw.frame_id,
dump_info.raw.plane_count, size);
} else {
printf("pipe(%d)raw buf planeCount wrong !!!\n", info->group_id);
}
for (int i = 0; i < dump_info.raw.plane_count; i ++) {
if(sif_raw->img_info.img_format == 0) {
sprintf(file_name, "pipe%d_plane%d_%ux%u_frame_%03d.raw",
dump_info.ctx_id,
i,
dump_info.raw.xres[i],
dump_info.raw.yres[i],
dump_info.raw.frame_id);
dumpToFile(file_name, dump_info.raw.addr[i], dump_info.raw.size[i]);
}
}
if(sif_raw->img_info.img_format == 8) {
sprintf(file_name, "pipe%d_%ux%u_frame_%03d.yuv",
dump_info.ctx_id,
dump_info.raw.xres[i],
dump_info.raw.yres[i],
dump_info.raw.frame_id);
dumpToFile2plane(file_name, sif_raw->img_addr.addr[0],
sif_raw->img_addr.addr[1], size, size/2);
}
}
ret = HB_VIN_ReleaseDevFrame(pipeId, 0, sif_raw);
if (ret < 0) {
printf("HB_VIN_ReleaseDevFrame error!!!\n");
}
free(sif_raw);
sif_raw = NULL;
}

int dumpToFile(char *filename, char *srcBuf, unsigned int size)
{
FILE *yuvFd = NULL;
char *buffer = NULL;

yuvFd = fopen(filename, "w+");
if (yuvFd == NULL) {
vio_err("ERRopen(%s) fail", filename);
return -1;
}
buffer = (char *)malloc(size);
if (buffer == NULL) {
vio_err(":malloc file");
fclose(yuvFd);
return -1;
}
memcpy(buffer, srcBuf, size);
fflush(stdout);
fwrite(buffer, 1, size, yuvFd);
fflush(yuvFd);
if (yuvFd)
fclose(yuvFd);
if (buffer)
free(buffer);
vio_dbg("filedump(%s, size(%d) is successed\n", filename, size);
return 0;
}
int dumpToFile2plane(char *filename, char *srcBuf, char *srcBuf1,
unsigned int size, unsigned int size1)
{
FILE *yuvFd = NULL;
char *buffer = NULL;

yuvFd = fopen(filename, "w+");
if (yuvFd == NULL) {
vio_err("open(%s) fail", filename);
return -1;
}
buffer = (char *)malloc(size + size1);
if (buffer == NULL) {
vio_err("ERR:malloc file");
fclose(yuvFd);
return -1;
}
memcpy(buffer, srcBuf, size);
memcpy(buffer + size, srcBuf1, size1);
fflush(stdout);
fwrite(buffer, 1, size + size1, yuvFd);
fflush(yuvFd);
if (yuvFd)
fclose(yuvFd);
if (buffer)
free(buffer);
vio_dbg("filedump(%s, size(%d) is successed\n", filename, size);
return 0;
}

HB_VIN_SendPipeRaw

【函数声明】

int HB_VIN_SendPipeRaw(uint32_t pipeId, void *pstVideoFrame,int32_t millSec)

【功能描述】

回灌raw接口,数据给ISP处理

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
pstVideoFrame回灌raw数据信息输入
millSec超时参数 millSec
设为-1 时,为阻塞接口;
0 时为 非阻塞接口;
大于 0 时为超时等待时间,
超时时间的 单位为毫秒(ms)
输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

    int pipeId = 0;
hb_vio_buffer_t *feedback_buf;
hb_vio_buffer_t *isp_yuv = NULL;
isp_yuv = (hb_vio_buffer_t *) malloc(sizeof(hb_vio_buffer_t));
memset(isp_yuv, 0, sizeof(hb_vio_buffer_t));
ret = HB_VIN_SendPipeRaw(pipeId, feedback_buf,1000);
if (ret) {
printf("HB_VIN_SendFrame error!!!\n");
}
ret = HB_VIN_GetChnFrame(pipeId, 0, isp_yuv, -1);
if (ret < 0) {
printf("HB_VIN_GetPipeFrame error!!!\n");
}
ret = HB_VIN_ReleaseChnFrame(pipeId, 0, isp_yuv);
if (ret < 0) {
printf("HB_VPS_ReleaseDevRaw error!!!\n");
}

HB_VIN_SetPipeAttr/HB_VIN_GetPipeAttr

【函数声明】

int HB_VIN_SetPipeAttr(uint32_t pipeId,VIN_PIPE_ATTR_S *stVinPipeAttr);
int HB_VIN_GetPipeAttr(uint32_t pipeId, VIN_PIPE_ATTR_S *stVinPipeAttr);

【功能描述】

设置pipe(ISP)属性、获取pipe属性

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
stVinPipeAttr描述pipe属性的指针输入,get的时候为输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

请参见HB_VIN_CreatePipe/HB_VIN_DestroyPipe举例

HB_VIN_CtrlPipeMirror

【函数声明】

int HB_VIN_CtrlPipeMirror(uint32_t pipeId, uint8_t on);

【功能描述】

pipe镜像控制。

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
on非0打开镜像功能,0关闭镜像功能。输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

Flip功能需要借助GDC实现,如先把镜像打开然后再旋转180度。

HB_VIN_MotionDetect

【函数声明】

int HB_VIN_MotionDetect(uint32_t pipeId)

【功能描述】

检测MD是否有中断,有MD中断就返回

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入

【返回值】

返回值描述
0检测到运行物体,阻塞调用,未检测到运动物体一直阻塞。

【注意事项】

【参考代码】

请参见HB_VIN_EnableDevMd举例

HB_VIN_InitLens

【函数声明】

int HB_VIN_InitLens(uint32_t pipeId, VIN_LENS_FUNC_TYPE_E lensType, const VIN_LENS_CTRL_ATTR_S *lenCtlAttr)

【功能描述】

马达驱动初始化。

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
lensType马达的功能类型,AF、Zoom功能输入
lenCtlAttr控制属性输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

如果使用AF调用一次接口,如果同时使用AF和Zoom功能,调用两次初始化。使用就去调用,不使用建议不调用。

【参考代码】

暂无

HB_VIN_DeinitLens

【函数声明】

int HB_VIN_DeinitLens(uint32_t pipeId)

【功能描述】

马达退出

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

暂无

HB_VIN_RegisterDisCallback

【函数声明】

int HB_VIN_RegisterDisCallback(uint32_t pipeId, VIN_DIS_CALLBACK_S *pstDISCallback)

【功能描述】

注册dis回调

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
pstDISCallback回调接口输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

暂无

HB_VIN_SetDevVCNumber/HB_VIN_GetDevVCNumber

【函数声明】

int HB_VIN_SetDevVCNumber(uint32_t devId, uint32_t vcNumber);
int HB_VIN_GetDevVCNumber(uint32_t devId, uint32_t *vcNumber);

【功能描述】

设置和获取dev的vc_index,使用MIPI的哪个vc.

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入
vcNumber对应mipi的vc,范围0~3输入,获取的时候为输出

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

HB_VIN_AddDevVCNumber

【函数声明】

int HB_VIN_AddDevVCNumber(uint32_t devId, uint32_t vcNumber)

【功能描述】

设置dev的vc_index,使用MIPI的哪个vc.

【参数描述】

参数名称描述输入/输出
devId对应每路输vc入,范围0~7输入
vcNumber对应mipi的vc,范围0~3输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

当使用linear模式时,这个接口不用使用,当使用DOL2模式时,此接口vcNumber设置为1,当使用DOL3模式时,调用两次HB_VIN_AddDevVCNumber,vcNumber分别传0和1.

【参考代码】

一路DOL2 初始化顺序:

  1. 把dev0绑到mipi0 HB_VIN_SetMipiBindDev(0, 0)
  2. 把mipi0的虚通道0绑到dev0 HB_VIN_SetDevVCNumber(0, 0)
  3. 把mipi0的虚通道1绑到dev0 HB_VIN_AddDevVCNumber(0, 1);
  4. 把dev0分别绑到ISP pipe0, HB_VIN_SetDevBindPipe(0, 0)
    ret = HB_SYS_SetVINVPSMode(pipeId, vin_vps_mode);
if(ret < 0) {
printf("HB_SYS_SetVINVPSMode%d error!\n", vin_vps_mode);
return ret;
}
ret = HB_VIN_CreatePipe(pipeId, pipeinfo); // isp init
if(ret < 0) {
printf("HB_MIPI_InitSensor error!\n");
return ret;
}
ret = HB_VIN_SetMipiBindDev(pipeId, mipiIdx);
if(ret < 0) {
printf("HB_VIN_SetMipiBindDev error!\n");
return ret;
}
ret = HB_VIN_SetDevVCNumber(pipeId, deseri_port);
if(ret < 0) {
printf("HB_VIN_SetDevVCNumber error!\n");
return ret;
}
ret = HB_VIN_AddDevVCNumber(pipeId, vc_num);
if(ret < 0) {
printf("HB_VIN_AddDevVCNumber error!\n");
return ret;
}
ret = HB_VIN_SetDevAttr(pipeId, devinfo);
if(ret < 0) {
printf("HB_MIPI_InitSensor error!\n");
return ret;
}
ret = HB_VIN_SetPipeAttr(pipeId, pipeinfo);
if(ret < 0) {
printf("HB_VIN_SetPipeAttr error!\n");
goto pipe_err;
}
ret = HB_VIN_SetChnDISAttr(pipeId, 1, disinfo);
if(ret < 0) {
printf("HB_VIN_SetChnDISAttr error!\n");
goto pipe_err;
}
ret = HB_VIN_SetChnLDCAttr(pipeId, 1, ldcinfo);
if(ret < 0) {
printf("HB_VIN_SetChnLDCAttr error!\n");
goto pipe_err;
}
ret = HB_VIN_SetChnAttr(pipeId, 1);
if(ret < 0) {
printf("HB_VIN_SetChnAttr error!\n");
goto chn_err;
}
HB_VIN_SetDevBindPipe(pipeId, pipeId);

HB_VIN_SetDevMclk

【函数声明】

int HB_VIN_SetDevMclk(uint32_t devId, uint32_t devMclk, uint32_t vpuMclk);

【功能描述】

设置sif mclk和vpu clk.

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入
devMclkSif mclk设置,请参见SIF MCLK输入,单位KHz
vpuMclkvpu clk设置, 请参见VPU CLK输入,单位KHz

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

暂无

HB_VIN_GetChnFd

【函数声明】

int HB_VIN_GetChnFd(uint32_t pipeId, uint32_t chnId)

【功能描述】

获取通道的fd

【参数描述】

参数名称描述输入/输出
pipeId对应每路输入,范围0~7输入
chnId通道号,为0输入

【返回值】

返回值描述
正值成功
负值失败

【注意事项】

【参考代码】

暂无

HB_VIN_CloseFd

【函数声明】

int HB_VIN_CloseFd(void)

【功能描述】

关闭通道的fd

【参数描述】

参数名称描述输入/输出
void无输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

【参考代码】

暂无

HB_VIN_EnableDevMd

【函数声明】

int HB_VIN_EnableDevMd(uint32_t devId)

【功能描述】

打开motiondetect功能

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

调用得在HB_VIN_SetDevAttrEx之后,HB_VIN_SetDevAttrEx接口是设置MD的一些属性值

【参考代码】

    VIN_DEV_ATTR_EX_S devAttr;
devAttr. path_sel = 0;
devAttr. roi_top = 0;
devAttr. roi_left = 0;
devAttr. roi_width = 1280;
devAttr. roi_height = 640;
devAttr. grid_step = 128;
devAttr. grid_tolerance =10;
devAttr. threshold = 10;
devAttr. weight_decay = 128;
devAttr. precision = 0;
ret = HB_VIN_SetDevAttrEx(pipeId, devexinfo);
if(ret < 0) {
printf("HB_VIN_SetDevAttrEx error!\n");
return ret;
}
ret = HB_VIN_EnableDevMd(pipeId);
if(ret < 0) {
printf("HB_VIN_EnableDevMd error!\n");
return ret;
}

下面起一个线程调用HB_VIN_MotionDetect检测收到MD中断后将MD功能关闭HB_VIN_DisableDevMd。

    int md_func(work_info_t * info)
{
int ret = 0;
int pipeId = info->group_id;
ret = HB_VIN_MotionDetect(pipeId);
if (ret < 0) {
printf("HB_VIN_MotionDetect error!!! ret %d \n", ret);
} else {
HB_VIN_DisableDevMd(pipeId);
printf("HB_VIN_DisableDevMd success!!! ret %d \n", ret);
}
return ret;
}

HB_VIN_DisableDevMd

【函数声明】

int HB_VIN_DisableDevMd(uint32_t devId)

【功能描述】

关闭motiondetect功能

【参数描述】

参数名称描述输入/输出
devId对应每路输入,范围0~7输入

【返回值】

返回值描述
0成功
非0失败

【注意事项】

用户收到md中断后关闭md功能

【参考代码】

请参见HB_VIN_EnableDevMd举例

数据结构

MIPI_INPUT_MODE_E

【结构定义】

typedef enum HB_MIPI_INPUT_MODE_E
{
INPUT_MODE_MIPI = 0x0, /* mipi */
INPUT_MODE_DVP = 0x1, /* DVP*/
INPUT_MODE_BUTT
} MIPI_INPUT_MODE_E;

【功能描述】

sensor接入方式

【成员说明】

  • MIPI接入
  • DVP接入

MIPI_SENSOR_MODE_E

【结构定义】

typedef enum HB_MIPI_SENSOR_MODE_E
{
NORMAL_M = 0x0,
DOL2_M = 0x1,
DOL3_M = 0x2,
PWL_M = 0x3,
} MIPI_SENSOR_MODE_E;

【功能描述】

sensor工作模式

【成员说明】

linear模式、DOL2模式、DOL3模式、PWL模式

MIPI_DESERIAL_INFO_T

【结构定义】

typedef struct HB_MIPI_DESERIAL_INFO_T {
int bus_type;
int bus_num;
int deserial_addr;
int physical_entry;
char *deserial_name;
} MIPI_DESERIAL_INFO_T;

【功能描述】

定义serdes初始化的属性信息

【成员说明】

成员含义
bus_type总线类型,0是i2c,1是spi
bus_num总线号,根据具体板子硬件原理图确定,目前用的5
deserial_addrserdes地址
physical_entry保留
deserial_nameserdes名字

MIPI_SNS_INFO_S

【结构定义】

typedef struct HB_MIPI_SNS_INFO_S {
int port;
int dev_port;
int bus_type;
int bus_num;
int fps;
int resolution;
int sensor_addr;
int serial_addr;
int entry_index;
MIPI_SENSOR_MODE_E sensor_mode;
int reg_width;
char *sensor_name;
int extra_mode;
int deserial_index;
int deserial_port;
int gpio_num;
int gpio_pin[GPIO_NUM];
int gpio_level[GPIO_NUM];
MIPI_SPI_DATA_S spi_info;
} MIPI_SNS_INFO_S;

【功能描述】

定义sensor初始化的属性信息

【成员说明】

成员含义
port当前sensor的一个逻辑编号,必须从0开始
dev_port每路sensor操作的驱动节点,一个驱动支持多个节点。
bus_type总线类型,0是i2c,1是spi
bus_num总线号,根据具体板子硬件原理图确定,现在默认i2c5
fps帧率
resolutionSensor的分辨率
sensor_addrsensor地址
serial_addrsensor内部serdes地址
entry_indexsensor使用的mipi索引
sensor_modesensor工作模式,1是normal,2是dol2,3是dol3
reg_width寄存器地址宽度
sensor_namesensor名字
extra_mode区分sensor的特性,具体sensor驱动实现
deserial_index当前属于哪一个serdes
deserial_port当前属于serdes哪一个port
gpio_num有的sensor需要gpio上下电,此sensor用到的相关GPIO管脚
gpio_pin操作的GPIO管脚,GPIO_NUM是用到的GPIO管脚的个数
gpio_level初始有效值,比如该管脚需要先拉低再拉高,此值为0,如果先拉高在拉低,此值为1
spi_infosensor spi信息,有的sensor通过spi总线访问

MIPI_SENSOR_INFO_S

【结构定义】

typedef struct HB_MIPI_SENSOR_INFO_S {
int deseEnable;
MIPI_INPUT_MODE_E inputMode;
MIPI_DESERIAL_INFO_T deserialInfo;
MIPI_SNS_INFO_S sensorInfo;
} MIPI_SENSOR_INFO_S;

【功能描述】

定义dev初始化的属性信息

【成员说明】

成员含义
deseEnable该sensor是否有serdes
inputModesensor接入方式
deserialInfoserdes信息
sensorInfosensor信息

MIPI_HOST_CFG_S

【结构定义】

typedef struct HB_MIPI_HOST_CFG_S {
uint16_t lane;
uint16_t datatype;
uint16_t mclk;
uint16_t mipiclk;
uint16_t fps;
uint16_t width;
uint16_t height;
uint16_t linelenth;
uint16_t framelenth;
uint16_t settle;
uint16_t channel_num;
uint16_t channel_sel[4];
} MIPI_HOST_CFG_S;

【功能描述】

定义mipi初始化参数信息

【成员说明】

成员含义
lanelane个数,0~4
datatype数据格式,参见DATA TYPE
mclkmipi模块主时钟,目前固定是24MHZ
mipiclksensor 输出 总的mipi bit rate, 单位 Mbits/每秒
fpssensor输出实际帧率
widthsensor输出实际宽度
heightsensor输出实际高度
linelenthsensor输出带blanking的总行长
framelenthsensor输出带blanking的总行数
settlesensor输出实际 Ttx-zero + Ttx-prepare时间(clk为单位)
channel_num使用虚通道的个数
channel_sel[4]保存每个虚通道的值

MIPI_ATTR_S

【结构定义】

typedef struct HB_MIPI_ATTR_S {
MIPI_HOST_CFG_S mipi_host_cfg;
uint32_t dev_enable;
} MIPI_ATTR_S;

【功能描述】

定义mipi初始化参数信息

【成员说明】

成员含义
mipi_host_cfgmipi host属性结构体
dev_enablemipi dev是否使能,1是使能,0是关闭

MIPI_SPI_DATA_S

【结构定义】

typedef struct HB_MIPI_SPI_DATA_S {
int spi_mode;
int spi_cs;
uint32_t spi_speed;
} MIPI_SPI_DATA_S;

【功能描述】

定义sensor相关spi信息

【成员说明】

成员含义
spi_modespi的工作模式
spi_csspi的片选
spi_speedspi的传输速率

VIN_DEV_SIZE_S

【结构定义】

typedef struct HB_VIN_DEV_SIZE_S {
uint32_t format;
uint32_t width;
uint32_t height;
uint32_t pix_length;
} VIN_DEV_SIZE_S;

【功能描述】

定义dev初始化的属性信息

【成员说明】

成员含义
format像素格式,format为0代表是raw8~raw16,根据pixel_lenght来表示究竟是raw8还是raw16。
width数据宽
height数据高
pix_length每个像素点长度

VIN_MIPI_ATTR_S

【结构定义】

typedef struct HB_VIN_MIPI_ATTR_S {
uint32_t enable;
uint32_t ipi_channels;
uint32_t ipi_mode;
uint32_t enable_mux_out;
uint32_t enable_frame_id;
uint32_t enable_bypass;
uint32_t enable_line_shift;
uint32_t enable_id_decoder;
uint32_t set_init_frame_id;
uint32_t set_line_shift_count;
uint32_t set_bypass_channels;
uint32_t enable_pattern;
} VIN_MIPI_ATTR_S;

【功能描述】

定义dev mipi初始化的信息

【成员说明】

成员含义
enablemipi使能,0是关闭,1是使能
ipi_channelsipi_channels表示用了几个channel,默认是0开始,如果设置是2,是用了0,1
ipi_mode当DOL2分成两路linear或者DOL3分成一路DOl2和一路linear或者三路linear的时候,此值就赋值为2或3.
enable_mux_out使能mux选择输出
enable_frame_id是否使能frameid
enable_bypass是否使能bypass
enable_line_shift未用
enable_id_decoder未用
set_init_frame_id初始frame id值一般为1
set_line_shift_count未用
set_bypass_channels未用
enable_pattern是否使能testpartern

VIN_DEV_INPUT_DDR_ATTR_S

【结构定义】

typedef struct HB_VIN_DEV_INPUT_DDR_ATTR_S {
uint32_t stride;
uint32_t buf_num;
uint32_t raw_feedback_en;
VIN_DEV_SIZE_S data;
} VIN_DEV_INPUT_DDR_ATTR_S;

【功能描述】

定义dev输入信息,offline和回灌场景用

【成员说明】

成员含义
stride硬件stride 跟格式匹配,如果是12bit那么stride = widthx1.5,如果是10bit,stride = widthx1.25,如此类推
buf_num回灌的存储数据的 buf 数目
raw_feedback_en使能回灌模式,不能和offline 模式同时开启,独立使用
data数据格式,见 VIN_DEV_SIZE_S

VIN_DEV_OUTPUT_DDR_S

【结构定义】

typedef struct HB_VIN_DEV_OUTPUT_DDR_S {
uint32_t stride;
uint32_t buffer_num;
uint32_t frameDepth
} VIN_DEV_OUTPUT_DDR_S;

【功能描述】

定义dev 输出到ddr初始化的信息

【成员说明】

成员含义
stride硬件stride 跟格式匹配,目前12bit 1952x1.5
buffer_numdev 输出到ddr 的buf 个数
frameDepth最多get的帧数, buffer_num是总buff数量,建议frameDepth值最大是ddrOutBufNum – 4。

VIN_DEV_OUTPUT_ISP_S

【结构定义】

typedef struct HB_VIN_DEV_OUTPUT_ISP_S {
uint32_t dol_exp_num;
uint32_t enable_dgain;
uint32_t set_dgain_short;
uint32_t set_dgain_medium;
uint32_t set_dgain_long;
uint32_t short_maxexp_lines;
uint32_t medium_maxexp_lines;
uint32_t vc_short_seq;
uint32_t vc_medium_seq;
uint32_t vc_long_seq;
} VIN_DEV_OUTPUT_ISP_S;

【功能描述】

定义dev 输出到pipe初始化的信息

【成员说明】

成员含义
dol_exp_num曝光模式,1 为普通模式,dol 2 或者 3 设置对应数目
enable_dgainISP内部调试参数,暂可忽略
set_dgain_shortISP 内部调试参数,暂可忽略
set_dgain_mediumISP 内部调试参数,暂可忽略
set_dgain_longISP 内部调试参数,暂可忽略
short_maxexp_lines最短帧的最大曝光行数,一般是sensor mode寄存器表中找,DOL2/3需要填,用来分配IRAM大小
medium_maxexp_lines普通帧的最大曝光行数,一般是sensor mode寄存器表中找,DOL3需要填,用来分配IRAM大小
vc_short_seq用来描述DOL2/3模式下,短帧的顺序
vc_medium_seq用来描述DOL2/3模式下,普通帧的顺序
vc_long_seq用来描述DOL2/3模式下,长帧的顺序

VIN_DEV_ATTR_S

【结构定义】

typedef struct HB_VIN_DEV_ATTR_S {
VIN_DEV_SIZE_S stSize;
union
{
VIN_MIPI_ATTR_S mipiAttr;
VIN_DVP_ATTR_S dvpAttr;
};
VIN_DEV_INPUT_DDR_ATTR_S DdrIspAttr;
VIN_DEV_OUTPUT_DDR_S outDdrAttr;
VIN_DEV_OUTPUT_ISP_S outIspAttr;
}VIN_DEV_ATTR_S;

【功能描述】

定义dev初始化的属性信息

【成员说明】

成员含义
VIN_DEV_SIZE_SstSize 输入的数据
VIN_DEV_INTF_MODE_EenIntfMode sif(dev)输入的接口模式,mipi or dvp,目前都是mipi
DdrIspAttrisp(pipe)的输入属性配置,offline或者是回灌
outDdrAttrsif(dev)的输出到ddr配置
outIspAttrsif到isp一些属性设置

VIN_DEV_ATTR_EX_S

【结构定义】

typedef struct HB_VIN_DEV_ATTR_EX_S {
uint32_t path_sel;
uint32_t roi_top;
uint32_t roi_left;
uint32_t roi_width;
uint32_t roi_height;
uint32_t grid_step;
uint32_t grid_tolerance;
uint32_t threshold;
uint32_t weight_decay;
uint32_t precision;
}VIN_DEV_ATTR_EX_S;

【功能描述】

定义md相关信息

【成员说明】

成员含义
path_sel0:sif-isp通路;1:sif-ipu通路
roi_topROI的y坐标
roi_leftROI的x坐标
roi_widthROI的长,必须是step的整数s倍
roi_heightROI的宽, 必须是step的整数倍
grid_step对应motion detect的区域中划分的每块的宽和高。为2的整数次幂,有效范围为4~128。
grid_tolerance每个块前后两帧进行比较的阈值。当前后两帧中相同块进行相减,插值超过这个阈值时,判断为不同。
threshold动态检测选取的ROI区域中划分的块比较不同的个数超过这个阈值,发出mot_det中断。
weight_decay新的一帧更新ref buffer时不是完全替代上一帧的数据,而是前后两帧加权平均的结果。Mot_det_wgt_decay为当前帧的权重,前一帧的权重为(256-mot_det_wgt_decay)。
precision为进行每个块计算时保留的小数点后的精度的位数,有效范围为1~4.

VIN_PIPE_SENSOR_MODE_E

【结构定义】

typedef enum HB_VIN_PIPE_SENSOR_MODE_E {
SENSOR_NORMAL_MODE = 1,
SENSOR_DOL2_MODE,
SENSOR_DOL3_MODE,
SENSOR_DOL4_MODE,
SENSOR_PWL_MODE,
SENSOR_INVAILD_MODE
} VIN_PIPE_SENSOR_MODE_E;

【功能描述】

sensor工作模式

【成员说明】

normal模式、DOL2模式、DOL3模式、PWL模式(压缩模式)

VIN_PIPE_CFA_PATTERN_E

【结构定义】

typedef enum HB_VIN_PIPE_CFA_PATTERN_E {
PIPE_BAYER_RGGB = 0,
PIPE_BAYER_GRBG,
PIPE_BAYER_GBRG,
PIPE_BAYER_BGGR,
PIPE_MONOCHROME,
} VIN_PIPE_CFA_PATTERN_E;

【功能描述】

数据格式布局

【成员说明】

不同的数据存储格式

VIN_PIPE_SIZE_S

【结构定义】

typedef struct HB_VIN_PIPE_SIZE_S {
uint32_t format;
uint32_t width;
uint32_t height;
} VIN_PIPE_SIZE_S;

【功能描述】

定义pipe size 数据信息

【成员说明】

成员含义
format数据格式
width数据宽
height数据高

VIN_PIPE_CALIB_S

【结构定义】

typedef struct HB_VIN_PIPE_CALIB_S {
uint32_t mode;
unsigned char *lname;
} VIN_PIPE_CALIB_S;

【功能描述】

sensor矫正数据加载

【成员说明】

成员含义
mode是否开启sensor矫正数据加载
lname对应使用的校准库

VIN_PIPE_ATTR_S

【结构定义】

typedef struct HB_VIN_PIPE_ATTR_S {
uint32_t ddrOutBufNum;
uint32_t frameDepth;
VIN_PIPE_SENSOR_MODE_E snsMode;
VIN_PIPE_SIZE_S stSize;
VIN_PIPE_CFA_PATTERN_E cfaPattern;
uint32_t temperMode;
uint32_t ispBypassEn;
uint32_t ispAlgoState;
uint32_t ispAfEn;s
uint32_t bitwidth;
uint32_t startX;
uint32_t startY;
VIN_PIPE_CALIB_S calib;
} VIN_PIPE_ATTR_S;

【功能描述】

定义pipe属性信息

【成员说明】

成员含义
ddrOutBufNum数据的位宽,8 \10\12\14\16
frameDepth最多get的帧数, ddrOutBufNum是总buff数量,建议frameDepth值最大是ddrOutBufNum – 3。
snsModesensor工作模式
stSizesensor的数据信息,见17
cfaPattern数据格式布局,和sensor保持一致
temperModetemper模式,0关闭,2打开
BypassEnable是否使能isp的bypass
ispAlgoState是否启动3a算法库,1是启动,0是关闭
bitwidth位宽,有效值 8、10、12、14、16、20
startX相对于原点的X偏移
startY相对于原点的Y偏移
calib是否开启sensor矫正数据加载,1是开启,0是关闭。

VIN_LDC_PATH_SEL_S

【结构定义】

typedef struct HB_VIN_LDC_PATH_SEL_S {
uint32_t rg_y_only:1;
uint32_t rg_uv_mode:1;
uint32_t rg_uv_interpo:1;
uint32_t reserved1:5;
uint32_t rg_h_blank_cyc:8;
uint32_t reserved0:16;
} VIN_LDC_PATH_SEL_S;

【功能描述】

定义LDC属性信息

【成员说明】

成员含义
rg_y_only输出类型
rg_uv_mode输出类型
rg_uv_interpoturning用
rg_h_blank_cycturning用

VIN_LDC_PICSIZE_S

【结构定义】

typedef struct HB_VIN_LDC_PICSIZE_S {
uint16_t pic_w;
uint16_t pic_h;
} VIN_LDC_PICSIZE_S;

【功能描述】

定义LDC宽高输入信息

【成员说明】

成员含义
pic_w需要设置比接入尺寸 -1 的size, 如果ISP 输出 1920 , 则这里设置 1919
pic_h除了size, ldc以及dis 部分其他设置不要更改

VIN_LDC_ALGOPARAM_S

【结构定义】

typedef struct HB_VIN_LDC_ALGOPARAM_S {
uint16_t rg_algo_param_b;
uint16_t rg_algo_param_a;
} VIN_LDC_ALGOPARAM_S;

【功能描述】

定义LDC属性信息

【成员说明】

成员含义
rg_algo_param_b参数需要tuning
rg_algo_param_a参数需要tuning

VIN_LDC_OFF_SHIFT_S

【结构定义】

typedef struct HB_VIN_LDC_OFF_SHIFT_S {
uint32_t rg_center_xoff:8;
uint32_t rg_center_yoff:8;
uint32_t reserved0:16;
} VIN_LDC_OFF_SHIFT_S;

【功能描述】

定义LDC属性信息

【成员说明】

成员含义
rg_center_xoff处理区域修正
rg_center_yoff处理区域修正

VIN_LDC_WOI_S

【结构定义】

typedef struct HB_VIN_LDC_WOI_S {
uint32_t rg_start:12;
uint32_t reserved1:4;
uint32_t rg_length:12;
uint32_t reserved0:4;
}VIN_LDC_WOI_S;

【功能描述】

定义LDC属性信息

【成员说明】

成员含义
rg_start处理区域修正
rg_length处理区域修正

VIN_LDC_ATTR_S

【结构定义】

typedef struct HB_VIN_LDC_ATTR_S {
uint32_t ldcEnable;
VIN_LDC_PATH_SEL_S ldcPath;
uint32_t yStartAddr;
uint32_t cStartAddr;
VIN_LDC_PICSIZE_S picSize;
uint32_t lineBuf;
VIN_LDC_ALGOPARAM_S xParam;
VIN_LDC_ALGOPARAM_S yParam;
VIN_LDC_OFF_SHIFT_S offShift;
VIN_LDC_WOI_S xWoi;
VIN_LDC_WOI_S yWoi;
} VIN_LDC_ATTR_S;

【功能描述】

定义LDC属性信息

【成员说明】

成员含义
ldcEnableLDC是否使能
ldcPath输出类型
yStartAddrIram使用地址
cStartAddrIram使用地址
picSize接入的尺寸
lineBuf值设置99
xParam参数需要tuning
yParam参数需要tuning
offShift处理区域修正
xWoi处理区域修正
yWoi处理区域修正

VIN_DIS_PICSIZE_S

【结构定义】

typedef struct HB_VIN_DIS_PICSIZE_S {
uint16_t pic_w;
uint16_t pic_h;
} VIN_DIS_PICSIZE_S;

【功能描述】

定义DIS属性信息

【成员说明】

成员含义
pic_w需要设置比接入尺寸 -1 的size, 如果ISP输出 1920 , 则这里设置 1919
pic_h需要设置比接入尺寸 -1 的size

VIN_DIS_PATH_SEL_S

【结构定义】

typedef struct HB_VIN_DIS_PATH_SEL_S {
uint32_t rg_dis_enable:1;
uint32_t rg_dis_path_sel:1;
uint32_t reserved0:30;
} VIN_DIS_PATH_SEL_S;

【功能描述】

定义DIS属性信息

【成员说明】

成员含义
rg_dis_enable输出类型
rg_dis_path_sel输出类型

VIN_DIS_CROP_S

【结构定义】

typedef struct HB_VIN_DIS_CROP_S {
uint16_t rg_dis_start;
uint16_t rg_dis_end;
} VIN_DIS_CROP_S;

【功能描述】

定义DIS属性信息

【成员说明】

成员含义
rg_dis_start处理区域修正
rg_dis_end处理区域修正

VIN_DIS_CALLBACK_S

【结构定义】

typedef struct HB_VIN_DIS_CALLBACK_S {
void (*VIN_DIS_DATA_CB) (uint32_t pipeId, uint32_t event,
VIN_DIS_MV_INFO_S *disData, void *userData);
} VIN_DIS_CALLBACK_S;

【功能描述】

定义dis回调接口

【成员说明】

成员含义
VIN_DIS_DATA_CB回调函数,收到数据后返回给用户

VIN_DIS_MV_INFO_S

【结构定义】

typedef struct HB_VIN_DIS_MV_INFO_S {
int gmvX;
int gmvY;
int xUpdate;
int yUpdate;
} VIN_DIS_MV_INFO_S;

【功能描述】

定义坐标移动的信息

【成员说明】

成员含义
gmvX绝对坐标,相对于相机中心的x移动量, 如果相机锁好固定住,gmv就是相对于固定锁好位置的移动。
gmvY绝对坐标,相对于相机中心的y移动量
xUpdate相对量,相对于前一帧的x移动量, Update则是不管锁在那,只看前一帧相机晃动的位置的移动.(如果前一帧是锁好的位置,则update与gmv相同,但这只会在连续晃动的第一帧发生)
yUpdate相对量,相对于前一帧的y移动量

VIN_DIS_ATTR_S

【结构定义】

typedef struct HB_VIN_DIS_ATTR_S {
VIN_DIS_PICSIZE_S picSize;
VIN_DIS_PATH_SEL_S disPath;
uint32_t disHratio;
uint32_t disVratio;
VIN_DIS_CROP_S xCrop;
VIN_DIS_CROP_S yCrop;
} VIN_DIS_ATTR_S;

【功能描述】

定义DIS属性信息

【成员说明】

成员含义
picSize输入数据宽高
disPath输出类型
disHratio设置为65536
disVrati设置为65536
xCrop处理区域修正
yCrop处理区域修正

VIN_LENS_FUNC_TYPE_E

【结构定义】

typedef enum HB_VIN_LENS_FUNC_TYPE_E {
VIN_LENS_AF_TYPE = 1,
VIN_LENS_ZOOM_TYPE,
VIN_LENS_INVALID,
} VIN_LENS_FUNC_TYPE_E;

【功能描述】

马达功能

【成员说明】

  • AF自动对焦,改变像距
  • ZOOM变焦,改变焦距

VIN_LENS_CTRL_ATTR_S

【结构定义】

typedef struct HB_VIN_LENS_CTRL_ATTR_S {
uint16_t port;
VIN_LENS_MOTOR_TYPE_E motorType;
uint32_t maxStep;
uint32_t initPos;
uint32_t minPos;
uint32_t maxPos;
union {
struct {
uint16_t pwmNum;
uint32_t pwmDuty;
uint32_t pwmPeriod;
} pwmParam;
struct {
uint16_t pulseForwardNum;
uint16_t pulseBackNum;
uint32_t pulseDuty;
uint32_t pulsePeriod;
} pulseParam;
struct {
uint16_t i2cNum;
uint32_t i2cAddr;
} i2cParam;
struct {
uint16_t gpioA1;
uint16_t gpioA2;
uint16_t gpioB1;
uint16_t gpioB2;
} gpioParam;
};
} VIN_LENS_CTRL_ATTR_S;

【功能描述】

定义pipe属性信息

【成员说明】

成员含义
port每一路输入,和pipeId对应
motorType电机驱动类型,详见VIN_LENS_MOTOR_TYPE_E
maxStep电机最大步数
initPos电机初始位置
minPos电机最小位置
maxPos电机最大位置
pwmNum马达控制pwm 设备号
pwmDuty马达控制pwm 占空比
pwmPeriod马达控制pwm 频率
pulseForwardNum马达控制 前向控制 pulse 设备号
pulseBackNum马达控制 后向控制 pulse 设备号
pulseDuty马达控制 脉冲占空比
pulsePeriod马达控制 脉冲 频率
i2cNum马达控制I2C 设备号
i2cAddr马达控制I2C 地址
gpioA1马达控制a+ gpio 号
gpioA2马达控制a- gpio 号
gpioB1马达控制b+ gpio 号
gpioB2马达控制b- gpio 号

VIN_LENS_MOTOR_TYPE_E

【结构定义】

typedef enum HB_VIN_LENS_MOTOR_TYPE_E {
VIN_LENS_PWM_TYPE = 0,
VIN_LENS_PULSE_TYPE,
VIN_LENS_I2C_TYPE,
VIN_LENSSPI_TYPE,
VIN_LENS_GPIO_TYPE
} VIN_LENS_MOTOR_TYPE_E;

【功能描述】

电机驱动类型,由以上几种。

【成员说明】

  • PWM 驱动、脉冲个数驱动、I2C 通信方式控制、spi 通信方式控制、GPIP 引脚时序控制。 由于硬件环境因素,只调试验证过GPIO方式。

DATA TYPE

DataType Description
0x28RAW6
0x29RAW7
0x2ARAW8
0x2BRAW10
0x2CRAW12
0x2DRAW14
0x2EReserved
0x18YUV 420 8-bit
0x19YUV 420 10-bit
0x1ALegacy YUV420 8-bit
0x1BReserved
0x1CYUV 420 8-bit(Chroma Shifted Pixel Sampling)
0x1DYUV 420 10-bit(Chroma Shifted Pixel Sampling))
0x1EYUV 422 8-bit
0x1FYUV 422 10-bit

SIF MCLK

ISP应用场景SIF_MCLK(MHz)
8M 30fps输入326.4
2M 30fps 2路分时多工148.36
2M 30fps 1路输入102.00
8M DOL2 30fps544.00
2M 15fps 4路分时多工148.36

VPU CLK

VPU应用场景编码VPU_BCLK/VPU_CCLK(MHz)
8M@30fpsAVC326.4
HEVC408
2M*4@30fpsAVC544
HEVC544
2M @30fpsAVC204
HEVC204

错误码

VIN错误码如下表:

错误码宏定义描述
-268565505HB_ERR_VIN_CREATE_PIPE_FAIL创建PIPE失败
-268565506HB_ERR_VIN_SIF_INIT_FAILDEV(Sif)初始化失败
-268565507HB_ERR_VIN_DEV_START_FAILDEV(Sif) start失败
-268565508HB_ERR_VIN_PIPE_START_FAILISP start失败
-268565509HB_ERR_VIN_CHN_UNEXISTChn不存在
-268565510HB_ERR_VIN_INVALID_PARAM接口参数错误
-268565511HB_ERR_VIN_ISP_INIT_FAILISP初始化错误
-268565512HB_ERR_VIN_ISP_FRAME_CORRUPTEDISP破帧,isp驱动应该会有drop
-268565513HB_ERR_VIN_CHANNEL_INIT_FAILISP初始化两个chn通道时失败
-268565514HB_ERR_VIN_DWE_INIT_FAILDWE初始化失败
-268565515HB_ERR_VIN_SET_DEV_ATTREX_FAILSIF扩展属性初始化失败
-268565516HB_ERR_VIN_LENS_INIT_FAIL马达初始化失败
-268565517HB_ERR_VIN_SEND_PIPERAW_FAILSIF回灌raw失败
-268565518HB_ERR_VIN_NULL_POINTVIN模块有空指针
-268565519HB_ERR_VIN_GET_CHNFRAME_FAIL获取ISP出来的数据失败
-268565520HB_ERR_VIN_GET_DEVFRAME_FAIL获取SIF出来的数据失败
-268565521HB_ERR_VIN_MD_ENABLE_FAIL使能MotionDetect失败
-268565522HB_ERR_VIN_MD_DISABLE_FAIL关闭MotionDetect失败
-268565523HB_ERR_VIN_SWITCH_SNS_TABLE_FAILISP模式linear\DOL切换失败

参考代码

VIN部分示例代码可以参考,get_sif_dataget_isp_data