xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/CamHwIsp20.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 "CamHwIsp20.h"
19*4882a593Smuzhiyun #include "Isp20Evts.h"
20*4882a593Smuzhiyun #include "rk_isp20_hw.h"
21*4882a593Smuzhiyun #include "Isp20_module_dbg.h"
22*4882a593Smuzhiyun #include "mediactl/mediactl-priv.h"
23*4882a593Smuzhiyun #include <linux/v4l2-subdev.h>
24*4882a593Smuzhiyun #include <sys/mman.h>
25*4882a593Smuzhiyun #ifdef ANDROID_OS
26*4882a593Smuzhiyun #include <cutils/properties.h>
27*4882a593Smuzhiyun #endif
28*4882a593Smuzhiyun #include "SPStreamProcUnit.h"
29*4882a593Smuzhiyun #include "PdafStreamProcUnit.h"
30*4882a593Smuzhiyun #include "CaptureRawData.h"
31*4882a593Smuzhiyun #include "code_to_pixel_format.h"
32*4882a593Smuzhiyun #include "RkAiqCalibDbV2.h"
33*4882a593Smuzhiyun #include "IspParamsSplitter.h"
34*4882a593Smuzhiyun #include "rkisp21-config.h"
35*4882a593Smuzhiyun #include "rkisp3-config.h"
36*4882a593Smuzhiyun #include "rkisp32-config.h"
37*4882a593Smuzhiyun #include "isp3x/Isp3xParams.h"
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun namespace RkCam {
40*4882a593Smuzhiyun std::unordered_map<std::string, SmartPtr<rk_aiq_static_info_t>> CamHwIsp20::mCamHwInfos;
41*4882a593Smuzhiyun std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>> CamHwIsp20::mSensorHwInfos;
42*4882a593Smuzhiyun std::unordered_map<std::string, std::string> CamHwIsp20::mFakeCameraName;
43*4882a593Smuzhiyun rk_aiq_isp_hw_info_t CamHwIsp20::mIspHwInfos;
44*4882a593Smuzhiyun rk_aiq_cif_hw_info_t CamHwIsp20::mCifHwInfos;
45*4882a593Smuzhiyun bool CamHwIsp20::mIsMultiIspMode = false;
46*4882a593Smuzhiyun uint16_t CamHwIsp20::mMultiIspExtendedPixel = 0;
47*4882a593Smuzhiyun #ifdef ISP_HW_V30
48*4882a593Smuzhiyun #define CAMHWISP_EFFECT_ISP_POOL_NUM 12
49*4882a593Smuzhiyun #else
50*4882a593Smuzhiyun #define CAMHWISP_EFFECT_ISP_POOL_NUM 6
51*4882a593Smuzhiyun #endif
52*4882a593Smuzhiyun // TODO: Sync 1608 sensor start streaming
53*4882a593Smuzhiyun XCam::Mutex     CamHwIsp20::_sync_1608_mutex;
54*4882a593Smuzhiyun bool            CamHwIsp20::_sync_1608_done = false;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun // TODO: Init static struct.
57*4882a593Smuzhiyun sensor_info_share_t CamHwIsp20::rk1608_share_inf{};
58*4882a593Smuzhiyun 
CamHwIsp20()59*4882a593Smuzhiyun CamHwIsp20::CamHwIsp20()
60*4882a593Smuzhiyun     : _hdr_mode(0)
61*4882a593Smuzhiyun     , _state(CAM_HW_STATE_INVALID)
62*4882a593Smuzhiyun     , _is_exit(false)
63*4882a593Smuzhiyun     , _linked_to_isp(false)
64*4882a593Smuzhiyun     , _linked_to_1608(false)
65*4882a593Smuzhiyun #if defined(ISP_HW_V20)
66*4882a593Smuzhiyun     , _ispp_module_init_ens(0)
67*4882a593Smuzhiyun #endif
68*4882a593Smuzhiyun     , _sharp_fbc_rotation(RK_AIQ_ROTATION_0)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun     mNoReadBack = false;
71*4882a593Smuzhiyun #ifndef ANDROID_OS
72*4882a593Smuzhiyun     char* valueStr = getenv("normal_no_read_back");
73*4882a593Smuzhiyun     if (valueStr) {
74*4882a593Smuzhiyun         mNoReadBack = atoi(valueStr) > 0 ? true : false;
75*4882a593Smuzhiyun     }
76*4882a593Smuzhiyun #else
77*4882a593Smuzhiyun     char property_value[PROPERTY_VALUE_MAX] = {'\0'};
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun     property_get("persist.vendor.rkisp_no_read_back", property_value, "-1");
80*4882a593Smuzhiyun     int val = atoi(property_value);
81*4882a593Smuzhiyun     if (val != -1)
82*4882a593Smuzhiyun         mNoReadBack = atoi(property_value) > 0 ? true : false;
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun     xcam_mem_clear(_fec_drv_mem_ctx);
85*4882a593Smuzhiyun     xcam_mem_clear(_ldch_drv_mem_ctx);
86*4882a593Smuzhiyun     xcam_mem_clear(_cac_drv_mem_ctx);
87*4882a593Smuzhiyun     xcam_mem_clear(fec_mem_info_array);
88*4882a593Smuzhiyun     xcam_mem_clear(ldch_mem_info_array);
89*4882a593Smuzhiyun     xcam_mem_clear(cac_mem_info_array);
90*4882a593Smuzhiyun     xcam_mem_clear(_dbg_drv_mem_ctx);
91*4882a593Smuzhiyun     xcam_mem_clear(dbg_mem_info_array);
92*4882a593Smuzhiyun     _fec_drv_mem_ctx.type = MEM_TYPE_FEC;
93*4882a593Smuzhiyun     _fec_drv_mem_ctx.ops_ctx = this;
94*4882a593Smuzhiyun     _fec_drv_mem_ctx.mem_info = (void*)(fec_mem_info_array);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     _ldch_drv_mem_ctx.type = MEM_TYPE_LDCH;
97*4882a593Smuzhiyun     _ldch_drv_mem_ctx.ops_ctx = this;
98*4882a593Smuzhiyun     _ldch_drv_mem_ctx.mem_info = (void*)(ldch_mem_info_array);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     _cac_drv_mem_ctx.type = MEM_TYPE_CAC;
101*4882a593Smuzhiyun     _cac_drv_mem_ctx.ops_ctx = this;
102*4882a593Smuzhiyun     _cac_drv_mem_ctx.mem_info = (void*)(cac_mem_info_array);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun     _dbg_drv_mem_ctx.type = MEM_TYPE_DBG_INFO;
105*4882a593Smuzhiyun     _dbg_drv_mem_ctx.ops_ctx = this;
106*4882a593Smuzhiyun     _dbg_drv_mem_ctx.mem_info = (void*)(dbg_mem_info_array);
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     xcam_mem_clear(_crop_rect);
109*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
110*4882a593Smuzhiyun     mParamsAssembler = new IspParamsAssembler("ISP_PARAMS_ASSEMBLER");
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun     mVicapIspPhyLinkSupported = false;
113*4882a593Smuzhiyun     mIspStremEvtTh = NULL;
114*4882a593Smuzhiyun     mIsGroupMode = false;
115*4882a593Smuzhiyun     mIsMain = false;
116*4882a593Smuzhiyun     _isp_stream_status = ISP_STREAM_STATUS_INVALID;
117*4882a593Smuzhiyun     mEffectIspParamsPool = new RkAiqIspEffParamsPool("ISP_EFF", CAMHWISP_EFFECT_ISP_POOL_NUM);
118*4882a593Smuzhiyun     _curIspParamsSeq = 0;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun     userSensorWidth = 0;
121*4882a593Smuzhiyun     userSensorHeight = 0;
122*4882a593Smuzhiyun     userSensorFmtCode = 0;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
~CamHwIsp20()125*4882a593Smuzhiyun CamHwIsp20::~CamHwIsp20()
126*4882a593Smuzhiyun {}
127*4882a593Smuzhiyun 
get_isp_ver(rk_aiq_isp_hw_info_t * hw_info)128*4882a593Smuzhiyun static XCamReturn get_isp_ver(rk_aiq_isp_hw_info_t *hw_info) {
129*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
130*4882a593Smuzhiyun     struct v4l2_capability cap;
131*4882a593Smuzhiyun     V4l2Device vdev(hw_info->isp_info[0].stats_path);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     ret = vdev.open();
135*4882a593Smuzhiyun     if (ret != XCAM_RETURN_NO_ERROR) {
136*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to open dev (%s)", hw_info->isp_info[0].stats_path);
137*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
138*4882a593Smuzhiyun     }
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun     if (vdev.query_cap(cap) == XCAM_RETURN_NO_ERROR) {
141*4882a593Smuzhiyun         char *p;
142*4882a593Smuzhiyun         p = strrchr((char*)cap.driver, '_');
143*4882a593Smuzhiyun         if (p == NULL) {
144*4882a593Smuzhiyun             ret = XCAM_RETURN_ERROR_FAILED;
145*4882a593Smuzhiyun             goto out;
146*4882a593Smuzhiyun         }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun         if (*(p + 1) != 'v') {
149*4882a593Smuzhiyun             ret = XCAM_RETURN_ERROR_FAILED;
150*4882a593Smuzhiyun             goto out;
151*4882a593Smuzhiyun         }
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun         hw_info->hw_ver_info.isp_ver = atoi(p + 2);
154*4882a593Smuzhiyun         //awb/aec version?
155*4882a593Smuzhiyun         vdev.close();
156*4882a593Smuzhiyun         return XCAM_RETURN_NO_ERROR;
157*4882a593Smuzhiyun     } else {
158*4882a593Smuzhiyun         ret = XCAM_RETURN_ERROR_FAILED;
159*4882a593Smuzhiyun         goto out;
160*4882a593Smuzhiyun     }
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun out:
163*4882a593Smuzhiyun     vdev.close();
164*4882a593Smuzhiyun     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get isp version failed !");
165*4882a593Smuzhiyun     return ret;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
get_sensor_caps(rk_sensor_full_info_t * sensor_info)168*4882a593Smuzhiyun static XCamReturn get_sensor_caps(rk_sensor_full_info_t *sensor_info) {
169*4882a593Smuzhiyun     struct v4l2_subdev_frame_size_enum fsize_enum;
170*4882a593Smuzhiyun     struct v4l2_subdev_mbus_code_enum  code_enum;
171*4882a593Smuzhiyun     std::vector<uint32_t> formats;
172*4882a593Smuzhiyun     rk_frame_fmt_t frameSize;
173*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun     V4l2SubDevice vdev(sensor_info->device_name.c_str());
176*4882a593Smuzhiyun     ret = vdev.open();
177*4882a593Smuzhiyun     if (ret != XCAM_RETURN_NO_ERROR) {
178*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to open dev (%s)", sensor_info->device_name.c_str());
179*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
180*4882a593Smuzhiyun     }
181*4882a593Smuzhiyun     //get module info
182*4882a593Smuzhiyun     struct rkmodule_inf *minfo = &(sensor_info->mod_info);
183*4882a593Smuzhiyun     if(vdev.io_control(RKMODULE_GET_MODULE_INFO, minfo) < 0) {
184*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s %s: Get sensor module info failed", __FUNCTION__, sensor_info->device_name.c_str());
185*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
186*4882a593Smuzhiyun     }
187*4882a593Smuzhiyun     sensor_info->len_name = std::string(minfo->base.lens);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #if 0
190*4882a593Smuzhiyun     memset(&code_enum, 0, sizeof(code_enum));
191*4882a593Smuzhiyun     while (vdev.io_control(VIDIOC_SUBDEV_ENUM_MBUS_CODE, &code_enum) == 0) {
192*4882a593Smuzhiyun         formats.push_back(code_enum.code);
193*4882a593Smuzhiyun         code_enum.index++;
194*4882a593Smuzhiyun     };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun     //TODO: sensor driver not supported now
197*4882a593Smuzhiyun     for (auto it = formats.begin(); it != formats.end(); ++it) {
198*4882a593Smuzhiyun         fsize_enum.pad = 0;
199*4882a593Smuzhiyun         fsize_enum.index = 0;
200*4882a593Smuzhiyun         fsize_enum.code = *it;
201*4882a593Smuzhiyun         while (vdev.io_control(VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fsize_enum) == 0) {
202*4882a593Smuzhiyun             frameSize.format = (rk_aiq_format_t)fsize_enum.code;
203*4882a593Smuzhiyun             frameSize.width = fsize_enum.max_width;
204*4882a593Smuzhiyun             frameSize.height = fsize_enum.max_height;
205*4882a593Smuzhiyun             sensor_info->frame_size.push_back(frameSize);
206*4882a593Smuzhiyun             fsize_enum.index++;
207*4882a593Smuzhiyun         };
208*4882a593Smuzhiyun     }
209*4882a593Smuzhiyun     if(!formats.size() || !sensor_info->frame_size.size()) {
210*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s %s: Enum sensor frame size failed", __FUNCTION__, sensor_info->device_name.c_str());
211*4882a593Smuzhiyun         ret = XCAM_RETURN_ERROR_FAILED;
212*4882a593Smuzhiyun     }
213*4882a593Smuzhiyun #endif
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun     struct v4l2_subdev_frame_interval_enum fie;
216*4882a593Smuzhiyun     memset(&fie, 0, sizeof(fie));
217*4882a593Smuzhiyun     while(vdev.io_control(VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL, &fie) == 0) {
218*4882a593Smuzhiyun         frameSize.format = (rk_aiq_format_t)fie.code;
219*4882a593Smuzhiyun         frameSize.width = fie.width;
220*4882a593Smuzhiyun         frameSize.height = fie.height;
221*4882a593Smuzhiyun         frameSize.fps = fie.interval.denominator / fie.interval.numerator;
222*4882a593Smuzhiyun         frameSize.hdr_mode = fie.reserved[0];
223*4882a593Smuzhiyun         sensor_info->frame_size.push_back(frameSize);
224*4882a593Smuzhiyun         fie.index++;
225*4882a593Smuzhiyun     }
226*4882a593Smuzhiyun     if (fie.index == 0)
227*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s %s: Enum sensor frame interval failed", __FUNCTION__, sensor_info->device_name.c_str());
228*4882a593Smuzhiyun     vdev.close();
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun     return ret;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun static XCamReturn
parse_module_info(rk_sensor_full_info_t * sensor_info)234*4882a593Smuzhiyun parse_module_info(rk_sensor_full_info_t *sensor_info)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun     // sensor entity name format SHOULD be like this:
237*4882a593Smuzhiyun     // m00_b_ov13850 1-0010
238*4882a593Smuzhiyun     std::string entity_name(sensor_info->sensor_name);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun     if (entity_name.empty())
241*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun     int parse_index = 0;
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun     if (entity_name.at(parse_index) != 'm') {
246*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
247*4882a593Smuzhiyun                         __LINE__, entity_name.c_str(), parse_index);
248*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
249*4882a593Smuzhiyun     }
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun     std::string index_str = entity_name.substr (parse_index, 3);
252*4882a593Smuzhiyun     sensor_info->module_index_str = index_str;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     parse_index += 3;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun     if (entity_name.at(parse_index) != '_') {
257*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
258*4882a593Smuzhiyun                         __LINE__, entity_name.c_str(), parse_index);
259*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
260*4882a593Smuzhiyun     }
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun     parse_index++;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun     if (entity_name.at(parse_index) != 'b' &&
265*4882a593Smuzhiyun             entity_name.at(parse_index) != 'f') {
266*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
267*4882a593Smuzhiyun                         __LINE__, entity_name.c_str(), parse_index);
268*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
269*4882a593Smuzhiyun     }
270*4882a593Smuzhiyun     sensor_info->phy_module_orient = entity_name.at(parse_index);
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun     parse_index++;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun     if (entity_name.at(parse_index) != '_') {
275*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
276*4882a593Smuzhiyun                         __LINE__, entity_name.c_str(), parse_index);
277*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
278*4882a593Smuzhiyun     }
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun     parse_index++;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun     std::size_t real_name_end = std::string::npos;
283*4882a593Smuzhiyun     if ((real_name_end = entity_name.find(' ')) == std::string::npos) {
284*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
285*4882a593Smuzhiyun                         __LINE__, entity_name.c_str(), parse_index);
286*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
287*4882a593Smuzhiyun     }
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun     std::string real_name_str = entity_name.substr(parse_index, real_name_end - parse_index);
290*4882a593Smuzhiyun     sensor_info->module_real_sensor_name = real_name_str;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s:%d, real sensor name %s, module ori %c, module id %s",
293*4882a593Smuzhiyun                     __FUNCTION__, __LINE__, sensor_info->module_real_sensor_name.c_str(),
294*4882a593Smuzhiyun                     sensor_info->phy_module_orient, sensor_info->module_index_str.c_str());
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun #if defined(__GNUC__) && !defined(__clang__)
300*4882a593Smuzhiyun #pragma GCC diagnostic push
301*4882a593Smuzhiyun #pragma GCC diagnostic ignored "-Wstringop-truncation"
302*4882a593Smuzhiyun #endif
303*4882a593Smuzhiyun #if defined(ISP_HW_V20)
304*4882a593Smuzhiyun static rk_aiq_ispp_t*
get_ispp_subdevs(struct media_device * device,const char * devpath,rk_aiq_ispp_t * ispp_info)305*4882a593Smuzhiyun get_ispp_subdevs(struct media_device *device, const char *devpath, rk_aiq_ispp_t* ispp_info)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun     media_entity *entity = NULL;
308*4882a593Smuzhiyun     const char *entity_name = NULL;
309*4882a593Smuzhiyun     int index = 0;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun     if(!device || !ispp_info || !devpath)
312*4882a593Smuzhiyun         return NULL;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun     for(index = 0; index < MAX_CAM_NUM; index++) {
315*4882a593Smuzhiyun         if (0 == strlen(ispp_info[index].media_dev_path))
316*4882a593Smuzhiyun             break;
317*4882a593Smuzhiyun         if (0 == strncmp(ispp_info[index].media_dev_path, devpath, sizeof(ispp_info[index].media_dev_path))) {
318*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp info of path %s exists!", devpath);
319*4882a593Smuzhiyun             return &ispp_info[index];
320*4882a593Smuzhiyun         }
321*4882a593Smuzhiyun     }
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun     if (index >= MAX_CAM_NUM)
324*4882a593Smuzhiyun         return NULL;
325*4882a593Smuzhiyun #if defined(ISP_HW_V30)
326*4882a593Smuzhiyun     // parse driver pattern: soc:rkisp0-vir0
327*4882a593Smuzhiyun     int model_idx = -1;
328*4882a593Smuzhiyun     char* rkispp = strstr(device->info.driver, "rkispp");
329*4882a593Smuzhiyun     if (rkispp) {
330*4882a593Smuzhiyun         int ispp_idx = atoi(rkispp + strlen("rkispp"));
331*4882a593Smuzhiyun         char* vir = strstr(device->info.driver, "vir");
332*4882a593Smuzhiyun         if (vir) {
333*4882a593Smuzhiyun             int vir_idx = atoi(vir + strlen("vir"));
334*4882a593Smuzhiyun             model_idx = ispp_idx * 4 + vir_idx;
335*4882a593Smuzhiyun         }
336*4882a593Smuzhiyun     }
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun     if (model_idx == -1) {
339*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wrong ispp media driver info: %s", device->info.driver);
340*4882a593Smuzhiyun         return NULL;
341*4882a593Smuzhiyun     }
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun     ispp_info[index].model_idx = model_idx;
344*4882a593Smuzhiyun #else
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun     if (strcmp(device->info.model, "rkispp0") == 0 ||
347*4882a593Smuzhiyun             strcmp(device->info.model, "rkispp") == 0)
348*4882a593Smuzhiyun         ispp_info[index].model_idx = 0;
349*4882a593Smuzhiyun     else if (strcmp(device->info.model, "rkispp1") == 0)
350*4882a593Smuzhiyun         ispp_info[index].model_idx = 1;
351*4882a593Smuzhiyun     else if (strcmp(device->info.model, "rkispp2") == 0)
352*4882a593Smuzhiyun         ispp_info[index].model_idx = 2;
353*4882a593Smuzhiyun     else if (strcmp(device->info.model, "rkispp3") == 0)
354*4882a593Smuzhiyun         ispp_info[index].model_idx = 3;
355*4882a593Smuzhiyun     else
356*4882a593Smuzhiyun         ispp_info[index].model_idx = -1;
357*4882a593Smuzhiyun #endif
358*4882a593Smuzhiyun     strncpy(ispp_info[index].media_dev_path, devpath, sizeof(ispp_info[index].media_dev_path));
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_input_image", strlen("rkispp_input_image"));
361*4882a593Smuzhiyun     if(entity) {
362*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
363*4882a593Smuzhiyun         if(entity_name) {
364*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_input_image_path, entity_name, sizeof(ispp_info[index].pp_input_image_path));
365*4882a593Smuzhiyun         }
366*4882a593Smuzhiyun     }
367*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_m_bypass", strlen("rkispp_m_bypass"));
368*4882a593Smuzhiyun     if(entity) {
369*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
370*4882a593Smuzhiyun         if(entity_name) {
371*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_m_bypass_path, entity_name, sizeof(ispp_info[index].pp_m_bypass_path));
372*4882a593Smuzhiyun         }
373*4882a593Smuzhiyun     }
374*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_scale0", strlen("rkispp_scale0"));
375*4882a593Smuzhiyun     if(entity) {
376*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
377*4882a593Smuzhiyun         if(entity_name) {
378*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_scale0_path, entity_name, sizeof(ispp_info[index].pp_scale0_path));
379*4882a593Smuzhiyun         }
380*4882a593Smuzhiyun     }
381*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_scale1", strlen("rkispp_scale1"));
382*4882a593Smuzhiyun     if(entity) {
383*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
384*4882a593Smuzhiyun         if(entity_name) {
385*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_scale1_path, entity_name, sizeof(ispp_info[index].pp_scale1_path));
386*4882a593Smuzhiyun         }
387*4882a593Smuzhiyun     }
388*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_scale2", strlen("rkispp_scale2"));
389*4882a593Smuzhiyun     if(entity) {
390*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
391*4882a593Smuzhiyun         if(entity_name) {
392*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_scale2_path, entity_name, sizeof(ispp_info[index].pp_scale2_path));
393*4882a593Smuzhiyun         }
394*4882a593Smuzhiyun     }
395*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_tnr_params", strlen("rkispp_tnr_params"));
396*4882a593Smuzhiyun     if(entity) {
397*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
398*4882a593Smuzhiyun         if(entity_name) {
399*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_tnr_params_path, entity_name, sizeof(ispp_info[index].pp_tnr_params_path));
400*4882a593Smuzhiyun         }
401*4882a593Smuzhiyun     }
402*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_tnr_stats", strlen("rkispp_tnr_stats"));
403*4882a593Smuzhiyun     if(entity) {
404*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
405*4882a593Smuzhiyun         if(entity_name) {
406*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_tnr_stats_path, entity_name, sizeof(ispp_info[index].pp_tnr_stats_path));
407*4882a593Smuzhiyun         }
408*4882a593Smuzhiyun     }
409*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_nr_params", strlen("rkispp_nr_params"));
410*4882a593Smuzhiyun     if(entity) {
411*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
412*4882a593Smuzhiyun         if(entity_name) {
413*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_nr_params_path, entity_name, sizeof(ispp_info[index].pp_nr_params_path));
414*4882a593Smuzhiyun         }
415*4882a593Smuzhiyun     }
416*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_nr_stats", strlen("rkispp_nr_stats"));
417*4882a593Smuzhiyun     if(entity) {
418*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
419*4882a593Smuzhiyun         if(entity_name) {
420*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_nr_stats_path, entity_name, sizeof(ispp_info[index].pp_nr_stats_path));
421*4882a593Smuzhiyun         }
422*4882a593Smuzhiyun     }
423*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp_fec_params", strlen("rkispp_fec_params"));
424*4882a593Smuzhiyun     if(entity) {
425*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
426*4882a593Smuzhiyun         if(entity_name) {
427*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_fec_params_path, entity_name, sizeof(ispp_info[index].pp_fec_params_path));
428*4882a593Smuzhiyun         }
429*4882a593Smuzhiyun     }
430*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkispp-subdev", strlen("rkispp-subdev"));
431*4882a593Smuzhiyun     if(entity) {
432*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
433*4882a593Smuzhiyun         if(entity_name) {
434*4882a593Smuzhiyun             strncpy(ispp_info[index].pp_dev_path, entity_name, sizeof(ispp_info[index].pp_dev_path));
435*4882a593Smuzhiyun         }
436*4882a593Smuzhiyun     }
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "model(%s): ispp_info(%d): ispp-subdev entity name: %s\n",
439*4882a593Smuzhiyun                     device->info.model, index,
440*4882a593Smuzhiyun                     ispp_info[index].pp_dev_path);
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun     return &ispp_info[index];
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun #endif
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun static rk_aiq_isp_t*
get_isp_subdevs(struct media_device * device,const char * devpath,rk_aiq_isp_t * isp_info)447*4882a593Smuzhiyun get_isp_subdevs(struct media_device *device, const char *devpath, rk_aiq_isp_t* isp_info)
448*4882a593Smuzhiyun {
449*4882a593Smuzhiyun     media_entity *entity = NULL;
450*4882a593Smuzhiyun     const char *entity_name = NULL;
451*4882a593Smuzhiyun     int index = 0;
452*4882a593Smuzhiyun     if(!device || !isp_info || !devpath)
453*4882a593Smuzhiyun         return NULL;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun     for(index = 0; index < MAX_CAM_NUM; index++) {
456*4882a593Smuzhiyun         if (0 == strlen(isp_info[index].media_dev_path)) {
457*4882a593Smuzhiyun             isp_info[index].logic_id = index;
458*4882a593Smuzhiyun             break;
459*4882a593Smuzhiyun         }
460*4882a593Smuzhiyun         if (0 == strncmp(isp_info[index].media_dev_path, devpath, sizeof(isp_info[index].media_dev_path))) {
461*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp info of path %s exists!", devpath);
462*4882a593Smuzhiyun             return &isp_info[index];
463*4882a593Smuzhiyun         }
464*4882a593Smuzhiyun     }
465*4882a593Smuzhiyun     if (index >= MAX_CAM_NUM)
466*4882a593Smuzhiyun         return NULL;
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun #if defined(ISP_HW_V30)
469*4882a593Smuzhiyun     // parse driver pattern: soc:rkisp0-vir0
470*4882a593Smuzhiyun     int model_idx = -1;
471*4882a593Smuzhiyun     char* rkisp = strstr(device->info.driver, "rkisp");
472*4882a593Smuzhiyun     if (rkisp) {
473*4882a593Smuzhiyun         char* str_unite = NULL;
474*4882a593Smuzhiyun         str_unite = strstr(device->info.driver, "unite");
475*4882a593Smuzhiyun         if (str_unite) {
476*4882a593Smuzhiyun             model_idx = 0;
477*4882a593Smuzhiyun         } else {
478*4882a593Smuzhiyun             int isp_idx = atoi(rkisp + strlen("rkisp"));
479*4882a593Smuzhiyun             char* vir = strstr(device->info.driver, "vir");
480*4882a593Smuzhiyun             if (vir) {
481*4882a593Smuzhiyun                 int vir_idx = atoi(vir + strlen("vir"));
482*4882a593Smuzhiyun                 model_idx = isp_idx * 4 + vir_idx;
483*4882a593Smuzhiyun                 isp_info[index].phy_id = isp_idx;
484*4882a593Smuzhiyun             }
485*4882a593Smuzhiyun         }
486*4882a593Smuzhiyun     }
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun     if (model_idx == -1) {
489*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wrong isp media driver info: %s", device->info.driver);
490*4882a593Smuzhiyun         return NULL;
491*4882a593Smuzhiyun     }
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun     isp_info[index].model_idx = model_idx;
494*4882a593Smuzhiyun #else
495*4882a593Smuzhiyun     if (strcmp(device->info.model, "rkisp0") == 0 ||
496*4882a593Smuzhiyun             strcmp(device->info.model, "rkisp") == 0)
497*4882a593Smuzhiyun         isp_info[index].model_idx = 0;
498*4882a593Smuzhiyun     else if (strcmp(device->info.model, "rkisp1") == 0)
499*4882a593Smuzhiyun         isp_info[index].model_idx = 1;
500*4882a593Smuzhiyun     else if (strcmp(device->info.model, "rkisp2") == 0)
501*4882a593Smuzhiyun         isp_info[index].model_idx = 2;
502*4882a593Smuzhiyun     else if (strcmp(device->info.model, "rkisp3") == 0)
503*4882a593Smuzhiyun         isp_info[index].model_idx = 3;
504*4882a593Smuzhiyun     else
505*4882a593Smuzhiyun         isp_info[index].model_idx = -1;
506*4882a593Smuzhiyun #endif
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun     strncpy(isp_info[index].media_dev_path, devpath, sizeof(isp_info[index].media_dev_path));
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev"));
511*4882a593Smuzhiyun     if(entity) {
512*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
513*4882a593Smuzhiyun         if(entity_name) {
514*4882a593Smuzhiyun             strncpy(isp_info[index].isp_dev_path, entity_name, sizeof(isp_info[index].isp_dev_path));
515*4882a593Smuzhiyun         }
516*4882a593Smuzhiyun     }
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-csi-subdev", strlen("rkisp-csi-subdev"));
519*4882a593Smuzhiyun     if(entity) {
520*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
521*4882a593Smuzhiyun         if(entity_name) {
522*4882a593Smuzhiyun             strncpy(isp_info[index].csi_dev_path, entity_name, sizeof(isp_info[index].csi_dev_path));
523*4882a593Smuzhiyun         }
524*4882a593Smuzhiyun     }
525*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-mpfbc-subdev", strlen("rkisp-mpfbc-subdev"));
526*4882a593Smuzhiyun     if(entity) {
527*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
528*4882a593Smuzhiyun         if(entity_name) {
529*4882a593Smuzhiyun             strncpy(isp_info[index].mpfbc_dev_path, entity_name, sizeof(isp_info[index].mpfbc_dev_path));
530*4882a593Smuzhiyun         }
531*4882a593Smuzhiyun     }
532*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_mainpath", strlen("rkisp_mainpath"));
533*4882a593Smuzhiyun     if(entity) {
534*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
535*4882a593Smuzhiyun         if(entity_name) {
536*4882a593Smuzhiyun             strncpy(isp_info[index].main_path, entity_name, sizeof(isp_info[index].main_path));
537*4882a593Smuzhiyun         }
538*4882a593Smuzhiyun     }
539*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_selfpath", strlen("rkisp_selfpath"));
540*4882a593Smuzhiyun     if(entity) {
541*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
542*4882a593Smuzhiyun         if(entity_name) {
543*4882a593Smuzhiyun             strncpy(isp_info[index].self_path, entity_name, sizeof(isp_info[index].self_path));
544*4882a593Smuzhiyun         }
545*4882a593Smuzhiyun     }
546*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawwr0", strlen("rkisp_rawwr0"));
547*4882a593Smuzhiyun     if(entity) {
548*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
549*4882a593Smuzhiyun         if(entity_name) {
550*4882a593Smuzhiyun             strncpy(isp_info[index].rawwr0_path, entity_name, sizeof(isp_info[index].rawwr0_path));
551*4882a593Smuzhiyun         }
552*4882a593Smuzhiyun     }
553*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawwr1", strlen("rkisp_rawwr1"));
554*4882a593Smuzhiyun     if(entity) {
555*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
556*4882a593Smuzhiyun         if(entity_name) {
557*4882a593Smuzhiyun             strncpy(isp_info[index].rawwr1_path, entity_name, sizeof(isp_info[index].rawwr1_path));
558*4882a593Smuzhiyun         }
559*4882a593Smuzhiyun     }
560*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawwr2", strlen("rkisp_rawwr2"));
561*4882a593Smuzhiyun     if(entity) {
562*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
563*4882a593Smuzhiyun         if(entity_name) {
564*4882a593Smuzhiyun             strncpy(isp_info[index].rawwr2_path, entity_name, sizeof(isp_info[index].rawwr2_path));
565*4882a593Smuzhiyun         }
566*4882a593Smuzhiyun     }
567*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawwr3", strlen("rkisp_rawwr3"));
568*4882a593Smuzhiyun     if(entity) {
569*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
570*4882a593Smuzhiyun         if(entity_name) {
571*4882a593Smuzhiyun             strncpy(isp_info[index].rawwr3_path, entity_name, sizeof(isp_info[index].rawwr3_path));
572*4882a593Smuzhiyun         }
573*4882a593Smuzhiyun     }
574*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_dmapath", strlen("rkisp_dmapath"));
575*4882a593Smuzhiyun     if(entity) {
576*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
577*4882a593Smuzhiyun         if(entity_name) {
578*4882a593Smuzhiyun             strncpy(isp_info[index].dma_path, entity_name, sizeof(isp_info[index].dma_path));
579*4882a593Smuzhiyun         }
580*4882a593Smuzhiyun     }
581*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawrd0_m", strlen("rkisp_rawrd0_m"));
582*4882a593Smuzhiyun     if(entity) {
583*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
584*4882a593Smuzhiyun         if(entity_name) {
585*4882a593Smuzhiyun             strncpy(isp_info[index].rawrd0_m_path, entity_name, sizeof(isp_info[index].rawrd0_m_path));
586*4882a593Smuzhiyun         }
587*4882a593Smuzhiyun     }
588*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawrd1_l", strlen("rkisp_rawrd1_l"));
589*4882a593Smuzhiyun     if(entity) {
590*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
591*4882a593Smuzhiyun         if(entity_name) {
592*4882a593Smuzhiyun             strncpy(isp_info[index].rawrd1_l_path, entity_name, sizeof(isp_info[index].rawrd1_l_path));
593*4882a593Smuzhiyun         }
594*4882a593Smuzhiyun     }
595*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawrd2_s", strlen("rkisp_rawrd2_s"));
596*4882a593Smuzhiyun     if(entity) {
597*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
598*4882a593Smuzhiyun         if(entity_name) {
599*4882a593Smuzhiyun             strncpy(isp_info[index].rawrd2_s_path, entity_name, sizeof(isp_info[index].rawrd2_s_path));
600*4882a593Smuzhiyun         }
601*4882a593Smuzhiyun     }
602*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-statistics", strlen("rkisp-statistics"));
603*4882a593Smuzhiyun     if(entity) {
604*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
605*4882a593Smuzhiyun         if(entity_name) {
606*4882a593Smuzhiyun             strncpy(isp_info[index].stats_path, entity_name, sizeof(isp_info[index].stats_path));
607*4882a593Smuzhiyun         }
608*4882a593Smuzhiyun     }
609*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-input-params", strlen("rkisp-input-params"));
610*4882a593Smuzhiyun     if(entity) {
611*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
612*4882a593Smuzhiyun         if(entity_name) {
613*4882a593Smuzhiyun             strncpy(isp_info[index].input_params_path, entity_name, sizeof(isp_info[index].input_params_path));
614*4882a593Smuzhiyun         }
615*4882a593Smuzhiyun     }
616*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-mipi-luma", strlen("rkisp-mipi-luma"));
617*4882a593Smuzhiyun     if(entity) {
618*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
619*4882a593Smuzhiyun         if(entity_name) {
620*4882a593Smuzhiyun             strncpy(isp_info[index].mipi_luma_path, entity_name, sizeof(isp_info[index].mipi_luma_path));
621*4882a593Smuzhiyun         }
622*4882a593Smuzhiyun     }
623*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rockchip-mipi-dphy-rx", strlen("rockchip-mipi-dphy-rx"));
624*4882a593Smuzhiyun     if(entity) {
625*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
626*4882a593Smuzhiyun         if(entity_name) {
627*4882a593Smuzhiyun             strncpy(isp_info[index].mipi_dphy_rx_path, entity_name, sizeof(isp_info[index].mipi_dphy_rx_path));
628*4882a593Smuzhiyun         }
629*4882a593Smuzhiyun     } else {
630*4882a593Smuzhiyun         entity = media_get_entity_by_name(device, "rockchip-csi2-dphy0", strlen("rockchip-csi2-dphy0"));
631*4882a593Smuzhiyun         if(entity) {
632*4882a593Smuzhiyun             entity_name = media_entity_get_devname (entity);
633*4882a593Smuzhiyun             if(entity_name) {
634*4882a593Smuzhiyun                 strncpy(isp_info[index].mipi_dphy_rx_path, entity_name, sizeof(isp_info[index].mipi_dphy_rx_path));
635*4882a593Smuzhiyun             }
636*4882a593Smuzhiyun         }
637*4882a593Smuzhiyun     }
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif_dvp", strlen("rkcif_dvp"));
640*4882a593Smuzhiyun     if(entity)
641*4882a593Smuzhiyun         isp_info[index].linked_dvp = true;
642*4882a593Smuzhiyun     else
643*4882a593Smuzhiyun         isp_info[index].linked_dvp = false;
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif-dvp", strlen("rkcif-dvp"));
646*4882a593Smuzhiyun     if(entity)
647*4882a593Smuzhiyun         isp_info[index].linked_dvp = true;
648*4882a593Smuzhiyun     else
649*4882a593Smuzhiyun         isp_info[index].linked_dvp = false;
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun     const char* linked_entity_name_strs[] = {
652*4882a593Smuzhiyun         "rkcif-dvp",
653*4882a593Smuzhiyun         "rkcif_dvp",
654*4882a593Smuzhiyun         "rkcif_lite_mipi_lvds",
655*4882a593Smuzhiyun         "rkcif_mipi_lvds",
656*4882a593Smuzhiyun         "rkcif_mipi_lvds1",
657*4882a593Smuzhiyun         "rkcif_mipi_lvds2",
658*4882a593Smuzhiyun         "rkcif_mipi_lvds3",
659*4882a593Smuzhiyun         "rkcif_mipi_lvds4",
660*4882a593Smuzhiyun         "rkcif_mipi_lvds5",
661*4882a593Smuzhiyun         "rkcif-mipi-lvds",
662*4882a593Smuzhiyun         "rkcif-mipi-lvds1",
663*4882a593Smuzhiyun         "rkcif-mipi-lvds2",
664*4882a593Smuzhiyun         "rkcif-mipi-lvds3",
665*4882a593Smuzhiyun         "rkcif-mipi-lvds4",
666*4882a593Smuzhiyun         "rkcif-mipi-lvds5",
667*4882a593Smuzhiyun         NULL
668*4882a593Smuzhiyun     };
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun     int vicap_idx = 0;
671*4882a593Smuzhiyun     for (int i = 0; linked_entity_name_strs[i] != NULL; i++) {
672*4882a593Smuzhiyun         entity = media_get_entity_by_name(device, linked_entity_name_strs[i], strlen(linked_entity_name_strs[i]));
673*4882a593Smuzhiyun         if (entity) {
674*4882a593Smuzhiyun             strncpy(isp_info[index].linked_vicap[vicap_idx], entity->info.name, sizeof(isp_info[index].linked_vicap[vicap_idx]));
675*4882a593Smuzhiyun             isp_info[index].linked_sensor = true;
676*4882a593Smuzhiyun             if (vicap_idx++ >= MAX_ISP_LINKED_VICAP_CNT) {
677*4882a593Smuzhiyun                 break;
678*4882a593Smuzhiyun             }
679*4882a593Smuzhiyun         }
680*4882a593Smuzhiyun     }
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "model(%s): isp_info(%d): ispp-subdev entity name: %s\n",
683*4882a593Smuzhiyun                     device->info.model, index,
684*4882a593Smuzhiyun                     isp_info[index].isp_dev_path);
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun     return &isp_info[index];
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun static rk_aiq_cif_info_t*
get_cif_subdevs(struct media_device * device,const char * devpath,rk_aiq_cif_info_t * cif_info)690*4882a593Smuzhiyun get_cif_subdevs(struct media_device *device, const char *devpath, rk_aiq_cif_info_t* cif_info)
691*4882a593Smuzhiyun {
692*4882a593Smuzhiyun     media_entity *entity = NULL;
693*4882a593Smuzhiyun     const char *entity_name = NULL;
694*4882a593Smuzhiyun     int index = 0;
695*4882a593Smuzhiyun     if(!device || !devpath || !cif_info)
696*4882a593Smuzhiyun         return NULL;
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun     for(index = 0; index < MAX_CAM_NUM; index++) {
699*4882a593Smuzhiyun         if (0 == strlen(cif_info[index].media_dev_path))
700*4882a593Smuzhiyun             break;
701*4882a593Smuzhiyun         if (0 == strncmp(cif_info[index].media_dev_path, devpath, sizeof(cif_info[index].media_dev_path))) {
702*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp info of path %s exists!", devpath);
703*4882a593Smuzhiyun             return &cif_info[index];
704*4882a593Smuzhiyun         }
705*4882a593Smuzhiyun     }
706*4882a593Smuzhiyun     if (index >= MAX_CAM_NUM)
707*4882a593Smuzhiyun         return NULL;
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun     cif_info[index].model_idx = index;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun     strncpy(cif_info[index].media_dev_path, devpath, sizeof(cif_info[index].media_dev_path) - 1);
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id0", strlen("stream_cif_mipi_id0"));
714*4882a593Smuzhiyun     if(entity) {
715*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
716*4882a593Smuzhiyun         if(entity_name) {
717*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_id0, entity_name, sizeof(cif_info[index].mipi_id0) - 1);
718*4882a593Smuzhiyun         }
719*4882a593Smuzhiyun     }
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id1", strlen("stream_cif_mipi_id1"));
722*4882a593Smuzhiyun     if(entity) {
723*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
724*4882a593Smuzhiyun         if(entity_name) {
725*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_id1, entity_name, sizeof(cif_info[index].mipi_id1) - 1);
726*4882a593Smuzhiyun         }
727*4882a593Smuzhiyun     }
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id2", strlen("stream_cif_mipi_id2"));
730*4882a593Smuzhiyun     if(entity) {
731*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
732*4882a593Smuzhiyun         if(entity_name) {
733*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_id2, entity_name, sizeof(cif_info[index].mipi_id2) - 1);
734*4882a593Smuzhiyun         }
735*4882a593Smuzhiyun     }
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id3", strlen("stream_cif_mipi_id3"));
738*4882a593Smuzhiyun     if(entity) {
739*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
740*4882a593Smuzhiyun         if(entity_name) {
741*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_id3, entity_name, sizeof(cif_info[index].mipi_id3) - 1);
742*4882a593Smuzhiyun         }
743*4882a593Smuzhiyun     }
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif_scale_ch0", strlen("rkcif_scale_ch0"));
746*4882a593Smuzhiyun     if(entity) {
747*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
748*4882a593Smuzhiyun         if(entity_name) {
749*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_scl0, entity_name, sizeof(cif_info[index].mipi_scl0) - 1);
750*4882a593Smuzhiyun         }
751*4882a593Smuzhiyun     }
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif_scale_ch1", strlen("rkcif_scale_ch1"));
754*4882a593Smuzhiyun     if(entity) {
755*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
756*4882a593Smuzhiyun         if(entity_name) {
757*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_scl1, entity_name, sizeof(cif_info[index].mipi_scl1) - 1);
758*4882a593Smuzhiyun         }
759*4882a593Smuzhiyun     }
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif_scale_ch2", strlen("rkcif_scale_ch2"));
762*4882a593Smuzhiyun     if(entity) {
763*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
764*4882a593Smuzhiyun         if(entity_name) {
765*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_scl2, entity_name, sizeof(cif_info[index].mipi_scl2) - 1);
766*4882a593Smuzhiyun         }
767*4882a593Smuzhiyun     }
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif_scale_ch3", strlen("rkcif_scale_ch3"));
770*4882a593Smuzhiyun     if(entity) {
771*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
772*4882a593Smuzhiyun         if(entity_name) {
773*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_scl3, entity_name, sizeof(cif_info[index].mipi_scl3) - 1);
774*4882a593Smuzhiyun         }
775*4882a593Smuzhiyun     }
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id0", strlen("stream_cif_dvp_id0"));
778*4882a593Smuzhiyun     if(entity) {
779*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
780*4882a593Smuzhiyun         if(entity_name) {
781*4882a593Smuzhiyun             strncpy(cif_info[index].dvp_id0, entity_name, sizeof(cif_info[index].dvp_id0) - 1);
782*4882a593Smuzhiyun         }
783*4882a593Smuzhiyun     }
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id1", strlen("stream_cif_dvp_id1"));
786*4882a593Smuzhiyun     if(entity) {
787*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
788*4882a593Smuzhiyun         if(entity_name) {
789*4882a593Smuzhiyun             strncpy(cif_info[index].dvp_id1, entity_name, sizeof(cif_info[index].dvp_id1) - 1);
790*4882a593Smuzhiyun         }
791*4882a593Smuzhiyun     }
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id2", strlen("stream_cif_dvp_id2"));
794*4882a593Smuzhiyun     if(entity) {
795*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
796*4882a593Smuzhiyun         if(entity_name) {
797*4882a593Smuzhiyun             strncpy(cif_info[index].dvp_id2, entity_name, sizeof(cif_info[index].dvp_id2) - 1);
798*4882a593Smuzhiyun         }
799*4882a593Smuzhiyun     }
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id3", strlen("stream_cif_dvp_id3"));
802*4882a593Smuzhiyun     if(entity) {
803*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
804*4882a593Smuzhiyun         if(entity_name) {
805*4882a593Smuzhiyun             strncpy(cif_info[index].dvp_id3, entity_name, sizeof(cif_info[index].dvp_id3) - 1);
806*4882a593Smuzhiyun         }
807*4882a593Smuzhiyun     }
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif-mipi-luma", strlen("rkisp-mipi-luma"));
810*4882a593Smuzhiyun     if(entity) {
811*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
812*4882a593Smuzhiyun         if(entity_name) {
813*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_luma_path, entity_name, sizeof(cif_info[index].mipi_luma_path) - 1);
814*4882a593Smuzhiyun         }
815*4882a593Smuzhiyun     }
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
818*4882a593Smuzhiyun     if(entity) {
819*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
820*4882a593Smuzhiyun         if(entity_name) {
821*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_csi2_sd_path, entity_name, sizeof(cif_info[index].mipi_csi2_sd_path) - 1);
822*4882a593Smuzhiyun         }
823*4882a593Smuzhiyun     }
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev"));
826*4882a593Smuzhiyun     if(entity) {
827*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
828*4882a593Smuzhiyun         if(entity_name) {
829*4882a593Smuzhiyun             strncpy(cif_info[index].lvds_sd_path, entity_name, sizeof(cif_info[index].lvds_sd_path) - 1);
830*4882a593Smuzhiyun         }
831*4882a593Smuzhiyun     }
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev"));
834*4882a593Smuzhiyun     if(entity) {
835*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
836*4882a593Smuzhiyun         if(entity_name) {
837*4882a593Smuzhiyun             strncpy(cif_info[index].lvds_sd_path, entity_name, sizeof(cif_info[index].lvds_sd_path) - 1);
838*4882a593Smuzhiyun         }
839*4882a593Smuzhiyun     }
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rockchip-mipi-dphy-rx", strlen("rockchip-mipi-dphy-rx"));
842*4882a593Smuzhiyun     if(entity) {
843*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
844*4882a593Smuzhiyun         if(entity_name) {
845*4882a593Smuzhiyun             strncpy(cif_info[index].mipi_dphy_rx_path, entity_name, sizeof(cif_info[index].mipi_dphy_rx_path) - 1);
846*4882a593Smuzhiyun         }
847*4882a593Smuzhiyun     } else {
848*4882a593Smuzhiyun         entity = media_get_entity_by_name(device, "rockchip-csi2-dphy0", strlen("rockchip-csi2-dphy0"));
849*4882a593Smuzhiyun         if(entity) {
850*4882a593Smuzhiyun             entity_name = media_entity_get_devname (entity);
851*4882a593Smuzhiyun             if(entity_name) {
852*4882a593Smuzhiyun                 strncpy(cif_info[index].mipi_dphy_rx_path, entity_name, sizeof(cif_info[index].mipi_dphy_rx_path) - 1);
853*4882a593Smuzhiyun             }
854*4882a593Smuzhiyun         }
855*4882a593Smuzhiyun     }
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif", strlen("stream_cif"));
858*4882a593Smuzhiyun     if(entity) {
859*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
860*4882a593Smuzhiyun         if(entity_name) {
861*4882a593Smuzhiyun             strncpy(cif_info[index].stream_cif_path, entity_name, sizeof(cif_info[index].stream_cif_path) - 1);
862*4882a593Smuzhiyun         }
863*4882a593Smuzhiyun     }
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkcif-dvp-sof", strlen("rkcif-dvp-sof"));
866*4882a593Smuzhiyun     if(entity) {
867*4882a593Smuzhiyun         entity_name = media_entity_get_devname (entity);
868*4882a593Smuzhiyun         if(entity_name) {
869*4882a593Smuzhiyun             strncpy(cif_info[index].dvp_sof_sd_path, entity_name, sizeof(cif_info[index].dvp_sof_sd_path) - 1);
870*4882a593Smuzhiyun         }
871*4882a593Smuzhiyun     }
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun     return &cif_info[index];
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun static
878*4882a593Smuzhiyun XCamReturn
SensorInfoCopy(rk_sensor_full_info_t * finfo,rk_aiq_static_info_t * info)879*4882a593Smuzhiyun SensorInfoCopy(rk_sensor_full_info_t *finfo, rk_aiq_static_info_t *info) {
880*4882a593Smuzhiyun     int fs_num, i = 0;
881*4882a593Smuzhiyun     rk_aiq_sensor_info_t *sinfo = NULL;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun     //info->media_node_index = finfo->media_node_index;
884*4882a593Smuzhiyun     strncpy(info->lens_info.len_name, finfo->len_name.c_str(), sizeof(info->lens_info.len_name));
885*4882a593Smuzhiyun     sinfo = &info->sensor_info;
886*4882a593Smuzhiyun     strncpy(sinfo->sensor_name, finfo->sensor_name.c_str(), sizeof(sinfo->sensor_name));
887*4882a593Smuzhiyun     fs_num = finfo->frame_size.size();
888*4882a593Smuzhiyun     if (fs_num) {
889*4882a593Smuzhiyun         for (auto iter = finfo->frame_size.begin(); iter != finfo->frame_size.end() && i < 10; ++iter, i++) {
890*4882a593Smuzhiyun             sinfo->support_fmt[i].width = (*iter).width;
891*4882a593Smuzhiyun             sinfo->support_fmt[i].height = (*iter).height;
892*4882a593Smuzhiyun             sinfo->support_fmt[i].format = (*iter).format;
893*4882a593Smuzhiyun             sinfo->support_fmt[i].fps = (*iter).fps;
894*4882a593Smuzhiyun             sinfo->support_fmt[i].hdr_mode = (*iter).hdr_mode;
895*4882a593Smuzhiyun         }
896*4882a593Smuzhiyun         sinfo->num = i;
897*4882a593Smuzhiyun     }
898*4882a593Smuzhiyun 
899*4882a593Smuzhiyun     if (finfo->module_index_str.size()) {
900*4882a593Smuzhiyun         sinfo->phyId = atoi(finfo->module_index_str.c_str() + 1);
901*4882a593Smuzhiyun     } else {
902*4882a593Smuzhiyun         sinfo->phyId = -1;
903*4882a593Smuzhiyun     }
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
906*4882a593Smuzhiyun }
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun XCamReturn
selectIqFile(const char * sns_ent_name,char * iqfile_name)909*4882a593Smuzhiyun CamHwIsp20::selectIqFile(const char* sns_ent_name, char* iqfile_name)
910*4882a593Smuzhiyun {
911*4882a593Smuzhiyun     if (!sns_ent_name || !iqfile_name)
912*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
913*4882a593Smuzhiyun     const struct rkmodule_base_inf* base_inf = NULL;
914*4882a593Smuzhiyun     const char *sensor_name, *module_name, *lens_name;
915*4882a593Smuzhiyun     char sensor_name_full[32];
916*4882a593Smuzhiyun     std::string str(sns_ent_name);
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun     auto it = CamHwIsp20::mSensorHwInfos.find(str);
919*4882a593Smuzhiyun     if (it == CamHwIsp20::mSensorHwInfos.end()) {
920*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_ent_name);
921*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
922*4882a593Smuzhiyun     }
923*4882a593Smuzhiyun     base_inf = &(it->second.ptr()->mod_info.base);
924*4882a593Smuzhiyun     if (!strlen(base_inf->module) || !strlen(base_inf->sensor) ||
925*4882a593Smuzhiyun             !strlen(base_inf->lens)) {
926*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no camera module info, check the drv !");
927*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
928*4882a593Smuzhiyun     }
929*4882a593Smuzhiyun     sensor_name = base_inf->sensor;
930*4882a593Smuzhiyun     strncpy(sensor_name_full, sensor_name, 32);
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun     module_name = base_inf->module;
933*4882a593Smuzhiyun     lens_name = base_inf->lens;
934*4882a593Smuzhiyun     if (strlen(module_name) && strlen(lens_name)) {
935*4882a593Smuzhiyun         sprintf(iqfile_name, "%s_%s_%s.json",
936*4882a593Smuzhiyun                 sensor_name_full, module_name, lens_name);
937*4882a593Smuzhiyun     } else {
938*4882a593Smuzhiyun         sprintf(iqfile_name, "%s.json", sensor_name_full);
939*4882a593Smuzhiyun     }
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun #if defined(__GNUC__) && !defined(__clang__)
944*4882a593Smuzhiyun #pragma GCC diagnostic pop
945*4882a593Smuzhiyun #endif
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun rk_aiq_static_info_t*
getStaticCamHwInfoByPhyId(const char * sns_ent_name,uint16_t index)948*4882a593Smuzhiyun CamHwIsp20::getStaticCamHwInfoByPhyId(const char* sns_ent_name, uint16_t index)
949*4882a593Smuzhiyun {
950*4882a593Smuzhiyun     if (sns_ent_name) {
951*4882a593Smuzhiyun         std::string str(sns_ent_name);
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun         auto it = mCamHwInfos.find(str);
954*4882a593Smuzhiyun         if (it != mCamHwInfos.end()) {
955*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "find camerainfo of %s!", sns_ent_name);
956*4882a593Smuzhiyun             return it->second.ptr();
957*4882a593Smuzhiyun         } else {
958*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camerainfo of %s not fount!", sns_ent_name);
959*4882a593Smuzhiyun         }
960*4882a593Smuzhiyun     } else {
961*4882a593Smuzhiyun         std::string index_str{"m"};
962*4882a593Smuzhiyun         if (index < 10) {
963*4882a593Smuzhiyun             index_str.append("0");
964*4882a593Smuzhiyun         }
965*4882a593Smuzhiyun         index_str.append(std::to_string(index));
966*4882a593Smuzhiyun         auto it = std::find_if(
967*4882a593Smuzhiyun                       std::begin(mCamHwInfos), std::end(mCamHwInfos),
968*4882a593Smuzhiyun         [&](const std::pair<std::string, SmartPtr<rk_aiq_static_info_t>>& info) -> bool {
969*4882a593Smuzhiyun             return !info.first.compare(0, 3, index_str);
970*4882a593Smuzhiyun         });
971*4882a593Smuzhiyun         if (it != mCamHwInfos.end()) {
972*4882a593Smuzhiyun             return it->second.ptr();
973*4882a593Smuzhiyun         }
974*4882a593Smuzhiyun     }
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun     return NULL;
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun rk_aiq_static_info_t*
getStaticCamHwInfo(const char * sns_ent_name,uint16_t index)980*4882a593Smuzhiyun CamHwIsp20::getStaticCamHwInfo(const char* sns_ent_name, uint16_t index)
981*4882a593Smuzhiyun {
982*4882a593Smuzhiyun     if (sns_ent_name) {
983*4882a593Smuzhiyun         std::string str(sns_ent_name);
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun         auto it = mCamHwInfos.find(str);
986*4882a593Smuzhiyun         if (it != mCamHwInfos.end()) {
987*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "find camerainfo of %s!", sns_ent_name);
988*4882a593Smuzhiyun             return it->second.ptr();
989*4882a593Smuzhiyun         } else {
990*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camerainfo of %s not fount!", sns_ent_name);
991*4882a593Smuzhiyun         }
992*4882a593Smuzhiyun     } else {
993*4882a593Smuzhiyun         if (index < mCamHwInfos.size()) {
994*4882a593Smuzhiyun             int i = 0;
995*4882a593Smuzhiyun             for (auto it = mCamHwInfos.begin(); it != mCamHwInfos.end(); it++, i++) {
996*4882a593Smuzhiyun                 if (i == index)
997*4882a593Smuzhiyun                     return it->second.ptr();
998*4882a593Smuzhiyun             }
999*4882a593Smuzhiyun         }
1000*4882a593Smuzhiyun     }
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun     return NULL;
1003*4882a593Smuzhiyun }
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun XCamReturn
clearStaticCamHwInfo()1006*4882a593Smuzhiyun CamHwIsp20::clearStaticCamHwInfo()
1007*4882a593Smuzhiyun {
1008*4882a593Smuzhiyun     /* std::map<std::string, SmartPtr<rk_aiq_static_info_t>>::iterator it1; */
1009*4882a593Smuzhiyun     /* std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it2; */
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun     /* for (it1 = mCamHwInfos.begin(); it1 != mCamHwInfos.end(); it1++) { */
1012*4882a593Smuzhiyun     /*     rk_aiq_static_info_t *ptr = it1->second.ptr(); */
1013*4882a593Smuzhiyun     /*     delete ptr; */
1014*4882a593Smuzhiyun     /* } */
1015*4882a593Smuzhiyun     /* for (it2 = mSensorHwInfos.begin(); it2 != mSensorHwInfos.end(); it2++) { */
1016*4882a593Smuzhiyun     /*     rk_sensor_full_info_t *ptr = it2->second.ptr(); */
1017*4882a593Smuzhiyun     /*     delete ptr; */
1018*4882a593Smuzhiyun     /* } */
1019*4882a593Smuzhiyun     mCamHwInfos.clear();
1020*4882a593Smuzhiyun     mSensorHwInfos.clear();
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
1023*4882a593Smuzhiyun }
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun void
findAttachedSubdevs(struct media_device * device,uint32_t count,rk_sensor_full_info_t * s_info)1026*4882a593Smuzhiyun CamHwIsp20::findAttachedSubdevs(struct media_device *device, uint32_t count, rk_sensor_full_info_t *s_info)
1027*4882a593Smuzhiyun {
1028*4882a593Smuzhiyun     const struct media_entity_desc *entity_info = NULL;
1029*4882a593Smuzhiyun     struct media_entity *entity = NULL;
1030*4882a593Smuzhiyun     uint32_t k;
1031*4882a593Smuzhiyun 
1032*4882a593Smuzhiyun     for (k = 0; k < count; ++k) {
1033*4882a593Smuzhiyun         entity = media_get_entity (device, k);
1034*4882a593Smuzhiyun         entity_info = media_entity_get_info(entity);
1035*4882a593Smuzhiyun         if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_LENS)) {
1036*4882a593Smuzhiyun             if ((entity_info->name[0] == 'm') &&
1037*4882a593Smuzhiyun                     (strncmp(entity_info->name, s_info->module_index_str.c_str(), 3) == 0)) {
1038*4882a593Smuzhiyun                 if (entity_info->flags == 1)
1039*4882a593Smuzhiyun                     s_info->module_ircut_dev_name = std::string(media_entity_get_devname(entity));
1040*4882a593Smuzhiyun                 else//vcm
1041*4882a593Smuzhiyun                     s_info->module_lens_dev_name = std::string(media_entity_get_devname(entity));
1042*4882a593Smuzhiyun             }
1043*4882a593Smuzhiyun         } else if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_FLASH)) {
1044*4882a593Smuzhiyun             if ((entity_info->name[0] == 'm') &&
1045*4882a593Smuzhiyun                     (strncmp(entity_info->name, s_info->module_index_str.c_str(), 3) == 0)) {
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun                 /* check if entity name has the format string mxx_x_xxx-irxxx */
1048*4882a593Smuzhiyun                 if (strstr(entity_info->name, "-ir") != NULL) {
1049*4882a593Smuzhiyun                     s_info->module_flash_ir_dev_name[s_info->flash_ir_num++] =
1050*4882a593Smuzhiyun                         std::string(media_entity_get_devname(entity));
1051*4882a593Smuzhiyun                 } else
1052*4882a593Smuzhiyun                     s_info->module_flash_dev_name[s_info->flash_num++] =
1053*4882a593Smuzhiyun                         std::string(media_entity_get_devname(entity));
1054*4882a593Smuzhiyun             }
1055*4882a593Smuzhiyun         }
1056*4882a593Smuzhiyun     }
1057*4882a593Smuzhiyun     // query flash infos
1058*4882a593Smuzhiyun     if (s_info->flash_num) {
1059*4882a593Smuzhiyun         SmartPtr<FlashLightHw> fl = new FlashLightHw(s_info->module_flash_dev_name, s_info->flash_num);
1060*4882a593Smuzhiyun         fl->init(1);
1061*4882a593Smuzhiyun         s_info->fl_strth_adj_sup = fl->isStrengthAdj();
1062*4882a593Smuzhiyun         fl->deinit();
1063*4882a593Smuzhiyun     }
1064*4882a593Smuzhiyun     if (s_info->flash_ir_num) {
1065*4882a593Smuzhiyun         SmartPtr<FlashLightHw> fl_ir = new FlashLightHw(s_info->module_flash_ir_dev_name, s_info->flash_ir_num);
1066*4882a593Smuzhiyun         fl_ir->init(1);
1067*4882a593Smuzhiyun         s_info->fl_ir_strth_adj_sup = fl_ir->isStrengthAdj();
1068*4882a593Smuzhiyun         fl_ir->deinit();
1069*4882a593Smuzhiyun     }
1070*4882a593Smuzhiyun }
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun XCamReturn
initCamHwInfos()1073*4882a593Smuzhiyun CamHwIsp20::initCamHwInfos()
1074*4882a593Smuzhiyun {
1075*4882a593Smuzhiyun     char sys_path[64], devpath[32];
1076*4882a593Smuzhiyun     FILE *fp = NULL;
1077*4882a593Smuzhiyun     struct media_device *device = NULL;
1078*4882a593Smuzhiyun     int nents, j = 0, i = 0, node_index = 0;
1079*4882a593Smuzhiyun     const struct media_entity_desc *entity_info = NULL;
1080*4882a593Smuzhiyun     struct media_entity *entity = NULL;
1081*4882a593Smuzhiyun 
1082*4882a593Smuzhiyun     xcam_mem_clear (CamHwIsp20::mIspHwInfos);
1083*4882a593Smuzhiyun     xcam_mem_clear (CamHwIsp20::mCifHwInfos);
1084*4882a593Smuzhiyun 
1085*4882a593Smuzhiyun     while (i < MAX_MEDIA_INDEX) {
1086*4882a593Smuzhiyun         node_index = i;
1087*4882a593Smuzhiyun         snprintf (sys_path, 64, "/dev/media%d", i++);
1088*4882a593Smuzhiyun         fp = fopen (sys_path, "r");
1089*4882a593Smuzhiyun         if (!fp)
1090*4882a593Smuzhiyun             continue;
1091*4882a593Smuzhiyun         fclose (fp);
1092*4882a593Smuzhiyun         device = media_device_new (sys_path);
1093*4882a593Smuzhiyun         if (!device) {
1094*4882a593Smuzhiyun             continue;
1095*4882a593Smuzhiyun         }
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun         /* Enumerate entities, pads and links. */
1098*4882a593Smuzhiyun         media_device_enumerate (device);
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun         rk_aiq_isp_t* isp_info = NULL;
1101*4882a593Smuzhiyun         rk_aiq_cif_info_t* cif_info = NULL;
1102*4882a593Smuzhiyun         bool dvp_itf = false;
1103*4882a593Smuzhiyun         if (strcmp(device->info.model, "rkispp0") == 0 ||
1104*4882a593Smuzhiyun                 strcmp(device->info.model, "rkispp1") == 0 ||
1105*4882a593Smuzhiyun                 strcmp(device->info.model, "rkispp2") == 0 ||
1106*4882a593Smuzhiyun                 strcmp(device->info.model, "rkispp3") == 0 ||
1107*4882a593Smuzhiyun                 strcmp(device->info.model, "rkispp") == 0) {
1108*4882a593Smuzhiyun #if defined(ISP_HW_V20)
1109*4882a593Smuzhiyun             rk_aiq_ispp_t* ispp_info = get_ispp_subdevs(device, sys_path, CamHwIsp20::mIspHwInfos.ispp_info);
1110*4882a593Smuzhiyun             if (ispp_info)
1111*4882a593Smuzhiyun                 ispp_info->valid = true;
1112*4882a593Smuzhiyun #endif
1113*4882a593Smuzhiyun             goto media_unref;
1114*4882a593Smuzhiyun         } else if (strcmp(device->info.model, "rkisp0") == 0 ||
1115*4882a593Smuzhiyun                    strcmp(device->info.model, "rkisp1") == 0 ||
1116*4882a593Smuzhiyun                    strcmp(device->info.model, "rkisp2") == 0 ||
1117*4882a593Smuzhiyun                    strcmp(device->info.model, "rkisp3") == 0 ||
1118*4882a593Smuzhiyun                    strcmp(device->info.model, "rkisp") == 0) {
1119*4882a593Smuzhiyun             isp_info = get_isp_subdevs(device, sys_path, CamHwIsp20::mIspHwInfos.isp_info);
1120*4882a593Smuzhiyun             if (strstr(device->info.driver, "rkisp-unite")) {
1121*4882a593Smuzhiyun                 isp_info->is_multi_isp_mode = true;
1122*4882a593Smuzhiyun                 mIsMultiIspMode = true;
1123*4882a593Smuzhiyun                 mMultiIspExtendedPixel = RKMOUDLE_UNITE_EXTEND_PIXEL;
1124*4882a593Smuzhiyun             } else {
1125*4882a593Smuzhiyun                 isp_info->is_multi_isp_mode = false;
1126*4882a593Smuzhiyun                 mIsMultiIspMode = false;
1127*4882a593Smuzhiyun                 mMultiIspExtendedPixel = 0;
1128*4882a593Smuzhiyun             }
1129*4882a593Smuzhiyun             isp_info->valid = true;
1130*4882a593Smuzhiyun         } else if (strcmp(device->info.model, "rkcif") == 0 ||
1131*4882a593Smuzhiyun                    strcmp(device->info.model, "rkcif-dvp") == 0 ||
1132*4882a593Smuzhiyun                    strcmp(device->info.model, "rkcif_dvp") == 0 ||
1133*4882a593Smuzhiyun                    strstr(device->info.model, "rkcif_mipi_lvds") ||
1134*4882a593Smuzhiyun                    strstr(device->info.model, "rkcif-mipi-lvds") ||
1135*4882a593Smuzhiyun                    strcmp(device->info.model, "rkcif_lite_mipi_lvds") == 0) {
1136*4882a593Smuzhiyun             cif_info = get_cif_subdevs(device, sys_path, CamHwIsp20::mCifHwInfos.cif_info);
1137*4882a593Smuzhiyun             strncpy(cif_info->model_str, device->info.model, sizeof(cif_info->model_str));
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun             if (strcmp(device->info.model, "rkcif_dvp") == 0 || strcmp(device->info.model, "rkcif-dvp") == 0)
1140*4882a593Smuzhiyun                 dvp_itf = true;
1141*4882a593Smuzhiyun         } else {
1142*4882a593Smuzhiyun             goto media_unref;
1143*4882a593Smuzhiyun         }
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun         nents = media_get_entities_count (device);
1146*4882a593Smuzhiyun         for (j = 0; j < nents; ++j) {
1147*4882a593Smuzhiyun             entity = media_get_entity (device, j);
1148*4882a593Smuzhiyun             entity_info = media_entity_get_info(entity);
1149*4882a593Smuzhiyun             if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_SENSOR)) {
1150*4882a593Smuzhiyun                 if (strstr(entity_info->name, "1608")) {
1151*4882a593Smuzhiyun                     // [baron] skip psy-sensor(m_09_RK1608Dphy), save cif inf addr.
1152*4882a593Smuzhiyun                     if (cif_info) {
1153*4882a593Smuzhiyun                         CamHwIsp20::rk1608_share_inf.reference_mipi_cif = cif_info;
1154*4882a593Smuzhiyun                     }
1155*4882a593Smuzhiyun                     continue;
1156*4882a593Smuzhiyun                 }
1157*4882a593Smuzhiyun                 rk_aiq_static_info_t *info = new rk_aiq_static_info_t();
1158*4882a593Smuzhiyun                 rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t();
1159*4882a593Smuzhiyun                 s_full_info->media_node_index = node_index;
1160*4882a593Smuzhiyun                 strncpy(devpath, media_entity_get_devname(entity), sizeof(devpath) - 1);
1161*4882a593Smuzhiyun                 devpath[sizeof(devpath) - 1] = '\0';
1162*4882a593Smuzhiyun                 s_full_info->device_name = std::string(devpath);
1163*4882a593Smuzhiyun                 s_full_info->sensor_name = std::string(entity_info->name);
1164*4882a593Smuzhiyun                 s_full_info->parent_media_dev = std::string(sys_path);
1165*4882a593Smuzhiyun                 parse_module_info(s_full_info);
1166*4882a593Smuzhiyun                 get_sensor_caps(s_full_info);
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun                 if (cif_info) {
1169*4882a593Smuzhiyun                     s_full_info->linked_to_isp = false;
1170*4882a593Smuzhiyun                     s_full_info->cif_info = cif_info;
1171*4882a593Smuzhiyun                     s_full_info->isp_info = NULL;
1172*4882a593Smuzhiyun                     s_full_info->dvp_itf = dvp_itf;
1173*4882a593Smuzhiyun                     // [baron] add flag for 1608 sensor
1174*4882a593Smuzhiyun                     s_full_info->linked_to_1608 = false;
1175*4882a593Smuzhiyun                     info->_is_1608_sensor = false;
1176*4882a593Smuzhiyun                 } else if (isp_info) {
1177*4882a593Smuzhiyun                     s_full_info->linked_to_isp = true;
1178*4882a593Smuzhiyun                     isp_info->linked_sensor = true;
1179*4882a593Smuzhiyun                     isp_info->isMultiplex = false;
1180*4882a593Smuzhiyun                     s_full_info->isp_info = isp_info;
1181*4882a593Smuzhiyun #if defined(ISP_HW_V30)
1182*4882a593Smuzhiyun                     // FIXME: Just support isp3x(rk3588-8/9camera).
1183*4882a593Smuzhiyun                     for (int vi_idx = 0; vi_idx < MAX_ISP_LINKED_VICAP_CNT; vi_idx++) {
1184*4882a593Smuzhiyun                         if (strlen(isp_info->linked_vicap[vi_idx]) > 0) {
1185*4882a593Smuzhiyun                             strcpy(CamHwIsp20::rk1608_share_inf.reference_name, isp_info->linked_vicap[vi_idx]);
1186*4882a593Smuzhiyun                             s_full_info->cif_info = CamHwIsp20::rk1608_share_inf.reference_mipi_cif;
1187*4882a593Smuzhiyun                             info->_is_1608_sensor = true;
1188*4882a593Smuzhiyun                             s_full_info->linked_to_1608 = true;
1189*4882a593Smuzhiyun                         }
1190*4882a593Smuzhiyun                     }
1191*4882a593Smuzhiyun #endif
1192*4882a593Smuzhiyun                 } else {
1193*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "sensor device mount error!\n");
1194*4882a593Smuzhiyun                 }
1195*4882a593Smuzhiyun #if 0
1196*4882a593Smuzhiyun                 printf("  >>>>>>>>> sensor(%s): cif addr(%p), link_to_1608[%d], share_vi(%s)\n",
1197*4882a593Smuzhiyun                        entity_info->name,
1198*4882a593Smuzhiyun                        s_full_info->cif_info,
1199*4882a593Smuzhiyun                        s_full_info->linked_to_1608,
1200*4882a593Smuzhiyun                        CamHwIsp20::rk1608_share_inf.reference_name
1201*4882a593Smuzhiyun                       );
1202*4882a593Smuzhiyun #endif
1203*4882a593Smuzhiyun 
1204*4882a593Smuzhiyun                 findAttachedSubdevs(device, nents, s_full_info);
1205*4882a593Smuzhiyun                 SensorInfoCopy(s_full_info, info);
1206*4882a593Smuzhiyun                 info->has_lens_vcm = s_full_info->module_lens_dev_name.empty() ? false : true;
1207*4882a593Smuzhiyun                 info->has_fl = s_full_info->flash_num > 0 ? true : false;
1208*4882a593Smuzhiyun                 info->has_irc = s_full_info->module_ircut_dev_name.empty() ? false : true;
1209*4882a593Smuzhiyun                 info->fl_strth_adj_sup = s_full_info->fl_ir_strth_adj_sup;
1210*4882a593Smuzhiyun                 info->fl_ir_strth_adj_sup = s_full_info->fl_ir_strth_adj_sup;
1211*4882a593Smuzhiyun                 if (s_full_info->isp_info)
1212*4882a593Smuzhiyun                     info->is_multi_isp_mode = s_full_info->isp_info->is_multi_isp_mode;
1213*4882a593Smuzhiyun                 info->multi_isp_extended_pixel = mMultiIspExtendedPixel;
1214*4882a593Smuzhiyun                 LOGD_CAMHW_SUBM(ISP20HW_SUBM, "Init sensor %s with Multi-ISP Mode:%d Extended Pixels:%d ",
1215*4882a593Smuzhiyun                                 s_full_info->sensor_name.c_str(), info->is_multi_isp_mode,
1216*4882a593Smuzhiyun                                 info->multi_isp_extended_pixel);
1217*4882a593Smuzhiyun                 CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
1218*4882a593Smuzhiyun                 CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = info;
1219*4882a593Smuzhiyun             }
1220*4882a593Smuzhiyun         }
1221*4882a593Smuzhiyun 
1222*4882a593Smuzhiyun media_unref:
1223*4882a593Smuzhiyun         media_device_unref (device);
1224*4882a593Smuzhiyun     }
1225*4882a593Smuzhiyun 
1226*4882a593Smuzhiyun #if defined(ISP_HW_V30)
1227*4882a593Smuzhiyun     // judge isp if multiplex by multiple cams
1228*4882a593Smuzhiyun     rk_aiq_isp_t* isp_info = NULL;
1229*4882a593Smuzhiyun     for (i = 0; i < MAX_CAM_NUM; i++) {
1230*4882a593Smuzhiyun         isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
1231*4882a593Smuzhiyun         if (isp_info->valid) {
1232*4882a593Smuzhiyun             for (j = i - 1; j >= 0; j--) {
1233*4882a593Smuzhiyun                 if (isp_info->phy_id == CamHwIsp20::mIspHwInfos.isp_info[j].phy_id) {
1234*4882a593Smuzhiyun                     isp_info->isMultiplex = true;
1235*4882a593Smuzhiyun                     CamHwIsp20::mIspHwInfos.isp_info[j].isMultiplex = true;
1236*4882a593Smuzhiyun                 }
1237*4882a593Smuzhiyun             }
1238*4882a593Smuzhiyun         }
1239*4882a593Smuzhiyun     }
1240*4882a593Smuzhiyun #endif
1241*4882a593Smuzhiyun 
1242*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator iter;
1243*4882a593Smuzhiyun     for(iter = CamHwIsp20::mSensorHwInfos.begin(); \
1244*4882a593Smuzhiyun             iter != CamHwIsp20::mSensorHwInfos.end(); iter++) {
1245*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "match the sensor_name(%s) media link\n", (iter->first).c_str());
1246*4882a593Smuzhiyun         SmartPtr<rk_sensor_full_info_t> s_full_info = iter->second;
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun         /*
1249*4882a593Smuzhiyun          * The ISP and ISPP match links through the media device model
1250*4882a593Smuzhiyun          */
1251*4882a593Smuzhiyun         if (s_full_info->linked_to_isp) {
1252*4882a593Smuzhiyun             for (i = 0; i < MAX_CAM_NUM; i++) {
1253*4882a593Smuzhiyun                 LOGI_CAMHW_SUBM(ISP20HW_SUBM, "isp model_idx: %d, ispp(%d) model_idx: %d\n",
1254*4882a593Smuzhiyun                                 s_full_info->isp_info->model_idx,
1255*4882a593Smuzhiyun                                 i,
1256*4882a593Smuzhiyun                                 CamHwIsp20::mIspHwInfos.ispp_info[i].model_idx);
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun                 if (CamHwIsp20::mIspHwInfos.ispp_info[i].valid &&
1259*4882a593Smuzhiyun                         (s_full_info->isp_info->model_idx == CamHwIsp20::mIspHwInfos.ispp_info[i].model_idx)) {
1260*4882a593Smuzhiyun                     s_full_info->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
1261*4882a593Smuzhiyun                     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "isp(%d) link to ispp(%d)\n",
1262*4882a593Smuzhiyun                                     s_full_info->isp_info->model_idx,
1263*4882a593Smuzhiyun                                     CamHwIsp20::mIspHwInfos.ispp_info[i].model_idx);
1264*4882a593Smuzhiyun                     CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx =
1265*4882a593Smuzhiyun                         atoi(s_full_info->ispp_info->media_dev_path + strlen("/dev/media"));
1266*4882a593Smuzhiyun                     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor %s adapted to pp media %d:%s\n",
1267*4882a593Smuzhiyun                                     s_full_info->sensor_name.c_str(),
1268*4882a593Smuzhiyun                                     CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx,
1269*4882a593Smuzhiyun                                     s_full_info->ispp_info->media_dev_path);
1270*4882a593Smuzhiyun                     break;
1271*4882a593Smuzhiyun                 }
1272*4882a593Smuzhiyun             }
1273*4882a593Smuzhiyun         } else {
1274*4882a593Smuzhiyun             /*
1275*4882a593Smuzhiyun              * Determine which isp that vipCap is linked
1276*4882a593Smuzhiyun              */
1277*4882a593Smuzhiyun             for (i = 0; i < MAX_CAM_NUM; i++) {
1278*4882a593Smuzhiyun                 rk_aiq_isp_t* isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
1279*4882a593Smuzhiyun 
1280*4882a593Smuzhiyun                 for (int vicap_idx = 0; vicap_idx < MAX_ISP_LINKED_VICAP_CNT; vicap_idx++) {
1281*4882a593Smuzhiyun                     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "vicap %s, linked_vicap %s",
1282*4882a593Smuzhiyun                                     s_full_info->cif_info->model_str, isp_info->linked_vicap[vicap_idx]);
1283*4882a593Smuzhiyun                     if (strcmp(s_full_info->cif_info->model_str, isp_info->linked_vicap[vicap_idx]) == 0) {
1284*4882a593Smuzhiyun                         s_full_info->isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
1285*4882a593Smuzhiyun                         CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->is_multi_isp_mode =
1286*4882a593Smuzhiyun                             s_full_info->isp_info->is_multi_isp_mode;
1287*4882a593Smuzhiyun                         CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]
1288*4882a593Smuzhiyun                         ->multi_isp_extended_pixel = mMultiIspExtendedPixel;
1289*4882a593Smuzhiyun                         if (CamHwIsp20::mIspHwInfos.ispp_info[i].valid)
1290*4882a593Smuzhiyun                             s_full_info->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
1291*4882a593Smuzhiyun                         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "vicap link to isp(%d) to ispp(%d)\n",
1292*4882a593Smuzhiyun                                         s_full_info->isp_info->model_idx,
1293*4882a593Smuzhiyun                                         s_full_info->ispp_info ? s_full_info->ispp_info->model_idx : -1);
1294*4882a593Smuzhiyun                         CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx =
1295*4882a593Smuzhiyun                             s_full_info->ispp_info ? atoi(s_full_info->ispp_info->media_dev_path + strlen("/dev/media")) :
1296*4882a593Smuzhiyun                             -1;
1297*4882a593Smuzhiyun                         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor %s adapted to pp media %d:%s\n",
1298*4882a593Smuzhiyun                                         s_full_info->sensor_name.c_str(),
1299*4882a593Smuzhiyun                                         CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx,
1300*4882a593Smuzhiyun                                         s_full_info->ispp_info ? s_full_info->ispp_info->media_dev_path : "null");
1301*4882a593Smuzhiyun                         CamHwIsp20::mIspHwInfos.isp_info[i].linked_sensor = true;
1302*4882a593Smuzhiyun                     }
1303*4882a593Smuzhiyun                 }
1304*4882a593Smuzhiyun             }
1305*4882a593Smuzhiyun         }
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun         if (!s_full_info->isp_info/* || !s_full_info->ispp_info*/) {
1308*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get isp or ispp info fail, something gos wrong!");
1309*4882a593Smuzhiyun         } else {
1310*4882a593Smuzhiyun             //CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->linked_isp_info = *s_full_info->isp_info;
1311*4882a593Smuzhiyun             //CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->linked_ispp_info = *s_full_info->ispp_info;
1312*4882a593Smuzhiyun         }
1313*4882a593Smuzhiyun     }
1314*4882a593Smuzhiyun 
1315*4882a593Smuzhiyun     /* Look for free isp&ispp link to fake camera */
1316*4882a593Smuzhiyun     for (i = 0; i < MAX_CAM_NUM; i++) {
1317*4882a593Smuzhiyun         if (CamHwIsp20::mIspHwInfos.isp_info[i].valid &&
1318*4882a593Smuzhiyun                 !CamHwIsp20::mIspHwInfos.isp_info[i].linked_sensor) {
1319*4882a593Smuzhiyun             rk_aiq_static_info_t *hwinfo = new rk_aiq_static_info_t();
1320*4882a593Smuzhiyun             rk_sensor_full_info_t *fullinfo = new rk_sensor_full_info_t();
1321*4882a593Smuzhiyun 
1322*4882a593Smuzhiyun             fullinfo->isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
1323*4882a593Smuzhiyun             if (CamHwIsp20::mIspHwInfos.ispp_info[i].valid) {
1324*4882a593Smuzhiyun                 fullinfo->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
1325*4882a593Smuzhiyun                 hwinfo->sensor_info.binded_strm_media_idx =
1326*4882a593Smuzhiyun                     atoi(fullinfo->ispp_info->media_dev_path + strlen("/dev/media"));
1327*4882a593Smuzhiyun             }
1328*4882a593Smuzhiyun             fullinfo->media_node_index = -1;
1329*4882a593Smuzhiyun             fullinfo->device_name = std::string("/dev/null");
1330*4882a593Smuzhiyun             fullinfo->sensor_name = std::string("FakeCamera");
1331*4882a593Smuzhiyun             fullinfo->sensor_name += std::to_string(i);
1332*4882a593Smuzhiyun             fullinfo->parent_media_dev = std::string("/dev/null");
1333*4882a593Smuzhiyun             fullinfo->linked_to_isp = true;
1334*4882a593Smuzhiyun 
1335*4882a593Smuzhiyun             hwinfo->sensor_info.support_fmt[0].hdr_mode = NO_HDR;
1336*4882a593Smuzhiyun             hwinfo->sensor_info.support_fmt[1].hdr_mode = HDR_X2;
1337*4882a593Smuzhiyun             hwinfo->sensor_info.support_fmt[2].hdr_mode = HDR_X3;
1338*4882a593Smuzhiyun             hwinfo->sensor_info.num = 3;
1339*4882a593Smuzhiyun             CamHwIsp20::mIspHwInfos.isp_info[i].linked_sensor = true;
1340*4882a593Smuzhiyun 
1341*4882a593Smuzhiyun             SensorInfoCopy(fullinfo, hwinfo);
1342*4882a593Smuzhiyun             hwinfo->has_lens_vcm = false;
1343*4882a593Smuzhiyun             hwinfo->has_fl = false;
1344*4882a593Smuzhiyun             hwinfo->has_irc = false;
1345*4882a593Smuzhiyun             hwinfo->fl_strth_adj_sup = 0;
1346*4882a593Smuzhiyun             hwinfo->fl_ir_strth_adj_sup = 0;
1347*4882a593Smuzhiyun             hwinfo->is_multi_isp_mode        = fullinfo->isp_info->is_multi_isp_mode;
1348*4882a593Smuzhiyun             hwinfo->multi_isp_extended_pixel = mMultiIspExtendedPixel;
1349*4882a593Smuzhiyun             CamHwIsp20::mSensorHwInfos[fullinfo->sensor_name] = fullinfo;
1350*4882a593Smuzhiyun             CamHwIsp20::mCamHwInfos[fullinfo->sensor_name] = hwinfo;
1351*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "fake camera %d link to isp(%d) to ispp(%d)\n",
1352*4882a593Smuzhiyun                             i,
1353*4882a593Smuzhiyun                             fullinfo->isp_info->model_idx,
1354*4882a593Smuzhiyun                             fullinfo->ispp_info ? fullinfo->ispp_info->model_idx : -1);
1355*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor %s adapted to pp media %d:%s\n",
1356*4882a593Smuzhiyun                             fullinfo->sensor_name.c_str(),
1357*4882a593Smuzhiyun                             CamHwIsp20::mCamHwInfos[fullinfo->sensor_name]->sensor_info.binded_strm_media_idx,
1358*4882a593Smuzhiyun                             fullinfo->ispp_info ? fullinfo->ispp_info->media_dev_path : "null");
1359*4882a593Smuzhiyun         }
1360*4882a593Smuzhiyun     }
1361*4882a593Smuzhiyun 
1362*4882a593Smuzhiyun     get_isp_ver(&CamHwIsp20::mIspHwInfos);
1363*4882a593Smuzhiyun     for (auto &item : mCamHwInfos)
1364*4882a593Smuzhiyun         item.second->isp_hw_ver = mIspHwInfos.hw_ver_info.isp_ver;
1365*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
1366*4882a593Smuzhiyun }
1367*4882a593Smuzhiyun 
1368*4882a593Smuzhiyun const char*
getBindedSnsEntNmByVd(const char * vd)1369*4882a593Smuzhiyun CamHwIsp20::getBindedSnsEntNmByVd(const char* vd)
1370*4882a593Smuzhiyun {
1371*4882a593Smuzhiyun     if (!vd)
1372*4882a593Smuzhiyun         return NULL;
1373*4882a593Smuzhiyun 
1374*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator iter;
1375*4882a593Smuzhiyun     for(iter = CamHwIsp20::mSensorHwInfos.begin(); \
1376*4882a593Smuzhiyun             iter != CamHwIsp20::mSensorHwInfos.end(); iter++) {
1377*4882a593Smuzhiyun         SmartPtr<rk_sensor_full_info_t> s_full_info = iter->second;
1378*4882a593Smuzhiyun 
1379*4882a593Smuzhiyun         // skip 1608-dphy 'sensor'
1380*4882a593Smuzhiyun         if (strstr(s_full_info->sensor_name.c_str(), "1608"))
1381*4882a593Smuzhiyun             continue;
1382*4882a593Smuzhiyun         if (!s_full_info->isp_info)
1383*4882a593Smuzhiyun             continue;
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun         bool stream_vd = false;
1386*4882a593Smuzhiyun         if (s_full_info->ispp_info) {
1387*4882a593Smuzhiyun             if (strstr(s_full_info->ispp_info->pp_m_bypass_path, vd) ||
1388*4882a593Smuzhiyun                     strstr(s_full_info->ispp_info->pp_scale0_path, vd) ||
1389*4882a593Smuzhiyun                     strstr(s_full_info->ispp_info->pp_scale1_path, vd) ||
1390*4882a593Smuzhiyun                     strstr(s_full_info->ispp_info->pp_scale2_path, vd))
1391*4882a593Smuzhiyun                 stream_vd = true;
1392*4882a593Smuzhiyun         } else {
1393*4882a593Smuzhiyun             if (strstr(s_full_info->isp_info->main_path, vd) ||
1394*4882a593Smuzhiyun                     strstr(s_full_info->isp_info->self_path, vd))
1395*4882a593Smuzhiyun                 stream_vd = true;
1396*4882a593Smuzhiyun         }
1397*4882a593Smuzhiyun 
1398*4882a593Smuzhiyun         if (stream_vd) {
1399*4882a593Smuzhiyun             // check linked
1400*4882a593Smuzhiyun             if ((strstr(s_full_info->sensor_name.c_str(), "FakeCamera") == NULL) &&
1401*4882a593Smuzhiyun                     (strstr(s_full_info->sensor_name.c_str(), "_s_") == NULL)) {
1402*4882a593Smuzhiyun                 FILE *fp = NULL;
1403*4882a593Smuzhiyun                 struct media_device *device = NULL;
1404*4882a593Smuzhiyun                 uint32_t nents, j = 0, i = 0;
1405*4882a593Smuzhiyun                 const struct media_entity_desc *entity_info = NULL;
1406*4882a593Smuzhiyun                 struct media_entity *entity = NULL;
1407*4882a593Smuzhiyun                 media_pad *src_pad_s = NULL;
1408*4882a593Smuzhiyun                 char sys_path[64], devpath[32];
1409*4882a593Smuzhiyun 
1410*4882a593Smuzhiyun                 snprintf (sys_path, 64, "/dev/media%d", s_full_info->media_node_index);
1411*4882a593Smuzhiyun                 if (0 != access(sys_path, F_OK))
1412*4882a593Smuzhiyun                     continue;
1413*4882a593Smuzhiyun 
1414*4882a593Smuzhiyun                 device = media_device_new (sys_path);
1415*4882a593Smuzhiyun                 if (!device)
1416*4882a593Smuzhiyun                     return nullptr;
1417*4882a593Smuzhiyun 
1418*4882a593Smuzhiyun                 /* Enumerate entities, pads and links. */
1419*4882a593Smuzhiyun                 media_device_enumerate (device);
1420*4882a593Smuzhiyun                 entity = media_get_entity_by_name(device,
1421*4882a593Smuzhiyun                                                   s_full_info->sensor_name.c_str(),
1422*4882a593Smuzhiyun                                                   s_full_info->sensor_name.size());
1423*4882a593Smuzhiyun                 entity_info = media_entity_get_info(entity);
1424*4882a593Smuzhiyun                 if (entity && entity->num_links > 0) {
1425*4882a593Smuzhiyun                     if (entity->links[0].flags == MEDIA_LNK_FL_ENABLED) {
1426*4882a593Smuzhiyun                         media_device_unref (device);
1427*4882a593Smuzhiyun                         return  s_full_info->sensor_name.c_str();
1428*4882a593Smuzhiyun                     }
1429*4882a593Smuzhiyun                 }
1430*4882a593Smuzhiyun                 media_device_unref (device);
1431*4882a593Smuzhiyun             } else
1432*4882a593Smuzhiyun                 return  s_full_info->sensor_name.c_str();
1433*4882a593Smuzhiyun         }
1434*4882a593Smuzhiyun     }
1435*4882a593Smuzhiyun 
1436*4882a593Smuzhiyun     return NULL;
1437*4882a593Smuzhiyun }
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun #if defined(ISP_HW_V20)
1440*4882a593Smuzhiyun XCamReturn
init_pp(rk_sensor_full_info_t * s_info)1441*4882a593Smuzhiyun CamHwIsp20::init_pp(rk_sensor_full_info_t *s_info)
1442*4882a593Smuzhiyun {
1443*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1444*4882a593Smuzhiyun     SmartPtr<PollThread> isp20IsppPollthread;
1445*4882a593Smuzhiyun 
1446*4882a593Smuzhiyun     if (!s_info->ispp_info)
1447*4882a593Smuzhiyun         return ret;
1448*4882a593Smuzhiyun 
1449*4882a593Smuzhiyun     if (!strlen(s_info->ispp_info->media_dev_path))
1450*4882a593Smuzhiyun         return ret;
1451*4882a593Smuzhiyun     _ispp_sd = new V4l2SubDevice(s_info->ispp_info->pp_dev_path);
1452*4882a593Smuzhiyun     _ispp_sd ->open();
1453*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "pp_dev_path: %s\n", s_info->ispp_info->pp_dev_path);
1454*4882a593Smuzhiyun 
1455*4882a593Smuzhiyun     mTnrStreamProcUnit = new TnrStreamProcUnit(s_info);
1456*4882a593Smuzhiyun     mTnrStreamProcUnit->set_devices(this, _ispp_sd);
1457*4882a593Smuzhiyun     mNrStreamProcUnit = new NrStreamProcUnit(s_info);
1458*4882a593Smuzhiyun     mNrStreamProcUnit->set_devices(this, _ispp_sd);
1459*4882a593Smuzhiyun     mFecParamStream = new FecParamStream(s_info);
1460*4882a593Smuzhiyun     mFecParamStream->set_devices(this, _ispp_sd);
1461*4882a593Smuzhiyun 
1462*4882a593Smuzhiyun     return ret;
1463*4882a593Smuzhiyun }
1464*4882a593Smuzhiyun #endif
1465*4882a593Smuzhiyun 
1466*4882a593Smuzhiyun XCamReturn
init(const char * sns_ent_name)1467*4882a593Smuzhiyun CamHwIsp20::init(const char* sns_ent_name)
1468*4882a593Smuzhiyun {
1469*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1470*4882a593Smuzhiyun     SmartPtr<BaseSensorHw> sensorHw;
1471*4882a593Smuzhiyun     SmartPtr<LensHw> lensHw;
1472*4882a593Smuzhiyun     SmartPtr<V4l2Device> mipi_tx_devs[3];
1473*4882a593Smuzhiyun     SmartPtr<V4l2Device> mipi_rx_devs[3];
1474*4882a593Smuzhiyun     std::string sensor_name(sns_ent_name);
1475*4882a593Smuzhiyun 
1476*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
1477*4882a593Smuzhiyun 
1478*4882a593Smuzhiyun 
1479*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
1480*4882a593Smuzhiyun     if ((it = mSensorHwInfos.find(sensor_name)) == mSensorHwInfos.end()) {
1481*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_ent_name);
1482*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
1483*4882a593Smuzhiyun     }
1484*4882a593Smuzhiyun     rk_sensor_full_info_t *s_info = it->second.ptr();
1485*4882a593Smuzhiyun     sensorHw = new SensorHw(s_info->device_name.c_str());
1486*4882a593Smuzhiyun     sensorHw->setCamPhyId(mCamPhyId);
1487*4882a593Smuzhiyun     mSensorDev = sensorHw;
1488*4882a593Smuzhiyun     mSensorDev->open();
1489*4882a593Smuzhiyun     sensorHw->setTbInfo (mTbInfo.is_pre_aiq);
1490*4882a593Smuzhiyun 
1491*4882a593Smuzhiyun     Isp20Params::setCamPhyId(mCamPhyId);
1492*4882a593Smuzhiyun 
1493*4882a593Smuzhiyun     strncpy(sns_name, sns_ent_name, sizeof(sns_name) - 1);
1494*4882a593Smuzhiyun     sns_name[sizeof(sns_name) - 1] = '\0';
1495*4882a593Smuzhiyun 
1496*4882a593Smuzhiyun     // normal env.
1497*4882a593Smuzhiyun     if (s_info->linked_to_isp) {
1498*4882a593Smuzhiyun         _linked_to_isp  = true;
1499*4882a593Smuzhiyun         _linked_to_1608 = false;
1500*4882a593Smuzhiyun     } else {
1501*4882a593Smuzhiyun         _linked_to_isp  = false;
1502*4882a593Smuzhiyun         _linked_to_1608 = false;
1503*4882a593Smuzhiyun     }
1504*4882a593Smuzhiyun 
1505*4882a593Smuzhiyun     // 1608 sensor env.
1506*4882a593Smuzhiyun     if (s_info->linked_to_1608) {
1507*4882a593Smuzhiyun         _linked_to_isp  = false;
1508*4882a593Smuzhiyun         _linked_to_1608 = true;
1509*4882a593Smuzhiyun         // [baron] Record the number of use sensors(valid 1608 sensor)
1510*4882a593Smuzhiyun         CamHwIsp20::rk1608_share_inf.en_sns_num++;
1511*4882a593Smuzhiyun     }
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun     mIspCoreDev = new V4l2SubDevice(s_info->isp_info->isp_dev_path);
1514*4882a593Smuzhiyun     mIspCoreDev->open();
1515*4882a593Smuzhiyun 
1516*4882a593Smuzhiyun     if (strlen(s_info->isp_info->mipi_luma_path)) {
1517*4882a593Smuzhiyun         if (_linked_to_isp) {
1518*4882a593Smuzhiyun             mIspLumaDev = new V4l2Device(s_info->isp_info->mipi_luma_path);
1519*4882a593Smuzhiyun         } else
1520*4882a593Smuzhiyun             mIspLumaDev = new V4l2Device(s_info->cif_info->mipi_luma_path);
1521*4882a593Smuzhiyun         mIspLumaDev->open();
1522*4882a593Smuzhiyun     }
1523*4882a593Smuzhiyun 
1524*4882a593Smuzhiyun     mIspStatsDev = new V4l2Device (s_info->isp_info->stats_path);
1525*4882a593Smuzhiyun     mIspStatsDev->open();
1526*4882a593Smuzhiyun     mIspParamsDev = new V4l2Device (s_info->isp_info->input_params_path);
1527*4882a593Smuzhiyun     mIspParamsDev->open();
1528*4882a593Smuzhiyun 
1529*4882a593Smuzhiyun     if(!s_info->module_lens_dev_name.empty()) {
1530*4882a593Smuzhiyun         lensHw = new LensHw(s_info->module_lens_dev_name.c_str());
1531*4882a593Smuzhiyun         mLensDev = lensHw;
1532*4882a593Smuzhiyun         mLensDev->open();
1533*4882a593Smuzhiyun     }
1534*4882a593Smuzhiyun #if defined(ISP_HW_V20) || defined(ISP_HW_V21)
1535*4882a593Smuzhiyun     else {
1536*4882a593Smuzhiyun         // af soft stats need this device on 356x 1126
1537*4882a593Smuzhiyun         lensHw = new LensHw(NULL);
1538*4882a593Smuzhiyun         mLensDev = lensHw;
1539*4882a593Smuzhiyun     }
1540*4882a593Smuzhiyun #endif
1541*4882a593Smuzhiyun 
1542*4882a593Smuzhiyun     if(!s_info->module_ircut_dev_name.empty()) {
1543*4882a593Smuzhiyun         mIrcutDev = new V4l2SubDevice(s_info->module_ircut_dev_name.c_str());
1544*4882a593Smuzhiyun         mIrcutDev->open();
1545*4882a593Smuzhiyun     }
1546*4882a593Smuzhiyun 
1547*4882a593Smuzhiyun     if (!_linked_to_isp) {
1548*4882a593Smuzhiyun         if (strlen(s_info->cif_info->mipi_csi2_sd_path) > 0) {
1549*4882a593Smuzhiyun             _cif_csi2_sd = new V4l2SubDevice (s_info->cif_info->mipi_csi2_sd_path);
1550*4882a593Smuzhiyun         } else if (strlen(s_info->cif_info->lvds_sd_path) > 0) {
1551*4882a593Smuzhiyun             _cif_csi2_sd = new V4l2SubDevice (s_info->cif_info->lvds_sd_path);
1552*4882a593Smuzhiyun         } else if (strlen(s_info->cif_info->dvp_sof_sd_path) > 0) {
1553*4882a593Smuzhiyun             _cif_csi2_sd = new V4l2SubDevice (s_info->cif_info->dvp_sof_sd_path);
1554*4882a593Smuzhiyun         } else {
1555*4882a593Smuzhiyun             LOGW_CAMHW_SUBM(ISP20HW_SUBM, "_cif_csi2_sd is null! \n");
1556*4882a593Smuzhiyun         }
1557*4882a593Smuzhiyun         _cif_csi2_sd->open();
1558*4882a593Smuzhiyun     }
1559*4882a593Smuzhiyun 
1560*4882a593Smuzhiyun #if defined(ISP_HW_V20)
1561*4882a593Smuzhiyun     init_pp(s_info);
1562*4882a593Smuzhiyun #endif
1563*4882a593Smuzhiyun #if defined(RKAIQ_ENABLE_SPSTREAM)
1564*4882a593Smuzhiyun     mIspSpDev = new V4l2Device (s_info->isp_info->self_path);//rkisp_selfpath
1565*4882a593Smuzhiyun     mIspSpDev->open();
1566*4882a593Smuzhiyun     mSpStreamUnit = new SPStreamProcUnit(mIspSpDev, ISP_POLL_SP, mIspHwInfos.hw_ver_info.isp_ver);
1567*4882a593Smuzhiyun     mSpStreamUnit->set_devices(this, mIspCoreDev, _ispp_sd, mLensDev);
1568*4882a593Smuzhiyun #endif
1569*4882a593Smuzhiyun 
1570*4882a593Smuzhiyun     mPdafStreamUnit = new PdafStreamProcUnit(ISP_POLL_PDAF_STATS);
1571*4882a593Smuzhiyun     mPdafStreamUnit->set_devices(this);
1572*4882a593Smuzhiyun 
1573*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
1574*4882a593Smuzhiyun     auto buf_it = std::find_if(
1575*4882a593Smuzhiyun                       std::begin(mDevBufCntMap), std::end(mDevBufCntMap),
1576*4882a593Smuzhiyun     [&](const std::pair<std::string, int>& buf_cnt_map) {
1577*4882a593Smuzhiyun         return (
1578*4882a593Smuzhiyun                    !buf_cnt_map.first.compare("rkraw_tx") || !buf_cnt_map.first.compare("rkraw_rx") ||
1579*4882a593Smuzhiyun                    !buf_cnt_map.first.compare(0, sizeof("stream_cif_mipi_id"), "stream_cif_mipi_id") ||
1580*4882a593Smuzhiyun                    !buf_cnt_map.first.compare(0, sizeof("rkisp_rawwr"), "rkisp_rawwr"));
1581*4882a593Smuzhiyun     });
1582*4882a593Smuzhiyun     int buf_cnt = 0;
1583*4882a593Smuzhiyun     if (buf_it != mDevBufCntMap.end()) {
1584*4882a593Smuzhiyun         buf_cnt = buf_it->second;
1585*4882a593Smuzhiyun     }
1586*4882a593Smuzhiyun 
1587*4882a593Smuzhiyun     if (!_linked_to_1608) {
1588*4882a593Smuzhiyun         mRawCapUnit = new RawStreamCapUnit(s_info, _linked_to_isp, buf_cnt);
1589*4882a593Smuzhiyun         mRawProcUnit = new RawStreamProcUnit(s_info, _linked_to_isp, buf_cnt);
1590*4882a593Smuzhiyun 
1591*4882a593Smuzhiyun         // set sensor stream flag.
1592*4882a593Smuzhiyun         mRawCapUnit->setSensorCategory(false);
1593*4882a593Smuzhiyun         mRawProcUnit->setSensorCategory(false);
1594*4882a593Smuzhiyun     } else {
1595*4882a593Smuzhiyun         // 1608 sensor
1596*4882a593Smuzhiyun         if (NULL == CamHwIsp20::rk1608_share_inf.raw_cap_unit.ptr()) {
1597*4882a593Smuzhiyun             // [baron] just new buffer in 1st.
1598*4882a593Smuzhiyun             mRawCapUnit = new RawStreamCapUnit(s_info, _linked_to_isp, buf_cnt);
1599*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.raw_cap_unit = mRawCapUnit;
1600*4882a593Smuzhiyun         }
1601*4882a593Smuzhiyun 
1602*4882a593Smuzhiyun         mRawProcUnit = new RawStreamProcUnit(s_info, _linked_to_isp, buf_cnt);
1603*4882a593Smuzhiyun         if (mRawProcUnit.ptr()) {
1604*4882a593Smuzhiyun             // [baron] save multi rx addr for 1 tx.
1605*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.raw_proc_unit[mCamPhyId] = mRawProcUnit.ptr();
1606*4882a593Smuzhiyun         }
1607*4882a593Smuzhiyun 
1608*4882a593Smuzhiyun         // update tx by bakeup tx.
1609*4882a593Smuzhiyun         mRawCapUnit = CamHwIsp20::rk1608_share_inf.raw_cap_unit;
1610*4882a593Smuzhiyun         mRawCapUnit->setSensorCategory(true);
1611*4882a593Smuzhiyun         mRawProcUnit->setSensorCategory(true);
1612*4882a593Smuzhiyun     }
1613*4882a593Smuzhiyun 
1614*4882a593Smuzhiyun     mRawCapUnit->set_devices(mIspCoreDev, this, mRawProcUnit.ptr());
1615*4882a593Smuzhiyun     mRawProcUnit->set_devices(mIspCoreDev, this);
1616*4882a593Smuzhiyun     mRawCapUnit->setCamPhyId(mCamPhyId);
1617*4882a593Smuzhiyun     mRawProcUnit->setCamPhyId(mCamPhyId);
1618*4882a593Smuzhiyun #endif
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun     //cif scale
1621*4882a593Smuzhiyun     if (!_linked_to_isp && !_linked_to_1608) {
1622*4882a593Smuzhiyun         if (strlen(s_info->cif_info->mipi_scl0))
1623*4882a593Smuzhiyun             mCifScaleStream = new CifSclStream();
1624*4882a593Smuzhiyun     }
1625*4882a593Smuzhiyun 
1626*4882a593Smuzhiyun     //isp stats
1627*4882a593Smuzhiyun     mIspStatsStream = new RKStatsStream(mIspStatsDev, ISP_POLL_3A_STATS);
1628*4882a593Smuzhiyun     mIspStatsStream->setPollCallback (this);
1629*4882a593Smuzhiyun     mIspStatsStream->set_event_handle_dev(sensorHw);
1630*4882a593Smuzhiyun     if(lensHw.ptr()) {
1631*4882a593Smuzhiyun         mIspStatsStream->set_focus_handle_dev(lensHw);
1632*4882a593Smuzhiyun     }
1633*4882a593Smuzhiyun     mIspStatsStream->set_rx_handle_dev(this);
1634*4882a593Smuzhiyun     mIspStatsStream->setCamPhyId(mCamPhyId);
1635*4882a593Smuzhiyun     //luma
1636*4882a593Smuzhiyun     if (mIspLumaDev.ptr()) {
1637*4882a593Smuzhiyun         mLumaStream = new RKStream(mIspLumaDev, ISP_POLL_LUMA);
1638*4882a593Smuzhiyun         mLumaStream->setPollCallback (this);
1639*4882a593Smuzhiyun     }
1640*4882a593Smuzhiyun 
1641*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
1642*4882a593Smuzhiyun     //isp params
1643*4882a593Smuzhiyun     mIspParamStream = new RKStream(mIspParamsDev, ISP_POLL_PARAMS);
1644*4882a593Smuzhiyun     mIspParamStream->setCamPhyId(mCamPhyId);
1645*4882a593Smuzhiyun     mIspParamStream->setPollCallback (this);
1646*4882a593Smuzhiyun #endif
1647*4882a593Smuzhiyun 
1648*4882a593Smuzhiyun     if (s_info->flash_num) {
1649*4882a593Smuzhiyun         mFlashLight = new FlashLightHw(s_info->module_flash_dev_name, s_info->flash_num);
1650*4882a593Smuzhiyun         mFlashLight->init(s_info->flash_num);
1651*4882a593Smuzhiyun     }
1652*4882a593Smuzhiyun     if (s_info->flash_ir_num) {
1653*4882a593Smuzhiyun         mFlashLightIr = new FlashLightHw(s_info->module_flash_ir_dev_name, s_info->flash_ir_num);
1654*4882a593Smuzhiyun         mFlashLightIr->init(s_info->flash_ir_num);
1655*4882a593Smuzhiyun     }
1656*4882a593Smuzhiyun 
1657*4882a593Smuzhiyun #if defined(ISP_HW_V20)
1658*4882a593Smuzhiyun     xcam_mem_clear (_full_active_ispp_params);
1659*4882a593Smuzhiyun #endif
1660*4882a593Smuzhiyun     _state = CAM_HW_STATE_INITED;
1661*4882a593Smuzhiyun 
1662*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
1663*4882a593Smuzhiyun 
1664*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
1665*4882a593Smuzhiyun }
1666*4882a593Smuzhiyun 
1667*4882a593Smuzhiyun XCamReturn
deInit()1668*4882a593Smuzhiyun CamHwIsp20::deInit()
1669*4882a593Smuzhiyun {
1670*4882a593Smuzhiyun     if (mPdafStreamUnit.ptr())
1671*4882a593Smuzhiyun         mPdafStreamUnit->deinit();
1672*4882a593Smuzhiyun     if (mFlashLight.ptr())
1673*4882a593Smuzhiyun         mFlashLight->deinit();
1674*4882a593Smuzhiyun     if (mFlashLightIr.ptr())
1675*4882a593Smuzhiyun         mFlashLightIr->deinit();
1676*4882a593Smuzhiyun 
1677*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
1678*4882a593Smuzhiyun     if (strlen(sns_name) == 0 || (it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
1679*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", strlen(sns_name) ? sns_name : "");
1680*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
1681*4882a593Smuzhiyun     }
1682*4882a593Smuzhiyun 
1683*4882a593Smuzhiyun     rk_sensor_full_info_t *s_info = it->second.ptr();
1684*4882a593Smuzhiyun     int isp_index = s_info->isp_info->logic_id;
1685*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sensor_name(%s) is linked to isp_index(%d)",
1686*4882a593Smuzhiyun                     sns_name, isp_index);
1687*4882a593Smuzhiyun     if (!mNoReadBack) {
1688*4882a593Smuzhiyun         setupHdrLink(RK_AIQ_WORKING_MODE_ISP_HDR3, isp_index, false);
1689*4882a593Smuzhiyun         setupHdrLink_vidcap(_hdr_mode, isp_index, false);
1690*4882a593Smuzhiyun     }
1691*4882a593Smuzhiyun 
1692*4882a593Smuzhiyun     {
1693*4882a593Smuzhiyun         // TODO: These parameters only deinited when the first sensor deinit!
1694*4882a593Smuzhiyun         if (CamHwIsp20::rk1608_share_inf.raw_cap_unit.ptr()) {
1695*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.raw_cap_unit = NULL;
1696*4882a593Smuzhiyun             for (int i = 0; i < CAM_INDEX_FOR_1608; i++) {
1697*4882a593Smuzhiyun                 CamHwIsp20::rk1608_share_inf.raw_proc_unit[i] = NULL;
1698*4882a593Smuzhiyun             }
1699*4882a593Smuzhiyun             // [Stage 01] {init} <-> {deinit}.
1700*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.en_sns_num = 0;     // last sensor valid!
1701*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.us_open_cnt = 0;
1702*4882a593Smuzhiyun 
1703*4882a593Smuzhiyun             // [Stage 02] {Prepare} <-> {deinit}
1704*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.us_prepare_cnt = 0;    // prepare stage use
1705*4882a593Smuzhiyun         }
1706*4882a593Smuzhiyun         CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId] = 1;   // prepare stage use
1707*4882a593Smuzhiyun     }
1708*4882a593Smuzhiyun     _state = CAM_HW_STATE_INVALID;
1709*4882a593Smuzhiyun     if (strstr(sns_name, "_s_")) {
1710*4882a593Smuzhiyun         rawReproc_deInit(sns_name);
1711*4882a593Smuzhiyun     }
1712*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
1713*4882a593Smuzhiyun }
1714*4882a593Smuzhiyun 
1715*4882a593Smuzhiyun XCamReturn
poll_buffer_ready(SmartPtr<VideoBuffer> & buf)1716*4882a593Smuzhiyun CamHwIsp20::poll_buffer_ready (SmartPtr<VideoBuffer> &buf)
1717*4882a593Smuzhiyun {
1718*4882a593Smuzhiyun     if (buf->_buf_type == ISP_POLL_3A_STATS) {
1719*4882a593Smuzhiyun         // stats is comming, means that next params should be ready
1720*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
1721*4882a593Smuzhiyun         if (/*mNoReadBack*/true) {
1722*4882a593Smuzhiyun             if (buf->get_sequence() > 0)
1723*4882a593Smuzhiyun                 mParamsAssembler->forceReady(buf->get_sequence() + 1);
1724*4882a593Smuzhiyun             // set all ready params to drv
1725*4882a593Smuzhiyun             while (_state == CAM_HW_STATE_STARTED &&
1726*4882a593Smuzhiyun                     mParamsAssembler->ready()) {
1727*4882a593Smuzhiyun                 if (setIspConfig() != XCAM_RETURN_NO_ERROR)
1728*4882a593Smuzhiyun                     break;
1729*4882a593Smuzhiyun             }
1730*4882a593Smuzhiyun 
1731*4882a593Smuzhiyun         }
1732*4882a593Smuzhiyun #endif
1733*4882a593Smuzhiyun     } else if (buf->_buf_type == ISP_POLL_PARAMS) {
1734*4882a593Smuzhiyun         V4l2BufferProxy* v4lbuf = buf.get_cast_ptr<V4l2BufferProxy>();
1735*4882a593Smuzhiyun         struct isp2x_isp_params_cfg* data = (struct isp2x_isp_params_cfg*)(v4lbuf->get_v4l2_userptr());
1736*4882a593Smuzhiyun         static int frame_id0_cnt = 0;
1737*4882a593Smuzhiyun         if (mTbInfo.is_pre_aiq) {
1738*4882a593Smuzhiyun             if (data->frame_id == 0) {
1739*4882a593Smuzhiyun                 ++frame_id0_cnt;
1740*4882a593Smuzhiyun             }
1741*4882a593Smuzhiyun             LOGE("<TB> poll param id %d cnt %d", data->frame_id, frame_id0_cnt);
1742*4882a593Smuzhiyun         }
1743*4882a593Smuzhiyun         if (!mTbInfo.is_pre_aiq && frame_id0_cnt < 1) {
1744*4882a593Smuzhiyun             return XCAM_RETURN_NO_ERROR;
1745*4882a593Smuzhiyun         }
1746*4882a593Smuzhiyun     }
1747*4882a593Smuzhiyun     return CamHwBase::poll_buffer_ready(buf);
1748*4882a593Smuzhiyun }
1749*4882a593Smuzhiyun 
1750*4882a593Smuzhiyun XCamReturn
setupPipelineFmtCif(struct v4l2_subdev_selection & sns_sd_sel,struct v4l2_subdev_format & sns_sd_fmt,__u32 sns_v4l_pix_fmt)1751*4882a593Smuzhiyun CamHwIsp20::setupPipelineFmtCif(struct v4l2_subdev_selection& sns_sd_sel,
1752*4882a593Smuzhiyun                                 struct v4l2_subdev_format& sns_sd_fmt,
1753*4882a593Smuzhiyun                                 __u32 sns_v4l_pix_fmt)
1754*4882a593Smuzhiyun {
1755*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1756*4882a593Smuzhiyun 
1757*4882a593Smuzhiyun     int8_t bpp = 0;
1758*4882a593Smuzhiyun     pixFmt2Bpp(sns_v4l_pix_fmt, bpp);
1759*4882a593Smuzhiyun 
1760*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
1761*4882a593Smuzhiyun     if (mIsMultiIspMode && !mNoReadBack) {
1762*4882a593Smuzhiyun         ret = mRawCapUnit->set_csi_mem_word_big_align(sns_sd_sel.r.width, sns_sd_sel.r.height,
1763*4882a593Smuzhiyun                 sns_v4l_pix_fmt, bpp);
1764*4882a593Smuzhiyun         if (ret < 0) {
1765*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "tx set csi_mem_word_big_align failed!\n");
1766*4882a593Smuzhiyun             return ret;
1767*4882a593Smuzhiyun         }
1768*4882a593Smuzhiyun 
1769*4882a593Smuzhiyun         ret = mRawProcUnit->set_csi_mem_word_big_align(sns_sd_sel.r.width, sns_sd_sel.r.height,
1770*4882a593Smuzhiyun                 sns_v4l_pix_fmt, bpp);
1771*4882a593Smuzhiyun         if (ret < 0) {
1772*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "rx set csi_mem_word_big_align failed!\n");
1773*4882a593Smuzhiyun             return ret;
1774*4882a593Smuzhiyun         }
1775*4882a593Smuzhiyun     }
1776*4882a593Smuzhiyun 
1777*4882a593Smuzhiyun     // TODO: set cif crop according to sensor crop bounds
1778*4882a593Smuzhiyun     if (!_linked_to_1608) {
1779*4882a593Smuzhiyun         mRawCapUnit->set_tx_format(sns_sd_sel, sns_v4l_pix_fmt);
1780*4882a593Smuzhiyun     } else {
1781*4882a593Smuzhiyun         // [baron] Only processed the first time
1782*4882a593Smuzhiyun         if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
1783*4882a593Smuzhiyun             // [baron] Timing issue, for 1608.
1784*4882a593Smuzhiyun             mRawCapUnit->set_tx_format(sns_sd_sel, sns_v4l_pix_fmt);
1785*4882a593Smuzhiyun         }
1786*4882a593Smuzhiyun     }
1787*4882a593Smuzhiyun 
1788*4882a593Smuzhiyun     mRawProcUnit->set_rx_format(sns_sd_sel, sns_v4l_pix_fmt);
1789*4882a593Smuzhiyun #endif
1790*4882a593Smuzhiyun 
1791*4882a593Smuzhiyun     //set cif scale fmt
1792*4882a593Smuzhiyun     if (mCifScaleStream.ptr()) {
1793*4882a593Smuzhiyun         mCifScaleStream->set_format(sns_sd_sel, sns_v4l_pix_fmt, bpp);
1794*4882a593Smuzhiyun     }
1795*4882a593Smuzhiyun 
1796*4882a593Smuzhiyun     // set isp sink fmt, same as sensor bounds - crop
1797*4882a593Smuzhiyun     struct v4l2_subdev_format isp_sink_fmt;
1798*4882a593Smuzhiyun 
1799*4882a593Smuzhiyun     memset(&isp_sink_fmt, 0, sizeof(isp_sink_fmt));
1800*4882a593Smuzhiyun     isp_sink_fmt.pad = 0;
1801*4882a593Smuzhiyun     isp_sink_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1802*4882a593Smuzhiyun     ret = mIspCoreDev->getFormat(isp_sink_fmt);
1803*4882a593Smuzhiyun     if (ret) {
1804*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
1805*4882a593Smuzhiyun         return ret;
1806*4882a593Smuzhiyun     }
1807*4882a593Smuzhiyun     isp_sink_fmt.format.width = sns_sd_sel.r.width;
1808*4882a593Smuzhiyun     isp_sink_fmt.format.height = sns_sd_sel.r.height;
1809*4882a593Smuzhiyun     isp_sink_fmt.format.code = sns_sd_fmt.format.code;
1810*4882a593Smuzhiyun 
1811*4882a593Smuzhiyun     ret = mIspCoreDev->setFormat(isp_sink_fmt);
1812*4882a593Smuzhiyun     if (ret) {
1813*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
1814*4882a593Smuzhiyun         return ret;
1815*4882a593Smuzhiyun     }
1816*4882a593Smuzhiyun 
1817*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink fmt info: fmt 0x%x, %dx%d !",
1818*4882a593Smuzhiyun                     isp_sink_fmt.format.code, isp_sink_fmt.format.width, isp_sink_fmt.format.height);
1819*4882a593Smuzhiyun 
1820*4882a593Smuzhiyun     // set selection, isp needn't do the crop
1821*4882a593Smuzhiyun     struct v4l2_subdev_selection aSelection;
1822*4882a593Smuzhiyun     memset(&aSelection, 0, sizeof(aSelection));
1823*4882a593Smuzhiyun 
1824*4882a593Smuzhiyun     aSelection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1825*4882a593Smuzhiyun     aSelection.pad = 0;
1826*4882a593Smuzhiyun     aSelection.flags = 0;
1827*4882a593Smuzhiyun     aSelection.target = V4L2_SEL_TGT_CROP;
1828*4882a593Smuzhiyun     aSelection.r.width = sns_sd_sel.r.width;
1829*4882a593Smuzhiyun     aSelection.r.height = sns_sd_sel.r.height;
1830*4882a593Smuzhiyun     aSelection.r.left = 0;
1831*4882a593Smuzhiyun     aSelection.r.top = 0;
1832*4882a593Smuzhiyun     ret = mIspCoreDev->set_selection (aSelection);
1833*4882a593Smuzhiyun     if (ret) {
1834*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev crop failed !\n");
1835*4882a593Smuzhiyun         return ret;
1836*4882a593Smuzhiyun     }
1837*4882a593Smuzhiyun 
1838*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink crop info: %dx%d@%d,%d !",
1839*4882a593Smuzhiyun                     aSelection.r.width, aSelection.r.height,
1840*4882a593Smuzhiyun                     aSelection.r.left, aSelection.r.top);
1841*4882a593Smuzhiyun 
1842*4882a593Smuzhiyun     // set isp rkisp-isp-subdev src crop
1843*4882a593Smuzhiyun     aSelection.pad = 2;
1844*4882a593Smuzhiyun #if 1 // isp src has no crop
1845*4882a593Smuzhiyun     ret = mIspCoreDev->set_selection (aSelection);
1846*4882a593Smuzhiyun     if (ret) {
1847*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev source crop failed !\n");
1848*4882a593Smuzhiyun         return ret;
1849*4882a593Smuzhiyun     }
1850*4882a593Smuzhiyun #endif
1851*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src crop info: %dx%d@%d,%d !",
1852*4882a593Smuzhiyun                     aSelection.r.width, aSelection.r.height,
1853*4882a593Smuzhiyun                     aSelection.r.left, aSelection.r.top);
1854*4882a593Smuzhiyun 
1855*4882a593Smuzhiyun     // set isp rkisp-isp-subdev src pad fmt
1856*4882a593Smuzhiyun     struct v4l2_subdev_format isp_src_fmt;
1857*4882a593Smuzhiyun 
1858*4882a593Smuzhiyun     memset(&isp_src_fmt, 0, sizeof(isp_src_fmt));
1859*4882a593Smuzhiyun     isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1860*4882a593Smuzhiyun     isp_src_fmt.pad = 2;
1861*4882a593Smuzhiyun     ret = mIspCoreDev->getFormat(isp_src_fmt);
1862*4882a593Smuzhiyun     if (ret) {
1863*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get mIspCoreDev src fmt failed !\n");
1864*4882a593Smuzhiyun         return ret;
1865*4882a593Smuzhiyun     }
1866*4882a593Smuzhiyun 
1867*4882a593Smuzhiyun     isp_src_fmt.format.width = aSelection.r.width;
1868*4882a593Smuzhiyun     isp_src_fmt.format.height = aSelection.r.height;
1869*4882a593Smuzhiyun     ret = mIspCoreDev->setFormat(isp_src_fmt);
1870*4882a593Smuzhiyun     if (ret) {
1871*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev src fmt failed !\n");
1872*4882a593Smuzhiyun         return ret;
1873*4882a593Smuzhiyun     }
1874*4882a593Smuzhiyun 
1875*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src fmt info: fmt 0x%x, %dx%d !",
1876*4882a593Smuzhiyun                     isp_src_fmt.format.code, isp_src_fmt.format.width, isp_src_fmt.format.height);
1877*4882a593Smuzhiyun 
1878*4882a593Smuzhiyun     return ret;
1879*4882a593Smuzhiyun 
1880*4882a593Smuzhiyun }
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun XCamReturn
setupPipelineFmtIsp(struct v4l2_subdev_selection & sns_sd_sel,struct v4l2_subdev_format & sns_sd_fmt,__u32 sns_v4l_pix_fmt)1883*4882a593Smuzhiyun CamHwIsp20::setupPipelineFmtIsp(struct v4l2_subdev_selection& sns_sd_sel,
1884*4882a593Smuzhiyun                                 struct v4l2_subdev_format& sns_sd_fmt,
1885*4882a593Smuzhiyun                                 __u32 sns_v4l_pix_fmt)
1886*4882a593Smuzhiyun {
1887*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1888*4882a593Smuzhiyun 
1889*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
1890*4882a593Smuzhiyun     if (!_linked_to_1608 || CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
1891*4882a593Smuzhiyun         mRawCapUnit->set_tx_format(sns_sd_fmt, sns_v4l_pix_fmt);
1892*4882a593Smuzhiyun     }
1893*4882a593Smuzhiyun 
1894*4882a593Smuzhiyun     mRawProcUnit->set_rx_format(sns_sd_fmt, sns_v4l_pix_fmt);
1895*4882a593Smuzhiyun #endif
1896*4882a593Smuzhiyun 
1897*4882a593Smuzhiyun     // set scale fmt
1898*4882a593Smuzhiyun     if (mCifScaleStream.ptr()) {
1899*4882a593Smuzhiyun         int8_t bpp = 0;
1900*4882a593Smuzhiyun         pixFmt2Bpp(sns_v4l_pix_fmt, bpp);
1901*4882a593Smuzhiyun         mCifScaleStream->set_format(sns_sd_sel, sns_v4l_pix_fmt, bpp);
1902*4882a593Smuzhiyun     }
1903*4882a593Smuzhiyun 
1904*4882a593Smuzhiyun #ifndef ANDROID_OS // Android camera hal will set pipeline itself
1905*4882a593Smuzhiyun     // set isp sink fmt, same as sensor fmt
1906*4882a593Smuzhiyun     struct v4l2_subdev_format isp_sink_fmt;
1907*4882a593Smuzhiyun 
1908*4882a593Smuzhiyun     memset(&isp_sink_fmt, 0, sizeof(isp_sink_fmt));
1909*4882a593Smuzhiyun     isp_sink_fmt.pad = 0;
1910*4882a593Smuzhiyun     isp_sink_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1911*4882a593Smuzhiyun     ret = mIspCoreDev->getFormat(isp_sink_fmt);
1912*4882a593Smuzhiyun     if (ret) {
1913*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
1914*4882a593Smuzhiyun         return ret;
1915*4882a593Smuzhiyun     }
1916*4882a593Smuzhiyun 
1917*4882a593Smuzhiyun     isp_sink_fmt.format.width = sns_sd_fmt.format.width;
1918*4882a593Smuzhiyun     isp_sink_fmt.format.height = sns_sd_fmt.format.height;
1919*4882a593Smuzhiyun     isp_sink_fmt.format.code = sns_sd_fmt.format.code;
1920*4882a593Smuzhiyun 
1921*4882a593Smuzhiyun     ret = mIspCoreDev->setFormat(isp_sink_fmt);
1922*4882a593Smuzhiyun     if (ret) {
1923*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
1924*4882a593Smuzhiyun         return ret;
1925*4882a593Smuzhiyun     }
1926*4882a593Smuzhiyun 
1927*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink fmt info: fmt 0x%x, %dx%d !",
1928*4882a593Smuzhiyun                     isp_sink_fmt.format.code, isp_sink_fmt.format.width, isp_sink_fmt.format.height);
1929*4882a593Smuzhiyun 
1930*4882a593Smuzhiyun     // set selection, isp do the crop
1931*4882a593Smuzhiyun     struct v4l2_subdev_selection aSelection;
1932*4882a593Smuzhiyun     memset(&aSelection, 0, sizeof(aSelection));
1933*4882a593Smuzhiyun 
1934*4882a593Smuzhiyun     aSelection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1935*4882a593Smuzhiyun     aSelection.pad = 0;
1936*4882a593Smuzhiyun     aSelection.flags = 0;
1937*4882a593Smuzhiyun     aSelection.target = V4L2_SEL_TGT_CROP;
1938*4882a593Smuzhiyun     aSelection.r.width = sns_sd_sel.r.width;
1939*4882a593Smuzhiyun     aSelection.r.height = sns_sd_sel.r.height;
1940*4882a593Smuzhiyun     aSelection.r.left = sns_sd_sel.r.left;
1941*4882a593Smuzhiyun     aSelection.r.top = sns_sd_sel.r.top;
1942*4882a593Smuzhiyun     ret = mIspCoreDev->set_selection (aSelection);
1943*4882a593Smuzhiyun     if (ret) {
1944*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev crop failed !\n");
1945*4882a593Smuzhiyun         return ret;
1946*4882a593Smuzhiyun     }
1947*4882a593Smuzhiyun 
1948*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink crop info: %dx%d@%d,%d !",
1949*4882a593Smuzhiyun                     aSelection.r.width, aSelection.r.height,
1950*4882a593Smuzhiyun                     aSelection.r.left, aSelection.r.top);
1951*4882a593Smuzhiyun 
1952*4882a593Smuzhiyun     // set isp rkisp-isp-subdev src crop
1953*4882a593Smuzhiyun     aSelection.pad = 2;
1954*4882a593Smuzhiyun     aSelection.target = V4L2_SEL_TGT_CROP;
1955*4882a593Smuzhiyun     aSelection.r.left = 0;
1956*4882a593Smuzhiyun     aSelection.r.top = 0;
1957*4882a593Smuzhiyun     aSelection.r.width = sns_sd_sel.r.width;
1958*4882a593Smuzhiyun     aSelection.r.height = sns_sd_sel.r.height;
1959*4882a593Smuzhiyun #if 1 // isp src has no crop
1960*4882a593Smuzhiyun     ret = mIspCoreDev->set_selection (aSelection);
1961*4882a593Smuzhiyun     if (ret) {
1962*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev source crop failed !\n");
1963*4882a593Smuzhiyun         return ret;
1964*4882a593Smuzhiyun     }
1965*4882a593Smuzhiyun #endif
1966*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src crop info: %dx%d@%d,%d !",
1967*4882a593Smuzhiyun                     aSelection.r.width, aSelection.r.height,
1968*4882a593Smuzhiyun                     aSelection.r.left, aSelection.r.top);
1969*4882a593Smuzhiyun 
1970*4882a593Smuzhiyun     // set isp rkisp-isp-subdev src pad fmt
1971*4882a593Smuzhiyun     struct v4l2_subdev_format isp_src_fmt;
1972*4882a593Smuzhiyun 
1973*4882a593Smuzhiyun     isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1974*4882a593Smuzhiyun     isp_src_fmt.pad = 2;
1975*4882a593Smuzhiyun     ret = mIspCoreDev->getFormat(isp_src_fmt);
1976*4882a593Smuzhiyun     if (ret) {
1977*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get mIspCoreDev src fmt failed !\n");
1978*4882a593Smuzhiyun         return ret;
1979*4882a593Smuzhiyun     }
1980*4882a593Smuzhiyun 
1981*4882a593Smuzhiyun     isp_src_fmt.format.width = aSelection.r.width;
1982*4882a593Smuzhiyun     isp_src_fmt.format.height = aSelection.r.height;
1983*4882a593Smuzhiyun     ret = mIspCoreDev->setFormat(isp_src_fmt);
1984*4882a593Smuzhiyun     if (ret) {
1985*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev src fmt failed !\n");
1986*4882a593Smuzhiyun         return ret;
1987*4882a593Smuzhiyun     }
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src fmt info: fmt 0x%x, %dx%d !",
1990*4882a593Smuzhiyun                     isp_src_fmt.format.code, isp_src_fmt.format.width, isp_src_fmt.format.height);
1991*4882a593Smuzhiyun #endif
1992*4882a593Smuzhiyun     return ret;
1993*4882a593Smuzhiyun }
1994*4882a593Smuzhiyun 
1995*4882a593Smuzhiyun XCamReturn
setupPipelineFmt()1996*4882a593Smuzhiyun CamHwIsp20::setupPipelineFmt()
1997*4882a593Smuzhiyun {
1998*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1999*4882a593Smuzhiyun 
2000*4882a593Smuzhiyun     // get sensor v4l2 pixfmt
2001*4882a593Smuzhiyun     BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
2002*4882a593Smuzhiyun     rk_aiq_exposure_sensor_descriptor sns_des;
2003*4882a593Smuzhiyun     if (mSensorSubdev->get_sensor_desc(&sns_des)) {
2004*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "getSensorModeData failed \n");
2005*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_UNKNOWN;
2006*4882a593Smuzhiyun     }
2007*4882a593Smuzhiyun     __u32 sns_v4l_pix_fmt = sns_des.sensor_pixelformat;
2008*4882a593Smuzhiyun 
2009*4882a593Smuzhiyun     struct v4l2_subdev_format sns_sd_fmt;
2010*4882a593Smuzhiyun 
2011*4882a593Smuzhiyun     // get sensor real outupt size
2012*4882a593Smuzhiyun     memset(&sns_sd_fmt, 0, sizeof(sns_sd_fmt));
2013*4882a593Smuzhiyun     sns_sd_fmt.pad = 0;
2014*4882a593Smuzhiyun     sns_sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
2015*4882a593Smuzhiyun     ret = mSensorDev->getFormat(sns_sd_fmt);
2016*4882a593Smuzhiyun     if (ret) {
2017*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get sensor fmt failed !\n");
2018*4882a593Smuzhiyun         return ret;
2019*4882a593Smuzhiyun     }
2020*4882a593Smuzhiyun 
2021*4882a593Smuzhiyun     // get sensor crop bounds
2022*4882a593Smuzhiyun     struct v4l2_subdev_selection sns_sd_sel;
2023*4882a593Smuzhiyun     memset(&sns_sd_sel, 0, sizeof(sns_sd_sel));
2024*4882a593Smuzhiyun 
2025*4882a593Smuzhiyun     ret = mSensorDev->get_selection(0, V4L2_SEL_TGT_CROP_BOUNDS, sns_sd_sel);
2026*4882a593Smuzhiyun     if (ret) {
2027*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get_selection failed !\n");
2028*4882a593Smuzhiyun         // TODO, some sensor driver has not implemented this
2029*4882a593Smuzhiyun         // ioctl now
2030*4882a593Smuzhiyun         sns_sd_sel.r.width = sns_sd_fmt.format.width;
2031*4882a593Smuzhiyun         sns_sd_sel.r.height = sns_sd_fmt.format.height;
2032*4882a593Smuzhiyun         ret = XCAM_RETURN_NO_ERROR;
2033*4882a593Smuzhiyun     }
2034*4882a593Smuzhiyun 
2035*4882a593Smuzhiyun     // with librkrawstream, usr may change raw image, such as crop or rotate.
2036*4882a593Smuzhiyun     // in this case, pipeline format is differ from sensor format.
2037*4882a593Smuzhiyun     if(userSensorWidth && userSensorHeight){
2038*4882a593Smuzhiyun         sns_sd_sel.r.width = userSensorWidth;
2039*4882a593Smuzhiyun         sns_sd_sel.r.height = userSensorHeight;
2040*4882a593Smuzhiyun     }
2041*4882a593Smuzhiyun     if(userSensorFmtCode){
2042*4882a593Smuzhiyun         sns_sd_fmt.format.code = userSensorFmtCode;
2043*4882a593Smuzhiyun     }
2044*4882a593Smuzhiyun 
2045*4882a593Smuzhiyun     if (!_linked_to_isp && _crop_rect.width && _crop_rect.height) {
2046*4882a593Smuzhiyun         struct v4l2_format mipi_tx_fmt;
2047*4882a593Smuzhiyun         memset(&mipi_tx_fmt, 0, sizeof(mipi_tx_fmt));
2048*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "vicap get_crop %dx%d@%d,%d\n",
2049*4882a593Smuzhiyun                         _crop_rect.width, _crop_rect.height, _crop_rect.left, _crop_rect.top);
2050*4882a593Smuzhiyun 
2051*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
2052*4882a593Smuzhiyun         if (!_linked_to_1608) {
2053*4882a593Smuzhiyun             ret = mRawCapUnit->get_tx_device(0)->get_format(mipi_tx_fmt);
2054*4882a593Smuzhiyun         } else {
2055*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
2056*4882a593Smuzhiyun                 ret = mRawCapUnit->get_tx_device(0)->get_format(mipi_tx_fmt);
2057*4882a593Smuzhiyun             }
2058*4882a593Smuzhiyun         }
2059*4882a593Smuzhiyun #endif
2060*4882a593Smuzhiyun         mipi_tx_fmt.fmt.pix.width = _crop_rect.width;
2061*4882a593Smuzhiyun         mipi_tx_fmt.fmt.pix.height = _crop_rect.height;
2062*4882a593Smuzhiyun 
2063*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
2064*4882a593Smuzhiyun         if (!_linked_to_1608) {
2065*4882a593Smuzhiyun             ret = mRawCapUnit->get_tx_device(0)->set_format(mipi_tx_fmt);
2066*4882a593Smuzhiyun         } else {
2067*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
2068*4882a593Smuzhiyun                 ret = mRawCapUnit->get_tx_device(0)->set_format(mipi_tx_fmt);
2069*4882a593Smuzhiyun             }
2070*4882a593Smuzhiyun         }
2071*4882a593Smuzhiyun #endif
2072*4882a593Smuzhiyun         sns_sd_sel.r.width = _crop_rect.width;
2073*4882a593Smuzhiyun         sns_sd_sel.r.height = _crop_rect.height;
2074*4882a593Smuzhiyun         sns_sd_fmt.format.width = _crop_rect.width;
2075*4882a593Smuzhiyun         sns_sd_fmt.format.height = _crop_rect.height;
2076*4882a593Smuzhiyun         ret = XCAM_RETURN_NO_ERROR;
2077*4882a593Smuzhiyun     }
2078*4882a593Smuzhiyun 
2079*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sensor fmt info: bounds %dx%d, crop %dx%d@%d,%d !",
2080*4882a593Smuzhiyun                     sns_sd_sel.r.width, sns_sd_sel.r.height,
2081*4882a593Smuzhiyun                     sns_sd_fmt.format.width, sns_sd_fmt.format.height,
2082*4882a593Smuzhiyun                     sns_sd_sel.r.left, sns_sd_sel.r.top);
2083*4882a593Smuzhiyun 
2084*4882a593Smuzhiyun     if (_linked_to_isp)
2085*4882a593Smuzhiyun         ret = setupPipelineFmtIsp(sns_sd_sel, sns_sd_fmt, sns_v4l_pix_fmt);
2086*4882a593Smuzhiyun     else
2087*4882a593Smuzhiyun         ret = setupPipelineFmtCif(sns_sd_sel, sns_sd_fmt, sns_v4l_pix_fmt);
2088*4882a593Smuzhiyun 
2089*4882a593Smuzhiyun     if (ret) {
2090*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set ispcore fmt failed !\n");
2091*4882a593Smuzhiyun         return ret;
2092*4882a593Smuzhiyun     }
2093*4882a593Smuzhiyun 
2094*4882a593Smuzhiyun #if defined(ISP_HW_V20)
2095*4882a593Smuzhiyun     if (!_ispp_sd.ptr())
2096*4882a593Smuzhiyun         return ret;
2097*4882a593Smuzhiyun 
2098*4882a593Smuzhiyun     struct v4l2_subdev_format isp_src_fmt;
2099*4882a593Smuzhiyun 
2100*4882a593Smuzhiyun     isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
2101*4882a593Smuzhiyun     isp_src_fmt.pad = 2;
2102*4882a593Smuzhiyun     ret = mIspCoreDev->getFormat(isp_src_fmt);
2103*4882a593Smuzhiyun 
2104*4882a593Smuzhiyun     // set ispp format, same as isp_src_fmt
2105*4882a593Smuzhiyun     isp_src_fmt.pad = 0;
2106*4882a593Smuzhiyun     ret = _ispp_sd->setFormat(isp_src_fmt);
2107*4882a593Smuzhiyun     if (ret) {
2108*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set _ispp_sd sink fmt failed !\n");
2109*4882a593Smuzhiyun         return ret;
2110*4882a593Smuzhiyun     }
2111*4882a593Smuzhiyun #if 0//not use
2112*4882a593Smuzhiyun     struct v4l2_subdev_selection aSelection;
2113*4882a593Smuzhiyun     memset(&aSelection, 0, sizeof(aSelection));
2114*4882a593Smuzhiyun 
2115*4882a593Smuzhiyun     aSelection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
2116*4882a593Smuzhiyun     aSelection.pad = 0;
2117*4882a593Smuzhiyun     aSelection.target = V4L2_SEL_TGT_CROP_BOUNDS;
2118*4882a593Smuzhiyun     aSelection.flags = 0;
2119*4882a593Smuzhiyun     aSelection.r.left = 0;
2120*4882a593Smuzhiyun     aSelection.r.top = 0;
2121*4882a593Smuzhiyun     aSelection.r.width = isp_src_fmt.format.width;
2122*4882a593Smuzhiyun     aSelection.r.height = isp_src_fmt.format.height;
2123*4882a593Smuzhiyun #if 0
2124*4882a593Smuzhiyun     ret = _ispp_sd->set_selection (aSelection);
2125*4882a593Smuzhiyun     if (ret) {
2126*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set _ispp_sd crop bound failed !\n");
2127*4882a593Smuzhiyun         return ret;
2128*4882a593Smuzhiyun     }
2129*4882a593Smuzhiyun #endif
2130*4882a593Smuzhiyun     aSelection.target = V4L2_SEL_TGT_CROP;
2131*4882a593Smuzhiyun     ret = _ispp_sd->set_selection (aSelection);
2132*4882a593Smuzhiyun     if (ret) {
2133*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set _ispp_sd crop failed !\n");
2134*4882a593Smuzhiyun         return ret;
2135*4882a593Smuzhiyun     }
2136*4882a593Smuzhiyun #endif
2137*4882a593Smuzhiyun     // set sp format to NV12 as default
2138*4882a593Smuzhiyun 
2139*4882a593Smuzhiyun     if (mIspSpDev.ptr()) {
2140*4882a593Smuzhiyun         struct v4l2_selection selection;
2141*4882a593Smuzhiyun         memset(&selection, 0, sizeof(selection));
2142*4882a593Smuzhiyun 
2143*4882a593Smuzhiyun         selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2144*4882a593Smuzhiyun         selection.target = V4L2_SEL_TGT_CROP;
2145*4882a593Smuzhiyun         selection.flags = 0;
2146*4882a593Smuzhiyun         selection.r.left = 0;
2147*4882a593Smuzhiyun         selection.r.top = 0;
2148*4882a593Smuzhiyun         selection.r.width = isp_src_fmt.format.width;
2149*4882a593Smuzhiyun         selection.r.height = isp_src_fmt.format.height;
2150*4882a593Smuzhiyun 
2151*4882a593Smuzhiyun         ret = mIspSpDev->set_selection (selection);
2152*4882a593Smuzhiyun 
2153*4882a593Smuzhiyun         struct v4l2_format fmt;
2154*4882a593Smuzhiyun         ret = mIspSpDev->get_format (fmt);
2155*4882a593Smuzhiyun         if (ret) {
2156*4882a593Smuzhiyun             LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get mIspSpDev fmt failed !\n");
2157*4882a593Smuzhiyun             //return;
2158*4882a593Smuzhiyun         }
2159*4882a593Smuzhiyun         if (V4L2_PIX_FMT_FBCG == fmt.fmt.pix.pixelformat) {
2160*4882a593Smuzhiyun             mIspSpDev->set_format(/*isp_src_fmt.format.width*/1920,
2161*4882a593Smuzhiyun                     /*isp_src_fmt.format.height*/1080,
2162*4882a593Smuzhiyun                     V4L2_PIX_FMT_NV12,
2163*4882a593Smuzhiyun                     V4L2_FIELD_NONE, 0);
2164*4882a593Smuzhiyun         }
2165*4882a593Smuzhiyun     }
2166*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispp sd fmt info: %dx%d",
2167*4882a593Smuzhiyun                     isp_src_fmt.format.width, isp_src_fmt.format.height);
2168*4882a593Smuzhiyun #endif
2169*4882a593Smuzhiyun     return ret;
2170*4882a593Smuzhiyun }
2171*4882a593Smuzhiyun 
2172*4882a593Smuzhiyun XCamReturn
setupHdrLink_vidcap(int hdr_mode,int cif_index,bool enable)2173*4882a593Smuzhiyun CamHwIsp20::setupHdrLink_vidcap(int hdr_mode, int cif_index, bool enable)
2174*4882a593Smuzhiyun {
2175*4882a593Smuzhiyun     media_device *device = NULL;
2176*4882a593Smuzhiyun     media_entity *entity = NULL;
2177*4882a593Smuzhiyun     media_pad *src_pad_s = NULL, *src_pad_m = NULL, *src_pad_l = NULL, *sink_pad = NULL;
2178*4882a593Smuzhiyun 
2179*4882a593Smuzhiyun     // TODO: have some bugs now
2180*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
2181*4882a593Smuzhiyun 
2182*4882a593Smuzhiyun     if (_linked_to_isp)
2183*4882a593Smuzhiyun         return XCAM_RETURN_NO_ERROR;
2184*4882a593Smuzhiyun 
2185*4882a593Smuzhiyun     // TODO: normal mode
2186*4882a593Smuzhiyun     device = media_device_new (mCifHwInfos.cif_info[cif_index].media_dev_path);
2187*4882a593Smuzhiyun 
2188*4882a593Smuzhiyun     /* Enumerate entities, pads and links. */
2189*4882a593Smuzhiyun     media_device_enumerate (device);
2190*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
2191*4882a593Smuzhiyun     if(entity) {
2192*4882a593Smuzhiyun         src_pad_s = (media_pad *)media_entity_get_pad(entity, 1);
2193*4882a593Smuzhiyun         if (!src_pad_s) {
2194*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rockchip-mipi-csi2 source pad0 failed !\n");
2195*4882a593Smuzhiyun             goto FAIL;
2196*4882a593Smuzhiyun         }
2197*4882a593Smuzhiyun     } else {
2198*4882a593Smuzhiyun         entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev"));
2199*4882a593Smuzhiyun         if(entity) {
2200*4882a593Smuzhiyun             src_pad_s = (media_pad *)media_entity_get_pad(entity, 1);
2201*4882a593Smuzhiyun             if (!src_pad_s) {
2202*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lvds-subdev source pad0 failed !\n");
2203*4882a593Smuzhiyun                 goto FAIL;
2204*4882a593Smuzhiyun             }
2205*4882a593Smuzhiyun         } else {
2206*4882a593Smuzhiyun             entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev"));
2207*4882a593Smuzhiyun             if(entity) {
2208*4882a593Smuzhiyun                 src_pad_s = (media_pad *)media_entity_get_pad(entity, 1);
2209*4882a593Smuzhiyun                 if (!src_pad_s) {
2210*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lite-lvds-subdev source pad0 failed !\n");
2211*4882a593Smuzhiyun                     goto FAIL;
2212*4882a593Smuzhiyun                 }
2213*4882a593Smuzhiyun             }
2214*4882a593Smuzhiyun         }
2215*4882a593Smuzhiyun     }
2216*4882a593Smuzhiyun 
2217*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id0", strlen("stream_cif_mipi_id0"));
2218*4882a593Smuzhiyun     if(entity) {
2219*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2220*4882a593Smuzhiyun         if (!sink_pad) {
2221*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_mipi_id0 failed!\n");
2222*4882a593Smuzhiyun             goto FAIL;
2223*4882a593Smuzhiyun         }
2224*4882a593Smuzhiyun     }
2225*4882a593Smuzhiyun 
2226*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id0", strlen("stream_cif_dvp_id0"));
2227*4882a593Smuzhiyun     if(entity) {
2228*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2229*4882a593Smuzhiyun         if (!sink_pad) {
2230*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_dvp_id0 failed!\n");
2231*4882a593Smuzhiyun             goto FAIL;
2232*4882a593Smuzhiyun         }
2233*4882a593Smuzhiyun     }
2234*4882a593Smuzhiyun     if (enable)
2235*4882a593Smuzhiyun         media_setup_link(device, src_pad_s, sink_pad, MEDIA_LNK_FL_ENABLED);
2236*4882a593Smuzhiyun     else
2237*4882a593Smuzhiyun         media_setup_link(device, src_pad_s, sink_pad, 0);
2238*4882a593Smuzhiyun 
2239*4882a593Smuzhiyun 
2240*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
2241*4882a593Smuzhiyun     if(entity) {
2242*4882a593Smuzhiyun         src_pad_m = (media_pad *)media_entity_get_pad(entity, 2);
2243*4882a593Smuzhiyun         if (!src_pad_m) {
2244*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rockchip-mipi-csi2 source pad0 failed !\n");
2245*4882a593Smuzhiyun             goto FAIL;
2246*4882a593Smuzhiyun         }
2247*4882a593Smuzhiyun     } else {
2248*4882a593Smuzhiyun         entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev"));
2249*4882a593Smuzhiyun         if(entity) {
2250*4882a593Smuzhiyun             src_pad_m = (media_pad *)media_entity_get_pad(entity, 2);
2251*4882a593Smuzhiyun             if (!src_pad_m) {
2252*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lvds-subdev source pad0 failed !\n");
2253*4882a593Smuzhiyun                 goto FAIL;
2254*4882a593Smuzhiyun             }
2255*4882a593Smuzhiyun         } else {
2256*4882a593Smuzhiyun             entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev"));
2257*4882a593Smuzhiyun             if(entity) {
2258*4882a593Smuzhiyun                 src_pad_m = (media_pad *)media_entity_get_pad(entity, 2);
2259*4882a593Smuzhiyun                 if (!src_pad_m) {
2260*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lite-lvds-subdev source pad0 failed !\n");
2261*4882a593Smuzhiyun                     goto FAIL;
2262*4882a593Smuzhiyun                 }
2263*4882a593Smuzhiyun             }
2264*4882a593Smuzhiyun         }
2265*4882a593Smuzhiyun     }
2266*4882a593Smuzhiyun 
2267*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id1", strlen("stream_cif_mipi_id1"));
2268*4882a593Smuzhiyun     if(entity) {
2269*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2270*4882a593Smuzhiyun         if (!sink_pad) {
2271*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_mipi_id1 failed!\n");
2272*4882a593Smuzhiyun             goto FAIL;
2273*4882a593Smuzhiyun         }
2274*4882a593Smuzhiyun     }
2275*4882a593Smuzhiyun 
2276*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id1", strlen("stream_cif_dvp_id1"));
2277*4882a593Smuzhiyun     if(entity) {
2278*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2279*4882a593Smuzhiyun         if (!sink_pad) {
2280*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_dvp_id1 failed!\n");
2281*4882a593Smuzhiyun             goto FAIL;
2282*4882a593Smuzhiyun         }
2283*4882a593Smuzhiyun     }
2284*4882a593Smuzhiyun 
2285*4882a593Smuzhiyun     if (enable)
2286*4882a593Smuzhiyun         media_setup_link(device, src_pad_m, sink_pad, MEDIA_LNK_FL_ENABLED);
2287*4882a593Smuzhiyun     else
2288*4882a593Smuzhiyun         media_setup_link(device, src_pad_m, sink_pad, 0);
2289*4882a593Smuzhiyun 
2290*4882a593Smuzhiyun #if 0
2291*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
2292*4882a593Smuzhiyun     if(entity) {
2293*4882a593Smuzhiyun         src_pad_l = (media_pad *)media_entity_get_pad(entity, 3);
2294*4882a593Smuzhiyun         if (!src_pad_l) {
2295*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rockchip-mipi-csi2 source pad0 failed !\n");
2296*4882a593Smuzhiyun             goto FAIL;
2297*4882a593Smuzhiyun         }
2298*4882a593Smuzhiyun     }
2299*4882a593Smuzhiyun 
2300*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_mipi_id2", strlen("stream_cif_mipi_id2"));
2301*4882a593Smuzhiyun     if(entity) {
2302*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2303*4882a593Smuzhiyun         if (!sink_pad) {
2304*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_mipi_id2 failed!\n");
2305*4882a593Smuzhiyun             goto FAIL;
2306*4882a593Smuzhiyun         }
2307*4882a593Smuzhiyun     }
2308*4882a593Smuzhiyun 
2309*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "stream_cif_dvp_id2", strlen("stream_cif_dvp_id2"));
2310*4882a593Smuzhiyun     if(entity) {
2311*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2312*4882a593Smuzhiyun         if (!sink_pad) {
2313*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_dvp_id2 failed!\n");
2314*4882a593Smuzhiyun             goto FAIL;
2315*4882a593Smuzhiyun         }
2316*4882a593Smuzhiyun     }
2317*4882a593Smuzhiyun 
2318*4882a593Smuzhiyun     if (RK_AIQ_HDR_GET_WORKING_MODE(hdr_mode) == RK_AIQ_WORKING_MODE_ISP_HDR3) {
2319*4882a593Smuzhiyun         if (enable)
2320*4882a593Smuzhiyun             media_setup_link(device, src_pad_l, sink_pad, MEDIA_LNK_FL_ENABLED);
2321*4882a593Smuzhiyun         else
2322*4882a593Smuzhiyun             media_setup_link(device, src_pad_l, sink_pad, 0);
2323*4882a593Smuzhiyun     } else
2324*4882a593Smuzhiyun         media_setup_link(device, src_pad_l, sink_pad, 0);
2325*4882a593Smuzhiyun #endif
2326*4882a593Smuzhiyun     media_device_unref (device);
2327*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
2328*4882a593Smuzhiyun FAIL:
2329*4882a593Smuzhiyun     media_device_unref (device);
2330*4882a593Smuzhiyun     return XCAM_RETURN_ERROR_FAILED;
2331*4882a593Smuzhiyun }
2332*4882a593Smuzhiyun 
2333*4882a593Smuzhiyun XCamReturn
setupHdrLink(int hdr_mode,int isp_index,bool enable)2334*4882a593Smuzhiyun CamHwIsp20::setupHdrLink(int hdr_mode, int isp_index, bool enable)
2335*4882a593Smuzhiyun {
2336*4882a593Smuzhiyun     media_device *device = NULL;
2337*4882a593Smuzhiyun     media_entity *entity = NULL;
2338*4882a593Smuzhiyun     media_pad *src_pad_s = NULL, *src_pad_m = NULL, *src_pad_l = NULL, *sink_pad = NULL;
2339*4882a593Smuzhiyun 
2340*4882a593Smuzhiyun     device = media_device_new (mIspHwInfos.isp_info[isp_index].media_dev_path);
2341*4882a593Smuzhiyun     if (!device)
2342*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
2343*4882a593Smuzhiyun 
2344*4882a593Smuzhiyun     /* Enumerate entities, pads and links. */
2345*4882a593Smuzhiyun     media_device_enumerate (device);
2346*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev"));
2347*4882a593Smuzhiyun     if(entity) {
2348*4882a593Smuzhiyun         sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
2349*4882a593Smuzhiyun         if (!sink_pad) {
2350*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR sink pad failed!\n");
2351*4882a593Smuzhiyun             goto FAIL;
2352*4882a593Smuzhiyun         }
2353*4882a593Smuzhiyun     }
2354*4882a593Smuzhiyun 
2355*4882a593Smuzhiyun #if 0
2356*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, mIspHwInfos.isp_info[isp_index].linked_vicap,
2357*4882a593Smuzhiyun                                       strlen(mIspHwInfos.isp_info[isp_index].linked_vicap));
2358*4882a593Smuzhiyun     if (entity) {
2359*4882a593Smuzhiyun         media_pad* linked_vicap_pad = (media_pad *)media_entity_get_pad(entity, 0);
2360*4882a593Smuzhiyun         if (linked_vicap_pad) {
2361*4882a593Smuzhiyun             if (enable) {
2362*4882a593Smuzhiyun                 media_setup_link(device, linked_vicap_pad, sink_pad, 0);
2363*4882a593Smuzhiyun             } else {
2364*4882a593Smuzhiyun                 media_setup_link(device, linked_vicap_pad, sink_pad, MEDIA_LNK_FL_ENABLED);
2365*4882a593Smuzhiyun             }
2366*4882a593Smuzhiyun         }
2367*4882a593Smuzhiyun     }
2368*4882a593Smuzhiyun #endif
2369*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawrd2_s", strlen("rkisp_rawrd2_s"));
2370*4882a593Smuzhiyun     if(entity) {
2371*4882a593Smuzhiyun         src_pad_s = (media_pad *)media_entity_get_pad(entity, 0);
2372*4882a593Smuzhiyun         if (!src_pad_s) {
2373*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR source pad s failed!\n");
2374*4882a593Smuzhiyun             goto FAIL;
2375*4882a593Smuzhiyun         }
2376*4882a593Smuzhiyun     }
2377*4882a593Smuzhiyun     if (src_pad_s && sink_pad) {
2378*4882a593Smuzhiyun         if (enable)
2379*4882a593Smuzhiyun             media_setup_link(device, src_pad_s, sink_pad, MEDIA_LNK_FL_ENABLED);
2380*4882a593Smuzhiyun         else
2381*4882a593Smuzhiyun             media_setup_link(device, src_pad_s, sink_pad, 0);
2382*4882a593Smuzhiyun     }
2383*4882a593Smuzhiyun 
2384*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawrd0_m", strlen("rkisp_rawrd0_m"));
2385*4882a593Smuzhiyun     if(entity) {
2386*4882a593Smuzhiyun         src_pad_m = (media_pad *)media_entity_get_pad(entity, 0);
2387*4882a593Smuzhiyun         if (!src_pad_m) {
2388*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR source pad m failed!\n");
2389*4882a593Smuzhiyun             goto FAIL;
2390*4882a593Smuzhiyun         }
2391*4882a593Smuzhiyun     }
2392*4882a593Smuzhiyun 
2393*4882a593Smuzhiyun     if (src_pad_m && sink_pad) {
2394*4882a593Smuzhiyun         if (RK_AIQ_HDR_GET_WORKING_MODE(hdr_mode) >= RK_AIQ_WORKING_MODE_ISP_HDR2 && enable) {
2395*4882a593Smuzhiyun             media_setup_link(device, src_pad_m, sink_pad, MEDIA_LNK_FL_ENABLED);
2396*4882a593Smuzhiyun         } else
2397*4882a593Smuzhiyun             media_setup_link(device, src_pad_m, sink_pad, 0);
2398*4882a593Smuzhiyun     }
2399*4882a593Smuzhiyun 
2400*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp_rawrd1_l", strlen("rkisp_rawrd1_l"));
2401*4882a593Smuzhiyun     if(entity) {
2402*4882a593Smuzhiyun         src_pad_l = (media_pad *)media_entity_get_pad(entity, 0);
2403*4882a593Smuzhiyun         if (!src_pad_l) {
2404*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR source pad l failed!\n");
2405*4882a593Smuzhiyun             goto FAIL;
2406*4882a593Smuzhiyun         }
2407*4882a593Smuzhiyun     }
2408*4882a593Smuzhiyun 
2409*4882a593Smuzhiyun     if (src_pad_l && sink_pad) {
2410*4882a593Smuzhiyun         if (RK_AIQ_HDR_GET_WORKING_MODE(hdr_mode) == RK_AIQ_WORKING_MODE_ISP_HDR3 && enable) {
2411*4882a593Smuzhiyun             media_setup_link(device, src_pad_l, sink_pad, MEDIA_LNK_FL_ENABLED);
2412*4882a593Smuzhiyun         } else
2413*4882a593Smuzhiyun             media_setup_link(device, src_pad_l, sink_pad, 0);
2414*4882a593Smuzhiyun     }
2415*4882a593Smuzhiyun     media_device_unref (device);
2416*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
2417*4882a593Smuzhiyun FAIL:
2418*4882a593Smuzhiyun     media_device_unref (device);
2419*4882a593Smuzhiyun     return XCAM_RETURN_ERROR_FAILED;
2420*4882a593Smuzhiyun }
2421*4882a593Smuzhiyun 
2422*4882a593Smuzhiyun XCamReturn
setExpDelayInfo(int mode)2423*4882a593Smuzhiyun CamHwIsp20::setExpDelayInfo(int mode)
2424*4882a593Smuzhiyun {
2425*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
2426*4882a593Smuzhiyun     BaseSensorHw* sensorHw;
2427*4882a593Smuzhiyun     sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
2428*4882a593Smuzhiyun 
2429*4882a593Smuzhiyun     if(mode != RK_AIQ_WORKING_MODE_NORMAL) {
2430*4882a593Smuzhiyun         sensorHw->set_exp_delay_info(_cur_calib_infos.sensor.CISExpUpdate.Hdr.time_update,
2431*4882a593Smuzhiyun                                      _cur_calib_infos.sensor.CISExpUpdate.Hdr.gain_update,
2432*4882a593Smuzhiyun                                      _cur_calib_infos.sensor.CISDcgSet.Hdr.support_en ? \
2433*4882a593Smuzhiyun                                      _cur_calib_infos.sensor.CISExpUpdate.Hdr.dcg_update : -1);
2434*4882a593Smuzhiyun 
2435*4882a593Smuzhiyun         sint32_t timeDelay = _cur_calib_infos.sensor.CISExpUpdate.Hdr.time_update;
2436*4882a593Smuzhiyun         sint32_t gainDelay = _cur_calib_infos.sensor.CISExpUpdate.Hdr.gain_update;
2437*4882a593Smuzhiyun         _exp_delay = timeDelay > gainDelay ? timeDelay : gainDelay;
2438*4882a593Smuzhiyun     } else {
2439*4882a593Smuzhiyun         sensorHw->set_exp_delay_info(_cur_calib_infos.sensor.CISExpUpdate.Linear.time_update,
2440*4882a593Smuzhiyun                                      _cur_calib_infos.sensor.CISExpUpdate.Linear.gain_update,
2441*4882a593Smuzhiyun                                      _cur_calib_infos.sensor.CISDcgSet.Linear.support_en ? \
2442*4882a593Smuzhiyun                                      _cur_calib_infos.sensor.CISExpUpdate.Linear.dcg_update : -1);
2443*4882a593Smuzhiyun 
2444*4882a593Smuzhiyun         sint32_t timeDelay = _cur_calib_infos.sensor.CISExpUpdate.Linear.time_update;
2445*4882a593Smuzhiyun         sint32_t gainDelay = _cur_calib_infos.sensor.CISExpUpdate.Linear.gain_update;
2446*4882a593Smuzhiyun         _exp_delay = timeDelay > gainDelay ? timeDelay : gainDelay;
2447*4882a593Smuzhiyun     }
2448*4882a593Smuzhiyun 
2449*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
2450*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
2451*4882a593Smuzhiyun }
2452*4882a593Smuzhiyun 
2453*4882a593Smuzhiyun XCamReturn
setLensVcmCfg(struct rkmodule_inf & mod_info)2454*4882a593Smuzhiyun CamHwIsp20::setLensVcmCfg(struct rkmodule_inf& mod_info)
2455*4882a593Smuzhiyun {
2456*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
2457*4882a593Smuzhiyun     LensHw* lensHw = mLensDev.get_cast_ptr<LensHw>();
2458*4882a593Smuzhiyun     rk_aiq_lens_vcmcfg old_cfg, new_cfg;
2459*4882a593Smuzhiyun     int old_maxpos, new_maxpos;
2460*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2461*4882a593Smuzhiyun 
2462*4882a593Smuzhiyun     if (lensHw) {
2463*4882a593Smuzhiyun         ret = lensHw->getLensVcmCfg(old_cfg);
2464*4882a593Smuzhiyun         if (ret != XCAM_RETURN_NO_ERROR)
2465*4882a593Smuzhiyun             return ret;
2466*4882a593Smuzhiyun         ret = lensHw->getLensVcmMaxlogpos(old_maxpos);
2467*4882a593Smuzhiyun         if (ret != XCAM_RETURN_NO_ERROR)
2468*4882a593Smuzhiyun             return ret;
2469*4882a593Smuzhiyun 
2470*4882a593Smuzhiyun         CalibDbV2_Af_VcmCfg_t* vcmcfg = &_cur_calib_infos.af.vcmcfg;
2471*4882a593Smuzhiyun         float posture_diff = vcmcfg->posture_diff;
2472*4882a593Smuzhiyun 
2473*4882a593Smuzhiyun         new_cfg = old_cfg;
2474*4882a593Smuzhiyun         if (vcmcfg->start_current != -1) {
2475*4882a593Smuzhiyun             new_cfg.start_ma = vcmcfg->start_current;
2476*4882a593Smuzhiyun         }
2477*4882a593Smuzhiyun         if (vcmcfg->rated_current != -1) {
2478*4882a593Smuzhiyun             new_cfg.rated_ma = vcmcfg->rated_current;
2479*4882a593Smuzhiyun         }
2480*4882a593Smuzhiyun         if (vcmcfg->step_mode != -1) {
2481*4882a593Smuzhiyun             new_cfg.step_mode = vcmcfg->step_mode;
2482*4882a593Smuzhiyun         }
2483*4882a593Smuzhiyun 
2484*4882a593Smuzhiyun         if (vcmcfg->start_current == -1 && vcmcfg->rated_current == -1 && vcmcfg->step_mode == -1) {
2485*4882a593Smuzhiyun             if (mod_info.af.flag) {
2486*4882a593Smuzhiyun                 new_cfg.start_ma = mod_info.af.af_otp[0].vcm_start;
2487*4882a593Smuzhiyun                 new_cfg.rated_ma = mod_info.af.af_otp[0].vcm_end;
2488*4882a593Smuzhiyun 
2489*4882a593Smuzhiyun                 if (posture_diff != 0) {
2490*4882a593Smuzhiyun                     int range = new_cfg.rated_ma - new_cfg.start_ma;
2491*4882a593Smuzhiyun                     int start_ma = new_cfg.start_ma;
2492*4882a593Smuzhiyun                     int rated_ma = new_cfg.rated_ma;
2493*4882a593Smuzhiyun 
2494*4882a593Smuzhiyun                     new_cfg.start_ma = start_ma - (int)(range * posture_diff);
2495*4882a593Smuzhiyun                     new_cfg.rated_ma = rated_ma + (int)(range * posture_diff);
2496*4882a593Smuzhiyun 
2497*4882a593Smuzhiyun                     LOGD_AF("posture_diff %f, start_ma %d -> %d, rated_ma %d -> %d",
2498*4882a593Smuzhiyun                             posture_diff, start_ma, new_cfg.start_ma, rated_ma, new_cfg.rated_ma);
2499*4882a593Smuzhiyun                 }
2500*4882a593Smuzhiyun             }
2501*4882a593Smuzhiyun         }
2502*4882a593Smuzhiyun 
2503*4882a593Smuzhiyun         if ((new_cfg.start_ma != old_cfg.start_ma) ||
2504*4882a593Smuzhiyun                 (new_cfg.rated_ma != old_cfg.rated_ma) ||
2505*4882a593Smuzhiyun                 (new_cfg.step_mode != old_cfg.step_mode)) {
2506*4882a593Smuzhiyun             ret = lensHw->setLensVcmCfg(new_cfg);
2507*4882a593Smuzhiyun         }
2508*4882a593Smuzhiyun 
2509*4882a593Smuzhiyun         new_maxpos = old_maxpos;
2510*4882a593Smuzhiyun         if (vcmcfg->max_logical_pos > 0) {
2511*4882a593Smuzhiyun             new_maxpos = vcmcfg->max_logical_pos;
2512*4882a593Smuzhiyun         }
2513*4882a593Smuzhiyun         if (old_maxpos != new_maxpos) {
2514*4882a593Smuzhiyun             ret = lensHw->setLensVcmMaxlogpos(new_maxpos);
2515*4882a593Smuzhiyun         }
2516*4882a593Smuzhiyun     }
2517*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
2518*4882a593Smuzhiyun     return ret;
2519*4882a593Smuzhiyun }
2520*4882a593Smuzhiyun 
2521*4882a593Smuzhiyun XCamReturn
get_sensor_pdafinfo(rk_sensor_full_info_t * sensor_info,rk_sensor_pdaf_info_t * pdaf_info)2522*4882a593Smuzhiyun CamHwIsp20::get_sensor_pdafinfo(rk_sensor_full_info_t *sensor_info,
2523*4882a593Smuzhiyun                                 rk_sensor_pdaf_info_t *pdaf_info) {
2524*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2525*4882a593Smuzhiyun     struct rkmodule_channel_info channel;
2526*4882a593Smuzhiyun     memset(&channel, 0, sizeof(struct rkmodule_channel_info));
2527*4882a593Smuzhiyun 
2528*4882a593Smuzhiyun     V4l2SubDevice vdev(sensor_info->device_name.c_str());
2529*4882a593Smuzhiyun     ret = vdev.open();
2530*4882a593Smuzhiyun     if (ret != XCAM_RETURN_NO_ERROR) {
2531*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to open dev (%s)", sensor_info->device_name.c_str());
2532*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
2533*4882a593Smuzhiyun     }
2534*4882a593Smuzhiyun 
2535*4882a593Smuzhiyun     pdaf_info->pdaf_support = false;
2536*4882a593Smuzhiyun     for (int i = 0; i < 4; i++) {
2537*4882a593Smuzhiyun         channel.index = i;
2538*4882a593Smuzhiyun         if (vdev.io_control(RKMODULE_GET_CHANNEL_INFO, &channel) == 0) {
2539*4882a593Smuzhiyun             if (channel.bus_fmt == MEDIA_BUS_FMT_SPD_2X8) {
2540*4882a593Smuzhiyun                 pdaf_info->pdaf_support = true;
2541*4882a593Smuzhiyun                 pdaf_info->pdaf_vc = i;
2542*4882a593Smuzhiyun                 pdaf_info->pdaf_code = channel.bus_fmt;
2543*4882a593Smuzhiyun                 pdaf_info->pdaf_width = channel.width;
2544*4882a593Smuzhiyun                 pdaf_info->pdaf_height = channel.height;
2545*4882a593Smuzhiyun                 if (channel.data_bit == 10)
2546*4882a593Smuzhiyun                     pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB10;
2547*4882a593Smuzhiyun                 else if (channel.data_bit == 12)
2548*4882a593Smuzhiyun                     pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB12;
2549*4882a593Smuzhiyun                 else if (channel.data_bit == 8)
2550*4882a593Smuzhiyun                     pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB8;
2551*4882a593Smuzhiyun                 else
2552*4882a593Smuzhiyun                     pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB16;
2553*4882a593Smuzhiyun                 LOGI_CAMHW_SUBM(ISP20HW_SUBM, "channel.bus_fmt 0x%x, pdaf_width %d, pdaf_height %d",
2554*4882a593Smuzhiyun                                 channel.bus_fmt, pdaf_info->pdaf_width, pdaf_info->pdaf_height);
2555*4882a593Smuzhiyun                 break;
2556*4882a593Smuzhiyun             }
2557*4882a593Smuzhiyun         }
2558*4882a593Smuzhiyun     }
2559*4882a593Smuzhiyun 
2560*4882a593Smuzhiyun     if (pdaf_info->pdaf_support) {
2561*4882a593Smuzhiyun         if (sensor_info->linked_to_isp) {
2562*4882a593Smuzhiyun             switch (pdaf_info->pdaf_vc) {
2563*4882a593Smuzhiyun             case 0:
2564*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr0_path);
2565*4882a593Smuzhiyun                 break;
2566*4882a593Smuzhiyun             case 1:
2567*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr1_path);
2568*4882a593Smuzhiyun                 break;
2569*4882a593Smuzhiyun             case 2:
2570*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr2_path);
2571*4882a593Smuzhiyun                 break;
2572*4882a593Smuzhiyun             case 3:
2573*4882a593Smuzhiyun             default:
2574*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr3_path);
2575*4882a593Smuzhiyun                 break;
2576*4882a593Smuzhiyun             }
2577*4882a593Smuzhiyun         } else {
2578*4882a593Smuzhiyun             switch (pdaf_info->pdaf_vc) {
2579*4882a593Smuzhiyun             case 0:
2580*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id0);
2581*4882a593Smuzhiyun                 break;
2582*4882a593Smuzhiyun             case 1:
2583*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id1);
2584*4882a593Smuzhiyun                 break;
2585*4882a593Smuzhiyun             case 2:
2586*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id2);
2587*4882a593Smuzhiyun                 break;
2588*4882a593Smuzhiyun             case 3:
2589*4882a593Smuzhiyun             default:
2590*4882a593Smuzhiyun                 strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id3);
2591*4882a593Smuzhiyun                 break;
2592*4882a593Smuzhiyun             }
2593*4882a593Smuzhiyun         }
2594*4882a593Smuzhiyun     }
2595*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "%s: pdaf_vdev %s", __func__, pdaf_info->pdaf_vdev);
2596*4882a593Smuzhiyun 
2597*4882a593Smuzhiyun     vdev.close();
2598*4882a593Smuzhiyun     return ret;
2599*4882a593Smuzhiyun }
2600*4882a593Smuzhiyun 
isOnlineByWorkingMode()2601*4882a593Smuzhiyun bool CamHwIsp20::isOnlineByWorkingMode()
2602*4882a593Smuzhiyun {
2603*4882a593Smuzhiyun     return true;
2604*4882a593Smuzhiyun }
2605*4882a593Smuzhiyun 
2606*4882a593Smuzhiyun void
setCalib(const CamCalibDbV2Context_t * calibv2)2607*4882a593Smuzhiyun CamHwIsp20::setCalib(const CamCalibDbV2Context_t* calibv2)
2608*4882a593Smuzhiyun {
2609*4882a593Smuzhiyun     mCalibDbV2 = calibv2;
2610*4882a593Smuzhiyun     CalibDbV2_MFNR_t* mfnr =
2611*4882a593Smuzhiyun         (CalibDbV2_MFNR_t*)CALIBDBV2_GET_MODULE_PTR((void*)(mCalibDbV2), mfnr_v1);
2612*4882a593Smuzhiyun     if (mfnr) {
2613*4882a593Smuzhiyun         _cur_calib_infos.mfnr.enable = mfnr->TuningPara.enable;
2614*4882a593Smuzhiyun         _cur_calib_infos.mfnr.motion_detect_en = mfnr->TuningPara.motion_detect_en;
2615*4882a593Smuzhiyun     } else {
2616*4882a593Smuzhiyun         _cur_calib_infos.mfnr.enable = false;
2617*4882a593Smuzhiyun         _cur_calib_infos.mfnr.motion_detect_en = false;
2618*4882a593Smuzhiyun     }
2619*4882a593Smuzhiyun 
2620*4882a593Smuzhiyun     CalibDb_Aec_ParaV2_t* aec =
2621*4882a593Smuzhiyun         (CalibDb_Aec_ParaV2_t*)CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, ae_calib);
2622*4882a593Smuzhiyun     if (aec) {
2623*4882a593Smuzhiyun         _cur_calib_infos.aec.IrisType = aec->IrisCtrl.IrisType;
2624*4882a593Smuzhiyun     } else {
2625*4882a593Smuzhiyun         _cur_calib_infos.aec.IrisType = IRISV2_DC_TYPE;
2626*4882a593Smuzhiyun     }
2627*4882a593Smuzhiyun 
2628*4882a593Smuzhiyun     if (CHECK_ISP_HW_V32()) {
2629*4882a593Smuzhiyun         CalibDbV2_AFV31_t *af_v31 =
2630*4882a593Smuzhiyun             (CalibDbV2_AFV31_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v31));
2631*4882a593Smuzhiyun         if (af_v31) {
2632*4882a593Smuzhiyun             _cur_calib_infos.af.vcmcfg = af_v31->TuningPara.vcmcfg;
2633*4882a593Smuzhiyun         } else {
2634*4882a593Smuzhiyun             memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
2635*4882a593Smuzhiyun         }
2636*4882a593Smuzhiyun         memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
2637*4882a593Smuzhiyun     } else if (CHECK_ISP_HW_V30()) {
2638*4882a593Smuzhiyun         CalibDbV2_AFV30_t *af_v30 =
2639*4882a593Smuzhiyun             (CalibDbV2_AFV30_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v30));
2640*4882a593Smuzhiyun         if (af_v30) {
2641*4882a593Smuzhiyun             _cur_calib_infos.af.vcmcfg = af_v30->TuningPara.vcmcfg;
2642*4882a593Smuzhiyun         } else {
2643*4882a593Smuzhiyun             memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
2644*4882a593Smuzhiyun         }
2645*4882a593Smuzhiyun         memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
2646*4882a593Smuzhiyun     } else if (CHECK_ISP_HW_V32_LITE()) {
2647*4882a593Smuzhiyun         CalibDbV2_AFV32_t *af_v32 =
2648*4882a593Smuzhiyun             (CalibDbV2_AFV32_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v32));
2649*4882a593Smuzhiyun         if (af_v32) {
2650*4882a593Smuzhiyun             _cur_calib_infos.af.vcmcfg = af_v32->TuningPara.vcmcfg;
2651*4882a593Smuzhiyun         } else {
2652*4882a593Smuzhiyun             memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
2653*4882a593Smuzhiyun         }
2654*4882a593Smuzhiyun         memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
2655*4882a593Smuzhiyun     } else {
2656*4882a593Smuzhiyun         CalibDbV2_AF_t *af =
2657*4882a593Smuzhiyun             (CalibDbV2_AF_t*)CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af);
2658*4882a593Smuzhiyun         if (af) {
2659*4882a593Smuzhiyun             _cur_calib_infos.af.vcmcfg = af->TuningPara.vcmcfg;
2660*4882a593Smuzhiyun             _cur_calib_infos.af.ldg_param = af->TuningPara.ldg_param;
2661*4882a593Smuzhiyun             _cur_calib_infos.af.highlight = af->TuningPara.highlight;
2662*4882a593Smuzhiyun         } else {
2663*4882a593Smuzhiyun             memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
2664*4882a593Smuzhiyun             memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
2665*4882a593Smuzhiyun         }
2666*4882a593Smuzhiyun     }
2667*4882a593Smuzhiyun 
2668*4882a593Smuzhiyun     CalibDb_Sensor_ParaV2_t* sensor_calib =
2669*4882a593Smuzhiyun         (CalibDb_Sensor_ParaV2_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, sensor_calib));
2670*4882a593Smuzhiyun     if (sensor_calib) {
2671*4882a593Smuzhiyun         _cur_calib_infos.sensor.CISDcgSet = sensor_calib->CISDcgSet;
2672*4882a593Smuzhiyun         _cur_calib_infos.sensor.CISExpUpdate = sensor_calib->CISExpUpdate;
2673*4882a593Smuzhiyun     } else {
2674*4882a593Smuzhiyun         memset(&_cur_calib_infos.sensor, 0,
2675*4882a593Smuzhiyun                sizeof(_cur_calib_infos.sensor));
2676*4882a593Smuzhiyun     }
2677*4882a593Smuzhiyun 
2678*4882a593Smuzhiyun     // update infos to sensor hw
2679*4882a593Smuzhiyun     setExpDelayInfo(_hdr_mode);
2680*4882a593Smuzhiyun }
2681*4882a593Smuzhiyun 
2682*4882a593Smuzhiyun XCamReturn
prepare(uint32_t width,uint32_t height,int mode,int t_delay,int g_delay)2683*4882a593Smuzhiyun CamHwIsp20::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
2684*4882a593Smuzhiyun {
2685*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2686*4882a593Smuzhiyun     BaseSensorHw* sensorHw = NULL;
2687*4882a593Smuzhiyun     LensHw* lensHw = mLensDev.get_cast_ptr<LensHw>();
2688*4882a593Smuzhiyun 
2689*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
2690*4882a593Smuzhiyun 
2691*4882a593Smuzhiyun     XCAM_ASSERT (mCalibDbV2);
2692*4882a593Smuzhiyun 
2693*4882a593Smuzhiyun     _hdr_mode = mode;
2694*4882a593Smuzhiyun 
2695*4882a593Smuzhiyun     Isp20Params::set_working_mode(_hdr_mode);
2696*4882a593Smuzhiyun 
2697*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
2698*4882a593Smuzhiyun     if ((it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
2699*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
2700*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
2701*4882a593Smuzhiyun     }
2702*4882a593Smuzhiyun 
2703*4882a593Smuzhiyun     rk_sensor_full_info_t *s_info = it->second.ptr();
2704*4882a593Smuzhiyun     int isp_index = s_info->isp_info->logic_id;
2705*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor_name(%s) is linked to isp_index(%d)",
2706*4882a593Smuzhiyun                     sns_name, isp_index);
2707*4882a593Smuzhiyun 
2708*4882a593Smuzhiyun     if ((_hdr_mode > 0 && isOnlineByWorkingMode()) ||
2709*4882a593Smuzhiyun             (!_linked_to_isp && !mVicapIspPhyLinkSupported)) {
2710*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "use read back mode!");
2711*4882a593Smuzhiyun         mNoReadBack = false;
2712*4882a593Smuzhiyun     }
2713*4882a593Smuzhiyun 
2714*4882a593Smuzhiyun     // multimplex mode should be using readback mode
2715*4882a593Smuzhiyun     if (s_info->isp_info->isMultiplex)
2716*4882a593Smuzhiyun         mNoReadBack = false;
2717*4882a593Smuzhiyun 
2718*4882a593Smuzhiyun     if (mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_DOORLOCK ||
2719*4882a593Smuzhiyun         mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_BATIPC) {
2720*4882a593Smuzhiyun         mNoReadBack = true;
2721*4882a593Smuzhiyun     }
2722*4882a593Smuzhiyun 
2723*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "isp hw working mode: %s !", mNoReadBack ? "online" : "readback");
2724*4882a593Smuzhiyun 
2725*4882a593Smuzhiyun     //sof event
2726*4882a593Smuzhiyun     if (!mIspSofStream.ptr()) {
2727*4882a593Smuzhiyun         if (mNoReadBack) {
2728*4882a593Smuzhiyun             if (mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_DOORLOCK ||
2729*4882a593Smuzhiyun                 mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_BATIPC) {
2730*4882a593Smuzhiyun                 mIspSofStream = new RKSofEventStream(_cif_csi2_sd, ISP_POLL_SOF);
2731*4882a593Smuzhiyun             } else {
2732*4882a593Smuzhiyun                 mIspSofStream = new RKSofEventStream(mIspCoreDev, ISP_POLL_SOF);
2733*4882a593Smuzhiyun             }
2734*4882a593Smuzhiyun         } else {
2735*4882a593Smuzhiyun             if (_linked_to_isp)
2736*4882a593Smuzhiyun                 mIspSofStream = new RKSofEventStream(mIspCoreDev, ISP_POLL_SOF);
2737*4882a593Smuzhiyun             else
2738*4882a593Smuzhiyun                 mIspSofStream = new RKSofEventStream(_cif_csi2_sd, ISP_POLL_SOF, _linked_to_1608);
2739*4882a593Smuzhiyun         }
2740*4882a593Smuzhiyun         mIspSofStream->setPollCallback (this);
2741*4882a593Smuzhiyun     }
2742*4882a593Smuzhiyun 
2743*4882a593Smuzhiyun     _isp_stream_status = ISP_STREAM_STATUS_INVALID;
2744*4882a593Smuzhiyun     if (/*mIsGroupMode*/true) {
2745*4882a593Smuzhiyun         mIspStremEvtTh = new RkStreamEventPollThread("StreamEvt",
2746*4882a593Smuzhiyun                 new V4l2Device (s_info->isp_info->input_params_path),
2747*4882a593Smuzhiyun                 this);
2748*4882a593Smuzhiyun     }
2749*4882a593Smuzhiyun 
2750*4882a593Smuzhiyun     if (!mNoReadBack) {
2751*4882a593Smuzhiyun         setupHdrLink(RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode), isp_index, true);
2752*4882a593Smuzhiyun         if (!_linked_to_isp) {
2753*4882a593Smuzhiyun             int cif_index = s_info->cif_info->model_idx;
2754*4882a593Smuzhiyun             setupHdrLink_vidcap(_hdr_mode, cif_index, true);
2755*4882a593Smuzhiyun         }
2756*4882a593Smuzhiyun     } else
2757*4882a593Smuzhiyun         setupHdrLink(RK_AIQ_WORKING_MODE_ISP_HDR3, isp_index, false);
2758*4882a593Smuzhiyun 
2759*4882a593Smuzhiyun     sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
2760*4882a593Smuzhiyun     ret = sensorHw->set_working_mode(mode);
2761*4882a593Smuzhiyun     if (ret) {
2762*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor mode error !");
2763*4882a593Smuzhiyun         return ret;
2764*4882a593Smuzhiyun     }
2765*4882a593Smuzhiyun 
2766*4882a593Smuzhiyun     if (mIsGroupMode) {
2767*4882a593Smuzhiyun         ret = sensorHw->set_sync_mode(mIsMain ? INTERNAL_MASTER_MODE : EXTERNAL_MASTER_MODE);
2768*4882a593Smuzhiyun         if (ret) {
2769*4882a593Smuzhiyun             LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor group mode error !\n");
2770*4882a593Smuzhiyun         }
2771*4882a593Smuzhiyun     } else {
2772*4882a593Smuzhiyun         sensorHw->set_sync_mode(NO_SYNC_MODE);
2773*4882a593Smuzhiyun     }
2774*4882a593Smuzhiyun 
2775*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
2776*4882a593Smuzhiyun     mRawCapUnit->set_working_mode(mode);
2777*4882a593Smuzhiyun     mRawProcUnit->set_working_mode(mode);
2778*4882a593Smuzhiyun #endif
2779*4882a593Smuzhiyun 
2780*4882a593Smuzhiyun     setExpDelayInfo(mode);
2781*4882a593Smuzhiyun     setLensVcmCfg(s_info->mod_info);
2782*4882a593Smuzhiyun     xcam_mem_clear(_lens_des);
2783*4882a593Smuzhiyun     if (lensHw)
2784*4882a593Smuzhiyun         lensHw->getLensModeData(_lens_des);
2785*4882a593Smuzhiyun 
2786*4882a593Smuzhiyun #if defined(ISP_HW_V20)
2787*4882a593Smuzhiyun     _ispp_module_init_ens = 0;
2788*4882a593Smuzhiyun #endif
2789*4882a593Smuzhiyun     ret = setupPipelineFmt();
2790*4882a593Smuzhiyun     if (ret < 0) {
2791*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setupPipelineFmt err: %d\n", ret);
2792*4882a593Smuzhiyun     }
2793*4882a593Smuzhiyun 
2794*4882a593Smuzhiyun     struct v4l2_subdev_format isp_src_fmt;
2795*4882a593Smuzhiyun     memset(&isp_src_fmt, 0, sizeof(isp_src_fmt));
2796*4882a593Smuzhiyun     isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
2797*4882a593Smuzhiyun     isp_src_fmt.pad = 2;
2798*4882a593Smuzhiyun     ret = mIspCoreDev->getFormat(isp_src_fmt);
2799*4882a593Smuzhiyun #if defined(RKAIQ_HAVE_MULTIISP)
2800*4882a593Smuzhiyun     if (ret == XCAM_RETURN_NO_ERROR && s_info->isp_info->is_multi_isp_mode) {
2801*4882a593Smuzhiyun         uint16_t extended_pixel = mMultiIspExtendedPixel;
2802*4882a593Smuzhiyun         uint32_t width = isp_src_fmt.format.width;
2803*4882a593Smuzhiyun         uint32_t height = isp_src_fmt.format.height;
2804*4882a593Smuzhiyun         mParamsSplitter        = new IspParamsSplitter();
2805*4882a593Smuzhiyun         mParamsSplitter->SetPicInfo({0, 0, width, height})
2806*4882a593Smuzhiyun         .SetLeftIspRect({0, 0, width / 2 + extended_pixel, height})
2807*4882a593Smuzhiyun         .SetRightIspRect({width / 2 - extended_pixel, 0, width / 2 + extended_pixel, height});
2808*4882a593Smuzhiyun         IspParamsSplitter::Rectangle f = mParamsSplitter->GetPicInfo();
2809*4882a593Smuzhiyun         IspParamsSplitter::Rectangle l = mParamsSplitter->GetLeftIspRect();
2810*4882a593Smuzhiyun         IspParamsSplitter::Rectangle r = mParamsSplitter->GetRightIspRect();
2811*4882a593Smuzhiyun         LOGD_ANALYZER(
2812*4882a593Smuzhiyun             "Set Multi-ISP Mode ParamSplitter:\n"
2813*4882a593Smuzhiyun             " Extended Pixel%d\n"
2814*4882a593Smuzhiyun             " F : { %u, %u, %u, %u }\n"
2815*4882a593Smuzhiyun             " L : { %u, %u, %u, %u }\n"
2816*4882a593Smuzhiyun             " R : { %u, %u, %u, %u }\n",
2817*4882a593Smuzhiyun             extended_pixel,
2818*4882a593Smuzhiyun             f.x, f.y, f.w, f.h,
2819*4882a593Smuzhiyun             l.x, l.y, l.w, l.h,
2820*4882a593Smuzhiyun             r.x, r.y, r.w, r.h);
2821*4882a593Smuzhiyun     }
2822*4882a593Smuzhiyun #endif
2823*4882a593Smuzhiyun 
2824*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
2825*4882a593Smuzhiyun     if (!_linked_to_isp && !mNoReadBack) {
2826*4882a593Smuzhiyun         if (!_linked_to_1608) {
2827*4882a593Smuzhiyun             mRawCapUnit->prepare_cif_mipi();
2828*4882a593Smuzhiyun         } else {
2829*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
2830*4882a593Smuzhiyun                 mRawCapUnit->prepare_cif_mipi();
2831*4882a593Smuzhiyun                 CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId] = 0;
2832*4882a593Smuzhiyun             }
2833*4882a593Smuzhiyun         }
2834*4882a593Smuzhiyun     }
2835*4882a593Smuzhiyun #endif
2836*4882a593Smuzhiyun 
2837*4882a593Smuzhiyun #if defined(RKAIQ_ENABLE_SPSTREAM)
2838*4882a593Smuzhiyun     if ((_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) || _cur_calib_infos.af.ldg_param.enable) {
2839*4882a593Smuzhiyun         mSpStreamUnit->prepare(&_cur_calib_infos.af.ldg_param, &_cur_calib_infos.af.highlight);
2840*4882a593Smuzhiyun     }
2841*4882a593Smuzhiyun #endif
2842*4882a593Smuzhiyun     CalibDbV2_Af_Pdaf_t *pdaf = NULL;
2843*4882a593Smuzhiyun     if (CHECK_ISP_HW_V30()) {
2844*4882a593Smuzhiyun         CalibDbV2_AFV30_t *af_v30 =
2845*4882a593Smuzhiyun             (CalibDbV2_AFV30_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v30));
2846*4882a593Smuzhiyun         pdaf = &af_v30->TuningPara.pdaf;
2847*4882a593Smuzhiyun     }
2848*4882a593Smuzhiyun 
2849*4882a593Smuzhiyun     get_sensor_pdafinfo(s_info, &mPdafInfo);
2850*4882a593Smuzhiyun     if (mPdafInfo.pdaf_support && pdaf && pdaf->enable) {
2851*4882a593Smuzhiyun         mPdafInfo.pdaf_lrdiffline = pdaf->pdLRInDiffLine;
2852*4882a593Smuzhiyun         mPdafStreamUnit->prepare(&mPdafInfo);
2853*4882a593Smuzhiyun     } else {
2854*4882a593Smuzhiyun         mPdafInfo.pdaf_support = false;
2855*4882a593Smuzhiyun     }
2856*4882a593Smuzhiyun 
2857*4882a593Smuzhiyun     if (mCifScaleStream.ptr()) {
2858*4882a593Smuzhiyun         mCifScaleStream->set_working_mode(mode);
2859*4882a593Smuzhiyun         mCifScaleStream->prepare();
2860*4882a593Smuzhiyun     }
2861*4882a593Smuzhiyun 
2862*4882a593Smuzhiyun     _state = CAM_HW_STATE_PREPARED;
2863*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
2864*4882a593Smuzhiyun     return ret;
2865*4882a593Smuzhiyun }
2866*4882a593Smuzhiyun 
2867*4882a593Smuzhiyun XCamReturn
start()2868*4882a593Smuzhiyun CamHwIsp20::start()
2869*4882a593Smuzhiyun {
2870*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2871*4882a593Smuzhiyun     BaseSensorHw* sensorHw = NULL;
2872*4882a593Smuzhiyun     LensHw* lensHw = NULL;
2873*4882a593Smuzhiyun 
2874*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
2875*4882a593Smuzhiyun     sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
2876*4882a593Smuzhiyun     lensHw = mLensDev.get_cast_ptr<LensHw>();
2877*4882a593Smuzhiyun 
2878*4882a593Smuzhiyun     if (_state != CAM_HW_STATE_PREPARED &&
2879*4882a593Smuzhiyun             _state != CAM_HW_STATE_STOPPED) {
2880*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camhw state err: %d\n", ret);
2881*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
2882*4882a593Smuzhiyun     }
2883*4882a593Smuzhiyun 
2884*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
2885*4882a593Smuzhiyun     // set inital params
2886*4882a593Smuzhiyun     if (mParamsAssembler.ptr()) {
2887*4882a593Smuzhiyun         mParamsAssembler->setCamPhyId(mCamPhyId);
2888*4882a593Smuzhiyun         ret = mParamsAssembler->start();
2889*4882a593Smuzhiyun         if (ret < 0) {
2890*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
2891*4882a593Smuzhiyun         }
2892*4882a593Smuzhiyun 
2893*4882a593Smuzhiyun         if (mParamsAssembler->ready())
2894*4882a593Smuzhiyun             setIspConfig();
2895*4882a593Smuzhiyun     }
2896*4882a593Smuzhiyun #endif
2897*4882a593Smuzhiyun     if (mLumaStream.ptr())
2898*4882a593Smuzhiyun         mLumaStream->start();
2899*4882a593Smuzhiyun     if (mIspSofStream.ptr()) {
2900*4882a593Smuzhiyun         mIspSofStream->setCamPhyId(mCamPhyId);
2901*4882a593Smuzhiyun         mIspSofStream->start();
2902*4882a593Smuzhiyun     }
2903*4882a593Smuzhiyun 
2904*4882a593Smuzhiyun     if (_linked_to_isp)
2905*4882a593Smuzhiyun         mIspCoreDev->subscribe_event(V4L2_EVENT_FRAME_SYNC);
2906*4882a593Smuzhiyun 
2907*4882a593Smuzhiyun     if (mIspStremEvtTh.ptr()) {
2908*4882a593Smuzhiyun         ret = mIspStremEvtTh->start();
2909*4882a593Smuzhiyun         if (ret < 0) {
2910*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start isp stream event failed: %d\n", ret);
2911*4882a593Smuzhiyun         }
2912*4882a593Smuzhiyun     } else {
2913*4882a593Smuzhiyun         ret = hdr_mipi_start_mode(_hdr_mode);
2914*4882a593Smuzhiyun         if (ret < 0) {
2915*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
2916*4882a593Smuzhiyun         }
2917*4882a593Smuzhiyun     }
2918*4882a593Smuzhiyun 
2919*4882a593Smuzhiyun     ret = mIspCoreDev->start();
2920*4882a593Smuzhiyun     if (ret < 0) {
2921*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start isp core dev err: %d\n", ret);
2922*4882a593Smuzhiyun     }
2923*4882a593Smuzhiyun     if (mIspStatsStream.ptr())
2924*4882a593Smuzhiyun         mIspStatsStream->start();
2925*4882a593Smuzhiyun 
2926*4882a593Smuzhiyun     if (mFlashLight.ptr()) {
2927*4882a593Smuzhiyun         ret = mFlashLight->start();
2928*4882a593Smuzhiyun         if (ret < 0) {
2929*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start flashlight err: %d\n", ret);
2930*4882a593Smuzhiyun         }
2931*4882a593Smuzhiyun     }
2932*4882a593Smuzhiyun     if (mFlashLightIr.ptr()) {
2933*4882a593Smuzhiyun         ret = mFlashLightIr->start();
2934*4882a593Smuzhiyun         if (ret < 0) {
2935*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start flashlight ir err: %d\n", ret);
2936*4882a593Smuzhiyun         }
2937*4882a593Smuzhiyun     }
2938*4882a593Smuzhiyun #if defined(RKAIQ_ENABLE_SPSTREAM)
2939*4882a593Smuzhiyun     if ((_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) || _cur_calib_infos.af.ldg_param.enable) {
2940*4882a593Smuzhiyun         mSpStreamUnit->start();
2941*4882a593Smuzhiyun     }
2942*4882a593Smuzhiyun #endif
2943*4882a593Smuzhiyun     if (mPdafInfo.pdaf_support) {
2944*4882a593Smuzhiyun         mPdafStreamUnit->start();
2945*4882a593Smuzhiyun     }
2946*4882a593Smuzhiyun 
2947*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
2948*4882a593Smuzhiyun     if (mIspParamStream.ptr())
2949*4882a593Smuzhiyun         mIspParamStream->startThreadOnly();
2950*4882a593Smuzhiyun #endif
2951*4882a593Smuzhiyun 
2952*4882a593Smuzhiyun #if defined(ISP_HW_V20)
2953*4882a593Smuzhiyun     if (mNrStreamProcUnit.ptr())
2954*4882a593Smuzhiyun         mNrStreamProcUnit->start();
2955*4882a593Smuzhiyun 
2956*4882a593Smuzhiyun     if (mTnrStreamProcUnit.ptr())
2957*4882a593Smuzhiyun         mTnrStreamProcUnit->start();
2958*4882a593Smuzhiyun 
2959*4882a593Smuzhiyun     if (mFecParamStream.ptr())
2960*4882a593Smuzhiyun         mFecParamStream->start();
2961*4882a593Smuzhiyun #endif
2962*4882a593Smuzhiyun     sensorHw->start();
2963*4882a593Smuzhiyun     if (lensHw)
2964*4882a593Smuzhiyun         lensHw->start();
2965*4882a593Smuzhiyun     _is_exit = false;
2966*4882a593Smuzhiyun     _state = CAM_HW_STATE_STARTED;
2967*4882a593Smuzhiyun 
2968*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
2969*4882a593Smuzhiyun     // in fastboot server stage, F1 param maybe ready
2970*4882a593Smuzhiyun     // before _state = CAM_HW_STATE_STARTED.
2971*4882a593Smuzhiyun     if (mParamsAssembler->ready())
2972*4882a593Smuzhiyun         setIspConfig();
2973*4882a593Smuzhiyun #endif
2974*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
2975*4882a593Smuzhiyun     return ret;
2976*4882a593Smuzhiyun }
2977*4882a593Smuzhiyun 
2978*4882a593Smuzhiyun 
2979*4882a593Smuzhiyun XCamReturn
hdr_mipi_prepare_mode(int mode)2980*4882a593Smuzhiyun CamHwIsp20::hdr_mipi_prepare_mode(int mode)
2981*4882a593Smuzhiyun {
2982*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2983*4882a593Smuzhiyun     int new_mode = RK_AIQ_HDR_GET_WORKING_MODE(mode);
2984*4882a593Smuzhiyun 
2985*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
2986*4882a593Smuzhiyun     if (!mNoReadBack) {
2987*4882a593Smuzhiyun         bool init_state = true;
2988*4882a593Smuzhiyun         if (_linked_to_1608) {
2989*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.us_prepare_cnt > 0) {
2990*4882a593Smuzhiyun                 init_state = false;
2991*4882a593Smuzhiyun             }
2992*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.us_prepare_cnt++;
2993*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.us_prepare_cnt > 10)
2994*4882a593Smuzhiyun                 CamHwIsp20::rk1608_share_inf.us_prepare_cnt = 10;
2995*4882a593Smuzhiyun         }
2996*4882a593Smuzhiyun 
2997*4882a593Smuzhiyun         if (new_mode == RK_AIQ_WORKING_MODE_NORMAL) {
2998*4882a593Smuzhiyun             if (!_linked_to_1608) {
2999*4882a593Smuzhiyun                 ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0);
3000*4882a593Smuzhiyun             } else {
3001*4882a593Smuzhiyun                 if (init_state) {
3002*4882a593Smuzhiyun                     ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0);
3003*4882a593Smuzhiyun                 }
3004*4882a593Smuzhiyun             }
3005*4882a593Smuzhiyun             ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_0);
3006*4882a593Smuzhiyun         } else if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
3007*4882a593Smuzhiyun             if (!_linked_to_1608) {
3008*4882a593Smuzhiyun                 ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
3009*4882a593Smuzhiyun             } else {
3010*4882a593Smuzhiyun                 if (init_state) {
3011*4882a593Smuzhiyun                     ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
3012*4882a593Smuzhiyun                 }
3013*4882a593Smuzhiyun             }
3014*4882a593Smuzhiyun             ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
3015*4882a593Smuzhiyun         } else {
3016*4882a593Smuzhiyun             if (!_linked_to_1608) {
3017*4882a593Smuzhiyun                 ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_ALL);
3018*4882a593Smuzhiyun             } else {
3019*4882a593Smuzhiyun                 if (init_state) {
3020*4882a593Smuzhiyun                     ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_ALL);
3021*4882a593Smuzhiyun                 }
3022*4882a593Smuzhiyun             }
3023*4882a593Smuzhiyun             ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_ALL);
3024*4882a593Smuzhiyun         }
3025*4882a593Smuzhiyun         if (ret < 0) {
3026*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
3027*4882a593Smuzhiyun         }
3028*4882a593Smuzhiyun     }
3029*4882a593Smuzhiyun #endif
3030*4882a593Smuzhiyun     return ret;
3031*4882a593Smuzhiyun }
3032*4882a593Smuzhiyun 
3033*4882a593Smuzhiyun XCamReturn
hdr_mipi_start_mode(int mode)3034*4882a593Smuzhiyun CamHwIsp20::hdr_mipi_start_mode(int mode)
3035*4882a593Smuzhiyun {
3036*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3037*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s enter", __FUNCTION__);
3038*4882a593Smuzhiyun 
3039*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
3040*4882a593Smuzhiyun     if (!mNoReadBack) {
3041*4882a593Smuzhiyun         if (!_linked_to_1608) {
3042*4882a593Smuzhiyun             mRawCapUnit->start(mode);
3043*4882a593Smuzhiyun             mRawProcUnit->start(mode);
3044*4882a593Smuzhiyun         } else {
3045*4882a593Smuzhiyun             SmartLock locker(_sync_1608_mutex);
3046*4882a593Smuzhiyun             bool stream_on = false;
3047*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.us_stream_cnt++;
3048*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.us_stream_cnt > 10)
3049*4882a593Smuzhiyun                 CamHwIsp20::rk1608_share_inf.us_stream_cnt = 10;
3050*4882a593Smuzhiyun             if (CamHwIsp20::rk1608_share_inf.us_stream_cnt >= CamHwIsp20::rk1608_share_inf.en_sns_num) {
3051*4882a593Smuzhiyun                 // only processed the last streaming
3052*4882a593Smuzhiyun                 stream_on = true;
3053*4882a593Smuzhiyun             }
3054*4882a593Smuzhiyun             if (stream_on) {
3055*4882a593Smuzhiyun                 mRawCapUnit->start(mode);
3056*4882a593Smuzhiyun             }
3057*4882a593Smuzhiyun             mRawProcUnit->start(mode);
3058*4882a593Smuzhiyun             if (stream_on) {
3059*4882a593Smuzhiyun                 _sync_1608_done = true;
3060*4882a593Smuzhiyun                 _sync_done_cond.broadcast();
3061*4882a593Smuzhiyun             } else {
3062*4882a593Smuzhiyun                 _sync_1608_done = false;
3063*4882a593Smuzhiyun             }
3064*4882a593Smuzhiyun         }
3065*4882a593Smuzhiyun     }
3066*4882a593Smuzhiyun #endif
3067*4882a593Smuzhiyun     if (mCifScaleStream.ptr())
3068*4882a593Smuzhiyun         mCifScaleStream->start();
3069*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s exit", __FUNCTION__);
3070*4882a593Smuzhiyun     return ret;
3071*4882a593Smuzhiyun }
3072*4882a593Smuzhiyun 
3073*4882a593Smuzhiyun XCamReturn
hdr_mipi_stop()3074*4882a593Smuzhiyun CamHwIsp20::hdr_mipi_stop()
3075*4882a593Smuzhiyun {
3076*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3077*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
3078*4882a593Smuzhiyun     mRawProcUnit->stop();
3079*4882a593Smuzhiyun 
3080*4882a593Smuzhiyun     if (!_linked_to_1608) {
3081*4882a593Smuzhiyun         mRawCapUnit->stop();
3082*4882a593Smuzhiyun     } else {
3083*4882a593Smuzhiyun         bool stop_en = false;
3084*4882a593Smuzhiyun         CamHwIsp20::rk1608_share_inf.us_stop_cnt++;
3085*4882a593Smuzhiyun         if (CamHwIsp20::rk1608_share_inf.us_stop_cnt > 10)
3086*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.us_stop_cnt = 10;
3087*4882a593Smuzhiyun         if (CamHwIsp20::rk1608_share_inf.us_stop_cnt == CamHwIsp20::rk1608_share_inf.en_sns_num) {
3088*4882a593Smuzhiyun             stop_en = true;
3089*4882a593Smuzhiyun         }
3090*4882a593Smuzhiyun         if (stop_en) {
3091*4882a593Smuzhiyun             mRawCapUnit->stop();
3092*4882a593Smuzhiyun         }
3093*4882a593Smuzhiyun     }
3094*4882a593Smuzhiyun #endif
3095*4882a593Smuzhiyun     if (mCifScaleStream.ptr())
3096*4882a593Smuzhiyun         mCifScaleStream->stop();
3097*4882a593Smuzhiyun     return ret;
3098*4882a593Smuzhiyun }
3099*4882a593Smuzhiyun 
stop()3100*4882a593Smuzhiyun XCamReturn CamHwIsp20::stop()
3101*4882a593Smuzhiyun {
3102*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3103*4882a593Smuzhiyun     BaseSensorHw* sensorHw = NULL;
3104*4882a593Smuzhiyun     LensHw* lensHw = NULL;
3105*4882a593Smuzhiyun 
3106*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3107*4882a593Smuzhiyun 
3108*4882a593Smuzhiyun     if (_state == CAM_HW_STATE_STOPPED)
3109*4882a593Smuzhiyun         return ret;
3110*4882a593Smuzhiyun 
3111*4882a593Smuzhiyun     if (mIspStatsStream.ptr())
3112*4882a593Smuzhiyun         mIspStatsStream->stop();
3113*4882a593Smuzhiyun     if (mLumaStream.ptr())
3114*4882a593Smuzhiyun         mLumaStream->stop();
3115*4882a593Smuzhiyun     if (mIspSofStream.ptr())
3116*4882a593Smuzhiyun         mIspSofStream->stop();
3117*4882a593Smuzhiyun 
3118*4882a593Smuzhiyun #if defined(RKAIQ_ENABLE_SPSTREAM)
3119*4882a593Smuzhiyun     if ((_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) || _cur_calib_infos.af.ldg_param.enable) {
3120*4882a593Smuzhiyun         mSpStreamUnit->stop();
3121*4882a593Smuzhiyun     }
3122*4882a593Smuzhiyun #endif
3123*4882a593Smuzhiyun     if (mPdafInfo.pdaf_support) {
3124*4882a593Smuzhiyun         mPdafStreamUnit->stop();
3125*4882a593Smuzhiyun     }
3126*4882a593Smuzhiyun 
3127*4882a593Smuzhiyun     // stop after pollthread, ensure that no new events
3128*4882a593Smuzhiyun     // come into snesorHw
3129*4882a593Smuzhiyun     sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
3130*4882a593Smuzhiyun     sensorHw->stop();
3131*4882a593Smuzhiyun 
3132*4882a593Smuzhiyun     lensHw = mLensDev.get_cast_ptr<LensHw>();
3133*4882a593Smuzhiyun     if (lensHw)
3134*4882a593Smuzhiyun         lensHw->stop();
3135*4882a593Smuzhiyun 
3136*4882a593Smuzhiyun     if (_linked_to_isp)
3137*4882a593Smuzhiyun         mIspCoreDev->unsubscribe_event(V4L2_EVENT_FRAME_SYNC);
3138*4882a593Smuzhiyun     ret = mIspCoreDev->stop();
3139*4882a593Smuzhiyun     if (ret < 0) {
3140*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "stop isp core dev err: %d\n", ret);
3141*4882a593Smuzhiyun     }
3142*4882a593Smuzhiyun 
3143*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
3144*4882a593Smuzhiyun     if (mParamsAssembler.ptr())
3145*4882a593Smuzhiyun         mParamsAssembler->stop();
3146*4882a593Smuzhiyun #endif
3147*4882a593Smuzhiyun     if (mIspStremEvtTh.ptr()) {
3148*4882a593Smuzhiyun         mIspStremEvtTh->stop();
3149*4882a593Smuzhiyun         if (/*_isp_stream_status == ISP_STREAM_STATUS_STREAM_ON*/true) {
3150*4882a593Smuzhiyun             SmartLock locker(_stop_cond_mutex);
3151*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "stop isp stream");
3152*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
3153*4882a593Smuzhiyun             if (mIspParamStream.ptr())
3154*4882a593Smuzhiyun                 mIspParamStream->stop();
3155*4882a593Smuzhiyun #else
3156*4882a593Smuzhiyun             if (mIspParamsDev.ptr())
3157*4882a593Smuzhiyun                 mIspParamsDev->stop();
3158*4882a593Smuzhiyun #endif
3159*4882a593Smuzhiyun             hdr_mipi_stop();
3160*4882a593Smuzhiyun             _isp_stream_status = ISP_STREAM_STATUS_INVALID;
3161*4882a593Smuzhiyun         }
3162*4882a593Smuzhiyun     } else {
3163*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
3164*4882a593Smuzhiyun         if (mIspParamStream.ptr())
3165*4882a593Smuzhiyun             mIspParamStream->stop();
3166*4882a593Smuzhiyun #else
3167*4882a593Smuzhiyun         if (mIspParamsDev.ptr())
3168*4882a593Smuzhiyun             mIspParamsDev->stop();
3169*4882a593Smuzhiyun #endif
3170*4882a593Smuzhiyun 
3171*4882a593Smuzhiyun         if (!mNoReadBack) {
3172*4882a593Smuzhiyun             ret = hdr_mipi_stop();
3173*4882a593Smuzhiyun             if (ret < 0) {
3174*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi stop err: %d\n", ret);
3175*4882a593Smuzhiyun             }
3176*4882a593Smuzhiyun         }
3177*4882a593Smuzhiyun     }
3178*4882a593Smuzhiyun 
3179*4882a593Smuzhiyun #if defined(ISP_HW_V20)
3180*4882a593Smuzhiyun     if (mTnrStreamProcUnit.ptr())
3181*4882a593Smuzhiyun         mTnrStreamProcUnit->stop();
3182*4882a593Smuzhiyun 
3183*4882a593Smuzhiyun     if (mNrStreamProcUnit.ptr())
3184*4882a593Smuzhiyun         mNrStreamProcUnit->stop();
3185*4882a593Smuzhiyun 
3186*4882a593Smuzhiyun     if (mFecParamStream.ptr())
3187*4882a593Smuzhiyun         mFecParamStream->stop();
3188*4882a593Smuzhiyun #endif
3189*4882a593Smuzhiyun 
3190*4882a593Smuzhiyun     if (mFlashLight.ptr()) {
3191*4882a593Smuzhiyun         ret = mFlashLight->stop();
3192*4882a593Smuzhiyun         if (ret < 0) {
3193*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "stop flashlight err: %d\n", ret);
3194*4882a593Smuzhiyun         }
3195*4882a593Smuzhiyun     }
3196*4882a593Smuzhiyun     if (mFlashLightIr.ptr()) {
3197*4882a593Smuzhiyun         mFlashLightIr->keep_status(mKpHwSt);
3198*4882a593Smuzhiyun         ret = mFlashLightIr->stop();
3199*4882a593Smuzhiyun         if (ret < 0) {
3200*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "stop flashlight ir err: %d\n", ret);
3201*4882a593Smuzhiyun         }
3202*4882a593Smuzhiyun     }
3203*4882a593Smuzhiyun 
3204*4882a593Smuzhiyun     if (!mKpHwSt)
3205*4882a593Smuzhiyun         setIrcutParams(false);
3206*4882a593Smuzhiyun 
3207*4882a593Smuzhiyun     {
3208*4882a593Smuzhiyun         SmartLock locker (_isp_params_cfg_mutex);
3209*4882a593Smuzhiyun         _camIsp3aResult.clear();
3210*4882a593Smuzhiyun         _effecting_ispparam_map.clear();
3211*4882a593Smuzhiyun     }
3212*4882a593Smuzhiyun 
3213*4882a593Smuzhiyun     {
3214*4882a593Smuzhiyun         // TODO: [baron] PAL/NTSC mode convert[Start / Stop]. recovery cnt.
3215*4882a593Smuzhiyun         // [Stage 02] {start} <-> {stop}
3216*4882a593Smuzhiyun         CamHwIsp20::rk1608_share_inf.us_stream_cnt = 0;
3217*4882a593Smuzhiyun         if (CamHwIsp20::rk1608_share_inf.us_stop_cnt >= CamHwIsp20::rk1608_share_inf.en_sns_num) {
3218*4882a593Smuzhiyun             // ensure all valid 1608-sensor stoped.
3219*4882a593Smuzhiyun             CamHwIsp20::rk1608_share_inf.us_stop_cnt = 0;
3220*4882a593Smuzhiyun         }
3221*4882a593Smuzhiyun     }
3222*4882a593Smuzhiyun 
3223*4882a593Smuzhiyun     _state = CAM_HW_STATE_STOPPED;
3224*4882a593Smuzhiyun 
3225*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3226*4882a593Smuzhiyun     return ret;
3227*4882a593Smuzhiyun }
3228*4882a593Smuzhiyun 
pause()3229*4882a593Smuzhiyun XCamReturn CamHwIsp20::pause()
3230*4882a593Smuzhiyun {
3231*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3232*4882a593Smuzhiyun     BaseSensorHw* sensorHw = NULL;
3233*4882a593Smuzhiyun 
3234*4882a593Smuzhiyun     if (mIspStatsStream.ptr())
3235*4882a593Smuzhiyun         mIspStatsStream->stop();
3236*4882a593Smuzhiyun     if (mIspSofStream.ptr())
3237*4882a593Smuzhiyun         mIspSofStream->stop();
3238*4882a593Smuzhiyun     if (mLumaStream.ptr())
3239*4882a593Smuzhiyun         mLumaStream->stop();
3240*4882a593Smuzhiyun     if (!mNoReadBack)
3241*4882a593Smuzhiyun         hdr_mipi_stop();
3242*4882a593Smuzhiyun 
3243*4882a593Smuzhiyun     sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
3244*4882a593Smuzhiyun     sensorHw->stop();
3245*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
3246*4882a593Smuzhiyun         if (mIspParamStream.ptr())
3247*4882a593Smuzhiyun             mIspParamStream->stop();
3248*4882a593Smuzhiyun #else
3249*4882a593Smuzhiyun         if (mIspParamsDev.ptr())
3250*4882a593Smuzhiyun             mIspParamsDev->stop();
3251*4882a593Smuzhiyun #endif
3252*4882a593Smuzhiyun #if defined(ISP_HW_V20)
3253*4882a593Smuzhiyun     if (mTnrStreamProcUnit.ptr())
3254*4882a593Smuzhiyun         mTnrStreamProcUnit->start();
3255*4882a593Smuzhiyun 
3256*4882a593Smuzhiyun     if (mNrStreamProcUnit.ptr())
3257*4882a593Smuzhiyun         mNrStreamProcUnit->stop();
3258*4882a593Smuzhiyun 
3259*4882a593Smuzhiyun     if (mFecParamStream.ptr())
3260*4882a593Smuzhiyun         mFecParamStream->stop();
3261*4882a593Smuzhiyun #endif
3262*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
3263*4882a593Smuzhiyun     if (mParamsAssembler.ptr())
3264*4882a593Smuzhiyun         mParamsAssembler->stop();
3265*4882a593Smuzhiyun #endif
3266*4882a593Smuzhiyun     if (mPdafStreamUnit.ptr())
3267*4882a593Smuzhiyun         mPdafStreamUnit->stop();
3268*4882a593Smuzhiyun 
3269*4882a593Smuzhiyun     {
3270*4882a593Smuzhiyun         SmartLock locker (_isp_params_cfg_mutex);
3271*4882a593Smuzhiyun         _camIsp3aResult.clear();
3272*4882a593Smuzhiyun         _effecting_ispparam_map.clear();
3273*4882a593Smuzhiyun     }
3274*4882a593Smuzhiyun 
3275*4882a593Smuzhiyun     _state = CAM_HW_STATE_PAUSED;
3276*4882a593Smuzhiyun     return ret;
3277*4882a593Smuzhiyun }
3278*4882a593Smuzhiyun 
swWorkingModeDyn(int mode)3279*4882a593Smuzhiyun XCamReturn CamHwIsp20::swWorkingModeDyn(int mode)
3280*4882a593Smuzhiyun {
3281*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3282*4882a593Smuzhiyun     BaseSensorHw* sensorHw = NULL;
3283*4882a593Smuzhiyun 
3284*4882a593Smuzhiyun     if (_linked_to_isp || mNoReadBack) {
3285*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "sensor linked to isp, not supported now!");
3286*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
3287*4882a593Smuzhiyun     }
3288*4882a593Smuzhiyun 
3289*4882a593Smuzhiyun     sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
3290*4882a593Smuzhiyun 
3291*4882a593Smuzhiyun     ret = sensorHw->set_working_mode(mode);
3292*4882a593Smuzhiyun     if (ret) {
3293*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor mode error !");
3294*4882a593Smuzhiyun         return ret;
3295*4882a593Smuzhiyun     }
3296*4882a593Smuzhiyun 
3297*4882a593Smuzhiyun     setExpDelayInfo(mode);
3298*4882a593Smuzhiyun 
3299*4882a593Smuzhiyun     Isp20Params::set_working_mode(mode);
3300*4882a593Smuzhiyun 
3301*4882a593Smuzhiyun #if 0 // for quick switch, not used now
3302*4882a593Smuzhiyun     int old_mode = RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode);
3303*4882a593Smuzhiyun     int new_mode = RK_AIQ_HDR_GET_WORKING_MODE(mode);
3304*4882a593Smuzhiyun     //set hdr mode to drv
3305*4882a593Smuzhiyun     if (mIspCoreDev.ptr()) {
3306*4882a593Smuzhiyun         int drv_mode = ISP2X_HDR_MODE_NOMAL;
3307*4882a593Smuzhiyun         if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
3308*4882a593Smuzhiyun             drv_mode = ISP2X_HDR_MODE_X3;
3309*4882a593Smuzhiyun         else if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2)
3310*4882a593Smuzhiyun             drv_mode = ISP2X_HDR_MODE_X2;
3311*4882a593Smuzhiyun 
3312*4882a593Smuzhiyun         if (mIspCoreDev->io_control (RKISP_CMD_SW_HDR_MODE_QUICK, &drv_mode) < 0) {
3313*4882a593Smuzhiyun             ret = XCAM_RETURN_ERROR_FAILED;
3314*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set RKISP_CMD_SW_HDR_MODE_QUICK failed");
3315*4882a593Smuzhiyun             return ret;
3316*4882a593Smuzhiyun         }
3317*4882a593Smuzhiyun     }
3318*4882a593Smuzhiyun     // reconfig tx,rx stream
3319*4882a593Smuzhiyun     if (!old_mode && new_mode) {
3320*4882a593Smuzhiyun         // normal to hdr
3321*4882a593Smuzhiyun         if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
3322*4882a593Smuzhiyun             hdr_mipi_start(MIPI_STREAM_IDX_1 | MIPI_STREAM_IDX_2);
3323*4882a593Smuzhiyun         else
3324*4882a593Smuzhiyun             hdr_mipi_start(MIPI_STREAM_IDX_1);
3325*4882a593Smuzhiyun     } else if (old_mode && !new_mode) {
3326*4882a593Smuzhiyun         // hdr to normal
3327*4882a593Smuzhiyun         if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
3328*4882a593Smuzhiyun             hdr_mipi_stop(MIPI_STREAM_IDX_1 | MIPI_STREAM_IDX_2);
3329*4882a593Smuzhiyun         else
3330*4882a593Smuzhiyun             hdr_mipi_stop(MIPI_STREAM_IDX_1);
3331*4882a593Smuzhiyun     } else if (old_mode == RK_AIQ_WORKING_MODE_ISP_HDR3 &&
3332*4882a593Smuzhiyun                new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
3333*4882a593Smuzhiyun         // hdr3 to hdr2
3334*4882a593Smuzhiyun         hdr_mipi_stop(MIPI_STREAM_IDX_1);
3335*4882a593Smuzhiyun     } else if (old_mode == RK_AIQ_WORKING_MODE_ISP_HDR2 &&
3336*4882a593Smuzhiyun                new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3) {
3337*4882a593Smuzhiyun         // hdr3 to hdr2
3338*4882a593Smuzhiyun         hdr_mipi_start(MIPI_STREAM_IDX_2);
3339*4882a593Smuzhiyun     } else {
3340*4882a593Smuzhiyun         // do nothing
3341*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "do nothing, old mode %d, new mode %d\n",
3342*4882a593Smuzhiyun                         _hdr_mode, mode);
3343*4882a593Smuzhiyun     }
3344*4882a593Smuzhiyun #endif
3345*4882a593Smuzhiyun     _hdr_mode = mode;
3346*4882a593Smuzhiyun 
3347*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
3348*4882a593Smuzhiyun     mRawCapUnit->set_working_mode(mode);
3349*4882a593Smuzhiyun     mRawProcUnit->set_working_mode(mode);
3350*4882a593Smuzhiyun     // remap _mipi_tx_devs for cif
3351*4882a593Smuzhiyun     if (!_linked_to_isp && !mNoReadBack) {
3352*4882a593Smuzhiyun         mRawCapUnit->prepare_cif_mipi();
3353*4882a593Smuzhiyun     }
3354*4882a593Smuzhiyun #endif
3355*4882a593Smuzhiyun 
3356*4882a593Smuzhiyun     return ret;
3357*4882a593Smuzhiyun }
3358*4882a593Smuzhiyun 
resume()3359*4882a593Smuzhiyun XCamReturn CamHwIsp20::resume()
3360*4882a593Smuzhiyun {
3361*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3362*4882a593Smuzhiyun     BaseSensorHw* sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
3363*4882a593Smuzhiyun 
3364*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
3365*4882a593Smuzhiyun     // set inital params
3366*4882a593Smuzhiyun     ret = mParamsAssembler->start();
3367*4882a593Smuzhiyun     if (ret < 0) {
3368*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
3369*4882a593Smuzhiyun     }
3370*4882a593Smuzhiyun 
3371*4882a593Smuzhiyun     if (mParamsAssembler->ready())
3372*4882a593Smuzhiyun         setIspConfig();
3373*4882a593Smuzhiyun #endif
3374*4882a593Smuzhiyun     ret = hdr_mipi_start_mode(_hdr_mode);
3375*4882a593Smuzhiyun     if (ret < 0) {
3376*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
3377*4882a593Smuzhiyun     }
3378*4882a593Smuzhiyun     sensorHw->start();
3379*4882a593Smuzhiyun     if (mIspSofStream.ptr())
3380*4882a593Smuzhiyun         mIspSofStream->start();
3381*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
3382*4882a593Smuzhiyun     if (mIspParamStream.ptr())
3383*4882a593Smuzhiyun         mIspParamStream->startThreadOnly();
3384*4882a593Smuzhiyun #endif
3385*4882a593Smuzhiyun     if (mLumaStream.ptr())
3386*4882a593Smuzhiyun         mLumaStream->start();
3387*4882a593Smuzhiyun     if (mIspStatsStream.ptr())
3388*4882a593Smuzhiyun         mIspStatsStream->start();
3389*4882a593Smuzhiyun 
3390*4882a593Smuzhiyun #if defined(ISP_HW_V20)
3391*4882a593Smuzhiyun     if (mTnrStreamProcUnit.ptr())
3392*4882a593Smuzhiyun         mTnrStreamProcUnit->start();
3393*4882a593Smuzhiyun 
3394*4882a593Smuzhiyun     if (mNrStreamProcUnit.ptr())
3395*4882a593Smuzhiyun         mNrStreamProcUnit->start();
3396*4882a593Smuzhiyun 
3397*4882a593Smuzhiyun     if (mFecParamStream.ptr())
3398*4882a593Smuzhiyun         mFecParamStream->start();
3399*4882a593Smuzhiyun #endif
3400*4882a593Smuzhiyun     if (mPdafStreamUnit.ptr())
3401*4882a593Smuzhiyun         mPdafStreamUnit->start();
3402*4882a593Smuzhiyun 
3403*4882a593Smuzhiyun     _state = CAM_HW_STATE_STARTED;
3404*4882a593Smuzhiyun     return ret;
3405*4882a593Smuzhiyun }
3406*4882a593Smuzhiyun 
3407*4882a593Smuzhiyun #if defined(ISP_HW_V20)
3408*4882a593Smuzhiyun void
gen_full_ispp_params(const struct rkispp_params_cfg * update_params,struct rkispp_params_cfg * full_params)3409*4882a593Smuzhiyun CamHwIsp20::gen_full_ispp_params(const struct rkispp_params_cfg* update_params,
3410*4882a593Smuzhiyun                                  struct rkispp_params_cfg* full_params)
3411*4882a593Smuzhiyun {
3412*4882a593Smuzhiyun     XCAM_ASSERT (update_params);
3413*4882a593Smuzhiyun     XCAM_ASSERT (full_params);
3414*4882a593Smuzhiyun 
3415*4882a593Smuzhiyun     int end = RK_ISP2X_PP_MAX_ID - RK_ISP2X_PP_TNR_ID;
3416*4882a593Smuzhiyun 
3417*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3418*4882a593Smuzhiyun     for (int i = 0; i < end; i++)
3419*4882a593Smuzhiyun         if (update_params->module_en_update & (1 << i)) {
3420*4882a593Smuzhiyun             full_params->module_en_update |= 1 << i;
3421*4882a593Smuzhiyun             // clear old bit value
3422*4882a593Smuzhiyun             full_params->module_ens &= ~(1 << i);
3423*4882a593Smuzhiyun             // set new bit value
3424*4882a593Smuzhiyun             full_params->module_ens |= update_params->module_ens & (1LL << i);
3425*4882a593Smuzhiyun         }
3426*4882a593Smuzhiyun 
3427*4882a593Smuzhiyun     for (int i = 0; i < end; i++)
3428*4882a593Smuzhiyun         if (update_params->module_cfg_update & (1 << i)) {
3429*4882a593Smuzhiyun             full_params->module_cfg_update |= 1 << i;
3430*4882a593Smuzhiyun         }
3431*4882a593Smuzhiyun 
3432*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3433*4882a593Smuzhiyun }
3434*4882a593Smuzhiyun #endif
3435*4882a593Smuzhiyun 
3436*4882a593Smuzhiyun #if 0
3437*4882a593Smuzhiyun void CamHwIsp20::dump_isp_config(struct isp2x_isp_params_cfg* isp_params,
3438*4882a593Smuzhiyun                                  SmartPtr<RkAiqIspParamsProxy> aiq_results,
3439*4882a593Smuzhiyun                                  SmartPtr<RkAiqIspParamsProxy> aiq_other_results)
3440*4882a593Smuzhiyun {
3441*4882a593Smuzhiyun     rk_aiq_isp_meas_params_v20_t* isp20_meas_result =
3442*4882a593Smuzhiyun         static_cast<rk_aiq_isp_meas_params_v20_t*>(aiq_results->data().ptr());
3443*4882a593Smuzhiyun     rk_aiq_isp_other_params_v20_t* isp20_other_result =
3444*4882a593Smuzhiyun         static_cast<rk_aiq_isp_other_params_v20_t*>(aiq_other_results->data().ptr());
3445*4882a593Smuzhiyun 
3446*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params mask: 0x%llx-0x%llx-0x%llx\n",
3447*4882a593Smuzhiyun                     isp_params->module_en_update,
3448*4882a593Smuzhiyun                     isp_params->module_ens,
3449*4882a593Smuzhiyun                     isp_params->module_cfg_update);
3450*4882a593Smuzhiyun 
3451*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "aiq_results: ae-lite.winnum=%d; ae-big2.winnum=%d, sub[1].size: [%dx%d]\n",
3452*4882a593Smuzhiyun                     isp20_meas_result->aec_meas.rawae0.wnd_num,
3453*4882a593Smuzhiyun                     isp20_meas_result->aec_meas.rawae1.wnd_num,
3454*4882a593Smuzhiyun                     isp20_meas_result->aec_meas.rawae1.subwin[1].h_size,
3455*4882a593Smuzhiyun                     isp20_meas_result->aec_meas.rawae1.subwin[1].v_size);
3456*4882a593Smuzhiyun 
3457*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: ae-lite.winnum=%d; ae-big2.winnum=%d, sub[1].size: [%dx%d]\n",
3458*4882a593Smuzhiyun                     isp_params->meas.rawae0.wnd_num,
3459*4882a593Smuzhiyun                     isp_params->meas.rawae1.wnd_num,
3460*4882a593Smuzhiyun                     isp_params->meas.rawae1.subwin[1].h_size,
3461*4882a593Smuzhiyun                     isp_params->meas.rawae1.subwin[1].v_size);
3462*4882a593Smuzhiyun 
3463*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: win size: [%dx%d]-[%dx%d]-[%dx%d]-[%dx%d]\n",
3464*4882a593Smuzhiyun                     isp_params->meas.rawae0.win.h_size,
3465*4882a593Smuzhiyun                     isp_params->meas.rawae0.win.v_size,
3466*4882a593Smuzhiyun                     isp_params->meas.rawae3.win.h_size,
3467*4882a593Smuzhiyun                     isp_params->meas.rawae3.win.v_size,
3468*4882a593Smuzhiyun                     isp_params->meas.rawae1.win.h_size,
3469*4882a593Smuzhiyun                     isp_params->meas.rawae1.win.v_size,
3470*4882a593Smuzhiyun                     isp_params->meas.rawae2.win.h_size,
3471*4882a593Smuzhiyun                     isp_params->meas.rawae2.win.v_size);
3472*4882a593Smuzhiyun 
3473*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: debayer:");
3474*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "clip_en:%d, dist_scale:%d, filter_c_en:%d, filter_g_en:%d",
3475*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.clip_en,
3476*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.dist_scale,
3477*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter_c_en,
3478*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter_g_en);
3479*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "gain_offset:%d,hf_offset:%d,max_ratio:%d,offset:%d,order_max:%d",
3480*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.gain_offset,
3481*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.hf_offset,
3482*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.max_ratio,
3483*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.offset,
3484*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.order_max);
3485*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "order_min:%d, shift_num:%d, thed0:%d, thed1:%d",
3486*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.order_min,
3487*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.shift_num,
3488*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.thed0,
3489*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.thed1);
3490*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "filter1:[%d, %d, %d, %d, %d]",
3491*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter1_coe1,
3492*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter1_coe2,
3493*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter1_coe3,
3494*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter1_coe4,
3495*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter1_coe5);
3496*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "filter2:[%d, %d, %d, %d, %d]",
3497*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter2_coe1,
3498*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter2_coe2,
3499*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter2_coe3,
3500*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter2_coe4,
3501*4882a593Smuzhiyun                     isp_params->others.debayer_cfg.filter2_coe5);
3502*4882a593Smuzhiyun 
3503*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: gic: \n"
3504*4882a593Smuzhiyun                     "edge_open:%d, regmingradthrdark2:%d, regmingradthrdark1:%d, regminbusythre:%d\n"
3505*4882a593Smuzhiyun                     "regdarkthre:%d,regmaxcorvboth:%d,regdarktthrehi:%d,regkgrad2dark:%d,regkgrad1dark:%d\n"
3506*4882a593Smuzhiyun                     "regstrengthglobal_fix:%d, regdarkthrestep:%d, regkgrad2:%d, regkgrad1:%d\n"
3507*4882a593Smuzhiyun                     "reggbthre:%d, regmaxcorv:%d, regmingradthr2:%d, regmingradthr1:%d, gr_ratio:%d\n"
3508*4882a593Smuzhiyun                     "dnloscale:%d, dnhiscale:%d, reglumapointsstep:%d, gvaluelimitlo:%d, gvaluelimithi:%d\n"
3509*4882a593Smuzhiyun                     "fratiohilimt1:%d, strength_fix:%d, noise_cuten:%d, noise_coe_a:%d, noise_coe_b:%d, diff_clip:%d\n",
3510*4882a593Smuzhiyun                     isp_params->others.gic_cfg.edge_open,
3511*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regmingradthrdark2,
3512*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regmingradthrdark1,
3513*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regminbusythre,
3514*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regdarkthre,
3515*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regmaxcorvboth,
3516*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regdarktthrehi,
3517*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regkgrad2dark,
3518*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regkgrad1dark,
3519*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regstrengthglobal_fix,
3520*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regdarkthrestep,
3521*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regkgrad2,
3522*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regkgrad1,
3523*4882a593Smuzhiyun                     isp_params->others.gic_cfg.reggbthre,
3524*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regmaxcorv,
3525*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regmingradthr2,
3526*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regmingradthr1,
3527*4882a593Smuzhiyun                     isp_params->others.gic_cfg.gr_ratio,
3528*4882a593Smuzhiyun                     isp_params->others.gic_cfg.dnloscale,
3529*4882a593Smuzhiyun                     isp_params->others.gic_cfg.dnhiscale,
3530*4882a593Smuzhiyun                     isp_params->others.gic_cfg.reglumapointsstep,
3531*4882a593Smuzhiyun                     isp_params->others.gic_cfg.gvaluelimitlo,
3532*4882a593Smuzhiyun                     isp_params->others.gic_cfg.gvaluelimithi,
3533*4882a593Smuzhiyun                     isp_params->others.gic_cfg.fusionratiohilimt1,
3534*4882a593Smuzhiyun                     isp_params->others.gic_cfg.regstrengthglobal_fix,
3535*4882a593Smuzhiyun                     isp_params->others.gic_cfg.noise_cut_en,
3536*4882a593Smuzhiyun                     isp_params->others.gic_cfg.noise_coe_a,
3537*4882a593Smuzhiyun                     isp_params->others.gic_cfg.noise_coe_b,
3538*4882a593Smuzhiyun                     isp_params->others.gic_cfg.diff_clip);
3539*4882a593Smuzhiyun     for(int i = 0; i < ISP2X_GIC_SIGMA_Y_NUM; i++) {
3540*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sigma_y[%d]=%d\n", i, isp_params->others.gic_cfg.sigma_y[i]);
3541*4882a593Smuzhiyun     }
3542*4882a593Smuzhiyun #if 0 //TODO Merge
3543*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "aiq_results: gic: dnloscale=%f, dnhiscale=%f,gvaluelimitlo=%f,gvaluelimithi=%f,fusionratiohilimt1=%f"
3544*4882a593Smuzhiyun                     "textureStrength=%f,globalStrength=%f,noiseCurve_0=%f,noiseCurve_1=%f",
3545*4882a593Smuzhiyun                     isp20_other_result->gic.dnloscale, isp20_other_result->gic.dnhiscale,
3546*4882a593Smuzhiyun                     isp20_other_result->gic.gvaluelimitlo, isp20_other_result->gic.gvaluelimithi,
3547*4882a593Smuzhiyun                     isp20_other_result->gic.fusionratiohilimt1, isp20_other_result->gic.textureStrength,
3548*4882a593Smuzhiyun                     isp20_other_result->gic.globalStrength, isp20_other_result->gic.noiseCurve_0,
3549*4882a593Smuzhiyun                     isp20_other_result->gic.noiseCurve_1);
3550*4882a593Smuzhiyun     for(int i = 0; i < ISP2X_GIC_SIGMA_Y_NUM; i++) {
3551*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sigma[%d]=%f\n", i, isp20_other_result->gic.sigma_y[i]);
3552*4882a593Smuzhiyun     }
3553*4882a593Smuzhiyun #endif
3554*4882a593Smuzhiyun }
3555*4882a593Smuzhiyun #endif
3556*4882a593Smuzhiyun 
3557*4882a593Smuzhiyun #if defined(ISP_HW_V20)
3558*4882a593Smuzhiyun XCamReturn
setIsppSharpFbcRot(struct rkispp_sharp_config * shp_cfg)3559*4882a593Smuzhiyun CamHwIsp20::setIsppSharpFbcRot(struct rkispp_sharp_config* shp_cfg)
3560*4882a593Smuzhiyun {
3561*4882a593Smuzhiyun     // check if sharp enable
3562*4882a593Smuzhiyun     // check if fec disable
3563*4882a593Smuzhiyun     if ((_ispp_module_init_ens & ISPP_MODULE_SHP) &&
3564*4882a593Smuzhiyun             !(_ispp_module_init_ens & ISPP_MODULE_FEC)) {
3565*4882a593Smuzhiyun         switch (_sharp_fbc_rotation) {
3566*4882a593Smuzhiyun         case RK_AIQ_ROTATION_0 :
3567*4882a593Smuzhiyun             shp_cfg->rotation = 0;
3568*4882a593Smuzhiyun             break;
3569*4882a593Smuzhiyun         case RK_AIQ_ROTATION_90 :
3570*4882a593Smuzhiyun             shp_cfg->rotation = 1;
3571*4882a593Smuzhiyun             break;
3572*4882a593Smuzhiyun         case RK_AIQ_ROTATION_270 :
3573*4882a593Smuzhiyun             shp_cfg->rotation = 3;
3574*4882a593Smuzhiyun             break;
3575*4882a593Smuzhiyun         default:
3576*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wrong rotation %d\n", _sharp_fbc_rotation);
3577*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
3578*4882a593Smuzhiyun         }
3579*4882a593Smuzhiyun     } else {
3580*4882a593Smuzhiyun         if (_sharp_fbc_rotation != RK_AIQ_ROTATION_0) {
3581*4882a593Smuzhiyun             shp_cfg->rotation = 0;
3582*4882a593Smuzhiyun             _sharp_fbc_rotation = RK_AIQ_ROTATION_0;
3583*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't set sharp config, check fec & sharp config\n");
3584*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
3585*4882a593Smuzhiyun         }
3586*4882a593Smuzhiyun     }
3587*4882a593Smuzhiyun 
3588*4882a593Smuzhiyun     LOGD("sharp rotation %d", _sharp_fbc_rotation);
3589*4882a593Smuzhiyun 
3590*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
3591*4882a593Smuzhiyun }
3592*4882a593Smuzhiyun #endif
3593*4882a593Smuzhiyun 
3594*4882a593Smuzhiyun XCamReturn
showOtpPdafData(struct rkmodule_pdaf_inf * otp_pdaf)3595*4882a593Smuzhiyun CamHwIsp20::showOtpPdafData(struct rkmodule_pdaf_inf *otp_pdaf)
3596*4882a593Smuzhiyun {
3597*4882a593Smuzhiyun     unsigned int gainmap_w, gainmap_h;
3598*4882a593Smuzhiyun     unsigned int dccmap_w, dccmap_h;
3599*4882a593Smuzhiyun     char print_buf[256];
3600*4882a593Smuzhiyun     unsigned int i, j;
3601*4882a593Smuzhiyun 
3602*4882a593Smuzhiyun     if (otp_pdaf->flag) {
3603*4882a593Smuzhiyun         gainmap_w = otp_pdaf->gainmap_width;
3604*4882a593Smuzhiyun         gainmap_h = otp_pdaf->gainmap_height;
3605*4882a593Smuzhiyun         dccmap_w = otp_pdaf->dccmap_width;
3606*4882a593Smuzhiyun         dccmap_h = otp_pdaf->dccmap_height;
3607*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "[RKPDAFOTPParam]");
3608*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "flag=%d;", otp_pdaf->flag);
3609*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "gainmap_width=%d;", gainmap_w);
3610*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "gainmap_height=%d;", gainmap_h);
3611*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "gainmap_table=");
3612*4882a593Smuzhiyun         for (i = 0; i < gainmap_h; i++) {
3613*4882a593Smuzhiyun             memset(print_buf, 0, sizeof(print_buf));
3614*4882a593Smuzhiyun             for (j = 0; j < gainmap_w; j++) {
3615*4882a593Smuzhiyun                 sprintf(print_buf + strlen(print_buf), "%d ", otp_pdaf->gainmap[i * gainmap_w + j]);
3616*4882a593Smuzhiyun             }
3617*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "%s", print_buf);
3618*4882a593Smuzhiyun         }
3619*4882a593Smuzhiyun 
3620*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dcc_mode=%d;", otp_pdaf->dcc_mode);
3621*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dcc_dir=%d;", otp_pdaf->dcc_dir);
3622*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dccmap_width=%d;", otp_pdaf->dccmap_width);
3623*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dccmap_height=%d;", otp_pdaf->dccmap_height);
3624*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dccmap_table=");
3625*4882a593Smuzhiyun         for (i = 0; i < dccmap_h; i++) {
3626*4882a593Smuzhiyun             memset(print_buf, 0, sizeof(print_buf));
3627*4882a593Smuzhiyun             for (j = 0; j < dccmap_w; j++) {
3628*4882a593Smuzhiyun                 sprintf(print_buf + strlen(print_buf), "%d ", otp_pdaf->dccmap[i * dccmap_w + j]);
3629*4882a593Smuzhiyun             }
3630*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "%s", print_buf);
3631*4882a593Smuzhiyun         }
3632*4882a593Smuzhiyun     }
3633*4882a593Smuzhiyun 
3634*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
3635*4882a593Smuzhiyun }
3636*4882a593Smuzhiyun 
3637*4882a593Smuzhiyun XCamReturn
showOtpAfData(struct rkmodule_af_inf * af_inf)3638*4882a593Smuzhiyun CamHwIsp20::showOtpAfData(struct rkmodule_af_inf *af_inf)
3639*4882a593Smuzhiyun {
3640*4882a593Smuzhiyun     unsigned int i;
3641*4882a593Smuzhiyun 
3642*4882a593Smuzhiyun     if (af_inf->flag) {
3643*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "[RKAFOTPParam]");
3644*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "flag=%d;", af_inf->flag);
3645*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dir_cnt=%d;", af_inf->dir_cnt);
3646*4882a593Smuzhiyun 
3647*4882a593Smuzhiyun         for (i = 0; i < af_inf->dir_cnt; i++) {
3648*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "af_inf=%d;", af_inf->af_otp[i].vcm_dir);
3649*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "af_macro=%d;", af_inf->af_otp[i].vcm_start);
3650*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "af_macro=%d;", af_inf->af_otp[i].vcm_end);
3651*4882a593Smuzhiyun         }
3652*4882a593Smuzhiyun     }
3653*4882a593Smuzhiyun 
3654*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
3655*4882a593Smuzhiyun }
3656*4882a593Smuzhiyun 
3657*4882a593Smuzhiyun XCamReturn
getSensorModeData(const char * sns_ent_name,rk_aiq_exposure_sensor_descriptor & sns_des)3658*4882a593Smuzhiyun CamHwIsp20::getSensorModeData(const char* sns_ent_name,
3659*4882a593Smuzhiyun                               rk_aiq_exposure_sensor_descriptor& sns_des)
3660*4882a593Smuzhiyun {
3661*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3662*4882a593Smuzhiyun     BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
3663*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3664*4882a593Smuzhiyun     struct v4l2_subdev_selection select;
3665*4882a593Smuzhiyun 
3666*4882a593Smuzhiyun     ret = mSensorSubdev->getSensorModeData(sns_ent_name, sns_des);
3667*4882a593Smuzhiyun     if (ret) {
3668*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "getSensorModeData failed \n");
3669*4882a593Smuzhiyun         return ret;
3670*4882a593Smuzhiyun     }
3671*4882a593Smuzhiyun 
3672*4882a593Smuzhiyun     xcam_mem_clear (select);
3673*4882a593Smuzhiyun     ret = mIspCoreDev->get_selection(0, V4L2_SEL_TGT_CROP, select);
3674*4882a593Smuzhiyun     if (ret == XCAM_RETURN_NO_ERROR) {
3675*4882a593Smuzhiyun         sns_des.isp_acq_width = select.r.width;
3676*4882a593Smuzhiyun         sns_des.isp_acq_height = select.r.height;
3677*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "get isp acq,w: %d, h: %d\n",
3678*4882a593Smuzhiyun                         sns_des.isp_acq_width,
3679*4882a593Smuzhiyun                         sns_des.isp_acq_height);
3680*4882a593Smuzhiyun     } else {
3681*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get selecttion error \n");
3682*4882a593Smuzhiyun         sns_des.isp_acq_width = sns_des.sensor_output_width;
3683*4882a593Smuzhiyun         sns_des.isp_acq_height = sns_des.sensor_output_height;
3684*4882a593Smuzhiyun         ret = XCAM_RETURN_NO_ERROR;
3685*4882a593Smuzhiyun     }
3686*4882a593Smuzhiyun 
3687*4882a593Smuzhiyun     if(userSensorWidth && userSensorHeight){
3688*4882a593Smuzhiyun         sns_des.sensor_output_width = userSensorWidth;
3689*4882a593Smuzhiyun         sns_des.sensor_output_height = userSensorHeight;
3690*4882a593Smuzhiyun         sns_des.isp_acq_width = sns_des.sensor_output_width;
3691*4882a593Smuzhiyun         sns_des.isp_acq_height = sns_des.sensor_output_height;
3692*4882a593Smuzhiyun     }
3693*4882a593Smuzhiyun 
3694*4882a593Smuzhiyun     xcam_mem_clear (sns_des.lens_des);
3695*4882a593Smuzhiyun     if (mLensSubdev)
3696*4882a593Smuzhiyun         mLensSubdev->getLensModeData(sns_des.lens_des);
3697*4882a593Smuzhiyun 
3698*4882a593Smuzhiyun     auto iter_sns_info = mSensorHwInfos.find(sns_name);
3699*4882a593Smuzhiyun     if (iter_sns_info == mSensorHwInfos.end()) {
3700*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
3701*4882a593Smuzhiyun     } else {
3702*4882a593Smuzhiyun         struct rkmodule_inf *minfo = &(iter_sns_info->second->mod_info);
3703*4882a593Smuzhiyun         if (minfo->awb.flag) {
3704*4882a593Smuzhiyun             memcpy(&sns_des.otp_awb, &minfo->awb, sizeof(minfo->awb));
3705*4882a593Smuzhiyun         } else {
3706*4882a593Smuzhiyun             sns_des.otp_awb.flag = 0;
3707*4882a593Smuzhiyun         }
3708*4882a593Smuzhiyun 
3709*4882a593Smuzhiyun         if (minfo->lsc.flag)
3710*4882a593Smuzhiyun             sns_des.otp_lsc = &minfo->lsc;
3711*4882a593Smuzhiyun         else
3712*4882a593Smuzhiyun             sns_des.otp_lsc = nullptr;
3713*4882a593Smuzhiyun 
3714*4882a593Smuzhiyun         if (minfo->af.flag) {
3715*4882a593Smuzhiyun             sns_des.otp_af = &minfo->af;
3716*4882a593Smuzhiyun             showOtpAfData(sns_des.otp_af);
3717*4882a593Smuzhiyun         } else {
3718*4882a593Smuzhiyun             sns_des.otp_af = nullptr;
3719*4882a593Smuzhiyun         }
3720*4882a593Smuzhiyun 
3721*4882a593Smuzhiyun         if (minfo->pdaf.flag) {
3722*4882a593Smuzhiyun             sns_des.otp_pdaf = &minfo->pdaf;
3723*4882a593Smuzhiyun             showOtpPdafData(sns_des.otp_pdaf);
3724*4882a593Smuzhiyun         } else {
3725*4882a593Smuzhiyun             sns_des.otp_pdaf = nullptr;
3726*4882a593Smuzhiyun         }
3727*4882a593Smuzhiyun     }
3728*4882a593Smuzhiyun 
3729*4882a593Smuzhiyun     return ret;
3730*4882a593Smuzhiyun }
3731*4882a593Smuzhiyun 
3732*4882a593Smuzhiyun XCamReturn
setExposureParams(SmartPtr<RkAiqExpParamsProxy> & expPar)3733*4882a593Smuzhiyun CamHwIsp20::setExposureParams(SmartPtr<RkAiqExpParamsProxy>& expPar)
3734*4882a593Smuzhiyun {
3735*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3736*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3737*4882a593Smuzhiyun     BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
3738*4882a593Smuzhiyun 
3739*4882a593Smuzhiyun     //exp
3740*4882a593Smuzhiyun     ret = mSensorSubdev->setExposureParams(expPar);
3741*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3742*4882a593Smuzhiyun     return ret;
3743*4882a593Smuzhiyun }
3744*4882a593Smuzhiyun 
3745*4882a593Smuzhiyun XCamReturn
setIrisParams(SmartPtr<RkAiqIrisParamsProxy> & irisPar,CalibDb_IrisTypeV2_t irisType)3746*4882a593Smuzhiyun CamHwIsp20::setIrisParams(SmartPtr<RkAiqIrisParamsProxy>& irisPar, CalibDb_IrisTypeV2_t irisType)
3747*4882a593Smuzhiyun {
3748*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3749*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3750*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3751*4882a593Smuzhiyun 
3752*4882a593Smuzhiyun     if(irisType == IRISV2_P_TYPE) {
3753*4882a593Smuzhiyun         //P-iris
3754*4882a593Smuzhiyun         int step = irisPar->data()->PIris.step;
3755*4882a593Smuzhiyun         bool update = irisPar->data()->PIris.update;
3756*4882a593Smuzhiyun 
3757*4882a593Smuzhiyun         if (mLensSubdev && update) {
3758*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set P-Iris step: %d", step);
3759*4882a593Smuzhiyun             if (mLensSubdev->setPIrisParams(step) < 0) {
3760*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set P-Iris step failed to device");
3761*4882a593Smuzhiyun                 return XCAM_RETURN_ERROR_IOCTL;
3762*4882a593Smuzhiyun             }
3763*4882a593Smuzhiyun         }
3764*4882a593Smuzhiyun     } else if(irisType == IRISV2_DC_TYPE) {
3765*4882a593Smuzhiyun         //DC-iris
3766*4882a593Smuzhiyun         int PwmDuty = irisPar->data()->DCIris.pwmDuty;
3767*4882a593Smuzhiyun         bool update = irisPar->data()->DCIris.update;
3768*4882a593Smuzhiyun 
3769*4882a593Smuzhiyun         if (mLensSubdev && update) {
3770*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set DC-Iris PwmDuty: %d", PwmDuty);
3771*4882a593Smuzhiyun             if (mLensSubdev->setDCIrisParams(PwmDuty) < 0) {
3772*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set DC-Iris PwmDuty failed to device");
3773*4882a593Smuzhiyun                 return XCAM_RETURN_ERROR_IOCTL;
3774*4882a593Smuzhiyun             }
3775*4882a593Smuzhiyun         }
3776*4882a593Smuzhiyun     } else if(irisType == IRISV2_HDC_TYPE) {
3777*4882a593Smuzhiyun         //HDC-iris
3778*4882a593Smuzhiyun         int target = irisPar->data()->HDCIris.target;
3779*4882a593Smuzhiyun         bool update = irisPar->data()->HDCIris.update;
3780*4882a593Smuzhiyun         if (mLensSubdev && update) {
3781*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set HDC-Iris Target: %d", target);
3782*4882a593Smuzhiyun             if (mLensSubdev->setHDCIrisParams(target) < 0) {
3783*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set HDC-Iris target failed to device");
3784*4882a593Smuzhiyun                 return XCAM_RETURN_ERROR_IOCTL;
3785*4882a593Smuzhiyun             }
3786*4882a593Smuzhiyun         }
3787*4882a593Smuzhiyun     }
3788*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3789*4882a593Smuzhiyun     return ret;
3790*4882a593Smuzhiyun }
3791*4882a593Smuzhiyun 
3792*4882a593Smuzhiyun XCamReturn
getIrisParams(SmartPtr<RkAiqIrisParamsProxy> & irisPar,CalibDb_IrisTypeV2_t irisType)3793*4882a593Smuzhiyun CamHwIsp20::getIrisParams(SmartPtr<RkAiqIrisParamsProxy>& irisPar, CalibDb_IrisTypeV2_t irisType)
3794*4882a593Smuzhiyun {
3795*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3796*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3797*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3798*4882a593Smuzhiyun 
3799*4882a593Smuzhiyun     if(irisType == IRISV2_HDC_TYPE) {
3800*4882a593Smuzhiyun         //HDC-iris
3801*4882a593Smuzhiyun         int adc = 0;
3802*4882a593Smuzhiyun         int position = 0;
3803*4882a593Smuzhiyun         if (mLensSubdev) {
3804*4882a593Smuzhiyun             if (mLensSubdev->getHDCIrisParams(&adc) < 0) {
3805*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDC-Iris adc failed to device");
3806*4882a593Smuzhiyun                 return XCAM_RETURN_ERROR_IOCTL;
3807*4882a593Smuzhiyun             }
3808*4882a593Smuzhiyun             if (mLensSubdev->getZoomParams(&position) < 0) {
3809*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get zoom result failed to device");
3810*4882a593Smuzhiyun                 return XCAM_RETURN_ERROR_IOCTL;
3811*4882a593Smuzhiyun             }
3812*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||get HDC-Iris ADC: %d  get zoomPos: %d\n", adc, position);
3813*4882a593Smuzhiyun             irisPar->data()->HDCIris.adc = adc;
3814*4882a593Smuzhiyun             irisPar->data()->HDCIris.zoomPos = position;
3815*4882a593Smuzhiyun         }
3816*4882a593Smuzhiyun     }
3817*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3818*4882a593Smuzhiyun     return ret;
3819*4882a593Smuzhiyun }
3820*4882a593Smuzhiyun 
3821*4882a593Smuzhiyun XCamReturn
setFocusParams(SmartPtr<RkAiqFocusParamsProxy> & focus_params)3822*4882a593Smuzhiyun CamHwIsp20::setFocusParams(SmartPtr<RkAiqFocusParamsProxy>& focus_params)
3823*4882a593Smuzhiyun {
3824*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3825*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3826*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3827*4882a593Smuzhiyun     rk_aiq_focus_params_t* p_focus = &focus_params->data()->result;
3828*4882a593Smuzhiyun     bool focus_valid = p_focus->lens_pos_valid;
3829*4882a593Smuzhiyun     bool zoom_valid = p_focus->zoom_pos_valid;
3830*4882a593Smuzhiyun     bool focus_correction = p_focus->focus_correction;
3831*4882a593Smuzhiyun     bool zoom_correction = p_focus->zoom_correction;
3832*4882a593Smuzhiyun     bool zoomfocus_modifypos = p_focus->zoomfocus_modifypos;
3833*4882a593Smuzhiyun     bool end_zoom_chg = p_focus->end_zoom_chg;
3834*4882a593Smuzhiyun     bool vcm_config_valid = p_focus->vcm_config_valid;
3835*4882a593Smuzhiyun 
3836*4882a593Smuzhiyun     if (!mLensSubdev)
3837*4882a593Smuzhiyun         goto OUT;
3838*4882a593Smuzhiyun 
3839*4882a593Smuzhiyun     if (zoomfocus_modifypos)
3840*4882a593Smuzhiyun         mLensSubdev->ZoomFocusModifyPosition(focus_params);
3841*4882a593Smuzhiyun     if (focus_correction)
3842*4882a593Smuzhiyun         mLensSubdev->FocusCorrection();
3843*4882a593Smuzhiyun     if (zoom_correction)
3844*4882a593Smuzhiyun         mLensSubdev->ZoomCorrection();
3845*4882a593Smuzhiyun 
3846*4882a593Smuzhiyun     if (focus_valid && !zoom_valid) {
3847*4882a593Smuzhiyun         if (mLensSubdev->setFocusParams(focus_params) < 0) {
3848*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set focus result failed to device");
3849*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3850*4882a593Smuzhiyun         }
3851*4882a593Smuzhiyun     } else if ((focus_valid && zoom_valid) || end_zoom_chg) {
3852*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||setZoomFocusParams");
3853*4882a593Smuzhiyun         if (mLensSubdev->setZoomFocusParams(focus_params) < 0) {
3854*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set setZoomFocusParams failed to device");
3855*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3856*4882a593Smuzhiyun         }
3857*4882a593Smuzhiyun     }
3858*4882a593Smuzhiyun 
3859*4882a593Smuzhiyun     rk_aiq_lens_vcmcfg lens_cfg;
3860*4882a593Smuzhiyun     if (mLensSubdev && vcm_config_valid) {
3861*4882a593Smuzhiyun         mLensSubdev->getLensVcmCfg(lens_cfg);
3862*4882a593Smuzhiyun         lens_cfg.start_ma = p_focus->vcm_start_ma;
3863*4882a593Smuzhiyun         lens_cfg.rated_ma = p_focus->vcm_end_ma;
3864*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set vcm config: %d, %d", lens_cfg.start_ma, lens_cfg.rated_ma);
3865*4882a593Smuzhiyun         if (mLensSubdev->setLensVcmCfg(lens_cfg) < 0) {
3866*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set vcm config failed to device");
3867*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3868*4882a593Smuzhiyun         }
3869*4882a593Smuzhiyun     }
3870*4882a593Smuzhiyun 
3871*4882a593Smuzhiyun OUT:
3872*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3873*4882a593Smuzhiyun     return ret;
3874*4882a593Smuzhiyun }
3875*4882a593Smuzhiyun 
3876*4882a593Smuzhiyun XCamReturn
getZoomPosition(int & position)3877*4882a593Smuzhiyun CamHwIsp20::getZoomPosition(int& position)
3878*4882a593Smuzhiyun {
3879*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3880*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3881*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3882*4882a593Smuzhiyun 
3883*4882a593Smuzhiyun     if (mLensSubdev) {
3884*4882a593Smuzhiyun         if (mLensSubdev->getZoomParams(&position) < 0) {
3885*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get zoom result failed to device");
3886*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3887*4882a593Smuzhiyun         }
3888*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||get zoom result: %d", position);
3889*4882a593Smuzhiyun     }
3890*4882a593Smuzhiyun 
3891*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3892*4882a593Smuzhiyun     return ret;
3893*4882a593Smuzhiyun }
3894*4882a593Smuzhiyun 
3895*4882a593Smuzhiyun XCamReturn
setLensVcmCfg(rk_aiq_lens_vcmcfg & lens_cfg)3896*4882a593Smuzhiyun CamHwIsp20::setLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg)
3897*4882a593Smuzhiyun {
3898*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3899*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3900*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3901*4882a593Smuzhiyun 
3902*4882a593Smuzhiyun     if (mLensSubdev) {
3903*4882a593Smuzhiyun         if (mLensSubdev->setLensVcmCfg(lens_cfg) < 0) {
3904*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set vcm config failed");
3905*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3906*4882a593Smuzhiyun         }
3907*4882a593Smuzhiyun     }
3908*4882a593Smuzhiyun 
3909*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3910*4882a593Smuzhiyun     return ret;
3911*4882a593Smuzhiyun }
3912*4882a593Smuzhiyun 
3913*4882a593Smuzhiyun XCamReturn
FocusCorrection()3914*4882a593Smuzhiyun CamHwIsp20::FocusCorrection()
3915*4882a593Smuzhiyun {
3916*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3917*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3918*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3919*4882a593Smuzhiyun 
3920*4882a593Smuzhiyun     if (mLensSubdev) {
3921*4882a593Smuzhiyun         if (mLensSubdev->FocusCorrection() < 0) {
3922*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "focus correction failed");
3923*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3924*4882a593Smuzhiyun         }
3925*4882a593Smuzhiyun     }
3926*4882a593Smuzhiyun 
3927*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3928*4882a593Smuzhiyun     return ret;
3929*4882a593Smuzhiyun }
3930*4882a593Smuzhiyun 
3931*4882a593Smuzhiyun XCamReturn
ZoomCorrection()3932*4882a593Smuzhiyun CamHwIsp20::ZoomCorrection()
3933*4882a593Smuzhiyun {
3934*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3935*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3936*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3937*4882a593Smuzhiyun 
3938*4882a593Smuzhiyun     if (mLensSubdev) {
3939*4882a593Smuzhiyun         if (mLensSubdev->ZoomCorrection() < 0) {
3940*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "zoom correction failed");
3941*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3942*4882a593Smuzhiyun         }
3943*4882a593Smuzhiyun     }
3944*4882a593Smuzhiyun 
3945*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3946*4882a593Smuzhiyun     return ret;
3947*4882a593Smuzhiyun }
3948*4882a593Smuzhiyun 
3949*4882a593Smuzhiyun XCamReturn
getLensVcmCfg(rk_aiq_lens_vcmcfg & lens_cfg)3950*4882a593Smuzhiyun CamHwIsp20::getLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg)
3951*4882a593Smuzhiyun {
3952*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3953*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3954*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3955*4882a593Smuzhiyun 
3956*4882a593Smuzhiyun     if (mLensSubdev) {
3957*4882a593Smuzhiyun         if (mLensSubdev->getLensVcmCfg(lens_cfg) < 0) {
3958*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get vcm config failed");
3959*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3960*4882a593Smuzhiyun         }
3961*4882a593Smuzhiyun     }
3962*4882a593Smuzhiyun 
3963*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3964*4882a593Smuzhiyun     return ret;
3965*4882a593Smuzhiyun }
3966*4882a593Smuzhiyun 
3967*4882a593Smuzhiyun XCamReturn
setAngleZ(float angleZ)3968*4882a593Smuzhiyun CamHwIsp20::setAngleZ(float angleZ)
3969*4882a593Smuzhiyun {
3970*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3971*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3972*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
3973*4882a593Smuzhiyun 
3974*4882a593Smuzhiyun     if (mLensSubdev) {
3975*4882a593Smuzhiyun         if (mLensSubdev->setAngleZ(angleZ) < 0) {
3976*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setAngleZ failed");
3977*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
3978*4882a593Smuzhiyun         }
3979*4882a593Smuzhiyun     }
3980*4882a593Smuzhiyun 
3981*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
3982*4882a593Smuzhiyun     return ret;
3983*4882a593Smuzhiyun }
3984*4882a593Smuzhiyun 
3985*4882a593Smuzhiyun XCamReturn
setCpslParams(SmartPtr<RkAiqCpslParamsProxy> & cpsl_params)3986*4882a593Smuzhiyun CamHwIsp20::setCpslParams(SmartPtr<RkAiqCpslParamsProxy>& cpsl_params)
3987*4882a593Smuzhiyun {
3988*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
3989*4882a593Smuzhiyun 
3990*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
3991*4882a593Smuzhiyun 
3992*4882a593Smuzhiyun     RKAiqCpslInfoWrapper_t* cpsl_setting = cpsl_params->data().ptr();
3993*4882a593Smuzhiyun 
3994*4882a593Smuzhiyun     if (cpsl_setting->update_fl) {
3995*4882a593Smuzhiyun         rk_aiq_flash_setting_t* fl_setting = &cpsl_setting->fl;
3996*4882a593Smuzhiyun         if (mFlashLight.ptr()) {
3997*4882a593Smuzhiyun             ret = mFlashLight->set_params(*fl_setting);
3998*4882a593Smuzhiyun             if (ret < 0) {
3999*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set flashlight params err: %d\n", ret);
4000*4882a593Smuzhiyun             }
4001*4882a593Smuzhiyun         }
4002*4882a593Smuzhiyun     }
4003*4882a593Smuzhiyun 
4004*4882a593Smuzhiyun     if (cpsl_setting->update_ir) {
4005*4882a593Smuzhiyun         rk_aiq_ir_setting_t* ir_setting = &cpsl_setting->ir;
4006*4882a593Smuzhiyun         ret = setIrcutParams(ir_setting->irc_on);
4007*4882a593Smuzhiyun         if (ret < 0) {
4008*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set ir params err: %d\n", ret);
4009*4882a593Smuzhiyun         }
4010*4882a593Smuzhiyun 
4011*4882a593Smuzhiyun         rk_aiq_flash_setting_t* fl_ir_setting = &cpsl_setting->fl_ir;
4012*4882a593Smuzhiyun 
4013*4882a593Smuzhiyun         if (mFlashLightIr.ptr()) {
4014*4882a593Smuzhiyun             ret = mFlashLightIr->set_params(*fl_ir_setting);
4015*4882a593Smuzhiyun             if (ret < 0) {
4016*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set flashlight ir params err: %d\n", ret);
4017*4882a593Smuzhiyun             }
4018*4882a593Smuzhiyun         }
4019*4882a593Smuzhiyun     }
4020*4882a593Smuzhiyun 
4021*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
4022*4882a593Smuzhiyun     return ret;
4023*4882a593Smuzhiyun }
4024*4882a593Smuzhiyun 
4025*4882a593Smuzhiyun XCamReturn
setHdrProcessCount(rk_aiq_luma_params_t luma_params)4026*4882a593Smuzhiyun CamHwIsp20::setHdrProcessCount(rk_aiq_luma_params_t luma_params)
4027*4882a593Smuzhiyun {
4028*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4029*4882a593Smuzhiyun 
4030*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
4031*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4032*4882a593Smuzhiyun     mRawProcUnit->set_hdr_frame_readback_infos(luma_params.frame_id, luma_params.hdrProcessCnt);
4033*4882a593Smuzhiyun #endif
4034*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
4035*4882a593Smuzhiyun     return ret;
4036*4882a593Smuzhiyun }
4037*4882a593Smuzhiyun 
4038*4882a593Smuzhiyun XCamReturn
getEffectiveIspParams(rkisp_effect_params_v20 & ispParams,uint32_t frame_id)4039*4882a593Smuzhiyun CamHwIsp20::getEffectiveIspParams(rkisp_effect_params_v20& ispParams, uint32_t frame_id)
4040*4882a593Smuzhiyun {
4041*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
4042*4882a593Smuzhiyun     std::map<uint32_t, SmartPtr<RkAiqIspEffParamsProxy>>::iterator it;
4043*4882a593Smuzhiyun     uint32_t search_id = frame_id == uint32_t(-1) ? 0 : frame_id;
4044*4882a593Smuzhiyun     SmartLock locker (_isp_params_cfg_mutex);
4045*4882a593Smuzhiyun 
4046*4882a593Smuzhiyun     if (_effecting_ispparam_map.size() == 0) {
4047*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camId: %d, can't search id %d,  _effecting_exp_mapsize is %d\n",
4048*4882a593Smuzhiyun                         mCamPhyId, frame_id, _effecting_ispparam_map.size());
4049*4882a593Smuzhiyun         return  XCAM_RETURN_ERROR_PARAM;
4050*4882a593Smuzhiyun     }
4051*4882a593Smuzhiyun 
4052*4882a593Smuzhiyun     it = _effecting_ispparam_map.find(search_id);
4053*4882a593Smuzhiyun 
4054*4882a593Smuzhiyun     // havn't found
4055*4882a593Smuzhiyun     if (it == _effecting_ispparam_map.end()) {
4056*4882a593Smuzhiyun         std::map<uint32_t, SmartPtr<RkAiqIspEffParamsProxy>>::reverse_iterator rit;
4057*4882a593Smuzhiyun 
4058*4882a593Smuzhiyun         rit = _effecting_ispparam_map.rbegin();
4059*4882a593Smuzhiyun         do {
4060*4882a593Smuzhiyun             LOGV_CAMHW_SUBM(ISP20HW_SUBM, "camId: %d, traverse _effecting_ispparam_map to find id %d, current id is [%d]\n",
4061*4882a593Smuzhiyun                             mCamPhyId, search_id, rit->first);
4062*4882a593Smuzhiyun             if (search_id >= rit->first ) {
4063*4882a593Smuzhiyun                 LOGD_CAMHW_SUBM(ISP20HW_SUBM, "camId: %d, can't find id %d, get latest id %d in _effecting_ispparam_map\n",
4064*4882a593Smuzhiyun                                 mCamPhyId, search_id, rit->first);
4065*4882a593Smuzhiyun                 break;
4066*4882a593Smuzhiyun             }
4067*4882a593Smuzhiyun         } while (++rit != _effecting_ispparam_map.rend());
4068*4882a593Smuzhiyun 
4069*4882a593Smuzhiyun         if (rit == _effecting_ispparam_map.rend()) {
4070*4882a593Smuzhiyun             if (_effecting_ispparam_map.size() > 0) {
4071*4882a593Smuzhiyun                 ispParams = _effecting_ispparam_map.rbegin()->second->data()->result;
4072*4882a593Smuzhiyun                 return XCAM_RETURN_NO_ERROR;
4073*4882a593Smuzhiyun             }
4074*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM,
4075*4882a593Smuzhiyun                             "camId: %d, can't find the latest effecting ispparams for id %d, impossible case !",
4076*4882a593Smuzhiyun                             mCamPhyId, frame_id);
4077*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
4078*4882a593Smuzhiyun         }
4079*4882a593Smuzhiyun         ispParams = rit->second->data()->result;
4080*4882a593Smuzhiyun     } else {
4081*4882a593Smuzhiyun         ispParams = it->second->data()->result;
4082*4882a593Smuzhiyun     }
4083*4882a593Smuzhiyun 
4084*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
4085*4882a593Smuzhiyun 
4086*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
4087*4882a593Smuzhiyun }
4088*4882a593Smuzhiyun 
4089*4882a593Smuzhiyun #if 0
4090*4882a593Smuzhiyun void CamHwIsp20::dumpRawnrFixValue(struct isp2x_rawnr_cfg * pRawnrCfg )
4091*4882a593Smuzhiyun {
4092*4882a593Smuzhiyun     printf("%s:(%d)  enter \n", __FUNCTION__, __LINE__);
4093*4882a593Smuzhiyun     int i = 0;
4094*4882a593Smuzhiyun 
4095*4882a593Smuzhiyun     //(0x0004)
4096*4882a593Smuzhiyun     printf("(0x0004) gauss_en:%d log_bypass:%d \n",
4097*4882a593Smuzhiyun            pRawnrCfg->gauss_en,
4098*4882a593Smuzhiyun            pRawnrCfg->log_bypass);
4099*4882a593Smuzhiyun 
4100*4882a593Smuzhiyun     //(0x0008 - 0x0010)
4101*4882a593Smuzhiyun     printf("(0x0008 - 0x0010) filtpar0-2:%d %d %d \n",
4102*4882a593Smuzhiyun            pRawnrCfg->filtpar0,
4103*4882a593Smuzhiyun            pRawnrCfg->filtpar1,
4104*4882a593Smuzhiyun            pRawnrCfg->filtpar2);
4105*4882a593Smuzhiyun 
4106*4882a593Smuzhiyun     //(0x0014 - 0x001c)
4107*4882a593Smuzhiyun     printf("(0x0014 - 0x001c) dgain0-2:%d %d %d \n",
4108*4882a593Smuzhiyun            pRawnrCfg->dgain0,
4109*4882a593Smuzhiyun            pRawnrCfg->dgain1,
4110*4882a593Smuzhiyun            pRawnrCfg->dgain2);
4111*4882a593Smuzhiyun 
4112*4882a593Smuzhiyun     //(0x0020 - 0x002c)
4113*4882a593Smuzhiyun     for(int i = 0; i < ISP2X_RAWNR_LUMA_RATION_NUM; i++) {
4114*4882a593Smuzhiyun         printf("(0x0020 - 0x002c) luration[%d]:%d \n",
4115*4882a593Smuzhiyun                i, pRawnrCfg->luration[i]);
4116*4882a593Smuzhiyun     }
4117*4882a593Smuzhiyun 
4118*4882a593Smuzhiyun     //(0x0030 - 0x003c)
4119*4882a593Smuzhiyun     for(int i = 0; i < ISP2X_RAWNR_LUMA_RATION_NUM; i++) {
4120*4882a593Smuzhiyun         printf("(0x0030 - 0x003c) lulevel[%d]:%d \n",
4121*4882a593Smuzhiyun                i, pRawnrCfg->lulevel[i]);
4122*4882a593Smuzhiyun     }
4123*4882a593Smuzhiyun 
4124*4882a593Smuzhiyun     //(0x0040)
4125*4882a593Smuzhiyun     printf("(0x0040) gauss:%d \n",
4126*4882a593Smuzhiyun            pRawnrCfg->gauss);
4127*4882a593Smuzhiyun 
4128*4882a593Smuzhiyun     //(0x0044)
4129*4882a593Smuzhiyun     printf("(0x0044) sigma:%d \n",
4130*4882a593Smuzhiyun            pRawnrCfg->sigma);
4131*4882a593Smuzhiyun 
4132*4882a593Smuzhiyun     //(0x0048)
4133*4882a593Smuzhiyun     printf("(0x0048) pix_diff:%d \n",
4134*4882a593Smuzhiyun            pRawnrCfg->pix_diff);
4135*4882a593Smuzhiyun 
4136*4882a593Smuzhiyun     //(0x004c)
4137*4882a593Smuzhiyun     printf("(0x004c) thld_diff:%d \n",
4138*4882a593Smuzhiyun            pRawnrCfg->thld_diff);
4139*4882a593Smuzhiyun 
4140*4882a593Smuzhiyun     //(0x0050)
4141*4882a593Smuzhiyun     printf("(0x0050) gas_weig_scl1:%d  gas_weig_scl2:%d  thld_chanelw:%d \n",
4142*4882a593Smuzhiyun            pRawnrCfg->gas_weig_scl1,
4143*4882a593Smuzhiyun            pRawnrCfg->gas_weig_scl2,
4144*4882a593Smuzhiyun            pRawnrCfg->thld_chanelw);
4145*4882a593Smuzhiyun 
4146*4882a593Smuzhiyun     //(0x0054)
4147*4882a593Smuzhiyun     printf("(0x0054) lamda:%d \n",
4148*4882a593Smuzhiyun            pRawnrCfg->lamda);
4149*4882a593Smuzhiyun 
4150*4882a593Smuzhiyun     //(0x0058 - 0x005c)
4151*4882a593Smuzhiyun     printf("(0x0058 - 0x005c) fixw0-3:%d %d %d %d\n",
4152*4882a593Smuzhiyun            pRawnrCfg->fixw0,
4153*4882a593Smuzhiyun            pRawnrCfg->fixw1,
4154*4882a593Smuzhiyun            pRawnrCfg->fixw2,
4155*4882a593Smuzhiyun            pRawnrCfg->fixw3);
4156*4882a593Smuzhiyun 
4157*4882a593Smuzhiyun     //(0x0060 - 0x0068)
4158*4882a593Smuzhiyun     printf("(0x0060 - 0x0068) wlamda0-2:%d %d %d\n",
4159*4882a593Smuzhiyun            pRawnrCfg->wlamda0,
4160*4882a593Smuzhiyun            pRawnrCfg->wlamda1,
4161*4882a593Smuzhiyun            pRawnrCfg->wlamda2);
4162*4882a593Smuzhiyun 
4163*4882a593Smuzhiyun 
4164*4882a593Smuzhiyun     //(0x006c)
4165*4882a593Smuzhiyun     printf("(0x006c) rgain_filp-2:%d bgain_filp:%d\n",
4166*4882a593Smuzhiyun            pRawnrCfg->rgain_filp,
4167*4882a593Smuzhiyun            pRawnrCfg->bgain_filp);
4168*4882a593Smuzhiyun 
4169*4882a593Smuzhiyun 
4170*4882a593Smuzhiyun     printf("%s:(%d)  exit \n", __FUNCTION__, __LINE__);
4171*4882a593Smuzhiyun }
4172*4882a593Smuzhiyun 
4173*4882a593Smuzhiyun 
4174*4882a593Smuzhiyun 
4175*4882a593Smuzhiyun void CamHwIsp20::dumpTnrFixValue(struct rkispp_tnr_config  * pTnrCfg)
4176*4882a593Smuzhiyun {
4177*4882a593Smuzhiyun     int i = 0;
4178*4882a593Smuzhiyun     printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
4179*4882a593Smuzhiyun     //0x0080
4180*4882a593Smuzhiyun     printf("(0x0080) opty_en:%d optc_en:%d gain_en:%d\n",
4181*4882a593Smuzhiyun            pTnrCfg->opty_en,
4182*4882a593Smuzhiyun            pTnrCfg->optc_en,
4183*4882a593Smuzhiyun            pTnrCfg->gain_en);
4184*4882a593Smuzhiyun 
4185*4882a593Smuzhiyun     //0x0088
4186*4882a593Smuzhiyun     printf("(0x0088) pk0_y:%d pk1_y:%d pk0_c:%d pk1_c:%d \n",
4187*4882a593Smuzhiyun            pTnrCfg->pk0_y,
4188*4882a593Smuzhiyun            pTnrCfg->pk1_y,
4189*4882a593Smuzhiyun            pTnrCfg->pk0_c,
4190*4882a593Smuzhiyun            pTnrCfg->pk1_c);
4191*4882a593Smuzhiyun 
4192*4882a593Smuzhiyun     //0x008c
4193*4882a593Smuzhiyun     printf("(0x008c) glb_gain_cur:%d glb_gain_nxt:%d \n",
4194*4882a593Smuzhiyun            pTnrCfg->glb_gain_cur,
4195*4882a593Smuzhiyun            pTnrCfg->glb_gain_nxt);
4196*4882a593Smuzhiyun 
4197*4882a593Smuzhiyun     //0x0090
4198*4882a593Smuzhiyun     printf("(0x0090) glb_gain_cur_div:%d gain_glb_filt_sqrt:%d \n",
4199*4882a593Smuzhiyun            pTnrCfg->glb_gain_cur_div,
4200*4882a593Smuzhiyun            pTnrCfg->glb_gain_cur_sqrt);
4201*4882a593Smuzhiyun 
4202*4882a593Smuzhiyun     //0x0094 - 0x0098
4203*4882a593Smuzhiyun     for(i = 0; i < TNR_SIGMA_CURVE_SIZE - 1; i++) {
4204*4882a593Smuzhiyun         printf("(0x0094 - 0x0098) sigma_x[%d]:%d \n",
4205*4882a593Smuzhiyun                i, pTnrCfg->sigma_x[i]);
4206*4882a593Smuzhiyun     }
4207*4882a593Smuzhiyun 
4208*4882a593Smuzhiyun     //0x009c - 0x00bc
4209*4882a593Smuzhiyun     for(i = 0; i < TNR_SIGMA_CURVE_SIZE; i++) {
4210*4882a593Smuzhiyun         printf("(0x009c - 0x00bc) sigma_y[%d]:%d \n",
4211*4882a593Smuzhiyun                i, pTnrCfg->sigma_y[i]);
4212*4882a593Smuzhiyun     }
4213*4882a593Smuzhiyun 
4214*4882a593Smuzhiyun     //0x00c4 - 0x00cc
4215*4882a593Smuzhiyun     //dir_idx = 0;
4216*4882a593Smuzhiyun     for(i = 0; i < TNR_LUMA_CURVE_SIZE; i++) {
4217*4882a593Smuzhiyun         printf("(0x00c4 - 0x00cc) luma_curve[%d]:%d \n",
4218*4882a593Smuzhiyun                i, pTnrCfg->luma_curve[i]);
4219*4882a593Smuzhiyun     }
4220*4882a593Smuzhiyun 
4221*4882a593Smuzhiyun     //0x00d0
4222*4882a593Smuzhiyun     printf("(0x00d0) txt_th0_y:%d txt_th1_y:%d \n",
4223*4882a593Smuzhiyun            pTnrCfg->txt_th0_y,
4224*4882a593Smuzhiyun            pTnrCfg->txt_th1_y);
4225*4882a593Smuzhiyun 
4226*4882a593Smuzhiyun     //0x00d4
4227*4882a593Smuzhiyun     printf("(0x00d0) txt_th0_c:%d txt_th1_c:%d \n",
4228*4882a593Smuzhiyun            pTnrCfg->txt_th0_c,
4229*4882a593Smuzhiyun            pTnrCfg->txt_th1_c);
4230*4882a593Smuzhiyun 
4231*4882a593Smuzhiyun     //0x00d8
4232*4882a593Smuzhiyun     printf("(0x00d8) txt_thy_dlt:%d txt_thc_dlt:%d \n",
4233*4882a593Smuzhiyun            pTnrCfg->txt_thy_dlt,
4234*4882a593Smuzhiyun            pTnrCfg->txt_thc_dlt);
4235*4882a593Smuzhiyun 
4236*4882a593Smuzhiyun     //0x00dc - 0x00ec
4237*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
4238*4882a593Smuzhiyun         printf("(0x00dc - 0x00ec) gfcoef_y0[%d]:%d \n",
4239*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_y0[i]);
4240*4882a593Smuzhiyun     }
4241*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4242*4882a593Smuzhiyun         printf("(0x00dc - 0x00ec) gfcoef_y1[%d]:%d \n",
4243*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_y1[i]);
4244*4882a593Smuzhiyun     }
4245*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4246*4882a593Smuzhiyun         printf("(0x00dc - 0x00ec) gfcoef_y2[%d]:%d \n",
4247*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_y2[i]);
4248*4882a593Smuzhiyun     }
4249*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4250*4882a593Smuzhiyun         printf("(0x00dc - 0x00ec) gfcoef_y3[%d]:%d \n",
4251*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_y3[i]);
4252*4882a593Smuzhiyun     }
4253*4882a593Smuzhiyun 
4254*4882a593Smuzhiyun     //0x00f0 - 0x0100
4255*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
4256*4882a593Smuzhiyun         printf("(0x00f0 - 0x0100) gfcoef_yg0[%d]:%d \n",
4257*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yg0[i]);
4258*4882a593Smuzhiyun     }
4259*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4260*4882a593Smuzhiyun         printf("(0x00f0 - 0x0100) gfcoef_yg1[%d]:%d \n",
4261*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yg1[i]);
4262*4882a593Smuzhiyun     }
4263*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4264*4882a593Smuzhiyun         printf("(0x00f0 - 0x0100) gfcoef_yg2[%d]:%d \n",
4265*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yg2[i]);
4266*4882a593Smuzhiyun     }
4267*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4268*4882a593Smuzhiyun         printf("(0x00f0 - 0x0100) gfcoef_yg3[%d]:%d \n",
4269*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yg3[i]);
4270*4882a593Smuzhiyun     }
4271*4882a593Smuzhiyun 
4272*4882a593Smuzhiyun 
4273*4882a593Smuzhiyun     //0x0104 - 0x0110
4274*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
4275*4882a593Smuzhiyun         printf("(0x0104 - 0x0110) gfcoef_yl0[%d]:%d \n",
4276*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yl0[i]);
4277*4882a593Smuzhiyun     }
4278*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4279*4882a593Smuzhiyun         printf("(0x0104 - 0x0110) gfcoef_yl1[%d]:%d \n",
4280*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yl1[i]);
4281*4882a593Smuzhiyun     }
4282*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4283*4882a593Smuzhiyun         printf("(0x0104 - 0x0110) gfcoef_yl2[%d]:%d \n",
4284*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_yl2[i]);
4285*4882a593Smuzhiyun     }
4286*4882a593Smuzhiyun 
4287*4882a593Smuzhiyun     //0x0114 - 0x0120
4288*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
4289*4882a593Smuzhiyun         printf("(0x0114 - 0x0120) gfcoef_cg0[%d]:%d \n",
4290*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_cg0[i]);
4291*4882a593Smuzhiyun     }
4292*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4293*4882a593Smuzhiyun         printf("(0x0114 - 0x0120) gfcoef_cg1[%d]:%d \n",
4294*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_cg1[i]);
4295*4882a593Smuzhiyun     }
4296*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4297*4882a593Smuzhiyun         printf("(0x0114 - 0x0120) gfcoef_cg2[%d]:%d \n",
4298*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_cg2[i]);
4299*4882a593Smuzhiyun     }
4300*4882a593Smuzhiyun 
4301*4882a593Smuzhiyun 
4302*4882a593Smuzhiyun     //0x0124 - 0x012c
4303*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
4304*4882a593Smuzhiyun         printf("(0x0124 - 0x012c) gfcoef_cl0[%d]:%d \n",
4305*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_cl0[i]);
4306*4882a593Smuzhiyun     }
4307*4882a593Smuzhiyun     for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
4308*4882a593Smuzhiyun         printf("(0x0124 - 0x012c) gfcoef_cl1[%d]:%d \n",
4309*4882a593Smuzhiyun                i, pTnrCfg->gfcoef_cl1[i]);
4310*4882a593Smuzhiyun     }
4311*4882a593Smuzhiyun 
4312*4882a593Smuzhiyun 
4313*4882a593Smuzhiyun     //0x0130 - 0x0134
4314*4882a593Smuzhiyun     //dir_idx = 0;  i = lvl;
4315*4882a593Smuzhiyun     for(i = 0; i < TNR_SCALE_YG_SIZE; i++) {
4316*4882a593Smuzhiyun         printf("(0x0130 - 0x0134) scale_yg[%d]:%d \n",
4317*4882a593Smuzhiyun                i, pTnrCfg->scale_yg[i]);
4318*4882a593Smuzhiyun     }
4319*4882a593Smuzhiyun 
4320*4882a593Smuzhiyun     //0x0138 - 0x013c
4321*4882a593Smuzhiyun     //dir_idx = 1;  i = lvl;
4322*4882a593Smuzhiyun     for(i = 0; i < TNR_SCALE_YL_SIZE; i++) {
4323*4882a593Smuzhiyun         printf("(0x0138 - 0x013c) scale_yl[%d]:%d \n",
4324*4882a593Smuzhiyun                i, pTnrCfg->scale_yl[i]);
4325*4882a593Smuzhiyun     }
4326*4882a593Smuzhiyun 
4327*4882a593Smuzhiyun     //0x0140 - 0x0148
4328*4882a593Smuzhiyun     //dir_idx = 0;  i = lvl;
4329*4882a593Smuzhiyun     for(i = 0; i < TNR_SCALE_CG_SIZE; i++) {
4330*4882a593Smuzhiyun         printf("(0x0140 - 0x0148) scale_cg[%d]:%d \n",
4331*4882a593Smuzhiyun                i, pTnrCfg->scale_cg[i]);
4332*4882a593Smuzhiyun         printf("(0x0140 - 0x0148) scale_y2cg[%d]:%d \n",
4333*4882a593Smuzhiyun                i, pTnrCfg->scale_y2cg[i]);
4334*4882a593Smuzhiyun     }
4335*4882a593Smuzhiyun 
4336*4882a593Smuzhiyun     //0x014c - 0x0154
4337*4882a593Smuzhiyun     //dir_idx = 1;  i = lvl;
4338*4882a593Smuzhiyun     for(i = 0; i < TNR_SCALE_CL_SIZE; i++) {
4339*4882a593Smuzhiyun         printf("(0x014c - 0x0154) scale_cl[%d]:%d \n",
4340*4882a593Smuzhiyun                i, pTnrCfg->scale_cl[i]);
4341*4882a593Smuzhiyun     }
4342*4882a593Smuzhiyun     for(i = 0; i < TNR_SCALE_Y2CL_SIZE; i++) {
4343*4882a593Smuzhiyun         printf("(0x014c - 0x0154) scale_y2cl[%d]:%d \n",
4344*4882a593Smuzhiyun                i, pTnrCfg->scale_y2cl[i]);
4345*4882a593Smuzhiyun     }
4346*4882a593Smuzhiyun 
4347*4882a593Smuzhiyun     //0x0158
4348*4882a593Smuzhiyun     for(i = 0; i < TNR_WEIGHT_Y_SIZE; i++) {
4349*4882a593Smuzhiyun         printf("(0x0158) weight_y[%d]:%d \n",
4350*4882a593Smuzhiyun                i, pTnrCfg->weight_y[i]);
4351*4882a593Smuzhiyun     }
4352*4882a593Smuzhiyun 
4353*4882a593Smuzhiyun     printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
4354*4882a593Smuzhiyun }
4355*4882a593Smuzhiyun 
4356*4882a593Smuzhiyun 
4357*4882a593Smuzhiyun void CamHwIsp20::dumpUvnrFixValue(struct rkispp_nr_config  * pNrCfg)
4358*4882a593Smuzhiyun {
4359*4882a593Smuzhiyun     int i = 0;
4360*4882a593Smuzhiyun     printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
4361*4882a593Smuzhiyun     //0x0080
4362*4882a593Smuzhiyun     printf("(0x0088) uvnr_step1_en:%d uvnr_step2_en:%d nr_gain_en:%d uvnr_nobig_en:%d uvnr_big_en:%d\n",
4363*4882a593Smuzhiyun            pNrCfg->uvnr_step1_en,
4364*4882a593Smuzhiyun            pNrCfg->uvnr_step2_en,
4365*4882a593Smuzhiyun            pNrCfg->nr_gain_en,
4366*4882a593Smuzhiyun            pNrCfg->uvnr_nobig_en,
4367*4882a593Smuzhiyun            pNrCfg->uvnr_big_en);
4368*4882a593Smuzhiyun 
4369*4882a593Smuzhiyun     //0x0084
4370*4882a593Smuzhiyun     printf("(0x0084) uvnr_gain_1sigma:%d \n",
4371*4882a593Smuzhiyun            pNrCfg->uvnr_gain_1sigma);
4372*4882a593Smuzhiyun 
4373*4882a593Smuzhiyun     //0x0088
4374*4882a593Smuzhiyun     printf("(0x0088) uvnr_gain_offset:%d \n",
4375*4882a593Smuzhiyun            pNrCfg->uvnr_gain_offset);
4376*4882a593Smuzhiyun 
4377*4882a593Smuzhiyun     //0x008c
4378*4882a593Smuzhiyun     printf("(0x008c) uvnr_gain_uvgain:%d uvnr_step2_en:%d uvnr_gain_t2gen:%d uvnr_gain_iso:%d\n",
4379*4882a593Smuzhiyun            pNrCfg->uvnr_gain_uvgain[0],
4380*4882a593Smuzhiyun            pNrCfg->uvnr_gain_uvgain[1],
4381*4882a593Smuzhiyun            pNrCfg->uvnr_gain_t2gen,
4382*4882a593Smuzhiyun            pNrCfg->uvnr_gain_iso);
4383*4882a593Smuzhiyun 
4384*4882a593Smuzhiyun 
4385*4882a593Smuzhiyun     //0x0090
4386*4882a593Smuzhiyun     printf("(0x0090) uvnr_t1gen_m3alpha:%d \n",
4387*4882a593Smuzhiyun            pNrCfg->uvnr_t1gen_m3alpha);
4388*4882a593Smuzhiyun 
4389*4882a593Smuzhiyun     //0x0094
4390*4882a593Smuzhiyun     printf("(0x0094) uvnr_t1flt_mode:%d \n",
4391*4882a593Smuzhiyun            pNrCfg->uvnr_t1flt_mode);
4392*4882a593Smuzhiyun 
4393*4882a593Smuzhiyun     //0x0098
4394*4882a593Smuzhiyun     printf("(0x0098) uvnr_t1flt_msigma:%d \n",
4395*4882a593Smuzhiyun            pNrCfg->uvnr_t1flt_msigma);
4396*4882a593Smuzhiyun 
4397*4882a593Smuzhiyun     //0x009c
4398*4882a593Smuzhiyun     printf("(0x009c) uvnr_t1flt_wtp:%d \n",
4399*4882a593Smuzhiyun            pNrCfg->uvnr_t1flt_wtp);
4400*4882a593Smuzhiyun 
4401*4882a593Smuzhiyun     //0x00a0-0x00a4
4402*4882a593Smuzhiyun     for(i = 0; i < NR_UVNR_T1FLT_WTQ_SIZE; i++) {
4403*4882a593Smuzhiyun         printf("(0x00a0-0x00a4) uvnr_t1flt_wtq[%d]:%d \n",
4404*4882a593Smuzhiyun                i, pNrCfg->uvnr_t1flt_wtq[i]);
4405*4882a593Smuzhiyun     }
4406*4882a593Smuzhiyun 
4407*4882a593Smuzhiyun     //0x00a8
4408*4882a593Smuzhiyun     printf("(0x00a8) uvnr_t2gen_m3alpha:%d \n",
4409*4882a593Smuzhiyun            pNrCfg->uvnr_t2gen_m3alpha);
4410*4882a593Smuzhiyun 
4411*4882a593Smuzhiyun     //0x00ac
4412*4882a593Smuzhiyun     printf("(0x00ac) uvnr_t2gen_msigma:%d \n",
4413*4882a593Smuzhiyun            pNrCfg->uvnr_t2gen_msigma);
4414*4882a593Smuzhiyun 
4415*4882a593Smuzhiyun     //0x00b0
4416*4882a593Smuzhiyun     printf("(0x00b0) uvnr_t2gen_wtp:%d \n",
4417*4882a593Smuzhiyun            pNrCfg->uvnr_t2gen_wtp);
4418*4882a593Smuzhiyun 
4419*4882a593Smuzhiyun     //0x00b4
4420*4882a593Smuzhiyun     for(i = 0; i < NR_UVNR_T2GEN_WTQ_SIZE; i++) {
4421*4882a593Smuzhiyun         printf("(0x00b4) uvnr_t2gen_wtq[%d]:%d \n",
4422*4882a593Smuzhiyun                i, pNrCfg->uvnr_t2gen_wtq[i]);
4423*4882a593Smuzhiyun     }
4424*4882a593Smuzhiyun 
4425*4882a593Smuzhiyun     //0x00b8
4426*4882a593Smuzhiyun     printf("(0x00b8) uvnr_t2flt_msigma:%d \n",
4427*4882a593Smuzhiyun            pNrCfg->uvnr_t2flt_msigma);
4428*4882a593Smuzhiyun 
4429*4882a593Smuzhiyun     //0x00bc
4430*4882a593Smuzhiyun     printf("(0x00bc) uvnr_t2flt_wtp:%d \n",
4431*4882a593Smuzhiyun            pNrCfg->uvnr_t2flt_wtp);
4432*4882a593Smuzhiyun     for(i = 0; i < NR_UVNR_T2FLT_WT_SIZE; i++) {
4433*4882a593Smuzhiyun         printf("(0x00bc) uvnr_t2flt_wt[%d]:%d \n",
4434*4882a593Smuzhiyun                i, pNrCfg->uvnr_t2flt_wt[i]);
4435*4882a593Smuzhiyun     }
4436*4882a593Smuzhiyun 
4437*4882a593Smuzhiyun 
4438*4882a593Smuzhiyun     printf("%s:(%d) entor \n", __FUNCTION__, __LINE__);
4439*4882a593Smuzhiyun }
4440*4882a593Smuzhiyun 
4441*4882a593Smuzhiyun 
4442*4882a593Smuzhiyun void CamHwIsp20::dumpYnrFixValue(struct rkispp_nr_config  * pNrCfg)
4443*4882a593Smuzhiyun {
4444*4882a593Smuzhiyun     printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
4445*4882a593Smuzhiyun 
4446*4882a593Smuzhiyun     int i = 0;
4447*4882a593Smuzhiyun 
4448*4882a593Smuzhiyun     //0x0104 - 0x0108
4449*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_SGM_DX_SIZE; i++) {
4450*4882a593Smuzhiyun         printf("(0x0104 - 0x0108) ynr_sgm_dx[%d]:%d \n",
4451*4882a593Smuzhiyun                i, pNrCfg->ynr_sgm_dx[i]);
4452*4882a593Smuzhiyun     }
4453*4882a593Smuzhiyun 
4454*4882a593Smuzhiyun     //0x010c - 0x012c
4455*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_SGM_Y_SIZE; i++) {
4456*4882a593Smuzhiyun         printf("(0x010c - 0x012c) ynr_lsgm_y[%d]:%d \n",
4457*4882a593Smuzhiyun                i, pNrCfg->ynr_lsgm_y[i]);
4458*4882a593Smuzhiyun     }
4459*4882a593Smuzhiyun 
4460*4882a593Smuzhiyun     //0x0130
4461*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_CI_SIZE; i++) {
4462*4882a593Smuzhiyun         printf("(0x0130) ynr_lci[%d]:%d \n",
4463*4882a593Smuzhiyun                i, pNrCfg->ynr_lci[i]);
4464*4882a593Smuzhiyun     }
4465*4882a593Smuzhiyun 
4466*4882a593Smuzhiyun     //0x0134
4467*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_LGAIN_MIN_SIZE; i++) {
4468*4882a593Smuzhiyun         printf("(0x0134) ynr_lgain_min[%d]:%d \n",
4469*4882a593Smuzhiyun                i, pNrCfg->ynr_lgain_min[i]);
4470*4882a593Smuzhiyun     }
4471*4882a593Smuzhiyun 
4472*4882a593Smuzhiyun     //0x0138
4473*4882a593Smuzhiyun     printf("(0x0138) ynr_lgain_max:%d \n",
4474*4882a593Smuzhiyun            pNrCfg->ynr_lgain_max);
4475*4882a593Smuzhiyun 
4476*4882a593Smuzhiyun 
4477*4882a593Smuzhiyun     //0x013c
4478*4882a593Smuzhiyun     printf("(0x013c) ynr_lmerge_bound:%d ynr_lmerge_ratio:%d\n",
4479*4882a593Smuzhiyun            pNrCfg->ynr_lmerge_bound,
4480*4882a593Smuzhiyun            pNrCfg->ynr_lmerge_ratio);
4481*4882a593Smuzhiyun 
4482*4882a593Smuzhiyun     //0x0140
4483*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_LWEIT_FLT_SIZE; i++) {
4484*4882a593Smuzhiyun         printf("(0x0140) ynr_lweit_flt[%d]:%d \n",
4485*4882a593Smuzhiyun                i, pNrCfg->ynr_lweit_flt[i]);
4486*4882a593Smuzhiyun     }
4487*4882a593Smuzhiyun 
4488*4882a593Smuzhiyun     //0x0144 - 0x0164
4489*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_SGM_Y_SIZE; i++) {
4490*4882a593Smuzhiyun         printf("(0x0144 - 0x0164) ynr_hsgm_y[%d]:%d \n",
4491*4882a593Smuzhiyun                i, pNrCfg->ynr_hsgm_y[i]);
4492*4882a593Smuzhiyun     }
4493*4882a593Smuzhiyun 
4494*4882a593Smuzhiyun     //0x0168
4495*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_CI_SIZE; i++) {
4496*4882a593Smuzhiyun         printf("(0x0168) ynr_hlci[%d]:%d \n",
4497*4882a593Smuzhiyun                i, pNrCfg->ynr_hlci[i]);
4498*4882a593Smuzhiyun     }
4499*4882a593Smuzhiyun 
4500*4882a593Smuzhiyun     //0x016c
4501*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_CI_SIZE; i++) {
4502*4882a593Smuzhiyun         printf("(0x016c) ynr_lhci[%d]:%d \n",
4503*4882a593Smuzhiyun                i, pNrCfg->ynr_lhci[i]);
4504*4882a593Smuzhiyun     }
4505*4882a593Smuzhiyun 
4506*4882a593Smuzhiyun     //0x0170
4507*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_CI_SIZE; i++) {
4508*4882a593Smuzhiyun         printf("(0x0170) ynr_hhci[%d]:%d \n",
4509*4882a593Smuzhiyun                i, pNrCfg->ynr_hhci[i]);
4510*4882a593Smuzhiyun     }
4511*4882a593Smuzhiyun 
4512*4882a593Smuzhiyun     //0x0174
4513*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_HGAIN_SGM_SIZE; i++) {
4514*4882a593Smuzhiyun         printf("(0x0174) ynr_hgain_sgm[%d]:%d \n",
4515*4882a593Smuzhiyun                i, pNrCfg->ynr_hgain_sgm[i]);
4516*4882a593Smuzhiyun     }
4517*4882a593Smuzhiyun 
4518*4882a593Smuzhiyun     //0x0178 - 0x0188
4519*4882a593Smuzhiyun     for(i = 0; i < 5; i++) {
4520*4882a593Smuzhiyun         printf("(0x0178 - 0x0188) ynr_hweit_d[%d - %d]:%d %d %d %d \n",
4521*4882a593Smuzhiyun                i * 4 + 0, i * 4 + 3,
4522*4882a593Smuzhiyun                pNrCfg->ynr_hweit_d[i * 4 + 0],
4523*4882a593Smuzhiyun                pNrCfg->ynr_hweit_d[i * 4 + 1],
4524*4882a593Smuzhiyun                pNrCfg->ynr_hweit_d[i * 4 + 2],
4525*4882a593Smuzhiyun                pNrCfg->ynr_hweit_d[i * 4 + 3]);
4526*4882a593Smuzhiyun     }
4527*4882a593Smuzhiyun 
4528*4882a593Smuzhiyun 
4529*4882a593Smuzhiyun     //0x018c - 0x01a0
4530*4882a593Smuzhiyun     for(i = 0; i < 6; i++) {
4531*4882a593Smuzhiyun         printf("(0x018c - 0x01a0) ynr_hgrad_y[%d - %d]:%d %d %d %d \n",
4532*4882a593Smuzhiyun                i * 4 + 0, i * 4 + 3,
4533*4882a593Smuzhiyun                pNrCfg->ynr_hgrad_y[i * 4 + 0],
4534*4882a593Smuzhiyun                pNrCfg->ynr_hgrad_y[i * 4 + 1],
4535*4882a593Smuzhiyun                pNrCfg->ynr_hgrad_y[i * 4 + 2],
4536*4882a593Smuzhiyun                pNrCfg->ynr_hgrad_y[i * 4 + 3]);
4537*4882a593Smuzhiyun     }
4538*4882a593Smuzhiyun 
4539*4882a593Smuzhiyun     //0x01a4 -0x01a8
4540*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_HWEIT_SIZE; i++) {
4541*4882a593Smuzhiyun         printf("(0x01a4 -0x01a8) ynr_hweit[%d]:%d \n",
4542*4882a593Smuzhiyun                i, pNrCfg->ynr_hweit[i]);
4543*4882a593Smuzhiyun     }
4544*4882a593Smuzhiyun 
4545*4882a593Smuzhiyun     //0x01b0
4546*4882a593Smuzhiyun     printf("(0x01b0) ynr_hmax_adjust:%d \n",
4547*4882a593Smuzhiyun            pNrCfg->ynr_hmax_adjust);
4548*4882a593Smuzhiyun 
4549*4882a593Smuzhiyun     //0x01b4
4550*4882a593Smuzhiyun     printf("(0x01b4) ynr_hstrength:%d \n",
4551*4882a593Smuzhiyun            pNrCfg->ynr_hstrength);
4552*4882a593Smuzhiyun 
4553*4882a593Smuzhiyun     //0x01b8
4554*4882a593Smuzhiyun     printf("(0x01b8) ynr_lweit_cmp0-1:%d %d\n",
4555*4882a593Smuzhiyun            pNrCfg->ynr_lweit_cmp[0],
4556*4882a593Smuzhiyun            pNrCfg->ynr_lweit_cmp[1]);
4557*4882a593Smuzhiyun 
4558*4882a593Smuzhiyun     //0x01bc
4559*4882a593Smuzhiyun     printf("(0x01bc) ynr_lmaxgain_lv4:%d \n",
4560*4882a593Smuzhiyun            pNrCfg->ynr_lmaxgain_lv4);
4561*4882a593Smuzhiyun 
4562*4882a593Smuzhiyun     //0x01c0 - 0x01e0
4563*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_HSTV_Y_SIZE; i++) {
4564*4882a593Smuzhiyun         printf("(0x01c0 - 0x01e0 ) ynr_hstv_y[%d]:%d \n",
4565*4882a593Smuzhiyun                i, pNrCfg->ynr_hstv_y[i]);
4566*4882a593Smuzhiyun     }
4567*4882a593Smuzhiyun 
4568*4882a593Smuzhiyun     //0x01e4  - 0x01e8
4569*4882a593Smuzhiyun     for(i = 0; i < NR_YNR_ST_SCALE_SIZE; i++) {
4570*4882a593Smuzhiyun         printf("(0x01e4  - 0x01e8 ) ynr_st_scale[%d]:%d \n",
4571*4882a593Smuzhiyun                i, pNrCfg->ynr_st_scale[i]);
4572*4882a593Smuzhiyun     }
4573*4882a593Smuzhiyun 
4574*4882a593Smuzhiyun     printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
4575*4882a593Smuzhiyun 
4576*4882a593Smuzhiyun }
4577*4882a593Smuzhiyun 
4578*4882a593Smuzhiyun 
4579*4882a593Smuzhiyun void CamHwIsp20::dumpSharpFixValue(struct rkispp_sharp_config  * pSharpCfg)
4580*4882a593Smuzhiyun {
4581*4882a593Smuzhiyun     printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
4582*4882a593Smuzhiyun     int i = 0;
4583*4882a593Smuzhiyun 
4584*4882a593Smuzhiyun     //0x0080
4585*4882a593Smuzhiyun     printf("(0x0080) alpha_adp_en:%d yin_flt_en:%d edge_avg_en:%d\n",
4586*4882a593Smuzhiyun            pSharpCfg->alpha_adp_en,
4587*4882a593Smuzhiyun            pSharpCfg->yin_flt_en,
4588*4882a593Smuzhiyun            pSharpCfg->edge_avg_en);
4589*4882a593Smuzhiyun 
4590*4882a593Smuzhiyun 
4591*4882a593Smuzhiyun     //0x0084
4592*4882a593Smuzhiyun     printf("(0x0084) hbf_ratio:%d ehf_th:%d pbf_ratio:%d\n",
4593*4882a593Smuzhiyun            pSharpCfg->hbf_ratio,
4594*4882a593Smuzhiyun            pSharpCfg->ehf_th,
4595*4882a593Smuzhiyun            pSharpCfg->pbf_ratio);
4596*4882a593Smuzhiyun 
4597*4882a593Smuzhiyun     //0x0088
4598*4882a593Smuzhiyun     printf("(0x0088) edge_thed:%d dir_min:%d smoth_th4:%d\n",
4599*4882a593Smuzhiyun            pSharpCfg->edge_thed,
4600*4882a593Smuzhiyun            pSharpCfg->dir_min,
4601*4882a593Smuzhiyun            pSharpCfg->smoth_th4);
4602*4882a593Smuzhiyun 
4603*4882a593Smuzhiyun     //0x008c
4604*4882a593Smuzhiyun     printf("(0x008c) l_alpha:%d g_alpha:%d \n",
4605*4882a593Smuzhiyun            pSharpCfg->l_alpha,
4606*4882a593Smuzhiyun            pSharpCfg->g_alpha);
4607*4882a593Smuzhiyun 
4608*4882a593Smuzhiyun 
4609*4882a593Smuzhiyun     //0x0090
4610*4882a593Smuzhiyun     for(i = 0; i < 3; i++) {
4611*4882a593Smuzhiyun         printf("(0x0090) pbf_k[%d]:%d  \n",
4612*4882a593Smuzhiyun                i, pSharpCfg->pbf_k[i]);
4613*4882a593Smuzhiyun     }
4614*4882a593Smuzhiyun 
4615*4882a593Smuzhiyun 
4616*4882a593Smuzhiyun 
4617*4882a593Smuzhiyun     //0x0094 - 0x0098
4618*4882a593Smuzhiyun     for(i = 0; i < 6; i++) {
4619*4882a593Smuzhiyun         printf("(0x0094 - 0x0098) mrf_k[%d]:%d  \n",
4620*4882a593Smuzhiyun                i, pSharpCfg->mrf_k[i]);
4621*4882a593Smuzhiyun     }
4622*4882a593Smuzhiyun 
4623*4882a593Smuzhiyun 
4624*4882a593Smuzhiyun     //0x009c -0x00a4
4625*4882a593Smuzhiyun     for(i = 0; i < 12; i++) {
4626*4882a593Smuzhiyun         printf("(0x009c -0x00a4) mbf_k[%d]:%d  \n",
4627*4882a593Smuzhiyun                i, pSharpCfg->mbf_k[i]);
4628*4882a593Smuzhiyun     }
4629*4882a593Smuzhiyun 
4630*4882a593Smuzhiyun 
4631*4882a593Smuzhiyun     //0x00a8 -0x00ac
4632*4882a593Smuzhiyun     for(i = 0; i < 6; i++) {
4633*4882a593Smuzhiyun         printf("(0x00a8 -0x00ac) hrf_k[%d]:%d  \n",
4634*4882a593Smuzhiyun                i, pSharpCfg->hrf_k[i]);
4635*4882a593Smuzhiyun     }
4636*4882a593Smuzhiyun 
4637*4882a593Smuzhiyun 
4638*4882a593Smuzhiyun     //0x00b0
4639*4882a593Smuzhiyun     for(i = 0; i < 3; i++) {
4640*4882a593Smuzhiyun         printf("(0x00b0) hbf_k[%d]:%d  \n",
4641*4882a593Smuzhiyun                i, pSharpCfg->hbf_k[i]);
4642*4882a593Smuzhiyun     }
4643*4882a593Smuzhiyun 
4644*4882a593Smuzhiyun 
4645*4882a593Smuzhiyun     //0x00b4
4646*4882a593Smuzhiyun     for(i = 0; i < 3; i++) {
4647*4882a593Smuzhiyun         printf("(0x00b4) eg_coef[%d]:%d  \n",
4648*4882a593Smuzhiyun                i, pSharpCfg->eg_coef[i]);
4649*4882a593Smuzhiyun     }
4650*4882a593Smuzhiyun 
4651*4882a593Smuzhiyun     //0x00b8
4652*4882a593Smuzhiyun     for(i = 0; i < 3; i++) {
4653*4882a593Smuzhiyun         printf("(0x00b8) eg_smoth[%d]:%d  \n",
4654*4882a593Smuzhiyun                i, pSharpCfg->eg_smoth[i]);
4655*4882a593Smuzhiyun     }
4656*4882a593Smuzhiyun 
4657*4882a593Smuzhiyun 
4658*4882a593Smuzhiyun     //0x00bc - 0x00c0
4659*4882a593Smuzhiyun     for(i = 0; i < 6; i++) {
4660*4882a593Smuzhiyun         printf("(0x00bc - 0x00c0) eg_gaus[%d]:%d  \n",
4661*4882a593Smuzhiyun                i, pSharpCfg->eg_gaus[i]);
4662*4882a593Smuzhiyun     }
4663*4882a593Smuzhiyun 
4664*4882a593Smuzhiyun 
4665*4882a593Smuzhiyun     //0x00c4 - 0x00c8
4666*4882a593Smuzhiyun     for(i = 0; i < 6; i++) {
4667*4882a593Smuzhiyun         printf("(0x00c4 - 0x00c8) dog_k[%d]:%d  \n",
4668*4882a593Smuzhiyun                i, pSharpCfg->dog_k[i]);
4669*4882a593Smuzhiyun     }
4670*4882a593Smuzhiyun 
4671*4882a593Smuzhiyun 
4672*4882a593Smuzhiyun     //0x00cc - 0x00d0
4673*4882a593Smuzhiyun     for(i = 0; i < SHP_LUM_POINT_SIZE; i++) {
4674*4882a593Smuzhiyun         printf("(0x00cc - 0x00d0) lum_point[%d]:%d  \n",
4675*4882a593Smuzhiyun                i, pSharpCfg->lum_point[i]);
4676*4882a593Smuzhiyun     }
4677*4882a593Smuzhiyun 
4678*4882a593Smuzhiyun     //0x00d4
4679*4882a593Smuzhiyun     printf("(0x00d4) pbf_shf_bits:%d  mbf_shf_bits:%d hbf_shf_bits:%d\n",
4680*4882a593Smuzhiyun            pSharpCfg->pbf_shf_bits,
4681*4882a593Smuzhiyun            pSharpCfg->mbf_shf_bits,
4682*4882a593Smuzhiyun            pSharpCfg->hbf_shf_bits);
4683*4882a593Smuzhiyun 
4684*4882a593Smuzhiyun 
4685*4882a593Smuzhiyun     //0x00d8 - 0x00dc
4686*4882a593Smuzhiyun     for(i = 0; i < SHP_SIGMA_SIZE; i++) {
4687*4882a593Smuzhiyun         printf("(0x00d8 - 0x00dc) pbf_sigma[%d]:%d  \n",
4688*4882a593Smuzhiyun                i, pSharpCfg->pbf_sigma[i]);
4689*4882a593Smuzhiyun     }
4690*4882a593Smuzhiyun 
4691*4882a593Smuzhiyun     //0x00e0 - 0x00e4
4692*4882a593Smuzhiyun     for(i = 0; i < SHP_LUM_CLP_SIZE; i++) {
4693*4882a593Smuzhiyun         printf("(0x00e0 - 0x00e4) lum_clp_m[%d]:%d  \n",
4694*4882a593Smuzhiyun                i, pSharpCfg->lum_clp_m[i]);
4695*4882a593Smuzhiyun     }
4696*4882a593Smuzhiyun 
4697*4882a593Smuzhiyun     //0x00e8 - 0x00ec
4698*4882a593Smuzhiyun     for(i = 0; i < SHP_LUM_MIN_SIZE; i++) {
4699*4882a593Smuzhiyun         printf("(0x00e8 - 0x00ec) lum_min_m[%d]:%d  \n",
4700*4882a593Smuzhiyun                i, pSharpCfg->lum_min_m[i]);
4701*4882a593Smuzhiyun     }
4702*4882a593Smuzhiyun 
4703*4882a593Smuzhiyun     //0x00f0 - 0x00f4
4704*4882a593Smuzhiyun     for(i = 0; i < SHP_SIGMA_SIZE; i++) {
4705*4882a593Smuzhiyun         printf("(0x00f0 - 0x00f4) mbf_sigma[%d]:%d  \n",
4706*4882a593Smuzhiyun                i, pSharpCfg->mbf_sigma[i]);
4707*4882a593Smuzhiyun     }
4708*4882a593Smuzhiyun 
4709*4882a593Smuzhiyun     //0x00f8 - 0x00fc
4710*4882a593Smuzhiyun     for(i = 0; i < SHP_LUM_CLP_SIZE; i++) {
4711*4882a593Smuzhiyun         printf("(0x00f8 - 0x00fc) lum_clp_h[%d]:%d  \n",
4712*4882a593Smuzhiyun                i, pSharpCfg->lum_clp_h[i]);
4713*4882a593Smuzhiyun     }
4714*4882a593Smuzhiyun 
4715*4882a593Smuzhiyun     //0x0100 - 0x0104
4716*4882a593Smuzhiyun     for(i = 0; i < SHP_SIGMA_SIZE; i++) {
4717*4882a593Smuzhiyun         printf("(0x0100 - 0x0104) hbf_sigma[%d]:%d  \n",
4718*4882a593Smuzhiyun                i, pSharpCfg->hbf_sigma[i]);
4719*4882a593Smuzhiyun     }
4720*4882a593Smuzhiyun 
4721*4882a593Smuzhiyun     //0x0108 - 0x010c
4722*4882a593Smuzhiyun     for(i = 0; i < SHP_EDGE_LUM_THED_SIZE; i++) {
4723*4882a593Smuzhiyun         printf("(0x0108 - 0x010c) edge_lum_thed[%d]:%d  \n",
4724*4882a593Smuzhiyun                i, pSharpCfg->edge_lum_thed[i]);
4725*4882a593Smuzhiyun     }
4726*4882a593Smuzhiyun 
4727*4882a593Smuzhiyun     //0x0110 - 0x0114
4728*4882a593Smuzhiyun     for(i = 0; i < SHP_CLAMP_SIZE; i++) {
4729*4882a593Smuzhiyun         printf("(0x0110 - 0x0114) clamp_pos[%d]:%d  \n",
4730*4882a593Smuzhiyun                i, pSharpCfg->clamp_pos[i]);
4731*4882a593Smuzhiyun     }
4732*4882a593Smuzhiyun 
4733*4882a593Smuzhiyun     //0x0118 - 0x011c
4734*4882a593Smuzhiyun     for(i = 0; i < SHP_CLAMP_SIZE; i++) {
4735*4882a593Smuzhiyun         printf("(0x0118 - 0x011c) clamp_neg[%d]:%d  \n",
4736*4882a593Smuzhiyun                i, pSharpCfg->clamp_neg[i]);
4737*4882a593Smuzhiyun     }
4738*4882a593Smuzhiyun 
4739*4882a593Smuzhiyun     //0x0120 - 0x0124
4740*4882a593Smuzhiyun     for(i = 0; i < SHP_DETAIL_ALPHA_SIZE; i++) {
4741*4882a593Smuzhiyun         printf("(0x0120 - 0x0124) detail_alpha[%d]:%d  \n",
4742*4882a593Smuzhiyun                i, pSharpCfg->detail_alpha[i]);
4743*4882a593Smuzhiyun     }
4744*4882a593Smuzhiyun 
4745*4882a593Smuzhiyun     //0x0128
4746*4882a593Smuzhiyun     printf("(0x0128) rfl_ratio:%d  rfh_ratio:%d\n",
4747*4882a593Smuzhiyun            pSharpCfg->rfl_ratio, pSharpCfg->rfh_ratio);
4748*4882a593Smuzhiyun 
4749*4882a593Smuzhiyun     // mf/hf ratio
4750*4882a593Smuzhiyun 
4751*4882a593Smuzhiyun     //0x012C
4752*4882a593Smuzhiyun     printf("(0x012C) m_ratio:%d  h_ratio:%d\n",
4753*4882a593Smuzhiyun            pSharpCfg->m_ratio, pSharpCfg->h_ratio);
4754*4882a593Smuzhiyun 
4755*4882a593Smuzhiyun     printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
4756*4882a593Smuzhiyun }
4757*4882a593Smuzhiyun #endif
4758*4882a593Smuzhiyun 
4759*4882a593Smuzhiyun XCamReturn
setModuleCtl(rk_aiq_module_id_t moduleId,bool en)4760*4882a593Smuzhiyun CamHwIsp20::setModuleCtl(rk_aiq_module_id_t moduleId, bool en)
4761*4882a593Smuzhiyun {
4762*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4763*4882a593Smuzhiyun     if (_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) {
4764*4882a593Smuzhiyun         if ((moduleId == RK_MODULE_TNR) && (en == false)) {
4765*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "motion detect is running, operate not permit!");
4766*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_FAILED;
4767*4882a593Smuzhiyun         }
4768*4882a593Smuzhiyun     }
4769*4882a593Smuzhiyun     setModuleStatus(moduleId, en);
4770*4882a593Smuzhiyun     return ret;
4771*4882a593Smuzhiyun }
4772*4882a593Smuzhiyun 
4773*4882a593Smuzhiyun XCamReturn
getModuleCtl(rk_aiq_module_id_t moduleId,bool & en)4774*4882a593Smuzhiyun CamHwIsp20::getModuleCtl(rk_aiq_module_id_t moduleId, bool &en)
4775*4882a593Smuzhiyun {
4776*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4777*4882a593Smuzhiyun     getModuleStatus(moduleId, en);
4778*4882a593Smuzhiyun     return ret;
4779*4882a593Smuzhiyun }
4780*4882a593Smuzhiyun 
notify_capture_raw()4781*4882a593Smuzhiyun XCamReturn CamHwIsp20::notify_capture_raw()
4782*4882a593Smuzhiyun {
4783*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4784*4882a593Smuzhiyun     if (mRawProcUnit.ptr())
4785*4882a593Smuzhiyun         return mRawProcUnit->notify_capture_raw();
4786*4882a593Smuzhiyun     else
4787*4882a593Smuzhiyun #endif
4788*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
4789*4882a593Smuzhiyun }
4790*4882a593Smuzhiyun 
capture_raw_ctl(capture_raw_t type,int count,const char * capture_dir,char * output_dir)4791*4882a593Smuzhiyun XCamReturn CamHwIsp20::capture_raw_ctl(capture_raw_t type, int count, const char* capture_dir, char* output_dir)
4792*4882a593Smuzhiyun {
4793*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4794*4882a593Smuzhiyun     if (!mRawProcUnit.ptr())
4795*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
4796*4882a593Smuzhiyun 
4797*4882a593Smuzhiyun     if (type == CAPTURE_RAW_AND_YUV_SYNC)
4798*4882a593Smuzhiyun         return mRawProcUnit->capture_raw_ctl(type);
4799*4882a593Smuzhiyun     else if (type == CAPTURE_RAW_SYNC)
4800*4882a593Smuzhiyun         return mRawProcUnit->capture_raw_ctl(type, count, capture_dir, output_dir);
4801*4882a593Smuzhiyun #endif
4802*4882a593Smuzhiyun     return XCAM_RETURN_ERROR_FAILED;
4803*4882a593Smuzhiyun }
4804*4882a593Smuzhiyun 
4805*4882a593Smuzhiyun XCamReturn
setIrcutParams(bool on)4806*4882a593Smuzhiyun CamHwIsp20::setIrcutParams(bool on)
4807*4882a593Smuzhiyun {
4808*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4809*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
4810*4882a593Smuzhiyun 
4811*4882a593Smuzhiyun     struct v4l2_control control;
4812*4882a593Smuzhiyun 
4813*4882a593Smuzhiyun     xcam_mem_clear (control);
4814*4882a593Smuzhiyun     control.id = V4L2_CID_BAND_STOP_FILTER;
4815*4882a593Smuzhiyun     if(on)
4816*4882a593Smuzhiyun         control.value = IRCUT_STATE_CLOSED;
4817*4882a593Smuzhiyun     else
4818*4882a593Smuzhiyun         control.value = IRCUT_STATE_OPENED;
4819*4882a593Smuzhiyun     if (mIrcutDev.ptr()) {
4820*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set ircut value: %d", control.value);
4821*4882a593Smuzhiyun         if (mIrcutDev->io_control (VIDIOC_S_CTRL, &control) < 0) {
4822*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set ircut value failed to device!");
4823*4882a593Smuzhiyun             ret = XCAM_RETURN_ERROR_IOCTL;
4824*4882a593Smuzhiyun         }
4825*4882a593Smuzhiyun     }
4826*4882a593Smuzhiyun 
4827*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
4828*4882a593Smuzhiyun     return ret;
4829*4882a593Smuzhiyun }
4830*4882a593Smuzhiyun 
getIspModuleEnState()4831*4882a593Smuzhiyun uint64_t CamHwIsp20::getIspModuleEnState()
4832*4882a593Smuzhiyun {
4833*4882a593Smuzhiyun     return _isp_module_ens;
4834*4882a593Smuzhiyun }
4835*4882a593Smuzhiyun 
setSensorFlip(bool mirror,bool flip,int skip_frm_cnt)4836*4882a593Smuzhiyun XCamReturn CamHwIsp20::setSensorFlip(bool mirror, bool flip, int skip_frm_cnt)
4837*4882a593Smuzhiyun {
4838*4882a593Smuzhiyun     BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
4839*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4840*4882a593Smuzhiyun 
4841*4882a593Smuzhiyun     int32_t skip_frame_sequence = 0;
4842*4882a593Smuzhiyun     ret = mSensorSubdev->set_mirror_flip(mirror, flip, skip_frame_sequence);
4843*4882a593Smuzhiyun 
4844*4882a593Smuzhiyun     /* struct timespec tp; */
4845*4882a593Smuzhiyun     /* clock_gettime(CLOCK_MONOTONIC, &tp); */
4846*4882a593Smuzhiyun     /* int64_t skip_ts = (int64_t)(tp.tv_sec) * 1000 * 1000 * 1000 + (int64_t)(tp.tv_nsec); */
4847*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4848*4882a593Smuzhiyun     if (_state == CAM_HW_STATE_STARTED && skip_frame_sequence != -1) {
4849*4882a593Smuzhiyun         mRawCapUnit->skip_frames(skip_frm_cnt, skip_frame_sequence);
4850*4882a593Smuzhiyun     }
4851*4882a593Smuzhiyun #endif
4852*4882a593Smuzhiyun     return ret;
4853*4882a593Smuzhiyun }
4854*4882a593Smuzhiyun 
getSensorFlip(bool & mirror,bool & flip)4855*4882a593Smuzhiyun XCamReturn CamHwIsp20::getSensorFlip(bool& mirror, bool& flip)
4856*4882a593Smuzhiyun {
4857*4882a593Smuzhiyun     BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
4858*4882a593Smuzhiyun 
4859*4882a593Smuzhiyun     return mSensorSubdev->get_mirror_flip(mirror, flip);
4860*4882a593Smuzhiyun }
4861*4882a593Smuzhiyun 
setSensorCrop(rk_aiq_rect_t & rect)4862*4882a593Smuzhiyun XCamReturn CamHwIsp20::setSensorCrop(rk_aiq_rect_t& rect)
4863*4882a593Smuzhiyun {
4864*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4865*4882a593Smuzhiyun     struct v4l2_crop crop;
4866*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4867*4882a593Smuzhiyun     for (int i = 0; i < 3; i++) {
4868*4882a593Smuzhiyun         V4l2Device* mipi_tx = mRawCapUnit->get_tx_device(i).get_cast_ptr<V4l2Device>();
4869*4882a593Smuzhiyun         memset(&crop, 0, sizeof(crop));
4870*4882a593Smuzhiyun         crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
4871*4882a593Smuzhiyun         ret = mipi_tx->get_crop(crop);
4872*4882a593Smuzhiyun         crop.c.left = rect.left;
4873*4882a593Smuzhiyun         crop.c.top = rect.top;
4874*4882a593Smuzhiyun         crop.c.width = rect.width;
4875*4882a593Smuzhiyun         crop.c.height = rect.height;
4876*4882a593Smuzhiyun         ret = mipi_tx->set_crop(crop);
4877*4882a593Smuzhiyun     }
4878*4882a593Smuzhiyun     _crop_rect = rect;
4879*4882a593Smuzhiyun #endif
4880*4882a593Smuzhiyun     return ret;
4881*4882a593Smuzhiyun }
4882*4882a593Smuzhiyun 
getSensorCrop(rk_aiq_rect_t & rect)4883*4882a593Smuzhiyun XCamReturn CamHwIsp20::getSensorCrop(rk_aiq_rect_t& rect)
4884*4882a593Smuzhiyun {
4885*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
4886*4882a593Smuzhiyun     struct v4l2_crop crop;
4887*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4888*4882a593Smuzhiyun     V4l2Device* mipi_tx = mRawCapUnit->get_tx_device(0).get_cast_ptr<V4l2Device>();
4889*4882a593Smuzhiyun     memset(&crop, 0, sizeof(crop));
4890*4882a593Smuzhiyun     ret = mipi_tx->get_crop(crop);
4891*4882a593Smuzhiyun     rect.left = crop.c.left;
4892*4882a593Smuzhiyun     rect.top = crop.c.top;
4893*4882a593Smuzhiyun     rect.width = crop.c.width;
4894*4882a593Smuzhiyun     rect.height = crop.c.height;
4895*4882a593Smuzhiyun #endif
4896*4882a593Smuzhiyun     return ret;
4897*4882a593Smuzhiyun }
4898*4882a593Smuzhiyun 
setHdrGlobalTmoMode(uint32_t frame_id,bool mode)4899*4882a593Smuzhiyun void CamHwIsp20::setHdrGlobalTmoMode(uint32_t frame_id, bool mode)
4900*4882a593Smuzhiyun {
4901*4882a593Smuzhiyun     if (mNoReadBack)
4902*4882a593Smuzhiyun         return;
4903*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4904*4882a593Smuzhiyun     mRawProcUnit->set_hdr_global_tmo_mode(frame_id, mode);
4905*4882a593Smuzhiyun #endif
4906*4882a593Smuzhiyun }
4907*4882a593Smuzhiyun 
setMulCamConc(bool cc)4908*4882a593Smuzhiyun void CamHwIsp20::setMulCamConc(bool cc)
4909*4882a593Smuzhiyun {
4910*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
4911*4882a593Smuzhiyun     mRawProcUnit->setMulCamConc(cc);
4912*4882a593Smuzhiyun     if (cc)
4913*4882a593Smuzhiyun         mNoReadBack = false;
4914*4882a593Smuzhiyun #endif
4915*4882a593Smuzhiyun }
4916*4882a593Smuzhiyun 
getShareMemOps(isp_drv_share_mem_ops_t ** mem_ops)4917*4882a593Smuzhiyun void CamHwIsp20::getShareMemOps(isp_drv_share_mem_ops_t** mem_ops)
4918*4882a593Smuzhiyun {
4919*4882a593Smuzhiyun     this->alloc_mem = (alloc_mem_t)&CamHwIsp20::allocMemResource;
4920*4882a593Smuzhiyun     this->release_mem = (release_mem_t)&CamHwIsp20::releaseMemResource;
4921*4882a593Smuzhiyun     this->get_free_item = (get_free_item_t)&CamHwIsp20::getFreeItem;
4922*4882a593Smuzhiyun     *mem_ops = this;
4923*4882a593Smuzhiyun }
4924*4882a593Smuzhiyun 
allocMemResource(uint8_t id,void * ops_ctx,void * config,void ** mem_ctx)4925*4882a593Smuzhiyun void CamHwIsp20::allocMemResource(uint8_t id, void *ops_ctx, void *config, void **mem_ctx)
4926*4882a593Smuzhiyun {
4927*4882a593Smuzhiyun     int ret = -1;
4928*4882a593Smuzhiyun     struct rkispp_fecbuf_info fecbuf_info;
4929*4882a593Smuzhiyun     struct rkisp_meshbuf_info cacbuf_info;
4930*4882a593Smuzhiyun     struct rkispp_fecbuf_size fecbuf_size;
4931*4882a593Smuzhiyun     struct rkisp_meshbuf_size cacbuf_size;
4932*4882a593Smuzhiyun     struct rkisp_info2ddr dbgbuf_info;
4933*4882a593Smuzhiyun 
4934*4882a593Smuzhiyun     uint8_t offset = id * ISP3X_MESH_BUF_NUM;
4935*4882a593Smuzhiyun 
4936*4882a593Smuzhiyun     CamHwIsp20 *isp20 = static_cast<CamHwIsp20*>((isp_drv_share_mem_ops_t*)ops_ctx);
4937*4882a593Smuzhiyun     rk_aiq_share_mem_config_t* share_mem_cfg = (rk_aiq_share_mem_config_t *)config;
4938*4882a593Smuzhiyun 
4939*4882a593Smuzhiyun     SmartLock locker (isp20->_mem_mutex);
4940*4882a593Smuzhiyun     if (share_mem_cfg->mem_type == MEM_TYPE_LDCH) {
4941*4882a593Smuzhiyun #if defined(ISP_HW_V20) || defined(ISP_HW_V21)
4942*4882a593Smuzhiyun         struct rkisp_ldchbuf_size ldchbuf_size;
4943*4882a593Smuzhiyun         struct rkisp_ldchbuf_info ldchbuf_info;
4944*4882a593Smuzhiyun         unsigned long cmd = RKISP_CMD_SET_LDCHBUF_SIZE;
4945*4882a593Smuzhiyun 
4946*4882a593Smuzhiyun         ldchbuf_size.meas_width = share_mem_cfg->alloc_param.width;
4947*4882a593Smuzhiyun         ldchbuf_size.meas_height = share_mem_cfg->alloc_param.height;
4948*4882a593Smuzhiyun #else
4949*4882a593Smuzhiyun         struct rkisp_meshbuf_info ldchbuf_info;
4950*4882a593Smuzhiyun         struct rkisp_meshbuf_size ldchbuf_size;
4951*4882a593Smuzhiyun         unsigned long cmd = RKISP_CMD_SET_MESHBUF_SIZE;
4952*4882a593Smuzhiyun 
4953*4882a593Smuzhiyun         ldchbuf_size.unite_isp_id = id;
4954*4882a593Smuzhiyun         ldchbuf_size.module_id = ISP3X_MODULE_LDCH;
4955*4882a593Smuzhiyun         ldchbuf_size.meas_width = share_mem_cfg->alloc_param.width;
4956*4882a593Smuzhiyun         ldchbuf_size.meas_height = share_mem_cfg->alloc_param.height;
4957*4882a593Smuzhiyun         ldchbuf_size.buf_cnt = ISP2X_MESH_BUF_NUM;
4958*4882a593Smuzhiyun #endif
4959*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(cmd, &ldchbuf_size);
4960*4882a593Smuzhiyun         if (ret < 0) {
4961*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc ldch buf failed!");
4962*4882a593Smuzhiyun             *mem_ctx = nullptr;
4963*4882a593Smuzhiyun             return;
4964*4882a593Smuzhiyun         }
4965*4882a593Smuzhiyun         xcam_mem_clear(ldchbuf_info);
4966*4882a593Smuzhiyun #if defined(ISP_HW_V20) || defined(ISP_HW_V21)
4967*4882a593Smuzhiyun         cmd = RKISP_CMD_GET_LDCHBUF_INFO;
4968*4882a593Smuzhiyun #else
4969*4882a593Smuzhiyun         ldchbuf_info.unite_isp_id = id;
4970*4882a593Smuzhiyun         ldchbuf_info.module_id = ISP3X_MODULE_LDCH;
4971*4882a593Smuzhiyun         cmd = RKISP_CMD_GET_MESHBUF_INFO;
4972*4882a593Smuzhiyun #endif
4973*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(cmd, &ldchbuf_info);
4974*4882a593Smuzhiyun         if (ret < 0) {
4975*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to get ldch buf info!!");
4976*4882a593Smuzhiyun             *mem_ctx = nullptr;
4977*4882a593Smuzhiyun             return;
4978*4882a593Smuzhiyun         }
4979*4882a593Smuzhiyun 
4980*4882a593Smuzhiyun         rk_aiq_ldch_share_mem_info_t* mem_info_array =
4981*4882a593Smuzhiyun             (rk_aiq_ldch_share_mem_info_t*)(isp20->_ldch_drv_mem_ctx.mem_info);
4982*4882a593Smuzhiyun         for (int i = 0; i < ISP2X_MESH_BUF_NUM; i++) {
4983*4882a593Smuzhiyun             mem_info_array[offset + i].map_addr =
4984*4882a593Smuzhiyun                 mmap(NULL, ldchbuf_info.buf_size[i], PROT_READ | PROT_WRITE, MAP_SHARED, ldchbuf_info.buf_fd[i], 0);
4985*4882a593Smuzhiyun             if (MAP_FAILED == mem_info_array[offset + i].map_addr)
4986*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map ldch buf!!");
4987*4882a593Smuzhiyun 
4988*4882a593Smuzhiyun             mem_info_array[offset + i].fd = ldchbuf_info.buf_fd[i];
4989*4882a593Smuzhiyun             mem_info_array[offset + i].size = ldchbuf_info.buf_size[i];
4990*4882a593Smuzhiyun             struct isp2x_mesh_head *head = (struct isp2x_mesh_head*)mem_info_array[offset + i].map_addr;
4991*4882a593Smuzhiyun             mem_info_array[offset + i].addr = (void*)((char*)mem_info_array[offset + i].map_addr + head->data_oft);
4992*4882a593Smuzhiyun             mem_info_array[offset + i].state = (char*)&head->stat;
4993*4882a593Smuzhiyun         }
4994*4882a593Smuzhiyun 
4995*4882a593Smuzhiyun         *mem_ctx = (void*)(&isp20->_ldch_drv_mem_ctx);
4996*4882a593Smuzhiyun #if defined(ISP_HW_V20)
4997*4882a593Smuzhiyun     } else if (share_mem_cfg->mem_type == MEM_TYPE_FEC) {
4998*4882a593Smuzhiyun         fecbuf_size.meas_width = share_mem_cfg->alloc_param.width;
4999*4882a593Smuzhiyun         fecbuf_size.meas_height = share_mem_cfg->alloc_param.height;
5000*4882a593Smuzhiyun         fecbuf_size.meas_mode = share_mem_cfg->alloc_param.reserved[0];
5001*4882a593Smuzhiyun         ret = isp20->_ispp_sd->io_control(RKISPP_CMD_SET_FECBUF_SIZE, &fecbuf_size);
5002*4882a593Smuzhiyun         if (ret < 0) {
5003*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc fec buf failed!");
5004*4882a593Smuzhiyun             *mem_ctx = nullptr;
5005*4882a593Smuzhiyun             return;
5006*4882a593Smuzhiyun         }
5007*4882a593Smuzhiyun         xcam_mem_clear(fecbuf_info);
5008*4882a593Smuzhiyun         ret = isp20->_ispp_sd->io_control(RKISPP_CMD_GET_FECBUF_INFO, &fecbuf_info);
5009*4882a593Smuzhiyun         if (ret < 0) {
5010*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to get fec buf info!!");
5011*4882a593Smuzhiyun             *mem_ctx = nullptr;
5012*4882a593Smuzhiyun             return;
5013*4882a593Smuzhiyun         }
5014*4882a593Smuzhiyun         rk_aiq_fec_share_mem_info_t* mem_info_array =
5015*4882a593Smuzhiyun             (rk_aiq_fec_share_mem_info_t*)(isp20->_fec_drv_mem_ctx.mem_info);
5016*4882a593Smuzhiyun         for (int i = 0; i < FEC_MESH_BUF_NUM; i++) {
5017*4882a593Smuzhiyun             mem_info_array[i].map_addr =
5018*4882a593Smuzhiyun                 mmap(NULL, fecbuf_info.buf_size[i], PROT_READ | PROT_WRITE, MAP_SHARED, fecbuf_info.buf_fd[i], 0);
5019*4882a593Smuzhiyun             if (MAP_FAILED == mem_info_array[i].map_addr)
5020*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map fec buf!!");
5021*4882a593Smuzhiyun 
5022*4882a593Smuzhiyun             mem_info_array[i].fd = fecbuf_info.buf_fd[i];
5023*4882a593Smuzhiyun             mem_info_array[i].size = fecbuf_info.buf_size[i];
5024*4882a593Smuzhiyun             struct rkispp_fec_head *head = (struct rkispp_fec_head*)mem_info_array[i].map_addr;
5025*4882a593Smuzhiyun             mem_info_array[i].meshxf =
5026*4882a593Smuzhiyun                 (unsigned char*)mem_info_array[i].map_addr + head->meshxf_oft;
5027*4882a593Smuzhiyun             mem_info_array[i].meshyf =
5028*4882a593Smuzhiyun                 (unsigned char*)mem_info_array[i].map_addr + head->meshyf_oft;
5029*4882a593Smuzhiyun             mem_info_array[i].meshxi =
5030*4882a593Smuzhiyun                 (unsigned short*)((char*)mem_info_array[i].map_addr + head->meshxi_oft);
5031*4882a593Smuzhiyun             mem_info_array[i].meshyi =
5032*4882a593Smuzhiyun                 (unsigned short*)((char*)mem_info_array[i].map_addr + head->meshyi_oft);
5033*4882a593Smuzhiyun             mem_info_array[i].state = (char*)&head->stat;
5034*4882a593Smuzhiyun         }
5035*4882a593Smuzhiyun         *mem_ctx = (void*)(&isp20->_fec_drv_mem_ctx);
5036*4882a593Smuzhiyun #endif
5037*4882a593Smuzhiyun     } else if (share_mem_cfg->mem_type == MEM_TYPE_CAC) {
5038*4882a593Smuzhiyun         cacbuf_size.unite_isp_id = id;
5039*4882a593Smuzhiyun         cacbuf_size.module_id = ISP3X_MODULE_CAC;
5040*4882a593Smuzhiyun         cacbuf_size.meas_width = share_mem_cfg->alloc_param.width;
5041*4882a593Smuzhiyun         cacbuf_size.meas_height = share_mem_cfg->alloc_param.height;
5042*4882a593Smuzhiyun         cacbuf_size.buf_cnt = share_mem_cfg->alloc_param.reserved[0];
5043*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(RKISP_CMD_SET_MESHBUF_SIZE, &cacbuf_size);
5044*4882a593Smuzhiyun         if (ret < 0) {
5045*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc cac buf failed!");
5046*4882a593Smuzhiyun             *mem_ctx = nullptr;
5047*4882a593Smuzhiyun             return;
5048*4882a593Smuzhiyun         }
5049*4882a593Smuzhiyun         xcam_mem_clear(cacbuf_info);
5050*4882a593Smuzhiyun         cacbuf_info.unite_isp_id = id;
5051*4882a593Smuzhiyun         cacbuf_info.module_id = ISP3X_MODULE_CAC;
5052*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(RKISP_CMD_GET_MESHBUF_INFO, &cacbuf_info);
5053*4882a593Smuzhiyun         if (ret < 0) {
5054*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to get cac buf info!!");
5055*4882a593Smuzhiyun             *mem_ctx = nullptr;
5056*4882a593Smuzhiyun             return;
5057*4882a593Smuzhiyun         }
5058*4882a593Smuzhiyun         rk_aiq_cac_share_mem_info_t* mem_info_array =
5059*4882a593Smuzhiyun             (rk_aiq_cac_share_mem_info_t*)(isp20->_cac_drv_mem_ctx.mem_info);
5060*4882a593Smuzhiyun         for (int i = 0; i < cacbuf_size.buf_cnt; i++) {
5061*4882a593Smuzhiyun             mem_info_array[offset + i].map_addr =
5062*4882a593Smuzhiyun                 mmap(NULL, cacbuf_info.buf_size[i], PROT_READ | PROT_WRITE, MAP_SHARED, cacbuf_info.buf_fd[i], 0);
5063*4882a593Smuzhiyun             if (MAP_FAILED == mem_info_array[offset + i].map_addr) {
5064*4882a593Smuzhiyun                 mem_info_array[offset + i].map_addr = NULL;
5065*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map cac buf!!");
5066*4882a593Smuzhiyun                 *mem_ctx = nullptr;
5067*4882a593Smuzhiyun                 return;
5068*4882a593Smuzhiyun             }
5069*4882a593Smuzhiyun 
5070*4882a593Smuzhiyun             mem_info_array[offset + i].fd = cacbuf_info.buf_fd[i];
5071*4882a593Smuzhiyun             mem_info_array[offset + i].size = cacbuf_info.buf_size[i];
5072*4882a593Smuzhiyun             struct isp2x_mesh_head* head = (struct isp2x_mesh_head*)mem_info_array[offset + i].map_addr;
5073*4882a593Smuzhiyun             mem_info_array[offset + i].addr = (void*)((char*)mem_info_array[offset + i].map_addr + head->data_oft);
5074*4882a593Smuzhiyun             mem_info_array[offset + i].state = (char*)&head->stat;
5075*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "Got CAC LUT fd %d for ISP %d", mem_info_array[offset + i].fd, id);
5076*4882a593Smuzhiyun         }
5077*4882a593Smuzhiyun         *mem_ctx = (void*)(&isp20->_cac_drv_mem_ctx);
5078*4882a593Smuzhiyun     } else if (share_mem_cfg->mem_type == MEM_TYPE_DBG_INFO) {
5079*4882a593Smuzhiyun 
5080*4882a593Smuzhiyun         id = 0;
5081*4882a593Smuzhiyun         offset = id * RKISP_INFO2DDR_BUF_MAX;
5082*4882a593Smuzhiyun         dbgbuf_info.wsize = share_mem_cfg->alloc_param.width;
5083*4882a593Smuzhiyun         dbgbuf_info.vsize = share_mem_cfg->alloc_param.height;
5084*4882a593Smuzhiyun         dbgbuf_info.owner = (rkisp_info2ddr_owner)(share_mem_cfg->alloc_param.reserved[0]);
5085*4882a593Smuzhiyun         if (dbgbuf_info.owner == RKISP_INFO2DRR_OWNER_AWB) {
5086*4882a593Smuzhiyun             dbgbuf_info.u.awb.awb2ddr_sel = share_mem_cfg->alloc_param.reserved[1];
5087*4882a593Smuzhiyun         } else if (dbgbuf_info.owner == RKISP_INFO2DRR_OWNER_GAIN) {
5088*4882a593Smuzhiyun             dbgbuf_info.u.gain.gain2ddr_mode = share_mem_cfg->alloc_param.reserved[1];
5089*4882a593Smuzhiyun         } else {
5090*4882a593Smuzhiyun             *mem_ctx = nullptr;
5091*4882a593Smuzhiyun             return;
5092*4882a593Smuzhiyun         }
5093*4882a593Smuzhiyun         dbgbuf_info.buf_cnt = share_mem_cfg->alloc_param.reserved[2];
5094*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(RKISP_CMD_INFO2DDR, &dbgbuf_info);
5095*4882a593Smuzhiyun         if (ret < 0) {
5096*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc dbg buf failed!");
5097*4882a593Smuzhiyun             *mem_ctx = nullptr;
5098*4882a593Smuzhiyun             return;
5099*4882a593Smuzhiyun         }
5100*4882a593Smuzhiyun         rk_aiq_dbg_share_mem_info_t* mem_info_array =
5101*4882a593Smuzhiyun             (rk_aiq_dbg_share_mem_info_t*)(isp20->_dbg_drv_mem_ctx.mem_info);
5102*4882a593Smuzhiyun         for (int i = 0; i < dbgbuf_info.buf_cnt; i++) {
5103*4882a593Smuzhiyun             mem_info_array[offset + i].map_addr =
5104*4882a593Smuzhiyun                 mmap(NULL, dbgbuf_info.wsize * dbgbuf_info.vsize, PROT_READ | PROT_WRITE, MAP_SHARED, dbgbuf_info.buf_fd[i], 0);
5105*4882a593Smuzhiyun             if (MAP_FAILED == mem_info_array[offset + i].map_addr) {
5106*4882a593Smuzhiyun                 mem_info_array[offset + i].map_addr = NULL;
5107*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map dbg buf!!");
5108*4882a593Smuzhiyun                 *mem_ctx = nullptr;
5109*4882a593Smuzhiyun                 return;
5110*4882a593Smuzhiyun             }
5111*4882a593Smuzhiyun             mem_info_array[offset + i].size = dbgbuf_info.wsize * dbgbuf_info.vsize;
5112*4882a593Smuzhiyun             mem_info_array[offset + i].fd = dbgbuf_info.buf_fd[i];
5113*4882a593Smuzhiyun         }
5114*4882a593Smuzhiyun         *mem_ctx = (void*)(&isp20->_dbg_drv_mem_ctx);
5115*4882a593Smuzhiyun     }
5116*4882a593Smuzhiyun }
5117*4882a593Smuzhiyun 
releaseMemResource(uint8_t id,void * mem_ctx)5118*4882a593Smuzhiyun void CamHwIsp20::releaseMemResource(uint8_t id, void *mem_ctx)
5119*4882a593Smuzhiyun {
5120*4882a593Smuzhiyun     int ret = -1;
5121*4882a593Smuzhiyun     drv_share_mem_ctx_t* drv_mem_ctx = (drv_share_mem_ctx_t*)mem_ctx;
5122*4882a593Smuzhiyun     if (mem_ctx == nullptr) return;
5123*4882a593Smuzhiyun     CamHwIsp20 *isp20 = (CamHwIsp20*)(drv_mem_ctx->ops_ctx);
5124*4882a593Smuzhiyun     uint8_t offset = id * ISP3X_MESH_BUF_NUM;
5125*4882a593Smuzhiyun     uint64_t module_id = 0;
5126*4882a593Smuzhiyun 
5127*4882a593Smuzhiyun     SmartLock locker (isp20->_mem_mutex);
5128*4882a593Smuzhiyun     if (drv_mem_ctx->type == MEM_TYPE_LDCH) {
5129*4882a593Smuzhiyun         rk_aiq_ldch_share_mem_info_t* mem_info_array =
5130*4882a593Smuzhiyun             (rk_aiq_ldch_share_mem_info_t*)(drv_mem_ctx->mem_info);
5131*4882a593Smuzhiyun         for (int i = 0; i < ISP2X_MESH_BUF_NUM; i++) {
5132*4882a593Smuzhiyun             if (mem_info_array[offset + i].map_addr) {
5133*4882a593Smuzhiyun                 if (mem_info_array[offset + i].state &&
5134*4882a593Smuzhiyun                         (MESH_BUF_CHIPINUSE != mem_info_array[offset + i].state[0])) {
5135*4882a593Smuzhiyun                     mem_info_array[offset + i].state[0] = MESH_BUF_INIT;
5136*4882a593Smuzhiyun                 }
5137*4882a593Smuzhiyun                 ret = munmap(mem_info_array[offset + i].map_addr, mem_info_array[offset + i].size);
5138*4882a593Smuzhiyun                 if (ret < 0)
5139*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap ldch buf info!!");
5140*4882a593Smuzhiyun                 mem_info_array[offset + i].map_addr = NULL;
5141*4882a593Smuzhiyun             }
5142*4882a593Smuzhiyun             if (mem_info_array[offset + i].fd > 0) {
5143*4882a593Smuzhiyun                 ::close(mem_info_array[offset + i].fd);
5144*4882a593Smuzhiyun                 mem_info_array[offset + i].fd = -1;
5145*4882a593Smuzhiyun             }
5146*4882a593Smuzhiyun         }
5147*4882a593Smuzhiyun         module_id = ISP2X_MODULE_LDCH;
5148*4882a593Smuzhiyun     } else if (drv_mem_ctx->type == MEM_TYPE_FEC) {
5149*4882a593Smuzhiyun         rk_aiq_fec_share_mem_info_t* mem_info_array =
5150*4882a593Smuzhiyun             (rk_aiq_fec_share_mem_info_t*)(drv_mem_ctx->mem_info);
5151*4882a593Smuzhiyun         for (int i = 0; i < FEC_MESH_BUF_NUM; i++) {
5152*4882a593Smuzhiyun             if (mem_info_array[i].map_addr) {
5153*4882a593Smuzhiyun                 if (mem_info_array[i].state &&
5154*4882a593Smuzhiyun                         (MESH_BUF_CHIPINUSE != mem_info_array[i].state[0])) {
5155*4882a593Smuzhiyun                     mem_info_array[i].state[0] = MESH_BUF_INIT;
5156*4882a593Smuzhiyun                 }
5157*4882a593Smuzhiyun                 ret = munmap(mem_info_array[i].map_addr, mem_info_array[i].size);
5158*4882a593Smuzhiyun                 if (ret < 0)
5159*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap fec buf info!!");
5160*4882a593Smuzhiyun                 mem_info_array[i].map_addr = NULL;
5161*4882a593Smuzhiyun             }
5162*4882a593Smuzhiyun             if (mem_info_array[i].fd > 0) {
5163*4882a593Smuzhiyun                 ::close(mem_info_array[i].fd);
5164*4882a593Smuzhiyun                 mem_info_array[i].fd = -1;
5165*4882a593Smuzhiyun             }
5166*4882a593Smuzhiyun         }
5167*4882a593Smuzhiyun     } else if (drv_mem_ctx->type == MEM_TYPE_CAC) {
5168*4882a593Smuzhiyun         rk_aiq_cac_share_mem_info_t* mem_info_array =
5169*4882a593Smuzhiyun             (rk_aiq_cac_share_mem_info_t*)(drv_mem_ctx->mem_info);
5170*4882a593Smuzhiyun         for (int i = 0; i < ISP3X_MESH_BUF_NUM; i++) {
5171*4882a593Smuzhiyun             if (mem_info_array[offset + i].map_addr) {
5172*4882a593Smuzhiyun                 if (mem_info_array[offset + i].state &&
5173*4882a593Smuzhiyun                         (MESH_BUF_CHIPINUSE != mem_info_array[offset + i].state[0])) {
5174*4882a593Smuzhiyun                     mem_info_array[offset + i].state[0] = MESH_BUF_INIT;
5175*4882a593Smuzhiyun                 }
5176*4882a593Smuzhiyun                 ret = munmap(mem_info_array[offset + i].map_addr, mem_info_array[offset + i].size);
5177*4882a593Smuzhiyun                 if (ret < 0)
5178*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap cac buf info!!");
5179*4882a593Smuzhiyun                 mem_info_array[offset + i].map_addr = NULL;
5180*4882a593Smuzhiyun             }
5181*4882a593Smuzhiyun             if (mem_info_array[offset + i].fd > 0) {
5182*4882a593Smuzhiyun                 ::close(mem_info_array[offset + i].fd);
5183*4882a593Smuzhiyun                 mem_info_array[offset + i].fd = -1;
5184*4882a593Smuzhiyun             }
5185*4882a593Smuzhiyun         }
5186*4882a593Smuzhiyun         module_id = ISP3X_MODULE_CAC;
5187*4882a593Smuzhiyun     } else if (drv_mem_ctx->type == MEM_TYPE_DBG_INFO) {
5188*4882a593Smuzhiyun         rk_aiq_dbg_share_mem_info_t* mem_info_array =
5189*4882a593Smuzhiyun             (rk_aiq_dbg_share_mem_info_t*)(drv_mem_ctx->mem_info);
5190*4882a593Smuzhiyun         if (mem_info_array == nullptr)
5191*4882a593Smuzhiyun             return;
5192*4882a593Smuzhiyun 
5193*4882a593Smuzhiyun         struct rkisp_info2ddr info;
5194*4882a593Smuzhiyun         info.owner = RKISP_INFO2DRR_OWNER_NULL;
5195*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(RKISP_CMD_INFO2DDR, &info);
5196*4882a593Smuzhiyun         if (ret < 0) {
5197*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc dbg buf failed!");
5198*4882a593Smuzhiyun             return;
5199*4882a593Smuzhiyun         }
5200*4882a593Smuzhiyun         for (int i = 0; i < RKISP_INFO2DDR_BUF_MAX; i++) {
5201*4882a593Smuzhiyun             if (mem_info_array[offset + i].map_addr) {
5202*4882a593Smuzhiyun                 ret = munmap(mem_info_array[offset + i].map_addr, mem_info_array[offset + i].size);
5203*4882a593Smuzhiyun                 if (ret < 0)
5204*4882a593Smuzhiyun                     LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%dth,munmap dbg buf info!! error:%s, map_addr:%p, size:%d",
5205*4882a593Smuzhiyun                                     i, strerror(errno), mem_info_array[offset + i].map_addr,
5206*4882a593Smuzhiyun                                     mem_info_array[offset + i].size);
5207*4882a593Smuzhiyun                 mem_info_array[offset + i].map_addr = NULL;
5208*4882a593Smuzhiyun             }
5209*4882a593Smuzhiyun             if (mem_info_array[offset + i].fd > 0) ::close(mem_info_array[offset + i].fd);
5210*4882a593Smuzhiyun         }
5211*4882a593Smuzhiyun     }
5212*4882a593Smuzhiyun     if (module_id != 0) {
5213*4882a593Smuzhiyun         ret = isp20->mIspCoreDev->io_control(RKISP_CMD_MESHBUF_FREE, &module_id);
5214*4882a593Smuzhiyun         if (ret < 0) {
5215*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "free dbg buf failed!");
5216*4882a593Smuzhiyun         }
5217*4882a593Smuzhiyun     }
5218*4882a593Smuzhiyun }
5219*4882a593Smuzhiyun 
5220*4882a593Smuzhiyun void*
getFreeItem(uint8_t id,void * mem_ctx)5221*4882a593Smuzhiyun CamHwIsp20::getFreeItem(uint8_t id, void *mem_ctx)
5222*4882a593Smuzhiyun {
5223*4882a593Smuzhiyun     unsigned int idx;
5224*4882a593Smuzhiyun     int retry_cnt = 3;
5225*4882a593Smuzhiyun     drv_share_mem_ctx_t* drv_mem_ctx = (drv_share_mem_ctx_t*)mem_ctx;
5226*4882a593Smuzhiyun     if (!mem_ctx || !drv_mem_ctx->ops_ctx) return nullptr;
5227*4882a593Smuzhiyun     CamHwIsp20 *isp20 = (CamHwIsp20*)(drv_mem_ctx->ops_ctx);
5228*4882a593Smuzhiyun     uint8_t offset = id * ISP3X_MESH_BUF_NUM;
5229*4882a593Smuzhiyun 
5230*4882a593Smuzhiyun     SmartLock locker (isp20->_mem_mutex);
5231*4882a593Smuzhiyun     if (drv_mem_ctx->type == MEM_TYPE_LDCH) {
5232*4882a593Smuzhiyun         rk_aiq_ldch_share_mem_info_t* mem_info_array =
5233*4882a593Smuzhiyun             (rk_aiq_ldch_share_mem_info_t*)(drv_mem_ctx->mem_info);
5234*4882a593Smuzhiyun         do {
5235*4882a593Smuzhiyun             for (idx = 0; idx < ISP2X_MESH_BUF_NUM; idx++) {
5236*4882a593Smuzhiyun                 if (mem_info_array[offset + idx].map_addr) {
5237*4882a593Smuzhiyun                     if (mem_info_array[offset + idx].state &&
5238*4882a593Smuzhiyun                             (0 == mem_info_array[offset + idx].state[0])) {
5239*4882a593Smuzhiyun                         return (void*)&mem_info_array[offset + idx];
5240*4882a593Smuzhiyun                     }
5241*4882a593Smuzhiyun                 }
5242*4882a593Smuzhiyun             }
5243*4882a593Smuzhiyun         } while(retry_cnt--);
5244*4882a593Smuzhiyun     } else if (drv_mem_ctx->type == MEM_TYPE_FEC) {
5245*4882a593Smuzhiyun         rk_aiq_fec_share_mem_info_t* mem_info_array =
5246*4882a593Smuzhiyun             (rk_aiq_fec_share_mem_info_t*)(drv_mem_ctx->mem_info);
5247*4882a593Smuzhiyun         if (mem_info_array == nullptr) return nullptr;
5248*4882a593Smuzhiyun         do {
5249*4882a593Smuzhiyun             for (idx = 0; idx < FEC_MESH_BUF_NUM; idx++) {
5250*4882a593Smuzhiyun                 if (mem_info_array[idx].map_addr) {
5251*4882a593Smuzhiyun                     if (mem_info_array[idx].state && (0 == mem_info_array[idx].state[0])) {
5252*4882a593Smuzhiyun                         return (void*)&mem_info_array[idx];
5253*4882a593Smuzhiyun                     }
5254*4882a593Smuzhiyun                 }
5255*4882a593Smuzhiyun             }
5256*4882a593Smuzhiyun         } while(retry_cnt--);
5257*4882a593Smuzhiyun     } else if (drv_mem_ctx->type == MEM_TYPE_CAC) {
5258*4882a593Smuzhiyun         rk_aiq_cac_share_mem_info_t* mem_info_array =
5259*4882a593Smuzhiyun             (rk_aiq_cac_share_mem_info_t*)(drv_mem_ctx->mem_info);
5260*4882a593Smuzhiyun         if (mem_info_array == nullptr) return nullptr;
5261*4882a593Smuzhiyun         do {
5262*4882a593Smuzhiyun             for (idx = 0; idx < ISP3X_MESH_BUF_NUM; idx++) {
5263*4882a593Smuzhiyun                 if (mem_info_array[offset + idx].map_addr != nullptr) {
5264*4882a593Smuzhiyun                     if (-1 != mem_info_array[offset + idx].fd) {
5265*4882a593Smuzhiyun                         return (void*)&mem_info_array[offset + idx];
5266*4882a593Smuzhiyun                     }
5267*4882a593Smuzhiyun                 }
5268*4882a593Smuzhiyun             }
5269*4882a593Smuzhiyun         } while(retry_cnt--);
5270*4882a593Smuzhiyun     } else if (drv_mem_ctx->type == MEM_TYPE_DBG_INFO) {
5271*4882a593Smuzhiyun         rk_aiq_dbg_share_mem_info_t* mem_info_array =
5272*4882a593Smuzhiyun             (rk_aiq_dbg_share_mem_info_t*)(drv_mem_ctx->mem_info);
5273*4882a593Smuzhiyun         if (mem_info_array == nullptr) return nullptr;
5274*4882a593Smuzhiyun         do {
5275*4882a593Smuzhiyun             for (idx = 0; idx < RKISP_INFO2DDR_BUF_MAX; idx++) {
5276*4882a593Smuzhiyun                 if (mem_info_array[offset + idx].map_addr) {
5277*4882a593Smuzhiyun                     uint32_t state = *(uint32_t*)(mem_info_array[offset + idx].map_addr);
5278*4882a593Smuzhiyun                     if (state == RKISP_INFO2DDR_BUF_INIT)
5279*4882a593Smuzhiyun                         return (void*)&mem_info_array[offset + idx];
5280*4882a593Smuzhiyun                 }
5281*4882a593Smuzhiyun             }
5282*4882a593Smuzhiyun         } while(retry_cnt--);
5283*4882a593Smuzhiyun     }
5284*4882a593Smuzhiyun     return NULL;
5285*4882a593Smuzhiyun }
5286*4882a593Smuzhiyun 
5287*4882a593Smuzhiyun XCamReturn
poll_event_ready(uint32_t sequence,int type)5288*4882a593Smuzhiyun CamHwIsp20::poll_event_ready (uint32_t sequence, int type)
5289*4882a593Smuzhiyun {
5290*4882a593Smuzhiyun //    if (type == V4L2_EVENT_FRAME_SYNC && mIspEvtsListener) {
5291*4882a593Smuzhiyun //        SmartPtr<SensorHw> mSensor = mSensorDev.dynamic_cast_ptr<SensorHw>();
5292*4882a593Smuzhiyun //        SmartPtr<Isp20Evt> evtInfo = new Isp20Evt(this, mSensor);
5293*4882a593Smuzhiyun //        evtInfo->evt_code = type;
5294*4882a593Smuzhiyun //        evtInfo->sequence = sequence;
5295*4882a593Smuzhiyun //        evtInfo->expDelay = _exp_delay;
5296*4882a593Smuzhiyun 
5297*4882a593Smuzhiyun //        return  mIspEvtsListener->ispEvtsCb(evtInfo);
5298*4882a593Smuzhiyun //    }
5299*4882a593Smuzhiyun 
5300*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
5301*4882a593Smuzhiyun }
5302*4882a593Smuzhiyun 
5303*4882a593Smuzhiyun SmartPtr<ispHwEvt_t>
make_ispHwEvt(uint32_t sequence,int type,int64_t timestamp)5304*4882a593Smuzhiyun CamHwIsp20::make_ispHwEvt (uint32_t sequence, int type, int64_t timestamp)
5305*4882a593Smuzhiyun {
5306*4882a593Smuzhiyun     if (type == V4L2_EVENT_FRAME_SYNC) {
5307*4882a593Smuzhiyun         SmartPtr<SensorHw> mSensor = mSensorDev.dynamic_cast_ptr<SensorHw>();
5308*4882a593Smuzhiyun         SmartPtr<Isp20Evt> evtInfo = new Isp20Evt(this, mSensor);
5309*4882a593Smuzhiyun         evtInfo->evt_code = type;
5310*4882a593Smuzhiyun         evtInfo->sequence = sequence;
5311*4882a593Smuzhiyun         evtInfo->expDelay = _exp_delay;
5312*4882a593Smuzhiyun         evtInfo->setSofTimeStamp(timestamp);
5313*4882a593Smuzhiyun 
5314*4882a593Smuzhiyun         return  evtInfo;
5315*4882a593Smuzhiyun     }
5316*4882a593Smuzhiyun 
5317*4882a593Smuzhiyun     return nullptr;
5318*4882a593Smuzhiyun }
5319*4882a593Smuzhiyun 
5320*4882a593Smuzhiyun XCamReturn
poll_event_failed(int64_t timestamp,const char * msg)5321*4882a593Smuzhiyun CamHwIsp20::poll_event_failed (int64_t timestamp, const char *msg)
5322*4882a593Smuzhiyun {
5323*4882a593Smuzhiyun     return XCAM_RETURN_ERROR_FAILED;
5324*4882a593Smuzhiyun }
5325*4882a593Smuzhiyun XCamReturn
applyAnalyzerResult(SmartPtr<SharedItemBase> base,bool sync)5326*4882a593Smuzhiyun CamHwIsp20::applyAnalyzerResult(SmartPtr<SharedItemBase> base, bool sync)
5327*4882a593Smuzhiyun {
5328*4882a593Smuzhiyun     return dispatchResult(base);
5329*4882a593Smuzhiyun }
5330*4882a593Smuzhiyun 
5331*4882a593Smuzhiyun XCamReturn
applyAnalyzerResult(cam3aResultList & list)5332*4882a593Smuzhiyun CamHwIsp20::applyAnalyzerResult(cam3aResultList& list)
5333*4882a593Smuzhiyun {
5334*4882a593Smuzhiyun     return dispatchResult(list);
5335*4882a593Smuzhiyun }
5336*4882a593Smuzhiyun 
5337*4882a593Smuzhiyun XCamReturn
dispatchResult(cam3aResultList & list)5338*4882a593Smuzhiyun CamHwIsp20::dispatchResult(cam3aResultList& list)
5339*4882a593Smuzhiyun {
5340*4882a593Smuzhiyun     cam3aResultList isp_result_list;
5341*4882a593Smuzhiyun     for (auto& result : list) {
5342*4882a593Smuzhiyun         switch (result->getType()) {
5343*4882a593Smuzhiyun         case RESULT_TYPE_AEC_PARAM:
5344*4882a593Smuzhiyun         case RESULT_TYPE_HIST_PARAM:
5345*4882a593Smuzhiyun         case RESULT_TYPE_AWB_PARAM:
5346*4882a593Smuzhiyun         case RESULT_TYPE_AWBGAIN_PARAM:
5347*4882a593Smuzhiyun         case RESULT_TYPE_AF_PARAM:
5348*4882a593Smuzhiyun         case RESULT_TYPE_DPCC_PARAM:
5349*4882a593Smuzhiyun         case RESULT_TYPE_MERGE_PARAM:
5350*4882a593Smuzhiyun         case RESULT_TYPE_TMO_PARAM:
5351*4882a593Smuzhiyun         case RESULT_TYPE_CCM_PARAM:
5352*4882a593Smuzhiyun         case RESULT_TYPE_LSC_PARAM:
5353*4882a593Smuzhiyun         case RESULT_TYPE_BLC_PARAM:
5354*4882a593Smuzhiyun         case RESULT_TYPE_RAWNR_PARAM:
5355*4882a593Smuzhiyun         case RESULT_TYPE_GIC_PARAM:
5356*4882a593Smuzhiyun         case RESULT_TYPE_DEBAYER_PARAM:
5357*4882a593Smuzhiyun         case RESULT_TYPE_LDCH_PARAM:
5358*4882a593Smuzhiyun         case RESULT_TYPE_LUT3D_PARAM:
5359*4882a593Smuzhiyun         case RESULT_TYPE_DEHAZE_PARAM:
5360*4882a593Smuzhiyun         case RESULT_TYPE_AGAMMA_PARAM:
5361*4882a593Smuzhiyun         case RESULT_TYPE_ADEGAMMA_PARAM:
5362*4882a593Smuzhiyun         case RESULT_TYPE_WDR_PARAM:
5363*4882a593Smuzhiyun         case RESULT_TYPE_CSM_PARAM:
5364*4882a593Smuzhiyun         case RESULT_TYPE_CGC_PARAM:
5365*4882a593Smuzhiyun         case RESULT_TYPE_CONV422_PARAM:
5366*4882a593Smuzhiyun         case RESULT_TYPE_YUVCONV_PARAM:
5367*4882a593Smuzhiyun         case RESULT_TYPE_GAIN_PARAM:
5368*4882a593Smuzhiyun         case RESULT_TYPE_CP_PARAM:
5369*4882a593Smuzhiyun         case RESULT_TYPE_IE_PARAM:
5370*4882a593Smuzhiyun         case RESULT_TYPE_MOTION_PARAM:
5371*4882a593Smuzhiyun             isp_result_list.push_back(result);
5372*4882a593Smuzhiyun             break;
5373*4882a593Smuzhiyun         default:
5374*4882a593Smuzhiyun             dispatchResult(result);
5375*4882a593Smuzhiyun             break;
5376*4882a593Smuzhiyun         }
5377*4882a593Smuzhiyun     }
5378*4882a593Smuzhiyun 
5379*4882a593Smuzhiyun     if (isp_result_list.size() > 0) {
5380*4882a593Smuzhiyun         handleIsp3aReslut(isp_result_list);
5381*4882a593Smuzhiyun     }
5382*4882a593Smuzhiyun 
5383*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
5384*4882a593Smuzhiyun }
5385*4882a593Smuzhiyun 
5386*4882a593Smuzhiyun XCamReturn
handleIsp3aReslut(cam3aResultList & list)5387*4882a593Smuzhiyun CamHwIsp20::handleIsp3aReslut(cam3aResultList& list)
5388*4882a593Smuzhiyun {
5389*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
5390*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5391*4882a593Smuzhiyun     if (_is_exit) {
5392*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set 3a config bypass since ia engine has stop");
5393*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
5394*4882a593Smuzhiyun     }
5395*4882a593Smuzhiyun 
5396*4882a593Smuzhiyun     bool restart = false;
5397*4882a593Smuzhiyun     if (_state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_STOPPED ||
5398*4882a593Smuzhiyun             _state == CAM_HW_STATE_PAUSED) {
5399*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "hdr-debug: %s: first set ispparams\n",
5400*4882a593Smuzhiyun                         __func__);
5401*4882a593Smuzhiyun         if (!mIspParamsDev->is_activated()) {
5402*4882a593Smuzhiyun             ret = mIspParamsDev->start();
5403*4882a593Smuzhiyun             if (ret < 0) {
5404*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "prepare isp params dev err: %d\n", ret);
5405*4882a593Smuzhiyun             }
5406*4882a593Smuzhiyun 
5407*4882a593Smuzhiyun             ret = hdr_mipi_prepare_mode(_hdr_mode);
5408*4882a593Smuzhiyun             if (ret < 0) {
5409*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
5410*4882a593Smuzhiyun             }
5411*4882a593Smuzhiyun         }
5412*4882a593Smuzhiyun 
5413*4882a593Smuzhiyun         for (auto& result : list) {
5414*4882a593Smuzhiyun             result->setId(0);
5415*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
5416*4882a593Smuzhiyun             mParamsAssembler->addReadyCondition(result->getType());
5417*4882a593Smuzhiyun #endif
5418*4882a593Smuzhiyun         }
5419*4882a593Smuzhiyun         restart = true;
5420*4882a593Smuzhiyun     }
5421*4882a593Smuzhiyun 
5422*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
5423*4882a593Smuzhiyun     mParamsAssembler->queue(list);
5424*4882a593Smuzhiyun 
5425*4882a593Smuzhiyun     // set all ready params to drv
5426*4882a593Smuzhiyun     while (_state == CAM_HW_STATE_STARTED &&
5427*4882a593Smuzhiyun             mParamsAssembler->ready()) {
5428*4882a593Smuzhiyun         SmartLock locker(_stop_cond_mutex);
5429*4882a593Smuzhiyun         if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF) {
5430*4882a593Smuzhiyun             ret = setIspConfig();
5431*4882a593Smuzhiyun             if (ret != XCAM_RETURN_NO_ERROR)
5432*4882a593Smuzhiyun                 break;
5433*4882a593Smuzhiyun         } else {
5434*4882a593Smuzhiyun             break;
5435*4882a593Smuzhiyun         }
5436*4882a593Smuzhiyun     }
5437*4882a593Smuzhiyun #else
5438*4882a593Smuzhiyun     SmartLock locker(_stop_cond_mutex);
5439*4882a593Smuzhiyun     if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF || restart) {
5440*4882a593Smuzhiyun         ret = setIspConfig(&list);
5441*4882a593Smuzhiyun     }
5442*4882a593Smuzhiyun #endif
5443*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
5444*4882a593Smuzhiyun     return ret;
5445*4882a593Smuzhiyun }
5446*4882a593Smuzhiyun 
5447*4882a593Smuzhiyun XCamReturn
dispatchResult(SmartPtr<cam3aResult> result)5448*4882a593Smuzhiyun CamHwIsp20::dispatchResult(SmartPtr<cam3aResult> result)
5449*4882a593Smuzhiyun {
5450*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5451*4882a593Smuzhiyun     if (!result.ptr())
5452*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
5453*4882a593Smuzhiyun 
5454*4882a593Smuzhiyun     LOG1("%s enter, msg type(0x%x)", __FUNCTION__, result->getType());
5455*4882a593Smuzhiyun     switch (result->getType())
5456*4882a593Smuzhiyun     {
5457*4882a593Smuzhiyun     case RESULT_TYPE_EXPOSURE_PARAM:
5458*4882a593Smuzhiyun     {
5459*4882a593Smuzhiyun         SmartPtr<RkAiqExpParamsProxy> exp = result.dynamic_cast_ptr<RkAiqExpParamsProxy>();
5460*4882a593Smuzhiyun         ret = setExposureParams(exp);
5461*4882a593Smuzhiyun         if (ret)
5462*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setExposureParams error %d id %d", ret, result->getId());
5463*4882a593Smuzhiyun         break;
5464*4882a593Smuzhiyun     }
5465*4882a593Smuzhiyun     case RESULT_TYPE_AEC_PARAM:
5466*4882a593Smuzhiyun     case RESULT_TYPE_HIST_PARAM:
5467*4882a593Smuzhiyun     case RESULT_TYPE_AWB_PARAM:
5468*4882a593Smuzhiyun     case RESULT_TYPE_AWBGAIN_PARAM:
5469*4882a593Smuzhiyun     case RESULT_TYPE_AF_PARAM:
5470*4882a593Smuzhiyun     case RESULT_TYPE_DPCC_PARAM:
5471*4882a593Smuzhiyun     case RESULT_TYPE_MERGE_PARAM:
5472*4882a593Smuzhiyun     case RESULT_TYPE_TMO_PARAM:
5473*4882a593Smuzhiyun     case RESULT_TYPE_CCM_PARAM:
5474*4882a593Smuzhiyun     case RESULT_TYPE_LSC_PARAM:
5475*4882a593Smuzhiyun     case RESULT_TYPE_BLC_PARAM:
5476*4882a593Smuzhiyun     case RESULT_TYPE_RAWNR_PARAM:
5477*4882a593Smuzhiyun     case RESULT_TYPE_GIC_PARAM:
5478*4882a593Smuzhiyun     case RESULT_TYPE_DEBAYER_PARAM:
5479*4882a593Smuzhiyun     case RESULT_TYPE_LDCH_PARAM:
5480*4882a593Smuzhiyun     case RESULT_TYPE_LUT3D_PARAM:
5481*4882a593Smuzhiyun     case RESULT_TYPE_DEHAZE_PARAM:
5482*4882a593Smuzhiyun     case RESULT_TYPE_AGAMMA_PARAM:
5483*4882a593Smuzhiyun     case RESULT_TYPE_ADEGAMMA_PARAM:
5484*4882a593Smuzhiyun     case RESULT_TYPE_WDR_PARAM:
5485*4882a593Smuzhiyun     case RESULT_TYPE_CSM_PARAM:
5486*4882a593Smuzhiyun     case RESULT_TYPE_CGC_PARAM:
5487*4882a593Smuzhiyun     case RESULT_TYPE_CONV422_PARAM:
5488*4882a593Smuzhiyun     case RESULT_TYPE_YUVCONV_PARAM:
5489*4882a593Smuzhiyun     case RESULT_TYPE_GAIN_PARAM:
5490*4882a593Smuzhiyun     case RESULT_TYPE_CP_PARAM:
5491*4882a593Smuzhiyun     case RESULT_TYPE_IE_PARAM:
5492*4882a593Smuzhiyun     case RESULT_TYPE_MOTION_PARAM:
5493*4882a593Smuzhiyun     case RESULT_TYPE_CAC_PARAM:
5494*4882a593Smuzhiyun         handleIsp3aReslut(result);
5495*4882a593Smuzhiyun         break;
5496*4882a593Smuzhiyun     case RESULT_TYPE_TNR_PARAM:
5497*4882a593Smuzhiyun     case RESULT_TYPE_YNR_PARAM:
5498*4882a593Smuzhiyun     case RESULT_TYPE_UVNR_PARAM:
5499*4882a593Smuzhiyun     case RESULT_TYPE_SHARPEN_PARAM:
5500*4882a593Smuzhiyun     case RESULT_TYPE_EDGEFLT_PARAM:
5501*4882a593Smuzhiyun     case RESULT_TYPE_FEC_PARAM:
5502*4882a593Smuzhiyun     case RESULT_TYPE_ORB_PARAM:
5503*4882a593Smuzhiyun #if defined(ISP_HW_V20)
5504*4882a593Smuzhiyun         handlePpReslut(result);
5505*4882a593Smuzhiyun #endif
5506*4882a593Smuzhiyun         break;
5507*4882a593Smuzhiyun     case RESULT_TYPE_FOCUS_PARAM:
5508*4882a593Smuzhiyun     {
5509*4882a593Smuzhiyun         SmartPtr<RkAiqFocusParamsProxy> focus = result.dynamic_cast_ptr<RkAiqFocusParamsProxy>();
5510*4882a593Smuzhiyun         ret = setFocusParams(focus);
5511*4882a593Smuzhiyun         if (ret)
5512*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setFocusParams error %d", ret);
5513*4882a593Smuzhiyun         break;
5514*4882a593Smuzhiyun     }
5515*4882a593Smuzhiyun     case RESULT_TYPE_IRIS_PARAM:
5516*4882a593Smuzhiyun     {
5517*4882a593Smuzhiyun         SmartPtr<RkAiqIrisParamsProxy> iris = result.dynamic_cast_ptr<RkAiqIrisParamsProxy>();
5518*4882a593Smuzhiyun         ret = setIrisParams(iris, _cur_calib_infos.aec.IrisType);
5519*4882a593Smuzhiyun         if (ret)
5520*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setIrisParams error %d", ret);
5521*4882a593Smuzhiyun         ret = getIrisParams(iris, _cur_calib_infos.aec.IrisType);
5522*4882a593Smuzhiyun         if (ret)
5523*4882a593Smuzhiyun             LOGE_ANALYZER("getIrisParams error %d", ret);
5524*4882a593Smuzhiyun         break;
5525*4882a593Smuzhiyun     }
5526*4882a593Smuzhiyun     case RESULT_TYPE_CPSL_PARAM:
5527*4882a593Smuzhiyun     {
5528*4882a593Smuzhiyun         SmartPtr<RkAiqCpslParamsProxy> cpsl = result.dynamic_cast_ptr<RkAiqCpslParamsProxy>();
5529*4882a593Smuzhiyun         ret = setCpslParams(cpsl);
5530*4882a593Smuzhiyun         if (ret)
5531*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setCpslParams error %d", ret);
5532*4882a593Smuzhiyun         break;
5533*4882a593Smuzhiyun     }
5534*4882a593Smuzhiyun     case RESULT_TYPE_FLASH_PARAM:
5535*4882a593Smuzhiyun     {
5536*4882a593Smuzhiyun #ifdef FLASH_CTL_DEBUG
5537*4882a593Smuzhiyun         SmartPtr<rk_aiq_flash_setting_t> flash = result.dynamic_cast_ptr<rk_aiq_flash_setting_t>();
5538*4882a593Smuzhiyun         ret = setFlParams(flash);
5539*4882a593Smuzhiyun         if (ret)
5540*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setFlParams error %d", ret);
5541*4882a593Smuzhiyun #endif
5542*4882a593Smuzhiyun         break;
5543*4882a593Smuzhiyun     }
5544*4882a593Smuzhiyun     case RESULT_TYPE_AFD_PARAM:
5545*4882a593Smuzhiyun     {
5546*4882a593Smuzhiyun         SmartPtr<RkAiqIspAfdParamsProxy> afd = result.dynamic_cast_ptr<RkAiqIspAfdParamsProxy>();
5547*4882a593Smuzhiyun         if (mCifScaleStream.ptr()) {
5548*4882a593Smuzhiyun             bool enable = afd->data()->result.enable;
5549*4882a593Smuzhiyun             int  ratio  = afd->data()->result.ratio;
5550*4882a593Smuzhiyun             setCifSclStartFlag(ratio, enable);
5551*4882a593Smuzhiyun         }
5552*4882a593Smuzhiyun         break;
5553*4882a593Smuzhiyun     }
5554*4882a593Smuzhiyun     default:
5555*4882a593Smuzhiyun         LOGE("unknown param type(0x%x)!", result->getType());
5556*4882a593Smuzhiyun         break;
5557*4882a593Smuzhiyun     }
5558*4882a593Smuzhiyun     return ret;
5559*4882a593Smuzhiyun     LOGD("%s exit", __FUNCTION__);
5560*4882a593Smuzhiyun }
5561*4882a593Smuzhiyun 
notify_sof(SmartPtr<VideoBuffer> & buf)5562*4882a593Smuzhiyun XCamReturn CamHwIsp20::notify_sof(SmartPtr<VideoBuffer>& buf)
5563*4882a593Smuzhiyun {
5564*4882a593Smuzhiyun     SmartPtr<SofEventBuffer> evtbuf = buf.dynamic_cast_ptr<SofEventBuffer>();
5565*4882a593Smuzhiyun     SmartPtr<SofEventData> evtdata = evtbuf->get_data();
5566*4882a593Smuzhiyun     BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
5567*4882a593Smuzhiyun     LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
5568*4882a593Smuzhiyun     mSensorSubdev->handle_sof(evtdata->_timestamp, evtdata->_frameid);
5569*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
5570*4882a593Smuzhiyun     if (!mNoReadBack)
5571*4882a593Smuzhiyun         mRawProcUnit->notify_sof(evtdata->_timestamp, evtdata->_frameid);
5572*4882a593Smuzhiyun #endif
5573*4882a593Smuzhiyun     if (mLensSubdev)
5574*4882a593Smuzhiyun         mLensSubdev->handle_sof(evtdata->_timestamp, evtdata->_frameid);
5575*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
5576*4882a593Smuzhiyun }
5577*4882a593Smuzhiyun 
5578*4882a593Smuzhiyun XCamReturn
handleIsp3aReslut(SmartPtr<cam3aResult> & result)5579*4882a593Smuzhiyun CamHwIsp20::handleIsp3aReslut(SmartPtr<cam3aResult> &result)
5580*4882a593Smuzhiyun {
5581*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
5582*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5583*4882a593Smuzhiyun     if (_is_exit) {
5584*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set 3a config bypass since ia engine has stop");
5585*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
5586*4882a593Smuzhiyun     }
5587*4882a593Smuzhiyun 
5588*4882a593Smuzhiyun     if (_state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_STOPPED ||
5589*4882a593Smuzhiyun             _state == CAM_HW_STATE_PAUSED) {
5590*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "hdr-debug: %s: first set ispparams id[%d]\n",
5591*4882a593Smuzhiyun                         __func__, result->getId());
5592*4882a593Smuzhiyun         if (!mIspParamsDev->is_activated()) {
5593*4882a593Smuzhiyun             ret = mIspParamsDev->start();
5594*4882a593Smuzhiyun             if (ret < 0) {
5595*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "prepare isp params dev err: %d\n", ret);
5596*4882a593Smuzhiyun             }
5597*4882a593Smuzhiyun 
5598*4882a593Smuzhiyun             ret = hdr_mipi_prepare_mode(_hdr_mode);
5599*4882a593Smuzhiyun             if (ret < 0) {
5600*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
5601*4882a593Smuzhiyun             }
5602*4882a593Smuzhiyun         }
5603*4882a593Smuzhiyun 
5604*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
5605*4882a593Smuzhiyun         mParamsAssembler->addReadyCondition(result->getType());
5606*4882a593Smuzhiyun #endif
5607*4882a593Smuzhiyun     }
5608*4882a593Smuzhiyun 
5609*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
5610*4882a593Smuzhiyun     mParamsAssembler->queue(result);
5611*4882a593Smuzhiyun 
5612*4882a593Smuzhiyun     // set all ready params to drv
5613*4882a593Smuzhiyun     while (_state == CAM_HW_STATE_STARTED &&
5614*4882a593Smuzhiyun             mParamsAssembler->ready()) {
5615*4882a593Smuzhiyun         SmartLock locker(_stop_cond_mutex);
5616*4882a593Smuzhiyun         if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF) {
5617*4882a593Smuzhiyun             ret = setIspConfig();
5618*4882a593Smuzhiyun             if (ret != XCAM_RETURN_NO_ERROR)
5619*4882a593Smuzhiyun                 break;
5620*4882a593Smuzhiyun         } else {
5621*4882a593Smuzhiyun             break;
5622*4882a593Smuzhiyun         }
5623*4882a593Smuzhiyun     }
5624*4882a593Smuzhiyun #else
5625*4882a593Smuzhiyun     SmartLock locker(_stop_cond_mutex);
5626*4882a593Smuzhiyun     if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF) {
5627*4882a593Smuzhiyun         ret = setIspConfig();
5628*4882a593Smuzhiyun         if (ret != XCAM_RETURN_NO_ERROR) {
5629*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setIspConfig failed !");
5630*4882a593Smuzhiyun         }
5631*4882a593Smuzhiyun     }
5632*4882a593Smuzhiyun #endif
5633*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
5634*4882a593Smuzhiyun     return ret;
5635*4882a593Smuzhiyun }
5636*4882a593Smuzhiyun 
5637*4882a593Smuzhiyun void
analyzePpInitEns(SmartPtr<cam3aResult> & result)5638*4882a593Smuzhiyun CamHwIsp20::analyzePpInitEns(SmartPtr<cam3aResult> &result)
5639*4882a593Smuzhiyun {
5640*4882a593Smuzhiyun     if (result->getType() == RESULT_TYPE_TNR_PARAM) {
5641*4882a593Smuzhiyun         // TODO: tnr init_ens should be always on ?
5642*4882a593Smuzhiyun         RkAiqIspTnrParamsProxy* tnr = nullptr;
5643*4882a593Smuzhiyun         tnr = result.get_cast_ptr<RkAiqIspTnrParamsProxy>();
5644*4882a593Smuzhiyun         if (tnr) {
5645*4882a593Smuzhiyun             rk_aiq_isp_tnr_t& tnr_param = tnr->data()->result;
5646*4882a593Smuzhiyun             if(tnr_param.tnr_en) {
5647*4882a593Smuzhiyun                 if (tnr_param.mode > 0)
5648*4882a593Smuzhiyun                     mPpModuleInitEns |= ISPP_MODULE_TNR_3TO1;
5649*4882a593Smuzhiyun                 else
5650*4882a593Smuzhiyun                     mPpModuleInitEns |= ISPP_MODULE_TNR;
5651*4882a593Smuzhiyun 
5652*4882a593Smuzhiyun             } else {
5653*4882a593Smuzhiyun                 mPpModuleInitEns &= ~ISPP_MODULE_TNR_3TO1;
5654*4882a593Smuzhiyun             }
5655*4882a593Smuzhiyun         }
5656*4882a593Smuzhiyun     } else if (result->getType() == RESULT_TYPE_FEC_PARAM) {
5657*4882a593Smuzhiyun         RkAiqIspFecParamsProxy* fec = nullptr;
5658*4882a593Smuzhiyun         fec = result.get_cast_ptr<RkAiqIspFecParamsProxy>();
5659*4882a593Smuzhiyun         if (fec) {
5660*4882a593Smuzhiyun             rk_aiq_isp_fec_t& fec_param = fec->data()->result;
5661*4882a593Smuzhiyun             if(fec_param.sw_fec_en) {
5662*4882a593Smuzhiyun                 if (fec_param.usage == ISPP_MODULE_FEC_ST) {
5663*4882a593Smuzhiyun                     mPpModuleInitEns |= ISPP_MODULE_FEC_ST;
5664*4882a593Smuzhiyun                 } else if (fec_param.usage == ISPP_MODULE_FEC) {
5665*4882a593Smuzhiyun                     mPpModuleInitEns |= ISPP_MODULE_FEC;
5666*4882a593Smuzhiyun                 }
5667*4882a593Smuzhiyun             } else {
5668*4882a593Smuzhiyun                 mPpModuleInitEns &= ~ISPP_MODULE_FEC_ST;
5669*4882a593Smuzhiyun             }
5670*4882a593Smuzhiyun         }
5671*4882a593Smuzhiyun     } else if (result->getType() == RESULT_TYPE_EDGEFLT_PARAM ||
5672*4882a593Smuzhiyun                result->getType() == RESULT_TYPE_YNR_PARAM ||
5673*4882a593Smuzhiyun                result->getType() == RESULT_TYPE_UVNR_PARAM ||
5674*4882a593Smuzhiyun                result->getType() == RESULT_TYPE_SHARPEN_PARAM) {
5675*4882a593Smuzhiyun         // TODO: nr,sharp init_ens always on ?
5676*4882a593Smuzhiyun         mPpModuleInitEns |= ISPP_MODULE_SHP | ISPP_MODULE_NR;
5677*4882a593Smuzhiyun     } else if (result->getType() == RESULT_TYPE_ORB_PARAM) {
5678*4882a593Smuzhiyun         RkAiqIspOrbParamsProxy* orb = nullptr;
5679*4882a593Smuzhiyun         orb = result.get_cast_ptr<RkAiqIspOrbParamsProxy>();
5680*4882a593Smuzhiyun         if (orb) {
5681*4882a593Smuzhiyun             rk_aiq_isp_orb_t& orb_param = orb->data()->result;
5682*4882a593Smuzhiyun             if(orb_param.orb_en)
5683*4882a593Smuzhiyun                 mPpModuleInitEns |= ISPP_MODULE_ORB;
5684*4882a593Smuzhiyun             else
5685*4882a593Smuzhiyun                 mPpModuleInitEns &= ~ISPP_MODULE_ORB;
5686*4882a593Smuzhiyun         }
5687*4882a593Smuzhiyun     }
5688*4882a593Smuzhiyun }
5689*4882a593Smuzhiyun 
5690*4882a593Smuzhiyun #if defined(ISP_HW_V20)
5691*4882a593Smuzhiyun XCamReturn
handlePpReslut(SmartPtr<cam3aResult> & result)5692*4882a593Smuzhiyun CamHwIsp20::handlePpReslut(SmartPtr<cam3aResult> &result)
5693*4882a593Smuzhiyun {
5694*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
5695*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5696*4882a593Smuzhiyun     if (_is_exit) {
5697*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set pp config bypass since ia engine has stop");
5698*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
5699*4882a593Smuzhiyun     }
5700*4882a593Smuzhiyun 
5701*4882a593Smuzhiyun     if (_state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_STOPPED ||
5702*4882a593Smuzhiyun             _state == CAM_HW_STATE_PAUSED) {
5703*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "RKISPP_CMD_SET_INIT_MODULE");
5704*4882a593Smuzhiyun         analyzePpInitEns(result);
5705*4882a593Smuzhiyun         if (_ispp_sd->io_control(RKISPP_CMD_SET_INIT_MODULE, &mPpModuleInitEns))
5706*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISPP_CMD_SET_INIT_MODULE ioctl failed");
5707*4882a593Smuzhiyun     }
5708*4882a593Smuzhiyun     setPpConfig(result);
5709*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
5710*4882a593Smuzhiyun     return ret;
5711*4882a593Smuzhiyun }
5712*4882a593Smuzhiyun #endif
5713*4882a593Smuzhiyun 
getParamsForEffMap(uint32_t frameId)5714*4882a593Smuzhiyun bool CamHwIsp20::getParamsForEffMap(uint32_t frameId)
5715*4882a593Smuzhiyun {
5716*4882a593Smuzhiyun     if (_effecting_ispparam_map.count(frameId) <= 0) {
5717*4882a593Smuzhiyun         if (mEffectIspParamsPool->has_free_items()) {
5718*4882a593Smuzhiyun             _effecting_ispparam_map[frameId] = mEffectIspParamsPool->get_item();
5719*4882a593Smuzhiyun             return true;
5720*4882a593Smuzhiyun         } else {
5721*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no free eff ispparam");
5722*4882a593Smuzhiyun             return false;
5723*4882a593Smuzhiyun         }
5724*4882a593Smuzhiyun     }
5725*4882a593Smuzhiyun     return true;
5726*4882a593Smuzhiyun }
5727*4882a593Smuzhiyun 
5728*4882a593Smuzhiyun XCamReturn
setIspConfig(cam3aResultList * result_list)5729*4882a593Smuzhiyun CamHwIsp20::setIspConfig(cam3aResultList* result_list)
5730*4882a593Smuzhiyun {
5731*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5732*4882a593Smuzhiyun 
5733*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
5734*4882a593Smuzhiyun 
5735*4882a593Smuzhiyun     SmartPtr<V4l2Buffer> v4l2buf;
5736*4882a593Smuzhiyun     uint32_t frameId = -1;
5737*4882a593Smuzhiyun 
5738*4882a593Smuzhiyun     {
5739*4882a593Smuzhiyun         SmartLock locker(_isp_params_cfg_mutex);
5740*4882a593Smuzhiyun         while (_effecting_ispparam_map.size() > 4)
5741*4882a593Smuzhiyun             _effecting_ispparam_map.erase(_effecting_ispparam_map.begin());
5742*4882a593Smuzhiyun     }
5743*4882a593Smuzhiyun 
5744*4882a593Smuzhiyun     if (mIspParamsDev.ptr()) {
5745*4882a593Smuzhiyun         ret = mIspParamsDev->get_buffer(v4l2buf);
5746*4882a593Smuzhiyun         if (ret) {
5747*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Can not get isp params buffer, queued cnts:%d \n",
5748*4882a593Smuzhiyun                             mIspParamsDev->get_queued_bufcnt());
5749*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
5750*4882a593Smuzhiyun         }
5751*4882a593Smuzhiyun     } else
5752*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
5753*4882a593Smuzhiyun 
5754*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
5755*4882a593Smuzhiyun     cam3aResultList ready_results;
5756*4882a593Smuzhiyun     ret = mParamsAssembler->deQueOne(ready_results, frameId);
5757*4882a593Smuzhiyun     if (ret != XCAM_RETURN_NO_ERROR) {
5758*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque isp ready parameter failed\n");
5759*4882a593Smuzhiyun         mIspParamsDev->return_buffer_to_pool(v4l2buf);
5760*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
5761*4882a593Smuzhiyun     }
5762*4882a593Smuzhiyun #else
5763*4882a593Smuzhiyun     cam3aResultList& ready_results = *result_list;
5764*4882a593Smuzhiyun     frameId = (*ready_results.begin())->getId();
5765*4882a593Smuzhiyun #endif
5766*4882a593Smuzhiyun     LOGD_CAMHW("----------%s, cam%d start config id(%d)'s isp params", __FUNCTION__, mCamPhyId, frameId);
5767*4882a593Smuzhiyun 
5768*4882a593Smuzhiyun     // add isp dgain results to ready results
5769*4882a593Smuzhiyun     SensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<SensorHw>();
5770*4882a593Smuzhiyun     if (mSensorSubdev) {
5771*4882a593Smuzhiyun         SmartPtr<RkAiqSensorExpParamsProxy> expParam;
5772*4882a593Smuzhiyun 
5773*4882a593Smuzhiyun         if (mSensorSubdev->getEffectiveExpParams(expParam, frameId) < 0) {
5774*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "frame_id(%d), get exposure failed!!!\n", frameId);
5775*4882a593Smuzhiyun         } else {
5776*4882a593Smuzhiyun             expParam->setType(RESULT_TYPE_EXPOSURE_PARAM);
5777*4882a593Smuzhiyun             ready_results.push_back(expParam);
5778*4882a593Smuzhiyun         }
5779*4882a593Smuzhiyun     }
5780*4882a593Smuzhiyun 
5781*4882a593Smuzhiyun     if (v4l2buf.ptr()) {
5782*4882a593Smuzhiyun #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
5783*4882a593Smuzhiyun         struct isp32_isp_params_cfg* isp_params =
5784*4882a593Smuzhiyun                 (struct isp32_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
5785*4882a593Smuzhiyun #elif defined(ISP_HW_V30)
5786*4882a593Smuzhiyun         struct isp3x_isp_params_cfg* isp_params =
5787*4882a593Smuzhiyun                 (struct isp3x_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
5788*4882a593Smuzhiyun #elif defined(ISP_HW_V21)
5789*4882a593Smuzhiyun         struct isp21_isp_params_cfg* isp_params =
5790*4882a593Smuzhiyun                 (struct isp21_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
5791*4882a593Smuzhiyun #else
5792*4882a593Smuzhiyun         struct isp20_isp_params_cfg* isp_params =
5793*4882a593Smuzhiyun                 (struct isp20_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
5794*4882a593Smuzhiyun #endif
5795*4882a593Smuzhiyun         int buf_index      = v4l2buf->get_buf().index;
5796*4882a593Smuzhiyun         bool isMultiIsp    = mIsMultiIspMode;
5797*4882a593Smuzhiyun         bool extened_pixel = mMultiIspExtendedPixel;
5798*4882a593Smuzhiyun 
5799*4882a593Smuzhiyun         isp_params->module_en_update  = 0;
5800*4882a593Smuzhiyun         isp_params->module_cfg_update = 0;
5801*4882a593Smuzhiyun         isp_params->module_ens = 0;
5802*4882a593Smuzhiyun         if (merge_isp_results(ready_results, isp_params) != XCAM_RETURN_NO_ERROR)
5803*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "ISP parameter translation error\n");
5804*4882a593Smuzhiyun 
5805*4882a593Smuzhiyun         if (isp_params->module_cfg_update == 0 &&
5806*4882a593Smuzhiyun             isp_params->module_en_update) {
5807*4882a593Smuzhiyun             mIspParamsDev->return_buffer_to_pool(v4l2buf);
5808*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no new ISP parameters to drv");
5809*4882a593Smuzhiyun             return ret;
5810*4882a593Smuzhiyun         }
5811*4882a593Smuzhiyun 
5812*4882a593Smuzhiyun         isp_params->module_cfg_update |= ISP32_MODULE_FORCE;
5813*4882a593Smuzhiyun 
5814*4882a593Smuzhiyun         // TODO: isp driver has bug now, lsc cfg_up should be set along with
5815*4882a593Smuzhiyun         // en_up
5816*4882a593Smuzhiyun         if (isp_params->module_cfg_update & ISP2X_MODULE_LSC)
5817*4882a593Smuzhiyun             isp_params->module_en_update |= ISP2X_MODULE_LSC;
5818*4882a593Smuzhiyun 
5819*4882a593Smuzhiyun         isp_params->frame_id = frameId;
5820*4882a593Smuzhiyun 
5821*4882a593Smuzhiyun #if defined(ISP_HW_V30)
5822*4882a593Smuzhiyun         if(mIsMultiIspMode == false) {
5823*4882a593Smuzhiyun             dynamic_cast<Isp3xParams*>(this)->fixedAwbOveflowToIsp3xParams(isp_params, mIsMultiIspMode);
5824*4882a593Smuzhiyun         }
5825*4882a593Smuzhiyun #endif
5826*4882a593Smuzhiyun 
5827*4882a593Smuzhiyun #if defined(RKAIQ_HAVE_MULTIISP) && defined(ISP_HW_V30)
5828*4882a593Smuzhiyun         struct isp3x_isp_params_cfg ori_params;
5829*4882a593Smuzhiyun         if (mIsMultiIspMode) {
5830*4882a593Smuzhiyun             ori_params = *isp_params;
5831*4882a593Smuzhiyun             mParamsSplitter->SplitIspParams(&ori_params, isp_params);
5832*4882a593Smuzhiyun             dynamic_cast<Isp3xParams*>(this)->fixedAwbOveflowToIsp3xParams((void*)isp_params, mIsMultiIspMode);
5833*4882a593Smuzhiyun         }
5834*4882a593Smuzhiyun #endif
5835*4882a593Smuzhiyun 
5836*4882a593Smuzhiyun #if defined(RKAIQ_ENABLE_SPSTREAM)
5837*4882a593Smuzhiyun         if (mAfParams) {
5838*4882a593Smuzhiyun             RkAiqIspAfParamsProxy* afParams =
5839*4882a593Smuzhiyun                 mAfParams.get_cast_ptr<RkAiqIspAfParamsProxy>();
5840*4882a593Smuzhiyun             if (mSpStreamUnit.ptr()) {
5841*4882a593Smuzhiyun                 mSpStreamUnit->update_af_meas_params(&afParams->data()->result);
5842*4882a593Smuzhiyun             }
5843*4882a593Smuzhiyun         }
5844*4882a593Smuzhiyun #endif
5845*4882a593Smuzhiyun 
5846*4882a593Smuzhiyun #if defined(RKAIQ_HAVE_MULTIISP) && defined(ISP_HW_V30)
5847*4882a593Smuzhiyun         if (mIsMultiIspMode)
5848*4882a593Smuzhiyun             updateEffParams(isp_params, &ori_params);
5849*4882a593Smuzhiyun         else
5850*4882a593Smuzhiyun             updateEffParams(isp_params, NULL);
5851*4882a593Smuzhiyun #else
5852*4882a593Smuzhiyun             updateEffParams(isp_params, NULL);
5853*4882a593Smuzhiyun #endif
5854*4882a593Smuzhiyun         bool is_wait_params_done = false;
5855*4882a593Smuzhiyun         if (mTbInfo.prd_type != RK_AIQ_PRD_TYPE_NORMAL) {
5856*4882a593Smuzhiyun             // skip the params
5857*4882a593Smuzhiyun             if (processTb(isp_params)) {
5858*4882a593Smuzhiyun                 mIspParamsDev->return_buffer_to_pool(v4l2buf);
5859*4882a593Smuzhiyun                 return XCAM_RETURN_NO_ERROR;
5860*4882a593Smuzhiyun             }
5861*4882a593Smuzhiyun             if (mTbInfo.is_pre_aiq && frameId == 0)
5862*4882a593Smuzhiyun                 is_wait_params_done = true;
5863*4882a593Smuzhiyun         }
5864*4882a593Smuzhiyun 
5865*4882a593Smuzhiyun         if (mIspParamsDev->queue_buffer(v4l2buf) != 0) {
5866*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM,
5867*4882a593Smuzhiyun                             "RKISP1: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n", buf_index,
5868*4882a593Smuzhiyun                             errno, strerror(errno));
5869*4882a593Smuzhiyun             mIspParamsDev->return_buffer_to_pool(v4l2buf);
5870*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_IOCTL;
5871*4882a593Smuzhiyun         }
5872*4882a593Smuzhiyun 
5873*4882a593Smuzhiyun #ifdef DISABLE_PARAMS_POLL_THREAD
5874*4882a593Smuzhiyun         int timeout = is_wait_params_done ? 100 : 1;
5875*4882a593Smuzhiyun         int buf_counts = mIspParamsDev->get_buffer_count ();
5876*4882a593Smuzhiyun         while (mIspParamsDev->get_queued_bufcnt() > 2 || is_wait_params_done) {
5877*4882a593Smuzhiyun             if (mIspParamsDev->poll_event (timeout, -1) <= 0) {
5878*4882a593Smuzhiyun                 LOGW_CAMHW_SUBM(ISP20HW_SUBM, "poll params error, queue cnts: %d !",
5879*4882a593Smuzhiyun                                 mIspParamsDev->get_queued_bufcnt());
5880*4882a593Smuzhiyun                 if (mIspParamsDev->get_queued_bufcnt() == buf_counts)
5881*4882a593Smuzhiyun                    timeout = 100 ;
5882*4882a593Smuzhiyun                 else
5883*4882a593Smuzhiyun                     break;
5884*4882a593Smuzhiyun             }
5885*4882a593Smuzhiyun             SmartPtr<V4l2Buffer> buf;
5886*4882a593Smuzhiyun             ret = mIspParamsDev->dequeue_buffer (buf);
5887*4882a593Smuzhiyun             if (ret != XCAM_RETURN_NO_ERROR) {
5888*4882a593Smuzhiyun                 XCAM_LOG_WARNING ("dequeue buffer failed");
5889*4882a593Smuzhiyun                 //return ret;
5890*4882a593Smuzhiyun             } else {
5891*4882a593Smuzhiyun                 if (is_wait_params_done) {
5892*4882a593Smuzhiyun                     is_wait_params_done = false;
5893*4882a593Smuzhiyun                     SmartPtr<VideoBuffer> video_buf = new V4l2BufferProxy (buf, mIspParamsDev);
5894*4882a593Smuzhiyun                     video_buf->_buf_type = ISP_POLL_PARAMS;
5895*4882a593Smuzhiyun 
5896*4882a593Smuzhiyun                     LOGE("<TB> poll param id:%d, call err_cb", frameId);
5897*4882a593Smuzhiyun                     CamHwBase::poll_buffer_ready(video_buf);
5898*4882a593Smuzhiyun                 }
5899*4882a593Smuzhiyun                 mIspParamsDev->return_buffer_to_pool(buf);
5900*4882a593Smuzhiyun             }
5901*4882a593Smuzhiyun         }
5902*4882a593Smuzhiyun #endif
5903*4882a593Smuzhiyun         _isp_module_ens |= isp_params->module_ens & isp_params->module_en_update;
5904*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(
5905*4882a593Smuzhiyun             ISP20HW_SUBM,
5906*4882a593Smuzhiyun             "Config id(%u)'s isp params, full_en 0x%llx ens 0x%llx ens_up 0x%llx, cfg_up 0x%llx", isp_params->frame_id,
5907*4882a593Smuzhiyun             _isp_module_ens,
5908*4882a593Smuzhiyun             isp_params->module_ens,
5909*4882a593Smuzhiyun             isp_params->module_en_update,
5910*4882a593Smuzhiyun             isp_params->module_cfg_update);
5911*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(
5912*4882a593Smuzhiyun             ISP20HW_SUBM,
5913*4882a593Smuzhiyun             "device(%s) queue buffer index %d, queue cnt %d, check exit status again[exit: %d]",
5914*4882a593Smuzhiyun             XCAM_STR(mIspParamsDev->get_device_name()), buf_index,
5915*4882a593Smuzhiyun             mIspParamsDev->get_queued_bufcnt(), _is_exit);
5916*4882a593Smuzhiyun         if (_is_exit) return XCAM_RETURN_BYPASS;
5917*4882a593Smuzhiyun     } else
5918*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
5919*4882a593Smuzhiyun 
5920*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
5921*4882a593Smuzhiyun     return ret;
5922*4882a593Smuzhiyun }
5923*4882a593Smuzhiyun 
5924*4882a593Smuzhiyun #if defined(ISP_HW_V20)
5925*4882a593Smuzhiyun XCamReturn
setPpConfig(SmartPtr<cam3aResult> & result)5926*4882a593Smuzhiyun CamHwIsp20::setPpConfig(SmartPtr<cam3aResult> &result)
5927*4882a593Smuzhiyun {
5928*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5929*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
5930*4882a593Smuzhiyun     if (result->getType() == RESULT_TYPE_TNR_PARAM) {
5931*4882a593Smuzhiyun         ret = mTnrStreamProcUnit->config_params(result->getId(), result);
5932*4882a593Smuzhiyun     } else if (result->getType() == RESULT_TYPE_FEC_PARAM)
5933*4882a593Smuzhiyun         ret = mFecParamStream->config_params(result->getId(), result);
5934*4882a593Smuzhiyun     else if (result->getType() == RESULT_TYPE_EDGEFLT_PARAM ||
5935*4882a593Smuzhiyun              result->getType() == RESULT_TYPE_YNR_PARAM ||
5936*4882a593Smuzhiyun              result->getType() == RESULT_TYPE_UVNR_PARAM ||
5937*4882a593Smuzhiyun              result->getType() == RESULT_TYPE_SHARPEN_PARAM ||
5938*4882a593Smuzhiyun              result->getType() == RESULT_TYPE_ORB_PARAM) {
5939*4882a593Smuzhiyun         ret = mNrStreamProcUnit->config_params(result->getId(), result);
5940*4882a593Smuzhiyun     }
5941*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
5942*4882a593Smuzhiyun     return ret;
5943*4882a593Smuzhiyun }
5944*4882a593Smuzhiyun #endif
5945*4882a593Smuzhiyun 
5946*4882a593Smuzhiyun SmartPtr<cam3aResult>
get_3a_module_result(cam3aResultList & results,int32_t type)5947*4882a593Smuzhiyun CamHwIsp20::get_3a_module_result (cam3aResultList &results, int32_t type)
5948*4882a593Smuzhiyun {
5949*4882a593Smuzhiyun     cam3aResultList::iterator i_res = results.begin();
5950*4882a593Smuzhiyun     SmartPtr<cam3aResult> res;
5951*4882a593Smuzhiyun 
5952*4882a593Smuzhiyun     auto it = std::find_if(
5953*4882a593Smuzhiyun                   results.begin(), results.end(),
5954*4882a593Smuzhiyun     [&](const SmartPtr<cam3aResult> &r) {
5955*4882a593Smuzhiyun         return type == r->getType();
5956*4882a593Smuzhiyun     });
5957*4882a593Smuzhiyun     if (it != results.end()) {
5958*4882a593Smuzhiyun         res = *it;
5959*4882a593Smuzhiyun     }
5960*4882a593Smuzhiyun 
5961*4882a593Smuzhiyun     return res;
5962*4882a593Smuzhiyun }
5963*4882a593Smuzhiyun 
get_stream_format(rkaiq_stream_type_t type,struct v4l2_format & format)5964*4882a593Smuzhiyun XCamReturn CamHwIsp20::get_stream_format(rkaiq_stream_type_t type, struct v4l2_format &format)
5965*4882a593Smuzhiyun {
5966*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
5967*4882a593Smuzhiyun 
5968*4882a593Smuzhiyun     switch (type)
5969*4882a593Smuzhiyun     {
5970*4882a593Smuzhiyun     case RKISP20_STREAM_MIPITX_S:
5971*4882a593Smuzhiyun     case RKISP20_STREAM_MIPITX_M:
5972*4882a593Smuzhiyun     case RKISP20_STREAM_MIPITX_L:
5973*4882a593Smuzhiyun     {
5974*4882a593Smuzhiyun         memset(&format, 0, sizeof(format));
5975*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
5976*4882a593Smuzhiyun         ret = mRawCapUnit->get_tx_device(0)->get_format(format);
5977*4882a593Smuzhiyun #endif
5978*4882a593Smuzhiyun         break;
5979*4882a593Smuzhiyun     }
5980*4882a593Smuzhiyun     case RKISP20_STREAM_SP:
5981*4882a593Smuzhiyun     case RKISP20_STREAM_NR:
5982*4882a593Smuzhiyun     {
5983*4882a593Smuzhiyun         struct v4l2_subdev_format isp_fmt;
5984*4882a593Smuzhiyun         isp_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
5985*4882a593Smuzhiyun         isp_fmt.pad = 2;
5986*4882a593Smuzhiyun         ret = mIspCoreDev->getFormat(isp_fmt);
5987*4882a593Smuzhiyun         if (ret == XCAM_RETURN_NO_ERROR) {
5988*4882a593Smuzhiyun             BaseSensorHw* sensorHw;
5989*4882a593Smuzhiyun             sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
5990*4882a593Smuzhiyun             format.fmt.pix.width = isp_fmt.format.width;
5991*4882a593Smuzhiyun             format.fmt.pix.height = isp_fmt.format.height;
5992*4882a593Smuzhiyun             format.fmt.pix.pixelformat = get_v4l2_pixelformat(isp_fmt.format.code);
5993*4882a593Smuzhiyun         }
5994*4882a593Smuzhiyun         break;
5995*4882a593Smuzhiyun     }
5996*4882a593Smuzhiyun     default:
5997*4882a593Smuzhiyun         ret = XCAM_RETURN_ERROR_PARAM;
5998*4882a593Smuzhiyun         break;
5999*4882a593Smuzhiyun     }
6000*4882a593Smuzhiyun     return ret;
6001*4882a593Smuzhiyun }
6002*4882a593Smuzhiyun 
get_sp_resolution(int & width,int & height,int & aligned_w,int & aligned_h)6003*4882a593Smuzhiyun XCamReturn CamHwIsp20::get_sp_resolution(int &width, int &height, int &aligned_w, int &aligned_h)
6004*4882a593Smuzhiyun {
6005*4882a593Smuzhiyun #if defined(RKAIQ_ENABLE_SPSTREAM)
6006*4882a593Smuzhiyun     return mSpStreamUnit->get_sp_resolution(width, height, aligned_w, aligned_h);
6007*4882a593Smuzhiyun #else
6008*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
6009*4882a593Smuzhiyun #endif
6010*4882a593Smuzhiyun }
6011*4882a593Smuzhiyun 
6012*4882a593Smuzhiyun #if RKAIQ_HAVE_PDAF
get_pdaf_support()6013*4882a593Smuzhiyun bool CamHwIsp20::get_pdaf_support()
6014*4882a593Smuzhiyun {
6015*4882a593Smuzhiyun     bool pdaf_support = false;
6016*4882a593Smuzhiyun 
6017*4882a593Smuzhiyun     if (mPdafStreamUnit.ptr())
6018*4882a593Smuzhiyun         pdaf_support = mPdafInfo.pdaf_support;
6019*4882a593Smuzhiyun 
6020*4882a593Smuzhiyun     return pdaf_support;
6021*4882a593Smuzhiyun }
6022*4882a593Smuzhiyun #endif
6023*4882a593Smuzhiyun 
notify_isp_stream_status(bool on)6024*4882a593Smuzhiyun void CamHwIsp20::notify_isp_stream_status(bool on)
6025*4882a593Smuzhiyun {
6026*4882a593Smuzhiyun     if (on) {
6027*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "camId:%d, %s on", mCamPhyId, __func__);
6028*4882a593Smuzhiyun         XCamReturn ret = hdr_mipi_start_mode(_hdr_mode);
6029*4882a593Smuzhiyun         if (ret < 0) {
6030*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
6031*4882a593Smuzhiyun         }
6032*4882a593Smuzhiyun         _isp_stream_status = ISP_STREAM_STATUS_STREAM_ON;
6033*4882a593Smuzhiyun 
6034*4882a593Smuzhiyun         if (mHwResLintener) {
6035*4882a593Smuzhiyun             SmartPtr<Isp20Evt> ispEvt =
6036*4882a593Smuzhiyun                 new Isp20Evt(this, mSensorDev.dynamic_cast_ptr<SensorHw>());
6037*4882a593Smuzhiyun 
6038*4882a593Smuzhiyun             SmartPtr<V4l2Device> dev(NULL);
6039*4882a593Smuzhiyun             SmartPtr<Isp20EvtBuffer> ispEvtbuf =
6040*4882a593Smuzhiyun                 new Isp20EvtBuffer(ispEvt, dev);
6041*4882a593Smuzhiyun 
6042*4882a593Smuzhiyun             ispEvtbuf->_buf_type = VICAP_STREAM_ON_EVT;
6043*4882a593Smuzhiyun             SmartPtr<VideoBuffer> vbuf = ispEvtbuf.dynamic_cast_ptr<VideoBuffer>();
6044*4882a593Smuzhiyun 
6045*4882a593Smuzhiyun             // FIXME: [Baron] 2022-06-29, all rx started, tx start
6046*4882a593Smuzhiyun             if (!_linked_to_1608) {
6047*4882a593Smuzhiyun                 mHwResLintener->hwResCb(vbuf);
6048*4882a593Smuzhiyun             } else {
6049*4882a593Smuzhiyun                 waitLastSensorDone();
6050*4882a593Smuzhiyun                 mHwResLintener->hwResCb(vbuf);
6051*4882a593Smuzhiyun             }
6052*4882a593Smuzhiyun         }
6053*4882a593Smuzhiyun     } else {
6054*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "camId:%d, %s off", mCamPhyId, __func__);
6055*4882a593Smuzhiyun         _isp_stream_status = ISP_STREAM_STATUS_STREAM_OFF;
6056*4882a593Smuzhiyun         // if CIFISP_V4L2_EVENT_STREAM_STOP event is listened, isp driver
6057*4882a593Smuzhiyun         // will wait isp params streaming off
6058*4882a593Smuzhiyun         {
6059*4882a593Smuzhiyun             SmartLock locker(_stop_cond_mutex);
6060*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_POLL_THREAD
6061*4882a593Smuzhiyun             if (mIspParamStream.ptr())
6062*4882a593Smuzhiyun                 mIspParamStream->stop();
6063*4882a593Smuzhiyun #else
6064*4882a593Smuzhiyun             if (mIspParamsDev.ptr())
6065*4882a593Smuzhiyun                 mIspParamsDev->stop();
6066*4882a593Smuzhiyun #endif
6067*4882a593Smuzhiyun         }
6068*4882a593Smuzhiyun         hdr_mipi_stop();
6069*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "camId:%d, %s off done", mCamPhyId, __func__);
6070*4882a593Smuzhiyun     }
6071*4882a593Smuzhiyun }
6072*4882a593Smuzhiyun 
reset_hardware()6073*4882a593Smuzhiyun XCamReturn CamHwIsp20::reset_hardware()
6074*4882a593Smuzhiyun {
6075*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
6076*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
6077*4882a593Smuzhiyun     if (mRawCapUnit.ptr()) {
6078*4882a593Smuzhiyun         ret = mRawCapUnit->reset_hardware();
6079*4882a593Smuzhiyun     }
6080*4882a593Smuzhiyun #endif
6081*4882a593Smuzhiyun     return ret;
6082*4882a593Smuzhiyun }
6083*4882a593Smuzhiyun 
6084*4882a593Smuzhiyun XCamReturn
waitLastSensorDone()6085*4882a593Smuzhiyun CamHwIsp20::waitLastSensorDone()
6086*4882a593Smuzhiyun {
6087*4882a593Smuzhiyun     SmartLock lock (_sync_1608_mutex);
6088*4882a593Smuzhiyun 
6089*4882a593Smuzhiyun     while (!_sync_1608_done) {
6090*4882a593Smuzhiyun         _sync_done_cond.timedwait(_sync_1608_mutex, 100000ULL);
6091*4882a593Smuzhiyun     }
6092*4882a593Smuzhiyun 
6093*4882a593Smuzhiyun     return XCamReturn();
6094*4882a593Smuzhiyun }
6095*4882a593Smuzhiyun 
6096*4882a593Smuzhiyun XCamReturn
pixFmt2Bpp(uint32_t pixFmt,int8_t & bpp)6097*4882a593Smuzhiyun CamHwIsp20::pixFmt2Bpp(uint32_t pixFmt, int8_t& bpp)
6098*4882a593Smuzhiyun {
6099*4882a593Smuzhiyun     switch (pixFmt) {
6100*4882a593Smuzhiyun     case V4L2_PIX_FMT_SBGGR8:
6101*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGBRG8:
6102*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGRBG8:
6103*4882a593Smuzhiyun     case V4L2_PIX_FMT_SRGGB8:
6104*4882a593Smuzhiyun         bpp = 8;
6105*4882a593Smuzhiyun         break;
6106*4882a593Smuzhiyun     case V4L2_PIX_FMT_SBGGR10:
6107*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGBRG10:
6108*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGRBG10:
6109*4882a593Smuzhiyun     case V4L2_PIX_FMT_SRGGB10:
6110*4882a593Smuzhiyun         bpp = 10;
6111*4882a593Smuzhiyun         break;
6112*4882a593Smuzhiyun     case V4L2_PIX_FMT_SBGGR12:
6113*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGBRG12:
6114*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGRBG12:
6115*4882a593Smuzhiyun     case V4L2_PIX_FMT_SRGGB12:
6116*4882a593Smuzhiyun         bpp = 12;
6117*4882a593Smuzhiyun         break;
6118*4882a593Smuzhiyun     case V4L2_PIX_FMT_SBGGR14:
6119*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGBRG14:
6120*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGRBG14:
6121*4882a593Smuzhiyun     case V4L2_PIX_FMT_SRGGB14:
6122*4882a593Smuzhiyun         bpp = 14;
6123*4882a593Smuzhiyun         break;
6124*4882a593Smuzhiyun     case V4L2_PIX_FMT_SBGGR16:
6125*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGBRG16:
6126*4882a593Smuzhiyun     case V4L2_PIX_FMT_SGRBG16:
6127*4882a593Smuzhiyun     case V4L2_PIX_FMT_SRGGB16:
6128*4882a593Smuzhiyun         bpp = 16;
6129*4882a593Smuzhiyun         break;
6130*4882a593Smuzhiyun     default:
6131*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "unknown format");
6132*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
6133*4882a593Smuzhiyun     }
6134*4882a593Smuzhiyun 
6135*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
6136*4882a593Smuzhiyun }
6137*4882a593Smuzhiyun 
6138*4882a593Smuzhiyun XCamReturn
rawReproc_genIspParams(uint32_t sequence,rk_aiq_frame_info_t * offline_finfo,int mode)6139*4882a593Smuzhiyun CamHwIsp20::rawReproc_genIspParams (uint32_t sequence, rk_aiq_frame_info_t *offline_finfo, int mode)
6140*4882a593Smuzhiyun {
6141*4882a593Smuzhiyun     XCamReturn ret;
6142*4882a593Smuzhiyun     if (mode) {
6143*4882a593Smuzhiyun         if (offline_finfo) {
6144*4882a593Smuzhiyun             SensorHw* mSensor = mSensorDev.get_cast_ptr<SensorHw>();
6145*4882a593Smuzhiyun             ret = mSensor->set_offline_effecting_exp_map(sequence + 1, offline_finfo);
6146*4882a593Smuzhiyun         }
6147*4882a593Smuzhiyun         struct v4l2_event event;
6148*4882a593Smuzhiyun         event.u.frame_sync.frame_sequence = sequence;
6149*4882a593Smuzhiyun 
6150*4882a593Smuzhiyun         mIspSofStream->stop();
6151*4882a593Smuzhiyun         SmartPtr<VideoBuffer> buf =
6152*4882a593Smuzhiyun             mIspSofStream->new_video_buffer(event, NULL);
6153*4882a593Smuzhiyun 
6154*4882a593Smuzhiyun         CamHwBase::poll_buffer_ready(buf);
6155*4882a593Smuzhiyun     } else {
6156*4882a593Smuzhiyun         // wait until params of frame index 'sequence' have been done
6157*4882a593Smuzhiyun         int8_t wait_times = 100;
6158*4882a593Smuzhiyun         while ((sequence > _curIspParamsSeq) && (wait_times-- > 0)) {
6159*4882a593Smuzhiyun             usleep(10 * 1000);
6160*4882a593Smuzhiyun         }
6161*4882a593Smuzhiyun         if (wait_times == 0) {
6162*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wait params %d(cur:%d) done over 1 seconds !", sequence, _curIspParamsSeq);
6163*4882a593Smuzhiyun         } else {
6164*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "wait params %d(cur:%d) success !", sequence, _curIspParamsSeq);
6165*4882a593Smuzhiyun         }
6166*4882a593Smuzhiyun     }
6167*4882a593Smuzhiyun 
6168*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
6169*4882a593Smuzhiyun }
6170*4882a593Smuzhiyun 
6171*4882a593Smuzhiyun const char*
rawReproc_preInit(const char * isp_driver,const char * offline_sns_ent_name)6172*4882a593Smuzhiyun CamHwIsp20::rawReproc_preInit(const char* isp_driver, const char* offline_sns_ent_name)
6173*4882a593Smuzhiyun {
6174*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
6175*4882a593Smuzhiyun     ENTER_XCORE_FUNCTION();
6176*4882a593Smuzhiyun     int isp_driver_index = -1;
6177*4882a593Smuzhiyun     if (!isp_driver) {
6178*4882a593Smuzhiyun         return NULL;
6179*4882a593Smuzhiyun     } else {
6180*4882a593Smuzhiyun #ifdef ISP_HW_V30
6181*4882a593Smuzhiyun         char* isp_driver_name = const_cast<char*>(isp_driver);
6182*4882a593Smuzhiyun         char *rkisp = strstr(isp_driver_name, "rkisp");
6183*4882a593Smuzhiyun         if (rkisp) {
6184*4882a593Smuzhiyun             int isp_mode = atoi(rkisp + strlen("rkisp"));
6185*4882a593Smuzhiyun             char* vir = strstr(isp_driver_name, "vir");
6186*4882a593Smuzhiyun             if (vir) {
6187*4882a593Smuzhiyun                 int vir_idx = atoi(vir + strlen("vir"));
6188*4882a593Smuzhiyun                 isp_driver_index = isp_mode * 4 + vir_idx;
6189*4882a593Smuzhiyun             }
6190*4882a593Smuzhiyun         }
6191*4882a593Smuzhiyun #else
6192*4882a593Smuzhiyun 
6193*4882a593Smuzhiyun         if (strcmp(isp_driver, "rkisp0") == 0 ||
6194*4882a593Smuzhiyun                 strcmp(isp_driver, "rkisp") == 0)
6195*4882a593Smuzhiyun             isp_driver_index = 0;
6196*4882a593Smuzhiyun         else if (strcmp(isp_driver, "rkisp1") == 0)
6197*4882a593Smuzhiyun             isp_driver_index = 1;
6198*4882a593Smuzhiyun         else if (strcmp(isp_driver, "rkisp2") == 0)
6199*4882a593Smuzhiyun             isp_driver_index = 2;
6200*4882a593Smuzhiyun         else if (strcmp(isp_driver, "rkisp3") == 0)
6201*4882a593Smuzhiyun             isp_driver_index = 3;
6202*4882a593Smuzhiyun         else
6203*4882a593Smuzhiyun             isp_driver_index = -1;
6204*4882a593Smuzhiyun #endif
6205*4882a593Smuzhiyun     }
6206*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator iter;
6207*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_aiq_static_info_t> >::iterator iter_info;
6208*4882a593Smuzhiyun     for (iter = CamHwIsp20::mSensorHwInfos.begin(); \
6209*4882a593Smuzhiyun             iter != CamHwIsp20::mSensorHwInfos.end(); iter++) {
6210*4882a593Smuzhiyun         rk_sensor_full_info_t *s_full_info_f = iter->second.ptr();
6211*4882a593Smuzhiyun         if (s_full_info_f->isp_info) {
6212*4882a593Smuzhiyun             if (s_full_info_f->isp_info->model_idx != isp_driver_index) {
6213*4882a593Smuzhiyun                 continue;
6214*4882a593Smuzhiyun             }
6215*4882a593Smuzhiyun             rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t;
6216*4882a593Smuzhiyun             *s_full_info = *s_full_info_f;
6217*4882a593Smuzhiyun             iter_info = CamHwIsp20::mCamHwInfos.find(iter->first);
6218*4882a593Smuzhiyun             if (iter_info == CamHwIsp20::mCamHwInfos.end()) {
6219*4882a593Smuzhiyun                 continue;
6220*4882a593Smuzhiyun             }
6221*4882a593Smuzhiyun             rk_aiq_static_info_t *cam_hw_info_f = iter_info->second.ptr();
6222*4882a593Smuzhiyun             rk_aiq_static_info_t *cam_hw_info = new rk_aiq_static_info_t;
6223*4882a593Smuzhiyun             *cam_hw_info = *cam_hw_info_f;
6224*4882a593Smuzhiyun             char sensor_name_real[64];
6225*4882a593Smuzhiyun             if (!strstr(s_full_info->sensor_name.c_str(), offline_sns_ent_name)) {
6226*4882a593Smuzhiyun                 int module_index = 0;
6227*4882a593Smuzhiyun                 std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator sns_it;
6228*4882a593Smuzhiyun                 for (sns_it = CamHwIsp20::mSensorHwInfos.begin(); \
6229*4882a593Smuzhiyun                         sns_it != CamHwIsp20::mSensorHwInfos.end(); sns_it++) {
6230*4882a593Smuzhiyun                     rk_sensor_full_info_t *sns_full = sns_it->second.ptr();
6231*4882a593Smuzhiyun                     if (strstr(sns_full->sensor_name.c_str(), "_s_")) {
6232*4882a593Smuzhiyun                         int sns_index = atoi(sns_full->sensor_name.c_str() + 2);
6233*4882a593Smuzhiyun                         if (module_index <= sns_index) {
6234*4882a593Smuzhiyun                             module_index = sns_index + 1;
6235*4882a593Smuzhiyun                         }
6236*4882a593Smuzhiyun                     }
6237*4882a593Smuzhiyun                 }
6238*4882a593Smuzhiyun                 std::string tmp_sensor_name = s_full_info_f->sensor_name;
6239*4882a593Smuzhiyun                 s_full_info->phy_module_orient = 's';
6240*4882a593Smuzhiyun                 memset(sensor_name_real, 0, sizeof(sensor_name_real));
6241*4882a593Smuzhiyun                 sprintf(sensor_name_real, "%s%d%s%s%s", "m0", module_index, "_s_",
6242*4882a593Smuzhiyun                         offline_sns_ent_name,
6243*4882a593Smuzhiyun                         " 1-111a");
6244*4882a593Smuzhiyun                 std::string sns_fake_name = sensor_name_real;
6245*4882a593Smuzhiyun                 s_full_info->sensor_name = sns_fake_name;
6246*4882a593Smuzhiyun                 CamHwIsp20::mFakeCameraName[s_full_info->sensor_name] = tmp_sensor_name;
6247*4882a593Smuzhiyun                 CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
6248*4882a593Smuzhiyun                 CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = cam_hw_info;
6249*4882a593Smuzhiyun                 CamHwIsp20::mSensorHwInfos.erase(tmp_sensor_name);
6250*4882a593Smuzhiyun                 CamHwIsp20::mCamHwInfos.erase(tmp_sensor_name);
6251*4882a593Smuzhiyun                 iter_info++;
6252*4882a593Smuzhiyun                 return s_full_info->sensor_name.c_str();
6253*4882a593Smuzhiyun             } else {
6254*4882a593Smuzhiyun                 std::string tmp_sensor_name = s_full_info_f->sensor_name;
6255*4882a593Smuzhiyun                 s_full_info->phy_module_orient = 's';
6256*4882a593Smuzhiyun                 memset(sensor_name_real, 0, sizeof(sensor_name_real));
6257*4882a593Smuzhiyun                 sprintf(sensor_name_real, "%s%s%s%s", s_full_info->module_index_str.c_str(), "_s_",
6258*4882a593Smuzhiyun                         s_full_info->module_real_sensor_name.c_str(),
6259*4882a593Smuzhiyun                         " 1-111a");
6260*4882a593Smuzhiyun                 std::string sns_fake_name = sensor_name_real;
6261*4882a593Smuzhiyun                 s_full_info->sensor_name = sns_fake_name;
6262*4882a593Smuzhiyun                 CamHwIsp20::mFakeCameraName[s_full_info->sensor_name] = tmp_sensor_name;
6263*4882a593Smuzhiyun                 CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
6264*4882a593Smuzhiyun                 CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = cam_hw_info;
6265*4882a593Smuzhiyun                 CamHwIsp20::mSensorHwInfos.erase(tmp_sensor_name);
6266*4882a593Smuzhiyun                 CamHwIsp20::mCamHwInfos.erase(tmp_sensor_name);
6267*4882a593Smuzhiyun                 iter_info++;
6268*4882a593Smuzhiyun                 return s_full_info->sensor_name.c_str();
6269*4882a593Smuzhiyun             }
6270*4882a593Smuzhiyun         }
6271*4882a593Smuzhiyun     }
6272*4882a593Smuzhiyun     LOGI_CAMHW_SUBM(ISP20HW_SUBM, "offline preInit faile\n");
6273*4882a593Smuzhiyun     return NULL;
6274*4882a593Smuzhiyun     EXIT_XCORE_FUNCTION();
6275*4882a593Smuzhiyun }
6276*4882a593Smuzhiyun 
6277*4882a593Smuzhiyun XCamReturn
rawReproc_deInit(const char * fakeSensor)6278*4882a593Smuzhiyun CamHwIsp20::rawReproc_deInit(const char* fakeSensor)
6279*4882a593Smuzhiyun {
6280*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
6281*4882a593Smuzhiyun     std::string fake_sns_name = std::string(fakeSensor);
6282*4882a593Smuzhiyun     std::string real_sns_name = "";
6283*4882a593Smuzhiyun     std::unordered_map<std::string, std::string>::iterator it_sns_name;
6284*4882a593Smuzhiyun     it_sns_name = CamHwIsp20::mFakeCameraName.find(fake_sns_name);
6285*4882a593Smuzhiyun     if (it_sns_name == CamHwIsp20::mFakeCameraName.end()) {
6286*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
6287*4882a593Smuzhiyun     }
6288*4882a593Smuzhiyun     real_sns_name = it_sns_name->second;
6289*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator it;
6290*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_aiq_static_info_t> >::iterator it_info;
6291*4882a593Smuzhiyun     it = CamHwIsp20::mSensorHwInfos.find(fake_sns_name);
6292*4882a593Smuzhiyun     it_info = CamHwIsp20::mCamHwInfos.find(fake_sns_name);
6293*4882a593Smuzhiyun     if (it != CamHwIsp20::mSensorHwInfos.end()) {
6294*4882a593Smuzhiyun         rk_sensor_full_info_t *s_full_info_f = it->second.ptr();
6295*4882a593Smuzhiyun         rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t;
6296*4882a593Smuzhiyun         *s_full_info = *s_full_info_f;
6297*4882a593Smuzhiyun         s_full_info->sensor_name = real_sns_name;
6298*4882a593Smuzhiyun         CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
6299*4882a593Smuzhiyun         CamHwIsp20::mSensorHwInfos.erase(it);
6300*4882a593Smuzhiyun     }
6301*4882a593Smuzhiyun     if (it_info != CamHwIsp20::mCamHwInfos.end()) {
6302*4882a593Smuzhiyun         rk_aiq_static_info_t *cam_hw_info_f = it_info->second.ptr();
6303*4882a593Smuzhiyun         rk_aiq_static_info_t *cam_hw_info = new rk_aiq_static_info_t;
6304*4882a593Smuzhiyun         *cam_hw_info = *cam_hw_info_f;
6305*4882a593Smuzhiyun         CamHwIsp20::mCamHwInfos[real_sns_name] = cam_hw_info;
6306*4882a593Smuzhiyun         CamHwIsp20::mCamHwInfos.erase(it_info);
6307*4882a593Smuzhiyun     }
6308*4882a593Smuzhiyun     CamHwIsp20::mFakeCameraName.erase(it_sns_name);
6309*4882a593Smuzhiyun     return ret;
6310*4882a593Smuzhiyun }
6311*4882a593Smuzhiyun 
6312*4882a593Smuzhiyun XCamReturn
rawReProc_prepare(uint32_t sequence,rk_aiq_frame_info_t * offline_finfo)6313*4882a593Smuzhiyun CamHwIsp20::rawReProc_prepare (uint32_t sequence, rk_aiq_frame_info_t *offline_finfo)
6314*4882a593Smuzhiyun {
6315*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
6316*4882a593Smuzhiyun     SensorHw* mSensor = mSensorDev.get_cast_ptr<SensorHw>();
6317*4882a593Smuzhiyun     ret = mSensor->set_offline_effecting_exp_map(sequence, &offline_finfo[0]);
6318*4882a593Smuzhiyun     ret = mSensor->set_offline_effecting_exp_map(sequence + 1, &offline_finfo[1]);
6319*4882a593Smuzhiyun     return ret;
6320*4882a593Smuzhiyun }
6321*4882a593Smuzhiyun 
6322*4882a593Smuzhiyun XCamReturn
setCifSclStartFlag(int ratio,bool mode)6323*4882a593Smuzhiyun CamHwIsp20::setCifSclStartFlag(int ratio, bool mode)
6324*4882a593Smuzhiyun {
6325*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
6326*4882a593Smuzhiyun 
6327*4882a593Smuzhiyun     if (mode == mCifScaleStream->getIsActive())
6328*4882a593Smuzhiyun         return ret;
6329*4882a593Smuzhiyun 
6330*4882a593Smuzhiyun     auto it = mSensorHwInfos.find(sns_name);
6331*4882a593Smuzhiyun     if ( it == mSensorHwInfos.end()) {
6332*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
6333*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
6334*4882a593Smuzhiyun     }
6335*4882a593Smuzhiyun     rk_sensor_full_info_t *s_info = it->second.ptr();
6336*4882a593Smuzhiyun     ret = mCifScaleStream->restart(s_info, ratio, this, mode);
6337*4882a593Smuzhiyun     return ret;
6338*4882a593Smuzhiyun }
6339*4882a593Smuzhiyun 
6340*4882a593Smuzhiyun } //namspace RkCam
6341