📄 image_sensor_ov7660.c
字号:
#elif defined(CAM_PREVIEW_22FPS)
SET_TG_OUTPUT_CLK_DIVIDER(2);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(1);
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(5);
SET_CMOS_DATA_LATCH(4);
OV7660_start_grab_x_offset=0;
OV7660_start_grab_y_offset=0;
#elif defined(CAM_PREVIEW_30FPS)
SET_TG_OUTPUT_CLK_DIVIDER(1);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(1);
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(3);
SET_CMOS_DATA_LATCH(2);
OV7660_start_grab_x_offset=1;
OV7660_start_grab_y_offset=0;
#endif
OV7660_dummy_pixels=0; // camera preview period is (OV7660_VGA_PERIOD_PIXEL_NUMS + OV7660_dummy_pixels)
OV7660_dummy_lines=0;
}
OV7660_preview_pclk_division=((DRV_Reg32(ISP_TG_PHASE_COUNTER_REG)&0xF0)>>4)+1;
switch (sensor_config_data->image_mirror)
{
case IMAGE_NORMAL:
SET_FIRST_GRAB_COLOR(BAYER_R);
while(temp_reg2 != (0x00|temp_reg1))
{
ov7660_write_cmos_sensor(0x1E,(0x00|temp_reg1));
temp_reg2=ov7660_read_cmos_sensor(0x1E);
};
break;
case IMAGE_H_MIRROR:
SET_FIRST_GRAB_COLOR(BAYER_R);
while(temp_reg2 != (0x20|temp_reg1))
{
ov7660_write_cmos_sensor(0x1E,(0x20|temp_reg1));
temp_reg2=ov7660_read_cmos_sensor(0x1E);
};
break;
case IMAGE_V_MIRROR:
SET_FIRST_GRAB_COLOR(BAYER_Gb);
while(temp_reg2 != (0x10|temp_reg1))
{
ov7660_write_cmos_sensor(0x1E,(0x10|temp_reg1));
temp_reg2=ov7660_read_cmos_sensor(0x1E);
};
break;
case IMAGE_HV_MIRROR:
SET_FIRST_GRAB_COLOR(BAYER_Gb);
while(temp_reg2 != (0x30|temp_reg1))
{
ov7660_write_cmos_sensor(0x1E,(0x30|temp_reg1));
temp_reg2=ov7660_read_cmos_sensor(0x1E);
};
break;
}
image_window->grab_start_x=OV7660_IMAGE_SENSOR_VGA_INSERTED_PIXELS+OV7660_start_grab_x_offset-2-2; //-2 is for effect will have wrong edge on right side
image_window->grab_start_y=OV7660_IMAGE_SENSOR_VGA_INSERTED_LINES+OV7660_dummy_lines+OV7660_start_grab_y_offset;
image_window->exposure_window_width=IMAGE_SENSOR_VGA_WIDTH-6;
image_window->exposure_window_height=IMAGE_SENSOR_VGA_HEIGHT-8;
set_OV76X0_dummy(OV7660_dummy_pixels,OV7660_dummy_lines);
write_OV76X0_shutter(OV7660_exposure_lines);
#ifdef OUTPUT_DEBUG_INFO
sprintf(temp_buffer, "pre_shut:%d, dummy_p=%d, dummy_l=%d", OV7660_exposure_lines, OV7660_dummy_pixels, OV7660_dummy_lines);
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
sprintf(temp_buffer, "End of OV7660_preview");
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
#endif
} /* OV7660_preview */
void OV7660_capture(image_sensor_exposure_window_struct *image_window, image_sensor_config_struct *sensor_config_data)
{
volatile kal_uint32 shutter=OV7660_exposure_lines;
//if(OV7660_MPEG4_encode_mode)
// ASSERT(0);
if(sensor_config_data->enable_shutter_tansfer==KAL_TRUE)
shutter=sensor_config_data->capture_shutter;
#ifdef OUTPUT_DEBUG_INFO
sprintf(temp_buffer, "Begin of OV7660_capture");
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
sprintf(temp_buffer, "cap_shutter:%d, pre_shut:%d", shutter, OV7660_exposure_lines);
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
#endif
OV7660_start_grab_x_offset=1;
OV7660_start_grab_y_offset=0;
if ((image_window->image_target_width<=IMAGE_SENSOR_1M_WIDTH)&&
(image_window->image_target_height<=IMAGE_SENSOR_1M_HEIGHT))
{ /* Less than VGA Mode */
if (image_window->digital_zoom_factor>=(ISP_DIGITAL_ZOOM_INTERVAL<<1))
{
ov7660_write_cmos_sensor(0x11,0x81);
SET_TG_OUTPUT_CLK_DIVIDER(3);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(2);
SET_TG_PIXEL_CLK_DIVIDER(15);
SET_CMOS_DATA_LATCH(6);
if ((image_window->image_target_width==IMAGE_SENSOR_1M_WIDTH)&&
(image_window->image_target_height==IMAGE_SENSOR_1M_HEIGHT))
OV7660_dummy_pixels=2000;
else
OV7660_dummy_pixels=OV7660_VGA_PERIOD_PIXEL_NUMS/4;
OV7660_dummy_lines=0;
image_window->grab_start_x=OV7660_IMAGE_SENSOR_VGA_INSERTED_PIXELS+OV7660_start_grab_x_offset-2; //-2 is for effect will have wrong edge on right side
image_window->grab_start_y=OV7660_IMAGE_SENSOR_VGA_INSERTED_LINES+OV7660_dummy_lines+OV7660_start_grab_y_offset;
image_window->exposure_window_width=IMAGE_SENSOR_VGA_WIDTH-6;
image_window->exposure_window_height=IMAGE_SENSOR_VGA_HEIGHT-8;
}
else
{
ov7660_write_cmos_sensor(0x11,0x80);
if(sensor_config_data->frame_rate==0xF0) // That means WEBCAM mode.
{
#if defined(CAM_PREVIEW_15FPS)
SET_TG_OUTPUT_CLK_DIVIDER(3);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(2);
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(7);
SET_CMOS_DATA_LATCH(3);
OV7660_start_grab_x_offset=1;
OV7660_start_grab_y_offset=0;
#elif defined(CAM_PREVIEW_22FPS)
SET_TG_OUTPUT_CLK_DIVIDER(2);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(1);
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(5);
SET_CMOS_DATA_LATCH(4);
OV7660_start_grab_x_offset=0;
OV7660_start_grab_y_offset=0;
#elif defined(CAM_PREVIEW_30FPS)
SET_TG_OUTPUT_CLK_DIVIDER(1);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(1);
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(3);
SET_CMOS_DATA_LATCH(2);
OV7660_start_grab_x_offset=1;
OV7660_start_grab_y_offset=0;
#endif
OV7660_dummy_pixels=0;
OV7660_dummy_lines=0;
image_window->grab_start_x=OV7660_IMAGE_SENSOR_VGA_INSERTED_PIXELS+OV7660_start_grab_x_offset;
image_window->grab_start_y=OV7660_IMAGE_SENSOR_VGA_INSERTED_LINES+2+OV7660_dummy_lines+OV7660_start_grab_y_offset;
image_window->exposure_window_width=IMAGE_SENSOR_VGA_WIDTH;
image_window->exposure_window_height=(IMAGE_SENSOR_VGA_HEIGHT-2)-20;
}
else
{
SET_TG_OUTPUT_CLK_DIVIDER(3);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(2);
SET_TG_PIXEL_CLK_DIVIDER(7);
SET_CMOS_DATA_LATCH(3);
if ((image_window->image_target_width==IMAGE_SENSOR_1M_WIDTH)&&
(image_window->image_target_height==IMAGE_SENSOR_1M_HEIGHT))
OV7660_dummy_pixels=1000;
else
OV7660_dummy_pixels=0;
OV7660_dummy_lines=0;
image_window->grab_start_x=OV7660_IMAGE_SENSOR_VGA_INSERTED_PIXELS+OV7660_start_grab_x_offset-2; //-2 is for effect will have wrong edge on right side
image_window->grab_start_y=OV7660_IMAGE_SENSOR_VGA_INSERTED_LINES+OV7660_dummy_lines+OV7660_start_grab_y_offset;
image_window->exposure_window_width=IMAGE_SENSOR_VGA_WIDTH-6;
image_window->exposure_window_height=IMAGE_SENSOR_VGA_HEIGHT-8;
}
}
OV7660_capture_pclk_division=((DRV_Reg32(ISP_TG_PHASE_COUNTER_REG)&0xF0)>>4)+1;
shutter=(shutter*OV7660_preview_pclk_division)/OV7660_capture_pclk_division;
shutter=(shutter*OV7660_VGA_PERIOD_PIXEL_NUMS)/(OV7660_VGA_PERIOD_PIXEL_NUMS+OV7660_dummy_pixels);
}
if(shutter<1)
shutter=1;
set_OV76X0_dummy(OV7660_dummy_pixels,OV7660_dummy_lines);
write_OV76X0_shutter(shutter);
#ifdef OUTPUT_DEBUG_INFO
sprintf(temp_buffer, "cap_shut:%d, pre_shut:%d, pre_pclk_div=%d, cap_pclk_div=%d, dummy_p=%d, dummy_l=%d", shutter, OV7660_exposure_lines, OV7660_preview_pclk_division, OV7660_capture_pclk_division, OV7660_dummy_pixels, OV7660_dummy_lines);
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
sprintf(temp_buffer, "End of OV7660_capture");
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
#endif
} /* OV7660_capture() */
/*************************************************************************
* FUNCTION
* OV7660_write_reg
*
* DESCRIPTION
* This function set the register of OV76X0.
*
* PARAMETERS
* addr : the register index of OV76X0
* para : setting parameter of the specified register of OV76X0
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV7660_write_reg(kal_uint32 addr, kal_uint32 para)
{
ov7660_write_cmos_sensor(addr,para);
} /* OV7660_write_reg() */
/*************************************************************************
* FUNCTION
* ov7660_read_cmos_sensor
*
* DESCRIPTION
* This function read parameter of specified register from OV76X0.
*
* PARAMETERS
* addr : the register index of OV76X0
*
* RETURNS
* the data that read from OV76X0
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint32 OV7660_read_reg(kal_uint32 addr)
{
return (ov7660_read_cmos_sensor(addr));
} /* OV7660_read_reg() */
/*************************************************************************
* FUNCTION
* OV7660_set_shutter
*
* DESCRIPTION
* This function set e-shutter of OV76X0 to change exposure time.
*
* PARAMETERS
* shutter : exposured lines
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV7660_set_shutter(kal_uint16 shutter)
{
OV7660_exposure_lines=shutter;
write_OV76X0_shutter(shutter);
} /* OV7660_set_shutter */
/*************************************************************************
* FUNCTION
* OV7660_set_gain
*
* DESCRIPTION
* This function is to set global gain to sensor.
*
* PARAMETERS
* gain : sensor global gain(base: 0x40)
*
* RETURNS
* the actually gain set to sensor.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint16 OV7660_set_gain(kal_uint16 gain)
{
ov7660_sensor_global_gain=(gain*OV7660_sensor_gain_base)/BASEGAIN;
write_OV76X0_gain(ov7660_sensor_global_gain);
ov7660_sensor_global_gain=(ov7660_sensor_global_gain*BASEGAIN)/OV7660_sensor_gain_base;
#ifdef OUTPUT_DEBUG_INFO
sprintf(temp_buffer, "fps:%d, expo_lines:%d, gain-AE:%d, return:%d",sensor_frame_rate, OV7660_exposure_lines, gain, ov7660_sensor_global_gain);
rmmi_write_to_uart((kal_uint8*) temp_buffer, strlen(temp_buffer), KAL_TRUE);
#endif
return ov7660_sensor_global_gain;
}
/*************************************************************************
* FUNCTION
* OV7660_night_mode
*
* DESCRIPTION
* This function night mode of OV76X0.
*
* PARAMETERS
* none
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV7660_night_mode(kal_bool enable)
{
if(enable)
{
OV7660_MAX_EXPOSURE_LINES=2*(OV7660_PIXEL_CLK/OV7660_MIN_FRAME_RATE)/OV7660_VGA_PERIOD_PIXEL_NUMS;
#if ((defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6225_SERIES)||defined(DRV_ISP_6228_SERIES)||defined(DRV_ISP_6229_SERIES))&&defined(ISP_SUPPORT))
if(camera_oper_data.pregain_mode==ISP_ONLY)
#endif
ov7660_write_cmos_sensor(0x00,OV7660_night_gain);
OV7660_sensor_night_mode=KAL_TRUE;
}
else
{
OV7660_MAX_EXPOSURE_LINES=(OV7660_PIXEL_CLK/OV7660_MIN_FRAME_RATE)/OV7660_VGA_PERIOD_PIXEL_NUMS;
#if ((defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6225_SERIES)||defined(DRV_ISP_6228_SERIES)||defined(DRV_ISP_6229_SERIES))&&defined(ISP_SUPPORT))
if(camera_oper_data.pregain_mode==ISP_ONLY)
#endif
ov7660_write_cmos_sensor(0x00,ov7660_normal_gain);
OV7660_sensor_night_mode=KAL_FALSE;
}
#if ((defined(DRV_ISP_6219_SERIES)||defined(DRV_ISP_6227_SERIES)||defined(DRV_ISP_6225_SERIES)||defined(DRV_ISP_6228_SERIES)||defined(DRV_ISP_6229_SERIES))&&defined(ISP_SUPPORT))
if(camera_oper_data.pregain_mode==ISP_ONLY)
#endif
OV7660_sensor_gain_base=ov7660_read_gain();
} /* OV7660_night_mode */
#if (!defined(DRV_ISP_6219_SERIES))
extern void flashlight_power_on(kal_bool on);
void OV7660_set_Flashlight(kal_bool bEnable)
{
flashlight_power_on(bEnable);
} /* OV7660_set_Flashlight */
#endif
//Wonder, because 7660 is not qualified in 38, so here must be double check
#if (defined(DRV_ISP_6238_SERIES))
void OV7660_get_sensor_ae_info(sensor_ae_info *pInfo) {
pInfo->default_prev_line_pixels = IMAGE_SENSOR_VGA_WIDTH;
pInfo->current_prev_line_pixels = OV7660_VGA_PERIOD_PIXEL_NUMS;
//Wonder, it to be check!
pInfo->current_pclk= OV7660_preview_pclk_division;
}
kal_uint32 OV7660_get_image_sensor_full_width(void){
return OV7660_IMAGE_SENSOR_FULL_WIDTH;
}
#endif //DRV_ISP_6238_SERIES
/*************************************************************************
* FUNCTION
* image_sensor_func_OV76X0
*
* DESCRIPTION
* OV76X0 Image Sensor functions struct.
*
* PARAMETERS
* none
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
image_sensor_func_struct image_sensor_func_OV7660=
{
OV7660_init,
OV7660_get_id,
OV7660_get_size,
OV7660_get_period,
OV7660_preview,
OV7660_capture,
OV7660_write_reg,
OV7660_read_reg,
OV7660_set_shutter,
OV7660_night_mode,
OV7660_power_off,
OV7660_set_gain
#if (!defined(DRV_ISP_6219_SERIES))
,OV7660_set_Flashlight
#endif
#if (defined(DRV_ISP_6238_SERIES))
,OV7660_get_sensor_ae_info
,OV7660_get_image_sensor_full_width
#endif
}; /* image_sensor_func_OV76X0 */
/*************************************************************************
* FUNCTION
* cam_module_func_config
*
* DESCRIPTION
* This function maps the external camera module function API structure.
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV7660_image_sensor_func_config(void)
{
image_sensor_func=&image_sensor_func_OV7660;
} /* cam_module_func_config() */
// write camera_para to sensor register
void OV7660_camera_para_to_sensor(void)
{
kal_uint32 i;
for(i=0; 0xFFFFFFFF!=camera_para.SENSOR.reg[i].addr; i++)
{
OV7660_write_reg(camera_para.SENSOR.reg[i].addr, camera_para.SENSOR.reg[i].para);
}
#ifdef DRV_ISP_6238_SERIES //FACTORY_START_ADDR is for 3X common setting
for(i=FACTORY_START_ADDR; 0xFFFFFFFF!=camera_para.SENSOR.reg[i].addr; i++)
{
OV7660_write_reg(camera_para.SENSOR.reg[i].addr, camera_para.SENSOR.reg[i].para);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -