diff options
Diffstat (limited to 'drivers/media/video/wmt_v4l2/sensors/sp2518')
-rwxr-xr-x | drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.c | 326 | ||||
-rwxr-xr-x | drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.h | 1221 |
2 files changed, 1547 insertions, 0 deletions
diff --git a/drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.c b/drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.c new file mode 100755 index 00000000..40de4d91 --- /dev/null +++ b/drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.c @@ -0,0 +1,326 @@ + +#include "../cmos-subdev.h" +#include "../../wmt-vid.h" +#include "sp2518.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, sp2518_640_480_regs), + CMOS_WIN_SIZE("SVGA", 800, 600, sp2518_800_600_regs), + CMOS_WIN_SIZE("200w", 1600, 1200, sp2518_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 = sp2518_wb_auto; + size = ARRAY_SIZE(sp2518_wb_auto); + break; + case WHITE_BALANCE_INCANDESCENCE: + regs = sp2518_wb_incandescent; + size = ARRAY_SIZE(sp2518_wb_incandescent); + break; + case WHITE_BALANCE_DAYLIGHT: + regs = sp2518_wb_daylight; + size = ARRAY_SIZE(sp2518_wb_daylight); + break; + case WHITE_BALANCE_CLOUDY: + regs = sp2518_wb_cloudy; + size = ARRAY_SIZE(sp2518_wb_cloudy); + break; + case WHITE_BALANCE_FLUORESCENT: + regs = sp2518_wb_fluorescent; + size = ARRAY_SIZE(sp2518_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 = sp2518_scene_mode_auto; + size = ARRAY_SIZE(sp2518_scene_mode_auto); + break; + case SCENE_MODE_NIGHTSHOT: + regs = sp2518_scene_mode_night; + size = ARRAY_SIZE(sp2518_scene_mode_night); + break; + default: + return -EINVAL; + } + + sensor_write_array(sd, regs, size); + return 0; +} + +static int sensor_s_exposure(struct cmos_subdev *sd, int value) +{ + uint8_t *regs; + size_t size; + + switch (value) { + case -2: + regs = sp2518_exposure_neg2; + size = ARRAY_SIZE(sp2518_exposure_neg2); + break; + case -1: + regs = sp2518_exposure_neg1; + size = ARRAY_SIZE(sp2518_exposure_neg1); + break; + case 0: + regs = sp2518_exposure_zero; + size = ARRAY_SIZE(sp2518_exposure_zero); + break; + case 1: + regs = sp2518_exposure_pos1; + size = ARRAY_SIZE(sp2518_exposure_pos1); + break; + case 2: + regs = sp2518_exposure_pos2; + size = ARRAY_SIZE(sp2518_exposure_pos2); + 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; + + sensor_write(sd, 0xfd, 0x00); // set page0 + data = sensor_read(sd, 0x31); + switch (value) { + case 0: + data &= ~0x20; + break; + case 1: + data |= 0x20; + break; + default: + return -EINVAL; + } + sensor_write(sd, 0x31, data); + printk(KERN_DEBUG "%s, 0x%x\n", __func__, data); + return 0; +} + +static int sensor_s_vflip(struct cmos_subdev *sd, int value) +{ + uint8_t data; + + sensor_write(sd, 0xfd, 0x00); // set page0 + data = sensor_read(sd, 0x31); + switch (value) { + case 0: + data &= ~0x40; + break; + case 1: + data |= 0x40; + break; + default: + return -EINVAL; + } + sensor_write(sd, 0x31, data); + printk(KERN_DEBUG "%s, 0x%x\n", __func__, data); + return 0; +} + +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); + return 0; +} + +static int sensor_try_mbus_fmt(struct cmos_subdev *sd, + struct v4l2_mbus_framefmt *mf) +{ + 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) +{ + uint8_t data = 0; + + sensor_write(sd, 0xfd, 0x0); + data = sensor_read(sd, 0x02); + return (data == sd->id) ? 0 : -EINVAL; +} + +static int sensor_init(struct cmos_subdev *sd) +{ + if (sensor_identify(sd)) { + return -1; + } + + sensor_write_array(sd, sp2518_default_regs_init, + ARRAY_SIZE(sp2518_default_regs_init)); + return 0; +} + +static int sensor_exit(struct cmos_subdev *sd) +{ + sensor_write_array(sd, sp2518_default_regs_exit, + ARRAY_SIZE(sp2518_default_regs_exit)); + return 0; +} + +static struct cmos_subdev_ops sp2518_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 sp2518 = { + .name = "sp2518", + .i2c_addr = 0x30, + .id = 0x53, + .max_width = 1600, + .max_height = 1200, + .ops = &sp2518_ops, +}; + +#if 0 +static int __init sp2518_init(void) +{ + return cmos_register_sudbdev(&sp2518); +} + +static void __exit sp2518_exit(void) +{ + return cmos_unregister_subdev(&sp2518); +} + +module_init(sp2518_init); +module_exit(sp2518_exit); + +MODULE_LICENSE("GPL"); +#endif diff --git a/drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.h b/drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.h new file mode 100755 index 00000000..73b0ed0e --- /dev/null +++ b/drivers/media/video/wmt_v4l2/sensors/sp2518/sp2518.h @@ -0,0 +1,1221 @@ + +#ifndef __SP2518_H_ +#define __SP2518_H_ + +#define SP2518_P0_0xf7 0x80//78 +#define SP2518_P0_0xf8 0x74//6e +#define SP2518_P0_0xf9 0x80//74 +#define SP2518_P0_0xfa 0x74//6a +//HEQ +#define SP2518_P0_0xdd 0x80 +#define SP2518_P0_0xde 0x95//90 +//sharpen +#define SP2518_P1_0xe9 0x20//0x30//14 +#define SP2518_P1_0xed 0x20//0x30//10 +//sat +#define SP2518_P0_0xd3 0x77 +#define SP2518_P0_0xd4 0x77 +#define SP2518_P0_0xd6 0x77 +#define SP2518_P0_0xd7 0x77 +#define SP2518_P0_0xd8 0x77 +#define SP2518_P0_0xd9 0x77 +#define SP2518_P0_0xda 0x77 +#define SP2518_P0_0xdb 0x77 +//auto lum +#define SP2518_NORMAL_Y0ffset 0x10 +#define SP2518_LOWLIGHT_Y0ffset 0x20 + +#define CLK24M_48M +// #define CLK24M_72M + +// Scene Mode +uint8_t sp2518_scene_mode_auto[] = { + 0xfd , 0x00, + 0xb2,SP2518_NORMAL_Y0ffset, + 0xb3,0x1f, + +#ifdef CLK24M_48M + #if 0 + //capture preview daylight 48M 50hz fix 9FPS maxgain + 0xfd,0x00, + 0x03,0x02, + 0x04,0xbe, + 0x09,0x00, + 0x0a,0x64, + 0xf0,0x75, + 0xf1,0x00, + 0xfd,0x01, + 0x90,0x0b, + 0x92,0x01, + 0x98,0x75, + 0x99,0x00, + 0x9a,0x01, + 0x9b,0x00, + + // status + 0xfd,0x01, + 0xce,0x07, + 0xcf,0x05, + 0xd0,0x07, + 0xd1,0x05, + 0xd7,0x77,//exp_nr_outd_8lsb + 0xd8,0x00, + 0xd9,0x7b,//exp_outd_nr_8lsb + 0xda,0x00, + 0xfd,0x00, + #else + //capture preview daylight 48M 50hz fix 8FPS maxgain + 0xfd,0x00, + 0x03,0x02, + 0x04,0x70, + 0x09,0x00, + 0x0a,0xe4, + 0xf0,0x68, + 0xf1,0x00, + 0xfd,0x01, + 0x90,0x0c, + 0x92,0x01, + 0x98,0x68, + 0x99,0x00, + 0x9a,0x01, + 0x9b,0x00, + + // status + 0xfd,0x01, + 0xce,0xe0, + 0xcf,0x04, + 0xd0,0xe0, + 0xd1,0x04, + 0xd7,0x64,//exp_nr_outd_8lsb + 0xd8,0x00, + 0xd9,0x68,//exp_outd_nr_8lsb + 0xda,0x00, + 0xfd,0x00, + #endif +#elif defined(CLK24M_72M) + //capture preview daylight 72M 50hz 8-13FPS maxgain + 0xfd , 0x00, + 0x03 , 0xf6, + 0x04 , 0xbe, + 0x09 , 0x00, + 0x0a , 0x8b, + 0xf0 , 0xa9, + 0xf1 , 0x00, + 0xfd , 0x01, + 0x90 , 0x0c, + 0x92 , 0x01, + 0x98 , 0xa9, + 0x99 , 0x00, + 0x9a , 0x01, + 0x9b , 0x00, + + // status + 0xfd , 0x01, + 0xce , 0xec, + 0xcf , 0x07, + 0xd0 , 0xec, + 0xd1 , 0x07, + 0xd7 , 0xab,//exp_nr_outd_8lsb + 0xd8 , 0x00, + 0xd9 , 0xaf,//exp_outd_nr_8lsb + 0xda , 0x00, + 0xfd , 0x00, +#endif +}; + +uint8_t sp2518_scene_mode_night[] = { + 0xfd , 0x00, + 0xb2 , SP2518_LOWLIGHT_Y0ffset, + 0xb3 , 0x1f, + +#ifdef CLK24M_48M + //capture preview night 48M 50hz fix 6FPS maxgain + 0xfd,0x00, + 0x03,0x01, + 0x04,0xd4, + 0x09,0x02, + 0x0a,0x64, + 0xf0,0x4e, + 0xf1,0x00, + 0xfd,0x01, + 0x90,0x10, + 0x92,0x01, + 0x98,0x4e, + 0x99,0x00, + 0x9a,0x01, + 0x9b,0x00, + + // status + 0xfd,0x01, + 0xce,0xe0, + 0xcf,0x04, + 0xd0,0xe0, + 0xd1,0x04, + 0xd7,0x50,//exp_nr_outd_8lsb + 0xd8,0x00, + 0xd9,0x54,//exp_outd_nr_8lsb + 0xda,0x00, + 0xfd,0x00, +#elif defined(CLK24M_72M) + //capture preview night 72M 50hz fix 6FPS maxgain + 0xfd , 0x00, + 0x03 , 0x01, + 0x04 , 0xd4, + 0x05 , 0x00, + 0x06 , 0x00, + 0x07 , 0x00, + 0x08 , 0x00, + 0x09 , 0x05, + 0x0a , 0x66, + 0xf0 , 0x4e, + 0xf1 , 0x00, + 0xfd , 0x01, + 0x90 , 0x10, + 0x92 , 0x01, + 0x98 , 0x4e, + 0x99 , 0x00, + 0x9a , 0x01, + 0x9b , 0x00, + //Status + 0xfd , 0x01, + 0xce , 0xe0, + 0xcf , 0x04, + 0xd0 , 0xe0, + 0xd1 , 0x04, + 0xd7 , 0x50, + 0xd8 , 0x00, + 0xd9 , 0x54, + 0xda , 0x00, + 0xfd , 0x00, +#endif +}; + + +// White Balance +uint8_t sp2518_wb_auto [] = { + 0xfd, 0x01, + 0x28, 0xce, + 0x29, 0x8a, + 0xfd, 0x00, + 0x32, 0x0d, + 0xfd, 0x00, +}; + +uint8_t sp2518_wb_incandescent [] = { + 0xfd,0x00, + 0x32,0x05, + 0xfd,0x01, + 0x28,0x7b, + 0x29,0xd3, + 0xfd,0x00, +}; + +uint8_t sp2518_wb_fluorescent [] = { + 0xfd,0x00, + 0x32,0x05, + 0xfd,0x01, + 0x28,0xb4, + 0x29,0xc4, + 0xfd,0x00, +}; + +uint8_t sp2518_wb_daylight [] = { + 0xfd,0x00, + 0x32,0x05, + 0xfd,0x01, + 0x28,0xc1, + 0x29,0x88, + 0xfd,0x00, +}; + +uint8_t sp2518_wb_cloudy [] = { + 0xfd,0x00, + 0x32,0x05, + 0xfd,0x01, + 0x28,0xe2, + 0x29,0x82, + 0xfd,0x00, +}; + +uint8_t sp2518_wb_tungsten [] = { + 0xfd,0x00, + 0x32,0x05, + 0xfd,0x01, + 0x28,0xae, + 0x29,0xcc, + 0xfd,0x00, +}; + + +// Exposure +uint8_t sp2518_exposure_neg2[] = { + 0xfd,0x00, + 0xdc,0xe0, +}; + +uint8_t sp2518_exposure_neg1[] = { + 0xfd,0x00, + 0xdc,0xf0, +}; + +uint8_t sp2518_exposure_zero[] = { + 0xfd,0x00, + 0xdc,0x00, +}; + +uint8_t sp2518_exposure_pos1[] = { + 0xfd,0x00, + 0xdc,0x10, +}; + +uint8_t sp2518_exposure_pos2[] = { + 0xfd,0x00, + 0xdc,0x20, +}; + + +// Color Effect +uint8_t sp2518_colorfx_none[] = { + 0xfd,0x00, + 0x62,0x00, + 0x63,0x80, + 0x64,0x80, +}; + +uint8_t sp2518_colorfx_bw[] = { + 0xfd,0x00, + 0x62,0x20, + 0x63,0x80, + 0x64,0x80, +}; + +uint8_t sp2518_colorfx_sepia[] = { + 0xfd,0x00, + 0x62,0x10, + 0x63,0xb0, + 0x64,0x40, +}; + +uint8_t sp2518_colorfx_negative[] = { + 0xfd,0x00, + 0x62,0x04, + 0x63,0x80, + 0x64,0x80, +}; + +uint8_t sp2518_colorfx_emboss[] = { + 0xfd,0x00, + 0x62,0x01, + 0x63,0x80, + 0x64,0x80, +}; + +uint8_t sp2518_colorfx_sketch[] = { + 0xfd,0x00, + 0x62,0x40, + 0x63,0x80, + 0x64,0x80, +}; + +uint8_t sp2518_colorfx_sky_blue[] = { + 0xfd,0x00, + 0x62,0x10, + 0x63,0x80, + 0x64,0xb0, +}; + +uint8_t sp2518_colorfx_grass_green[] = { + 0xfd,0x00, + 0x62,0x10, + 0x63,0x50, + 0x64,0x50, +}; + +uint8_t sp2518_colorfx_skin_whiten[] = { +}; + +uint8_t sp2518_colorfx_vivid[] = { +}; + +// Brightness +uint8_t sp2518_brightness_neg4[] = { + 0xfd,0x00, + 0xdc,0xc0, +}; + +uint8_t sp2518_brightness_neg3[] = { + 0xfd,0x00, + 0xdc,0xd0, +}; + +uint8_t sp2518_brightness_neg2[] = { + 0xfd,0x00, + 0xdc,0xe0, +}; + +uint8_t sp2518_brightness_neg1[] = { + 0xfd,0x00, + 0xdc,0xf0, +}; + +uint8_t sp2518_brightness_zero[] = { + 0xfd,0x00, + 0xdc,0x00, +}; + +uint8_t sp2518_brightness_pos1[] = { + 0xfd,0x00, + 0xdc,0x10, +}; + +uint8_t sp2518_brightness_pos2[] = { + 0xfd,0x00, + 0xdc,0x20, +}; + +uint8_t sp2518_brightness_pos3[] = { + 0xfd,0x00, + 0xdc,0x30, +}; + +uint8_t sp2518_brightness_pos4[] = { + 0xfd,0x00, + 0xdc,0x40, +}; + +// Contrast +uint8_t sp2518_contrast_neg4[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde-0x20, +}; + +uint8_t sp2518_contrast_neg3[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde-0x18, +}; + +uint8_t sp2518_contrast_neg2[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde-0x10, +}; + +uint8_t sp2518_contrast_neg1[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde-0x08, +}; + +uint8_t sp2518_contrast_zero[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde, +}; + +uint8_t sp2518_contrast_pos1[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde+0x08, +}; + +uint8_t sp2518_contrast_pos2[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde+0x10, +}; + +uint8_t sp2518_contrast_pos3[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde+0x18, +}; + +uint8_t sp2518_contrast_pos4[] = { + 0xfd,0x00, + 0xde,SP2518_P0_0xde+0x20, +}; + +// Saturation +uint8_t sp2518_saturation_neg4[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3-32, + 0xd4,SP2518_P0_0xd4-32, + 0xd6,SP2518_P0_0xd6-32, + 0xd7,SP2518_P0_0xd7-32, + 0xd8,SP2518_P0_0xd8-32,//UV outdoor + 0xd9,SP2518_P0_0xd9-32,//UV indoor + 0xda,SP2518_P0_0xda-32,//UV dummy + 0xdb,SP2518_P0_0xdb-32,//UV lowlight +}; + +uint8_t sp2518_saturation_neg3[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3-24, + 0xd4,SP2518_P0_0xd4-24, + 0xd6,SP2518_P0_0xd6-24, + 0xd7,SP2518_P0_0xd7-24, + 0xd8,SP2518_P0_0xd8-24,//UV outdoor + 0xd9,SP2518_P0_0xd9-24,//UV indoor + 0xda,SP2518_P0_0xda-24,//UV dummy + 0xdb,SP2518_P0_0xdb-24,//UV lowlight +}; + +uint8_t sp2518_saturation_neg2[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3-16, + 0xd4,SP2518_P0_0xd4-16, + 0xd6,SP2518_P0_0xd6-16, + 0xd7,SP2518_P0_0xd7-16, + 0xd8,SP2518_P0_0xd8-16,//UV outdoor + 0xd9,SP2518_P0_0xd9-16,//UV indoor + 0xda,SP2518_P0_0xda-16,//UV dummy + 0xdb,SP2518_P0_0xdb-16,//UV lowlight +}; + +uint8_t sp2518_saturation_neg1[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3-8, + 0xd4,SP2518_P0_0xd4-8, + 0xd6,SP2518_P0_0xd6-8, + 0xd7,SP2518_P0_0xd7-8, + 0xd8,SP2518_P0_0xd8-8,//UV outdoor + 0xd9,SP2518_P0_0xd9-8,//UV indoor + 0xda,SP2518_P0_0xda-8,//UV dummy + 0xdb,SP2518_P0_0xdb-8,//UV lowlight +}; + +uint8_t sp2518_saturation_zero[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3, + 0xd4,SP2518_P0_0xd4, + 0xd6,SP2518_P0_0xd6, + 0xd7,SP2518_P0_0xd7, + 0xd8,SP2518_P0_0xd8,//UV outdoor + 0xd9,SP2518_P0_0xd9,//UV indoor + 0xda,SP2518_P0_0xda,//UV dummy + 0xdb,SP2518_P0_0xdb,//UV lowlight +}; + +uint8_t sp2518_saturation_pos1[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3+8, + 0xd4,SP2518_P0_0xd4+8, + 0xd6,SP2518_P0_0xd6+8, + 0xd7,SP2518_P0_0xd7+8, + 0xd8,SP2518_P0_0xd8+8,//UV outdoor + 0xd9,SP2518_P0_0xd9+8,//UV indoor + 0xda,SP2518_P0_0xda+8,//UV dummy + 0xdb,SP2518_P0_0xdb+8,//UV lowlight +}; + +uint8_t sp2518_saturation_pos2[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3+16, + 0xd4,SP2518_P0_0xd4+16, + 0xd6,SP2518_P0_0xd6+16, + 0xd7,SP2518_P0_0xd7+16, + 0xd8,SP2518_P0_0xd8+16,//UV outdoor + 0xd9,SP2518_P0_0xd9+16,//UV indoor + 0xda,SP2518_P0_0xda+16,//UV dummy + 0xdb,SP2518_P0_0xdb+16,//UV lowlight +}; + +uint8_t sp2518_saturation_pos3[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3+24, + 0xd4,SP2518_P0_0xd4+24, + 0xd6,SP2518_P0_0xd6+24, + 0xd7,SP2518_P0_0xd7+24, + 0xd8,SP2518_P0_0xd8+24,//UV outdoor + 0xd9,SP2518_P0_0xd9+24,//UV indoor + 0xda,SP2518_P0_0xda+24,//UV dummy + 0xdb,SP2518_P0_0xdb+24,//UV lowlight +}; + +uint8_t sp2518_saturation_pos4[] = { + 0xfd,0x00, + 0xd3,SP2518_P0_0xd3+32, + 0xd4,SP2518_P0_0xd4+32, + 0xd6,SP2518_P0_0xd6+32, + 0xd7,SP2518_P0_0xd7+32, + 0xd8,SP2518_P0_0xd8+32,//UV outdoor + 0xd9,SP2518_P0_0xd9+32,//UV indoor + 0xda,SP2518_P0_0xda+32,//UV dummy + 0xdb,SP2518_P0_0xdb+32,//UV lowlight +}; + + +// Resolution + +// QCIF +uint8_t sp2518_176x144[]={ +}; + +// QVGA +uint8_t sp2518_320x240[]={ +}; + +// CIF +uint8_t sp2518_352x288[]={ +}; + +// VGA +uint8_t sp2518_640_480_regs[]={ + 0xfd,0x00, + + 0x47,0x00, + 0x48,0x00, + 0x49,0x04, + 0x4a,0xb0, + + 0x4b,0x00, + 0x4c,0x00, + 0x4d,0x06, + 0x4e,0x40, + + 0xfd,0x01, + 0x06,0x00, + 0x07,0x50, + 0x08,0x00, + 0x09,0x50, + 0x0a,0x01, //480 + 0x0b,0xe0, + 0x0c,0x02, //640 + 0x0d,0x80, + 0x0e,0x01, + 0xfd,0x00, +}; + +// SVGA +uint8_t sp2518_800_600_regs[]={ + 0xfd,0x00, + + 0x47,0x00, + 0x48,0x00, + 0x49,0x04, + 0x4a,0xb0, + + 0x4b,0x00, + 0x4c,0x00, + 0x4d,0x06, + 0x4e,0x40, + 0xfd,0x01, + 0x06,0x00, + 0x07,0x40, + 0x08,0x00, + 0x09,0x40, + 0x0a,0x02, //600 + 0x0b,0x58, + 0x0c,0x03, //800 + 0x0d,0x20, + 0x0e,0x01, + 0xfd,0x00, +}; + +// XGA +uint8_t sp2518_1024x768[]={ +}; + +// 720p +uint8_t sp2518_1280x720[]={ +}; + +// UXGA +uint8_t sp2518_1600_1200_regs[]={ + 0xfd,0x00, + 0x47,0x00, + 0x48,0x00, + 0x49,0x04, + 0x4a,0xb0, + + 0x4b,0x00, + 0x4c,0x00, + 0x4d,0x06, + 0x4e,0x40, + + 0xfd,0x01, + 0x0e,0x00, + 0xfd,0x00, +}; + +// 1080p +uint8_t sp2518_1920x1080[]={ +}; + +// QXGA +uint8_t sp2518_2048x1536[]={ +}; + +uint8_t sp2518_2592x1944[]={ +}; + +// Initiliztion +uint8_t sp2518_default_regs_init[] = { + 0xfd,0x00, + 0x1b,0x1a,//drv ability + 0x0e,0x01, + + 0x0f,0x2f, + 0x10,0x2e, + 0x11,0x00, + 0x12,0x4f, + 0x14,0x40,// 0x20 zch 20120920 + 0x16,0x02, + 0x17,0x10, + 0x1a,0x1f, + 0x1e,0x81, + 0x21,0x00, + 0x22,0x1b, + 0x25,0x10, + 0x26,0x25, + 0x27,0x6d, + 0x2c,0x23,//31 Ronlus remove balck dot0x45, + 0x2d,0x75, + 0x2e,0x38,//sxga 0x18 + + 0x31,0x10,//mirror upside down + 0x44,0x03, + 0x6f,0x00, + 0xa0,0x04, + 0x5f,0x01, + 0x32,0x00, + 0xfd,0x01, + 0x2c,0x00, + 0x2d,0x00, + 0xfd,0x00, + 0xfb,0x83, + 0xf4,0x09, + //Pregain + 0xfd,0x01, + 0xc6,0x90, + 0xc7,0x90, + 0xc8,0x90, + 0xc9,0x90, + //blacklevel + 0xfd,0x00, + 0x65,0x08, + 0x66,0x08, + 0x67,0x08, + 0x68,0x08, + + //bpc + 0x46,0xff, + //rpc + 0xfd,0x00, + 0xe0,0x6c, + 0xe1,0x54, + 0xe2,0x48, + 0xe3,0x40, + 0xe4,0x40, + 0xe5,0x3e, + 0xe6,0x3e, + 0xe8,0x3a, + 0xe9,0x3a, + 0xea,0x3a, + 0xeb,0x38, + 0xf5,0x38, + 0xf6,0x38, + 0xfd,0x01, + 0x94,0xc0,//f8 + 0x95,0x38, + 0x9c,0x6c, + 0x9d,0x38, +#ifdef CLK24M_48M + #if 0 + //capture preview daylight 48M 50hz fix 9FPS maxgain + 0xfd,0x00, + 0x30,0x04, + 0x03,0x02, + 0x04,0xbe, + 0x09,0x00, + 0x0a,0x64, + 0xf0,0x75, + 0xf1,0x00, + 0xfd,0x01, + 0x90,0x0b, + 0x92,0x01, + 0x98,0x75, + 0x99,0x00, + 0x9a,0x01, + 0x9b,0x00, + + // status + 0xfd,0x01, + 0xce,0x07, + 0xcf,0x05, + 0xd0,0x07, + 0xd1,0x05, + 0xd7,0x77,//exp_nr_outd_8lsb + 0xd8,0x00, + 0xd9,0x7b,//exp_outd_nr_8lsb + 0xda,0x00, + 0xfd,0x00, + #else + //capture preview daylight 48M 50hz fix 8FPS maxgain + 0xfd,0x00, + 0x30,0x04, + 0x03,0x02, + 0x04,0x70, + 0x09,0x00, + 0x0a,0xe4, + 0xf0,0x68, + 0xf1,0x00, + 0xfd,0x01, + 0x90,0x0c, + 0x92,0x01, + 0x98,0x68, + 0x99,0x00, + 0x9a,0x01, + 0x9b,0x00, + + // status + 0xfd,0x01, + 0xce,0xe0, + 0xcf,0x04, + 0xd0,0xe0, + 0xd1,0x04, + 0xd7,0x64,//exp_nr_outd_8lsb + 0xd8,0x00, + 0xd9,0x68,//exp_outd_nr_8lsb + 0xda,0x00, + 0xfd,0x00, + #endif +#elif defined(CLK24M_72M) + //capturepreviewdaylight72M50hz8-13FPSmaxgain + 0xfd,0x00, + 0x30,0x08 + 0x03,0xf6, + 0x04,0xbe, + 0x09,0x00, + 0x0a,0x8b, + 0xf0,0xa9, + 0xf1,0x00, + 0xfd,0x01, + 0x90,0x0c, + 0x92,0x01, + 0x98,0xa9, + 0x99,0x00, + 0x9a,0x01, + 0x9b,0x00, + + //status + 0xfd,0x01, + 0xce,0xec, + 0xcf,0x07, + 0xd0,0xec, + 0xd1,0x07, + 0xd7,0xab,//exp_nr_outd_8lsb + 0xd8,0x00, + 0xd9,0xaf,//exp_outd_nr_8lsb + 0xda,0x00, + 0xfd,0x00, +#endif + +#if 0 + /*24*3pll 8~13fps 50hz*/ + 0xfd , 0x00, + 0x03 , 0x03, + 0x04 , 0xf6, + 0x05 , 0x00, + 0x06 , 0x00, + 0x07 , 0x00, + 0x08 , 0x00, + 0x09 , 0x00, + 0x0a , 0x8b, + 0x2f , 0x00, + 0x30 , 0x08, //0x08 modify by sp_yjp,20120809 + 0xf0 , 0xa9, + 0xf1 , 0x00, + 0xfd , 0x01, + 0x90 , 0x0c, + 0x92 , 0x01, + 0x98 , 0xa9, + 0x99 , 0x00, + 0x9a , 0x01, + 0x9b , 0x00, + + //Status + 0xfd , 0x01, + 0xce , 0xec, + 0xcf , 0x07, + 0xd0 , 0xec, + 0xd1 , 0x07, + 0xd7 , 0xab,//a5 + 0xd8 , 0x00, + 0xd9 , 0xaf,//a9 + 0xda , 0x00, + 0xfd , 0x00, +#endif + + 0xfd,0x01, + 0xca,0x30,//mean dummy2low + 0xcb,0x50,//mean low2dummy + 0xcc,0xc0,//f8;rpc low + 0xcd,0xc0,//rpc dummy + 0xd5,0x80,//mean normal2dummy + 0xd6,0x90,//mean dummy2normal + 0xfd,0x00, + + //lens shading + 0xfd,0x00, + 0xa1,0x20, + 0xa2,0x20, + 0xa3,0x20, + 0xa4,0xff, + 0xa5,0x80, + 0xa6,0x80, + 0xfd,0x01, + 0x64,0x1e,//28 + 0x65,0x1c,//25 + 0x66,0x1c,//2a + 0x67,0x16,//25 + 0x68,0x1c,//25 + 0x69,0x1c,//29 + 0x6a,0x1a,//28 + 0x6b,0x16,//20 + 0x6c,0x1a,//22 + 0x6d,0x1a,//22 + 0x6e,0x1a,//22 + 0x6f,0x16,//1c + 0xb8,0x04,//0a + 0xb9,0x13,//0a + 0xba,0x00,//23 + 0xbb,0x03,//14 + 0xbc,0x03,//08 + 0xbd,0x11,//08 + 0xbe,0x00,//12 + 0xbf,0x02,//00 + 0xc0,0x04,//05 + 0xc1,0x0e,//05 + 0xc2,0x00,//18 + 0xc3,0x05,//08 + //raw filter + 0xfd,0x01, + 0xde,0x0f, + 0xfd,0x00, + 0x57,0x08,//raw_dif_thr + 0x58,0x08,//a + 0x56,0x08,//a + 0x59,0x10, + + 0x5a,0xa0,//raw_rb_fac_outdoor + 0xc4,0xa0,//60raw_rb_fac_indoor + 0x43,0xa0,//40raw_rb_fac_dummy + 0xad,0x40,//raw_rb_fac_low + + 0x4f,0xa0,//raw_gf_fac_outdoor + 0xc3,0xa0,//60raw_gf_fac_indoor + 0x3f,0xa0,//40raw_gf_fac_dummy + 0x42,0x40,//raw_gf_fac_low + 0xc2,0x15, + + 0xb6,0x80,//raw_gflt_fac_outdoor + 0xb7,0x80,//60raw_gflt_fac_normal + 0xb8,0x40,//40raw_gflt_fac_dummy + 0xb9,0x20,//raw_gflt_fac_low + + 0xfd,0x01, + 0x50,0x0c,//raw_grgb_thr + 0x51,0x0c, + 0x52,0x10, + 0x53,0x10, + 0xfd,0x00, + // awb1 + 0xfd,0x01, + 0x11,0x10, + 0x12,0x1f, + 0x16,0x1c, + 0x18,0x00, + 0x19,0x00, + 0x1b,0x96, + 0x1a,0x9a,//95 + 0x1e,0x2f, + 0x1f,0x29, + 0x20,0xff, + 0x22,0xff, + 0x28,0xce, + 0x29,0x8a, + 0xfd,0x00, + 0xe7,0x03, + 0xe7,0x00, + 0xfd,0x01, + 0x2a,0xf0, + 0x2b,0x10, + 0x2e,0x04, + 0x2f,0x18, + 0x21,0x60, + 0x23,0x60, + 0x8b,0xab, + 0x8f,0x12, + //awb2 + 0xfd,0x01, + 0x1a,0x80, + 0x1b,0x80, + 0x43,0x80, + //outdoor + 0x00,0xd4, + 0x01,0xb0, + 0x02,0x90, + 0x03,0x78, + //d65 + 0x35,0xd6,//d6;b0 + 0x36,0xf0,//f0;d1;e9 + 0x37,0x7a,//8a;70 + 0x38,0x9a,//dc;9a;af + //indoor + 0x39,0xab, + 0x3a,0xca, + 0x3b,0xa3, + 0x3c,0xc1, + //f + 0x31,0x82,//7d + 0x32,0xa5,//a0;74 + 0x33,0xd6,//d2 + 0x34,0xec,//e8 + 0x3d,0xa5,//a7;88 + 0x3e,0xc2,//be;bb + 0x3f,0xa7,//b3;ad + 0x40,0xc5,//c5;d0 + //Color Correction + 0xfd,0x01, + 0x1c,0xc0, + 0x1d,0x95, + 0xa0,0xa6,//b8 + 0xa1,0xda,//;d5 + 0xa2,0x00,//;f2 + 0xa3,0x06,//;e8 + 0xa4,0xb2,//;95 + 0xa5,0xc7,//;03 + 0xa6,0x00,//;f2 + 0xa7,0xce,//;c4 + 0xa8,0xb2,//;ca + 0xa9,0x0c,//;3c + 0xaa,0x30,//;03 + 0xab,0x0c,//;0f + 0xac,0xc0,//b8 + 0xad,0xc0,//d5 + 0xae,0x00,//f2 + 0xaf,0xf2,//e8 + 0xb0,0xa6,//95 + 0xb1,0xe8,//03 + 0xb2,0x00,//f2 + 0xb3,0xe7,//c4 + 0xb4,0x99,//ca + 0xb5,0x0c,//3c + 0xb6,0x33,//03 + 0xb7,0x0c,//0f + //Saturation + 0xfd,0x00, + 0xbf,0x01, + 0xbe,0xbb, + 0xc0,0xb0, + 0xc1,0xf0, + + 0xd3,SP2518_P0_0xd3, + 0xd4,SP2518_P0_0xd4, + 0xd6,SP2518_P0_0xd6, + 0xd7,SP2518_P0_0xd7, + 0xd8,SP2518_P0_0xd8,//UV outdoor + 0xd9,SP2518_P0_0xd9,//UV indoor + 0xda,SP2518_P0_0xda,//UV dummy + 0xdb,SP2518_P0_0xdb,//UV lowlight + + //uv_dif + 0xfd,0x00, + 0xf3,0x03, + 0xb0,0x00, + 0xb1,0x23, + //gamma1 + 0xfd,0x00,// + 0x8b,0x0 ,//0 ;0 + 0x8c,0xA ,//14;A + 0x8d,0x13,//24;13 + 0x8e,0x25,//3a;25 + 0x8f,0x43,//59;43 + 0x90,0x5D,//6f;5D + 0x91,0x74,//84;74 + 0x92,0x88,//95;88 + 0x93,0x9A,//a3;9A + 0x94,0xA9,//b1;A9 + 0x95,0xB5,//be;B5 + 0x96,0xC0,//c7;C0 + 0x97,0xCA,//d1;CA + 0x98,0xD4,//d9;D4 + 0x99,0xDD,//e1;DD + 0x9a,0xE6,//e9;E6 + 0x9b,0xEF,//f1;EF + 0xfd,0x01,//01;01 + 0x8d,0xF7,//f9;F7 + 0x8e,0xFF,//ff;FF + //gamma2 + 0xfd,0x00,// + 0x78,0x0 ,//0 + 0x79,0xA ,//14 + 0x7a,0x13,//24 + 0x7b,0x25,//3a + 0x7c,0x43,//59 + 0x7d,0x5D,//6f + 0x7e,0x74,//84 + 0x7f,0x88,//95 + 0x80,0x9A,//a3 + 0x81,0xA9,//b1 + 0x82,0xB5,//be + 0x83,0xC0,//c7 + 0x84,0xCA,//d1 + 0x85,0xD4,//d9 + 0x86,0xDD,//e1 + 0x87,0xE6,//e9 + 0x88,0xEF,//f1 + 0x89,0xF7,//f9 + 0x8a,0xFF,//ff + /*//¹â°ß¹ý¶ÈºÃ + //gamma1 + 0xfd,0x00, + 0x8b,0x00, + 0x8c,0x14, + 0x8d,0x24, + 0x8e,0x3A, + 0x8f,0x59, + 0x90,0x70, + 0x91,0x85, + 0x92,0x96, + 0x93,0xA6, + 0x94,0xB3, + 0x95,0xBE, + 0x96,0xC9, + 0x97,0xD2, + 0x98,0xDB, + 0x99,0xE3, + 0x9a,0xEB, + 0x9b,0xF2, + 0xfd,0x01, + 0x8d,0xF9, + 0x8e,0xFF, + //gamma2 + 0xfd,0x00, + 0x78,0x00, + 0x79,0x14, + 0x7a,0x24, + 0x7b,0x3A, + 0x7c,0x59, + 0x7d,0x70, + 0x7e,0x85, + 0x7f,0x96, + 0x80,0xA6, + 0x81,0xB3, + 0x82,0xBE, + 0x83,0xC9, + 0x84,0xD2, + 0x85,0xDB, + 0x86,0xE3, + 0x87,0xEB, + 0x88,0xF2, + 0x89,0xF9, + 0x8a,0xFF, + */ + //gamma_ae + 0xfd,0x01, + 0x96,0x46, + 0x97,0x14, + 0x9f,0x06, + //HEQ + 0xfd,0x00,// + 0xdd,SP2518_P0_0xdd,//0x80 + 0xde,SP2518_P0_0xde,//a0 + 0xdf,0x80,// + //Ytarget + 0xfd,0x00,// + 0xed,SP2518_P0_0xf7+0x04, + 0xf7,SP2518_P0_0xf7, + 0xf8,SP2518_P0_0xf8, + 0xec,SP2518_P0_0xf8-0x04, + 0xef,SP2518_P0_0xf9+0x04, + 0xf9,SP2518_P0_0xf9, + 0xfa,SP2518_P0_0xfa, + 0xee,SP2518_P0_0xfa-0x04, + + //sharpen + 0xfd,0x01, + 0xdf,0x0f, + 0xe5,0x10, + 0xe7,0x10, + 0xe8,0x20, + 0xec,0x20, + 0xe9,0x20, + 0xed,0x20, + 0xea,0x10, + 0xef,0x10, + 0xeb,0x10, + 0xf0,0x10, + //;gw + 0xfd,0x01,// + 0x70,0x76,// + 0x7b,0x40,// + 0x81,0x30,// + //;Y_offset + 0xfd,0x00, + 0xb2,0X10, + 0xb3,0x1f, + 0xb4,0x30, + 0xb5,0x50, + //;CNR + 0xfd,0x00, + 0x5b,0x20, + 0x61,0x80, + 0x77,0x80, + 0xca,0x80, + //;YNR + 0xab,0x00, + 0xac,0x02, + 0xae,0x08, + 0xaf,0x20, + 0xfd,0x00, + 0x32,0x0d, + 0x33,0xcf,//ef + 0x34,0x7f,//3f + 0x35,0x40,//3 + 0xe7,0x03, + 0xe7,0x00, + + //SP2518_config_window(WINDOW_SIZE_VGA) +#if 0 // + 0xfd,0x00, + 0x4b,0x00, + 0x4c,0x00, + 0x47,0x00, + 0x48,0x00, + 0x4d,0x06, + 0x4e,0x40, + 0x49,0x04, + 0x4a,0xb0, + + 0xfd,0x01, + 0x06,0x00, + 0x07,0x50, + 0x08,0x00, + 0x09,0x50, + 0x0a,0x01, //480 + 0x0b,0xe0, + 0x0c,0x02, //640 + 0x0d,0x80, + 0x0e,0x01, + 0xfd,0x00, +#else //uxga + 0xfd,0x00, + 0x47,0x00, + 0x48,0x00, + 0x49,0x04, + 0x4a,0xb0, + + 0x4b,0x00, + 0x4c,0x00, + 0x4d,0x06, + 0x4e,0x40, + + 0xfd,0x01, + 0x0e,0x00, + 0xfd,0x00, +#endif + 0x36, 0x80, + 0x5d,0x0e,//vsync delay +}; + +// Exit +uint8_t sp2518_default_regs_exit[] = { +}; + +#endif /* #ifndef __SP2518_H_ */ |