Tool/software:
Hi.
I am creating a new target board and connected new camera. We are using RGB+IR virtual modules.
It is as shown in the figure below.
Additionally, the camera sensor config code has been modified as shown below.
#include <iss_sensors.h>
#include <iss_sensor_priv.h>
#include <iss_sensor_if.h>
#include <iss_sensor_serdes.h>
/**< ISS AEWB plugin is included here to get the default AEWB configuration
from each sensor */
// #define vc1940_OUT_WIDTH (1936)
// #define vc1940_OUT_HEIGHT (1100)
#define vc1940_OUT_WIDTH (2560)
#define vc1940_OUT_HEIGHT (1984)
// #define vc1940_OUT_WIDTH (2690)
// #define vc1940_OUT_HEIGHT (2020)
//정확한 사이즈 Toltal size
// 2M
// Horizontal
// Active Pixels 1920
// Front Porch 88
// Sync Width 44
// Back Porch 148
// Blanking Total 280
// Total Pixels 2200
// Vertical
// Active Lines 1080
// Front Porch 4
// Sync Width 5
// Back Porch 36
// Blanking Total 45
// Total Lines 1125
// 5M
// Horizontal Active : 2560,
// Horizontal Back Porch : 60,
// Horizontal Sync Pulse : 20,
// Horizontal Total (HTS) : 2690
// Vertical Active : 1984,
// Vertical Back Porch : 12
// Vertical Sync Pulse : 5,
// Vertical Total (VTS) : 2020
#define vc1940_META_HEIGHT_AFTER (4)
#define ISS_SENSOR_vc1940_FEATURES (ISS_SENSOR_FEATURE_MANUAL_EXPOSURE| \
ISS_SENSOR_FEATURE_MANUAL_GAIN| \
ISS_SENSOR_FEATURE_LINEAR_MODE| \
ISS_SENSOR_FEATURE_COMB_COMP_WDR_MODE | \
ISS_SENSOR_FEATURE_CFG_UC1 | \
ISS_SENSOR_FEATURE_DCC_SUPPORTED)
static int32_t vc1940_Probe(uint32_t chId, void *pSensorHdl);
static int32_t vc1940_Config(uint32_t chId, void *pSensorHdl, uint32_t sensor_features_requested);
// static int32_t vc1940_StreamOn(uint32_t chId, void *pSensorHdl);
// static int32_t vc1940_StreamOff(uint32_t chId, void *pSensorHdl);
// static int32_t vc1940_PowerOn(uint32_t chMask, void *pSensorHdl);
// static int32_t vc1940_PowerOff(uint32_t chId, void *pSensorHdl);
// static int32_t vc1940_GetExpParams(uint32_t chId, void *pSensorHdl, IssSensor_ExposureParams *pExpPrms);
// static int32_t vc1940_SetAeParams(void *pSensorHdl, uint32_t chId, IssSensor_ExposureParams *pExpPrms);
// static int32_t vc1940_GetDccParams(uint32_t chId, void *pSensorHdl, IssSensor_DccParams *pDccPrms);
// static void vc1940_InitAewbConfig(uint32_t chId, void *pSensorHdl);
// static void vc1940_GetIspConfig (uint32_t chId, void *pSensorHdl);
// static void vc1940_deinit (uint32_t chId, void *pSensorHdl);
// static int32_t vc1940_ReadWriteReg (uint32_t chId, void *pSensorHdl, uint32_t readWriteFlag, I2cParams *pReg);
// static int32_t vc1940_GetExpPrgFxn(uint32_t chId, void *pSensorHdl, IssAeDynamicParams *p_ae_dynPrms);
// static int32_t vc1940_SetAwbParams(void *pSensorHdl, uint32_t chId, IssSensor_WhiteBalanceParams *pWbPrms);
// static int32_t vc1940_GetWBPrgFxn(uint32_t chId, void *pSensorHdl, IssAwbDynamicParams *p_awb_dynPrms);
static int32_t vc1940_WriteReg(uint8_t i2cInstId,
uint8_t i2cAddr,
uint16_t regAddr,
uint8_t regValue,
uint32_t numRegs);
static int32_t vc1940_ReadReg(uint8_t i2cInstId,
uint8_t i2cAddr,
uint16_t regAddr,
uint8_t *regVal,
uint32_t numRegs);
#include "ICMU_vc1940.h"
static IssSensor_CreateParams vc1940CreatePrms = {
SENSOR_ST_vc1940_MAX, /*sensor name*/
0x6, /*i2cInstId*/
{
SENSOR_0_I2C_ALIAS, SENSOR_1_I2C_ALIAS, SENSOR_2_I2C_ALIAS, SENSOR_3_I2C_ALIAS,
SENSOR_4_I2C_ALIAS, SENSOR_5_I2C_ALIAS, SENSOR_6_I2C_ALIAS, SENSOR_7_I2C_ALIAS,
SENSOR_8_I2C_ALIAS, SENSOR_9_I2C_ALIAS, SENSOR_10_I2C_ALIAS, SENSOR_11_I2C_ALIAS
},/*i2cAddrSensor*/
{
SER_0_I2C_ALIAS, SER_1_I2C_ALIAS, SER_2_I2C_ALIAS, SER_3_I2C_ALIAS,
SER_4_I2C_ALIAS, SER_5_I2C_ALIAS, SER_6_I2C_ALIAS, SER_7_I2C_ALIAS,
SER_8_I2C_ALIAS, SER_9_I2C_ALIAS, SER_10_I2C_ALIAS, SER_11_I2C_ALIAS
},/*i2cAddrSer*/
/*IssSensor_Info*/
{
{
vc1940_OUT_WIDTH, /*width*/
// vc1940_OUT_HEIGHT-vc1940_META_HEIGHT_AFTER, /*height*/
vc1940_OUT_HEIGHT,
1, /*num_exposures*/
vx_false_e, /*line_interleaved*/
{
//{TIVX_RAW_IMAGE_16_BIT, 11}, /*dataFormat and MSB [0]*/
{VX_DF_IMAGE_YUYV, 7}, /*dataFormat and MSB [0]*/ //add ICMU YUV422 8bit
},
0, /*meta_height_before*/
// vc1940_META_HEIGHT_AFTER, /*meta_height_after*/
0,
},
// vc1940_META_HEIGHT_AFTER, /*features*/
0,
ALGORITHMS_ISS_AEWB_MODE_AEWB, /*aewbMode*/
30, /*fps*/
4, /*numDataLanes*/
{1, 2, 3, 4}, /*dataLanesMap*/
{0, 0, 0, 0}, /*dataLanesPolarity*/
//CSIRX_LANE_BAND_SPEED_2250_TO_2500_MBPS , /*csi_laneBandSpeed*/
CSIRX_LANE_BAND_SPEED_1040_TO_1200_MBPS , /*csi_laneBandSpeed* add ICMU CSI*/
//CSIRX_LANE_BAND_SPEED_880_TO_1040_MBPS,
},
//12, /*numChan*/
2, /*numChan*/
190, /*dccId*/
//390, /*dccId*/
};
static IssSensorFxns vc1940SensorFxns = {
// vc1940_Config
vc1940_Probe,
vc1940_Config
// vc1940_StreamOn,
// vc1940_StreamOff,
// vc1940_PowerOn,
// vc1940_PowerOff,
// vc1940_GetExpParams,
// vc1940_SetAeParams,
// vc1940_GetDccParams,
// vc1940_InitAewbConfig,
// vc1940_GetIspConfig,
// vc1940_ReadWriteReg,
// vc1940_GetExpPrgFxn,
// vc1940_deinit,
// vc1940_GetWBPrgFxn,
// vc1940_SetAwbParams
};
static IssSensorIntfParams vc1940SensorIntfPrms = {
0, /*sensorBroadcast*/
0, /*enableFsin*/
0, /*numCamerasStreaming*/
};
IssSensors_Handle vc1940SensorHandle = {
1, /*isUsed*/
&vc1940CreatePrms, /*CreatePrms*/
&vc1940SensorFxns, /*SensorFxns*/
&vc1940SensorIntfPrms, /*SensorIntfPrms*/
};
int32_t IssSensor_vc1940_Init()
{
int32_t status;
int32_t chId;
printf("IssSensor_vc1940 5M Init............ \n");
status = IssSensor_Register(&vc1940SensorHandle);
if(0 != status)
{
printf("IssSensor_vc1749_Init failed \n");
}
// for(chId=0;chId<ISS_SENSORS_MAX_CHANNEL;chId++)
// {
// sp1hGainRegValueOld[chId] = 0;
// redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
// }
return status;
}
static int32_t vc1940_Probe(uint32_t chId, void *pSensorHdl)
{
int32_t status = 0;
printf("=====================================================================\n");
printf("[ICMU] vc1940_Probe.................................................\n");
printf("=====================================================================\n");
// int32_t status = -1;
// uint32_t i2cInstId;
// uint8_t sensorI2cAddr;
// uint16_t chipIdRegAddr = IMX390_CHIP_ID_REG_ADDR;
// uint8_t chipIdRegValueRead = 0xAB;
// IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
// IssSensor_CreateParams * pCreatePrms;
// I2cParams * serCfg = NULL;
// uint8_t count=0;
// uint8_t max_retries = 1;
// assert(NULL != pSenHandle);
// pCreatePrms = pSenHandle->createPrms;
// assert(NULL != pCreatePrms);
// i2cInstId = pCreatePrms->i2cInstId;
// sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
// status = UB960_SetSensorAlias(chId, IMX390_I2C_ADDR >> 1, pCreatePrms->i2cAddrSer[chId]);
// if(0 != status)
// {
// printf("IMX390_Probe Error: UB960_SetSensorAlias for chId %d returned %d \n", chId, status);
// return status;
// }
// serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
// /*The code assumes that I2C instance is the same for sensor and serializer*/
// if(NULL != serCfg)
// {
// status = ub953_cfgScript(i2cInstId, pCreatePrms->i2cAddrSer[chId], serCfg);
// }
// /*Read chip ID to detect if the sensor can be detected*/
// while( (chipIdRegValueRead != IMX390_CHIP_ID_REG_VAL) && (count < max_retries))
// {
// status = IMX390_ReadReg(i2cInstId, sensorI2cAddr, chipIdRegAddr, &chipIdRegValueRead, 1U);
// if(status == 0 )
// {
// if(chipIdRegValueRead == IMX390_CHIP_ID_REG_VAL)
// {
// status = 0;
// issLogPrintf("IMX390_Probe SUCCESS : Read expected value 0x%x at chip ID register 0x%x \n", IMX390_CHIP_ID_REG_VAL, chipIdRegAddr);
// }
// else
// {
// status = -1;
// issLogPrintf("IMX390_Probe : 0x%x read at chip ID register 0x%x. Expected 0x%x \n", chipIdRegValueRead, chipIdRegAddr, IMX390_CHIP_ID_REG_VAL);
// issLogPrintf("IMX390 Probe Failed.. Retrying \n");
// appLogWaitMsecs(100);
// }
// }
// else
// {
// issLogPrintf("IMX390 Probe : Failed to read CHIP_ID register 0x%x \n", chipIdRegAddr);
// }
// count++;
// }
return (status);
}
//static uint32_t imx390FeaturesEnabled;
static int32_t vc1940_Config(uint32_t chId, void *pSensorHdl, uint32_t sensor_features_requested)
{
int32_t status = 0;
uint32_t i2cInstId;
uint16_t sensor_cfg_script_len = 0;
I2cParams *sensorCfg = NULL;
I2cParams *serCfg = NULL;
IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
IssSensor_CreateParams * pCreatePrms;
printf("=====================================================================\n");
printf("[ICMU] vc1940_Config.................................................\n");
printf("=====================================================================\n");
assert(NULL != pSenHandle);
pCreatePrms = pSenHandle->createPrms;
assert(NULL != pCreatePrms);
if(sensor_features_requested != (sensor_features_requested & ISS_SENSOR_vc1940_FEATURES))
{
printf("vc1940_Config : Error. feature set 0x%x is not supported \n", sensor_features_requested);
return -1;
}
// imx390FeaturesEnabled= sensor_features_requested;
// i2cInstId = pCreatePrms->i2cInstId;
// if(ISS_SENSOR_FEATURE_CFG_UC1 == (sensor_features_requested & ISS_SENSOR_FEATURE_CFG_UC1))
// {
// serCfg = imx390SensorRegConfigWdr60fps.serCfgPreScript;
// sensorCfg = imx390SensorRegConfigWdr60fps.sensorCfgPreScript;
// sensor_cfg_script_len = IMX390_WDR_CONFIG_SIZE;
// }
// else
// {
// if(sensor_features_requested & ISS_SENSOR_FEATURE_COMB_COMP_WDR_MODE)
// {
// serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
// sensorCfg = imx390SensorRegConfigWdr.sensorCfgPreScript;
// sensor_cfg_script_len = IMX390_WDR_CONFIG_SIZE;
// }else
// {
// serCfg = imx390SensorRegConfigLinear.serCfgPreScript;
// sensorCfg = imx390SensorRegConfigLinear.sensorCfgPreScript;
// sensor_cfg_script_len = IMX390_LINEAR_CONFIG_SIZE;
// }
// }
// /*Deserializer config is done in IssSensor_PowerOn, Need to set sensor alias*/
// status = UB960_SetSensorAlias(chId, IMX390_I2C_ADDR >> 1, pCreatePrms->i2cAddrSer[chId]);
// if(0 != status)
// {
// printf("IMX390_Config Error : UB960_SetSensorAlias for chId %d returned %d \n", chId, status);
// }else
// {
// status = ub953_cfgScript(i2cInstId, pCreatePrms->i2cAddrSer[chId], serCfg);
// if(0 != status)
// {
// printf("IMX390_Config Error : UB953 config failed for camera # %d \n", chId);
// }else
// {
// status = IMX390_Sensor_RegConfig(i2cInstId, pCreatePrms->i2cAddrSensor[chId], sensorCfg, sensor_cfg_script_len);
// }
// }
return (status);
}
static int32_t vc1940_ReadReg(uint8_t i2cInstId,
uint8_t i2cAddr,
uint16_t regAddr,
uint8_t *regVal,
uint32_t numRegs)
{
int32_t status = -1;
I2C_Handle sensorI2cHandle = NULL;
static uint8_t sensorI2cByteOrder = 255U;
getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
if(NULL == sensorI2cHandle)
{
printf("Sensor I2C Handle is NULL \n");
return -1;
}
status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr, regVal, numRegs, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
if(0 != status)
{
issLogPrintf("Error : I2C Timeout while reading from IMX390 register 0x%x \n", regAddr);
}
return (status);
}
static int32_t vc1940_WriteReg(uint8_t i2cInstId,
uint8_t i2cAddr,
uint16_t regAddr,
uint8_t regVal,
uint32_t numRegs)
{
int32_t status = -1;
I2C_Handle sensorI2cHandle = NULL;
static uint8_t sensorI2cByteOrder = 255U;
getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
if(NULL == sensorI2cHandle)
{
printf("Sensor I2C Handle is NULL \n");
return -1;
}
status = Board_i2c16BitRegWr(sensorI2cHandle, i2cAddr, regAddr, ®Val, numRegs, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
if(0 != status)
{
printf("Error : I2C Timeout while writing 0x%x to IMX390 register 0x%x \n", regVal, regAddr);
}
return (status);
}
1. Please confirm this code that sensor settings are correct.(YUV422 8bit format)
2. I checked the MAX96714 Deserilazer setting and confirmed with oscilloscope that the MIPI data is coming out. Please tell me what I need to do to receive data with TDA4VM MIPI CSI-0 or how to verify it.
3. I would like to know the part that checks whether MIPI data is received in run_app_multi_cam.