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.

J722SXH01EVM: add a new sensor fail

Part Number: J722SXH01EVM


Tool/software:

HI TI

我们现在porting 一个新sensor遇到问题,log上报错是没有收到图,屏幕显示花屏。setting是有验证过ok的,之前跟贵司fae Adam有过沟通,分析可能接的csi口没有按照贵司建议的来接,我们硬件重做了转板,现在是完全按照贵司的解法接的,依旧跟之前一样的报错。请协助帮忙debug。目前iic通信正常,帧率分辨率已确认正确,mipi速率也是够的。

log和驱动代码上传至附件。sdk用的是ti-processor-sdk-rtos[com COM13] (2025-04-15_131227) COM13 (USB Serial Port (COM13)).log

/*
 *
 * Copyright (c) 2020 Texas Instruments Incorporated
 *
 * All rights reserved not granted herein.
 *
 * Limited License.
 *
 * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
 * license under copyrights and patents it now or hereafter owns or controls to make,
 * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
 * terms herein.  With respect to the foregoing patent license, such license is granted
 * solely to the extent that any such patent is necessary to Utilize the software alone.
 * The patent license shall not apply to any combinations which include this software,
 * other than combinations with devices manufactured by or for TI ("TI Devices").
 * No hardware patent is licensed hereunder.
 *
 * Redistributions must preserve existing copyright notices and reproduce this license
 * (including the above copyright notice and the disclaimer and (if applicable) source
 * code license limitations below) in the documentation and/or other materials provided
 * with the distribution
 *
 * Redistribution and use in binary form, without modification, are permitted provided
 * that the following conditions are met:
 *
 * *       No reverse engineering, decompilation, or disassembly of this software is
 * permitted with respect to any software provided in binary form.
 *
 * *       any redistribution and use are licensed by TI for use only with TI Devices.
 *
 * *       Nothing shall obligate TI to provide you with source code for the software
 * licensed and provided to you in object code.
 *
 * If software source code is provided to you, modification and redistribution of the
 * source code are permitted provided that the following conditions are met:
 *
 * *       any redistribution and use of the source code, including any resulting derivative
 * works, are licensed by TI for use only with TI Devices.
 *
 * *       any redistribution and use of any object code compiled from the source code
 * and any resulting derivative works, are licensed by TI for use only with TI Devices.
 *
 * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
 *
 * may be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * DISCLAIMER.
 *
 * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
#include "iss_sensor_imx390.h"
#include "imx390_serdes_config.h"

static IssSensor_CreateParams  imx390CreatePrms = {
    SENSOR_SONY_IMX390_UB953_D3,     /*sensor name*/
    0x5,                             /*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*/
    {
        {
            IMX390_OUT_WIDTH,               /*width*/
            IMX390_OUT_HEIGHT-IMX390_META_HEIGHT_AFTER,            /*height*/
            1,                              /*num_exposures*/
            vx_false_e,                     /*line_interleaved*/
            {
                {TIVX_RAW_IMAGE_16_BIT, 11},    /*dataFormat and MSB [0]*/
            },
            0,                              /*meta_height_before*/
            IMX390_META_HEIGHT_AFTER,      /*meta_height_after*/
        },
        ISS_SENSOR_IMX390_FEATURES,     /*features*/
        ALGORITHMS_ISS_AEWB_MODE_AEWB,  /*aewbMode*/
        30,                             /*fps*/
        4,                              /*numDataLanes*/
        {1, 2, 3, 4},                   /*dataLanesMap*/
        {0, 0, 0, 0},                   /*dataLanesPolarity*/
        CSIRX_LANE_BAND_SPEED_1350_TO_1500_MBPS, /*csi_laneBandSpeed*/
    },
    12,                                  /*numChan*/
    390,                                /*dccId*/
};

static IssSensorFxns           im390SensorFxns = {
    IMX390_Probe,
    IMX390_Config,
    IMX390_StreamOn,
    IMX390_StreamOff,
    IMX390_PowerOn,
    IMX390_PowerOff,
    IMX390_GetExpParams,
    IMX390_SetAeParams,
    IMX390_GetDccParams,
    IMX390_InitAewbConfig,
    IMX390_GetIspConfig,
    IMX390_ReadWriteReg,
    IMX390_GetExpPrgFxn,
    IMX390_deinit,
    IMX390_GetWBPrgFxn,
    IMX390_SetAwbParams
};

static IssSensorIntfParams     imx390SensorIntfPrms = {
    0,             /*sensorBroadcast*/
    0,             /*enableFsin*/
    0,			   /*numCamerasStreaming*/
};

IssSensorConfig     imx390SensorRegConfigLinear = {
    max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
    max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
    iMX390LinearConfig,        /*sensorCfgPreScript*/
    NULL,        /*desCfgPostScript*/
    NULL,                    /*serCfgPostScript*/
    NULL,                    /*sensorCfgPostScript*/
};

IssSensorConfig     imx390SensorRegConfigWdr = {
    max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
    max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
    iMX390WdrConfig,        /*sensorCfgPreScript*/
    NULL,        /*desCfgPostScript*/
    NULL,                    /*serCfgPostScript*/
    NULL,                    /*sensorCfgPostScript*/
};

IssSensorConfig     imx390SensorRegConfigWdr60fps = {
    max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
    max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
    iMX390WdrConfig,     /*sensorCfgPreScript*/
    NULL,        /*desCfgPostScript*/
    NULL,                    /*serCfgPostScript*/
    NULL,                    /*sensorCfgPostScript*/
};

IssSensors_Handle imx390SensorHandle = {
    1,                                 /*isUsed*/
    &imx390CreatePrms,                /*CreatePrms*/
    &im390SensorFxns,                /*SensorFxns*/
    &imx390SensorIntfPrms,            /*SensorIntfPrms*/
};

/*
 * \brief DCC Parameters of IMX390
 */
//IssCapture_CmplxIoLaneCfg           imx390Csi2CmplxIoLaneCfg;
extern IssSensors_Handle * gIssSensorTable[ISS_SENSORS_MAX_SUPPORTED_SENSOR];
static uint16_t sp1hGainRegValueOld[ISS_SENSORS_MAX_CHANNEL];
static uint16_t redGain_prev[ISS_SENSORS_MAX_CHANNEL];
static uint16_t greenGain_prev[ISS_SENSORS_MAX_CHANNEL];
static uint16_t blueGain_prev[ISS_SENSORS_MAX_CHANNEL];

int32_t IssSensor_IMX390_Init()
{
    int32_t status;
    int32_t chId;
    status = IssSensor_Register(&imx390SensorHandle);
    if(0 != status)
    {
        printf("IssSensor_IMX390_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;
}

/*******************************************************************************
 *  Local Functions Definition
 *******************************************************************************
 */

static int32_t IMX390_Probe(uint32_t chId, void *pSensorHdl)
{
    printf("IMX390_Probe++++++++");
    int32_t status = -1;
    uint32_t i2cInstId;
    uint8_t sensorI2cAddr;
    uint16_t chipIdRegAddr = IMX390_CHIP_ID_REG_ADDR;
    uint16_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];

    #if 0
    serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
    /*The code assumes that I2C instance is the same for sensor and serializer*/
    if(NULL != serCfg)
    {
        status = max_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;
                printf("IMX390_Probe SUCCESS : Read expected value 0x%x at chip ID register 0x%x \n", IMX390_CHIP_ID_REG_VAL, chipIdRegAddr);
            }
            else
            {
                status = -1;
                printf("IMX390_Probe : 0x%x read at chip ID register 0x%x. Expected 0x%x \n", chipIdRegValueRead, chipIdRegAddr, IMX390_CHIP_ID_REG_VAL);
                printf("IMX390 Probe Failed.. Retrying \n");
                appLogWaitMsecs(100);
            }
        }
        else
        {
            printf("IMX390 Probe : Failed to read CHIP_ID register 0x%x \n", chipIdRegAddr);
        }
        count++;
    }
    #endif 
    printf("IMX390_Probe----------");
    return (0);
}

static int32_t IMX390_Sensor_RegConfig(uint32_t i2cInstId, uint8_t sensorI2cAddr, I2cParams *sensorCfg, uint16_t sensor_cfg_script_len)
{
    int32_t status = 0;
    uint16_t regAddr;
    uint16_t regValue;
    uint16_t delayMilliSec;
    uint32_t regCnt;

    if(NULL != sensorCfg)
    {
        regCnt = 0;
        regAddr  = sensorCfg[regCnt].nRegAddr;
        regValue = sensorCfg[regCnt].nRegValue;
        delayMilliSec = sensorCfg[regCnt].nDelay;

        printf(" Configuring IMX390 imager 0x%x.. Please wait till it finishes \n", sensorI2cAddr);
        while(regCnt<sensor_cfg_script_len)
        {
            status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);

            if (0 != status)
            {
                printf(" \n \n IMX390: Sensor Reg Write Failed for regAddr 0x%x \n \n", regAddr);
            }

            if(delayMilliSec > 0)
            {
               appLogWaitMsecs(delayMilliSec);
            }

            regCnt++;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
        }
        /*Wait 100ms after the init is done*/
        appLogWaitMsecs(100);
        //printf(" IMX390 config done \n ");
    }
    else
    {
        printf(" IMX390 config script is NULL \n");
    }
    return status;
}

static uint32_t imx390FeaturesEnabled;
static int32_t IMX390_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;
    uint8_t regValue = 0;
    I2cParams *sensorCfg = NULL;
    I2cParams *serCfg = NULL;
    I2cParams *desCfg = NULL;
    IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
    IssSensor_CreateParams * pCreatePrms;

    assert(NULL != pSenHandle);
    pCreatePrms = pSenHandle->createPrms;
    assert(NULL != pCreatePrms);

    if(sensor_features_requested != (sensor_features_requested & ISS_SENSOR_IMX390_FEATURES))
    {
        printf("IMX390_Config : Error. feature set 0x%x is not supported \n", sensor_features_requested);
        return -1;
    }

    imx390FeaturesEnabled= sensor_features_requested;

    i2cInstId = pCreatePrms->i2cInstId;
	desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
    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 = max_cfgScript(i2cInstId, MAX9296_DES_ID >> 1, desCfg);
    Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &regValue);
    printf("des link lock status: 0x%x\n",regValue);
    Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x10, &regValue);
    printf("des regAddr:0x10 - 0x%x\n",regValue);
    if(0 != status)
    {
        printf("IMX390_Config Error : max9296 config failed for camera # %d \n", chId);
    }
    Deserializer_ReadReg(pCreatePrms->i2cAddrSer[chId], 0x00, &regValue);
    printf("max96717F[ID]::0x00 - 0x%x\n",regValue);
    status = max_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] >> 1, sensorCfg, sensor_cfg_script_len);
    }
    return (status);
}

static int32_t IMX390_StreamOn(uint32_t chId, void *pSensorHdl)
{
    int32_t status = 0;

    IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
    IssSensor_CreateParams * pCreatePrms;
    uint32_t i2cInstId;
    uint8_t sensorI2cAddr;
    uint32_t regCnt;
    uint16_t regAddr;
    uint16_t regValue;
    uint8_t  value;
    uint16_t delayMilliSec;
	I2cParams *sensorCfg = NULL;
    uint16_t sensor_cfg_script_len = 0;
    

    assert(NULL != pSenHandle);
    pCreatePrms = pSenHandle->createPrms;
    assert(NULL != pCreatePrms);

    if(ISS_SENSOR_FEATURE_CFG_UC1 == (imx390FeaturesEnabled& ISS_SENSOR_FEATURE_CFG_UC1))
    {
        if(pSenHandle->sensorIntfPrms->numCamerasStreaming >= 3U)
        {
            printf("IMX390_StreamOn Error : %d cameras streaming already \n", pSenHandle->sensorIntfPrms->numCamerasStreaming);
            printf("IMX390_StreamOn Error : 60fps mode can support upto 3 cameras because of UB960 b/w limitation \n");
            return -1;
        }
    }

    i2cInstId = pCreatePrms->i2cInstId;
    sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    sensorCfg = imx390SensorRegConfigWdr.sensorCfgPreScript;
    sensor_cfg_script_len = 10;
    if(NULL != sensorCfg)
    {
        regCnt = 0;
        regAddr  = sensorCfg[regCnt].nRegAddr;
        regValue = sensorCfg[regCnt].nRegValue;
        delayMilliSec = sensorCfg[regCnt].nDelay;
        while(regCnt<sensor_cfg_script_len)
        {
            printf("write IMX390 success!:regAddr 0x%x -- regValue 0x%x status = %d\n \n", regAddr, regValue, status);
            status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, regAddr, &regValue, 1u);
            if(delayMilliSec > 0)
            {
               appLogWaitMsecs(delayMilliSec);
            }
            if (0 == status)
            {
                printf("Read IMX390 success!:regAddr 0x%x -- regValue 0x%x\n \n", regAddr, regValue);
            }
            regCnt++;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
        }
        appLogWaitMsecs(100);

    }
    else
    {
        printf("IMX390_StreamOn: IMX390 config script is NULL \n");
    }
    status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x1, 1u);/*ACTIVE*/
    appLogWaitMsecs(10);
    status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, &regValue, 1u);
    if (status == 0)
    {
        printf("read IMX390_StreamOn flag:0x0100 - 0x%x\n", regValue);
    }
    status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x42);
    status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x84);
    Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1dc, &value);
    printf("des [video lock]regAddr:0x1dc - 0x%x\n",value);
    Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1fc, &value);
    printf("des [video lock]regAddr:0x1fc - 0x%x\n",value);
    Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x21c, &value);
    printf("des [video lock]regAddr:0x21c - 0x%x\n",value);
    Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x23c, &value);
    printf("des [video lock]regAddr:0x23c - 0x%x\n",value);
    printf("IMX390_StreamOn End--------------------- \n");
    return (status);
}

static int32_t IMX390_StreamOff(uint32_t chId, void *pSensorHdl)
{
    int32_t status = 0;
    IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
    IssSensor_CreateParams * pCreatePrms;
    uint32_t i2cInstId;
    uint8_t sensorI2cAddr;

    assert(NULL != pSenHandle);
    pCreatePrms = pSenHandle->createPrms;
    assert(NULL != pCreatePrms);

    i2cInstId = pCreatePrms->i2cInstId;
    sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];

    status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x0, 1u);/*STANDBY*/
    appLogWaitMsecs(10);
    status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x40);
    status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x00);
    return status;
}

static int32_t IMX390_PowerOn(uint32_t chId, void *pSensorHdl)
{
    int32_t status = 0;

    sp1hGainRegValueOld[chId] = 0;
    redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;

    printf("IMX390_PowerOn : chId = 0x%x \n", chId);

    return status;
}

static int32_t IMX390_PowerOff(uint32_t chId, void *pSensorHdl)
{
    return (0);
}

static int32_t IMX390_SetAeParams(void *pSensorHdl, uint32_t chId, IssSensor_ExposureParams *pExpPrms)
{
    uint16_t regAddr;
    uint16_t cnt;
    uint8_t regValue;
    int32_t status = -1;
    IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
    IssSensor_CreateParams * pCreatePrms;
    uint32_t i2cInstId;
    uint8_t sensorI2cAddr;
    uint32_t sp1h_again = 0U;

    assert(NULL != pSenHandle);
    pCreatePrms = pSenHandle->createPrms;
    assert(NULL != pCreatePrms);

    i2cInstId = pCreatePrms->i2cInstId;
    sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];

    /* Exp time is fixed to 11ms for LFM. Set Analog Gain Only */

    for (cnt = 0; cnt < ISS_IMX390_GAIN_TBL_SIZE; cnt ++)
    {
        if (pExpPrms->analogGain[ISS_SENSOR_EXPOSURE_LONG] <= gIMX390GainsTable[cnt][0])
        {
            sp1h_again = gIMX390GainsTable[cnt][1];
            break;
        }
    }

    if(sp1hGainRegValueOld[chId] == sp1h_again)
    {
        /*Reduce I2C transactions.
        Do not write to the sensor if register value does not change */
        return 0;
    }
    sp1hGainRegValueOld[chId] = sp1h_again;

    regAddr = 0x0008;
    regValue = 1;
    status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    if(status != 0)
    {
        printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
    }

    regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR;
    regValue = sp1h_again & 0xFF;
    status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    if(status != 0)
    {
        printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
    }

    regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR_HIGH;
    regValue = sp1h_again >> 8;
    status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    if(status != 0)
    {
        printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
    }

    regAddr = 0x0008;
    regValue = 0;
    status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    if(status != 0)
    {
        printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
    }

    return (status);
}

static int32_t IMX390_GetDccParams(uint32_t chId, void *pSensorHdl, IssSensor_DccParams *pDccPrms)
{
    int32_t status = 0;
    return (status);
}

static int32_t IMX390_GetExpParams(uint32_t chId, void *pSensorHdl, IssSensor_ExposureParams *pExpPrms)
{
    int32_t status = 0;

    assert(NULL != pExpPrms);
    pExpPrms->expRatio = ISS_SENSOR_IMX390_DEFAULT_EXP_RATIO;

    return (status);
}

static void IMX390_InitAewbConfig(uint32_t chId, void *pSensorHdl)
{
    return;
}

static void IMX390_GetIspConfig (uint32_t chId, void *pSensorHdl)
{
    return;
}

static void IMX390_deinit (uint32_t chId, void *pSensorHdl)
{
    return;
}

static int32_t IMX390_ReadWriteReg (uint32_t chId, void *pSensorHdl, uint32_t readWriteFlag, I2cParams *pReg)
{
    int32_t status = 0;

    uint16_t regValue = 0;
    IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
    IssSensor_CreateParams * pCreatePrms;

    assert(NULL != pSenHandle);
    pCreatePrms = pSenHandle->createPrms;

    assert(NULL != pReg);

    if (1u == readWriteFlag)
    {
        /*write*/
        regValue = pReg->nRegValue;
        status = IMX390_WriteReg(pCreatePrms->i2cInstId,
            pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, regValue, 1u);
    }
    else
    {
        /*read*/
        status = IMX390_ReadReg(pCreatePrms->i2cInstId,
            pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, &regValue, 1u);

        if (0 == status)
        {
            pReg->nRegValue = regValue;
        }
    }
    return (status);
}

static int32_t IMX390_ReadReg(uint8_t     i2cInstId,
                            uint8_t         i2cAddr,
                            uint16_t        regAddr,
                            uint16_t         *regVal,
                            uint32_t        numRegs)
{
    int32_t  status = -1;
    I2C_Handle sensorI2cHandle = NULL;
    static uint8_t sensorI2cByteOrder = 0U;
    uint8_t   readReg8_High = 0xAB;
    uint8_t   readReg8_Low = 0xCD;
    uint32_t count;
    getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
    if(NULL == sensorI2cHandle)
    {
        printf("Sensor I2C Handle is NULL \n");
        return -1;
    }
    for(count = 0;count<numRegs;count++)
    {
        status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr, &readReg8_High, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
        if(status == 0 )
    {
            status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr+1, &readReg8_Low, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
        }
    }
    *regVal = ((readReg8_High << 8) & 0xFF00) | readReg8_Low;
    return (status);
}

static int32_t IMX390_WriteReg(uint8_t    i2cInstId,
                             uint8_t       i2cAddr,
                             uint16_t         regAddr,
                             uint16_t          regVal,
                             uint32_t      numRegs)
{
    int32_t  status = 0;
    int16_t  ret = 0;
    I2C_Handle sensorI2cHandle = NULL;
    static uint8_t sensorI2cByteOrder = 255u;
    getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
    uint8_t   rawRegVal[4];
    I2C_Transaction transaction;
    #if defined (MCU_PLUS_SDK)
    I2C_Transaction_init(&transaction);
    #else
    I2C_transactionInit(&transaction);
    #endif
    if(NULL == sensorI2cHandle)
    {
        printf("Sensor I2C Handle is NULL \n");
        return -1;
    }

    transaction.slaveAddress = i2cAddr;
    transaction.writeBuf     = rawRegVal;
    transaction.writeCount   = 4;
    transaction.readBuf      = NULL;
    transaction.readCount    = 0;
    {
          rawRegVal[0U] = (uint8_t) ((regAddr >> 8U) & (uint8_t) 0xFF);
          rawRegVal[1U] = (uint8_t) ((regAddr >> 0U) & (uint8_t) 0xFF);
          rawRegVal[2U] = (uint8_t) ((regVal >> 8U) & (uint8_t) 0xFF);
          rawRegVal[3U] = (uint8_t) ((regVal >> 0U) & (uint8_t) 0xFF);
          ret = I2C_transfer(sensorI2cHandle, &transaction); 
          if(ret != I2C_STS_SUCCESS)
          {
                printf("IMX390_WriteReg : Error writing to register 0x%x \n ", regAddr);
                status = -1;
          }
    }

    return (status);
}

static int32_t IMX390_GetExpPrgFxn(uint32_t chId, void *pSensorHdl, IssAeDynamicParams *p_ae_dynPrms)
{
    int32_t status = 0;
    uint8_t count = 0;

    p_ae_dynPrms->targetBrightnessRange.min = DEFAULT_TARGET_BRIGHTNESS_MIN;
    p_ae_dynPrms->targetBrightnessRange.max = DEFAULT_TARGET_BRIGHTNESS_MAX;
    p_ae_dynPrms->targetBrightness = DEFAULT_TARGET_BRIGHTNESS;
    p_ae_dynPrms->threshold = DEFAULT_TARGET_THRESHOLD;
    p_ae_dynPrms->exposureTimeStepSize = DEFAULT_EXPOSURE_TIME;
    p_ae_dynPrms->enableBlc = DEFAULT_ENABLE_BLC;

    p_ae_dynPrms->exposureTimeRange[count].min = 11000;
    p_ae_dynPrms->exposureTimeRange[count].max = 11000;
    p_ae_dynPrms->analogGainRange[count].min = 1024;
    p_ae_dynPrms->analogGainRange[count].max = 8192;
    p_ae_dynPrms->digitalGainRange[count].min = 256;
    p_ae_dynPrms->digitalGainRange[count].max = 256;
    count++;

    p_ae_dynPrms->numAeDynParams = count;
    return (status);
}

static int32_t IMX390_GetWBPrgFxn(uint32_t chId, void *pSensorHdl, IssAwbDynamicParams *p_awb_dynPrms)
{
    int32_t  status = 0;

    p_awb_dynPrms->redGainRange.min = 512;
    p_awb_dynPrms->redGainRange.max = 2048;

    p_awb_dynPrms->greenGainRange.min = 512;
    p_awb_dynPrms->greenGainRange.max = 2048;

    p_awb_dynPrms->blueGainRange.min = 512;
    p_awb_dynPrms->blueGainRange.max = 2048;

    p_awb_dynPrms->sensor_pre_gain = 0;

    printf("IMX390_GetWBPrgFxn: sensor_pre_gain = %d \n", p_awb_dynPrms->sensor_pre_gain);
    return (status);
}

static int32_t IMX390_SetAwbParams(void *pSensorHdl, uint32_t chId, IssSensor_WhiteBalanceParams *pWbPrms)
{
    int32_t status = 0;
    uint16_t regAddr;
    uint16_t regValue;
    IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
    IssSensor_CreateParams * pCreatePrms;

    assert(NULL != pSenHandle);
    pCreatePrms = pSenHandle->createPrms;
    assert(NULL != pCreatePrms);
    assert(NULL != pWbPrms);

    if(redGain_prev[chId] != pWbPrms->rGain[0])
    {
        redGain_prev[chId] = pWbPrms->rGain[0];
        regAddr = IMX390_RED_GAIN_REG_L;
        regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        regAddr = IMX390_RED_GAIN_REG_H;
        regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
    }

    if(greenGain_prev[chId] != pWbPrms->gGain[0])
    {
        greenGain_prev[chId] = pWbPrms->gGain[0];
        regAddr = IMX390_GREEN1_GAIN_REG_L;
        regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        regAddr = IMX390_GREEN2_GAIN_REG_L;
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);

        regAddr = IMX390_GREEN1_GAIN_REG_H;
        regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        regAddr = IMX390_GREEN2_GAIN_REG_H;
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
    }

    if(blueGain_prev[chId] != pWbPrms->bGain[0])
    {
        blueGain_prev[chId] = pWbPrms->bGain[0];
        regAddr = IMX390_BLUE_GAIN_REG_L;
        regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff ;/*Sensor gain is Q8, ISP gain is Q10*/
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        regAddr = IMX390_BLUE_GAIN_REG_H;
        regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
        status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
    }

    return (status);
}
5415.iss_sensors.c-j722s-evm-09_02_00_05

  • 另外,有量到mipi波形,解串器也有读到videolock

    TKS!

  • Hi,

    This is the English E2E forum, so I am unable to understand your post. Could you please translate or restate your question in English so I can help?

    Thank you,

    Fabiana

  • Hi Fabiana

    Now we have encountered problems with a new sensor porting. The error reported in the log is that the picture is not received, and the screen shows a flower screen. The setting has been verified and ok. We communicated with fae Adam of your company before and analyzed that the possible csi port was not connected according to your company's suggestion. We have redone the hardware switching board, and now the CSI port is connected completely according to your company's solution, and the error is still reported as before. Please help debug. At present, the iic communication is normal, the frame rate resolution has been confirmed to be correct, and the mipi rate is the default code, and the resolution we selected is 1920*1536,There is the mipi waveform, and the 

    Deserializer also reads videolock

    .log and driver code are uploaded  as above .The sdk uses ti-processor-sdk-rtos-j722s-evm-09_02_00_05

  • /*
     *
     * Copyright (c) 2020 Texas Instruments Incorporated
     *
     * All rights reserved not granted herein.
     *
     * Limited License.
     *
     * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
     * license under copyrights and patents it now or hereafter owns or controls to make,
     * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
     * terms herein.  With respect to the foregoing patent license, such license is granted
     * solely to the extent that any such patent is necessary to Utilize the software alone.
     * The patent license shall not apply to any combinations which include this software,
     * other than combinations with devices manufactured by or for TI ("TI Devices").
     * No hardware patent is licensed hereunder.
     *
     * Redistributions must preserve existing copyright notices and reproduce this license
     * (including the above copyright notice and the disclaimer and (if applicable) source
     * code license limitations below) in the documentation and/or other materials provided
     * with the distribution
     *
     * Redistribution and use in binary form, without modification, are permitted provided
     * that the following conditions are met:
     *
     * *       No reverse engineering, decompilation, or disassembly of this software is
     * permitted with respect to any software provided in binary form.
     *
     * *       any redistribution and use are licensed by TI for use only with TI Devices.
     *
     * *       Nothing shall obligate TI to provide you with source code for the software
     * licensed and provided to you in object code.
     *
     * If software source code is provided to you, modification and redistribution of the
     * source code are permitted provided that the following conditions are met:
     *
     * *       any redistribution and use of the source code, including any resulting derivative
     * works, are licensed by TI for use only with TI Devices.
     *
     * *       any redistribution and use of any object code compiled from the source code
     * and any resulting derivative works, are licensed by TI for use only with TI Devices.
     *
     * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
     *
     * may be used to endorse or promote products derived from this software without
     * specific prior written permission.
     *
     * DISCLAIMER.
     *
     * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     * IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     * OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     */
    #include "iss_sensor_imx390.h"
    #include "imx390_serdes_config.h"
    
    static IssSensor_CreateParams  imx390CreatePrms = {
        SENSOR_SONY_IMX390_UB953_D3,     /*sensor name*/
        0x5,                             /*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*/
        {
            {
                IMX390_OUT_WIDTH,               /*width*/
                IMX390_OUT_HEIGHT-IMX390_META_HEIGHT_AFTER,            /*height*/
                1,                              /*num_exposures*/
                vx_false_e,                     /*line_interleaved*/
                {
                    {TIVX_RAW_IMAGE_16_BIT, 11},    /*dataFormat and MSB [0]*/
                },
                0,                              /*meta_height_before*/
                IMX390_META_HEIGHT_AFTER,      /*meta_height_after*/
            },
            ISS_SENSOR_IMX390_FEATURES,     /*features*/
            ALGORITHMS_ISS_AEWB_MODE_AEWB,  /*aewbMode*/
            30,                             /*fps*/
            4,                              /*numDataLanes*/
            {1, 2, 3, 4},                   /*dataLanesMap*/
            {0, 0, 0, 0},                   /*dataLanesPolarity*/
            CSIRX_LANE_BAND_SPEED_320_TO_360_MBPS, /*csi_laneBandSpeed*/
        },
        12,                                  /*numChan*/
        390,                                /*dccId*/
    };
    
    static IssSensorFxns           im390SensorFxns = {
        IMX390_Probe,
        IMX390_Config,
        IMX390_StreamOn,
        IMX390_StreamOff,
        IMX390_PowerOn,
        IMX390_PowerOff,
        IMX390_GetExpParams,
        IMX390_SetAeParams,
        IMX390_GetDccParams,
        IMX390_InitAewbConfig,
        IMX390_GetIspConfig,
        IMX390_ReadWriteReg,
        IMX390_GetExpPrgFxn,
        IMX390_deinit,
        IMX390_GetWBPrgFxn,
        IMX390_SetAwbParams
    };
    
    static IssSensorIntfParams     imx390SensorIntfPrms = {
        0,             /*sensorBroadcast*/
        0,             /*enableFsin*/
        0,			   /*numCamerasStreaming*/
    };
    
    IssSensorConfig     imx390SensorRegConfigLinear = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390LinearConfig,        /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensorConfig     imx390SensorRegConfigWdr = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390WdrConfig,        /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensorConfig     imx390SensorRegConfigWdr60fps = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390WdrConfig,     /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensors_Handle imx390SensorHandle = {
        1,                                 /*isUsed*/
        &imx390CreatePrms,                /*CreatePrms*/
        &im390SensorFxns,                /*SensorFxns*/
        &imx390SensorIntfPrms,            /*SensorIntfPrms*/
    };
    
    /*
     * \brief DCC Parameters of IMX390
     */
    //IssCapture_CmplxIoLaneCfg           imx390Csi2CmplxIoLaneCfg;
    extern IssSensors_Handle * gIssSensorTable[ISS_SENSORS_MAX_SUPPORTED_SENSOR];
    static uint16_t sp1hGainRegValueOld[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t redGain_prev[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t greenGain_prev[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t blueGain_prev[ISS_SENSORS_MAX_CHANNEL];
    
    int32_t IssSensor_IMX390_Init()
    {
        int32_t status;
        int32_t chId;
        status = IssSensor_Register(&imx390SensorHandle);
        if(0 != status)
        {
            printf("IssSensor_IMX390_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;
    }
    
    /*******************************************************************************
     *  Local Functions Definition
     *******************************************************************************
     */
    
    static int32_t IMX390_Probe(uint32_t chId, void *pSensorHdl)
    {
        printf("IMX390_Probe++++++++");
        int32_t status = -1;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint16_t chipIdRegAddr = IMX390_CHIP_ID_REG_ADDR;
        uint16_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];
    
        #if 0
        serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
        /*The code assumes that I2C instance is the same for sensor and serializer*/
        if(NULL != serCfg)
        {
            status = max_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;
                    printf("IMX390_Probe SUCCESS : Read expected value 0x%x at chip ID register 0x%x \n", IMX390_CHIP_ID_REG_VAL, chipIdRegAddr);
                }
                else
                {
                    status = -1;
                    printf("IMX390_Probe : 0x%x read at chip ID register 0x%x. Expected 0x%x \n", chipIdRegValueRead, chipIdRegAddr, IMX390_CHIP_ID_REG_VAL);
                    printf("IMX390 Probe Failed.. Retrying \n");
                    appLogWaitMsecs(100);
                }
            }
            else
            {
                printf("IMX390 Probe : Failed to read CHIP_ID register 0x%x \n", chipIdRegAddr);
            }
            count++;
        }
        #endif 
        printf("IMX390_Probe----------");
        return (0);
    }
    
    static int32_t IMX390_Sensor_RegConfig(uint32_t i2cInstId, uint8_t sensorI2cAddr, I2cParams *sensorCfg, uint16_t sensor_cfg_script_len)
    {
        int32_t status = 0;
        uint16_t regAddr;
        uint16_t regValue;
        uint16_t delayMilliSec;
        uint32_t regCnt;
    
        if(NULL != sensorCfg)
        {
            regCnt = 0;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
    
            printf(" Configuring IMX390 imager 0x%x.. Please wait till it finishes \n", sensorI2cAddr);
            while(regCnt<sensor_cfg_script_len)
            {
                status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    
                if (0 != status)
                {
                    printf(" \n \n IMX390: Sensor Reg Write Failed for regAddr 0x%x \n \n", regAddr);
                }
    
                if(delayMilliSec > 0)
                {
                   appLogWaitMsecs(delayMilliSec);
                }
    
                regCnt++;
                regAddr  = sensorCfg[regCnt].nRegAddr;
                regValue = sensorCfg[regCnt].nRegValue;
                delayMilliSec = sensorCfg[regCnt].nDelay;
            }
            /*Wait 100ms after the init is done*/
            appLogWaitMsecs(100);
            //printf(" IMX390 config done \n ");
        }
        else
        {
            printf(" IMX390 config script is NULL \n");
        }
        return status;
    }
    
    static uint32_t imx390FeaturesEnabled;
    static int32_t IMX390_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;
        uint8_t regValue = 0;
        I2cParams *sensorCfg = NULL;
        I2cParams *serCfg = NULL;
        I2cParams *desCfg = NULL;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        if(sensor_features_requested != (sensor_features_requested & ISS_SENSOR_IMX390_FEATURES))
        {
            printf("IMX390_Config : Error. feature set 0x%x is not supported \n", sensor_features_requested);
            return -1;
        }
    
        imx390FeaturesEnabled= sensor_features_requested;
    
        i2cInstId = pCreatePrms->i2cInstId;
    	desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
        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 = max_cfgScript(i2cInstId, MAX9296_DES_ID >> 1, desCfg);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &regValue);
        printf("des link lock status: 0x%x\n",regValue);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x10, &regValue);
        printf("des regAddr:0x10 - 0x%x\n",regValue);
        if(0 != status)
        {
            printf("IMX390_Config Error : max9296 config failed for camera # %d \n", chId);
        }
        Deserializer_ReadReg(pCreatePrms->i2cAddrSer[chId], 0x00, &regValue);
        printf("max96717F[ID]::0x00 - 0x%x\n",regValue);
        status = max_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] >> 1, sensorCfg, sensor_cfg_script_len);
        }
        return (status);
    }
    
    static int32_t IMX390_StreamOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint8_t serI2cAddr;
        uint32_t regCnt;
        uint16_t regAddr;
        uint16_t regValue;
        uint8_t  value;
        uint16_t delayMilliSec;
    	I2cParams *sensorCfg = NULL;
        uint16_t sensor_cfg_script_len = 0;
        
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        if(ISS_SENSOR_FEATURE_CFG_UC1 == (imx390FeaturesEnabled& ISS_SENSOR_FEATURE_CFG_UC1))
        {
            if(pSenHandle->sensorIntfPrms->numCamerasStreaming >= 3U)
            {
                printf("IMX390_StreamOn Error : %d cameras streaming already \n", pSenHandle->sensorIntfPrms->numCamerasStreaming);
                printf("IMX390_StreamOn Error : 60fps mode can support upto 3 cameras because of UB960 b/w limitation \n");
                return -1;
            }
        }
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
        serI2cAddr    = pCreatePrms->i2cAddrSer[chId];
        sensorCfg = imx390SensorRegConfigWdr.sensorCfgPreScript;
        sensor_cfg_script_len = 10;
        if(NULL != sensorCfg)
        {
            regCnt = 0;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
            while(regCnt<sensor_cfg_script_len)
            {
                printf("write IMX390 success!:regAddr 0x%x -- regValue 0x%x status = %d\n \n", regAddr, regValue, status);
                status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, regAddr, &regValue, 1u);
                if(delayMilliSec > 0)
                {
                   appLogWaitMsecs(delayMilliSec);
                }
                if (0 == status)
                {
                    printf("Read IMX390 success!:regAddr 0x%x -- regValue 0x%x\n \n", regAddr, regValue);
                }
                regCnt++;
                regAddr  = sensorCfg[regCnt].nRegAddr;
                regValue = sensorCfg[regCnt].nRegValue;
                delayMilliSec = sensorCfg[regCnt].nDelay;
            }
            appLogWaitMsecs(100);
    
        }
        else
        {
            printf("IMX390_StreamOn: IMX390 config script is NULL \n");
        }
        status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x1, 1u);/*ACTIVE*/
        appLogWaitMsecs(10);
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_StreamOn flag:0x0100 - 0x%x\n", regValue);
        }
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x42);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x84);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1dc, &value);
        printf("des [video lock]regAddr:0x1dc - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1fc, &value);
        printf("des [video lock]regAddr:0x1fc - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x21c, &value);
        printf("des [video lock]regAddr:0x21c - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x23c, &value);
        printf("des [video lock]regAddr:0x23c - 0x%x\n",value);
        Deserializer_ReadReg(serI2cAddr, 0x112, &value);
        printf("max96717pclkdet:regAddr:0x112 - 0x%x\n",value);
        printf("IMX390_StreamOn End--------------------- \n");
        return (status);
    }
    
    static int32_t IMX390_StreamOff(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    
        status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x0, 1u);/*STANDBY*/
        appLogWaitMsecs(10);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x40);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x00);
        return status;
    }
    
    static int32_t IMX390_PowerOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        sp1hGainRegValueOld[chId] = 0;
        redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
    
        printf("IMX390_PowerOn : chId = 0x%x \n", chId);
    
        return status;
    }
    
    static int32_t IMX390_PowerOff(uint32_t chId, void *pSensorHdl)
    {
        return (0);
    }
    
    static int32_t IMX390_SetAeParams(void *pSensorHdl, uint32_t chId, IssSensor_ExposureParams *pExpPrms)
    {
        uint16_t regAddr;
        uint16_t cnt;
        uint8_t regValue;
        int32_t status = -1;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint32_t sp1h_again = 0U;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    
        /* Exp time is fixed to 11ms for LFM. Set Analog Gain Only */
    
        for (cnt = 0; cnt < ISS_IMX390_GAIN_TBL_SIZE; cnt ++)
        {
            if (pExpPrms->analogGain[ISS_SENSOR_EXPOSURE_LONG] <= gIMX390GainsTable[cnt][0])
            {
                sp1h_again = gIMX390GainsTable[cnt][1];
                break;
            }
        }
    
        if(sp1hGainRegValueOld[chId] == sp1h_again)
        {
            /*Reduce I2C transactions.
            Do not write to the sensor if register value does not change */
            return 0;
        }
        sp1hGainRegValueOld[chId] = sp1h_again;
    
        regAddr = 0x0008;
        regValue = 1;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR;
        regValue = sp1h_again & 0xFF;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR_HIGH;
        regValue = sp1h_again >> 8;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = 0x0008;
        regValue = 0;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        return (status);
    }
    
    static int32_t IMX390_GetDccParams(uint32_t chId, void *pSensorHdl, IssSensor_DccParams *pDccPrms)
    {
        int32_t status = 0;
        return (status);
    }
    
    static int32_t IMX390_GetExpParams(uint32_t chId, void *pSensorHdl, IssSensor_ExposureParams *pExpPrms)
    {
        int32_t status = 0;
    
        assert(NULL != pExpPrms);
        pExpPrms->expRatio = ISS_SENSOR_IMX390_DEFAULT_EXP_RATIO;
    
        return (status);
    }
    
    static void IMX390_InitAewbConfig(uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static void IMX390_GetIspConfig (uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static void IMX390_deinit (uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static int32_t IMX390_ReadWriteReg (uint32_t chId, void *pSensorHdl, uint32_t readWriteFlag, I2cParams *pReg)
    {
        int32_t status = 0;
    
        uint16_t regValue = 0;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
    
        assert(NULL != pReg);
    
        if (1u == readWriteFlag)
        {
            /*write*/
            regValue = pReg->nRegValue;
            status = IMX390_WriteReg(pCreatePrms->i2cInstId,
                pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, regValue, 1u);
        }
        else
        {
            /*read*/
            status = IMX390_ReadReg(pCreatePrms->i2cInstId,
                pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, &regValue, 1u);
    
            if (0 == status)
            {
                pReg->nRegValue = regValue;
            }
        }
        return (status);
    }
    
    static int32_t IMX390_ReadReg(uint8_t     i2cInstId,
                                uint8_t         i2cAddr,
                                uint16_t        regAddr,
                                uint16_t         *regVal,
                                uint32_t        numRegs)
    {
        int32_t  status = -1;
        I2C_Handle sensorI2cHandle = NULL;
        static uint8_t sensorI2cByteOrder = 0U;
        uint8_t   readReg8_High = 0xAB;
        uint8_t   readReg8_Low = 0xCD;
        uint32_t count;
        getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
        if(NULL == sensorI2cHandle)
        {
            printf("Sensor I2C Handle is NULL \n");
            return -1;
        }
        for(count = 0;count<numRegs;count++)
        {
            status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr, &readReg8_High, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
            if(status == 0 )
        {
                status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr+1, &readReg8_Low, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
            }
        }
        *regVal = ((readReg8_High << 8) & 0xFF00) | readReg8_Low;
        return (status);
    }
    
    static int32_t IMX390_WriteReg(uint8_t    i2cInstId,
                                 uint8_t       i2cAddr,
                                 uint16_t         regAddr,
                                 uint16_t          regVal,
                                 uint32_t      numRegs)
    {
        int32_t  status = 0;
        int16_t  ret = 0;
        I2C_Handle sensorI2cHandle = NULL;
        static uint8_t sensorI2cByteOrder = 255u;
        getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
        uint8_t   rawRegVal[4];
        I2C_Transaction transaction;
        #if defined (MCU_PLUS_SDK)
        I2C_Transaction_init(&transaction);
        #else
        I2C_transactionInit(&transaction);
        #endif
        if(NULL == sensorI2cHandle)
        {
            printf("Sensor I2C Handle is NULL \n");
            return -1;
        }
    
        transaction.slaveAddress = i2cAddr;
        transaction.writeBuf     = rawRegVal;
        transaction.writeCount   = 4;
        transaction.readBuf      = NULL;
        transaction.readCount    = 0;
        {
              rawRegVal[0U] = (uint8_t) ((regAddr >> 8U) & (uint8_t) 0xFF);
              rawRegVal[1U] = (uint8_t) ((regAddr >> 0U) & (uint8_t) 0xFF);
              rawRegVal[2U] = (uint8_t) ((regVal >> 8U) & (uint8_t) 0xFF);
              rawRegVal[3U] = (uint8_t) ((regVal >> 0U) & (uint8_t) 0xFF);
              ret = I2C_transfer(sensorI2cHandle, &transaction); 
              if(ret != I2C_STS_SUCCESS)
              {
                    printf("IMX390_WriteReg : Error writing to register 0x%x \n ", regAddr);
                    status = -1;
              }
        }
    
        return (status);
    }
    
    static int32_t IMX390_GetExpPrgFxn(uint32_t chId, void *pSensorHdl, IssAeDynamicParams *p_ae_dynPrms)
    {
        int32_t status = 0;
        uint8_t count = 0;
    
        p_ae_dynPrms->targetBrightnessRange.min = DEFAULT_TARGET_BRIGHTNESS_MIN;
        p_ae_dynPrms->targetBrightnessRange.max = DEFAULT_TARGET_BRIGHTNESS_MAX;
        p_ae_dynPrms->targetBrightness = DEFAULT_TARGET_BRIGHTNESS;
        p_ae_dynPrms->threshold = DEFAULT_TARGET_THRESHOLD;
        p_ae_dynPrms->exposureTimeStepSize = DEFAULT_EXPOSURE_TIME;
        p_ae_dynPrms->enableBlc = DEFAULT_ENABLE_BLC;
    
        p_ae_dynPrms->exposureTimeRange[count].min = 11000;
        p_ae_dynPrms->exposureTimeRange[count].max = 11000;
        p_ae_dynPrms->analogGainRange[count].min = 1024;
        p_ae_dynPrms->analogGainRange[count].max = 8192;
        p_ae_dynPrms->digitalGainRange[count].min = 256;
        p_ae_dynPrms->digitalGainRange[count].max = 256;
        count++;
    
        p_ae_dynPrms->numAeDynParams = count;
        return (status);
    }
    
    static int32_t IMX390_GetWBPrgFxn(uint32_t chId, void *pSensorHdl, IssAwbDynamicParams *p_awb_dynPrms)
    {
        int32_t  status = 0;
    
        p_awb_dynPrms->redGainRange.min = 512;
        p_awb_dynPrms->redGainRange.max = 2048;
    
        p_awb_dynPrms->greenGainRange.min = 512;
        p_awb_dynPrms->greenGainRange.max = 2048;
    
        p_awb_dynPrms->blueGainRange.min = 512;
        p_awb_dynPrms->blueGainRange.max = 2048;
    
        p_awb_dynPrms->sensor_pre_gain = 0;
    
        printf("IMX390_GetWBPrgFxn: sensor_pre_gain = %d \n", p_awb_dynPrms->sensor_pre_gain);
        return (status);
    }
    
    static int32_t IMX390_SetAwbParams(void *pSensorHdl, uint32_t chId, IssSensor_WhiteBalanceParams *pWbPrms)
    {
        int32_t status = 0;
        uint16_t regAddr;
        uint16_t regValue;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
        assert(NULL != pWbPrms);
    
        if(redGain_prev[chId] != pWbPrms->rGain[0])
        {
            redGain_prev[chId] = pWbPrms->rGain[0];
            regAddr = IMX390_RED_GAIN_REG_L;
            regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_RED_GAIN_REG_H;
            regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        if(greenGain_prev[chId] != pWbPrms->gGain[0])
        {
            greenGain_prev[chId] = pWbPrms->gGain[0];
            regAddr = IMX390_GREEN1_GAIN_REG_L;
            regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_GREEN2_GAIN_REG_L;
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
    
            regAddr = IMX390_GREEN1_GAIN_REG_H;
            regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_GREEN2_GAIN_REG_H;
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        if(blueGain_prev[chId] != pWbPrms->bGain[0])
        {
            blueGain_prev[chId] = pWbPrms->bGain[0];
            regAddr = IMX390_BLUE_GAIN_REG_L;
            regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff ;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_BLUE_GAIN_REG_H;
            regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        return (status);
    }
    
    2465.iss_sensors.c2465.[com COM13] (2025-04-15_131227) COM13 (USB Serial Port (COM13)).log

  • Hi ,

    Thank you for clarifying your question. I have looped in the appropriate engineer to give comment.

    Best Regards,

    Fabiana

  • Hi Fabiana

    May I ask if you are helping with the analysis?

    Thanks!

  • Hi zhiing peng,

    Can you please make sure to start the sensor and deserializer only in streamon callback function and not before that? If possible, can you please move entire sensor and deserializer configuration in streamon callback? 

    Regards,

    Brijesh

  • Hi Brijesh

    move entire sensor and deserializer configuration in streamon callback as you said,It couldn't be improved either. The error was the same as before

    TKS

    peng

    /*
     *
     * Copyright (c) 2020 Texas Instruments Incorporated
     *
     * All rights reserved not granted herein.
     *
     * Limited License.
     *
     * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
     * license under copyrights and patents it now or hereafter owns or controls to make,
     * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
     * terms herein.  With respect to the foregoing patent license, such license is granted
     * solely to the extent that any such patent is necessary to Utilize the software alone.
     * The patent license shall not apply to any combinations which include this software,
     * other than combinations with devices manufactured by or for TI ("TI Devices").
     * No hardware patent is licensed hereunder.
     *
     * Redistributions must preserve existing copyright notices and reproduce this license
     * (including the above copyright notice and the disclaimer and (if applicable) source
     * code license limitations below) in the documentation and/or other materials provided
     * with the distribution
     *
     * Redistribution and use in binary form, without modification, are permitted provided
     * that the following conditions are met:
     *
     * *       No reverse engineering, decompilation, or disassembly of this software is
     * permitted with respect to any software provided in binary form.
     *
     * *       any redistribution and use are licensed by TI for use only with TI Devices.
     *
     * *       Nothing shall obligate TI to provide you with source code for the software
     * licensed and provided to you in object code.
     *
     * If software source code is provided to you, modification and redistribution of the
     * source code are permitted provided that the following conditions are met:
     *
     * *       any redistribution and use of the source code, including any resulting derivative
     * works, are licensed by TI for use only with TI Devices.
     *
     * *       any redistribution and use of any object code compiled from the source code
     * and any resulting derivative works, are licensed by TI for use only with TI Devices.
     *
     * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
     *
     * may be used to endorse or promote products derived from this software without
     * specific prior written permission.
     *
     * DISCLAIMER.
     *
     * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     * IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     * OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     */
    #include "iss_sensor_imx390.h"
    #include "imx390_serdes_config.h"
    
    static IssSensor_CreateParams  imx390CreatePrms = {
        SENSOR_SONY_IMX390_UB953_D3,     /*sensor name*/
        0x5,                             /*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*/
        {
            {
                IMX390_OUT_WIDTH,               /*width*/
                IMX390_OUT_HEIGHT-IMX390_META_HEIGHT_AFTER,            /*height*/
                1,                              /*num_exposures*/
                vx_false_e,                     /*line_interleaved*/
                {
                    {TIVX_RAW_IMAGE_16_BIT, 11},    /*dataFormat and MSB [0]*/
                },
                0,                              /*meta_height_before*/
                IMX390_META_HEIGHT_AFTER,      /*meta_height_after*/
            },
            ISS_SENSOR_IMX390_FEATURES,     /*features*/
            ALGORITHMS_ISS_AEWB_MODE_AEWB,  /*aewbMode*/
            30,                             /*fps*/
            4,                              /*numDataLanes*/
            {1, 2, 3, 4},                   /*dataLanesMap*/
            {0, 0, 0, 0},                   /*dataLanesPolarity*/
            CSIRX_LANE_BAND_SPEED_320_TO_360_MBPS, /*csi_laneBandSpeed*/
        },
        12,                                  /*numChan*/
        390,                                /*dccId*/
    };
    
    static IssSensorFxns           im390SensorFxns = {
        IMX390_Probe,
        IMX390_Config,
        IMX390_StreamOn,
        IMX390_StreamOff,
        IMX390_PowerOn,
        IMX390_PowerOff,
        IMX390_GetExpParams,
        IMX390_SetAeParams,
        IMX390_GetDccParams,
        IMX390_InitAewbConfig,
        IMX390_GetIspConfig,
        IMX390_ReadWriteReg,
        IMX390_GetExpPrgFxn,
        IMX390_deinit,
        IMX390_GetWBPrgFxn,
        IMX390_SetAwbParams
    };
    
    static IssSensorIntfParams     imx390SensorIntfPrms = {
        0,             /*sensorBroadcast*/
        0,             /*enableFsin*/
        0,			   /*numCamerasStreaming*/
    };
    
    IssSensorConfig     imx390SensorRegConfigLinear = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390LinearConfig,        /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensorConfig     imx390SensorRegConfigWdr = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390WdrConfig,        /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensorConfig     imx390SensorRegConfigWdr60fps = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390WdrConfig,     /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensors_Handle imx390SensorHandle = {
        1,                                 /*isUsed*/
        &imx390CreatePrms,                /*CreatePrms*/
        &im390SensorFxns,                /*SensorFxns*/
        &imx390SensorIntfPrms,            /*SensorIntfPrms*/
    };
    
    /*
     * \brief DCC Parameters of IMX390
     */
    //IssCapture_CmplxIoLaneCfg           imx390Csi2CmplxIoLaneCfg;
    extern IssSensors_Handle * gIssSensorTable[ISS_SENSORS_MAX_SUPPORTED_SENSOR];
    static uint16_t sp1hGainRegValueOld[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t redGain_prev[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t greenGain_prev[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t blueGain_prev[ISS_SENSORS_MAX_CHANNEL];
    
    int32_t IssSensor_IMX390_Init()
    {
        int32_t status;
        int32_t chId;
        status = IssSensor_Register(&imx390SensorHandle);
        if(0 != status)
        {
            printf("IssSensor_IMX390_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;
    }
    
    /*******************************************************************************
     *  Local Functions Definition
     *******************************************************************************
     */
    
    static int32_t IMX390_Probe(uint32_t chId, void *pSensorHdl)
    {
        printf("IMX390_Probe++++++++");
        int32_t status = -1;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint16_t chipIdRegAddr = IMX390_CHIP_ID_REG_ADDR;
        uint16_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];
    
        #if 0
        serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
        /*The code assumes that I2C instance is the same for sensor and serializer*/
        if(NULL != serCfg)
        {
            status = max_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;
                    printf("IMX390_Probe SUCCESS : Read expected value 0x%x at chip ID register 0x%x \n", IMX390_CHIP_ID_REG_VAL, chipIdRegAddr);
                }
                else
                {
                    status = -1;
                    printf("IMX390_Probe : 0x%x read at chip ID register 0x%x. Expected 0x%x \n", chipIdRegValueRead, chipIdRegAddr, IMX390_CHIP_ID_REG_VAL);
                    printf("IMX390 Probe Failed.. Retrying \n");
                    appLogWaitMsecs(100);
                }
            }
            else
            {
                printf("IMX390 Probe : Failed to read CHIP_ID register 0x%x \n", chipIdRegAddr);
            }
            count++;
        }
        #endif 
        printf("IMX390_Probe----------");
        return (0);
    }
    
    static int32_t IMX390_Sensor_RegConfig(uint32_t i2cInstId, uint8_t sensorI2cAddr, I2cParams *sensorCfg, uint16_t sensor_cfg_script_len)
    {
        int32_t status = 0;
        uint16_t regAddr;
        uint16_t regValue;
        uint16_t delayMilliSec;
        uint32_t regCnt;
    
        if(NULL != sensorCfg)
        {
            regCnt = 0;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
    
            printf(" Configuring IMX390 imager 0x%x.. Please wait till it finishes \n", sensorI2cAddr);
            while(regCnt<sensor_cfg_script_len)
            {
                status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    
                if (0 != status)
                {
                    printf(" \n \n IMX390: Sensor Reg Write Failed for regAddr 0x%x \n \n", regAddr);
                }
    
                if(delayMilliSec > 0)
                {
                   appLogWaitMsecs(delayMilliSec);
                }
    
                regCnt++;
                regAddr  = sensorCfg[regCnt].nRegAddr;
                regValue = sensorCfg[regCnt].nRegValue;
                delayMilliSec = sensorCfg[regCnt].nDelay;
            }
            /*Wait 100ms after the init is done*/
            appLogWaitMsecs(100);
            //printf(" IMX390 config done \n ");
        }
        else
        {
            printf(" IMX390 config script is NULL \n");
        }
        return status;
    }
    
    static uint32_t imx390FeaturesEnabled;
    static int32_t IMX390_Config(uint32_t chId, void *pSensorHdl, uint32_t sensor_features_requested)
    {
        int32_t status = 0;
        #if 0
        uint32_t i2cInstId;
        uint16_t sensor_cfg_script_len = 0;
        uint8_t regValue = 0;
        I2cParams *sensorCfg = NULL;
        I2cParams *serCfg = NULL;
        I2cParams *desCfg = NULL;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        if(sensor_features_requested != (sensor_features_requested & ISS_SENSOR_IMX390_FEATURES))
        {
            printf("IMX390_Config : Error. feature set 0x%x is not supported \n", sensor_features_requested);
            return -1;
        }
    
        imx390FeaturesEnabled= sensor_features_requested;
    
        i2cInstId = pCreatePrms->i2cInstId;
    	desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
        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 = max_cfgScript(i2cInstId, MAX9296_DES_ID >> 1, desCfg);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &regValue);
        printf("des link lock status: 0x%x\n",regValue);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x10, &regValue);
        printf("des regAddr:0x10 - 0x%x\n",regValue);
        if(0 != status)
        {
            printf("IMX390_Config Error : max9296 config failed for camera # %d \n", chId);
        }
        Deserializer_ReadReg(pCreatePrms->i2cAddrSer[chId], 0x00, &regValue);
        printf("max96717F[ID]::0x00 - 0x%x\n",regValue);
        status = max_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] >> 1, sensorCfg, sensor_cfg_script_len);
        }
        #endif
        return (status);
    }
    
    static int32_t IMX390_StreamOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        I2cParams *sensorCfg = NULL;
        I2cParams *serCfg = NULL;
        I2cParams *desCfg = NULL;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint8_t serI2cAddr;
        uint32_t regCnt;
        uint16_t regAddr;
        uint16_t regValue;
        uint8_t  value;
        uint16_t delayMilliSec;
        uint16_t sensor_cfg_script_len = 0;
        
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        if(ISS_SENSOR_FEATURE_CFG_UC1 == (imx390FeaturesEnabled& ISS_SENSOR_FEATURE_CFG_UC1))
        {
            if(pSenHandle->sensorIntfPrms->numCamerasStreaming >= 3U)
            {
                printf("IMX390_StreamOn Error : %d cameras streaming already \n", pSenHandle->sensorIntfPrms->numCamerasStreaming);
                printf("IMX390_StreamOn Error : 60fps mode can support upto 3 cameras because of UB960 b/w limitation \n");
                return -1;
            }
        }
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
        serI2cAddr    = pCreatePrms->i2cAddrSer[chId];
        sensorCfg = imx390SensorRegConfigWdr.sensorCfgPreScript;
        desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
        serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
        sensor_cfg_script_len = IMX390_WDR_CONFIG_SIZE;
    
        /*Deserializer config is done in IssSensor_PowerOn, Need to set sensor alias*/
        status = max_cfgScript(i2cInstId, MAX9296_DES_ID >> 1, desCfg);
        appLogWaitMsecs(100);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &value);
        printf("des link lock status: 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x10, &value);
        printf("des regAddr:0x10 - 0x%x\n",value);
        if(0 != status)
        {
            printf("IMX390_Config Error : max9296 config failed for camera # %d \n", chId);
        }
        Deserializer_ReadReg(pCreatePrms->i2cAddrSer[chId], 0x00, &value);
        printf("max96717F[ID]::0x00 - 0x%x\n",value);
    
        appLogWaitMsecs(500);
        status = max_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] >> 1, sensorCfg, sensor_cfg_script_len);
        }
        sensor_cfg_script_len = 10;
        if(NULL != sensorCfg)
        {
            regCnt = 0;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
            while(regCnt<sensor_cfg_script_len)
            {
                printf("write IMX390 success!:regAddr 0x%x -- regValue 0x%x status = %d\n \n", regAddr, regValue, status);
                status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, regAddr, &regValue, 1u);
                if(delayMilliSec > 0)
                {
                   appLogWaitMsecs(delayMilliSec);
                }
                if (0 == status)
                {
                    printf("Read IMX390 success!:regAddr 0x%x -- regValue 0x%x\n \n", regAddr, regValue);
                }
                regCnt++;
                regAddr  = sensorCfg[regCnt].nRegAddr;
                regValue = sensorCfg[regCnt].nRegValue;
                delayMilliSec = sensorCfg[regCnt].nDelay;
            }
            appLogWaitMsecs(100);
    
        }
        else
        {
            printf("IMX390_StreamOn: IMX390 config script is NULL \n");
        }
        status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x1, 1u);/*ACTIVE*/
        appLogWaitMsecs(10);
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_StreamOn flag:0x0100 - 0x%x\n", regValue);
        }
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x42);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x84);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1dc, &value);
        printf("des [video lock]regAddr:0x1dc - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1fc, &value);
        printf("des [video lock]regAddr:0x1fc - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x21c, &value);
        printf("des [video lock]regAddr:0x21c - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x23c, &value);
        printf("des [video lock]regAddr:0x23c - 0x%x\n",value);
        Deserializer_ReadReg(serI2cAddr, 0x112, &value);
        printf("max96717pclkdet:regAddr:0x112 - 0x%x\n",value);
        printf("IMX390_StreamOn End--------------------- \n");
        return (status);
    }
    
    static int32_t IMX390_StreamOff(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    
        status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x0, 1u);/*STANDBY*/
        appLogWaitMsecs(10);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x40);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x00);
        return status;
    }
    
    static int32_t IMX390_PowerOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        sp1hGainRegValueOld[chId] = 0;
        redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
    
        printf("IMX390_PowerOn : chId = 0x%x \n", chId);
    
        return status;
    }
    
    static int32_t IMX390_PowerOff(uint32_t chId, void *pSensorHdl)
    {
        return (0);
    }
    
    static int32_t IMX390_SetAeParams(void *pSensorHdl, uint32_t chId, IssSensor_ExposureParams *pExpPrms)
    {
        uint16_t regAddr;
        uint16_t cnt;
        uint8_t regValue;
        int32_t status = -1;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint32_t sp1h_again = 0U;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    
        /* Exp time is fixed to 11ms for LFM. Set Analog Gain Only */
    
        for (cnt = 0; cnt < ISS_IMX390_GAIN_TBL_SIZE; cnt ++)
        {
            if (pExpPrms->analogGain[ISS_SENSOR_EXPOSURE_LONG] <= gIMX390GainsTable[cnt][0])
            {
                sp1h_again = gIMX390GainsTable[cnt][1];
                break;
            }
        }
    
        if(sp1hGainRegValueOld[chId] == sp1h_again)
        {
            /*Reduce I2C transactions.
            Do not write to the sensor if register value does not change */
            return 0;
        }
        sp1hGainRegValueOld[chId] = sp1h_again;
    
        regAddr = 0x0008;
        regValue = 1;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR;
        regValue = sp1h_again & 0xFF;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR_HIGH;
        regValue = sp1h_again >> 8;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = 0x0008;
        regValue = 0;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        return (status);
    }
    
    static int32_t IMX390_GetDccParams(uint32_t chId, void *pSensorHdl, IssSensor_DccParams *pDccPrms)
    {
        int32_t status = 0;
        return (status);
    }
    
    static int32_t IMX390_GetExpParams(uint32_t chId, void *pSensorHdl, IssSensor_ExposureParams *pExpPrms)
    {
        int32_t status = 0;
    
        assert(NULL != pExpPrms);
        pExpPrms->expRatio = ISS_SENSOR_IMX390_DEFAULT_EXP_RATIO;
    
        return (status);
    }
    
    static void IMX390_InitAewbConfig(uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static void IMX390_GetIspConfig (uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static void IMX390_deinit (uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static int32_t IMX390_ReadWriteReg (uint32_t chId, void *pSensorHdl, uint32_t readWriteFlag, I2cParams *pReg)
    {
        int32_t status = 0;
    
        uint16_t regValue = 0;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
    
        assert(NULL != pReg);
    
        if (1u == readWriteFlag)
        {
            /*write*/
            regValue = pReg->nRegValue;
            status = IMX390_WriteReg(pCreatePrms->i2cInstId,
                pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, regValue, 1u);
        }
        else
        {
            /*read*/
            status = IMX390_ReadReg(pCreatePrms->i2cInstId,
                pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, &regValue, 1u);
    
            if (0 == status)
            {
                pReg->nRegValue = regValue;
            }
        }
        return (status);
    }
    
    static int32_t IMX390_ReadReg(uint8_t     i2cInstId,
                                uint8_t         i2cAddr,
                                uint16_t        regAddr,
                                uint16_t         *regVal,
                                uint32_t        numRegs)
    {
        int32_t  status = -1;
        I2C_Handle sensorI2cHandle = NULL;
        static uint8_t sensorI2cByteOrder = 0U;
        uint8_t   readReg8_High = 0xAB;
        uint8_t   readReg8_Low = 0xCD;
        uint32_t count;
        getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
        if(NULL == sensorI2cHandle)
        {
            printf("Sensor I2C Handle is NULL \n");
            return -1;
        }
        for(count = 0;count<numRegs;count++)
        {
            status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr, &readReg8_High, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
            if(status == 0 )
        {
                status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr+1, &readReg8_Low, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
            }
        }
        *regVal = ((readReg8_High << 8) & 0xFF00) | readReg8_Low;
        return (status);
    }
    
    static int32_t IMX390_WriteReg(uint8_t    i2cInstId,
                                 uint8_t       i2cAddr,
                                 uint16_t         regAddr,
                                 uint16_t          regVal,
                                 uint32_t      numRegs)
    {
        int32_t  status = 0;
        int16_t  ret = 0;
        I2C_Handle sensorI2cHandle = NULL;
        static uint8_t sensorI2cByteOrder = 255u;
        getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
        uint8_t   rawRegVal[4];
        I2C_Transaction transaction;
        #if defined (MCU_PLUS_SDK)
        I2C_Transaction_init(&transaction);
        #else
        I2C_transactionInit(&transaction);
        #endif
        if(NULL == sensorI2cHandle)
        {
            printf("Sensor I2C Handle is NULL \n");
            return -1;
        }
    
        transaction.slaveAddress = i2cAddr;
        transaction.writeBuf     = rawRegVal;
        transaction.writeCount   = 4;
        transaction.readBuf      = NULL;
        transaction.readCount    = 0;
        {
              rawRegVal[0U] = (uint8_t) ((regAddr >> 8U) & (uint8_t) 0xFF);
              rawRegVal[1U] = (uint8_t) ((regAddr >> 0U) & (uint8_t) 0xFF);
              rawRegVal[2U] = (uint8_t) ((regVal >> 8U) & (uint8_t) 0xFF);
              rawRegVal[3U] = (uint8_t) ((regVal >> 0U) & (uint8_t) 0xFF);
              ret = I2C_transfer(sensorI2cHandle, &transaction); 
              if(ret != I2C_STS_SUCCESS)
              {
                    printf("IMX390_WriteReg : Error writing to register 0x%x \n ", regAddr);
                    status = -1;
              }
        }
    
        return (status);
    }
    
    static int32_t IMX390_GetExpPrgFxn(uint32_t chId, void *pSensorHdl, IssAeDynamicParams *p_ae_dynPrms)
    {
        int32_t status = 0;
        uint8_t count = 0;
    
        p_ae_dynPrms->targetBrightnessRange.min = DEFAULT_TARGET_BRIGHTNESS_MIN;
        p_ae_dynPrms->targetBrightnessRange.max = DEFAULT_TARGET_BRIGHTNESS_MAX;
        p_ae_dynPrms->targetBrightness = DEFAULT_TARGET_BRIGHTNESS;
        p_ae_dynPrms->threshold = DEFAULT_TARGET_THRESHOLD;
        p_ae_dynPrms->exposureTimeStepSize = DEFAULT_EXPOSURE_TIME;
        p_ae_dynPrms->enableBlc = DEFAULT_ENABLE_BLC;
    
        p_ae_dynPrms->exposureTimeRange[count].min = 11000;
        p_ae_dynPrms->exposureTimeRange[count].max = 11000;
        p_ae_dynPrms->analogGainRange[count].min = 1024;
        p_ae_dynPrms->analogGainRange[count].max = 8192;
        p_ae_dynPrms->digitalGainRange[count].min = 256;
        p_ae_dynPrms->digitalGainRange[count].max = 256;
        count++;
    
        p_ae_dynPrms->numAeDynParams = count;
        return (status);
    }
    
    static int32_t IMX390_GetWBPrgFxn(uint32_t chId, void *pSensorHdl, IssAwbDynamicParams *p_awb_dynPrms)
    {
        int32_t  status = 0;
    
        p_awb_dynPrms->redGainRange.min = 512;
        p_awb_dynPrms->redGainRange.max = 2048;
    
        p_awb_dynPrms->greenGainRange.min = 512;
        p_awb_dynPrms->greenGainRange.max = 2048;
    
        p_awb_dynPrms->blueGainRange.min = 512;
        p_awb_dynPrms->blueGainRange.max = 2048;
    
        p_awb_dynPrms->sensor_pre_gain = 0;
    
        printf("IMX390_GetWBPrgFxn: sensor_pre_gain = %d \n", p_awb_dynPrms->sensor_pre_gain);
        return (status);
    }
    
    static int32_t IMX390_SetAwbParams(void *pSensorHdl, uint32_t chId, IssSensor_WhiteBalanceParams *pWbPrms)
    {
        int32_t status = 0;
        uint16_t regAddr;
        uint16_t regValue;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
        assert(NULL != pWbPrms);
    
        if(redGain_prev[chId] != pWbPrms->rGain[0])
        {
            redGain_prev[chId] = pWbPrms->rGain[0];
            regAddr = IMX390_RED_GAIN_REG_L;
            regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_RED_GAIN_REG_H;
            regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        if(greenGain_prev[chId] != pWbPrms->gGain[0])
        {
            greenGain_prev[chId] = pWbPrms->gGain[0];
            regAddr = IMX390_GREEN1_GAIN_REG_L;
            regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_GREEN2_GAIN_REG_L;
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
    
            regAddr = IMX390_GREEN1_GAIN_REG_H;
            regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_GREEN2_GAIN_REG_H;
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        if(blueGain_prev[chId] != pWbPrms->bGain[0])
        {
            blueGain_prev[chId] = pWbPrms->bGain[0];
            regAddr = IMX390_BLUE_GAIN_REG_L;
            regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff ;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_BLUE_GAIN_REG_H;
            regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        return (status);
    }
    

    5460.iss_sensors.c

  • There are a lots of errors coming from the sensor. Please check why sensor output is outputting erroneous stream, stream with ECC and CRC errors... CSIRX is just reporting these errors. 

    [MCU2_0] 67.604816 s: crcCount: 3008
    [MCU2_0] 67.604832 s: eccCount: 10860
    [MCU2_0] 67.604851 s: correctedEccCount: 6552
    [MCU2_0] 67.604869 s: dataIdErrorCount: 1069
    [MCU2_0] 67.604887 s: invalidAccessCount: 0
    [MCU2_0] 67.604904 s: invalidSpCount: 7
    [MCU2_0] 67.604923 s: strmFIFOOvflCount[0]: 54
    [MCU2_0] 67.604943 s: strmFIFOOvflCount[1]: 214

  • Hi Brijesh

    We have lit up this module on another platform, and the Settings are exactly the same. The image data information read through the

    serializer(max96717) is all normal. Do we still need to set it when the soc receives it? The sensor resolution is 1920*1536, raw12, and the mipi rate is within the default range of 1350-1500Gbps per lane in the driver
    We also measured the correct mipi waveform in Deserializer (max9296). Could it be that the soc did not parse mipi correctly? I hope to investigate again in this direction
    Tks
    peng
  • Hi Brijesh

    Let me report the latest progress. I increased the mipi rate. It can be lit now, but it crashed after one minute. There is no mipi data and the iic reports an error. After analyzing it, the main reason is that the configuration of the deserializer has been modified by the soc end, not the initialization configuration, which leads to the module not being able to link. Please take a look at which operations will modify the configuration of the unstring separator when running singlecam

    max9296 initialization configuration

        {0x0313, 0x00, 0x10},
        {0x0001, 0x01, 0x10},
        {0x0052, 0x01, 0x10},
        {0x0051, 0x02, 0x10},
        {0x044A, 0xC0, 0x10},      
        {0x0320, 0x2C, 0x10},
        //{0x0313, 0x02, 0x10},
        {0x03E2, 0x20, 0x10},
        {0x03E7, 0x0C, 0x10},
        {0x03E6, 0xB7, 0x10},
        {0x03E5, 0x35, 0x10},
        {0x03EF, 0x40, 0x10},
        {0x03E0, 0x34, 0x10},
        {0x03F1, 0x40, 0x10},
    the configuration of the deserializer has been modified by the soc

    read success![slaveAddr:0x48] regAddr:0x313, RegValue: 0x2
    read success![slaveAddr:0x48] regAddr:0x1, RegValue: 0x2
    read success![slaveAddr:0x48] regAddr:0x52, RegValue: 0x2
    read success![slaveAddr:0x48] regAddr:0x51, RegValue: 0x1

    read success![slaveAddr:0x48] regAddr:0x44a, RegValue: 0xd0
    read success![slaveAddr:0x48] regAddr:0x320, RegValue: 0x2f
    read success![slaveAddr:0x48] regAddr:0x3e2, RegValue: 0x81
    read success![slaveAddr:0x48] regAddr:0x3e7, RegValue: 0x0
    read success![slaveAddr:0x48] regAddr:0x3e6, RegValue: 0x0
    read success![slaveAddr:0x48] regAddr:0x3e5, RegValue: 0x0
    read success![slaveAddr:0x48] regAddr:0x3ef, RegValue: 0x9f
    read success![slaveAddr:0x48] regAddr:0x3e0, RegValue: 0xe
    read success![slaveAddr:0x48] regAddr:0x3f1, RegValue: 0xf0
    read success![slaveAddr:0x48] regAddr:0xffff, RegValue: 0x0

    =~=~=~=~=~=~=~=~=~=~=~= MobaXterm log 2025.04.22 16:28:52 =~=~=~=~=~=~=~=~=~=~=~=
    
    
     _____                    _____           _         _   
    |  _  |___ ___ ___ ___   |  _  |___ ___  |_|___ ___| |_ 
    |     |  _| .'| . | . |  |   __|  _| . | | | -_|  _|  _|
    |__|__|_| |__,|_  |___|  |__|  |_| |___|_| |___|___|_|  
                  |___|                    |___|            
    
    Arago Project j722s-evm -
    
    Arago 2023.10 j722s-evm -
    
    j722s-evm login: 
    
    j722s-evm login: 
    
    j722s-evm login: 
    
    j722s-evm login: root
    
    [   15.224246] audit: type=1006 audit(1651179910.891:10): pid=1101 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=3 res=1
    [   15.236808] audit: type=1300 audit(1651179910.891:10): arch=c00000b7 syscall=64 success=yes exit=1 a0=8 a1=ffffd38cdce8 a2=1 a3=ffffa8cbe020 items=0 ppid=1 pid=1101 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=3 comm="(systemd)" exe="/lib/systemd/systemd" key=(null)
    [   15.263290] audit: type=1327 audit(1651179910.891:10): proctitle="(systemd)"
    [   15.270391] audit: type=1334 audit(1651179910.903:11): prog-id=11 op=LOAD
    [   15.277263] audit: type=1300 audit(1651179910.903:11): arch=c00000b7 syscall=280 success=yes exit=8 a0=5 a1=ffffd6f139e0 a2=78 a3=0 items=0 ppid=1 pid=1101 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=3 comm="systemd" exe="/lib/systemd/systemd" key=(null)
    [   15.302755] audit: type=1327 audit(1651179910.903:11): proctitle="(systemd)"
    [   15.309882] audit: type=1334 audit(1651179910.927:12): prog-id=11 op=UNLOAD
    [   15.316895] audit: type=1334 audit(1651179910.927:13): prog-id=12 op=LOAD
    [   15.323731] audit: type=1300 audit(1651179910.927:13): arch=c00000b7 syscall=280 success=yes exit=8 a0=5 a1=ffffd6f13a80 a2=78 a3=0 items=0 ppid=1 pid=1101 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=3 comm="systemd" exe="/lib/systemd/systemd" key=(null)
    [   15.349222] audit: type=1327 audit(1651179910.927:13): proctitle="(systemd)"
    root@j722s-evm:~# 9;232Rd /      cd /opt/vision_apps/
    -sh: 9: command not found
    -sh: 2cd: command not found
    root@j722s-evm:~# cd /opt/vision_apps/
    root@j722s-evm:/opt/vision_apps# ./vision_apps_init.sh 
    root@j722s-evm:/opt/vision_apps# [MCU2_0]      5.833718 s: CIO: Init ... Done !!!
    
    [MCU2_0]      5.833757 s: CPU is running FreeRTOS
    
    [MCU2_0]      5.833771 s: APP: Init ... !!!
    
    [MCU2_0]      5.833781 s: SCICLIENT: Init ... !!!
    
    [MCU2_0]      5.833845 s: SCICLIENT: DMSC FW version [9.0.6--w2023.01-j722s (Kool Koa]
    
    [MCU2_0]      5.833861 s: SCICLIENT: DMSC FW revision 0x9  
    
    [MCU2_0]      5.833874 s: SCICLIENT: DMSC FW ABI revision 3.1
    
    [MCU2_0]      5.833887 s: SCICLIENT: Init ... Done !!!
    
    [MCU2_0]      5.833899 s: MEM: Init ... !!!
    
    [MCU2_0]      5.833911 s: MEM: Created heap (DDR_LOCAL_MEM, id=0, flags=0x00000004) @ b5800000 of size 33554432 bytes !!!
    
    [MCU2_0]      5.833938 s: MEM: Init ... Done !!!
    
    [MCU2_0]      5.833949 s: IPC: Init ... !!!
    
    [MCU2_0]      5.833962 s: IPC: 4 CPUs participating in IPC !!!
    
    [MCU2_0]      5.834167 s: IPC: Waiting for HLOS to be ready ... !!!
    
    [MCU2_0]     14.236694 s: IPC: HLOS is ready !!!
    
    [MCU2_0]     14.236755 s: IPC: Init ... Done !!!
    
    [MCU2_0]     14.236769 s: APP: Syncing with 3 CPUs ... !!!
    
    [MCU2_0]     14.236786 s: APP: Syncing with 3 CPUs ... Done !!!
    
    [MCU2_0]     14.236800 s: REMOTE_SERVICE: Init ... !!!
    
    [MCU2_0]     14.237728 s: REMOTE_SERVICE: Init ... Done !!!
    
    [MCU2_0]     14.237793 s: FVID2: Init ... !!!
    
    [MCU2_0]     14.237861 s: FVID2: Init ... Done !!!
    
    [MCU2_0]     14.238382 s: DispApp_init() - DONE !!!
    
    [MCU2_0]     14.249040 s: Display create complete!!
    
    [MCU2_0]     14.249065 s: VHWA: VPAC Init ... !!!
    
    [MCU2_0]     14.249078 s: SCICLIENT: Sciclient_pmSetModuleState module=219 state=2
    
    [MCU2_0]     14.249157 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.249171 s: VHWA: LDC Init ... !!!
    
    [MCU2_0]     14.249269 s: VHWA: LDC Init ... Done !!!
    
    [MCU2_0]     14.249287 s: VHWA: MSC Init ... !!!
    
    [MCU2_0]     14.249612 s: VHWA: MSC Init ... Done !!!
    
    [MCU2_0]     14.249632 s: VHWA: VISS Init ... !!!
    
    [MCU2_0]     14.249733 s: VHWA: VISS Init ... Done !!!
    
    [MCU2_0]     14.249749 s: VHWA: VPAC Init ... Done !!!
    
    [MCU2_0]     14.249762 s: VHWA: DMPAC: Init ... !!!
    
    [MCU2_0]     14.249773 s: SCICLIENT: Sciclient_pmSetModuleState module=277 state=2
    
    [MCU2_0]     14.249847 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.249861 s: VHWA: DOF Init ... !!!
    
    [MCU2_0]     14.249964 s: VHWA: DOF Init ... Done !!!
    
    [MCU2_0]     14.249979 s: VHWA: SDE Init ... !!!
    
    [MCU2_0]     14.250055 s: VHWA: SDE Init ... Done !!!
    
    [MCU2_0]     14.250072 s: VHWA: DMPAC: Init ... Done !!!
    
    [MCU2_0]     14.250094 s:  VX_ZONE_INIT:Enabled
    
    [MCU2_0]     14.250108 s:  VX_ZONE_ERROR:Enabled
    
    [MCU2_0]     14.250120 s:  VX_ZONE_WARNING:Enabled
    
    [MCU2_0]     14.250642 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MCU2-0 
    
    [MCU2_0]     14.250716 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target VPAC_LDC1 
    
    [MCU2_0]     14.250780 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target VPAC_MSC1 
    
    [MCU2_0]     14.250836 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target VPAC_MSC2 
    
    [MCU2_0]     14.250926 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target VPAC_VISS1 
    
    [MCU2_0]     14.251005 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target CAPTURE1 
    
    [MCU2_0]     14.251074 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target CAPTURE2 
    
    [MCU2_0]     14.251145 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target CAPTURE3 
    
    [MCU2_0]     14.251211 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target CAPTURE4 
    
    [MCU2_0]     14.251279 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DISPLAY1 
    
    [MCU2_0]     14.251343 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DISPLAY2 
    
    [MCU2_0]     14.251399 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target CSITX 
    
    [MCU2_0]     14.251472 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target CSITX2 
    
    [MCU2_0]     14.251528 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DMPAC_SDE 
    
    [MCU2_0]     14.251592 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DMPAC_DOF 
    
    [MCU2_0]     14.251615 s:  VX_ZONE_INIT:[tivxInitLocal:136] Initialization Done !!!
    
    [MCU2_0]     14.251629 s: APP: OpenVX Target kernel init ... !!!
    
    [MCU2_0]     14.255664 s: APP: OpenVX Target kernel init ... Done !!!
    
    [MCU2_0]     14.255689 s: UDMA: Init for CSITX/CSIRX ... !!!
    
    [MCU2_0]     14.255853 s: UDMA: Init for CSITX/CSIRX ... Done !!!
    
    [MCU2_0]     14.255875 s: CSI2RX: Init ... !!!
    
    [MCU2_0]     14.255887 s: SCICLIENT: Sciclient_pmSetModuleState module=182 state=2
    
    [MCU2_0]     14.255925 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.255940 s: SCICLIENT: Sciclient_pmSetModuleState module=247 state=2
    
    [MCU2_0]     14.255992 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.256005 s: SCICLIENT: Sciclient_pmSetModuleState module=185 state=2
    
    [MCU2_0]     14.256046 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.256059 s: SCICLIENT: Sciclient_pmSetModuleState module=251 state=2
    
    [MCU2_0]     14.256100 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.256285 s: CSI2RX: Init ... Done !!!
    
    [MCU2_0]     14.256301 s: CSI2TX: Init ... !!!
    
    [MCU2_0]     14.256312 s: SCICLIENT: Sciclient_pmSetModuleState module=250 state=2
    
    [MCU2_0]     14.256367 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.256381 s: SCICLIENT: Sciclient_pmSetModuleState module=238 state=2
    
    [MCU2_0]     14.256427 s: SCICLIENT: Sciclient_pmSetModuleState success
    
    [MCU2_0]     14.256440 s: SCICLIENT: Sciclient_pmSetModuleClkFreq module=250 clk=3 freq=16000000
    
    [MCU2_0]     14.256503 s: SCICLIENT: Sciclient_pmSetModuleClkFreq success
    
    [MCU2_0]     14.256517 s: SCICLIENT: Sciclient_pmSetModuleClkFreq module=250 clk=4 freq=500000000
    
    [MCU2_0]     14.256571 s: SCICLIENT: Sciclient_pmSetModuleClkFreq success
    
    [MCU2_0]     14.256601 s: CSI2TX: Init ... Done !!!
    
    [MCU2_0]     14.256614 s: ISS: Init ... !!!
    
    [MCU2_0]     14.256630 s: Found sensor IMX390-UB953_D3 at location 0 
    
    [MCU2_0]     14.256647 s: Found sensor AR0233-UB953_MARS at location 1 
    
    [MCU2_0]     14.256662 s: Found sensor AR0820-UB953_LI at location 2 
    
    [MCU2_0]     14.256676 s: Found sensor UB9xxx_RAW12_TESTPATTERN at location 3 
    
    [MCU2_0]     14.256694 s: Found sensor UB96x_UYVY_TESTPATTERN at location 4 
    
    [MCU2_0]     14.256710 s: Found sensor GW_AR0233_UYVY at location 5 
    
    [MCU2_0]     14.256723 s: IssSensor_Init ... Done !!!
    
    [MCU2_0]     14.256770 s: IttRemoteServer_Init ... Done !!!
    
    [MCU2_0]     14.256783 s: ISS: Init ... Done !!!
    
    [MCU2_0]     14.256796 s: VISS REMOTE SERVICE: Init ... !!!
    
    [MCU2_0]     14.256833 s: VISS REMOTE SERVICE: Init ... Done !!!
    
    [MCU2_0]     14.256849 s: APP: Init ... Done !!!
    
    [MCU2_0]     14.256861 s: APP: Run ... !!!
    
    [MCU2_0]     14.256872 s: IPC: Starting echo test ...
    
    [MCU2_0]     14.256937 s: APP: Run ... Done !!!
    
    [MCU2_0]     14.257828 s: IPC: Echo status: a530-0[.] main-r5f0-0[s] c75ss0[.] c75ss1[P] 
    
    [MCU2_0]     14.258022 s: IPC: Echo status: a530-0[.] main-r5f0-0[s] c75ss0[P] c75ss1[P] 
    
    [C7x_1 ]      6.142837 s: CIO: Init ... Done !!!
    
    [C7x_1 ]      6.142855 s: CPU is running FreeRTOS
    
    [C7x_1 ]      6.142866 s: APP: Init ... !!!
    
    [C7x_1 ]      6.142875 s: SCICLIENT: Init ... !!!
    
    [C7x_1 ]      6.142934 s: SCICLIENT: DMSC FW version [9.0.6--w2023.01-j722s (Kool Koa]
    
    [C7x_1 ]      6.142951 s: SCICLIENT: DMSC FW revision 0x9  
    
    [C7x_1 ]      6.142962 s: SCICLIENT: DMSC FW ABI revision 3.1
    
    [C7x_1 ]      6.142975 s: SCICLIENT: Init ... Done !!!
    
    [C7x_1 ]      6.142985 s: UDMA: Init ... !!!
    
    [C7x_1 ]      6.142995 s: UDMA: Init ... Done !!!
    
    [C7x_1 ]      6.143005 s: MEM: Init ... !!!
    
    [C7x_1 ]      6.143016 s: MEM: Created heap (DDR_LOCAL_MEM, id=0, flags=0x00000004) @ 102000000 of size 117440512 bytes !!!
    
    [C7x_1 ]      6.143043 s: MEM: Init ... Done !!!
    
    [C7x_1 ]      6.143053 s: IPC: Init ... !!!
    
    [C7x_1 ]      6.143064 s: IPC: 4 CPUs participating in IPC !!!
    
    [C7x_1 ]      6.143382 s: IPC: Waiting for HLOS to be ready ... !!!
    
    [C7x_1 ]     13.972001 s: IPC: HLOS is ready !!!
    
    [C7x_1 ]     13.972074 s: IPC: Init ... Done !!!
    
    [C7x_1 ]     13.972088 s: APP: Syncing with 3 CPUs ... !!!
    
    [C7x_1 ]     14.236788 s: APP: Syncing with 3 CPUs ... Done !!!
    
    [C7x_1 ]     14.236806 s: REMOTE_SERVICE: Init ... !!!
    
    [C7x_1 ]     14.237019 s: REMOTE_SERVICE: Init ... Done !!!
    
    [C7x_1 ]     14.237043 s:  VX_ZONE_INIT:Enabled
    
    [C7x_1 ]     14.237061 s:  VX_ZONE_ERROR:Enabled
    
    [C7x_1 ]     14.237077 s:  VX_ZONE_WARNING:Enabled
    
    [C7x_1 ]     14.237712 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1 
    
    [C7x_1 ]     14.237865 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_2 
    
    [C7x_1 ]     14.238027 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_3 
    
    [C7x_1 ]     14.238174 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_4 
    
    [C7x_1 ]     14.238317 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_5 
    
    [C7x_1 ]     14.238460 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_6 
    
    [C7x_1 ]     14.238598 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_7 
    
    [C7x_1 ]     14.238740 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-1_PRI_8 
    
    [C7x_1 ]     14.238812 s:  VX_ZONE_INIT:[tivxInitLocal:136] Initialization Done !!!
    
    [C7x_1 ]     14.238826 s: APP: OpenVX Target kernel init ... !!!
    
    [C7x_1 ]     14.239168 s: APP: OpenVX Target kernel init ... Done !!!
    
    [C7x_1 ]     14.239185 s: APP: Init ... Done !!!
    
    [C7x_1 ]     14.239195 s: APP: Run ... !!!
    
    [C7x_1 ]     14.239205 s: IPC: Starting echo test ...
    
    [C7x_1 ]     14.239338 s: APP: Run ... Done !!!
    
    [C7x_1 ]     14.258278 s: IPC: Echo status: a530-0[.] main-r5f0-0[P] c75ss0[s] c75ss1[.] 
    
    [C7x_1 ]     14.258322 s: IPC: Echo status: a530-0[.] main-r5f0-0[P] c75ss0[s] c75ss1[P] 
    
    [C7x_2 ]      6.451572 s: CIO: Init ... Done !!!
    
    [C7x_2 ]      6.451590 s: CPU is running FreeRTOS
    
    [C7x_2 ]      6.451601 s: APP: Init ... !!!
    
    [C7x_2 ]      6.451610 s: SCICLIENT: Init ... !!!
    
    [C7x_2 ]      6.451670 s: SCICLIENT: DMSC FW version [9.0.6--w2023.01-j722s (Kool Koa]
    
    [C7x_2 ]      6.451687 s: SCICLIENT: DMSC FW revision 0x9  
    
    [C7x_2 ]      6.451699 s: SCICLIENT: DMSC FW ABI revision 3.1
    
    [C7x_2 ]      6.451711 s: SCICLIENT: Init ... Done !!!
    
    [C7x_2 ]      6.451721 s: UDMA: Init ... !!!
    
    [C7x_2 ]      6.451731 s: UDMA: Init ... Done !!!
    
    [C7x_2 ]      6.451742 s: MEM: Init ... !!!
    
    [C7x_2 ]      6.451754 s: MEM: Created heap (DDR_LOCAL_MEM, id=0, flags=0x00000004) @ 112000000 of size 117440512 bytes !!!
    
    [C7x_2 ]      6.451779 s: MEM: Init ... Done !!!
    
    [C7x_2 ]      6.451789 s: IPC: Init ... !!!
    
    [C7x_2 ]      6.451800 s: IPC: 4 CPUs participating in IPC !!!
    
    [C7x_2 ]      6.452122 s: IPC: Waiting for HLOS to be ready ... !!!
    
    [C7x_2 ]     14.069722 s: IPC: HLOS is ready !!!
    
    [C7x_2 ]     14.069796 s: IPC: Init ... Done !!!
    
    [C7x_2 ]     14.069811 s: APP: Syncing with 3 CPUs ... !!!
    
    [C7x_2 ]     14.236788 s: APP: Syncing with 3 CPUs ... Done !!!
    
    [C7x_2 ]     14.236805 s: REMOTE_SERVICE: Init ... !!!
    
    [C7x_2 ]     14.236962 s: REMOTE_SERVICE: Init ... Done !!!
    
    [C7x_2 ]     14.237011 s:  VX_ZONE_INIT:Enabled
    
    [C7x_2 ]     14.237023 s:  VX_ZONE_ERROR:Enabled
    
    [C7x_2 ]     14.237035 s:  VX_ZONE_WARNING:Enabled
    
    [C7x_2 ]     14.237851 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2 
    
    [C7x_2 ]     14.237961 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_2 
    
    [C7x_2 ]     14.238108 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_3 
    
    [C7x_2 ]     14.238247 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_4 
    
    [C7x_2 ]     14.238385 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_5 
    
    [C7x_2 ]     14.238529 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_6 
    
    [C7x_2 ]     14.238727 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_7 
    
    [C7x_2 ]     14.238827 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target DSP_C7-2_PRI_8 
    
    [C7x_2 ]     14.238851 s:  VX_ZONE_INIT:[tivxInitLocal:136] Initialization Done !!!
    
    [C7x_2 ]     14.238865 s: APP: OpenVX Target kernel init ... !!!
    
    [C7x_2 ]     14.239199 s: APP: OpenVX Target kernel init ... Done !!!
    
    [C7x_2 ]     14.239217 s: APP: Init ... Done !!!
    
    [C7x_2 ]     14.239227 s: APP: Run ... !!!
    
    [C7x_2 ]     14.239284 s: IPC: Starting echo test ...
    
    [C7x_2 ]     14.239462 s: APP: Run ... Done !!!
    
    [C7x_2 ]     14.257909 s: IPC: Echo status: a530-0[.] main-r5f0-0[P] c75ss0[.] c75ss1[s] 
    
    [C7x_2 ]     14.258191 s: IPC: Echo status: a530-0[.] main-r5f0-0[P] c75ss0[P] c75ss1[s] 
    
    
    root@j722s-evm:/opt/vision_apps# 
    root@j722s-evm:/opt/vision_apps# ./run_app_single_cam.sh 
    APP: Init ... !!!
    MEM: Init ... !!!
    MEM: Initialized DMA HEAP (fd=5) !!!
    MEM: Init ... Done !!!
    IPC: Init ... !!!
    IPC: Init ... Done !!!
    REMOTE_SERVICE: Init ... !!!
    REMOTE_SERVICE: Init ... Done !!!
        39.734931 s: GTC Frequency = 200 MHz
    APP: Init ... Done !!!
        39.739201 s:  VX_ZONE_INIT:Enabled
        39.739250 s:  VX_ZONE_ERROR:Enabled
        39.739260 s:  VX_ZONE_WARNING:Enabled
        39.741844 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-0 
        39.742010 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-1 
        39.742128 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-2 
        39.742240 s:  VX_ZONE_INIT:[tivxPlatformCreateTargetId:116] Added target MPU-3 
        39.742255 s:  VX_ZONE_INIT:[tivxInitLocal:136] Initialization Done !!!
        39.743415 s:  VX_ZONE_INIT:[tivxHostInitLocal:101] Initialization Done for HOST !!!
    sensor_selection = [0]
    ldc_enable = [0]
    num_frames_to_run = [1000000000]
    is_interactive = [1]
    IttCtrl_registerHandler: command echo registered at location 0 
    IttCtrl_registerHandler: command iss_read_2a_params registered at location 1 
    IttCtrl_registerHandler: command iss_write_2a_params registered at location 2 
    IttCtrl_registerHandler: command iss_raw_save registered at location 3 
    IttCtrl_registerHandler: command iss_yuv_save registered at location 4 
    IttCtrl_registerHandler: command iss_read_sensor_reg registered at location 5 
    IttCtrl_registerHandler: command iss_write_sensor_reg registered at location 6 
    IttCtrl_registerHandler: command dev_ctrl registered at location 7 
    IttCtrl_registerHandler: command iss_send_dcc_file registered at location 8 
     NETWORK: Opened at IP Addr = 0.0.0.0, socket port=5000!!!
        39.753015 s: ISS: Enumerating sensors ... !!!
        39.753289 s: ISS: Enumerating sensors ... found 0 : IMX390-UB953_D3
        39.753303 s: ISS: Enumerating sensors ... found 1 : AR0233-UB953_MARS
        39.753313 s: ISS: Enumerating sensors ... found 2 : AR0820-UB953_LI
        39.753322 s: ISS: Enumerating sensors ... found 3 : UB9xxx_RAW12_TESTPATTERN
        39.753331 s: ISS: Enumerating sensors ... found 4 : UB96x_UYVY_TESTPATTERN
        39.753339 s: ISS: Enumerating sensors ... found 5 : GW_AR0233_UYVY
    Select camera port index 0-11 : [MCU2_0]     39.753114 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_ENUMERATE 
    
    [MCU2_0]     39.753211 s: Write 0x01 to TCA9543APWR (0x70) successful!!!
    
    0
    6 registered sensor drivers
    a : IMX390-UB953_D3 
    b : AR0233-UB953_MARS 
    c : AR0820-UB953_LI 
    d : UB9xxx_RAW12_TESTPATTERN 
    e : UB96x_UYVY_TESTPATTERN 
    f : GW_AR0233_UYVY 
    Select a sensor above or press '0' to autodetect the sensor : Invalid selection 
    . Try again 
    6 registered sensor drivers
    a : IMX390-UB953_D3 
    b : AR0233-UB953_MARS 
    c : AR0820-UB953_LI 
    d : UB9xxx_RAW12_TESTPATTERN 
    e : UB96x_UYVY_TESTPATTERN 
    f : GW_AR0233_UYVY 
    Select a sensor above or press '0' to autodetect the sensor : a
    Sensor selected : IMX390-UB953_D3
    LDC Selection Yes(1)/No(0) : LDC Selection Yes(1)/No(0) : 0
    CAC Selection Yes(1)/No(0) : CAC Selection Yes(1)/No(0) : 0
    Querying IMX390-UB953_D3 
        43.708526 s: ISS: Querying sensor [IMX390-UB953_D3] ... !!!
        43.708695 s: ISS: Querying sensor [IMX390-UB953_D3] ... Done !!!
        43.708712 s: ISS: Initializing sensor [IMX390-UB953_D3], doing IM_SENSOR_CMD_PWRON ... !!!
        43.708838 s: ISS: Initializing sensor [IMX390-UB953_D3], doing IM_SENSOR_CMD_CONFIG ... !!!
    [MCU2_0]     43.708592 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_QUERY 
    
    [MCU2_0]     43.708611 s: Received Query for IMX390-UB953_D3 
    
    [MCU2_0]     43.708742 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_PWRON 
    
    [MCU2_0]     43.708759 s: IM_SENSOR_CMD_PWRON : channel_mask = 0x1 
    
    [MCU2_0]     43.708792 s: IMX390_PowerOn : chId = 0x0 
    
    [MCU2_0]     43.708872 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_CONFIG 
    
    [MCU2_0]     43.708886 s: Application requested features = 0x158 
    
    [MCU2_0]  
    
    [MCU2_0]     43.708911 s: IM_SENSOR_CMD_CONFIG channel_mask = 1
    
    [MCU2_0]     43.708963 s: IM_SENSOR_CMD_CONFIG::probe++++++++IMX390_Probe++++++++IMX390_Probe----------IM_SENSOR_CMD_CONFIG::probe---------Configuring camera # 0 
    
    [MCU2_0]     43.708999 s: serdes config start : slaveAddr = 0x48 
    
    [MCU2_0]     43.709140 s: write success![slaveAddr:0x48] regAddr:0x313, RegValue: 0x0
    
    [MCU2_0]     43.709319 s: read success![slaveAddr:0x48] regAddr:0x313, RegValue: 0x0
    
    [MCU2_0]     43.725165 s: write success![slaveAddr:0x48] regAddr:0x1, RegValue: 0x1
    
    [MCU2_0]     43.725338 s: read success![slaveAddr:0x48] regAddr:0x1, RegValue: 0x1
    
    [MCU2_0]     43.741164 s: write success![slaveAddr:0x48] regAddr:0x52, RegValue: 0x1
    
    [MCU2_0]     43.741338 s: read success![slaveAddr:0x48] regAddr:0x52, RegValue: 0x1
    
    [MCU2_0]     43.757164 s: write success![slaveAddr:0x48] regAddr:0x51, RegValue: 0x2
    
    [MCU2_0]     43.757337 s: read success![slaveAddr:0x48] regAddr:0x51, RegValue: 0x2
    
    [MCU2_0]     43.773166 s: write success![slaveAddr:0x48] regAddr:0x44a, RegValue: 0xc0
    
    [MCU2_0]     43.773342 s: read success![slaveAddr:0x48] regAddr:0x44a, RegValue: 0xc0
    
    [MCU2_0]     43.789167 s: write success![slaveAddr:0x48] regAddr:0x320, RegValue: 0x2c
    
    [MCU2_0]     43.789339 s: read success![slaveAddr:0x48] regAddr:0x320, RegValue: 0x2c
    
    [MCU2_0]     43.805166 s: write success![slaveAddr:0x48] regAddr:0x3e2, RegValue: 0x20
    
    [MCU2_0]     43.805340 s: read success![slaveAddr:0x48] regAddr:0x3e2, RegValue: 0x20
    
    [MCU2_0]     43.821167 s: write success![slaveAddr:0x48] regAddr:0x3e7, RegValue: 0xc
    
    [MCU2_0]     43.821339 s: read success![slaveAddr:0x48] regAddr:0x3e7, RegValue: 0xc
    
    [MCU2_0]     43.837170 s: write success![slaveAddr:0x48] regAddr:0x3e6, RegValue: 0xb7
    
    [MCU2_0]     43.837344 s: read success![slaveAddr:0x48] regAddr:0x3e6, RegValue: 0xb7
    
    [MCU2_0]     43.853172 s: write success![slaveAddr:0x48] regAddr:0x3e5, RegValue: 0x35
    
    [MCU2_0]     43.853346 s: read success![slaveAddr:0x48] regAddr:0x3e5, RegValue: 0x35
    
    [MCU2_0]     43.869173 s: write success![slaveAddr:0x48] regAddr:0x3ef, RegValue: 0x40
    
    [MCU2_0]     43.869347 s: read success![slaveAddr:0x48] regAddr:0x3ef, RegValue: 0x40
    
    [MCU2_0]     43.885175 s: write success![slaveAddr:0x48] regAddr:0x3e0, RegValue: 0x34
    
    [MCU2_0]     43.885350 s: read success![slaveAddr:0x48] regAddr:0x3e0, RegValue: 0x34
    
    [MCU2_0]     43.901176 s: write success![slaveAddr:0x48] regAddr:0x3f1, RegValue: 0x40
    
    [MCU2_0]     43.901349 s: read success![slaveAddr:0x48] regAddr:0x3f1, RegValue: 0x40
    
    [MCU2_0]     43.917217 s: write success![slaveAddr:0x48] regAddr:0xffff, RegValue: 0x0
    
    [MCU2_0]     43.917429 s: read success![slaveAddr:0x48] regAddr:0xffff, RegValue: 0x0
    
    [MCU2_0]     43.933055 s:  End of UB953 config 
    
    [MCU2_0]     43.933256 s: des link lock status: 0xda
    
    [MCU2_0]     43.933455 s: des regAddr:0x10 - 0x11
    
    [MCU2_0]     43.933654 s: max96717F[ID]::0x00 - 0x80
    
    [MCU2_0]     43.933678 s: serdes config start : slaveAddr = 0x40 
    
    [MCU2_0]     43.933853 s: write success![slaveAddr:0x40] regAddr:0x1, RegValue: 0x4
    
    [MCU2_0]     43.934067 s: read success![slaveAddr:0x40] regAddr:0x1, RegValue: 0x4
    
    [MCU2_0]     43.950219 s: write success![slaveAddr:0x40] regAddr:0x10, RegValue: 0x15
    
    [MCU2_0]     43.950430 s: read success![slaveAddr:0x40] regAddr:0x10, RegValue: 0x11
    
    [MCU2_0]     43.966219 s: write success![slaveAddr:0x40] regAddr:0x318, RegValue: 0x6c
    
    [MCU2_0]     43.966432 s: read success![slaveAddr:0x40] regAddr:0x318, RegValue: 0x6c
    
    [MCU2_0]     43.982220 s: write success![slaveAddr:0x40] regAddr:0x2d6, RegValue: 0x84
    
    [MCU2_0]     43.982433 s: read success![slaveAddr:0x40] regAddr:0x2d6, RegValue: 0x84
    
    [MCU2_0]     43.998223 s: write success![slaveAddr:0x40] regAddr:0xffff, RegValue: 0x0
    
    [MCU2_0]     43.998438 s: read success![slaveAddr:0x40] regAddr:0xffff, RegValue: 0x0
    
    [MCU2_0]     44.014061 s:  End of UB953 config 
    
    [MCU2_0]     44.014092 s:  Configuring IMX390 imager 0x10.. Please wait till it finishes 
    
        44.278212 s: ISS: Initializing sensor [IMX390-UB953_D3] ... Done !!!
    [MCU2_0]     44.278096 s: IM_SENSOR_CMD_CONFIG returning status = 0
    
    Test data path is NULL. Defaulting to current folder 
    read_test_image_raw : Unable to open file .//img_test.raw
    app_create_viss : sensor_dcc_id = 390 
    Scaler is enabled
    
    
     ==========================
     Demo : Single Camera w/ 2A
     ==========================
    
     p: Print performance statistics
    
     s: Save Sensor RAW, VISS Output and H3A output images to File System
    
     e: Export performance statistics
    
     u: Update DCC from File System
    
    
     x: Exit
    
     Enter Choice:     46.310382 s: ISS: Starting sensor [IMX390-UB953_D3] ... !!!
    
    Unsupported command 
    
    
    
     ==========================
     Demo : Single Camera w/ 2A
     ==========================
    
     p: Print performance statistics
    
     s: Save Sensor RAW, VISS Output and H3A output images to File System
    
     e: Export performance statistics
    
     u: Update DCC from File System
    
    
     x: Exit
    
     Enter Choice: [MCU2_0]     46.310471 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_STREAM_ON 
    
    [MCU2_0]     46.310517 s: IM_SENSOR_CMD_STREAM_ON:  channel_mask = 0x1
    
    [MCU2_0]     46.410637 s: read IMX390_StreamOn flag:0x0100 - 0x1
    
        46.512906 s: ISS: Starting sensor [IMX390-UB953_D3] ... Done !!!
    get_dcc_dir_size : Could not open directory or directory is empty /opt/vision_apps/dcc/IMX390-UB953_D3/wdr 
    [MCU2_0]     46.510456 s: des [video lock]regAddr:0x1dc - 0x0
    
    [MCU2_0]     46.510661 s: des [video lock]regAddr:0x1fc - 0x1
    
    [MCU2_0]     46.510863 s: des [video lock]regAddr:0x21c - 0x0
    
    [MCU2_0]     46.511065 s: des [video lock]regAddr:0x55f - 0x61
    
    [MCU2_0]     46.511270 s: max96717pclkdet:regAddr:0x112 - 0x8a
    
    [MCU2_0]     46.511285 s: read sensor+++++
    
    [MCU2_0]     46.511295 s:  
    
    [MCU2_0]     46.511672 s: read IMX390_chip_id:0x0014 - 0x8dd4
    
    [MCU2_0]     46.512050 s: read IMX390_chip_id:0x0016 - 0x4216
    
    [MCU2_0]     46.512430 s: read IMX390_chip_id:0x0018 - 0x15a8
    
    [MCU2_0]     46.512810 s: read IMX390_chip_id flag:0x001a - 0x0
    
    [MCU2_0]     46.512825 s: IMX390_StreamOn End--------------------- 
    
    [MCU2_0]     46.571835 s: IMX390_GetWBPrgFxn: sensor_pre_gain = 0 
    
    [MCU2_0]    149.541508 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.574510 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.607515 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.640517 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.673519 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.706522 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.739525 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.772526 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.805530 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.838533 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.871534 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.904538 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.937541 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    149.970542 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.003546 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.036549 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.069551 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.102553 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.135557 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.168559 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.201561 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.234564 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.267567 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.300570 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.333571 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.366575 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.399578 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.432580 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.465583 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.498586 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.531587 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.564590 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.597594 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.630596 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.663599 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.696600 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.729603 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.762606 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.795609 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.828612 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.861615 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.894617 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.927619 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.960622 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    150.993624 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.026627 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.059631 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.092632 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.125635 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.158638 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.191640 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.224644 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.257646 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.290648 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.323651 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.356654 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.389656 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.422660 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.455662 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.488664 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.521667 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.554671 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.587672 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.620675 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.653679 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.686679 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.719684 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.752687 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.785688 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.818692 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.851693 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.884696 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.917698 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.950702 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    151.983704 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.016706 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.049709 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.082712 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.115714 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.148718 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.181718 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.214723 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.247725 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.280726 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.313730 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.346733 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.379734 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.412740 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.445741 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.478743 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.511747 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.544749 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.577751 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.610755 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.643757 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.676758 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    x[MCU2_0]    152.709762 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.742764 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.775766 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    
    
    [MCU2_0]    152.808770 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.841773 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
    [MCU2_0]    152.874774 s: RTOS DPL ERROR: Semaphore wait failed. Timeout expired.
    
       152.888719 s: ISS: Stopping sensor [IMX390-UB953_D3] ... !!!
    [MCU2_0]    152.888784 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_STREAM_OFF 
    
    [MCU2_0]    152.888827 s: IM_SENSOR_CMD_STREAM_ON:  channel_mask = 0x1
    
    [MCU2_0]    152.888915 s: IMX390_WriteReg : Error writing to register 0x100 
    
    [MCU2_0]    152.898931 s:  des---link lock status: 0x12
    
    [MCU2_0]    152.899107 s: read success![slaveAddr:0x48] regAddr:0x313, RegValue: 0x2
    
    [MCU2_0]    152.914936 s: read success![slaveAddr:0x48] regAddr:0x1, RegValue: 0x2
    
    [MCU2_0]    152.930938 s: read success![slaveAddr:0x48] regAddr:0x52, RegValue: 0x2
    
    [MCU2_0]    152.946936 s: read success![slaveAddr:0x48] regAddr:0x51, RegValue: 0x1
    
    [MCU2_0]    152.962937 s: read success![slaveAddr:0x48] regAddr:0x44a, RegValue: 0xd0
    
    [MCU2_0]    152.978938 s: read success![slaveAddr:0x48] regAddr:0x320, RegValue: 0x2f
    
    [MCU2_0]    152.994940 s: read success![slaveAddr:0x48] regAddr:0x3e2, RegValue: 0x81
    
    [MCU2_0]    153.010941 s: read success![slaveAddr:0x48] regAddr:0x3e7, RegValue: 0x0
    
    [MCU2_0]    153.026942 s: read success![slaveAddr:0x48] regAddr:0x3e6, RegValue: 0x0
    
    [MCU2_0]    153.042943 s: read success![slaveAddr:0x48] regAddr:0x3e5, RegValue: 0x0
    
    [MCU2_0]    153.058945 s: read success![slaveAddr:0x48] regAddr:0x3ef, RegValue: 0x9f
    
    [MCU2_0]    153.074944 s: read success![slaveAddr:0x48] regAddr:0x3e0, RegValue: 0xe
    
    [MCU2_0]    153.090947 s: read success![slaveAddr:0x48] regAddr:0x3f1, RegValue: 0xf0
    
    [MCU2_0]    153.106950 s: read success![slaveAddr:0x48] regAddr:0xffff, RegValue: 0x0
    
       153.123086 s: ISS: Stopping sensor [IMX390-UB953_D3] failed !!!
    [MCU2_0]    153.123014 s: Warning : Failed to stop sensor at channel Id 0 
    
       153.211767 s: ISS: Stopping sensor [IMX390-UB953_D3] ... !!!
    [MCU2_0]    153.211821 s: ImageSensor_RemoteServiceHandler: IM_SENSOR_CMD_STREAM_OFF 
    
    [MCU2_0]    153.211840 s: IM_SENSOR_CMD_STREAM_ON:  channel_mask = 0x1
    
    [MCU2_0]    153.211908 s: IMX390_WriteReg : Error writing to register 0x100 
    
    [MCU2_0]    153.221958 s:  des---link lock status: 0x12
    
    [MCU2_0]    153.222129 s: read success![slaveAddr:0x48] regAddr:0x313, RegValue: 0x40
    
    [MCU2_0]    153.237956 s: read success![slaveAddr:0x48] regAddr:0x1, RegValue: 0x2
    
    [MCU2_0]    153.253962 s: read success![slaveAddr:0x48] regAddr:0x52, RegValue: 0x2
    
    [MCU2_0]    153.269960 s: read success![slaveAddr:0x48] regAddr:0x51, RegValue: 0x1
    
    [MCU2_0]    153.285962 s: read success![slaveAddr:0x48] regAddr:0x44a, RegValue: 0xd0
    
    [MCU2_0]    153.301963 s: read success![slaveAddr:0x48] regAddr:0x320, RegValue: 0x2f
    
    [MCU2_0]    153.317965 s: read success![slaveAddr:0x48] regAddr:0x3e2, RegValue: 0x81
    
    [MCU2_0]    153.333967 s: read success![slaveAddr:0x48] regAddr:0x3e7, RegValue: 0x0
    
    [MCU2_0]    153.349967 s: read success![slaveAddr:0x48] regAddr:0x3e6, RegValue: 0x0
    
    [MCU2_0]    153.365969 s: read success![slaveAddr:0x48] regAddr:0x3e5, RegValue: 0x0
    
    [MCU2_0]    153.381971 s: read success![slaveAddr:0x48] regAddr:0x3ef, RegValue: 0x9f
    
    [MCU2_0]    153.397971 s: read success![slaveAddr:0x48] regAddr:0x3e0, RegValue: 0xe
    
    [MCU2_0]    153.413973 s: read success![slaveAddr:0x48] regAddr:0x3f1, RegValue: 0xf0
    
    [MCU2_0]    153.429976 s: read success![slaveAddr:0x48] regAddr:0xffff, RegValue: 0x0
    
       153.446099 s: ISS: Stopping sensor [IMX390-UB953_D3] failed !!!
    Error : app_run_graph_xx returned 0xffffffff 
       153.446595 s:  VX_ZONE_WARNING:[vxReleaseContext:1344] A kernel with name com.ti.hwa.vpac_msc_multi_scale has not been removed, possibly due to a kernel module not being unloaded.
       153.446611 s:  VX_ZONE_WARNING:[vxReleaseContext:1345] Removing as a part of garbage collection
       153.446625 s:  VX_ZONE_WARNING:[ownDecrementReference:489] #### EXTERNAL REF COUNT IS ALREADY ZERO!!! 0xffff8e0aace8 type:00000804 #####
       153.446637 s:  VX_ZONE_WARNING:[vxReleaseContext:1344] A kernel with name com.ti.hwa.vpac_viss has not been removed, possibly due to a kernel module not being unloaded.
       153.446649 s:  VX_ZONE_WARNING:[vxReleaseContext:1345] Removing as a part of garbage collection
       153.446661 s:  VX_ZONE_WARNING:[ownDecrementReference:489] #### EXTERNAL REF COUNT IS ALREADY ZERO!!! 0xffff8e0ae0e8 type:00000804 #####
       153.446673 s:  VX_ZONE_WARNING:[vxReleaseContext:1344] A kernel with name com.ti.display has not been removed, possibly due to a kernel module not being unloaded.
       153.446685 s:  VX_ZONE_WARNING:[vxReleaseContext:1345] Removing as a part of garbage collection
       153.446696 s:  VX_ZONE_WARNING:[ownDecrementReference:489] #### EXTERNAL REF COUNT IS ALREADY ZERO!!! 0xffff8e0aede8 type:00000804 #####
       153.446708 s:  VX_ZONE_WARNING:[vxReleaseContext:1344] A kernel with name com.ti.capture has not been removed, possibly due to a kernel module not being unloaded.
       153.446719 s:  VX_ZONE_WARNING:[vxReleaseContext:1345] Removing as a part of garbage collection
       153.446731 s:  VX_ZONE_WARNING:[ownDecrementReference:489] #### EXTERNAL REF COUNT IS ALREADY ZERO!!! 0xffff8e0afae8 type:00000804 #####
       153.446743 s:  VX_ZONE_WARNING:[vxReleaseContext:1344] A kernel with name com.ti.imaging.aewb has not been removed, possibly due to a kernel module not being unloaded.
       153.446754 s:  VX_ZONE_WARNING:[vxReleaseContext:1345] Removing as a part of garbage collection
       153.446765 s:  VX_ZONE_WARNING:[ownDecrementReference:489] #### EXTERNAL REF COUNT IS ALREADY ZERO!!! 0xffff8e0b14e8 type:00000804 #####
       153.446779 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8d73c2e8 of type 00000802 at external count 1, internal count 0, releasing it
       153.446791 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=graph_81) now as a part of garbage collection
    [MCU2_0]    153.446039 s: Warning : Failed to stop sensor at channel Id 0 
    
       153.456178 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e106ce8 of type 00000817 at external count 1, internal count 0, releasing it
       153.456205 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=raw_image_82) now as a part of garbage collection
       153.456797 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e19c490 of type 00000813 at external count 1, internal count 0, releasing it
       153.456813 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=object_array_83) now as a part of garbage collection
       153.456836 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e106f28 of type 00000817 at external count 1, internal count 0, releasing it
       153.456848 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=raw_image_84) now as a part of garbage collection
       153.457442 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e19c638 of type 00000813 at external count 1, internal count 0, releasing it
       153.457458 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=object_array_85) now as a part of garbage collection
    [MCU2_0]    153.449966 s: ==========================================================
    
    [MCU2_0]    153.450003 s:  Capture Status: Instance|0
    
    [MCU2_0]    153.450022 s: ==========================================================
    
    [MCU2_0]    153.450043 s:  overflowCount: 0
    
    [MCU2_0]    153.450061 s:  spuriousUdmaIntrCount: 0
    
    [MCU2_0]    153.450079 s:  frontFIFOOvflCount: 0
    
    [MCU2_0]    153.450094 s:  crcCount: 0
    
    [MCU2_0]    153.450109 s:  eccCount: 0
    
    [MCU2_0]    153.450127 s:  correctedEccCount: 0
    
    [MCU2_0]    153.450144 s:  dataIdErrorCount: 0
    
       153.458027 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e19c7e0 of type 00000813 at external count 1, internal count 0, releasing it
    [MCU2_0]    153.450164 s:  invalidAccessCount: 0
    
       153.790412 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=object_array_87) now as a part of garbage collection
    [MCU2_0]    153.450182 s:  invalidSpCount: 0
    
    [MCU2_0]    153.450202 s:  strmFIFOOvflCount[0]: 0
    
    [MCU2_0]    153.450222 s:  strmFIFOOvflCount[1]: 0
    
    [MCU2_0]    153.450238 s:  Channel Num | Frame Queue Count | Frame De-queue Count | Frame Drop Count | Error Frame Count |
    
    [MCU2_0]    153.450272 s:            0 |              3084 |                 3084 |                0 |                 0 |
    
    [MCU2_0]    153.450493 s: ==========================================================
    
    [MCU2_0]    153.450532 s:  Capture Status: Instance|1
    
    [MCU2_0]    153.450547 s: ==========================================================
    
    [MCU2_0]    153.450569 s:  overflowCount: 0
    
    [MCU2_0]    153.450587 s:  spuriousUdmaIntrCount: 0
    
    [MCU2_0]    153.450605 s:  frontFIFOOvflCount: 0
    
    [MCU2_0]    153.450620 s:  crcCount: 0
    
    [MCU2_0]    153.450635 s:  eccCount: 0
    
    [MCU2_0]    153.450652 s:  correctedEccCount: 0
    
    [MCU2_0]    153.450670 s:  dataIdErrorCount: 0
    
    [MCU2_0]    153.450687 s:  invalidAccessCount: 0
    
    [MCU2_0]    153.450704 s:  invalidSpCount: 0
    
    [MCU2_0]    153.450722 s:  strmFIFOOvflCount[0]: 0
    
    [MCU2_0]    153.450742 s:  strmFIFOOvflCount[1]: 0
    
    [MCU2_0]    153.450757 s:  Channel Num | Frame Queue Count | Frame De-queue Count | Frame Drop Count | Error Frame Count |
    
       153.791067 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e19c988 of type 00000813 at external count 1, internal count 0, releasing it
       153.791084 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=object_array_89) now as a part of garbage collection
       153.791678 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e12c868 of type 0000080f at external count 1, internal count 0, releasing it
       153.791692 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=image_93) now as a part of garbage collection
       153.792139 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0f9e90 of type 00000816 at external count 1, internal count 0, releasing it
       153.792154 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_94) now as a part of garbage collection
       153.792223 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fa0b8 of type 00000816 at external count 1, internal count 0, releasing it
       153.792237 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_95) now as a part of garbage collection
       153.792291 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fa2e0 of type 00000816 at external count 1, internal count 0, releasing it
       153.792305 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_96) now as a part of garbage collection
       153.792363 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fa508 of type 00000816 at external count 1, internal count 0, releasing it
       153.792377 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_98) now as a part of garbage collection
       153.792432 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fa730 of type 00000816 at external count 1, internal count 0, releasing it
       153.792446 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_99) now as a part of garbage collection
       153.792502 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fa958 of type 00000816 at external count 1, internal count 0, releasing it
       154.123491 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_100) now as a part of garbage collection
       154.123601 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e12cb30 of type 0000080f at external count 1, internal count 0, releasing it
       154.123616 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=image_102) now as a part of garbage collection
       154.123883 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fab80 of type 00000816 at external count 1, internal count 0, releasing it
       154.123899 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_104) now as a part of garbage collection
       154.123955 s:  VX_ZONE_WARNING:[vxReleaseContext:1325] Found a reference 0xffff8e0fafd0 of type 00000816 at external count 1, internal count 0, releasing it
       154.123969 s:  VX_ZONE_WARNING:[vxReleaseContext:1327] Releasing reference (name=user_data_object_106) now as a part of garbage collection
       154.124103 s: ISS: De-initializing sensor [IMX390-UB953_D3] ... !!!
       154.124227 s: ISS: De-initializing sensor [IMX390-UB953_D3] ... Done !!!
       154.124252 s:  VX_ZONE_INIT:[tivxHostDeInitLocal:115] De-Initialization Done for HOST !!!
       154.128874 s:  VX_ZONE_INIT:[tivxDeInitLocal:204] De-Initialization Done !!!
    APP: Deinit ... !!!
    REMOTE_SERVICE: Deinit ... !!!
    REMOTE_SERVICE: Deinit ... Done !!!
    IPC: Deinit ... !!!
    IPC: DeInit ... Done !!!
    MEM: Deinit ... !!!
    DDR_SHARED_MEM: Alloc's: 23 alloc's of 56019229 bytes 
    DDR_SHARED_MEM: Free's : 23 free's  of 56019229 bytes 
    DDR_SHARED_MEM: Open's : 0 allocs  of 0 bytes 
    MEM: Deinit ... Done !!!
    APP: Deinit ... Done !!!
    root@j722s-evm:/opt/vision_apps# 


     current  code

    4452.iss_sensors.c

    /*
     *
     * Copyright (c) 2020 Texas Instruments Incorporated
     *
     * All rights reserved not granted herein.
     *
     * Limited License.
     *
     * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
     * license under copyrights and patents it now or hereafter owns or controls to make,
     * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
     * terms herein.  With respect to the foregoing patent license, such license is granted
     * solely to the extent that any such patent is necessary to Utilize the software alone.
     * The patent license shall not apply to any combinations which include this software,
     * other than combinations with devices manufactured by or for TI ("TI Devices").
     * No hardware patent is licensed hereunder.
     *
     * Redistributions must preserve existing copyright notices and reproduce this license
     * (including the above copyright notice and the disclaimer and (if applicable) source
     * code license limitations below) in the documentation and/or other materials provided
     * with the distribution
     *
     * Redistribution and use in binary form, without modification, are permitted provided
     * that the following conditions are met:
     *
     * *       No reverse engineering, decompilation, or disassembly of this software is
     * permitted with respect to any software provided in binary form.
     *
     * *       any redistribution and use are licensed by TI for use only with TI Devices.
     *
     * *       Nothing shall obligate TI to provide you with source code for the software
     * licensed and provided to you in object code.
     *
     * If software source code is provided to you, modification and redistribution of the
     * source code are permitted provided that the following conditions are met:
     *
     * *       any redistribution and use of the source code, including any resulting derivative
     * works, are licensed by TI for use only with TI Devices.
     *
     * *       any redistribution and use of any object code compiled from the source code
     * and any resulting derivative works, are licensed by TI for use only with TI Devices.
     *
     * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
     *
     * may be used to endorse or promote products derived from this software without
     * specific prior written permission.
     *
     * DISCLAIMER.
     *
     * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     * IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     * OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     */
    #include "iss_sensor_imx390.h"
    #include "imx390_serdes_config.h"
    
    static IssSensor_CreateParams  imx390CreatePrms = {
        SENSOR_SONY_IMX390_UB953_D3,     /*sensor name*/
        0x5,                             /*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*/
        {
            {
                IMX390_OUT_WIDTH,               /*width*/
                IMX390_OUT_HEIGHT-IMX390_META_HEIGHT_AFTER,            /*height*/
                1,                              /*num_exposures*/
                vx_false_e,                     /*line_interleaved*/
                {
                    {TIVX_RAW_IMAGE_16_BIT, 11},    /*dataFormat and MSB [0]*/
                },
                0,                              /*meta_height_before*/
                IMX390_META_HEIGHT_AFTER,      /*meta_height_after*/
            },
            ISS_SENSOR_IMX390_FEATURES,     /*features*/
            ALGORITHMS_ISS_AEWB_MODE_AEWB,  /*aewbMode*/
            30,                             /*fps*/
            4,                              /*numDataLanes*/
            {1, 2, 3, 4},                   /*dataLanesMap*/
            {0, 0, 0, 0},                   /*dataLanesPolarity*/
            CSIRX_LANE_BAND_SPEED_1350_TO_1500_MBPS, /*csi_laneBandSpeed*/
        },
        12,                                  /*numChan*/
        390,                                /*dccId*/
    };
    
    static IssSensorFxns           im390SensorFxns = {
        IMX390_Probe,
        IMX390_Config,
        IMX390_StreamOn,
        IMX390_StreamOff,
        IMX390_PowerOn,
        IMX390_PowerOff,
        IMX390_GetExpParams,
        IMX390_SetAeParams,
        IMX390_GetDccParams,
        IMX390_InitAewbConfig,
        IMX390_GetIspConfig,
        IMX390_ReadWriteReg,
        IMX390_GetExpPrgFxn,
        IMX390_deinit,
        IMX390_GetWBPrgFxn,
        IMX390_SetAwbParams
    };
    
    static IssSensorIntfParams     imx390SensorIntfPrms = {
        0,             /*sensorBroadcast*/
        0,             /*enableFsin*/
        0,			   /*numCamerasStreaming*/
    };
    
    IssSensorConfig     imx390SensorRegConfigLinear = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390LinearConfig,        /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensorConfig     imx390SensorRegConfigWdr = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390WdrConfig,        /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensorConfig     imx390SensorRegConfigWdr60fps = {
        max9296DesCfg_D3IMX390,     /*desCfgPreScript*/
        max96717fSerCfg_D3IMX390,     /*serCfgPreScript*/
        iMX390WdrConfig,     /*sensorCfgPreScript*/
        NULL,        /*desCfgPostScript*/
        NULL,                    /*serCfgPostScript*/
        NULL,                    /*sensorCfgPostScript*/
    };
    
    IssSensors_Handle imx390SensorHandle = {
        1,                                 /*isUsed*/
        &imx390CreatePrms,                /*CreatePrms*/
        &im390SensorFxns,                /*SensorFxns*/
        &imx390SensorIntfPrms,            /*SensorIntfPrms*/
    };
    
    /*
     * \brief DCC Parameters of IMX390
     */
    //IssCapture_CmplxIoLaneCfg           imx390Csi2CmplxIoLaneCfg;
    extern IssSensors_Handle * gIssSensorTable[ISS_SENSORS_MAX_SUPPORTED_SENSOR];
    static uint16_t sp1hGainRegValueOld[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t redGain_prev[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t greenGain_prev[ISS_SENSORS_MAX_CHANNEL];
    static uint16_t blueGain_prev[ISS_SENSORS_MAX_CHANNEL];
    
    int32_t IssSensor_IMX390_Init()
    {
        int32_t status;
        int32_t chId;
        status = IssSensor_Register(&imx390SensorHandle);
        if(0 != status)
        {
            printf("IssSensor_IMX390_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;
    }
    
    /*******************************************************************************
     *  Local Functions Definition
     *******************************************************************************
     */
    
    static int32_t IMX390_Probe(uint32_t chId, void *pSensorHdl)
    {
        printf("IMX390_Probe++++++++");
        int32_t status = -1;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint16_t chipIdRegAddr = IMX390_CHIP_ID_REG_ADDR;
        uint16_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];
    
        #if 0
        serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
        /*The code assumes that I2C instance is the same for sensor and serializer*/
        if(NULL != serCfg)
        {
            status = max_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;
                    printf("IMX390_Probe SUCCESS : Read expected value 0x%x at chip ID register 0x%x \n", IMX390_CHIP_ID_REG_VAL, chipIdRegAddr);
                }
                else
                {
                    status = -1;
                    printf("IMX390_Probe : 0x%x read at chip ID register 0x%x. Expected 0x%x \n", chipIdRegValueRead, chipIdRegAddr, IMX390_CHIP_ID_REG_VAL);
                    printf("IMX390 Probe Failed.. Retrying \n");
                    appLogWaitMsecs(100);
                }
            }
            else
            {
                printf("IMX390 Probe : Failed to read CHIP_ID register 0x%x \n", chipIdRegAddr);
            }
            count++;
        }
        #endif 
        printf("IMX390_Probe----------");
        return (0);
    }
    
    static int32_t IMX390_Sensor_RegConfig(uint32_t i2cInstId, uint8_t sensorI2cAddr, I2cParams *sensorCfg, uint16_t sensor_cfg_script_len)
    {
        int32_t status = 0;
        uint16_t regAddr;
        uint16_t regValue;
        uint16_t delayMilliSec;
        uint32_t regCnt;
    
        if(NULL != sensorCfg)
        {
            regCnt = 0;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
    
            printf(" Configuring IMX390 imager 0x%x.. Please wait till it finishes \n", sensorI2cAddr);
            while(regCnt<sensor_cfg_script_len)
            {
                status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
    
                if (0 != status)
                {
                    printf(" \n \n IMX390: Sensor Reg Write Failed for regAddr 0x%x \n \n", regAddr);
                }
    
                if(delayMilliSec > 0)
                {
                   appLogWaitMsecs(delayMilliSec);
                }
    
                regCnt++;
                regAddr  = sensorCfg[regCnt].nRegAddr;
                regValue = sensorCfg[regCnt].nRegValue;
                delayMilliSec = sensorCfg[regCnt].nDelay;
            }
            /*Wait 100ms after the init is done*/
            appLogWaitMsecs(100);
            //printf(" IMX390 config done \n ");
        }
        else
        {
            printf(" IMX390 config script is NULL \n");
        }
        return status;
    }
    
    static uint32_t imx390FeaturesEnabled;
    static int32_t IMX390_Config(uint32_t chId, void *pSensorHdl, uint32_t sensor_features_requested)
    {
        int32_t status = 0;
        #if 1
        uint32_t i2cInstId;
        uint16_t sensor_cfg_script_len = 0;
        uint8_t regValue = 0;
        I2cParams *sensorCfg = NULL;
        I2cParams *serCfg = NULL;
        I2cParams *desCfg = NULL;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        if(sensor_features_requested != (sensor_features_requested & ISS_SENSOR_IMX390_FEATURES))
        {
            printf("IMX390_Config : Error. feature set 0x%x is not supported \n", sensor_features_requested);
            return -1;
        }
    
        imx390FeaturesEnabled= sensor_features_requested;
    
        i2cInstId = pCreatePrms->i2cInstId;
    	desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
        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 = max_cfgScript(i2cInstId, MAX9296_DES_ID >> 1, desCfg);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &regValue);
        printf("des link lock status: 0x%x\n",regValue);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x10, &regValue);
        printf("des regAddr:0x10 - 0x%x\n",regValue);
        if(0 != status)
        {
            printf("IMX390_Config Error : max9296 config failed for camera # %d \n", chId);
        }
        Deserializer_ReadReg(pCreatePrms->i2cAddrSer[chId], 0x00, &regValue);
        printf("max96717F[ID]::0x00 - 0x%x\n",regValue);
        status = max_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] >> 1, sensorCfg, sensor_cfg_script_len);
        }
        #endif
        return (status);
    }
    
    static int32_t IMX390_StreamOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        I2cParams *sensorCfg = NULL;
        I2cParams *serCfg = NULL;
        I2cParams *desCfg = NULL;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint8_t serI2cAddr;
        uint32_t regCnt;
        uint16_t regAddr;
        uint16_t regValue;
        uint8_t  value;
        uint16_t delayMilliSec;
        uint16_t sensor_cfg_script_len = 0;
        
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        if(ISS_SENSOR_FEATURE_CFG_UC1 == (imx390FeaturesEnabled& ISS_SENSOR_FEATURE_CFG_UC1))
        {
            if(pSenHandle->sensorIntfPrms->numCamerasStreaming >= 3U)
            {
                printf("IMX390_StreamOn Error : %d cameras streaming already \n", pSenHandle->sensorIntfPrms->numCamerasStreaming);
                printf("IMX390_StreamOn Error : 60fps mode can support upto 3 cameras because of UB960 b/w limitation \n");
                return -1;
            }
        }
     
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
        serI2cAddr    = pCreatePrms->i2cAddrSer[chId];
      #if 0  
    
       
        sensorCfg = imx390SensorRegConfigWdr.sensorCfgPreScript;
        desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
        serCfg = imx390SensorRegConfigWdr.serCfgPreScript;
        sensor_cfg_script_len = IMX390_WDR_CONFIG_SIZE;
    
        /*Deserializer config is done in IssSensor_PowerOn, Need to set sensor alias*/
        status = max_cfgScript(i2cInstId, MAX9296_DES_ID >> 1, desCfg);
        appLogWaitMsecs(500);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &value);
        printf("des link lock status: 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x10, &value);
        printf("des regAddr:0x10 - 0x%x\n",value);
        if(0 != status)
        {
            printf("IMX390_Config Error : max9296 config failed for camera # %d \n", chId);
        }
        Deserializer_ReadReg(pCreatePrms->i2cAddrSer[chId], 0x00, &value);
        printf("max96717F[ID]::0x00 - 0x%x\n",value);
    
        appLogWaitMsecs(500);
        status = max_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] >> 1, sensorCfg, sensor_cfg_script_len);
        }
        
        sensor_cfg_script_len = 10;
        if(NULL != sensorCfg)
        {
            regCnt = 0;
            regAddr  = sensorCfg[regCnt].nRegAddr;
            regValue = sensorCfg[regCnt].nRegValue;
            delayMilliSec = sensorCfg[regCnt].nDelay;
            while(regCnt<sensor_cfg_script_len)
            {
                printf("write IMX390 success!:regAddr 0x%x -- regValue 0x%x status = %d\n \n", regAddr, regValue, status);
                status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, regAddr, &regValue, 1u);
                if(delayMilliSec > 0)
                {
                   appLogWaitMsecs(delayMilliSec);
                }
                if (0 == status)
                {
                    printf("Read IMX390 success!:regAddr 0x%x -- regValue 0x%x\n \n", regAddr, regValue);
                }
                regCnt++;
                regAddr  = sensorCfg[regCnt].nRegAddr;
                regValue = sensorCfg[regCnt].nRegValue;
                delayMilliSec = sensorCfg[regCnt].nDelay;
            }
            appLogWaitMsecs(100);
    
        }
        else
        {
            printf("IMX390_StreamOn: IMX390 config script is NULL \n");
        }
        #endif
        #if 1
        status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x1, 1u);/*ACTIVE*/
        appLogWaitMsecs(100);
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_StreamOn flag:0x0100 - 0x%x\n", regValue);
        }
        #endif
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x02);//0x42
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x04);//0x84
        appLogWaitMsecs(100);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1dc, &value);
        printf("des [video lock]regAddr:0x1dc - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x1fc, &value);
        printf("des [video lock]regAddr:0x1fc - 0x%x\n",value);
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x21c, &value);
        printf("des [video lock]regAddr:0x21c - 0x%x\n",value);
        Deserializer_ReadReg(serI2cAddr, 0x55f, &value);
        printf("des [video lock]regAddr:0x55f - 0x%x\n",value);
        Deserializer_ReadReg(serI2cAddr, 0x112, &value);
        printf("max96717pclkdet:regAddr:0x112 - 0x%x\n",value);
        printf("read sensor+++++\n \n");
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0014, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_chip_id:0x0014 - 0x%x\n", regValue);
        }
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0016, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_chip_id:0x0016 - 0x%x\n", regValue);
        }
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x0018, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_chip_id:0x0018 - 0x%x\n", regValue);
        }
        status |= IMX390_ReadReg(i2cInstId, sensorI2cAddr >> 1, 0x001a, &regValue, 1u);
        if (status == 0)
        {
            printf("read IMX390_chip_id flag:0x001a - 0x%x\n", regValue);
        }
        printf("IMX390_StreamOn End--------------------- \n");
        return (status);
    }
    
    static int32_t IMX390_StreamOff(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint32_t cnt;
        uint8_t sensorI2cAddr;
        uint16_t regAddr;
        uint8_t regValue;
        uint16_t delayMilliSec;
        I2cParams *desCfg = NULL;
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    
        status |= IMX390_WriteReg(i2cInstId, sensorI2cAddr >> 1, 0x0100, 0x0, 1u);/*STANDBY*/
        appLogWaitMsecs(10);
    
        Deserializer_ReadReg(MAX9296_DES_ID >> 1, 0x13, &regValue);
        printf("des---link lock status: 0x%x\n",regValue);
    
      
        #if 1
        desCfg = imx390SensorRegConfigWdr.desCfgPreScript;
        if(NULL != desCfg)
        {
            cnt = 0;
            regAddr  = desCfg[0].nRegAddr;
    
            while(regAddr != 0xFFFF)
            {
                regAddr  = desCfg[cnt].nRegAddr;
                regValue = desCfg[cnt].nRegValue;
                delayMilliSec = desCfg[cnt].nDelay;
                status |= Deserializer_ReadReg(MAX9296_DES_ID >> 1, desCfg[cnt].nRegAddr, &regValue);   
                printf("read success![slaveAddr:0x%x] regAddr:0x%x, RegValue: 0x%x\n", MAX9296_DES_ID >> 1, desCfg[cnt].nRegAddr, regValue);
                cnt++;
                if(delayMilliSec > 0)
                {
                    appLogWaitMsecs(delayMilliSec);
                }
            }
        }
    
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x313, 0x40);
        status |= Deserializer_WriteReg(MAX9296_DES_ID >> 1, 0x330, 0x00);
        #endif
        return status;
    }
    
    static int32_t IMX390_PowerOn(uint32_t chId, void *pSensorHdl)
    {
        int32_t status = 0;
    
        sp1hGainRegValueOld[chId] = 0;
        redGain_prev[chId] = greenGain_prev[chId] = blueGain_prev[chId] = 512;
    
        printf("IMX390_PowerOn : chId = 0x%x \n", chId);
    
        return status;
    }
    
    static int32_t IMX390_PowerOff(uint32_t chId, void *pSensorHdl)
    {
        return (0);
    }
    
    static int32_t IMX390_SetAeParams(void *pSensorHdl, uint32_t chId, IssSensor_ExposureParams *pExpPrms)
    {
        #if 0
        uint16_t regAddr;
        uint16_t cnt;
        uint8_t regValue;
        int32_t status = -1;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
        uint32_t i2cInstId;
        uint8_t sensorI2cAddr;
        uint32_t sp1h_again = 0U;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
    
        i2cInstId = pCreatePrms->i2cInstId;
        sensorI2cAddr = pCreatePrms->i2cAddrSensor[chId];
    
        /* Exp time is fixed to 11ms for LFM. Set Analog Gain Only */
    
        for (cnt = 0; cnt < ISS_IMX390_GAIN_TBL_SIZE; cnt ++)
        {
            if (pExpPrms->analogGain[ISS_SENSOR_EXPOSURE_LONG] <= gIMX390GainsTable[cnt][0])
            {
                sp1h_again = gIMX390GainsTable[cnt][1];
                break;
            }
        }
    
        if(sp1hGainRegValueOld[chId] == sp1h_again)
        {
            /*Reduce I2C transactions.
            Do not write to the sensor if register value does not change */
            return 0;
        }
        sp1hGainRegValueOld[chId] = sp1h_again;
    
        regAddr = 0x0008;
        regValue = 1;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR;
        regValue = sp1h_again & 0xFF;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = IMX390_SP1H_ANALOG_GAIN_CONTROL_REG_ADDR_HIGH;
        regValue = sp1h_again >> 8;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    
        regAddr = 0x0008;
        regValue = 0;
        status = IMX390_WriteReg(i2cInstId, sensorI2cAddr, regAddr, regValue, 1u);
        if(status != 0)
        {
            printf("Error writing 0x%x to IMX390 register 0x%x \n", regValue, regAddr);
        }
    #endif
        return (0);
    }
    
    static int32_t IMX390_GetDccParams(uint32_t chId, void *pSensorHdl, IssSensor_DccParams *pDccPrms)
    {
        int32_t status = 0;
        return (status);
    }
    
    static int32_t IMX390_GetExpParams(uint32_t chId, void *pSensorHdl, IssSensor_ExposureParams *pExpPrms)
    {
        int32_t status = 0;
    
        assert(NULL != pExpPrms);
        pExpPrms->expRatio = ISS_SENSOR_IMX390_DEFAULT_EXP_RATIO;
    
        return (status);
    }
    
    static void IMX390_InitAewbConfig(uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static void IMX390_GetIspConfig (uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static void IMX390_deinit (uint32_t chId, void *pSensorHdl)
    {
        return;
    }
    
    static int32_t IMX390_ReadWriteReg (uint32_t chId, void *pSensorHdl, uint32_t readWriteFlag, I2cParams *pReg)
    {
        int32_t status = 0;
    
        uint16_t regValue = 0;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
    
        assert(NULL != pReg);
    
        if (1u == readWriteFlag)
        {
            /*write*/
            regValue = pReg->nRegValue;
            status = IMX390_WriteReg(pCreatePrms->i2cInstId,
                pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, regValue, 1u);
        }
        else
        {
            /*read*/
            status = IMX390_ReadReg(pCreatePrms->i2cInstId,
                pCreatePrms->i2cAddrSensor[chId], pReg->nRegAddr, &regValue, 1u);
    
            if (0 == status)
            {
                pReg->nRegValue = regValue;
            }
        }
        return (status);
    }
    
    static int32_t IMX390_ReadReg(uint8_t     i2cInstId,
                                uint8_t         i2cAddr,
                                uint16_t        regAddr,
                                uint16_t         *regVal,
                                uint32_t        numRegs)
    {
        int32_t  status = -1;
        I2C_Handle sensorI2cHandle = NULL;
        static uint8_t sensorI2cByteOrder = 0U;
        uint8_t   readReg8_High = 0xAB;
        uint8_t   readReg8_Low = 0xCD;
        uint32_t count;
        getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
        if(NULL == sensorI2cHandle)
        {
            printf("Sensor I2C Handle is NULL \n");
            return -1;
        }
        for(count = 0;count<numRegs;count++)
        {
            status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr, &readReg8_High, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
            if(status == 0 )
        {
                status = Board_i2c16BitRegRd(sensorI2cHandle, i2cAddr, regAddr+1, &readReg8_Low, 1U, sensorI2cByteOrder, SENSOR_I2C_TIMEOUT);
            }
        }
        *regVal = ((readReg8_High << 8) & 0xFF00) | readReg8_Low;
        return (status);
    }
    
    static int32_t IMX390_WriteReg(uint8_t    i2cInstId,
                                 uint8_t       i2cAddr,
                                 uint16_t         regAddr,
                                 uint16_t          regVal,
                                 uint32_t      numRegs)
    {
        int32_t  status = 0;
        int16_t  ret = 0;
        I2C_Handle sensorI2cHandle = NULL;
        static uint8_t sensorI2cByteOrder = 255u;
        getIssSensorI2cInfo(&sensorI2cByteOrder, &sensorI2cHandle);
        uint8_t   rawRegVal[4];
        I2C_Transaction transaction;
        #if defined (MCU_PLUS_SDK)
        I2C_Transaction_init(&transaction);
        #else
        I2C_transactionInit(&transaction);
        #endif
        if(NULL == sensorI2cHandle)
        {
            printf("Sensor I2C Handle is NULL \n");
            return -1;
        }
    
        transaction.slaveAddress = i2cAddr;
        transaction.writeBuf     = rawRegVal;
        transaction.writeCount   = 4;
        transaction.readBuf      = NULL;
        transaction.readCount    = 0;
        {
              rawRegVal[0U] = (uint8_t) ((regAddr >> 8U) & (uint8_t) 0xFF);
              rawRegVal[1U] = (uint8_t) ((regAddr >> 0U) & (uint8_t) 0xFF);
              rawRegVal[2U] = (uint8_t) ((regVal >> 8U) & (uint8_t) 0xFF);
              rawRegVal[3U] = (uint8_t) ((regVal >> 0U) & (uint8_t) 0xFF);
              ret = I2C_transfer(sensorI2cHandle, &transaction); 
              if(ret != I2C_STS_SUCCESS)
              {
                    printf("IMX390_WriteReg : Error writing to register 0x%x \n ", regAddr);
                    status = -1;
              }
        }
    
        return (status);
    }
    
    static int32_t IMX390_GetExpPrgFxn(uint32_t chId, void *pSensorHdl, IssAeDynamicParams *p_ae_dynPrms)
    {
        int32_t status = 0;
        uint8_t count = 0;
    
        p_ae_dynPrms->targetBrightnessRange.min = DEFAULT_TARGET_BRIGHTNESS_MIN;
        p_ae_dynPrms->targetBrightnessRange.max = DEFAULT_TARGET_BRIGHTNESS_MAX;
        p_ae_dynPrms->targetBrightness = DEFAULT_TARGET_BRIGHTNESS;
        p_ae_dynPrms->threshold = DEFAULT_TARGET_THRESHOLD;
        p_ae_dynPrms->exposureTimeStepSize = DEFAULT_EXPOSURE_TIME;
        p_ae_dynPrms->enableBlc = DEFAULT_ENABLE_BLC;
    
        p_ae_dynPrms->exposureTimeRange[count].min = 11000;
        p_ae_dynPrms->exposureTimeRange[count].max = 11000;
        p_ae_dynPrms->analogGainRange[count].min = 1024;
        p_ae_dynPrms->analogGainRange[count].max = 8192;
        p_ae_dynPrms->digitalGainRange[count].min = 256;
        p_ae_dynPrms->digitalGainRange[count].max = 256;
        count++;
    
        p_ae_dynPrms->numAeDynParams = count;
        return (status);
    }
    
    static int32_t IMX390_GetWBPrgFxn(uint32_t chId, void *pSensorHdl, IssAwbDynamicParams *p_awb_dynPrms)
    {
        int32_t  status = 0;
    
        p_awb_dynPrms->redGainRange.min = 512;
        p_awb_dynPrms->redGainRange.max = 2048;
    
        p_awb_dynPrms->greenGainRange.min = 512;
        p_awb_dynPrms->greenGainRange.max = 2048;
    
        p_awb_dynPrms->blueGainRange.min = 512;
        p_awb_dynPrms->blueGainRange.max = 2048;
    
        p_awb_dynPrms->sensor_pre_gain = 0;
    
        printf("IMX390_GetWBPrgFxn: sensor_pre_gain = %d \n", p_awb_dynPrms->sensor_pre_gain);
        return (status);
    }
    
    static int32_t IMX390_SetAwbParams(void *pSensorHdl, uint32_t chId, IssSensor_WhiteBalanceParams *pWbPrms)
    {
        #if 0
        int32_t status = 0;
        uint16_t regAddr;
        uint16_t regValue;
        IssSensors_Handle * pSenHandle = (IssSensors_Handle*)pSensorHdl;
        IssSensor_CreateParams * pCreatePrms;
    
        assert(NULL != pSenHandle);
        pCreatePrms = pSenHandle->createPrms;
        assert(NULL != pCreatePrms);
        assert(NULL != pWbPrms);
    
        if(redGain_prev[chId] != pWbPrms->rGain[0])
        {
            redGain_prev[chId] = pWbPrms->rGain[0];
            regAddr = IMX390_RED_GAIN_REG_L;
            regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_RED_GAIN_REG_H;
            regValue = (pWbPrms->rGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        if(greenGain_prev[chId] != pWbPrms->gGain[0])
        {
            greenGain_prev[chId] = pWbPrms->gGain[0];
            regAddr = IMX390_GREEN1_GAIN_REG_L;
            regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_GREEN2_GAIN_REG_L;
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
    
            regAddr = IMX390_GREEN1_GAIN_REG_H;
            regValue = (pWbPrms->gGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_GREEN2_GAIN_REG_H;
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
    
        if(blueGain_prev[chId] != pWbPrms->bGain[0])
        {
            blueGain_prev[chId] = pWbPrms->bGain[0];
            regAddr = IMX390_BLUE_GAIN_REG_L;
            regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) & 0xff ;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
            regAddr = IMX390_BLUE_GAIN_REG_H;
            regValue = (pWbPrms->bGain[0]>>IMX390_ISP_GAIN_OFFSET) >> 8;/*Sensor gain is Q8, ISP gain is Q10*/
            status |= IMX390_WriteReg(pCreatePrms->i2cInstId, pCreatePrms->i2cAddrSensor[chId], regAddr, regValue, 1u);
        }
        #endif
        return (0);
    }