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]);
}