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