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个部分,如 下图所示。
视频输入设备
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的总线号
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
snsInfo | sensor的配置信息 | 输入 |
busNum | bus号 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
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
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
snsInfo | sensor的配置信息 | 输入 |
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上
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
snsInfo | sensor的配置信息 | 输入 |
serdesIdx | serdes的索引0~1 | 输入 |
serdesPort | serdes的port号954 0 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
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上
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
snsInfo | sensor的配置信息 | 输入 |
mipiIdx | mipi_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下的工作模式
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
snsInfo | sensor的配置信息 | 输入 |
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 | 输入 |
snsInfo | Sensor 信息 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
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
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
mipiIdx | Mipi 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里面定义。
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
mipiIdx | Mipi 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
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
mipiIdx | Mipi 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的初始化。
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
mipiIdx | Mipi host 索引号 | 输入 |
mipiAttr | Mipi总线属性信息 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
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对应。
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
mipiIdx | Mipi 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 | 输入 |
snsInfo | sensor信息 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
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 | 输入 |
fps | sensor的帧率 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
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 | 输入 |
mipiIdx | mipi_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 | 输入 |
stVinDevAttr | dev通道属性 | 输入,调用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 | 输入 |
stVinDevAttrEx | dev的扩展属性 | 输入,调用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即可 | 输入 |
stVinLdcAttr | ldc的属性信息 | 输入,获取属性的时候为输出 |
【返回值】
返回值 | 描述 |
---|---|
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即可 | 输入 |
stVinDisAttr | dis的属性信息 | 输入,获取属性的时候为输出 |
【返回值】
返回值 | 描述 |
---|---|
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 初始化顺序:
- 把dev0绑到mipi0 HB_VIN_SetMipiBindDev(0, 0)
- 把mipi0的虚通道0绑到dev0 HB_VIN_SetDevVCNumber(0, 0)
- 把mipi0的虚通道1绑到dev0 HB_VIN_AddDevVCNumber(0, 1);
- 把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 | 输入 |
devMclk | Sif mclk设置,请参见SIF MCLK | 输入,单位KHz |
vpuMclk | vpu 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;