| /* Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| /* #define DEBUG */ |
| |
| #include <linux/delay.h> |
| #include <linux/types.h> |
| #include <linux/i2c.h> |
| #include <linux/uaccess.h> |
| #include <linux/miscdevice.h> |
| #include <linux/leds.h> |
| #include <linux/slab.h> |
| #include <media/msm_camera.h> |
| #include <mach/gpio.h> |
| #include <mach/camera.h> |
| #include "ov5640.h" |
| |
| #define FALSE 0 |
| #define TRUE 1 |
| |
| struct ov5640_work { |
| struct work_struct work; |
| }; |
| |
| struct __ov5640_ctrl { |
| const struct msm_camera_sensor_info *sensordata; |
| int sensormode; |
| uint fps_divider; /* init to 1 * 0x00000400 */ |
| uint pict_fps_divider; /* init to 1 * 0x00000400 */ |
| u16 curr_step_pos; |
| u16 curr_lens_pos; |
| u16 init_curr_lens_pos; |
| u16 my_reg_gain; |
| u16 my_reg_line_count; |
| enum msm_s_resolution prev_res; |
| enum msm_s_resolution pict_res; |
| enum msm_s_resolution curr_res; |
| enum msm_s_test_mode set_test; |
| }; |
| |
| static DECLARE_WAIT_QUEUE_HEAD(ov5640_wait_queue); |
| DEFINE_MUTEX(ov5640_mutex); |
| |
| static int ov5640_pwdn_gpio; |
| static int ov5640_reset_gpio; |
| static int ov5640_driver_pwdn_gpio; |
| static int OV5640_CSI_CONFIG; |
| static struct ov5640_work *ov5640_sensorw; |
| static struct i2c_client *ov5640_client; |
| static u8 ov5640_i2c_buf[4]; |
| static u8 ov5640_counter; |
| static int16_t ov5640_effect; |
| static int is_autoflash; |
| static int effect_value; |
| unsigned int ov5640_SAT_U = 0x40; |
| unsigned int ov5640_SAT_V = 0x40; |
| |
| static struct __ov5640_ctrl *ov5640_ctrl; |
| static int ov5640_afinit = 1; |
| |
| struct rw_semaphore ov_leds_list_lock; |
| struct list_head ov_leds_list; |
| |
| static int ov5640_i2c_remove(struct i2c_client *client); |
| static int ov5640_i2c_probe(struct i2c_client *client, |
| const struct i2c_device_id *id); |
| |
| static int ov5640_i2c_txdata(u16 saddr, u8 *txdata, int length) |
| { |
| struct i2c_msg msg[] = { |
| { |
| .addr = saddr, |
| .flags = 0, |
| .len = length, |
| .buf = txdata, |
| }, |
| }; |
| |
| if (i2c_transfer(ov5640_client->adapter, msg, 1) < 0) |
| return -EIO; |
| else |
| return 0; |
| } |
| |
| static int ov5640_i2c_write(unsigned short saddr, unsigned int waddr, |
| unsigned short bdata, u8 trytimes) |
| { |
| int rc = -EIO; |
| |
| ov5640_counter = 0; |
| ov5640_i2c_buf[0] = (waddr & 0xFF00) >> 8; |
| ov5640_i2c_buf[1] = (waddr & 0x00FF); |
| ov5640_i2c_buf[2] = (bdata & 0x00FF); |
| |
| while ((ov5640_counter < trytimes) && (rc != 0)) { |
| rc = ov5640_i2c_txdata(saddr, ov5640_i2c_buf, 3); |
| |
| if (rc < 0) { |
| ov5640_counter++; |
| CDBG("***--CAMERA i2c_write_w failed,i2c addr=0x%x," |
| "command addr = 0x%x, val = 0x%x,s=%d," |
| "rc=%d!\n", saddr, waddr, bdata, |
| ov5640_counter, rc); |
| msleep(20); |
| } |
| } |
| return rc; |
| } |
| |
| static int ov5640_i2c_rxdata(unsigned short saddr, unsigned char *rxdata, |
| int length) |
| { |
| struct i2c_msg msgs[] = { |
| { |
| .addr = saddr, |
| .flags = 0, |
| .len = 2, |
| .buf = rxdata, |
| }, |
| { |
| .addr = saddr, |
| .flags = I2C_M_RD, |
| .len = length, |
| .buf = rxdata, |
| }, |
| }; |
| |
| if (i2c_transfer(ov5640_client->adapter, msgs, 2) < 0) { |
| CDBG("ov5640_i2c_rxdata failed!\n"); |
| return -EIO; |
| } |
| |
| return 0; |
| } |
| |
| static int32_t ov5640_i2c_read_byte(unsigned short saddr, |
| unsigned int raddr, unsigned int *rdata) |
| { |
| int rc = 0; |
| unsigned char buf[2]; |
| |
| memset(buf, 0, sizeof(buf)); |
| |
| buf[0] = (raddr & 0xFF00)>>8; |
| buf[1] = (raddr & 0x00FF); |
| |
| rc = ov5640_i2c_rxdata(saddr, buf, 1); |
| if (rc < 0) { |
| CDBG("ov5640_i2c_read_byte failed!\n"); |
| return rc; |
| } |
| |
| *rdata = buf[0]; |
| |
| return rc; |
| } |
| |
| static int32_t ov5640_writepregs(struct ov5640_sensor *ptb, int32_t len) |
| { |
| int32_t i, ret = 0; |
| uint32_t regv; |
| |
| for (i = 0; i < len; i++) { |
| if (0 == ptb[i].mask) { |
| ov5640_i2c_write(ov5640_client->addr, ptb[i].addr, |
| ptb[i].data, 10); |
| } else { |
| ov5640_i2c_read_byte(ov5640_client->addr, ptb[i].addr, |
| ®v); |
| regv &= ptb[i].mask; |
| regv |= (ptb[i].data & (~ptb[i].mask)); |
| ov5640_i2c_write(ov5640_client->addr, ptb[i].addr, |
| regv, 10); |
| } |
| } |
| return ret; |
| } |
| |
| static void camera_sw_power_onoff(int v) |
| { |
| if (v == 0) { |
| CDBG("camera_sw_power_onoff: down\n"); |
| ov5640_i2c_write(ov5640_client->addr, 0x3008, 0x42, 10); |
| } else { |
| CDBG("camera_sw_power_onoff: on\n"); |
| ov5640_i2c_write(ov5640_client->addr, 0x3008, 0x02, 10); |
| } |
| } |
| |
| static void ov5640_power_off(void) |
| { |
| CDBG("--CAMERA-- %s ... (Start...)\n", __func__); |
| gpio_set_value(ov5640_pwdn_gpio, 1); |
| CDBG("--CAMERA-- %s ... (End...)\n", __func__); |
| } |
| |
| static void ov5640_power_on(void) |
| { |
| CDBG("--CAMERA-- %s ... (Start...)\n", __func__); |
| gpio_set_value(ov5640_pwdn_gpio, 0); |
| CDBG("--CAMERA-- %s ... (End...)\n", __func__); |
| } |
| |
| static void ov5640_power_reset(void) |
| { |
| CDBG("--CAMERA-- %s ... (Start...)\n", __func__); |
| gpio_set_value(ov5640_reset_gpio, 1); /* reset camera reset pin */ |
| msleep(20); |
| gpio_set_value(ov5640_reset_gpio, 0); |
| msleep(20); |
| gpio_set_value(ov5640_reset_gpio, 1); |
| msleep(20); |
| |
| CDBG("--CAMERA-- %s ... (End...)\n", __func__); |
| } |
| |
| static int ov5640_probe_readID(const struct msm_camera_sensor_info *data) |
| { |
| int rc = 0; |
| u32 device_id_high = 0; |
| u32 device_id_low = 0; |
| |
| CDBG("--CAMERA-- %s (Start...)\n", __func__); |
| CDBG("--CAMERA-- %s sensor poweron,begin to read ID!\n", __func__); |
| |
| /* 0x300A ,sensor ID register */ |
| rc = ov5640_i2c_read_byte(ov5640_client->addr, 0x300A, |
| &device_id_high); |
| |
| if (rc < 0) { |
| CDBG("--CAMERA-- %s ok , readI2C failed, rc = 0x%x\r\n", |
| __func__, rc); |
| return rc; |
| } |
| CDBG("--CAMERA-- %s readID high byte, data = 0x%x\r\n", |
| __func__, device_id_high); |
| |
| /* 0x300B ,sensor ID register */ |
| rc = ov5640_i2c_read_byte(ov5640_client->addr, 0x300B, |
| &device_id_low); |
| if (rc < 0) { |
| CDBG("--CAMERA-- %s ok , readI2C failed,rc = 0x%x\r\n", |
| __func__, rc); |
| return rc; |
| } |
| |
| CDBG("--CAMERA-- %s readID low byte, data = 0x%x\r\n", |
| __func__, device_id_low); |
| CDBG("--CAMERA-- %s return ID :0x%x\n", __func__, |
| (device_id_high << 8) + device_id_low); |
| |
| /* 0x5640, ov5640 chip id */ |
| if ((device_id_high << 8) + device_id_low != OV5640_SENSOR_ID) { |
| CDBG("--CAMERA-- %s ok , device id error, should be 0x%x\r\n", |
| __func__, OV5640_SENSOR_ID); |
| return -EINVAL; |
| } else { |
| CDBG("--CAMERA-- %s ok , device id=0x%x\n", __func__, |
| OV5640_SENSOR_ID); |
| return 0; |
| } |
| } |
| |
| static int ov5640_af_setting(void) |
| { |
| int rc = 0; |
| int lens = sizeof(ov5640_afinit_tbl) / sizeof(ov5640_afinit_tbl[0]); |
| |
| CDBG("--CAMERA-- ov5640_af_setting\n"); |
| |
| ov5640_i2c_write(ov5640_client->addr, 0x3000, 0x20, 10); |
| |
| rc = ov5640_i2c_txdata(ov5640_client->addr, ov5640_afinit_tbl, lens); |
| if (rc < 0) { |
| CDBG("--CAMERA-- AF_init failed\n"); |
| return rc; |
| } |
| |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_MAIN, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_ACK, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_PARA0, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_PARA1, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_PARA2, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_PARA3, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_PARA4, 0x00, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_FW_STATUS, 0x7f, 10); |
| ov5640_i2c_write(ov5640_client->addr, 0x3000, 0x00, 10); |
| |
| return rc; |
| } |
| |
| static int ov5640_set_flash_light(enum led_brightness brightness) |
| { |
| struct led_classdev *led_cdev; |
| |
| CDBG("ov5640_set_flash_light brightness = %d\n", brightness); |
| |
| down_read(&ov_leds_list_lock); |
| list_for_each_entry(led_cdev, &ov_leds_list, node) { |
| if (!strncmp(led_cdev->name, "flashlight", 10)) |
| break; |
| } |
| up_read(&ov_leds_list_lock); |
| |
| if (led_cdev) { |
| led_brightness_set(led_cdev, brightness); |
| } else { |
| CDBG("get flashlight device failed\n"); |
| return -EINVAL; |
| } |
| |
| return 0; |
| } |
| |
| static int ov5640_video_config(void) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- ov5640_video_config\n"); |
| CDBG("--CAMERA-- preview in, is_autoflash - 0x%x\n", is_autoflash); |
| |
| /* autoflash setting */ |
| if (is_autoflash == 1) |
| ov5640_set_flash_light(LED_OFF); |
| |
| /* preview setting */ |
| rc = OV5640CORE_WRITEPREG(ov5640_preview_tbl); |
| return rc; |
| } |
| |
| static int ov5640_snapshot_config(void) |
| { |
| int rc = 0; |
| unsigned int tmp; |
| |
| CDBG("--CAMERA-- SENSOR_SNAPSHOT_MODE\n"); |
| CDBG("--CAMERA-- %s, snapshot in, is_autoflash - 0x%x\n", __func__, |
| is_autoflash); |
| |
| if (is_autoflash == 1) { |
| ov5640_i2c_read_byte(ov5640_client->addr, 0x350b, &tmp); |
| CDBG("--CAMERA-- GAIN VALUE : %x\n", tmp); |
| if ((tmp & 0x80) == 0) |
| ov5640_set_flash_light(LED_OFF); |
| else |
| ov5640_set_flash_light(LED_FULL); |
| } |
| |
| rc = OV5640CORE_WRITEPREG(ov5640_capture_tbl); |
| |
| return rc; |
| } |
| |
| static int ov5640_setting(enum msm_s_reg_update rupdate, |
| enum msm_s_setting rt) |
| { |
| int rc = -EINVAL, tmp; |
| struct msm_camera_csi_params ov5640_csi_params; |
| |
| CDBG("--CAMERA-- %s (Start...), rupdate=%d\n", __func__, rupdate); |
| |
| switch (rupdate) { |
| case S_UPDATE_PERIODIC: |
| if (!OV5640_CSI_CONFIG) { |
| camera_sw_power_onoff(0); /* standby */ |
| msleep(20); |
| |
| ov5640_csi_params.lane_cnt = 2; |
| ov5640_csi_params.data_format = CSI_8BIT; |
| ov5640_csi_params.lane_assign = 0xe4; |
| ov5640_csi_params.dpcm_scheme = 0; |
| ov5640_csi_params.settle_cnt = 0x6; |
| |
| CDBG("%s: msm_camio_csi_config\n", __func__); |
| |
| rc = msm_camio_csi_config(&ov5640_csi_params); |
| msleep(20); |
| camera_sw_power_onoff(1); /* on */ |
| msleep(20); |
| |
| OV5640_CSI_CONFIG = 1; |
| |
| } else { |
| rc = 0; |
| } |
| |
| if (S_RES_PREVIEW == rt) |
| rc = ov5640_video_config(); |
| else if (S_RES_CAPTURE == rt) |
| rc = ov5640_snapshot_config(); |
| |
| break; /* UPDATE_PERIODIC */ |
| |
| case S_REG_INIT: |
| CDBG("--CAMERA-- S_REG_INIT (Start)\n"); |
| |
| rc = ov5640_i2c_write(ov5640_client->addr, 0x3103, 0x11, 10); |
| rc = ov5640_i2c_write(ov5640_client->addr, 0x3008, 0x82, 10); |
| msleep(20); |
| |
| /* set sensor init setting */ |
| CDBG("set sensor init setting\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_init_tbl); |
| if (rc < 0) { |
| CDBG("sensor init setting failed\n"); |
| break; |
| } |
| |
| /* set image quality setting */ |
| rc = OV5640CORE_WRITEPREG(ov5640_init_iq_tbl); |
| rc = ov5640_i2c_read_byte(ov5640_client->addr, 0x4740, &tmp); |
| CDBG("--CAMERA-- init 0x4740 value=0x%x\n", tmp); |
| |
| if (tmp != 0x21) { |
| rc = ov5640_i2c_write(ov5640_client->addr, 0x4740, |
| 0x21, 10); |
| msleep(20); |
| rc = ov5640_i2c_read_byte(ov5640_client->addr, |
| 0x4740, &tmp); |
| CDBG("--CAMERA-- WG 0x4740 value=0x%x\n", tmp); |
| } |
| |
| CDBG("--CAMERA-- AF_init: ov5640_afinit = %d\n", |
| ov5640_afinit); |
| if (ov5640_afinit == 1) { |
| rc = ov5640_af_setting(); |
| if (rc < 0) { |
| CDBG("--CAMERA-- ov5640_af_setting failed\n"); |
| break; |
| } |
| ov5640_afinit = 0; |
| } |
| |
| /* reset fps_divider */ |
| ov5640_ctrl->fps_divider = 1 * 0x0400; |
| CDBG("--CAMERA-- S_REG_INIT (End)\n"); |
| break; /* case REG_INIT: */ |
| |
| default: |
| break; |
| } /* switch (rupdate) */ |
| |
| CDBG("--CAMERA-- %s (End), rupdate=%d\n", __func__, rupdate); |
| |
| return rc; |
| } |
| |
| static int ov5640_sensor_open_init(const struct msm_camera_sensor_info *data) |
| { |
| int rc = -ENOMEM; |
| |
| CDBG("--CAMERA-- %s\n", __func__); |
| ov5640_ctrl = kzalloc(sizeof(struct __ov5640_ctrl), GFP_KERNEL); |
| if (!ov5640_ctrl) { |
| CDBG("--CAMERA-- kzalloc ov5640_ctrl error !!\n"); |
| kfree(ov5640_ctrl); |
| return rc; |
| } |
| |
| ov5640_ctrl->fps_divider = 1 * 0x00000400; |
| ov5640_ctrl->pict_fps_divider = 1 * 0x00000400; |
| ov5640_ctrl->set_test = S_TEST_OFF; |
| ov5640_ctrl->prev_res = S_QTR_SIZE; |
| ov5640_ctrl->pict_res = S_FULL_SIZE; |
| |
| if (data) |
| ov5640_ctrl->sensordata = data; |
| |
| ov5640_power_off(); |
| |
| CDBG("%s: msm_camio_clk_rate_set\n", __func__); |
| |
| msm_camio_clk_rate_set(24000000); |
| msleep(20); |
| |
| ov5640_power_on(); |
| ov5640_power_reset(); |
| |
| CDBG("%s: init sequence\n", __func__); |
| |
| if (ov5640_ctrl->prev_res == S_QTR_SIZE) |
| rc = ov5640_setting(S_REG_INIT, S_RES_PREVIEW); |
| else |
| rc = ov5640_setting(S_REG_INIT, S_RES_CAPTURE); |
| |
| if (rc < 0) { |
| CDBG("--CAMERA-- %s : ov5640_setting failed. rc = %d\n", |
| __func__, rc); |
| kfree(ov5640_ctrl); |
| return rc; |
| } |
| |
| OV5640_CSI_CONFIG = 0; |
| |
| CDBG("--CAMERA--re_init_sensor ok!!\n"); |
| return rc; |
| } |
| |
| static int ov5640_sensor_release(void) |
| { |
| CDBG("--CAMERA--ov5640_sensor_release!!\n"); |
| |
| mutex_lock(&ov5640_mutex); |
| |
| ov5640_power_off(); |
| |
| kfree(ov5640_ctrl); |
| ov5640_ctrl = NULL; |
| |
| OV5640_CSI_CONFIG = 0; |
| |
| mutex_unlock(&ov5640_mutex); |
| return 0; |
| } |
| |
| static const struct i2c_device_id ov5640_i2c_id[] = { |
| {"ov5640", 0}, {} |
| }; |
| |
| static int ov5640_i2c_remove(struct i2c_client *client) |
| { |
| return 0; |
| } |
| |
| static int ov5640_init_client(struct i2c_client *client) |
| { |
| /* Initialize the MSM_CAMI2C Chip */ |
| init_waitqueue_head(&ov5640_wait_queue); |
| return 0; |
| } |
| |
| static long ov5640_set_effect(int mode, int effect) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| |
| switch (mode) { |
| case SENSOR_PREVIEW_MODE: |
| /* Context A Special Effects */ |
| CDBG("--CAMERA-- %s ...SENSOR_PREVIEW_MODE\n", __func__); |
| break; |
| |
| case SENSOR_SNAPSHOT_MODE: |
| /* Context B Special Effects */ |
| CDBG("--CAMERA-- %s ...SENSOR_SNAPSHOT_MODE\n", __func__); |
| break; |
| |
| default: |
| break; |
| } |
| |
| effect_value = effect; |
| |
| switch (effect) { |
| case CAMERA_EFFECT_OFF: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_OFF\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_normal_tbl); |
| /* for recover saturation level when change special effect */ |
| ov5640_i2c_write(ov5640_client->addr, 0x5583, ov5640_SAT_U, |
| 10); |
| /* for recover saturation level when change special effect */ |
| ov5640_i2c_write(ov5640_client->addr, 0x5584, ov5640_SAT_V, |
| 10); |
| break; |
| |
| case CAMERA_EFFECT_MONO: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_MONO\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_mono_tbl); |
| break; |
| |
| case CAMERA_EFFECT_BW: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_BW\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_bw_tbl); |
| break; |
| |
| case CAMERA_EFFECT_BLUISH: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_BLUISH\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_bluish_tbl); |
| break; |
| |
| case CAMERA_EFFECT_SOLARIZE: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_NEGATIVE\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_solarize_tbl); |
| break; |
| |
| case CAMERA_EFFECT_SEPIA: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_SEPIA\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_sepia_tbl); |
| break; |
| |
| case CAMERA_EFFECT_REDDISH: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_REDDISH\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_reddish_tbl); |
| break; |
| |
| case CAMERA_EFFECT_GREENISH: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_GREENISH\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_greenish_tbl); |
| break; |
| |
| case CAMERA_EFFECT_NEGATIVE: |
| CDBG("--CAMERA-- %s ...CAMERA_EFFECT_NEGATIVE\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_effect_negative_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA-- %s ...Default(Not Support)\n", __func__); |
| } |
| |
| ov5640_effect = effect; |
| /* Refresh Sequencer */ |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static int ov5640_set_brightness(int8_t brightness) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| CDBG("--CAMERA-- %s ...brightness = %d\n", __func__ , brightness); |
| |
| switch (brightness) { |
| case CAMERA_BRIGHTNESS_LV0: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV0\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv0_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV1: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV1\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv1_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV2: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV2\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv2_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV3: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV3\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv3_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV4: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV4\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_default_lv4_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV5: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV5\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv5_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV6: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV6\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv6_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV7: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV7\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv7_tbl); |
| break; |
| |
| case CAMERA_BRIGHTNESS_LV8: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_LV8\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_brightness_lv8_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA--CAMERA_BRIGHTNESS_ERROR COMMAND\n"); |
| break; |
| } |
| |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static int ov5640_set_contrast(int contrast) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| CDBG("--CAMERA-- %s ...contrast = %d\n", __func__ , contrast); |
| |
| if (effect_value == CAMERA_EFFECT_OFF) { |
| switch (contrast) { |
| case CAMERA_CONTRAST_LV0: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV0\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv0_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV1: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV1\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv1_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV2: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV2\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv2_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV3: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV3\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv3_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV4: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV4\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_contrast_default_lv4_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV5: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV5\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv5_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV6: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV6\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv6_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV7: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV7\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv7_tbl); |
| break; |
| |
| case CAMERA_CONTRAST_LV8: |
| CDBG("--CAMERA--CAMERA_CONTRAST_LV8\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_contrast_lv8_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA--CAMERA_CONTRAST_ERROR COMMAND\n"); |
| break; |
| } |
| } |
| |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static int ov5640_set_sharpness(int sharpness) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| CDBG("--CAMERA-- %s ...sharpness = %d\n", __func__ , sharpness); |
| |
| if (effect_value == CAMERA_EFFECT_OFF) { |
| switch (sharpness) { |
| case CAMERA_SHARPNESS_LV0: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV0\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv0_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV1: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV1\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv1_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV2: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV2\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_sharpness_default_lv2_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV3: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV3\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv3_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV4: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV4\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv4_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV5: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV5\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv5_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV6: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV6\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv6_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV7: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV7\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv7_tbl); |
| break; |
| |
| case CAMERA_SHARPNESS_LV8: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_LV8\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_sharpness_lv8_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA--CAMERA_SHARPNESS_ERROR COMMAND\n"); |
| break; |
| } |
| } |
| |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static int ov5640_set_saturation(int saturation) |
| { |
| long rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| CDBG("--CAMERA-- %s ...saturation = %d\n", __func__ , saturation); |
| |
| if (effect_value == CAMERA_EFFECT_OFF) { |
| switch (saturation) { |
| case CAMERA_SATURATION_LV0: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV0\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv0_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV1: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV1\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv1_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV2: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV2\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv2_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV3: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV3\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv3_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV4: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV4\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_saturation_default_lv4_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV5: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV5\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv5_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV6: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV6\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv6_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV7: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV7\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv7_tbl); |
| break; |
| |
| case CAMERA_SATURATION_LV8: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV8\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_saturation_lv8_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA--CAMERA_SATURATION_ERROR COMMAND\n"); |
| break; |
| } |
| } |
| |
| /* for recover saturation level when change special effect */ |
| switch (saturation) { |
| case CAMERA_SATURATION_LV0: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV0\n"); |
| ov5640_SAT_U = 0x00; |
| ov5640_SAT_V = 0x00; |
| break; |
| case CAMERA_SATURATION_LV1: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV1\n"); |
| ov5640_SAT_U = 0x10; |
| ov5640_SAT_V = 0x10; |
| break; |
| case CAMERA_SATURATION_LV2: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV2\n"); |
| ov5640_SAT_U = 0x20; |
| ov5640_SAT_V = 0x20; |
| break; |
| case CAMERA_SATURATION_LV3: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV3\n"); |
| ov5640_SAT_U = 0x30; |
| ov5640_SAT_V = 0x30; |
| break; |
| case CAMERA_SATURATION_LV4: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV4\n"); |
| ov5640_SAT_U = 0x40; |
| ov5640_SAT_V = 0x40; break; |
| case CAMERA_SATURATION_LV5: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV5\n"); |
| ov5640_SAT_U = 0x50; |
| ov5640_SAT_V = 0x50; break; |
| case CAMERA_SATURATION_LV6: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV6\n"); |
| ov5640_SAT_U = 0x60; |
| ov5640_SAT_V = 0x60; |
| break; |
| case CAMERA_SATURATION_LV7: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV7\n"); |
| ov5640_SAT_U = 0x70; |
| ov5640_SAT_V = 0x70; break; |
| case CAMERA_SATURATION_LV8: |
| CDBG("--CAMERA--CAMERA_SATURATION_LV8\n"); |
| ov5640_SAT_U = 0x80; |
| ov5640_SAT_V = 0x80; |
| break; |
| default: |
| CDBG("--CAMERA--CAMERA_SATURATION_ERROR COMMAND\n"); |
| break; |
| } |
| |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static long ov5640_set_antibanding(int antibanding) |
| { |
| long rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| CDBG("--CAMERA-- %s ...antibanding = %d\n", __func__, antibanding); |
| |
| switch (antibanding) { |
| case CAMERA_ANTIBANDING_OFF: |
| CDBG("--CAMERA--CAMERA_ANTIBANDING_OFF\n"); |
| break; |
| |
| case CAMERA_ANTIBANDING_60HZ: |
| CDBG("--CAMERA--CAMERA_ANTIBANDING_60HZ\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_antibanding_60z_tbl); |
| break; |
| |
| case CAMERA_ANTIBANDING_50HZ: |
| CDBG("--CAMERA--CAMERA_ANTIBANDING_50HZ\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_antibanding_50z_tbl); |
| break; |
| |
| case CAMERA_ANTIBANDING_AUTO: |
| CDBG("--CAMERA--CAMERA_ANTIBANDING_AUTO\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_antibanding_auto_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA--CAMERA_ANTIBANDING_ERROR COMMAND\n"); |
| break; |
| } |
| |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static long ov5640_set_exposure_mode(int mode) |
| { |
| long rc = 0; |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| CDBG("--CAMERA-- %s ...mode = %d\n", __func__ , mode); |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| return rc; |
| } |
| |
| static int32_t ov5640_lens_shading_enable(uint8_t is_enable) |
| { |
| int32_t rc = 0; |
| CDBG("--CAMERA--%s: ...(Start). enable = %d\n", __func__, is_enable); |
| |
| if (is_enable) { |
| CDBG("%s: enable~!!\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_lens_shading_on_tbl); |
| } else { |
| CDBG("%s: disable~!!\n", __func__); |
| rc = OV5640CORE_WRITEPREG(ov5640_lens_shading_off_tbl); |
| } |
| CDBG("--CAMERA--%s: ...(End). rc = %d\n", __func__, rc); |
| return rc; |
| } |
| |
| static int ov5640_set_sensor_mode(int mode, int res) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- ov5640_set_sensor_mode mode = %d, res = %d\n", |
| mode, res); |
| |
| switch (mode) { |
| case SENSOR_PREVIEW_MODE: |
| CDBG("--CAMERA-- SENSOR_PREVIEW_MODE\n"); |
| rc = ov5640_setting(S_UPDATE_PERIODIC, S_RES_PREVIEW); |
| break; |
| |
| case SENSOR_SNAPSHOT_MODE: |
| CDBG("--CAMERA-- SENSOR_SNAPSHOT_MODE\n"); |
| rc = ov5640_setting(S_UPDATE_PERIODIC, S_RES_CAPTURE); |
| break; |
| |
| case SENSOR_RAW_SNAPSHOT_MODE: |
| CDBG("--CAMERA-- SENSOR_RAW_SNAPSHOT_MODE\n"); |
| rc = ov5640_setting(S_UPDATE_PERIODIC, S_RES_CAPTURE); |
| break; |
| |
| default: |
| CDBG("--CAMERA--ov5640_set_sensor_mode no support\n"); |
| rc = -EINVAL; |
| break; |
| } |
| |
| return rc; |
| } |
| |
| static int ov5640_set_wb_oem(uint8_t param) |
| { |
| int rc = 0; |
| unsigned int tmp2; |
| |
| CDBG("[kylin] %s \r\n", __func__); |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, 0x350b, &tmp2); |
| CDBG("--CAMERA-- GAIN VALUE : %x\n", tmp2); |
| |
| switch (param) { |
| case CAMERA_WB_AUTO: |
| |
| CDBG("--CAMERA--CAMERA_WB_AUTO\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_wb_def); |
| break; |
| |
| case CAMERA_WB_CUSTOM: |
| CDBG("--CAMERA--CAMERA_WB_CUSTOM\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_wb_custom); |
| break; |
| case CAMERA_WB_INCANDESCENT: |
| CDBG("--CAMERA--CAMERA_WB_INCANDESCENT\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_wb_inc); |
| break; |
| case CAMERA_WB_DAYLIGHT: |
| CDBG("--CAMERA--CAMERA_WB_DAYLIGHT\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_wb_daylight); |
| break; |
| case CAMERA_WB_CLOUDY_DAYLIGHT: |
| CDBG("--CAMERA--CAMERA_WB_CLOUDY_DAYLIGHT\n"); |
| rc = OV5640CORE_WRITEPREG(ov5640_wb_cloudy); |
| break; |
| default: |
| break; |
| } |
| return rc; |
| } |
| |
| static int ov5640_set_touchaec(uint32_t x, uint32_t y) |
| { |
| uint8_t aec_arr[8] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}; |
| int idx = 0; |
| int i; |
| |
| CDBG("[kylin] %s x: %d ,y: %d\r\n", __func__ , x, y); |
| idx = x / 2 + y * 2; |
| CDBG("[kylin] idx: %d\r\n", idx); |
| |
| if (x % 2 == 0) |
| aec_arr[idx] = 0x10 | 0x0a; |
| else |
| aec_arr[idx] = 0x01 | 0xa0; |
| |
| for (i = 0; i < 8; i++) { |
| CDBG("write : %x val : %x ", 0x5688 + i, aec_arr[i]); |
| ov5640_i2c_write(ov5640_client->addr, 0x5688 + i, |
| aec_arr[i], 10); |
| } |
| |
| return 1; |
| } |
| |
| static int ov5640_set_exposure_compensation(int compensation) |
| { |
| long rc = 0; |
| |
| CDBG("--CAMERA-- %s ...(Start)\n", __func__); |
| |
| CDBG("--CAMERA-- %s ...exposure_compensation = %d\n", __func__ , |
| compensation); |
| |
| switch (compensation) { |
| case CAMERA_EXPOSURE_COMPENSATION_LV0: |
| CDBG("--CAMERA--CAMERA_EXPOSURE_COMPENSATION_LV0\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_exposure_compensation_lv0_tbl); |
| break; |
| |
| case CAMERA_EXPOSURE_COMPENSATION_LV1: |
| CDBG("--CAMERA--CAMERA_EXPOSURE_COMPENSATION_LV1\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_exposure_compensation_lv1_tbl); |
| break; |
| |
| case CAMERA_EXPOSURE_COMPENSATION_LV2: |
| CDBG("--CAMERA--CAMERA_EXPOSURE_COMPENSATION_LV2\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_exposure_compensation_lv2_default_tbl); |
| break; |
| |
| case CAMERA_EXPOSURE_COMPENSATION_LV3: |
| CDBG("--CAMERA--CAMERA_EXPOSURE_COMPENSATION_LV3\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_exposure_compensation_lv3_tbl); |
| break; |
| |
| case CAMERA_EXPOSURE_COMPENSATION_LV4: |
| CDBG("--CAMERA--CAMERA_EXPOSURE_COMPENSATION_LV3\n"); |
| rc = OV5640CORE_WRITEPREG( |
| ov5640_exposure_compensation_lv4_tbl); |
| break; |
| |
| default: |
| CDBG("--CAMERA--ERROR CAMERA_EXPOSURE_COMPENSATION\n"); |
| break; |
| } |
| |
| CDBG("--CAMERA-- %s ...(End)\n", __func__); |
| |
| return rc; |
| } |
| |
| static int ov5640_sensor_start_af(void) |
| { |
| int i; |
| unsigned int af_st = 0; |
| unsigned int af_ack = 0; |
| unsigned int tmp = 0; |
| int rc = 0; |
| |
| CDBG("--CAMERA-- %s (Start...)\n", __func__); |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, |
| OV5640_CMD_FW_STATUS, &af_st); |
| CDBG("--CAMERA-- %s af_st = %d\n", __func__, af_st); |
| |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_ACK, 0x01, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_MAIN, 0x03, 10); |
| |
| for (i = 0; i < 50; i++) { |
| ov5640_i2c_read_byte(ov5640_client->addr, |
| OV5640_CMD_ACK, &af_ack); |
| if (af_ack == 0) |
| break; |
| msleep(50); |
| } |
| CDBG("--CAMERA-- %s af_ack = 0x%x\n", __func__, af_ack); |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_FW_STATUS, |
| &af_st); |
| CDBG("--CAMERA-- %s af_st = %d\n", __func__, af_st); |
| |
| if (af_st == 0x10) { |
| CDBG("--CAMERA-- %s AF ok and release AF setting~!!\n", |
| __func__); |
| } else { |
| CDBG("--CAMERA-- %s AF not ready!!\n", __func__); |
| } |
| |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_ACK, 0x01, 10); |
| ov5640_i2c_write(ov5640_client->addr, OV5640_CMD_MAIN, 0x07, 10); |
| |
| for (i = 0; i < 70; i++) { |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_ACK, |
| &af_ack); |
| if (af_ack == 0) |
| break; |
| msleep(25); |
| } |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_PARA0, &tmp); |
| CDBG("0x3024 = %x\n", tmp); |
| rc = ((tmp == 0) ? 1 : 0); |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_PARA1, &tmp); |
| CDBG("0x3025 = %x\n", tmp); |
| rc = ((tmp == 0) ? 1 : 0); |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_PARA2, &tmp); |
| CDBG("0x3026 = %x\n", tmp); |
| rc = ((tmp == 0) ? 1 : 0); |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_PARA3, &tmp); |
| CDBG("0x3027 = %x\n", tmp); |
| rc = ((tmp == 0) ? 1 : 0) ; |
| |
| ov5640_i2c_read_byte(ov5640_client->addr, OV5640_CMD_PARA4, &tmp); |
| CDBG("0x3028 = %x\n", tmp); |
| rc = ((tmp == 0) ? 1 : 0) ; |
| |
| CDBG("--CAMERA-- %s rc = %d(End...)\n", __func__, rc); |
| return rc; |
| } |
| |
| static int ov5640_sensor_config(void __user *argp) |
| { |
| struct sensor_cfg_data cdata; |
| long rc = 0; |
| |
| if (copy_from_user(&cdata, (void *)argp, |
| sizeof(struct sensor_cfg_data))) |
| return -EFAULT; |
| |
| CDBG("--CAMERA-- %s %d\n", __func__, cdata.cfgtype); |
| |
| mutex_lock(&ov5640_mutex); |
| |
| switch (cdata.cfgtype) { |
| case CFG_SET_MODE: |
| rc = ov5640_set_sensor_mode(cdata.mode, cdata.rs); |
| break; |
| |
| case CFG_SET_EFFECT: |
| CDBG("--CAMERA-- CFG_SET_EFFECT mode=%d," |
| "effect = %d !!\n", cdata.mode, |
| cdata.cfg.effect); |
| rc = ov5640_set_effect(cdata.mode, cdata.cfg.effect); |
| break; |
| |
| case CFG_START: |
| CDBG("--CAMERA-- CFG_START (Not Support) !!\n"); |
| /* Not Support */ |
| break; |
| |
| case CFG_PWR_UP: |
| CDBG("--CAMERA-- CFG_PWR_UP (Not Support) !!\n"); |
| /* Not Support */ |
| break; |
| |
| case CFG_PWR_DOWN: |
| CDBG("--CAMERA-- CFG_PWR_DOWN (Not Support)\n"); |
| ov5640_power_off(); |
| break; |
| |
| case CFG_SET_DEFAULT_FOCUS: |
| CDBG("--CAMERA-- CFG_SET_DEFAULT_FOCUS (Not Implement) !!\n"); |
| break; |
| |
| case CFG_MOVE_FOCUS: |
| CDBG("--CAMERA-- CFG_MOVE_FOCUS (Not Implement) !!\n"); |
| break; |
| |
| case CFG_SET_BRIGHTNESS: |
| CDBG("--CAMERA-- CFG_SET_BRIGHTNESS !!\n"); |
| rc = ov5640_set_brightness(cdata.cfg.brightness); |
| break; |
| |
| case CFG_SET_CONTRAST: |
| CDBG("--CAMERA-- CFG_SET_CONTRAST !!\n"); |
| rc = ov5640_set_contrast(cdata.cfg.contrast); |
| break; |
| |
| case CFG_SET_EXPOSURE_MODE: |
| CDBG("--CAMERA-- CFG_SET_EXPOSURE_MODE !!\n"); |
| rc = ov5640_set_exposure_mode(cdata.cfg.ae_mode); |
| break; |
| |
| case CFG_SET_ANTIBANDING: |
| CDBG("--CAMERA-- CFG_SET_ANTIBANDING antibanding = %d!!\n", |
| cdata.cfg.antibanding); |
| rc = ov5640_set_antibanding(cdata.cfg.antibanding); |
| break; |
| |
| case CFG_SET_LENS_SHADING: |
| CDBG("--CAMERA-- CFG_SET_LENS_SHADING !!\n"); |
| rc = ov5640_lens_shading_enable( |
| cdata.cfg.lens_shading); |
| break; |
| |
| case CFG_SET_SATURATION: |
| CDBG("--CAMERA-- CFG_SET_SATURATION !!\n"); |
| rc = ov5640_set_saturation(cdata.cfg.saturation); |
| break; |
| |
| case CFG_SET_SHARPNESS: |
| CDBG("--CAMERA-- CFG_SET_SHARPNESS !!\n"); |
| rc = ov5640_set_sharpness(cdata.cfg.sharpness); |
| break; |
| |
| case CFG_SET_WB: |
| CDBG("--CAMERA-- CFG_SET_WB!!\n"); |
| ov5640_set_wb_oem(cdata.cfg.wb_val); |
| rc = 0 ; |
| break; |
| |
| case CFG_SET_TOUCHAEC: |
| CDBG("--CAMERA-- CFG_SET_TOUCHAEC!!\n"); |
| ov5640_set_touchaec(cdata.cfg.aec_cord.x, |
| cdata.cfg.aec_cord.y); |
| rc = 0 ; |
| break; |
| |
| case CFG_SET_AUTO_FOCUS: |
| CDBG("--CAMERA-- CFG_SET_AUTO_FOCUS !\n"); |
| rc = ov5640_sensor_start_af(); |
| break; |
| |
| case CFG_SET_AUTOFLASH: |
| CDBG("--CAMERA-- CFG_SET_AUTOFLASH !\n"); |
| is_autoflash = cdata.cfg.is_autoflash; |
| CDBG("[kylin] is autoflash %d\r\n", is_autoflash); |
| rc = 0; |
| break; |
| |
| case CFG_SET_EXPOSURE_COMPENSATION: |
| CDBG("--CAMERA-- CFG_SET_EXPOSURE_COMPENSATION !\n"); |
| rc = ov5640_set_exposure_compensation( |
| cdata.cfg.exp_compensation); |
| break; |
| |
| default: |
| CDBG("%s: Command=%d (Not Implement)!!\n", __func__, |
| cdata.cfgtype); |
| rc = -EINVAL; |
| break; |
| } |
| |
| mutex_unlock(&ov5640_mutex); |
| return rc; |
| } |
| |
| static struct i2c_driver ov5640_i2c_driver = { |
| .id_table = ov5640_i2c_id, |
| .probe = ov5640_i2c_probe, |
| .remove = ov5640_i2c_remove, |
| .driver = { |
| .name = "ov5640", |
| }, |
| }; |
| |
| static int ov5640_probe_init_gpio(const struct msm_camera_sensor_info *data) |
| { |
| int rc = 0; |
| |
| CDBG("--CAMERA-- %s\n", __func__); |
| |
| ov5640_pwdn_gpio = data->sensor_pwd; |
| ov5640_reset_gpio = data->sensor_reset; |
| ov5640_driver_pwdn_gpio = data->vcm_pwd ; |
| |
| if (data->vcm_enable) |
| gpio_direction_output(data->vcm_pwd, 1); |
| |
| gpio_direction_output(data->sensor_reset, 1); |
| gpio_direction_output(data->sensor_pwd, 1); |
| |
| return rc; |
| |
| } |
| |
| static void ov5640_probe_free_gpio(const struct msm_camera_sensor_info *data) |
| { |
| gpio_free(ov5640_pwdn_gpio); |
| gpio_free(ov5640_reset_gpio); |
| |
| if (data->vcm_enable) { |
| gpio_free(ov5640_driver_pwdn_gpio); |
| ov5640_driver_pwdn_gpio = 0xFF ; |
| } |
| |
| ov5640_pwdn_gpio = 0xFF; |
| ov5640_reset_gpio = 0xFF; |
| } |
| |
| static int ov5640_sensor_probe(const struct msm_camera_sensor_info *info, |
| struct msm_sensor_ctrl *s) |
| { |
| int rc = -ENOTSUPP; |
| |
| CDBG("--CAMERA-- %s (Start...)\n", __func__); |
| rc = i2c_add_driver(&ov5640_i2c_driver); |
| CDBG("--CAMERA-- i2c_add_driver ret:0x%x,ov5640_client=0x%x\n", |
| rc, (unsigned int)ov5640_client); |
| if ((rc < 0) || (ov5640_client == NULL)) { |
| CDBG("--CAMERA-- i2c_add_driver FAILS!!\n"); |
| return rc; |
| } |
| |
| rc = ov5640_probe_init_gpio(info); |
| if (rc < 0) |
| return rc; |
| |
| ov5640_power_off(); |
| |
| /* SENSOR NEED MCLK TO DO I2C COMMUNICTION, OPEN CLK FIRST*/ |
| msm_camio_clk_rate_set(24000000); |
| |
| msleep(20); |
| |
| ov5640_power_on(); |
| ov5640_power_reset(); |
| |
| rc = ov5640_probe_readID(info); |
| |
| if (rc < 0) { |
| CDBG("--CAMERA--ov5640_probe_readID Fail !!~~~~!!\n"); |
| CDBG("--CAMERA-- %s, unregister\n", __func__); |
| i2c_del_driver(&ov5640_i2c_driver); |
| ov5640_power_off(); |
| ov5640_probe_free_gpio(info); |
| return rc; |
| } |
| |
| s->s_init = ov5640_sensor_open_init; |
| s->s_release = ov5640_sensor_release; |
| s->s_config = ov5640_sensor_config; |
| s->s_camera_type = BACK_CAMERA_2D; |
| s->s_mount_angle = info->sensor_platform_info->mount_angle; |
| |
| ov5640_power_off(); |
| |
| CDBG("--CAMERA-- %s (End...)\n", __func__); |
| return rc; |
| } |
| |
| static int ov5640_i2c_probe(struct i2c_client *client, |
| const struct i2c_device_id *id) |
| { |
| CDBG("--CAMERA-- %s ... (Start...)\n", __func__); |
| |
| if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { |
| CDBG("--CAMERA--i2c_check_functionality failed\n"); |
| return -ENOMEM; |
| } |
| |
| ov5640_sensorw = kzalloc(sizeof(struct ov5640_work), GFP_KERNEL); |
| if (!ov5640_sensorw) { |
| CDBG("--CAMERA--kzalloc failed\n"); |
| return -ENOMEM; |
| } |
| |
| i2c_set_clientdata(client, ov5640_sensorw); |
| ov5640_init_client(client); |
| ov5640_client = client; |
| |
| CDBG("--CAMERA-- %s ... (End...)\n", __func__); |
| return 0; |
| } |
| |
| static int __ov5640_probe(struct platform_device *pdev) |
| { |
| return msm_camera_drv_start(pdev, ov5640_sensor_probe); |
| } |
| |
| static struct platform_driver msm_camera_driver = { |
| .probe = __ov5640_probe, |
| .driver = { |
| .name = "msm_camera_ov5640", |
| .owner = THIS_MODULE, |
| }, |
| }; |
| |
| static int __init ov5640_init(void) |
| { |
| ov5640_i2c_buf[0] = 0x5A; |
| return platform_driver_register(&msm_camera_driver); |
| } |
| |
| module_init(ov5640_init); |
| |
| MODULE_DESCRIPTION("OV5640 YUV MIPI sensor driver"); |
| MODULE_LICENSE("GPL v2"); |