LOCAL uint32_t OV7690_Identify(uint32_t param) { #define OV7690_PID_VALUE 0x76 #define OV7690_PID_ADDR 0x0A #define OV7690_VER_VALUE 0x73 #define OV7690_VER_ADDR 0x0B uint32_t i; uint8_t ret; uint32_t err_cnt = 0; uint8_t reg[2] = {0x0A, 0x0B}; uint8_t value[2] = {0x76, 0x91}; for(i = 0; i<2; ) { //nLoop = 1000; ret = OV7690_ReadReg(reg[i]); if( ret != value[i]) { err_cnt++; if(err_cnt>3) { SENSOR_TRACE("Fail to OV7690_Identify: ret: %d, value[%d]: %d.\n", ret, i, value[i]); return SENSOR_FAIL; } else { //Masked by frank.yang,DCAM_Sleep() will cause a Assert when called in boot precedure //DCAM_Sleep(10); //while(nLoop--); msleep(10); continue; } } err_cnt = 0; i++; } SENSOR_TRACE("OV7690_Identify: it is OV7690.\n"); return 0; }
LOCAL uint32_t set_gc0309_video_mode(uint32_t mode) { if(0 == mode) GC0309_WriteReg(0xec,0x20); else if(1 == mode) GC0309_WriteReg(0xec,0x00); SENSOR_TRACE("SENSOR: GC0309_ReadReg(0xec) = %x\n", GC0309_ReadReg(0xec)); SENSOR_TRACE("SENSOR: set_video_mode: mode = %d\n", mode); return 0; }
LOCAL uint32_t set_gc0309_awb(uint32_t mode) { uint8_t awb_en_value; uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GC0309_awb_tab[mode]; awb_en_value = GC0309_ReadReg(0x22); if(mode>6) return 0; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) || (0xFF != sensor_reg_ptr[i].reg_value); i++) { if(0x22 == sensor_reg_ptr[i].reg_addr) { if(mode == 0) GC0309_WriteReg(0x22, awb_en_value |0x02 ); else GC0309_WriteReg(0x22, awb_en_value &0xfd ); } else { GC0309_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } } SENSOR_TRACE("SENSOR: set_awb_mode: mode = %d\n", mode); return 0; }
LOCAL uint8_t OV7690_ReadReg( uint8_t subaddr) { uint8_t value = 0; Sensor_ReadReg_8bits(subaddr, &value); SENSOR_TRACE("SENSOR: OV7690_ReadReg reg/value(%x,%x) !!\n", subaddr, value); return value; }
LOCAL uint32_t GC0328_BeforeSnapshot(uint32_t param) { uint16_t shutter = 0x00; uint16_t temp_reg = 0x00; uint16_t temp_r =0x00; uint16_t temp_g =0x00; uint16_t temp_b =0x00; BOOLEAN b_AEC_on; SENSOR_TRACE("GC0328_BeforeSnapshot "); printk("SENSOR: set flash on beforeSnapShot, g_flash_mode = %d \n", g_flash_mode_en); if (g_flash_mode_en) { //Sensor_SetFlash(0x11); // high light Sensor_SetFlash(1); } #if 0 if(GC0328_ReadReg(0X41) & 0x08 == 0x08) //AEC on b_AEC_on = SENSOR_TRUE; else b_AEC_on = SENSOR_FALSE; temp_reg = GC0328_ReadReg(0xdb); temp_r = GC0328_ReadReg(0xcd); temp_g = GC0328_ReadReg(0xce); temp_b = GC0328_ReadReg(0xcf); shutter = (GC0328_ReadReg(0x03)<<8) | (GC0328_ReadReg(0x04)&0x00ff) ; shutter = shutter /2; if(b_AEC_on) GC0328_WriteReg(0x41,GC0328_ReadReg(0x41) & 0xc5); //0x01); SENSOR_Sleep(300); ///12m Sensor_SetMCLK(12); GC0328_WriteReg(0x03,shutter/256); GC0328_WriteReg(0x04,shutter & 0x00ff); //SENSOR_TRACE("GC0328_BeforeSnapshot, temp_r=%x,temp_reg=%x, final = %x ",temp_r,temp_reg, temp_r*temp_reg/ 0x80); temp_r = (temp_r*temp_reg) / 0x80; temp_g = (temp_g*temp_reg) / 0x80; temp_b = (temp_b*temp_reg) / 0x80; if(b_AEC_on) { GC0328_WriteReg(0xcd, temp_r); GC0328_WriteReg(0xce, temp_g); GC0328_WriteReg(0xcf , temp_b); } //SENSOR_TRACE("GC0328_BeforeSnapshot, temp_r=%x,temp_g=%x, temp_b = %x ",temp_r,temp_g,temp_b); SENSOR_Sleep(300); #endif return 0; }
LOCAL uint32_t set_ov7675_ae_awb_enable(uint32_t ae_enable, uint32_t awb_enable) { unsigned char ae_value; ae_value=OV7675_ReadReg(AE_ENABLE); if(0x00==ae_enable) { ae_value&=0xfa; } else if(0x01==ae_enable) { ae_value|=0x05; } if(0x00==awb_enable) { ae_value&=0xfd; } else if(0x01==awb_enable) { ae_value|=0x02; } OV7675_WriteReg(AE_ENABLE,ae_value); SENSOR_TRACE("SENSOR: set_ae_awb_enable: ae=%d awb=%d", ae_enable, awb_enable); return 0; }
LOCAL uint32_t Set_GT2005_Video_Mode(uint32_t mode) { SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GT2005_video_mode_nor_tab[mode]; GT2005_Write_Group_Regs(sensor_reg_ptr ); SENSOR_TRACE("set_GT2005_video_mode=%d",mode); return 0; }
LOCAL uint32_t Set_GT2005_Anti_Flicker(uint32_t mode) { //PLL Setting 15FPS Under 19.5MHz PCLK Sensor_WriteReg(0x0116 , 0x01); Sensor_WriteReg(0x0118 , 0x34); Sensor_WriteReg(0x0119 , 0x01); Sensor_WriteReg(0x011a , 0x04); Sensor_WriteReg(0x011B , 0x01); Sensor_WriteReg(0x0313 , 0x34); Sensor_WriteReg(0x0314 , 0x3B); switch(mode) { case FLICKER_50HZ: Sensor_WriteReg(0x0315 , 0x16); break; case FLICKER_60HZ: Sensor_WriteReg(0x0315 , 0x56); break; default: return 0; } SENSOR_TRACE("set_GT2005_anti_flicker-mode=%d",mode); msleep(200); return 0; }
LOCAL uint32_t Set_GT2005_Image_Effect(uint32_t effect_type) { SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GT2005_image_effect_tab[effect_type]; SENSOR_ASSERT(PNULL != sensor_reg_ptr); GT2005_Write_Group_Regs(sensor_reg_ptr); SENSOR_TRACE("set_GT2005_image_effect: effect_type = %d", effect_type); return 0; }
LOCAL uint32_t _BF3905_set_video_mode(uint32_t mode) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = PNULL; uint8_t tempregval = 0; SENSOR_TRACE("SENSOR: set_video_mode: mode = %d\n", mode); return 0; }
LOCAL uint32_t Set_GT2005_Contrast(uint32_t level) { SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GT2005_contrast_tab[level]; SENSOR_ASSERT(PNULL != sensor_reg_ptr); GT2005_Write_Group_Regs(sensor_reg_ptr); SENSOR_TRACE("set_GT2005_contrast: level = %d", level); return 0; }
LOCAL uint32_t set_vmirror_enable(uint32_t enable) { uint8_t value = 0; value = GC0309_ReadReg(0x14); value = (value & 0xFD) | ((enable & 0x1) << 1); //portrait SENSOR_TRACE("set_vmirror_enable: enable = %d, 0x14: 0x%x.\n", enable, value); GC0309_WriteReg(0x14, value); return 0; }
LOCAL uint32_t set_hmirror_enable(uint32_t enable) { uint8_t value = 0; value = GC0309_ReadReg(0x14); value = (value & 0xFE) | (enable == 1 ? 0 : 1); //landscape SENSOR_TRACE("set_hmirror_enable: enable = %d, 0x14: 0x%x.\n", enable, value); GC0309_WriteReg(0x14, value); return 0; }
LOCAL uint32_t set_vmirror_enable(uint32_t enable) { uint8_t value = 0; value = OV7675_ReadReg(0x1e); value = (value & 0xEF) | (((enable == 1 ? 0 : 1)) << 4); //portrait SENSOR_TRACE("set_vmirror_enable: enable = %d, 0x1e: 0x%x.\n", enable, value); OV7675_WriteReg(0x1e, value); return 0; }
LOCAL uint32_t Set_GT2005_Brightness(uint32_t level) { SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GT2005_brightness_tab[level]; SENSOR_ASSERT(PNULL != sensor_reg_ptr); GT2005_Write_Group_Regs(sensor_reg_ptr); SENSOR_TRACE("set_GT2005_brightness: level = %d", level); return 0; }
LOCAL uint32_t set_hmirror_enable(uint32_t enable) { uint8_t value = 0; value = OV7675_ReadReg(0x1e); value = (value & 0xDF) | ((enable & 0x1) << 5); //landscape SENSOR_TRACE("set_hmirror_enable: enable = %d, 0x1e: 0x%x.\n", enable, value); OV7675_WriteReg(0x1e, value); return 0; }
LOCAL uint32_t Set_GT2005_AWB(uint32_t mode) { SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GT2005_awb_tab[mode]; SENSOR_ASSERT(PNULL != sensor_reg_ptr); GT2005_Write_Group_Regs(sensor_reg_ptr); msleep(100); SENSOR_TRACE("set_GT2005_awb_mode: mode = %d", mode); return 0; }
/**---------------------------------------------------------------------------* ** Function Definitions **---------------------------------------------------------------------------*/ LOCAL void GC0309_WriteReg( uint8_t subaddr, uint8_t data ) { #ifndef _USE_DSP_I2C_ Sensor_WriteReg_8bits(subaddr, data); #else DSENSOR_IICWrite((uint16_t)subaddr, (uint16_t)data); #endif SENSOR_TRACE("SENSOR: GC0309_WriteReg reg/value(%x,%x) !!\n", subaddr, data); }
LOCAL uint32_t GT2005_Before_Snapshot(uint32_t sensor_snapshot_mode) { switch(sensor_snapshot_mode) { case SENSOR_MODE_PREVIEW_ONE: //VGA SENSOR_TRACE("Capture VGA Size"); break; case SENSOR_MODE_SNAPSHOT_ONE_FIRST: // 1.3 M case SENSOR_MODE_SNAPSHOT_ONE_SECOND: // 2 M SENSOR_TRACE("Capture 1.3M&2M Size"); GT2005_Set_Shutter (); //PLL Setting 3FPS Under 10MHz PCLK Sensor_WriteReg(0x0119 , 0x02); break; default: break; } SENSOR_TRACE("SENSOR_GT2005: Before Snapshot"); return 0; }
LOCAL uint32_t OV7690_After_Snapshot(uint32_t param) {// Tim.zhu@20080520 for cr116612 modify the switch preview to capture #define PLL_ADDR 0x11 SENSOR_TRACE("OV7690_BeforeSnapshot: OV7690_After_Snapshot "); set_OV7690_ae_awb_enable(0x01, 0x01); OV7690_WriteReg(PLL_ADDR, 0x01); OV7690_WriteReg(0x2a, 0x30); DCAM_Sleep(200); // wait 2 frame the sensor working normal if no delay the lum is incorrect return 0; }
LOCAL uint32_t set_image_effect(uint32_t effect_type) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)ov7675_image_effect_tab[effect_type]; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) && (0xFF != sensor_reg_ptr[i].reg_value) ; i++) { OV7675_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } SENSOR_TRACE("SENSOR: set_image_effect: effect_type = %d", effect_type); return 0; }
LOCAL uint8_t GC0309_ReadReg( uint8_t subaddr) { uint8_t value = 0; #ifndef _USE_DSP_I2C_ value = Sensor_ReadReg( subaddr); #else value = (uint16_t)DSENSOR_IICRead((uint16_t)subaddr); #endif SENSOR_TRACE("SENSOR: GC0309_ReadReg reg/value(%x,%x) !!\n", subaddr, value); return value; }
LOCAL uint32_t OV7690_set_work_mode(uint32_t mode) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)OV7690_mode_tab[mode]; SENSOR_ASSERT(mode <= 1); SENSOR_ASSERT(PNULL != sensor_reg_ptr); for(i = 0; (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_TRACE("OV7690_set_work_mode: mode = %d", mode); return 0; }
LOCAL uint32_t GT2005_Identify(uint32_t param) { #define GT2005_ID_H_VALUE 0x51 #define GT2005_ID_L_VALUE 0x38 uint8_t id_h_value = 0; uint8_t id_l_value = 0; uint32_t ret_value = 0xFF; id_h_value = Sensor_ReadReg(0x0000); SENSOR_TRACE("GT2005_Identify-id_h_value %d.\n", id_h_value); id_l_value = Sensor_ReadReg(0x0001); SENSOR_TRACE("GT2005_Identify-id_l_value %d.\n", id_l_value); if((GT2005_ID_H_VALUE == id_h_value) && (GT2005_ID_L_VALUE == id_l_value)) { ret_value = 0; SENSOR_TRACE("It Is GT2005 Sensor !\n"); } return ret_value; }
LOCAL uint32_t set_image_effect(uint32_t effect_type) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GC0309_image_effect_tab[effect_type]; if(effect_type>7) return 0; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) || (0xFF != sensor_reg_ptr[i].reg_value) ; i++) { Sensor_WriteReg_8bits(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } SENSOR_TRACE("-----------set_image_effect: effect_type = %d------------\n", effect_type); return 0; }
LOCAL uint32_t set_brightness(uint32_t level) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)gc0309_brightness_tab[level]; if(level>6) return 0; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) && (0xFF != sensor_reg_ptr[i].reg_value); i++) { GC0309_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } SENSOR_TRACE("set_brightness: level = %d\n", level); return 0; }
LOCAL uint32_t set_ov7675_ev(uint32_t level) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)ov7675_ev_tab[level]; if(level>6) return 0; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) && (0xFF != sensor_reg_ptr[i].reg_value) ; i++) { OV7675_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } SENSOR_TRACE("SENSOR: set_ev: level = %d", level); return 0; }
LOCAL uint32_t set_gc0309_ev(uint32_t level) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)GC0309_ev_tab[level]; if(level>6) return 0; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) ||(0xFF != sensor_reg_ptr[i].reg_value) ; i++) { GC0309_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } SENSOR_TRACE("SENSOR: set_ev: level = %d\n", level); return 0; }
LOCAL uint32_t set_ov7675_awb(uint32_t mode) { uint16_t i; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)ov7675_awb_tab[mode]; if(mode > 6) return 0; for(i = 0; (0xFF != sensor_reg_ptr[i].reg_addr) && (0xFF != sensor_reg_ptr[i].reg_value); i++) { OV7675_WriteReg(sensor_reg_ptr[i].reg_addr, sensor_reg_ptr[i].reg_value); } Sensor_SetSensorExifInfo(SENSOR_EXIF_CTRL_LIGHTSOURCE, (uint32_t)mode); SENSOR_TRACE("SENSOR: set_awb_mode: mode = %d", mode); return 0; }
LOCAL uint32_t set_ov7675_ae_enable(uint32_t enable) { unsigned char ae_value; ae_value=OV7675_ReadReg(AE_ENABLE); if(0x00==enable) { ae_value&=0xfa; OV7675_WriteReg(AE_ENABLE,ae_value); } else if(0x01==enable) { ae_value|=0x05; OV7675_WriteReg(AE_ENABLE,ae_value); } SENSOR_TRACE("SENSOR: set_ae_enable: enable = %d", enable); return 0; }