/* * Copyright (c) 2019 Rockchip Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "CamHwIsp21.h" //#include "isp20/Isp20PollThread.h" #ifdef ANDROID_OS #include #endif namespace RkCam { CamHwIsp21::CamHwIsp21() : CamHwIsp20() { mNoReadBack = true; #ifndef ANDROID_OS char* valueStr = getenv("normal_no_read_back"); if (valueStr) { mNoReadBack = atoi(valueStr) > 0 ? true : false; } #else char property_value[PROPERTY_VALUE_MAX] = {'\0'}; property_get("persist.vendor.rkisp_no_read_back", property_value, "-1"); int val = atoi(property_value); if (val != -1) mNoReadBack = atoi(property_value) > 0 ? true : false; #endif } CamHwIsp21::~CamHwIsp21() {} XCamReturn CamHwIsp21::init(const char* sns_ent_name) { xcam_mem_clear (_full_active_isp21_params); XCamReturn ret = CamHwIsp20::init(sns_ent_name); //SmartPtr isp20Pollthread = // mPollthread.dynamic_cast_ptr(); //isp20Pollthread->set_need_luma_rd_info(false); return ret; } XCamReturn CamHwIsp21::stop() { XCamReturn ret = CamHwIsp20::stop(); xcam_mem_clear (_full_active_isp21_params); return ret; } bool CamHwIsp21::isOnlineByWorkingMode() { return false; } XCamReturn CamHwIsp21::dispatchResult(cam3aResultList& list) { cam3aResultList isp_result_list; for (auto& result : list) { switch (result->getType()) { case RESULT_TYPE_FLASH_PARAM: case RESULT_TYPE_CPSL_PARAM: case RESULT_TYPE_IRIS_PARAM: case RESULT_TYPE_FOCUS_PARAM: case RESULT_TYPE_EXPOSURE: CamHwIsp20::dispatchResult(result); break; default: isp_result_list.push_back(result); break; } } if (isp_result_list.size() > 0) { handleIsp3aReslut(isp_result_list); } return XCAM_RETURN_NO_ERROR; } XCamReturn CamHwIsp21::dispatchResult(SmartPtr result) { XCamReturn ret = XCAM_RETURN_NO_ERROR; if (!result.ptr()) return XCAM_RETURN_ERROR_PARAM; LOGD("%s enter, msg type(0x%x)", __FUNCTION__, result->getType()); switch (result->getType()) { case RESULT_TYPE_FLASH_PARAM: case RESULT_TYPE_CPSL_PARAM: case RESULT_TYPE_IRIS_PARAM: case RESULT_TYPE_FOCUS_PARAM: case RESULT_TYPE_EXPOSURE: return CamHwIsp20::dispatchResult(result); default: handleIsp3aReslut(result); break; } return ret; LOGD("%s exit", __FUNCTION__); } void CamHwIsp21::gen_full_isp_params(const struct isp21_isp_params_cfg* update_params, struct isp21_isp_params_cfg* full_params, uint64_t* module_en_update_partial, uint64_t* module_cfg_update_partial) { XCAM_ASSERT (update_params); XCAM_ASSERT (full_params); int i = 0; ENTER_CAMHW_FUNCTION(); for (; i <= RK_ISP2X_MAX_ID; i++) if (update_params->module_en_update & (1LL << i)) { if ((full_params->module_ens & (1LL << i)) != (update_params->module_ens & (1LL << i))) *module_en_update_partial |= 1LL << i; full_params->module_en_update |= 1LL << i; // clear old bit value full_params->module_ens &= ~(1LL << i); // set new bit value full_params->module_ens |= update_params->module_ens & (1LL << i); } for (i = 0; i <= RK_ISP2X_MAX_ID; i++) { if (update_params->module_cfg_update & (1LL << i)) { #define CHECK_UPDATE_PARAMS(dst, src) \ if (memcmp(&dst, &src, sizeof(dst)) == 0 && \ full_params->frame_id > ISP_PARAMS_EFFECT_DELAY_CNT) { \ continue; \ } \ *module_cfg_update_partial |= 1LL << i; \ dst = src; \ full_params->module_cfg_update |= 1LL << i; switch (i) { case RK_ISP2X_RAWAE_BIG1_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawae0, update_params->meas.rawae0); break; case RK_ISP2X_RAWAE_BIG2_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawae1, update_params->meas.rawae1); break; case RK_ISP2X_RAWAE_BIG3_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawae2, update_params->meas.rawae2); break; case RK_ISP2X_RAWAE_LITE_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawae3, update_params->meas.rawae3); break; case RK_ISP2X_RAWHIST_BIG1_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawhist0, update_params->meas.rawhist0); break; case RK_ISP2X_RAWHIST_BIG2_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawhist1, update_params->meas.rawhist1); break; case RK_ISP2X_RAWHIST_BIG3_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawhist2, update_params->meas.rawhist2); break; case RK_ISP2X_RAWHIST_LITE_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawhist3, update_params->meas.rawhist3); break; case RK_ISP2X_YUVAE_ID: CHECK_UPDATE_PARAMS(full_params->meas.yuvae, update_params->meas.yuvae); break; case RK_ISP2X_SIHST_ID: CHECK_UPDATE_PARAMS(full_params->meas.sihst, update_params->meas.sihst); break; case RK_ISP2X_SIAWB_ID: CHECK_UPDATE_PARAMS(full_params->meas.siawb, update_params->meas.siawb); break; case RK_ISP2X_RAWAWB_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawawb, update_params->meas.rawawb); break; case RK_ISP2X_AWB_GAIN_ID: CHECK_UPDATE_PARAMS(full_params->others.awb_gain_cfg, update_params->others.awb_gain_cfg); break; case RK_ISP2X_RAWAF_ID: CHECK_UPDATE_PARAMS(full_params->meas.rawaf, update_params->meas.rawaf); break; case RK_ISP2X_HDRMGE_ID: CHECK_UPDATE_PARAMS(full_params->others.hdrmge_cfg, update_params->others.hdrmge_cfg); break; /* case RK_ISP2X_HDRTMO_ID: */ /* full_params->others.hdrtmo_cfg = update_params->others.hdrtmo_cfg; */ /* break; */ case RK_ISP2X_CTK_ID: CHECK_UPDATE_PARAMS(full_params->others.ccm_cfg, update_params->others.ccm_cfg); break; case RK_ISP2X_LSC_ID: CHECK_UPDATE_PARAMS(full_params->others.lsc_cfg, update_params->others.lsc_cfg); break; case RK_ISP2X_GOC_ID: CHECK_UPDATE_PARAMS(full_params->others.gammaout_cfg, update_params->others.gammaout_cfg); break; case RK_ISP2X_3DLUT_ID: CHECK_UPDATE_PARAMS(full_params->others.isp3dlut_cfg, update_params->others.isp3dlut_cfg); break; case RK_ISP2X_DPCC_ID: CHECK_UPDATE_PARAMS(full_params->others.dpcc_cfg, update_params->others.dpcc_cfg); break; case RK_ISP2X_BLS_ID: CHECK_UPDATE_PARAMS(full_params->others.bls_cfg, update_params->others.bls_cfg); break; case RK_ISP2X_DEBAYER_ID: CHECK_UPDATE_PARAMS(full_params->others.debayer_cfg, update_params->others.debayer_cfg); break; case RK_ISP2X_DHAZ_ID: CHECK_UPDATE_PARAMS(full_params->others.dhaz_cfg, update_params->others.dhaz_cfg); break; /* case RK_ISP2X_RAWNR_ID: */ /* full_params->others.rawnr_cfg = update_params->others.rawnr_cfg; */ /* break; */ /* case RK_ISP2X_GAIN_ID: */ /* full_params->others.gain_cfg = update_params->others.gain_cfg; */ /* break; */ case RK_ISP2X_LDCH_ID: CHECK_UPDATE_PARAMS(full_params->others.ldch_cfg, update_params->others.ldch_cfg); break; case RK_ISP2X_GIC_ID: CHECK_UPDATE_PARAMS(full_params->others.gic_cfg, update_params->others.gic_cfg); break; case RK_ISP2X_CPROC_ID: CHECK_UPDATE_PARAMS(full_params->others.cproc_cfg, update_params->others.cproc_cfg); break; case Rk_ISP21_BAYNR_ID: CHECK_UPDATE_PARAMS(full_params->others.baynr_cfg, update_params->others.baynr_cfg); break; case Rk_ISP21_BAY3D_ID: CHECK_UPDATE_PARAMS(full_params->others.bay3d_cfg, update_params->others.bay3d_cfg); break; case Rk_ISP21_YNR_ID: CHECK_UPDATE_PARAMS(full_params->others.ynr_cfg, update_params->others.ynr_cfg); break; case Rk_ISP21_CNR_ID: CHECK_UPDATE_PARAMS(full_params->others.cnr_cfg, update_params->others.cnr_cfg); break; case Rk_ISP21_SHARP_ID: CHECK_UPDATE_PARAMS(full_params->others.sharp_cfg, update_params->others.sharp_cfg); break; case Rk_ISP21_DRC_ID: CHECK_UPDATE_PARAMS(full_params->others.drc_cfg, update_params->others.drc_cfg); break; case RK_ISP2X_SDG_ID: CHECK_UPDATE_PARAMS(full_params->others.sdg_cfg, update_params->others.sdg_cfg); break; default: break; } } } EXIT_CAMHW_FUNCTION(); } /* * some module(HDR/TNR) parameters are related to the next frame exposure * and can only be easily obtained at the hwi layer, * so these parameters are calculated at hwi and the result is overwritten. */ XCamReturn CamHwIsp21::overrideExpRatioToAiqResults(const sint32_t frameId, int module_id, cam3aResultList &results, int hdr_mode) { XCamReturn ret = XCAM_RETURN_NO_ERROR; SmartPtr curFrameExpParam; SmartPtr nextFrameExpParam; SmartPtr mSensorSubdev = mSensorDev.dynamic_cast_ptr(); if (mSensorSubdev.ptr()) { if (mSensorSubdev->getEffectiveExpParams(curFrameExpParam, frameId) < 0) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n", module_id, frameId); return ret; } if (mSensorSubdev->getEffectiveExpParams(nextFrameExpParam, frameId + 1) < 0) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n", module_id, frameId + 1); return ret; } } LOGD_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n" "curFrame(%d): lexp: %f-%f, mexp: %f-%f, sexp: %f-%f\n" "nextFrame(%d): lexp: %f-%f, mexp: %f-%f, sexp: %f-%f\n", module_id, frameId, frameId, curFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.analog_gain, curFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.integration_time, curFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain, curFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time, curFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain, curFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time, frameId + 1, nextFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.analog_gain, nextFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.integration_time, nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain, nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time, nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain, nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time); //calc expo float nextLExpo = 0; float nextMExpo = 0; float nextSExpo = 0; float nextRatioLS = 1.0; if(hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) { nextLExpo = nextFrameExpParam->data()->aecExpInfo.LinearExp.exp_real_params.analog_gain * \ nextFrameExpParam->data()->aecExpInfo.LinearExp.exp_real_params.integration_time; nextMExpo = nextLExpo; nextSExpo = nextLExpo; } else if(hdr_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2) { nextLExpo = nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain * \ nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time; nextMExpo = nextLExpo; nextSExpo = nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain * \ nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time; } else { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get wrong hdr mode\n"); return ret; } nextRatioLS = nextLExpo / nextSExpo; nextRatioLS = nextRatioLS >= 1 ? nextRatioLS : 1; switch (module_id) { case Rk_ISP21_DRC_ID: { SmartPtr drc_res = get_3a_module_result(results, RESULT_TYPE_DRC_PARAM); SmartPtr drcParamsProxy; if (drc_res.ptr()) { drcParamsProxy = drc_res.dynamic_cast_ptr(); } else { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get drc params from 3a result failed!\n"); return ret; } rk_aiq_isp_drc_v21_t& drc = drcParamsProxy->data()->result; if(!drc.bTmoEn) break; if (drc.LongFrameMode) nextRatioLS = 1.0; //get sw_drc_compres_scl float MFHDR_LOG_Q_BITS = 11; float adrc_gain = drc.DrcProcRes.sw_drc_adrc_gain; float log_ratio2 = log(nextRatioLS * adrc_gain) / log(2.0f) + 12; float offsetbits_int = (float)(drc.DrcProcRes.sw_drc_offset_pow2); float offsetbits = offsetbits_int * pow(2, MFHDR_LOG_Q_BITS); float hdrbits = log_ratio2 * pow(2, MFHDR_LOG_Q_BITS); float hdrvalidbits = hdrbits - offsetbits; float compres_scl = (12 * pow(2, MFHDR_LOG_Q_BITS * 2)) / hdrvalidbits; drc.DrcProcRes.sw_drc_compres_scl = (int)(compres_scl); //get sw_drc_min_ogain if(drc.DrcProcRes.sw_drc_min_ogain == 1) drc.DrcProcRes.sw_drc_min_ogain = 1 << 15; else { float sw_drc_min_ogain = 1 / (nextRatioLS * adrc_gain); drc.DrcProcRes.sw_drc_min_ogain = (int)(sw_drc_min_ogain * pow(2, 15) + 0.5); } //get sw_drc_compres_y if(drc.CompressMode == COMPRESS_AUTO) { float curveparam, curveparam2, curveparam3, tmp; float luma2[17] = { 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576 }; float curveTable[17]; float ISP_RAW_BIT = 12; float dstbits = ISP_RAW_BIT * pow(2, MFHDR_LOG_Q_BITS); float validbits = dstbits - offsetbits; for(int i = 0; i < ISP21_DRC_Y_NUM; ++i) { curveparam = (float)(validbits - 0) / (hdrvalidbits - validbits + pow(2, -6)); curveparam2 = validbits * (1 + curveparam); curveparam3 = hdrvalidbits * curveparam; tmp = luma2[i] * hdrvalidbits / 24576; curveTable[i] = (tmp * curveparam2 / (tmp + curveparam3)); drc.DrcProcRes.sw_drc_compres_y[i] = (int)(curveTable[i]) ; } } LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nextRatioLS:%f sw_drc_compres_scl:%d sw_drc_min_ogain:%d\n", nextRatioLS, drc.DrcProcRes.sw_drc_compres_scl, drc.DrcProcRes.sw_drc_min_ogain); LOGD_CAMHW_SUBM(ISP20HW_SUBM, "CompressMode:%d\n", drc.CompressMode); for(int i = 0; i < ISP21_DRC_Y_NUM; ++i) LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sw_drc_compres_y[%d]:%d\n", i, drc.DrcProcRes.sw_drc_compres_y[i]); break; } case RK_ISP2X_HDRMGE_ID: { SmartPtr merge_res = get_3a_module_result(results, RESULT_TYPE_MERGE_PARAM); SmartPtr mergeParamsProxy; if (merge_res.ptr()) { mergeParamsProxy = merge_res.dynamic_cast_ptr(); } else { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get drc params from 3a result failed!\n"); return ret; } RkAiqAmergeProcResult_t& merge = mergeParamsProxy->data()->result; if(merge.Res.sw_hdrmge_mode == 0) break; //get sw_hdrmge_gain0 merge.Res.sw_hdrmge_gain0 = (int)(64 * nextRatioLS); if(nextRatioLS == 1) merge.Res.sw_hdrmge_gain0_inv = (int)(4096 * (1 / nextRatioLS) - 1); else merge.Res.sw_hdrmge_gain0_inv = (int)(4096 * (1 / nextRatioLS)); //get sw_hdrmge_gain1 merge.Res.sw_hdrmge_gain1 = 0x40; merge.Res.sw_hdrmge_gain1_inv = 0xfff; //get sw_hdrmge_gain2 merge.Res.sw_hdrmge_gain2 = 0x40; LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d\n", merge.Res.sw_hdrmge_gain0, merge.Res.sw_hdrmge_gain0_inv); break; } default: LOGW_CAMHW_SUBM(ISP20HW_SUBM, "unkown module id: 0x%x!\n", module_id); break; } return ret; } XCamReturn CamHwIsp21::setIspConfig() { XCamReturn ret = XCAM_RETURN_NO_ERROR; ENTER_CAMHW_FUNCTION(); SmartPtr v4l2buf; uint32_t frameId = -1; { SmartLock locker (_isp_params_cfg_mutex); while (_effecting_ispparam_map.size() > 4) _effecting_ispparam_map.erase(_effecting_ispparam_map.begin()); } if (mIspParamsDev.ptr()) { ret = mIspParamsDev->get_buffer(v4l2buf); if (ret) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Can not get isp params buffer\n"); return XCAM_RETURN_ERROR_PARAM; } } else return XCAM_RETURN_BYPASS; cam3aResultList ready_results; ret = mParamsAssembler->deQueOne(ready_results, frameId); if (ret != XCAM_RETURN_NO_ERROR) { LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque isp ready parameter failed\n"); mIspParamsDev->return_buffer_to_pool (v4l2buf); return XCAM_RETURN_ERROR_PARAM; } LOGD_ANALYZER("----------%s, start config id(%d)'s isp params", __FUNCTION__, frameId); struct isp21_isp_params_cfg update_params; update_params.module_en_update = 0; update_params.module_ens = 0; update_params.module_cfg_update = 0; if (_state == CAM_HW_STATE_STOPPED || _state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_PAUSED) { // update all ens _full_active_isp21_params.module_en_update = ~0; // just re-config the enabled moddules _full_active_isp21_params.module_cfg_update = _full_active_isp21_params.module_ens; } else { _full_active_isp21_params.module_en_update = 0; // use module_ens to store module status, so we can use it to restore // the init params for re-start and re-prepare /* _full_active_isp21_params.module_ens = 0; */ _full_active_isp21_params.module_cfg_update = 0; } ret = overrideExpRatioToAiqResults(frameId, Rk_ISP21_DRC_ID, ready_results, _hdr_mode); if (ret < 0) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "DRC convertExpRatioToAiqResults error!\n"); } ret = overrideExpRatioToAiqResults(frameId, RK_ISP2X_HDRMGE_ID, ready_results, _hdr_mode); if (ret < 0) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Merge convertExpRatioToAiqResults error!\n"); } if (frameId >= 0) { SmartPtr awb_res = get_3a_module_result(ready_results, RESULT_TYPE_AWB_PARAM); SmartPtr awbParams; if (awb_res.ptr()) { awbParams = awb_res.dynamic_cast_ptr(); { SmartLock locker (_isp_params_cfg_mutex); _effecting_ispparam_map[frameId].awb_cfg_v201 = awbParams->data()->result; } } else { /* use the latest */ SmartLock locker (_isp_params_cfg_mutex); if (!_effecting_ispparam_map.empty()) { _effecting_ispparam_map[frameId].awb_cfg_v201 = (_effecting_ispparam_map.rbegin())->second.awb_cfg_v201; LOGW_CAMHW_SUBM(ISP20HW_SUBM, "use frame %d awb params for frame %d !\n", frameId, (_effecting_ispparam_map.rbegin())->first); } else { LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get awb params from 3a result failed for frame %d !\n", frameId); } } } // TODO: merge_isp_results would cause the compile warning: reference to ‘merge_isp_results’ is ambiguous // now use Isp21Params::merge_isp_results instead if (Isp21Params::merge_isp_results(ready_results, &update_params) != XCAM_RETURN_NO_ERROR) LOGE_CAMHW_SUBM(ISP20HW_SUBM, "ISP parameter translation error\n"); uint64_t module_en_update_partial = 0; uint64_t module_cfg_update_partial = 0; gen_full_isp_params(&update_params, &_full_active_isp21_params, &module_en_update_partial, &module_cfg_update_partial); if (_state == CAM_HW_STATE_STOPPED) LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispparam ens 0x%llx, en_up 0x%llx, cfg_up 0x%llx", _full_active_isp21_params.module_ens, _full_active_isp21_params.module_en_update, _full_active_isp21_params.module_cfg_update); #ifdef RUNTIME_MODULE_DEBUG _full_active_isp21_params.module_en_update &= ~g_disable_isp_modules_en; _full_active_isp21_params.module_ens |= g_disable_isp_modules_en; _full_active_isp21_params.module_cfg_update &= ~g_disable_isp_modules_cfg_update; module_en_update_partial = _full_active_isp21_params.module_en_update; module_cfg_update_partial = _full_active_isp21_params.module_cfg_update; #endif { SmartLock locker (_isp_params_cfg_mutex); if (frameId < 0) { _effecting_ispparam_map[0].isp_params_v21 = _full_active_isp21_params; } else { _effecting_ispparam_map[frameId].isp_params_v21 = _full_active_isp21_params; } } if (v4l2buf.ptr()) { struct isp21_isp_params_cfg* isp_params; int buf_index = v4l2buf->get_buf().index; isp_params = (struct isp21_isp_params_cfg*)v4l2buf->get_buf().m.userptr; *isp_params = _full_active_isp21_params; isp_params->module_en_update = module_en_update_partial; isp_params->module_cfg_update = module_cfg_update_partial; //TODO: isp driver has bug now, lsc cfg_up should be set along with //en_up if (isp_params->module_cfg_update & ISP2X_MODULE_LSC) isp_params->module_en_update |= ISP2X_MODULE_LSC; isp_params->frame_id = frameId; #if 0 //TODO: isp21 params has no exposure info field SmartPtr mSensorSubdev = mSensorDev.dynamic_cast_ptr(); if (mSensorSubdev.ptr()) { memset(&isp_params->exposure, 0, sizeof(isp_params->exposure)); SmartPtr expParam; if (mSensorSubdev->getEffectiveExpParams(expParam, frameId) < 0) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "frame_id(%d), get exposure failed!!!\n", frameId); } else { if (RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode) == RK_AIQ_WORKING_MODE_NORMAL) { isp_params->exposure.linear_exp.analog_gain_code_global = \ expParam->data()->aecExpInfo.LinearExp.exp_sensor_params.analog_gain_code_global; isp_params->exposure.linear_exp.coarse_integration_time = \ expParam->data()->aecExpInfo.LinearExp.exp_sensor_params.coarse_integration_time; } else { isp_params->exposure.hdr_exp[0].analog_gain_code_global = \ expParam->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global; isp_params->exposure.hdr_exp[0].coarse_integration_time = \ expParam->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time; isp_params->exposure.hdr_exp[1].analog_gain_code_global = \ expParam->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global; isp_params->exposure.hdr_exp[1].coarse_integration_time = \ expParam->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time; isp_params->exposure.hdr_exp[2].analog_gain_code_global = \ expParam->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global; isp_params->exposure.hdr_exp[2].coarse_integration_time = \ expParam->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time; } } } #endif if (mIspParamsDev->queue_buffer (v4l2buf) != 0) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISP1: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n", buf_index, errno, strerror(errno)); mIspParamsDev->return_buffer_to_pool (v4l2buf); return XCAM_RETURN_ERROR_IOCTL; } ispModuleEns = _full_active_isp21_params.module_ens; LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispparam ens 0x%llx, en_up 0x%llx, cfg_up 0x%llx", _full_active_isp21_params.module_ens, isp_params->module_en_update, isp_params->module_cfg_update); LOGD_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) queue buffer index %d, queue cnt %d, check exit status again[exit: %d]", XCAM_STR (mIspParamsDev->get_device_name()), buf_index, mIspParamsDev->get_queued_bufcnt(), _is_exit); if (_is_exit) return XCAM_RETURN_BYPASS; } else return XCAM_RETURN_BYPASS; EXIT_CAMHW_FUNCTION(); return ret; } };