#define MAX(x,y) ((x>y) ? x: y)
/* Sensor Driver Configuration */
-#define SENSOR_NAME RK29_CAM_SENSOR_MT9P111
+#define SENSOR_NAME mt9p111
#define SENSOR_V4L2_IDENT V4L2_IDENT_MT9P111
#define SENSOR_ID SEQUENCE_END
#define SENSOR_ID_REG SEQUENCE_END
#define CONFIG_SENSOR_I2C_RDWRCHK 0
-#define SENSOR_BUS_PARAM (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\
- SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |\
+#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_DN 6500
#define COLOR_TEMPERATURE_CLOUDY_UP 8000
#define COLOR_TEMPERATURE_CLEARDAY_DN 5000
#define COLOR_TEMPERATURE_CLEARDAY_UP 6500
{ 0xC88C, 0x034A, WORD_LEN, 0}, // CAM_CORE_B_FINE_ITMIN
{ 0xC890, 0x0000, WORD_LEN, 0}, // CAM_CORE_B_COARSE_ITMIN
{ 0xC892, 0x0001, WORD_LEN, 0}, // CAM_CORE_B_COARSE_ITMAX_MARGIN
+#if 1
{ 0xC894, 0x07EF, WORD_LEN, 0}, // CAM_CORE_B_MIN_FRAME_LENGTH_LINES
+#else
+{ 0xC894, 0x1300, WORD_LEN, 0}, // CAM_CORE_B_MIN_FRAME_LENGTH_LINES
+#endif
+
{ 0xC896, 0xFFFF, WORD_LEN, 0}, // CAM_CORE_B_MAX_FRAME_LENGTH_LINES
{ 0xC898, 0x082F, WORD_LEN, 0}, // CAM_CORE_B_BASE_FRAME_LENGTH_LINES
{ 0xC89A, 0x1964, WORD_LEN, 0}, // CAM_CORE_B_MIN_LINE_LENGTH_PCLK
{ 0xC89C, 0xFFFE, WORD_LEN, 0}, // CAM_CORE_B_MAX_LINE_LENGTH_PCLK
{ 0xC89E, 0x7F7F, WORD_LEN, 0}, // CAM_CORE_B_P4_5_6_DIVIDER
+#if 1
{ 0xC8A0, 0x07EF, WORD_LEN, 0}, // CAM_CORE_B_FRAME_LENGTH_LINES
+#else
+{ 0xC8A0, 0x1300, WORD_LEN, 0}, // CAM_CORE_B_FRAME_LENGTH_LINES
+#endif
{ 0xC8A2, 0x1964, WORD_LEN, 0}, // CAM_CORE_B_LINE_LENGTH_PCK
{ 0xC8A4, 0x0A28, WORD_LEN, 0}, // CAM_CORE_B_OUTPUT_SIZE_WIDTH
{ 0xC8A6, 0x07A0, WORD_LEN, 0}, // CAM_CORE_B_OUTPUT_SIZE_HEIGHT
static struct reginfo sensor_720p[]=
{
- {SEQUENCE_END, 0x00},
+ //{SEQUENCE_END, 0x00},
{0x098E, 0x843C, WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS [CAM_CORE_A_Y_ADDR_START]
{0x843C, 0x01, BYTE_LEN, 0 }, // SEQ_STATE_CFG_5_MAX_FRAME_CNT
{0x8404, 0x01, BYTE_LEN, 0 }, // SEQ_CMD
{0x098E, 0x843C, WORD_LEN, 0}, // LOGICAL_ADDRESS_ACCESS [SEQ_STATE_CFG_5_MAX_FRAME_CNT]
{0x843C, 0x01, BYTE_LEN, 0 }, // SEQ_STATE_CFG_5_MAX_FRAME_CNT
{0x8404, 0x01, BYTE_LEN, 0 }, // SEQ_CMD
- {0x0016, 0x0047, WORD_LEN, 0}, // CLOCKS_CONTRO
+ {0x0016, 0x0447, WORD_LEN, 0}, // CLOCKS_CONTRO
{SEQUENCE_END, 0x00}
};
static struct reginfo sensor_ClrFmt_YUYV[]=
atomic_t tasklock_cnt;
#endif
struct rk29camera_platform_data *sensor_io_request;
- struct rk29camera_gpio_res *sensor_gpio_res;
};
static struct sensor* to_sensor(const struct i2c_client *client)
preempt_enable();
}
}
+#endif
return 0;
sensor_task_lock_err:
return -1;
-#else
- return 0;
-#endif
-
}
/* sensor register write */
struct soc_camera_link *icl = to_soc_camera_link(icd);
int ret = 0;
- SENSOR_DG("%s %s cmd(%d) on(%d)\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd,on);
+
switch (cmd)
{
case Sensor_PowerDown:
}
default:
{
- SENSOR_TR("%s %s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),__FUNCTION__,cmd);
+ SENSOR_TR("%s power cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),cmd);
break;
}
}
struct sensor *sensor = to_sensor(client);
const struct v4l2_queryctrl *qctrl;
int ret,pid = 0;
-#if (SENSOR_RESET_REG != SEQUENCE_END)
- struct reginfo reg_info;
-#endif
SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
goto sensor_INIT_ERR;
#if (SENSOR_RESET_REG != SEQUENCE_END)
+ struct reginfo reg_info;
reg_info.reg = SENSOR_RESET_REG;
reg_info.val = SENSOR_RESET_VAL;
reg_info.reg_len = SENSOR_RESET_REG_LEN;
/* 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;
- msleep(100);
+
return 0;
}
static struct reginfo sensor_power_down_sequence[]=
struct v4l2_pix_format *pix = &f->fmt.pix;
struct reginfo *winseqe_set_addr=NULL;
int ret = 0, set_w,set_h;
-
+ u16 seq_state=0;
+
if (sensor->info_priv.pixfmt != pix->pixelformat) {
switch (pix->pixelformat)
{
SENSOR_TR("%s Preview 2 Capture failed\n", SENSOR_NAME_STRING());
goto sensor_s_fmt_end;
}
+
+ do{ //check state of register 0x8405 to make sure set is successful
+ ret = 0;
+ msleep(50);
+ ret =sensor_read(client,0x8405, &seq_state);
+ if (ret < 0)
+ return ret;
+ SENSOR_DG("mt9p111 Preview seq_state = 0x%x\n",seq_state);
+ } while(seq_state != 0x07);
+
sensor->info_priv.capture_w = set_w;
sensor->info_priv.capture_h = set_h;
sensor->info_priv.snap2preview = true;
SENSOR_TR("%s Capture 2 Preview failed\n", SENSOR_NAME_STRING());
goto sensor_s_fmt_end;
}
+
+ do{ //check state of register 0x8405 to make sure set is successful
+ ret = 0;
+ msleep(50);
+ ret =sensor_read(client,0x8405, &seq_state);
+ if (ret < 0)
+ return ret;
+ SENSOR_DG("mt9p111 Snapshot seq_state = 0x%x\n",seq_state);
+ } while(seq_state != 0x03);
+
+
sensor->info_priv.preview_w = pix->width;
sensor->info_priv.preview_h = pix->height;
sensor->info_priv.snap2preview = false;
return -EINVAL;
}
#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;
-}
-#endif
#if CONFIG_SENSOR_Focus
static int sensor_set_focus_absolute(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)
{
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;
}
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;
}
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;
}
}
case V4L2_CID_FOCUS_ABSOLUTE:
{
- ext_ctrl->value = sensor->info_priv.focus;
- break;
+ return -EINVAL;
}
case V4L2_CID_FOCUS_RELATIVE:
{
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;
}
#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);
} else if (enable == 0) {
sensor->info_priv.enable = 0;
}
+
+sensor_s_stream_end:
return 0;
}
{
int ret,pid = 0;
struct sensor *sensor = to_sensor(client);
-#if (SENSOR_RESET_REG != SEQUENCE_END)
- struct reginfo reg_info;
-#endif
/* We must have a parent by now. And it cannot be a wrong one.
* So this entire test is completely redundant. */
/* soft reset */
#if (SENSOR_RESET_REG != SEQUENCE_END)
+ struct reginfo reg_info;
reg_info.reg = SENSOR_RESET_REG;
reg_info.val = SENSOR_RESET_VAL;
reg_info.reg_len = SENSOR_RESET_REG_LEN;
static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
{
struct i2c_client *client = sd->priv;
- 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_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
+ sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;
break;
}
default:
break;
}
}
-sensor_ioctl_end:
- return ret;
+
+ return 0;
}
static void __exit sensor_mod_exit(void)
{
+ SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());
i2c_del_driver(&sensor_i2c_driver);
}