xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/SensorHw.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 _SENSOR_HW_BASE_H_
19*4882a593Smuzhiyun #define _SENSOR_HW_BASE_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <map>
22*4882a593Smuzhiyun #include <list>
23*4882a593Smuzhiyun #include <istream>
24*4882a593Smuzhiyun #include "v4l2_device.h"
25*4882a593Smuzhiyun #include "rk_aiq_pool.h"
26*4882a593Smuzhiyun #include "common/rk-camera-module.h"
27*4882a593Smuzhiyun #include "v4l2_buffer_proxy.h"
28*4882a593Smuzhiyun #include "rk_aiq_offline_raw.h"
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /************ BELOW FROM kernel/include/uapi/linux/rk-preisp.h ************/
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* test hdr function */
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun * struct hdrae_exp_s - hdrae exposure
35*4882a593Smuzhiyun *
36*4882a593Smuzhiyun */
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun enum cg_mode_e {
39*4882a593Smuzhiyun     GAIN_MODE_LCG,
40*4882a593Smuzhiyun     GAIN_MODE_HCG,
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct hdrae_exp_s {
44*4882a593Smuzhiyun     unsigned int long_exp_reg;
45*4882a593Smuzhiyun     unsigned int long_gain_reg;
46*4882a593Smuzhiyun     unsigned int middle_exp_reg;
47*4882a593Smuzhiyun     unsigned int middle_gain_reg;
48*4882a593Smuzhiyun     unsigned int short_exp_reg;
49*4882a593Smuzhiyun     unsigned int short_gain_reg;
50*4882a593Smuzhiyun     unsigned int long_exp_val;
51*4882a593Smuzhiyun     unsigned int long_gain_val;
52*4882a593Smuzhiyun     unsigned int middle_exp_val;
53*4882a593Smuzhiyun     unsigned int middle_gain_val;
54*4882a593Smuzhiyun     unsigned int short_exp_val;
55*4882a593Smuzhiyun     unsigned int short_gain_val;
56*4882a593Smuzhiyun     unsigned char long_cg_mode;
57*4882a593Smuzhiyun     unsigned char middle_cg_mode;
58*4882a593Smuzhiyun     unsigned char short_cg_mode;
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define SENSOR_CMD_SET_HDRAE_EXP        \
62*4882a593Smuzhiyun     _IOW('V', BASE_VIDIOC_PRIVATE + 0, struct hdrae_exp_s)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /************ UPPER FROM kernel/include/uapi/linux/rk-preisp.h ************/
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun using namespace XCam;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun namespace RkCam {
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define SENSOR_SUBM (0x4)
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun class BaseSensorHw : public V4l2SubDevice {
73*4882a593Smuzhiyun public:
BaseSensorHw(const char * name)74*4882a593Smuzhiyun     explicit BaseSensorHw(const char* name): V4l2SubDevice (name) {}
~BaseSensorHw()75*4882a593Smuzhiyun     virtual ~BaseSensorHw() {}
setCamPhyId(int phyId)76*4882a593Smuzhiyun     virtual void setCamPhyId(int phyId) {
77*4882a593Smuzhiyun         mCamPhyId = phyId;
78*4882a593Smuzhiyun     }
setExposureParams(SmartPtr<RkAiqExpParamsProxy> & expPar)79*4882a593Smuzhiyun      virtual XCamReturn setExposureParams(SmartPtr<RkAiqExpParamsProxy>& expPar) { return XCAM_RETURN_NO_ERROR;}
getSensorModeData(const char * sns_ent_name,rk_aiq_exposure_sensor_descriptor & sns_des)80*4882a593Smuzhiyun     virtual XCamReturn getSensorModeData(const char* sns_ent_name,
81*4882a593Smuzhiyun                                  rk_aiq_exposure_sensor_descriptor& sns_des) { return XCAM_RETURN_NO_ERROR;}
82*4882a593Smuzhiyun 
handle_sof(int64_t time,uint32_t frameid)83*4882a593Smuzhiyun     virtual XCamReturn handle_sof(int64_t time, uint32_t frameid) { return XCAM_RETURN_NO_ERROR;}
get_pixel(rk_aiq_exposure_sensor_descriptor * sns_des)84*4882a593Smuzhiyun     virtual int get_pixel(rk_aiq_exposure_sensor_descriptor* sns_des)   { return 0;}
get_blank(rk_aiq_exposure_sensor_descriptor * sns_des)85*4882a593Smuzhiyun     virtual int get_blank(rk_aiq_exposure_sensor_descriptor* sns_des) { return 0;}
get_exposure_range(rk_aiq_exposure_sensor_descriptor * sns_des)86*4882a593Smuzhiyun     virtual int get_exposure_range(rk_aiq_exposure_sensor_descriptor* sns_des) { return 0;}
get_sensor_desc(rk_aiq_exposure_sensor_descriptor * sns_des)87*4882a593Smuzhiyun     virtual int get_sensor_desc(rk_aiq_exposure_sensor_descriptor* sns_des) { return 0;}
88*4882a593Smuzhiyun 
get_sensor_descriptor(rk_aiq_exposure_sensor_descriptor * sns_des)89*4882a593Smuzhiyun     virtual XCamReturn get_sensor_descriptor (rk_aiq_exposure_sensor_descriptor* sns_des) { return XCAM_RETURN_NO_ERROR;}
getEffectiveExpParams(SmartPtr<RkAiqSensorExpParamsProxy> & ExpParams,uint32_t frame_id)90*4882a593Smuzhiyun     virtual XCamReturn getEffectiveExpParams(SmartPtr<RkAiqSensorExpParamsProxy>& ExpParams, uint32_t frame_id) { return XCAM_RETURN_NO_ERROR;}
set_working_mode(int mode)91*4882a593Smuzhiyun     virtual XCamReturn set_working_mode(int mode) { return XCAM_RETURN_NO_ERROR;}
set_exp_delay_info(int time_delay,int gain_delay,int hcg_lcg_mode_delay)92*4882a593Smuzhiyun     virtual XCamReturn set_exp_delay_info(int time_delay, int gain_delay, int hcg_lcg_mode_delay) { return XCAM_RETURN_NO_ERROR;}
set_mirror_flip(bool mirror,bool flip,int32_t & skip_frame_sequence)93*4882a593Smuzhiyun     virtual XCamReturn set_mirror_flip(bool mirror, bool flip, int32_t& skip_frame_sequence) { return XCAM_RETURN_NO_ERROR;}
get_mirror_flip(bool & mirror,bool & flip)94*4882a593Smuzhiyun     virtual XCamReturn get_mirror_flip(bool& mirror, bool& flip) { return XCAM_RETURN_NO_ERROR;}
95*4882a593Smuzhiyun     virtual XCamReturn start(bool prepared = false) { return XCAM_RETURN_NO_ERROR;}
stop()96*4882a593Smuzhiyun     virtual XCamReturn stop() { return XCAM_RETURN_NO_ERROR;}
on_dqueue(int dev_idx,SmartPtr<V4l2BufferProxy> buf_proxy)97*4882a593Smuzhiyun     virtual XCamReturn on_dqueue(int dev_idx, SmartPtr<V4l2BufferProxy> buf_proxy) { return XCAM_RETURN_NO_ERROR; }
is_virtual_sensor()98*4882a593Smuzhiyun     virtual bool is_virtual_sensor() { return false; }
set_sync_mode(uint32_t mode)99*4882a593Smuzhiyun     virtual XCamReturn set_sync_mode(uint32_t mode) {return XCAM_RETURN_NO_ERROR;}
setTbInfo(bool is_pre_aiq)100*4882a593Smuzhiyun     void setTbInfo(bool is_pre_aiq) {
101*4882a593Smuzhiyun         mTbIsPreAiq = is_pre_aiq;
102*4882a593Smuzhiyun     }
103*4882a593Smuzhiyun protected:
104*4882a593Smuzhiyun     XCAM_DEAD_COPY (BaseSensorHw);
105*4882a593Smuzhiyun     uint32_t get_v4l2_pixelformat(uint32_t pixelcode);
106*4882a593Smuzhiyun     int mCamPhyId;
107*4882a593Smuzhiyun     bool mTbIsPreAiq;
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun class SensorHw : public BaseSensorHw {
111*4882a593Smuzhiyun public:
112*4882a593Smuzhiyun     explicit SensorHw(const char* name);
113*4882a593Smuzhiyun     virtual ~SensorHw();
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun     virtual XCamReturn setExposureParams(SmartPtr<RkAiqExpParamsProxy>& expPar);
116*4882a593Smuzhiyun     virtual XCamReturn getSensorModeData(const char* sns_ent_name,
117*4882a593Smuzhiyun                                  rk_aiq_exposure_sensor_descriptor& sns_des);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun     virtual XCamReturn handle_sof(int64_t time, uint32_t frameid);
120*4882a593Smuzhiyun     virtual int get_pixel(rk_aiq_exposure_sensor_descriptor* sns_des);
121*4882a593Smuzhiyun     virtual int get_blank(rk_aiq_exposure_sensor_descriptor* sns_des);
122*4882a593Smuzhiyun     virtual int get_exposure_range(rk_aiq_exposure_sensor_descriptor* sns_des);
123*4882a593Smuzhiyun     virtual int get_sensor_desc(rk_aiq_exposure_sensor_descriptor* sns_des);
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun     virtual XCamReturn get_sensor_descriptor (rk_aiq_exposure_sensor_descriptor* sns_des);
126*4882a593Smuzhiyun     virtual XCamReturn getEffectiveExpParams(SmartPtr<RkAiqSensorExpParamsProxy>& ExpParams, uint32_t frame_id);
127*4882a593Smuzhiyun     virtual XCamReturn set_working_mode(int mode);
128*4882a593Smuzhiyun     virtual XCamReturn set_exp_delay_info(int time_delay, int gain_delay, int hcg_lcg_mode_delay);
129*4882a593Smuzhiyun     virtual XCamReturn set_mirror_flip(bool mirror, bool flip, int32_t& skip_frame_sequence);
130*4882a593Smuzhiyun     virtual XCamReturn get_mirror_flip(bool& mirror, bool& flip);
131*4882a593Smuzhiyun     virtual XCamReturn start(bool prepared = false);
132*4882a593Smuzhiyun     virtual XCamReturn stop();
133*4882a593Smuzhiyun     virtual XCamReturn set_sync_mode(uint32_t mode);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun     virtual XCamReturn set_offline_effecting_exp_map(uint32_t sequence, rk_aiq_frame_info_t *offline_finfo);
136*4882a593Smuzhiyun     XCAM_DEAD_COPY (SensorHw);
137*4882a593Smuzhiyun protected:
138*4882a593Smuzhiyun     Mutex _mutex;
139*4882a593Smuzhiyun     int _working_mode;
140*4882a593Smuzhiyun     std::list<std::pair<SmartPtr<RkAiqSensorExpParamsProxy>, bool>> _exp_list;
141*4882a593Smuzhiyun     std::map<int, SmartPtr<RkAiqSensorExpParamsProxy>> _effecting_exp_map;
142*4882a593Smuzhiyun     bool _first;
143*4882a593Smuzhiyun     uint32_t _frame_sequence;
144*4882a593Smuzhiyun     rk_aiq_exposure_sensor_descriptor _sensor_desc;
145*4882a593Smuzhiyun     std::list<SmartPtr<RkAiqSensorExpParamsProxy>> _delayed_gain_list;
146*4882a593Smuzhiyun     std::list<SmartPtr<RkAiqSensorExpParamsProxy>> _delayed_dcg_gain_mode_list;
147*4882a593Smuzhiyun     SmartPtr<RkAiqSensorExpParamsProxy> _last_exp_time;
148*4882a593Smuzhiyun     SmartPtr<RkAiqSensorExpParamsProxy> _last_exp_gain;
149*4882a593Smuzhiyun     SmartPtr<RkAiqSensorExpParamsProxy> _last_dcg_gain_mode;
150*4882a593Smuzhiyun     int _gain_delay;
151*4882a593Smuzhiyun     int _time_delay;
152*4882a593Smuzhiyun     bool _gain_delayed;
153*4882a593Smuzhiyun     int _dcg_gain_mode_delay;
154*4882a593Smuzhiyun     bool _dcg_gain_mode_delayed;
155*4882a593Smuzhiyun     bool _dcg_gain_mode_with_time;
156*4882a593Smuzhiyun     bool _is_i2c_exp;
157*4882a593Smuzhiyun     SmartPtr<RkAiqSensorExpParamsPool> _expParamsPool;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun     enum {
160*4882a593Smuzhiyun         RK_EXP_UPDATE_TIME,
161*4882a593Smuzhiyun         RK_EXP_UPDATE_GAIN,
162*4882a593Smuzhiyun         RK_EXP_UPDATE_DCG,
163*4882a593Smuzhiyun     };
164*4882a593Smuzhiyun     typedef struct pending_split_exps_s {
165*4882a593Smuzhiyun         bool is_rk_exp_res;
166*4882a593Smuzhiyun         union {
167*4882a593Smuzhiyun             struct {
168*4882a593Smuzhiyun                 uint16_t line_length_pixels;
169*4882a593Smuzhiyun                 uint32_t frame_length_lines;
170*4882a593Smuzhiyun                 float pixel_clock_freq_mhz;
171*4882a593Smuzhiyun                 int   dcg_mode[3];
172*4882a593Smuzhiyun                 RkAiqExpSensorParam_t sensor_params[3];
173*4882a593Smuzhiyun                 uint32_t update_bits;
174*4882a593Smuzhiyun             } rk_exp_res;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun             struct {
177*4882a593Smuzhiyun                 unsigned int   nNumRegs;
178*4882a593Smuzhiyun                 unsigned int   RegAddr[MAX_I2CDATA_LEN];
179*4882a593Smuzhiyun                 unsigned int   RegValue[MAX_I2CDATA_LEN];
180*4882a593Smuzhiyun                 unsigned int   AddrByteNum[MAX_I2CDATA_LEN];
181*4882a593Smuzhiyun                 unsigned int   ValueByteNum[MAX_I2CDATA_LEN];
182*4882a593Smuzhiyun             } i2c_exp_res;
183*4882a593Smuzhiyun         };
184*4882a593Smuzhiyun     } pending_split_exps_t;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     std::map<uint32_t, pending_split_exps_t> _pending_spilt_map;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun     static uint16_t DEFAULT_POOL_SIZE;
189*4882a593Smuzhiyun     std::string _sns_entity_name;
190*4882a593Smuzhiyun     bool _mirror;
191*4882a593Smuzhiyun     bool _flip;
192*4882a593Smuzhiyun     bool _update_mirror_flip;
193*4882a593Smuzhiyun     int get_sensor_fps(float& fps);
194*4882a593Smuzhiyun     XCamReturn setLinearSensorExposure(RKAiqAecExpInfo_t* expPar);
195*4882a593Smuzhiyun     XCamReturn setHdrSensorExposure(RKAiqAecExpInfo_t* expPar);
196*4882a593Smuzhiyun     XCamReturn setLinearSensorExposure(pending_split_exps_t* expPar);
197*4882a593Smuzhiyun     XCamReturn setHdrSensorExposure(pending_split_exps_t* expPar);
198*4882a593Smuzhiyun     XCamReturn setExposure(uint32_t frameid);
199*4882a593Smuzhiyun     XCamReturn setSensorDpcc(Sensor_dpcc_res_t* SensorDpccInfo);
200*4882a593Smuzhiyun     XCamReturn composeExpParam( RKAiqAecExpInfo_t* timeValid, RKAiqAecExpInfo_t* gainValid, RKAiqAecExpInfo_t* dcgGainModeValid, RKAiqAecExpInfo_t* newExp);
201*4882a593Smuzhiyun     XCamReturn split_locked(SmartPtr<RkAiqSensorExpParamsProxy>& exp_param, uint32_t sof_id);
202*4882a593Smuzhiyun     XCamReturn handle_sof_internal(int64_t time, uint32_t frameid);
203*4882a593Smuzhiyun     XCamReturn setI2cDAta(pending_split_exps_t* exps);
204*4882a593Smuzhiyun     int get_nr_switch(rk_aiq_sensor_nr_switch_t* nr_switch);
205*4882a593Smuzhiyun     XCamReturn _set_mirror_flip();
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun };
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun } //namespace RkCam
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #endif
212