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;
}
Esempio n. 10
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;
}