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