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