📄 ov2640.c
字号:
/* ov2640 - ov2640 camera driver
*
* Copyrith (c) 2006, OmniVision
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. NO WARRANTY OF ANY KIND is expressed or implied.
*
*
* OmniVision is a trademark of OmniVision Technologies, Inc.
*
* Version 1.00 July.04.2006 david zhu
* david@ovt.com.cn
*
*/
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/videodev.h>
#include <asm/dma.h>
#include "pxaovcamera.h"
#include "ovcamerachip.h"
#include "ov2640.h"
#define DEBUG
#ifdef DEBUG
#define ov2640print(fmt,args...) printk(KERN_WARNING "OV2640:" fmt, ## args)
#else
#define ov2640print(fmt,args...)
#endif
ovcamerachip g_ovcamerachip;
#define REG11A_UXGA 0x02
#define REG3DA_UXGA 0x2E
#define REG3DA_SVGA 0x35
#define QCIF 176
#define QVGA 320
#define CIF 352
#define VGA 640
#define SVGA 800
#define XGA 1024
#define SXGA 1280
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/********old code by jiahongling*****************************
const static u8 OV_REGS_INITIALIZE[] =
{
0xff, 0x00,
0x2c, 0xff,
0x2e, 0xdf,
0xff, 0x01,
0x12, 0x80,
0x3c, 0x35,
0x11, 0x02,
0x04, 0x28,
0x13, 0xe5,
0x14, 0x48,
0x2c, 0x0c,
0x33, 0x78,
0x3b, 0xf7,
0x36, 0x00,
0x37, 0x42,
0x3e, 0x00,
0x43, 0x11,
0x16, 0x10,
0x39, 0x82,
0x35, 0xc8,
0x22, 0x0f,
0x23, 0x00,
0x34, 0xa0,
0x06, 0x08,
0x07, 0xc0,
0x0d, 0xb7,
0x0e, 0x29,
0x4c, 0x00,
0x4a, 0x81,
0x21, 0x99,
0x09, 0x02,
0x24, 0x3e,
0x25, 0x38,
0x26, 0x81,
0x5c, 0x00,
0x63, 0x00,
0x7c, 0x00,
0x61, 0x70,
0x62, 0x80,
0x20, 0x80,
0x28, 0x30,
0x6c, 0x00,
0x6e, 0x00,
0x70, 0x02,
0x71, 0x94,
0x73, 0xc1,
0x3d, 0x34,
0x5a, 0x57,
0x4f, 0xbb,
0x50, 0x9c,
0x6d, 0x80,
0x39, 0x02,
0x3a, 0x33,
0x3b, 0xfb,
0x3c, 0x32,
0xff, 0x00,
0xe5, 0x7f,
0xf9, 0xc0,
0x41, 0x24,
0xe0, 0x14,
0x76, 0xff,
0x33, 0xa0,
0x42, 0x20,
0x43, 0x18,
0x4c, 0x00,
0x87, 0xd0,
0x88, 0x3f,
0xd7, 0x03,
0xd9, 0x10,
0xd3, 0x82,
0xc8, 0x08,
0xc9, 0x80,
0x7c, 0x00,
0x7d, 0x00,
0x7c, 0x03,
0x7d, 0x48,
0x7d, 0x48,
0x7c, 0x08,
0x7d, 0x20,
0x7d, 0x10,
0x7d, 0x0e,
0x90, 0x00,
0x91, 0x0e,
0x91, 0x1a,
0x91, 0x31,
0x91, 0x5a,
0x91, 0x69,
0x91, 0x75,
0x91, 0x7e,
0x91, 0x88,
0x91, 0x8f,
0x91, 0x96,
0x91, 0xa3,
0x91, 0xaf,
0x91, 0xc4,
0x91, 0xd7,
0x91, 0xe8,
0x91, 0x20,
0x92, 0x00,
0x93, 0x06,
0x93, 0xe3,
0x93, 0x31,
0x93, 0x05,
0x93, 0x00,
0x93, 0x04,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x96, 0x00,
0x97, 0x08,
0x97, 0x19,
0x97, 0x02,
0x97, 0x0c,
0x97, 0x24,
0x97, 0x30,
0x97, 0x28,
0x97, 0x26,
0x97, 0x02,
0x97, 0x98,
0x97, 0x80,
0x97, 0x00,
0x97, 0x00,
0xc3, 0xed,
0xc4, 0x9a,
0xa4, 0x01,
0xc5, 0x11,
0xc6, 0x51,
0xc7, 0x00,
0xb6, 0x66,
0xb8, 0xA5,
0xb7, 0x64,
0xb9, 0x7C,
0xb3, 0xaf,
0xb4, 0x97,
0xb5, 0xFF,
0xb0, 0xC5,
0xb1, 0x94,
0xb2, 0x0f,
0xc4, 0x9d,
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x1d,
0x50, 0x00,
0x51, 0x90,
0x52, 0x18,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0x90,
0x5b, 0x18,
0x5c, 0x05,
0xc3, 0xed,
0x7f, 0x00,
0xda, 0x04,
0xe5, 0x1f,
0xe1, 0x77,
0xe0, 0x00,
0xdd, 0xff,
0x05, 0x00,
0x3d, 0x48,
0xff, 0x01, // set sensor to SVGA
0x12, 0x40,
0x17, 0x11,
0x18, 0x43,
0x19, 0x00,
0x1a, 0x4b,
0x32, 0x09,
0x37, 0xc0,
0x4f, 0xca,
0x50, 0xa8,
0x6d, 0x00,
0x3d, 0x38,
0x35, 0xc0,
0x22, 0x0f,
0x6d, 0x00,
0xff, 0x00, // set output to QCIF // keep view angle
0x86, 0x3d,
0xc0, 0x64, // image horizontal size HSIze[10:3]
0xc1, 0x4b, // image Vertical size VSIze[10:3]
0x8c, 0x00, // HSize[11],HSize[2:0],Vsize[2:0]
0x50, 0x92, // down sample /4
0x51, 0xC8, // H_Size[7:0], 0x(real/4)
0x52, 0x96, // V_Size[7:0] (real/4)
0x53, 0x00, // OFFSET_X[7 0]
0x54, 0x00, // OFFSET_Y[7 0]
0x55, 0x00, // V_size[8],offset_y[10:8],H_Size[8],offset_X[10:8]
0x5a, 0x2c, // outw[7:0] real/4
0x5b, 0x24, // outH[7:0] real/4
0x5c, 0x00, // bit [7:4],zmspd ,bit2 outh[8],bit 1..0 ,outw[9 8]
0xd3, 0x04, // bit 6..0,DVP PCLK=sysclk(48)/[6..0]
0xe0, 0x04, // add the following 4 line to set YUV output
0xe1, 0x67,
0xda, 0x00, // RGB565 0x08 YUV 0x00
0xe0, 0x00,
0x00, 0x00
};
********************************************************/
/////////////////////////////////////////////////////////
/**************** add by syp according to ov *******************/
/////////////////////////////////////////////////////////
const static u8 OV_REGS_INITIALIZE[] =
{
0xff, 0x00,//使能table12
0x2c, 0xff,//
0x2e, 0xdf,
0xff, 0x01,
//0x12, 0x80,
0x3c, 0x32,
0x11, 0x00,//内部时钟关闭
0x09, 0x02,
0x04, 0x28,
0x13, 0xe5,
0x14, 0x48,
0x2c, 0x0c,
0x33, 0x78,
0x3a, 0x33,
0x3b, 0xfb,
//0x36, 0x00,
//0x37, 0x42,
0x3e, 0x00,
0x43, 0x11,
0x16, 0x10,
0x39, 0x02,
0x35, 0x88,
0x22, 0x0a,
0x37, 0x40,
0x23, 0x00,
0x34, 0xa0,
0x36, 0x1a,//
0x06, 0x02,///
0x07, 0xc0,
0x0d, 0xb7,
0x0e, 0x01, //
0x4c, 0x00,
0x4a, 0x81,
0x21, 0x99,
//0x24, 0x40,//
//0x09, 0x02,
0x24, 0x40,
0x25, 0x38,
0x26, 0x82,
0x5c, 0x00,
0x63, 0x00,
0x46, 0x3f,
0x61, 0x70,
0x62, 0x80,
0x7c, 0x05,
0x20, 0x80,
0x28, 0x30,
0x6c, 0x00,
0x6d, 0x80,//
0x6e, 0x00,
0x70, 0x02,
0x71, 0x94,
0x73, 0xc1,
0x3d, 0x34,
0x5a, 0x57,
0x4f, 0xbb,
0x50, 0x9c,
0xff, 0x00,//
/*0x6d, 0x80,
0x39, 0x02,
0x3a, 0x33,
0x3b, 0xfb,
0x3c, 0x32,
0xff, 0x00,*/
0xe5, 0x7f,
0xf9, 0xc0,
0x41, 0x24,
0xe0, 0x14,
0x76, 0xff,
0x33, 0xa0,
0x42, 0x20,
0x43, 0x18,
0x4c, 0x00,
0x87, 0xd0,
0x88, 0x3f,
0xd7, 0x03,
0xd9, 0x10,
0xd3, 0x82,
0xc8, 0x08,
0xc9, 0x80,
0x7c, 0x00,
0x7d, 0x00,
0x7c, 0x03,
0x7d, 0x48,
0x7d, 0x48,
0x7c, 0x08,
0x7d, 0x20,
0x7d, 0x10,
0x7d, 0x0e,
0x90, 0x00,
0x91, 0x0e,
0x91, 0x1a,
0x91, 0x31,
0x91, 0x5a, //
0x91, 0x69,
0x91, 0x75,
0x91, 0x7e,
0x91, 0x88,
0x91, 0x8f,
0x91, 0x96,
0x91, 0xa3,
0x91, 0xaf,
0x91, 0xc4,
0x91, 0xd7,
0x91, 0xe8,
0x91, 0x20,
0x92, 0x00,
0x93, 0x06,
0x93, 0xe3,
//0x93, 0x31,
0x93, 0x05,
0x93, 0x05,
0x93, 0x00,
0x93, 0x04,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x93, 0x00,
0x96, 0x00,
0x97, 0x08,
0x97, 0x19,
0x97, 0x02,
0x97, 0x0c,
0x97, 0x24,
0x97, 0x30,
0x97, 0x28,
0x97, 0x26,
0x97, 0x02,
0x97, 0x98,
0x97, 0x80,
0x97, 0x00,
0x97, 0x00,
0xc3, 0xed,
//0xc4, 0x9a,
0xa4, 0x00, //
0xc5, 0x11,
0xc6, 0x51,
0xbf, 0x80,//
0xc7, 0x00,
0xb6, 0x66,
0xb8, 0xA5,
0xb7, 0x64,
0xb9, 0x7C,
0xb3, 0xaf,
0xb4, 0x97,
0xb5, 0xFF,
0xb0, 0xC5,
0xb1, 0x94,
0xb2, 0x0f,
0xc4, 0x5c, //
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x1d,
0x50, 0x00,
0x51, 0x90,
0x52, 0x18,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0x90,
0x5b, 0x18,
0x5c, 0x05,
0xc3, 0xed,
0x7f, 0x00,
0xda, 0x00,
0xe5, 0x1f,
0xe1, 0x77,
0xe0, 0x00,
0xdd, 0x7f,
0x05, 0x00,
/*0x3d, 0x48,
0xff, 0x01, // set sensor to SVGA
0x12, 0x40,
0x17, 0x11,
0x18, 0x43,
0x19, 0x00,
0x1a, 0x4b,
0x32, 0x09,
0x37, 0xc0,
0x4f, 0xca,
0x50, 0xa8,
0x6d, 0x00,
0x3d, 0x38,
0x35, 0xc0,
0x22, 0x0f,
0x6d, 0x00,
0xff, 0x00, // set output to QCIF // keep view angle
0x86, 0x3d,
0xc0, 0x64, // image horizontal size HSIze[10:3]
0xc1, 0x4b, // image Vertical size VSIze[10:3]
0x8c, 0x00, // HSize[11],HSize[2:0],Vsize[2:0]
0x50, 0x92, // down sample /4
0x51, 0xC8, // H_Size[7:0], 0x(real/4)
0x52, 0x96, // V_Size[7:0] (real/4)
0x53, 0x00, // OFFSET_X[7 0]
0x54, 0x00, // OFFSET_Y[7 0]
0x55, 0x00, // V_size[8],offset_y[10:8],H_Size[8],offset_X[10:8]
0x5a, 0x2c, // outw[7:0] real/4
0x5b, 0x24, // outH[7:0] real/4
0x5c, 0x00, // bit [7:4],zmspd ,bit2 outh[8],bit 1..0 ,outw[9 8]
0xd3, 0x04, // bit 6..0,DVP PCLK=sysclk(48)/[6..0]
0xe0, 0x04, // add the following 4 line to set YUV output
0xe1, 0x67,
0xda, 0x00, // RGB565 0x08 YUV 0x00
0xe0, 0x00,
0x00, 0x00 */
};////end code by syp 2008.6.24
/////////////////////////////////////////////////////////////
//apply by ov
/*--------CIF:352*288----------*/
const static u8 OV2640_UXGA_CIF[]=
{
0xff, 0x00,
0xe0, 0x04,
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x35,
0x50, 0x92,
0x51, 0x90,
0x52, 0x2c,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0x58,
0x5b, 0x48,
0x5c, 0x00,
0xd3, 0x08,
0xe0, 0x00
};
/*--------QCIF:176*144----------*/
const static u8 OV2640_UXGA_QCIF[]=
{
0xff, 0x00,
0xc0, 0xC8,
0xc1, 0x96,
0x8c, 0x00,
0x86, 0x3D,
0x50, 0x9B,
0x51, 0x90,
0x52, 0x2C,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x5a, 0x2C,
0x5b, 0x24,
0x5c, 0x00,
0xd3, 0x04
};
/*-------QVGA:320*240---------*/
const static u8 OV2640_UXGA_QVGA[]=
{
0xff, 0x00,
0xe0, 0x04,
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x3d,
0x50, 0x92,
0x51, 0x90,
0x52, 0x2c,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0x50,
0x5b, 0x3c,
0x5c, 0x00,
0xd3, 0x04,
0xe0, 0x00
};
/*-------SVGA:800*600 ---------*/
const static u8 OV2640_UXGA_SVGA[]=
{
0xff, 0x00,
0xe0, 0x04,
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x35,
0x50, 0x89,
0x51, 0x90,
0x52, 0x2c,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0xc8,
0x5b, 0x96,
0x5c, 0x00,
0xd3, 0x02,
0xe0, 0x00
};
/*--------SXGA:1280*1024---------*/
const static u8 OV2640_UXGA_SXGA[]=
{
0xff, 0x00,
0xe0, 0x04,
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x3d,
0x50, 0x00,
0x51, 0x90,
0x52, 0x2c,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0x40,
0x5b, 0xf0,
0x5c, 0x01,
0xd3, 0x82,
0xe0, 0x00
};
/*-------VGA:640*480---------*/
const static u8 OV2640_UXGA_VGA[]=
{
0xff, 0x00,
0xe0, 0x04,
0xc0, 0xc8,
0xc1, 0x96,
0x86, 0x3d,
0x50, 0x89,
0x51, 0x90,
0x52, 0x2c,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x57, 0x00,
0x5a, 0xa0,
0x5b, 0x78,
0x5c, 0x00,
0xd3, 0x04,
0xe0, 0x00
};
/*-------XGA:1024*768---------*/
const static u8 OV2640_UXGA_XGA[]=
{
0xff, 0x00,
0xc0, 0xC8,
0xc1, 0x96,
0x8c, 0x00,
0x86, 0x3D,
0x50, 0x00,
0x51, 0x90,
0x52, 0x2C,
0x53, 0x00,
0x54, 0x00,
0x55, 0x88,
0x5a, 0x00,
0x5b, 0xC0,
0x5c, 0x01,
0xd3, 0x02
};
const static u8 *OV2640_SETTING_PELS[]=
{
OV2640_UXGA_QCIF,
OV2640_UXGA_QVGA,
OV2640_UXGA_CIF,
OV2640_UXGA_VGA,
OV2640_UXGA_SVGA,
OV2640_UXGA_XGA,
OV2640_UXGA_SXGA
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const static u8 OV2640_BRIGHTNESS_DISABLE[]=
{
0xFF, 0x00, 0xff,
0x7C, 0x00, 0xff,
0x7D, 0x00, 0x04,
0x00, 0x00, 0x00
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -