summaryrefslogtreecommitdiff
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorGuoniu.Zhou <guoniu.zhou@nxp.com>2018-07-25 11:20:04 +0800
committerJason Liu <jason.hui.liu@nxp.com>2018-10-29 11:10:38 +0800
commit4ecbf0e1415dfd9d862d24a357e85025182662fc (patch)
tree2df2dc79fd2bb39effe17c2883b8ae03b663da39 /drivers/media/platform
parent7929b6acab9b26eb6dce4b638d2f8e0592768e4b (diff)
MLK-19007-2: camera: add "NTSC, 720P, QSXGA" for mipi ov5640
1. Use ISI channel 2 instead of 1 for mipi ov5640 because if image line resolution is more than 2k, isi line buffer need to chain to recevice line data 2. Add 15fps QSXGA, 30fps NTSC and 720P support for mipi ov5640 Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com> Reviewed-by: Robby.Cai <robby.cai@nxp.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/imx8/ov5640_mipi_v3.c759
1 files changed, 289 insertions, 470 deletions
diff --git a/drivers/media/platform/imx8/ov5640_mipi_v3.c b/drivers/media/platform/imx8/ov5640_mipi_v3.c
index 0dfdbece3c0c..7aed344bf7d7 100644
--- a/drivers/media/platform/imx8/ov5640_mipi_v3.c
+++ b/drivers/media/platform/imx8/ov5640_mipi_v3.c
@@ -45,11 +45,12 @@
enum ov5640_mode {
ov5640_mode_MIN = 0,
ov5640_mode_VGA_640_480 = 0,
- ov5640_mode_QVGA_320_240 = 1,
- ov5640_mode_480_272 = 2,
- ov5640_mode_720P_1280_720 = 3,
- ov5640_mode_1080P_1920_1080 = 4,
- ov5640_mode_MAX = 4
+ ov5640_mode_NTSC_720_480 = 1,
+ ov5640_mode_720P_1280_720 = 2,
+ ov5640_mode_1080P_1920_1080 = 3,
+ ov5640_mode_QSXGA_2592_1944 = 4,
+ ov5640_mode_MAX = 5,
+ ov5640_mode_INIT = 0xff, /*only for sensor init*/
};
enum ov5640_frame_rate {
@@ -67,6 +68,14 @@ struct ov5640_datafmt {
enum v4l2_colorspace colorspace;
};
+/* image size under 1280 * 960 are SUBSAMPLING
+ * image size upper 1280 * 960 are SCALING
+ */
+enum ov5640_downsize_mode {
+ SUBSAMPLING,
+ SCALING,
+};
+
struct reg_value {
u16 u16RegAddr;
u8 u8Val;
@@ -76,6 +85,7 @@ struct reg_value {
struct ov5640_mode_info {
enum ov5640_mode mode;
+ enum ov5640_downsize_mode dn_mode;
u32 width;
u32 height;
struct reg_value *init_data_ptr;
@@ -123,401 +133,273 @@ struct ov5640 {
int pwn_gpio, rst_gpio;
};
-static struct reg_value ov5640_init_parm[] = {
- {0x3008, 0x42, 0, 0},
-
- /* System setting.0*/
- {0x3103, 0x03, 0, 0},
- {0x3000, 0x00, 0, 0},
- {0x3004, 0xff, 0, 0},
- {0x3002, 0x1c, 0, 0},
- {0x3006, 0xc3, 0, 0},
- {0x302e, 0x08, 0, 0},
- {0x3037, 0x13, 0, 0},
- {0x3108, 0x01, 0, 0},
- {0x3618, 0x00, 0, 0},
- {0x3612, 0x29, 0, 0},
- {0x3708, 0x64, 0, 0},
- {0x3709, 0x52, 0, 0},
- {0x370c, 0x03, 0, 0},
- {0x3820, 0x41, 0, 0},
- {0x3821, 0x07, 0, 0},
- {0x3630, 0x36, 0, 0},
- {0x3631, 0x0e, 0, 0},
- {0x3632, 0xe2, 0, 0},
- {0x3633, 0x12, 0, 0},
- {0x3621, 0xe0, 0, 0},
- {0x3704, 0xa0, 0, 0},
- {0x3703, 0x5a, 0, 0},
- {0x3715, 0x78, 0, 0},
- {0x3717, 0x01, 0, 0},
- {0x370b, 0x60, 0, 0},
- {0x3705, 0x1a, 0, 0},
- {0x3905, 0x02, 0, 0},
- {0x3906, 0x10, 0, 0},
- {0x3901, 0x0a, 0, 0},
- {0x3731, 0x12, 0, 0},
- {0x3600, 0x08, 0, 0},
- {0x3601, 0x33, 0, 0},
- {0x302d, 0x60, 0, 0},
- {0x3620, 0x52, 0, 0},
- {0x371b, 0x20, 0, 0},
- {0x471c, 0x50, 0, 0},
- {0x3a13, 0x43, 0, 0},
- {0x3a18, 0x00, 0, 0},
- {0x3a19, 0x7c, 0, 0},
- {0x3635, 0x13, 0, 0},
- {0x3636, 0x03, 0, 0},
- {0x3634, 0x40, 0, 0},
- {0x3622, 0x01, 0, 0},
- {0x3c01, 0x00, 0, 0},
- {0x3a00, 0x58, 0, 0},
- {0x4001, 0x02, 0, 0},
- {0x4004, 0x02, 0, 0},
- {0x4005, 0x1a, 0, 0},
- {0x5001, 0xa3, 0, 0},
-
- /* AEC */
- {0x3a0f, 0x30, 0, 0},
- {0x3a10, 0x28, 0, 0},
- {0x3a1b, 0x30, 0, 0},
- {0x3a1e, 0x26, 0, 0},
- {0x3a11, 0x60, 0, 0},
- {0x3a1f, 0x14, 0, 0},
-
- /* AWB */
- {0x5180, 0xff, 0, 0},
- {0x5181, 0xf2, 0, 0},
- {0x5182, 0x00, 0, 0},
- {0x5183, 0x14, 0, 0},
- {0x5184, 0x25, 0, 0},
- {0x5185, 0x24, 0, 0},
- {0x5186, 0x09, 0, 0},
- {0x5187, 0x09, 0, 0},
- {0x5188, 0x09, 0, 0},
- {0x5189, 0x88, 0, 0},
- {0x518a, 0x54, 0, 0},
- {0x518b, 0xee, 0, 0},
- {0x518c, 0xb2, 0, 0},
- {0x518d, 0x50, 0, 0},
- {0x518e, 0x34, 0, 0},
- {0x518f, 0x6b, 0, 0},
- {0x5190, 0x46, 0, 0},
- {0x5191, 0xf8, 0, 0},
- {0x5192, 0x04, 0, 0},
- {0x5193, 0x70, 0, 0},
- {0x5194, 0xf0, 0, 0},
- {0x5195, 0xf0, 0, 0},
- {0x5196, 0x03, 0, 0},
- {0x5197, 0x01, 0, 0},
- {0x5198, 0x04, 0, 0},
- {0x5199, 0x6c, 0, 0},
- {0x519a, 0x04, 0, 0},
- {0x519b, 0x00, 0, 0},
- {0x519c, 0x09, 0, 0},
- {0x519d, 0x2b, 0, 0},
- {0x519e, 0x38, 0, 0},
-
- /* Color Matrix */
- {0x5381, 0x1e, 0, 0},
- {0x5382, 0x5b, 0, 0},
- {0x5383, 0x08, 0, 0},
- {0x5384, 0x0a, 0, 0},
- {0x5385, 0x7e, 0, 0},
- {0x5386, 0x88, 0, 0},
- {0x5387, 0x7c, 0, 0},
- {0x5388, 0x6c, 0, 0},
- {0x5389, 0x10, 0, 0},
- {0x538a, 0x01, 0, 0},
- {0x538b, 0x98, 0, 0},
-
- /* sharp */
- {0x5300, 0x08, 0, 0},
- {0x5301, 0x30, 0, 0},
- {0x5302, 0x10, 0, 0},
- {0x5303, 0x00, 0, 0},
- {0x5304, 0x08, 0, 0},
- {0x5305, 0x30, 0, 0},
- {0x5306, 0x08, 0, 0},
- {0x5307, 0x16, 0, 0},
- {0x5309, 0x08, 0, 0},
- {0x530a, 0x30, 0, 0},
- {0x530b, 0x04, 0, 0},
- {0x530c, 0x06, 0, 0},
-
- /* Gamma */
- {0x5480, 0x01, 0, 0},
- {0x5481, 0x08, 0, 0},
- {0x5482, 0x14, 0, 0},
- {0x5483, 0x28, 0, 0},
- {0x5484, 0x51, 0, 0},
- {0x5485, 0x65, 0, 0},
- {0x5486, 0x71, 0, 0},
- {0x5487, 0x7d, 0, 0},
- {0x5488, 0x87, 0, 0},
- {0x5489, 0x91, 0, 0},
- {0x548a, 0x9a, 0, 0},
- {0x548b, 0xaa, 0, 0},
- {0x548c, 0xb8, 0, 0},
- {0x548d, 0xcd, 0, 0},
- {0x548e, 0xdd, 0, 0},
- {0x548f, 0xea, 0, 0},
- {0x5490, 0x1d, 0, 0},
-
- /* UV adjust. */
- {0x5580, 0x02, 0, 0},
- {0x5583, 0x40, 0, 0},
- {0x5584, 0x10, 0, 0},
- {0x5589, 0x10, 0, 0},
- {0x558a, 0x00, 0, 0},
- {0x558b, 0xf8, 0, 0},
-
- /* Lens correction0 */
- {0x5800, 0x23, 0, 0},
- {0x5801, 0x14, 0, 0},
- {0x5802, 0x0f, 0, 0},
- {0x5803, 0x0f, 0, 0},
- {0x5804, 0x12, 0, 0},
- {0x5805, 0x26, 0, 0},
- {0x5806, 0x0c, 0, 0},
- {0x5807, 0x08, 0, 0},
- {0x5808, 0x05, 0, 0},
- {0x5809, 0x05, 0, 0},
- {0x580a, 0x08, 0, 0},
- {0x580b, 0x0d, 0, 0},
- {0x580c, 0x08, 0, 0},
- {0x580d, 0x03, 0, 0},
- {0x580e, 0x00, 0, 0},
- {0x580f, 0x00, 0, 0},
- {0x5810, 0x03, 0, 0},
- {0x5811, 0x09, 0, 0},
- {0x5812, 0x07, 0, 0},
- {0x5813, 0x03, 0, 0},
- {0x5814, 0x00, 0, 0},
- {0x5815, 0x01, 0, 0},
- {0x5816, 0x03, 0, 0},
- {0x5817, 0x08, 0, 0},
- {0x5818, 0x0d, 0, 0},
- {0x5819, 0x08, 0, 0},
- {0x581a, 0x05, 0, 0},
- {0x581b, 0x06, 0, 0},
- {0x581c, 0x08, 0, 0},
- {0x581d, 0x0e, 0, 0},
- {0x581e, 0x29, 0, 0},
- {0x581f, 0x17, 0, 0},
- {0x5820, 0x11, 0, 0},
- {0x5821, 0x11, 0, 0},
- {0x5822, 0x15, 0, 0},
- {0x5823, 0x28, 0, 0},
- {0x5824, 0x46, 0, 0},
- {0x5825, 0x26, 0, 0},
- {0x5826, 0x08, 0, 0},
- {0x5827, 0x26, 0, 0},
- {0x5828, 0x64, 0, 0},
- {0x5829, 0x26, 0, 0},
- {0x582a, 0x24, 0, 0},
- {0x582b, 0x22, 0, 0},
- {0x582c, 0x24, 0, 0},
- {0x582d, 0x24, 0, 0},
- {0x582e, 0x06, 0, 0},
- {0x582f, 0x22, 0, 0},
- {0x5830, 0x40, 0, 0},
- {0x5831, 0x42, 0, 0},
- {0x5832, 0x24, 0, 0},
- {0x5833, 0x26, 0, 0},
- {0x5834, 0x24, 0, 0},
- {0x5835, 0x22, 0, 0},
- {0x5836, 0x22, 0, 0},
- {0x5837, 0x26, 0, 0},
- {0x5838, 0x44, 0, 0},
- {0x5839, 0x24, 0, 0},
- {0x583a, 0x26, 0, 0},
- {0x583b, 0x28, 0, 0},
- {0x583c, 0x42, 0, 0},
- {0x583d, 0xce, 0, 0},
- };
-
-static struct reg_value ov5640_setting_VGA_640_480[] = {
- {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0}, {0x3802, 0x00, 0, 0},
- {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0}, {0x3805, 0x3f, 0, 0},
- {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0}, {0x3808, 0x02, 0, 0},
- {0x3809, 0x80, 0, 0}, {0x380a, 0x01, 0, 0}, {0x380b, 0xe0, 0, 0},
- {0x380c, 0x07, 0, 0}, {0x380d, 0x68, 0, 0}, {0x380e, 0x03, 0, 0},
- {0x380f, 0xd8, 0, 0}, {0x3810, 0x00, 0, 0}, {0x3811, 0x10, 0, 0},
- {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0}, {0x3814, 0x31, 0, 0},
- {0x3815, 0x31, 0, 0},
+static struct reg_value ov5640_init_setting_30fps_VGA[] = {
+
+ {0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0},
+ {0x3103, 0x03, 0, 0}, {0x3017, 0x00, 0, 0}, {0x3018, 0x00, 0, 0},
+ {0x3034, 0x18, 0, 0}, {0x3035, 0x14, 0, 0}, {0x3036, 0x38, 0, 0},
+ {0x3037, 0x13, 0, 0}, {0x3108, 0x01, 0, 0}, {0x3630, 0x36, 0, 0},
+ {0x3631, 0x0e, 0, 0}, {0x3632, 0xe2, 0, 0}, {0x3633, 0x12, 0, 0},
+ {0x3621, 0xe0, 0, 0}, {0x3704, 0xa0, 0, 0}, {0x3703, 0x5a, 0, 0},
+ {0x3715, 0x78, 0, 0}, {0x3717, 0x01, 0, 0}, {0x370b, 0x60, 0, 0},
+ {0x3705, 0x1a, 0, 0}, {0x3905, 0x02, 0, 0}, {0x3906, 0x10, 0, 0},
+ {0x3901, 0x0a, 0, 0}, {0x3731, 0x12, 0, 0}, {0x3600, 0x08, 0, 0},
+ {0x3601, 0x33, 0, 0}, {0x302d, 0x60, 0, 0}, {0x3620, 0x52, 0, 0},
+ {0x371b, 0x20, 0, 0}, {0x471c, 0x50, 0, 0}, {0x3a13, 0x43, 0, 0},
+ {0x3a18, 0x00, 0, 0}, {0x3a19, 0xf8, 0, 0}, {0x3635, 0x13, 0, 0},
+ {0x3636, 0x03, 0, 0}, {0x3634, 0x40, 0, 0}, {0x3622, 0x01, 0, 0},
+ {0x3c01, 0xa4, 0, 0}, {0x3c04, 0x28, 0, 0}, {0x3c05, 0x98, 0, 0},
+ {0x3c06, 0x00, 0, 0}, {0x3c07, 0x08, 0, 0}, {0x3c08, 0x00, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
+ {0x3820, 0x41, 0, 0}, {0x3821, 0x07, 0, 0}, {0x3814, 0x31, 0, 0},
+ {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
+ {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
+ {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
+ {0x3808, 0x02, 0, 0}, {0x3809, 0x80, 0, 0}, {0x380a, 0x01, 0, 0},
+ {0x380b, 0xe0, 0, 0}, {0x380c, 0x07, 0, 0}, {0x380d, 0x68, 0, 0},
+ {0x380e, 0x03, 0, 0}, {0x380f, 0xd8, 0, 0}, {0x3810, 0x00, 0, 0},
+ {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
+ {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
+ {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
+ {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
+ {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
+ {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
+ {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x3000, 0x00, 0, 0},
+ {0x3002, 0x1c, 0, 0}, {0x3004, 0xff, 0, 0}, {0x3006, 0xc3, 0, 0},
+ {0x300e, 0x45, 0, 0}, {0x302e, 0x08, 0, 0}, {0x4300, 0x3F, 0, 0},
+ {0x501f, 0x00, 0, 0}, {0x4713, 0x03, 0, 0}, {0x4407, 0x04, 0, 0},
+ {0x440e, 0x00, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
+ {0x4837, 0x0a, 0, 0}, {0x4800, 0x04, 0, 0}, {0x3824, 0x02, 0, 0},
+ {0x5000, 0xa7, 0, 0}, {0x5001, 0xa3, 0, 0}, {0x5180, 0xff, 0, 0},
+ {0x5181, 0xf2, 0, 0}, {0x5182, 0x00, 0, 0}, {0x5183, 0x14, 0, 0},
+ {0x5184, 0x25, 0, 0}, {0x5185, 0x24, 0, 0}, {0x5186, 0x09, 0, 0},
+ {0x5187, 0x09, 0, 0}, {0x5188, 0x09, 0, 0}, {0x5189, 0x88, 0, 0},
+ {0x518a, 0x54, 0, 0}, {0x518b, 0xee, 0, 0}, {0x518c, 0xb2, 0, 0},
+ {0x518d, 0x50, 0, 0}, {0x518e, 0x34, 0, 0}, {0x518f, 0x6b, 0, 0},
+ {0x5190, 0x46, 0, 0}, {0x5191, 0xf8, 0, 0}, {0x5192, 0x04, 0, 0},
+ {0x5193, 0x70, 0, 0}, {0x5194, 0xf0, 0, 0}, {0x5195, 0xf0, 0, 0},
+ {0x5196, 0x03, 0, 0}, {0x5197, 0x01, 0, 0}, {0x5198, 0x04, 0, 0},
+ {0x5199, 0x6c, 0, 0}, {0x519a, 0x04, 0, 0}, {0x519b, 0x00, 0, 0},
+ {0x519c, 0x09, 0, 0}, {0x519d, 0x2b, 0, 0}, {0x519e, 0x38, 0, 0},
+ {0x5381, 0x1e, 0, 0}, {0x5382, 0x5b, 0, 0}, {0x5383, 0x08, 0, 0},
+ {0x5384, 0x0a, 0, 0}, {0x5385, 0x7e, 0, 0}, {0x5386, 0x88, 0, 0},
+ {0x5387, 0x7c, 0, 0}, {0x5388, 0x6c, 0, 0}, {0x5389, 0x10, 0, 0},
+ {0x538a, 0x01, 0, 0}, {0x538b, 0x98, 0, 0}, {0x5300, 0x08, 0, 0},
+ {0x5301, 0x30, 0, 0}, {0x5302, 0x10, 0, 0}, {0x5303, 0x00, 0, 0},
+ {0x5304, 0x08, 0, 0}, {0x5305, 0x30, 0, 0}, {0x5306, 0x08, 0, 0},
+ {0x5307, 0x16, 0, 0}, {0x5309, 0x08, 0, 0}, {0x530a, 0x30, 0, 0},
+ {0x530b, 0x04, 0, 0}, {0x530c, 0x06, 0, 0}, {0x5480, 0x01, 0, 0},
+ {0x5481, 0x08, 0, 0}, {0x5482, 0x14, 0, 0}, {0x5483, 0x28, 0, 0},
+ {0x5484, 0x51, 0, 0}, {0x5485, 0x65, 0, 0}, {0x5486, 0x71, 0, 0},
+ {0x5487, 0x7d, 0, 0}, {0x5488, 0x87, 0, 0}, {0x5489, 0x91, 0, 0},
+ {0x548a, 0x9a, 0, 0}, {0x548b, 0xaa, 0, 0}, {0x548c, 0xb8, 0, 0},
+ {0x548d, 0xcd, 0, 0}, {0x548e, 0xdd, 0, 0}, {0x548f, 0xea, 0, 0},
+ {0x5490, 0x1d, 0, 0}, {0x5580, 0x02, 0, 0}, {0x5583, 0x40, 0, 0},
+ {0x5584, 0x10, 0, 0}, {0x5589, 0x10, 0, 0}, {0x558a, 0x00, 0, 0},
+ {0x558b, 0xf8, 0, 0}, {0x5800, 0x23, 0, 0}, {0x5801, 0x14, 0, 0},
+ {0x5802, 0x0f, 0, 0}, {0x5803, 0x0f, 0, 0}, {0x5804, 0x12, 0, 0},
+ {0x5805, 0x26, 0, 0}, {0x5806, 0x0c, 0, 0}, {0x5807, 0x08, 0, 0},
+ {0x5808, 0x05, 0, 0}, {0x5809, 0x05, 0, 0}, {0x580a, 0x08, 0, 0},
+ {0x580b, 0x0d, 0, 0}, {0x580c, 0x08, 0, 0}, {0x580d, 0x03, 0, 0},
+ {0x580e, 0x00, 0, 0}, {0x580f, 0x00, 0, 0}, {0x5810, 0x03, 0, 0},
+ {0x5811, 0x09, 0, 0}, {0x5812, 0x07, 0, 0}, {0x5813, 0x03, 0, 0},
+ {0x5814, 0x00, 0, 0}, {0x5815, 0x01, 0, 0}, {0x5816, 0x03, 0, 0},
+ {0x5817, 0x08, 0, 0}, {0x5818, 0x0d, 0, 0}, {0x5819, 0x08, 0, 0},
+ {0x581a, 0x05, 0, 0}, {0x581b, 0x06, 0, 0}, {0x581c, 0x08, 0, 0},
+ {0x581d, 0x0e, 0, 0}, {0x581e, 0x29, 0, 0}, {0x581f, 0x17, 0, 0},
+ {0x5820, 0x11, 0, 0}, {0x5821, 0x11, 0, 0}, {0x5822, 0x15, 0, 0},
+ {0x5823, 0x28, 0, 0}, {0x5824, 0x46, 0, 0}, {0x5825, 0x26, 0, 0},
+ {0x5826, 0x08, 0, 0}, {0x5827, 0x26, 0, 0}, {0x5828, 0x64, 0, 0},
+ {0x5829, 0x26, 0, 0}, {0x582a, 0x24, 0, 0}, {0x582b, 0x22, 0, 0},
+ {0x582c, 0x24, 0, 0}, {0x582d, 0x24, 0, 0}, {0x582e, 0x06, 0, 0},
+ {0x582f, 0x22, 0, 0}, {0x5830, 0x40, 0, 0}, {0x5831, 0x42, 0, 0},
+ {0x5832, 0x24, 0, 0}, {0x5833, 0x26, 0, 0}, {0x5834, 0x24, 0, 0},
+ {0x5835, 0x22, 0, 0}, {0x5836, 0x22, 0, 0}, {0x5837, 0x26, 0, 0},
+ {0x5838, 0x44, 0, 0}, {0x5839, 0x24, 0, 0}, {0x583a, 0x26, 0, 0},
+ {0x583b, 0x28, 0, 0}, {0x583c, 0x42, 0, 0}, {0x583d, 0xce, 0, 0},
+ {0x5025, 0x00, 0, 0}, {0x3a0f, 0x30, 0, 0}, {0x3a10, 0x28, 0, 0},
+ {0x3a1b, 0x30, 0, 0}, {0x3a1e, 0x26, 0, 0}, {0x3a11, 0x60, 0, 0},
+ {0x3a1f, 0x14, 0, 0}, {0x3008, 0x42, 0, 0}, {0x3c00, 0x04, 0, 300},
};
-static struct reg_value ov5640_setting_QVGA_320_240[] = {
- {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0}, {0x3802, 0x00, 0, 0},
- {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0}, {0x3805, 0x3f, 0, 0},
- {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0}, {0x3808, 0x01, 0, 0},
- {0x3809, 0x40, 0, 0}, {0x380a, 0x00, 0, 0}, {0x380b, 0xf0, 0, 0},
- {0x380c, 0x07, 0, 0}, {0x380d, 0x68, 0, 0}, {0x380e, 0x03, 0, 0},
- {0x380f, 0xd8, 0, 0}, {0x3810, 0x00, 0, 0}, {0x3811, 0x10, 0, 0},
- {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0}, {0x3814, 0x31, 0, 0},
- {0x3815, 0x31, 0, 0},
+static struct reg_value ov5640_setting_30fps_VGA_640_480[] = {
+ {0x3008, 0x42, 0, 0},
+ {0x3035, 0x12, 0, 0}, {0x3036, 0x38, 0, 0}, {0x3c07, 0x08, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
+ {0x3820, 0x41, 0, 0}, {0x3821, 0x07, 0, 0}, {0x3814, 0x31, 0, 0},
+ {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
+ {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
+ {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
+ {0x3808, 0x02, 0, 0}, {0x3809, 0x80, 0, 0}, {0x380a, 0x01, 0, 0},
+ {0x380b, 0xe0, 0, 0}, {0x380c, 0x07, 0, 0}, {0x380d, 0x68, 0, 0},
+ {0x380e, 0x04, 0, 0}, {0x380f, 0x38, 0, 0}, {0x3810, 0x00, 0, 0},
+ {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
+ {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
+ {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
+ {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x0e, 0, 0},
+ {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
+ {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
+ {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x4713, 0x03, 0, 0},
+ {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
+ {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
+ {0x4005, 0x1a, 0, 0}, {0x3008, 0x02, 0, 0}, {0x3503, 0x00, 0, 0},
};
-static struct reg_value ov5640_setting_480_272[] = {
- {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0}, {0x3802, 0x00, 0, 0},
- {0x3803, 0xfa, 0, 0}, {0x3804, 0x0a, 0, 0}, {0x3805, 0x3f, 0, 0},
- {0x3806, 0x06, 0, 0}, {0x3807, 0xa9, 0, 0}, {0x3808, 0x01, 0, 0},
- {0x3809, 0xE0, 0, 0}, {0x380a, 0x01, 0, 0}, {0x380b, 0x10, 0, 0},
- {0x380c, 0x07, 0, 0}, {0x380d, 0x64, 0, 0}, {0x380e, 0x02, 0, 0},
- {0x380f, 0xe4, 0, 0}, {0x3810, 0x00, 0, 0}, {0x3811, 0x10, 0, 0},
- {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0}, {0x3814, 0x31, 0, 0},
- {0x3815, 0x31, 0, 0},
+static struct reg_value ov5640_setting_30fps_NTSC_720_480[] = {
+ {0x3008, 0x42, 0, 0},
+ {0x3035, 0x12, 0, 0}, {0x3036, 0x38, 0, 0}, {0x3c07, 0x08, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
+ {0x3820, 0x41, 0, 0}, {0x3821, 0x07, 0, 0}, {0x3814, 0x31, 0, 0},
+ {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
+ {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
+ {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
+ {0x3808, 0x02, 0, 0}, {0x3809, 0xd0, 0, 0}, {0x380a, 0x01, 0, 0},
+ {0x380b, 0xe0, 0, 0}, {0x380c, 0x07, 0, 0}, {0x380d, 0x68, 0, 0},
+ {0x380e, 0x03, 0, 0}, {0x380f, 0xd8, 0, 0}, {0x3810, 0x00, 0, 0},
+ {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x3c, 0, 0},
+ {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
+ {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
+ {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
+ {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
+ {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
+ {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x4713, 0x03, 0, 0},
+ {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
+ {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
+ {0x4005, 0x1a, 0, 0}, {0x3008, 0x02, 0, 0}, {0x3503, 0, 0, 0},
};
-static struct reg_value ov5640_setting_720P_1280_720[] = {
- {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0}, {0x3802, 0x00, 0, 0},
- {0x3803, 0xfa, 0, 0}, {0x3804, 0x0a, 0, 0}, {0x3805, 0x3f, 0, 0},
- {0x3806, 0x06, 0, 0}, {0x3807, 0xa9, 0, 0}, {0x3808, 0x05, 0, 0},
- {0x3809, 0x00, 0, 0}, {0x380a, 0x02, 0, 0}, {0x380b, 0xd0, 0, 0},
- {0x380c, 0x07, 0, 0}, {0x380d, 0x64, 0, 0}, {0x380e, 0x02, 0, 0},
- {0x380f, 0xe4, 0, 0}, {0x3810, 0x00, 0, 0}, {0x3811, 0x10, 0, 0},
- {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0}, {0x3814, 0x31, 0, 0},
- {0x3815, 0x31, 0, 0},
+static struct reg_value ov5640_setting_30fps_720P_1280_720[] = {
+ {0x3008, 0x42, 0, 0},
+ {0x3035, 0x21, 0, 0}, {0x3036, 0x54, 0, 0}, {0x3c07, 0x07, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
+ {0x3820, 0x41, 0, 0}, {0x3821, 0x07, 0, 0}, {0x3814, 0x31, 0, 0},
+ {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
+ {0x3802, 0x00, 0, 0}, {0x3803, 0xfa, 0, 0}, {0x3804, 0x0a, 0, 0},
+ {0x3805, 0x3f, 0, 0}, {0x3806, 0x06, 0, 0}, {0x3807, 0xa9, 0, 0},
+ {0x3808, 0x05, 0, 0}, {0x3809, 0x00, 0, 0}, {0x380a, 0x02, 0, 0},
+ {0x380b, 0xd0, 0, 0}, {0x380c, 0x07, 0, 0}, {0x380d, 0x64, 0, 0},
+ {0x380e, 0x02, 0, 0}, {0x380f, 0xe4, 0, 0}, {0x3810, 0x00, 0, 0},
+ {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0},
+ {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
+ {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x02, 0, 0},
+ {0x3a03, 0xe4, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0xbc, 0, 0},
+ {0x3a0a, 0x01, 0, 0}, {0x3a0b, 0x72, 0, 0}, {0x3a0e, 0x01, 0, 0},
+ {0x3a0d, 0x02, 0, 0}, {0x3a14, 0x02, 0, 0}, {0x3a15, 0xe4, 0, 0},
+ {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x4713, 0x02, 0, 0},
+ {0x4407, 0x04, 0, 0}, {0x460b, 0x37, 0, 0}, {0x460c, 0x20, 0, 0},
+ {0x3824, 0x04, 0, 0}, {0x5001, 0x83, 0, 0}, {0x4005, 0x1a, 0, 0},
+ {0x3008, 0x02, 0, 0}, {0x3503, 0, 0, 0},
};
-static struct reg_value ov5640_setting_1080P_1920_1080[] = {
+static struct reg_value ov5640_setting_30fps_1080P_1920_1080[] = {
+ {0x3008, 0x42, 0, 0},
+ {0x3035, 0x21, 0, 0}, {0x3036, 0x54, 0, 0}, {0x3c07, 0x08, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
+ {0x3820, 0x40, 0, 0}, {0x3821, 0x06, 0, 0}, {0x3814, 0x11, 0, 0},
+ {0x3815, 0x11, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
+ {0x3802, 0x00, 0, 0}, {0x3803, 0x00, 0, 0}, {0x3804, 0x0a, 0, 0},
+ {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9f, 0, 0},
+ {0x3808, 0x0a, 0, 0}, {0x3809, 0x20, 0, 0}, {0x380a, 0x07, 0, 0},
+ {0x380b, 0x98, 0, 0}, {0x380c, 0x0b, 0, 0}, {0x380d, 0x1c, 0, 0},
+ {0x380e, 0x07, 0, 0}, {0x380f, 0xb0, 0, 0}, {0x3810, 0x00, 0, 0},
+ {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0},
+ {0x3618, 0x04, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x21, 0, 0},
+ {0x3709, 0x12, 0, 0}, {0x370c, 0x00, 0, 0}, {0x3a02, 0x03, 0, 0},
+ {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
+ {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
+ {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
+ {0x4001, 0x02, 0, 0}, {0x4004, 0x06, 0, 0}, {0x4713, 0x03, 0, 0},
+ {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
+ {0x3824, 0x02, 0, 0}, {0x5001, 0x83, 0, 0}, {0x3035, 0x11, 0, 0},
+ {0x3036, 0x54, 0, 0}, {0x3c07, 0x07, 0, 0}, {0x3c08, 0x00, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
{0x3800, 0x01, 0, 0}, {0x3801, 0x50, 0, 0}, {0x3802, 0x01, 0, 0},
{0x3803, 0xb2, 0, 0}, {0x3804, 0x08, 0, 0}, {0x3805, 0xef, 0, 0},
{0x3806, 0x05, 0, 0}, {0x3807, 0xf1, 0, 0}, {0x3808, 0x07, 0, 0},
{0x3809, 0x80, 0, 0}, {0x380a, 0x04, 0, 0}, {0x380b, 0x38, 0, 0},
{0x380c, 0x09, 0, 0}, {0x380d, 0xc4, 0, 0}, {0x380e, 0x04, 0, 0},
- {0x380f, 0x60, 0, 0}, {0x3810, 0x00, 0, 0}, {0x3811, 0x10, 0, 0},
- {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0}, {0x3814, 0x11, 0, 0},
- {0x3815, 0x11, 0, 0},
-};
-
-/* MIPI */
-static struct reg_value ov5640_mipi_pll_VGA_30fps_640_480[] = {
- {0x3035, 0x14, 0, 0}, {0x3036, 0x38, 0, 0}, {0x460c, 0x22, 0, 0},
- {0x3824, 0x02, 0, 0}, {0x4837, 0x0a, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_VGA_15fps_640_480[] = {
- {0x3035, 0x22, 0, 0}, {0x3036, 0x38, 0, 0}, {0x460c, 0x22, 0, 0},
- {0x3824, 0x02, 0, 0}, {0x4837, 0x0a, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_QVGA_30fps_320_240[] = {
- {0x3035, 0x14, 0, 0}, {0x3036, 0x38, 0, 0}, {0x460c, 0x22, 0, 0},
- {0x3824, 0x02, 0, 0}, {0x4837, 0x22, 0, 0},
+ {0x380f, 0x60, 0, 0}, {0x3612, 0x2b, 0, 0}, {0x3708, 0x64, 0, 0},
+ {0x3a02, 0x04, 0, 0}, {0x3a03, 0x60, 0, 0}, {0x3a08, 0x01, 0, 0},
+ {0x3a09, 0x50, 0, 0}, {0x3a0a, 0x01, 0, 0}, {0x3a0b, 0x18, 0, 0},
+ {0x3a0e, 0x03, 0, 0}, {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x04, 0, 0},
+ {0x3a15, 0x60, 0, 0}, {0x4713, 0x02, 0, 0}, {0x4407, 0x04, 0, 0},
+ {0x460b, 0x37, 0, 0}, {0x460c, 0x20, 0, 0}, {0x3824, 0x04, 0, 0},
+ {0x4005, 0x1a, 0, 0}, {0x3008, 0x02, 0, 0},
+ {0x3503, 0, 0, 0},
};
-static struct reg_value ov5640_mipi_pll_QVGA_15fps_320_240[] = {
- {0x3035, 0x22, 0, 0}, {0x3036, 0x38, 0, 0}, {0x460c, 0x22, 0, 0},
- {0x3824, 0x02, 0, 0}, {0x4837, 0x0a, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_30fps_480_272[] = {
- {0x3035, 0x21, 0, 0}, {0x3036, 0x69, 0, 0}, {0x460c, 0x20, 0, 0},
- {0x3824, 0x04, 0, 0}, {0x4837, 0x16, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_15fps_480_272[] = {
- {0x3035, 0x41, 0, 0}, {0x3036, 0x69, 0, 0}, {0x460c, 0x20, 0, 0},
- {0x3824, 0x04, 0, 0}, {0x4837, 0x16, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_720P_30fps_1280_720[] = {
- {0x3035, 0x21, 0, 0}, {0x3036, 0x54, 0, 0}, {0x460c, 0x20, 0, 0},
- {0x3824, 0x04, 0, 0}, {0x4837, 0x0a, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_720P_15fps_1280_720[] = {
- {0x3035, 0x41, 0, 0}, {0x3036, 0x54, 0, 0}, {0x460c, 0x20, 0, 0},
- {0x3824, 0x04, 0, 0}, {0x4837, 0x0a, 0, 0},
-};
-
-static struct reg_value ov5640_mipi_pll_1080P_15fps_1920_1080[] = {
- {0x3035, 0x21, 0, 0}, {0x3036, 0x54, 0, 0}, {0x460c, 0x20, 0, 0},
- {0x3824, 0x04, 0, 0}, {0x4837, 0x0a, 0, 0},
-};
-
-static struct ov5640_mode_info ov5640_mode_info_data[ov5640_mode_MAX + 1] = {
- {ov5640_mode_VGA_640_480, 640, 480, ov5640_setting_VGA_640_480,
- ARRAY_SIZE(ov5640_setting_VGA_640_480)},
-
- {ov5640_mode_QVGA_320_240, 320, 240, ov5640_setting_QVGA_320_240,
- ARRAY_SIZE(ov5640_setting_QVGA_320_240)},
-
- {ov5640_mode_480_272, 480, 272, ov5640_setting_480_272,
- ARRAY_SIZE(ov5640_setting_480_272)},
-
- {ov5640_mode_720P_1280_720, 1280, 720, ov5640_setting_720P_1280_720,
- ARRAY_SIZE(ov5640_setting_720P_1280_720)},
-
- {ov5640_mode_1080P_1920_1080, 1920, 1080, ov5640_setting_1080P_1920_1080,
- ARRAY_SIZE(ov5640_setting_1080P_1920_1080)},
+static struct reg_value ov5640_setting_15fps_QSXGA_2592_1944[] = {
+ {0x3008, 0x42, 0, 0},
+ {0x4202, 0x0f, 0, 0}, /* stream off the sensor */
+ {0x3820, 0x40, 0, 0}, {0x3821, 0x06, 0, 0}, /*disable flip*/
+ {0x3035, 0x21, 0, 0}, {0x3036, 0x54, 0, 0}, {0x3c07, 0x08, 0, 0},
+ {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
+ {0x3820, 0x40, 0, 0}, {0x3821, 0x06, 0, 0}, {0x3814, 0x11, 0, 0},
+ {0x3815, 0x11, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
+ {0x3802, 0x00, 0, 0}, {0x3803, 0x00, 0, 0}, {0x3804, 0x0a, 0, 0},
+ {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9f, 0, 0},
+ {0x3808, 0x0a, 0, 0}, {0x3809, 0x20, 0, 0}, {0x380a, 0x07, 0, 0},
+ {0x380b, 0x98, 0, 0}, {0x380c, 0x0b, 0, 0}, {0x380d, 0x1c, 0, 0},
+ {0x380e, 0x07, 0, 0}, {0x380f, 0xb0, 0, 0}, {0x3810, 0x00, 0, 0},
+ {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0},
+ {0x3618, 0x04, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x21, 0, 0},
+ {0x3709, 0x12, 0, 0}, {0x370c, 0x00, 0, 0}, {0x3a02, 0x03, 0, 0},
+ {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
+ {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
+ {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
+ {0x4001, 0x02, 0, 0}, {0x4004, 0x06, 0, 0}, {0x4713, 0x03, 0, 0},
+ {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
+ {0x3824, 0x02, 0, 0}, {0x5001, 0x83, 0, 70}, {0x3008, 0x02, 0, 0},
+ {0x4202, 0x00, 0, 0}, /* stream on the sensor */
};
-static struct reg_value ov5640_mipi_config[] = {
- {0x302C, 0xc2, 0, 0}, /* Driver Capability */
-
- {0x4300, 0x3F, 0, 0}, /* YUV422 YVYU */
- {0x501f, 0x00, 0, 0}, /* YUV422 YVYU */
-
- {0x3034, 0x18, 0, 0}, /* MIPI 8bits mode */
- {0x3017, 0x00, 0, 0},
- {0x3018, 0x00, 0, 0},
-
- {0x300e, 0x45, 0, 0}, /* MIPI mode */
- {0x4800, 0x04, 0, 0},
-
- {0x4740, 0x23, 0, 0}, /* BIT5: Pixel BIT1: HSYNC BIT0: VSYNC */
- /* 1: hight level */
- /* 0: low level valid */
- {0x5000, 0xa7, 0, 0},
+static struct ov5640_mode_info ov5640_mode_info_data[2][ov5640_mode_MAX + 1] = {
+ {
+ {ov5640_mode_VGA_640_480, -1, 0, 0, NULL, 0},
+ {ov5640_mode_NTSC_720_480, -1, 0, 0, NULL, 0},
+ {ov5640_mode_720P_1280_720, -1, 0, 0, NULL, 0},
+ {ov5640_mode_1080P_1920_1080, -1, 0, 0, NULL, 0},
+ {ov5640_mode_QSXGA_2592_1944, SCALING, 2592, 1944,
+ ov5640_setting_15fps_QSXGA_2592_1944,
+ ARRAY_SIZE(ov5640_setting_15fps_QSXGA_2592_1944)},
+ },
+ {
+ {ov5640_mode_VGA_640_480, SUBSAMPLING, 640, 480,
+ ov5640_setting_30fps_VGA_640_480,
+ ARRAY_SIZE(ov5640_setting_30fps_VGA_640_480)},
+ {ov5640_mode_NTSC_720_480, SUBSAMPLING, 720, 480,
+ ov5640_setting_30fps_NTSC_720_480,
+ ARRAY_SIZE(ov5640_setting_30fps_NTSC_720_480)},
+ {ov5640_mode_720P_1280_720, SUBSAMPLING, 1280, 720,
+ ov5640_setting_30fps_720P_1280_720,
+ ARRAY_SIZE(ov5640_setting_30fps_720P_1280_720)},
+ {ov5640_mode_1080P_1920_1080, SCALING, 1920, 1080,
+ ov5640_setting_30fps_1080P_1920_1080,
+ ARRAY_SIZE(ov5640_setting_30fps_1080P_1920_1080)},
+ {ov5640_mode_QSXGA_2592_1944, -1, 0, 0, NULL, 0},
+ },
};
static struct ov5640_hs_info hs_setting[] = {
+ {2592, 1944, 30, 0x0B},
+ {2592, 1944, 15, 0x10},
+
{1920, 1080, 30, 0x0B},
{1920, 1080, 15, 0x10},
+
{1280, 720, 30, 0x11},
{1280, 720, 15, 0x16},
+
+ {720, 480, 30, 0x1E},
+ {720, 480, 15, 0x23},
+
{640, 480, 30, 0x1E},
{640, 480, 15, 0x23},
+
{320, 240, 30, 0x1E},
{320, 240, 15, 0x23},
};
-static struct ov5640_pll_info ov5640_mipi_pll_info_data[2][ov5640_mode_MAX + 1] = {
- {
- {ov5640_mode_VGA_640_480, ov5640_mipi_pll_VGA_15fps_640_480,
- ARRAY_SIZE(ov5640_mipi_pll_VGA_15fps_640_480)},
-
- {ov5640_mode_QVGA_320_240, ov5640_mipi_pll_QVGA_15fps_320_240,
- ARRAY_SIZE(ov5640_mipi_pll_QVGA_15fps_320_240)},
-
- {ov5640_mode_480_272, ov5640_mipi_pll_15fps_480_272,
- ARRAY_SIZE(ov5640_mipi_pll_15fps_480_272)},
-
- {ov5640_mode_720P_1280_720, ov5640_mipi_pll_720P_15fps_1280_720,
- ARRAY_SIZE(ov5640_mipi_pll_720P_15fps_1280_720)},
-
- {ov5640_mode_1080P_1920_1080, ov5640_mipi_pll_1080P_15fps_1920_1080,
- ARRAY_SIZE(ov5640_mipi_pll_1080P_15fps_1920_1080)},
- },
-
- {
- {ov5640_mode_VGA_640_480, ov5640_mipi_pll_VGA_30fps_640_480,
- ARRAY_SIZE(ov5640_mipi_pll_VGA_30fps_640_480)},
-
- {ov5640_mode_QVGA_320_240, ov5640_mipi_pll_QVGA_30fps_320_240,
- ARRAY_SIZE(ov5640_mipi_pll_QVGA_30fps_320_240)},
-
- {ov5640_mode_480_272, ov5640_mipi_pll_30fps_480_272,
- ARRAY_SIZE(ov5640_mipi_pll_30fps_480_272)},
-
- {ov5640_mode_720P_1280_720, ov5640_mipi_pll_720P_30fps_1280_720,
- ARRAY_SIZE(ov5640_mipi_pll_720P_30fps_1280_720)},
- },
-};
-
static struct regulator *io_regulator;
static struct regulator *core_regulator;
static struct regulator *analog_regulator;
@@ -781,66 +663,9 @@ static int ov5640_config_init(struct ov5640 *sensor)
int ArySize = 0, retval = 0;
/* Configure ov5640 initial parm */
- pModeSetting = ov5640_init_parm;
- ArySize = ARRAY_SIZE(ov5640_init_parm);
-
- retval = ov5640_download_firmware(sensor, pModeSetting, ArySize);
- if (retval < 0)
- return retval;
-
- return 0;
-}
-
-static int ov5640_config_resolution(struct ov5640 *sensor,
- enum ov5640_mode mode)
-{
- struct reg_value *pModeSetting = NULL;
- int ArySize = 0, retval = 0;
-
- if (mode < ov5640_mode_MIN || mode > ov5640_mode_MAX)
- return -EINVAL;
-
- if (mode == ov5640_mode_1080P_1920_1080) {
- ov5640_write_reg(sensor, 0x3709, 0x12);
- ov5640_write_reg(sensor, 0x3821, 0x06);
- }
-
- if (mode == ov5640_mode_480_272) {
- mode = ov5640_mode_VGA_640_480;
- pr_warn("Not support 480*272, change to 640*480\n");
- }
-
- /* Configure ov5640 initial parm */
- pModeSetting = ov5640_mode_info_data[mode].init_data_ptr;
- ArySize = ov5640_mode_info_data[mode].init_data_size;
-
- retval = ov5640_download_firmware(sensor, pModeSetting, ArySize);
- if (retval < 0)
- return retval;
-
- return 0;
-}
-
-static int ov5640_config_others(struct ov5640 *sensor,
- enum ov5640_frame_rate rate, enum ov5640_mode mode)
-{
- struct reg_value *pModeSetting = NULL;
- int ArySize = 0, retval = 0;
-
- if (mode < ov5640_mode_MIN || mode > ov5640_mode_MAX)
- return -EINVAL;
-
- mode = (mode == ov5640_mode_480_272) ?
- ov5640_mode_VGA_640_480 : mode;
- pModeSetting = ov5640_mipi_pll_info_data[rate][mode].init_data_ptr;
- ArySize = ov5640_mipi_pll_info_data[rate][mode].init_data_size;
- retval = ov5640_download_firmware(sensor, pModeSetting, ArySize);
- if (retval < 0)
- return retval;
+ pModeSetting = ov5640_init_setting_30fps_VGA;
+ ArySize = ARRAY_SIZE(ov5640_init_setting_30fps_VGA);
- /* Configure ov5640 initial parm */
- pModeSetting = ov5640_mipi_config;
- ArySize = ARRAY_SIZE(ov5640_mipi_config);
retval = ov5640_download_firmware(sensor, pModeSetting, ArySize);
if (retval < 0)
return retval;
@@ -852,32 +677,38 @@ static void ov5640_start(struct ov5640 *sensor)
{
ov5640_write_reg(sensor, 0x3008, 0x02);
ov5640_write_reg(sensor, 0x3008, 0x02);
+
+ /* Color bar control */
+ /*ov5640_write_reg(sensor, 0x503d, 0x80);*/
udelay(1000);
}
static int ov5640_change_mode(struct ov5640 *sensor,
- enum ov5640_frame_rate rate, enum ov5640_mode mode)
+ enum ov5640_frame_rate frame_rate, enum ov5640_mode mode)
{
- int retval;
+ struct reg_value *pModeSetting = NULL;
+ int ArySize = 0, retval = 0;
- if (mode == ov5640_mode_1080P_1920_1080 && rate != ov5640_15_fps) {
- pr_warn("1080P only suppoert 15fps frame rate\n");
- rate = ov5640_15_fps;
+ if (mode > ov5640_mode_MAX || mode < ov5640_mode_MIN) {
+ pr_err("Wrong ov5640 mode detected!\n");
+ return -1;
}
- retval = ov5640_config_resolution(sensor, mode);
- if (retval < 0) {
- pr_err("%s config resolution fail\n", __func__);
- return -EINVAL;
- }
+ pModeSetting = ov5640_mode_info_data[frame_rate][mode].init_data_ptr;
+ ArySize = ov5640_mode_info_data[frame_rate][mode].init_data_size;
- retval = ov5640_config_others(sensor, rate, mode);
- if (retval < 0) {
- pr_err("%s config others fail\n", __func__);
+ sensor->pix.width = ov5640_mode_info_data[frame_rate][mode].width;
+ sensor->pix.height = ov5640_mode_info_data[frame_rate][mode].height;
+
+ if (sensor->pix.width == 0 || sensor->pix.height == 0 ||
+ pModeSetting == NULL || ArySize == 0) {
+ pr_err("Not support mode=%d %s\n", mode,
+ (frame_rate == 0) ? "15(fps)" : "30(fps)");
return -EINVAL;
}
- return 0;
+ retval = ov5640_download_firmware(sensor, pModeSetting, ArySize);
+ return retval;
}
static int init_device(struct ov5640 *sensor)
@@ -889,15 +720,6 @@ static int init_device(struct ov5640 *sensor)
if (retval < 0)
return retval;
- retval = ov5640_config_resolution(sensor, ov5640_mode_VGA_640_480);
- if (retval < 0)
- return retval;
-
- retval = ov5640_config_others(sensor, ov5640_30_fps,
- ov5640_mode_VGA_640_480);
- if (retval < 0)
- return retval;
-
ov5640_start(sensor);
return 0;
@@ -1017,12 +839,6 @@ static int ov5640_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *a)
timeperframe->numerator = 1;
}
- if (mode == ov5640_mode_1080P_1920_1080 && tgt_fps != 15) {
- pr_warn("1080P only suppoert 15fps frame rate\n");
- timeperframe->denominator = 15;
- timeperframe->numerator = 1;
- }
-
/* Actual frame rate we use */
tgt_fps = timeperframe->denominator /
timeperframe->numerator;
@@ -1042,8 +858,8 @@ static int ov5640_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *a)
sensor->streamcap.timeperframe = *timeperframe;
sensor->streamcap.capturemode = mode;
- sensor->pix.width = ov5640_mode_info_data[mode].width;
- sensor->pix.height = ov5640_mode_info_data[mode].height;
+ sensor->pix.width = ov5640_mode_info_data[frame_rate][mode].width;
+ sensor->pix.height = ov5640_mode_info_data[frame_rate][mode].height;
break;
@@ -1163,10 +979,16 @@ static int ov5640_enum_framesizes(struct v4l2_subdev *sd,
if (fse->index > ov5640_mode_MAX)
return -EINVAL;
- fse->max_width = ov5640_mode_info_data[fse->index].width;
+ fse->max_width =
+ max(ov5640_mode_info_data[0][fse->index].width,
+ ov5640_mode_info_data[1][fse->index].width);
fse->min_width = fse->max_width;
- fse->max_height = ov5640_mode_info_data[fse->index].height;
+
+ fse->max_height =
+ max(ov5640_mode_info_data[0][fse->index].height,
+ ov5640_mode_info_data[1][fse->index].height);
fse->min_height = fse->max_height;
+
return 0;
}
@@ -1198,16 +1020,13 @@ static int ov5640_enum_frameintervals(struct v4l2_subdev *sd,
count = 0;
for (i = 0; i < ARRAY_SIZE(ov5640_framerates); i++) {
for (j = 0; j < (ov5640_mode_MAX + 1); j++) {
- if (fie->width == ov5640_mode_info_data[j].width
- && fie->height == ov5640_mode_info_data[j].height
- && ov5640_mode_info_data[j].init_data_ptr != NULL) {
+ if (fie->width == ov5640_mode_info_data[i][j].width
+ && fie->height == ov5640_mode_info_data[i][j].height
+ && ov5640_mode_info_data[i][j].init_data_ptr != NULL) {
count++;
}
if (fie->index == (count - 1)) {
fie->interval.denominator = ov5640_framerates[i];
- if (ov5640_mode_info_data[j].mode ==
- ov5640_mode_1080P_1920_1080)
- fie->interval.denominator = ov5640_framerates[0];
return 0;
}
}
@@ -1348,8 +1167,8 @@ static int ov5640_probe(struct i2c_client *client,
sensor->i2c_client = client;
sensor->pix.pixelformat = V4L2_PIX_FMT_UYVY;
- sensor->pix.width = ov5640_mode_info_data[0].width;
- sensor->pix.height = ov5640_mode_info_data[0].height;
+ sensor->pix.width = ov5640_mode_info_data[1][0].width;
+ sensor->pix.height = ov5640_mode_info_data[1][0].height;
sensor->streamcap.capability = V4L2_MODE_HIGHQUALITY |
V4L2_CAP_TIMEPERFRAME;
sensor->streamcap.capturemode = 0;