Exemplo n.º 1
0
inline static int mt_eis_register_char_driver(void)
{
    int ret = 0;

    EIS_LOG("[mt_eis_register_char_driver] \n");

    if ( (ret = alloc_chrdev_region(&dev_eis, 0, 1, EIS_DEV_NAME)) < 0 ) {
        EIS_ERR("alloc_chrdev_region failed, %d \n", ret);
        return ret;
    }
    //Allocate driver
    pcdev_eis = cdev_alloc();
    if (pcdev_eis == NULL) {
        EIS_ERR("cdev_alloc failed\n");
        ret = -ENOMEM;
        goto mt_eis_register_char_driver_exit;
    }
    //Attatch file operation.
    cdev_init(pcdev_eis, &mt_eis_fops);

    pcdev_eis->owner = THIS_MODULE;
    //Add to system
    if ( (ret = cdev_add(pcdev_eis, dev_eis, 1)) < 0) {
        EIS_ERR("Attatch file operation failed, %d \n", ret);
        goto mt_eis_register_char_driver_exit;
    }

mt_eis_register_char_driver_exit:

    if (ret < 0) {
        mt_eis_unregister_char_driver();
    }

    return ret;
}
Exemplo n.º 2
0
MINT32 EisHal::destroyMemBuf(MUINT32 bufCnt, IMEM_BUF_INFO *bufInfo)
{
    EIS_LOG("Cnt(%d)", bufCnt);

    MINT32 err = EIS_RETURN_NO_ERROR;

    if(bufCnt > 1)  // more than one
    {
        for(MUINT32 i = 0; i < bufCnt; ++i)
        {
            if(0 == bufInfo[i].virtAddr)
            {
                EIS_LOG("Buffer doesn't exist, i(%d)",i);
                continue;
            }

            if(m_pIMemDrv->unmapPhyAddr(&bufInfo[i]) < 0)
            {
                EIS_ERR("m_pIMemDrv->unmapPhyAddr() error, i(%d)",i);
                err = EIS_RETURN_API_FAIL;
            }

            if (m_pIMemDrv->freeVirtBuf(&bufInfo[i]) < 0)
            {
                EIS_ERR("m_pIMemDrv->freeVirtBuf() error, i(%d)",i);
                err = EIS_RETURN_API_FAIL;
            }
        }
    }
    else
    {
        if(0 == bufInfo->virtAddr)
        {
            EIS_LOG("Buffer doesn't exist");
        }

        if(m_pIMemDrv->unmapPhyAddr(bufInfo) < 0)
        {
            EIS_ERR("m_pIMemDrv->unmapPhyAddr() error");
            err = EIS_RETURN_API_FAIL;
        }

        if (m_pIMemDrv->freeVirtBuf(bufInfo) < 0)
        {
            EIS_ERR("m_pIMemDrv->freeVirtBuf() error");
            err = EIS_RETURN_API_FAIL;
        }
    }

    EIS_LOG("X");
    return err;
}
Exemplo n.º 3
0
MINT32 EisHal::createMemBuf(MUINT32 &memSize, MUINT32 bufCnt, IMEM_BUF_INFO *bufInfo)
{
    MINT32 err = EIS_RETURN_NO_ERROR;
    MUINT32 alingSize = (memSize + L1_CACHE_BYTES - 1) & ~(L1_CACHE_BYTES - 1);

    EIS_LOG("Cnt(%d),Size(%u),alingSize(%u)",bufCnt, memSize, alingSize);

    memSize = alingSize;

    if(bufCnt > 1)  // more than one
    {
        for(MUINT32 i = 0; i < bufCnt; ++i)
        {
            bufInfo[i].size = alingSize;

            if(m_pIMemDrv->allocVirtBuf(&bufInfo[i]) < 0)
            {
                EIS_ERR("m_pIMemDrv->allocVirtBuf() error, i(%d)",i);
                err = EIS_RETURN_API_FAIL;
            }

            if(m_pIMemDrv->mapPhyAddr(&bufInfo[i]) < 0)
            {
                EIS_ERR("m_pIMemDrv->mapPhyAddr() error, i(%d)",i);
                err = EIS_RETURN_API_FAIL;
            }
        }
    }
    else
    {
        bufInfo->size = alingSize;

        if(m_pIMemDrv->allocVirtBuf(bufInfo) < 0)
        {
            EIS_ERR("m_pIMemDrv->allocVirtBuf() error");
            err = EIS_RETURN_API_FAIL;
        }

        if(m_pIMemDrv->mapPhyAddr(bufInfo) < 0)
        {
            EIS_ERR("m_pIMemDrv->mapPhyAddr() error");
            err = EIS_RETURN_API_FAIL;
        }
    }

    EIS_LOG("X");
    return err;
}
Exemplo n.º 4
0
static int mt_eis_dump_reg(__user mt_eis_reg_t *preg_io)
{
    int ret = 0;
    mt_eis_reg_t reg;
    int i;

    spin_lock_irq(&eis_lock);
    
    for (i = 0; i < 11; i++) {
        reg.val[i] = ioread32(EIS_BASE + 4 * i);
    }

    reg.val[11] = CRZ_BASE + 0x10;            // CRZ source size
    reg.val[12] = ioread32(CRZ_BASE + 0x10);
    reg.val[13] = CRZ_BASE + 0x14;            // CRZ target size
    reg.val[14] = ioread32(CRZ_BASE + 0x14);
    reg.val[15] = 0x12345678;
    reg.val[16] = 0;
    reg.val[17] = 0x12345678;
    reg.val[18] = 0;
    reg.val[19] = 0x12345678;
    reg.val[20] = 0; 

    if (copy_to_user(preg_io, &reg, sizeof(mt_eis_reg_t)) != 0) {
        EIS_ERR("copy_to_user failed \n");
        ret = -1;
    }

    spin_unlock_irq(&eis_lock);
        
    return ret;
}
Exemplo n.º 5
0
static int mt_eis_probe(struct platform_device *pdev)
{
    int ret = 0;
    struct resource *pres = NULL;
    int i;

    EIS_LOG("[mt_eis_probe] enter \n");
    
    // Check platform_device parameters
    if (pdev == NULL) {
        dev_err(&pdev->dev, "pdev is NULL \n");
        return -ENXIO;
    }
    // Register char driver
    if ( (ret = mt_eis_register_char_driver()) ) {
        dev_err(&pdev->dev, "register char failed \n");
        return ret;
    }
    // Mapping CAM_REGISTERS
    for (i = 0; i < 1; i++) {
        pres = platform_get_resource(pdev, IORESOURCE_MEM, i);
        if (pres == NULL) {
            dev_err(&pdev->dev, "platform_get_resource failed \n");
            ret = -ENOMEM;
            goto mt_eis_probe_exit;
        }
        pres = request_mem_region(pres->start, pres->end - pres->start + 1, pdev->name);
        if (pres == NULL) {
            dev_err(&pdev->dev, "request_mem_region failed \n");
            ret = -ENOMEM;
            goto mt_eis_probe_exit;
        }
    }

    // Create class register
    pclass_eis = class_create(THIS_MODULE, "eisdrv");
    if (IS_ERR(pclass_eis)) {
        ret = PTR_ERR(pclass_eis);
        EIS_ERR("Unable to create class, err = %d\n", ret);
        return ret;
    }
    // FIXME: error handling
    device_create(pclass_eis, NULL, dev_eis, NULL, EIS_DEV_NAME);
    // Initialize critical section
    spin_lock_init(&eis_lock);

mt_eis_probe_exit:

    if (ret < 0) {
        mt_eis_unregister_char_driver();
    }

    EIS_LOG("[mt_eis_probe] exit \n");

    return ret;
}
Exemplo n.º 6
0
static int __init mt_eis_init(void)
{
    int ret = 0;
    struct proc_dir_entry *prEntry;

    //EIS_LOG("[mt_eis_init] \n");

    if ((ret = platform_driver_register(&eis_driver)) < 0) {
        EIS_ERR("platform_driver_register fail \n");
        return ret;
    }

    prEntry = create_proc_entry("driver/eis_reg", 0, NULL); 
    if (prEntry) {
        prEntry->read_proc = mt_eis_dump_reg_to_proc; 
        prEntry->write_proc = mt_eis_reg_debug; 
    }
    else {
        EIS_ERR("add /proc/driver/eis_reg entry fail \n");  
    }

    return ret;
}
Exemplo n.º 7
0
static long mt_eis_ioctl(struct file *file,
                        unsigned int cmd, unsigned long arg)
{
    long ret = 0;

    switch (cmd) {

    case MT_EIS_IOC_T_DUMP_REG:
        ret = mt_eis_dump_reg((__user mt_eis_reg_t *) arg);
        break;

    case MT_EIS_IOC_T_CLK_ONOFF:
        ret = mt_eis_clk_onoff(arg);
        break;
        
    default:
        EIS_ERR("[mt_eis_ioctl] unknown cmd \n");
        ret = -EPERM;
        break;
    }

    return ret;
}
Exemplo n.º 8
0
MVOID EisHal::getEISResult(MUINT32 &a_CMV_X_Int,
                               MUINT32 &a_CMV_X_Flt,
                               MUINT32 &a_CMV_Y_Int,
                               MUINT32 &a_CMV_Y_Flt,
                               MUINT32 &a_TarWidth,
                               MUINT32 &a_TarHeight)
{

    EIS_LOG("mCMV_X(%d),mCMV_Y(%d)",mCMV_X,mCMV_Y);

    a_TarWidth  = mTarget_W;
    a_TarHeight = mTarget_H;

    if(mConfigPass == MTRUE)
    {
        //====== Boundary Checking ======

        if(mCMV_X < 0)
        {
            EIS_ERR("mCMV_X should not be negative(%u), fix to 0",mCMV_X);

            mCMV_X = 0;
            a_CMV_X_Int = a_CMV_X_Flt = 0;
        }
        else
        {
            MFLOAT tempCMV_X = mCMV_X / 256.0;
            if((tempCMV_X + (MFLOAT)mTarget_W) > (MFLOAT)mInput_W)
            {
                EIS_ERR("mCMV_X too large(%u), fix to %u",mCMV_X,(mInput_W - mTarget_W));

                mCMV_X = (mInput_W - mTarget_W);
            }

            a_CMV_X_Int = (mCMV_X & (~0xFF)) >> intPartShift;
            a_CMV_X_Flt = (mCMV_X & (0xFF)) << floatPartShift;
        }

        if(mCMV_Y < 0)
        {
            EIS_ERR("mCMV_Y should not be negative(%u), fix to 0",mCMV_Y);

            mCMV_Y = 0;
            a_CMV_Y_Int = a_CMV_Y_Flt = 0;
        }
        else
        {
            MFLOAT tempCMV_Y = mCMV_Y / 256.0;
            if((tempCMV_Y + (MFLOAT)mTarget_H) > (MFLOAT)mInput_H)
            {
                EIS_ERR("mCMV_X too large(%u), fix to %u",mCMV_X,(mInput_H - mTarget_H));

                mCMV_X = (mInput_H - mTarget_H);
            }

            a_CMV_Y_Int = (mCMV_Y & (~0xFF)) >> intPartShift;
            a_CMV_Y_Flt = (mCMV_Y & (0xFF)) << floatPartShift;
        }

        EIS_LOG("X_Int(%u),X_Flt(%u),Y_Int(%u),Y_Flt(%u)",a_CMV_X_Int,
                                                          a_CMV_X_Flt,
                                                          a_CMV_Y_Int,
                                                          a_CMV_Y_Flt);
    }
    else
    {
Exemplo n.º 9
0
MINT32 EisHal::doEIS()
{
    if(mConfigPass == MTRUE)
    {
        MINT32 err = EIS_RETURN_NO_ERROR;

        EIS_SET_PROC_INFO_STRUCT sEIS_AlgSetInfo;
        EIS_RESULT_INFO_STRUCT   sEIS_Result;

        char value[PROPERTY_VALUE_MAX] = {'\0'};
        property_get("debug.eis.dump", value, "0");
        g_debugDump = atoi(value);

        if(g_debugDump >= 1)
        {
            EIS_LOG("+");
        }

        //====== Get Statistic from EIS Driver ======

        sEIS_AlgSetInfo.eis_image_size_config.InputWidth   = mInput_W;
        sEIS_AlgSetInfo.eis_image_size_config.InputHeight  = mInput_H;
        sEIS_AlgSetInfo.eis_image_size_config.TargetWidth  = mTarget_W;
        sEIS_AlgSetInfo.eis_image_size_config.TargetHeight = mTarget_H;

        getEISStatistic(&sEIS_AlgSetInfo.eis_state);

        if(g_debugDump >= 1)
        {
            dumpStatistic(sEIS_AlgSetInfo.eis_state);
        }

        //====== EIS Algorithm Calculate CMV ======

        err = m_pEisAlg->EisFeatureCtrl(EIS_FEATURE_SET_PROC_INFO, &sEIS_AlgSetInfo, NULL);
        if(err != S_EIS_OK)
        {
            EIS_ERR("EisFeatureCtrl(EIS_FEATURE_SET_PROC_INFO) fail(0x%x)",err);
            err = EIS_RETURN_API_FAIL;
            return err;
        }

        err = m_pEisAlg->EisMain(&sEIS_Result);
        if(err != S_EIS_OK)
        {
            EIS_ERR("EisMain fail(0x%x)",err);
            err = EIS_RETURN_API_FAIL;
            return err;
        }

        //====== Get GMV ======

        EIS_GMV_INFO_STRUCT eisGMVInfo;
        err = m_pEisAlg->EisFeatureCtrl(EIS_FEATURE_GET_ORI_GMV, NULL, &eisGMVInfo);

        if(err != S_EIS_OK)
        {
            EIS_ERR("EisFeatureCtrl(EIS_FEATURE_GET_ORI_GMV) fail(0x%x)",err);
            err = EIS_RETURN_API_FAIL;
            return err;
        }

        //====== Save EIS CMV and GMV =======

        mCMV_X = sEIS_Result.CMV_X;
        mCMV_Y = sEIS_Result.CMV_Y;

        mGMV_X = eisGMVInfo.EIS_GMVx;
        mGMV_Y = eisGMVInfo.EIS_GMVy;

        //====== Not The First Frame ======

        if(mFirstFlag == 0)
        {
            EIS_LOG("not first frame");
            m_pEisDrv->setFirstFrame(MFALSE);
            mFirstFlag = 1;
        }

        //====== Debug ======

        if(g_debugDump >= 1 && mFirstFlag < 3)
        {
            m_pEisDrv->dumpReg();
            ++mFirstFlag;
        }

        if(g_debugDump >= 1)
        {
            EIS_LOG("-");
        }
    }
    else
    {
        EIS_LOG("EIS config fail, do nothing");
    }

    return EIS_RETURN_NO_ERROR;
}
Exemplo n.º 10
0
MVOID EisHal::configEIS(NSHwScenario::EhwMode a_ehwMode, eisHal_config_t a_sEisConfig)
{
    EIS_LOG("HW_Sce(%d)",(MINT32)a_ehwMode);

    MINT32 err = 0;

    EIS_GET_PROC_INFO_STRUCT  eisHWSetting;
    EIS_SET_ENV_INFO_STRUCT   eisAlgoInit;
    EIS_CONFIG_IMAGE_INFO_STRUCT eisImageSize;

    //====== Member Variable Setting ======

    mConfigPass = MFALSE;

    //====== Dynamic Debug ======

    char value[PROPERTY_VALUE_MAX] = {'\0'};
    property_get("debug.eis.dump", value, "0");
    g_debugDump = atoi(value);

    //====== EIS Register Setting ======

    //member variable setting
    mInput_W = a_sEisConfig.imageWidth;
    mInput_H = a_sEisConfig.imageHeight;

    mTarget_W = (mInput_W / (EIS_FACTOR / 100.0));
    mTarget_H = (mInput_H / (EIS_FACTOR / 100.0));

    EIS_LOG("mInput_W(%u),mInput_H(%u),mTarget_W(%u),mTarget_H(%u)",mInput_W,mInput_H,mTarget_W,mTarget_H);

    if(a_ehwMode == NSHwScenario::eHW_VSS)
    {
        eisAlgoInit.Eis_Input_Path = EIS_PATH_RAW_DOMAIN;

        //RAW domain only setting
        m_pEisDrv->setEIS_DB_SEL(1);
        m_pEisDrv->setEISRawSel(1);
    }
    else if(a_ehwMode == NSHwScenario::eHW_ZSD)
    {
        eisAlgoInit.Eis_Input_Path = EIS_PATH_YUV_DOMAIN;

        //YUV domain only setting
        m_pEisDrv->setEIS_DB_SEL(0);
        m_pEisDrv->setEISRawSel(0);
    }
    else
    {
        EIS_LOG("not support right now, use VSS");

        eisAlgoInit.Eis_Input_Path = EIS_PATH_RAW_DOMAIN;

        //RAW domain only setting
        m_pEisDrv->setEIS_DB_SEL(1);
        m_pEisDrv->setEISRawSel(1);
    }

    // get customize setting
    getEISCustomize(&eisAlgoInit.eis_tuning_data);

    // set image size info
    eisImageSize.InputWidth   = mInput_W - 4;   //@ryan wang: sync eis parameters in middleware and algorithm to avoid "wrong boundry" issue
    eisImageSize.InputHeight  = mInput_H - 4;   //@ryan wang: sync eis parameters in middleware and algorithm to avoid "wrong boundry" issue
    eisImageSize.TargetWidth  = mTarget_W;
    eisImageSize.TargetHeight = mTarget_H;

    // init EIS algo
    err = m_pEisAlg->EisInit(&eisAlgoInit);
    if(err != S_EIS_OK)
    {
        EIS_ERR("EisInit fail(0x%x)",err);
        return;
    }

    // query setting from EIS algorithm
    err = m_pEisAlg->EisFeatureCtrl(EIS_FEATURE_GET_PROC_INFO, &eisImageSize, &eisHWSetting);
    if(err != S_EIS_OK)
    {
        EIS_ERR("EisFeatureCtrl(EIS_FEATURE_GET_PROC_INFO) fail(0x%x)",err);
        return;
    }

    if(g_debugDump >= 1)
    {
        EIS_LOG("Algo eis_tuning_data");
        EIS_LOG("sensitivity(%d)",eisAlgoInit.eis_tuning_data.sensitivity);
        EIS_LOG("filter_small_motion(%u)",eisAlgoInit.eis_tuning_data.filter_small_motion);
        EIS_LOG("advtuning_data.new_tru_th(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.new_tru_th);
        EIS_LOG("advtuning_data.vot_th(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.vot_th);
        EIS_LOG("advtuning_data.votb_enlarge_size(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.votb_enlarge_size);
        EIS_LOG("advtuning_data.min_s_th(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.min_s_th);
        EIS_LOG("advtuning_data.vec_th(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.vec_th);
        EIS_LOG("advtuning_data.spr_offset(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.spr_offset);
        EIS_LOG("advtuning_data.spr_gain1(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.spr_gain1);
        EIS_LOG("advtuning_data.spr_gain2(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.spr_gain2);
        EIS_LOG("advtuning_data.vot_his_method(%d)",eisAlgoInit.eis_tuning_data.advtuning_data.vot_his_method);
        EIS_LOG("advtuning_data.smooth_his_step(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.smooth_his_step);
        EIS_LOG("advtuning_data.eis_debug(%u)",eisAlgoInit.eis_tuning_data.advtuning_data.eis_debug);

        for(MINT32 i = 0; i < 4; ++i)
        {
            EIS_LOG("gmv_pan_array[%d]=%u",i,eisAlgoInit.eis_tuning_data.advtuning_data.gmv_pan_array[i]);
            EIS_LOG("gmv_sm_array[%d]=%u",i,eisAlgoInit.eis_tuning_data.advtuning_data.gmv_sm_array[i]);
            EIS_LOG("cmv_pan_array[%d]=%u",i,eisAlgoInit.eis_tuning_data.advtuning_data.cmv_pan_array[i]);
            EIS_LOG("cmv_sm_array[%d]=%u",i,eisAlgoInit.eis_tuning_data.advtuning_data.cmv_sm_array[i]);
        }

        EIS_LOG("Algo eisHWSetting");
        EIS_LOG("pathCDRZ(0x%x)",eisHWSetting.pathCDRZ);
        EIS_LOG("IIR_DS(0x%x)",eisHWSetting.IIR_DS);
        EIS_LOG("MBNum_H(0x%x),MBNum_V(0x%x)",eisHWSetting.MBNum_H, eisHWSetting.MBNum_V);
        EIS_LOG("RPNum_H(0x%x),RPNum_V(0x%x)",eisHWSetting.RPNum_H,eisHWSetting.RPNum_V);
        EIS_LOG("AD_Knee(0x%x),AD_Clip(0x%x)",eisHWSetting.AD_Knee, eisHWSetting.AD_Clip);
        EIS_LOG("Gain_H(0x%x),IIR_Gain_H(0x%x),FIR_Gain_H(0x%x)",eisHWSetting.Gain_H, eisHWSetting.IIR_Gain_H, eisHWSetting.FIR_Gain_H);
        EIS_LOG("IIR_Gain_V(0x%x)",eisHWSetting.IIR_Gain_V);
        EIS_LOG("LMV_TH_X_Cent(0x%x),LMV_TH_X_Surrd(0x%x),LMV_TH_Y_Cent(0x%x),LMV_TH_Y_Surrd(0x%x)",eisHWSetting.LMV_TH_X_Cent,eisHWSetting.LMV_TH_X_Surrd,eisHWSetting.LMV_TH_Y_Cent,eisHWSetting.LMV_TH_Y_Surrd);
        EIS_LOG("FL_Offset_H(0x%x),FL_Offset_V(0x%x)",eisHWSetting.FL_Offset_H, eisHWSetting.FL_Offset_V);
        EIS_LOG("MB_Offset_H(0x%x),MB_Offset_V(0x%x)",eisHWSetting.MB_Offset_H,eisHWSetting.MB_Offset_V);
        EIS_LOG("MB_Intv_H(0x%x),MB_Intv_V(0x%x)",eisHWSetting.MB_Intv_H,eisHWSetting.MB_Intv_V);
    }

    // HW setting
    if(mFirstFlag == 0)
    {
        EIS_LOG("first frame");
        m_pEisDrv->setFirstFrame(MTRUE);
    }

    m_pEisDrv->enableEIS(MTRUE);
    m_pEisDrv->setWRPEnable(MTRUE);                 // enable write RP function

    //m_pEisDrv->setEISSel(eisHWSetting.pathCDRZ);    //YUV domain only setting
    m_pEisDrv->setEISSel(1);    //always after CDRZ. modified for ZSDNCC

    m_pEisDrv->setEISImage(mInput_W,mInput_H);
    m_pEisDrv->setEISFilterDS(eisHWSetting.IIR_DS);
    m_pEisDrv->setMBNum(eisHWSetting.MBNum_H, eisHWSetting.MBNum_V);
    m_pEisDrv->setRPNum(eisHWSetting.RPNum_H,eisHWSetting.RPNum_V);
    m_pEisDrv->setADKneeClip(eisHWSetting.AD_Knee, eisHWSetting.AD_Clip);
    m_pEisDrv->setFilter_H(eisHWSetting.Gain_H, eisHWSetting.IIR_Gain_H, eisHWSetting.FIR_Gain_H);
    m_pEisDrv->setFilter_V(eisHWSetting.IIR_Gain_V);
    m_pEisDrv->setLMV_TH(eisHWSetting.LMV_TH_X_Cent,eisHWSetting.LMV_TH_X_Surrd,eisHWSetting.LMV_TH_Y_Cent,eisHWSetting.LMV_TH_Y_Surrd);
    m_pEisDrv->setFLOffset(eisHWSetting.FL_Offset_H, eisHWSetting.FL_Offset_V);
    m_pEisDrv->setMBOffset_H(eisHWSetting.MB_Offset_H);
    m_pEisDrv->setMBOffset_V(eisHWSetting.MB_Offset_V);
    m_pEisDrv->setMBInterval_H(eisHWSetting.MB_Intv_H);
    m_pEisDrv->setMBInterval_V(eisHWSetting.MB_Intv_V);

    err = m_pEisDrv->configStatus();
    if(err != EIS_RETURN_NO_ERROR)
    {
        EIS_ERR("EIS_Drv register setting fail(%d)",err);
        EIS_LOG("*** Do again ***");

        m_pEisDrv->resetConfigStatus();

        if(a_ehwMode == NSHwScenario::eHW_VSS)
        {
            //RAW domain only setting
            m_pEisDrv->setEIS_DB_SEL(1);
            m_pEisDrv->setEISRawSel(1);
        }
        else if(a_ehwMode == NSHwScenario::eHW_ZSD)
        {
            //YUV domain only setting
            m_pEisDrv->setEIS_DB_SEL(0);
            m_pEisDrv->setEISRawSel(0);
        }
        else
        {
            EIS_LOG("not support right now, use VSS");

            //RAW domain only setting
            m_pEisDrv->setEIS_DB_SEL(1);
            m_pEisDrv->setEISRawSel(1);
        }

        // HW setting
        if(mFirstFlag == 0)
        {
            EIS_LOG("first frame");
            m_pEisDrv->setFirstFrame(MTRUE);
        }

        m_pEisDrv->enableEIS(MTRUE);
        m_pEisDrv->setWRPEnable(MTRUE);                 // enable write RP function

        //m_pEisDrv->setEISSel(eisHWSetting.pathCDRZ);    //YUV domain only setting
        m_pEisDrv->setEISSel(1);    //always after CDRZ. modified for ZSDNCC

        m_pEisDrv->setEISImage(mInput_W,mInput_H);
        m_pEisDrv->setEISFilterDS(eisHWSetting.IIR_DS);
        m_pEisDrv->setMBNum(eisHWSetting.MBNum_H, eisHWSetting.MBNum_V);
        m_pEisDrv->setRPNum(eisHWSetting.RPNum_H,eisHWSetting.RPNum_V);
        m_pEisDrv->setADKneeClip(eisHWSetting.AD_Knee, eisHWSetting.AD_Clip);
        m_pEisDrv->setFilter_H(eisHWSetting.Gain_H, eisHWSetting.IIR_Gain_H, eisHWSetting.FIR_Gain_H);
        m_pEisDrv->setFilter_V(eisHWSetting.IIR_Gain_V);
        m_pEisDrv->setLMV_TH(eisHWSetting.LMV_TH_X_Cent,eisHWSetting.LMV_TH_X_Surrd,eisHWSetting.LMV_TH_Y_Cent,eisHWSetting.LMV_TH_Y_Surrd);
        m_pEisDrv->setFLOffset(eisHWSetting.FL_Offset_H, eisHWSetting.FL_Offset_V);
        m_pEisDrv->setMBOffset_H(eisHWSetting.MB_Offset_H);
        m_pEisDrv->setMBOffset_V(eisHWSetting.MB_Offset_V);
        m_pEisDrv->setMBInterval_H(eisHWSetting.MB_Intv_H);
        m_pEisDrv->setMBInterval_V(eisHWSetting.MB_Intv_V);

        err = m_pEisDrv->configStatus();
        if(err != EIS_RETURN_NO_ERROR)
        {
            mConfigPass = MFALSE;
        }
        else
        {
            mConfigPass = MTRUE;
        }
    }
    else
    {
        mConfigPass = MTRUE;
    }

    if(g_debugDump >= 1)
    {
        m_pEisDrv->dumpReg();
    }

    EIS_LOG("-");
}
Exemplo n.º 11
0
MINT32 EisHal::uninit()
{
    EIS_LOG("mUsers(%d)", mUsers);

    Mutex::Autolock lock(mLock);

    //====== Check Reference Count ======

    if(mUsers <= 0)
    {
        EIS_LOG("There is no more user");
        return EIS_RETURN_NO_ERROR;
    }

    //====== Uninitialize ======

    android_atomic_dec(&mUsers);    //decrease referebce count

    if(mUsers == 0)    // there is no user
    {
        MINT32 err = EIS_RETURN_NO_ERROR;

        //====== Dynamic Debug ======

        char value[PROPERTY_VALUE_MAX] = {'\0'};
        property_get("debug.eis.dump", value, "0");
        g_debugDump = atoi(value);

        if(g_debugDump >= 2)
        {
            EIS_SET_LOG_BUFFER_STRUCT pEisAlgoLogInfo;

            pEisAlgoLogInfo.Eis_Log_Buf_Addr = mEisAlgoIMemBuf.virtAddr;
            pEisAlgoLogInfo.Eis_Log_Buf_Size = mEisAlgoIMemBuf.size;

        	err = m_pEisAlg->EisFeatureCtrl(EIS_FEATURE_SAVE_LOG, &pEisAlgoLogInfo, NULL);
    	    if(err != S_EIS_OK)
    	    {
    	        EIS_ERR("EisFeatureCtrl(EIS_FEATURE_SAVE_LOG) fail(0x%x)",err);
    	    }
        }

        m_pEisDrv->enableEIS(0);

    	if(m_pEisDrv != NULL)
        {
        	m_pEisDrv->destroyInstance();
        	m_pEisDrv = NULL;
    	}

        if(m_pEisAlg != NULL)
        {
            m_pEisAlg->destroyInstance();
            m_pEisAlg = NULL;
        }

        if(g_debugDump >= 2)
        {
            //====== Free Memory ======

            destroyMemBuf(1,&mEisAlgoIMemBuf);

            mEisAlgoIMemBuf.memID = -5;
            mEisAlgoIMemBuf.virtAddr = mEisAlgoIMemBuf.phyAddr = mEisAlgoIMemBuf.size = 0;

            if(m_pIMemDrv != NULL)
            {
                m_pIMemDrv->destroyInstance();
                m_pIMemDrv = NULL;
            }
        }

        mFirstFlag = 0; // first frmae
        mConfigPass = MFALSE;
    }
    else
    {
        EIS_LOG("Still %d users", mUsers);
    }

    EIS_LOG("-");
    return EIS_RETURN_NO_ERROR;
}
Exemplo n.º 12
0
MINT32 EisHal::init()
{
    EIS_LOG("mUsers(%d)", mUsers);

    //====== Check Reference Count ======

    Mutex::Autolock lock(mLock);

    if(mUsers > 0)
    {
        EIS_LOG("%d has created", mUsers);
        android_atomic_inc(&mUsers);
        return EIS_RETURN_NO_ERROR;
    }

    //====== Dynamic Debug ======

    char value[PROPERTY_VALUE_MAX] = {'\0'};
    property_get("debug.eis.dump", value, "0");
    g_debugDump = atoi(value);

    //====== Create EIS Driver ======

    m_pEisDrv = EisDrvBase::createInstance();

    if(m_pEisDrv == NULL)
    {
        EIS_ERR("EisDrv::createInstance fail");
        goto create_fail_exit;
    }

    //====== Create EIS Algorithm Object ======

    m_pEisAlg = MTKEis::createInstance();

    if(m_pEisAlg == NULL)
    {
        EIS_ERR("EisAlg::createInstance fail");
        goto create_fail_exit;
    }

    if(g_debugDump >= 2)
    {
        //====== EisAlgo Debug Buffer ======

        m_pIMemDrv = IMemDrv::createInstance();
        if(m_pIMemDrv == NULL)
        {
            EIS_ERR("Null IMemDrv Obj");
            return EIS_RETURN_NULL_OBJ;
        }

        MUINT32 eisMemSize = EIS_LOG_BUFFER_SIZE;

        createMemBuf(eisMemSize,1,&mEisAlgoIMemBuf);
        if(mEisAlgoIMemBuf.virtAddr == 0 && mEisAlgoIMemBuf.phyAddr == 0)
        {
            EIS_ERR("create IMem fail");
            return EIS_RETURN_MEMORY_ERROR;
        }

        EIS_LOG("mEisAlgoIMemBuf : memID(%d),size(%u),virAdd(0x%x),phyAddr(0x%x)",mEisAlgoIMemBuf.memID,
                                                                                  mEisAlgoIMemBuf.size,
                                                                                  mEisAlgoIMemBuf.virtAddr,
                                                                                  mEisAlgoIMemBuf.phyAddr);
    }

    android_atomic_inc(&mUsers);

    EIS_LOG("-");
    return EIS_RETURN_NO_ERROR;

create_fail_exit:

    if(m_pEisDrv != NULL)
    {
        m_pEisDrv->destroyInstance();
        m_pEisDrv = NULL;
    }

    if(m_pEisAlg != NULL)
    {
        m_pEisAlg->destroyInstance();
        m_pEisAlg = NULL;
    }

    EIS_LOG("-");
    return EIS_RETURN_INVALID_DRIVER;
}