summaryrefslogtreecommitdiff
path: root/drivers/media/video/wmt_v4l2/sensors/ov2643
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/wmt_v4l2/sensors/ov2643')
-rwxr-xr-xdrivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.c329
-rwxr-xr-xdrivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.h380
2 files changed, 709 insertions, 0 deletions
diff --git a/drivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.c b/drivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.c
new file mode 100755
index 00000000..53731fae
--- /dev/null
+++ b/drivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.c
@@ -0,0 +1,329 @@
+
+#include "../cmos-subdev.h"
+#include "../../wmt-vid.h"
+#include "ov2643.h"
+
+#define sensor_write_array(sd, arr, sz) \
+ cmos_init_8bit_addr(arr, sz, (sd)->i2c_addr)
+
+#define sensor_read(sd, reg) \
+ wmt_vid_i2c_read(sd->i2c_addr, reg)
+
+#define sensor_write(sd, reg, val) \
+ wmt_vid_i2c_write(sd->i2c_addr, reg, val)
+
+struct cmos_win_size {
+ char *name;
+ int width;
+ int height;
+ uint8_t *regs;
+ size_t size;
+};
+
+#define CMOS_WIN_SIZE(n, w, h, r) \
+ {.name = n, .width = w , .height = h, .regs = r, .size = ARRAY_SIZE(r) }
+
+static const struct cmos_win_size cmos_supported_win_sizes[] = {
+ CMOS_WIN_SIZE("VGA", 640, 480, ov2643_640_480_regs),
+ CMOS_WIN_SIZE("720p", 1280, 720, ov2643_1280_720_regs),
+ CMOS_WIN_SIZE("UXGA", 1600, 1200, ov2643_1600_1200_regs),
+};
+
+static const struct cmos_win_size *cmos_select_win(u32 *width, u32 *height)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(cmos_supported_win_sizes); i++) {
+ if (cmos_supported_win_sizes[i].width == *width &&
+ cmos_supported_win_sizes[i].height == *height) {
+ *width = cmos_supported_win_sizes[i].width;
+ *height = cmos_supported_win_sizes[i].height;
+ return &cmos_supported_win_sizes[i];
+ }
+ }
+ return NULL;
+}
+
+static int sensor_s_wb(struct cmos_subdev *sd, enum v4l2_wb_mode value)
+{
+ uint8_t *regs;
+ size_t size;
+
+ switch (value) {
+ case WHITE_BALANCE_AUTO:
+ regs = ov2643_wb_auto;
+ size = ARRAY_SIZE(ov2643_wb_auto);
+ break;
+ case WHITE_BALANCE_INCANDESCENCE:
+ regs = ov2643_wb_incandescent;
+ size = ARRAY_SIZE(ov2643_wb_incandescent);
+ break;
+ case WHITE_BALANCE_DAYLIGHT:
+ regs = ov2643_wb_daylight;
+ size = ARRAY_SIZE(ov2643_wb_daylight);
+ break;
+ case WHITE_BALANCE_CLOUDY:
+ regs = ov2643_wb_cloudy;
+ size = ARRAY_SIZE(ov2643_wb_cloudy);
+ break;
+ case WHITE_BALANCE_FLUORESCENT:
+ regs = ov2643_wb_fluorescent;
+ size = ARRAY_SIZE(ov2643_wb_fluorescent);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ sensor_write_array(sd, regs, size);
+ return 0;
+}
+
+static int sensor_s_scenemode(struct cmos_subdev *sd, enum v4l2_scene_mode value)
+{
+ uint8_t *regs;
+ size_t size;
+
+ switch (value) {
+ case SCENE_MODE_AUTO:
+ regs = ov2643_scene_mode_auto;
+ size = ARRAY_SIZE(ov2643_scene_mode_auto);
+ break;
+ case SCENE_MODE_NIGHTSHOT:
+ regs = ov2643_scene_mode_night;
+ size = ARRAY_SIZE(ov2643_scene_mode_night);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ sensor_write_array(sd, regs, size);
+ return 0;
+}
+
+static int sensor_s_exposure(struct cmos_subdev *sd, enum v4l2_exposure_mode value)
+{
+ uint8_t *regs;
+ size_t size;
+
+ switch (value) {
+ case -2:
+ regs = ov2643_exposure_neg6;
+ size = ARRAY_SIZE(ov2643_exposure_neg6);
+ break;
+ case -1:
+ regs = ov2643_exposure_neg3;
+ size = ARRAY_SIZE(ov2643_exposure_neg3);
+ break;
+ case 0:
+ regs = ov2643_exposure_zero;
+ size = ARRAY_SIZE(ov2643_exposure_zero);
+ break;
+ case 1:
+ regs = ov2643_exposure_pos3;
+ size = ARRAY_SIZE(ov2643_exposure_pos3);
+ break;
+ case 2:
+ regs = ov2643_exposure_pos6;
+ size = ARRAY_SIZE(ov2643_exposure_pos6);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ sensor_write_array(sd, regs, size);
+ return 0;
+}
+
+static int sensor_s_hflip(struct cmos_subdev *sd, int value)
+{
+ uint8_t data;
+
+ data = sensor_read(sd, 0x12);
+
+ switch (value) {
+ case 0:
+ data &= ~0x20;
+ break;
+ case 1:
+ data |= 0x20;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return sensor_write(sd, 0x12, data);
+}
+
+static int sensor_s_vflip(struct cmos_subdev *sd, int value)
+{
+ uint8_t data;
+
+ data = sensor_read(sd, 0x12);
+
+ switch (value) {
+ case 0:
+ data &= ~0x10;
+ break;
+ case 1:
+ data |= 0x10;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return sensor_write(sd, 0x12, data);
+}
+
+static int sensor_queryctrl(struct cmos_subdev *sd, struct v4l2_queryctrl *qc)
+{
+ switch (qc->id) {
+ case V4L2_CID_VFLIP:
+ case V4L2_CID_HFLIP:
+ return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
+ case V4L2_CID_CAMERA_SCENE_MODE:
+ return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
+ case V4L2_CID_DO_WHITE_BALANCE:
+ return v4l2_ctrl_query_fill(qc, 0, 3, 1, 0);
+ case V4L2_CID_EXPOSURE:
+ return v4l2_ctrl_query_fill(qc, -2, 2, 1, 0);
+ }
+ return -EINVAL;
+}
+
+static int sensor_s_ctrl(struct cmos_subdev *sd, struct v4l2_control *ctrl)
+{
+ switch (ctrl->id) {
+ case V4L2_CID_CAMERA_SCENE_MODE:
+ return sensor_s_scenemode(sd, ctrl->value);
+ case V4L2_CID_DO_WHITE_BALANCE:
+ return sensor_s_wb(sd, ctrl->value);
+ case V4L2_CID_EXPOSURE:
+ return sensor_s_exposure(sd, ctrl->value);
+ case V4L2_CID_HFLIP:
+ return sensor_s_hflip(sd, ctrl->value);
+ case V4L2_CID_VFLIP:
+ return sensor_s_vflip(sd, ctrl->value);
+ default:
+ case WMT_V4L2_CID_CAMERA_ANTIBANDING:
+ return -EINVAL;
+ }
+ return -EINVAL;
+}
+
+static int sensor_g_mbus_fmt(struct cmos_subdev *sd,
+ struct v4l2_mbus_framefmt *mf)
+{
+ return -EINVAL;
+}
+
+static int sensor_s_mbus_fmt(struct cmos_subdev *sd,
+ struct v4l2_mbus_framefmt *mf)
+{
+ const struct cmos_win_size *win;
+
+ win = cmos_select_win(&mf->width, &mf->height);
+ if (!win) {
+ pr_err("%s, s_mbus_fmt failed, width %d, height %d\n",
+ sd->name, mf->width, mf->height);
+ return -EINVAL;
+ }
+ sensor_write_array(sd, win->regs, win->size);
+ msleep(300);
+
+ return 0;
+}
+
+static int sensor_try_mbus_fmt(struct cmos_subdev *sd,
+ struct v4l2_mbus_framefmt *mf)
+{
+ const struct cmos_win_size *win;
+
+ win = cmos_select_win(&mf->width, &mf->height);
+
+ return 0;
+}
+
+static int sensor_enum_framesizes(struct cmos_subdev *sd,
+ struct v4l2_frmsizeenum *fsize)
+{
+ int i;
+ int num_valid = -1;
+ __u32 index = fsize->index;
+
+ for (i = 0; i < ARRAY_SIZE(cmos_supported_win_sizes); i++) {
+ const struct cmos_win_size *win = &cmos_supported_win_sizes[index];
+ if (index == ++num_valid) {
+ fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+ fsize->discrete.width = win->width;
+ fsize->discrete.height = win->height;
+ return 0;
+ }
+ }
+
+ return -EINVAL;
+}
+
+static int sensor_identify(struct cmos_subdev *sd)
+{
+ int data;
+
+ data = sensor_read(sd, 0xa);
+ data <<=8;
+ data += sensor_read(sd ,0xb);
+
+ return (data == sd->id) ? 0 : -EINVAL;
+}
+
+static int sensor_init(struct cmos_subdev *sd)
+{
+ if (sensor_identify(sd)) {
+ return -1;
+ }
+
+ sensor_write_array(sd, ov2643_default_regs_init,
+ ARRAY_SIZE(ov2643_default_regs_init));
+ return 0;
+}
+
+static int sensor_exit(struct cmos_subdev *sd)
+{
+ return 0;
+}
+
+static struct cmos_subdev_ops ov2643_ops = {
+ .identify = sensor_identify,
+ .init = sensor_init,
+ .exit = sensor_exit,
+ .queryctrl = sensor_queryctrl,
+ .s_ctrl = sensor_s_ctrl,
+ .s_mbus_fmt = sensor_s_mbus_fmt,
+ .g_mbus_fmt = sensor_g_mbus_fmt,
+ .try_mbus_fmt = sensor_try_mbus_fmt,
+ .enum_framesizes = sensor_enum_framesizes,
+};
+
+struct cmos_subdev ov2643 = {
+ .name = "ov2643",
+ .i2c_addr = 0x30,
+ .id = 0x2643,
+ .max_width = 1600,
+ .max_height = 1200,
+ .ops = &ov2643_ops,
+};
+
+#if 0
+static int __init ov2643_init(void)
+{
+ return cmos_register_sudbdev(&ov2643);
+}
+
+static void __exit ov2643_exit(void)
+{
+ return cmos_unregister_subdev(&ov2643);
+}
+
+module_init(ov2643_init);
+module_exit(ov2643_exit);
+
+MODULE_LICENSE("GPL");
+#endif
diff --git a/drivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.h b/drivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.h
new file mode 100755
index 00000000..b041bf32
--- /dev/null
+++ b/drivers/media/video/wmt_v4l2/sensors/ov2643/ov2643.h
@@ -0,0 +1,380 @@
+#ifndef OV2643_H
+#define OV2643_H
+
+// Scene Mode
+uint8_t ov2643_scene_mode_auto[] = {
+ 0x03,0x10,
+ 0x41,0x00,
+ 0x03,0x20,
+ 0xb2,0x80,
+ 0xff,0xff,
+};
+
+uint8_t ov2643_scene_mode_night[] = {
+ 0x03,0x10,
+ 0x41,0x15,
+ 0x03,0x20,
+ 0xb2,0xf0,
+ 0xff,0xff,
+};
+
+
+// White Balance
+uint8_t ov2643_wb_auto [] = {
+
+};
+
+uint8_t ov2643_wb_incandescent [] = {
+
+};
+
+uint8_t ov2643_wb_fluorescent [] = {
+
+};
+
+uint8_t ov2643_wb_daylight [] = {
+
+};
+
+uint8_t ov2643_wb_cloudy [] = {
+
+};
+
+
+// Exposure
+uint8_t ov2643_exposure_neg6[] = {
+
+};
+
+uint8_t ov2643_exposure_neg3[] = {
+
+};
+
+uint8_t ov2643_exposure_zero[] = {
+
+};
+
+uint8_t ov2643_exposure_pos3[] = {
+
+};
+
+uint8_t ov2643_exposure_pos6[] = {
+
+};
+
+
+// Resolution
+uint8_t ov2643_1600_1200_regs[]={
+ //;pclk=72mhz,30fps/pclk=36mhz,15fps
+ //0x12,0x80,
+ 0xc3,0x1f,
+ 0xc4,0xff,
+ 0x3d,0x48,
+ 0xdd,0xa5,
+ //;windows setup
+ 0x20,0x01,
+ 0x21,0x25,
+ 0x22,0x00,
+ 0x23,0x0c,
+ 0x24,0x64,//;0x640=1600
+ 0x25,0x08,
+ 0x26,0x4b,//;0x4b0=1200
+ 0x27,0x06,
+ 0x28,0x42,
+ //;format setting
+ 0x12,0x08,//+MIRROR*0x20+FLIP*0x10,//mirror and flip
+ 0x39,0x10,
+ 0xcd,0x12,
+ 0x3d,0x08,
+ //;frame setting
+ 0x0e,0x10,//clock 48Mhz PCLK
+ 0x0f,0x14,
+ 0x10,0x0a,
+ 0x11,0x00,
+
+ 0x29,0x07,//;dummy pixels
+ 0x2a,0x9a,
+ 0x2b,0x04,//;dummy lines//0x04
+ 0x2c,0xd4,// //0xd4
+ //for 12.5fps 0x4d4*1.2=0x5cb
+ 0x2d,0x00,
+ 0x2e,0x00,
+
+ 0x1c,0x25,//vsync width
+ 0x1d,0x06,//;banding
+ 0x1e,0x00,
+ 0x1f,0xb9,//0xba,//0x5d,
+
+ 0xde,0xc4,//added 2011-9-2 9:21:54
+ //0x75,0x6a,//advanced AWB for 2M
+};
+
+uint8_t ov2643_1280_720_regs[]={
+ //;pclk=72mhz,30fps/pclk=36mhz,15fps
+ //0x12,0x80,
+ 0xc3,0x1f,
+ 0xc4,0xff,
+ 0x3d,0x48,
+ 0xdd,0xa5,
+ //;windows setup
+ 0x20,0x01,//0x01,//
+ 0x21,0x25,//0x60,//
+ 0x22,0x00,
+ 0x23,0x0c,
+ 0x24,0x50,//;0x500=1280
+ 0x25,0x04,
+ 0x26,0x2d,//;0x2d0=720
+ 0x27,0x04,
+ 0x28,0x42,
+
+ //format
+ 0x12,0x48,//+MIRROR*0x20+FLIP*0x10,//mirror and flip
+ 0x39,0x10,
+ 0xcd,0x12,
+
+ //;frame setting
+ 0x0e,0x10,//0x10,//0xb4,//clock 48Mhz PCLK
+ 0x0f,0x14,
+ 0x10,0x0a,
+ 0x11,0x00,
+
+ 0x29,0x06,//;dummy pixels //24.75M 0x29,0x06//24M 0x29,0x06,//
+ 0x2a,0x40, //24.75M 0x2a,0x72//24M 0x2a,0x40,//
+ 0x2b,0x02,//;dummy lines //24.75M 0x2b,0x02//24M 0x2b,0x02,//
+ 0x2c,0xee, //24.75M 0x2c,0xee//24M 0x2c,0xee,//
+ //for 25fps 0x2ee*1.2=0x384
+
+ 0x1c,0x25,//vsync width
+ 0x1d,0x02,//0x04,//0x02,
+ 0x1e,0x00,
+ 0x1f,0xe1,
+
+ 0xde,0x7c,
+ 0x3d,0x08,
+};
+
+uint8_t ov2643_640_480_regs[]={
+ //;pclk=72mhz,30fps/pclk=36mhz,15fps
+ //0x12,0x80,
+ 0xc3,0x1f,
+ 0xc4,0xff,
+ 0x3d,0x48,
+ 0xdd,0xa5,
+ //;windows setup
+ 0x20,0x01,
+ 0x21,0x98,
+ 0x22,0x00,
+ 0x23,0x06,
+ 0x24,0x28,//;0x280=640
+ 0x25,0x04,
+ 0x26,0x1e,//;0x1e0=480
+ 0x27,0x04,
+ 0x28,0x40,
+
+ //format
+ 0x12,0x09,
+ 0x39,0xd0,
+ 0xcd,0x13,
+ 0x3d,0x08,
+
+ //;frame setting
+ 0x0e,0x10,//clock 48Mhz PCLK
+ 0x0f,0x14,
+ 0x10,0x0a,
+ 0x11,0x00,
+ 0x29,0x07,//;dummy pixels//24.75M 0x29,0x07//24M 0x29,0x07,//->ov setting
+ 0x2a,0x93, //24.75M 0x2a,0xd0//24M 0x2a,0x93,//->ov setting
+ 0x2b,0x02,//;dummy lines //24.75M 0x2b,0x02//24M 0x2b,0x02,//->ov setting
+ 0x2c,0x6a, //24.75M 0x2c,0x6a//24M 0x2c,0x6a,//->ov setting
+ //for 25fps 0x26a*1.2=0x2e6
+ 0x1c,0x25,//vsync width
+ 0x1d,0x02,
+ 0x1e,0x00,
+ 0x1f,0xb9,
+
+ 0xde,0x7c,
+ 0x3d,0x08,
+};
+
+
+uint8_t ov2643_default_regs_init[]={
+ 0x12,0x80, //reset
+ 0x13,0xff,
+ //;pclk=72mhz,30fps/pclk=36mhz,15fps
+ 0xc3,0x1f,
+ 0xc4,0xff,
+ 0x3d,0x48,
+ 0xdd,0xa5,
+ //;windows setup
+ 0x20,0x01,
+ 0x21,0x98,
+ 0x22,0x00,
+ 0x23,0x06,
+ 0x24,0x28,//;0x280=640
+ 0x25,0x04,
+ 0x26,0x1e,//;0x1e0=480
+ 0x27,0x04,
+ 0x28,0x40,
+ //;format setting
+ 0x12,0x09,
+ 0x39,0xd0,
+ 0xcd,0x13,
+ 0x3d,0x08,
+ //;frame setting
+ 0x0e,0x10,//clock 48Mhz PCLK
+ 0x0f,0x14,
+ 0x10,0x0a,
+ 0x11,0x00,
+ 0x29,0x07,//;dummy pixels//24.75M 0x29,0x07//24M 0x29,0x07,//->ov setting
+ 0x2a,0x93, //24.75M 0x2a,0xd0//24M 0x2a,0x93,//->ov setting
+ 0x2b,0x02,//;dummy lines //24.75M 0x2b,0x02//24M 0x2b,0x02,//->ov setting
+ 0x2c,0x6a, //24.75M 0x2c,0x6a//24M 0x2c,0x6a,//->ov setting
+ //for 25fps 0x26a*1.2=0x2e6
+ 0x1c,0x25,//vsync width
+ 0x1d,0x02,
+ 0x1e,0x00,
+ 0x1f,0xb9,
+
+ //common part except 0x3d,0xde
+ 0x14,0x87, //band filter bit7: 1:50Hz 0:60Hz bit4:
+ 0x15,0x42,
+ 0x3c,0xa4,
+ 0x18,0x78,//set to default then set to csi_ae value to wake up quickly
+ 0x19,0x68,//
+ 0x1a,0x71,
+ 0x37,0xe8,
+ 0x16,0x90,
+ 0x43,0x00,
+ 0x40,0xfb,
+ 0xa9,0x44,
+ 0x2f,0xec,
+ 0x35,0x10,
+ 0x36,0x10,
+ 0x0c,0x00,
+ 0x0d,0x00,
+ 0xd0,0x93,
+ 0xdc,0x2b,
+ 0xd9,0x41,
+ 0xd3,0x02,
+ 0xde,0x7c,
+ 0x3d,0x08,
+ 0x0c,0x00,
+ 0x9b,0x69,
+ 0x9c,0x7d,
+ 0x9d,0x7d,
+ 0x9e,0x69,
+ 0x35,0x04,
+ 0x36,0x04,
+ //;gamma
+ //normal ////enhanced////zqh3 ////zqh2 ////zqh1 ////reset //
+ 0x65,0x04,//0x65,0x12,//0x65,0x04,//0x65,0x04,//0x65,0x07,//0x65,0x05,//
+ 0x66,0x07,//0x66,0x20,//0x66,0x07,//0x66,0x07,//0x66,0x12,//0x66,0x0c,//
+ 0x67,0x19,//0x67,0x39,//0x67,0x19,//0x67,0x19,//0x67,0x1f,//0x67,0x1c,//
+ 0x68,0x34,//0x68,0x4e,//0x68,0x34,//0x68,0x34,//0x68,0x35,//0x68,0x2a,//
+ 0x69,0x4a,//0x69,0x62,//0x69,0x4a,//0x69,0x4a,//0x69,0x4a,//0x69,0x39,//
+ 0x6a,0x5a,//0x6a,0x74,//0x6a,0x5a,//0x6a,0x5a,//0x6a,0x5d,//0x6a,0x45,//
+ 0x6b,0x67,//0x6b,0x85,//0x6b,0x67,//0x6b,0x6b,//0x6b,0x6f,//0x6b,0x52,//
+ 0x6c,0x71,//0x6c,0x92,//0x6c,0x71,//0x6c,0x78,//0x6c,0x7d,//0x6c,0x5d,//
+ 0x6d,0x7c,//0x6d,0x9e,//0x6d,0x7c,//0x6d,0x84,//0x6d,0x8a,//0x6d,0x68,//
+ 0x6e,0x8c,//0x6e,0xb2,//0x6e,0x8c,//0x6e,0x98,//0x6e,0x9f,//0x6e,0x7f,//
+ 0x6f,0x9b,//0x6f,0xc0,//0x6f,0x9b,//0x6f,0xa6,//0x6f,0xae,//0x6f,0x91,//
+ 0x70,0xa9,//0x70,0xcc,//0x70,0xa9,//0x70,0xb2,//0x70,0xbb,//0x70,0xa5,//
+ 0x71,0xc0,//0x71,0xe0,//0x71,0xc0,//0x71,0xc6,//0x71,0xd0,//0x71,0xc6,//
+ 0x72,0xd5,//0x72,0xee,//0x72,0xd5,//0x72,0xd5,//0x72,0xdf,//0x72,0xde,//
+ 0x73,0xe8,//0x73,0xf6,//0x73,0xe8,//0x73,0xe8,//0x73,0xe8,//0x73,0xef,//
+ 0x74,0x20,//0x74,0x11,//0x74,0x20,//0x74,0x20,//0x74,0x20,//0x74,0x16,//
+ //;color matrix
+ //ttune //ov seeting //
+ 0xab,0x20,//0xab,0x28,//
+ 0xac,0x5b,//0xac,0x48,//
+ 0xad,0x05,//0xad,0x10,//
+ 0xae,0x1b,//0xae,0x18,//
+ 0xaf,0x76,//0xaf,0x75,//
+ 0xb0,0x90,//0xb0,0x8c,//
+ 0xb1,0x90,//0xb1,0x8d,//
+ 0xb2,0x8c,//0xb2,0x8c,//
+ 0xb3,0x04,//0xb3,0x00,//
+ 0xb4,0x98,//0xb4,0x98,//
+ 0xb5,0x00,//0xb5,0x00,//
+ //;lens shading
+ 0x40,0xFB,//0x40,0x08,//
+ 0x4c,0x03,//0x4c,0x03,//
+ 0x4d,0x30,//0x4d,0xd0,//
+ 0x4e,0x02,//0x4e,0x02,//
+ 0x4f,0x5c,//0x4f,0x5c,//
+ 0x50,0x3e,//0x50,0x3e,//
+ 0x51,0x00,//0x51,0x00,//
+ 0x52,0x66,//0x52,0x66,//
+ 0x53,0x03,//0x53,0x03,//
+ 0x54,0x30,//0x54,0xd0,//
+ 0x55,0x02,//0x55,0x02,//
+ 0x56,0x5c,//0x56,0x5c,//
+ 0x57,0x47,//0x57,0x47,//
+ 0x58,0x00,//0x58,0x00,//
+ 0x59,0x66,//0x59,0x66,//
+ 0x5a,0x03,//0x5a,0x03,//
+ 0x5b,0x20,//0x5b,0xd0,//
+ 0x5c,0x02,//0x5c,0x02,//
+ 0x5d,0x5c,//0x5d,0x5c,/
+ 0x5e,0x3e,//0x5e,0x3e,//
+ 0x5f,0x00,//0x5f,0x00,//
+ 0x60,0x66,//0x60,0x66,//
+
+ 0x41,0x1f,
+ 0xb5,0x01,
+ 0xb6,0x07,
+ 0xb9,0x3c,
+ 0xba,0x28,
+ 0xb7,0x90,
+ 0xb8,0x08,
+ 0xbf,0x0c,
+ 0xc0,0x3e,
+ 0xa3,0x0a,
+ 0xa4,0x0f,
+ 0xa5,0x09,//denoise threshold
+ 0xa6,0x16,
+ 0x9f,0x0a,
+ 0xa0,0x0f,
+ 0xa7,0x0a,
+ 0xa8,0x0f,
+ 0xa1,0x18,//0xa1,0x10,
+ 0xa2,0x10,//0xa2,0x04,
+ 0xa9,0x00,//0xa9,0x04,
+ 0xaa,0xa6,
+ //;awb
+ 0x75,0x68,//0x75,0x6a,//
+ 0x76,0x11,//0x76,0x11,//
+ 0x77,0x92,//0x77,0x92,//
+ 0x78,0xa1,//0x78,0xa1,//
+ 0x79,0xe1,//0x79,0xe1,//
+ 0x7a,0x02,//0x7a,0x02,//
+ 0x7c,0x0e,//0x7c,0x05,//
+ 0x7d,0x12,//0x7d,0x08,//
+ 0x7e,0x12,//0x7e,0x08,//
+ 0x7f,0x54,//0x7f,0x7c,//
+ 0x80,0x78,//0x80,0x58,//
+ 0x81,0xa2,//0x81,0x2a,//
+ 0x82,0x80,//0x82,0xc5,//
+ 0x83,0x4e,//0x83,0x46,//
+ 0x84,0x40,//0x84,0x3a,//
+ 0x85,0x4c,//0x85,0x54,//
+ 0x86,0x43,//0x86,0x44,//
+ 0x87,0xf8,//0x87,0xf8,//
+ 0x88,0x08,//0x88,0x08,//
+ 0x89,0x70,//0x89,0x70,//
+ 0x8a,0xf0,//0x8a,0xf0,//
+ 0x8b,0xf0,//0x8b,0xf0,//
+
+ 0x90,0xe3,
+ 0x93,0x10,
+ 0x94,0x20,
+ 0x95,0x10,
+ 0x96,0x18,
+
+ 0xff,0xff,//delay 255ms
+ 0xff,0xff,//delay 255ms
+};
+;
+
+#endif
+