mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 13:27:06 +09:00
camera:add mt9p111 auto focus and some effect
This commit is contained in:
@@ -76,7 +76,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
|
||||
|
||||
|
||||
#define SENSOR_BUS_PARAM (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\
|
||||
SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |\
|
||||
SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |\
|
||||
SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8 |SOCAM_MCLK_24MHZ)
|
||||
|
||||
#define COLOR_TEMPERATURE_CLOUDY_DN 6500
|
||||
@@ -1238,50 +1238,6 @@ static struct reginfo sensor_init_data[] =
|
||||
{0x8404, 0x06}, // SEQ_CMD},
|
||||
|
||||
{SEQUENCE_WAIT_MS,300},
|
||||
|
||||
//[Step8-Features]},
|
||||
//AF_VCM_enable},
|
||||
{0xC400, 0x88}, // AFM_ALGO},
|
||||
{0x8419, 0x05}, // SEQ_STATE_CFG_1_AF},
|
||||
{0xC400, 0x08}, // AFM_ALGO},
|
||||
//AF_settings},
|
||||
{0xB002, 0x0305}, // AF_MODE},
|
||||
{0xB004, 0x0002}, // AF_ALGO},
|
||||
//{0xB008, 0x0003FFFF}, // AF_ZONE_WEIGHTS_HI},
|
||||
//{0xB00C, 0xFFFFFFFF}, // AF_ZONE_WEIGHTS_LO},
|
||||
//set_posMin/Max},
|
||||
{0xC40A, 0x0028}, // AFM_POS_MIN},
|
||||
{0xC40C, 0x00BE}, // AFM_POS_MAX},
|
||||
//AF_postition_settings},
|
||||
{0xB018, 0x00}, // AF_FS_POS_0},
|
||||
{0xB019, 0x14}, // AF_FS_POS_1},
|
||||
{0xB01A, 0x20}, // AF_FS_POS_2},
|
||||
{0xB01B, 0x2C}, // AF_FS_POS_3},
|
||||
{0xB01C, 0x38}, // AF_FS_POS_4},
|
||||
{0xB01D, 0x44}, // AF_FS_POS_5},
|
||||
{0xB01E, 0x50}, // AF_FS_POS_6},
|
||||
{0xB01F, 0x5C}, // AF_FS_POS_7},
|
||||
{0xB020, 0x68}, // AF_FS_POS_8},
|
||||
{0xB021, 0x74}, // AF_FS_POS_9},
|
||||
{0xB022, 0x80}, // AF_FS_POS_10},
|
||||
{0xB023, 0x8C}, // AF_FS_POS_11},
|
||||
{0xB024, 0x98}, // AF_FS_POS_12},
|
||||
{0xB025, 0xA4}, // AF_FS_POS_13},
|
||||
{0xB026, 0xB0}, // AF_FS_POS_14},
|
||||
{0xB027, 0xBC}, // AF_FS_POS_15},
|
||||
{0xB012, 0x0F}, // AF_FS_NUM_STEPS},
|
||||
{0xB014, 0x0B}, // AF_FS_STEP_SIZE},
|
||||
// 2nd_scan_option},
|
||||
{0x098E, 0xB013}, // LOGICAL_ADDRESS_ACCESS [AF_FS_NUM_STEPS2]},
|
||||
{0xB013, 0x77}, // AF_FS_NUM_STEPS2},
|
||||
{0xB014, 0x05}, // AF_FS_STEP_SIZE},
|
||||
|
||||
{0x002A, 0x7F7A}, // PLL_P4_P5_P6_DIVIDERS},
|
||||
{0x8404, 0x05}, // SEQ_CMD},
|
||||
{SEQUENCE_WAIT_MS,300},
|
||||
{0x0018, 0x2008}, // STANDBY_CONTROL_AND_STATUS},
|
||||
{SEQUENCE_WAIT_MS,100},
|
||||
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
|
||||
@@ -1637,6 +1593,9 @@ static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Bri
|
||||
#if CONFIG_SENSOR_Effect
|
||||
static struct reginfo sensor_Effect_Normal[] =
|
||||
{
|
||||
{0x098e,0xdc38},
|
||||
{0xdc38,0x00},
|
||||
{0x8404,0x06},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
|
||||
@@ -1647,11 +1606,19 @@ static struct reginfo sensor_Effect_WandB[] =
|
||||
|
||||
static struct reginfo sensor_Effect_Sepia[] =
|
||||
{
|
||||
{0x098e,0xdc38},
|
||||
{0xdc38,0x02},
|
||||
{0xdc3a,0x10},
|
||||
{0xdc3b,0xe0},
|
||||
{0x8404,0x06},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
|
||||
static struct reginfo sensor_Effect_Negative[] =
|
||||
{
|
||||
{0x098e,0xdc38},
|
||||
{0xdc38,0x03},
|
||||
{0x8404,0x06},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
static struct reginfo sensor_Effect_Bluish[] =
|
||||
@@ -1663,8 +1630,17 @@ static struct reginfo sensor_Effect_Green[] =
|
||||
{
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,
|
||||
sensor_Effect_Bluish, sensor_Effect_Green,NULL,
|
||||
|
||||
static struct reginfo sensor_Effect_Solarize[] =
|
||||
{
|
||||
{0x098e,0xdc38},
|
||||
{0xdc38,0x05},
|
||||
{0xdc39,0x20},
|
||||
{0x8404,0x06},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_Negative,sensor_Effect_Sepia,
|
||||
sensor_Effect_Solarize,NULL,
|
||||
};
|
||||
#endif
|
||||
#if CONFIG_SENSOR_Exposure
|
||||
@@ -1836,9 +1812,8 @@ static const struct v4l2_querymenu sensor_menus[] =
|
||||
#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,},
|
||||
{ .id = V4L2_CID_EFFECT, .index = 0, .name = "none", .reserved = 0, }, { .id = V4L2_CID_EFFECT, .index = 1, .name = "negative", .reserved = 0,},
|
||||
{ .id = V4L2_CID_EFFECT, .index = 2, .name = "sepia", .reserved = 0,}, { .id = V4L2_CID_EFFECT, .index = 3, .name = "solarize", .reserved = 0,},
|
||||
#endif
|
||||
|
||||
#if CONFIG_SENSOR_Scene
|
||||
@@ -1883,7 +1858,7 @@ static const struct v4l2_queryctrl sensor_controls[] =
|
||||
.type = V4L2_CTRL_TYPE_MENU,
|
||||
.name = "Effect Control",
|
||||
.minimum = 0,
|
||||
.maximum = 5,
|
||||
.maximum = 3,
|
||||
.step = 1,
|
||||
.default_value = 0,
|
||||
},
|
||||
@@ -2330,11 +2305,69 @@ static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regar
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_SENSOR_Focus
|
||||
static struct reginfo sensor_af_init0[] =
|
||||
{
|
||||
//[Step8-Features]},
|
||||
//AF_VCM_enable},
|
||||
{0xC400, 0x88}, // AFM_ALGO},
|
||||
{0x8419, 0x05}, // SEQ_STATE_CFG_1_AF},
|
||||
{0xC400, 0x08}, // AFM_ALGO},
|
||||
//AF_settings},
|
||||
{0xB002, 0x0305}, // AF_MODE},
|
||||
{0xB004, 0x0002}, // AF_ALGO},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
static struct reginfo sensor_af_init1[] =
|
||||
{
|
||||
//set_posMin/Max},
|
||||
{0xC40A, 0x0028}, // AFM_POS_MIN},
|
||||
{0xC40C, 0x00BE}, // AFM_POS_MAX},
|
||||
//AF_postition_settings},
|
||||
{0xB018, 0x00}, // AF_FS_POS_0},
|
||||
{0xB019, 0x14}, // AF_FS_POS_1},
|
||||
{0xB01A, 0x20}, // AF_FS_POS_2},
|
||||
{0xB01B, 0x2C}, // AF_FS_POS_3},
|
||||
{0xB01C, 0x38}, // AF_FS_POS_4},
|
||||
{0xB01D, 0x44}, // AF_FS_POS_5},
|
||||
{0xB01E, 0x50}, // AF_FS_POS_6},
|
||||
{0xB01F, 0x5C}, // AF_FS_POS_7},
|
||||
{0xB020, 0x68}, // AF_FS_POS_8},
|
||||
{0xB021, 0x74}, // AF_FS_POS_9},
|
||||
{0xB022, 0x80}, // AF_FS_POS_10},
|
||||
{0xB023, 0x8C}, // AF_FS_POS_11},
|
||||
{0xB024, 0x98}, // AF_FS_POS_12},
|
||||
{0xB025, 0xA4}, // AF_FS_POS_13},
|
||||
{0xB026, 0xB0}, // AF_FS_POS_14},
|
||||
{0xB027, 0xBC}, // AF_FS_POS_15},
|
||||
{0xB012, 0x0F}, // AF_FS_NUM_STEPS},
|
||||
{0xB014, 0x0B}, // AF_FS_STEP_SIZE},
|
||||
// 2nd_scan_option},
|
||||
{0x098E, 0xB013}, // LOGICAL_ADDRESS_ACCESS [AF_FS_NUM_STEPS2]},
|
||||
{0xB013, 0x77}, // AF_FS_NUM_STEPS2},
|
||||
{0xB014, 0x05}, // AF_FS_STEP_SIZE},
|
||||
|
||||
{0x002A, 0x7F7A}, // PLL_P4_P5_P6_DIVIDERS},
|
||||
{0x8404, 0x05}, // SEQ_CMD},
|
||||
{SEQUENCE_WAIT_MS,300},
|
||||
{0x0018, 0x2008}, // STANDBY_CONTROL_AND_STATUS},
|
||||
{SEQUENCE_WAIT_MS,100},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
|
||||
|
||||
static struct reginfo sensor_af_trigger[] =
|
||||
{
|
||||
{0x098e,0xb006},
|
||||
{0xb006,0x01},
|
||||
{SEQUENCE_END, 0x00}
|
||||
};
|
||||
static int sensor_af_single(struct i2c_client *client)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = sensor_write_array(client, sensor_af_trigger);
|
||||
if (ret<0)
|
||||
SENSOR_TR("%s sensor auto focus trigger fail!!",SENSOR_NAME_STRING());
|
||||
sensor_af_single_end:
|
||||
return ret;
|
||||
}
|
||||
@@ -2350,10 +2383,57 @@ sensor_af_const_end:
|
||||
static int sensor_af_zoneupdate(struct i2c_client *client)
|
||||
{
|
||||
int ret = 0;
|
||||
struct i2c_msg msg[2];
|
||||
u8 buf[2][6] =
|
||||
{
|
||||
{0xb0,0x08,0x00,0x03,0xff,0xff},
|
||||
{0xb0,0x0c,0xff,0xff,0xff,0xff},
|
||||
};
|
||||
|
||||
msg[0].addr = client->addr;
|
||||
msg[0].flags = client->flags;
|
||||
msg[0].buf = buf[0];
|
||||
msg[0].len = sizeof(buf);
|
||||
msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */
|
||||
msg[0].read_type = 0; /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */
|
||||
|
||||
msg[1].addr = client->addr;
|
||||
msg[1].flags = client->flags;
|
||||
msg[1].buf = buf[1];
|
||||
msg[1].len = sizeof(buf);
|
||||
msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED; /* ddl@rock-chips.com : 100kHz */
|
||||
msg[1].read_type = 0; /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */
|
||||
|
||||
ret = i2c_transfer(client->adapter, &msg[0], 1);
|
||||
ret |= i2c_transfer(client->adapter, &msg[1], 1);
|
||||
if (ret >= 0) {
|
||||
return 0;
|
||||
} else {
|
||||
SENSOR_TR("\n %s sensor auto focus zone set fail!!\n",SENSOR_NAME_STRING());
|
||||
}
|
||||
|
||||
sensor_af_zoneupdate_end:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sensor_af_init(struct i2c_client *client)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = sensor_write_array(client, sensor_af_init0);
|
||||
if (ret<0) {
|
||||
SENSOR_TR("%s sensor auto focus init_0 fail!!",SENSOR_NAME_STRING());
|
||||
} else {
|
||||
if (sensor_af_zoneupdate(client) == 0) {
|
||||
ret = sensor_write_array(client, sensor_af_init1);
|
||||
if (ret<0) {
|
||||
SENSOR_TR("%s sensor auto focus init_1 fail!!",SENSOR_NAME_STRING());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)
|
||||
|
||||
Reference in New Issue
Block a user