/*
* A V4L2 driver for ov5640 cameras.
*
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/videodev2.h>
#include <linux/clk.h>
#include <media/v4l2-device.h>
#include <media/v4l2-chip-ident.h>
#include <media/v4l2-mediabus.h>
#include <linux/io.h>
#include "camera.h"
MODULE_AUTHOR("raymonxiu");
MODULE_DESCRIPTION("A low-level driver for ov5640 sensors");
MODULE_LICENSE("GPL");
#define AF_WIN_NEW_COORD
//for internel driver debug
#define DEV_DBG_EN 0
#if(DEV_DBG_EN == 1)
#define vfe_dev_dbg(x,arg...) printk("[OV5640]"x,##arg)
#else
#define vfe_dev_dbg(x,arg...)
#endif
#define vfe_dev_err(x,arg...) printk("[OV5640]"x,##arg)
#define vfe_dev_print(x,arg...) printk("[OV5640]"x,##arg)
#define CAP_BDG 0
#if(CAP_BDG == 1)
#define vfe_dev_cap_dbg(x,arg...) printk("[OV5640_CAP_DBG]"x,##arg)
#else
#define vfe_dev_cap_dbg(x,arg...)
#endif
#define LOG_ERR_RET(x) { \
int ret; \
ret = x; \
if(ret < 0) {\
vfe_dev_err("error at %s\n",__func__); \
return ret; \
} \
}
//define module timing
#define MCLK (24*1000*1000)
static int MCLK_DIV = 1;
#ifdef CONFIG_ARCH_SUN9IW1P1
static int A80_VERSION = 0 ;
#endif
//#define FPGA_VER
#define VREF_POL V4L2_MBUS_VSYNC_ACTIVE_HIGH
#define HREF_POL V4L2_MBUS_HSYNC_ACTIVE_HIGH
#define CLK_POL V4L2_MBUS_PCLK_SAMPLE_RISING
#define V4L2_IDENT_SENSOR 0x5640
//define the voltage level of control signal
#define CSI_STBY_ON 1
#define CSI_STBY_OFF 0
#define CSI_RST_ON 0
#define CSI_RST_OFF 1
#define CSI_PWR_ON 1
#define CSI_PWR_OFF 0
#define CSI_AF_PWR_ON 1
#define CSI_AF_PWR_OFF 0
#define SENSOR_NAME "ov5640"
#define regval_list reg_list_a16_d8
#define REG_TERM 0xfffe
#define VAL_TERM 0xfe
#define REG_DLY 0xffff
#define FLASH_EN_POL 1
#define FLASH_MODE_POL 1
#ifdef _FLASH_FUNC_
#include "../flash_light/flash.h"
static struct flash_dev_info fl_info;
static unsigned int to_flash=0;
static unsigned int flash_auto_level=0x1c;
#endif
#define CONTINUEOUS_AF
//#define AUTO_FPS
#define DENOISE_LV_AUTO
#define SHARPNESS 0x18
#ifdef AUTO_FPS
//#define AF_FAST
#endif
#ifndef DENOISE_LV_AUTO
#define DENOISE_LV 0x8
#endif
#define AE_CW 1
unsigned int night_mode=0;
unsigned int Nfrms=1;
unsigned int cap_manual_gain=0x10;
#define CAP_GAIN_CAL 0//0--auto limit frames;1--manual fixed gain
#define CAP_MULTI_FRAMES
#ifdef CAP_MULTI_FRAMES
#define MAX_FRM_CAP 4
#else
#define MAX_FRM_CAP 1
#endif
/*
* Our nominal (default) frame rate.
*/
#define SENSOR_FRAME_RATE 30
/*
* The ov5640 sits on i2c with ID 0x78
*/
#define I2C_ADDR 0x78
//static struct delayed_work sensor_s_ae_ratio_work;
static struct v4l2_subdev *glb_sd;
/*
* Information we maintain about a known sensor.
*/
struct sensor_format_struct; /* coming later */
struct cfg_array { /* coming later */
struct regval_list * regs;
int size;
};
static inline struct sensor_info *to_state(struct v4l2_subdev *sd)
{
return container_of(sd, struct sensor_info, sd);
}
/*
* The default register settings
*
*/
static struct regval_list sensor_default_regs[] = {
{0x3103,0x11},//
{0x3008,0x82},//reset
{REG_DLY,0x1e},//delay 30ms
{0x3008,0x42},//power down
{0x3103,0x03},//
{0x3017,0x00},//disable oe
{0x3018,0x00},//
//pll and clock setting
{0x3034,0x18},//
{0x3035,0x21},//
{0x3036,0x46},//0x46->30fps
{0x3037,0x13},//////div
{0x3108,0x01},//
{0x3824,0x01},//
{0x3630,0x36},//
{0x3631,0x0e},//
{0x3632,0xe2},//
{0x3633,0x12},//
{0x3621,0xe0},//
{0x3704,0xa0},//
{0x3703,0x5a},//
{0x3715,0x78},//
{0x3717,0x01},//
{0x370b,0x60},//
{0x3705,0x1a},//
{0x3905,0x02},//
{0x3906,0x10},//
{0x3901,0x0a},//
{0x3731,0x12},//
{0x3600,0x08},//
{0x3601,0x33},//
// {0x302d,0x60},//
{0x3620,0x52},//
{0x371b,0x20},//
{0x471c,0x50},//
{0x3a13,0x43},//
{0x3a18,0x00},//
{0x3a19,0x88},//
{0x3635,0x13},//
{0x3636,0x03},//
{0x3634,0x40},//
{0x3622,0x01},//
{0x3c01,0x34},//
{0x3c04,0x28},//
{0x3c05,0x98},//
{0x3c06,0x00},//
{0x3c07,0x08},//
{0x3c08,0x00},//
{0x3c09,0x1c},//
{0x3c0a,0x9c},//
{0x3c0b,0x40},//
// {0x3820,0x41},// binning
// {0x3821,0x41},// binning
{0x3814,0x31},//
{0x3815,0x31},//
{0x3800,0x00},//
{0x3801,0x00},//
{0x3802,0x00},//
{0x3803,0x04},//
{0x3804,0x0a},//
{0x3805,0x3f},//
{0x3806,0x07},//
{0x3807,0x9b},//
{0x3808,0x02},//
{0x3809,0x80},//
{0x380a,0x01},//
{0x380b,0xe0},//
{0x380c,0x07},//
{0x380d,0x68},//
{0x380e,0x03},//
{0x380f,0xd8},//
{0x3810,0x00},//
{0x3811,0x10},//
{0x3812,0x00},//
{0x3813,0x06},//
{0x3618,0x00},//
{0x3612,0x29},//
{0x3708,0x64},//
{0x3709,0x52},//
{0x370c,0x03},//
{0x3a00,0x78},
{0x3a02,0x03},//
{0x3a03,0xd8},//
{0x3a08,0x01},//
{0x3a09,0x27},//
{0x3a0a,0x00},//
{0x3a0b,0xf6},//
{0x3a0e,0x03},//
{0x3a0d,0x04},//
{0x3a14,0x03},//
{0x3a15,0xd8},//
{0x4001,0x02},//
{0x4004,0x02},//
{0x3000,0x00},//
{0x3002,0x1c},//
{0x3004,0xff},//
{0x3006,0xc3},//
{0x300e,0x58},//
// {0x302e,0x00},//
{0x302c,0x42},//bit[7:6]: output drive capability
//00: 1x 01: 2x 10: 3x 11: 4x
{0x4300,0x30},//
{0x501f,0x00},//
{0x4713,0x03},//
{0x4407,0x04},//
{0x440e,0x00},//
{0x460b,0x35},//
{0x460c,0x20},//
{0x4837,0x22},
{0x5000,0xa7},//
{0x5001,0xa3},//
{0x4740,0x21},//hsync,vsync,clock pol,reference to application note,spec is wrong
//AWB
{0x3406,0x00}, //0x00}, // LA ORG
{0x5180,0xff}, //0xff}, // 0xff 0xff
{0x5181,0xf2}, //0x50}, // 0xf2 0x50
{0x5182,0x00}, //0x11}, // 0x00 0x11
{0x5183,0x14}, //0x14}, // 0x14 0x14
{0x5184,0x25}, //0x25}, // 0x25 0x25
{0x5185,0x24}, //0x24}, // 0x24 0x24
{0x5186,0x16}, //0x1c}, // 0x09 0x1c
{0x5187,0x16}, //0x18}, // 0x09 0x18
{0x5188,0x16}, //0x18}, // 0x09 0x18
{0x5189,0x6e}, //0x6e}, // 0x75 0x6e
{0x518a,0x68}, //0x68}, // 0x54 0x68
{0x518b,0xe0}, //0xa8}, // 0xe0 0xa8
{0x518c,0xb2}, //0xa8}, // 0xb2 0xa8
{0x518d,0x42}, //0x3d}, // 0x42 0x3d
{0x518e,0x3e}, //0x3d}, // 0x3d 0x3d
{0x518f,0x4c}, //0x54}, // 0x56 0x54
{0x5190,0x56}, //0x54}, // 0x46 0x54
{0x5191,0xf8}, //0xf8}, // 0xf8 0xf8
{0x5192,0x04}, //0x04}, // 0x04 0x04
{0x5193,0x70}, //0x70}, // 0x70 0x70
{0x5194,0xf0}, //0xf0}, // 0xf0 0xf0
{0x5195,0xf0}, //0xf0}, // 0xf0 0xf0
{0x5196,0x03}, //0x03}, // 0x03 0x03
{0x5197,0x01}, //0x01}, // 0x01 0x01
{0x5198,0x04}, //0x05}, // 0x04 0x05
{0x5199,0x12}, //0x7c}, // 0x12 0x7c
{0x519a,0x04}, //0x04}, // 0x04 0x04
{0x519b,0x00}, //0x00}, // 0x00 0x00
{0x519c,0x06}, //0x06}, // 0x06 0x06
{0x519d,0x82}, //0x79}, // 0x82 0x79
{0x519e,0x38}, //0x38}, // 0x38 0x38
//Color // LA ORG
{0x5381,0x1e}, //0x1e}, // 0x1e 0x1e
{0x5382,0x5b}, //0x5b}, // 0x5b 0x5b
{0x5383,0x14}, //0x08}, // 0x08 0x08
{0x5384,0x05}, //0x0a}, // 0x0a 0x05
{0x5385,0x77}, //0x7e}, // 0x7e 0x72
{0x5386,0x7c}, //0x88}, // 0x88 0x77
{0x5387,0x72}, //0x7c}, // 0x7c 0x6d
{0x5388,0x58}, //0x6c}, // 0x6c 0x4d
{0x5389,0x1a}, //0x10}, // 0x10 0x20
{0x538a,0x01}, //0x01}, // 0x01 0x01
{0x538b,0x98}, //0x98}, // 0x98 0x98
//Sharpness/Denoise
{0x5300,0x08},
{0x5301,0x30},
{0x5302
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
ov5640_registers_config.zip (1个子文件)
ov5640_registers_config.c 166KB
共 1 条
- 1
小波思基
- 粉丝: 70
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1