android—camera从应用到驱动——驱动代码

来源:互联网 发布:js刷新整个页面 编辑:程序博客网 时间:2024/05/17 02:16
    下面是展讯平台一个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  0x0000static 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 addressgc5004_mipi_I2C_ADDR_R,// salve i2c read addressSENSOR_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: resevedSENSOR_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 modeSENSOR_ENVIROMENT_NORMAL | SENSOR_ENVIROMENT_NIGHT,// image effectSENSOR_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 mode0,7,// bit[0:7]: count of step in brightness, contrast, sharpness, saturation// bit[8:31] resevedSENSOR_LOW_PULSE_RESET,// reset pulse level50,// reset pulse width(ms)SENSOR_HIGH_LEVEL_PWDN,// 1: high level valid; 0: low level valid1,// count of identify code{{0xf0, 0x50},// supply two code to identify sensor. {0xf1, 0x04}},// for Example: index = 0-> Device id, index = 1 -> version idSENSOR_AVDD_2800MV,// voltage of avdd2592,// max width of source image1944,// max height of source image"gc5004_mipi",// name of sensorSENSOR_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_TSENSOR_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 sensorNULL,//&g_gc5004_mipi_ext_info,                // extend information about sensorSENSOR_AVDD_1800MV,// iovddSENSOR_AVDD_1500MV,// dvdd3,// skip frame num before preview  打开camera到预览跳过得帧数1,// skip frame num before capture  打开camera拍照览跳过得帧数0,// deci frame num during preview0,// deci frame num during video preview0,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){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 powerSensor_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 sensorSensor_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     0xf1uint8_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);//读取IDSENSOR_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 Shutterexpsure_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 0LOCAL 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;}#endifLOCAL 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;}

0 0