static void HI704_Cal_Min_Frame_Rate(kal_uint16 min_framerate)
{
    kal_uint32 HI704_expmax = 0;
    kal_uint32 HI704_expbanding;
    kal_uint32 temp_data;
      
    SENSORDB("[HI704] HI704_Cal_Min_Frame_Rate:min_fps=%d\n",min_framerate);

    //No Fixed Framerate
    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)|0x01);   //Sleep: For Write Reg
    HI704_write_cmos_sensor(0x03, 0x00);
    HI704_write_cmos_sensor(0x11, HI704_read_cmos_sensor(0x11)&0xfb);

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)&0x7f);   //Close AE

    HI704_write_cmos_sensor(0x11, 0x04);
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)|0x08);   //Reset AE
    HI704_write_cmos_sensor(0x2a, 0xf0);
    HI704_write_cmos_sensor(0x2b, 0x34);

    HI704_write_cmos_sensor(0x03, 0x00);
    temp_data = ((HI704_read_cmos_sensor(0x40)<<8)|HI704_read_cmos_sensor(0x41));
    spin_lock(&hi704_yuv_drv_lock);
    HI704_sensor.pv_dummy_pixels = temp_data;
    HI704_sensor.pv_line_length = HI704_VGA_DEFAULT_PIXEL_NUMS+ HI704_sensor.pv_dummy_pixels ;
    spin_unlock(&hi704_yuv_drv_lock);

    if(HI704_sensor.banding == AE_FLICKER_MODE_50HZ)
    {
        HI704_expbanding = (HI704_sensor.pv_pclk/HI704_sensor.pv_line_length/100)*HI704_sensor.pv_line_length/8;
        HI704_expmax = HI704_expbanding*100*10/min_framerate ;
    }
    else if(HI704_sensor.banding == AE_FLICKER_MODE_60HZ)
    {
        HI704_expbanding = (HI704_sensor.pv_pclk/HI704_sensor.pv_line_length/120)*HI704_sensor.pv_line_length/8;
        HI704_expmax = HI704_expbanding*120*10/min_framerate ;
    }
    else
    {
        SENSORDB("[HI704][Error] Wrong Banding Setting!!!...");
    }
        
    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x88, (HI704_expmax>>16)&0xff);
    HI704_write_cmos_sensor(0x89, (HI704_expmax>>8)&0xff);
    HI704_write_cmos_sensor(0x8a, (HI704_expmax>>0)&0xff);

    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)&0xfe);   //Exit Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)|0x80);   //Open AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)&0xf7);   //Reset AE
}
Esempio n. 2
0
static void HI704_Set_Mirror_Flip(kal_uint8 image_mirror)
{
  /********************************************************
    * Page Mode 0: Reg 0x0011 bit[1:0] = [Y Flip : X Flip]
    * 0: Off; 1: On.
    *********************************************************/    
    SENSORDB("[Enter]:HI704 set Mirror_flip func:image_mirror=%d\n",image_mirror);
	
    HI704_write_cmos_sensor(0x03,0x00);     //Page 0	
    HI704_sensor.mirror = (HI704_read_cmos_sensor(0x11) & 0xfc); 

    switch (image_mirror) 
    {
        case IMAGE_NORMAL:
		    HI704_sensor.mirror |= 0x00;
	        break;
	    case IMAGE_H_MIRROR:
		    HI704_sensor.mirror |= 0x01;
	        break;
	    case IMAGE_V_MIRROR:
		    HI704_sensor.mirror |= 0x02;
	        break;
    	case IMAGE_HV_MIRROR:
		    HI704_sensor.mirror |= 0x03;
	        break;
    	default:
	        HI704_sensor.mirror |= 0x00;
    }

    HI704_write_cmos_sensor(0x11, HI704_sensor.mirror);

	SENSORDB("[Exit]:HI704 set Mirror_flip func\n");

}
static void HI704_Set_Mirror_Flip(kal_uint8 image_mirror)
{
    /********************************************************
    * Page Mode 0: Reg 0x0011 bit[1:0] = [Y Flip : X Flip]
    * 0: Off; 1: On.
    *********************************************************/    
    SENSORDB("[Enter]:HI704 set Mirror_flip func:image_mirror=%d\n",image_mirror);
	
    HI704_write_cmos_sensor(0x03,0x00);     //Page 0	
    
    spin_lock(&hi704_yuv_drv_lock);
    HI704_sensor.mirror = (HI704_read_cmos_sensor(0x11) & 0xfc); 

    switch (image_mirror) 
    {
     #ifdef HQ_PROJECT_A61P_HUAWEI
        case IMAGE_NORMAL:
		    HI704_sensor.mirror |= 0x03;
	        break;
	    case IMAGE_H_MIRROR:
		    HI704_sensor.mirror |= 0x01;
	        break;
	    case IMAGE_V_MIRROR:
		    HI704_sensor.mirror |= 0x02;
	        break;
    	case IMAGE_HV_MIRROR:
		    HI704_sensor.mirror |= 0x00;
	        break;
    	default:
	        HI704_sensor.mirror |= 0x03;
     #else
	 case IMAGE_NORMAL:
                    HI704_sensor.mirror |= 0x00;
                break;
            case IMAGE_H_MIRROR:
                    HI704_sensor.mirror |= 0x01;
                break;
            case IMAGE_V_MIRROR:
                    HI704_sensor.mirror |= 0x02;
                break;
        case IMAGE_HV_MIRROR:
                    HI704_sensor.mirror |= 0x03;
                break;
        default:
                HI704_sensor.mirror |= 0x00;
     #endif
    }
    
    spin_unlock(&hi704_yuv_drv_lock);
    HI704_write_cmos_sensor(0x11, HI704_sensor.mirror);
    SENSORDB("[Exit]:HI704 set Mirror_flip func\n");
}
/*************************************************************************
* FUNCTION
*	HI704_set_param_exposure
*
* DESCRIPTION
*	exposure setting.
*
* PARAMETERS
*	none
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
BOOL HI704_set_param_exposure(UINT16 para)
{
    SENSORDB("[Enter]HI704 set_param_exposure func:para = %d\n",para);

    if(HI704_sensor.exposure == para) return KAL_TRUE;

    spin_lock(&hi704_yuv_drv_lock);
    HI704_sensor.exposure = para;
    spin_unlock(&hi704_yuv_drv_lock);

	   HI704_write_cmos_sensor(0x03,0x10);
	   HI704_write_cmos_sensor(0x12,HI704_read_cmos_sensor(0x12)|0x10);
	switch (para)
	{
		case AE_EV_COMP_13:  //+4 EV
			HI704_write_cmos_sensor(0x40,0x60);
			break;  
		case AE_EV_COMP_10:  //+3 EV
			HI704_write_cmos_sensor(0x40,0x48);
			break;    
		case AE_EV_COMP_07:  //+2 EV
			HI704_write_cmos_sensor(0x40,0x30);
			break;    
		case AE_EV_COMP_03:	 //	+1 EV	
			HI704_write_cmos_sensor(0x40,0x18);	
			break;    
		case AE_EV_COMP_00:  // +0 EV
#ifdef HQ_PROJECT_A61P_HUAWEI
		    HI704_write_cmos_sensor(0x40,0x06);   //0x00_20120214
#else
		    HI704_write_cmos_sensor(0x40,0x08);   //0x00_20120214
#endif
			break;    
		case AE_EV_COMP_n03:  // -1 EV
			HI704_write_cmos_sensor(0x40,0x98);
			break;    
		case AE_EV_COMP_n07:	// -2 EV		
			HI704_write_cmos_sensor(0x40,0xb0);	
			break;    
		case AE_EV_COMP_n10:   //-3 EV
			HI704_write_cmos_sensor(0x40,0xc8);
			break;
		case AE_EV_COMP_n13:  // -4 EV
			HI704_write_cmos_sensor(0x40,0xe0);
			break;
		default:
			return FALSE;
	}

    return TRUE;	
} /* HI704_set_param_exposure */
Esempio n. 5
0
/*************************************************************************
* FUNCTION
*	HI704_set_param_exposure
*
* DESCRIPTION
*	exposure setting.
*
* PARAMETERS
*	none
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
BOOL HI704_set_param_exposure(UINT16 para)
{


	SENSORDB("[Enter]HI704 set_param_exposure func:para = %d\n",para);

	
	if(HI704_sensor.exposure == para) return KAL_TRUE;

	  HI704_sensor.exposure = para;

	   HI704_write_cmos_sensor(0x03,0x10);
	   HI704_write_cmos_sensor(0x12,HI704_read_cmos_sensor(0x12)|0x10);
	switch (para)
	{
		case AE_EV_COMP_13:  //+4 EV
			HI704_write_cmos_sensor(0x40,0x60);
			break;  
		case AE_EV_COMP_10:  //+3 EV
			HI704_write_cmos_sensor(0x40,0x48);
			break;    
		case AE_EV_COMP_07:  //+2 EV
			HI704_write_cmos_sensor(0x40,0x30);
			break;    
		case AE_EV_COMP_03:	 //	+1 EV	
			HI704_write_cmos_sensor(0x40,0x18);	
			break;    
		case AE_EV_COMP_00:  // +0 EV
		    HI704_write_cmos_sensor(0x40,0x10);
			break;    
		case AE_EV_COMP_n03:  // -1 EV
			HI704_write_cmos_sensor(0x40,0x98);
			break;    
		case AE_EV_COMP_n07:	// -2 EV		
			HI704_write_cmos_sensor(0x40,0xb0);	
			break;    
		case AE_EV_COMP_n10:   //-3 EV
			HI704_write_cmos_sensor(0x40,0xc8);
			break;
		case AE_EV_COMP_n13:  // -4 EV
			HI704_write_cmos_sensor(0x40,0xe0);
			break;
		default:
			return FALSE;
	}

	return TRUE;
	
} /* HI704_set_param_exposure */
// 640 * 480
static void HI704_Set_VGA_mode(void)
{
    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)|0x01);   //Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x00);
    HI704_write_cmos_sensor(0x10, 0x00);        //VGA Size

    HI704_write_cmos_sensor(0x20, 0x00);
    HI704_write_cmos_sensor(0x21, 0x04);

    HI704_write_cmos_sensor(0x40, 0x01);        //HBLANK: 0x70 = 112
    HI704_write_cmos_sensor(0x41, 0x58);
    HI704_write_cmos_sensor(0x42, 0x00);        //VBLANK: 0x04 = 4
    HI704_write_cmos_sensor(0x43, 0x13);

    HI704_write_cmos_sensor(0x03, 0x11);
    HI704_write_cmos_sensor(0x10, 0x25);  

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_pv_exposure_lines = (HI704_read_cmos_sensor(0x80) << 16)|(HI704_read_cmos_sensor(0x81) << 8)|HI704_read_cmos_sensor(0x82);


    HI704_write_cmos_sensor(0x03, 0x20);

    HI704_write_cmos_sensor(0x10, 0x1c);   //Close AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)|0x08);   //Reset AE
#ifdef HQ_PROJECT_A61P_HUAWEI
    HI704_write_cmos_sensor(0x83, HI704_pv_exposure_lines >> 16);
    HI704_write_cmos_sensor(0x84, (HI704_pv_exposure_lines >> 8) & 0x000000FF);
    HI704_write_cmos_sensor(0x85, HI704_pv_exposure_lines & 0x000000FF);
#else	
    HI704_write_cmos_sensor(0x83, HI704_pv_exposure_lines >> 16);
    HI704_write_cmos_sensor(0x84, (HI704_pv_exposure_lines >> 8) & 0x000000FF);
    HI704_write_cmos_sensor(0x85, HI704_pv_exposure_lines & 0x000000FF);
#endif	
    HI704_write_cmos_sensor(0x86, 0x00);
    HI704_write_cmos_sensor(0x87, 0xfa);

    HI704_write_cmos_sensor(0x8b, 0x3f);
    HI704_write_cmos_sensor(0x8c, 0x7a);
    HI704_write_cmos_sensor(0x8d, 0x34);
    HI704_write_cmos_sensor(0x8e, 0xbc);

    HI704_write_cmos_sensor(0x9c, 0x0b);
    HI704_write_cmos_sensor(0x9d, 0xb8);
    HI704_write_cmos_sensor(0x9e, 0x00);
    HI704_write_cmos_sensor(0x9f, 0xfa);

    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)&0xfe);   //Exit Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, 0x9c);   //Open AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)&0xf7);   //Reset AE

}
static kal_uint8 HI704_power_on(void)
{
    kal_uint8 HI704_sensor_id = 0;
    spin_lock(&hi704_yuv_drv_lock);
    HI704_sensor.pv_pclk = 13000000;
    spin_unlock(&hi704_yuv_drv_lock);
    //Software Reset
    HI704_write_cmos_sensor(0x01,0xf1);
    HI704_write_cmos_sensor(0x01,0xf3);
    HI704_write_cmos_sensor(0x01,0xf1);

    /* Read Sensor ID  */
    HI704_sensor_id = HI704_read_cmos_sensor(0x04);
    SENSORDB("[HI704YUV]:read Sensor ID:%x\n",HI704_sensor_id);	
    return HI704_sensor_id;
}
Esempio n. 8
0
// 640 * 480
static void HI704_Set_VGA_mode(void)
{
    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)|0x01);   //Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x00);
    HI704_write_cmos_sensor(0x10, 0x00);        //VGA Size

    HI704_write_cmos_sensor(0x20, 0x00);
    HI704_write_cmos_sensor(0x21, 0x04);

    HI704_write_cmos_sensor(0x40, 0x01);        //HBLANK: 0x70 = 112
    HI704_write_cmos_sensor(0x41, 0x58);
    HI704_write_cmos_sensor(0x42, 0x00);        //VBLANK: 0x04 = 4
    HI704_write_cmos_sensor(0x43, 0x13);

    HI704_write_cmos_sensor(0x03, 0x11);
    HI704_write_cmos_sensor(0x10, 0x25);  

    HI704_write_cmos_sensor(0x03, 0x20);

    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)&0x7f);   //Close AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)|0x08);   //Reset AE
	
    HI704_write_cmos_sensor(0x83, 0x00);
    HI704_write_cmos_sensor(0x84, 0xbe);
    HI704_write_cmos_sensor(0x85, 0x6e);
    HI704_write_cmos_sensor(0x86, 0x00);
    HI704_write_cmos_sensor(0x87, 0xfa);

    HI704_write_cmos_sensor(0x8b, 0x3f);
    HI704_write_cmos_sensor(0x8c, 0x7a);
    HI704_write_cmos_sensor(0x8d, 0x34);
    HI704_write_cmos_sensor(0x8e, 0xbc);

    HI704_write_cmos_sensor(0x9c, 0x0b);
    HI704_write_cmos_sensor(0x9d, 0xb8);
    HI704_write_cmos_sensor(0x9e, 0x00);
    HI704_write_cmos_sensor(0x9f, 0xfa);

    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)&0xfe);   //Exit Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)|0x80);   //Open AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)&0xf7);   //Reset AE

}
Esempio n. 9
0
// 320 * 240
static void HI704_Set_QVGA_mode(void)
{
    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)|0x01);   //Sleep: For Write Reg
    
    HI704_write_cmos_sensor(0x03, 0x00);
    HI704_write_cmos_sensor(0x10, 0x01);        //QVGA Size: 0x10 -> 0x01

    HI704_write_cmos_sensor(0x20, 0x00);
    HI704_write_cmos_sensor(0x21, 0x02);

    HI704_write_cmos_sensor(0x40, 0x01);        //HBLANK:  0x0158 = 344
    HI704_write_cmos_sensor(0x41, 0x58);
    HI704_write_cmos_sensor(0x42, 0x00);        //VBLANK:  0x14 = 20
    HI704_write_cmos_sensor(0x43, 0x14);

    HI704_write_cmos_sensor(0x03, 0x11);        //QVGA Fixframerate
    HI704_write_cmos_sensor(0x10, 0x21);  

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)&0x7f);   //Close AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)|0x08);   //Reset AE

    HI704_write_cmos_sensor(0x83, 0x00);
    HI704_write_cmos_sensor(0x84, 0xaf);
    HI704_write_cmos_sensor(0x85, 0xc8);
    HI704_write_cmos_sensor(0x86, 0x00);
    HI704_write_cmos_sensor(0x87, 0xfa);

    HI704_write_cmos_sensor(0x8b, 0x3a);
    HI704_write_cmos_sensor(0x8c, 0x98);
    HI704_write_cmos_sensor(0x8d, 0x30);
    HI704_write_cmos_sensor(0x8e, 0xd4);

    HI704_write_cmos_sensor(0x9c, 0x0b);
    HI704_write_cmos_sensor(0x9d, 0x3b);
    HI704_write_cmos_sensor(0x9e, 0x00);
    HI704_write_cmos_sensor(0x9f, 0xfa);

    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)&0xfe);   //Exit Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)|0x80);   //Open AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)&0xf7);   //Reset AE

}
Esempio n. 10
0
UINT32 HI704FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,
							 UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)
{
    UINT16 u2Temp = 0; 
	UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;
	UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;
	UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;
	UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;
	MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;
	MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;

	switch (FeatureId)
	{
		case SENSOR_FEATURE_GET_RESOLUTION:
			*pFeatureReturnPara16++=HI704_IMAGE_SENSOR_FULL_WIDTH;
			*pFeatureReturnPara16=HI704_IMAGE_SENSOR_FULL_HEIGHT;
			*pFeatureParaLen=4;
		     break;
		case SENSOR_FEATURE_GET_PERIOD:
			*pFeatureReturnPara16++=HI704_IMAGE_SENSOR_PV_WIDTH;//+HI704_sensor.pv_dummy_pixels;
			*pFeatureReturnPara16=HI704_IMAGE_SENSOR_PV_HEIGHT;//+HI704_sensor.pv_dummy_lines;
			*pFeatureParaLen=4;
		     break;
		case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ:
			//*pFeatureReturnPara32 = HI704_sensor_pclk/10;
			*pFeatureParaLen=4;
		     break;
		case SENSOR_FEATURE_SET_ESHUTTER:
	
		     break;
		case SENSOR_FEATURE_SET_NIGHTMODE:
			 HI704_night_mode((BOOL) *pFeatureData16);
		     break;
		case SENSOR_FEATURE_SET_GAIN:
			 break; 
		case SENSOR_FEATURE_SET_FLASHLIGHT:
		     break;
		case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ:
		     break;
		case SENSOR_FEATURE_SET_REGISTER:
			 HI704_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);
		     break;
		case SENSOR_FEATURE_GET_REGISTER:
			 pSensorRegData->RegData = HI704_read_cmos_sensor(pSensorRegData->RegAddr);
		     break;
		case SENSOR_FEATURE_GET_CONFIG_PARA:
			 memcpy(pSensorConfigData, &HI704SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));
			 *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT);
		     break;
		case SENSOR_FEATURE_SET_CCT_REGISTER:
		case SENSOR_FEATURE_GET_CCT_REGISTER:
		case SENSOR_FEATURE_SET_ENG_REGISTER:
		case SENSOR_FEATURE_GET_ENG_REGISTER:
		case SENSOR_FEATURE_GET_REGISTER_DEFAULT:
		case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR:
		case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA:
		case SENSOR_FEATURE_GET_GROUP_INFO:
		case SENSOR_FEATURE_GET_ITEM_INFO:
		case SENSOR_FEATURE_SET_ITEM_INFO:
		case SENSOR_FEATURE_GET_ENG_INFO:
		     break;
		case SENSOR_FEATURE_GET_GROUP_COUNT:
	               // *pFeatureReturnPara32++=0;
			//*pFeatureParaLen=4;
		     break; 
		
		case SENSOR_FEATURE_GET_LENS_DRIVER_ID:
			// get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE
			// if EEPROM does not exist in camera module.
			*pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE;
			*pFeatureParaLen=4;
		     break;
		case SENSOR_FEATURE_SET_YUV_CMD:
			 HI704YUVSensorSetting((FEATURE_ID)*pFeatureData32, *(pFeatureData32+1));
		     break;	
		case SENSOR_FEATURE_SET_VIDEO_MODE:
		     HI704YUVSetVideoMode(*pFeatureData16);
		     break; 
		case SENSOR_FEATURE_CHECK_SENSOR_ID:
			HI704_GetSensorID(pFeatureData32); 
			break; 
		default:
			 break;			
	}
	return ERROR_NONE;
}	/* HI704FeatureControl() */
Esempio n. 11
0
static void HI704_Fix_Video_Frame_Rate(kal_uint16 fix_framerate)
{
    kal_uint32 HI704_expfix;
    kal_uint32 HI704_expfix_temp;
    kal_uint32 HI704_expmax;
    kal_uint32 HI704_expbanding;
    
  
    SENSORDB("[Enter]HI704 Fix_video_frame_rate func: fix_fps=%d\n",fix_framerate);


	HI704_sensor.video_current_frame_rate = fix_framerate;
    // Fixed Framerate
    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)|0x01);   //Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x00);
    HI704_write_cmos_sensor(0x11, HI704_read_cmos_sensor(0x11)|0x04);

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)&0x7f);   //Close AE
    
    HI704_write_cmos_sensor(0x11, 0x00);
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)|0x08);   //Reset AE
    HI704_write_cmos_sensor(0x2a, 0x00);
    HI704_write_cmos_sensor(0x2b, 0x35);

    HI704_write_cmos_sensor(0x03, 0x00);
    HI704_sensor.pv_dummy_pixels = ((HI704_read_cmos_sensor(0x40)<<8)|HI704_read_cmos_sensor(0x41));
    

    HI704_sensor.pv_line_length = HI704_VGA_DEFAULT_PIXEL_NUMS + HI704_sensor.pv_dummy_pixels ;
    
    
    HI704_sensor.pv_dummy_lines = ((HI704_read_cmos_sensor(0x42)<<8)|HI704_read_cmos_sensor(0x43));
    
    
    HI704_expfix_temp = ((HI704_sensor.pv_pclk*10/fix_framerate)-(HI704_sensor.pv_line_length*HI704_sensor.pv_dummy_lines))/8;
    
    HI704_expfix = ((HI704_expfix_temp*8/HI704_sensor.pv_line_length)*HI704_sensor.pv_line_length)/8;
    

    HI704_write_cmos_sensor(0x03, 0x20);
    //HI704_write_cmos_sensor(0x83, (HI704_expfix>>16)&0xff);
    //HI704_write_cmos_sensor(0x84, (HI704_expfix>>8)&0xff);
    //HI704_write_cmos_sensor(0x85, (HI704_expfix>>0)&0xff);
    HI704_write_cmos_sensor(0x91, (HI704_expfix>>16)&0xff);
    HI704_write_cmos_sensor(0x92, (HI704_expfix>>8)&0xff);
    HI704_write_cmos_sensor(0x93, (HI704_expfix>>0)&0xff);

    if(HI704_sensor.banding == AE_FLICKER_MODE_50HZ)
    {
        HI704_expbanding = ((HI704_read_cmos_sensor(0x8b)<<8)|HI704_read_cmos_sensor(0x8c));
    }
    else if(HI704_sensor.banding == AE_FLICKER_MODE_60HZ)
    {
        HI704_expbanding = ((HI704_read_cmos_sensor(0x8d)<<8)|HI704_read_cmos_sensor(0x8e));
    }
    else
    {
        SENSORDB("[HI704]Wrong Banding Setting!!!...");
    }
    HI704_expmax = ((HI704_expfix_temp-HI704_expbanding)/HI704_expbanding)*HI704_expbanding;

    
    
    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x88, (HI704_expmax>>16)&0xff);
    HI704_write_cmos_sensor(0x89, (HI704_expmax>>8)&0xff);
    HI704_write_cmos_sensor(0x8a, (HI704_expmax>>0)&0xff);

    HI704_write_cmos_sensor(0x01, HI704_read_cmos_sensor(0x01)&0xfe);   //Exit Sleep: For Write Reg

    HI704_write_cmos_sensor(0x03, 0x20);
    HI704_write_cmos_sensor(0x10, HI704_read_cmos_sensor(0x10)|0x80);   //Open AE
    HI704_write_cmos_sensor(0x18, HI704_read_cmos_sensor(0x18)&0xf7);   //Reset AE

}