LOCAL uint32_t OV9660_Identify(uint32_t param) { #define OV9660_PID_VALUE 0x96 #define OV9660_PID_ADDR 0x0A #define OV9660_VER_VALUE 0x63 #define OV9660_VER_ADDR 0x0B uint8_t pid_value = 0; uint8_t ver_value = 0; BOOLEAN ret_value = 0XFF; pid_value = Sensor_ReadReg(OV9660_PID_ADDR); // Get Version Code ver_value = Sensor_ReadReg(OV9660_VER_ADDR); if(OV9660_PID_VALUE == pid_value) { // Get Device Code if(OV9660_VER_VALUE == ver_value) { SENSOR_PRINT("That is OV9660 sensor !"); } else { SENSOR_PRINT("OV9660_Identify: That is OV%x%x sensor !", pid_value, ver_value); } ret_value = 0; } SENSOR_PRINT("OV9660_Identify: PID = %x, VER = %x",pid_value, ver_value); return (uint32_t)ret_value; }
LOCAL uint32_t _ov8830_Identify(uint32_t param) { #define ov8830_PID_VALUE 0x88 #define ov8830_PID_ADDR 0x300A #define ov8830_VER_VALUE 0x30 #define ov8830_VER_ADDR 0x300B uint8_t pid_value = 0x00; uint8_t ver_value = 0x00; uint32_t ret_value = SENSOR_FAIL; SENSOR_PRINT("SENSOR_ov8830: mipi raw identify\n"); pid_value = Sensor_ReadReg(ov8830_PID_ADDR); if (ov8830_PID_VALUE == pid_value) { ver_value = Sensor_ReadReg(ov8830_VER_ADDR); SENSOR_PRINT("SENSOR_ov8830: Identify: PID = %x, VER = %x", pid_value, ver_value); if (ov8830_VER_VALUE == ver_value) { Sensor_InitRawTuneInfo(); ret_value = SENSOR_SUCCESS; SENSOR_PRINT("SENSOR_ov8830: this is ov8830 sensor !"); } else { SENSOR_PRINT("SENSOR_ov8830: Identify this is OV%x%x sensor !", pid_value, ver_value); } } else { SENSOR_PRINT("SENSOR_ov8830: identify fail,pid_value=%d", pid_value); } return ret_value; }
LOCAL uint8_t OV7675_ReadReg( uint8_t subaddr) { uint8_t value = 0; value = Sensor_ReadReg(subaddr); //SENSOR_TRACE("SENSOR: OV7675_ReadReg reg/value(%x,%x) !!\n", subaddr, value); return value; }
LOCAL uint8_t SP0A19_ReadReg( uint8_t subaddr) { uint8_t value = 0; //I2C_WriteCmdArr(SP0A19_I2C_ADDR_W, &subaddr, 1, SCI_TRUE); //I2C_ReadCmd(SP0A19_I2C_ADDR_R, &value, SCI_TRUE); //SENSOR_PRINTK( "SP0A19 read ret is %X=%X",subaddr,value ); value = Sensor_ReadReg( subaddr); return value; }
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 OV9660_set_ae_enable(uint32_t enable) { unsigned char value; SENSOR_PRINT("OV9660_set_ae_enable: enable = %d", enable); value = Sensor_ReadReg(0x13); value &= 0xFE; value |= enable; Sensor_WriteReg(0x13, value); return 0; }
LOCAL uint32_t _BF3905_Identify(uint32_t param) { #define BF3905_PID_VALUE 0x39 #define BF3905_PID_ADDR 0xFC #define BF3905_VER_VALUE 0x05 #define BF3905_VER_ADDR 0xFD uint8_t pid_value=0x00; uint8_t ver_value=0x00; uint32_t ret_value=SENSOR_FAIL; CMR_LOGE("SENSOR:BF3905 identify .\n"); pid_value = Sensor_ReadReg(BF3905_PID_ADDR); if(BF3905_PID_VALUE==pid_value) { ver_value=Sensor_ReadReg(BF3905_VER_ADDR); CMR_LOGE("SENSOR: BF3905_Identify: PID = %x, VER = %x \n",pid_value, ver_value); if(BF3905_VER_VALUE==ver_value) { ret_value=SENSOR_SUCCESS; CMR_LOGE("SENSOR: this is BF3905 sensor ! \n"); } else { CMR_LOGE("SENSOR: BF3905_Identify this is TOSHIBA sensor ! \n"); } } else { CMR_LOGE("SENSOR:BF3905 identify fail,pid_value=%d .\n",pid_value); } return ret_value; }
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 uint8_t BF3905_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 return value; }
LOCAL uint32_t OV9660_set_vmirror_enable(uint32_t enable) { uint16_t reg04; Sensor_WriteReg(0xff, 0x01); reg04 = Sensor_ReadReg(0x04); if (enable) { reg04 = (reg04 | 0x50); Sensor_WriteReg(0xff, 0x01); Sensor_WriteReg(0x04, reg04); } else { reg04 = (reg04 & (~(0x50))); Sensor_WriteReg(0xff, 0x01); Sensor_WriteReg(0x04, reg04); } return 0; }
LOCAL uint32_t OV7690_set_whitebalance_mode(uint32_t mode ) { uint16_t i; uint16_t temp; SENSOR_REG_T* sensor_reg_ptr = (SENSOR_REG_T*)OV7690_WB_mode_tab[mode]; if(mode>6) return 0; temp = Sensor_ReadReg( 0x13 ); if (mode < 1 ) { Sensor_WriteReg( 0x13, temp |BIT_1 );// Auto mode : enable auto white balanec } else { Sensor_WriteReg( 0x13, temp &( ~BIT_1) );// other mode : disable auto white balanec } 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_whitebalance_mode: mode = %d", mode); return 0; }
LOCAL void GT2005_Set_Shutter(void) { uint16_t shutter,AGain_shutter,DGain_shutter; Sensor_WriteReg(0x020B , 0x28); Sensor_WriteReg(0x020C , 0x44); Sensor_WriteReg(0x040B , 0x44); Sensor_WriteReg(0x0300 , 0xc1); shutter = (Sensor_ReadReg(0x0012)<<8 )|( Sensor_ReadReg(0x0013)); AGain_shutter = (Sensor_ReadReg(0x0014)<<8 )|( Sensor_ReadReg(0x0015)); DGain_shutter = (Sensor_ReadReg(0x0016)<<8 )|( Sensor_ReadReg(0x0017)); Sensor_WriteReg(0x0300 , 0x41); //close ALC shutter = shutter / 2; Sensor_WriteReg(0x0305 , shutter&0xff); Sensor_WriteReg(0x0304 , (shutter>>8)&0xff); Sensor_WriteReg(0x0307 , AGain_shutter&0xff); Sensor_WriteReg(0x0306 , (AGain_shutter>>8)&0xff); //AG Sensor_WriteReg(0x0308, DGain_shutter&0xff); //DG }
LOCAL void OV9660_CalculateExposureGain(SENSOR_MODE_E sensor_preview_mode, SENSOR_MODE_E sensor_snapshot_mode) { uint32_t TgtMaxExp =1248; uint32_t PrvExp,TgtExp = 0; uint32_t dummyline = 0; uint8_t PrvGain,val45,val10,val04,val2d,val2e; uint32_t preview_xclk = s_OV9660_resolution_Tab_YUV[sensor_preview_mode].xclk_to_sensor; uint32_t snapshot_xclk = s_OV9660_resolution_Tab_YUV[sensor_snapshot_mode].xclk_to_sensor; if((0==preview_xclk)||(0==snapshot_xclk)) { SENSOR_PRINT("OV9660_CalculateExposureGain: error! .\n"); SENSOR_FAIL; } if(sensor_preview_mode != sensor_snapshot_mode) { // 1. Close AE/AG(0x13 register). Sensor_WriteReg(0x13,0xe0); // 2. Read out gain/expsoure values, 0x00 and 0x10,0x04,0x45 register, (PrvGain, PrvExp) // 3. Change resolution and frame to capture mode // 4 . Calculate exposure/gain PrvGain = Sensor_ReadReg(0x00); PrvExp = Sensor_ReadReg(0x10) <<2; PrvExp += (Sensor_ReadReg(0x04) & 0x03); PrvExp += (Sensor_ReadReg(0x45) & 0x3f) << 10; PrvExp += Sensor_ReadReg(0x2d); PrvExp += Sensor_ReadReg(0x2e)<<8; SENSOR_PRINT("OV9660: prvGain %d, prvExp %d", PrvGain, PrvExp); TgtExp = PrvExp * snapshot_xclk / preview_xclk; if ( PrvGain & 0x10 ) { PrvGain &= 0xef; TgtExp <<= 1; } if ( PrvGain & 0x20 ) { PrvGain &= 0xdf; TgtExp <<= 1; } if ( PrvGain & 0x40 ) { PrvGain &= 0xbf; TgtExp <<= 1; } if ( PrvGain & 0x80 ) { PrvGain &= 0x7f; TgtExp <<= 1; } TgtExp <<= 1; if(TgtExp > TgtMaxExp) { dummyline = TgtExp - TgtMaxExp; TgtExp = TgtMaxExp; } SENSOR_PRINT("OV9660: PrvGain %d, TgtExp %d", PrvGain, TgtExp); val45 =(uint8_t)( (TgtExp>>10) | ((Sensor_ReadReg(0x45) & 0xc0))); // val45 = (TgtExp>>10); val10 = (uint8_t)(TgtExp>>2); val04 =(uint8_t)( Sensor_ReadReg(0x04)&0xfc); val04 = (val04|(uint8_t)(TgtExp&0x03)); val2d = (uint8_t)(dummyline & 0xff); val2e = (uint8_t)((dummyline>>8) & 0xff); Sensor_WriteReg(0x45,val45); Sensor_WriteReg(0x10,val10); Sensor_WriteReg(0x04,val04); Sensor_WriteReg(0x00,PrvGain); Sensor_WriteReg(0x2d,val2d); Sensor_WriteReg(0x2e,val2e); Sensor_WriteReg(0x46,0); Sensor_WriteReg(0x47,0); msleep(300); }