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"); }
/************************************************************************* * FUNCTION * HI704_set_param_banding * * DESCRIPTION * banding setting. * * PARAMETERS * none * * RETURNS * None * * GLOBALS AFFECTED * *************************************************************************/ BOOL HI704_set_param_banding(UINT16 para) { SENSORDB("[Enter]HI704 set_param_banding func:para = %d\n",para); if(HI704_sensor.banding == para) return KAL_TRUE; spin_lock(&hi704_yuv_drv_lock); HI704_sensor.banding = para; spin_unlock(&hi704_yuv_drv_lock); switch (para) { case AE_FLICKER_MODE_50HZ: { HI704_write_cmos_sensor(0x03,0x20); HI704_write_cmos_sensor(0x10,0x9c); } break; case AE_FLICKER_MODE_60HZ: { HI704_write_cmos_sensor(0x03,0x20); HI704_write_cmos_sensor(0x10,0x8c); } break; default: return KAL_FALSE; } return KAL_TRUE; } /* HI704_set_param_banding */
static void HI704_set_dummy(kal_uint16 dummy_pixels,kal_uint16 dummy_lines) { HI704_write_cmos_sensor(0x03, 0x00); //Page 0 HI704_write_cmos_sensor(0x40,((dummy_pixels & 0x0F00))>>8); //HBLANK HI704_write_cmos_sensor(0x41,(dummy_pixels & 0xFF)); HI704_write_cmos_sensor(0x42,((dummy_lines & 0xFF00)>>8)); //VBLANK ( Vsync Type 1) HI704_write_cmos_sensor(0x43,(dummy_lines & 0xFF)); }
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"); }
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; }
static void HI704_Initial_Setting(void) { kal_uint32 iEcount; for(iEcount=0;(!((0xff==(HI704_Initial_Setting_Info[iEcount].address))&&(0xff==(HI704_Initial_Setting_Info[iEcount].data))));iEcount++) { HI704_write_cmos_sensor(HI704_Initial_Setting_Info[iEcount].address, HI704_Initial_Setting_Info[iEcount].data); } }
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() */
/************************************************************************* * 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 */
/************************************************************************* * 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 */
/************************************************************************* * FUNCTION * HI704_set_param_effect * * DESCRIPTION * effect setting. * * PARAMETERS * none * * RETURNS * None * * GLOBALS AFFECTED * *************************************************************************/ BOOL HI704_set_param_effect(UINT16 para) { SENSORDB("[Enter]HI704 set_param_effect func:para = %d\n",para); if(HI704_sensor.effect == para) return KAL_TRUE; spin_lock(&hi704_yuv_drv_lock); HI704_sensor.effect = para; spin_unlock(&hi704_yuv_drv_lock); switch (para) { case MEFFECT_OFF: { HI704_write_cmos_sensor(0x03, 0x10); HI704_write_cmos_sensor(0x11, 0x03); HI704_write_cmos_sensor(0x12, 0x30); HI704_write_cmos_sensor(0x13, 0x00); HI704_write_cmos_sensor(0x44, 0x80); HI704_write_cmos_sensor(0x45, 0x80); HI704_write_cmos_sensor(0x47, 0x7f); HI704_write_cmos_sensor(0x03, 0x13); HI704_write_cmos_sensor(0x20, 0x07); HI704_write_cmos_sensor(0x21, 0x07); } break; case MEFFECT_SEPIA: { HI704_write_cmos_sensor(0x03, 0x10); HI704_write_cmos_sensor(0x11, 0x03); HI704_write_cmos_sensor(0x12, 0x23); HI704_write_cmos_sensor(0x13, 0x00); HI704_write_cmos_sensor(0x44, 0x70); HI704_write_cmos_sensor(0x45, 0x98); HI704_write_cmos_sensor(0x47, 0x7f); HI704_write_cmos_sensor(0x03, 0x13); HI704_write_cmos_sensor(0x20, 0x07); HI704_write_cmos_sensor(0x21, 0x07); } break; case MEFFECT_NEGATIVE: { HI704_write_cmos_sensor(0x03, 0x10); HI704_write_cmos_sensor(0x11, 0x03); HI704_write_cmos_sensor(0x12, 0x08); HI704_write_cmos_sensor(0x13, 0x00); HI704_write_cmos_sensor(0x14, 0x00); } break; case MEFFECT_SEPIAGREEN: { HI704_write_cmos_sensor(0x03, 0x10); HI704_write_cmos_sensor(0x11, 0x03); HI704_write_cmos_sensor(0x12, 0x03); HI704_write_cmos_sensor(0x40, 0x00); HI704_write_cmos_sensor(0x13, 0x00); HI704_write_cmos_sensor(0x44, 0x30); HI704_write_cmos_sensor(0x45, 0x50); } break; case MEFFECT_SEPIABLUE: { HI704_write_cmos_sensor(0x03, 0x10); HI704_write_cmos_sensor(0x11, 0x03); HI704_write_cmos_sensor(0x12, 0x03); HI704_write_cmos_sensor(0x40, 0x00); HI704_write_cmos_sensor(0x13, 0x00); HI704_write_cmos_sensor(0x44, 0xb0); HI704_write_cmos_sensor(0x45, 0x40); } break; case MEFFECT_MONO: { HI704_write_cmos_sensor(0x03, 0x10); HI704_write_cmos_sensor(0x11, 0x03); HI704_write_cmos_sensor(0x12, 0x03); HI704_write_cmos_sensor(0x40, 0x00); HI704_write_cmos_sensor(0x44, 0x80); HI704_write_cmos_sensor(0x45, 0x80); } break; default: return KAL_FALSE; } return KAL_TRUE; } /* HI704_set_param_effect */
/************************************************************************* * FUNCTION * HI704_set_param_wb * * DESCRIPTION * wb setting. * * PARAMETERS * none * * RETURNS * None * * GLOBALS AFFECTED * *************************************************************************/ BOOL HI704_set_param_wb(UINT16 para) { //This sensor need more time to balance AWB, //we suggest higher fps or drop some frame to avoid garbage color when preview initial SENSORDB("[Enter]HI704 set_param_wb func:para = %d\n",para); if(HI704_sensor.wb == para) return KAL_TRUE; spin_lock(&hi704_yuv_drv_lock); HI704_sensor.wb = para; spin_unlock(&hi704_yuv_drv_lock); switch (para) { case AWB_MODE_AUTO: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x2e); //HI704_write_cmos_sensor(0x80, 0x38); //HI704_write_cmos_sensor(0x82, 0x38); #ifdef HQ_PROJECT_A61P_HUAWEI HI704_write_cmos_sensor(0x83, 0x56); #else HI704_write_cmos_sensor(0x83, 0x5e); #endif HI704_write_cmos_sensor(0x84, 0x15); //0x1e_20120214 #ifdef HQ_PROJECT_A61P_HUAWEI HI704_write_cmos_sensor(0x85, 0x5e); //0x52_20120214 #else HI704_write_cmos_sensor(0x85, 0x4f); //0x52_20120214 #endif HI704_write_cmos_sensor(0x86, 0x1c); } break; case AWB_MODE_CLOUDY_DAYLIGHT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x4a);//71 HI704_write_cmos_sensor(0x82, 0x2a);//2b HI704_write_cmos_sensor(0x83, 0x4c);//72 HI704_write_cmos_sensor(0x84, 0x4a);//70 HI704_write_cmos_sensor(0x85, 0x2a);//2b HI704_write_cmos_sensor(0x86, 0x28); } break; case AWB_MODE_DAYLIGHT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x59); HI704_write_cmos_sensor(0x82, 0x29); HI704_write_cmos_sensor(0x83, 0x60); HI704_write_cmos_sensor(0x84, 0x50); HI704_write_cmos_sensor(0x85, 0x2f); HI704_write_cmos_sensor(0x86, 0x23); } break; case AWB_MODE_INCANDESCENT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x29); HI704_write_cmos_sensor(0x82, 0x54); HI704_write_cmos_sensor(0x83, 0x2e); HI704_write_cmos_sensor(0x84, 0x23); HI704_write_cmos_sensor(0x85, 0x58); HI704_write_cmos_sensor(0x86, 0x4f); } break; case AWB_MODE_FLUORESCENT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x41); HI704_write_cmos_sensor(0x82, 0x42); HI704_write_cmos_sensor(0x83, 0x44); HI704_write_cmos_sensor(0x84, 0x34); HI704_write_cmos_sensor(0x85, 0x46); HI704_write_cmos_sensor(0x86, 0x3a); } break; case AWB_MODE_TUNGSTEN: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x80, 0x24); HI704_write_cmos_sensor(0x81, 0x20); HI704_write_cmos_sensor(0x82, 0x58); HI704_write_cmos_sensor(0x83, 0x27); HI704_write_cmos_sensor(0x84, 0x22); HI704_write_cmos_sensor(0x85, 0x58); HI704_write_cmos_sensor(0x86, 0x52); } break; default: return FALSE; } return TRUE; } /* HI704_set_param_wb */
// 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 }
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 }
static void HI704_Cal_Min_Frame_Rate(kal_uint16 min_framerate) { kal_uint32 HI704_expmax; kal_uint32 HI704_expbanding; 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); 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 ; 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 }
// 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 }
// 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 }
void HI704_night_mode(kal_bool enable) { SENSORDB("[Enter]HI704 night mode func:enable = %d\n",enable); SENSORDB("HI704_sensor.video_mode = %d\n",HI704_sensor.MPEG4_Video_mode); SENSORDB("HI704_sensor.night_mode = %d\n",HI704_sensor.night_mode); HI704_sensor.night_mode = enable; if(enable) { //HI704_Cal_Min_Frame_Rate(HI704_MIN_FRAMERATE_5); HI704_write_cmos_sensor(0x03, 0x00); HI704_write_cmos_sensor(0x01, 0xf1); HI704_write_cmos_sensor(0x03, 0x20); HI704_write_cmos_sensor(0x10, 0x1c); HI704_write_cmos_sensor(0x03, 0x20); //HI704_write_cmos_sensor(0x18, 0x38); HI704_write_cmos_sensor(0x88, 0x08); HI704_write_cmos_sensor(0x89, 0x2e); HI704_write_cmos_sensor(0x8a, 0xba); HI704_write_cmos_sensor(0x03, 0x00); HI704_write_cmos_sensor(0x01, 0xf0); HI704_write_cmos_sensor(0x03, 0x20); HI704_write_cmos_sensor(0x10, 0x9c); //HI704_write_cmos_sensor(0x18, 0x30); } else { //HI704_Cal_Min_Frame_Rate(HI704_MIN_FRAMERATE_10); HI704_write_cmos_sensor(0x03, 0x00); HI704_write_cmos_sensor(0x01, 0xf1); HI704_write_cmos_sensor(0x03, 0x20); HI704_write_cmos_sensor(0x10, 0x1c); HI704_write_cmos_sensor(0x03, 0x20); //HI704_write_cmos_sensor(0x18, 0x38); HI704_write_cmos_sensor(0x88, 0x04); HI704_write_cmos_sensor(0x89, 0xf5); HI704_write_cmos_sensor(0x8a, 0x88); HI704_write_cmos_sensor(0x03, 0x00); HI704_write_cmos_sensor(0x01, 0xf0); HI704_write_cmos_sensor(0x03, 0x20); HI704_write_cmos_sensor(0x10, 0x9c); //HI704_write_cmos_sensor(0x18, 0x30); } }
/************************************************************************* * FUNCTION * HI704_set_param_wb * * DESCRIPTION * wb setting. * * PARAMETERS * none * * RETURNS * None * * GLOBALS AFFECTED * *************************************************************************/ BOOL HI704_set_param_wb(UINT16 para) { //This sensor need more time to balance AWB, //we suggest higher fps or drop some frame to avoid garbage color when preview initial SENSORDB("[Enter]HI704 set_param_wb func:para = %d\n",para); if(HI704_sensor.wb == para) return KAL_TRUE; HI704_sensor.wb = para; switch (para) { case AWB_MODE_AUTO: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x2e); HI704_write_cmos_sensor(0x80, 0x38); HI704_write_cmos_sensor(0x82, 0x38); HI704_write_cmos_sensor(0x83, 0x5e); HI704_write_cmos_sensor(0x84, 0x24); HI704_write_cmos_sensor(0x85, 0x59); HI704_write_cmos_sensor(0x86, 0x24); } break; case AWB_MODE_CLOUDY_DAYLIGHT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x71); HI704_write_cmos_sensor(0x82, 0x2b); HI704_write_cmos_sensor(0x83, 0x72); HI704_write_cmos_sensor(0x84, 0x70); HI704_write_cmos_sensor(0x85, 0x2b); HI704_write_cmos_sensor(0x86, 0x28); } break; case AWB_MODE_DAYLIGHT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x59); HI704_write_cmos_sensor(0x82, 0x29); HI704_write_cmos_sensor(0x83, 0x60); HI704_write_cmos_sensor(0x84, 0x50); HI704_write_cmos_sensor(0x85, 0x2f); HI704_write_cmos_sensor(0x86, 0x23); } break; case AWB_MODE_INCANDESCENT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x29); HI704_write_cmos_sensor(0x82, 0x54); HI704_write_cmos_sensor(0x83, 0x2e); HI704_write_cmos_sensor(0x84, 0x23); HI704_write_cmos_sensor(0x85, 0x58); HI704_write_cmos_sensor(0x86, 0x4f); } break; case AWB_MODE_FLUORESCENT: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x11, 0x28); HI704_write_cmos_sensor(0x80, 0x41); HI704_write_cmos_sensor(0x82, 0x42); HI704_write_cmos_sensor(0x83, 0x44); HI704_write_cmos_sensor(0x84, 0x34); HI704_write_cmos_sensor(0x85, 0x46); HI704_write_cmos_sensor(0x86, 0x3a); } break; case AWB_MODE_TUNGSTEN: { HI704_write_cmos_sensor(0x03, 0x22); HI704_write_cmos_sensor(0x80, 0x24); HI704_write_cmos_sensor(0x81, 0x20); HI704_write_cmos_sensor(0x82, 0x58); HI704_write_cmos_sensor(0x83, 0x27); HI704_write_cmos_sensor(0x84, 0x22); HI704_write_cmos_sensor(0x85, 0x58); HI704_write_cmos_sensor(0x86, 0x52); } break; default: return FALSE; } return TRUE; } /* HI704_set_param_wb */