⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image_sensor.c

📁 OV2640.rar
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -