This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: TDA4V RGB+IR Sensor new camera modlue

Part Number: TDA4VM

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, &regVal, 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.