xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp21/CamHwIsp21.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  Copyright (c) 2019 Rockchip Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "CamHwIsp21.h"
19*4882a593Smuzhiyun #ifdef ANDROID_OS
20*4882a593Smuzhiyun #include <cutils/properties.h>
21*4882a593Smuzhiyun #endif
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun namespace RkCam {
24*4882a593Smuzhiyun 
CamHwIsp21()25*4882a593Smuzhiyun CamHwIsp21::CamHwIsp21()
26*4882a593Smuzhiyun     : CamHwIsp20()
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun     mNoReadBack = true;
29*4882a593Smuzhiyun #ifndef ANDROID_OS
30*4882a593Smuzhiyun     char* valueStr = getenv("normal_no_read_back");
31*4882a593Smuzhiyun     if (valueStr) {
32*4882a593Smuzhiyun         mNoReadBack = atoi(valueStr) > 0 ? true : false;
33*4882a593Smuzhiyun     }
34*4882a593Smuzhiyun #else
35*4882a593Smuzhiyun     char property_value[PROPERTY_VALUE_MAX] = {'\0'};
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun     property_get("persist.vendor.rkisp_no_read_back", property_value, "-1");
38*4882a593Smuzhiyun     int val = atoi(property_value);
39*4882a593Smuzhiyun     if (val != -1)
40*4882a593Smuzhiyun         mNoReadBack = atoi(property_value) > 0 ? true : false;
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
~CamHwIsp21()44*4882a593Smuzhiyun CamHwIsp21::~CamHwIsp21()
45*4882a593Smuzhiyun {}
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun XCamReturn
init(const char * sns_ent_name)48*4882a593Smuzhiyun CamHwIsp21::init(const char* sns_ent_name)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun     XCamReturn ret = CamHwIsp20::init(sns_ent_name);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun     return ret;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun XCamReturn
stop()56*4882a593Smuzhiyun CamHwIsp21::stop()
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun     XCamReturn ret = CamHwIsp20::stop();
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun     return ret;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
isOnlineByWorkingMode()63*4882a593Smuzhiyun bool CamHwIsp21::isOnlineByWorkingMode()
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun     return false;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun XCamReturn
dispatchResult(cam3aResultList & list)69*4882a593Smuzhiyun CamHwIsp21::dispatchResult(cam3aResultList& list)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun     cam3aResultList isp_result_list;
72*4882a593Smuzhiyun     for (auto& result : list) {
73*4882a593Smuzhiyun         switch (result->getType()) {
74*4882a593Smuzhiyun         case RESULT_TYPE_FLASH_PARAM:
75*4882a593Smuzhiyun         case RESULT_TYPE_CPSL_PARAM:
76*4882a593Smuzhiyun         case RESULT_TYPE_IRIS_PARAM:
77*4882a593Smuzhiyun         case RESULT_TYPE_FOCUS_PARAM:
78*4882a593Smuzhiyun         case RESULT_TYPE_EXPOSURE_PARAM:
79*4882a593Smuzhiyun         case RESULT_TYPE_AFD_PARAM:
80*4882a593Smuzhiyun             CamHwIsp20::dispatchResult(result);
81*4882a593Smuzhiyun             break;
82*4882a593Smuzhiyun         default:
83*4882a593Smuzhiyun             isp_result_list.push_back(result);
84*4882a593Smuzhiyun             break;
85*4882a593Smuzhiyun         }
86*4882a593Smuzhiyun     }
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun     if (isp_result_list.size() > 0) {
89*4882a593Smuzhiyun         handleIsp3aReslut(isp_result_list);
90*4882a593Smuzhiyun     }
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun XCamReturn
dispatchResult(SmartPtr<cam3aResult> result)96*4882a593Smuzhiyun CamHwIsp21::dispatchResult(SmartPtr<cam3aResult> result)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
99*4882a593Smuzhiyun     if (!result.ptr())
100*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     LOGD("%s enter, msg type(0x%x)", __FUNCTION__, result->getType());
103*4882a593Smuzhiyun     switch (result->getType())
104*4882a593Smuzhiyun     {
105*4882a593Smuzhiyun     case RESULT_TYPE_FLASH_PARAM:
106*4882a593Smuzhiyun     case RESULT_TYPE_CPSL_PARAM:
107*4882a593Smuzhiyun     case RESULT_TYPE_IRIS_PARAM:
108*4882a593Smuzhiyun     case RESULT_TYPE_FOCUS_PARAM:
109*4882a593Smuzhiyun     case RESULT_TYPE_EXPOSURE_PARAM:
110*4882a593Smuzhiyun         return CamHwIsp20::dispatchResult(result);
111*4882a593Smuzhiyun     default:
112*4882a593Smuzhiyun         handleIsp3aReslut(result);
113*4882a593Smuzhiyun         break;
114*4882a593Smuzhiyun     }
115*4882a593Smuzhiyun     return ret;
116*4882a593Smuzhiyun     LOGD("%s exit", __FUNCTION__);
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun void
updateEffParams(void * params,void * ori_params)120*4882a593Smuzhiyun CamHwIsp21::updateEffParams(void* params, void* ori_params) {
121*4882a593Smuzhiyun #ifdef ISP_HW_V21
122*4882a593Smuzhiyun     struct isp21_isp_params_cfg* isp_params = (struct isp21_isp_params_cfg*)params;
123*4882a593Smuzhiyun     uint32_t effFrmId = isp_params->frame_id;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun     rkisp_effect_params_v20 latestIspParams;
126*4882a593Smuzhiyun     bool is_got_latest_params = false;
127*4882a593Smuzhiyun     uint32_t latest_id = effFrmId == 0 ? 0 : effFrmId - 1;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun     if (XCAM_RETURN_NO_ERROR == getEffectiveIspParams(latestIspParams, latest_id))
130*4882a593Smuzhiyun         is_got_latest_params = true;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun     SmartLock locker(_isp_params_cfg_mutex);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     if (getParamsForEffMap(effFrmId)) {
135*4882a593Smuzhiyun         if (mAwbParams) {
136*4882a593Smuzhiyun             RkAiqIspAwbParamsProxyV21* awbParams =
137*4882a593Smuzhiyun                 dynamic_cast<RkAiqIspAwbParamsProxyV21*>(mAwbParams);
138*4882a593Smuzhiyun             _effecting_ispparam_map[effFrmId]->data()->result.awb_cfg_v201 = awbParams->data()->result;
139*4882a593Smuzhiyun         }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun         if (mBlcResult) {
142*4882a593Smuzhiyun             RkAiqIspBlcParamsProxyV21* blcParams =
143*4882a593Smuzhiyun                 dynamic_cast<RkAiqIspBlcParamsProxyV21*>(mBlcResult);
144*4882a593Smuzhiyun             _effecting_ispparam_map[effFrmId]->data()->result.blc_cfg = blcParams->data()->result;
145*4882a593Smuzhiyun         }
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun         struct isp21_isp_params_cfg* dst_isp_params = NULL;
148*4882a593Smuzhiyun         struct isp21_isp_params_cfg* lates_isp_params_ptr = NULL;
149*4882a593Smuzhiyun         struct isp21_isp_params_cfg* new_isp_params = NULL;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define UPDATE_MODULE_EFF_PARAMS(mask, new_param, latest_param, dst_param) \
152*4882a593Smuzhiyun         if (isp_params->module_cfg_update & (mask)) { \
153*4882a593Smuzhiyun             dst_param = new_param; \
154*4882a593Smuzhiyun         } else { \
155*4882a593Smuzhiyun            if (!is_got_latest_params) { \
156*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "impossible, no effect isp params!"); \
157*4882a593Smuzhiyun            } else { \
158*4882a593Smuzhiyun                 dst_param = latest_param; \
159*4882a593Smuzhiyun            } \
160*4882a593Smuzhiyun         } \
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun #define UPDATE_EFF_PARAMS() \
163*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE0, new_isp_params->meas.rawae0, \
164*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawae0, dst_isp_params->meas.rawae0); \
165*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE1, new_isp_params->meas.rawae1, \
166*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawae1, dst_isp_params->meas.rawae1); \
167*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE2, new_isp_params->meas.rawae2, \
168*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawae2, dst_isp_params->meas.rawae2); \
169*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE3, new_isp_params->meas.rawae3, \
170*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawae3, dst_isp_params->meas.rawae3); \
171*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST0, new_isp_params->meas.rawhist0, \
172*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawhist0, dst_isp_params->meas.rawhist0); \
173*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST1, new_isp_params->meas.rawhist1, \
174*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawhist1, dst_isp_params->meas.rawhist1); \
175*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST2, new_isp_params->meas.rawhist2, \
176*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawhist2, dst_isp_params->meas.rawhist2); \
177*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST3, new_isp_params->meas.rawhist3, \
178*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawhist3, dst_isp_params->meas.rawhist3); \
179*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAWB, new_isp_params->meas.rawawb, \
180*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawawb, dst_isp_params->meas.rawawb); \
181*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAF, new_isp_params->meas.rawaf, \
182*4882a593Smuzhiyun                                  lates_isp_params_ptr->meas.rawaf, dst_isp_params->meas.rawaf);\
183*4882a593Smuzhiyun         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_BLS, new_isp_params->others.bls_cfg, \
184*4882a593Smuzhiyun                                  lates_isp_params_ptr->others.bls_cfg, dst_isp_params->others.bls_cfg); \
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun         dst_isp_params = &_effecting_ispparam_map[effFrmId]->data()->result.isp_params_v21;
187*4882a593Smuzhiyun         if (is_got_latest_params)
188*4882a593Smuzhiyun             lates_isp_params_ptr = &latestIspParams.isp_params_v21;
189*4882a593Smuzhiyun         new_isp_params = isp_params;
190*4882a593Smuzhiyun         UPDATE_EFF_PARAMS();
191*4882a593Smuzhiyun     }
192*4882a593Smuzhiyun #endif
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun bool
processTb(void * params)196*4882a593Smuzhiyun CamHwIsp21::processTb(void* params) {
197*4882a593Smuzhiyun     return false;
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun }
201