📄 image_sensor.c
字号:
GPIO_WriteIO(1, MODULE_CMPDN_PIN); // close #1
GPIO_ModeSetup(MODULE_CMPDN_PIN_2, 0);
GPIO_WriteIO(0, MODULE_CMPDN_PIN_2); // open #2
Delayms(300); //100
}
}
#endif
/*************************************************************************
* FUNCTION
* init_GC0306
*
* DESCRIPTION
* This function initialize the registers of CMOS sensor and ISP control register.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_int8 init_GC0306(void)
{
cis_module_power_on(KAL_TRUE); // Power On CIS Power
kal_sleep_task(2); // To wait for Stable Power
Delay1(10);
// SCCB high, output
GPIO_ModeSetup(SCCB_SERIAL_CLK_PIN,0);
GPIO_ModeSetup(SCCB_SERIAL_DATA_PIN,0);
GPIO_WriteIO(1, SCCB_SERIAL_CLK_PIN);
GPIO_WriteIO(1, SCCB_SERIAL_DATA_PIN);
GPIO_InitIO(OUTPUT, SCCB_SERIAL_CLK_PIN);
GPIO_InitIO(OUTPUT, SCCB_SERIAL_DATA_PIN);
SET_CMOS_CLOCK_POLARITY_LOW;
SET_VSYNC_POLARITY_HIGH;
SET_HSYNC_POLARITY_LOW; //LOW is hsync high active!
//ENABLE_CAMERA_SENSOR_HVALID_HREF; //test how it work?
ENABLE_CAMERA_INDATA_FORMAT;
SET_CAMERA_INPUT_TYPE(INPUT_YUV422);
SET_CAMERA_INPUT_ORDER(INPUT_ORDER_YCbY1Cr);
ENABLE_CAMERA_TG_CLK_48M;
UPLL_Enable(UPLL_OWNER_ISP);
//set_isp_driving_current(camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para);
set_isp_driving_current(ISP_DRIVING_8MA);
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(1);
SET_CMOS_DATA_LATCH(1);
#ifdef __DUAL_CAMERA_SUPPORT__
dual_camera_switch();
#endif
sensor_id=(read_cmos_sensor(0x00));
if(sensor_id != GC0306_SENSOR_ID)
return -1;
// Initail Sequence Write In.
//write_cmos_sensor(0x11,0x01);
//write_cmos_sensor( 0x44 , 0xa3 ); //e0: CbYCrY, e1:CrYCbY, e3:YCbYCr, e4 YCrYCb
write_cmos_sensor( 0x13 , 0x0 );
//write_cmos_sensor( 0x41 , 0x97 ); //HB 0x9f
write_cmos_sensor( 0xf1 , 0x00 ); //VB 0x9f
//write_cmos_sensor( 0x0 , 0x11 );
write_cmos_sensor( 0x1 , 0x8c );
write_cmos_sensor( 0x2 , 0x26 );
write_cmos_sensor( 0x3 , 0x01 ); //0x03
write_cmos_sensor( 0x4 , 0x0e ); //0xae
write_cmos_sensor( 0x5 , 0x0 );
write_cmos_sensor( 0x6 , 0x0 );
write_cmos_sensor( 0x7 , 0x0 );
write_cmos_sensor( 0x8 , 0x0 );
write_cmos_sensor( 0x9 , 0x1 );
write_cmos_sensor( 0x0a , 0xfc );
write_cmos_sensor( 0x0b , 0x2 );
write_cmos_sensor( 0x0c , 0x90 );
write_cmos_sensor( 0x0d , 0x05 );
write_cmos_sensor( 0x0e , 0x20 );
write_cmos_sensor( 0x0f , 0x30 );
write_cmos_sensor( 0x10 , 0x24 );
write_cmos_sensor( 0x11 , 0x10 );
write_cmos_sensor( 0x12 , 0x10 );
//write_cmos_sensor( 0x13 , 0x0 );
write_cmos_sensor( 0x14 , 0x00 ); //0xae
write_cmos_sensor( 0x15 , 0x08 );
write_cmos_sensor( 0x16 , 0x04 );
write_cmos_sensor( 0x17 , 0x0 );
write_cmos_sensor( 0x18 , 0x2 );
write_cmos_sensor( 0x19 , 0x00 );
write_cmos_sensor( 0x1a , 0x00 );
write_cmos_sensor( 0x1b , 0x0 );
write_cmos_sensor( 0x1c , 0x02 );
write_cmos_sensor( 0x1d , 0x02 );
write_cmos_sensor( 0x1e , 0x00 );
write_cmos_sensor( 0x40 , 0x7c );
write_cmos_sensor( 0x41 , 0x3d ); //0x9f
write_cmos_sensor( 0x42 , 0x30 );
write_cmos_sensor( 0x43 , 0x60 );
write_cmos_sensor( 0x44 , 0xe2 ); //e0: CbYCrY, e1:CrYCbY, e3:YCbYCr, e4 YCrYCb
write_cmos_sensor( 0x45 , 0x25 );
write_cmos_sensor( 0x46 , 0x20 );
//write_cmos_sensor( 0x47 , 0x0 );
write_cmos_sensor( 0x48 , 0x0 );
//write_cmos_sensor( 0x49 , 0x0 );
//write_cmos_sensor( 0x4a , 0x0 );
//write_cmos_sensor( 0x4b , 0x0 );
//write_cmos_sensor( 0x4c , 0x0 );
//write_cmos_sensor( 0x4d , 0x0 );
write_cmos_sensor( 0x4e , 0x23 ); //0X23
write_cmos_sensor( 0x4f , 0x1a );
/*write_cmos_sensor( 0x50 , 0x0 );
write_cmos_sensor( 0x51 , 0x20 );
write_cmos_sensor( 0x52 , 0x40 );
write_cmos_sensor( 0x53 , 0x60 );
write_cmos_sensor( 0x54 , 0x80 );
write_cmos_sensor( 0x55 , 0xa0 );
write_cmos_sensor( 0x56 , 0xc0 );
write_cmos_sensor( 0x57 , 0xe0 );*/
write_cmos_sensor( 0x59 , 0xf0 );
write_cmos_sensor( 0x5a , 0xf0 );
write_cmos_sensor( 0x5b , 0xf0 );
write_cmos_sensor( 0x5c , 0xf0 );
write_cmos_sensor( 0x61 , 0x40 ); //0x60, 2.0X
write_cmos_sensor( 0x63 , 0x40 ); //0x6a
write_cmos_sensor( 0x65 , 0x40 ); //0x78
write_cmos_sensor( 0x67 , 0x40 ); //0x60
write_cmos_sensor( 0x68 , 0x30 ); //0x60 , 2.0X, too big??
write_cmos_sensor( 0x69 , 0x48 );
write_cmos_sensor( 0x6a , 0xf8 );
write_cmos_sensor( 0x6b , 0xf4 );
write_cmos_sensor( 0x6c , 0xfc );
write_cmos_sensor( 0x6d , 0x53 );
write_cmos_sensor( 0x6e , 0xe7 );
write_cmos_sensor( 0x70 , 0x0 );
write_cmos_sensor( 0x71 , 0x10 );
write_cmos_sensor( 0x72 , 0x0 );
write_cmos_sensor( 0x73 , 0x14 );
write_cmos_sensor( 0x74 , 0x0 );
write_cmos_sensor( 0x75 , 0x10 );
write_cmos_sensor( 0x76 , 0x28 );
write_cmos_sensor( 0x77 , 0x3c );
write_cmos_sensor( 0x78 , 0x50 );
write_cmos_sensor( 0x80 , 0x10 );
write_cmos_sensor( 0x81 , 0x10 );
write_cmos_sensor( 0x82 , 0x34 );
write_cmos_sensor( 0x83 , 0x14 );
write_cmos_sensor( 0x84 , 0x40 );
write_cmos_sensor( 0x85 , 0x04 );
//write_cmos_sensor( 0x86 , 0x0 );
write_cmos_sensor( 0x87 , 0x93 );
write_cmos_sensor( 0x88 , 0x0a );
write_cmos_sensor( 0x89 , 0x4 );
//write_cmos_sensor( 0x8a , 0x18 );
write_cmos_sensor( 0x8b , 0x0a );
write_cmos_sensor( 0x8c , 0x12 );
//write_cmos_sensor( 0x8d , 0x80 );
//write_cmos_sensor( 0x8e , 0x0 );
//write_cmos_sensor( 0x8f , 0x0 );
write_cmos_sensor( 0x90 , 0x23 );
write_cmos_sensor( 0x91 , 0x3c );
write_cmos_sensor( 0x92 , 0x52 );
write_cmos_sensor( 0x93 , 0x74 );
write_cmos_sensor( 0x94 , 0x8e );
write_cmos_sensor( 0x95 , 0xa2 );
write_cmos_sensor( 0x96 , 0xb2 );
write_cmos_sensor( 0x97 , 0xbf );
write_cmos_sensor( 0x98 , 0xd2 );
write_cmos_sensor( 0x99 , 0xe2 );
write_cmos_sensor( 0x9a , 0xee );
write_cmos_sensor( 0x9b , 0xf6 );
write_cmos_sensor( 0x9c , 0xfe );
write_cmos_sensor( 0x9d , 0x80 );
write_cmos_sensor( 0x9e , 0x40 );
write_cmos_sensor( 0xa0 , 0x50 );//saturation
write_cmos_sensor( 0xa1 , 0x40 );//contrast
write_cmos_sensor( 0xa2 , 0x30 );//U saturation
write_cmos_sensor( 0xa3 , 0x30 );//V saturation
write_cmos_sensor( 0xa4 , 0xc0 );
write_cmos_sensor( 0xa5 , 0x2 );
write_cmos_sensor( 0xa6 , 0x60 );
write_cmos_sensor( 0xa7 , 0x4 );
write_cmos_sensor( 0xa8 , 0xf4 );
write_cmos_sensor( 0xa9 , 0x0c );
write_cmos_sensor( 0xaa , 0x01 );
write_cmos_sensor( 0xab , 0x00 );
write_cmos_sensor( 0xac , 0xf8 );
write_cmos_sensor( 0xad , 0x10 );
write_cmos_sensor( 0xae , 0x80 );
write_cmos_sensor( 0xaf , 0x80 );
write_cmos_sensor( 0xb0 , 0x10 );
write_cmos_sensor( 0xb1 , 0xff );
write_cmos_sensor( 0xbf , 0x18 ); //AWB_diff_range
write_cmos_sensor( 0xc0 , 0x20 );
write_cmos_sensor( 0xc1 , 0xf0 );
write_cmos_sensor( 0xc2 , 0x07 );
write_cmos_sensor( 0xc3 , 0x80 );
write_cmos_sensor( 0xc4 , 0x1 );
write_cmos_sensor( 0xc5 , 0x21 );//AWB_magin,AWB_speed
write_cmos_sensor( 0xc6 , 0x70 ); //AWB_max_gain
//write_cmos_sensor( 0xc7 , 0x0 );
//write_cmos_sensor( 0xc8 , 0x0 );
//write_cmos_sensor( 0xc9 , 0x0 );
write_cmos_sensor( 0xca , 0x40 );
write_cmos_sensor( 0xcb , 0x40 );
write_cmos_sensor( 0xcc , 0x40 );
write_cmos_sensor( 0xcd , 0x40 ); //R_ratio
write_cmos_sensor( 0xce , 0x40 ); //G_ratio
write_cmos_sensor( 0xcf , 0x40); //B_ratio
write_cmos_sensor( 0xd0 , 0x0 );
write_cmos_sensor( 0xd1 , 0x60 );
write_cmos_sensor( 0xd2 , 0xf4 );
//write_cmos_sensor( 0xd3 , 0x0 );
write_cmos_sensor( 0xd4 , 0x30 );
write_cmos_sensor( 0xd5 , 0xf0 );
write_cmos_sensor( 0xd6 , 0x58 ); //flicker_step ,william change 0625
write_cmos_sensor( 0xd7 , 0x02 ); //min_exp_l
write_cmos_sensor( 0xd8 , 0x03 ); //max_exp_h william change 0625
write_cmos_sensor( 0xd9 , 0x30 );
write_cmos_sensor( 0xda , 0x30 );
//write_cmos_sensor( 0xdb , 0x0 );
//write_cmos_sensor( 0xdc , 0x0 );
write_cmos_sensor( 0xdd , 0x40 );
write_cmos_sensor( 0xdf , 0x90 );
write_cmos_sensor( 0xe0 , 0x5 );
write_cmos_sensor( 0xe1 , 0x5 );
write_cmos_sensor( 0xe2 , 0x34 );
write_cmos_sensor( 0xe3 , 0x24 );
write_cmos_sensor( 0xe4 , 0x14 );
write_cmos_sensor( 0xe5 , 0x11 );
write_cmos_sensor( 0xe6 , 0x24 );
write_cmos_sensor( 0xe7 , 0x18 );
if(isSelfCaptureOn) //self capture active
{
write_cmos_sensor( 0xf , 0x20 );//0x30
write_cmos_sensor( 0x45 , 0x25 );//0x27
}
else
{
write_cmos_sensor( 0xf , 0x30 );//0x20
write_cmos_sensor( 0x45 , 0x24 );//0x26
}
normal_gain=0x00;//read_cmos_sensor(0x00);
sensor_gain_base=BASEGAIN;//0x40;//read_OV9650_gain();
return 1;
}
/*************************************************************************
* FUNCTION
* power_off_GC0306
*
* DESCRIPTION
* This function is to turn off sensor module power.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void power_off_GC0306(void)
{
//POWER_OFF_MODULE;
cis_module_power_on(KAL_FALSE);
#ifndef HW_SCCB
SET_SCCB_CLK_LOW;
SET_SCCB_DATA_LOW;
#endif
} /* power_off_GC0306 */
/*************************************************************************
* FUNCTION
* get_GC0306_id
*
* DESCRIPTION
* This function return the sensor read/write id of SCCB interface.
*
* PARAMETERS
* *sensor_write_id : address pointer of sensor write id
* *sensor_read_id : address pointer of sensor read id
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_GC0306_id(kal_uint8 *sensor_write_id, kal_uint8 *sensor_read_id)
{
*sensor_write_id=OV9650_WRITE_ID;
*sensor_read_id=OV9650_READ_ID;
} /* get_GC0306_id */
/*************************************************************************
* FUNCTION
* get_GC0306_size
*
* DESCRIPTION
* This function return the image width and height of image sensor.
*
* PARAMETERS
* *sensor_width : address pointer of horizontal effect pixels of image sensor
* *sensor_height : address pointer of vertical effect pixels of image sensor
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_GC0306_size(kal_uint16 *sensor_width, kal_uint16 *sensor_height)
{
*sensor_width=IMAGE_SENSOR_VGA_WIDTH; /* pixel numbers actually used in one frame */
*sensor_height=IMAGE_SENSOR_VGA_HEIGHT; /* line numbers actually used in one frame */
} /* get_GC0306_size */
/*************************************************************************
* FUNCTION
* get_GC0306_period
*
* DESCRIPTION
* This function return the image width and height of image sensor.
*
* PARAMETERS
* *pixel_number : address pointer of pixel numbers in one period of HSYNC
* *line_number : address pointer of line numbers in one period of VSYNC
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void get_GC0306_period(kal_uint16 *pixel_number, kal_uint16 *line_number)
{
*pixel_number=VGA_PERIOD_PIXEL_NUMS; /* pixel numbers in one period of HSYNC */
*line_number=VGA_PERIOD_LINE_NUMS; /* line numbers in one period of VSYNC */
} /* get_GC0306_period */
void GC0306_preview(image_sensor_exposure_window_struct *image_window, image_sensor_config_struct *sensor_config_data)
{
volatile kal_uint32 CISCTL_mode =read_cmos_sensor(0x0f); //read mirror,upsidedown
volatile kal_uint32 updown_mirror=(CISCTL_mode&0x30);
kal_uint16 current_shutter;
sensor_cap_state=KAL_FALSE;
g_bMJPEG_mode = KAL_FALSE;
// 1. OV0306's clock control register causes sensor output some abnormal frame even if
// it is written with the same value twice
// 2. MJPEG preview/capture use the same clock divider, no need to update for
// MJPEG encode mode
// if (sensor_config_data->isp_op_mode != ISP_MJPEG_ENCODE_MODE) {
//write_cmos_sensor(0x11,0x80); //MCLK = PCLK
// }
#if 1
if((sensor_config_data->isp_op_mode==ISP_MJPEG_PREVIEW_MODE)||
(sensor_config_data->isp_op_mode==ISP_MJPEG_ENCODE_MODE))
{
MPEG4_encode_mode=KAL_FALSE;
g_bMJPEG_mode = KAL_TRUE;
write_cmos_sensor(0x01,0x9a); //william change 0625
write_cmos_sensor(0x02,0x22);
write_cmos_sensor(0xd6,0x41);
/* config TG of ISP to match the setting of image sensor*/
SET_TG_OUTPUT_CLK_DIVIDER(3); //10fps
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(2);
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(3);
SET_CMOS_DATA_LATCH(2);
//write_cmos_sensor(0xd8 ,0x4 );
w_blank=160;
h_blank=120;
dummy_pixels=0;
dummy_lines=255;
}
else
#endif
#if 1 //chris move it to init_GC0306
if(sensor_config_data->frame_rate==0x0F) // MPEG4 Encode Mode
{
MPEG4_encode_mode=KAL_TRUE;
write_cmos_sensor(0x01,0x9a); //william change 0625
write_cmos_sensor(0x02,0x22);
write_cmos_sensor(0xd6,0x41);
/* config TG of ISP to match the setting of image sensor*/
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(3);
SET_CMOS_DATA_LATCH(2);
//write_cmos_sensor(0xd8 ,0x4 ); //flicker_step, div2, 24M
w_blank=160;
h_blank=120;
dummy_pixels=0;
dummy_lines=20;
}
else
{
MPEG4_encode_mode=KAL_FALSE;
write_cmos_sensor(0x01,0x8c); //william change 0625
write_cmos_sensor(0x02,0x26);
write_cmos_sensor(0xd6,0x58);
/* config TG of ISP to match the setting of image sensor*/
SET_TG_OUTPUT_CLK_DIVIDER(2); //30fps,1, william change 0625
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(1); // 1
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
//DISABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_TG_PIXEL_CLK_DIVIDER(2);
SET_CMOS_DATA_LATCH(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -