camera: add auto focus function for ov5642

This commit is contained in:
ddl
2010-12-13 20:33:48 +08:00
parent 17b655f011
commit 27b18f2b03
4 changed files with 5887 additions and 377 deletions

View File

@@ -890,7 +890,21 @@ config SOC_CAMERA_OV5642
tristate "ov5642 camera support"
depends on SOC_CAMERA && I2C
help
This is a ov5642 camera driver
This is a ov5642 camera driver
choice
prompt "OV5642 Module Focus select"
depends on SOC_CAMERA_OV5642
default OV5642_AUTOFOCUS
---help---
config OV5642_AUTOFOCUS
bool "OV5642 auto focus"
config OV5642_FIXEDFOCUS
bool "OV5642 fixed focus"
endchoice
config MX1_VIDEO
bool

View File

@@ -1,5 +1,5 @@
/*
o* Driver for MT9M001 CMOS Image Sensor from Micron
* Driver for OV5642 CMOS Image Sensor from OmniVision
*
* Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
*
@@ -20,6 +20,7 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
#include <media/v4l2-chip-ident.h>
#include <media/soc_camera.h>
#include <mach/rk29_camera.h>
#include "ov5642.h"
#define _CONS(a,b) a##b
#define CONS(a,b) _CONS(a,b)
@@ -48,16 +49,16 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
#define CONFIG_SENSOR_Effect 1
#define CONFIG_SENSOR_Scene 1
#define CONFIG_SENSOR_DigitalZoom 0
#define CONFIG_SENSOR_Focus 1
#if CONFIG_SENSOR_Focus
#define CONFIG_SENSOR_AutoFocus 0
#else
#undef CONFIG_SENSOR_AutoFocus
#endif
#define CONFIG_SENSOR_Exposure 0
#define CONFIG_SENSOR_Flash 0
#define CONFIG_SENSOR_Mirror 0
#define CONFIG_SENSOR_Flip 0
#ifdef CONFIG_OV5642_AUTOFOCUS
#define CONFIG_SENSOR_Focus 1
#include "ov5642_af_firmware.c"
#else
#define CONFIG_SENSOR_Focus 0
#endif
#define CONFIG_SENSOR_I2C_SPEED 300000 /* Hz */
@@ -97,7 +98,7 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
#define SENSOR_AF_IS_ERR (0x00<<0)
#define SENSOR_AF_IS_OK (0x01<<0)
#if (CONFIG_SENSOR_Focus == 1)
#if CONFIG_SENSOR_Focus
/* ov5642 VCM Command and Status Registers */
#define CMD_MAIN_Reg 0x3024
#define CMD_TAG_Reg 0x3025
@@ -114,6 +115,7 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
#define SingleFocus_Cmd 0x03
#define ConstFocus_Cmd 0x04
#define StepMode_Cmd 0x05
#define PauseFocus_Cmd 0x06
#define ReturnIdle_Cmd 0x08
#define SetZone_Cmd 0x10
#define UpdateZone_Cmd 0x12
@@ -152,12 +154,6 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
#define StepFocus_Spec_Tag 0x10
#endif
struct reginfo
{
u16 reg;
u8 val;
};
/* init 640X480 SVGA */
static struct reginfo sensor_init_data[] =
{
@@ -480,379 +476,137 @@ static struct reginfo sensor_init_data[] =
{0x370b , 0x40},
{0x370d , 0x02},
{0x3620 , 0x52},
{0X0000, 0X00}
};
/* 2592X1944 QSXGA */
static struct reginfo sensor_qsxga[] =
{
{0x3000 ,0x00}, //F8
{0x3001 ,0x00}, //48
{0x3002 ,0x00}, //5C
{0x3003 ,0x00}, //02
{0x3005 ,0xff}, //b7
{0x3006 ,0xff}, //43
{0x3007 ,0x3f}, //37
{0x350c ,0x07}, //08
{0x350d ,0xd0}, //30
{0x3602 ,0xe4}, //FC ?
{0x3612 ,0xac}, //FF ?
{0x3613 ,0x44}, //00 ?
{0x3621 ,0x27}, //C7
{0x3622 ,0x08}, //00 ?
{0x3623 ,0x22}, //01 ?
{0x3604 ,0x60}, //40 ?
{0x3705 ,0xda}, //DB ?
{0x370a ,0x80}, //81 ?
{0x3801 ,0x8a}, //50
{0x3803 ,0x0a}, //08
{0x3804 ,0x0a}, //05
{0x3805 ,0x20}, //00
{0x3806 ,0x07}, //03
{0x3807 ,0x98}, //C0
{0x3808 ,0x0a}, //02
{0x3809 ,0x20}, //80
{0x380a ,0x07}, //01
{0x380b ,0x98}, //E0
{0x380c ,0x0c},
{0x380d ,0x80},
{0x380e ,0x07}, //03
{0x380f ,0xd0}, //E8
{0x3810 ,0xc2}, //C0
{0x3815 ,0x44}, //04
{0x3818 ,0xc0}, //0xc8}, //C1
{0x3824 ,0x01}, //11
{0x3827 ,0x0a}, //08
{0x3a00 ,0x78}, //7C night mode close
{0x3a0d ,0x10}, //08
{0x3a0e ,0x0d}, //06
{0x3a10 ,0x32}, //72
{0x3a1b ,0x3c}, //80
{0x3a1e ,0x32}, //70
{0x3a11 ,0x80}, //D0
{0x3a1f ,0x20}, //40
{0x3a00 ,0x78}, //7C night mode close
{0x460b ,0x35}, //37
{0x471d ,0x00}, //05
{0x4713 ,0x03}, //02
{0x471c ,0x50}, //D0
{0x5682 ,0x0a}, //05
{0x5683 ,0x20}, //00
{0x5686 ,0x07}, //03
{0x5687 ,0x98}, //C0
{0x5001 ,0x4f}, //FF
{0x589b ,0x00}, //04
{0x589a ,0xc0}, //C5
{0x4407 ,0x04}, //0C
{0x589b ,0x00}, //04
{0x589a ,0xc0}, //C5
{0x3002 ,0x0c}, //5C
{0x3002 ,0x00}, //5C
{0x3012, 0x02},
{0x460c ,0x00}, //jpeg mode change to YUV mode
{0x460b ,0x37},
{0x471c ,0xd0},
{0x471d ,0x05},
{0x3815 ,0x01},
{0x3818 ,0xc0},
{0x501f ,0x00},
{0x4300 ,0x32},
{0x3002 ,0x1c},
{0x0000 ,0x00}
{0x0000 ,0x00}
};
/* 2048*1536 QXGA */
static struct reginfo sensor_qxga[] =
{
{0x3012, 0x02},
{0x3800 ,0x1 },
{0x3801 ,0x8A},
{0x3802 ,0x0 },
{0x3803 ,0xA },
{0x3804 ,0xA },
{0x3805 ,0x20},
{0x3806 ,0x7 },
{0x3807 ,0x98},
{0x3808 ,0x8 },
{0x3809 ,0x0 },
{0x380a ,0x6 },
{0x380b ,0x0 },
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x7 },
{0x380f ,0xd0},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0xA },
{0x5683 ,0x20},
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x7 },
{0x5687 ,0x98},
{0x0000 ,0x00}
};
/* 1600X1200 UXGA */
static struct reginfo sensor_uxga[] =
{
{0x3012, 0x02},
{0x3800 ,0x1 },
{0x3801 ,0x8A},
{0x3802 ,0x0 },
{0x3803 ,0xA },
{0x3804 ,0xA },
{0x3805 ,0x20},
{0x3806 ,0x7 },
{0x3807 ,0x98},
{0x3808 ,0x6 },
{0x3809 ,0x40},
{0x380a ,0x4 },
{0x380b ,0xb0},
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x7 },
{0x380f ,0xd0},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0xA },
{0x5683 ,0x20},
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x7 },
{0x5687 ,0x98},
{0x0000 ,0x00}
};
/* 1280X1024 SXGA */
static struct reginfo sensor_sxga[] =
{
{0x300E, 0x34},
{0x3011, 0x01},
{0x3012, 0x00},
{0x302a, 0x05},
{0x302b, 0xCB},
{0x306f, 0x54},
{0x3362, 0x80},
{0x3070, 0x5d},
{0x3072, 0x5d},
{0x301c, 0x0f},
{0x301d, 0x0f},
{0x3020, 0x01},
{0x3021, 0x18},
{0x3022, 0x00},
{0x3023, 0x0A},
{0x3024, 0x06},
{0x3025, 0x58},
{0x3026, 0x04},
{0x3027, 0xbc},
{0x3088, 0x05},
{0x3089, 0x00},
{0x308A, 0x04},
{0x308B, 0x00},
{0x3316, 0x64},
{0x3317, 0x4B},
{0x3318, 0x00},
{0x3319, 0x6C},
{0x331A, 0x50},
{0x331B, 0x40},
{0x331C, 0x00},
{0x331D, 0x6C},
{0x3302, 0x11},
{0x0000,0x00}
};
/* 800X600 SVGA*/
static struct reginfo sensor_svga[] =
{
{0x300E, 0x34},
{0x3011, 0x01},
{0x3012, 0x10},
{0x302a, 0x02},
{0x302b, 0xE6},
{0x306f, 0x14},
{0x3362, 0x90},
{0x3070, 0x5d},
{0x3072, 0x5d},
{0x301c, 0x07},
{0x301d, 0x07},
{0x3020, 0x01},
{0x3021, 0x18},
{0x3022, 0x00},
{0x3023, 0x06},
{0x3024, 0x06},
{0x3025, 0x58},
{0x3026, 0x02},
{0x3027, 0x5E},
{0x3088, 0x03},
{0x3089, 0x20},
{0x308A, 0x02},
{0x308B, 0x58},
{0x3316, 0x64},
{0x3317, 0x25},
{0x3318, 0x80},
{0x3319, 0x08},
{0x331A, 0x64},
{0x331B, 0x4B},
{0x331C, 0x00},
{0x331D, 0x38},
{0x3302, 0x11},
{0x3800 ,0x1 },
{0x3801 ,0x50},
{0x3802 ,0x0 },
{0x3803 ,0x8 },
{0x3804 ,0x5 },
{0x3805 ,0x0 },
{0x3806 ,0x3 },
{0x3807 ,0xc0},
{0x3808 ,0x3 },
{0x3809 ,0x20},
{0x380a ,0x2 },
{0x380b ,0x58},
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x3 },
{0x380f ,0xe8},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0x5 },
{0x5683 ,0x0 },
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x3 },
{0x5687 ,0xc0},
{0x5687 ,0xc0},
{0x3815 ,0x02},
{0x0000,0x00}
};
/* 640X480 VGA */
static struct reginfo sensor_vga[] =
{
{0x3012, 0x00},
{0x3800 ,0x1 },
{0x3801 ,0x8A},
{0x3802 ,0x0 },
{0x3803 ,0xA },
{0x3804 ,0xA },
{0x3805 ,0x20},
{0x3806 ,0x7 },
{0x3807 ,0x98},
{0x3808 ,0x2 },
{0x3809 ,0x80},
{0x380a ,0x1 },
{0x380b ,0xe0},
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x7 },
{0x380f ,0xd0},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0xA },
{0x5683 ,0x20},
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x7 },
{0x5687 ,0x98},
{0x0000,0x00}
};
/* 352X288 CIF */
static struct reginfo sensor_cif[] =
{
{0x3800 ,0x1 },
{0x3801 ,0x50},
{0x3802 ,0x0 },
{0x3803 ,0x8 },
{0x3804 ,0x4 },
{0x3805 ,0x96},
{0x3806 ,0x3 },
{0x3807 ,0xc0},
{0x3808 ,0x1 },
{0x3809 ,0x60},
{0x380a ,0x1 },
{0x380b ,0x20},
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x3 },
{0x380f ,0xe8},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0x4 },
{0x5683 ,0x96},
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x3 },
{0x5687 ,0xc0},
{0x3800 ,0x1 },
{0x3801 ,0x50},
{0x3802 ,0x0 },
{0x3803 ,0x8 },
{0x3804 ,0x4 },
{0x3805 ,0x96},
{0x3806 ,0x3 },
{0x3807 ,0xc0},
{0x3808 ,0x1 },
{0x3809 ,0x60},
{0x380a ,0x1 },
{0x380b ,0x20},
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x3 },
{0x380f ,0xe8},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0x4 },
{0x5683 ,0x96},
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x3 },
{0x5687 ,0xc0},
{0x0000,0x00}
};
/* 320*240 QVGA */
static struct reginfo sensor_qvga[] =
{
{0x300E, 0x34},
{0x3011, 0x01},
{0x3012, 0x10},
{0x302a, 0x02},
{0x302b, 0xE6},
{0x306f, 0x14},
{0x3362, 0x90},
{0x3070, 0x5D},
{0x3072, 0x5D},
{0x301c, 0x07},
{0x301d, 0x07},
{0x3020, 0x01},
{0x3021, 0x18},
{0x3022, 0x00},
{0x3023, 0x06},
{0x3024, 0x06},
{0x3025, 0x58},
{0x3026, 0x02},
{0x3027, 0x61},
{0x3088, 0x01},
{0x3089, 0x40},
{0x308A, 0x00},
{0x308B, 0xf0},
{0x3316, 0x64},
{0x3317, 0x25},
{0x3318, 0x80},
{0x3319, 0x08},
{0x331A, 0x14},
{0x331B, 0x0f},
{0x331C, 0x00},
{0x331D, 0x38},
{0x3302, 0x11},
{
{0x0000,0x00}
};
/* 176X144 QCIF*/
static struct reginfo sensor_qcif[] =
{
{0x300E, 0x34},
{0x3011, 0x01},
{0x3012, 0x10},
{0x302a, 0x02},
{0x302b, 0xE6},
{0x306f, 0x14},
{0x3362, 0x90},
{0x3070, 0x5d},
{0x3072, 0x5d},
{0x301c, 0x07},
{0x301d, 0x07},
{0x3020, 0x01},
{0x3021, 0x18},
{0x3022, 0x00},
{0x3023, 0x06},
{0x3024, 0x06},
{0x3025, 0x58},
{0x3026, 0x02},
{0x3027, 0x61},
{0x3088, 0x00},
{0x3089, 0xa0},
{0x308a, 0x00},
{0x308b, 0x78},
{0x3316, 0x64},
{0x3317, 0x25},
{0x3318, 0x80},
{0x3319, 0x08},
{0x331a, 0x0a},
{0x331b, 0x07},
{0x331c, 0x80},
{0x331d, 0x38},
{0x3100, 0x00},
{0x3302, 0x11},
{0x0000,0x00}
};
static struct reginfo sensor_af_firmware[] =
{
{0x3800 ,0x1 },
{0x3801 ,0x50},
{0x3802 ,0x0 },
{0x3803 ,0x8 },
{0x3804 ,0x4 },
{0x3805 ,0x96},
{0x3806 ,0x3 },
{0x3807 ,0xc0},
{0x3808 ,0x0 },
{0x3809 ,0xb0},
{0x380a ,0x0 },
{0x380b ,0x90},
{0x380c ,0xc },
{0x380d ,0x80},
{0x380e ,0x3 },
{0x380f ,0xe8},
{0x5001 ,0x7f},
{0x5680 ,0x0 },
{0x5681 ,0x0 },
{0x5682 ,0x4 },
{0x5683 ,0x96},
{0x5684 ,0x0 },
{0x5685 ,0x0 },
{0x5686 ,0x3 },
{0x5687 ,0xc0},
{0x0000,0x00}
};
#if 0
@@ -1444,7 +1198,7 @@ static const struct v4l2_queryctrl sensor_controls[] =
},
#endif
#if CONFIG_SENSOR_Focus
#ifdef CONFIG_SENSOR_Focus
{
.id = V4L2_CID_FOCUS_RELATIVE,
.type = V4L2_CTRL_TYPE_INTEGER,
@@ -1462,7 +1216,6 @@ static const struct v4l2_queryctrl sensor_controls[] =
.step = 1,
.default_value = 125,
},
#if CONFIG_SENSOR_AutoFocus
{
.id = V4L2_CID_FOCUS_AUTO,
.type = V4L2_CTRL_TYPE_BOOLEAN,
@@ -1472,7 +1225,6 @@ static const struct v4l2_queryctrl sensor_controls[] =
.step = 1,
.default_value = 0,
},
#endif
#endif
#if CONFIG_SENSOR_Flash
@@ -1671,25 +1423,33 @@ static int sensor_af_cmdset(struct i2c_client *client, int cmd_main, struct af_c
if (cmdinfo) {
if (cmdinfo->validate_bit & 0x80) {
if (sensor_write(client, CMD_TAG_Reg, cmdinfo->cmd_tag)) {
SENSOR_TR("%s write CMD_TAG_Reg(cmd:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main);
SENSOR_TR("%s write CMD_TAG_Reg(main:0x%x tag:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main,cmdinfo->cmd_tag);
goto sensor_af_cmdset_err;
}
SENSOR_DG("%s write CMD_TAG_Reg(main:0x%x tag:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,cmdinfo->cmd_tag);
}
for (i=0; i<4; i++) {
if (cmdinfo->validate_bit & (1<<i)) {
if (sensor_write(client, CMD_PARA0_Reg-i, cmdinfo->cmd_para[i])) {
SENSOR_TR("%s write CMD_PARA_Reg(0x%x, cmd:0x%x) error!\n",SENSOR_NAME_STRING(),i,cmd_main);
SENSOR_TR("%s write CMD_PARA_Reg(main:0x%x para%d:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main,i,cmdinfo->cmd_para[i]);
goto sensor_af_cmdset_err;
}
SENSOR_TR("%s write CMD_PARA_Reg(main:0x%x para%d:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main,i,cmdinfo->cmd_para[i]);
}
}
} else {
if (sensor_write(client, CMD_TAG_Reg, 0xff)) {
SENSOR_TR("%s write CMD_TAG_Reg(main:0x%x no tag) error!\n",SENSOR_NAME_STRING(),cmd_main);
goto sensor_af_cmdset_err;
}
SENSOR_DG("%s write CMD_TAG_Reg(main:0x%x no tag) success!\n",SENSOR_NAME_STRING(),cmd_main);
}
if (sensor_write(client, CMD_MAIN_Reg, cmd_main)) {
SENSOR_TR("%s write CMD_MAIN_Reg(cmd:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main);
SENSOR_TR("%s write CMD_MAIN_Reg(main:0x%x) error!\n",SENSOR_NAME_STRING(),cmd_main);
goto sensor_af_cmdset_err;
}
SENSOR_DG("%s write CMD_MAIN_Reg(main:0x%x) success!\n",SENSOR_NAME_STRING(),cmd_main);
return 0;
sensor_af_cmdset_err:
return -1;
@@ -1697,12 +1457,8 @@ sensor_af_cmdset_err:
static int sensor_af_single(struct i2c_client *client)
{
int ret = 0;
struct sensor *sensor = to_sensor(client);
char state,cnt;
if ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) == 0)
return -EACCES;
if (sensor_af_cmdset(client, SingleFocus_Cmd, NULL)) {
SENSOR_TR("%s single focus mode set error!\n",SENSOR_NAME_STRING());
ret = -1;
@@ -1734,13 +1490,56 @@ static int sensor_af_single(struct i2c_client *client)
sensor_af_single_end:
return ret;
}
static int sensor_af_const(struct i2c_client *client)
{
int ret = 0;
if (sensor_af_cmdset(client, ConstFocus_Cmd, NULL)) {
SENSOR_TR("%s const focus mode set error!\n",SENSOR_NAME_STRING());
ret = -1;
goto sensor_af_const_end;
}
sensor_af_const_end:
return ret;
}
static int sensor_af_pause2capture(struct i2c_client *client)
{
int ret = 0;
char state,cnt;
if (sensor_af_cmdset(client, PauseFocus_Cmd, NULL)) {
SENSOR_TR("%s pause focus mode set error!\n",SENSOR_NAME_STRING());
ret = -1;
goto sensor_af_pause_end;
}
cnt = 0;
do
{
if (cnt != 0) {
msleep(1);
}
cnt++;
ret = sensor_read(client, STA_FOCUS_Reg, &state);
if (ret != 0){
SENSOR_TR("%s[%d] read focus_status failed\n",SENSOR_NAME_STRING(),__LINE__);
ret = -1;
goto sensor_af_pause_end;
}
}while((state != S_CAPTURE) && (cnt<100));
if (state != S_CAPTURE) {
SENSOR_TR("%s[%d] focus state(0x%x) is error!\n",SENSOR_NAME_STRING(),__LINE__,state);
ret = -1;
goto sensor_af_pause_end;
}
sensor_af_pause_end:
return ret;
}
static int sensor_af_zoneupdate(struct i2c_client *client)
{
int ret = 0;
struct sensor *sensor = to_sensor(client);
if ((sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) == 0)
return -EACCES;
if (sensor_af_cmdset(client, UpdateZone_Cmd, NULL)) {
SENSOR_TR("%s update zone fail!\n",SENSOR_NAME_STRING());
@@ -1790,6 +1589,7 @@ static int sensor_af_init(struct i2c_client *client)
}
sensor_af_init_end:
SENSOR_DG("%s %s ret:0x%x \n",SENSOR_NAME_STRING(),__FUNCTION__,ret);
return ret;
}
#endif
@@ -2443,7 +2243,7 @@ static int sensor_set_focus_absolute(struct soc_camera_device *icd, const struct
int ret = 0;
qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);
if (qctrl_info)
if (!qctrl_info)
return -EINVAL;
if (sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) {
@@ -2452,7 +2252,7 @@ static int sensor_set_focus_absolute(struct soc_camera_device *icd, const struct
cmdinfo.cmd_para[0] = value;
cmdinfo.validate_bit = 0x81;
ret = sensor_af_cmdset(client, StepMode_Cmd, &cmdinfo);
SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
SENSOR_DG("%s..%s : %d ret:0x%x\n",SENSOR_NAME_STRING(),__FUNCTION__, value,ret);
} else {
ret = -EINVAL;
SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
@@ -2473,7 +2273,7 @@ static int sensor_set_focus_relative(struct soc_camera_device *icd, const struct
int ret = 0;
qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_RELATIVE);
if (qctrl_info)
if (!qctrl_info)
return -EINVAL;
if (sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) {
@@ -2485,7 +2285,7 @@ static int sensor_set_focus_relative(struct soc_camera_device *icd, const struct
}
cmdinfo.validate_bit = 0x80;
ret = sensor_af_cmdset(client, StepMode_Cmd, &cmdinfo);
SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);
SENSOR_DG("%s..%s : %d ret:0x%x\n",SENSOR_NAME_STRING(),__FUNCTION__, value,ret);
} else {
ret = -EINVAL;
SENSOR_TR("\n %s..%s valure = %d is invalidate.. \n",SENSOR_NAME_STRING(),__FUNCTION__,value);
@@ -2497,21 +2297,21 @@ static int sensor_set_focus_relative(struct soc_camera_device *icd, const struct
return ret;
}
#if CONFIG_SENSOR_AutoFocus
static int sensor_set_focus_auto(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
{
struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
struct sensor *sensor = to_sensor(client);
const struct v4l2_queryctrl *qctrl_info;
struct af_cmdinfo cmdinfo;
int ret = 0;
qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_AUTO);
if (qctrl_info)
if (!qctrl_info)
return -EINVAL;
if (sensor->info_priv.funmodule_state & SENSOR_AF_IS_OK) {
ret = sensor_af_const(client);
SENSOR_DG("%s..%s : %d ret:0x%x\n",SENSOR_NAME_STRING(),__FUNCTION__, value,ret);
} else {
ret = -EACCES;
SENSOR_TR("\n %s..%s AF module state is error!\n",SENSOR_NAME_STRING(),__FUNCTION__);
@@ -2519,8 +2319,6 @@ static int sensor_set_focus_auto(struct soc_camera_device *icd, const struct v4l
return ret;
}
#endif
#endif
static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
@@ -2532,7 +2330,7 @@ static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
if (!qctrl)
{
SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);
SENSOR_TR("\n %s ioctrl id = 0x%x is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);
return -EINVAL;
}
@@ -2593,7 +2391,7 @@ static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
if (!qctrl)
{
SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);
SENSOR_TR("\n %s ioctrl id = 0x%x is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);
return -EINVAL;
}
@@ -2709,7 +2507,7 @@ static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_
if (!qctrl)
{
SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);
SENSOR_TR("\n %s ioctrl id = 0x%x is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);
return -EINVAL;
}
@@ -2763,7 +2561,7 @@ static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_c
if (!qctrl)
{
SENSOR_TR("\n %s ioctrl id = %d is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);
SENSOR_TR("\n %s ioctrl id = 0x%x is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);
return -EINVAL;
}
@@ -2832,23 +2630,27 @@ static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_c
if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))
return -EINVAL;
if (ext_ctrl->value != sensor->info_priv.focus) {
sensor_set_focus_absolute(icd, qctrl,ext_ctrl->value);
//val_offset = ext_ctrl->value -sensor->info_priv.focus;
//sensor->info_priv.focus += val_offset;
}
sensor_set_focus_absolute(icd, qctrl,ext_ctrl->value);
break;
}
case V4L2_CID_FOCUS_RELATIVE:
{
if (ext_ctrl->value) {
sensor_set_focus_relative(icd, qctrl,ext_ctrl->value);
//sensor->info_priv.focus += ext_ctrl->value;
//SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus);
}
if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))
return -EINVAL;
sensor_set_focus_relative(icd, qctrl,ext_ctrl->value);
break;
}
case V4L2_CID_FOCUS_AUTO:
{
if (ext_ctrl->value != sensor->info_priv.auto_focus) {
if (sensor_set_focus_auto(icd, qctrl,ext_ctrl->value) != 0)
return -EINVAL;
sensor->info_priv.auto_focus = ext_ctrl->value;
}
break;
}
#endif
#if CONFIG_SENSOR_Flash
case V4L2_CID_FLASH:
@@ -2897,7 +2699,6 @@ static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_control
struct soc_camera_device *icd = client->dev.platform_data;
int i, error_cnt=0, error_idx=-1;
for (i=0; i<ext_ctrl->count; i++) {
if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) {
error_cnt++;

View File

@@ -0,0 +1,19 @@
/*
* Driver for OV5642 CMOS Image Sensor from OmniVision
*
* Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
*
* 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.
*/
#ifndef __OV5642_H__
#define __OV5642_H__
struct reginfo
{
u16 reg;
u8 val;
};
#endif

File diff suppressed because it is too large Load Diff