📄 image_sensor.c
字号:
write_cmos_sensor(0xBF, 0x80);
write_cmos_sensor(0xC7, 0x10);
write_cmos_sensor(0xB6, 0x66);
write_cmos_sensor(0xB8, 0xA5);
write_cmos_sensor(0xB7, 0x64);
write_cmos_sensor(0xB9, 0x7C);
write_cmos_sensor(0xB3, 0xAF);
write_cmos_sensor(0xB4, 0x97);
write_cmos_sensor(0xB5, 0xFF);
write_cmos_sensor(0xB0, 0xC5);
write_cmos_sensor(0xB1, 0x94);
write_cmos_sensor(0xB2, 0x0F);
write_cmos_sensor(0xB4, 0x5C);
//
write_cmos_sensor(0xC0, 0xC8);
write_cmos_sensor(0xC1, 0x96);
write_cmos_sensor(0x86, 0x1D);
write_cmos_sensor(0x50, 0x00);
write_cmos_sensor(0x51, 0x90);
write_cmos_sensor(0x52, 0x18);
write_cmos_sensor(0x53, 0x00);
write_cmos_sensor(0x54, 0x00);
write_cmos_sensor(0x55, 0x88);
write_cmos_sensor(0x57, 0x00);
write_cmos_sensor(0x5A, 0x90);
write_cmos_sensor(0x5B, 0x18);
write_cmos_sensor(0x5C, 0x05);
//
write_cmos_sensor(0xC3, 0xED);
write_cmos_sensor(0x7F, 0x00);
//
write_cmos_sensor(0xDA, 0x04);
//
write_cmos_sensor(0xE5, 0x1F);
write_cmos_sensor(0xE1, 0x67);
write_cmos_sensor(0xE0, 0x00);
write_cmos_sensor(0xDD, 0x7F);
write_cmos_sensor(0x05, 0x00);
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x2A, 0x30);
write_cmos_sensor(0x2B, 0x00);
write_cmos_sensor(0x11, 0x00);
write_cmos_sensor(0x12, 0x40); // SVGA mode
// setup windowing
write_cmos_sensor(0x17, 0x11);
write_cmos_sensor(0x18, 0x43);
write_cmos_sensor(0x19, 0x00);
write_cmos_sensor(0x1A, 0x4B);
write_cmos_sensor(0x32, 0x09);
write_cmos_sensor(0x03, 0x04);
write_cmos_sensor(0x3D, 0x38);
write_cmos_sensor(0x39, 0x12);
write_cmos_sensor(0x35, 0xDA);
write_cmos_sensor(0x22, 0x1A);
write_cmos_sensor(0x37, 0xC3);
write_cmos_sensor(0x23, 0x00);
write_cmos_sensor(0x34, 0xA0);
write_cmos_sensor(0x36, 0x1A);
write_cmos_sensor(0x06, 0x88);
write_cmos_sensor(0x07, 0xC0);
write_cmos_sensor(0x0D, 0x87);
write_cmos_sensor(0x0E, 0x41);
write_cmos_sensor(0x4C, 0x00);
//
write_cmos_sensor(0x63, 0x20);// CIP RAW
//
write_cmos_sensor(PAGE_SETTING_REG, 0x00);
write_cmos_sensor(0xC0, 0x66);
write_cmos_sensor(0xC1, 0x4C);
write_cmos_sensor(0x8C, 0x06);
write_cmos_sensor(0x86, 0x35);
write_cmos_sensor(0x50, 0x00);
write_cmos_sensor(0x51, 0xCC);
write_cmos_sensor(0x52, 0x99);
write_cmos_sensor(0x53, 0x00);
write_cmos_sensor(0x54, 0x00);
write_cmos_sensor(0x55, 0x00);
write_cmos_sensor(0x5A, 0xCC);
write_cmos_sensor(0x5B, 0x99);
write_cmos_sensor(0x5C, 0x00);
write_cmos_sensor(0xD3, 0x82);
//
write_cmos_sensor(0xDA, 0x04);
//
write_cmos_sensor(0xE5, 0x1F);
write_cmos_sensor(0xE1, 0x67);
write_cmos_sensor(0xE0, 0x00);
write_cmos_sensor(0xDD, 0x7F);
write_cmos_sensor(0x05, 0x00);
//
write_cmos_sensor(0x87, OV_WPC_BPC_CTRL);// Pixel correction on
write_cmos_sensor(0xC3, 0x81);
write_cmos_sensor(0xC2, 0x01);// raw
write_cmos_sensor(0x92, 0x71);
write_cmos_sensor(0x93, 0x00);
write_cmos_sensor(0x92, 0x00);
write_cmos_sensor(0x93, 0x00);
write_cmos_sensor(0x4F, 0xCA); // 50Hz banding
write_cmos_sensor(0x50, 0xA8); // 60Hz banding
write_cmos_sensor(PAGE_SETTING_REG, 0x00);
#else
write_cmos_sensor(PAGE_SETTING_REG, 0x00);
write_cmos_sensor(0x2C, 0xFF);
write_cmos_sensor(0x2E, 0xDF);
write_cmos_sensor(PAGE_SETTING_REG, 0x00);
write_cmos_sensor(0xE5, 0x7F); // Bypass DSP
write_cmos_sensor(0xF9, 0xC0); // Bypass DSP
write_cmos_sensor(0x05, 0x01); // Bypass DSP
write_cmos_sensor(0x88, 0x00); // Bypass DSP
write_cmos_sensor(0x89, 0x00); // Bypass DSP
write_cmos_sensor(0x76, 0x00); // Bypass DSP
write_cmos_sensor(0x85, 0x1F); // Bypass DSP
write_cmos_sensor(0x7F, 0x0F); // Bypass DSP
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x3C, 0x32); // reserved
write_cmos_sensor(0x2A, 0x30);
write_cmos_sensor(0x2B, 0x00);
write_cmos_sensor(0x11, 0x00); // clk divider
write_cmos_sensor(0x09, 0x02);
write_cmos_sensor(0x04, 0x28);
write_cmos_sensor(0x13, 0xE0); // AEC/AGC off
write_cmos_sensor(0x14, 0x48);
write_cmos_sensor(0x2C, 0x0C); // reserved
write_cmos_sensor(0x33, 0x78); // reserved
write_cmos_sensor(0x3A, 0x33); // reserved
write_cmos_sensor(0x3B, 0xFB); // reserved
write_cmos_sensor(0x3E, 0x00); // reserved
write_cmos_sensor(0x43, 0x11); // reserved
write_cmos_sensor(0x16, 0x10); // reserved
write_cmos_sensor(0x12, 0x40); // SVGA mode
// setup windowing
write_cmos_sensor(0x17, 0x11);
write_cmos_sensor(0x18, 0x43);
write_cmos_sensor(0x19, 0x00);
write_cmos_sensor(0x1A, 0x4B);
write_cmos_sensor(0x32, 0x09);
write_cmos_sensor(0x4F, 0xCA); // 50Hz banding
write_cmos_sensor(0x50, 0xA8); // 60Hz banding
write_cmos_sensor(0x5A, 0x23); // reserved
write_cmos_sensor(0x6D, 0x00); // reserved
write_cmos_sensor(0x3D, 0x38); // reserved
write_cmos_sensor(0x39, 0x12); // reserved
write_cmos_sensor(0x35, 0xDA); // reserved
write_cmos_sensor(0x22, 0x1A); // reserved
write_cmos_sensor(0x37, 0xC3); // reserved
write_cmos_sensor(0x23, 0x00); // reserved
write_cmos_sensor(0x34, 0xC0); // reserved
write_cmos_sensor(0x36, 0x1A); // reserved
write_cmos_sensor(0x06, 0x88); // reserved
write_cmos_sensor(0x07, 0xC0); // reserved
write_cmos_sensor(0x0D, 0x87);
write_cmos_sensor(0x0E, 0x41); // reserved
write_cmos_sensor(0x4C, 0x00); // reserved
write_cmos_sensor(0x4A, 0x81); // reserved
write_cmos_sensor(0x21, 0x99); // reserved
write_cmos_sensor(0x5C, 0x00); // reserved
write_cmos_sensor(0x63, 0x00); // reserved
write_cmos_sensor(0x61, 0x70); // histogram low
write_cmos_sensor(0x62, 0x80); // histogram high
write_cmos_sensor(0x7C, 0x05); // reserved
write_cmos_sensor(0x20, 0x80); // reserved
write_cmos_sensor(0x28, 0x30); // reserved
write_cmos_sensor(0x6C, 0x00); // reserved
write_cmos_sensor(0x6E, 0x00); // reserved
write_cmos_sensor(0x70, 0x02); // reserved
write_cmos_sensor(0x71, 0x94); // reserved
write_cmos_sensor(0x73, 0xc1); // reserved
write_cmos_sensor(PAGE_SETTING_REG, 0x00);
write_cmos_sensor(0x05, 0x01); // bypass DSP, sensor output directly
#endif
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x0F, 0x43); // reserved
write_cmos_sensor(0x2D, 0x00); // VSYNC pulse width
write_cmos_sensor(0x2E, 0x00); // VSYNC pulse width
write_cmos_sensor(0x11,0x01); // clock divider
write_cmos_sensor(0x12,0x40); // SVGA mode
// setup windowing
write_cmos_sensor(0x17, 0x10);
write_cmos_sensor(0x18, 0x43);
write_cmos_sensor(0x19, 0x00);
write_cmos_sensor(0x1A, 0x4d);
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x11, 0x01); // clock divider
write_cmos_sensor(0x3D, 0x38); // reserved
write_cmos_sensor(0x13, 0xC0); // turn off AGC/AEC
write_cmos_sensor(0x00, 0x00); // global gain
write_cmos_sensor(0x04, 0x28);
write_cmos_sensor(0x10, 0x33); // exposure line
write_cmos_sensor(0x45, 0x00); // AGC/AEC
}
/*************************************************************************
* FUNCTION
* OV2640_Init
*
* DESCRIPTION
* This function initialize the registers of CMOS sensor and ISP control register.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_int8 OV2640_Init(void)
{
volatile kal_uint32 i;
kal_uint16 iSensor_ID;
SET_TG_OUTPUT_CLK_DIVIDER(1);
SET_CMOS_RISING_EDGE(0);
SET_CMOS_FALLING_EDGE(1);
#ifdef USE_48MHZ
ENABLE_CAMERA_TG_CLK_48M;
UPLL_Enable(UPLL_OWNER_ISP);
#endif
SET_CMOS_CLOCK_POLARITY_LOW;
#ifdef OV_PROCESSING_RAW
SET_VSYNC_POLARITY_HIGH;
#else
SET_VSYNC_POLARITY_LOW;
#endif
SET_HSYNC_POLARITY_LOW;
ENABLE_CAMERA_PIXEL_CLKIN_ENABLE;
SET_FIRST_GRAB_COLOR(BAYER_Gr);
cis_module_power_on(KAL_TRUE); // Power On CIS Power
kal_sleep_task(2); // To wait for Stable Power
#if (defined(MT6228)||defined(MT6229))
kal_sleep_task(2);
#endif
SET_RESET_CMOS_SENSOR_HIGH; //Sensor RESET pin high//huafeizhou061016 del
for (i=0;i<0x8000;i++);
#if (defined(MT6228)||defined(MT6229))
for (i=0;i<0x8000;i++);
#endif
SET_RESET_CMOS_SENSOR_LOW; //Sensor RESET pin low
for (i=0;i<40000;i++);//about 1ms huafeizhou061016
#if (defined(MT6228)||defined(MT6229))
for (i=0;i<40000;i++);//about 1ms huafeizhou061016
#endif
SET_RESET_CMOS_SENSOR_HIGH; //Sensor RESET pin high
kal_sleep_task(4);
#if (defined(MT6228)||defined(MT6229))
kal_sleep_task(4);
#endif
set_isp_driving_current(camera_para.SENSOR.reg[CMMCLK_CURRENT_INDEX].para); //8MA
// Reset Sensor
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x12, 0x80);
kal_sleep_task(2);
#if (defined(MT6228)||defined(MT6229))
kal_sleep_task(2);
#endif
iSensor_ID = (read_cmos_sensor(0x0A) << 8) | read_cmos_sensor(0x0B);
if ((iSensor_ID != OV2640_SENSOR_ID_2C) && (iSensor_ID != OV2640_SENSOR_ID_2B)) {
return -1;
}
set_isp_interrupt_trigger_delay_lines(1);
// Initail Sequence Write In.
OV2640_InitialSetting();
camera_para_to_sensor();
//set sensor driving capacity 0x0==>1x 0x1==>3x 0x2==>2x 0x03==>4x
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x09, 0x03); //PCLK Driving current
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
// sensor_gain_base=read_OV2640_gain();
return 1;
} /* OV2640_Init */
/*************************************************************************
* FUNCTION
* OV2640_PowerOff
*
* DESCRIPTION
* This function is to turn off sensor module power.
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV2640_PowerOff(void)
{
cis_module_power_on(KAL_FALSE); // turn off sensor power
#ifdef USE_48MHZ
UPLL_Disable(UPLL_OWNER_ISP);
#endif
SET_SCCB_CLK_LOW;
SET_SCCB_DATA_LOW;
} /* OV2640_PowerOff */
/*************************************************************************
* FUNCTION
* OV2640_GetID
*
* DESCRIPTION
* This function return the sensor read/write id of SCCB interface.
*
* PARAMETERS
* *pWriteID : address pointer of sensor write id
* *pReadID : address pointer of sensor read id
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV2640_GetID(kal_uint8 *pWriteID, kal_uint8 *pReadID)
{
*pWriteID = OV2640_WRITE_ID;
*pReadID = OV2640_READ_ID;
} /* OV2640_GetID */
/*************************************************************************
* FUNCTION
* OV2640_GetSize
*
* DESCRIPTION
* This function return the image width and height of image sensor.
*
* PARAMETERS
* *pWidth : address pointer of horizontal effect pixels of image sensor
* *pHeight : address pointer of vertical effect pixels of image sensor
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV2640_GetSize(kal_uint16 *pWidth, kal_uint16 *pHeight)
{
*pWidth = IMAGE_SENSOR_FULL_WIDTH; // effect pixel number in one line
*pHeight = IMAGE_SENSOR_FULL_HEIGHT; // effective line number in one frame
} /* OV2640_GetSize */
/*************************************************************************
* FUNCTION
* get_OV2640_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 OV2640_GetPeriod(kal_uint16 *pPixels, kal_uint16 *pLines)
{
*pPixels = PV_PERIOD_PIXEL_NUMS; // pixel numbers in one period of HSYNC
*pLines = PV_PERIOD_LINE_NUMS; // line numbers in one period of VSYNC
} /* OV2640_GetPeriod */
void OV2640_Preview(image_sensor_exposure_window_struct *pImageWindow, image_sensor_config_struct *pSensorConfigData)
{
kal_uint8 iTemp;
kal_uint16 iDummyPixels, iDummyLines, iStartX, iStartY;
write_cmos_sensor(PAGE_SETTING_REG, 0x01);
write_cmos_sensor(0x12, 0x40); // change to SVGA(800x600) mode
#ifdef OV_PROCESSING_RAW
// setup sensor output ROI
write_cmos_sensor(0x17, 0x11);
write_cmos_sensor(0x18, 0x44);
write_cmos_sensor(0x32, 0x09);
write_cmos_sensor(0x19, 0x00);
write_cmos_sensor(0x1A, 0x4D);
write_cmos_sensor(0x03, 0x04);
write_cmos_sensor(0x4F, 0xCA); // 50Hz banding AEC 8 LSBs
write_cmos_sensor(0x50, 0xA8); // 60Hz banding AEC 8 LSBs
write_cmos_sensor(0x6D, 0x00); // reserved //????
write_cmos_sensor(0x3D, 0x38); // PLL/divider setting
write_cmos_sensor(0x39, 0x12); // PWCOM1, reserved
write_cmos_sensor(0x35, 0xDA); // reserved
iTemp = read_cmos_sensor(0x22); // ANCOM3
write_cmos_sensor(0x22, iTemp | 0x10);
write_cmos_sensor(0x37, 0xC3); // reserved
write_cmos_sensor(0x23, 0x00); // reserved
write_cmos_sensor(0x34, 0xA0); // ARCOM2, reserved
write_cmos_sensor(0x36, 0x1A); // reserved
write_cmos_sensor(0x06, 0x88); // reserved
write_cmos_sensor(0x07, 0xC0); // reserved
write_cmos_sensor(0x0D, 0x87); // reserved
write_cmos_sensor(0x0E, 0x41); // reserved
write_cmos_sensor(0x4C, 0x00); // reserved
write_cmos_sensor(PAGE_SETTING_REG, 0x00);
write_cmos_sensor(0xC0, 0x66);
write_cmos_sensor(0xC1, 0x4C);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -