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