From 179a335ede74f613ecb3cea5a3a55eef5a724666 Mon Sep 17 00:00:00 2001 From: zyc Date: Mon, 15 Sep 2014 18:19:44 +0800 Subject: [PATCH] rk312x : cif : cif driver v0.0x1.6 --- .../arm/mach-rockchip/rk_camera_sensor_info.h | 2 +- drivers/media/video/Kconfig | 52 - drivers/media/video/Makefile | 51 +- drivers/media/video/gc0307.c | 2 +- drivers/media/video/gc0308.c | 2 +- drivers/media/video/gc0309.c | 2 +- drivers/media/video/gc0328.c | 2 +- drivers/media/video/gc0329.c | 2 +- drivers/media/video/gc2015.c | 2 +- drivers/media/video/gc2035.c | 2 +- drivers/media/video/gt2005.c | 2 +- drivers/media/video/hm2057.c | 2 +- drivers/media/video/hm5065.c | 2 +- drivers/media/video/mt9p111.c | 2 +- drivers/media/video/nt99160_2way.c | 2 +- drivers/media/video/nt99240_2way.c | 2 +- drivers/media/video/ov2659.c | 2 +- drivers/media/video/ov5640.c | 2 +- drivers/media/video/rk30_camera_oneframe.c | 4 +- drivers/media/video/sp0838.c | 3049 +++++------------ drivers/media/video/sp2518.c | 2 +- 21 files changed, 902 insertions(+), 2288 deletions(-) diff --git a/arch/arm/mach-rockchip/rk_camera_sensor_info.h b/arch/arm/mach-rockchip/rk_camera_sensor_info.h index 9fded1de4377..b37ffdb3e49a 100644 --- a/arch/arm/mach-rockchip/rk_camera_sensor_info.h +++ b/arch/arm/mach-rockchip/rk_camera_sensor_info.h @@ -212,7 +212,7 @@ #define nt99340_I2C_ADDR 0x76 #define sp0718_I2C_ADDR 0x42 -#define sp0838_I2C_ADDR INVALID_VALUE +#define sp0838_I2C_ADDR 0x30 #define sp0a19_I2C_ADDR 0x7a #define sp1628_I2C_ADDR 0x78 #define sp2518_I2C_ADDR 0x60 diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 54ddb6565f7b..4274f0b18ca4 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig @@ -15,57 +15,5 @@ menu "rockchip camera sensor interface driver" tristate "rk30_camera_oneframe" depends on ROCKCHIP_CAMERA_SENSOR_INTERFACE default y - - - config GC0307 - tristate "gc0307,support" - - config GC0308 - tristate "gc0308,support" - - config GC0309 - tristate "gc0309,support" - - config GC0328 - tristate "gc0328,support" - - config GC0329 - tristate "gc0329,support" - default y - - config GC2015 - tristate "gc2015,support" - - config GC2035 - tristate "gc2035,support" - - config GT2005 - tristate "gt2005,support" - - config HM2057 - tristate "hm2057,support" - - config HM5065 - tristate "hm5065,support" - - config MT9P111 - tristate "mt9p111,support" - - config NT99160_2WAY - tristate "nt99160_2way,support" - - config NT99240_2WAY - tristate "nt99240_2way,support" - config OV2659 - tristate "ov2659,support" - default y - - config OV5640 - tristate "ov5640,support" - - - config SP2518 - tristate "sp2518,support" - endmenu diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index 328ed947a5ce..00df4b1e3e58 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile @@ -1,33 +1,18 @@ -obj-$(CONFIG_RK30_CAMERA_ONEFRAME) += rk30_camera_oneframe.o generic_sensor.o - -obj-$(CONFIG_GC0307) += gc0307.o -obj-$(CONFIG_GC0308) += gc0308.o -obj-$(CONFIG_GC0309) += gc0309.o -obj-$(CONFIG_GC0328) += gc0328.o -obj-$(CONFIG_GC0329) += gc0329.o -obj-$(CONFIG_GC2015) += gc2015.o -obj-$(CONFIG_GC2035) += gc2035.o - -obj-$(CONFIG_GT2005) += gt2005.o - -obj-$(CONFIG_HM2057) += hm2057.o -obj-$(CONFIG_HM5065) += hm5065.o - -obj-$(CONFIG_MT9P111) += mt9p111.o - -obj-$(CONFIG_MT9T111) += mt9t111.o - -obj-$(CONFIG_NT99160_2WAY) += nt99160_2way.o - -obj-$(CONFIG_NT99240_2WAY) += nt99240_2way.o - - - - -obj-$(CONFIG_OV2659) += ov2659.o -obj-$(CONFIG_OV5640) += ov5640.o - - -obj-$(CONFIG_SP2518) += sp2518.o - - +obj-$(CONFIG_RK30_CAMERA_ONEFRAME) += rk30_camera_oneframe.o generic_sensor.o \ +gc0307.o \ +gc0308.o \ +gc0309.o \ +gc0328.o \ +gc0329.o \ +gc2015.o \ +gc2035.o \ +gt2005.o \ +hm2057.o \ +hm5065.o \ +mt9p111.o \ +nt99160_2way.o \ +nt99240_2way.o \ +ov2659.o \ +ov5640.o \ +sp0838.o \ +sp2518.o diff --git a/drivers/media/video/gc0307.c b/drivers/media/video/gc0307.c index 3b2e9978c6a6..8e024f00583b 100755 --- a/drivers/media/video/gc0307.c +++ b/drivers/media/video/gc0307.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x99 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 640 #define SENSOR_PREVIEW_H 480 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gc0308.c b/drivers/media/video/gc0308.c index e712f7d7f9ba..93d78ec88e51 100755 --- a/drivers/media/video/gc0308.c +++ b/drivers/media/video/gc0308.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x9b #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 640 #define SENSOR_PREVIEW_H 480 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gc0309.c b/drivers/media/video/gc0309.c index 19633c62c432..7204463605d8 100755 --- a/drivers/media/video/gc0309.c +++ b/drivers/media/video/gc0309.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0xa0 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 640 #define SENSOR_PREVIEW_H 480 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gc0328.c b/drivers/media/video/gc0328.c index fabe6cf2b1b1..55fca1c41507 100755 --- a/drivers/media/video/gc0328.c +++ b/drivers/media/video/gc0328.c @@ -22,7 +22,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x9d #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 640 #define SENSOR_PREVIEW_H 480 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gc0329.c b/drivers/media/video/gc0329.c index 277f592dc9c5..df393d1cae1c 100755 --- a/drivers/media/video/gc0329.c +++ b/drivers/media/video/gc0329.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0xc0 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 640 #define SENSOR_PREVIEW_H 480 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gc2015.c b/drivers/media/video/gc2015.c index 786b35e4fa76..db58e05e323d 100755 --- a/drivers/media/video/gc2015.c +++ b/drivers/media/video/gc2015.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x2005 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gc2035.c b/drivers/media/video/gc2035.c index c39ed4e7f410..ffd401abe502 100755 --- a/drivers/media/video/gc2035.c +++ b/drivers/media/video/gc2035.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x2035 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/gt2005.c b/drivers/media/video/gt2005.c index 3f336250c393..4f2ac72c3fe1 100755 --- a/drivers/media/video/gt2005.c +++ b/drivers/media/video/gt2005.c @@ -21,7 +21,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x5138 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 640 #define SENSOR_PREVIEW_H 480 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/hm2057.c b/drivers/media/video/hm2057.c index 4095e02f0156..15fdecf28af7 100755 --- a/drivers/media/video/hm2057.c +++ b/drivers/media/video/hm2057.c @@ -26,7 +26,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x2056 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/hm5065.c b/drivers/media/video/hm5065.c index a403c51d6877..15283befc376 100755 --- a/drivers/media/video/hm5065.c +++ b/drivers/media/video/hm5065.c @@ -23,7 +23,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x039E #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/mt9p111.c b/drivers/media/video/mt9p111.c index adfa9bb66efc..d94833148cdd 100755 --- a/drivers/media/video/mt9p111.c +++ b/drivers/media/video/mt9p111.c @@ -22,7 +22,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x00 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 576 #define SENSOR_PREVIEW_H 432 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/nt99160_2way.c b/drivers/media/video/nt99160_2way.c index 764343e79366..6ca37e9ab01d 100755 --- a/drivers/media/video/nt99160_2way.c +++ b/drivers/media/video/nt99160_2way.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x1600 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 diff --git a/drivers/media/video/nt99240_2way.c b/drivers/media/video/nt99240_2way.c index 542451ff4533..c19066b7d1fe 100755 --- a/drivers/media/video/nt99240_2way.c +++ b/drivers/media/video/nt99240_2way.c @@ -22,7 +22,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x2400 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/ov2659.c b/drivers/media/video/ov2659.c index 74d28ceda038..4d4573da5a89 100755 --- a/drivers/media/video/ov2659.c +++ b/drivers/media/video/ov2659.c @@ -23,7 +23,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x2656 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/ov5640.c b/drivers/media/video/ov5640.c index db502e91a84f..7d5904001b54 100755 --- a/drivers/media/video/ov5640.c +++ b/drivers/media/video/ov5640.c @@ -25,7 +25,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x5640 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_LOW|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps diff --git a/drivers/media/video/rk30_camera_oneframe.c b/drivers/media/video/rk30_camera_oneframe.c index 68ba342a1777..a001e9eaedfa 100755 --- a/drivers/media/video/rk30_camera_oneframe.c +++ b/drivers/media/video/rk30_camera_oneframe.c @@ -266,8 +266,10 @@ static u32 DISABLE_INVERT_PCLK_CIF1; 1. When cif was at work, the aclk is closed ,may cause bus abnormal ,so sleep 100ms before close aclk *v0.1.5: 1. Improve the code to support all configuration.reset,af,flash... +*v0.1.6: + 1. Delete SOCAM_DATAWIDTH_8 in SENSOR_BUS_PARAM parameters,it conflict with V4L2_MBUS_PCLK_SAMPLE_FALLING. */ -#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 0x5) +#define RK_CAM_VERSION_CODE KERNEL_VERSION(0, 1, 0x6) static int version = RK_CAM_VERSION_CODE; module_param(version, int, S_IRUGO); diff --git a/drivers/media/video/sp0838.c b/drivers/media/video/sp0838.c index 9a19166e9eec..941dcb42e372 100755 --- a/drivers/media/video/sp0838.c +++ b/drivers/media/video/sp0838.c @@ -1,129 +1,125 @@ - +//#include +#include "generic_sensor.h" /* -o* Driver for MT9M001 CMOS Image Sensor from Micron - * - * Copyright (C) 2008, Guennadi Liakhovetski - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int debug=1; -module_param(debug, int, S_IRUGO|S_IWUSR); - -#define dprintk(level, fmt, arg...) do { \ - if (debug >= level) \ - printk(KERN_WARNING fmt , ## arg); } while (0) - -#define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__) -#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__) +* Driver Version Note +*v0.0.1: this driver is compatible with generic_sensor +*v0.1.1: +* add sensor_focus_af_const_pause_usr_cb; +*/ +static int version = KERNEL_VERSION(0,1,1); +module_param(version, int, S_IRUGO); -#define _CONS(a,b) a##b -#define CONS(a,b) _CONS(a,b) -#define __STR(x) #x -#define _STR(x) __STR(x) -#define STR(x) _STR(x) +static int debug; +module_param(debug, int, S_IRUGO|S_IWUSR); -#define MIN(x,y) ((xy) ? x: y) +#define dprintk(level, fmt, arg...) do { \ + if (debug > level) \ + printk(KERN_WARNING fmt , ## arg); } while (0) -/* Sensor Driver Configuration */ +/* Sensor Driver Configuration Begin */ #define SENSOR_NAME RK29_CAM_SENSOR_SP0838 #define SENSOR_V4L2_IDENT V4L2_IDENT_SP0838 #define SENSOR_ID 0x27 -#define SENSOR_ID_REG 0x02 -#define SENSOR_MIN_WIDTH 640//176 -#define SENSOR_MIN_HEIGHT 480//144 -#define SENSOR_MAX_WIDTH 640 -#define SENSOR_MAX_HEIGHT 480 -#define SENSOR_INIT_WIDTH 640 /* Sensor pixel size for sensor_init_data array */ -#define SENSOR_INIT_HEIGHT 480 -#define SENSOR_INIT_WINSEQADR sensor_vga -#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8 - -#define CONFIG_SENSOR_WhiteBalance 1 -#define CONFIG_SENSOR_Brightness 0 -#define CONFIG_SENSOR_Contrast 0 -#define CONFIG_SENSOR_Saturation 0 -#define CONFIG_SENSOR_Effect 1 -#define CONFIG_SENSOR_Scene 1 -#define CONFIG_SENSOR_DigitalZoom 0 -#define CONFIG_SENSOR_Focus 0 -#define CONFIG_SENSOR_Exposure 0 -#define CONFIG_SENSOR_Flash 0 -#define CONFIG_SENSOR_Mirror 0 -#define CONFIG_SENSOR_Flip 0 - -#define CONFIG_SENSOR_I2C_SPEED 100000 ///250000 /* Hz */ -/* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */ -#define CONFIG_SENSOR_I2C_NOSCHED 0 -#define CONFIG_SENSOR_I2C_RDWRCHK 0 - -#define SENSOR_BUS_PARAM (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\ - SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |\ - SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) - -#define COLOR_TEMPERATURE_CLOUDY_DN 6500 -#define COLOR_TEMPERATURE_CLOUDY_UP 8000 -#define COLOR_TEMPERATURE_CLEARDAY_DN 5000 -#define COLOR_TEMPERATURE_CLEARDAY_UP 6500 -#define COLOR_TEMPERATURE_OFFICE_DN 3500 -#define COLOR_TEMPERATURE_OFFICE_UP 5000 -#define COLOR_TEMPERATURE_HOME_DN 2500 -#define COLOR_TEMPERATURE_HOME_UP 3500 +#define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ + V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ + V4L2_MBUS_DATA_ACTIVE_LOW | SOCAM_MCLK_24MHZ) +#define SENSOR_PREVIEW_W 640 +#define SENSOR_PREVIEW_H 480 +#define SENSOR_PREVIEW_FPS 15000 // 15fps +#define SENSOR_FULLRES_L_FPS 7500 // 7.5fps +#define SENSOR_FULLRES_H_FPS 7500 // 7.5fps +#define SENSOR_720P_FPS 0 +#define SENSOR_1080P_FPS 0 + +#define SENSOR_REGISTER_LEN 1 // sensor register address bytes +#define SENSOR_VALUE_LEN 1 // sensor register value bytes + +static unsigned int SensorConfiguration = (CFG_WhiteBalance|CFG_Effect|CFG_Scene); +static unsigned int SensorChipID[] = {SENSOR_ID}; +/* Sensor Driver Configuration End */ + #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a)) #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a) -#define SENSOR_AF_IS_ERR (0x00<<0) -#define SENSOR_AF_IS_OK (0x01<<0) -#define SENSOR_INIT_IS_ERR (0x00<<28) -#define SENSOR_INIT_IS_OK (0x01<<28) +#define SensorRegVal(a,b) CONS4(SensorReg,SENSOR_REGISTER_LEN,Val,SENSOR_VALUE_LEN)(a,b) +#define sensor_write(client,reg,v) CONS4(sensor_write_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v)) +#define sensor_read(client,reg,v) CONS4(sensor_read_reg,SENSOR_REGISTER_LEN,val,SENSOR_VALUE_LEN)(client,(reg),(v)) +#define sensor_write_array generic_sensor_write_array +struct sensor_parameter +{ + unsigned int PreviewDummyPixels; + unsigned int CaptureDummyPixels; + unsigned int preview_exposure; + unsigned short int preview_line_width; + unsigned short int preview_gain; -//HEQ -#define Pre_Value_P0_0xdd 0x70 -#define Pre_Value_P0_0xde 0x90 + unsigned short int PreviewPclk; + unsigned short int CapturePclk; + char awb[6]; +}; +struct specific_sensor{ + struct generic_sensor common_sensor; + //define user data below + struct sensor_parameter parameter; -struct reginfo -{ - u8 reg; - u8 val; }; -///=========sp0838-modify by sp_yjp,20120529================= -/* init 640X480 VGA */ -static struct reginfo sensor_init_data[] = + +#ifndef SP0838_MIRROR +#define SP0838_MIRROR 0 +#endif +#ifndef SP0838_FLIP +#define SP0838_FLIP 0 +#endif +/* +* The follow setting need been filled. +* +* Must Filled: +* sensor_init_data : Sensor initial setting; +* sensor_fullres_lowfps_data : Sensor full resolution setting with best auality, recommand for video; +* sensor_preview_data : Sensor preview resolution setting, recommand it is vga or svga; +* sensor_softreset_data : Sensor software reset register; +* sensor_check_id_data : Sensir chip id register; +* +* Optional filled: +* sensor_fullres_highfps_data: Sensor full resolution setting with high framerate, recommand for video; +* sensor_720p: Sensor 720p setting, it is for video; +* sensor_1080p: Sensor 1080p setting, it is for video; +* +* :::::WARNING::::: +* The SensorEnd which is the setting end flag must be filled int the last of each setting; +*/ + +/* Sensor initial setting *//* init 640X480 VGA */ +static struct rk_sensor_reg sensor_init_data[] = { {0xfd , 0x00}, //P0 {0x1B , 0x02}, - {0x1C , 0x07}, //add by sp_yjp,bit2: driver ability set(8mA) - +#ifdef SP0838_FRONT_DRVCAP + {0x1C , 0x03}, //add by sp_yjp,bit2: driver ability set(8mA) +#else + {0x1C , 0x07}, +#endif + {0x30 , 0x02},// 1/2ispclk {0x27 , 0xe8}, {0x28 , 0x0b}, // 0x0B pzt 2012-7-26 {0x32 , 0x00}, {0x22 , 0xc0}, {0x26 , 0x10}, - {0x31 , 0x70},//0x10}, //Upside/mirr/Pclk inv/sub + {0x31 , 0x10|(SP0838_FLIP<<6)|(SP0838_MIRROR<<5)},//0x10}, //Upside/mirr/Pclk inv/sub {0x5f , 0x11}, //Bayer order {0xfd , 0x01}, //P1 +//{0x20 , 0x68}, +//{0x21 , 0x68}, +//{0x22 , 0x7f}, +//{0x23 , 0x30}, + + {0x25 , 0x1a}, //Awb start {0x26 , 0xfb}, {0x28 , 0x75}, @@ -166,36 +162,40 @@ static struct reginfo sensor_init_data[] = {0x53 , 0x00}, {0x54 , 0x00}, {0x55 , 0x10}, //BPC debug end - {0x4f , 0x08}, //blueedge - {0x50 , 0x08}, + {0x4f , 0xff}, //blueedge + {0x50 , 0xff}, {0x57 , 0x10}, //Raw filter debut start {0x58 , 0x10}, {0x59 , 0x10}, {0x56 , 0x71}, //0x70 modify by sp_yjp,20120613 - {0x5a , 0x05}, //{0x5a , 0x02}, //0x05 modify by sp_yjp,20120613 - {0x5b , 0x06},// {0x5b , 0x02}, //0x05 modify by sp_yjp,20120613 + + {0x5a , 0x06}, //{0x5a , 0x02}, //0x05 modify by sp_yjp,20130709 + {0x5b , 0x08},// {0x5b , 0x02}, //0x06 modify by sp_yjp,20130709 {0x5c , 0x30}, //Raw filter debut end //0x20 modify by sp_yjp,20120613 - {0x65 , 0x03}, //Sharpness debug start + {0x65 , 0x04}, //Sharpness debug start //0x03 modify by sp_yjp,20130709 {0x66 , 0x01}, // {0x66 , 0x01},sp_wyq - {0x67 , 0x02},// {0x67 , 0x03}, //0x05 //modify by sp_yjp,20120613 - {0x68 , 0x42},// {0x68 , 0x46},//0x46 zch 20120725 + {0x67 , 0x08},// {0x67 , 0x03}, //0x05 //modify by sp_yjp,20120613 + {0x68 , 0x46},// {0x68 , 0x46},//0x46 zch 20120725 + {0x69 , 0x7f}, {0x6a , 0x01}, - {0x6b , 0x06},//{0x6b , 0x04}, + + {0x6b , 0x04},//{0x6b , 0x04}, //0x06 modify by sp_yjp,20130709 {0x6c , 0x01}, - {0x6d , 0x02}, //Edge gain normal {0x6d , 0x03}, //0x05 //modify by sp_yjp,20120613 - {0x6e , 0x42}, //Edge gain normal {0x6e , 0x46}, //0x46 zch 20120725 + {0x6d , 0x06}, //Edge gain normal {0x6d , 0x03}, //0x05 //modify by sp_yjp,20120613 + {0x6e , 0x46}, //Edge gain normal {0x6e , 0x46}, //0x46 zch 20120725 + {0x6f , 0x7f}, {0x70 , 0x01}, - {0x71 , 0x09}, //?�����ֵ - {0x72 , 0x01}, //�??����?? - {0x73 , 0x03}, //? //0x05 //modify by sp_yjp,20120613 - {0x74 , 0x43}, //??//0x47? //modify by sp_yjp,20120613 + {0x71 , 0x0a}, //ï�����ֵ//0x09 modify by sp_yjp,20130709 + {0x72 , 0x01}, //�ï½ï¿½ï¿½ï¿½ï¿½Ö? + {0x73 , 0x02}, //? //0x05 //modify by sp_yjp,20120613 + {0x74 , 0x43}, //ï¿//0x47? //modify by sp_yjp,20120613 - {0x75 , 0x7f}, //ʹ??????λ + {0x75 , 0x7f}, //ʹÿ¿½ÿ¿½Î» {0x76 , 0x01}, //Sharpness debug end {0xcb , 0x07}, //HEQ&Saturation debug start {0xcc , 0x04}, @@ -208,20 +208,58 @@ static struct reginfo sensor_init_data[] = {0xd4 , 0x00}, {0xd6 , 0x1c}, {0xd7 , 0x16}, - {0xdd , 0x70}, //Contrast //0x70 //modify by sp_yjp,20120613 - {0xde , 0x90}, //HEQ&Saturation debug end //0x90 //modify by sp_yjp,20120613 - {0x7f , 0xd7}, //Color Correction start + {0xdc , 0x08}, + {0xdd , 0x70}, //Contrast //0x70 //modify by sp_yjp,20130709 + {0xde , 0xa0}, //HEQ&Saturation debug end //0x90 //modify by sp_yjp,20130709 + + #if 0 + {0x7f , 0xe1}, //Color Correction start {0x80 , 0xbc}, - {0x81 , 0xed}, + {0x81 , 0xe3}, {0x82 , 0xd7}, - {0x83 , 0xd4}, - {0x84 , 0xd6}, + {0x83 , 0xd5}, + {0x84 , 0xd4}, {0x85 , 0xff}, {0x86 , 0x89}, {0x87 , 0xf8}, {0x88 , 0x3c}, {0x89 , 0x33}, - {0x8a , 0x0f}, //Color Correction end + {0x8a , 0x0f}, //Color Correction end + #endif + + +#if 0//ÉÔºì + {0x7f , 0xee}, //Color Correction start + {0x80 , 0xc9}, + {0x81 , 0xc9}, + {0x82 , 0xd7}, + {0x83 , 0xe5}, + {0x84 , 0xc4}, + {0x85 , 0x07}, + {0x86 , 0x9a}, + {0x87 , 0xde}, + {0x88 , 0x3c}, + {0x89 , 0x33}, + {0x8a , 0x0c}, //Color Correction end +#endif + + +#if 1 +{0x7f , 0xf4},//0xed//0xe1 //Color Correction start +{0x80 , 0xbc},//0xbc//0xbc +{0x81 , 0xd0},//0xd7//0xe3 +{0x82 , 0xbe},//0xbe//0xd7 +{0x83 , 0xd5},//0xd5//0xd5 +{0x84 , 0xee},//0xee//0xd4 +{0x85 , 0xec},//0xf3//0xff +{0x86 , 0xb6},//0xaf//0x89 +{0x87 , 0xde},//0xdf//0xf8 +{0x88 , 0x3c},//0x3c//0x3c +{0x89 , 0x33},//0x33//0x33 +{0x8a , 0x0f},//0x0f//0x0f //Color Correction end +#endif + + {0x8b , 0x00}, //gamma start {0x8c , 0x1a}, {0x8d , 0x29}, @@ -235,19 +273,28 @@ static struct reginfo sensor_init_data[] = {0x95 , 0xc5}, {0x96 , 0xcd}, {0x97 , 0xd5}, - {0x98 , 0xdd}, - {0x99 , 0xe5}, - {0x9a , 0xed}, - {0x9b , 0xf5}, + {0x98 , 0xda}, + {0x99 , 0xe3}, + {0x9a , 0xe8}, + {0x9b , 0xf0}, {0xfd , 0x01}, //P1 - {0x8d , 0xfd}, - {0x8e , 0xff}, //gamma end + {0x8d , 0xf6}, + {0x8e , 0xfa}, //gamma end {0xfd , 0x00}, //P0 {0xca , 0xcf}, - {0xd8 , 0x48}, //UV outdoor - {0xd9 , 0x48}, //UV indoor - {0xda , 0x40}, //UV dummy //0x48 //modify by sp_yjp,20120613 - {0xdb , 0x38}, //UV lowlight //0x48 //modify by sp_yjp,20120613 + + #if 0 + {0xd8 , 0x58}, //UV outdoor + {0xd9 , 0x58}, //UV indoor + {0xda , 0x50}, //UV dummy //0x48 //modify by sp_yjp,20120613 + {0xdb , 0x40}, //UV lowlight //0x48 //modify by sp_yjp,20120613 + #else + {0xd8 , 0x58}, //UV outdoor + {0xd9 , 0x58}, //UV indoor + {0xda , 0x50}, //UV dummy //0x48 //modify by sp_yjp,20120613 + {0xdb , 0x50}, //UV lowlight //0x48 //modify by sp_yjp,20120613 + #endif + {0xb9 , 0x00}, //Ygamma start {0xba , 0x04}, {0xbb , 0x08}, @@ -280,10 +327,17 @@ static struct reginfo sensor_init_data[] = ///{0xf9 , 0x68}, //AE target ///{0xfa , 0x53}, - {0xf7 , 0x80}, //AE target //modify by sp_yjp,20120613 + #if 1 + {0xf7 , 0x88}, //AE target //modify by sp_yjp,20130709 + {0xf8 , 0x73}, + {0xf9 , 0x78}, //AE target + {0xfa , 0x63}, + #else + {0xf7 , 0x80}, //AE target //modify by sp_yjp,20120613 {0xf8 , 0x6b}, {0xf9 , 0x70}, //AE target {0xfa , 0x5b}, + #endif {0xfd , 0x01}, //P1 {0x09 , 0x31}, //AE Step 3.0 @@ -292,9 +346,9 @@ static struct reginfo sensor_init_data[] = {0x14 , 0x20}, {0x15 , 0x0f}, -/* - #if 0//24M 1div 50HZ 16-8fps //modify by sp_yjp,20120613 - {0xfd , 0x00}, + /* +#if 0//24M 1div 50HZ 16-8fps //modify by sp_yjp,20120613 + {0xfd , 0x00}, {0x05 , 0x0 }, {0x06 , 0x0 }, {0x09 , 0x2 }, @@ -331,7 +385,7 @@ static struct reginfo sensor_init_data[] = {0xca , 0x70}, //0x70 {0xcb , 0xc }, {0xfd , 0x00}, - #else//caprure preview daylight 24M 50hz 20-8FPS maxgain:0x70 +#else//caprure preview daylight 24M 50hz 20-8FPS maxgain:0x70 {0xfd , 0x00}, {0x05 , 0x0 }, {0x06 , 0x0 }, @@ -370,31 +424,29 @@ static struct reginfo sensor_init_data[] = {0xcb , 0xc }, {0xfd , 0x00}, #endif -*/ -#if 1//zch 20120725 - //caprure preview daylight 24M 50hz 20-10FPS maxgain:0x70 + */ + #if 0//zch 20130709 + //caprure preview daylight 24M 50hz 15-10FPS maxgain:0x68 {0xfd,0x00}, {0x05,0x00}, {0x06,0x00}, - {0x07,0x00}, - {0x08,0x00}, - {0x09,0x01}, - {0x0a,0x76}, - {0xf0,0x62}, + {0x09,0x03}, + {0x0a,0x04}, + {0xf0,0x4a}, {0xf1,0x00}, - {0xf2,0x5f}, - {0xf5,0x78}, + {0xf2,0x59}, + {0xf5,0x72}, {0xfd,0x01}, - {0x00,0xae}, - {0x0f,0x60}, - {0x16,0x60}, - {0x17,0x9e}, - {0x18,0xa6}, - {0x1b,0x60}, - {0x1c,0xa6}, + {0x00,0xa0}, + {0x0f,0x5a}, + {0x16,0x5a}, + {0x17,0x98}, + {0x18,0xa0}, + {0x1b,0x5a}, + {0x1c,0xa0}, {0xb4,0x20}, {0xb5,0x3a}, - {0xb6,0x5e}, + {0xb6,0x46}, {0xb9,0x40}, {0xba,0x4f}, {0xbb,0x47}, @@ -405,496 +457,562 @@ static struct reginfo sensor_init_data[] = {0xc0,0x42}, {0xc1,0x41}, {0xc2,0x41}, - {0xc3,0x70}, + {0xc3,0x68}, {0xc4,0x41}, {0xc5,0x41}, {0xc6,0x41}, - {0xca,0x70}, + {0xca,0x68}, {0xcb,0x0a}, + {0xfd,0x00}, + #endif + + #if 0//2/1/2 ISP9-12fps + {0xfd,0x00}, + {0x05,0x00}, + {0x06,0x00}, + {0x09,0x00}, + {0x0a,0xa7}, + {0xf0,0x3b}, + {0xf1,0x00}, + {0xf2,0x56}, + {0xf5,0x6f}, + {0xfd,0x01}, + {0x00,0xa9}, + {0x0f,0x57}, + {0x16,0x57}, + {0x17,0x99}, + {0x18,0xa1}, + {0x1b,0x57}, + {0x1c,0xa1}, + {0xb4,0x21}, + {0xb5,0x39}, + {0xb6,0x39}, + {0xb9,0x40}, + {0xba,0x4f}, + {0xbb,0x47}, + {0xbc,0x45}, + {0xbd,0x43}, + {0xbe,0x42}, + {0xbf,0x42}, + {0xc0,0x42}, + {0xc1,0x41}, + {0xc2,0x41}, + {0xc3,0x41}, + {0xc4,0x41}, + {0xc5,0x70}, + {0xc6,0x41}, + {0xca,0x70}, + {0xcb,0x0c}, + {0xfd,0x00}, + + #endif + +#if 0//10-12fps +{0xfd,0x00}, +{0x05,0x00}, +{0x06,0x00}, +{0x09,0x00}, +{0x0a,0xa7}, +{0xf0,0x3b}, +{0xf1,0x00}, +{0xf2,0x56}, +{0xf5,0x6f}, +{0xfd,0x01}, +{0x00,0xa7}, +{0x0f,0x57}, +{0x16,0x57}, +{0x17,0x97}, +{0x18,0x9f}, +{0x1b,0x57}, +{0x1c,0x9f}, +{0xb4,0x21}, +{0xb5,0x39}, +{0xb6,0x39}, +{0xb9,0x40}, +{0xba,0x4f}, +{0xbb,0x47}, +{0xbc,0x45}, +{0xbd,0x43}, +{0xbe,0x42}, +{0xbf,0x42}, +{0xc0,0x42}, +{0xc1,0x41}, +{0xc2,0x41}, +{0xc3,0x41}, +{0xc4,0x70}, +{0xc5,0x41}, +{0xc6,0x41}, +{0xca,0x70}, +{0xcb,0x0b}, +{0xfd,0x00}, + #endif + +#if 1 +//sensor AE settings:6-11fps +{0xfd,0x00}, +{0x05,0x00}, +{0x06,0x00}, +{0x09,0x01}, +{0x0a,0x05}, +{0xf0,0x36}, +{0xf1,0x00}, +{0xf2,0x53}, +{0xf5,0x6c}, +{0xfd,0x01}, +{0x00,0x9c}, +{0x0f,0x54}, +{0x16,0x54}, +{0x17,0x9c}, +{0x18,0x00}, +{0x1b,0x54}, +{0x1c,0x43}, +{0xb4,0x20}, +{0xb5,0x34}, +{0xb6,0x34}, +{0xb9,0x40}, +{0xba,0x4f}, +{0xbb,0x47}, +{0xbc,0x45}, +{0xbd,0x43}, +{0xbe,0x42}, +{0xbf,0x42}, +{0xc0,0x42}, +{0xc1,0x41}, +{0xc2,0x41}, +{0xc3,0x41}, +{0xc4,0x41}, +{0xc5,0x41}, +{0xc6,0x41}, +{0xca,0x60}, +{0xcb,0x10}, +{0xfd,0x00}, +#endif + //added by yaowei@2013-06-05 + //{0xfd,0x00}, //P0 + //{0xd9,0x55}, + //{0xda,0x55}, + //{0xdb,0x55}, + //{0xdc,0xe0}, + + {0xfd , 0x00}, //P0 {0x32 , 0x15}, //Auto_mode set {0x34 , 0x66}, //Isp_mode set {0x35 , 0x40}, //out format {0xfd , 0x00}, //P0 - {0xff , 0xff} //out format + SensorEnd }; -///=========sp0838-modify by sp_yjp,20120529================= +/* Senor full resolution setting: recommand for capture */ +static struct rk_sensor_reg sensor_fullres_lowfps_data[] ={ -/* 1280X1024 SXGA */ -static struct reginfo sensor_sxga[] = -{ - {0x00, 0x00}//,{0xff,0xff} + {0x47, 0x00}, + {0x48, 0x00}, + {0x49, 0x01}, + {0x4a, 0xe0}, + {0x4b, 0x00}, + {0x4c, 0x00}, + {0x4d, 0x02}, + {0x4e, 0x80}, + SensorEnd }; - -/* 800X600 SVGA*/ -static struct reginfo sensor_svga[] = -{ - {0x00, 0x00}//,{0xff,0xff} +/* Senor full resolution setting: recommand for video */ +static struct rk_sensor_reg sensor_fullres_highfps_data[] ={ + SensorEnd }; - -/* 640X480 VGA */ -static struct reginfo sensor_vga[] = +/* Preview resolution setting*/ +static struct rk_sensor_reg sensor_preview_data[] = { {0x47, 0x00}, {0x48, 0x00}, {0x49, 0x01}, - {0x4a, 0xe0}, //e0 + {0x4a, 0xe0}, {0x4b, 0x00}, {0x4c, 0x00}, {0x4d, 0x02}, {0x4e, 0x80}, - {0xfd, 0x00},{0xff,0xff} -}; -///=========sp0838-modify by sp_yjp,20120529================= -/* 352X288 CIF */ -static struct reginfo sensor_cif[] = -{ - {0x00, 0x00}//,{0xff,0xff} + SensorEnd }; - -/* 320*240 QVGA */ -static struct reginfo sensor_qvga[] = -{ - {0x00, 0x00}//,{0xff,0xff} +/* 1280x720 */ +static struct rk_sensor_reg sensor_720p[]={ + SensorEnd }; -/* 176X144 QCIF*/ -static struct reginfo sensor_qcif[] = -{ - {0x00, 0x00}//,{0xff,0xff} +/* 1920x1080 */ +static struct rk_sensor_reg sensor_1080p[]={ + SensorEnd }; -static struct reginfo sensor_ClrFmt_YUYV[]= -{ - {0xfd, 0x00},{0xff,0xff} + +static struct rk_sensor_reg sensor_softreset_data[]={ + SensorEnd }; -static struct reginfo sensor_ClrFmt_UYVY[]= -{ - {0xfd, 0x00},{0xff,0xff} +static struct rk_sensor_reg sensor_check_id_data[]={ + SensorRegVal(0x02,0x27), + SensorEnd }; ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_WhiteBalance -static struct reginfo sensor_WhiteB_Auto[]= +static struct rk_sensor_reg sensor_WhiteB_Auto[]= { - //sp0838_reg_WB_auto �Զ� + //sp0838_reg_WB_auto �Զ� {0xfd, 0x01}, {0x28, 0x75}, {0x29, 0x4e}, {0xfd, 0x00}, // AUTO 3000K~7000K {0x32, 0x15}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; /* Cloudy Colour Temperature : 6500K - 8000K */ -static struct reginfo sensor_WhiteB_Cloudy[]= +static struct rk_sensor_reg sensor_WhiteB_Cloudy[]= { - // sp0838_reg_WB_auto ���� + // sp0838_reg_WB_auto ���� {0xfd, 0x00}, {0x32, 0x05}, {0xfd, 0x01}, {0x28, 0x71}, {0x29, 0x41}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; /* ClearDay Colour Temperature : 5000K - 6500K */ -static struct reginfo sensor_WhiteB_ClearDay[]= +static struct rk_sensor_reg sensor_WhiteB_ClearDay[]= { //Sunny - // sp0838_reg_WB_auto ���� + // sp0838_reg_WB_auto ���� {0xfd, 0x00}, {0x32, 0x05}, {0xfd, 0x01}, {0x28, 0x6b}, {0x29, 0x48}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; /* Office Colour Temperature : 3500K - 5000K */ -static struct reginfo sensor_WhiteB_TungstenLamp1[]= +static struct rk_sensor_reg sensor_WhiteB_TungstenLamp1[]= { //Office - //sp0838_reg_WB_auto ӫ���� - {0xfd, 0x00}, - {0x32, 0x05}, - {0xfd, 0x01}, - {0x28, 0x5a}, - {0x29, 0x62}, - {0xfd, 0x00},{0xff,0xff} - + //sp0838_reg_WB_auto ӫ���� + {0xfd, 0x00}, + {0x32, 0x05}, + {0xfd, 0x01}, + {0x28, 0x41}, + {0x29, 0x71}, + {0xfd, 0x00}, + SensorEnd }; /* Home Colour Temperature : 2500K - 3500K */ -static struct reginfo sensor_WhiteB_TungstenLamp2[]= +static struct rk_sensor_reg sensor_WhiteB_TungstenLamp2[]= { //Home - //sp0838_reg_WB_auto �׳��� - {0xfd, 0x00}, - {0x32, 0x05}, - {0xfd, 0x01}, - {0x28, 0x41}, - {0x29, 0x71}, - {0xfd, 0x00},{0xff,0xff} + //sp0838_reg_WB_auto �׳��� + {0xfd, 0x00}, + {0x32, 0x05}, + {0xfd, 0x01}, + {0x28, 0x5a}, + {0x29, 0x62}, + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2, +static struct rk_sensor_reg *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2, sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL, }; -#endif - ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Brightness -static struct reginfo sensor_Brightness0[]= +static struct rk_sensor_reg sensor_Brightness0[]= { // Brightness -2 {0xfd, 0x00}, {0xdc, 0xe0}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Brightness1[]= +static struct rk_sensor_reg sensor_Brightness1[]= { // Brightness -1 {0xfd, 0x00}, {0xdc, 0xf0}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Brightness2[]= +static struct rk_sensor_reg sensor_Brightness2[]= { // Brightness 0 {0xfd, 0x00}, - {0xdc, 0x00}, - {0xfd, 0x00},{0xff,0xff} + {0xdc, 0x10}, + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Brightness3[]= +static struct rk_sensor_reg sensor_Brightness3[]= { // Brightness +1 {0xfd, 0x00}, {0xdc, 0x10}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Brightness4[]= +static struct rk_sensor_reg sensor_Brightness4[]= { // Brightness +2 {0xfd, 0x00}, {0xdc, 0x20}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Brightness5[]= +static struct rk_sensor_reg sensor_Brightness5[]= { // Brightness +3 {0xfd, 0x00}, {0xdc, 0x30}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3, +static struct rk_sensor_reg *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3, sensor_Brightness4, sensor_Brightness5,NULL, }; -#endif - ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Effect -static struct reginfo sensor_Effect_Normal[] = +static struct rk_sensor_reg sensor_Effect_Normal[] = { {0xfd, 0x00}, {0x62, 0x00}, {0x63, 0x80}, {0x64, 0x80}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Effect_WandB[] = +static struct rk_sensor_reg sensor_Effect_WandB[] = { {0xfd, 0x00}, {0x62, 0x40}, {0x63, 0x80}, {0x64, 0x80}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Effect_Sepia[] = +static struct rk_sensor_reg sensor_Effect_Sepia[] = { {0xfd, 0x00}, {0x62, 0x20}, {0x63, 0xc0}, {0x64, 0x20}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Effect_Negative[] = +static struct rk_sensor_reg sensor_Effect_Negative[] = { //Negative {0xfd, 0x00}, {0x62, 0x10}, {0x63, 0x80}, {0x64, 0x80}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Effect_Bluish[] = +static struct rk_sensor_reg sensor_Effect_Bluish[] = { // Bluish {0xfd, 0x00}, {0x62, 0x20}, {0x63, 0x20}, {0x64, 0xf0}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Effect_Green[] = +static struct rk_sensor_reg sensor_Effect_Green[] = { // Greenish {0xfd, 0x00}, {0x62, 0x20}, {0x63, 0x20}, {0x64, 0x20}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia, +static struct rk_sensor_reg *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia, sensor_Effect_Bluish, sensor_Effect_Green,NULL, }; -#endif ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Exposure -static struct reginfo sensor_Exposure0[]= +static struct rk_sensor_reg sensor_Exposure0[]= { {0xfd, 0x00}, {0xdc, 0xd0}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Exposure1[]= +static struct rk_sensor_reg sensor_Exposure1[]= { {0xfd, 0x00}, {0xdc, 0xe0}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Exposure2[]= +static struct rk_sensor_reg sensor_Exposure2[]= { {0xfd, 0x00}, {0xdc, 0xf0}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Exposure3[]= +static struct rk_sensor_reg sensor_Exposure3[]= { {0xfd, 0x00}, - {0xdc, 0x00}, - {0xfd, 0x00},{0xff,0xff} + {0xdc, 0x10}, + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Exposure4[]= +static struct rk_sensor_reg sensor_Exposure4[]= { {0xfd, 0x00}, {0xdc, 0x10}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Exposure5[]= +static struct rk_sensor_reg sensor_Exposure5[]= { {0xfd, 0x00}, {0xdc, 0x20}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_Exposure6[]= +static struct rk_sensor_reg sensor_Exposure6[]= { {0xfd, 0x00}, {0xdc, 0x30}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3, +static struct rk_sensor_reg *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3, sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL, }; -#endif ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Saturation -static struct reginfo sensor_Saturation0[]= +static struct rk_sensor_reg sensor_Saturation0[]= { - {0xfd, 0x00},{0xff,0xff} + SensorEnd }; -static struct reginfo sensor_Saturation1[]= +static struct rk_sensor_reg sensor_Saturation1[]= { - {0xfd, 0x00},{0xff,0xff} + SensorEnd }; -static struct reginfo sensor_Saturation2[]= +static struct rk_sensor_reg sensor_Saturation2[]= { - {0xfd, 0x00},{0xff,0xff} + SensorEnd }; -static struct reginfo *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,}; - -#endif +static struct rk_sensor_reg *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,}; ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Contrast -static struct reginfo sensor_Contrast0[]= +static struct rk_sensor_reg sensor_Contrast0[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd-0x30}, //level -3 - {0xde, Pre_Value_P0_0xde-0x30}, - {0xfd, 0x00},{0xff,0xff} + SensorEnd }; -static struct reginfo sensor_Contrast1[]= +static struct rk_sensor_reg sensor_Contrast1[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd-0x20}, //level -2 - {0xde, Pre_Value_P0_0xde-0x20}, - {0xfd, 0x00},{0xff,0xff} + SensorEnd }; -static struct reginfo sensor_Contrast2[]= +static struct rk_sensor_reg sensor_Contrast2[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd-0x10}, //level -1 - {0xde, Pre_Value_P0_0xde-0x10}, - {0xfd, 0x00},{0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Contrast3[]= +static struct rk_sensor_reg sensor_Contrast3[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd}, //level 0 - {0xde, Pre_Value_P0_0xde}, - {0xfd, 0x00},{0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Contrast4[]= +static struct rk_sensor_reg sensor_Contrast4[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd+0x10}, //level +1 - {0xde, Pre_Value_P0_0xde+0x10}, - {0xfd, 0x00},{0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Contrast5[]= +static struct rk_sensor_reg sensor_Contrast5[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd+0x20}, //level +2 - {0xde, Pre_Value_P0_0xde+0x20} - {0xfd, 0x00},{0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Contrast6[]= +static struct rk_sensor_reg sensor_Contrast6[]= { - {0xfd, 0x00}, - {0xdd, Pre_Value_P0_0xdd+0x30}, //level +-3 - {0xde, Pre_Value_P0_0xde+0x30} - {0xfd, 0x00},{0xff,0xff} +SensorEnd }; -static struct reginfo *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3, +static struct rk_sensor_reg *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3, sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL, }; -#endif - +/* ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Mirror -static struct reginfo sensor_MirrorOn[]= +static struct rk_sensor_reg sensor_MirrorOn[]= { {0xfd, 0x00}, //page 0 {0x31, 0x30}, //bit6:flip bit5:mirror bit4:pclk - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_MirrorOff[]= +static struct rk_sensor_reg sensor_MirrorOff[]= { {0xfd, 0x00}, //page 0 {0x31, 0x10}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,}; -#endif -#if CONFIG_SENSOR_Flip -static struct reginfo sensor_FlipOn[]= +//static struct rk_sensor_reg *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,}; + +static struct rk_sensor_reg sensor_FlipOn[]= { {0xfd, 0x00}, //page 0 {0x31, 0x50}, - {0xfd, 0x00},{0xff,0xff} + {0xfd, 0x00}, + SensorEnd }; -static struct reginfo sensor_FlipOff[]= +static struct rk_sensor_reg sensor_FlipOff[]= { {0xfd, 0x00}, //page 0 {0x31, 0x10}, - {0xfd, 0x00},{0xff,0xff} -}; -static struct reginfo *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,}; - -#endif + {0xfd, 0x00}, + SensorEnd +};*/ +//static struct rk_sensor_reg *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,}; ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_Scene//? zch -static struct reginfo sensor_SceneAuto[] = + +static struct rk_sensor_reg sensor_SceneAuto[] = { #if 0 - //caprure preview daylight 24M 50hz 20-8FPS maxgain:0x70 - {0xfd,0x00}, - {0x05,0x0 }, - {0x06,0x0 }, - {0x07,0x0 }, - {0x08,0x0 }, - {0x09,0x1 }, - {0x0a,0x76}, - {0xf0,0x62}, - {0xf1,0x0 }, - {0xf2,0x5f}, - {0xf5,0x78}, - {0xfd,0x01}, - {0x00,0xb2}, - {0x0f,0x60}, - {0x16,0x60}, - {0x17,0xa2}, - {0x18,0xaa}, - {0x1b,0x60}, - {0x1c,0xaa}, - {0xb4,0x20}, - {0xb5,0x3a}, - {0xb6,0x5e}, - {0xb9,0x40}, - {0xba,0x4f}, - {0xbb,0x47}, - {0xbc,0x45}, - {0xbd,0x43}, - {0xbe,0x42}, - {0xbf,0x42}, - {0xc0,0x42}, - {0xc1,0x41}, - {0xc2,0x41}, - {0xc3,0x41}, - {0xc4,0x41}, - {0xc5,0x70}, - {0xc6,0x41}, - {0xca,0x70}, - {0xcb,0xc }, - {0x14,0x20}, - {0x15,0x0f}, - {0xfd,0x00}, - {0xff,0xff} -#endif - - -#if 1 //caprure preview daylight 24M 50hz 20-10FPS maxgain:0x70 {0xfd,0x00}, {0x05,0x00}, @@ -937,12 +1055,138 @@ static struct reginfo sensor_SceneAuto[] = {0x14,0x20}, {0x15,0x0f}, {0xfd,0x00}, -{0xff,0xff} #endif +#if 0//9-12 + +{0xfd,0x00}, +{0x05,0x00}, +{0x06,0x00}, +{0x09,0x00}, +{0x0a,0xa7}, +{0xf0,0x3b}, +{0xf1,0x00}, +{0xf2,0x56}, +{0xf5,0x6f}, +{0xfd,0x01}, +{0x00,0xa9}, +{0x0f,0x57}, +{0x16,0x57}, +{0x17,0x99}, +{0x18,0xa1}, +{0x1b,0x57}, +{0x1c,0xa1}, +{0xb4,0x21}, +{0xb5,0x39}, +{0xb6,0x39}, +{0xb9,0x40}, +{0xba,0x4f}, +{0xbb,0x47}, +{0xbc,0x45}, +{0xbd,0x43}, +{0xbe,0x42}, +{0xbf,0x42}, +{0xc0,0x42}, +{0xc1,0x41}, +{0xc2,0x41}, +{0xc3,0x41}, +{0xc4,0x41}, +{0xc5,0x70}, +{0xc6,0x41}, +{0xca,0x70}, +{0xcb,0x0c}, +{0xfd,0x00}, +#endif + +#if 0//10-12 +{0xfd,0x00}, +{0x05,0x00}, +{0x06,0x00}, +{0x09,0x00}, +{0x0a,0xa7}, +{0xf0,0x3b}, +{0xf1,0x00}, +{0xf2,0x56}, +{0xf5,0x6f}, +{0xfd,0x01}, +{0x00,0xa7}, +{0x0f,0x57}, +{0x16,0x57}, +{0x17,0x97}, +{0x18,0x9f}, +{0x1b,0x57}, +{0x1c,0x9f}, +{0xb4,0x21}, +{0xb5,0x39}, +{0xb6,0x39}, +{0xb9,0x40}, +{0xba,0x4f}, +{0xbb,0x47}, +{0xbc,0x45}, +{0xbd,0x43}, +{0xbe,0x42}, +{0xbf,0x42}, +{0xc0,0x42}, +{0xc1,0x41}, +{0xc2,0x41}, +{0xc3,0x41}, +{0xc4,0x70}, +{0xc5,0x41}, +{0xc6,0x41}, +{0xca,0x70}, +{0xcb,0x0b}, +{0xfd,0x00}, + +#endif + +#if 1 + +//sensor AE settings:6-11fps +{0xfd,0x00}, +{0x05,0x00}, +{0x06,0x00}, +{0x09,0x01}, +{0x0a,0x05}, +{0xf0,0x36}, +{0xf1,0x00}, +{0xf2,0x53}, +{0xf5,0x6c}, +{0xfd,0x01}, +{0x00,0x9c}, +{0x0f,0x54}, +{0x16,0x54}, +{0x17,0x9c}, +{0x18,0x00}, +{0x1b,0x54}, +{0x1c,0x43}, +{0xb4,0x20}, +{0xb5,0x34}, +{0xb6,0x34}, +{0xb9,0x40}, +{0xba,0x4f}, +{0xbb,0x47}, +{0xbc,0x45}, +{0xbd,0x43}, +{0xbe,0x42}, +{0xbf,0x42}, +{0xc0,0x42}, +{0xc1,0x41}, +{0xc2,0x41}, +{0xc3,0x41}, +{0xc4,0x41}, +{0xc5,0x41}, +{0xc6,0x41}, +{0xca,0x60}, +{0xcb,0x10}, +{0xfd,0x00}, + +#endif + +SensorEnd }; -static struct reginfo sensor_SceneNight[] = +static struct rk_sensor_reg sensor_SceneNight[] = { +#if 0 //caprure preview night 24M 50hz 20-6FPS maxgain:0x78 {0xfd,0x00}, {0x05,0x0 }, @@ -983,1902 +1227,337 @@ static struct reginfo sensor_SceneNight[] = {0x14,0x20}, {0x15,0x1f}, {0xfd,0x00}, - {0xff,0xff} -}; - - - -static struct reginfo *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,}; + #endif + #if 0 + {0xfd,0x00}, + {0x05,0x00}, + {0x06,0x00}, + {0x09,0x00}, + {0x0a,0xa7}, + {0xf0,0x3b}, + {0xf1,0x00}, + {0xf2,0x56}, + {0xf5,0x6f}, + {0xfd,0x01}, + {0x00,0xaf}, + {0x0f,0x57}, + {0x16,0x57}, + {0x17,0x9f}, + {0x18,0xa7}, + {0x1b,0x57}, + {0x1c,0xa7}, + {0xb4,0x21}, + {0xb5,0x39}, + {0xb6,0x39}, + {0xb9,0x40}, + {0xba,0x4f}, + {0xbb,0x47}, + {0xbc,0x45}, + {0xbd,0x43}, + {0xbe,0x42}, + {0xbf,0x42}, + {0xc0,0x42}, + {0xc1,0x41}, + {0xc2,0x41}, + {0xc3,0x41}, + {0xc4,0x41}, + {0xc5,0x41}, + #endif + +#if 1 + +//sensor AE settings:6-11fps +{0xfd,0x00}, +{0x05,0x00}, +{0x06,0x00}, +{0x09,0x01}, +{0x0a,0x05}, +{0xf0,0x36}, +{0xf1,0x00}, +{0xf2,0x53}, +{0xf5,0x6c}, +{0xfd,0x01}, +{0x00,0x9c}, +{0x0f,0x54}, +{0x16,0x54}, +{0x17,0x9c}, +{0x18,0x00}, +{0x1b,0x54}, +{0x1c,0x43}, +{0xb4,0x20}, +{0xb5,0x34}, +{0xb6,0x34}, +{0xb9,0x40}, +{0xba,0x4f}, +{0xbb,0x47}, +{0xbc,0x45}, +{0xbd,0x43}, +{0xbe,0x42}, +{0xbf,0x42}, +{0xc0,0x42}, +{0xc1,0x41}, +{0xc2,0x41}, +{0xc3,0x41}, +{0xc4,0x41}, +{0xc5,0x41}, +{0xc6,0x41}, +{0xca,0x60}, +{0xcb,0x10}, +{0xfd,0x00}, + + #endif + +SensorEnd +}; + +static struct rk_sensor_reg *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,}; ///=========sp0838-modify by sp_yjp,20120529================= -#if CONFIG_SENSOR_DigitalZoom -static struct reginfo sensor_Zoom0[] = +static struct rk_sensor_reg sensor_Zoom0[] = { - {0xfd,0x00}, - {0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Zoom1[] = +static struct rk_sensor_reg sensor_Zoom1[] = { - {0xfd,0x00}, - {0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Zoom2[] = +static struct rk_sensor_reg sensor_Zoom2[] = { - {0xfd,0x00}, - {0xff,0xff} +SensorEnd }; -static struct reginfo sensor_Zoom3[] = +static struct rk_sensor_reg sensor_Zoom3[] = { - {0xfd,0x00}, - {0xff,0xff} +SensorEnd }; -static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,}; -#endif +static struct rk_sensor_reg *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,}; ///=========sp0838-modify by sp_yjp,20120529================= static struct v4l2_querymenu sensor_menus[] = { - #if CONFIG_SENSOR_WhiteBalance - { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 0, .name = "auto", .reserved = 0, }, { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 1, .name = "incandescent", .reserved = 0,}, - { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 2, .name = "fluorescent", .reserved = 0,}, { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 3, .name = "daylight", .reserved = 0,}, - { .id = V4L2_CID_DO_WHITE_BALANCE, .index = 4, .name = "cloudy-daylight", .reserved = 0,}, - #endif - - #if CONFIG_SENSOR_Effect - { .id = V4L2_CID_EFFECT, .index = 0, .name = "none", .reserved = 0, }, { .id = V4L2_CID_EFFECT, .index = 1, .name = "mono", .reserved = 0,}, - { .id = V4L2_CID_EFFECT, .index = 2, .name = "negative", .reserved = 0,}, { .id = V4L2_CID_EFFECT, .index = 3, .name = "sepia", .reserved = 0,}, - { .id = V4L2_CID_EFFECT, .index = 4, .name = "posterize", .reserved = 0,} ,{ .id = V4L2_CID_EFFECT, .index = 5, .name = "aqua", .reserved = 0,}, - #endif - - #if CONFIG_SENSOR_Scene - { .id = V4L2_CID_SCENE, .index = 0, .name = "auto", .reserved = 0,} ,{ .id = V4L2_CID_SCENE, .index = 1, .name = "night", .reserved = 0,}, - #endif - - #if CONFIG_SENSOR_Flash - { .id = V4L2_CID_FLASH, .index = 0, .name = "off", .reserved = 0, }, { .id = V4L2_CID_FLASH, .index = 1, .name = "auto", .reserved = 0,}, - { .id = V4L2_CID_FLASH, .index = 2, .name = "on", .reserved = 0,}, { .id = V4L2_CID_FLASH, .index = 3, .name = "torch", .reserved = 0,}, - #endif -}; - -static const struct v4l2_queryctrl sensor_controls[] = -{ - #if CONFIG_SENSOR_WhiteBalance - { - .id = V4L2_CID_DO_WHITE_BALANCE, - .type = V4L2_CTRL_TYPE_MENU, - .name = "White Balance Control", - .minimum = 0, - .maximum = 4, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Brightness - { - .id = V4L2_CID_BRIGHTNESS, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "Brightness Control", - .minimum = -3, - .maximum = 2, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Effect - { - .id = V4L2_CID_EFFECT, - .type = V4L2_CTRL_TYPE_MENU, - .name = "Effect Control", - .minimum = 0, - .maximum = 5, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Exposure - { - .id = V4L2_CID_EXPOSURE, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "Exposure Control", - .minimum = 0, - .maximum = 6, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Saturation - { - .id = V4L2_CID_SATURATION, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "Saturation Control", - .minimum = 0, - .maximum = 2, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Contrast - { - .id = V4L2_CID_CONTRAST, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "Contrast Control", - .minimum = -3, - .maximum = 3, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Mirror - { - .id = V4L2_CID_HFLIP, - .type = V4L2_CTRL_TYPE_BOOLEAN, - .name = "Mirror Control", - .minimum = 0, - .maximum = 1, - .step = 1, - .default_value = 1, - }, - #endif - - #if CONFIG_SENSOR_Flip - { - .id = V4L2_CID_VFLIP, - .type = V4L2_CTRL_TYPE_BOOLEAN, - .name = "Flip Control", - .minimum = 0, - .maximum = 1, - .step = 1, - .default_value = 1, - }, - #endif - - #if CONFIG_SENSOR_Scene - { - .id = V4L2_CID_SCENE, - .type = V4L2_CTRL_TYPE_MENU, - .name = "Scene Control", - .minimum = 0, - .maximum = 1, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_DigitalZoom - { - .id = V4L2_CID_ZOOM_RELATIVE, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "DigitalZoom Control", - .minimum = -1, - .maximum = 1, - .step = 1, - .default_value = 0, - }, { - .id = V4L2_CID_ZOOM_ABSOLUTE, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "DigitalZoom Control", - .minimum = 0, - .maximum = 3, - .step = 1, - .default_value = 0, - }, - #endif - - #if CONFIG_SENSOR_Focus - { - .id = V4L2_CID_FOCUS_RELATIVE, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "Focus Control", - .minimum = -1, - .maximum = 1, - .step = 1, - .default_value = 0, - }, { - .id = V4L2_CID_FOCUS_ABSOLUTE, - .type = V4L2_CTRL_TYPE_INTEGER, - .name = "Focus Control", - .minimum = 0, - .maximum = 255, - .step = 1, - .default_value = 125, - }, - #endif - - #if CONFIG_SENSOR_Flash - { - .id = V4L2_CID_FLASH, - .type = V4L2_CTRL_TYPE_MENU, - .name = "Flash Control", - .minimum = 0, - .maximum = 3, - .step = 1, - .default_value = 0, - }, - #endif -}; - -static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *did); -static int sensor_video_probe(struct soc_camera_device *icd, struct i2c_client *client); -static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl); -static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl); -static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl); -static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl); -static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg); -static int sensor_resume(struct soc_camera_device *icd); -static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags); -static unsigned long sensor_query_bus_param(struct soc_camera_device *icd); -static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value); -static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value); -static int sensor_deactivate(struct i2c_client *client); - -static struct soc_camera_ops sensor_ops = -{ - .suspend = sensor_suspend, - .resume = sensor_resume, - .set_bus_param = sensor_set_bus_param, - .query_bus_param = sensor_query_bus_param, - .controls = sensor_controls, - .menus = sensor_menus, - .num_controls = ARRAY_SIZE(sensor_controls), - .num_menus = ARRAY_SIZE(sensor_menus), -}; - -/* only one fixed colorspace per pixelcode */ -struct sensor_datafmt { - enum v4l2_mbus_pixelcode code; - enum v4l2_colorspace colorspace; }; - -/* Find a data format by a pixel code in an array */ -static const struct sensor_datafmt *sensor_find_datafmt( - enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt, - int n) +/* +* User could be add v4l2_queryctrl in sensor_controls by new_user_v4l2ctrl +*/ +static struct sensor_v4l2ctrl_usr_s sensor_controls[] = { - int i; - for (i = 0; i < n; i++) - if (fmt[i].code == code) - return fmt + i; - - return NULL; -} - -static const struct sensor_datafmt sensor_colour_fmts[] = { - {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} }; -typedef struct sensor_info_priv_s -{ - int whiteBalance; - int brightness; - int contrast; - int saturation; - int effect; - int scene; - int digitalzoom; - int focus; - int flash; - int exposure; - bool snap2preview; - bool video2preview; - unsigned char mirror; /* HFLIP */ - unsigned char flip; /* VFLIP */ - unsigned int winseqe_cur_addr; - struct sensor_datafmt fmt; - unsigned int funmodule_state; -} sensor_info_priv_t; - -struct sensor -{ - struct v4l2_subdev subdev; - struct i2c_client *client; - sensor_info_priv_t info_priv; - int model; /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */ -#if CONFIG_SENSOR_I2C_NOSCHED - atomic_t tasklock_cnt; -#endif - struct rk29camera_platform_data *sensor_io_request; - struct rk29camera_gpio_res *sensor_gpio_res; +//MUST define the current used format as the first item +static struct rk_sensor_datafmt sensor_colour_fmts[] = { + {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG} }; +//static struct soc_camera_ops sensor_ops; + +/* +********************************************************** +* Following is local code: +* +* Please codeing your program here +********************************************************** +*/ -static struct sensor* to_sensor(const struct i2c_client *client) +/* +********************************************************** +* Following is callback +* If necessary, you could coding these callback +********************************************************** +*/ +/* +* the function is called in open sensor +*/ +static int sensor_activate_cb(struct i2c_client *client) { - return container_of(i2c_get_clientdata(client), struct sensor, subdev); -} -static int sensor_task_lock(struct i2c_client *client, int lock) -{ -#if CONFIG_SENSOR_I2C_NOSCHED - int cnt = 3; - struct sensor *sensor = to_sensor(client); - - if (lock) { - if (atomic_read(&sensor->tasklock_cnt) == 0) { - while ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt>0)) { - SENSOR_TR("\n %s will obtain i2c in atomic, but i2c bus is locked! Wait...\n",SENSOR_NAME_STRING()); - msleep(35); - cnt--; - } - if ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt<=0)) { - SENSOR_TR("\n %s obtain i2c fail in atomic!!\n",SENSOR_NAME_STRING()); - goto sensor_task_lock_err; - } - preempt_disable(); - } - - atomic_add(1, &sensor->tasklock_cnt); - } else { - if (atomic_read(&sensor->tasklock_cnt) > 0) { - atomic_sub(1, &sensor->tasklock_cnt); + SENSOR_DG("%s",__FUNCTION__); - if (atomic_read(&sensor->tasklock_cnt) == 0) - preempt_enable(); - } - } + return 0; -sensor_task_lock_err: - return -1; -#else - return 0; -#endif - } - -/* sensor register write */ -static int sensor_write(struct i2c_client *client, u8 reg, u8 val) +/* +* the function is called in close sensor +*/ +static int sensor_deactivate_cb(struct i2c_client *client) { - int err,cnt; - u8 buf[2]; - struct i2c_msg msg[1]; - - buf[0] = reg & 0xFF; - buf[1] = val; - - msg->addr = client->addr; - msg->flags = client->flags; - msg->buf = buf; - msg->len = sizeof(buf); - msg->scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */ - msg->read_type = 0; /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */ - - cnt = 3; - err = -EAGAIN; + //struct generic_sensor *sensor = to_generic_sensor(client); - while ((cnt-- > 0) && (err < 0)) { /* ddl@rock-chips.com : Transfer again if transent is failed */ - err = i2c_transfer(client->adapter, msg, 1); - - if (err >= 0) { - return 0; - } else { - SENSOR_TR("\n %s write reg(0x%x, val:0x%x) failed, try to write again!\n",SENSOR_NAME_STRING(),reg, val); - udelay(10); - } - } - - return err; -} - -/* sensor register read */ -static int sensor_read(struct i2c_client *client, u8 reg, u8 *val) -{ - int err,cnt; - //u8 buf[2]; - u8 buf[1]; - struct i2c_msg msg[2]; - - //buf[0] = reg >> 8; - buf[0] = reg; - buf[1] = reg & 0xFF; - - msg[0].addr = client->addr; - msg[0].flags = client->flags; - msg[0].buf = buf; - msg[0].len = sizeof(buf); - msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */ - msg[0].read_type = 2; /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */ - - msg[1].addr = client->addr; - msg[1].flags = client->flags|I2C_M_RD; - msg[1].buf = buf; - msg[1].len = 1; - msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */ - msg[1].read_type = 2; /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */ - - cnt = 1; - err = -EAGAIN; - while ((cnt-- > 0) && (err < 0)) { /* ddl@rock-chips.com : Transfer again if transent is failed */ - err = i2c_transfer(client->adapter, msg, 2); - - if (err >= 0) { - *val = buf[0]; - return 0; - } else { - SENSOR_TR("\n %s read reg(0x%x val:0x%x) failed, try to read again! \n",SENSOR_NAME_STRING(),reg, *val); - udelay(10); - } - } - - return err; -} - -/* write a array of registers */ -#if 1 -static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray) -{ - int err; - int i = 0; - - //for(i=0; i < sizeof(sensor_init_data) / 2;i++) - while((regarray[i].reg != 0xff) || (regarray[i].val != 0xff)) - { - err = sensor_write(client, regarray[i].reg, regarray[i].val); - if (err != 0) - { - SENSOR_TR("%s..write failed current i = %d\n", SENSOR_NAME_STRING(),i); - return err; - } - i++; - } + SENSOR_DG("%s",__FUNCTION__); - return 0; + return 0; } -#else -static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray) -{ - int err; - int i = 0; - u8 val_read; - while (regarray[i].reg != 0) - { - err = sensor_write(client, regarray[i].reg, regarray[i].val); - if (err != 0) - { - SENSOR_TR("%s..write failed current i = %d\n", SENSOR_NAME_STRING(),i); - return err; - } - err = sensor_read(client, regarray[i].reg, &val_read); - SENSOR_TR("%s..reg[0x%x]=0x%x,0x%x\n", SENSOR_NAME_STRING(),regarray[i].reg, val_read, regarray[i].val); - i++; - } +/* +* the function is called before sensor register setting in VIDIOC_S_FMT +*/ +static int sensor_s_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture) +{ return 0; } -#endif - -#if CONFIG_SENSOR_I2C_RDWRCHK -static int sensor_check_array(struct i2c_client *client, struct reginfo *regarray) -{ - int ret; - int i = 0; - - u8 value; - - SENSOR_DG("%s >>>>>>>>>>>>>>>>>>>>>>\n",__FUNCTION__); - for(i=0;ipowerdown) { - ret = icl->powerdown(icd->pdev, on); - if (ret == RK29_CAM_IO_SUCCESS) { - if (on == 0) { - mdelay(2); - if (icl->reset) - icl->reset(icd->pdev); - } - } else if (ret == RK29_CAM_EIO_REQUESTFAIL) { - ret = -ENODEV; - goto sensor_power_end; - } - } - break; - } - case Sensor_Flash: - { - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - struct sensor *sensor = to_sensor(client); - - if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) { - sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on); - } - break; - } - default: - { - SENSOR_TR("%s %s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),__FUNCTION__,cmd); - break; - } - } -sensor_power_end: - return ret; -} - -static int sensor_init(struct v4l2_subdev *sd, u32 val) +/* +* the function is called after sensor register setting finished in VIDIOC_S_FMT +*/ +static int sensor_s_fmt_cb_bh (struct i2c_client *client,struct v4l2_mbus_framefmt *mf, bool capture) { - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct soc_camera_device *icd = client->dev.platform_data; - struct sensor *sensor = to_sensor(client); - const struct v4l2_queryctrl *qctrl; - const struct sensor_datafmt *fmt; - int ret; - - SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__); - - if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) { - ret = -ENODEV; - goto sensor_INIT_ERR; - } - - /* soft reset */ - if (sensor_task_lock(client,1)<0) - goto sensor_INIT_ERR; - /* ret = sensor_write(client, 0x12, 0x80); - if (ret != 0) - { - SENSOR_TR("%s soft reset sensor failed\n",SENSOR_NAME_STRING()); - ret = -ENODEV; - goto sensor_INIT_ERR; - } - - mdelay(5); */ //delay 5 microseconds - - ret = sensor_write_array(client, sensor_init_data); - if (ret != 0) - { - SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING()); - goto sensor_INIT_ERR; - } - - sensor_task_lock(client,0); - - sensor->info_priv.winseqe_cur_addr = (int)SENSOR_INIT_WINSEQADR; - fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts)); - if (!fmt) { - SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING()); - ret = -EINVAL; - goto sensor_INIT_ERR; - } - sensor->info_priv.fmt = *fmt; - - /* sensor sensor information for initialization */ - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE); - if (qctrl) - sensor->info_priv.whiteBalance = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_BRIGHTNESS); - if (qctrl) - sensor->info_priv.brightness = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT); - if (qctrl) - sensor->info_priv.effect = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EXPOSURE); - if (qctrl) - sensor->info_priv.exposure = qctrl->default_value; - - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SATURATION); - if (qctrl) - sensor->info_priv.saturation = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_CONTRAST); - if (qctrl) - sensor->info_priv.contrast = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_HFLIP); - if (qctrl) - sensor->info_priv.mirror = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_VFLIP); - if (qctrl) - sensor->info_priv.flip = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SCENE); - if (qctrl) - sensor->info_priv.scene = qctrl->default_value; - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE); - if (qctrl) - sensor->info_priv.digitalzoom = qctrl->default_value; - - /* ddl@rock-chips.com : if sensor support auto focus and flash, programer must run focus and flash code */ - #if CONFIG_SENSOR_Focus - sensor_set_focus(); - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE); - if (qctrl) - sensor->info_priv.focus = qctrl->default_value; - #endif - - #if CONFIG_SENSOR_Flash - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH); - if (qctrl) - sensor->info_priv.flash = qctrl->default_value; - #endif - - SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),((val == 0)?__FUNCTION__:"sensor_reinit"),icd->user_width,icd->user_height); - sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK; return 0; -sensor_INIT_ERR: - sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK; - sensor_task_lock(client,0); - sensor_deactivate(client); - return ret; } - -static int sensor_deactivate(struct i2c_client *client) +static int sensor_softrest_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series) { - struct soc_camera_device *icd = client->dev.platform_data; - //u8 reg_val; - struct sensor *sensor = to_sensor(client); - SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__); - - /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */ - sensor_ioctrl(icd, Sensor_PowerDown, 1); - msleep(100); - - /* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */ - icd->user_width = SENSOR_INIT_WIDTH; - icd->user_height = SENSOR_INIT_HEIGHT; - sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK; return 0; } -static struct reginfo sensor_power_down_sequence[]= +static int sensor_check_id_usr_cb(struct i2c_client *client,struct rk_sensor_reg *series) { - {0xfd,0x00},{0xff,0xff} -}; -static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg) -{ - int ret; - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if (pm_msg.event == PM_EVENT_SUSPEND) { - SENSOR_DG("\n %s Enter Suspend.. \n", SENSOR_NAME_STRING()); - ret = sensor_write_array(client, sensor_power_down_sequence) ; - if (ret != 0) { - SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__); - return ret; - } else { - ret = sensor_ioctrl(icd, Sensor_PowerDown, 1); - if (ret < 0) { - SENSOR_TR("\n %s suspend fail for turn on power!\n", SENSOR_NAME_STRING()); - return -EINVAL; - } - } - } else { - SENSOR_TR("\n %s cann't suppout Suspend..\n",SENSOR_NAME_STRING()); - return -EINVAL; - } - return 0; -} - -static int sensor_resume(struct soc_camera_device *icd) -{ - int ret; - - ret = sensor_ioctrl(icd, Sensor_PowerDown, 0); - if (ret < 0) { - SENSOR_TR("\n %s resume fail for turn on power!\n", SENSOR_NAME_STRING()); - return -EINVAL; - } - - SENSOR_DG("\n %s Enter Resume.. \n", SENSOR_NAME_STRING()); - - return 0; - + return 0; } - -static int sensor_set_bus_param(struct soc_camera_device *icd, - unsigned long flags) +static int sensor_try_fmt_cb_th(struct i2c_client *client,struct v4l2_mbus_framefmt *mf) { - - return 0; + return 0; } -static unsigned long sensor_query_bus_param(struct soc_camera_device *icd) +static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg) { - struct soc_camera_link *icl = to_soc_camera_link(icd); - unsigned long flags = SENSOR_BUS_PARAM; + //struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - return soc_camera_apply_sensor_flags(icl, flags); + + if (pm_msg.event == PM_EVENT_SUSPEND) { + SENSOR_DG("Suspend"); + + } else { + SENSOR_TR("pm_msg.event(0x%x) != PM_EVENT_SUSPEND\n",pm_msg.event); + return -EINVAL; + } + return 0; } -static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) +static int sensor_resume(struct soc_camera_device *icd) { - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct soc_camera_device *icd = client->dev.platform_data; - struct sensor *sensor = to_sensor(client); - mf->width = icd->user_width; - mf->height = icd->user_height; - mf->code = sensor->info_priv.fmt.code; - mf->colorspace = sensor->info_priv.fmt.colorspace; - mf->field = V4L2_FIELD_NONE; + SENSOR_DG("Resume"); - return 0; -} -static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) -{ - bool ret = false; - - if ((mf->width == 1024) && (mf->height == 768)) { - ret = true; - } else if ((mf->width == 1280) && (mf->height == 1024)) { - ret = true; - } else if ((mf->width == 1600) && (mf->height == 1200)) { - ret = true; - } else if ((mf->width == 2048) && (mf->height == 1536)) { - ret = true; - } else if ((mf->width == 2592) && (mf->height == 1944)) { - ret = true; - } + return 0; - if (ret == true) - SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height); - return ret; } - -static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) +static int sensor_mirror_cb (struct i2c_client *client, int mirror) { - bool ret = false; - - if ((mf->width == 1280) && (mf->height == 720)) { - ret = true; - } else if ((mf->width == 1920) && (mf->height == 1080)) { - ret = true; - } - - if (ret == true) - SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height); - return ret; -} -static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - const struct sensor_datafmt *fmt; - struct sensor *sensor = to_sensor(client); - const struct v4l2_queryctrl *qctrl; - struct soc_camera_device *icd = client->dev.platform_data; - struct reginfo *winseqe_set_addr=NULL; - int ret=0, set_w,set_h; - - fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts, - ARRAY_SIZE(sensor_colour_fmts)); - if (!fmt) { - ret = -EINVAL; - goto sensor_s_fmt_end; - } - - if (sensor->info_priv.fmt.code != mf->code) { - switch (mf->code) - { - case V4L2_MBUS_FMT_YUYV8_2X8: - { - winseqe_set_addr = sensor_ClrFmt_YUYV; - break; - } - case V4L2_MBUS_FMT_UYVY8_2X8: - { - winseqe_set_addr = sensor_ClrFmt_UYVY; - break; - } - default: - break; - } - if (winseqe_set_addr != NULL) { - sensor_write_array(client, winseqe_set_addr); - sensor->info_priv.fmt.code = mf->code; - sensor->info_priv.fmt.colorspace= mf->colorspace; - SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code); - } else { - SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code); - } - } - - set_w = mf->width; - set_h = mf->height; + int err = 0; + + SENSOR_DG("mirror: %d",mirror); + - if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg) - { - winseqe_set_addr = sensor_qcif; - set_w = 176; - set_h = 144; - } - else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg) - { - winseqe_set_addr = sensor_qvga; - set_w = 320; - set_h = 240; - } - else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg) - { - winseqe_set_addr = sensor_cif; - set_w = 352; - set_h = 288; - } - else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg) - { - winseqe_set_addr = sensor_vga; - set_w = 640-16; - set_h = 480-16; - } - else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg) - { - winseqe_set_addr = sensor_svga; - set_w = 800; - set_h = 600; - } - else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg) - { - winseqe_set_addr = sensor_sxga; - set_w = 1280; - set_h = 1024; - } - else - { - winseqe_set_addr = SENSOR_INIT_WINSEQADR; /* ddl@rock-chips.com : Sensor output smallest size if isn't support app */ - set_w = SENSOR_INIT_WIDTH; - set_h = SENSOR_INIT_HEIGHT; - SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height); - } - - if ((int)winseqe_set_addr != sensor->info_priv.winseqe_cur_addr) { - #if CONFIG_SENSOR_Flash - if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */ - if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) { - sensor_ioctrl(icd, Sensor_Flash, Flash_On); - SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING()); - } - } else { /* ddl@rock-chips.com : Video */ - if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) { - sensor_ioctrl(icd, Sensor_Flash, Flash_Off); - SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING()); - } - } - #endif - ret |= sensor_write_array(client, winseqe_set_addr); - if (ret != 0) { - SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING()); - #if CONFIG_SENSOR_Flash - if (sensor_fmt_capturechk(sd,mf) == true) { - if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) { - sensor_ioctrl(icd, Sensor_Flash, Flash_Off); - SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING()); - } - } - #endif - goto sensor_s_fmt_end; - } - - sensor->info_priv.winseqe_cur_addr = (int)winseqe_set_addr; - - if (sensor_fmt_capturechk(sd,mf) == true) { /* ddl@rock-chips.com : Capture */ - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT); - sensor_set_effect(icd, qctrl,sensor->info_priv.effect); - if (sensor->info_priv.whiteBalance != 0) { - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE); - sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance); - } - sensor->info_priv.snap2preview = true; - } else if (sensor_fmt_videochk(sd,mf) == true) { /* ddl@rock-chips.com : Video */ - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT); - sensor_set_effect(icd, qctrl,sensor->info_priv.effect); - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE); - sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance); - sensor->info_priv.video2preview = true; - } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) { - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT); - sensor_set_effect(icd, qctrl,sensor->info_priv.effect); - qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE); - sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance); - msleep(600); - sensor->info_priv.video2preview = false; - sensor->info_priv.snap2preview = false; - } - - SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h); - } - else - { - SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h); - } - - mf->width = set_w; - mf->height = set_h; - -sensor_s_fmt_end: - return ret; + return err; } +/* +* the function is v4l2 control V4L2_CID_HFLIP callback +*/ +static int sensor_v4l2ctrl_mirror_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, + struct v4l2_ext_control *ext_ctrl) +{ + struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); -static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd) -; - struct sensor *sensor = to_sensor(client); - const struct sensor_datafmt *fmt; - int ret = 0; - - fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts, - ARRAY_SIZE(sensor_colour_fmts)); - if (fmt == NULL) { - fmt = &sensor->info_priv.fmt; - mf->code = fmt->code; - } - - if (mf->height > SENSOR_MAX_HEIGHT) - mf->height = SENSOR_MAX_HEIGHT; - else if (mf->height < SENSOR_MIN_HEIGHT) - mf->height = SENSOR_MIN_HEIGHT; - - if (mf->width > SENSOR_MAX_WIDTH) - mf->width = SENSOR_MAX_WIDTH; - else if (mf->width < SENSOR_MIN_WIDTH) - mf->width = SENSOR_MIN_WIDTH; - - mf->colorspace = fmt->colorspace; - - return ret; + if (sensor_mirror_cb(client,ext_ctrl->value) != 0) + SENSOR_TR("sensor_mirror failed, value:0x%x",ext_ctrl->value); + + SENSOR_DG("sensor_mirror success, value:0x%x",ext_ctrl->value); + return 0; } - static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id) +static int sensor_flip_cb(struct i2c_client *client, int flip) { - struct i2c_client *client = v4l2_get_subdevdata(sd); - - if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR) - return -EINVAL; - - if (id->match.addr != client->addr) - return -ENODEV; - - id->ident = SENSOR_V4L2_IDENT; /* ddl@rock-chips.com : Return OV9650 identifier */ - id->revision = 0; + int err = 0; - return 0; -} -#if CONFIG_SENSOR_Brightness -static int sensor_set_brightness(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_BrightnessSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_BrightnessSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Effect -static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_EffectSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_EffectSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Exposure -static int sensor_set_exposure(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_ExposureSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_ExposureSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Saturation -static int sensor_set_saturation(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_SaturationSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_SaturationSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Contrast -static int sensor_set_contrast(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_ContrastSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_ContrastSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Mirror -static int sensor_set_mirror(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_MirrorSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_MirrorSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Flip -static int sensor_set_flip(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_FlipSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_FlipSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_Scene -static int sensor_set_scene(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_SceneSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_SceneSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; -} -#endif -#if CONFIG_SENSOR_WhiteBalance -static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) - { - if (sensor_WhiteBalanceSeqe[value - qctrl->minimum] != NULL) - { - if (sensor_write_array(client, sensor_WhiteBalanceSeqe[value - qctrl->minimum]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - } - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; + SENSOR_DG("flip: %d",flip); + + return err; } -#endif -#if CONFIG_SENSOR_DigitalZoom -static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value) +/* +* the function is v4l2 control V4L2_CID_VFLIP callback +*/ +static int sensor_v4l2ctrl_flip_cb(struct soc_camera_device *icd, struct sensor_v4l2ctrl_info_s *ctrl_info, + struct v4l2_ext_control *ext_ctrl) { - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - struct sensor *sensor = to_sensor(client); - const struct v4l2_queryctrl *qctrl_info; - int digitalzoom_cur, digitalzoom_total; + struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE); - if (qctrl_info) - return -EINVAL; - - digitalzoom_cur = sensor->info_priv.digitalzoom; - digitalzoom_total = qctrl_info->maximum; - - if ((*value > 0) && (digitalzoom_cur >= digitalzoom_total)) - { - SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur); - return -EINVAL; - } - - if ((*value < 0) && (digitalzoom_cur <= qctrl_info->minimum)) - { - SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur); - return -EINVAL; - } - - if ((*value > 0) && ((digitalzoom_cur + *value) > digitalzoom_total)) - { - *value = digitalzoom_total - digitalzoom_cur; - } - - if ((*value < 0) && ((digitalzoom_cur + *value) < 0)) - { - *value = 0 - digitalzoom_cur; - } - - digitalzoom_cur += *value; - - if (sensor_ZoomSeqe[digitalzoom_cur] != NULL) - { - if (sensor_write_array(client, sensor_ZoomSeqe[digitalzoom_cur]) != 0) - { - SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__); - return -EINVAL; - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, *value); - return 0; - } - - return -EINVAL; + if (sensor_flip_cb(client,ext_ctrl->value) != 0) + SENSOR_TR("sensor_flip failed, value:0x%x",ext_ctrl->value); + + SENSOR_DG("sensor_flip success, value:0x%x",ext_ctrl->value); + return 0; } -#endif -#if CONFIG_SENSOR_Flash -static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value) -{ - if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) { - if (value == 3) { /* ddl@rock-chips.com: torch */ - sensor_ioctrl(icd, Sensor_Flash, Flash_Torch); /* Flash On */ - } else { - sensor_ioctrl(icd, Sensor_Flash, Flash_Off); - } - SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value); - return 0; - } - - SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value); - return -EINVAL; +/* +* the functions are focus callbacks +*/ +static int sensor_focus_init_usr_cb(struct i2c_client *client){ + return 0; } -#endif -static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct sensor *sensor = to_sensor(client); - const struct v4l2_queryctrl *qctrl; - - qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id); - - if (!qctrl) - { - SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ctrl->id); - return -EINVAL; - } - - switch (ctrl->id) - { - case V4L2_CID_BRIGHTNESS: - { - ctrl->value = sensor->info_priv.brightness; - break; - } - case V4L2_CID_SATURATION: - { - ctrl->value = sensor->info_priv.saturation; - break; - } - case V4L2_CID_CONTRAST: - { - ctrl->value = sensor->info_priv.contrast; - break; - } - case V4L2_CID_DO_WHITE_BALANCE: - { - ctrl->value = sensor->info_priv.whiteBalance; - break; - } - case V4L2_CID_EXPOSURE: - { - ctrl->value = sensor->info_priv.exposure; - break; - } - case V4L2_CID_HFLIP: - { - ctrl->value = sensor->info_priv.mirror; - break; - } - case V4L2_CID_VFLIP: - { - ctrl->value = sensor->info_priv.flip; - break; - } - default : - break; - } - return 0; +static int sensor_focus_af_single_usr_cb(struct i2c_client *client){ + return 0; } - - -static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct sensor *sensor = to_sensor(client); - struct soc_camera_device *icd = client->dev.platform_data; - const struct v4l2_queryctrl *qctrl; - - - qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id); - - if (!qctrl) - { - SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ctrl->id); - return -EINVAL; - } - - switch (ctrl->id) - { -#if CONFIG_SENSOR_Brightness - case V4L2_CID_BRIGHTNESS: - { - if (ctrl->value != sensor->info_priv.brightness) - { - if (sensor_set_brightness(icd, qctrl,ctrl->value) != 0) - { - return -EINVAL; - } - sensor->info_priv.brightness = ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_Exposure - case V4L2_CID_EXPOSURE: - { - if (ctrl->value != sensor->info_priv.exposure) - { - if (sensor_set_exposure(icd, qctrl,ctrl->value) != 0) - { - return -EINVAL; - } - sensor->info_priv.exposure = ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_Saturation - case V4L2_CID_SATURATION: - { - if (ctrl->value != sensor->info_priv.saturation) - { - if (sensor_set_saturation(icd, qctrl,ctrl->value) != 0) - { - return -EINVAL; - } - sensor->info_priv.saturation = ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_Contrast - case V4L2_CID_CONTRAST: - { - if (ctrl->value != sensor->info_priv.contrast) - { - if (sensor_set_contrast(icd, qctrl,ctrl->value) != 0) - { - return -EINVAL; - } - sensor->info_priv.contrast = ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_WhiteBalance - case V4L2_CID_DO_WHITE_BALANCE: - { - if (ctrl->value != sensor->info_priv.whiteBalance) - { - if (sensor_set_whiteBalance(icd, qctrl,ctrl->value) != 0) - { - return -EINVAL; - } - sensor->info_priv.whiteBalance = ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_Mirror - case V4L2_CID_HFLIP: - { - if (ctrl->value != sensor->info_priv.mirror) - { - if (sensor_set_mirror(icd, qctrl,ctrl->value) != 0) - return -EINVAL; - sensor->info_priv.mirror = ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_Flip - case V4L2_CID_VFLIP: - { - if (ctrl->value != sensor->info_priv.flip) - { - if (sensor_set_flip(icd, qctrl,ctrl->value) != 0) - return -EINVAL; - sensor->info_priv.flip = ctrl->value; - } - break; - } -#endif - default: - break; - } - - return 0; -} -static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl) -{ - const struct v4l2_queryctrl *qctrl; - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - struct sensor *sensor = to_sensor(client); - - qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id); - - if (!qctrl) - { - SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id); - return -EINVAL; - } - - switch (ext_ctrl->id) - { - case V4L2_CID_SCENE: - { - ext_ctrl->value = sensor->info_priv.scene; - break; - } - case V4L2_CID_EFFECT: - { - ext_ctrl->value = sensor->info_priv.effect; - break; - } - case V4L2_CID_ZOOM_ABSOLUTE: - { - ext_ctrl->value = sensor->info_priv.digitalzoom; - break; - } - case V4L2_CID_ZOOM_RELATIVE: - { - return -EINVAL; - } - case V4L2_CID_FOCUS_ABSOLUTE: - { - ext_ctrl->value = sensor->info_priv.focus; - break; - } - case V4L2_CID_FOCUS_RELATIVE: - { - return -EINVAL; - } - case V4L2_CID_FLASH: - { - ext_ctrl->value = sensor->info_priv.flash; - break; - } - default : - break; - } - return 0; +static int sensor_focus_af_near_usr_cb(struct i2c_client *client){ + return 0; } -static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl) -{ - const struct v4l2_queryctrl *qctrl; - struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd)); - struct sensor *sensor = to_sensor(client); - int val_offset; - - qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id); - - if (!qctrl) - { - SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id); - return -EINVAL; - } - - val_offset = 0; - switch (ext_ctrl->id) - { -#if CONFIG_SENSOR_Scene - case V4L2_CID_SCENE: - { - if (ext_ctrl->value != sensor->info_priv.scene) - { - if (sensor_set_scene(icd, qctrl,ext_ctrl->value) != 0) - return -EINVAL; - sensor->info_priv.scene = ext_ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_Effect - case V4L2_CID_EFFECT: - { - if (ext_ctrl->value != sensor->info_priv.effect) - { - if (sensor_set_effect(icd, qctrl,ext_ctrl->value) != 0) - return -EINVAL; - sensor->info_priv.effect= ext_ctrl->value; - } - break; - } -#endif -#if CONFIG_SENSOR_DigitalZoom - case V4L2_CID_ZOOM_ABSOLUTE: - { - if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum)) - return -EINVAL; - - if (ext_ctrl->value != sensor->info_priv.digitalzoom) - { - val_offset = ext_ctrl->value -sensor->info_priv.digitalzoom; - - if (sensor_set_digitalzoom(icd, qctrl,&val_offset) != 0) - return -EINVAL; - sensor->info_priv.digitalzoom += val_offset; - - SENSOR_DG("%s digitalzoom is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom); - } - - break; - } - case V4L2_CID_ZOOM_RELATIVE: - { - if (ext_ctrl->value) - { - if (sensor_set_digitalzoom(icd, qctrl,&ext_ctrl->value) != 0) - return -EINVAL; - sensor->info_priv.digitalzoom += ext_ctrl->value; - - SENSOR_DG("%s digitalzoom is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom); - } - break; - } -#endif -#if CONFIG_SENSOR_Focus - case V4L2_CID_FOCUS_ABSOLUTE: - { - if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum)) - return -EINVAL; - - if (ext_ctrl->value != sensor->info_priv.focus) - { - val_offset = ext_ctrl->value -sensor->info_priv.focus; - - sensor->info_priv.focus += val_offset; - } - - break; - } - case V4L2_CID_FOCUS_RELATIVE: - { - if (ext_ctrl->value) - { - sensor->info_priv.focus += ext_ctrl->value; - - SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus); - } - break; - } -#endif -#if CONFIG_SENSOR_Flash - case V4L2_CID_FLASH: - { - if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0) - return -EINVAL; - sensor->info_priv.flash = ext_ctrl->value; - - SENSOR_DG("%s flash is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.flash); - break; - } -#endif - default: - break; - } - return 0; +static int sensor_focus_af_far_usr_cb(struct i2c_client *client){ + return 0; } -static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct soc_camera_device *icd = client->dev.platform_data; - int i, error_cnt=0, error_idx=-1; - - - for (i=0; icount; i++) { - if (sensor_g_ext_control(icd, &ext_ctrl->controls[i]) != 0) { - error_cnt++; - error_idx = i; - } - } - - if (error_cnt > 1) - error_idx = ext_ctrl->count; - - if (error_idx != -1) { - ext_ctrl->error_idx = error_idx; - return -EINVAL; - } else { - return 0; - } +static int sensor_focus_af_specialpos_usr_cb(struct i2c_client *client,int pos){ + return 0; } -static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct soc_camera_device *icd = client->dev.platform_data; - int i, error_cnt=0, error_idx=-1; - - - for (i=0; icount; i++) { - if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) { - error_cnt++; - error_idx = i; - } - } - - if (error_cnt > 1) - error_idx = ext_ctrl->count; - - if (error_idx != -1) { - ext_ctrl->error_idx = error_idx; - return -EINVAL; - } else { - return 0; - } +static int sensor_focus_af_const_usr_cb(struct i2c_client *client){ + return 0; } - -/* Interface active, can use i2c. If it fails, it can indeed mean, that - * this wasn't our capture interface, so, we wait for the right one */ -static int sensor_video_probe(struct soc_camera_device *icd, - struct i2c_client *client) +static int sensor_focus_af_const_pause_usr_cb(struct i2c_client *client) { - char pid = 0; - int ret; - struct sensor *sensor = to_sensor(client); - - /* We must have a parent by now. And it cannot be a wrong one. - * So this entire test is completely redundant. */ - if (!icd->dev.parent || - to_soc_camera_host(icd->dev.parent)->nr != icd->iface) - return -ENODEV; - - if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) { - ret = -ENODEV; - goto sensor_video_probe_err; - } - - /* soft reset */ - /* ret = sensor_write(client, 0x12, 0x80); - if (ret != 0) - { - SENSOR_TR("soft reset %s failed\n",SENSOR_NAME_STRING()); - return -ENODEV; - } - mdelay(50); *///delay 5 microseconds - - /* check if it is an sensor sensor */ - ////////ret = sensor_read(client, 0x00, &pid); - ret = sensor_read(client, SENSOR_ID_REG, &pid); - if (ret != 0) { - SENSOR_TR("%s read chip id high byte failed\n",SENSOR_NAME_STRING()); - ret = -ENODEV; - goto sensor_video_probe_err; - } - - SENSOR_DG("\n %s pid = 0x%x\n", SENSOR_NAME_STRING(), pid); - if (pid == SENSOR_ID) { - sensor->model = SENSOR_V4L2_IDENT; - } else { - SENSOR_TR("error: %s mismatched pid = 0x%x\n", SENSOR_NAME_STRING(), pid); - ret = -ENODEV; - goto sensor_video_probe_err; - } - return 0; - -sensor_video_probe_err: - - return ret; } - -static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd) -; - struct soc_camera_device *icd = client->dev.platform_data; - struct sensor *sensor = to_sensor(client); - int ret = 0; -#if CONFIG_SENSOR_Flash - int i; -#endif - - SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd); - switch (cmd) - { - case RK29_CAM_SUBDEV_DEACTIVATE: - { - sensor_deactivate(client); - break; - } - - case RK29_CAM_SUBDEV_IOREQUEST: - { - sensor->sensor_io_request = (struct rk29camera_platform_data*)arg; - if (sensor->sensor_io_request != NULL) { - if (sensor->sensor_io_request->gpio_res[0].dev_name && - (strcmp(sensor->sensor_io_request->gpio_res[0].dev_name, dev_name(icd->pdev)) == 0)) { - sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[0]; - } else if (sensor->sensor_io_request->gpio_res[1].dev_name && - (strcmp(sensor->sensor_io_request->gpio_res[1].dev_name, dev_name(icd->pdev)) == 0)) { - sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[1]; - } - } else { - SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__); - ret = -EINVAL; - goto sensor_ioctl_end; - } - /* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control - for this project */ - #if CONFIG_SENSOR_Flash - if (sensor->sensor_gpio_res) { - if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) { - for (i = 0; i < icd->ops->num_controls; i++) { - if (V4L2_CID_FLASH == icd->ops->controls[i].id) { - memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl)); - } - } - sensor->info_priv.flash = 0xff; - SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING()); - } - } - #endif - break; - } - default: - { - SENSOR_TR("%s %s cmd(0x%x) is unknown !\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd); - break; - } - } -sensor_ioctl_end: - return ret; - +static int sensor_focus_af_close_usr_cb(struct i2c_client *client){ + return 0; } -static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index, - enum v4l2_mbus_pixelcode *code) -{ - if (index >= ARRAY_SIZE(sensor_colour_fmts)) - return -EINVAL; - *code = sensor_colour_fmts[index].code; +static int sensor_focus_af_zoneupdate_usr_cb(struct i2c_client *client, int *zone_tm_pos){ return 0; } -static struct v4l2_subdev_core_ops sensor_subdev_core_ops = { - .init = sensor_init, - .g_ctrl = sensor_g_control, - .s_ctrl = sensor_s_control, - .g_ext_ctrls = sensor_g_ext_controls, - .s_ext_ctrls = sensor_s_ext_controls, - .g_chip_ident = sensor_g_chip_ident, - .ioctl = sensor_ioctl, -}; - -static struct v4l2_subdev_video_ops sensor_subdev_video_ops = { - .s_mbus_fmt = sensor_s_fmt, - .g_mbus_fmt = sensor_g_fmt, - .try_mbus_fmt = sensor_try_fmt, - .enum_mbus_fmt = sensor_enum_fmt, -}; -static struct v4l2_subdev_ops sensor_subdev_ops = { - .core = &sensor_subdev_core_ops, - .video = &sensor_subdev_video_ops, -}; +/* +face defect call back +*/ +static int sensor_face_detect_usr_cb(struct i2c_client *client,int on){ + return 0; +} -static int sensor_probe(struct i2c_client *client, - const struct i2c_device_id *did) +/* +* The function can been run in sensor_init_parametres which run in sensor_probe, so user can do some +* initialization in the function. +*/ +static void sensor_init_parameters_user(struct specific_sensor* spsensor,struct soc_camera_device *icd) { - struct sensor *sensor; - 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; - - SENSOR_DG("\n%s..%s..%d..\n",__FUNCTION__,__FILE__,__LINE__); - if (!icd) { - dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING()); - return -EINVAL; - } - - icl = to_soc_camera_link(icd); - if (!icl) { - dev_err(&client->dev, "%s driver needs platform data\n", SENSOR_NAME_STRING()); - return -EINVAL; - } - - if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { - dev_warn(&adapter->dev, - "I2C-Adapter doesn't support I2C_FUNC_I2C\n"); - return -EIO; - } - - sensor = kzalloc(sizeof(struct sensor), GFP_KERNEL); - if (!sensor) - return -ENOMEM; - - v4l2_i2c_subdev_init(&sensor->subdev, client, &sensor_subdev_ops); - - /* Second stage probe - when a capture adapter is there */ - icd->ops = &sensor_ops; - - sensor->info_priv.fmt = sensor_colour_fmts[0]; - - #if CONFIG_SENSOR_I2C_NOSCHED - atomic_set(&sensor->tasklock_cnt,0); - #endif - - ret = sensor_video_probe(icd, client); - if (ret < 0) { - icd->ops = NULL; - i2c_set_clientdata(client, NULL); - kfree(sensor); - sensor = NULL; - } - SENSOR_DG("\n%s..%s..%d ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret); - return ret; + return; } +/* -static int sensor_remove(struct i2c_client *client) -{ - struct sensor *sensor = to_sensor(client); - struct soc_camera_device *icd = client->dev.platform_data; +#define CHIP_NAME RK29_CAM_SENSOR_NAME_SP0838 +#define DBG_DIR "fcam" +#include "./add-cam-inf.c" - icd->ops = NULL; - i2c_set_clientdata(client, NULL); - client->driver = NULL; - kfree(sensor); - sensor = NULL; - return 0; -} +* :::::WARNING::::: +* It is not allowed to modify the following code +*/ -static const struct i2c_device_id sensor_id[] = { - {SENSOR_NAME_STRING(), 0 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, sensor_id); - -static struct i2c_driver sensor_i2c_driver = { - .driver = { - .name = SENSOR_NAME_STRING(), - }, - .probe = sensor_probe, - .remove = sensor_remove, - .id_table = sensor_id, -}; +sensor_init_parameters_default_code(); -static int __init sensor_mod_init(void) -{ - printk("\n*****************%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING()); -#ifdef CONFIG_SOC_CAMERA_FCAM - return 0; -#else - return i2c_add_driver(&sensor_i2c_driver); -#endif -} +sensor_v4l2_struct_initialization(); -static void __exit sensor_mod_exit(void) -{ - i2c_del_driver(&sensor_i2c_driver); -} +sensor_probe_default_code(); -device_initcall_sync(sensor_mod_init); -module_exit(sensor_mod_exit); +sensor_remove_default_code(); -MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver)); -MODULE_AUTHOR("ddl "); -MODULE_LICENSE("GPL"); +sensor_driver_default_module_code(); diff --git a/drivers/media/video/sp2518.c b/drivers/media/video/sp2518.c index ef108f9df737..a003f30f05fc 100755 --- a/drivers/media/video/sp2518.c +++ b/drivers/media/video/sp2518.c @@ -24,7 +24,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define SENSOR_ID 0x53 #define SENSOR_BUS_PARAM (V4L2_MBUS_MASTER |\ V4L2_MBUS_PCLK_SAMPLE_RISING|V4L2_MBUS_HSYNC_ACTIVE_HIGH| V4L2_MBUS_VSYNC_ACTIVE_HIGH|\ - V4L2_MBUS_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ) + V4L2_MBUS_DATA_ACTIVE_HIGH |SOCAM_MCLK_24MHZ) #define SENSOR_PREVIEW_W 800 #define SENSOR_PREVIEW_H 600 #define SENSOR_PREVIEW_FPS 15000 // 15fps -- 2.34.1