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