以下是迅为4412开发板提供的OV5640摄像头驱动,将OV5640注册为I2C设备,提供设备节点/dev/video0。

驱动下载:https://download.csdn.net/download/q1449516487/11231317

详情参考代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/platform_device.h>
#include <linux/videodev2.h>
#include <media/v4l2-subdev.h>
#include <media/soc_camera.h>
#include <media/v4l2-chip-ident.h>
#include <linux/delay.h>/* add by cym 20130605 */
#include <linux/videodev2_samsung.h>
#include <linux/regulator/consumer.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/regs-gpio.h>
#include <mach/regs-clock.h>
/* end add *//* add by cym 20130605 */
enum {AUTO_FOCUS_FAILED,AUTO_FOCUS_DONE,AUTO_FOCUS_CANCELLED,
};#ifndef CONFIG_TC4_EVT
//static struct regulator *vdd18_5m_cam_regulator = NULL;
//static struct regulator *vdd28_5m_cam_regulator = NULL;
struct regulator *ov_vddaf_cam_regulator = NULL;
struct regulator *ov_vdd5m_cam_regulator = NULL;struct regulator *ov_vdd18_cam_regulator = NULL;
struct regulator *ov_vdd28_cam_regulator = NULL;int down_af_firmware_flag = 0;
#endif
/* end add *//* ANSI Color codes */
#define VT(CODES)  "\033[" CODES "m"
#define VT_NORMAL  VT("")
#define VT_RED     VT("0;32;31")
#define VT_GREEN   VT("1;32")
#define VT_YELLOW  VT("1;33")
#define VT_BLUE    VT("1;34")
#define VT_PURPLE  VT("0;35")#define OV5640_DBG#define xprintk(fmt, ...) \printk("%s()->%d " fmt, __func__, __LINE__, ## __VA_ARGS__)#ifdef OV5640_DBG#define _DBG(color, fmt, ...)  \xprintk(color "" fmt VT_NORMAL, ## __VA_ARGS__)#define OV_INFO(fmt, args...)  _DBG(VT_GREEN, fmt, ## args)
#define OV_ERR(fmt, args...)   _DBG(VT_RED, fmt, ## args)
#else
#define OV_INFO(fmt, args...)  do {} while(0)
#define OV_ERR(fmt, args...) do {} while(0)
#endif#define _INFO(color, fmt, ...) \xprintk(color "::" fmt ""VT_NORMAL, ## __VA_ARGS__)/* mainly used in test code */
#define INFO_PURLPLE(fmt, args...) _INFO(VT_PURPLE, fmt, ## args)
#define INFO_RED(fmt, args...)     _INFO(VT_RED, fmt, ## args)
#define INFO_GREEN(fmt, args...)   _INFO(VT_GREEN, fmt, ## args)
#define INFO_BLUE(fmt, args...)    _INFO(VT_BLUE, fmt, ## args)#define OV5640_I2C_NAME  "ov5640"/* * I2C write address: 0x78, read: 0x79 , give up least significant bit. */
#define OV5640_I2C_ADDR  (0x78 >> 1)/** sensor ID*/
#define OV5640  0x5640
#define VERSION(id, vers) ((id << 8) | (vers & 0XFF))/* default format */
#define QVGA_WIDTH  320
#define QVGA_HEIGHT 240#define VGA_WIDTH    640
#define VGA_HEIGHT  480#define XGA_WIDTH    1024
#define XGA_HEIGHT  768#define SXGA_WIDTH   1280
#define SXGA_HEIGHT 960#define UXGA_WIDTH   1600
#define UXGA_HEIGHT 1200#define QXGA_WIDTH  2048
#define QXGA_HEIGHT 1536#define QSXGA_WIDTH     2560
#define QSXGA_HEIGHT    1920  //normally 2048, but ov5640 only support simple qsxga#define CAPTURE_FRAME_RATE  500   /* multiplied by 100 */
#define PREVIEW_FRAME_RATE  1500   /* multiplied by 100 */#define OV5640_COLUMN_SKIP 0
#define OV5640_ROW_SKIP    0
#define OV5640_MAX_WIDTH   (QSXGA_WIDTH)
#define OV5640_MAX_HEIGHT  (QSXGA_HEIGHT)#define OV5640_HFLIP 0x1
#define OV5640_VFLIP 0x2enum ov5640_resolution {RESV_VGA = 1,RESV_XGA,RESV_SXGA,RESV_UXGA,RESV_QXGA,RESV_QSXGA,
};struct regval {unsigned short reg;unsigned char  val;
};struct ov5640_color_format {enum v4l2_mbus_pixelcode code;enum v4l2_colorspace colorspace;
};struct ov5640_win_size {char *name;enum ov5640_resolution resv;unsigned int  width;unsigned int  height;const struct regval *regs;
};struct ov5640_priv {struct v4l2_subdev  subdev;const struct ov5640_color_format *cfmt;const struct ov5640_win_size *win;int  model;int brightness;int contrast;int saturation;int hue;int exposure;int sharpness;int colorfx;int flip_flag;
};static const struct regval ov5640_init_regs[] = {/* for the setting , 24M Mlck input and 24M Plck output */{0x3103, 0x11}, {0x3008, 0x82}, /* soft reset */{0x3008, 0x42}, {0x3103, 0x03}, /* input clock, from PLL */{0x3017, 0xff}, /* d[9:0] pins I/O ctrl */{0x3018, 0xff}, /* system control */{0x3034, 0x1a}, /* MIPI 10-bit mode */{0x3035, 0x11}, /* clock, PLL sets */{0x3036, 0x46}, {0x3037, 0x13}, {0x3108, 0x01}, /* SCCB CLK root divider */{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, 0xf8}, {0x3635, 0x13}, {0x3636, 0x03}, {0x3634, 0x40}, {0x3622, 0x01}, {0x3c01, 0x34},  /* 50/60HZ detector */{0x3c04, 0x28}, {0x3c05, 0x98}, {0x3c06, 0x00}, {0x3c07, 0x08}, {0x3c08, 0x00}, {0x3c09, 0x1c}, {0x3c0a, 0x9c}, {0x3c0b, 0x40}, {0x3820, 0x41}, /* mirror and flip */{0x3821, 0x07}, {0x3814, 0x31}, /* image windowing */{0x3815, 0x31}, {0x3800, 0x00}, {0x3801, 0x00}, {0x3802, 0x00}, {0x3803, 0x04}, {0x3804, 0x0a}, {0x3805, 0x3f}, {0x3806, 0x07}, {0x3807, 0x9b}, {0x3808, 0x02}, /* 0x280==640 */{0x3809, 0x80}, {0x380a, 0x01}, /* 0x1e0==480 */{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}, {0x3a02, 0x03}, /* AEC/AGC control */{0x3a03, 0xd8}, {0x3a08, 0x01}, {0x3a09, 0x27}, {0x3a0a, 0x00}, {0x3a0b, 0xf6}, {0x3a0e, 0x03}, {0x3a0d, 0x04}, {0x3a14, 0x03}, {0x3a15, 0xd8}, {0x4001, 0x02}, /* BLC start line */{0x4004, 0x02}, /* BLC line number */{0x3000, 0x00}, /* block enable */{0x3002, 0x1c}, {0x3004, 0xff}, /* clock enable */{0x3006, 0xc3}, {0x300e, 0x58}, {0x302e, 0x00}, {0x4300, 0x32}, /* format ctrl: YUV422 UYVY */{0x501f, 0x00}, /* format MUX ctrl: ISP YUV422 */{0x4713, 0x03}, /* jpeg mode select: mode 3 */{0x4407, 0x04}, /* jpeg ctrl */{0x440e, 0x00}, {0x460b, 0x35}, /* VFIFO ctrl */{0x460c, 0x22}, {0x3824, 0x02}, {0x5000, 0xa7}, /* ISP top ctrl */{0x5001, 0xa3}, {0x5180, 0xff}, /* AWB ctrl */{0x5181, 0xf2}, {0x5182, 0x00}, {0x5183, 0x14}, {0x5184, 0x25}, {0x5185, 0x24}, {0x5186, 0x09}, {0x5187, 0x09}, {0x5188, 0x09}, {0x5189, 0x75}, {0x518a, 0x54}, {0x518b, 0xe0}, {0x518c, 0xb2}, {0x518d, 0x42}, {0x518e, 0x3d}, {0x518f, 0x56}, {0x5190, 0x46}, {0x5191, 0xf8}, {0x5192, 0x04}, {0x5193, 0x70}, {0x5194, 0xf0}, {0x5195, 0xf0}, {0x5196, 0x03}, {0x5197, 0x01}, {0x5198, 0x04}, {0x5199, 0x12}, {0x519a, 0x04}, {0x519b, 0x00}, {0x519c, 0x06}, {0x519d, 0x82}, {0x519e, 0x38}, {0x5381, 0x1e}, /* Color matrix */{0x5382, 0x5b}, {0x5383, 0x08}, {0x5384, 0x0a}, {0x5385, 0x7e}, {0x5386, 0x88}, {0x5387, 0x7c}, {0x5388, 0x6c}, {0x5389, 0x10}, {0x538a, 0x01}, {0x538b, 0x98}, {0x5300, 0x08}, /* Color interpolation */{0x5301, 0x30}, {0x5302, 0x10}, {0x5303, 0x00}, {0x5304, 0x08}, {0x5305, 0x30}, {0x5306, 0x08}, {0x5307, 0x16}, {0x5309, 0x08}, {0x530a, 0x30}, {0x530b, 0x04}, {0x530c, 0x06}, {0x5480, 0x01}, /* gamma ctrl */{0x5481, 0x08}, {0x5482, 0x14}, {0x5483, 0x28}, {0x5484, 0x51}, {0x5485, 0x65}, {0x5486, 0x71}, {0x5487, 0x7d}, {0x5488, 0x87}, {0x5489, 0x91}, {0x548a, 0x9a}, {0x548b, 0xaa}, {0x548c, 0xb8}, {0x548d, 0xcd}, {0x548e, 0xdd}, {0x548f, 0xea}, {0x5490, 0x1d}, {0x5580, 0x02}, /* special digital effects(SDE) */{0x5583, 0x40}, {0x5584, 0x10}, {0x5589, 0x10}, {0x558a, 0x00}, {0x558b, 0xf8}, {0x5800, 0x23}, /* LENC ctrl */{0x5801, 0x14}, {0x5802, 0x0f}, {0x5803, 0x0f}, {0x5804, 0x12}, {0x5805, 0x26}, {0x5806, 0x0c}, {0x5807, 0x08}, {0x5808, 0x05}, {0x5809, 0x05}, {0x580a, 0x08}, {0x580b, 0x0d}, {0x580c, 0x08}, {0x580d, 0x03}, {0x580e, 0x00}, {0x580f, 0x00}, {0x5810, 0x03}, {0x5811, 0x09}, {0x5812, 0x07}, {0x5813, 0x03}, {0x5814, 0x00}, {0x5815, 0x01}, {0x5816, 0x03}, {0x5817, 0x08}, {0x5818, 0x0d}, {0x5819, 0x08}, {0x581a, 0x05}, {0x581b, 0x06}, {0x581c, 0x08}, {0x581d, 0x0e}, {0x581e, 0x29}, {0x581f, 0x17}, {0x5820, 0x11}, {0x5821, 0x11}, {0x5822, 0x15}, {0x5823, 0x28}, {0x5824, 0x46}, {0x5825, 0x26}, {0x5826, 0x08}, {0x5827, 0x26}, {0x5828, 0x64}, {0x5829, 0x26}, {0x582a, 0x24}, {0x582b, 0x22}, {0x582c, 0x24}, {0x582d, 0x24}, {0x582e, 0x06}, {0x582f, 0x22}, {0x5830, 0x40}, {0x5831, 0x42}, {0x5832, 0x24}, {0x5833, 0x26}, {0x5834, 0x24}, {0x5835, 0x22}, {0x5836, 0x22}, {0x5837, 0x26}, {0x5838, 0x44}, {0x5839, 0x24}, {0x583a, 0x26}, {0x583b, 0x28}, {0x583c, 0x42}, {0x583d, 0xce}, {0x5025, 0x00}, {0x3a0f, 0x30}, /* AEC functions */{0x3a10, 0x28}, {0x3a1b, 0x30}, {0x3a1e, 0x26}, {0x3a11, 0x60}, {0x3a1f, 0x14}, {0x3008, 0x02}, /* soft reset/pwd default value */{0x3035, 0x21}, /* SC PLL ctrl */{0x3c01, 0xb4}, /* Band, 0x50Hz */{0x3c00, 0x04}, {0x3a19, 0x7c}, /* gain ceiling */{0x5800, 0x2c}, /* OV5640 LENC setting */{0x5801, 0x17}, {0x5802, 0x11}, {0x5803, 0x11}, {0x5804, 0x15}, {0x5805, 0x29}, {0x5806, 0x08}, {0x5807, 0x06}, {0x5808, 0x04}, {0x5809, 0x04}, {0x580a, 0x05}, {0x580b, 0x07}, {0x580c, 0x06}, {0x580d, 0x03}, {0x580e, 0x01}, {0x580f, 0x01}, {0x5810, 0x03}, {0x5811, 0x06}, {0x5812, 0x06}, {0x5813, 0x02}, {0x5814, 0x01}, {0x5815, 0x01}, {0x5816, 0x04}, {0x5817, 0x07}, {0x5818, 0x06}, {0x5819, 0x07}, {0x581a, 0x06}, {0x581b, 0x06}, {0x581c, 0x06}, {0x581d, 0x0e}, {0x581e, 0x31}, {0x581f, 0x12}, {0x5820, 0x11}, {0x5821, 0x11}, {0x5822, 0x11}, {0x5823, 0x2f}, {0x5824, 0x12}, {0x5825, 0x25}, {0x5826, 0x39}, {0x5827, 0x29}, {0x5828, 0x27}, {0x5829, 0x39}, {0x582a, 0x26}, {0x582b, 0x33}, {0x582c, 0x24}, {0x582d, 0x39}, {0x582e, 0x28}, {0x582f, 0x21}, {0x5830, 0x40}, {0x5831, 0x21}, {0x5832, 0x17}, {0x5833, 0x17}, {0x5834, 0x15}, {0x5835, 0x11}, {0x5836, 0x24}, {0x5837, 0x27}, {0x5838, 0x26}, {0x5839, 0x26}, {0x583a, 0x26}, {0x583b, 0x28}, {0x583c, 0x14}, {0x583d, 0xee}, {0x4005, 0x1a}, /* BLC always update */{0x5381, 0x26}, /* color matrix ctrl */{0x5382, 0x50}, {0x5383, 0x0c}, {0x5384, 0x09}, {0x5385, 0x74}, {0x5386, 0x7d}, {0x5387, 0x7e}, {0x5388, 0x75}, {0x5389, 0x09}, {0x538b, 0x98}, {0x538a, 0x01}, {0x5580, 0x02}, /* (SDE)UVAdjust Auto Mode */{0x5588, 0x01}, {0x5583, 0x40}, {0x5584, 0x10}, {0x5589, 0x0f}, {0x558a, 0x00}, {0x558b, 0x3f}, {0x5308, 0x25}, /* De-Noise, 0xAuto */{0x5304, 0x08}, {0x5305, 0x30}, {0x5306, 0x10}, {0x5307, 0x20}, {0x5180, 0xff}, /* awb ctrl */{0x5181, 0xf2}, {0x5182, 0x11}, {0x5183, 0x14}, {0x5184, 0x25}, {0x5185, 0x24}, {0x5186, 0x10}, {0x5187, 0x12}, {0x5188, 0x10}, {0x5189, 0x80}, {0x518a, 0x54}, {0x518b, 0xb8}, {0x518c, 0xb2}, {0x518d, 0x42}, {0x518e, 0x3a}, {0x518f, 0x56}, {0x5190, 0x46}, {0x5191, 0xf0}, {0x5192, 0xf}, {0x5193, 0x70}, {0x5194, 0xf0}, {0x5195, 0xf0}, {0x5196, 0x3}, {0x5197, 0x1}, {0x5198, 0x6}, {0x5199, 0x62}, {0x519a, 0x4}, {0x519b, 0x0}, {0x519c, 0x4}, {0x519d, 0xe7}, {0x519e, 0x38}, };static const struct regval ov5640_qsxga_regs[] = {{0x3820, 0x40},  /* diff. init */{0x3821, 0x06},{0x3814, 0x11}, /* image windowing */{0x3815, 0x11},{0x3803, 0x00},{0x3807, 0x9f},{0x3808, 0x0a}, /* 0x0a20==2592 */{0x3809, 0x20},{0x380a, 0x07}, /* 0x798==1944 */{0x380b, 0x98},{0x380c, 0x0b},{0x380d, 0x1c},{0x380e, 0x07},{0x380f, 0xb0},{0x3813, 0x04},{0x3618, 0x04},{0x3612, 0x4b},{0x3708, 0x21},{0x3709, 0x12},{0x370c, 0x00},{0x3a02, 0x07}, /* night mode */{0x3a03, 0xb0},{0x3a0e, 0x06},{0x3a0d, 0x08},{0x3a14, 0x07},{0x3a15, 0xb0},{0x4004, 0x06}, /* BLC line number */{0x5000, 0x07}, /* black/white pixel cancell, color interp. enable */{0x5181, 0x52}, /* AWB */{0x5182, 0x00},{0x5197, 0x01},{0x519e, 0x38},{0x3035, 0x21}, /* SC PLL */{0x5000, 0x27}, {0x5001, 0x83}, /* special effect, color matrix, AWB enable */{0x3035, 0x71},{0x4713, 0x02}, /* jpeg mode 2 */{0x3036, 0x69},{0x4407, 0x0c}, /* jpeg ctrl */{0x460b, 0x37},{0x460c, 0x20},{0x3824, 0x01},{0x4005, 0x1A},};/*
static const struct regval ov5640_qsxga_to_qvga_regs[] = {};
*/static const struct regval ov5640_qsxga_to_vga_regs[] = {{0x3800, 0x00}, /* image windowing */{0x3801, 0x00},{0x3802, 0x00},{0x3803, 0x00},{0x3804, 0xA },{0x3805, 0x3f},{0x3806, 0x7 },{0x3807, 0x9f},{0x3808, 0x2 }, /* 0x280== 640*/{0x3809, 0x80},{0x380a, 0x1 }, /* 0x1e0== 480*/{0x380b, 0xe0},{0x380c, 0xc },{0x380d, 0x80},{0x380e, 0x7 },{0x380f, 0xd0},{0x5001, 0xa3}, /* SDE, scaling, color matrix, AWB enable */{0x5680, 0x0 }, /* AVG ctrl */{0x5681, 0x0 },{0x5682, 0xA },{0x5683, 0x20},{0x5684, 0x0 },{0x5685, 0x0 },{0x5686, 0x7 },{0x5687, 0x98},};static const struct regval ov5640_qsxga_to_xga_regs[] = {{0x3800, 0x00},{0x3801, 0x00},{0x3802, 0x00},{0x3803, 0x00},{0x3804, 0xA },{0x3805, 0x3f},{0x3806, 0x7 },{0x3807, 0x9f},{0x3808, 0x4 }, /* 0x400==1024 */{0x3809, 0x0 },{0x380a, 0x3 }, /* 0x300== 768*/{0x380b, 0x0 },{0x380c, 0xc },{0x380d, 0x80},{0x380e, 0x7 },{0x380f, 0xd0},{0x5001, 0xa3},{0x5680, 0x0 },{0x5681, 0x0 },{0x5682, 0xA },{0x5683, 0x20},{0x5684, 0x0 },{0x5685, 0x0 },{0x5686, 0x7 },{0x5687, 0x98},};static const struct regval ov5640_qsxga_to_sxga_regs[] = {{0x3800, 0x00},{0x3801, 0x00},{0x3802, 0x00},{0x3803, 0x00},{0x3804, 0xA },{0x3805, 0x3f},{0x3806, 0x7 },{0x3807, 0x9f},{0x3808, 0x5 }, /* 0x500==1280 */{0x3809, 0x0 },{0x380a, 0x3 }, /* 0x3c0==960 */{0x380b, 0xc0},{0x380c, 0xc },{0x380d, 0x80},{0x380e, 0x7 },{0x380f, 0xd0},{0x5001, 0xa3},{0x5680, 0x0 },{0x5681, 0x0 },{0x5682, 0xA },{0x5683, 0x20},{0x5684, 0x0 },{0x5685, 0x0 },{0x5686, 0x7 },{0x5687, 0x98},};static const struct regval ov5640_qsxga_to_uxga_regs[] = {
#if 0{0x3800, 0x00},{0x3801, 0x00},{0x3802, 0x00},{0x3803, 0x00},{0x3804, 0xA },{0x3805, 0x3f},{0x3806, 0x7 },{0x3807, 0x9f},{0x3808, 0x6 }, /* 0x640== 1600*/{0x3809, 0x40},{0x380a, 0x4 }, /* 0x4b0==1200 */{0x380b, 0xb0},{0x380c, 0xc },{0x380d, 0x80},{0x380e, 0x7 },{0x380f, 0xd0},{0x5001, 0xa3},{0x5680, 0x0 },{0x5681, 0x0 },{0x5682, 0xA },{0x5683, 0x20},{0x5684, 0x0 },{0x5685, 0x0 },{0x5686, 0x7 },{0x5687, 0x98},
#else{0x3503, 0x07},{0x3a00, 0x38},{0x4050, 0x6e},{0x4051, 0x8f},{0x5302, 0x1c},{0x5303, 0x08},{0x5306, 0x0c},{0x5307, 0x1c},{0x3820, 0x40},{0x3821, 0x06},{0x3800, 0x00},{0x3801, 0x00},{0x3802, 0x00},{0x3803, 0x00},{0x3804, 0x0a},{0x3805, 0x3f},{0x3806, 0x07},{0x3807, 0x9f},{0x3808, 0x0a},{0x3809, 0x20},{0x380a, 0x07},{0x380b, 0x98},{0x3810, 0x00},{0x3811, 0x10},{0x3812, 0x00},{0x3813, 0x04},{0x3814, 0x11},{0x3815, 0x11},{0x3034, 0x1a},{0x3035, 0x11},{0x3036, 0x46},{0x3037, 0x13},{0x3038, 0x00},{0x3039, 0x00},{0x380c, 0x0b},{0x380d, 0x1c},{0x380e, 0x07},{0x380f, 0xb0},{0x3a08, 0x00},{0x3a09, 0xc5},{0x3a0e, 0x0a},{0x3a0a, 0x00},{0x3a0b, 0xa4},{0x3a0d, 0x0c},{0x3618, 0x04},{0x3612, 0x2b},{0x3709, 0x12},{0x370c, 0x00},{0x4004, 0x06},{0x3002, 0x00},{0x3006, 0xff},{0x4713, 0x02},{0x4407, 0x04},{0x460b, 0x37},{0x460c, 0x22},{0x4837, 0x16},{0x3824, 0x01},{0x5001, 0x83},{0x4202,0x00},
#endif
};static const struct regval ov5640_qsxga_to_qxga_regs[] = {{0x3800, 0x00},{0x3801, 0x00},{0x3802, 0x00},{0x3803, 0x00},{0x3804, 0xA },{0x3805, 0x3f},{0x3806, 0x7 },{0x3807, 0x9f},{0x3808, 0x8 }, /* 0x800==2048 */{0x3809, 0x0 },{0x380a, 0x6 }, /* 0x600==1536 */{0x380b, 0x0 },{0x380c, 0xc },{0x380d, 0x80},{0x380e, 0x7 },{0x380f, 0xd0},{0x5001, 0xa3},{0x5680, 0x0 },{0x5681, 0x0 },{0x5682, 0xA },{0x5683, 0x20},{0x5684, 0x0 },{0x5685, 0x0 },{0x5686, 0x7 },{0x5687, 0x98},};#if 0
static const struct v4l2_queryctrl ov5640_controls[] = {{.id       = V4L2_CID_VFLIP,.type     = V4L2_CTRL_TYPE_BOOLEAN,.name     = "Flip Vertically",.minimum = 0,.maximum   = 1,.step      = 1,.default_value = 0,},{.id     = V4L2_CID_HFLIP,.type     = V4L2_CTRL_TYPE_BOOLEAN,.name     = "Flip Horizontally",.minimum   = 0,.maximum   = 1,.step      = 1,.default_value = 0,},
};
#endif/* QVGA: 320*240 */
/*
static const struct ov5640_win_size ov5640_win_qvga = {.name     = "QVGA",.width    = QVGA_WIDTH,.height   = QVGA_HEIGHT,.regs     = ov5640_qsxga_to_qvga_regs,
};
*/static const struct ov5640_win_size ov5640_wins[] = {{.name    = "VGA",    /* VGA: 640*480 */.resv    = RESV_VGA,.width   = VGA_WIDTH, .height  = VGA_HEIGHT,.regs    = ov5640_qsxga_to_vga_regs,},{.name    = "XGA",    /* XGA: 1024*768 */.resv    = RESV_XGA,.width   = XGA_WIDTH,.height  = XGA_HEIGHT,.regs    = ov5640_qsxga_to_xga_regs,},{.name    = "SXGA",    /* SXGA: 1280*960  */.resv    = RESV_SXGA,.width   = SXGA_WIDTH,.height  = SXGA_HEIGHT,.regs    = ov5640_qsxga_to_sxga_regs,},{.name    = "UXGA",    /* UXGA: 1600*1200 */.resv    = RESV_UXGA,.width   = UXGA_WIDTH,.height  = UXGA_HEIGHT,.regs    = ov5640_qsxga_to_uxga_regs,},{.name    = "QXGA",    /* QXGA: 2048*1536 */.resv    = RESV_QXGA,.width   = QXGA_WIDTH,.height  = QXGA_HEIGHT,.regs    = ov5640_qsxga_to_qxga_regs,},{.name    = "QSXGA",    /* QSXGA: 2560*1920*/.resv    = RESV_QSXGA,.width   = QSXGA_WIDTH,.height  = QSXGA_HEIGHT,.regs    = ov5640_qsxga_regs,},};/** supported color format list*/
static const struct ov5640_color_format ov5640_cfmts[] = {{.code       = 2,//cym V4L2_MBUS_FMT_YUYV8_2X8_BE,.colorspace   = V4L2_COLORSPACE_JPEG,},{.code        = 3, //cym V4L2_MBUS_FMT_YUYV8_2X8_LE,.colorspace  = V4L2_COLORSPACE_JPEG,},{.code           = 0x2007, //cym V4L2_MBUS_FMT_YUYV8_2X8_LE,.colorspace     = V4L2_COLORSPACE_JPEG,},
};static int i2cc_get_reg(struct i2c_client *client,unsigned short reg, unsigned char *value)
{unsigned char buffer[2];int ret = 0;int err = 0;buffer[0] = (reg >> 8) & 0xFF;buffer[1] = reg & 0xFF;if (2 != (ret = i2c_master_send(client, buffer, 2))) {err = -2;OV_ERR("i2cc out error: ret == %d (should be 2)\n", ret);}if (1 != (ret = i2c_master_recv(client, buffer, 1))) {err = -1;OV_ERR("i2cc in error: ret == %d (should be 1)\n", ret);}//OV_INFO("ov5640 client: read 0x%x = 0x%x\n", reg, buffer[0]);*value = buffer[0];return (err);
}static int i2cc_set_reg(struct i2c_client *client,unsigned short reg, unsigned char value)
{unsigned char buffer[3];int ret = 0;int err = 0;buffer[0] = (reg >> 8) & 0xFF;buffer[1] = reg & 0xFF;buffer[2] = value;//OV_INFO("ov5640 client: writing 0x%x = 0x%x\n", reg, value);if (3 != (ret = i2c_master_send(client, buffer, 3))) {OV_ERR("i2cc out error: ret = %d (should be 3)\n", ret);err = -3;}return (err);
}#if 1
/* add by dg 2015-07-15*//*************************************************************************
* FUNCTION
*   OV5640_FOCUS_AD5820_Init
*
* DESCRIPTION
*   This function is to load micro code for AF function
*
* PARAMETERS
*   None
*
* RETURNS
*   None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static u8 AD5820_Config[] =
{0x02, 0x0f, 0xd6, 0x02, 0x0a, 0x39, 0xc2, 0x01, 0x22, 0x22, 0x00, 0x02, 0x0f, 0xb2, 0xe5, 0x1f, //0x8000,0x70, 0x72, 0xf5, 0x1e, 0xd2, 0x35, 0xff, 0xef, 0x25, 0xe0, 0x24, 0x4e, 0xf8, 0xe4, 0xf6, 0x08, //0x8010,0xf6, 0x0f, 0xbf, 0x34, 0xf2, 0x90, 0x0e, 0x93, 0xe4, 0x93, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, //0x8020,0x04, 0x7f, 0x05, 0x80, 0x02, 0x7f, 0xfb, 0x78, 0xbd, 0xa6, 0x07, 0x12, 0x0f, 0x04, 0x40, 0x04, //0x8030,0x7f, 0x03, 0x80, 0x02, 0x7f, 0x30, 0x78, 0xbc, 0xa6, 0x07, 0xe6, 0x18, 0xf6, 0x08, 0xe6, 0x78, //0x8040,0xb9, 0xf6, 0x78, 0xbc, 0xe6, 0x78, 0xba, 0xf6, 0x78, 0xbf, 0x76, 0x33, 0xe4, 0x08, 0xf6, 0x78, //0x8050,0xb8, 0x76, 0x01, 0x75, 0x4a, 0x02, 0x78, 0xb6, 0xf6, 0x08, 0xf6, 0x74, 0xff, 0x78, 0xc1, 0xf6, //0x8060,0x08, 0xf6, 0x75, 0x1f, 0x01, 0x78, 0xbc, 0xe6, 0x75, 0xf0, 0x05, 0xa4, 0xf5, 0x4b, 0x12, 0x0a, //0x8070,0xff, 0xc2, 0x37, 0x22, 0x78, 0xb8, 0xe6, 0xd3, 0x94, 0x00, 0x40, 0x02, 0x16, 0x22, 0xe5, 0x1f, //0x8080,0xb4, 0x05, 0x23, 0xe4, 0xf5, 0x1f, 0xc2, 0x01, 0x78, 0xb6, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, //0x8090,0x4e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xa2, 0x37, 0xe4, 0x33, 0xf5, 0x3c, 0x90, 0x30, 0x28, 0xf0, //0x80a0,0x75, 0x1e, 0x10, 0xd2, 0x35, 0x22, 0xe5, 0x4b, 0x75, 0xf0, 0x05, 0x84, 0x78, 0xbc, 0xf6, 0x90, //0x80b0,0x0e, 0x8c, 0xe4, 0x93, 0xff, 0x25, 0xe0, 0x24, 0x0a, 0xf8, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x78, //0x80c0,0xbc, 0xe6, 0x25, 0xe0, 0x24, 0x4e, 0xf8, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0xef, 0x12, 0x0f, 0x0b, //0x80d0,0xd3, 0x78, 0xb7, 0x96, 0xee, 0x18, 0x96, 0x40, 0x0d, 0x78, 0xbc, 0xe6, 0x78, 0xb9, 0xf6, 0x78, //0x80e0,0xb6, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x90, 0x0e, 0x8c, 0xe4, 0x93, 0x12, 0x0f, 0x0b, 0xc3, 0x78, //0x80f0,0xc2, 0x96, 0xee, 0x18, 0x96, 0x50, 0x0d, 0x78, 0xbc, 0xe6, 0x78, 0xba, 0xf6, 0x78, 0xc1, 0xa6, //0x8100,0x06, 0x08, 0xa6, 0x07, 0x78, 0xb6, 0xe6, 0xfe, 0x08, 0xe6, 0xc3, 0x78, 0xc2, 0x96, 0xff, 0xee, //0x8110,0x18, 0x96, 0x78, 0xc3, 0xf6, 0x08, 0xa6, 0x07, 0x90, 0x0e, 0x95, 0xe4, 0x18, 0x12, 0x0e, 0xe9, //0x8120,0x40, 0x02, 0xd2, 0x37, 0x78, 0xbc, 0xe6, 0x08, 0x26, 0x08, 0xf6, 0xe5, 0x1f, 0x64, 0x01, 0x70, //0x8130,0x4a, 0xe6, 0xc3, 0x78, 0xc0, 0x12, 0x0e, 0xdf, 0x40, 0x05, 0x12, 0x0e, 0xda, 0x40, 0x39, 0x12, //0x8140,0x0f, 0x02, 0x40, 0x04, 0x7f, 0xfe, 0x80, 0x02, 0x7f, 0x02, 0x78, 0xbd, 0xa6, 0x07, 0x78, 0xb9, //0x8150,0xe6, 0x24, 0x03, 0x78, 0xbf, 0xf6, 0x78, 0xb9, 0xe6, 0x24, 0xfd, 0x78, 0xc0, 0xf6, 0x12, 0x0f, //0x8160,0x02, 0x40, 0x06, 0x78, 0xc0, 0xe6, 0xff, 0x80, 0x04, 0x78, 0xbf, 0xe6, 0xff, 0x78, 0xbe, 0xa6, //0x8170,0x07, 0x75, 0x1f, 0x02, 0x78, 0xb8, 0x76, 0x01, 0x02, 0x02, 0x4a, 0xe5, 0x1f, 0x64, 0x02, 0x60, //0x8180,0x03, 0x02, 0x02, 0x2a, 0x78, 0xbe, 0xe6, 0xff, 0xc3, 0x78, 0xc0, 0x12, 0x0e, 0xe0, 0x40, 0x08, //0x8190,0x12, 0x0e, 0xda, 0x50, 0x03, 0x02, 0x02, 0x28, 0x12, 0x0f, 0x02, 0x40, 0x04, 0x7f, 0xff, 0x80, //0x81a0,0x02, 0x7f, 0x01, 0x78, 0xbd, 0xa6, 0x07, 0x78, 0xb9, 0xe6, 0x04, 0x78, 0xbf, 0xf6, 0x78, 0xb9, //0x81b0,0xe6, 0x14, 0x78, 0xc0, 0xf6, 0x18, 0x12, 0x0f, 0x04, 0x40, 0x04, 0xe6, 0xff, 0x80, 0x02, 0x7f, //0x81c0,0x00, 0x78, 0xbf, 0xa6, 0x07, 0xd3, 0x08, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x40, 0x04, 0xe6, 0xff, //0x81d0,0x80, 0x02, 0x7f, 0x00, 0x78, 0xc0, 0xa6, 0x07, 0xc3, 0x18, 0xe6, 0x64, 0x80, 0x94, 0xb3, 0x50, //0x81e0,0x04, 0xe6, 0xff, 0x80, 0x02, 0x7f, 0x33, 0x78, 0xbf, 0xa6, 0x07, 0xc3, 0x08, 0xe6, 0x64, 0x80, //0x81f0,0x94, 0xb3, 0x50, 0x04, 0xe6, 0xff, 0x80, 0x02, 0x7f, 0x33, 0x78, 0xc0, 0xa6, 0x07, 0x12, 0x0f, //0x8200,0x02, 0x40, 0x06, 0x78, 0xc0, 0xe6, 0xff, 0x80, 0x04, 0x78, 0xbf, 0xe6, 0xff, 0x78, 0xbe, 0xa6, //0x8210,0x07, 0x75, 0x1f, 0x03, 0x78, 0xb8, 0x76, 0x01, 0x80, 0x20, 0xe5, 0x1f, 0x64, 0x03, 0x70, 0x26, //0x8220,0x78, 0xbe, 0xe6, 0xff, 0xc3, 0x78, 0xc0, 0x12, 0x0e, 0xe0, 0x40, 0x05, 0x12, 0x0e, 0xda, 0x40, //0x8230,0x09, 0x78, 0xb9, 0xe6, 0x78, 0xbe, 0xf6, 0x75, 0x1f, 0x04, 0x78, 0xbe, 0xe6, 0x75, 0xf0, 0x05, //0x8240,0xa4, 0xf5, 0x4b, 0x02, 0x0a, 0xff, 0xe5, 0x1f, 0xb4, 0x04, 0x10, 0x90, 0x0e, 0x94, 0xe4, 0x78, //0x8250,0xc3, 0x12, 0x0e, 0xe9, 0x40, 0x02, 0xd2, 0x37, 0x75, 0x1f, 0x05, 0x22, 0x30, 0x01, 0x03, 0x02, //0x8260,0x04, 0xc0, 0x30, 0x02, 0x03, 0x02, 0x04, 0xc0, 0x90, 0x51, 0xa5, 0xe0, 0x78, 0x93, 0xf6, 0xa3, //0x8270,0xe0, 0x08, 0xf6, 0xa3, 0xe0, 0x08, 0xf6, 0xe5, 0x1f, 0x70, 0x3c, 0x75, 0x1e, 0x20, 0xd2, 0x35, //0x8280,0x12, 0x0c, 0x7a, 0x78, 0x7e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x78, 0x8b, 0xa6, 0x09, 0x18, 0x76, //0x8290,0x01, 0x12, 0x0c, 0x5b, 0x78, 0x4e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x78, 0x8b, 0xe6, 0x78, 0x6e, //0x82a0,0xf6, 0x75, 0x1f, 0x01, 0x78, 0x93, 0xe6, 0x78, 0x90, 0xf6, 0x78, 0x94, 0xe6, 0x78, 0x91, 0xf6, //0x82b0,0x78, 0x95, 0xe6, 0x78, 0x92, 0xf6, 0x22, 0x79, 0x90, 0xe7, 0xd3, 0x78, 0x93, 0x96, 0x40, 0x05, //0x82c0,0xe7, 0x96, 0xff, 0x80, 0x08, 0xc3, 0x79, 0x93, 0xe7, 0x78, 0x90, 0x96, 0xff, 0x78, 0x88, 0x76, //0x82d0,0x00, 0x08, 0xa6, 0x07, 0x79, 0x91, 0xe7, 0xd3, 0x78, 0x94, 0x96, 0x40, 0x05, 0xe7, 0x96, 0xff, //0x82e0,0x80, 0x08, 0xc3, 0x79, 0x94, 0xe7, 0x78, 0x91, 0x96, 0xff, 0x12, 0x0c, 0x8e, 0x79, 0x92, 0xe7, //0x82f0,0xd3, 0x78, 0x95, 0x96, 0x40, 0x05, 0xe7, 0x96, 0xff, 0x80, 0x08, 0xc3, 0x79, 0x95, 0xe7, 0x78, //0x8300,0x92, 0x96, 0xff, 0x12, 0x0c, 0x8e, 0x12, 0x0c, 0x5b, 0x78, 0x8a, 0xe6, 0x25, 0xe0, 0x24, 0x4e, //0x8310,0xf8, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x78, 0x8a, 0xe6, 0x24, 0x6e, 0xf8, 0xa6, 0x09, 0x78, 0x8a, //0x8320,0xe6, 0x24, 0x01, 0xff, 0xe4, 0x33, 0xfe, 0xd3, 0xef, 0x94, 0x0f, 0xee, 0x64, 0x80, 0x94, 0x80, //0x8330,0x40, 0x04, 0x7f, 0x00, 0x80, 0x05, 0x78, 0x8a, 0xe6, 0x04, 0xff, 0x78, 0x8a, 0xa6, 0x07, 0xe5, //0x8340,0x1f, 0xb4, 0x01, 0x0a, 0xe6, 0x60, 0x03, 0x02, 0x04, 0xc0, 0x75, 0x1f, 0x02, 0x22, 0x12, 0x0c, //0x8350,0x7a, 0x78, 0x80, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x12, 0x0c, 0x7a, 0x78, 0x82, 0xa6, 0x06, 0x08, //0x8360,0xa6, 0x07, 0x78, 0x6e, 0xe6, 0x78, 0x8c, 0xf6, 0x78, 0x6e, 0xe6, 0x78, 0x8d, 0xf6, 0x7f, 0x01, //0x8370,0xef, 0x25, 0xe0, 0x24, 0x4f, 0xf9, 0xc3, 0x78, 0x81, 0xe6, 0x97, 0x18, 0xe6, 0x19, 0x97, 0x50, //0x8380,0x0a, 0x12, 0x0c, 0x82, 0x78, 0x80, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x74, 0x6e, 0x2f, 0xf9, 0x78, //0x8390,0x8c, 0xe6, 0xc3, 0x97, 0x50, 0x08, 0x74, 0x6e, 0x2f, 0xf8, 0xe6, 0x78, 0x8c, 0xf6, 0xef, 0x25, //0x83a0,0xe0, 0x24, 0x4f, 0xf9, 0xd3, 0x78, 0x83, 0xe6, 0x97, 0x18, 0xe6, 0x19, 0x97, 0x40, 0x0a, 0x12, //0x83b0,0x0c, 0x82, 0x78, 0x82, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x74, 0x6e, 0x2f, 0xf9, 0x78, 0x8d, 0xe6, //0x83c0,0xd3, 0x97, 0x40, 0x08, 0x74, 0x6e, 0x2f, 0xf8, 0xe6, 0x78, 0x8d, 0xf6, 0x0f, 0xef, 0x64, 0x10, //0x83d0,0x70, 0x9e, 0xc3, 0x79, 0x81, 0xe7, 0x78, 0x83, 0x96, 0xff, 0x19, 0xe7, 0x18, 0x96, 0x78, 0x84, //0x83e0,0xf6, 0x08, 0xa6, 0x07, 0xc3, 0x79, 0x8c, 0xe7, 0x78, 0x8d, 0x96, 0x08, 0xf6, 0xd3, 0x79, 0x81, //0x83f0,0xe7, 0x78, 0x7f, 0x96, 0x19, 0xe7, 0x18, 0x96, 0x40, 0x05, 0x09, 0xe7, 0x08, 0x80, 0x06, 0xc3, //0x8400,0x79, 0x7f, 0xe7, 0x78, 0x81, 0x96, 0xff, 0x19, 0xe7, 0x18, 0x96, 0xfe, 0x78, 0x86, 0xa6, 0x06, //0x8410,0x08, 0xa6, 0x07, 0x79, 0x8c, 0xe7, 0xd3, 0x78, 0x8b, 0x96, 0x40, 0x05, 0xe7, 0x96, 0xff, 0x80, //0x8420,0x08, 0xc3, 0x79, 0x8b, 0xe7, 0x78, 0x8c, 0x96, 0xff, 0x78, 0x8f, 0xa6, 0x07, 0xe5, 0x1f, 0x64, //0x8430,0x02, 0x70, 0x69, 0x90, 0x0e, 0x91, 0x93, 0xff, 0x18, 0xe6, 0xc3, 0x9f, 0x50, 0x72, 0x12, 0x0c, //0x8440,0x4a, 0x12, 0x0c, 0x2f, 0x90, 0x0e, 0x8e, 0x12, 0x0c, 0x38, 0x78, 0x80, 0x12, 0x0c, 0x6b, 0x7b, //0x8450,0x04, 0x12, 0x0c, 0x1d, 0xc3, 0x12, 0x06, 0x45, 0x50, 0x56, 0x90, 0x0e, 0x92, 0xe4, 0x93, 0xff, //0x8460,0x78, 0x8f, 0xe6, 0x9f, 0x40, 0x02, 0x80, 0x11, 0x90, 0x0e, 0x90, 0xe4, 0x93, 0xff, 0xd3, 0x78, //0x8470,0x89, 0xe6, 0x9f, 0x18, 0xe6, 0x94, 0x00, 0x40, 0x03, 0x75, 0x1f, 0x05, 0x12, 0x0c, 0x4a, 0x12, //0x8480,0x0c, 0x2f, 0x90, 0x0e, 0x8f, 0x12, 0x0c, 0x38, 0x78, 0x7e, 0x12, 0x0c, 0x6b, 0x7b, 0x40, 0x12, //0x8490,0x0c, 0x1d, 0xd3, 0x12, 0x06, 0x45, 0x40, 0x18, 0x75, 0x1f, 0x05, 0x22, 0xe5, 0x1f, 0xb4, 0x05, //0x84a0,0x0f, 0xd2, 0x01, 0xc2, 0x02, 0xe4, 0xf5, 0x1f, 0xf5, 0x1e, 0xd2, 0x35, 0xd2, 0x33, 0xd2, 0x36, //0x84b0,0x22, 0xef, 0x8d, 0xf0, 0xa4, 0xa8, 0xf0, 0xcf, 0x8c, 0xf0, 0xa4, 0x28, 0xce, 0x8d, 0xf0, 0xa4, //0x84c0,0x2e, 0xfe, 0x22, 0xbc, 0x00, 0x0b, 0xbe, 0x00, 0x29, 0xef, 0x8d, 0xf0, 0x84, 0xff, 0xad, 0xf0, //0x84d0,0x22, 0xe4, 0xcc, 0xf8, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xec, 0x33, 0xfc, //0x84e0,0xee, 0x9d, 0xec, 0x98, 0x40, 0x05, 0xfc, 0xee, 0x9d, 0xfe, 0x0f, 0xd5, 0xf0, 0xe9, 0xe4, 0xce, //0x84f0,0xfd, 0x22, 0xed, 0xf8, 0xf5, 0xf0, 0xee, 0x84, 0x20, 0xd2, 0x1c, 0xfe, 0xad, 0xf0, 0x75, 0xf0, //0x8500,0x08, 0xef, 0x2f, 0xff, 0xed, 0x33, 0xfd, 0x40, 0x07, 0x98, 0x50, 0x06, 0xd5, 0xf0, 0xf2, 0x22, //0x8510,0xc3, 0x98, 0xfd, 0x0f, 0xd5, 0xf0, 0xea, 0x22, 0xe8, 0x8f, 0xf0, 0xa4, 0xcc, 0x8b, 0xf0, 0xa4, //0x8520,0x2c, 0xfc, 0xe9, 0x8e, 0xf0, 0xa4, 0x2c, 0xfc, 0x8a, 0xf0, 0xed, 0xa4, 0x2c, 0xfc, 0xea, 0x8e, //0x8530,0xf0, 0xa4, 0xcd, 0xa8, 0xf0, 0x8b, 0xf0, 0xa4, 0x2d, 0xcc, 0x38, 0x25, 0xf0, 0xfd, 0xe9, 0x8f, //0x8540,0xf0, 0xa4, 0x2c, 0xcd, 0x35, 0xf0, 0xfc, 0xeb, 0x8e, 0xf0, 0xa4, 0xfe, 0xa9, 0xf0, 0xeb, 0x8f, //0x8550,0xf0, 0xa4, 0xcf, 0xc5, 0xf0, 0x2e, 0xcd, 0x39, 0xfe, 0xe4, 0x3c, 0xfc, 0xea, 0xa4, 0x2d, 0xce, //0x8560,0x35, 0xf0, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, //0x8570,0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc, 0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, //0x8580,0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40, 0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, //0x8590,0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6, 0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, //0x85a0,0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9, 0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, //0x85b0,0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb, 0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, //0x85c0,0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb, 0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, //0x85d0,0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9, 0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, //0x85e0,0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, //0x85f0,0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a, 0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, //0x8600,0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, //0x8610,0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07, 0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, //0x8620,0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8, 0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, //0x8630,0xfa, 0xe4, 0xc8, 0xf9, 0x22, 0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, //0x8640,0xf0, 0xe8, 0x9c, 0x45, 0xf0, 0x22, 0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, //0x8650,0xee, 0x13, 0xfe, 0xef, 0x13, 0xff, 0xd8, 0xf1, 0x22, 0xe8, 0x60, 0x0f, 0xef, 0xc3, 0x33, 0xff, //0x8660,0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xd8, 0xf1, 0x22, 0xe4, 0x93, 0xfc, 0x74, //0x8670,0x01, 0x93, 0xfd, 0x74, 0x02, 0x93, 0xfe, 0x74, 0x03, 0x93, 0xff, 0x22, 0xe6, 0xfb, 0x08, 0xe6, //0x8680,0xf9, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xcb, 0xf8, 0x22, 0xec, 0xf6, 0x08, 0xed, 0xf6, 0x08, 0xee, //0x8690,0xf6, 0x08, 0xef, 0xf6, 0x22, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, //0x86a0,0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, //0x86b0,0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, //0x86c0,0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0x90, 0x38, 0x04, 0x78, 0x52, 0x12, 0x0b, 0xfd, 0x90, //0x86d0,0x38, 0x00, 0xe0, 0xfe, 0xa3, 0xe0, 0xfd, 0xed, 0xff, 0xc3, 0x12, 0x0b, 0x9e, 0x90, 0x38, 0x10, //0x86e0,0x12, 0x0b, 0x92, 0x90, 0x38, 0x06, 0x78, 0x54, 0x12, 0x0b, 0xfd, 0x90, 0x38, 0x02, 0xe0, 0xfe, //0x86f0,0xa3, 0xe0, 0xfd, 0xed, 0xff, 0xc3, 0x12, 0x0b, 0x9e, 0x90, 0x38, 0x12, 0x12, 0x0b, 0x92, 0xa3, //0x8700,0xe0, 0xb4, 0x31, 0x07, 0x78, 0x52, 0x79, 0x52, 0x12, 0x0c, 0x13, 0x90, 0x38, 0x14, 0xe0, 0xb4, //0x8710,0x71, 0x15, 0x78, 0x52, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, //0x8720,0xf9, 0x79, 0x53, 0xf7, 0xee, 0x19, 0xf7, 0x90, 0x38, 0x15, 0xe0, 0xb4, 0x31, 0x07, 0x78, 0x54, //0x8730,0x79, 0x54, 0x12, 0x0c, 0x13, 0x90, 0x38, 0x15, 0xe0, 0xb4, 0x71, 0x15, 0x78, 0x54, 0xe6, 0xfe, //0x8740,0x08, 0xe6, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x79, 0x55, 0xf7, 0xee, 0x19, //0x8750,0xf7, 0x79, 0x52, 0x12, 0x0b, 0xd9, 0x09, 0x12, 0x0b, 0xd9, 0xaf, 0x47, 0x12, 0x0b, 0xb2, 0xe5, //0x8760,0x44, 0xfb, 0x7a, 0x00, 0xfd, 0x7c, 0x00, 0x12, 0x04, 0xd3, 0x78, 0x5a, 0xa6, 0x06, 0x08, 0xa6, //0x8770,0x07, 0xaf, 0x45, 0x12, 0x0b, 0xb2, 0xad, 0x03, 0x7c, 0x00, 0x12, 0x04, 0xd3, 0x78, 0x56, 0xa6, //0x8780,0x06, 0x08, 0xa6, 0x07, 0xaf, 0x48, 0x78, 0x54, 0x12, 0x0b, 0xb4, 0xe5, 0x43, 0xfb, 0xfd, 0x7c, //0x8790,0x00, 0x12, 0x04, 0xd3, 0x78, 0x5c, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xaf, 0x46, 0x7e, 0x00, 0x78, //0x87a0,0x54, 0x12, 0x0b, 0xb6, 0xad, 0x03, 0x7c, 0x00, 0x12, 0x04, 0xd3, 0x78, 0x58, 0xa6, 0x06, 0x08, //0x87b0,0xa6, 0x07, 0xc3, 0x78, 0x5b, 0xe6, 0x94, 0x08, 0x18, 0xe6, 0x94, 0x00, 0x50, 0x05, 0x76, 0x00, //0x87c0,0x08, 0x76, 0x08, 0xc3, 0x78, 0x5d, 0xe6, 0x94, 0x08, 0x18, 0xe6, 0x94, 0x00, 0x50, 0x05, 0x76, //0x87d0,0x00, 0x08, 0x76, 0x08, 0x78, 0x5a, 0x12, 0x0b, 0xc6, 0xff, 0xd3, 0x78, 0x57, 0xe6, 0x9f, 0x18, //0x87e0,0xe6, 0x9e, 0x40, 0x0e, 0x78, 0x5a, 0xe6, 0x13, 0xfe, 0x08, 0xe6, 0x78, 0x57, 0x12, 0x0c, 0x08, //0x87f0,0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0x78, 0x5e, 0x12, 0x0b, 0xbe, 0xff, 0xd3, 0x78, 0x59, 0xe6, //0x8800,0x9f, 0x18, 0xe6, 0x9e, 0x40, 0x0e, 0x78, 0x5c, 0xe6, 0x13, 0xfe, 0x08, 0xe6, 0x78, 0x59, 0x12, //0x8810,0x0c, 0x08, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xe4, 0xfc, 0xfd, 0x78, 0x62, 0x12, 0x06, 0x99, //0x8820,0x78, 0x5a, 0x12, 0x0b, 0xc6, 0x78, 0x57, 0x26, 0xff, 0xee, 0x18, 0x36, 0xfe, 0x78, 0x66, 0x12, //0x8830,0x0b, 0xbe, 0x78, 0x59, 0x26, 0xff, 0xee, 0x18, 0x36, 0xfe, 0xe4, 0xfc, 0xfd, 0x78, 0x6a, 0x12, //0x8840,0x06, 0x99, 0x12, 0x0b, 0xce, 0x78, 0x66, 0x12, 0x06, 0x8c, 0xd3, 0x12, 0x06, 0x45, 0x40, 0x08, //0x8850,0x12, 0x0b, 0xce, 0x78, 0x66, 0x12, 0x06, 0x99, 0x78, 0x54, 0x12, 0x0b, 0xd0, 0x78, 0x6a, 0x12, //0x8860,0x06, 0x8c, 0xd3, 0x12, 0x06, 0x45, 0x40, 0x0a, 0x78, 0x54, 0x12, 0x0b, 0xd0, 0x78, 0x6a, 0x12, //0x8870,0x06, 0x99, 0x78, 0x61, 0xe6, 0x90, 0x60, 0x01, 0xf0, 0x78, 0x65, 0xe6, 0xa3, 0xf0, 0x78, 0x69, //0x8880,0xe6, 0xa3, 0xf0, 0x78, 0x55, 0xe6, 0xa3, 0xf0, 0x7d, 0x01, 0x78, 0x61, 0x12, 0x0b, 0xe9, 0x24, //0x8890,0x01, 0x12, 0x0b, 0xa6, 0x78, 0x65, 0x12, 0x0b, 0xe9, 0x24, 0x02, 0x12, 0x0b, 0xa6, 0x78, 0x69, //0x88a0,0x12, 0x0b, 0xe9, 0x24, 0x03, 0x12, 0x0b, 0xa6, 0x78, 0x6d, 0x12, 0x0b, 0xe9, 0x24, 0x04, 0x12, //0x88b0,0x0b, 0xa6, 0x0d, 0xbd, 0x05, 0xd4, 0xc2, 0x0e, 0xc2, 0x06, 0x22, 0x85, 0x08, 0x41, 0x90, 0x30, //0x88c0,0x24, 0xe0, 0xf5, 0x3d, 0xa3, 0xe0, 0xf5, 0x3e, 0xa3, 0xe0, 0xf5, 0x3f, 0xa3, 0xe0, 0xf5, 0x40, //0x88d0,0xa3, 0xe0, 0xf5, 0x3c, 0xd2, 0x34, 0xe5, 0x41, 0x12, 0x06, 0xb1, 0x09, 0x31, 0x03, 0x09, 0x35, //0x88e0,0x04, 0x09, 0x3b, 0x05, 0x09, 0x3e, 0x06, 0x09, 0x41, 0x07, 0x09, 0x4a, 0x08, 0x09, 0x5b, 0x12, //0x88f0,0x09, 0x73, 0x18, 0x09, 0x89, 0x19, 0x09, 0x5e, 0x1a, 0x09, 0x6a, 0x1b, 0x09, 0xad, 0x80, 0x09, //0x8900,0xb2, 0x81, 0x0a, 0x1d, 0x8f, 0x0a, 0x09, 0x90, 0x0a, 0x1d, 0x91, 0x0a, 0x1d, 0x92, 0x0a, 0x1d, //0x8910,0x93, 0x0a, 0x1d, 0x94, 0x0a, 0x1d, 0x98, 0x0a, 0x17, 0x9f, 0x0a, 0x1a, 0xec, 0x00, 0x00, 0x0a, //0x8920,0x38, 0x12, 0x0f, 0x74, 0x22, 0x12, 0x0f, 0x74, 0xd2, 0x03, 0x22, 0xd2, 0x03, 0x22, 0xc2, 0x03, //0x8930,0x22, 0xa2, 0x37, 0xe4, 0x33, 0xf5, 0x3c, 0x02, 0x0a, 0x1d, 0xc2, 0x01, 0xc2, 0x02, 0xc2, 0x03, //0x8940,0x12, 0x0d, 0x0d, 0x75, 0x1e, 0x70, 0xd2, 0x35, 0x02, 0x0a, 0x1d, 0x02, 0x0a, 0x04, 0x85, 0x40, //0x8950,0x4a, 0x85, 0x3c, 0x4b, 0x12, 0x0a, 0xff, 0x02, 0x0a, 0x1d, 0x85, 0x4a, 0x40, 0x85, 0x4b, 0x3c, //0x8960,0x02, 0x0a, 0x1d, 0xe4, 0xf5, 0x22, 0xf5, 0x23, 0x85, 0x40, 0x31, 0x85, 0x3f, 0x30, 0x85, 0x3e, //0x8970,0x2f, 0x85, 0x3d, 0x2e, 0x12, 0x0f, 0x46, 0x80, 0x1f, 0x75, 0x22, 0x00, 0x75, 0x23, 0x01, 0x74, //0x8980,0xff, 0xf5, 0x2d, 0xf5, 0x2c, 0xf5, 0x2b, 0xf5, 0x2a, 0x12, 0x0f, 0x46, 0x85, 0x2d, 0x40, 0x85, //0x8990,0x2c, 0x3f, 0x85, 0x2b, 0x3e, 0x85, 0x2a, 0x3d, 0xe4, 0xf5, 0x3c, 0x80, 0x70, 0x12, 0x0f, 0x16, //0x89a0,0x80, 0x6b, 0x85, 0x3d, 0x45, 0x85, 0x3e, 0x46, 0xe5, 0x47, 0xc3, 0x13, 0xff, 0xe5, 0x45, 0xc3, //0x89b0,0x9f, 0x50, 0x02, 0x8f, 0x45, 0xe5, 0x48, 0xc3, 0x13, 0xff, 0xe5, 0x46, 0xc3, 0x9f, 0x50, 0x02, //0x89c0,0x8f, 0x46, 0xe5, 0x47, 0xc3, 0x13, 0xff, 0xfd, 0xe5, 0x45, 0x2d, 0xfd, 0xe4, 0x33, 0xfc, 0xe5, //0x89d0,0x44, 0x12, 0x0f, 0x90, 0x40, 0x05, 0xe5, 0x44, 0x9f, 0xf5, 0x45, 0xe5, 0x48, 0xc3, 0x13, 0xff, //0x89e0,0xfd, 0xe5, 0x46, 0x2d, 0xfd, 0xe4, 0x33, 0xfc, 0xe5, 0x43, 0x12, 0x0f, 0x90, 0x40, 0x05, 0xe5, //0x89f0,0x43, 0x9f, 0xf5, 0x46, 0x12, 0x06, 0xd7, 0x80, 0x14, 0x85, 0x40, 0x48, 0x85, 0x3f, 0x47, 0x85, //0x8a00,0x3e, 0x46, 0x85, 0x3d, 0x45, 0x80, 0x06, 0x02, 0x06, 0xd7, 0x12, 0x0d, 0x7e, 0x90, 0x30, 0x24, //0x8a10,0xe5, 0x3d, 0xf0, 0xa3, 0xe5, 0x3e, 0xf0, 0xa3, 0xe5, 0x3f, 0xf0, 0xa3, 0xe5, 0x40, 0xf0, 0xa3, //0x8a20,0xe5, 0x3c, 0xf0, 0x90, 0x30, 0x23, 0xe4, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, //0x8a30,0xd0, 0x90, 0x3f, 0x0c, 0xe0, 0xf5, 0x32, 0xe5, 0x32, 0x30, 0xe3, 0x74, 0x30, 0x36, 0x66, 0x90, //0x8a40,0x60, 0x19, 0xe0, 0xf5, 0x0a, 0xa3, 0xe0, 0xf5, 0x0b, 0x90, 0x60, 0x1d, 0xe0, 0xf5, 0x14, 0xa3, //0x8a50,0xe0, 0xf5, 0x15, 0x90, 0x60, 0x21, 0xe0, 0xf5, 0x0c, 0xa3, 0xe0, 0xf5, 0x0d, 0x90, 0x60, 0x29, //0x8a60,0xe0, 0xf5, 0x0e, 0xa3, 0xe0, 0xf5, 0x0f, 0x90, 0x60, 0x31, 0xe0, 0xf5, 0x10, 0xa3, 0xe0, 0xf5, //0x8a70,0x11, 0x90, 0x60, 0x39, 0xe0, 0xf5, 0x12, 0xa3, 0xe0, 0xf5, 0x13, 0x30, 0x01, 0x06, 0x30, 0x33, //0x8a80,0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x09, 0x30, 0x02, 0x06, 0x30, 0x33, 0x03, 0xd3, 0x80, 0x01, //0x8a90,0xc3, 0x92, 0x0a, 0x30, 0x33, 0x0c, 0x30, 0x03, 0x09, 0x20, 0x02, 0x06, 0x20, 0x01, 0x03, 0xd3, //0x8aa0,0x80, 0x01, 0xc3, 0x92, 0x0b, 0x90, 0x30, 0x01, 0xe0, 0x44, 0x40, 0xf0, 0xe0, 0x54, 0xbf, 0xf0, //0x8ab0,0xe5, 0x32, 0x30, 0xe1, 0x14, 0x30, 0x34, 0x11, 0x90, 0x30, 0x22, 0xe0, 0xf5, 0x08, 0xe4, 0xf0, //0x8ac0,0x30, 0x00, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x08, 0xe5, 0x32, 0x30, 0xe5, 0x12, 0x90, 0x56, //0x8ad0,0xa1, 0xe0, 0xf5, 0x09, 0x30, 0x31, 0x09, 0x30, 0x05, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0d, //0x8ae0,0x90, 0x3f, 0x0c, 0xe5, 0x32, 0xf0, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, //0x8af0,0x0e, 0x7e, 0xe4, 0x93, 0xfe, 0x74, 0x01, 0x93, 0xff, 0xc3, 0x90, 0x0e, 0x7c, 0x74, 0x01, 0x93, //0x8b00,0x9f, 0xff, 0xe4, 0x93, 0x9e, 0xfe, 0xe4, 0x8f, 0x3b, 0x8e, 0x3a, 0xf5, 0x39, 0xf5, 0x38, 0xab, //0x8b10,0x3b, 0xaa, 0x3a, 0xa9, 0x39, 0xa8, 0x38, 0xaf, 0x4b, 0xfc, 0xfd, 0xfe, 0x12, 0x05, 0x28, 0x12, //0x8b20,0x0d, 0xe1, 0xe4, 0x7b, 0xff, 0xfa, 0xf9, 0xf8, 0x12, 0x05, 0xb3, 0x12, 0x0d, 0xe1, 0x90, 0x0e, //0x8b30,0x69, 0xe4, 0x12, 0x0d, 0xf6, 0x12, 0x0d, 0xe1, 0xe4, 0x85, 0x4a, 0x37, 0xf5, 0x36, 0xf5, 0x35, //0x8b40,0xf5, 0x34, 0xaf, 0x37, 0xae, 0x36, 0xad, 0x35, 0xac, 0x34, 0xa3, 0x12, 0x0d, 0xf6, 0x8f, 0x37, //0x8b50,0x8e, 0x36, 0x8d, 0x35, 0x8c, 0x34, 0xe5, 0x3b, 0x45, 0x37, 0xf5, 0x3b, 0xe5, 0x3a, 0x45, 0x36, //0x8b60,0xf5, 0x3a, 0xe5, 0x39, 0x45, 0x35, 0xf5, 0x39, 0xe5, 0x38, 0x45, 0x34, 0xf5, 0x38, 0xe4, 0xf5, //0x8b70,0x22, 0xf5, 0x23, 0x85, 0x3b, 0x31, 0x85, 0x3a, 0x30, 0x85, 0x39, 0x2f, 0x85, 0x38, 0x2e, 0x02, //0x8b80,0x0f, 0x46, 0xe0, 0xa3, 0xe0, 0x75, 0xf0, 0x02, 0xa4, 0xff, 0xae, 0xf0, 0xc3, 0x08, 0xe6, 0x9f, //0x8b90,0xf6, 0x18, 0xe6, 0x9e, 0xf6, 0x22, 0xff, 0xe5, 0xf0, 0x34, 0x60, 0x8f, 0x82, 0xf5, 0x83, 0xec, //0x8ba0,0xf0, 0x22, 0x78, 0x52, 0x7e, 0x00, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x02, 0x04, 0xc1, 0xe4, 0xfc, //0x8bb0,0xfd, 0x12, 0x06, 0x99, 0x78, 0x5c, 0xe6, 0xc3, 0x13, 0xfe, 0x08, 0xe6, 0x13, 0x22, 0x78, 0x52, //0x8bc0,0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xe4, 0xfc, 0xfd, 0x22, 0xe7, 0xc4, 0xf8, 0x54, 0xf0, 0xc8, 0x68, //0x8bd0,0xf7, 0x09, 0xe7, 0xc4, 0x54, 0x0f, 0x48, 0xf7, 0x22, 0xe6, 0xfc, 0xed, 0x75, 0xf0, 0x04, 0xa4, //0x8be0,0x22, 0x12, 0x06, 0x7c, 0x8f, 0x48, 0x8e, 0x47, 0x8d, 0x46, 0x8c, 0x45, 0x22, 0xe0, 0xfe, 0xa3, //0x8bf0,0xe0, 0xfd, 0xee, 0xf6, 0xed, 0x08, 0xf6, 0x22, 0x13, 0xff, 0xc3, 0xe6, 0x9f, 0xff, 0x18, 0xe6, //0x8c00,0x9e, 0xfe, 0x22, 0xe6, 0xc3, 0x13, 0xf7, 0x08, 0xe6, 0x13, 0x09, 0xf7, 0x22, 0xad, 0x39, 0xac, //0x8c10,0x38, 0xfa, 0xf9, 0xf8, 0x12, 0x05, 0x28, 0x8f, 0x3b, 0x8e, 0x3a, 0x8d, 0x39, 0x8c, 0x38, 0xab, //0x8c20,0x37, 0xaa, 0x36, 0xa9, 0x35, 0xa8, 0x34, 0x22, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0xfe, 0x12, 0x05, //0x8c30,0x28, 0x8f, 0x37, 0x8e, 0x36, 0x8d, 0x35, 0x8c, 0x34, 0x22, 0x78, 0x84, 0xe6, 0xfe, 0x08, 0xe6, //0x8c40,0xff, 0xe4, 0x8f, 0x37, 0x8e, 0x36, 0xf5, 0x35, 0xf5, 0x34, 0x22, 0x90, 0x0e, 0x8c, 0xe4, 0x93, //0x8c50,0x25, 0xe0, 0x24, 0x0a, 0xf8, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe6, 0xfe, 0x08, 0xe6, 0xff, //0x8c60,0xe4, 0x8f, 0x3b, 0x8e, 0x3a, 0xf5, 0x39, 0xf5, 0x38, 0x22, 0x78, 0x4e, 0xe6, 0xfe, 0x08, 0xe6, //0x8c70,0xff, 0x22, 0xef, 0x25, 0xe0, 0x24, 0x4e, 0xf8, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x22, 0x78, 0x89, //0x8c80,0xef, 0x26, 0xf6, 0x18, 0xe4, 0x36, 0xf6, 0x22, 0x75, 0x89, 0x03, 0x75, 0xa8, 0x01, 0x75, 0xb8, //0x8c90,0x04, 0x75, 0x34, 0xff, 0x75, 0x35, 0x0e, 0x75, 0x36, 0x15, 0x75, 0x37, 0x0d, 0x12, 0x0e, 0x9a, //0x8ca0,0x12, 0x00, 0x09, 0x12, 0x0f, 0x16, 0x12, 0x00, 0x06, 0xd2, 0x00, 0xd2, 0x34, 0xd2, 0xaf, 0x75, //0x8cb0,0x34, 0xff, 0x75, 0x35, 0x0e, 0x75, 0x36, 0x49, 0x75, 0x37, 0x03, 0x12, 0x0e, 0x9a, 0x30, 0x08, //0x8cc0,0x09, 0xc2, 0x34, 0x12, 0x08, 0xcb, 0xc2, 0x08, 0xd2, 0x34, 0x30, 0x0b, 0x09, 0xc2, 0x36, 0x12, //0x8cd0,0x02, 0x6c, 0xc2, 0x0b, 0xd2, 0x36, 0x30, 0x09, 0x09, 0xc2, 0x36, 0x12, 0x00, 0x0e, 0xc2, 0x09, //0x8ce0,0xd2, 0x36, 0x30, 0x0e, 0x03, 0x12, 0x06, 0xd7, 0x30, 0x35, 0xd3, 0x90, 0x30, 0x29, 0xe5, 0x1e, //0x8cf0,0xf0, 0xb4, 0x10, 0x05, 0x90, 0x30, 0x23, 0xe4, 0xf0, 0xc2, 0x35, 0x80, 0xc1, 0xe4, 0xf5, 0x4b, //0x8d00,0x90, 0x0e, 0x7a, 0x93, 0xff, 0xe4, 0x8f, 0x37, 0xf5, 0x36, 0xf5, 0x35, 0xf5, 0x34, 0xaf, 0x37, //0x8d10,0xae, 0x36, 0xad, 0x35, 0xac, 0x34, 0x90, 0x0e, 0x6a, 0x12, 0x0d, 0xf6, 0x8f, 0x37, 0x8e, 0x36, //0x8d20,0x8d, 0x35, 0x8c, 0x34, 0x90, 0x0e, 0x72, 0x12, 0x06, 0x7c, 0xef, 0x45, 0x37, 0xf5, 0x37, 0xee, //0x8d30,0x45, 0x36, 0xf5, 0x36, 0xed, 0x45, 0x35, 0xf5, 0x35, 0xec, 0x45, 0x34, 0xf5, 0x34, 0xe4, 0xf5, //0x8d40,0x22, 0xf5, 0x23, 0x85, 0x37, 0x31, 0x85, 0x36, 0x30, 0x85, 0x35, 0x2f, 0x85, 0x34, 0x2e, 0x12, //0x8d50,0x0f, 0x46, 0xe4, 0xf5, 0x22, 0xf5, 0x23, 0x90, 0x0e, 0x72, 0x12, 0x0d, 0xea, 0x12, 0x0f, 0x46, //0x8d60,0xe4, 0xf5, 0x22, 0xf5, 0x23, 0x90, 0x0e, 0x6e, 0x12, 0x0d, 0xea, 0x02, 0x0f, 0x46, 0xe5, 0x40, //0x8d70,0x24, 0xf2, 0xf5, 0x37, 0xe5, 0x3f, 0x34, 0x43, 0xf5, 0x36, 0xe5, 0x3e, 0x34, 0xa2, 0xf5, 0x35, //0x8d80,0xe5, 0x3d, 0x34, 0x28, 0xf5, 0x34, 0xe5, 0x37, 0xff, 0xe4, 0xfe, 0xfd, 0xfc, 0x78, 0x18, 0x12, //0x8d90,0x06, 0x69, 0x8f, 0x40, 0x8e, 0x3f, 0x8d, 0x3e, 0x8c, 0x3d, 0xe5, 0x37, 0x54, 0xa0, 0xff, 0xe5, //0x8da0,0x36, 0xfe, 0xe4, 0xfd, 0xfc, 0x78, 0x07, 0x12, 0x06, 0x56, 0x78, 0x10, 0x12, 0x0f, 0x9a, 0xe4, //0x8db0,0xff, 0xfe, 0xe5, 0x35, 0xfd, 0xe4, 0xfc, 0x78, 0x0e, 0x12, 0x06, 0x56, 0x12, 0x0f, 0x9d, 0xe4, //0x8dc0,0xff, 0xfe, 0xfd, 0xe5, 0x34, 0xfc, 0x78, 0x18, 0x12, 0x06, 0x56, 0x78, 0x08, 0x12, 0x0f, 0x9a, //0x8dd0,0x22, 0x8f, 0x3b, 0x8e, 0x3a, 0x8d, 0x39, 0x8c, 0x38, 0x22, 0x12, 0x06, 0x7c, 0x8f, 0x31, 0x8e, //0x8de0,0x30, 0x8d, 0x2f, 0x8c, 0x2e, 0x22, 0x93, 0xf9, 0xf8, 0x02, 0x06, 0x69, 0x00, 0x00, 0x00, 0x00, //0x8df0,0x12, 0x01, 0x17, 0x08, 0x31, 0x15, 0x53, 0x54, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x13, 0x01, //0x8e00,0x10, 0x01, 0x56, 0x40, 0x1a, 0x30, 0x29, 0x7e, 0x00, 0x30, 0x04, 0x20, 0xdf, 0x30, 0x05, 0x40, //0x8e10,0xbf, 0x50, 0x03, 0x00, 0xfd, 0x50, 0x27, 0x01, 0xfe, 0x60, 0x00, 0x11, 0x00, 0x3f, 0x05, 0x30, //0x8e20,0x00, 0x3f, 0x06, 0x22, 0x00, 0x3f, 0x01, 0x2a, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x36, 0x06, 0x07, //0x8e30,0x00, 0x3f, 0x0b, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x40, 0xbf, 0x30, 0x01, 0x00, //0x8e40,0xbf, 0x30, 0x29, 0x70, 0x00, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x36, 0x03, 0x36, //0x8e50,0x02, 0x41, 0x44, 0x58, 0x20, 0x18, 0x10, 0x0a, 0x04, 0x04, 0x00, 0x03, 0xff, 0x64, 0x00, 0x00, //0x8e60,0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x06, 0x00, 0x03, 0x51, 0x00, 0x7a, //0x8e70,0x50, 0x3c, 0x28, 0x1e, 0x10, 0x10, 0x50, 0x2d, 0x28, 0x16, 0x10, 0x10, 0x02, 0x00, 0x10, 0x0c, //0x8e80,0x10, 0x04, 0x0c, 0x6e, 0x06, 0x05, 0x00, 0xa5, 0x5a, 0x00, 0xae, 0x35, 0xaf, 0x36, 0xe4, 0xfd, //0x8e90,0xed, 0xc3, 0x95, 0x37, 0x50, 0x33, 0x12, 0x0f, 0xe2, 0xe4, 0x93, 0xf5, 0x38, 0x74, 0x01, 0x93, //0x8ea0,0xf5, 0x39, 0x45, 0x38, 0x60, 0x23, 0x85, 0x39, 0x82, 0x85, 0x38, 0x83, 0xe0, 0xfc, 0x12, 0x0f, //0x8eb0,0xe2, 0x74, 0x03, 0x93, 0x52, 0x04, 0x12, 0x0f, 0xe2, 0x74, 0x02, 0x93, 0x42, 0x04, 0x85, 0x39, //0x8ec0,0x82, 0x85, 0x38, 0x83, 0xec, 0xf0, 0x0d, 0x80, 0xc7, 0x22, 0x78, 0xbe, 0xe6, 0xd3, 0x08, 0xff, //0x8ed0,0xe6, 0x64, 0x80, 0xf8, 0xef, 0x64, 0x80, 0x98, 0x22, 0x93, 0xff, 0x7e, 0x00, 0xe6, 0xfc, 0x08, //0x8ee0,0xe6, 0xfd, 0x12, 0x04, 0xc1, 0x78, 0xc1, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0xd3, 0xef, 0x9d, 0xee, //0x8ef0,0x9c, 0x22, 0x78, 0xbd, 0xd3, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x22, 0x25, 0xe0, 0x24, 0x0a, 0xf8, //0x8f00,0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe5, 0x3c, 0xd3, 0x94, 0x00, 0x40, 0x0b, 0x90, 0x0e, 0x88, //0x8f10,0x12, 0x0b, 0xf1, 0x90, 0x0e, 0x86, 0x80, 0x09, 0x90, 0x0e, 0x82, 0x12, 0x0b, 0xf1, 0x90, 0x0e, //0x8f20,0x80, 0xe4, 0x93, 0xf5, 0x44, 0xa3, 0xe4, 0x93, 0xf5, 0x43, 0xd2, 0x06, 0x30, 0x06, 0x03, 0xd3, //0x8f30,0x80, 0x01, 0xc3, 0x92, 0x0e, 0x22, 0xa2, 0xaf, 0x92, 0x32, 0xc2, 0xaf, 0xe5, 0x23, 0x45, 0x22, //0x8f40,0x90, 0x0e, 0x5d, 0x60, 0x0e, 0x12, 0x0f, 0xcb, 0xe0, 0xf5, 0x2c, 0x12, 0x0f, 0xc8, 0xe0, 0xf5, //0x8f50,0x2d, 0x80, 0x0c, 0x12, 0x0f, 0xcb, 0xe5, 0x30, 0xf0, 0x12, 0x0f, 0xc8, 0xe5, 0x31, 0xf0, 0xa2, //0x8f60,0x32, 0x92, 0xaf, 0x22, 0xd2, 0x01, 0xc2, 0x02, 0xe4, 0xf5, 0x1f, 0xf5, 0x1e, 0xd2, 0x35, 0xd2, //0x8f70,0x33, 0xd2, 0x36, 0xd2, 0x01, 0xc2, 0x02, 0xf5, 0x1f, 0xf5, 0x1e, 0xd2, 0x35, 0xd2, 0x33, 0x22, //0x8f80,0xfb, 0xd3, 0xed, 0x9b, 0x74, 0x80, 0xf8, 0x6c, 0x98, 0x22, 0x12, 0x06, 0x69, 0xe5, 0x40, 0x2f, //0x8f90,0xf5, 0x40, 0xe5, 0x3f, 0x3e, 0xf5, 0x3f, 0xe5, 0x3e, 0x3d, 0xf5, 0x3e, 0xe5, 0x3d, 0x3c, 0xf5, //0x8fa0,0x3d, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x3f, 0x0d, 0xe0, 0xf5, 0x33, 0xe5, 0x33, //0x8fb0,0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x0e, 0x5f, 0xe4, 0x93, 0xfe, 0x74, 0x01, //0x8fc0,0x93, 0xf5, 0x82, 0x8e, 0x83, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0xcd, 0x02, //0x8fd0,0x0c, 0x98, 0x8f, 0x82, 0x8e, 0x83, 0x75, 0xf0, 0x04, 0xed, 0x02, 0x06, 0xa5,                   //0x8fe0};#define SENSORDB(fmt, arg...)  printk(fmt, ##arg)
static struct timeval OV5640YUV_ktv1, OV5640YUV_ktv2;
struct i2c_client * g_client=NULL;#define UINT32  unsigned int
#define  UINT8  u8typedef enum
{OV5640_720P,       //1M 1280x960OV5640_5M,     //5M 2592x1944
} OV5640_RES_TYPE;
OV5640_RES_TYPE OV5640YUV_g_RES=OV5640_720P;typedef enum
{OV5640_MODE_PREVIEW,  //1M     1280x960OV5640_MODE_CAPTURE   //5M    2592x1944
} OV5640_MODE;OV5640_MODE g_iOV5640YUV_Mode=OV5640_MODE_PREVIEW;#define KAL_FALSE false
#define KAL_TRUE  true
#define kal_uint32  unsigned int
#define kal_uint16  u16
#define kal_uint8  unsigned char
#define UINT16  u16
#define UINT8   unsigned char
#define  kal_bool  bool
#define Sleep   msleepUINT8 OV5640YUVPixelClockDivider=0;
kal_uint32 OV5640YUV_sensor_pclk=56000000;
kal_uint32 OV5640YUV_PV_pclk = 5600;
kal_uint32 OV5640YUV_CAP_pclk = 5600;
kal_uint16 OV5640YUV_pv_exposure_lines=0x100,OV5640YUV_g_iBackupExtraExp = 0,OV5640YUV_extra_exposure_lines = 0;
kal_uint16 OV5640YUV_sensor_id=0;
//MSDK_SENSOR_CONFIG_STRUCT OV5640YUVSensorConfigData;
kal_uint32 OV5640YUV_FAC_SENSOR_REG;
kal_uint16 OV5640YUV_sensor_flip_value;//liuxinming add
kal_uint32 back_shutter = 0;
kal_uint32 back_pv_gain = 0;
kal_uint32 tem = 0;bool  OV5640YUV_MPEG4_encode_mode = KAL_FALSE;
bool  OV5640YUV_night_mode = KAL_FALSE;#define  ERROR_NONE  1inline void OV5640YUV_imgSensorProfileStart(void)
{do_gettimeofday(&OV5640YUV_ktv1);
}inline void OV5640YUV_imgSensorProfileEnd(char *tag)
{unsigned long TimeIntervalUS;do_gettimeofday(&OV5640YUV_ktv2);TimeIntervalUS = (OV5640YUV_ktv2.tv_sec - OV5640YUV_ktv1.tv_sec) * 1000000 + (OV5640YUV_ktv2.tv_usec - OV5640YUV_ktv1.tv_usec);SENSORDB("[%s]Profile = %lu\n",tag, TimeIntervalUS);
}u8  OV5640YUV_read_cmos_sensor(u16 addr)
{unsigned char value=0;i2cc_get_reg(g_client,addr,&value);return value;
}void OV5640YUV_write_cmos_sensor(u16 addr,u32 param)
{i2cc_set_reg(g_client,addr,param);
}static void OV5640_FOCUS_AD5820_Check_MCU()
{u8 check[13] = {0x00};//mcu oncheck[0] = OV5640YUV_read_cmos_sensor(0x3000);check[1] = OV5640YUV_read_cmos_sensor(0x3004);//soft reset of mcucheck[2] = OV5640YUV_read_cmos_sensor(0x3f00);//afc oncheck[3] = OV5640YUV_read_cmos_sensor(0x3001);check[4] = OV5640YUV_read_cmos_sensor(0x3005);//gpio1,gpio2check[5] = OV5640YUV_read_cmos_sensor(0x3018);check[6] = OV5640YUV_read_cmos_sensor(0x301e);check[7] = OV5640YUV_read_cmos_sensor(0x301b);check[8] = OV5640YUV_read_cmos_sensor(0x3042);//y0check[9] = OV5640YUV_read_cmos_sensor(0x3018);check[10] = OV5640YUV_read_cmos_sensor(0x301e);check[11] = OV5640YUV_read_cmos_sensor(0x301b);check[12] = OV5640YUV_read_cmos_sensor(0x3042);int i = 0;for(i = 0; i < 13; i++)SENSORDB("check[%d]=0x%x\n", i, check[i]);
}static void OV5640_FOCUS_AD5820_Init(void)
{u8 state=0x8F;unsigned int  iteration = 100;int totalCnt = 0;int sentCnt = 0;int index=0;u16 addr = 0x8000;u8 buf[256];int len = 128;//  OV5640YUV_imgSensorProfileStart();OV5640YUV_write_cmos_sensor(0x3000, 0x20);totalCnt = ARRAY_SIZE(AD5820_Config);#if 0//Brust modewhile (index < totalCnt) {sentCnt = totalCnt - index > len  ? len  : totalCnt - index;buf[0] = addr >> 8;buf[1] = addr & 0xff;memcpy(&buf[2], &AD5820_Config[index], len );OV5640YUV_multi_write_cmos_sensor(buf, sentCnt + 2);addr += len ;index += len ;}
#else//single modefor(sentCnt =0; sentCnt<totalCnt; sentCnt++){OV5640YUV_write_cmos_sensor(addr,AD5820_Config[sentCnt]);addr++;}
#endifmdelay(10);OV5640YUV_write_cmos_sensor(0x3022, 0x00);OV5640YUV_write_cmos_sensor(0x3023, 0x00);OV5640YUV_write_cmos_sensor(0x3024, 0x00);OV5640YUV_write_cmos_sensor(0x3025, 0x00);OV5640YUV_write_cmos_sensor(0x3026, 0x00);OV5640YUV_write_cmos_sensor(0x3027, 0x00);OV5640YUV_write_cmos_sensor(0x3028, 0x00);OV5640YUV_write_cmos_sensor(0x3029, 0x7f);OV5640YUV_write_cmos_sensor(0x3000, 0x00);do {state = (u8)OV5640YUV_read_cmos_sensor(0x3029);mdelay(5);if (iteration-- == 0){break;}} while(state!=0x70);OV5640YUV_imgSensorProfileEnd("OV5640_FOCUS_AD5820_Init");OV5640_FOCUS_AD5820_Check_MCU();return;
}   /*  OV5640_FOCUS_AD5820_Init  */void OV5640YUV_Sensor_Dvp_Init(void)
{OV5640YUV_write_cmos_sensor(0x4740, 0x20);//liuxinmingOV5640YUV_write_cmos_sensor(0x3008, 0x42);OV5640YUV_write_cmos_sensor(0x3103, 0x03);OV5640YUV_write_cmos_sensor(0x3017, 0x7f);OV5640YUV_write_cmos_sensor(0x3018, 0xff);OV5640YUV_write_cmos_sensor(0x302c, 0x82);OV5640YUV_write_cmos_sensor(0x3108, 0x01);OV5640YUV_write_cmos_sensor(0x3630, 0x2e);//2eOV5640YUV_write_cmos_sensor(0x3632, 0xe2);OV5640YUV_write_cmos_sensor(0x3633, 0x23);//23OV5640YUV_write_cmos_sensor(0x3621, 0xe0);OV5640YUV_write_cmos_sensor(0x3704, 0xa0);OV5640YUV_write_cmos_sensor(0x3703, 0x5a);OV5640YUV_write_cmos_sensor(0x3715, 0x78);OV5640YUV_write_cmos_sensor(0x3717, 0x01);OV5640YUV_write_cmos_sensor(0x370b, 0x60);OV5640YUV_write_cmos_sensor(0x3705, 0x1a);OV5640YUV_write_cmos_sensor(0x3905, 0x02);OV5640YUV_write_cmos_sensor(0x3906, 0x10);OV5640YUV_write_cmos_sensor(0x3901, 0x0a);OV5640YUV_write_cmos_sensor(0x3731, 0x12);OV5640YUV_write_cmos_sensor(0x3600, 0x08);OV5640YUV_write_cmos_sensor(0x3601, 0x33);OV5640YUV_write_cmos_sensor(0x302d, 0x60);OV5640YUV_write_cmos_sensor(0x3620, 0x52);OV5640YUV_write_cmos_sensor(0x371b, 0x20);OV5640YUV_write_cmos_sensor(0x471c, 0x50);OV5640YUV_write_cmos_sensor(0x3a18, 0x00);OV5640YUV_write_cmos_sensor(0x3a19, 0xf8);OV5640YUV_write_cmos_sensor(0x3635, 0x1c);//1cOV5640YUV_write_cmos_sensor(0x3634, 0x40);OV5640YUV_write_cmos_sensor(0x3622, 0x01);OV5640YUV_write_cmos_sensor(0x3c04, 0x28);OV5640YUV_write_cmos_sensor(0x3c05, 0x98);OV5640YUV_write_cmos_sensor(0x3c06, 0x00);OV5640YUV_write_cmos_sensor(0x3c07, 0x08);OV5640YUV_write_cmos_sensor(0x3c08, 0x00);OV5640YUV_write_cmos_sensor(0x3c09, 0x1c);OV5640YUV_write_cmos_sensor(0x3c0a, 0x9c);OV5640YUV_write_cmos_sensor(0x3c0b, 0x40);//  OV5640YUV_write_cmos_sensor(0x3820, 0x47);// OV5640YUV_write_cmos_sensor(0x3821, 0x01);//dg add 2015-07-24 for stop flip & mirror imageOV5640YUV_write_cmos_sensor(0x3820, 0x40);OV5640YUV_write_cmos_sensor(0x3821, 0x06);//windows setupOV5640YUV_write_cmos_sensor(0x3800, 0x00);OV5640YUV_write_cmos_sensor(0x3801, 0x00);OV5640YUV_write_cmos_sensor(0x3802, 0x00);OV5640YUV_write_cmos_sensor(0x3803, 0x04);//dg add  2015-07-25 to adjust X_AADR_END long for image windeos showOV5640YUV_write_cmos_sensor(0x3804, 0x0a);OV5640YUV_write_cmos_sensor(0x3805, 0x5f); //3f-5f->GoodOV5640YUV_write_cmos_sensor(0x3806, 0x07);OV5640YUV_write_cmos_sensor(0x3807, 0x9b);
#if 1OV5640YUV_write_cmos_sensor(0x3808, 0x05);//1280OV5640YUV_write_cmos_sensor(0x3809, 0x00);OV5640YUV_write_cmos_sensor(0x380a, 0x03);//960OV5640YUV_write_cmos_sensor(0x380b, 0xc0);
#elseOV5640YUV_write_cmos_sensor(0x3808, 0x05);OV5640YUV_write_cmos_sensor(0x3809, 0x80);OV5640YUV_write_cmos_sensor(0x380a, 0x01);OV5640YUV_write_cmos_sensor(0x380b, 0xe0);#endif//OV5640YUV_write_cmos_sensor(0x3810, 0x00);// OV5640YUV_write_cmos_sensor(0x3811, 0x10);//dg add  2015-07-25 to adjust X OFFSET position coordinate for image windeos showOV5640YUV_write_cmos_sensor(0x3810, 0x00); // 00->01->00OV5640YUV_write_cmos_sensor(0x3811, 0xED); // 10->00->F0->EF->EE->ED->GoodOV5640YUV_write_cmos_sensor(0x3812, 0x00);OV5640YUV_write_cmos_sensor(0x3813, 0x06);OV5640YUV_write_cmos_sensor(0x3814, 0x31);OV5640YUV_write_cmos_sensor(0x3815, 0x31);OV5640YUV_write_cmos_sensor(0x3034, 0x1a);OV5640YUV_write_cmos_sensor(0x3035, 0x21); //15fpsOV5640YUV_write_cmos_sensor(0x3036, 0x46);OV5640YUV_write_cmos_sensor(0x3037, 0x13);OV5640YUV_write_cmos_sensor(0x3038, 0x00);OV5640YUV_write_cmos_sensor(0x3039, 0x00);OV5640YUV_write_cmos_sensor(0x380c, 0x07);OV5640YUV_write_cmos_sensor(0x380d, 0x68);OV5640YUV_write_cmos_sensor(0x380e, 0x03); //03OV5640YUV_write_cmos_sensor(0x380f, 0xd8); //d8OV5640YUV_write_cmos_sensor(0x3c01, 0xb4);OV5640YUV_write_cmos_sensor(0x3c00, 0x04);OV5640YUV_write_cmos_sensor(0x3a08, 0x00);OV5640YUV_write_cmos_sensor(0x3a09, 0x93);OV5640YUV_write_cmos_sensor(0x3a0e, 0x06);OV5640YUV_write_cmos_sensor(0x3a0a, 0x00);OV5640YUV_write_cmos_sensor(0x3a0b, 0x7b);OV5640YUV_write_cmos_sensor(0x3a0d, 0x08);OV5640YUV_write_cmos_sensor(0x3a00, 0x38); //25fps-20fpsOV5640YUV_write_cmos_sensor(0x3a02, 0x03);OV5640YUV_write_cmos_sensor(0x3a03, 0xd8);OV5640YUV_write_cmos_sensor(0x3a14, 0x03);OV5640YUV_write_cmos_sensor(0x3a15, 0xd8);OV5640YUV_write_cmos_sensor(0x3618, 0x00);OV5640YUV_write_cmos_sensor(0x3612, 0x29);OV5640YUV_write_cmos_sensor(0x3708, 0x64);OV5640YUV_write_cmos_sensor(0x3709, 0x52);OV5640YUV_write_cmos_sensor(0x370c, 0x03);OV5640YUV_write_cmos_sensor(0x4001, 0x02);OV5640YUV_write_cmos_sensor(0x4004, 0x02);OV5640YUV_write_cmos_sensor(0x3000, 0x00);OV5640YUV_write_cmos_sensor(0x3002, 0x1c);OV5640YUV_write_cmos_sensor(0x3004, 0xff);OV5640YUV_write_cmos_sensor(0x3006, 0xc3);OV5640YUV_write_cmos_sensor(0x300e, 0x58);OV5640YUV_write_cmos_sensor(0x302e, 0x00);//OV5640YUV_write_cmos_sensor(0x4300, 0x30);OV5640YUV_write_cmos_sensor(0x4300, 0x32); //dg changge from 0x30->0x33OV5640YUV_write_cmos_sensor(0x501f, 0x00);OV5640YUV_write_cmos_sensor(0x4713, 0x03);OV5640YUV_write_cmos_sensor(0x4407, 0x04);OV5640YUV_write_cmos_sensor(0x460b, 0x35);OV5640YUV_write_cmos_sensor(0x460c, 0x22);//add by brightOV5640YUV_write_cmos_sensor(0x3824, 0x01);//add by brightOV5640YUV_write_cmos_sensor(0x5001, 0xa3);OV5640YUV_write_cmos_sensor(0x3406, 0x01);//awbinitOV5640YUV_write_cmos_sensor(0x3400, 0x06);OV5640YUV_write_cmos_sensor(0x3401, 0x80);OV5640YUV_write_cmos_sensor(0x3402, 0x04);OV5640YUV_write_cmos_sensor(0x3403, 0x00);OV5640YUV_write_cmos_sensor(0x3404, 0x06);OV5640YUV_write_cmos_sensor(0x3405, 0x00);//awbOV5640YUV_write_cmos_sensor(0x5180, 0xff);OV5640YUV_write_cmos_sensor(0x5181, 0xf2);OV5640YUV_write_cmos_sensor(0x5182, 0x00);OV5640YUV_write_cmos_sensor(0x5183, 0x14);OV5640YUV_write_cmos_sensor(0x5184, 0x25);OV5640YUV_write_cmos_sensor(0x5185, 0x24);OV5640YUV_write_cmos_sensor(0x5186, 0x16);OV5640YUV_write_cmos_sensor(0x5187, 0x16);OV5640YUV_write_cmos_sensor(0x5188, 0x16);OV5640YUV_write_cmos_sensor(0x5189, 0x72);OV5640YUV_write_cmos_sensor(0x518a, 0x68);OV5640YUV_write_cmos_sensor(0x518b, 0xf0);OV5640YUV_write_cmos_sensor(0x518c, 0xb2);OV5640YUV_write_cmos_sensor(0x518d, 0x50);OV5640YUV_write_cmos_sensor(0x518e, 0x30);OV5640YUV_write_cmos_sensor(0x518f, 0x30);OV5640YUV_write_cmos_sensor(0x5190, 0x50);OV5640YUV_write_cmos_sensor(0x5191, 0xf8);OV5640YUV_write_cmos_sensor(0x5192, 0x04);OV5640YUV_write_cmos_sensor(0x5193, 0x70);OV5640YUV_write_cmos_sensor(0x5194, 0xf0);OV5640YUV_write_cmos_sensor(0x5195, 0xf0);OV5640YUV_write_cmos_sensor(0x5196, 0x03);OV5640YUV_write_cmos_sensor(0x5197, 0x01);OV5640YUV_write_cmos_sensor(0x5198, 0x04);OV5640YUV_write_cmos_sensor(0x5199, 0x12);OV5640YUV_write_cmos_sensor(0x519a, 0x04);OV5640YUV_write_cmos_sensor(0x519b, 0x00);OV5640YUV_write_cmos_sensor(0x519c, 0x06);OV5640YUV_write_cmos_sensor(0x519d, 0x82);OV5640YUV_write_cmos_sensor(0x519e, 0x38);//color matrixOV5640YUV_write_cmos_sensor(0x5381, 0x1e);OV5640YUV_write_cmos_sensor(0x5382, 0x5b);OV5640YUV_write_cmos_sensor(0x5383, 0x14);OV5640YUV_write_cmos_sensor(0x5384, 0x06);OV5640YUV_write_cmos_sensor(0x5385, 0x82);OV5640YUV_write_cmos_sensor(0x5386, 0x88);OV5640YUV_write_cmos_sensor(0x5387, 0x7c);OV5640YUV_write_cmos_sensor(0x5388, 0x60);OV5640YUV_write_cmos_sensor(0x5389, 0x1c);OV5640YUV_write_cmos_sensor(0x538a, 0x01);OV5640YUV_write_cmos_sensor(0x538b, 0x98);//sharp&noiseOV5640YUV_write_cmos_sensor(0x5300, 0x08);OV5640YUV_write_cmos_sensor(0x5301, 0x30);OV5640YUV_write_cmos_sensor(0x5302, 0x3f);OV5640YUV_write_cmos_sensor(0x5303, 0x10);OV5640YUV_write_cmos_sensor(0x5304, 0x08);OV5640YUV_write_cmos_sensor(0x5305, 0x30);OV5640YUV_write_cmos_sensor(0x5306, 0x18);OV5640YUV_write_cmos_sensor(0x5307, 0x28);OV5640YUV_write_cmos_sensor(0x5309, 0x08);OV5640YUV_write_cmos_sensor(0x530a, 0x30);OV5640YUV_write_cmos_sensor(0x530b, 0x04);OV5640YUV_write_cmos_sensor(0x530c, 0x06);//gammaOV5640YUV_write_cmos_sensor(0x5480, 0x01);OV5640YUV_write_cmos_sensor(0x5481, 0x06);OV5640YUV_write_cmos_sensor(0x5482, 0x12);OV5640YUV_write_cmos_sensor(0x5483, 0x1e);OV5640YUV_write_cmos_sensor(0x5484, 0x4a);OV5640YUV_write_cmos_sensor(0x5485, 0x58);OV5640YUV_write_cmos_sensor(0x5486, 0x65);OV5640YUV_write_cmos_sensor(0x5487, 0x72);OV5640YUV_write_cmos_sensor(0x5488, 0x7d);OV5640YUV_write_cmos_sensor(0x5489, 0x88);OV5640YUV_write_cmos_sensor(0x548a, 0x92);OV5640YUV_write_cmos_sensor(0x548b, 0xa3);OV5640YUV_write_cmos_sensor(0x548c, 0xb2);OV5640YUV_write_cmos_sensor(0x548d, 0xc8);OV5640YUV_write_cmos_sensor(0x548e, 0xdd);OV5640YUV_write_cmos_sensor(0x548f, 0xf0);OV5640YUV_write_cmos_sensor(0x5490, 0x15);//UV adjustOV5640YUV_write_cmos_sensor(0x5580, 0x06);OV5640YUV_write_cmos_sensor(0x5583, 0x40);OV5640YUV_write_cmos_sensor(0x5584, 0x10);OV5640YUV_write_cmos_sensor(0x5589, 0x10);OV5640YUV_write_cmos_sensor(0x558a, 0x00);OV5640YUV_write_cmos_sensor(0x558b, 0xf8);//lens shadingOV5640YUV_write_cmos_sensor(0x5000, 0xa7);OV5640YUV_write_cmos_sensor(0x5800, 0x20);OV5640YUV_write_cmos_sensor(0x5801, 0x19);OV5640YUV_write_cmos_sensor(0x5802, 0x17);OV5640YUV_write_cmos_sensor(0x5803, 0x16);OV5640YUV_write_cmos_sensor(0x5804, 0x18);OV5640YUV_write_cmos_sensor(0x5805, 0x21);OV5640YUV_write_cmos_sensor(0x5806, 0x0F);OV5640YUV_write_cmos_sensor(0x5807, 0x0A);OV5640YUV_write_cmos_sensor(0x5808, 0x07);OV5640YUV_write_cmos_sensor(0x5809, 0x07);OV5640YUV_write_cmos_sensor(0x580a, 0x0A);OV5640YUV_write_cmos_sensor(0x580b, 0x0C);OV5640YUV_write_cmos_sensor(0x580c, 0x0A);OV5640YUV_write_cmos_sensor(0x580d, 0x03);OV5640YUV_write_cmos_sensor(0x580e, 0x01);OV5640YUV_write_cmos_sensor(0x580f, 0x01);OV5640YUV_write_cmos_sensor(0x5810, 0x03);OV5640YUV_write_cmos_sensor(0x5811, 0x09);OV5640YUV_write_cmos_sensor(0x5812, 0x0A);OV5640YUV_write_cmos_sensor(0x5813, 0x03);OV5640YUV_write_cmos_sensor(0x5814, 0x01);OV5640YUV_write_cmos_sensor(0x5815, 0x01);OV5640YUV_write_cmos_sensor(0x5816, 0x03);OV5640YUV_write_cmos_sensor(0x5817, 0x08);OV5640YUV_write_cmos_sensor(0x5818, 0x10);OV5640YUV_write_cmos_sensor(0x5819, 0x0A);OV5640YUV_write_cmos_sensor(0x581a, 0x06);OV5640YUV_write_cmos_sensor(0x581b, 0x06);OV5640YUV_write_cmos_sensor(0x581c, 0x08);OV5640YUV_write_cmos_sensor(0x581d, 0x0E);OV5640YUV_write_cmos_sensor(0x581e, 0x22);OV5640YUV_write_cmos_sensor(0x581f, 0x18);OV5640YUV_write_cmos_sensor(0x5820, 0x13);OV5640YUV_write_cmos_sensor(0x5821, 0x12);OV5640YUV_write_cmos_sensor(0x5822, 0x16);OV5640YUV_write_cmos_sensor(0x5823, 0x1E);OV5640YUV_write_cmos_sensor(0x5824, 0x64);OV5640YUV_write_cmos_sensor(0x5825, 0x2A);OV5640YUV_write_cmos_sensor(0x5826, 0x2C);OV5640YUV_write_cmos_sensor(0x5827, 0x2A);OV5640YUV_write_cmos_sensor(0x5828, 0x46);OV5640YUV_write_cmos_sensor(0x5829, 0x2A);OV5640YUV_write_cmos_sensor(0x582a, 0x26);OV5640YUV_write_cmos_sensor(0x582b, 0x24);OV5640YUV_write_cmos_sensor(0x582c, 0x26);OV5640YUV_write_cmos_sensor(0x582d, 0x2A);OV5640YUV_write_cmos_sensor(0x582e, 0x28);OV5640YUV_write_cmos_sensor(0x582f, 0x42);OV5640YUV_write_cmos_sensor(0x5830, 0x40);OV5640YUV_write_cmos_sensor(0x5831, 0x42);OV5640YUV_write_cmos_sensor(0x5832, 0x08);OV5640YUV_write_cmos_sensor(0x5833, 0x28);OV5640YUV_write_cmos_sensor(0x5834, 0x26);OV5640YUV_write_cmos_sensor(0x5835, 0x24);OV5640YUV_write_cmos_sensor(0x5836, 0x26);OV5640YUV_write_cmos_sensor(0x5837, 0x2A);OV5640YUV_write_cmos_sensor(0x5838, 0x44);OV5640YUV_write_cmos_sensor(0x5839, 0x4A);OV5640YUV_write_cmos_sensor(0x583a, 0x2C);OV5640YUV_write_cmos_sensor(0x583b, 0x2a);OV5640YUV_write_cmos_sensor(0x583c, 0x46);OV5640YUV_write_cmos_sensor(0x583d, 0xCE);OV5640YUV_write_cmos_sensor(0x5688, 0x22);OV5640YUV_write_cmos_sensor(0x5689, 0x22);OV5640YUV_write_cmos_sensor(0x568a, 0x42);OV5640YUV_write_cmos_sensor(0x568b, 0x24);OV5640YUV_write_cmos_sensor(0x568c, 0x42);OV5640YUV_write_cmos_sensor(0x568d, 0x24);OV5640YUV_write_cmos_sensor(0x568e, 0x22);OV5640YUV_write_cmos_sensor(0x568f, 0x22);OV5640YUV_write_cmos_sensor(0x5025, 0x00);OV5640YUV_write_cmos_sensor(0x3a0f, 0x30);OV5640YUV_write_cmos_sensor(0x3a10, 0x28);OV5640YUV_write_cmos_sensor(0x3a1b, 0x30);OV5640YUV_write_cmos_sensor(0x3a1e, 0x28);OV5640YUV_write_cmos_sensor(0x3a11, 0x61);OV5640YUV_write_cmos_sensor(0x3a1f, 0x10);OV5640YUV_write_cmos_sensor(0x4005, 0x1a);OV5640YUV_write_cmos_sensor(0x3406, 0x00);//awbinitOV5640YUV_write_cmos_sensor(0x3503, 0x00);//awbinitOV5640YUV_write_cmos_sensor(0x3008, 0x02);
}//set constant focus
static void OV5640_FOCUS_AD5820_Constant_Focus(void)
{UINT8 state = 0x8F;UINT32 iteration = 300;//send constant focus mode command to firmwareOV5640YUV_write_cmos_sensor(0x3023,0x01);OV5640YUV_write_cmos_sensor(0x3022,0x04);return;
}static void OV5640_FOCUS_AD5820_Single_Focus()
{UINT8 state = 0x8F;UINT32 iteration = 100;OV5640YUV_write_cmos_sensor(0x3023,0x01);OV5640YUV_write_cmos_sensor(0x3022,0x03);iteration = 100;do{state = (UINT8)OV5640YUV_read_cmos_sensor(0x3023);if(state == 0x00){SENSORDB("single focused!\n");break;}//   mdelay(30);mdelay(3);iteration --;}while(iteration);return;
}static void OV5640_FOCUS_AD5820_Pause_Focus()
{UINT8 state = 0x8F;UINT32 iteration = 100;//send idle command to firmwareOV5640YUV_write_cmos_sensor(0x3023,0x01);OV5640YUV_write_cmos_sensor(0x3022,0x06);iteration = 100;do{state = (UINT8)OV5640YUV_read_cmos_sensor(0x3023);if(state == 0x00){break;}msleep(30);//      msleep(10);iteration --;}while(iteration);if(iteration==0){printk("pause focus fail.........state is 0x%x...",state);return ;}printk("pause focus  OK ......");}
static void OV5640_FOCUS_AD5820_Cancel_Focus()
{UINT8 state = 0x8F;UINT32 iteration = 100;//send idle command to firmwareOV5640YUV_write_cmos_sensor(0x3023,0x01);OV5640YUV_write_cmos_sensor(0x3022,0x08);iteration = 100;do{state = (UINT8)OV5640YUV_read_cmos_sensor(0x3023);if(state == 0x00){break;}msleep(30);iteration --;}while(iteration);}void OV5640YUV_set_720P_init(void)
{//OV5640YUV_write_cmos_sensor(0x3008, 0x42);OV5640YUV_write_cmos_sensor(0x5189, 0x72);OV5640YUV_write_cmos_sensor(0x3503, 0x00);//AE//OV5640YUV_write_cmos_sensor(0x3406, 0x00);//AWBOV5640YUV_write_cmos_sensor(0x3a00, 0x38);//enable nightOV5640YUV_write_cmos_sensor(0x5302, 0x20);OV5640YUV_write_cmos_sensor(0x5303, 0x08);OV5640YUV_write_cmos_sensor(0x5306, 0x10);//18OV5640YUV_write_cmos_sensor(0x5307, 0x20);//28//OV5640YUV_write_cmos_sensor(0x3820, 0x47);// OV5640YUV_write_cmos_sensor(0x3821, 0x01);//dg add 2015-07-24 for stop flip imageOV5640YUV_write_cmos_sensor(0x3820, 0x40);OV5640YUV_write_cmos_sensor(0x3821, 0x06);OV5640YUV_write_cmos_sensor(0x3108, 0x01);//windows setupOV5640YUV_write_cmos_sensor(0x3800, 0x00);OV5640YUV_write_cmos_sensor(0x3801, 0x00);OV5640YUV_write_cmos_sensor(0x3802, 0x00);OV5640YUV_write_cmos_sensor(0x3803, 0x04);//dg add  2015-07-25 to adjust X_AADR_END long for image windeos showOV5640YUV_write_cmos_sensor(0x3804, 0x0a);OV5640YUV_write_cmos_sensor(0x3805, 0x5f); //3f-5f->GoodOV5640YUV_write_cmos_sensor(0x3806, 0x07);OV5640YUV_write_cmos_sensor(0x3807, 0x9b);
#if 1OV5640YUV_write_cmos_sensor(0x3808, 0x05);//1280OV5640YUV_write_cmos_sensor(0x3809, 0x00);OV5640YUV_write_cmos_sensor(0x380a, 0x03);//960OV5640YUV_write_cmos_sensor(0x380b, 0xc0);
#elseOV5640YUV_write_cmos_sensor(0x3808, 0x05);OV5640YUV_write_cmos_sensor(0x3809, 0x80);OV5640YUV_write_cmos_sensor(0x380a, 0x01);OV5640YUV_write_cmos_sensor(0x380b, 0xe0);#endif//OV5640YUV_write_cmos_sensor(0x3810, 0x00);// OV5640YUV_write_cmos_sensor(0x3811, 0x10);//dg add  2015-07-25 to adjust X OFFSET position coordinate for image windeos showOV5640YUV_write_cmos_sensor(0x3810, 0x00); // 00->01->00OV5640YUV_write_cmos_sensor(0x3811, 0xED); // 10->00->F0->EF->EE->ED->GoodOV5640YUV_write_cmos_sensor(0x3812, 0x00);OV5640YUV_write_cmos_sensor(0x3813, 0x06);OV5640YUV_write_cmos_sensor(0x3814, 0x31);OV5640YUV_write_cmos_sensor(0x3815, 0x31);OV5640YUV_write_cmos_sensor(0x3034, 0x1a);OV5640YUV_write_cmos_sensor(0x3035, 0x21); //25fpsOV5640YUV_write_cmos_sensor(0x3036, 0x46);OV5640YUV_write_cmos_sensor(0x3037, 0x13);OV5640YUV_write_cmos_sensor(0x3038, 0x00);OV5640YUV_write_cmos_sensor(0x3039, 0x00);OV5640YUV_write_cmos_sensor(0x380c, 0x07);OV5640YUV_write_cmos_sensor(0x380d, 0x68);OV5640YUV_write_cmos_sensor(0x380e, 0x03);OV5640YUV_write_cmos_sensor(0x380f, 0xd8);OV5640YUV_write_cmos_sensor(0x3a08, 0x00);OV5640YUV_write_cmos_sensor(0x3a09, 0x93);OV5640YUV_write_cmos_sensor(0x3a0e, 0x06);OV5640YUV_write_cmos_sensor(0x3a0a, 0x00);OV5640YUV_write_cmos_sensor(0x3a0b, 0x7b);OV5640YUV_write_cmos_sensor(0x3a0d, 0x08);OV5640YUV_write_cmos_sensor(0x3618, 0x00);OV5640YUV_write_cmos_sensor(0x3612, 0x29);OV5640YUV_write_cmos_sensor(0x3709, 0x52);OV5640YUV_write_cmos_sensor(0x370c, 0x03);OV5640YUV_write_cmos_sensor(0x4004, 0x02);OV5640YUV_write_cmos_sensor(0x460b, 0x35);OV5640YUV_write_cmos_sensor(0x460c, 0x22);OV5640YUV_write_cmos_sensor(0x4837, 0x15);OV5640YUV_write_cmos_sensor(0x3824, 0x01);OV5640YUV_write_cmos_sensor(0x5001, 0xa3);//OV5640YUV_write_cmos_sensor(0x3008, 0x02);
}void OV5640YUV_set_5M_init(void)
{//OV5640YUV_write_cmos_sensor(0x3008, 0x42);OV5640YUV_write_cmos_sensor(0x5189, 0x66);OV5640YUV_write_cmos_sensor(0x3503, 0x07);//AE//OV5640YUV_write_cmos_sensor(0x3406, 0x01);//AWBOV5640YUV_write_cmos_sensor(0x3a00, 0x38);//disable nightOV5640YUV_write_cmos_sensor(0x5302, 0x30);OV5640YUV_write_cmos_sensor(0x5303, 0x10);OV5640YUV_write_cmos_sensor(0x5306, 0x08);OV5640YUV_write_cmos_sensor(0x5307, 0x18);OV5640YUV_write_cmos_sensor(0x3820, 0x40); //46OV5640YUV_write_cmos_sensor(0x3821, 0x06); //00OV5640YUV_write_cmos_sensor(0x3800, 0x00);OV5640YUV_write_cmos_sensor(0x3801, 0x00);OV5640YUV_write_cmos_sensor(0x3802, 0x00);OV5640YUV_write_cmos_sensor(0x3803, 0x00);OV5640YUV_write_cmos_sensor(0x3804, 0x0a);OV5640YUV_write_cmos_sensor(0x3805, 0x3f);OV5640YUV_write_cmos_sensor(0x3806, 0x07);OV5640YUV_write_cmos_sensor(0x3807, 0x9f);OV5640YUV_write_cmos_sensor(0x3808, 0x0a);OV5640YUV_write_cmos_sensor(0x3809, 0x20);OV5640YUV_write_cmos_sensor(0x380a, 0x07);OV5640YUV_write_cmos_sensor(0x380b, 0x98);OV5640YUV_write_cmos_sensor(0x3810, 0x00);OV5640YUV_write_cmos_sensor(0x3811, 0x10);OV5640YUV_write_cmos_sensor(0x3812, 0x00);OV5640YUV_write_cmos_sensor(0x3813, 0x04);OV5640YUV_write_cmos_sensor(0x3814, 0x11);OV5640YUV_write_cmos_sensor(0x3815, 0x11);OV5640YUV_write_cmos_sensor(0x3034, 0x1a);OV5640YUV_write_cmos_sensor(0x3035, 0x11); //10fpsOV5640YUV_write_cmos_sensor(0x3036, 0x46);OV5640YUV_write_cmos_sensor(0x3037, 0x13);OV5640YUV_write_cmos_sensor(0x3038, 0x00);OV5640YUV_write_cmos_sensor(0x3039, 0x00);OV5640YUV_write_cmos_sensor(0x380c, 0x0b);OV5640YUV_write_cmos_sensor(0x380d, 0x1c);OV5640YUV_write_cmos_sensor(0x380e, 0x07);OV5640YUV_write_cmos_sensor(0x380f, 0xb0);OV5640YUV_write_cmos_sensor(0x3a08, 0x00);OV5640YUV_write_cmos_sensor(0x3a09, 0xc5);OV5640YUV_write_cmos_sensor(0x3a0e, 0x0a);OV5640YUV_write_cmos_sensor(0x3a0a, 0x00);OV5640YUV_write_cmos_sensor(0x3a0b, 0xa4);OV5640YUV_write_cmos_sensor(0x3a0d, 0x0c);OV5640YUV_write_cmos_sensor(0x3618, 0x04);OV5640YUV_write_cmos_sensor(0x3612, 0x2b);OV5640YUV_write_cmos_sensor(0x3709, 0x12);OV5640YUV_write_cmos_sensor(0x370c, 0x00);OV5640YUV_write_cmos_sensor(0x4004, 0x06);OV5640YUV_write_cmos_sensor(0x3002, 0x00);OV5640YUV_write_cmos_sensor(0x3006, 0xff);OV5640YUV_write_cmos_sensor(0x4713, 0x02);OV5640YUV_write_cmos_sensor(0x4407, 0x04);OV5640YUV_write_cmos_sensor(0x460b, 0x37);OV5640YUV_write_cmos_sensor(0x460c, 0x22);OV5640YUV_write_cmos_sensor(0x4837, 0x16);OV5640YUV_write_cmos_sensor(0x3824, 0x01);OV5640YUV_write_cmos_sensor(0x5001, 0x83);//OV5640YUV_write_cmos_sensor(0x3008, 0x02);mdelay(300);//liuxinming
}void OV5640YUV_set_720P(void)
{SENSORDB("OV5640YUV_set_720P Start \n");OV5640YUV_g_RES = OV5640_720P;OV5640YUV_set_720P_init();OV5640YUV_PV_pclk = 5600;OV5640YUV_sensor_pclk=56000000;SENSORDB("Set 720P End\n");
}void OV5640YUV_set_5M(void)
{SENSORDB("Set 5M begin\n");OV5640YUV_g_RES = OV5640_5M;OV5640YUV_set_5M_init();OV5640YUV_CAP_pclk = 5600;OV5640YUV_sensor_pclk=56000000;SENSORDB("Set 5M End\n");
}/*************************************************************************
* FUNCTION
*   OV5640_night_mode
*
* DESCRIPTION
*   This function night mode of OV5640.
*
* PARAMETERS
*   none
*
* RETURNS
*   None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV5640YUV_NightMode(bool bEnable)
{if(bEnable){OV5640YUV_night_mode = true;if(OV5640YUV_MPEG4_encode_mode== true){OV5640YUV_write_cmos_sensor(0x3034, 0x1a);OV5640YUV_write_cmos_sensor(0x3035, 0x21); //10fpsOV5640YUV_write_cmos_sensor(0x3036, 0x46);OV5640YUV_write_cmos_sensor(0x3037, 0x13);OV5640YUV_write_cmos_sensor(0x3038, 0x00);OV5640YUV_write_cmos_sensor(0x3039, 0x00);OV5640YUV_write_cmos_sensor(0x380c, 0x07);OV5640YUV_write_cmos_sensor(0x380d, 0x68);OV5640YUV_write_cmos_sensor(0x380e, 0x05);OV5640YUV_write_cmos_sensor(0x380f, 0xc4);OV5640YUV_write_cmos_sensor(0x3c01, 0xb4);OV5640YUV_write_cmos_sensor(0x3c00, 0x04);OV5640YUV_write_cmos_sensor(0x3a08, 0x00);OV5640YUV_write_cmos_sensor(0x3a09, 0x93);OV5640YUV_write_cmos_sensor(0x3a0e, 0x0a);OV5640YUV_write_cmos_sensor(0x3a0a, 0x00);OV5640YUV_write_cmos_sensor(0x3a0b, 0x7b);OV5640YUV_write_cmos_sensor(0x3a0d, 0x0c);OV5640YUV_write_cmos_sensor(0x3a00, 0x38);OV5640YUV_write_cmos_sensor(0x3a02 ,0x05);OV5640YUV_write_cmos_sensor(0x3a03 ,0xc4);OV5640YUV_write_cmos_sensor(0x3a14 ,0x05);OV5640YUV_write_cmos_sensor(0x3a15 ,0xc4);}else{OV5640YUV_write_cmos_sensor(0x3a00, 0x3c);//25fps-5fpsOV5640YUV_write_cmos_sensor(0x3a02 ,0x0b);OV5640YUV_write_cmos_sensor(0x3a03 ,0x88);OV5640YUV_write_cmos_sensor(0x3a14 ,0x0b);OV5640YUV_write_cmos_sensor(0x3a15 ,0x88);}}else{OV5640YUV_night_mode = false;if(OV5640YUV_MPEG4_encode_mode==false){OV5640YUV_write_cmos_sensor(0x3034, 0x1a);OV5640YUV_write_cmos_sensor(0x3035, 0x21); //15fpsOV5640YUV_write_cmos_sensor(0x3036, 0x46);OV5640YUV_write_cmos_sensor(0x3037, 0x13);OV5640YUV_write_cmos_sensor(0x3038, 0x00);OV5640YUV_write_cmos_sensor(0x3039, 0x00);OV5640YUV_write_cmos_sensor(0x380c, 0x07);OV5640YUV_write_cmos_sensor(0x380d, 0x68);OV5640YUV_write_cmos_sensor(0x380e, 0x03);OV5640YUV_write_cmos_sensor(0x380f, 0xd8);OV5640YUV_write_cmos_sensor(0x3c01, 0xb4);OV5640YUV_write_cmos_sensor(0x3c00, 0x04);OV5640YUV_write_cmos_sensor(0x3a08, 0x00);OV5640YUV_write_cmos_sensor(0x3a09, 0x93);OV5640YUV_write_cmos_sensor(0x3a0e, 0x06);OV5640YUV_write_cmos_sensor(0x3a0a, 0x00);OV5640YUV_write_cmos_sensor(0x3a0b, 0x7b);OV5640YUV_write_cmos_sensor(0x3a0d, 0x08);OV5640YUV_write_cmos_sensor(0x3a00, 0x38);OV5640YUV_write_cmos_sensor(0x3a02 ,0x03);OV5640YUV_write_cmos_sensor(0x3a03 ,0xd8);OV5640YUV_write_cmos_sensor(0x3a14 ,0x03);OV5640YUV_write_cmos_sensor(0x3a15 ,0xd8);}else{OV5640YUV_write_cmos_sensor(0x3a00, 0x38);//25fps-20fpsOV5640YUV_write_cmos_sensor(0x3a02 ,0x03);OV5640YUV_write_cmos_sensor(0x3a03 ,0xd8);OV5640YUV_write_cmos_sensor(0x3a14 ,0x03);OV5640YUV_write_cmos_sensor(0x3a15 ,0xd8);}}
}static void OV5640YUV_SetDummy(const kal_uint16 iPixels, const kal_uint16 iLines)
{return ;
}static void OV5640YUV_set_AE_mode(kal_bool AE_enable)
{kal_uint8 temp_AE_reg = 0;if (AE_enable == KAL_TRUE){OV5640YUV_write_cmos_sensor(0x3503, 0x00);}else{OV5640YUV_write_cmos_sensor(0x3503, 0x07);}
}#if 0
static void OV5640YUV_set_AWB_mode(kal_bool AWB_enable)
{kal_uint8 temp_AWB_reg = 0;if (AWB_enable == KAL_TRUE){OV5640YUV_write_cmos_sensor(0x3406, 0x00);}else{OV5640YUV_write_cmos_sensor(0x3406, 0x01);}
}
#endif
/*************************************************************************
* FUNCTION
*    OV5640YUV_SetGain
*
* DESCRIPTION
*    This function is to set global gain to sensor.
*
* PARAMETERS
*    gain : sensor global gain(base: 0x40)
*
* RETURNS
*    the actually gain set to sensor.
*
* GLOBALS AFFECTED
*
*************************************************************************/
//! Due to the OV5640 set gain will happen race condition.
//! It need to use a critical section to protect it.
//static atomic_t OV5640_SetGain_Flag;
//static wait_queue_head_t OV5640_SetGain_waitQueue;void OV5640YUV_SetGain(UINT16 iGain)
{kal_uint8 iReg;int timeOut = 0;#if 0if (atomic_read(&OV5640_SetGain_Flag) == 1) {timeOut = wait_event_interruptible_timeout(OV5640_SetGain_waitQueue, atomic_read(&OV5640_SetGain_Flag) == 0, 1 * HZ);if (timeOut == 0) {SENSORDB("[OV5640YUV_SetGain] Set Gain Wait Queue time out \n");return;}}atomic_set(&OV5640_SetGain_Flag, 1);
#endifOV5640YUV_write_cmos_sensor(0x3212, 0x00);OV5640YUV_write_cmos_sensor(0x350B, (kal_uint32)iGain);OV5640YUV_write_cmos_sensor(0x3212, 0x10);OV5640YUV_write_cmos_sensor(0x3212, 0xA0);#if 0atomic_set(&OV5640_SetGain_Flag, 0);wake_up_interruptible(&OV5640_SetGain_waitQueue);
#endif}   /*  OV5640YUV_SetGain  *//*************************************************************************
* FUNCTION
*   OV5640YUV_read_shutter
*
* DESCRIPTION
*   This function to  Get exposure time.
*
* PARAMETERS
*   None
*
* RETURNS
*   shutter : exposured lines
*
* GLOBALS AFFECTED
*
*************************************************************************/
UINT16 OV5640YUV_read_shutter(void)
{kal_uint8 temp_reg1, temp_reg2, temp_reg3;kal_uint16 temp_reg;temp_reg1 = OV5640YUV_read_cmos_sensor(0x3500);temp_reg2 = OV5640YUV_read_cmos_sensor(0x3501);temp_reg3 = OV5640YUV_read_cmos_sensor(0x3502);// SENSORDB("ov5640read shutter 0x3500=0x%x,0x3501=0x%x,0x3502=0x%x\n",//   temp_reg1,temp_reg2,temp_reg3);temp_reg = ((temp_reg1<<12) & 0xF000) | ((temp_reg2<<4) & 0x0FF0) | ((temp_reg3>>4) & 0x0F);//SENSORDB("ov5640read shutter = 0x%x\n", temp_reg);return (UINT16)temp_reg;
}void OV5640YUV_write_shutter(kal_uint16 shutter)
{kal_uint16 iExp = shutter;kal_uint16 OV5640_g_iExtra_ExpLines = 0 ;int timeOut = 0;OV5640YUV_write_cmos_sensor(0x3500, (iExp >> 12) & 0xFF);OV5640YUV_write_cmos_sensor(0x3501, (iExp >> 4 ) & 0xFF);OV5640YUV_write_cmos_sensor(0x3502, (iExp <<4 ) & 0xFF);
}   /* write_OV5640_shutter *//*************************************************************************
* FUNCTION
*   OV5640YUV_SetShutter
*
* DESCRIPTION
*   This function set e-shutter of OV5640 to change exposure time.
*
* PARAMETERS
*   shutter : exposured lines
*
* RETURNS
*   None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void OV5640YUV_SetShutter(kal_uint16 iShutter)
{if (iShutter < 1)iShutter = 1;OV5640YUV_pv_exposure_lines = iShutter;OV5640YUV_write_shutter(iShutter);//SENSORDB("iShutter = %d\n", iShutter);}   /*  OV5640YUV_SetShutter   *//*************************************************************************
* FUNCTION
*    read_OV5640YUV_gain
*
* DESCRIPTION
*    This function is to set global gain to sensor.
*
* PARAMETERS
*    None
*
* RETURNS
*    gain : sensor global gain(base: 0x40)
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint16 read_OV5640YUV_gain(void)
{kal_uint8 temp_gain;kal_uint16 gain;gain = OV5640YUV_read_cmos_sensor(0x350B);return gain;
}  /* read_OV5640YUV_gain */void write_OV5640YUV_gain(kal_uint16 gain)
{OV5640YUV_SetGain(gain);
}/*************************************************************************
* FUNCTION
*   OV5640YUVPreview
*
* DESCRIPTION
*   This function start the sensor preview.
*
* PARAMETERS
*   *image_window : address pointer of pixel numbers in one period of HSYNC
*  *sensor_config_data : address pointer of line numbers in one period of VSYNC
*
* RETURNS
*   None
*
* GLOBALS AFFECTED
*
*************************************************************************/
UINT32 OV5640YUVPreview()
{//   kal_uint16 iStartX = 0, iStartY = 0;g_iOV5640YUV_Mode = OV5640_MODE_PREVIEW;OV5640YUV_write_cmos_sensor(0x4202,0x0f);// msleep(30);msleep(5);OV5640YUV_set_720P();OV5640YUV_write_cmos_sensor(0x4202,0x00);//  msleep(30);// dg cancle  ,donot focus  start,otherwise picture is not working well.//dg  use after// OV5640YUV_write_cmos_sensor(0x3023,0x01);//  OV5640YUV_write_cmos_sensor(0x3022,0x04);#if 0if (tem){OV5640YUV_SetShutter(back_shutter);write_OV5640YUV_gain(back_pv_gain);}tem =0;
#endif//OV5640YUV_write_cmos_sensor(0x3820, 0x46);//OV5640YUV_write_cmos_sensor(0x3821, 0x00);
/*if(sensor_config_data->SensorOperationMode==MSDK_SENSOR_OPERATION_MODE_VIDEO)        // MPEG4 Encode Mode{OV5640YUV_MPEG4_encode_mode = KAL_TRUE;}else{OV5640YUV_MPEG4_encode_mode = KAL_FALSE;}iStartX += OV5640_IMAGE_SENSOR_PV_STARTX;iStartY += OV5640_IMAGE_SENSOR_PV_STARTY;
*/// sensor_config_data->SensorImageMirror = IMAGE_HV_MIRROR;// OV5640YUV_Set_Mirror_Flip(sensor_config_data->SensorImageMirror);/*************************************************************************************************************///dg cancle 2015-07-18//OV5640YUV_write_cmos_sensor(0x3820,0x47);//OV5640YUV_write_cmos_sensor(0x3821,0x01);// OV5640YUV_write_cmos_sensor(0x4514,0x00);/*************************************************************************************************************/#if 0OV5640YUV_dummy_pixels = 0;OV5640YUV_dummy_lines = 0;OV5640YUV_PV_dummy_pixels = OV5640YUV_dummy_pixels;OV5640YUV_PV_dummy_lines = OV5640YUV_dummy_lines;//OV5640YUV_SetDummy(OV5640YUV_dummy_pixels, OV5640YUV_dummy_lines);
#endif//OV5640YUV_NightMode(OV5640YUV_night_mode);OV5640YUV_NightMode(false);#if 0memcpy(&OV5640YUVSensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT));image_window->GrabStartX= iStartX;image_window->GrabStartY= iStartY;image_window->ExposureWindowWidth= OV5640_IMAGE_SENSOR_PV_WIDTH - 2*iStartX;image_window->ExposureWindowHeight= OV5640_IMAGE_SENSOR_PV_HEIGHT - 2*iStartY;
#endifreturn 0;
}UINT32 OV5640YUVCapture( )
{kal_uint32 shutter = 0;kal_uint32 temp_shutter = 0;kal_uint16 iStartX = 0, iStartY = 0;kal_uint32 pv_gain = 0;kal_uint8 temp = 0;//for night modeif(g_iOV5640YUV_Mode == OV5640_MODE_PREVIEW){g_iOV5640YUV_Mode = OV5640_MODE_CAPTURE;//  if(sensor_config_data->EnableShutterTansfer==KAL_TRUE)//   shutter=sensor_config_data->CaptureShutter;temp= OV5640YUV_read_cmos_sensor(0x3a00);OV5640YUV_write_cmos_sensor(0x3a00,temp&0xfb);OV5640YUV_set_AE_mode(KAL_FALSE);//OV5640YUV_set_AWB_mode(KAL_FALSE);shutter = OV5640YUV_read_shutter();pv_gain = read_OV5640YUV_gain();back_shutter = shutter;back_pv_gain = pv_gain;tem = 1;SENSORDB("Preview Shutter = %d, Gain = %d\n", shutter, pv_gain);#if 0if ((image_window->ImageTargetWidth<= OV5640_IMAGE_SENSOR_PV_WIDTH) &&(image_window->ImageTargetHeight<= OV5640_IMAGE_SENSOR_PV_HEIGHT)){OV5640YUV_dummy_pixels= 0;OV5640YUV_dummy_lines = 0;iStartX = OV5640_IMAGE_SENSOR_PV_STARTX;iStartY = OV5640_IMAGE_SENSOR_PV_STARTY;image_window->GrabStartX=iStartX;image_window->GrabStartY=iStartY;image_window->ExposureWindowWidth=OV5640_IMAGE_SENSOR_PV_WIDTH - 2*iStartX;image_window->ExposureWindowHeight=OV5640_IMAGE_SENSOR_PV_HEIGHT- 2*iStartY;}else{
#endifOV5640_FOCUS_AD5820_Single_Focus();OV5640YUV_write_cmos_sensor(0x4202,0x0f);Sleep(30);OV5640YUV_set_5M();OV5640YUV_write_cmos_sensor(0x4202,0x00);Sleep(30);
#if 0OV5640YUV_dummy_pixels= 0;OV5640YUV_dummy_lines = 0;OV5640YUV_CAP_pclk = 560;OV5640YUV_PV_pclk = 560;//temp_shutter = (shutter*(OV5640_PV_PERIOD_PIXEL_NUMS_HTS+OV5640YUV_PV_dummy_pixels)*OV5640YUV_CAP_pclk)//         /(OV5640_FULL_PERIOD_PIXEL_NUMS_HTS+OV5640YUV_dummy_pixels)/OV5640YUV_PV_pclk;//shutter = (kal_uint32)(temp_shutter);shutter = shutter*4/3;SENSORDB("cap shutter calutaed = %d, 0x%x\n", shutter,shutter);iStartX = 2* OV5640_IMAGE_SENSOR_PV_STARTX;iStartY = 2* OV5640_IMAGE_SENSOR_PV_STARTY;image_window->GrabStartX=iStartX;image_window->GrabStartY=iStartY;image_window->ExposureWindowWidth=OV5640_IMAGE_SENSOR_FULL_WIDTH -2*iStartX;image_window->ExposureWindowHeight=OV5640_IMAGE_SENSOR_FULL_HEIGHT-2*iStartY;}sensor_config_data->Lines = image_window->ExposureWindowHeight;sensor_config_data->Shutter =shutter;OV5640YUV_SetDummy(OV5640YUV_dummy_pixels, OV5640YUV_dummy_lines);#endifOV5640YUV_SetShutter(shutter);write_OV5640YUV_gain(pv_gain);
#if 0memcpy(&OV5640YUVSensorConfigData, sensor_config_data, sizeof(MSDK_SENSOR_CONFIG_STRUCT));
#endif// sensor_config_data->SensorImageMirror = IMAGE_NORMAL;// OV5640YUV_Set_Mirror_Flip(sensor_config_data->SensorImageMirror);}/*************************************************************************************************************/OV5640YUV_write_cmos_sensor(0x3820,0x46);OV5640YUV_write_cmos_sensor(0x3821,0x00);OV5640YUV_write_cmos_sensor(0x4514,0x88);/*************************************************************************************************************/return ERROR_NONE;
}#endif  //end dg add 2015-07-15/* add by cym 20130605 */
static int ov5640_power(int flag)
{int err;printk("cym: ov5640 sensor is power %s\n",flag == 1 ?"on":"off");//Attention: Power On the all the camera module when system turn on//Here only control the reset&&powerdown pin/* Camera A */if(1 == flag){//poweron
#ifndef CONFIG_TC4_EVTregulator_enable(ov_vdd18_cam_regulator);udelay(10);regulator_enable(ov_vdd28_cam_regulator);udelay(10);regulator_enable(ov_vdd5m_cam_regulator); //DOVDD  DVDD 1.8vudelay(10);regulator_enable(ov_vddaf_cam_regulator);         //AVDD 2.8vudelay(10);
#endif
#if 1//pwdn     GPF0_5: 2M PWDNerr = gpio_request(EXYNOS4_GPF0(5), "GPF0_5");if (err)printk(KERN_ERR "#### failed to request GPF0_5 ####\n");s3c_gpio_setpull(EXYNOS4_GPF0(5), S3C_GPIO_PULL_NONE);gpio_direction_output(EXYNOS4_GPF0(5), 1);gpio_free(EXYNOS4_GPF0(5));
#endif//pwdn1   GPF2_4: 5M PWDNerr = gpio_request(EXYNOS4_GPL0(3), "GPL0_3");if (err)printk(KERN_ERR "#### failed to request GPL0_3 ####\n");s3c_gpio_setpull(EXYNOS4_GPL0(3), S3C_GPIO_PULL_NONE);gpio_direction_output(EXYNOS4_GPL0(3), 0);gpio_free(EXYNOS4_GPL0(3));msleep(20);//reseterr = gpio_request(EXYNOS4_GPL0(1), "GPL0_1");if (err)printk(KERN_ERR "#### failed to request GPL0_1 ####\n");s3c_gpio_setpull(EXYNOS4_GPL0(1), S3C_GPIO_PULL_NONE);gpio_direction_output(EXYNOS4_GPL0(1), 1);msleep(10);gpio_direction_output(EXYNOS4_GPL0(1), 0);msleep(10);gpio_direction_output(EXYNOS4_GPL0(1), 1);gpio_free(EXYNOS4_GPL0(1));msleep(20);}else{err = gpio_request(EXYNOS4_GPL0(1), "GPF0");if (err)printk(KERN_ERR "#### failed to request GPF0_4 ####\n");s3c_gpio_setpull(EXYNOS4_GPL0(1), S3C_GPIO_PULL_NONE);gpio_direction_output(EXYNOS4_GPL0(1), 0);gpio_free(EXYNOS4_GPL0(1));#if 1//powerdown    GPF0_5: 2M PWDNerr = gpio_request(EXYNOS4_GPF0(5), "GPF0_5");if (err)printk(KERN_ERR "#### failed to request GPE0_5 ####\n");s3c_gpio_setpull(EXYNOS4_GPF0(5), S3C_GPIO_PULL_NONE);gpio_direction_output(EXYNOS4_GPF0(5), 1);gpio_free(EXYNOS4_GPF0(5));
#endif//pwdn1           GPF2_4: 5M PWDNerr = gpio_request(EXYNOS4_GPL0(3), "GPL0_3");if (err)printk(KERN_ERR "#### failed to request GPF2_4 ####\n");s3c_gpio_setpull(EXYNOS4_GPL0(3), S3C_GPIO_PULL_NONE);gpio_direction_output(EXYNOS4_GPL0(3), 1);gpio_free(EXYNOS4_GPL0(3));
#ifndef CONFIG_TC4_EVTregulator_disable(ov_vdd18_cam_regulator);udelay(10);regulator_disable(ov_vdd28_cam_regulator);udelay(10);regulator_disable(ov_vdd5m_cam_regulator);udelay(10);regulator_disable(ov_vddaf_cam_regulator);udelay(10);
#endif}return 0;
}#define DEV_DBG_EN     1
#define REG_ADDR_STEP 2
#define REG_DATA_STEP 1
#define REG_STEP            (REG_ADDR_STEP+REG_DATA_STEP)#define csi_dev_err(x,arg...) printk(KERN_INFO"[OV5640]"x,##arg)
#define csi_dev_print(x,arg...) printk(KERN_INFO"[OV5640]"x,##arg)struct regval_list {unsigned char reg_num[REG_ADDR_STEP];unsigned char value[REG_DATA_STEP];
};static char ov5640_sensor_af_fw_regs[] = {0x02, 0x0f, 0xd6, 0x02, 0x0a, 0x39, 0xc2, 0x01, 0x22, 0x22, 0x00, 0x02, 0x0f, 0xb2, 0xe5, 0x1f, //0x8000,0x70, 0x72, 0xf5, 0x1e, 0xd2, 0x35, 0xff, 0xef, 0x25, 0xe0, 0x24, 0x4e, 0xf8, 0xe4, 0xf6, 0x08, //0x8010,0xf6, 0x0f, 0xbf, 0x34, 0xf2, 0x90, 0x0e, 0x93, 0xe4, 0x93, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, //0x8020,0x04, 0x7f, 0x05, 0x80, 0x02, 0x7f, 0xfb, 0x78, 0xbd, 0xa6, 0x07, 0x12, 0x0f, 0x04, 0x40, 0x04, //0x8030,0x7f, 0x03, 0x80, 0x02, 0x7f, 0x30, 0x78, 0xbc, 0xa6, 0x07, 0xe6, 0x18, 0xf6, 0x08, 0xe6, 0x78, //0x8040,0xb9, 0xf6, 0x78, 0xbc, 0xe6, 0x78, 0xba, 0xf6, 0x78, 0xbf, 0x76, 0x33, 0xe4, 0x08, 0xf6, 0x78, //0x8050,0xb8, 0x76, 0x01, 0x75, 0x4a, 0x02, 0x78, 0xb6, 0xf6, 0x08, 0xf6, 0x74, 0xff, 0x78, 0xc1, 0xf6, //0x8060,0x08, 0xf6, 0x75, 0x1f, 0x01, 0x78, 0xbc, 0xe6, 0x75, 0xf0, 0x05, 0xa4, 0xf5, 0x4b, 0x12, 0x0a, //0x8070,0xff, 0xc2, 0x37, 0x22, 0x78, 0xb8, 0xe6, 0xd3, 0x94, 0x00, 0x40, 0x02, 0x16, 0x22, 0xe5, 0x1f, //0x8080,0xb4, 0x05, 0x23, 0xe4, 0xf5, 0x1f, 0xc2, 0x01, 0x78, 0xb6, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, //0x8090,0x4e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xa2, 0x37, 0xe4, 0x33, 0xf5, 0x3c, 0x90, 0x30, 0x28, 0xf0, //0x80a0,0x75, 0x1e, 0x10, 0xd2, 0x35, 0x22, 0xe5, 0x4b, 0x75, 0xf0, 0x05, 0x84, 0x78, 0xbc, 0xf6, 0x90, //0x80b0,0x0e, 0x8c, 0xe4, 0x93, 0xff, 0x25, 0xe0, 0x24, 0x0a, 0xf8, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x78, //0x80c0,0xbc, 0xe6, 0x25, 0xe0, 0x24, 0x4e, 0xf8, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0xef, 0x12, 0x0f, 0x0b, //0x80d0,0xd3, 0x78, 0xb7, 0x96, 0xee, 0x18, 0x96, 0x40, 0x0d, 0x78, 0xbc, 0xe6, 0x78, 0xb9, 0xf6, 0x78, //0x80e0,0xb6, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x90, 0x0e, 0x8c, 0xe4, 0x93, 0x12, 0x0f, 0x0b, 0xc3, 0x78, //0x80f0,0xc2, 0x96, 0xee, 0x18, 0x96, 0x50, 0x0d, 0x78, 0xbc, 0xe6, 0x78, 0xba, 0xf6, 0x78, 0xc1, 0xa6, //0x8100,0x06, 0x08, 0xa6, 0x07, 0x78, 0xb6, 0xe6, 0xfe, 0x08, 0xe6, 0xc3, 0x78, 0xc2, 0x96, 0xff, 0xee, //0x8110,0x18, 0x96, 0x78, 0xc3, 0xf6, 0x08, 0xa6, 0x07, 0x90, 0x0e, 0x95, 0xe4, 0x18, 0x12, 0x0e, 0xe9, //0x8120,0x40, 0x02, 0xd2, 0x37, 0x78, 0xbc, 0xe6, 0x08, 0x26, 0x08, 0xf6, 0xe5, 0x1f, 0x64, 0x01, 0x70, //0x8130,0x4a, 0xe6, 0xc3, 0x78, 0xc0, 0x12, 0x0e, 0xdf, 0x40, 0x05, 0x12, 0x0e, 0xda, 0x40, 0x39, 0x12, //0x8140,0x0f, 0x02, 0x40, 0x04, 0x7f, 0xfe, 0x80, 0x02, 0x7f, 0x02, 0x78, 0xbd, 0xa6, 0x07, 0x78, 0xb9, //0x8150,0xe6, 0x24, 0x03, 0x78, 0xbf, 0xf6, 0x78, 0xb9, 0xe6, 0x24, 0xfd, 0x78, 0xc0, 0xf6, 0x12, 0x0f, //0x8160,0x02, 0x40, 0x06, 0x78, 0xc0, 0xe6, 0xff, 0x80, 0x04, 0x78, 0xbf, 0xe6, 0xff, 0x78, 0xbe, 0xa6, //0x8170,0x07, 0x75, 0x1f, 0x02, 0x78, 0xb8, 0x76, 0x01, 0x02, 0x02, 0x4a, 0xe5, 0x1f, 0x64, 0x02, 0x60, //0x8180,0x03, 0x02, 0x02, 0x2a, 0x78, 0xbe, 0xe6, 0xff, 0xc3, 0x78, 0xc0, 0x12, 0x0e, 0xe0, 0x40, 0x08, //0x8190,0x12, 0x0e, 0xda, 0x50, 0x03, 0x02, 0x02, 0x28, 0x12, 0x0f, 0x02, 0x40, 0x04, 0x7f, 0xff, 0x80, //0x81a0,0x02, 0x7f, 0x01, 0x78, 0xbd, 0xa6, 0x07, 0x78, 0xb9, 0xe6, 0x04, 0x78, 0xbf, 0xf6, 0x78, 0xb9, //0x81b0,0xe6, 0x14, 0x78, 0xc0, 0xf6, 0x18, 0x12, 0x0f, 0x04, 0x40, 0x04, 0xe6, 0xff, 0x80, 0x02, 0x7f, //0x81c0,0x00, 0x78, 0xbf, 0xa6, 0x07, 0xd3, 0x08, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x40, 0x04, 0xe6, 0xff, //0x81d0,0x80, 0x02, 0x7f, 0x00, 0x78, 0xc0, 0xa6, 0x07, 0xc3, 0x18, 0xe6, 0x64, 0x80, 0x94, 0xb3, 0x50, //0x81e0,0x04, 0xe6, 0xff, 0x80, 0x02, 0x7f, 0x33, 0x78, 0xbf, 0xa6, 0x07, 0xc3, 0x08, 0xe6, 0x64, 0x80, //0x81f0,0x94, 0xb3, 0x50, 0x04, 0xe6, 0xff, 0x80, 0x02, 0x7f, 0x33, 0x78, 0xc0, 0xa6, 0x07, 0x12, 0x0f, //0x8200,0x02, 0x40, 0x06, 0x78, 0xc0, 0xe6, 0xff, 0x80, 0x04, 0x78, 0xbf, 0xe6, 0xff, 0x78, 0xbe, 0xa6, //0x8210,0x07, 0x75, 0x1f, 0x03, 0x78, 0xb8, 0x76, 0x01, 0x80, 0x20, 0xe5, 0x1f, 0x64, 0x03, 0x70, 0x26, //0x8220,0x78, 0xbe, 0xe6, 0xff, 0xc3, 0x78, 0xc0, 0x12, 0x0e, 0xe0, 0x40, 0x05, 0x12, 0x0e, 0xda, 0x40, //0x8230,0x09, 0x78, 0xb9, 0xe6, 0x78, 0xbe, 0xf6, 0x75, 0x1f, 0x04, 0x78, 0xbe, 0xe6, 0x75, 0xf0, 0x05, //0x8240,0xa4, 0xf5, 0x4b, 0x02, 0x0a, 0xff, 0xe5, 0x1f, 0xb4, 0x04, 0x10, 0x90, 0x0e, 0x94, 0xe4, 0x78, //0x8250,0xc3, 0x12, 0x0e, 0xe9, 0x40, 0x02, 0xd2, 0x37, 0x75, 0x1f, 0x05, 0x22, 0x30, 0x01, 0x03, 0x02, //0x8260,0x04, 0xc0, 0x30, 0x02, 0x03, 0x02, 0x04, 0xc0, 0x90, 0x51, 0xa5, 0xe0, 0x78, 0x93, 0xf6, 0xa3, //0x8270,0xe0, 0x08, 0xf6, 0xa3, 0xe0, 0x08, 0xf6, 0xe5, 0x1f, 0x70, 0x3c, 0x75, 0x1e, 0x20, 0xd2, 0x35, //0x8280,0x12, 0x0c, 0x7a, 0x78, 0x7e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x78, 0x8b, 0xa6, 0x09, 0x18, 0x76, //0x8290,0x01, 0x12, 0x0c, 0x5b, 0x78, 0x4e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x78, 0x8b, 0xe6, 0x78, 0x6e, //0x82a0,0xf6, 0x75, 0x1f, 0x01, 0x78, 0x93, 0xe6, 0x78, 0x90, 0xf6, 0x78, 0x94, 0xe6, 0x78, 0x91, 0xf6, //0x82b0,0x78, 0x95, 0xe6, 0x78, 0x92, 0xf6, 0x22, 0x79, 0x90, 0xe7, 0xd3, 0x78, 0x93, 0x96, 0x40, 0x05, //0x82c0,0xe7, 0x96, 0xff, 0x80, 0x08, 0xc3, 0x79, 0x93, 0xe7, 0x78, 0x90, 0x96, 0xff, 0x78, 0x88, 0x76, //0x82d0,0x00, 0x08, 0xa6, 0x07, 0x79, 0x91, 0xe7, 0xd3, 0x78, 0x94, 0x96, 0x40, 0x05, 0xe7, 0x96, 0xff, //0x82e0,0x80, 0x08, 0xc3, 0x79, 0x94, 0xe7, 0x78, 0x91, 0x96, 0xff, 0x12, 0x0c, 0x8e, 0x79, 0x92, 0xe7, //0x82f0,0xd3, 0x78, 0x95, 0x96, 0x40, 0x05, 0xe7, 0x96, 0xff, 0x80, 0x08, 0xc3, 0x79, 0x95, 0xe7, 0x78, //0x8300,0x92, 0x96, 0xff, 0x12, 0x0c, 0x8e, 0x12, 0x0c, 0x5b, 0x78, 0x8a, 0xe6, 0x25, 0xe0, 0x24, 0x4e, //0x8310,0xf8, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x78, 0x8a, 0xe6, 0x24, 0x6e, 0xf8, 0xa6, 0x09, 0x78, 0x8a, //0x8320,0xe6, 0x24, 0x01, 0xff, 0xe4, 0x33, 0xfe, 0xd3, 0xef, 0x94, 0x0f, 0xee, 0x64, 0x80, 0x94, 0x80, //0x8330,0x40, 0x04, 0x7f, 0x00, 0x80, 0x05, 0x78, 0x8a, 0xe6, 0x04, 0xff, 0x78, 0x8a, 0xa6, 0x07, 0xe5, //0x8340,0x1f, 0xb4, 0x01, 0x0a, 0xe6, 0x60, 0x03, 0x02, 0x04, 0xc0, 0x75, 0x1f, 0x02, 0x22, 0x12, 0x0c, //0x8350,0x7a, 0x78, 0x80, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x12, 0x0c, 0x7a, 0x78, 0x82, 0xa6, 0x06, 0x08, //0x8360,0xa6, 0x07, 0x78, 0x6e, 0xe6, 0x78, 0x8c, 0xf6, 0x78, 0x6e, 0xe6, 0x78, 0x8d, 0xf6, 0x7f, 0x01, //0x8370,0xef, 0x25, 0xe0, 0x24, 0x4f, 0xf9, 0xc3, 0x78, 0x81, 0xe6, 0x97, 0x18, 0xe6, 0x19, 0x97, 0x50, //0x8380,0x0a, 0x12, 0x0c, 0x82, 0x78, 0x80, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x74, 0x6e, 0x2f, 0xf9, 0x78, //0x8390,0x8c, 0xe6, 0xc3, 0x97, 0x50, 0x08, 0x74, 0x6e, 0x2f, 0xf8, 0xe6, 0x78, 0x8c, 0xf6, 0xef, 0x25, //0x83a0,0xe0, 0x24, 0x4f, 0xf9, 0xd3, 0x78, 0x83, 0xe6, 0x97, 0x18, 0xe6, 0x19, 0x97, 0x40, 0x0a, 0x12, //0x83b0,0x0c, 0x82, 0x78, 0x82, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x74, 0x6e, 0x2f, 0xf9, 0x78, 0x8d, 0xe6, //0x83c0,0xd3, 0x97, 0x40, 0x08, 0x74, 0x6e, 0x2f, 0xf8, 0xe6, 0x78, 0x8d, 0xf6, 0x0f, 0xef, 0x64, 0x10, //0x83d0,0x70, 0x9e, 0xc3, 0x79, 0x81, 0xe7, 0x78, 0x83, 0x96, 0xff, 0x19, 0xe7, 0x18, 0x96, 0x78, 0x84, //0x83e0,0xf6, 0x08, 0xa6, 0x07, 0xc3, 0x79, 0x8c, 0xe7, 0x78, 0x8d, 0x96, 0x08, 0xf6, 0xd3, 0x79, 0x81, //0x83f0,0xe7, 0x78, 0x7f, 0x96, 0x19, 0xe7, 0x18, 0x96, 0x40, 0x05, 0x09, 0xe7, 0x08, 0x80, 0x06, 0xc3, //0x8400,0x79, 0x7f, 0xe7, 0x78, 0x81, 0x96, 0xff, 0x19, 0xe7, 0x18, 0x96, 0xfe, 0x78, 0x86, 0xa6, 0x06, //0x8410,0x08, 0xa6, 0x07, 0x79, 0x8c, 0xe7, 0xd3, 0x78, 0x8b, 0x96, 0x40, 0x05, 0xe7, 0x96, 0xff, 0x80, //0x8420,0x08, 0xc3, 0x79, 0x8b, 0xe7, 0x78, 0x8c, 0x96, 0xff, 0x78, 0x8f, 0xa6, 0x07, 0xe5, 0x1f, 0x64, //0x8430,0x02, 0x70, 0x69, 0x90, 0x0e, 0x91, 0x93, 0xff, 0x18, 0xe6, 0xc3, 0x9f, 0x50, 0x72, 0x12, 0x0c, //0x8440,0x4a, 0x12, 0x0c, 0x2f, 0x90, 0x0e, 0x8e, 0x12, 0x0c, 0x38, 0x78, 0x80, 0x12, 0x0c, 0x6b, 0x7b, //0x8450,0x04, 0x12, 0x0c, 0x1d, 0xc3, 0x12, 0x06, 0x45, 0x50, 0x56, 0x90, 0x0e, 0x92, 0xe4, 0x93, 0xff, //0x8460,0x78, 0x8f, 0xe6, 0x9f, 0x40, 0x02, 0x80, 0x11, 0x90, 0x0e, 0x90, 0xe4, 0x93, 0xff, 0xd3, 0x78, //0x8470,0x89, 0xe6, 0x9f, 0x18, 0xe6, 0x94, 0x00, 0x40, 0x03, 0x75, 0x1f, 0x05, 0x12, 0x0c, 0x4a, 0x12, //0x8480,0x0c, 0x2f, 0x90, 0x0e, 0x8f, 0x12, 0x0c, 0x38, 0x78, 0x7e, 0x12, 0x0c, 0x6b, 0x7b, 0x40, 0x12, //0x8490,0x0c, 0x1d, 0xd3, 0x12, 0x06, 0x45, 0x40, 0x18, 0x75, 0x1f, 0x05, 0x22, 0xe5, 0x1f, 0xb4, 0x05, //0x84a0,0x0f, 0xd2, 0x01, 0xc2, 0x02, 0xe4, 0xf5, 0x1f, 0xf5, 0x1e, 0xd2, 0x35, 0xd2, 0x33, 0xd2, 0x36, //0x84b0,0x22, 0xef, 0x8d, 0xf0, 0xa4, 0xa8, 0xf0, 0xcf, 0x8c, 0xf0, 0xa4, 0x28, 0xce, 0x8d, 0xf0, 0xa4, //0x84c0,0x2e, 0xfe, 0x22, 0xbc, 0x00, 0x0b, 0xbe, 0x00, 0x29, 0xef, 0x8d, 0xf0, 0x84, 0xff, 0xad, 0xf0, //0x84d0,0x22, 0xe4, 0xcc, 0xf8, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xec, 0x33, 0xfc, //0x84e0,0xee, 0x9d, 0xec, 0x98, 0x40, 0x05, 0xfc, 0xee, 0x9d, 0xfe, 0x0f, 0xd5, 0xf0, 0xe9, 0xe4, 0xce, //0x84f0,0xfd, 0x22, 0xed, 0xf8, 0xf5, 0xf0, 0xee, 0x84, 0x20, 0xd2, 0x1c, 0xfe, 0xad, 0xf0, 0x75, 0xf0, //0x8500,0x08, 0xef, 0x2f, 0xff, 0xed, 0x33, 0xfd, 0x40, 0x07, 0x98, 0x50, 0x06, 0xd5, 0xf0, 0xf2, 0x22, //0x8510,0xc3, 0x98, 0xfd, 0x0f, 0xd5, 0xf0, 0xea, 0x22, 0xe8, 0x8f, 0xf0, 0xa4, 0xcc, 0x8b, 0xf0, 0xa4, //0x8520,0x2c, 0xfc, 0xe9, 0x8e, 0xf0, 0xa4, 0x2c, 0xfc, 0x8a, 0xf0, 0xed, 0xa4, 0x2c, 0xfc, 0xea, 0x8e, //0x8530,0xf0, 0xa4, 0xcd, 0xa8, 0xf0, 0x8b, 0xf0, 0xa4, 0x2d, 0xcc, 0x38, 0x25, 0xf0, 0xfd, 0xe9, 0x8f, //0x8540,0xf0, 0xa4, 0x2c, 0xcd, 0x35, 0xf0, 0xfc, 0xeb, 0x8e, 0xf0, 0xa4, 0xfe, 0xa9, 0xf0, 0xeb, 0x8f, //0x8550,0xf0, 0xa4, 0xcf, 0xc5, 0xf0, 0x2e, 0xcd, 0x39, 0xfe, 0xe4, 0x3c, 0xfc, 0xea, 0xa4, 0x2d, 0xce, //0x8560,0x35, 0xf0, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, //0x8570,0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc, 0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, //0x8580,0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40, 0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, //0x8590,0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6, 0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, //0x85a0,0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9, 0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, //0x85b0,0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb, 0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, //0x85c0,0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb, 0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, //0x85d0,0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9, 0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, //0x85e0,0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, //0x85f0,0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a, 0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, //0x8600,0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, //0x8610,0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07, 0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, //0x8620,0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8, 0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, //0x8630,0xfa, 0xe4, 0xc8, 0xf9, 0x22, 0xeb, 0x9f, 0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, //0x8640,0xf0, 0xe8, 0x9c, 0x45, 0xf0, 0x22, 0xe8, 0x60, 0x0f, 0xec, 0xc3, 0x13, 0xfc, 0xed, 0x13, 0xfd, //0x8650,0xee, 0x13, 0xfe, 0xef, 0x13, 0xff, 0xd8, 0xf1, 0x22, 0xe8, 0x60, 0x0f, 0xef, 0xc3, 0x33, 0xff, //0x8660,0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xd8, 0xf1, 0x22, 0xe4, 0x93, 0xfc, 0x74, //0x8670,0x01, 0x93, 0xfd, 0x74, 0x02, 0x93, 0xfe, 0x74, 0x03, 0x93, 0xff, 0x22, 0xe6, 0xfb, 0x08, 0xe6, //0x8680,0xf9, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xcb, 0xf8, 0x22, 0xec, 0xf6, 0x08, 0xed, 0xf6, 0x08, 0xee, //0x8690,0xf6, 0x08, 0xef, 0xf6, 0x22, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, //0x86a0,0x22, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, //0x86b0,0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, //0x86c0,0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0x90, 0x38, 0x04, 0x78, 0x52, 0x12, 0x0b, 0xfd, 0x90, //0x86d0,0x38, 0x00, 0xe0, 0xfe, 0xa3, 0xe0, 0xfd, 0xed, 0xff, 0xc3, 0x12, 0x0b, 0x9e, 0x90, 0x38, 0x10, //0x86e0,0x12, 0x0b, 0x92, 0x90, 0x38, 0x06, 0x78, 0x54, 0x12, 0x0b, 0xfd, 0x90, 0x38, 0x02, 0xe0, 0xfe, //0x86f0,0xa3, 0xe0, 0xfd, 0xed, 0xff, 0xc3, 0x12, 0x0b, 0x9e, 0x90, 0x38, 0x12, 0x12, 0x0b, 0x92, 0xa3, //0x8700,0xe0, 0xb4, 0x31, 0x07, 0x78, 0x52, 0x79, 0x52, 0x12, 0x0c, 0x13, 0x90, 0x38, 0x14, 0xe0, 0xb4, //0x8710,0x71, 0x15, 0x78, 0x52, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, //0x8720,0xf9, 0x79, 0x53, 0xf7, 0xee, 0x19, 0xf7, 0x90, 0x38, 0x15, 0xe0, 0xb4, 0x31, 0x07, 0x78, 0x54, //0x8730,0x79, 0x54, 0x12, 0x0c, 0x13, 0x90, 0x38, 0x15, 0xe0, 0xb4, 0x71, 0x15, 0x78, 0x54, 0xe6, 0xfe, //0x8740,0x08, 0xe6, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x79, 0x55, 0xf7, 0xee, 0x19, //0x8750,0xf7, 0x79, 0x52, 0x12, 0x0b, 0xd9, 0x09, 0x12, 0x0b, 0xd9, 0xaf, 0x47, 0x12, 0x0b, 0xb2, 0xe5, //0x8760,0x44, 0xfb, 0x7a, 0x00, 0xfd, 0x7c, 0x00, 0x12, 0x04, 0xd3, 0x78, 0x5a, 0xa6, 0x06, 0x08, 0xa6, //0x8770,0x07, 0xaf, 0x45, 0x12, 0x0b, 0xb2, 0xad, 0x03, 0x7c, 0x00, 0x12, 0x04, 0xd3, 0x78, 0x56, 0xa6, //0x8780,0x06, 0x08, 0xa6, 0x07, 0xaf, 0x48, 0x78, 0x54, 0x12, 0x0b, 0xb4, 0xe5, 0x43, 0xfb, 0xfd, 0x7c, //0x8790,0x00, 0x12, 0x04, 0xd3, 0x78, 0x5c, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xaf, 0x46, 0x7e, 0x00, 0x78, //0x87a0,0x54, 0x12, 0x0b, 0xb6, 0xad, 0x03, 0x7c, 0x00, 0x12, 0x04, 0xd3, 0x78, 0x58, 0xa6, 0x06, 0x08, //0x87b0,0xa6, 0x07, 0xc3, 0x78, 0x5b, 0xe6, 0x94, 0x08, 0x18, 0xe6, 0x94, 0x00, 0x50, 0x05, 0x76, 0x00, //0x87c0,0x08, 0x76, 0x08, 0xc3, 0x78, 0x5d, 0xe6, 0x94, 0x08, 0x18, 0xe6, 0x94, 0x00, 0x50, 0x05, 0x76, //0x87d0,0x00, 0x08, 0x76, 0x08, 0x78, 0x5a, 0x12, 0x0b, 0xc6, 0xff, 0xd3, 0x78, 0x57, 0xe6, 0x9f, 0x18, //0x87e0,0xe6, 0x9e, 0x40, 0x0e, 0x78, 0x5a, 0xe6, 0x13, 0xfe, 0x08, 0xe6, 0x78, 0x57, 0x12, 0x0c, 0x08, //0x87f0,0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0x78, 0x5e, 0x12, 0x0b, 0xbe, 0xff, 0xd3, 0x78, 0x59, 0xe6, //0x8800,0x9f, 0x18, 0xe6, 0x9e, 0x40, 0x0e, 0x78, 0x5c, 0xe6, 0x13, 0xfe, 0x08, 0xe6, 0x78, 0x59, 0x12, //0x8810,0x0c, 0x08, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xe4, 0xfc, 0xfd, 0x78, 0x62, 0x12, 0x06, 0x99, //0x8820,0x78, 0x5a, 0x12, 0x0b, 0xc6, 0x78, 0x57, 0x26, 0xff, 0xee, 0x18, 0x36, 0xfe, 0x78, 0x66, 0x12, //0x8830,0x0b, 0xbe, 0x78, 0x59, 0x26, 0xff, 0xee, 0x18, 0x36, 0xfe, 0xe4, 0xfc, 0xfd, 0x78, 0x6a, 0x12, //0x8840,0x06, 0x99, 0x12, 0x0b, 0xce, 0x78, 0x66, 0x12, 0x06, 0x8c, 0xd3, 0x12, 0x06, 0x45, 0x40, 0x08, //0x8850,0x12, 0x0b, 0xce, 0x78, 0x66, 0x12, 0x06, 0x99, 0x78, 0x54, 0x12, 0x0b, 0xd0, 0x78, 0x6a, 0x12, //0x8860,0x06, 0x8c, 0xd3, 0x12, 0x06, 0x45, 0x40, 0x0a, 0x78, 0x54, 0x12, 0x0b, 0xd0, 0x78, 0x6a, 0x12, //0x8870,0x06, 0x99, 0x78, 0x61, 0xe6, 0x90, 0x60, 0x01, 0xf0, 0x78, 0x65, 0xe6, 0xa3, 0xf0, 0x78, 0x69, //0x8880,0xe6, 0xa3, 0xf0, 0x78, 0x55, 0xe6, 0xa3, 0xf0, 0x7d, 0x01, 0x78, 0x61, 0x12, 0x0b, 0xe9, 0x24, //0x8890,0x01, 0x12, 0x0b, 0xa6, 0x78, 0x65, 0x12, 0x0b, 0xe9, 0x24, 0x02, 0x12, 0x0b, 0xa6, 0x78, 0x69, //0x88a0,0x12, 0x0b, 0xe9, 0x24, 0x03, 0x12, 0x0b, 0xa6, 0x78, 0x6d, 0x12, 0x0b, 0xe9, 0x24, 0x04, 0x12, //0x88b0,0x0b, 0xa6, 0x0d, 0xbd, 0x05, 0xd4, 0xc2, 0x0e, 0xc2, 0x06, 0x22, 0x85, 0x08, 0x41, 0x90, 0x30, //0x88c0,0x24, 0xe0, 0xf5, 0x3d, 0xa3, 0xe0, 0xf5, 0x3e, 0xa3, 0xe0, 0xf5, 0x3f, 0xa3, 0xe0, 0xf5, 0x40, //0x88d0,0xa3, 0xe0, 0xf5, 0x3c, 0xd2, 0x34, 0xe5, 0x41, 0x12, 0x06, 0xb1, 0x09, 0x31, 0x03, 0x09, 0x35, //0x88e0,0x04, 0x09, 0x3b, 0x05, 0x09, 0x3e, 0x06, 0x09, 0x41, 0x07, 0x09, 0x4a, 0x08, 0x09, 0x5b, 0x12, //0x88f0,0x09, 0x73, 0x18, 0x09, 0x89, 0x19, 0x09, 0x5e, 0x1a, 0x09, 0x6a, 0x1b, 0x09, 0xad, 0x80, 0x09, //0x8900,0xb2, 0x81, 0x0a, 0x1d, 0x8f, 0x0a, 0x09, 0x90, 0x0a, 0x1d, 0x91, 0x0a, 0x1d, 0x92, 0x0a, 0x1d, //0x8910,0x93, 0x0a, 0x1d, 0x94, 0x0a, 0x1d, 0x98, 0x0a, 0x17, 0x9f, 0x0a, 0x1a, 0xec, 0x00, 0x00, 0x0a, //0x8920,0x38, 0x12, 0x0f, 0x74, 0x22, 0x12, 0x0f, 0x74, 0xd2, 0x03, 0x22, 0xd2, 0x03, 0x22, 0xc2, 0x03, //0x8930,0x22, 0xa2, 0x37, 0xe4, 0x33, 0xf5, 0x3c, 0x02, 0x0a, 0x1d, 0xc2, 0x01, 0xc2, 0x02, 0xc2, 0x03, //0x8940,0x12, 0x0d, 0x0d, 0x75, 0x1e, 0x70, 0xd2, 0x35, 0x02, 0x0a, 0x1d, 0x02, 0x0a, 0x04, 0x85, 0x40, //0x8950,0x4a, 0x85, 0x3c, 0x4b, 0x12, 0x0a, 0xff, 0x02, 0x0a, 0x1d, 0x85, 0x4a, 0x40, 0x85, 0x4b, 0x3c, //0x8960,0x02, 0x0a, 0x1d, 0xe4, 0xf5, 0x22, 0xf5, 0x23, 0x85, 0x40, 0x31, 0x85, 0x3f, 0x30, 0x85, 0x3e, //0x8970,0x2f, 0x85, 0x3d, 0x2e, 0x12, 0x0f, 0x46, 0x80, 0x1f, 0x75, 0x22, 0x00, 0x75, 0x23, 0x01, 0x74, //0x8980,0xff, 0xf5, 0x2d, 0xf5, 0x2c, 0xf5, 0x2b, 0xf5, 0x2a, 0x12, 0x0f, 0x46, 0x85, 0x2d, 0x40, 0x85, //0x8990,0x2c, 0x3f, 0x85, 0x2b, 0x3e, 0x85, 0x2a, 0x3d, 0xe4, 0xf5, 0x3c, 0x80, 0x70, 0x12, 0x0f, 0x16, //0x89a0,0x80, 0x6b, 0x85, 0x3d, 0x45, 0x85, 0x3e, 0x46, 0xe5, 0x47, 0xc3, 0x13, 0xff, 0xe5, 0x45, 0xc3, //0x89b0,0x9f, 0x50, 0x02, 0x8f, 0x45, 0xe5, 0x48, 0xc3, 0x13, 0xff, 0xe5, 0x46, 0xc3, 0x9f, 0x50, 0x02, //0x89c0,0x8f, 0x46, 0xe5, 0x47, 0xc3, 0x13, 0xff, 0xfd, 0xe5, 0x45, 0x2d, 0xfd, 0xe4, 0x33, 0xfc, 0xe5, //0x89d0,0x44, 0x12, 0x0f, 0x90, 0x40, 0x05, 0xe5, 0x44, 0x9f, 0xf5, 0x45, 0xe5, 0x48, 0xc3, 0x13, 0xff, //0x89e0,0xfd, 0xe5, 0x46, 0x2d, 0xfd, 0xe4, 0x33, 0xfc, 0xe5, 0x43, 0x12, 0x0f, 0x90, 0x40, 0x05, 0xe5, //0x89f0,0x43, 0x9f, 0xf5, 0x46, 0x12, 0x06, 0xd7, 0x80, 0x14, 0x85, 0x40, 0x48, 0x85, 0x3f, 0x47, 0x85, //0x8a00,0x3e, 0x46, 0x85, 0x3d, 0x45, 0x80, 0x06, 0x02, 0x06, 0xd7, 0x12, 0x0d, 0x7e, 0x90, 0x30, 0x24, //0x8a10,0xe5, 0x3d, 0xf0, 0xa3, 0xe5, 0x3e, 0xf0, 0xa3, 0xe5, 0x3f, 0xf0, 0xa3, 0xe5, 0x40, 0xf0, 0xa3, //0x8a20,0xe5, 0x3c, 0xf0, 0x90, 0x30, 0x23, 0xe4, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, //0x8a30,0xd0, 0x90, 0x3f, 0x0c, 0xe0, 0xf5, 0x32, 0xe5, 0x32, 0x30, 0xe3, 0x74, 0x30, 0x36, 0x66, 0x90, //0x8a40,0x60, 0x19, 0xe0, 0xf5, 0x0a, 0xa3, 0xe0, 0xf5, 0x0b, 0x90, 0x60, 0x1d, 0xe0, 0xf5, 0x14, 0xa3, //0x8a50,0xe0, 0xf5, 0x15, 0x90, 0x60, 0x21, 0xe0, 0xf5, 0x0c, 0xa3, 0xe0, 0xf5, 0x0d, 0x90, 0x60, 0x29, //0x8a60,0xe0, 0xf5, 0x0e, 0xa3, 0xe0, 0xf5, 0x0f, 0x90, 0x60, 0x31, 0xe0, 0xf5, 0x10, 0xa3, 0xe0, 0xf5, //0x8a70,0x11, 0x90, 0x60, 0x39, 0xe0, 0xf5, 0x12, 0xa3, 0xe0, 0xf5, 0x13, 0x30, 0x01, 0x06, 0x30, 0x33, //0x8a80,0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x09, 0x30, 0x02, 0x06, 0x30, 0x33, 0x03, 0xd3, 0x80, 0x01, //0x8a90,0xc3, 0x92, 0x0a, 0x30, 0x33, 0x0c, 0x30, 0x03, 0x09, 0x20, 0x02, 0x06, 0x20, 0x01, 0x03, 0xd3, //0x8aa0,0x80, 0x01, 0xc3, 0x92, 0x0b, 0x90, 0x30, 0x01, 0xe0, 0x44, 0x40, 0xf0, 0xe0, 0x54, 0xbf, 0xf0, //0x8ab0,0xe5, 0x32, 0x30, 0xe1, 0x14, 0x30, 0x34, 0x11, 0x90, 0x30, 0x22, 0xe0, 0xf5, 0x08, 0xe4, 0xf0, //0x8ac0,0x30, 0x00, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x08, 0xe5, 0x32, 0x30, 0xe5, 0x12, 0x90, 0x56, //0x8ad0,0xa1, 0xe0, 0xf5, 0x09, 0x30, 0x31, 0x09, 0x30, 0x05, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0d, //0x8ae0,0x90, 0x3f, 0x0c, 0xe5, 0x32, 0xf0, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, //0x8af0,0x0e, 0x7e, 0xe4, 0x93, 0xfe, 0x74, 0x01, 0x93, 0xff, 0xc3, 0x90, 0x0e, 0x7c, 0x74, 0x01, 0x93, //0x8b00,0x9f, 0xff, 0xe4, 0x93, 0x9e, 0xfe, 0xe4, 0x8f, 0x3b, 0x8e, 0x3a, 0xf5, 0x39, 0xf5, 0x38, 0xab, //0x8b10,0x3b, 0xaa, 0x3a, 0xa9, 0x39, 0xa8, 0x38, 0xaf, 0x4b, 0xfc, 0xfd, 0xfe, 0x12, 0x05, 0x28, 0x12, //0x8b20,0x0d, 0xe1, 0xe4, 0x7b, 0xff, 0xfa, 0xf9, 0xf8, 0x12, 0x05, 0xb3, 0x12, 0x0d, 0xe1, 0x90, 0x0e, //0x8b30,0x69, 0xe4, 0x12, 0x0d, 0xf6, 0x12, 0x0d, 0xe1, 0xe4, 0x85, 0x4a, 0x37, 0xf5, 0x36, 0xf5, 0x35, //0x8b40,0xf5, 0x34, 0xaf, 0x37, 0xae, 0x36, 0xad, 0x35, 0xac, 0x34, 0xa3, 0x12, 0x0d, 0xf6, 0x8f, 0x37, //0x8b50,0x8e, 0x36, 0x8d, 0x35, 0x8c, 0x34, 0xe5, 0x3b, 0x45, 0x37, 0xf5, 0x3b, 0xe5, 0x3a, 0x45, 0x36, //0x8b60,0xf5, 0x3a, 0xe5, 0x39, 0x45, 0x35, 0xf5, 0x39, 0xe5, 0x38, 0x45, 0x34, 0xf5, 0x38, 0xe4, 0xf5, //0x8b70,0x22, 0xf5, 0x23, 0x85, 0x3b, 0x31, 0x85, 0x3a, 0x30, 0x85, 0x39, 0x2f, 0x85, 0x38, 0x2e, 0x02, //0x8b80,0x0f, 0x46, 0xe0, 0xa3, 0xe0, 0x75, 0xf0, 0x02, 0xa4, 0xff, 0xae, 0xf0, 0xc3, 0x08, 0xe6, 0x9f, //0x8b90,0xf6, 0x18, 0xe6, 0x9e, 0xf6, 0x22, 0xff, 0xe5, 0xf0, 0x34, 0x60, 0x8f, 0x82, 0xf5, 0x83, 0xec, //0x8ba0,0xf0, 0x22, 0x78, 0x52, 0x7e, 0x00, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x02, 0x04, 0xc1, 0xe4, 0xfc, //0x8bb0,0xfd, 0x12, 0x06, 0x99, 0x78, 0x5c, 0xe6, 0xc3, 0x13, 0xfe, 0x08, 0xe6, 0x13, 0x22, 0x78, 0x52, //0x8bc0,0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xe4, 0xfc, 0xfd, 0x22, 0xe7, 0xc4, 0xf8, 0x54, 0xf0, 0xc8, 0x68, //0x8bd0,0xf7, 0x09, 0xe7, 0xc4, 0x54, 0x0f, 0x48, 0xf7, 0x22, 0xe6, 0xfc, 0xed, 0x75, 0xf0, 0x04, 0xa4, //0x8be0,0x22, 0x12, 0x06, 0x7c, 0x8f, 0x48, 0x8e, 0x47, 0x8d, 0x46, 0x8c, 0x45, 0x22, 0xe0, 0xfe, 0xa3, //0x8bf0,0xe0, 0xfd, 0xee, 0xf6, 0xed, 0x08, 0xf6, 0x22, 0x13, 0xff, 0xc3, 0xe6, 0x9f, 0xff, 0x18, 0xe6, //0x8c00,0x9e, 0xfe, 0x22, 0xe6, 0xc3, 0x13, 0xf7, 0x08, 0xe6, 0x13, 0x09, 0xf7, 0x22, 0xad, 0x39, 0xac, //0x8c10,0x38, 0xfa, 0xf9, 0xf8, 0x12, 0x05, 0x28, 0x8f, 0x3b, 0x8e, 0x3a, 0x8d, 0x39, 0x8c, 0x38, 0xab, //0x8c20,0x37, 0xaa, 0x36, 0xa9, 0x35, 0xa8, 0x34, 0x22, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0xfe, 0x12, 0x05, //0x8c30,0x28, 0x8f, 0x37, 0x8e, 0x36, 0x8d, 0x35, 0x8c, 0x34, 0x22, 0x78, 0x84, 0xe6, 0xfe, 0x08, 0xe6, //0x8c40,0xff, 0xe4, 0x8f, 0x37, 0x8e, 0x36, 0xf5, 0x35, 0xf5, 0x34, 0x22, 0x90, 0x0e, 0x8c, 0xe4, 0x93, //0x8c50,0x25, 0xe0, 0x24, 0x0a, 0xf8, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe6, 0xfe, 0x08, 0xe6, 0xff, //0x8c60,0xe4, 0x8f, 0x3b, 0x8e, 0x3a, 0xf5, 0x39, 0xf5, 0x38, 0x22, 0x78, 0x4e, 0xe6, 0xfe, 0x08, 0xe6, //0x8c70,0xff, 0x22, 0xef, 0x25, 0xe0, 0x24, 0x4e, 0xf8, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x22, 0x78, 0x89, //0x8c80,0xef, 0x26, 0xf6, 0x18, 0xe4, 0x36, 0xf6, 0x22, 0x75, 0x89, 0x03, 0x75, 0xa8, 0x01, 0x75, 0xb8, //0x8c90,0x04, 0x75, 0x34, 0xff, 0x75, 0x35, 0x0e, 0x75, 0x36, 0x15, 0x75, 0x37, 0x0d, 0x12, 0x0e, 0x9a, //0x8ca0,0x12, 0x00, 0x09, 0x12, 0x0f, 0x16, 0x12, 0x00, 0x06, 0xd2, 0x00, 0xd2, 0x34, 0xd2, 0xaf, 0x75, //0x8cb0,0x34, 0xff, 0x75, 0x35, 0x0e, 0x75, 0x36, 0x49, 0x75, 0x37, 0x03, 0x12, 0x0e, 0x9a, 0x30, 0x08, //0x8cc0,0x09, 0xc2, 0x34, 0x12, 0x08, 0xcb, 0xc2, 0x08, 0xd2, 0x34, 0x30, 0x0b, 0x09, 0xc2, 0x36, 0x12, //0x8cd0,0x02, 0x6c, 0xc2, 0x0b, 0xd2, 0x36, 0x30, 0x09, 0x09, 0xc2, 0x36, 0x12, 0x00, 0x0e, 0xc2, 0x09, //0x8ce0,0xd2, 0x36, 0x30, 0x0e, 0x03, 0x12, 0x06, 0xd7, 0x30, 0x35, 0xd3, 0x90, 0x30, 0x29, 0xe5, 0x1e, //0x8cf0,0xf0, 0xb4, 0x10, 0x05, 0x90, 0x30, 0x23, 0xe4, 0xf0, 0xc2, 0x35, 0x80, 0xc1, 0xe4, 0xf5, 0x4b, //0x8d00,0x90, 0x0e, 0x7a, 0x93, 0xff, 0xe4, 0x8f, 0x37, 0xf5, 0x36, 0xf5, 0x35, 0xf5, 0x34, 0xaf, 0x37, //0x8d10,0xae, 0x36, 0xad, 0x35, 0xac, 0x34, 0x90, 0x0e, 0x6a, 0x12, 0x0d, 0xf6, 0x8f, 0x37, 0x8e, 0x36, //0x8d20,0x8d, 0x35, 0x8c, 0x34, 0x90, 0x0e, 0x72, 0x12, 0x06, 0x7c, 0xef, 0x45, 0x37, 0xf5, 0x37, 0xee, //0x8d30,0x45, 0x36, 0xf5, 0x36, 0xed, 0x45, 0x35, 0xf5, 0x35, 0xec, 0x45, 0x34, 0xf5, 0x34, 0xe4, 0xf5, //0x8d40,0x22, 0xf5, 0x23, 0x85, 0x37, 0x31, 0x85, 0x36, 0x30, 0x85, 0x35, 0x2f, 0x85, 0x34, 0x2e, 0x12, //0x8d50,0x0f, 0x46, 0xe4, 0xf5, 0x22, 0xf5, 0x23, 0x90, 0x0e, 0x72, 0x12, 0x0d, 0xea, 0x12, 0x0f, 0x46, //0x8d60,0xe4, 0xf5, 0x22, 0xf5, 0x23, 0x90, 0x0e, 0x6e, 0x12, 0x0d, 0xea, 0x02, 0x0f, 0x46, 0xe5, 0x40, //0x8d70,0x24, 0xf2, 0xf5, 0x37, 0xe5, 0x3f, 0x34, 0x43, 0xf5, 0x36, 0xe5, 0x3e, 0x34, 0xa2, 0xf5, 0x35, //0x8d80,0xe5, 0x3d, 0x34, 0x28, 0xf5, 0x34, 0xe5, 0x37, 0xff, 0xe4, 0xfe, 0xfd, 0xfc, 0x78, 0x18, 0x12, //0x8d90,0x06, 0x69, 0x8f, 0x40, 0x8e, 0x3f, 0x8d, 0x3e, 0x8c, 0x3d, 0xe5, 0x37, 0x54, 0xa0, 0xff, 0xe5, //0x8da0,0x36, 0xfe, 0xe4, 0xfd, 0xfc, 0x78, 0x07, 0x12, 0x06, 0x56, 0x78, 0x10, 0x12, 0x0f, 0x9a, 0xe4, //0x8db0,0xff, 0xfe, 0xe5, 0x35, 0xfd, 0xe4, 0xfc, 0x78, 0x0e, 0x12, 0x06, 0x56, 0x12, 0x0f, 0x9d, 0xe4, //0x8dc0,0xff, 0xfe, 0xfd, 0xe5, 0x34, 0xfc, 0x78, 0x18, 0x12, 0x06, 0x56, 0x78, 0x08, 0x12, 0x0f, 0x9a, //0x8dd0,0x22, 0x8f, 0x3b, 0x8e, 0x3a, 0x8d, 0x39, 0x8c, 0x38, 0x22, 0x12, 0x06, 0x7c, 0x8f, 0x31, 0x8e, //0x8de0,0x30, 0x8d, 0x2f, 0x8c, 0x2e, 0x22, 0x93, 0xf9, 0xf8, 0x02, 0x06, 0x69, 0x00, 0x00, 0x00, 0x00, //0x8df0,0x12, 0x01, 0x17, 0x08, 0x31, 0x15, 0x53, 0x54, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x13, 0x01, //0x8e00,0x10, 0x01, 0x56, 0x40, 0x1a, 0x30, 0x29, 0x7e, 0x00, 0x30, 0x04, 0x20, 0xdf, 0x30, 0x05, 0x40, //0x8e10,0xbf, 0x50, 0x03, 0x00, 0xfd, 0x50, 0x27, 0x01, 0xfe, 0x60, 0x00, 0x11, 0x00, 0x3f, 0x05, 0x30, //0x8e20,0x00, 0x3f, 0x06, 0x22, 0x00, 0x3f, 0x01, 0x2a, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x36, 0x06, 0x07, //0x8e30,0x00, 0x3f, 0x0b, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x40, 0xbf, 0x30, 0x01, 0x00, //0x8e40,0xbf, 0x30, 0x29, 0x70, 0x00, 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, 0x36, 0x03, 0x36, //0x8e50,0x02, 0x41, 0x44, 0x58, 0x20, 0x18, 0x10, 0x0a, 0x04, 0x04, 0x00, 0x03, 0xff, 0x64, 0x00, 0x00, //0x8e60,0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x06, 0x00, 0x03, 0x51, 0x00, 0x7a, //0x8e70,0x50, 0x3c, 0x28, 0x1e, 0x10, 0x10, 0x50, 0x2d, 0x28, 0x16, 0x10, 0x10, 0x02, 0x00, 0x10, 0x0c, //0x8e80,0x10, 0x04, 0x0c, 0x6e, 0x06, 0x05, 0x00, 0xa5, 0x5a, 0x00, 0xae, 0x35, 0xaf, 0x36, 0xe4, 0xfd, //0x8e90,0xed, 0xc3, 0x95, 0x37, 0x50, 0x33, 0x12, 0x0f, 0xe2, 0xe4, 0x93, 0xf5, 0x38, 0x74, 0x01, 0x93, //0x8ea0,0xf5, 0x39, 0x45, 0x38, 0x60, 0x23, 0x85, 0x39, 0x82, 0x85, 0x38, 0x83, 0xe0, 0xfc, 0x12, 0x0f, //0x8eb0,0xe2, 0x74, 0x03, 0x93, 0x52, 0x04, 0x12, 0x0f, 0xe2, 0x74, 0x02, 0x93, 0x42, 0x04, 0x85, 0x39, //0x8ec0,0x82, 0x85, 0x38, 0x83, 0xec, 0xf0, 0x0d, 0x80, 0xc7, 0x22, 0x78, 0xbe, 0xe6, 0xd3, 0x08, 0xff, //0x8ed0,0xe6, 0x64, 0x80, 0xf8, 0xef, 0x64, 0x80, 0x98, 0x22, 0x93, 0xff, 0x7e, 0x00, 0xe6, 0xfc, 0x08, //0x8ee0,0xe6, 0xfd, 0x12, 0x04, 0xc1, 0x78, 0xc1, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0xd3, 0xef, 0x9d, 0xee, //0x8ef0,0x9c, 0x22, 0x78, 0xbd, 0xd3, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x22, 0x25, 0xe0, 0x24, 0x0a, 0xf8, //0x8f00,0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe5, 0x3c, 0xd3, 0x94, 0x00, 0x40, 0x0b, 0x90, 0x0e, 0x88, //0x8f10,0x12, 0x0b, 0xf1, 0x90, 0x0e, 0x86, 0x80, 0x09, 0x90, 0x0e, 0x82, 0x12, 0x0b, 0xf1, 0x90, 0x0e, //0x8f20,0x80, 0xe4, 0x93, 0xf5, 0x44, 0xa3, 0xe4, 0x93, 0xf5, 0x43, 0xd2, 0x06, 0x30, 0x06, 0x03, 0xd3, //0x8f30,0x80, 0x01, 0xc3, 0x92, 0x0e, 0x22, 0xa2, 0xaf, 0x92, 0x32, 0xc2, 0xaf, 0xe5, 0x23, 0x45, 0x22, //0x8f40,0x90, 0x0e, 0x5d, 0x60, 0x0e, 0x12, 0x0f, 0xcb, 0xe0, 0xf5, 0x2c, 0x12, 0x0f, 0xc8, 0xe0, 0xf5, //0x8f50,0x2d, 0x80, 0x0c, 0x12, 0x0f, 0xcb, 0xe5, 0x30, 0xf0, 0x12, 0x0f, 0xc8, 0xe5, 0x31, 0xf0, 0xa2, //0x8f60,0x32, 0x92, 0xaf, 0x22, 0xd2, 0x01, 0xc2, 0x02, 0xe4, 0xf5, 0x1f, 0xf5, 0x1e, 0xd2, 0x35, 0xd2, //0x8f70,0x33, 0xd2, 0x36, 0xd2, 0x01, 0xc2, 0x02, 0xf5, 0x1f, 0xf5, 0x1e, 0xd2, 0x35, 0xd2, 0x33, 0x22, //0x8f80,0xfb, 0xd3, 0xed, 0x9b, 0x74, 0x80, 0xf8, 0x6c, 0x98, 0x22, 0x12, 0x06, 0x69, 0xe5, 0x40, 0x2f, //0x8f90,0xf5, 0x40, 0xe5, 0x3f, 0x3e, 0xf5, 0x3f, 0xe5, 0x3e, 0x3d, 0xf5, 0x3e, 0xe5, 0x3d, 0x3c, 0xf5, //0x8fa0,0x3d, 0x22, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x3f, 0x0d, 0xe0, 0xf5, 0x33, 0xe5, 0x33, //0x8fb0,0xf0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0x90, 0x0e, 0x5f, 0xe4, 0x93, 0xfe, 0x74, 0x01, //0x8fc0,0x93, 0xf5, 0x82, 0x8e, 0x83, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0xcd, 0x02, //0x8fd0,0x0c, 0x98, 0x8f, 0x82, 0x8e, 0x83, 0x75, 0xf0, 0x04, 0xed, 0x02, 0x06, 0xa5, //0x8fe0
};static int ov5640_sensor_read(struct v4l2_subdev *sd, unsigned char *reg,unsigned char *value)
{struct i2c_client *client = v4l2_get_subdevdata(sd);u8 data[REG_STEP];struct i2c_msg msg;int ret,i;for(i = 0; i < REG_ADDR_STEP; i++)data[i] = reg[i];for(i = REG_ADDR_STEP; i < REG_STEP; i++)data[i] = 0xff;/** Send out the register address...*/msg.addr = client->addr;msg.flags = 0;msg.len = REG_ADDR_STEP;msg.buf = data;ret = i2c_transfer(client->adapter, &msg, 1);if (ret < 0) {csi_dev_err("Error %d on register write\n", ret);return ret;}/** ...then read back the result.*/msg.flags = I2C_M_RD;msg.len = REG_DATA_STEP;msg.buf = &data[REG_ADDR_STEP];ret = i2c_transfer(client->adapter, &msg, 1);if (ret >= 0) {for(i = 0; i < REG_DATA_STEP; i++)value[i] = data[i+REG_ADDR_STEP];ret = 0;}else {csi_dev_err("Error %d on register read\n", ret);}return ret;
}static int ov5640_sensor_write(struct v4l2_subdev *sd, unsigned char *reg,unsigned char *value)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct i2c_msg msg;unsigned char data[REG_STEP];int ret,i;for(i = 0; i < REG_ADDR_STEP; i++)data[i] = reg[i];for(i = REG_ADDR_STEP; i < REG_STEP; i++)data[i] = value[i-REG_ADDR_STEP];msg.addr = client->addr;msg.flags = 0;msg.len = REG_STEP;msg.buf = data;ret = i2c_transfer(client->adapter, &msg, 1);if (ret > 0) {ret = 0;}else if (ret < 0) {csi_dev_print("addr = 0x%4x, value = 0x%2x\n ",reg[0]*256+reg[1],value[0]);csi_dev_err("sensor_write error!\n");}return ret;
}#if 0
static int sensor_write_im(struct v4l2_subdev *sd, unsigned int addr,unsigned char value)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct i2c_msg msg;unsigned char data[REG_STEP];int ret;unsigned int retry=0;data[0] = (addr&0xff00)>>8;data[1] = addr&0x00ff;data[2] = value;msg.addr = client->addr;msg.flags = 0;msg.len = REG_STEP;msg.buf = data;sensor_write_im_transfer:ret = i2c_transfer(client->adapter, &msg, 1);if (ret > 0) {ret = 0;}else if (ret < 0) {if(retry<3) {retry++;csi_dev_err("sensor_write retry %d!\n",retry);goto sensor_write_im_transfer;}csi_dev_err("addr = 0x%4x, value = 0x%4x\n ",addr,value);csi_dev_err("sensor_write error!\n");}return ret;
}
#endifstatic int ov5640_sensor_write_array(struct v4l2_subdev *sd, struct regval_list *vals , uint size)
{int i,ret;unsigned int cnt;
//  unsigned char rd;if (size == 0)return -EINVAL;for(i = 0; i < size ; i++){if(vals->reg_num[0] == 0xff && vals->reg_num[1] == 0xff) {mdelay(vals->value[0]);}    else {cnt=0;ret = ov5640_sensor_write(sd, vals->reg_num, vals->value);while( ret < 0 && cnt < 3){if(ret<0)csi_dev_err("sensor_write_err!\n");ret = ov5640_sensor_write(sd, vals->reg_num, vals->value);cnt++;}if(cnt>0)csi_dev_err("csi i2c retry cnt=%d\n",cnt);if(ret<0 && cnt >=3)return ret;}vals++;}return 0;
}static int ov5640_sensor_write_continuous(struct v4l2_subdev *sd, int addr, char vals[] , uint size)
{int i,ret;struct regval_list reg_addr;if (size == 0)return -EINVAL;for(i = 0; i < size ; i++){reg_addr.reg_num[0] = (addr&0xff00)>>8;reg_addr.reg_num[1] = (addr&0x00ff);ret = ov5640_sensor_write(sd, reg_addr.reg_num, &vals[i]);if (ret < 0){csi_dev_err("sensor_write_err!\n");return ret;}addr++;}return 0;
}/* stuff about auto focus */
static int ov5640_sensor_download_af_fw(struct v4l2_subdev *sd)
{int ret,cnt;struct regval_list regs;struct regval_list af_fw_reset_reg[] = {{{0x30,0x00},{0x20}},};struct regval_list af_fw_start_reg[] = {{{0x30,0x22},{0x00}},{{0x30,0x23},{0x00}},{{0x30,0x24},{0x00}},{{0x30,0x25},{0x00}},{{0x30,0x26},{0x00}},{{0x30,0x27},{0x00}},{{0x30,0x28},{0x00}},{{0x30,0x29},{0x7f}},//0x7f{{0x30,0x00},{0x00}},   //start firmware for af};//reset sensor MCUret = ov5640_sensor_write_array(sd, af_fw_reset_reg, ARRAY_SIZE(af_fw_reset_reg));if(ret < 0) {csi_dev_err("reset sensor MCU error\n");return ret;}//download af fwret =ov5640_sensor_write_continuous(sd, 0x8000, ov5640_sensor_af_fw_regs, ARRAY_SIZE(ov5640_sensor_af_fw_regs));if(ret < 0) {csi_dev_err("download af fw error\n");return ret;}//start af firmwareret = ov5640_sensor_write_array(sd, af_fw_start_reg, ARRAY_SIZE(af_fw_start_reg));if(ret < 0) {csi_dev_err("start af firmware error\n");return ret;}mdelay(10);//check the af firmware statusregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x29;regs.value[0] = 0xff;cnt = 0;while(regs.value[0]!=0x70) {mdelay(5);ret = ov5640_sensor_read(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor check the af firmware status err !\n");return ret;}cnt++;if(cnt > 200) {csi_dev_err("AF firmware check status time out !\n");return -EFAULT;}}csi_dev_print("AF firmware check status complete,0x3029 = 0x%x\n",regs.value[0]);#if DEV_DBG_EN == 1   regs.reg_num[0] = 0x30;regs.reg_num[1] = 0x00;ov5640_sensor_read(sd, regs.reg_num, regs.value);csi_dev_print("0x3000 = 0x%x\n",regs.value[0]);regs.reg_num[0] = 0x30;regs.reg_num[1] = 0x04;ov5640_sensor_read(sd, regs.reg_num, regs.value);csi_dev_print("0x3004 = 0x%x\n",regs.value[0]);regs.reg_num[0] = 0x30;regs.reg_num[1] = 0x01;ov5640_sensor_read(sd, regs.reg_num, regs.value);csi_dev_print("0x3001 = 0x%x\n",regs.value[0]);regs.reg_num[0] = 0x30;regs.reg_num[1] = 0x05;ov5640_sensor_read(sd, regs.reg_num, regs.value);csi_dev_print("0x3005 = 0x%x\n",regs.value[0]);
#endifreturn 0;
}static int ov5640_sensor_s_release_af(struct v4l2_subdev *sd)
{struct regval_list regs;int ret;//release focuscsi_dev_print("sensor_s_release_af\n");//trig single afregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x22;regs.value[0] = 0x03; ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor tigger single af err !\n");return ret;}//release single afregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x22;regs.value[0] = 0x08; ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("release focus err !\n");return ret;}return 0;
}static int ov5640_sensor_s_af_zone(struct v4l2_subdev *sd, unsigned int xc, unsigned int yc)
{//struct sensor_info *info = to_state(sd);struct regval_list regs;int ret;csi_dev_print("sensor_s_af_zone\n");csi_dev_print("af zone input xc=%d,yc=%d\n",xc,yc);
#if 0   if(info->width == 0 || info->height == 0) {csi_dev_err("current width or height is zero!\n");return -EINVAL;}
#endif  xc = xc * 80 /640;yc = yc * 60 / 480;//csi_dev_dbg("af zone after xc=%d,yc=%d\n",xc,yc);//set x centerregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x24;regs.value[0] = xc;    ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor_s_af_zone_xc error!\n");return ret;}//set y centerregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x25;regs.value[0] = yc;   ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor_s_af_zone_yc error!\n");return ret;}//set af zoneregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x22;regs.value[0] = 0x81;  ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor_s_af_zone error!\n");return ret;}mdelay(5);return 0;
}static int ov5640_sensor_s_pause_af(struct v4l2_subdev *sd)
{struct regval_list regs;int ret;//pause af poisitioncsi_dev_print("sensor_s_pause_af\n");regs.reg_num[0] = 0x30;regs.reg_num[1] = 0x22;regs.value[0] = 0x06;  ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor pause af err !\n");return ret;}mdelay(5);return 0;
}static int ov5640_get_auto_focus_result(struct v4l2_subdev *sd,struct v4l2_control *ctrl)
{struct regval_list regs;int ret,cnt;regs.reg_num[0] = 0x30;regs.reg_num[1] = 0x23;regs.value[0] = 0xff;cnt = 0;//dg add  2015-07-13 0x3022 register:// 0x03 - Trig Single Auto Focus// 0x06 - Pause Auto Focus// 0x08 - Release Focus// 0x12 - Re-launch Focus Zones// 0x00 – command is finished//send idle command to firmwareOV5640YUV_write_cmos_sensor(0x3023,0x01);OV5640YUV_write_cmos_sensor(0x3022,0x06); //pause auto focus//wait for af pause completeregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x29;//dg change 0x23 to 0x29;regs.value[0] = 0xff;cnt = 0;while(regs.value[0]!=0x10)// dg change 0x00 to 0x10{mdelay(50);ret = ov5640_sensor_read(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor get af pause status err !\n");return ret;}cnt++;if(cnt>1000) {csi_dev_err("Single AF  pause is timeout,value = 0x%x\n",regs.value[0]);return -EFAULT;}}printk("pause focus  ok.....................");//ov5640_sensor_s_af_zone(sd, 640, 480);ctrl->value = AUTO_FOCUS_DONE;return 0;
}static int ov5640_sensor_s_single_af(struct v4l2_subdev *sd)
{struct regval_list regs;int ret;csi_dev_print("sensor_s_single_af\n");
#if 1//trig single afregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x23;regs.value[0] = 0x01; ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor tigger single af err !\n");return ret;}
#endifregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x22;regs.value[0] = 0x03;    ret = ov5640_sensor_write(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor tigger single af err !\n");return ret;}
#if 1//wait for af completeregs.reg_num[0] = 0x30;regs.reg_num[1] = 0x29;//dg change 0x23 to 0x29;regs.value[0] = 0xff;int cnt = 0;while(regs.value[0]!=0x10)// dg change 0x00 to 0x10){mdelay(50);ret = ov5640_sensor_read(sd, regs.reg_num, regs.value);if (ret < 0){csi_dev_err("sensor get af status err !\n");return ret;}cnt++;if(cnt>100) {csi_dev_err("Single AF is timeout,value = 0x%x\n",regs.value[0]);return -EFAULT;}}
#else;
#endifcsi_dev_print("Single AF is complete,value = 0x%x\n",regs.value[0]);return 0;
}
/* end add */static inline struct ov5640_priv *to_ov5640(const struct i2c_client *client)
{return container_of(i2c_get_clientdata(client), struct ov5640_priv, subdev);
}static int write_regs(struct i2c_client *client, const struct regval *regs, int array_len)
{int i;int ret = 0;for (i = 0; i < array_len; i++) {if ((ret = i2cc_set_reg(client, regs->reg, regs->val))) {OV_ERR("error to set reg:0x%d -> value:%d(index:%d)\n", regs->reg, regs->val, i);break;}regs++;}//    INFO_BLUE("------*------- write array regs over -------*------ \n");return (ret);
}static int ov5640_set_bus_param(struct soc_camera_device *icd, unsigned long flags)
{INFO_PURLPLE("\n");return 0;
}static unsigned long ov5640_query_bus_param(struct soc_camera_device *icd)
{struct soc_camera_link *icl = to_soc_camera_link(icd);/* camera can do 10 bit transfers,  but omit it now */unsigned long flags = SOCAM_PCLK_SAMPLE_RISING | SOCAM_MASTER |SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_HSYNC_ACTIVE_HIGH |SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8;return soc_camera_apply_sensor_flags(icl, flags);
}static int ov5640_g_chip_ident(struct v4l2_subdev *sd,struct v4l2_dbg_chip_ident *id)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct ov5640_priv *priv = to_ov5640(client);id->ident = priv->model;id->revision = 0;return (0);
}static const struct ov5640_win_size *select_win(unsigned int width, unsigned int height)
{const struct ov5640_win_size *ret = NULL;int size = ARRAY_SIZE(ov5640_wins);unsigned int diff = -1;unsigned int tmp;int i;//width = 1600;//height = 1200;for (i = 0; i < size; i++) {tmp = abs(width - ov5640_wins[i].width) + abs(height - ov5640_wins[i].height);if (tmp < diff) {diff = tmp;ret = ov5640_wins + i;}}return (ret);
}static int ov5640_try_fmt(struct v4l2_subdev *sd,struct v4l2_mbus_framefmt *vmf)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct ov5640_priv *priv = to_ov5640(client);const struct ov5640_win_size *win;int found = 0;int i;win = select_win(vmf->width, vmf->height);vmf->width = win->width;vmf->height = win->height;vmf->field = V4L2_FIELD_NONE;for (i = 0; i < ARRAY_SIZE(ov5640_cfmts); i++) {if (ov5640_cfmts[i].code == vmf->code) {found = 1;break;}}if (found) {vmf->colorspace = ov5640_cfmts[i].colorspace;} else {/* Unsupported format requested. Propose either */if (priv->cfmt) {/* the current one or */vmf->colorspace = priv->cfmt->colorspace;vmf->code = priv->cfmt->code;} else {/* the default one */vmf->colorspace = ov5640_cfmts[0].colorspace;vmf->code = ov5640_cfmts[0].code;}}INFO_GREEN("code:%d-%s %dX%d\n", vmf->code, win->name, vmf->width, vmf->height);return (0);
}/* start or stop streaming from the device */
static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct ov5640_priv *priv = to_ov5640(client);if (!enable) {INFO_PURLPLE("stream down\n");// set regs to enter sleep mode, already in DVP mode//   i2cc_set_reg(client, 0x3008, 0x42); //dg cancel 2015-07-18,  ov5640 power down,beacuse it cause some command not running.return (0);}
#if 0if (NULL == priv->win || NULL == priv->cfmt) {OV_ERR("win or cfmt select error!\n");return (-EPERM);}
#endifINFO_PURLPLE("stream on\n");//set regs to leave sleep mode, in DVP mode , needn't to set 0x300e to 0xc//  i2cc_set_reg(client, 0x3008, 0x02);  //dg cancel 2015-07-18,//dg cancel 2015-07-18,  ov5640 power down,beacuse it cause some command not running.#if 0INFO_GREEN("format: %d, win:%s\n", priv->cfmt->code, priv->win->name);// wait for 2 Vsync, and capture the 3rd frame, (1 / 7.5) * 2 =. 267msmdelay(270);if(0 == down_af_firmware_flag){ov5640_sensor_download_af_fw(sd);down_af_firmware_flag = 1;}#endifOV5640YUVPreview();// OV5640YUVCapture();//ov5640_sensor_s_single_af(sd);//dg add 2015-07-15//OV5640_FOCUS_AD5820_Single_Focus();//    OV5640_FOCUS_AD5820_Constant_Focus();return (0);
}static int reset_ov5640(struct i2c_client *client)
{int ret = i2cc_set_reg(client, 0x3008, 0x82);mdelay(5);return (ret);
}#if 0  //remove by cym 20130807
static int ov5640_get_params(struct i2c_client *client, unsigned int *width, unsigned int *height, enum v4l2_mbus_pixelcode code)
{struct ov5640_priv *priv = to_ov5640(client);int ret = -EINVAL;int i;/* select format */priv->cfmt = NULL;for (i = 0; i < ARRAY_SIZE(ov5640_cfmts); i++) {if (code == ov5640_cfmts[i].code) {priv->cfmt = ov5640_cfmts + i;break;}}if (NULL == priv->cfmt) {return (ret);}priv->win = select_win(*width, *height);*width = priv->win->width;*height = priv->win->height;INFO_PURLPLE("current params: %s %dX%d\n", priv->win->name, *width, *height);return (0);
}
#endifstatic inline void init_setting_values(struct ov5640_priv *priv)
{priv->flip_flag = OV5640_HFLIP;
}#if 1  //remove by cym 20130807
static void get_preview_params(struct i2c_client *client, unsigned int *exposure, unsigned short *maxlines, unsigned short *gain)
{unsigned char ret_h = 0;unsigned char ret_m = 0;unsigned char ret_l = 0;i2cc_get_reg(client, 0x3500, &ret_h);i2cc_get_reg(client, 0x3501, &ret_m);i2cc_get_reg(client, 0x3502, &ret_l);*exposure = ((ret_h << 16) + (ret_m << 8) + ret_l) >> 4;INFO_GREEN("expl:0x%x, expm:0x%x, exph:0x%x\n", ret_l, ret_m, ret_h);i2cc_get_reg(client, 0x350c, &ret_h);i2cc_get_reg(client, 0x350d, &ret_l);*maxlines = (ret_h << 8) + ret_l;//i2cc_get_reg(client, 0x350a, &ret_h);i2cc_get_reg(client, 0x350b, &ret_l);*gain = /*((ret_h & 0x1) << 8) + */ret_l;INFO_GREEN("exposure:0x%x, maxlines:0x%x, gain:0x%x\n",*exposure, *maxlines, *gain);
}
#endif#if 1  //remove by cym 20130807
static void manual_set_exposure_and_gain(struct i2c_client *client,unsigned int p_exposure, unsigned short p_maxlines, unsigned short p_gain)
{unsigned char ret_h = 0;unsigned char ret_l = 0;unsigned char exp_h;unsigned char exp_m;unsigned char exp_l;unsigned char lines_10ms;unsigned short cap_maxlines;unsigned short cap_exposure;unsigned short cap_gain;
//    unsigned short gain;unsigned int   cap_exp_gain;i2cc_get_reg(client, 0x350c, &ret_h);i2cc_get_reg(client, 0x350d, &ret_l);cap_maxlines = (ret_h << 8) + ret_l;//p_maxlines = 980;//cap_maxlines = 1964;INFO_GREEN("cap_maxlines: 0x%x\n", cap_maxlines);// for 50HZ, if 60HZ, devided by 12000lines_10ms = CAPTURE_FRAME_RATE * cap_maxlines / 10000 * 13 / 12;if (0 == p_maxlines) {p_maxlines = 1;}cap_exposure = ((p_exposure * CAPTURE_FRAME_RATE * cap_maxlines) / (p_maxlines * PREVIEW_FRAME_RATE)) * 6 / 5;//cap_exp_gain = 1126 * cap_exposure * cap_gain;cap_exp_gain = cap_exposure * p_gain;  // in night mode, need multiply 2 again.//cap_exp_gain >>= 9;if (cap_exp_gain < (long)cap_maxlines * 16) {cap_exposure = cap_exp_gain / 16;if (cap_exposure > lines_10ms) {cap_exposure /= lines_10ms;cap_exposure *= lines_10ms;}} else {cap_exposure = cap_maxlines;}if (0 == cap_exposure) {cap_exposure = 1;}cap_gain = ((cap_exp_gain << 1) / cap_exposure + 1) >> 1;exp_l = (cap_exposure << 4) & 0xFF;exp_m = (cap_exposure >> 4) & 0xFF;exp_h = (cap_exposure >> 12) & 0xFF;INFO_GREEN("gain:0x%x, expl:0x%x, expm:0x%x, exph:0x%x, cap_maxlines:0x%x\n", cap_gain, exp_l, exp_m, exp_h, cap_maxlines);i2cc_set_reg(client, 0x350b, cap_gain);i2cc_set_reg(client, 0x3502, exp_l);i2cc_set_reg(client, 0x3501, exp_m);i2cc_set_reg(client, 0x3500, exp_h);/** add delay-time, to avoid boundary problem between dark and bright*/mdelay(100);
}
#endifstatic int ov5640_set_params(struct i2c_client *client, unsigned int *width, unsigned int *height, enum v4l2_mbus_pixelcode code)
{struct ov5640_priv *priv = to_ov5640(client);int ret = -EINVAL;int i;const struct regval *reg_list = NULL;int list_len = 0;printk("%s(%d): code = %d\n", __FUNCTION__, __LINE__, code);printk("%s(%d): width = %d, height = %d\n", __FUNCTION__, __LINE__, *width, *height);/* select format */priv->cfmt = NULL;for (i = 0; i < ARRAY_SIZE(ov5640_cfmts); i++) {if (code == ov5640_cfmts[i].code) {priv->cfmt = ov5640_cfmts + i;break;}}if (NULL == priv->cfmt) {printk("%s(%d)\n", __FUNCTION__, __LINE__);return (ret);}/* select win size, now only one, so select directly */priv->win = select_win(*width, *height);/* set hardware regs needed */if (RESV_VGA == priv->win->resv) {reset_ov5640(client);/* set default regs */write_regs(client, ov5640_init_regs, ARRAY_SIZE(ov5640_init_regs));init_setting_values(priv);}switch (priv->win->resv) {case RESV_XGA: {reg_list = ov5640_qsxga_to_xga_regs;list_len = ARRAY_SIZE(ov5640_qsxga_to_xga_regs);break;}case RESV_SXGA: {reg_list = ov5640_qsxga_to_sxga_regs;list_len = ARRAY_SIZE(ov5640_qsxga_to_sxga_regs);break;}case RESV_UXGA: {reg_list = ov5640_qsxga_to_uxga_regs;list_len = ARRAY_SIZE(ov5640_qsxga_to_uxga_regs);break;}case RESV_QXGA: {reg_list = ov5640_qsxga_to_qxga_regs;list_len = ARRAY_SIZE(ov5640_qsxga_to_qxga_regs);break;}case RESV_QSXGA:default:break;}
#if 0   //remove by cym 20130807if (RESV_VGA != priv->win->resv) {unsigned int preview_exp;unsigned short preview_maxl;unsigned short preview_gain;/* manually set exposure and gain */// i2cc_set_reg(client, 0x3503, 0x07);get_preview_params(client, &preview_exp, &preview_maxl, &preview_gain);write_regs(client, ov5640_qsxga_regs, ARRAY_SIZE(ov5640_qsxga_regs));write_regs(client, ov5640_qsxga_to_uxga_regs, ARRAY_SIZE(ov5640_qsxga_to_uxga_regs));if (NULL != reg_list) {;//write_regs(client, reg_list, list_len);}//manual_set_exposure_and_gain(client, preview_exp, preview_maxl, preview_gain);}
#endif*width = priv->win->width;*height = priv->win->height;INFO_PURLPLE("ok, params are width:%d-height:%d\n", *width, *height);return (0);
}static int ov5640_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *vmf)
{struct i2c_client *client = v4l2_get_subdevdata(sd);
//    struct ov5640_priv *priv = to_ov5640(client);struct soc_camera_device *icd = client->dev.platform_data;#if 0if (NULL == priv->win || NULL == priv->cfmt) {unsigned int width = VGA_WIDTH;unsigned int height = VGA_HEIGHT;int ret = 0;ret = ov5640_get_params(client, &width, &height, 2);//cym V4L2_MBUS_FMT_YUYV8_2X8_BE);if (ret < 0) {return (ret);}}vmf->width = priv->win->width;vmf->height = priv->win->height;vmf->code = priv->cfmt->code;vmf->colorspace = priv->cfmt->colorspace;vmf->field = V4L2_FIELD_NONE;
#else//printk("%s(%d)\n", __FUNCTION__, __LINE__);vmf->width   = icd->user_width;//printk("%s(%d)\n", __FUNCTION__, __LINE__);vmf->height = icd->user_height;//printk("%s(%d)\n", __FUNCTION__, __LINE__);vmf->code  = 2;//priv->cfmt->code;//printk("%s(%d)\n", __FUNCTION__, __LINE__);vmf->colorspace = V4L2_COLORSPACE_JPEG;//priv->cfmt->colorspace;vmf->field    = V4L2_FIELD_NONE;
#endifINFO_GREEN("ok, get fmt w:%dXh:%d-code:%d-csp:%d\n", vmf->width, vmf->height, vmf->code, vmf->colorspace);return (0);
}static int ov5640_s_fmt(struct v4l2_subdev *sd,struct v4l2_mbus_framefmt *vmf)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct ov5640_priv *priv = to_ov5640(client);//ov5640_g_fmt(sd, vmf);//printk("*********** %s, line = %d(code = 0x%x, w:%d, h:%d)\n", __FUNCTION__, __LINE__, //                     vmf->code, vmf->width, vmf->height);#if 0int ret = ov5640_set_params(client, &vmf->width, &vmf->height, vmf->code);printk("%s(%d): rest = %d\n", __FUNCTION__, __LINE__, ret);if (!ret)vmf->colorspace = priv->cfmt->colorspace;return (ret);#endifreturn 1;//INFO_PURLPLE("\n");}//  TODO..... modify
static int ov5640_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *vcc)
{vcc->bounds.left = OV5640_COLUMN_SKIP;vcc->bounds.top  = OV5640_ROW_SKIP;vcc->bounds.width  = OV5640_MAX_WIDTH;vcc->bounds.height = OV5640_MAX_HEIGHT;vcc->defrect = vcc->bounds;  /* set default rect. */vcc->type    = V4L2_BUF_TYPE_VIDEO_CAPTURE;vcc->pixelaspect.numerator   = 1;vcc->pixelaspect.denominator = 1;INFO_PURLPLE("\n");return (0);
}//  TODO..... modify
static int ov5640_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *vc)
{vc->c.left  = 0;vc->c.top   = 0;vc->c.width = QSXGA_WIDTH;vc->c.height  = QSXGA_HEIGHT;vc->type     = V4L2_BUF_TYPE_VIDEO_CAPTURE;INFO_BLUE("\n");return (0);
}static int ov5640_enum_fmt(struct v4l2_subdev *sd, unsigned int index,enum v4l2_mbus_pixelcode *code)
{if (index >= ARRAY_SIZE(ov5640_cfmts))return -EINVAL;*code = ov5640_cfmts[index].code;OV_INFO("fmt index:%d\n", index);return 0;
}static int ov5640_enum_framesizes(struct v4l2_subdev *sd,struct v4l2_frmsizeenum *fsize)
{//struct s5k4ecgx_state *state =//    container_of(sd, struct s5k4ecgx_state, sd);//struct i2c_client *client = v4l2_get_subdevdata(sd);//struct ov5640_priv *priv = to_ov5640(client);//printk("********************** %s(%d) **************************\n", __FUNCTION__, __LINE__);fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;fsize->discrete.width = 640;//state->pix.width;fsize->discrete.height = 480;//state->pix.height;return 0;
}static int ov5640_set_brightness(struct i2c_client *client, int bright)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char reg5587, reg5588;if (bright < -4 || 4 < bright) {OV_ERR("brightness - %d is out of range[-4, 4]\n", bright);return (-ERANGE);}if (bright < 0) {reg5587 = 0x10 * (-bright);reg5588 = 0x09; /* bit[3] is Y bright sign */} else {reg5587 = 0x10 * bright;reg5588 = 0x01;}i2cc_set_reg(client, 0x5001, 0xff);i2cc_set_reg(client, 0x5587, reg5587);i2cc_set_reg(client, 0x5580, 0x04);i2cc_set_reg(client, 0x5588, reg5588);priv->brightness = bright;OV_INFO("brightness:%d, reg5587:0x%x, reg5588:0x%x\n", bright, reg5587, reg5588);return (0);
}static int ov5640_set_contrast(struct i2c_client *client, int contrast)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char y_gain, reg5588;if (contrast < -4 || 4 < contrast) {OV_ERR("contrast - %d is out of range[-4, 4]\n", contrast);return (-ERANGE);}if (0 == contrast) {reg5588 = 0x1;} else {reg5588 = 0x41;}y_gain = 0x20 + 0x4 * contrast;i2cc_set_reg(client, 0x5001, 0xff);i2cc_set_reg(client, 0x5580, 0x04);i2cc_set_reg(client, 0x5586, y_gain);i2cc_set_reg(client, 0x5585, y_gain);i2cc_set_reg(client, 0x5588, reg5588);priv->contrast = contrast;OV_INFO("contrast:%d, y_gain:0x%x, reg5588:0x%x\n", contrast, y_gain, reg5588);return (0);
}/* auto, manual seperated is ok?? */
static int ov5640_set_saturation(struct i2c_client *client, int saturation)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char uv_max, uv_min, reg5588;if (saturation < -4 || 4 < saturation) {OV_ERR("saturation - %d is out of range[-4, 4]\n", saturation);return (-ERANGE);}if (0 == saturation) {  /* different from application notes */uv_max = 0x40;   /* max value for UV adjust */uv_min = 0x10;   /* min value for UV adjust */reg5588 = 0x01;  /* bit[6]==0, auto saturation */} else {uv_max = 0x40 + 0x10 * saturation; /* U sat. */uv_min = uv_max; /* v sat */reg5588 = 0x41;  /* bit[6]==1, manual saturation */}i2cc_set_reg(client, 0x5001, 0xff);  /* init is 0xa3 */i2cc_set_reg(client, 0x5583, uv_max);i2cc_set_reg(client, 0x5584, uv_min);i2cc_set_reg(client, 0x5580, 0x02);  /* bit[1], enable(1)/disabe(0) saturation */i2cc_set_reg(client, 0x5588, reg5588); priv->saturation = saturation;OV_INFO("saturation:%d\n", saturation);return (0);
}/* XXX:effect is reversed to note's picture exept -180. check it */
static int ov5640_set_hue(struct i2c_client *client, int hue)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char reg5581, reg5582, reg5588;switch (hue) {case -180:reg5581 = 0x80;reg5582 = 0x00;reg5588 = 0x32;break;case -150:reg5581 = 0x6f;reg5582 = 0x40;reg5588 = 0x32;break;case -120:reg5581 = 0x40;reg5582 = 0x6f;reg5588 = 0x32;break;case -90:reg5581 = 0x00;reg5582 = 0x80;reg5588 = 0x02;break;case -60:reg5581 = 0x40;reg5582 = 0x6f;reg5588 = 0x02;break;case -30:reg5581 = 0x6f;reg5582 = 0x40;reg5588 = 0x02;break;case 0:reg5581 = 0x80;reg5582 = 0x00;reg5588 = 0x01;break;case 30:reg5581 = 0x6f;reg5582 = 0x40;reg5588 = 0x01;break;case 60:reg5581 = 0x40;reg5582 = 0x6f;reg5588 = 0x01;break;case 90:reg5581 = 0x00;reg5582 = 0x80;reg5588 = 0x31;break;case 120:reg5581 = 0x40;reg5582 = 0x6f;reg5588 = 0x31;break;case 150:reg5581 = 0x6f;reg5582 = 0x40;reg5588 = 0x31;break;default:OV_ERR("hue - %d is out of range[-180, 150]/step-30\n", hue);return (-ERANGE);}i2cc_set_reg(client, 0x5001, 0xff);i2cc_set_reg(client, 0x5580, 0x01);  /* XXXX:diff. from defualt value */i2cc_set_reg(client, 0x5581, reg5581);  /* hue cos coefficient */i2cc_set_reg(client, 0x5582, reg5582);  /* hue sin coefficient */i2cc_set_reg(client, 0x5588, reg5588);priv->hue = hue;OV_INFO("hue: %d, 5581:0x%x, 5582:0x%x, 5588:0x%x\n", hue, reg5581, reg5582, reg5588);return (0);
}/* default value here is different from init one. */
static int ov5640_set_exposure_level(struct i2c_client *client, int level)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char reg3a0f, reg3a10;unsigned char reg3a1b, reg3a1e;unsigned char reg3a11, reg3a1f;reg3a0f = 0x38 + 0x8 * level;reg3a10 = 0x30 + 0x8 * level;reg3a1b = reg3a0f;reg3a1e = reg3a10;reg3a1f = 0x10;switch (level) {case -5:  /* -1.7EV */reg3a11 = 0x20;break;case -4:  /* -1.3EV */reg3a11 = 0x30;break;case -3:  /* -1.0EV */reg3a11 = 0x41;break;case -2:  /* -0.7EV */reg3a11 = 0x51;break;case -1:  /* -0.3EV */reg3a11 = 0x61;break;case 0:  /* 0EV, default */reg3a11 = 0x61;break;case 1:  /* 0.3EV */reg3a11 = 0x71;break;case 2:  /* 0.7EV */reg3a11 = 0x80;reg3a1f = 0x20;break;case 3:  /* 1.0EV */reg3a11 = 0x90;reg3a1f = 0x20;break;case 4:  /* 1.3EV */reg3a11 = 0x91;reg3a1f = 0x20;break;case 5:  /* 1.7EV */reg3a11 = 0xa0;reg3a1f = 0x20;break;default:OV_ERR("exposure - %d is out of range[-5, 5]\n", level);return (-ERANGE);}OV_INFO("exposure: %d, 0x3a0f:0x%x, 0x3a10:0x%x\n", level, reg3a0f, reg3a10);//OV_INFO("0x3a1b:0x%x, 0x3a1e:0x%x\n", reg3a1b, reg3a1e);OV_INFO("0x3a11:0x%x, 0x3a1f:0x%x\n\n", reg3a11, reg3a1f);i2cc_set_reg(client, 0x3a0f, reg3a0f);  /* stable range high limit(enter) */i2cc_set_reg(client, 0x3a10, reg3a10);  /* stable range low limit(enter) */i2cc_set_reg(client, 0x3a11, reg3a11);  /* fast zone high limit */i2cc_set_reg(client, 0x3a1b, reg3a1b);  /* stable range high limit(go out) */i2cc_set_reg(client, 0x3a1e, reg3a1e);  /* stable range low limit(go out) */i2cc_set_reg(client, 0x3a1f, reg3a1f);  /* fast zone low limit */priv->exposure = level;return (0);
}#define OV5640_FLIP_VAL  ((unsigned char)0x06)
#define OV5640_FLIP_MASK (~(OV5640_FLIP_VAL))
static int ov5640_set_flip(struct i2c_client *client, struct v4l2_control *ctrl)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char reg3820, reg3821;OV_INFO("old flag: %d\n", priv->flip_flag);switch (ctrl->id) {case V4L2_CID_HFLIP:if (ctrl->value) {priv->flip_flag |= OV5640_HFLIP;} else {priv->flip_flag &= ~OV5640_HFLIP;}break;case V4L2_CID_VFLIP:if (ctrl->value) {priv->flip_flag |= OV5640_VFLIP;} else {priv->flip_flag &= ~OV5640_VFLIP;}break;default:OV_ERR("set flip out of range\n");return (-ERANGE);}OV_INFO("new flag: %d\n", priv->flip_flag);i2cc_get_reg(client, 0x3820, &reg3820);i2cc_get_reg(client, 0x3821, &reg3821);if (priv->flip_flag & OV5640_VFLIP) {reg3820 |= OV5640_FLIP_VAL;} else {reg3820 &= OV5640_FLIP_MASK;}if (priv->flip_flag & OV5640_HFLIP) {reg3821 |= OV5640_FLIP_VAL;} else {reg3821 &= OV5640_FLIP_MASK;}/* have a bug which flip a half picture only. *///i2cc_set_reg(client, 0x3212, 0x00);   /* enable group0, when add no flip */i2cc_set_reg(client, 0x3820, reg3820); i2cc_set_reg(client, 0x3821, reg3821);//i2cc_set_reg(client, 0x3212, 0x10);   /* end group0 *///i2cc_set_reg(client, 0x3212, 0xa1);   /* launch group1 */OV_INFO("0x3820:0x%x, 0x3821:0x%x\n", reg3820, reg3821);return (0);
}static int ov5640_set_sharpness(struct i2c_client *client, int sharp)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char reg5302;switch (sharp) {case -1:  /*auto sharpness*/break;case 0:   /* sharpness off */reg5302 = 0x00;break;case 1:reg5302 = 0x02;break;case 2:reg5302 = 0x04;break;case 3:reg5302 = 0x08;break;case 4:reg5302 = 0x0c;break;case 5:reg5302 = 0x10;break;case 6:reg5302 = 0x14;break;case 7:reg5302 = 0x18;break;case 8:reg5302 = 0x20;break;default:OV_ERR("set sharpness is out of range - %d[-1,8]\n", sharp);return (-ERANGE);}if (0 <= sharp) {i2cc_set_reg(client, 0x5308, 0x65);i2cc_set_reg(client, 0x5302, reg5302);OV_INFO("sharp:%d, 5302:0x%x\n", sharp, reg5302);} else {const struct regval ov5640_auto_sharpness[] = {{0x5308, 0x25},{0x5300, 0x08},{0x5301, 0x30},{0x5302, 0x10},{0x5303, 0x00},{0x5309, 0x08},{0x530a, 0x30},{0x530b, 0x04},{0x530c, 0x06},};int len = ARRAY_SIZE(ov5640_auto_sharpness);write_regs(client, ov5640_auto_sharpness, len);OV_INFO("sharp:%d, len:%d\n", sharp, len);}priv->sharpness = sharp;return (0);
}static int ov5640_set_colorfx(struct i2c_client *client, int effect)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char reg5583, reg5584, reg5001, reg5580;reg5001 = 0xff;reg5580 = 0x18;switch (effect) {case 0: /* normal */reg5001 = 0x7f;reg5580 = 0x00;break;case 1: /* black and white */reg5583 = 0x80;reg5584 = 0x80;break;case 2: /* sepia , antique */reg5583 = 0x40;reg5584 = 0xa0;break;case 3: /* negative */reg5001 = 0xff;reg5580 = 0x40;break;case 4: /* bluish */reg5583 = 0xa0;reg5584 = 0x40;break;case 5: /* greenish */reg5583 = 0x60;reg5584 = 0x60;break;case 6: /* reddish */reg5583 = 0x80;reg5584 = 0xc0;break;default:OV_ERR("set color effects out of range - %d[0,6]\n", effect);return (-ERANGE);}i2cc_set_reg(client, 0x5001, reg5001);i2cc_set_reg(client, 0x5580, reg5580);OV_INFO("effect:%d, 0x5001:0x%x, 0x5580:0x%x\n", effect, reg5001, reg5580);if (0 != effect && 3 != effect) {i2cc_set_reg(client, 0x5583, reg5583);i2cc_set_reg(client, 0x5584, reg5584); OV_INFO("0x5583:0x%x, 0x5584:0x%x\n", reg5583, reg5584);}priv->colorfx = effect;return (0);}/* Must be sorted from low to high control ID! */
static const u32 ov5640_user_ctrls[] = {V4L2_CID_USER_CLASS,V4L2_CID_BRIGHTNESS,V4L2_CID_CONTRAST,V4L2_CID_SATURATION,V4L2_CID_HUE,
//  V4L2_CID_BLACK_LEVEL,V4L2_CID_AUTO_WHITE_BALANCE,
//  V4L2_CID_DO_WHITE_BALANCE,
//  V4L2_CID_RED_BALANCE,
//  V4L2_CID_BLUE_BALANCE,
//  V4L2_CID_GAMMA,V4L2_CID_EXPOSURE,V4L2_CID_AUTOGAIN,V4L2_CID_GAIN,V4L2_CID_HFLIP,V4L2_CID_VFLIP,V4L2_CID_POWER_LINE_FREQUENCY,
//  V4L2_CID_HUE_AUTO,V4L2_CID_WHITE_BALANCE_TEMPERATURE,V4L2_CID_SHARPNESS,
//  V4L2_CID_BACKLIGHT_COMPENSATION,
//  V4L2_CID_CHROMA_AGC,
//  V4L2_CID_CHROMA_GAIN,
//  V4L2_CID_COLOR_KILLER,V4L2_CID_COLORFX,
//  V4L2_CID_AUTOBRIGHTNESS,V4L2_CID_BAND_STOP_FILTER,
//  V4L2_CID_ROTATE,
//  V4L2_CID_BG_COLOR,0,
};static const u32 ov5640_camera_ctrls[] = {V4L2_CID_CAMERA_CLASS,V4L2_CID_EXPOSURE_AUTO,
//  V4L2_CID_EXPOSURE_ABSOLUTE,
//  V4L2_CID_EXPOSURE_AUTO_PRIORITY,
//  V4L2_CID_PAN_RELATIVE,
//  V4L2_CID_TILT_RELATIVE,
//  V4L2_CID_PAN_RESET,
//  V4L2_CID_TILT_RESET,
//  V4L2_CID_PAN_ABSOLUTE,
//  V4L2_CID_TILT_ABSOLUTE,
//  V4L2_CID_FOCUS_ABSOLUTE,
//  V4L2_CID_FOCUS_RELATIVE,
//  V4L2_CID_FOCUS_AUTO,
//  V4L2_CID_ZOOM_ABSOLUTE,
//  V4L2_CID_ZOOM_RELATIVE,
//  V4L2_CID_ZOOM_CONTINUOUS,
//  V4L2_CID_IRIS_ABSOLUTE,
//  V4L2_CID_IRIS_RELATIVE,
//  V4L2_CID_PRIVACY,
//cym   V4L2_CID_SCENE_EXPOSURE,0,
};static const u32 *ov5640_ctrl_classes[] = {ov5640_user_ctrls,ov5640_camera_ctrls,NULL,
};static int ov5640_queryctrl(struct v4l2_subdev *sd,struct v4l2_queryctrl *qc)
{//struct i2c_client *client = v4l2_get_subdevdata(sd);qc->id = v4l2_ctrl_next(ov5640_ctrl_classes, qc->id);if (qc->id == 0) {return (-EINVAL);}OV_INFO("%s: id-%s\n", __func__, v4l2_ctrl_get_name(qc->id));/* Fill in min, max, step and default value for these controls. */switch (qc->id) {/* Standard V4L2 controls */case V4L2_CID_USER_CLASS:return v4l2_ctrl_query_fill(qc, 0, 0, 0, 0);case V4L2_CID_BRIGHTNESS:return v4l2_ctrl_query_fill(qc, -4, 4, 1, 0);case V4L2_CID_CONTRAST:return v4l2_ctrl_query_fill(qc, -4, 4, 1, 0);case V4L2_CID_SATURATION:return v4l2_ctrl_query_fill(qc, -4, 4, 1, 0);case V4L2_CID_HUE:return v4l2_ctrl_query_fill(qc, -180, 150, 30, 0);
#if 0// case V4L2_CID_BLACK_LEVEL:case V4L2_CID_AUTO_WHITE_BALANCE:return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);//   case V4L2_CID_DO_WHITE_BALANCE:
//  case V4L2_CID_RED_BALANCE:
//  case V4L2_CID_BLUE_BALANCE:
//  case V4L2_CID_GAMMA:
#endifcase V4L2_CID_EXPOSURE:return v4l2_ctrl_query_fill(qc, -5, 5, 1, 0);
#if 0case V4L2_CID_AUTOGAIN:return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);case V4L2_CID_GAIN:return v4l2_ctrl_query_fill(qc, 0, 0xFFU, 1, 128);
#endifcase V4L2_CID_HFLIP:case V4L2_CID_VFLIP:return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
#if 0case V4L2_CID_POWER_LINE_FREQUENCY:return v4l2_ctrl_query_fill(qc, 0, 2, 1, 1);
//  case V4L2_CID_HUE_AUTO:case V4L2_CID_WHITE_BALANCE_TEMPERATURE:return v4l2_ctrl_query_fill(qc, 0, 3, 1, 0);
#endifcase V4L2_CID_SHARPNESS:return v4l2_ctrl_query_fill(qc, -1, 8, 1, -1);
//  case V4L2_CID_BACKLIGHT_COMPENSATION:
//  case V4L2_CID_CHROMA_AGC:
//  case V4L2_CID_CHROMA_GAIN:
//  case V4L2_CID_COLOR_KILLER:case V4L2_CID_COLORFX:return v4l2_ctrl_query_fill(qc, 0, 6, 1, 0);
//  case V4L2_CID_AUTOBRIGHTNESS:
#if 0case V4L2_CID_BAND_STOP_FILTER:return v4l2_ctrl_query_fill(qc, 0, 63, 1, 2);// case V4L2_CID_ROTATE:
//  case V4L2_CID_BG_COLOR:
#endifcase V4L2_CID_CAMERA_CLASS:return v4l2_ctrl_query_fill(qc, 0, 0, 0, 0);
#if 0case V4L2_CID_EXPOSURE_AUTO:return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);// case V4L2_CID_EXPOSURE_ABSOLUTE:
//  case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
//  case V4L2_CID_PAN_RELATIVE:
//  case V4L2_CID_TILT_RELATIVE:
//  case V4L2_CID_PAN_RESET:
//  case V4L2_CID_TILT_RESET:
//  case V4L2_CID_PAN_ABSOLUTE:
//  case V4L2_CID_TILT_ABSOLUTE:
//  case V4L2_CID_FOCUS_ABSOLUTE:
//  case V4L2_CID_FOCUS_RELATIVE:
//  case V4L2_CID_FOCUS_AUTO:
//  case V4L2_CID_ZOOM_ABSOLUTE:
//  case V4L2_CID_ZOOM_RELATIVE:
//  case V4L2_CID_ZOOM_CONTINUOUS:
//  case V4L2_CID_IRIS_ABSOLUTE:
//  case V4L2_CID_IRIS_RELATIVE:
//  case V4L2_CID_PRIVACY:case V4L2_CID_SCENE_EXPOSURE:return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
#endifdefault:OV_ERR("invalid control ctrl: %s\n", v4l2_ctrl_get_name(qc->id));qc->flags |= V4L2_CTRL_FLAG_DISABLED;return (-EINVAL);}return (0);
}static int ov5640_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{struct i2c_client *client = v4l2_get_subdevdata(sd);//struct ov5640_priv *priv = to_ov5640(client);int ret = 0;//int val = 0;/* add by cym 20130812 */int err = 0;//int value = ctrl->value;/* end add */OV_INFO("%s: control ctrl- %s\n", __func__, v4l2_ctrl_get_name(ctrl->id));printk("%s: control ctrl- id = %d\n", __func__, ctrl->id-V4L2_CID_PRIVATE_BASE);switch (ctrl->id) {case V4L2_CID_BRIGHTNESS:ov5640_set_brightness(client, ctrl->value);break;case V4L2_CID_CONTRAST:ov5640_set_contrast(client, ctrl->value);break;case V4L2_CID_SATURATION:ov5640_set_saturation(client, ctrl->value);break;case V4L2_CID_HUE:ov5640_set_hue(client, ctrl->value);break;
#if 0// case V4L2_CID_BLACK_LEVEL:
//      ov5640_set_black_level(sd, ctrl->value);
//      break;case V4L2_CID_AUTO_WHITE_BALANCE:ov5640_set_awb(client, ctrl->value);break;
//  case V4L2_CID_DO_WHITE_BALANCE:
//      ov5640_set_do_white_balance(sd, ctrl->value);
//      break;
//  case V4L2_CID_RED_BALANCE:
//      ov5640_set_red_balance(sd, ctrl->value);
//      break;
//  case V4L2_CID_BLUE_BALANCE:
//      ov5640_set_blue_balance(sd, ctrl->value);
//      break;
//  case V4L2_CID_GAMMA:
//      ov5640_set_gamma(sd, ctrl->value);
//      break;
#endifcase V4L2_CID_EXPOSURE:ov5640_set_exposure_level(client, ctrl->value);break;
#if 0case V4L2_CID_AUTOGAIN:ov5640_set_autogain(sd, ctrl->value);break;case V4L2_CID_GAIN:ov5640_set_gain(sd, ctrl->value);break;
#endifcase V4L2_CID_HFLIP:case V4L2_CID_VFLIP:ov5640_set_flip(client, ctrl);break;
#if 0case V4L2_CID_POWER_LINE_FREQUENCY:ov5640_set_power_line_frequency(sd, ctrl->value);break;
//  case V4L2_CID_HUE_AUTO:
//      ov5640_set_hue_auto(sd, ctrl->value);
//      break;case V4L2_CID_WHITE_BALANCE_TEMPERATURE:set_white_balance_temperature(client, ctrl->value);break;
#endifcase V4L2_CID_SHARPNESS:ov5640_set_sharpness(client, ctrl->value);break;
//  case V4L2_CID_BACKLIGHT_COMPENSATION:
//      ov5640_set_backlight_compensation(sd, ctrl->value);
//      break;
//  case V4L2_CID_CHROMA_AGC:
//      ov5640_set_chroma_agc(sd, ctrl->value);
//      break;
//  case V4L2_CID_CHROMA_GAIN:
//      ov5640_set_chroma_gain(sd, ctrl->value);
//      break;
//  case V4L2_CID_COLOR_KILLER:
//      ov5640_set_color_killer(sd, ctrl->value);
//      break;case V4L2_CID_COLORFX:ov5640_set_colorfx(client, ctrl->value);break;
#if 0
//  case V4L2_CID_AUTOBRIGHTNESS:
//      ov5640_set_autobrightness(sd, ctrl->value);
//      break;case V4L2_CID_BAND_STOP_FILTER:ov5640_set_band_stop_filter(sd, ctrl->value);break;//   case V4L2_CID_ROTATE:
//      ov5640_set_rotate(sd, ctrl->value);
//      break;
//  case V4L2_CID_BG_COLOR:
//      ov5640_set_bg_color(sd, ctrl->value);
//      break;case V4L2_CID_EXPOSURE_AUTO:ov5640_set_exposure_auto(sd, ctrl->value);break;// case V4L2_CID_EXPOSURE_ABSOLUTE:
//  case V4L2_CID_EXPOSURE_AUTO_PRIORITY:
//  case V4L2_CID_PAN_RELATIVE:
//  case V4L2_CID_TILT_RELATIVE:
//  case V4L2_CID_PAN_RESET:
//  case V4L2_CID_TILT_RESET:
//  case V4L2_CID_PAN_ABSOLUTE:
//  case V4L2_CID_TILT_ABSOLUTE:
//  case V4L2_CID_FOCUS_ABSOLUTE:
//  case V4L2_CID_FOCUS_RELATIVE:
//  case V4L2_CID_FOCUS_AUTO:
//  case V4L2_CID_ZOOM_ABSOLUTE:
//  case V4L2_CID_ZOOM_RELATIVE:
//  case V4L2_CID_ZOOM_CONTINUOUS:
//  case V4L2_CID_IRIS_ABSOLUTE:
//  case V4L2_CID_IRIS_RELATIVE:
//  case V4L2_CID_PRIVACY:case V4L2_CID_SCENE_EXPOSURE:ov5640_set_scene_exposure(sd, ctrl->value);break;
#endif/* add by cym 20130812 */case V4L2_CID_CAMERA_SET_AUTO_FOCUS:{printk("auto focus......\n");err = ov5640_sensor_s_single_af(sd);//      OV5640_FOCUS_AD5820_Single_Focus();//   OV5640_FOCUS_AD5820_Constant_Focus();}break;/* end add */default:OV_ERR("invalid control ctrl: %s\n", v4l2_ctrl_get_name(ctrl->id));return (-EINVAL);}return (ret);
}static int ov5640_init(struct v4l2_subdev *sd, u32 val)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct ov5640_priv *priv = to_ov5640(client);unsigned char pid;unsigned char version;//int err = -EINVAL;/* add by cym 20121121 */ov5640_power(1);/* end add *///dg add 2015-07-15i2cc_set_reg(client, 0x3103,0x11);i2cc_set_reg(client, 0x3008,0x82);mdelay(20);// check and show product ID and manufacturer IDi2cc_get_reg(client, 0x300a, &pid);i2cc_get_reg(client, 0x300b, &version);printk("%s: version = 0x%x%x\n", __FUNCTION__, pid, version);if (OV5640 != VERSION(pid, version)) {OV_ERR("ov5640 probed failed!!\n");return (-ENODEV);}priv->model = 1;//cym V4L2_IDENT_OV5640;//ov5640_sensor_download_af_fw(sd);//ov5640_sensor_s_single_af(sd);//dg add  2015-07-25OV5640_FOCUS_AD5820_Init();OV5640YUV_Sensor_Dvp_Init();down_af_firmware_flag =1;INFO_BLUE("ov5640 device probed success\n");return 0;
}static int ov5640_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{struct i2c_client *client = v4l2_get_subdevdata(sd);struct ov5640_priv *priv = to_ov5640(client);int err = 0;OV_INFO("%s: control ctrl- %s\n", __func__, v4l2_ctrl_get_name(ctrl->id));printk("%s: control ctrl- id = %d\n", __func__, ctrl->id);switch (ctrl->id) {case V4L2_CID_BRIGHTNESS:ctrl->value = priv->brightness;break;case V4L2_CID_CONTRAST:ctrl->value = priv->contrast;break;case V4L2_CID_SATURATION:ctrl->value = priv->saturation;break;case V4L2_CID_HUE:ctrl->value = priv->hue;break;//  case V4L2_CID_BLACK_LEVEL://      ctrl->value = priv->black_level;//      break;
#if 0case V4L2_CID_AUTO_WHITE_BALANCE:ctrl->value = priv->auto_white_balance;break;//  case V4L2_CID_DO_WHITE_BALANCE://      ctrl->value = priv->do_white_balance;//      break;//  case V4L2_CID_RED_BALANCE://      ctrl->value = priv->red_balance;//      break;//  case V4L2_CID_BLUE_BALANCE://      ctrl->value = priv->blue_balance;//      break;//  case V4L2_CID_GAMMA://      ctrl->value = priv->gamma;//      break;
#endifcase V4L2_CID_EXPOSURE:ctrl->value = priv->exposure;break;
#if 0case V4L2_CID_AUTOGAIN:ctrl->value = priv->autogain;break;case V4L2_CID_GAIN:ctrl->value = priv->gain;break;
#endifcase V4L2_CID_HFLIP:ctrl->value = !!(priv->flip_flag & OV5640_HFLIP);break;case V4L2_CID_VFLIP:ctrl->value = !!(priv->flip_flag & OV5640_VFLIP);break;
#if 0case V4L2_CID_POWER_LINE_FREQUENCY:ctrl->value = priv->power_line_frequency;break;//  case V4L2_CID_HUE_AUTO://      ctrl->value = priv->hue_auto;//      break;case V4L2_CID_WHITE_BALANCE_TEMPERATURE:ctrl->value = priv->white_balance_temperature;break;
#endifcase V4L2_CID_SHARPNESS:ctrl->value = priv->sharpness;break;//  case V4L2_CID_BACKLIGHT_COMPENSATION://      ctrl->value = priv->backlight_compensation;//      break;//  case V4L2_CID_CHROMA_AGC://      ctrl->value = priv->chroma_agc;//      break;//  case V4L2_CID_CHROMA_GAIN://      ctrl->value = priv->chroma_gain;//      break;//  case V4L2_CID_COLOR_KILLER://      ctrl->value = priv->color_killer;//      break;case V4L2_CID_COLORFX:ctrl->value = priv->colorfx;break;
#if 0//  case V4L2_CID_AUTOBRIGHTNESS://      ctrl->value = priv->autobrightness;//      break;case V4L2_CID_BAND_STOP_FILTER:ctrl->value = priv->band_stop_filter;break;//  case V4L2_CID_ROTATE://      ctrl->value = priv->rotate;//      break;//  case V4L2_CID_BG_COLOR://      ctrl->value = priv->bg_color;//      break;case V4L2_CID_EXPOSURE_AUTO:ctrl->value = priv->exposure_auto;break;//  case V4L2_CID_EXPOSURE_ABSOLUTE://  case V4L2_CID_EXPOSURE_AUTO_PRIORITY://  case V4L2_CID_PAN_RELATIVE://  case V4L2_CID_TILT_RELATIVE://  case V4L2_CID_PAN_RESET://  case V4L2_CID_TILT_RESET://  case V4L2_CID_PAN_ABSOLUTE://  case V4L2_CID_TILT_ABSOLUTE://  case V4L2_CID_FOCUS_ABSOLUTE://  case V4L2_CID_FOCUS_RELATIVE://  case V4L2_CID_FOCUS_AUTO://  case V4L2_CID_ZOOM_ABSOLUTE://  case V4L2_CID_ZOOM_RELATIVE://  case V4L2_CID_ZOOM_CONTINUOUS://  case V4L2_CID_IRIS_ABSOLUTE://  case V4L2_CID_IRIS_RELATIVE://  case V4L2_CID_PRIVACY:case V4L2_CID_SCENE_EXPOSURE:ctrl->value = priv->scene_exposure;break;
#endif/* add by cym 20130829 */case V4L2_CID_CAMERA_AUTO_FOCUS_RESULT://android4.0 use this, it is very important for take picture,android4.4 not use.err = ov5640_get_auto_focus_result(sd, ctrl);break;/* end add */default:OV_ERR("invalid control ctrl: %s\n", v4l2_ctrl_get_name(ctrl->id));return (-EINVAL);}return (0);
}static int ov5640_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
{//struct i2c_client *client = v4l2_get_subdevdata(sd);struct v4l2_control ctrl;int i;int err = 0;if ((ctrls->ctrl_class != V4L2_CTRL_CLASS_USER)&& (ctrls->ctrl_class != V4L2_CTRL_CLASS_CAMERA)) {OV_ERR("ctrl class[%s] is illegal.\n", v4l2_ctrl_get_name(ctrls->ctrl_class));return (-EINVAL);}for (i = 0; i < ctrls->count; i++) {ctrl.id = ctrls->controls[i].id;ctrl.value = ctrls->controls[i].value;err = ov5640_s_ctrl(sd, &ctrl);//ctrls->controls[i].value = ctrl.value;if (err) {ctrls->error_idx = i;break;}}return (err);
}static int ov5640_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
{//struct i2c_client *client = v4l2_get_subdevdata(sd);struct v4l2_control ctrl;int i;int err = 0;if ((ctrls->ctrl_class != V4L2_CTRL_CLASS_USER)&& (ctrls->ctrl_class != V4L2_CTRL_CLASS_CAMERA)) {OV_ERR("ctrl class[%s] is illegal.\n", v4l2_ctrl_get_name(ctrls->ctrl_class));return (-EINVAL);}for (i = 0; i < ctrls->count; i++) {ctrl.id = ctrls->controls[i].id;//ctrl.value = ctrls->controls[i].value;err = ov5640_g_ctrl(sd, &ctrl);ctrls->controls[i].value = ctrl.value;if (err) {ctrls->error_idx = i;break;}}return (err);
}static int ov5640_try_ctrl(struct v4l2_subdev *sd,struct v4l2_ext_control *ctrl)
{struct v4l2_queryctrl qctrl;const char **menu_items = NULL;int err;qctrl.id = ctrl->id;err = ov5640_queryctrl(sd, &qctrl);if (err)return (err);if (qctrl.type == V4L2_CTRL_TYPE_MENU)menu_items = v4l2_ctrl_get_menu(qctrl.id);return v4l2_ctrl_check(ctrl, &qctrl, menu_items);
}static int ov5640_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
{//struct i2c_client *client = v4l2_get_subdevdata(sd);int i;int err = 0;if ((ctrls->ctrl_class != V4L2_CTRL_CLASS_USER)&& (ctrls->ctrl_class != V4L2_CTRL_CLASS_CAMERA)) {OV_ERR("ctrl_class[%s] is illegal.\n", v4l2_ctrl_get_name(ctrls->ctrl_class));return (-EINVAL);}for (i = 0; i < ctrls->count; i++) {err = ov5640_try_ctrl(sd, &ctrls->controls[i]);if (err) {ctrls->error_idx = i;break;}}return (err);
}#ifdef CONFIG_VIDEO_ADV_DEBUGstatic int ov5640_g_register(struct v4l2_subdev *sd,struct v4l2_dbg_register *reg)
{struct i2c_client *client = v4l2_get_subdevdata(sd);unsigned char val;int err;reg->size = 2;if (reg->reg > 0x603f) {return (-EINVAL);}err = i2cc_get_reg(client, reg->reg, &val);if (err) {return (err);}reg->val = val;return (0);
}static int ov5640_s_register(struct v4l2_subdev *sd,struct v4l2_dbg_register *reg)
{struct i2c_client *client = v4l2_get_subdevdata(sd);if (reg->reg > 0x603f) {return (-EINVAL);}return (i2cc_set_reg(client, (unsigned short)reg->reg,(unsigned char)reg->val));
}#endifstatic struct soc_camera_ops ov5640_ops = {.set_bus_param = ov5640_set_bus_param,.query_bus_param = ov5640_query_bus_param,//.controls = ov5640_controls,//.num_controls = ARRAY_SIZE(ov5640_controls),
};static struct v4l2_subdev_core_ops ov5640_subdev_core_ops = {.init = ov5640_init,   .g_ctrl     = ov5640_g_ctrl,.s_ctrl        = ov5640_s_ctrl,.queryctrl  = ov5640_queryctrl,.g_ext_ctrls = ov5640_g_ext_ctrls,.s_ext_ctrls = ov5640_s_ext_ctrls,.try_ext_ctrls = ov5640_try_ext_ctrls,.g_chip_ident = ov5640_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG.g_register    = ov5640_g_register,.s_register    = ov5640_s_register,
#endif
};static struct v4l2_subdev_video_ops ov5640_subdev_video_ops = {.s_stream =  ov5640_s_stream,.g_mbus_fmt = ov5640_g_fmt,.s_mbus_fmt = ov5640_s_fmt,.try_mbus_fmt   = ov5640_try_fmt,.cropcap  = ov5640_cropcap,.g_crop       = ov5640_g_crop,.enum_mbus_fmt = ov5640_enum_fmt,.enum_framesizes = ov5640_enum_framesizes,
};static struct v4l2_subdev_ops  ov5640_subdev_ops = {.core = &ov5640_subdev_core_ops,.video = &ov5640_subdev_video_ops,
};#if 0  //remove by cym 20130807
static int ov5640_video_probe(struct soc_camera_device *icd, struct i2c_client *client)
{struct ov5640_priv *priv = to_ov5640(client);unsigned char pid;unsigned char version;/** We must have a parent by now. And it cannot be a wrong one.* So this entire test is completely redundant.*/if (NULL == icd->dev.parent ||to_soc_camera_host(icd->dev.parent)->nr != icd->iface) {OV_ERR("error : has a wrong parent\n");//return (-ENODEV);}// check and show product ID and manufacturer IDi2cc_get_reg(client, 0x300a, &pid);i2cc_get_reg(client, 0x300b, &version);if (OV5640 != VERSION(pid, version)) {OV_ERR("ov5640 probed failed!!\n");return (-ENODEV);}priv->model = 1;//cym V4L2_IDENT_OV5640;INFO_BLUE("ov5640 device probed success\n");return (0);
}
#endifstatic int ov5640_probe(struct i2c_client *client, const struct i2c_device_id *did)
{struct ov5640_priv *priv;struct v4l2_subdev *sd = NULL;struct soc_camera_device *icd = client->dev.platform_data;//struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);struct soc_camera_link *icl;int ret = 0;OV_INFO("ov5640 probe start...\n");if (NULL == icd) {ret = -EINVAL;OV_ERR("error: missing soc camera device\n");goto failed;}g_client=client;/* add by cym 20130605 */
#ifndef CONFIG_TC4_EVTov_vdd18_cam_regulator = regulator_get(NULL, "vdd18_cam");if (IS_ERR(ov_vdd18_cam_regulator)) {printk("%s: failed to get %s\n", __func__, "vdd18_cam");ret = -ENODEV;goto err_regulator;}ov_vdd28_cam_regulator = regulator_get(NULL, "vdda28_2m");if (IS_ERR(ov_vdd28_cam_regulator)) {printk("%s: failed to get %s\n", __func__, "vdda28_2m");ret = -ENODEV;goto err_regulator;}ov_vddaf_cam_regulator = regulator_get(NULL, "vdd28_af");if (IS_ERR(ov_vddaf_cam_regulator)) {printk("%s: failed to get %s\n", __func__, "vdd28_af");ret = -ENODEV;goto err_regulator;}ov_vdd5m_cam_regulator = regulator_get(NULL, "vdd28_cam");if (IS_ERR(ov_vdd5m_cam_regulator)) {printk("%s: failed to get %s\n", __func__, "vdd28_cam");ret = -ENODEV;goto err_regulator;}// ov5640_power(1);
#endif/* end add */icl = to_soc_camera_link(icd);if (NULL == icl) {ret = -EINVAL;OV_ERR("error: missing soc camera link\n");//cym goto failed;}ret = i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA);if (0 == ret) {ret = -EINVAL;OV_ERR("I2C DOESN'T support I2C_FUNC_SMBUS_BYTE_DATA\n");goto failed;}priv = (struct ov5640_priv *)kzalloc(sizeof(struct ov5640_priv), GFP_KERNEL);if (NULL == priv) {ret = -ENOMEM;OV_ERR("alloc ov5640_priv struct failed!\n");goto failed;}sd = &priv->subdev;strcpy(sd->name, OV5640_I2C_NAME);v4l2_i2c_subdev_init(sd, client, &ov5640_subdev_ops);icd->ops = &ov5640_ops;#if 0ret = ov5640_video_probe(icd, client);if (ret) {icd->ops = NULL;kfree(priv);OV_ERR("error : failed to probe camera device");}
#endiffailed://return (ret);return (0);
#ifndef CONFIG_TC4_EVT
err_regulator:ov5640_power(0);regulator_put(ov_vddaf_cam_regulator);regulator_put(ov_vdd5m_cam_regulator);/* add by cym 20130506 */regulator_put(ov_vdd18_cam_regulator);regulator_put(ov_vdd28_cam_regulator);/* end add */return ret;
#endif
}static int ov5640_remove(struct i2c_client *client)
{struct ov5640_priv *priv = to_ov5640(client);struct soc_camera_device *icd = client->dev.platform_data;struct v4l2_subdev *sd = i2c_get_clientdata(client);v4l2_device_unregister_subdev(sd);//icd->ops = NULL;kfree(priv);INFO_RED("ov5640 device removed!\n");#ifndef CONFIG_TC4_EVTov5640_power(0);regulator_put(ov_vddaf_cam_regulator);regulator_put(ov_vdd5m_cam_regulator);regulator_put(ov_vdd18_cam_regulator);regulator_put(ov_vdd28_cam_regulator);down_af_firmware_flag = 0;/* end add */
#endifreturn (0);
}#if 0
static int ov5640_detect(struct i2c_client *client, struct i2c_board_info *info)
{strcpy(info->type, OV5640_I2C_NAME);return 0;
}
#endifstatic const struct i2c_device_id ov5640_id[] = {{ OV5640_I2C_NAME, 0 },{ }
};
MODULE_DEVICE_TABLE(i2c, ov5640_id);static const unsigned short ov5640_addrs[] = {OV5640_I2C_ADDR,I2C_CLIENT_END,
};#if 0
struct i2c_board_info ov5640_info = {I2C_BOARD_INFO(OV5640_I2C_NAME, OV5640_I2C_ADDR),
};
#endifstatic struct i2c_driver ov5640_i2c_driver = {.driver = {.name = OV5640_I2C_NAME,.owner = THIS_MODULE,},.class = I2C_CLASS_HWMON,.probe    = ov5640_probe,.remove   = ov5640_remove,.id_table = ov5640_id,.address_list = ov5640_addrs,
};/** module function*/static int __init ov5640_module_init(void)
{OV_INFO("install module\n");printk("%s\n", __FUNCTION__);return i2c_add_driver(&ov5640_i2c_driver);
}static void __exit ov5640_module_exit(void)
{OV_INFO("uninstall module\n");i2c_del_driver(&ov5640_i2c_driver);
}module_init(ov5640_module_init);
module_exit(ov5640_module_exit);MODULE_DESCRIPTION("SoC Camera driver for ov5640");
MODULE_AUTHOR("caoym@topeet.com ");
MODULE_LICENSE("GPL v2");

Exynos4412 OV5640摄像头(一)—— 驱动相关推荐

  1. linux摄像头 自动对焦,基于H3在Linux下驱动OV5640摄像头的方法与流程

    技术特征: 1.基于H3在Linux下驱动OV5640摄像头的方法,其特征在于,包括如下步骤: S1打开OV5640摄像头所对应的设备文件/dev/videoX: S2为OV5640摄像头驱动添加读写 ...

  2. FPGA USB FX2 ov5640摄像头视频采集 驱动CY7C68013A实现 提供2套工程源码和技术支持

    目录 1.前言 2.我这儿已有的 FPGA USB 通信方案 3.CY7C68013A芯片解读和硬件设计 FX2 简介 SlaveFIFO模式及其配置 4.工程详细设计方案 5.vivado工程 6. ...

  3. FPGA利用SCCB协议配置OV5640摄像头

    FPGA利用SCCB协议配置OV5640摄像头 为什么要配置摄像头 配置代码 测试代码 总结 为什么要配置摄像头 OV5640摄像头有许多工作模式,如可以工作在1080P,720P,480P分辨率的情 ...

  4. FPGA配置OV5640摄像头及RGB图像数据采集

    本文设计思想采用明德扬至简设计法.在做摄像头数据采集处理之前,需要配置OV5640传感器内部寄存器使其按要求正常工作,详细内容请参见<OV5640自动对焦照相模组应用指南>.首先要关注OV ...

  5. 【正点原子FPGA连载】第四十一章OV5640摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  6. 【正点原子FPGA连载】 第三十章双目OV5640摄像头LCD显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  7. STM32H750获取OV5640摄像头图像及上位机解码(一维码二维码)

    STM32H750获取OV5640摄像头图像及上位机解码(一维码&二维码) 1. 目的 针对静止拍摄图像场景,实现STM32H750对500万像素OV5640摄像头进行图像捕获,并通过串口将数 ...

  8. 【正点原子FPGA连载】第四十九章OV5640摄像头HDMI灰度显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  9. 【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  10. 【正点原子FPGA连载】第五十六章 双目OV5640摄像头HDMI显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 3)全套实验源码+手册+视频下载地址:ht ...

最新文章

  1. 03-2 BGP专有命令--BGP命令与配置手册
  2. python爬取aspx数据
  3. 创业失败的七个原因及解决之道
  4. pppoe 服务器 无线,无线路由器怎么设置PPPOE拨号【图文讲解】
  5. GDCM:gdcm::LTComp的测试程序
  6. 小程序----使用Less
  7. 2020知道python语言应用答案_2020知到Python语言应用答案章节期末答案
  8. 5个球放入3个箱子_国内5个经典的美食小吃,吃过3个以上算厉害,你吃过几个?...
  9. Scrapy 教程(九)-日志系统
  10. 透明flash代码_Animate/FLASH如何制作纵深前进的动画
  11. mysql concat函数进行模糊查询
  12. 本特利电涡流传感器330709-000-060-10-02-00
  13. esp8266 wifi 中继整理
  14. python如何表示正整数_python中正整数
  15. 学习-Java包装类之Double类(9)
  16. 互斥事件的概念和公式_独立事件与互斥事件的区别与联系公式
  17. qte5编译dub.json
  18. pregnant用法
  19. AmbientOcclusion(AO)
  20. 华为依然执5G手机市场牛耳,不得不感叹它的强大

热门文章

  1. 办公室服务器文件管理制度,机要文件管理制度
  2. 通用数据权限设计方案
  3. 开根号的笔算算法图解_用笔算开根号
  4. 4.3 木马隐藏分析
  5. macos 下 vmware fusion 安装 vmware tools
  6. mysql-front服务器_mysql-front远程连接自己linux服务器上的mysql服务器
  7. ssm框架体检管理系统源码+文档
  8. 智慧城市顶层设计与不确定性
  9. 敏捷开发scrum模型
  10. 大脑网络结构、功能和控制的物理学