android—camera从应用到驱动——驱动代码
2016-05-24 21:18
1056 查看
下面是展讯平台一个camera_gc5004的驱动代码: 所做的工作主要有: 1、camera上电_gc5004_mipi_PowerOn 2、识别camera型号_gc5004_mipi_Identify 3、硬件寄存器相关的设置 4、为kernel系统提供函数接口g_gc5004_mipi_raw_info #include <utils/Log.h> #include "sensor.h" #include "jpeg_exif_header.h" #include "sensor_drv_u.h" #include "sensor_raw.h" #include "sensor_gc5004_mipi_raw_param.c" #define SENSOR_PRINT CMR_LOGE #define DW9714_VCM_SLAVE_ADDR (0x18>>1) #define gc5004_mipi_I2C_ADDR_W 0x36 #define gc5004_mipi_I2C_ADDR_R 0x36 #define gc5004_mipi_RAW_PARAM_COM 0x0000 static int s_gc5004_mipi_gain = 0; static int s_capture_shutter = 0; static int s_capture_VTS = 0; static int s_video_min_framerate = 0; static int s_video_max_framerate = 0; LOCAL uint32_t _gc5004_mipi_GetResolutionTrimTab(uint32_t param); LOCAL uint32_t _gc5004_mipi_PowerOn(uint32_t power_on); /*上电函数*/ LOCAL uint32_t _gc5004_mipi_Identify(uint32_t param); /*读取ID函数*/ LOCAL uint32_t _gc5004_mipi_BeforeSnapshot(uint32_t param); LOCAL uint32_t _gc5004_mipi_after_snapshot(uint32_t param); LOCAL uint32_t _gc5004_mipi_StreamOn(uint32_t param); LOCAL uint32_t _gc5004_mipi_StreamOff(uint32_t param); LOCAL uint32_t _gc5004_mipi_write_exposure(uint32_t param); LOCAL uint32_t _gc5004_mipi_write_gain(uint32_t param); LOCAL uint32_t _gc5004_mipi_write_af(uint32_t param); LOCAL uint32_t _gc5004_mipi_flash(uint32_t param); LOCAL uint32_t _gc5004_mipi_ExtFunc(uint32_t ctl_param); LOCAL uint32_t _gc5004_mipi_get_VTS(void); LOCAL uint32_t _gc5004_mipi_set_VTS(int VTS); LOCAL uint32_t _gc5004_mipi_ReadGain(uint32_t param); LOCAL uint32_t _gc5004_mipi_set_video_mode(uint32_t param); LOCAL uint32_t _gc5004_mipi_get_shutter(void); LOCAL uint32_t _dw9174_SRCInit(uint32_t mode); LOCAL uint32_t _gc5004_mipi_com_Identify_otp(void* param_ptr); LOCAL const struct raw_param_info_tab s_gc5004_mipi_raw_param_tab[]={ {gc5004_mipi_RAW_PARAM_COM, &s_gc5004_mipi_raw_info, _gc5004_mipi_com_Identify_otp, PNULL}, {RAW_INFO_END_ID, PNULL, PNULL, PNULL} }; struct sensor_raw_info* s_gc5004_mipi_raw_info_ptr=NULL; static uint32_t g_module_id = 0; static uint32_t g_flash_mode_en = 0; static uint32_t g_af_slewrate = 1; LOCAL const SENSOR_REG_T gc5004_mipi_common_init[] = { //...... {0x04, 0x40}, {0x05, 0x01}, //...... }; LOCAL const SENSOR_REG_T gc5004_mipi_2592X1944_mipi_raw[] = { //...... {0x18, 0x02},//skip on //...... }; LOCAL SENSOR_REG_TAB_INFO_T s_gc5004_mipi_resolution_Tab_RAW[] = { {ADDR_AND_LEN_OF_ARRAY(gc5004_mipi_common_init), 0, 0, 24, SENSOR_IMAGE_FORMAT_RAW}, {ADDR_AND_LEN_OF_ARRAY(gc5004_mipi_1296X972_mipi_raw), 1296, 972, 24, SENSOR_IMAGE_FORMAT_RAW}, {ADDR_AND_LEN_OF_ARRAY(gc5004_mipi_2592X1944_mipi_raw), 2592, 1944, 24, SENSOR_IMAGE_FORMAT_RAW}, }; LOCAL SENSOR_TRIM_T s_gc5004_mipi_Resolution_Trim_Tab[] = { {0, 0, 0, 0, 0, 0, {0, 0, 0, 0}}, {0, 0, 1296, 972, 200, 480, 1000, {0, 0, 1296, 972}},//sysclk*10 {0, 0, 2592, 1944, 500, 480, 1972, {0, 0, 2592, 1944}},//sysclk*10 }; LOCAL const SENSOR_REG_T s_gc5004_mipi_1296X972_video_tab[SENSOR_VIDEO_MODE_MAX][1] = { /*video mode 0: ?fps*/ { {0xff, 0xff} }, }; LOCAL const SENSOR_REG_T s_gc5004_mipi_2592X1944_video_tab[SENSOR_VIDEO_MODE_MAX][1] = { /*video mode 0: ?fps*/ { {0xff, 0xff} }, }; LOCAL SENSOR_VIDEO_INFO_T s_gc5004_mipi_video_info[] = { {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, PNULL}, {{{30, 30, 200, 64}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},(SENSOR_REG_T**)s_gc5004_mipi_1296X972_video_tab}, {{{15, 15, 500, 64}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},(SENSOR_REG_T**)s_gc5004_mipi_2592X1944_video_tab}, {{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, PNULL}, }; LOCAL uint32_t _gc5004_mipi_set_video_mode(uint32_t param) { SENSOR_REG_T_PTR sensor_reg_ptr; uint16_t i = 0x00; uint32_t mode; if (param >= SENSOR_VIDEO_MODE_MAX) return 0; if (SENSOR_SUCCESS != Sensor_GetMode(&mode)) { SENSOR_PRINT("fail."); return SENSOR_FAIL; } if (PNULL == s_gc5004_mipi_video_info[mode].setting_ptr) { SENSOR_PRINT("fail."); return SENSOR_FAIL; } sensor_reg_ptr = (SENSOR_REG_T_PTR)&s_gc5004_mipi_video_info[mode].setting_ptr[param]; if (PNULL == sensor_reg_ptr) { SENSOR_PRINT("fail."); return SENSOR_FAIL; } for (i=0x00; (0xff!=sensor_reg_ptr[i].reg_addr)||(0xff!=sensor_reg_ptr[i].reg_value); i++) { Sensor_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } SENSOR_PRINT("0x%02x", param); return 0; } LOCAL SENSOR_IOCTL_FUNC_TAB_T s_gc5004_mipi_ioctl_func_tab = { PNULL, _gc5004_mipi_PowerOn, //上电 PNULL, _gc5004_mipi_Identify, //读取id _gc5004_mipi_GetResolutionTrimTab, _gc5004_mipi_BeforeSnapshot, _gc5004_mipi_after_snapshot, PNULL, //_gc5004_mipi_flash, PNULL, _gc5004_mipi_write_exposure, PNULL, _gc5004_mipi_write_gain, PNULL, PNULL, _gc5004_mipi_write_af, //对焦函数 PNULL, PNULL, //_gc5004_mipi_GetExifInfo, _gc5004_mipi_ExtFunc, PNULL, //_gc5004_mipi_set_anti_flicker, _gc5004_mipi_StreamOn, //打开camera函数 _gc5004_mipi_StreamOff, //关闭camera函数 PNULL, }; SENSOR_INFO_T g_gc5004_mipi_raw_info = { //外部调用接口 gc5004_mipi_I2C_ADDR_W, // salve i2c write address gc5004_mipi_I2C_ADDR_R, // salve i2c read address SENSOR_I2C_REG_8BIT | SENSOR_I2C_REG_8BIT, // bit0: 0: i2c register value is 8 bit, 1: i2c register value is 16 bit // bit1: 0: i2c register addr is 8 bit, 1: i2c register addr is 16 bit // other bit: reseved SENSOR_HW_SIGNAL_PCLK_N | SENSOR_HW_SIGNAL_VSYNC_N | SENSOR_HW_SIGNAL_HSYNC_P, // bit0: 0:negative; 1:positive -> polarily of pixel clock // bit2: 0:negative; 1:positive -> polarily of horizontal synchronization signal // bit4: 0:negative; 1:positive -> polarily of vertical synchronization signal // other bit: reseved // preview mode SENSOR_ENVIROMENT_NORMAL | SENSOR_ENVIROMENT_NIGHT, // image effect SENSOR_IMAGE_EFFECT_NORMAL | SENSOR_IMAGE_EFFECT_BLACKWHITE | SENSOR_IMAGE_EFFECT_RED | SENSOR_IMAGE_EFFECT_GREEN | SENSOR_IMAGE_EFFECT_BLUE | SENSOR_IMAGE_EFFECT_YELLOW | SENSOR_IMAGE_EFFECT_NEGATIVE | SENSOR_IMAGE_EFFECT_CANVAS, // while balance mode 0, 7, // bit[0:7]: count of step in brightness, contrast, sharpness, saturation // bit[8:31] reseved SENSOR_LOW_PULSE_RESET, // reset pulse level 50, // reset pulse width(ms) SENSOR_HIGH_LEVEL_PWDN, // 1: high level valid; 0: low level valid 1, // count of identify code {{0xf0, 0x50}, // supply two code to identify sensor. {0xf1, 0x04}}, // for Example: index = 0-> Device id, index = 1 -> version id SENSOR_AVDD_2800MV, // voltage of avdd 2592, // max width of source image 1944, // max height of source image "gc5004_mipi", // name of sensor SENSOR_IMAGE_FORMAT_RAW, // define in SENSOR_IMAGE_FORMAT_E enum,SENSOR_IMAGE_FORMAT_MAX // if set to SENSOR_IMAGE_FORMAT_MAX here, image format depent on SENSOR_REG_TAB_INFO_T SENSOR_IMAGE_PATTERN_RAWRGB_B,// pattern of input image form sensor; s_gc5004_mipi_resolution_Tab_RAW, // point to resolution table information structure &s_gc5004_mipi_ioctl_func_tab, // point to ioctl function table &s_gc5004_mipi_raw_info_ptr, // information and table about Rawrgb sensor NULL, //&g_gc5004_mipi_ext_info, // extend information about sensor SENSOR_AVDD_1800MV, // iovdd SENSOR_AVDD_1500MV, // dvdd 3, // skip frame num before preview 打开camera到预览跳过得帧数 1, // skip frame num before capture 打开camera拍照览跳过得帧数 0, // deci frame num during preview 0, // deci frame num during video preview 0, 0, 0, 0, 0, {SENSOR_INTERFACE_TYPE_CSI2, 2, 10, 0}, s_gc5004_mipi_video_info, 3, // skip frame num while change setting }; LOCAL struct sensor_raw_info* Sensor_GetContext(void) { 4000 return s_gc5004_mipi_raw_info_ptr; } LOCAL uint32_t Sensor_gc5004_mipi_InitRawTuneInfo(void) { uint32_t rtn=0x00; struct sensor_raw_info* raw_sensor_ptr=Sensor_GetContext(); struct sensor_raw_tune_info* sensor_ptr=raw_sensor_ptr->tune_ptr; struct sensor_raw_cali_info* cali_ptr=raw_sensor_ptr->cali_ptr; raw_sensor_ptr->version_info->version_id=0x00010000; raw_sensor_ptr->version_info->srtuct_size=sizeof(struct sensor_raw_info); return rtn; } LOCAL uint32_t _gc5004_mipi_GetResolutionTrimTab(uint32_t param) { SENSOR_PRINT("0x%x", (uint32_t)s_gc5004_mipi_Resolution_Trim_Tab); return (uint32_t) s_gc5004_mipi_Resolution_Trim_Tab; } LOCAL uint32_t _gc5004_mipi_PowerOn(uint32_t power_on) /*上电函数*/ { SENSOR_AVDD_VAL_E dvdd_val = g_gc5004_mipi_raw_info.dvdd_val; SENSOR_AVDD_VAL_E avdd_val = g_gc5004_mipi_raw_info.avdd_val; SENSOR_AVDD_VAL_E iovdd_val = g_gc5004_mipi_raw_info.iovdd_val; BOOLEAN power_down = g_gc5004_mipi_raw_info.power_down_level; BOOLEAN reset_level = g_gc5004_mipi_raw_info.reset_pulse_level; if (SENSOR_TRUE == power_on) {//上电时序 Sensor_PowerDown(power_down); // Open power Sensor_SetMonitorVoltage(SENSOR_AVDD_2800MV); Sensor_SetVoltage(dvdd_val, avdd_val, iovdd_val); Sensor_SetMonitorVoltage(SENSOR_AVDD_2800MV); usleep(20*1000); _dw9174_SRCInit(2); Sensor_SetMCLK(SENSOR_DEFALUT_MCLK); usleep(10*1000); Sensor_PowerDown(!power_down); // Reset sensor Sensor_Reset(reset_level); usleep(10*1000); } else { Sensor_PowerDown(power_down); Sensor_SetMCLK(SENSOR_DISABLE_MCLK); Sensor_SetVoltage(SENSOR_AVDD_CLOSED, SENSOR_AVDD_CLOSED, SENSOR_AVDD_CLOSED); Sensor_SetMonitorVoltage(SENSOR_AVDD_CLOSED); } SENSOR_PRINT("SENSOR_gc5004_mipi: _gc5004_mipi_Power_On(1:on, 0:off): %d", power_on); return SENSOR_SUCCESS; } LOCAL uint32_t _gc5004_mipi_cfg_otp(uint32_t param) { uint32_t rtn=SENSOR_SUCCESS; struct raw_param_info_tab* tab_ptr = (struct raw_param_info_tab*)s_gc5004_mipi_raw_param_tab; uint32_t module_id=g_module_id; SENSOR_PRINT("SENSOR_gc5004_mipi: _gc5004_mipi_cfg_otp"); if(PNULL!=tab_ptr[module_id].cfg_otp){ tab_ptr[module_id].cfg_otp(0); } return rtn; } LOCAL uint32_t _gc5004_mipi_com_Identify_otp(void* param_ptr) { uint32_t rtn=SENSOR_FAIL; uint32_t param_id; SENSOR_PRINT("SENSOR_gc5004_mipi: _gc5004_mipi_com_Identify_otp1111111111111111"); /*read param id from sensor omap*/ param_id=gc5004_mipi_RAW_PARAM_COM; if(gc5004_mipi_RAW_PARAM_COM==param_id){ rtn=SENSOR_SUCCESS ; } rtn=SENSOR_SUCCESS ; return rtn; } LOCAL uint32_t _gc5004_mipi_GetRawInof(void) { uint32_t rtn=SENSOR_SUCCESS; struct raw_param_info_tab* tab_ptr = (struct raw_param_info_tab*)s_gc5004_mipi_raw_param_tab; uint32_t param_id; uint32_t i=0x00; /*read param id from sensor omap*/ param_id=gc5004_mipi_RAW_PARAM_COM; for(i=0x00; ; i++) { g_module_id = i; if(RAW_INFO_END_ID==tab_ptr[i].param_id){ if(NULL==s_gc5004_mipi_raw_info_ptr){ SENSOR_PRINT("SENSOR_gc5004_mipi: ov5647_GetRawInof no param error"); rtn=SENSOR_FAIL; } SENSOR_PRINT("SENSOR_gc5004_mipi: gc5004_mipi_GetRawInof end"); break; } else if(PNULL!=tab_ptr[i].identify_otp){ if(SENSOR_SUCCESS==tab_ptr[i].identify_otp(0)) { s_gc5004_mipi_raw_info_ptr = tab_ptr[i].info_ptr; SENSOR_PRINT("SENSOR_gc5004_mipi: gc5004_mipi_GetRawInof success"); break; } } } return rtn; } LOCAL uint32_t _gc5004_mipi_GetMaxFrameLine(uint32_t index) { uint32_t max_line=0x00; SENSOR_TRIM_T_PTR trim_ptr=s_gc5004_mipi_Resolution_Trim_Tab; max_line=trim_ptr[index].frame_line; return max_line; } LOCAL uint32_t _gc5004_mipi_Identify(uint32_t param) { #define gc5004_mipi_PID_VALUE 0x50 #define gc5004_mipi_PID_ADDR 0xf0 #define gc5004_mipi_VER_VALUE 0x04 #define gc5004_mipi_VER_ADDR 0xf1 uint8_t pid_value = 0x00; uint8_t ver_value = 0x00; uint32_t ret_value = SENSOR_FAIL; SENSOR_PRINT("SENSOR_gc5004_mipi: mipi raw identify\n"); pid_value = Sensor_ReadReg(gc5004_mipi_PID_ADDR); if (gc5004_mipi_PID_VALUE == pid_value) { ver_value = Sensor_ReadReg(gc5004_mipi_VER_ADDR);//读取ID SENSOR_PRINT("SENSOR_gc5004_mipi: Identify: PID = %x, VER = %x", pid_value, ver_value); if (gc5004_mipi_VER_VALUE == ver_value) { //判断读取的id是否正确 ret_value=_gc5004_mipi_GetRawInof(); Sensor_gc5004_mipi_InitRawTuneInfo(); ret_value = SENSOR_SUCCESS; SENSOR_PRINT("SENSOR_gc5004_mipi: this is gc5004_mipi sensor !"); } else { SENSOR_PRINT ("SENSOR_gc5004_mipi: Identify this is GC%x%x sensor !", pid_value, ver_value); } } else { SENSOR_PRINT("SENSOR_gc5004_mipi: identify fail,pid_value=%x", pid_value); } return ret_value;//返回ID是否读取正确 } LOCAL uint32_t _gc5004_mipi_write_exposure(uint32_t param) { uint32_t ret_value = SENSOR_SUCCESS; uint16_t expsure_line=0x00; uint16_t dummy_line=0x00; uint16_t shutter_temp=0x00; SENSOR_PRINT("gc5004_mipi_Write_line param_exp = %d \n",param); expsure_line=param&0xffff; dummy_line=(param>>0x10)&0xffff; SENSOR_PRINT("gc5004_mipi_Write_line dummy_line = %d \n",dummy_line ); if (!expsure_line) expsure_line = 4; /* avoid 0 */ if(expsure_line < 4) expsure_line = 4; if(expsure_line > 8191) expsure_line = 8191;//2 ^ 13 //Update Shutter expsure_line = expsure_line/4; expsure_line = expsure_line*4; shutter_temp = expsure_line%4; if(shutter_temp >2) expsure_line+=4; SENSOR_PRINT("gc5004_mipi_Write_line 5004line = %d \n",expsure_line); ret_value = Sensor_WriteReg(0x04, (expsure_line) & 0xFF); ret_value = Sensor_WriteReg(0x03, (expsure_line >> 8) & 0x1F); return ret_value; } LOCAL uint32_t _gc5004_mipi_write_gain(uint32_t param) { uint32_t ret_value = SENSOR_SUCCESS; uint16_t temp=0x00; uint32_t real_gain = 0; SENSOR_PRINT("_gc5004_mipi raw _write_gain param = %d \n",param); real_gain = ((param&0xf)+16)*(((param>>4)&0x01)+1)*(((param>>5)&0x01)+1)*(((param>>6)&0x01)+1)*(((param>>7)&0x01)+1); real_gain = real_gain*(((param>>8)&0x01)+1)*(((param>>9)&0x01)+1)*(((param>>10)&0x01)+1)*(((param>>11)&0x01)+1); real_gain <<= 2; SENSOR_PRINT("_gc5004_mipi raw _write_gain real_gain = %d \n",real_gain); Sensor_WriteReg(0xfe, 0x00); Sensor_WriteReg(0xb6, 0x00); Sensor_WriteReg(0xb1, 0x01); Sensor_WriteReg(0xb2, 0x00); if(real_gain < 64) { real_gain = 64; Sensor_WriteReg(0xb6, 0x00); Sensor_WriteReg(0xb1, 0x01); Sensor_WriteReg(0xb2, 0x00); } else if ((64 <= real_gain)&(real_gain < 90)) { Sensor_WriteReg(0xb6, 0x00); temp = real_gain; SENSOR_PRINT("_gc5004_mipi_write_gain_1 temp = %d \n",temp); Sensor_WriteReg(0xb1, temp>>6); Sensor_WriteReg(0xb2, (temp<<2)&0xfc); } else if ((90 <= real_gain)&(real_gain < 128)) { Sensor_WriteReg(0xb6, 0x01); temp = 64*real_gain/90; SENSOR_PRINT("_gc5004_mipi_write_gain_2 temp = %d \n",temp); Sensor_WriteReg(0xb1, temp>>6); Sensor_WriteReg(0xb2, (temp<<2)&0xfc); } else if ((128 <= real_gain)&(real_gain < 178)) { Sensor_WriteReg(0xb6, 0x02); temp = 64*real_gain/128; SENSOR_PRINT("_gc5004_mipi_write_gain_3 temp = %d \n",temp); Sensor_WriteReg(0xb1, temp>>6); Sensor_WriteReg(0xb2, (temp<<2)&0xfc); } else if ((178 <= real_gain)&(real_gain < 247)) { Sensor_WriteReg(0xb6, 0x03); temp = 64*real_gain/178; SENSOR_PRINT("_gc5004_mipi_write_gain_4 temp = %d \n",temp); Sensor_WriteReg(0xb1, temp>>6); Sensor_WriteReg(0xb2, (temp<<2)&0xfc); } else if (247 <= real_gain) { Sensor_WriteReg(0xb6, 0x04); temp = 64*real_gain/247; SENSOR_PRINT("_gc5004_mipi_write_gain_5 temp = %d \n",temp); Sensor_WriteReg(0xb1, temp>>6); Sensor_WriteReg(0xb2, (temp<<2)&0xfc); } return ret_value; } LOCAL uint32_t _gc5004_mipi_write_af(uint32_t param) { uint32_t ret_value = SENSOR_SUCCESS; uint16_t slave_addr = DW9714_VCM_SLAVE_ADDR; uint16_t cmd_len = 0; uint8_t cmd_val[2] = {0x00}; cmd_val[0] = ((param&0xfff0)>>4) & 0x3f; cmd_val[1] = ((param&0x0f)<<4) & 0xf0; cmd_len = 2; ret_value = Sensor_WriteI2C(slave_addr,(uint8_t*)&cmd_val[0], cmd_len); SENSOR_PRINT("SENSOR_Gc5004: _write_af, ret = %d, param = %d, MSL:%x, LSL:%x\n", ret_value, param, cmd_val[0], cmd_val[1]); return ret_value; } LOCAL uint32_t _gc5004_mipi_PreBeforeSnapshot(uint32_t param) { uint32_t cap_shutter,prv_shutter; uint32_t shutter_h,shutter_l,shutter; SENSOR_PRINT("_gc5004_mipi_PreBeforeSnapshot param :%d",param); if(SENSOR_MODE_PREVIEW_ONE>= param){ SENSOR_PRINT("SENSOR_gc5004_mipi:preview equal to capture"); return SENSOR_SUCCESS; } shutter_l = (uint8_t)Sensor_ReadReg(0x04); shutter_h = (uint8_t)Sensor_ReadReg(0x03); shutter = ((shutter_h<<8)&0x1F00)|(shutter_l&0xFF); SENSOR_PRINT("SENSOR_gc5004_mipi_PreBeforeSnapshot prv_shutter = %d",shutter); prv_shutter = shutter; Sensor_SetMode(param); cap_shutter = shutter*2/5; SENSOR_PRINT("SENSOR_gc5004_mipi_PreBeforeSnapshot cap_shutter = %d",cap_shutter); if(!cap_shutter)cap_shutter=1; if(cap_shutter<1)cap_shutter=1; if(cap_shutter>8191)cap_shutter=8191; Sensor_WriteReg(0x04,cap_shutter&0xFF); Sensor_WriteReg(0x03,(cap_shutter>>8)&0x1F); // usleep(100*1000); //Sensor_StreamOff(); return SENSOR_SUCCESS; } LOCAL uint32_t _gc5004_mipi_BeforeSnapshot(uint32_t param) { uint32_t cap_mode = (param >> CAP_MODE_BITS); uint32_t rtn = SENSOR_SUCCESS; param = param & 0xffff; rtn = _gc5004_mipi_PreBeforeSnapshot(param); SENSOR_PRINT("_gc5004_mipi_BeforeSnapshot+++++++++++++++++ param = %d",param); return rtn; } LOCAL uint32_t _gc5004_mipi_after_snapshot(uint32_t param) { SENSOR_PRINT("SENSOR_gc5004_mipi: after_snapshot mode:%d", param); Sensor_SetMode(param); return SENSOR_SUCCESS; } #if 0 LOCAL uint32_t _gc5004_mipi_flash(uint32_t param) { SENSOR_PRINT("SENSOR_gc5004_mipi: param=%d", param); g_flash_mode_en = param; Sensor_SetFlash(param); SENSOR_PRINT_HIGH("end"); return SENSOR_SUCCESS; } #endif LOCAL uint32_t _gc5004_mipi_StreamOn(uint32_t param) { SENSOR_PRINT("SENSOR_gc5004_mipi: StreamOn"); usleep(50*1000); Sensor_WriteReg(0xfe, 0x03); Sensor_WriteReg(0x10, 0x91); Sensor_WriteReg(0xfe, 0x00); usleep(50*1000); return 0; } LOCAL uint32_t _gc5004_mipi_StreamOff(uint32_t param) { SENSOR_PRINT("SENSOR_gc5004_mipi: StreamOff"); usleep(50*1000); Sensor_WriteReg(0xfe, 0x03); Sensor_WriteReg(0x10, 0x81); Sensor_WriteReg(0xfe, 0x00); usleep(50*1000); return 0; } static uint32_t _gc5004_mipi_SetEV(uint32_t param) { uint32_t rtn = SENSOR_SUCCESS; return rtn; } LOCAL uint32_t _gc5004_mipi_ExtFunc(uint32_t ctl_param) { uint32_t rtn = SENSOR_SUCCESS; SENSOR_EXT_FUN_PARAM_T_PTR ext_ptr = (SENSOR_EXT_FUN_PARAM_T_PTR) ctl_param; SENSOR_PRINT_HIGH("0x%x", ext_ptr->cmd); switch (ext_ptr->cmd) { case SENSOR_EXT_FUNC_INIT: break; case SENSOR_EXT_FOCUS_START: break; case SENSOR_EXT_EXPOSURE_START: break; case SENSOR_EXT_EV: rtn = _gc5004_mipi_SetEV(ctl_param); break; default: break; } return rtn; } LOCAL uint32_t _dw9174_SRCInit(uint32_t mode) { uint8_t cmd_val[2] = {0x00}; uint16_t slave_addr = 0; uint16_t cmd_len = 0; uint32_t ret_value = SENSOR_SUCCESS; int i = 0; slave_addr = DW9714_VCM_SLAVE_ADDR; SENSOR_PRINT("SENSOR_Gc5004: _DW9714A_SRCInit: mode = %d\n", mode); switch (mode) { case 1: break; case 2: { cmd_val[0] = 0xec; cmd_val[1] = 0xa3; cmd_len = 2; ret_value = Sensor_WriteI2C(slave_addr,(uint8_t*)&cmd_val[0], cmd_len); cmd_val[0] = 0xa1; cmd_val[1] = 0x0e; cmd_len = 2; ret_value = Sensor_WriteI2C(slave_addr,(uint8_t*)&cmd_val[0], cmd_len); cmd_val[0] = 0xf2; cmd_val[1] = 0x90; cmd_len = 2; ret_value = Sensor_WriteI2C(slave_addr,(uint8_t*)&cmd_val[0], cmd_len); cmd_val[0] = 0xdc; cmd_val[1] = 0x51; cmd_len = 2; ret_value = Sensor_WriteI2C(slave_addr,(uint8_t*)&cmd_val[0], cmd_len); } break; case 3: break; } return ret_value; } LOCAL uint32_t _gc5004_mipi_ReadGain(uint32_t param) { uint32_t rtn = SENSOR_SUCCESS; return rtn; }
相关文章推荐
- 神器SystemTap
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Sql Server中REPLACE函数的使用