xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/LensHw.h (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 #ifndef _LENS_HW_BASE_H_
19*4882a593Smuzhiyun #define _LENS_HW_BASE_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <map>
22*4882a593Smuzhiyun #include <list>
23*4882a593Smuzhiyun #include <xcam_mutex.h>
24*4882a593Smuzhiyun #include "xcam_thread.h"
25*4882a593Smuzhiyun #include "smartptr.h"
26*4882a593Smuzhiyun #include "safe_list.h"
27*4882a593Smuzhiyun #include "v4l2_device.h"
28*4882a593Smuzhiyun #include "rk_aiq_pool.h"
29*4882a593Smuzhiyun #include "common/rk-camera-module.h"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define VCMDRV_SETZOOM_MAXCNT        300U
32*4882a593Smuzhiyun #define LENSHW_RECORD_SOF_NUM        256
33*4882a593Smuzhiyun #define LENSHW_RECORD_LOWPASSFV_NUM  256
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define RK_VIDIOC_VCM_TIMEINFO \
36*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 0, struct rk_cam_vcm_tim)
37*4882a593Smuzhiyun #define RK_VIDIOC_IRIS_TIMEINFO \
38*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 1, struct rk_cam_vcm_tim)
39*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM_TIMEINFO \
40*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 2, struct rk_cam_vcm_tim)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define RK_VIDIOC_GET_VCM_CFG \
43*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 3, struct rk_cam_vcm_cfg)
44*4882a593Smuzhiyun #define RK_VIDIOC_SET_VCM_CFG \
45*4882a593Smuzhiyun     _IOW('V', BASE_VIDIOC_PRIVATE + 4, struct rk_cam_vcm_cfg)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define RK_VIDIOC_FOCUS_CORRECTION \
48*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 5, unsigned int)
49*4882a593Smuzhiyun #define RK_VIDIOC_IRIS_CORRECTION \
50*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 6, unsigned int)
51*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM_CORRECTION \
52*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 7, unsigned int)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define RK_VIDIOC_FOCUS_SET_BACKLASH \
55*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 8, unsigned int)
56*4882a593Smuzhiyun #define RK_VIDIOC_IRIS_SET_BACKLASH \
57*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 9, unsigned int)
58*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM_SET_BACKLASH \
59*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 10, unsigned int)
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM1_TIMEINFO \
62*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 11, struct rk_cam_vcm_tim)
63*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM1_CORRECTION \
64*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 12, unsigned int)
65*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM1_SET_BACKLASH \
66*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 13, unsigned int)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define RK_VIDIOC_ZOOM_SET_POSITION \
69*4882a593Smuzhiyun     _IOW('V', BASE_VIDIOC_PRIVATE + 14, struct rk_cam_set_zoom)
70*4882a593Smuzhiyun #define RK_VIDIOC_FOCUS_SET_POSITION \
71*4882a593Smuzhiyun     _IOW('V', BASE_VIDIOC_PRIVATE + 15, struct rk_cam_set_focus)
72*4882a593Smuzhiyun #define RK_VIDIOC_MODIFY_POSITION \
73*4882a593Smuzhiyun     _IOW('V', BASE_VIDIOC_PRIVATE + 16, struct rk_cam_modify_pos)
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define RK_VIDIOC_GET_DCIRIS_HALL_ADC \
76*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 20, unsigned int)
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
79*4882a593Smuzhiyun #define RK_VIDIOC_COMPAT_VCM_TIMEINFO \
80*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 0, struct rk_cam_compat_vcm_tim)
81*4882a593Smuzhiyun #define RK_VIDIOC_COMPAT_IRIS_TIMEINFO \
82*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 1, struct rk_cam_compat_vcm_tim)
83*4882a593Smuzhiyun #define RK_VIDIOC_COMPAT_ZOOM_TIMEINFO \
84*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 2, struct rk_cam_compat_vcm_tim)
85*4882a593Smuzhiyun #define RK_VIDIOC_COMPAT_ZOOM1_TIMEINFO \
86*4882a593Smuzhiyun     _IOR('V', BASE_VIDIOC_PRIVATE + 11, struct rk_cam_compat_vcm_tim)
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define RK_VIDIOC_SET_VCM_MAX_LOGICALPOS \
90*4882a593Smuzhiyun     _IOW('V', BASE_VIDIOC_PRIVATE + 17, unsigned int)
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun typedef int s32;
93*4882a593Smuzhiyun typedef unsigned int u32;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct rk_cam_modify_pos {
96*4882a593Smuzhiyun     s32 focus_pos;
97*4882a593Smuzhiyun     s32 zoom_pos;
98*4882a593Smuzhiyun     s32 zoom1_pos;
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun struct rk_cam_set_focus {
102*4882a593Smuzhiyun     bool is_need_reback;
103*4882a593Smuzhiyun     s32 focus_pos;
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun struct rk_cam_zoom_pos {
107*4882a593Smuzhiyun     s32 zoom_pos;
108*4882a593Smuzhiyun     s32 focus_pos;
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun struct rk_cam_set_zoom {
112*4882a593Smuzhiyun     bool is_need_zoom_reback;
113*4882a593Smuzhiyun     bool is_need_focus_reback;
114*4882a593Smuzhiyun     u32 setzoom_cnt;
115*4882a593Smuzhiyun     struct rk_cam_zoom_pos zoom_pos[VCMDRV_SETZOOM_MAXCNT];
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun struct rk_cam_vcm_tim {
119*4882a593Smuzhiyun     struct timeval vcm_start_t;
120*4882a593Smuzhiyun     struct timeval vcm_end_t;
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
124*4882a593Smuzhiyun struct rk_cam_compat_vcm_tim {
125*4882a593Smuzhiyun     struct compat_timeval vcm_start_t;
126*4882a593Smuzhiyun     struct compat_timeval vcm_end_t;
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun #endif
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun struct rk_cam_motor_tim {
131*4882a593Smuzhiyun     struct timeval motor_start_t;
132*4882a593Smuzhiyun     struct timeval motor_end_t;
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun struct rk_cam_vcm_cfg {
136*4882a593Smuzhiyun     int start_ma;
137*4882a593Smuzhiyun     int rated_ma;
138*4882a593Smuzhiyun     int step_mode;
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define LENSHW_RECORD_SOF_NUM   256
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun using namespace XCam;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun namespace RkCam {
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define LENS_SUBM (0x10)
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun class LensHwHelperThd;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun class LensHw : public V4l2SubDevice {
153*4882a593Smuzhiyun public:
154*4882a593Smuzhiyun     explicit LensHw(const char* name);
155*4882a593Smuzhiyun     virtual ~LensHw();
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun     XCamReturn getOTPData();
158*4882a593Smuzhiyun     XCamReturn start(bool prepared = false) override;
159*4882a593Smuzhiyun     XCamReturn stop() override;
160*4882a593Smuzhiyun     XCamReturn start_internal();
161*4882a593Smuzhiyun     XCamReturn getLensModeData(rk_aiq_lens_descriptor& lens_des);
162*4882a593Smuzhiyun     XCamReturn getLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg);
163*4882a593Smuzhiyun     XCamReturn setLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg);
164*4882a593Smuzhiyun     XCamReturn getLensVcmMaxlogpos(int& max_log_pos);
165*4882a593Smuzhiyun     XCamReturn setLensVcmMaxlogpos(int& max_log_pos);
166*4882a593Smuzhiyun     XCamReturn setPIrisParams(int step);
167*4882a593Smuzhiyun     XCamReturn setDCIrisParams(int pwmDuty);
168*4882a593Smuzhiyun     XCamReturn setHDCIrisParams(int target);
169*4882a593Smuzhiyun     XCamReturn getHDCIrisParams(int* adc);
170*4882a593Smuzhiyun     XCamReturn setFocusParams(SmartPtr<RkAiqFocusParamsProxy>& focus_params);
171*4882a593Smuzhiyun     XCamReturn setFocusParamsSync(int position, bool is_update_time, bool focus_noreback);
172*4882a593Smuzhiyun     XCamReturn setZoomParams(int position);
173*4882a593Smuzhiyun     XCamReturn setZoomFocusParams(SmartPtr<RkAiqFocusParamsProxy>& focus_params);
174*4882a593Smuzhiyun     XCamReturn setZoomFocusParamsSync(SmartPtr<rk_aiq_focus_params_t> attrPtr, bool is_update_time);
175*4882a593Smuzhiyun     XCamReturn setZoomFocusRebackSync(SmartPtr<rk_aiq_focus_params_t> attrPtr, bool is_update_time);
176*4882a593Smuzhiyun     XCamReturn endZoomChgSync(SmartPtr<rk_aiq_focus_params_t> attrPtr, bool is_update_time);
177*4882a593Smuzhiyun     XCamReturn getPIrisParams(int* step);
178*4882a593Smuzhiyun     XCamReturn getFocusParams(int* position);
179*4882a593Smuzhiyun     XCamReturn getZoomParams(int* position);
180*4882a593Smuzhiyun     XCamReturn FocusCorrectionSync();
181*4882a593Smuzhiyun     XCamReturn ZoomCorrectionSync();
182*4882a593Smuzhiyun     XCamReturn FocusCorrection();
183*4882a593Smuzhiyun     XCamReturn ZoomCorrection();
184*4882a593Smuzhiyun     XCamReturn ZoomFocusModifyPositionSync(SmartPtr<rk_aiq_focus_params_t> attrPtr);
185*4882a593Smuzhiyun     XCamReturn ZoomFocusModifyPosition(SmartPtr<RkAiqFocusParamsProxy>& focus_params);
186*4882a593Smuzhiyun     XCamReturn handle_sof(int64_t time, uint32_t frameid);
187*4882a593Smuzhiyun     XCamReturn setLowPassFv(uint32_t sub_shp4_4[RKAIQ_RAWAF_SUMDATA_NUM], uint32_t sub_shp8_8[RKAIQ_RAWAF_SUMDATA_NUM],
188*4882a593Smuzhiyun                             uint32_t high_light[RKAIQ_RAWAF_SUMDATA_NUM], uint32_t high_light2[RKAIQ_RAWAF_SUMDATA_NUM], uint32_t frameid);
189*4882a593Smuzhiyun     XCamReturn getIrisInfoParams(SmartPtr<RkAiqIrisParamsProxy>& irisParams, uint32_t frame_id);
190*4882a593Smuzhiyun     XCamReturn getAfInfoParams(SmartPtr<RkAiqAfInfoProxy>& afInfo, uint32_t frame_id);
191*4882a593Smuzhiyun     XCamReturn setAngleZ(float angleZ);
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun private:
194*4882a593Smuzhiyun     XCamReturn queryLensSupport();
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun     XCAM_DEAD_COPY (LensHw);
197*4882a593Smuzhiyun     Mutex _mutex;
198*4882a593Smuzhiyun     SmartPtr<RkAiqAfInfoPool> _afInfoPool;
199*4882a593Smuzhiyun     SmartPtr<RkAiqIrisParamsPool> _irisInfoPool;
200*4882a593Smuzhiyun     static uint16_t DEFAULT_POOL_SIZE;
201*4882a593Smuzhiyun     struct v4l2_queryctrl _iris_query;
202*4882a593Smuzhiyun     struct v4l2_queryctrl _focus_query;
203*4882a593Smuzhiyun     struct v4l2_queryctrl _zoom_query;
204*4882a593Smuzhiyun     struct rk_cam_motor_tim _dciris_tim;
205*4882a593Smuzhiyun     struct rk_cam_motor_tim _piris_tim;
206*4882a593Smuzhiyun     struct rk_cam_vcm_tim _focus_tim;
207*4882a593Smuzhiyun     struct rk_cam_vcm_tim _zoom_tim;
208*4882a593Smuzhiyun     bool _iris_enable;
209*4882a593Smuzhiyun     bool _focus_enable;
210*4882a593Smuzhiyun     bool _zoom_enable;
211*4882a593Smuzhiyun     bool _zoom_correction;
212*4882a593Smuzhiyun     bool _focus_correction;
213*4882a593Smuzhiyun     int _piris_step;
214*4882a593Smuzhiyun     int _last_piris_step;
215*4882a593Smuzhiyun     int _dciris_pwmduty;
216*4882a593Smuzhiyun     int _last_dciris_pwmduty;
217*4882a593Smuzhiyun     int _hdciris_target;
218*4882a593Smuzhiyun     int _last_hdciris_target;
219*4882a593Smuzhiyun     int _focus_pos;
220*4882a593Smuzhiyun     int _zoom_pos;
221*4882a593Smuzhiyun     int _last_zoomchg_focus;
222*4882a593Smuzhiyun     int _last_zoomchg_zoom;
223*4882a593Smuzhiyun     int64_t _frame_time[LENSHW_RECORD_SOF_NUM];
224*4882a593Smuzhiyun     uint32_t _frame_sequence[LENSHW_RECORD_SOF_NUM];
225*4882a593Smuzhiyun     int _rec_sof_idx;
226*4882a593Smuzhiyun     int32_t _lowfv_fv4_4[LENSHW_RECORD_LOWPASSFV_NUM][RKAIQ_RAWAF_SUMDATA_NUM];
227*4882a593Smuzhiyun     int32_t _lowfv_fv8_8[LENSHW_RECORD_LOWPASSFV_NUM][RKAIQ_RAWAF_SUMDATA_NUM];
228*4882a593Smuzhiyun     int32_t _lowfv_highlht[LENSHW_RECORD_LOWPASSFV_NUM][RKAIQ_RAWAF_SUMDATA_NUM];
229*4882a593Smuzhiyun     int32_t _lowfv_highlht2[LENSHW_RECORD_LOWPASSFV_NUM][RKAIQ_RAWAF_SUMDATA_NUM];
230*4882a593Smuzhiyun     uint32_t _lowfv_seq[LENSHW_RECORD_LOWPASSFV_NUM];
231*4882a593Smuzhiyun     int _rec_lowfv_idx;
232*4882a593Smuzhiyun     SmartPtr<LensHwHelperThd> _lenshw_thd;
233*4882a593Smuzhiyun     SmartPtr<LensHwHelperThd> _lenshw_thd1;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun     bool _otp_valid;
236*4882a593Smuzhiyun     float _posture;
237*4882a593Smuzhiyun     float _hysteresis;
238*4882a593Smuzhiyun     float _startCurrent;
239*4882a593Smuzhiyun     float _endCurrent;
240*4882a593Smuzhiyun     float _angleZ;
241*4882a593Smuzhiyun     int _max_logical_pos;
242*4882a593Smuzhiyun };
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun class LensHwHelperThd
245*4882a593Smuzhiyun     : public Thread {
246*4882a593Smuzhiyun public:
LensHwHelperThd(LensHw * lenshw,int id)247*4882a593Smuzhiyun     LensHwHelperThd(LensHw *lenshw, int id)
248*4882a593Smuzhiyun         : Thread("LensHwHelperThread")
249*4882a593Smuzhiyun         , mLensHw(lenshw), mId(id) {
250*4882a593Smuzhiyun         (void)(mId);
251*4882a593Smuzhiyun     };
~LensHwHelperThd()252*4882a593Smuzhiyun     ~LensHwHelperThd() {
253*4882a593Smuzhiyun         mAttrQueue.clear ();
254*4882a593Smuzhiyun     };
255*4882a593Smuzhiyun 
triger_stop()256*4882a593Smuzhiyun     void triger_stop() {
257*4882a593Smuzhiyun         mAttrQueue.pause_pop ();
258*4882a593Smuzhiyun     };
259*4882a593Smuzhiyun 
triger_start()260*4882a593Smuzhiyun     void triger_start() {
261*4882a593Smuzhiyun         mAttrQueue.resume_pop ();
262*4882a593Smuzhiyun     };
263*4882a593Smuzhiyun 
push_attr(const SmartPtr<rk_aiq_focus_params_t> buffer)264*4882a593Smuzhiyun     bool push_attr (const SmartPtr<rk_aiq_focus_params_t> buffer) {
265*4882a593Smuzhiyun         mAttrQueue.push (buffer);
266*4882a593Smuzhiyun         return true;
267*4882a593Smuzhiyun     };
268*4882a593Smuzhiyun 
is_empty()269*4882a593Smuzhiyun     bool is_empty () {
270*4882a593Smuzhiyun         return mAttrQueue.is_empty();
271*4882a593Smuzhiyun     };
272*4882a593Smuzhiyun 
clear_attr()273*4882a593Smuzhiyun     void clear_attr () {
274*4882a593Smuzhiyun         mAttrQueue.clear ();
275*4882a593Smuzhiyun     };
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun protected:
278*4882a593Smuzhiyun     //virtual bool started ();
stopped()279*4882a593Smuzhiyun     virtual void stopped () {
280*4882a593Smuzhiyun         mAttrQueue.clear ();
281*4882a593Smuzhiyun     };
282*4882a593Smuzhiyun     virtual bool loop ();
283*4882a593Smuzhiyun private:
284*4882a593Smuzhiyun     LensHw *mLensHw;
285*4882a593Smuzhiyun     int mId;
286*4882a593Smuzhiyun     SafeList<rk_aiq_focus_params_t> mAttrQueue;
287*4882a593Smuzhiyun };
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun } //namespace RkCam
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun #endif
292