2445 lines
86 KiB
C
Executable File
2445 lines
86 KiB
C
Executable File
/* Copyright (c) 2011-2013, The Linux Foundation. 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.
|
|
*
|
|
*/
|
|
|
|
#if 0
|
|
#define CONFIG_LOAD_FILE // Enable it for Tunning Binary
|
|
#define NO_BURST // Enable no burst mode for Tunning
|
|
#endif
|
|
|
|
//#define FLASH_DEBUG
|
|
#ifdef FLASH_DEBUG
|
|
#define CDBG_FL(_fmt, args...) printk(_fmt, ##args)
|
|
#else
|
|
#define CDBG_FL(_fmt, args...)
|
|
#endif
|
|
|
|
#include "sr352.h"
|
|
/* *********************** Settings file selection *********************** */
|
|
#if defined (CONFIG_MACH_MILLETWIFIUS_OPEN) || \
|
|
defined (CONFIG_MACH_MILLETLTE_VZW) || \
|
|
defined (CONFIG_MACH_MILLETLTE_ATT) || \
|
|
defined (CONFIG_MACH_MILLETLTE_CAN) || \
|
|
defined (CONFIG_MACH_MILLETLTE_TMO)
|
|
#define REG_SET_FILE "sr352_yuv_millet_wifi_usa.h"
|
|
|
|
#elif defined (CONFIG_MACH_MATISSEWIFIUS_OPEN) || \
|
|
defined (CONFIG_MACH_MATISSELTE_VZW) || \
|
|
defined (CONFIG_MACH_MATISSELTE_ATT)
|
|
#define REG_SET_FILE "sr352_yuv_matisse_wifi_usa.h"
|
|
|
|
#elif defined (CONFIG_SEC_MATISSE_PROJECT)
|
|
#define REG_SET_FILE "sr352_yuv_matisse.h"
|
|
|
|
#elif defined (CONFIG_MACH_DEGASLTE_SPR)
|
|
#define REG_SET_FILE "sr352_yuv_degas_spr.h"
|
|
|
|
#elif defined (CONFIG_SEC_RUBENS_PROJECT)
|
|
#define REG_SET_FILE "sr352_yuv_rubens.h"
|
|
#define AF_FLASH_SUPPORT
|
|
|
|
#else
|
|
#define REG_SET_FILE "sr352_yuv.h"
|
|
#endif
|
|
|
|
#include REG_SET_FILE
|
|
/* *********************** End Selection *********************** */
|
|
|
|
#if defined(CONFIG_MACH_MILLETWIFIUS_OPEN) || \
|
|
defined (CONFIG_MACH_MATISSEWIFIUS_OPEN) || \
|
|
defined (CONFIG_MACH_MILLETLTE_VZW) || \
|
|
defined (CONFIG_MACH_MILLETLTE_ATT) || \
|
|
defined (CONFIG_MACH_MILLETLTE_CAN) || \
|
|
defined (CONFIG_MACH_MATISSELTE_VZW) || \
|
|
defined (CONFIG_MACH_MATISSELTE_ATT) || \
|
|
defined (CONFIG_MACH_DEGASLTE_SPR) || \
|
|
defined (CONFIG_MACH_MILLETLTE_TMO)
|
|
#define ANTIBANDING_60HZ 1
|
|
//dummy declaration for 50HZ
|
|
//for successful compilation
|
|
#define sr352_50hz_setting sr352_60hz_setting
|
|
#define sr352_HD_50hz_setting sr352_HD_60hz_setting
|
|
#define sr352_AEAWB_Lock_50Hz sr352_AEAWB_Lock_60Hz
|
|
#define sr352_AEAWB_Unlock_50Hz sr352_AEAWB_Unlock_60Hz
|
|
#elif defined(CONFIG_MACH_MILLETWIFI_OPEN) || \
|
|
defined(CONFIG_MACH_MILLET3G_EUR) || \
|
|
defined(CONFIG_MACH_MATISSE3G_OPEN) || \
|
|
defined(CONFIG_MACH_MATISSEWIFI_OPEN) || \
|
|
defined (CONFIG_SEC_RUBENS_PROJECT)
|
|
extern int back_camera_antibanding_get(void); /*add anti-banding code */
|
|
#define ANTIBANDING_60HZ (back_camera_antibanding_get() == 60)
|
|
#else
|
|
#define ANTIBANDING_60HZ 0
|
|
//dummy declaration for 60HZ
|
|
//for successful compilation
|
|
#define sr352_60hz_setting sr352_50hz_setting
|
|
#define sr352_HD_60hz_setting sr352_HD_50hz_setting
|
|
#define sr352_AEAWB_Lock_60Hz sr352_AEAWB_Lock_50Hz
|
|
#define sr352_AEAWB_Unlock_60Hz sr352_AEAWB_Unlock_50Hz
|
|
#endif
|
|
|
|
|
|
#include "msm_sd.h"
|
|
#include "camera.h"
|
|
#include "msm_cci.h"
|
|
#include "msm_camera_dt_util.h"
|
|
|
|
#ifndef NO_BURST
|
|
#define BURST_MODE_BUFFER_MAX_SIZE 255
|
|
#define BURST_REG 0x0e
|
|
#define DELAY_REG 0xff
|
|
uint8_t burst_reg_data[BURST_MODE_BUFFER_MAX_SIZE];
|
|
static int32_t sr352_sensor_burst_write (struct msm_sensor_ctrl_t *s_ctrl, struct msm_camera_i2c_reg_conf *reg_settings , int size);
|
|
#endif
|
|
|
|
#ifdef CONFIG_LOAD_FILE
|
|
#define SR352_WRITE_LIST(A) \
|
|
sr352_regs_from_sd_tunning(A,s_ctrl,#A);
|
|
#define SR352_WRITE_LIST_BURST(A) \
|
|
sr352_regs_from_sd_tunning(A,s_ctrl,#A);
|
|
#else
|
|
#define SR352_WRITE_LIST(A) \
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_conf_tbl( \
|
|
s_ctrl->sensor_i2c_client, A, \
|
|
ARRAY_SIZE(A), \
|
|
MSM_CAMERA_I2C_BYTE_DATA); CDBG("REGSEQ ****** %s", #A)
|
|
#define SR352_WRITE_LIST_BURST(A) \
|
|
sr352_sensor_burst_write(s_ctrl,A,ARRAY_SIZE(A)); CDBG("REGSEQ ****** BURST %s", #A)
|
|
#endif
|
|
|
|
#ifdef CONFIG_LOAD_FILE
|
|
#include <linux/vmalloc.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/uaccess.h>
|
|
|
|
static char *sr352_regs_table;
|
|
static int sr352_regs_table_size;
|
|
int sr352_regs_from_sd_tunning(struct msm_camera_i2c_reg_conf *settings, struct msm_sensor_ctrl_t *s_ctrl,char * name);
|
|
void sr352_regs_table_init(char *filename);
|
|
void sr352_regs_table_exit(void);
|
|
#endif
|
|
|
|
static struct yuv_ctrl sr352_ctrl;
|
|
extern uint16_t rear_vendor_id;
|
|
|
|
static int32_t cur_scene_mode_chg = 0;
|
|
extern unsigned int system_rev;
|
|
unsigned int settings_type = 0;
|
|
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
int flash_mode;
|
|
int flash_status;
|
|
int is_preflash;
|
|
int is_touchaf;
|
|
int focus_mode;
|
|
int need_main_flash;
|
|
int is_af_run;
|
|
FLASH_t Flash;
|
|
static int8_t cur_scene_mode = 0;
|
|
|
|
int set_led_flash(int);
|
|
void sr352_get_sensor_ev_data(struct msm_sensor_ctrl_t *s_ctrl, uint16_t PreFlashEnable);
|
|
void sr352_get_ev_data_flash_Off_func1(struct msm_sensor_ctrl_t *s_ctrl);
|
|
void sr352_get_ev_data_preflash_func2(struct msm_sensor_ctrl_t *s_ctrl);
|
|
void sr352_set_ev_data_mainFlash_func3(struct msm_sensor_ctrl_t *s_ctrl);
|
|
void sr352_return_ev_data_func4(struct msm_sensor_ctrl_t *s_ctrl);
|
|
void sr352_actuator_softlanding(struct msm_sensor_ctrl_t *s_ctrl);
|
|
void sr352_ae_stable_without_af(struct msm_sensor_ctrl_t *s_ctrl);
|
|
static int sr352_is_required_flash(struct msm_sensor_ctrl_t *s_ctrl, int flash_mode);
|
|
void sr352_set_af_mode(struct msm_sensor_ctrl_t *s_ctrl, int mode);
|
|
void sr352_recording_landing(struct msm_sensor_ctrl_t *s_ctrl);
|
|
#endif
|
|
|
|
|
|
void sr352_check_hw_revision(void);
|
|
|
|
void sr352_check_hw_revision()
|
|
{
|
|
CDBG(" Hardware revision = %d\n",system_rev);
|
|
#if defined(CONFIG_MACH_MILLETLTE_VZW)|| defined (CONFIG_MACH_MILLETLTE_TMO)
|
|
if(system_rev >= 1)
|
|
settings_type = 1;
|
|
#elif defined (CONFIG_MACH_MILLETLTE_OPEN) || defined (CONFIG_MACH_MILLETLTE_KOR)
|
|
if(system_rev >= 6)
|
|
settings_type = 1;
|
|
#elif defined (CONFIG_MACH_MILLETWIFI_OPEN)
|
|
if(system_rev >= 8)
|
|
settings_type = 1;
|
|
#elif defined (CONFIG_MACH_MILLETWIFIUS_OPEN)
|
|
if(system_rev >= 8)
|
|
settings_type = 1;
|
|
#elif defined (CONFIG_MACH_MILLET3G_EUR)
|
|
if(system_rev >= 7)
|
|
settings_type = 1;
|
|
#elif defined (CONFIG_SEC_MATISSE_PROJECT) || \
|
|
defined (CONFIG_MACH_MILLETLTE_ATT) || \
|
|
defined (CONFIG_MACH_MILLETLTE_CAN) || \
|
|
defined(CONFIG_SEC_DEGAS_PROJECT) || \
|
|
defined (CONFIG_MACH_MILLETLTE_TMO) || \
|
|
defined (CONFIG_SEC_RUBENS_PROJECT)
|
|
settings_type = 1;
|
|
#endif
|
|
}
|
|
|
|
// maximum number of chipid and slaveid pairs
|
|
// please change accordingly when you add more pairs
|
|
#define MAX_NUM_PAIRS 1
|
|
|
|
// Set of chipid and slaveid pairs not including the latest.
|
|
// Order: Latest but one to the oldest
|
|
// The latest values will be in the sensor lib file
|
|
// index 0 - chipid
|
|
// index 1 - slaveid
|
|
static uint16_t ids[MAX_NUM_PAIRS][2] = {{0xC2,0x40},};
|
|
|
|
int sr352_sensor_match_id(struct msm_camera_i2c_client *sensor_i2c_client,
|
|
struct msm_camera_slave_info *slave_info,
|
|
const char *sensor_name)
|
|
{
|
|
uint16_t chipid = 0;
|
|
int32_t i = 0;
|
|
|
|
if (!sensor_i2c_client || !slave_info || !sensor_name) {
|
|
pr_err("%s:%d failed: %p %p %p\n",__func__, __LINE__,
|
|
sensor_i2c_client, slave_info,sensor_name);
|
|
return -EINVAL;
|
|
}
|
|
|
|
sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client,
|
|
slave_info->sensor_id_reg_addr,
|
|
&chipid,
|
|
sensor_i2c_client->data_type);
|
|
|
|
if (chipid)
|
|
rear_vendor_id = chipid;
|
|
|
|
if(chipid!=slave_info->sensor_id) {
|
|
pr_err("%s: chipid read=%x did not match with chipid=%x",
|
|
__func__, chipid, slave_info->sensor_id);
|
|
|
|
for( i=0; i<MAX_NUM_PAIRS; ++i) {
|
|
chipid = 0;
|
|
sensor_i2c_client->cci_client->sid = ids[i][1] >> 1;
|
|
sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client,
|
|
slave_info->sensor_id_reg_addr,
|
|
&chipid,
|
|
sensor_i2c_client->data_type);
|
|
if(chipid == ids[i][0]) {
|
|
break;
|
|
}
|
|
pr_err("%s: chipid read=%x did not match with chipid=%x",
|
|
__func__, chipid, ids[i][0]);
|
|
}
|
|
}
|
|
|
|
CDBG("%s sensor_name =%s slaveid = 0x%X sensorid = 0x%X DATA TYPE = %d\n",
|
|
__func__, sensor_name, sensor_i2c_client->cci_client->sid,
|
|
slave_info->sensor_id, sensor_i2c_client->data_type);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int32_t sr352_set_exposure_compensation(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("mode = %d", mode);
|
|
switch (mode) {
|
|
case CAMERA_EV_M4:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_M4);
|
|
break;
|
|
case CAMERA_EV_M3:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_M3);
|
|
break;
|
|
case CAMERA_EV_M2:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_M2);
|
|
break;
|
|
case CAMERA_EV_M1:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_M1);
|
|
break;
|
|
case CAMERA_EV_DEFAULT:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_default);
|
|
break;
|
|
case CAMERA_EV_P1:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_P1);
|
|
break;
|
|
case CAMERA_EV_P2:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_P2);
|
|
break;
|
|
case CAMERA_EV_P3:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_P3);
|
|
break;
|
|
case CAMERA_EV_P4:
|
|
rc = SR352_WRITE_LIST(sr352_brightness_P4);
|
|
break;
|
|
default:
|
|
pr_err("%s: Setting %d is invalid\n", __func__, mode);
|
|
rc = 0;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
int32_t sr352_set_effect(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("mode = %d", mode);
|
|
switch (mode) {
|
|
case CAMERA_EFFECT_OFF:
|
|
if(settings_type == 1) {
|
|
rc = SR352_WRITE_LIST(sr352_effect_none_01);
|
|
}
|
|
else {
|
|
rc = SR352_WRITE_LIST(sr352_effect_none);
|
|
}
|
|
break;
|
|
case CAMERA_EFFECT_MONO:
|
|
rc = SR352_WRITE_LIST(sr352_effect_gray);
|
|
break;
|
|
case CAMERA_EFFECT_NEGATIVE:
|
|
rc = SR352_WRITE_LIST(sr352_effect_negative);
|
|
break;
|
|
case CAMERA_EFFECT_SEPIA:
|
|
rc = SR352_WRITE_LIST(sr352_effect_sepia);
|
|
break;
|
|
default:
|
|
pr_err("%s: Setting %d is invalid\n", __func__, mode);
|
|
rc = 0;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
int32_t sr352_set_scene_mode(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("Scene mode E = %d", mode);
|
|
if(cur_scene_mode_chg == 0) {
|
|
CDBG("Scene mode Not Set = %d", mode);
|
|
return rc;
|
|
}
|
|
|
|
if(sr352_ctrl.prev_mode == CAMERA_MODE_INIT
|
|
&& mode == CAMERA_SCENE_AUTO) {
|
|
CDBG("Scene mode X Not Set = %d", mode);
|
|
cur_scene_mode_chg = 0;
|
|
return rc;
|
|
}
|
|
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
cur_scene_mode = mode;
|
|
#endif
|
|
|
|
switch (mode) {
|
|
case CAMERA_SCENE_AUTO:
|
|
rc = SR352_WRITE_LIST(sr352_Scene_Off);
|
|
break;
|
|
case CAMERA_SCENE_LANDSCAPE:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Landscape);
|
|
break;
|
|
case CAMERA_SCENE_SPORT:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Sports);
|
|
break;
|
|
case CAMERA_SCENE_PARTY:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Party);
|
|
break;
|
|
case CAMERA_SCENE_BEACH:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Beach);
|
|
break;
|
|
case CAMERA_SCENE_SUNSET:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Sunset);
|
|
break;
|
|
case CAMERA_SCENE_DAWN:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Dawn);
|
|
break;
|
|
case CAMERA_SCENE_FALL:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Fall);
|
|
break;
|
|
case CAMERA_SCENE_CANDLE:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Candle);
|
|
break;
|
|
case CAMERA_SCENE_FIRE:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Firework);
|
|
break;
|
|
case CAMERA_SCENE_AGAINST_LIGHT:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Backlight);
|
|
break;
|
|
case CAMERA_SCENE_NIGHT:
|
|
rc = SR352_WRITE_LIST(sr352_scene_Nightshot);
|
|
break;
|
|
|
|
default:
|
|
pr_err("%s: Setting %d is invalid\n", __func__, mode);
|
|
rc = 0;
|
|
}
|
|
cur_scene_mode_chg = 0;
|
|
CDBG("Scene mode X = %d", mode);
|
|
return rc;
|
|
}
|
|
|
|
|
|
int32_t sr352_set_ae_awb_lock(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("mode = %d", mode);
|
|
|
|
if(ANTIBANDING_60HZ) {
|
|
if(mode) {
|
|
rc = SR352_WRITE_LIST(sr352_AEAWB_Lock_60Hz);
|
|
} else {
|
|
rc = SR352_WRITE_LIST(sr352_AEAWB_Unlock_60Hz);
|
|
}
|
|
} else {
|
|
if(mode) {
|
|
rc = SR352_WRITE_LIST(sr352_AEAWB_Lock_50Hz);
|
|
} else {
|
|
rc = SR352_WRITE_LIST(sr352_AEAWB_Unlock_50Hz);
|
|
}
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
int32_t sr352_set_white_balance(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("mode = %d", mode);
|
|
switch (mode) {
|
|
case CAMERA_WHITE_BALANCE_OFF:
|
|
case CAMERA_WHITE_BALANCE_AUTO:
|
|
rc = SR352_WRITE_LIST(sr352_wb_auto);
|
|
break;
|
|
case CAMERA_WHITE_BALANCE_INCANDESCENT:
|
|
rc = SR352_WRITE_LIST(sr352_wb_incandescent);
|
|
break;
|
|
case CAMERA_WHITE_BALANCE_FLUORESCENT:
|
|
rc = SR352_WRITE_LIST(sr352_wb_fluorescent);
|
|
break;
|
|
case CAMERA_WHITE_BALANCE_DAYLIGHT:
|
|
rc = SR352_WRITE_LIST(sr352_wb_sunny);
|
|
break;
|
|
case CAMERA_WHITE_BALANCE_CLOUDY_DAYLIGHT:
|
|
rc = SR352_WRITE_LIST(sr352_wb_cloudy);
|
|
break;
|
|
default:
|
|
pr_err("%s: Setting %d is invalid\n", __func__, mode);
|
|
rc = 0;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
int32_t sr352_set_metering(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("mode = %d", mode);
|
|
switch (mode) {
|
|
case CAMERA_AVERAGE:
|
|
rc = SR352_WRITE_LIST(sr352_metering_matrix);
|
|
break;
|
|
case CAMERA_CENTER_WEIGHT:
|
|
rc = SR352_WRITE_LIST(sr352_metering_center);
|
|
break;
|
|
case CAMERA_SPOT:
|
|
rc = SR352_WRITE_LIST(sr352_metering_spot);
|
|
break;
|
|
default:
|
|
pr_err("%s: Setting %d is invalid\n", __func__, mode);
|
|
rc = 0;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
int32_t sr352_set_resolution(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
int32_t rc = 0;
|
|
CDBG("mode = %d", mode);
|
|
switch (mode) {
|
|
case MSM_SENSOR_RES_FULL:
|
|
if(settings_type == 1) {
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
if (cur_scene_mode == CAMERA_SCENE_NIGHT) {
|
|
SR352_WRITE_LIST(sr352_Night_Capture_2048_1536_01);
|
|
} else {
|
|
SR352_WRITE_LIST(sr352_Capture_2048_1536_01);
|
|
}
|
|
#else
|
|
SR352_WRITE_LIST(sr352_Capture_2048_1536_01);
|
|
#endif
|
|
}
|
|
else {
|
|
SR352_WRITE_LIST(sr352_Capture_2048_1536);
|
|
}
|
|
break;
|
|
case MSM_SENSOR_RES_QTR:
|
|
if(settings_type == 1) {
|
|
SR352_WRITE_LIST(sr352_Enterpreview_1024x768_01);
|
|
}
|
|
else {
|
|
SR352_WRITE_LIST(sr352_Enterpreview_1024x768);
|
|
}
|
|
break;
|
|
case MSM_SENSOR_RES_2:
|
|
if(settings_type == 1) {
|
|
SR352_WRITE_LIST(sr352_Enterpreview_1024x576_01);
|
|
}
|
|
else {
|
|
SR352_WRITE_LIST(sr352_Enterpreview_1024x576);
|
|
}
|
|
break;
|
|
case MSM_SENSOR_RES_3:
|
|
if(settings_type == 1) {
|
|
rc = SR352_WRITE_LIST_BURST(sr352_recording_50Hz_HD_01);
|
|
}
|
|
else {
|
|
rc = SR352_WRITE_LIST_BURST(sr352_recording_50Hz_HD);
|
|
}
|
|
if(ANTIBANDING_60HZ) {
|
|
rc = SR352_WRITE_LIST(sr352_HD_60hz_setting);
|
|
} else {
|
|
rc = SR352_WRITE_LIST(sr352_HD_50hz_setting);
|
|
}
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
SR352_WRITE_LIST(sr352_HD_AF_Init_Reg);
|
|
#endif
|
|
break;
|
|
case MSM_SENSOR_RES_4:
|
|
rc = SR352_WRITE_LIST(sr352_preview_800_480);
|
|
break;
|
|
case MSM_SENSOR_RES_5:
|
|
if(settings_type == 1) {
|
|
SR352_WRITE_LIST(sr352_Enterpreview_640x480_01);
|
|
}
|
|
else {
|
|
SR352_WRITE_LIST(sr352_Enterpreview_640x480);
|
|
}
|
|
break;
|
|
case MSM_SENSOR_RES_6:
|
|
rc = SR352_WRITE_LIST(sr352_preview_320_240);
|
|
break;
|
|
case MSM_SENSOR_RES_7:
|
|
rc = SR352_WRITE_LIST(sr352_preview_176_144);
|
|
break;
|
|
default:
|
|
pr_err("%s: Setting %d is invalid\n", __func__, mode);
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
void sr352_init_camera(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
int32_t rc = 0;
|
|
if(settings_type == 1) {
|
|
rc = SR352_WRITE_LIST_BURST(sr352_Init_Reg_01);
|
|
} else {
|
|
rc = SR352_WRITE_LIST_BURST(sr352_Init_Reg);
|
|
}
|
|
if(rc < 0) {
|
|
pr_err("%s:%d error writing initsettings failed\n", __func__, __LINE__);
|
|
}
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
SR352_WRITE_LIST(sr352_AF_Init_Reg);
|
|
#endif
|
|
if(ANTIBANDING_60HZ) {
|
|
rc = SR352_WRITE_LIST(sr352_60hz_setting);
|
|
} else {
|
|
rc = SR352_WRITE_LIST(sr352_50hz_setting);
|
|
}
|
|
if(rc <0) {
|
|
pr_err("%s:%d error writing 50hz failed\n", __func__, __LINE__);
|
|
}
|
|
}
|
|
|
|
int32_t sr352_get_exif(struct ioctl_native_cmd * exif_info)
|
|
{
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
exif_info->value_1 = flash_status;
|
|
#else
|
|
exif_info->value_1 = 1; // equals 1 to update the exif value in the user level.
|
|
#endif
|
|
exif_info->value_2 = sr352_ctrl.exif_iso;
|
|
exif_info->value_3 = sr352_ctrl.exif_shutterspeed;
|
|
return 0;
|
|
}
|
|
|
|
int32_t sr352_set_exif(struct msm_sensor_ctrl_t *s_ctrl )
|
|
{
|
|
int32_t rc = 0;
|
|
uint16_t read_value0 = 0;
|
|
uint16_t read_value1 = 0;
|
|
uint16_t read_value2 = 0;
|
|
uint16_t read_value3 = 0;
|
|
uint16_t read_value4 = 0;
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write(
|
|
s_ctrl->sensor_i2c_client,
|
|
0x03,
|
|
0x20,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_read(
|
|
s_ctrl->sensor_i2c_client, 0xa0,
|
|
&read_value0,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_read(
|
|
s_ctrl->sensor_i2c_client, 0xa1,
|
|
&read_value1,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_read(
|
|
s_ctrl->sensor_i2c_client, 0xa2,
|
|
&read_value2,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_read(
|
|
s_ctrl->sensor_i2c_client, 0xa3,
|
|
&read_value3,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
sr352_ctrl.exif_shutterspeed = 27000000 / ((read_value0 << 24)
|
|
+ (read_value1 << 16) + (read_value2 << 8) + read_value3);
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write(
|
|
s_ctrl->sensor_i2c_client,
|
|
0x03,
|
|
0x20,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_read(
|
|
s_ctrl->sensor_i2c_client, 0x50,
|
|
&read_value4,
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
|
|
if (read_value4 < 0x26)
|
|
sr352_ctrl.exif_iso= 50;
|
|
else if (read_value4 < 0x5C)
|
|
sr352_ctrl.exif_iso = 100;
|
|
else if (read_value4 < 0x83)
|
|
sr352_ctrl.exif_iso = 200;
|
|
else
|
|
sr352_ctrl.exif_iso = 400;
|
|
|
|
pr_debug("sr352_set_exif: ISO = %d shutter speed = %d",
|
|
sr352_ctrl.exif_iso,sr352_ctrl.exif_shutterspeed);
|
|
return rc;
|
|
}
|
|
|
|
int32_t sr352_sensor_config(struct msm_sensor_ctrl_t *s_ctrl,
|
|
void __user *argp)
|
|
{
|
|
struct sensorb_cfg_data *cdata = (struct sensorb_cfg_data *)argp;
|
|
int32_t rc = 0;
|
|
int32_t i = 0;
|
|
mutex_lock(s_ctrl->msm_sensor_mutex);
|
|
|
|
switch (cdata->cfgtype) {
|
|
case CFG_GET_SENSOR_INFO:
|
|
CDBG(" CFG_GET_SENSOR_INFO");
|
|
memcpy(cdata->cfg.sensor_info.sensor_name,
|
|
s_ctrl->sensordata->sensor_name,
|
|
sizeof(cdata->cfg.sensor_info.sensor_name));
|
|
|
|
cdata->cfg.sensor_info.session_id =
|
|
s_ctrl->sensordata->sensor_info->session_id;
|
|
|
|
for (i = 0; i < SUB_MODULE_MAX; i++)
|
|
cdata->cfg.sensor_info.subdev_id[i] =
|
|
s_ctrl->sensordata->sensor_info->subdev_id[i];
|
|
|
|
CDBG("sensor name %s", cdata->cfg.sensor_info.sensor_name);
|
|
CDBG("session id %d", cdata->cfg.sensor_info.session_id);
|
|
|
|
for (i = 0; i < SUB_MODULE_MAX; i++)
|
|
CDBG("subdev_id[%d] %d", i,
|
|
cdata->cfg.sensor_info.subdev_id[i]);
|
|
|
|
break;
|
|
case CFG_SET_INIT_SETTING:
|
|
CDBG("CFG_SET_INIT_SETTING");
|
|
#ifdef CONFIG_LOAD_FILE /* this call should be always called first */
|
|
sr352_regs_table_init("/data/"REG_SET_FILE);
|
|
pr_err("/data/"REG_SET_FILE" inside CFG_SET_INIT_SETTING");
|
|
#endif
|
|
sr352_init_camera(s_ctrl);
|
|
|
|
#if !defined (AF_FLASH_SUPPORT)
|
|
//Stop stream and start in START_STREAM
|
|
CDBG("Stop stream after Init");
|
|
SR352_WRITE_LIST(sr352_stop_stream);
|
|
#endif
|
|
break;
|
|
case CFG_SET_RESOLUTION:
|
|
if (sr352_ctrl.prev_mode == CAMERA_MODE_RECORDING &&
|
|
sr352_ctrl.settings.resolution == MSM_SENSOR_RES_3) {
|
|
|
|
sr352_init_camera(s_ctrl);
|
|
//Stop stream and start in START_STREAM
|
|
SR352_WRITE_LIST(sr352_stop_stream);
|
|
CDBG("CFG CFG_SET_RESOLUTION - HD Recording mode off");
|
|
cur_scene_mode_chg = 1;
|
|
}
|
|
else if(sr352_ctrl.prev_mode == CAMERA_MODE_RECORDING &&
|
|
sr352_ctrl.settings.resolution != MSM_SENSOR_RES_3) {
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
sr352_recording_landing(s_ctrl);
|
|
#endif
|
|
|
|
if(settings_type == 1) {
|
|
rc = SR352_WRITE_LIST(sr352_recording_50Hz_modeOff_01);
|
|
}
|
|
else {
|
|
rc = SR352_WRITE_LIST(sr352_recording_50Hz_modeOff);
|
|
}
|
|
|
|
rc = SR352_WRITE_LIST(sr352_stop_stream);
|
|
CDBG("CFG CFG_SET_RESOLUTION - Non - HD Recording mode off");
|
|
}
|
|
sr352_ctrl.settings.prev_resolution = sr352_ctrl.settings.resolution;
|
|
sr352_ctrl.settings.resolution = *((int32_t *)cdata->cfg.setting);
|
|
CDBG("CFG_SET_RESOLUTION res = %d" , sr352_ctrl.settings.resolution);
|
|
if (sr352_ctrl.streamon == 0) {
|
|
switch(sr352_ctrl.op_mode) {
|
|
case CAMERA_MODE_PREVIEW:
|
|
{
|
|
sr352_set_resolution(s_ctrl , sr352_ctrl.settings.resolution);
|
|
#if !defined(AF_FLASH_SUPPORT)
|
|
if (sr352_ctrl.prev_mode == CAMERA_MODE_RECORDING &&
|
|
sr352_ctrl.settings.prev_resolution == MSM_SENSOR_RES_3) {
|
|
|
|
sr352_set_ae_awb_lock(s_ctrl, 0);
|
|
msleep(100);
|
|
}
|
|
|
|
if (sr352_ctrl.prev_mode == CAMERA_MODE_INIT) {
|
|
msleep(100);
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
case CAMERA_MODE_CAPTURE:
|
|
{
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
if (!is_af_run)
|
|
sr352_ae_stable_without_af(s_ctrl);
|
|
if (need_main_flash) {
|
|
SR352_WRITE_LIST(sr352_stop_stream);
|
|
SR352_WRITE_LIST(sr352_AfterPreFlash_FlashRegTable4_1);
|
|
sr352_set_ev_data_mainFlash_func3(s_ctrl);
|
|
set_led_flash(MSM_CAMERA_LED_HIGH);
|
|
SR352_WRITE_LIST(sr352_StartMainFlash_FlashRegTable5);
|
|
flash_status = MSM_CAMERA_LED_HIGH;
|
|
}
|
|
#endif
|
|
sr352_set_resolution(s_ctrl , sr352_ctrl.settings.resolution);
|
|
}
|
|
break;
|
|
case CAMERA_MODE_RECORDING:
|
|
{
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
if(sr352_ctrl.prev_mode != CAMERA_MODE_RECORDING ||
|
|
sr352_ctrl.settings.resolution != MSM_SENSOR_RES_3) {
|
|
sr352_recording_landing(s_ctrl);
|
|
}
|
|
#endif
|
|
if ( sr352_ctrl.settings.resolution == MSM_SENSOR_RES_3 ) {
|
|
CDBG("CFG writing *** sr352_recording_50Hz_HD");
|
|
sr352_set_resolution( s_ctrl , sr352_ctrl.settings.resolution);
|
|
} else {
|
|
CDBG("CFG writing *** sr352_recording_50Hz_30fps");
|
|
sr352_set_resolution( s_ctrl , MSM_SENSOR_RES_5);
|
|
if(settings_type == 1) {
|
|
rc = SR352_WRITE_LIST(sr352_recording_50Hz_30fps_01);
|
|
}
|
|
else {
|
|
rc = SR352_WRITE_LIST(sr352_recording_50Hz_30fps);
|
|
}
|
|
//msleep(100);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case CFG_SET_STOP_STREAM:
|
|
if(sr352_ctrl.streamon == 1) {
|
|
CDBG(" CFG_SET_STOP_STREAM writing stop stream registers: sr352_stop_stream");
|
|
sr352_ctrl.streamon = 0;
|
|
}
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
switch(sr352_ctrl.op_mode) {
|
|
case CAMERA_MODE_CAPTURE:
|
|
if (need_main_flash) {
|
|
if (flash_status == MSM_CAMERA_LED_HIGH) {
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
flash_status = MSM_CAMERA_LED_OFF;
|
|
SR352_WRITE_LIST(sr352_AfterMainFlash_FlashRegTable6);
|
|
sr352_return_ev_data_func4(s_ctrl);
|
|
SR352_WRITE_LIST(sr352_EndMainFlash_FlashRegTable7);
|
|
need_main_flash = 0;
|
|
}
|
|
}
|
|
is_af_run = 0;
|
|
break;
|
|
case CAMERA_MODE_RECORDING:
|
|
if (flash_status == MSM_CAMERA_LED_LOW) {
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
flash_status = MSM_CAMERA_LED_OFF;
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
break;
|
|
case CFG_SET_START_STREAM:
|
|
{
|
|
CDBG(" CFG_SET_START_STREAM writing start stream registers: sr352_start_stream start");
|
|
switch(sr352_ctrl.op_mode) {
|
|
case CAMERA_MODE_PREVIEW:
|
|
{
|
|
CDBG(" CFG_SET_START_STREAM: Preview");
|
|
if(sr352_ctrl.prev_mode != CAMERA_MODE_CAPTURE) {
|
|
sr352_set_scene_mode(s_ctrl, sr352_ctrl.settings.scenemode);
|
|
sr352_set_exposure_compensation(s_ctrl, sr352_ctrl.settings.exposure);
|
|
sr352_set_effect(s_ctrl , sr352_ctrl.settings.effect);
|
|
sr352_set_white_balance(s_ctrl , sr352_ctrl.settings.wb);
|
|
sr352_set_metering(s_ctrl, sr352_ctrl.settings.metering );
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
sr352_set_af_mode(s_ctrl, focus_mode);
|
|
#endif
|
|
}
|
|
}
|
|
break;
|
|
case CAMERA_MODE_CAPTURE:
|
|
{
|
|
CDBG("CFG_SET_START_STREAM: Capture");
|
|
sr352_set_exif(s_ctrl);
|
|
}
|
|
break;
|
|
case CAMERA_MODE_RECORDING:
|
|
{
|
|
sr352_set_exposure_compensation(s_ctrl, sr352_ctrl.settings.exposure);
|
|
sr352_set_effect(s_ctrl , sr352_ctrl.settings.effect);
|
|
sr352_set_white_balance(s_ctrl , sr352_ctrl.settings.wb);
|
|
sr352_set_metering(s_ctrl, sr352_ctrl.settings.metering );
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
sr352_set_af_mode(s_ctrl, focus_mode);
|
|
#endif
|
|
}
|
|
break;
|
|
}
|
|
sr352_ctrl.streamon = 1;
|
|
}
|
|
break;
|
|
case CFG_SET_SLAVE_INFO:
|
|
{
|
|
struct msm_camera_sensor_slave_info sensor_slave_info;
|
|
struct msm_camera_power_ctrl_t *p_ctrl;
|
|
uint16_t size;
|
|
int slave_index = 0;
|
|
CDBG("CFG_SET_SLAVE_INFO");
|
|
if (copy_from_user(&sensor_slave_info,
|
|
(void *)cdata->cfg.setting,
|
|
sizeof(sensor_slave_info))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
/* Update sensor slave address */
|
|
if (sensor_slave_info.slave_addr) {
|
|
s_ctrl->sensor_i2c_client->cci_client->sid =
|
|
sensor_slave_info.slave_addr >> 1;
|
|
}
|
|
|
|
/* Update sensor address type */
|
|
s_ctrl->sensor_i2c_client->addr_type =
|
|
sensor_slave_info.addr_type;
|
|
|
|
/* Update power up / down sequence */
|
|
p_ctrl = &s_ctrl->sensordata->power_info;
|
|
size = sensor_slave_info.power_setting_array.size;
|
|
if (p_ctrl->power_setting_size < size) {
|
|
struct msm_sensor_power_setting *tmp;
|
|
tmp = kmalloc(sizeof(*tmp) * size, GFP_KERNEL);
|
|
if (!tmp) {
|
|
pr_err("%s: failed to alloc mem\n", __func__);
|
|
rc = -ENOMEM;
|
|
break;
|
|
}
|
|
kfree(p_ctrl->power_setting);
|
|
p_ctrl->power_setting = tmp;
|
|
}
|
|
p_ctrl->power_setting_size = size;
|
|
rc = copy_from_user(p_ctrl->power_setting, (void *)
|
|
sensor_slave_info.power_setting_array.power_setting,
|
|
size * sizeof(struct msm_sensor_power_setting));
|
|
if (rc) {
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
kfree(sensor_slave_info.power_setting_array.
|
|
power_setting);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
CDBG("slave_addr = 0x%x, addr_type = %d, sensor_id_reg_addr = 0x%x, sensor_id %x", \
|
|
sensor_slave_info.slave_addr, sensor_slave_info.addr_type, \
|
|
sensor_slave_info.sensor_id_info.sensor_id_reg_addr, sensor_slave_info.sensor_id_info.sensor_id);
|
|
for (slave_index = 0; slave_index <
|
|
p_ctrl->power_setting_size; slave_index++) {
|
|
CDBG("i %d power setting %d %d %ld %d", slave_index,
|
|
p_ctrl->power_setting[slave_index].seq_type,
|
|
p_ctrl->power_setting[slave_index].seq_val,
|
|
p_ctrl->power_setting[slave_index].config_val,
|
|
p_ctrl->power_setting[slave_index].delay);
|
|
}
|
|
CDBG("CFG_SET_SLAVE_INFO EXIT");
|
|
break;
|
|
}
|
|
case CFG_WRITE_I2C_ARRAY:
|
|
{
|
|
struct msm_camera_i2c_reg_setting conf_array;
|
|
struct msm_camera_i2c_reg_array *reg_setting = NULL;
|
|
|
|
CDBG(" CFG_WRITE_I2C_ARRAY");
|
|
|
|
if (copy_from_user(&conf_array,
|
|
(void *)cdata->cfg.setting,
|
|
sizeof(struct msm_camera_i2c_reg_setting))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
reg_setting = kzalloc(conf_array.size *
|
|
(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
|
|
if (!reg_setting) {
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -ENOMEM;
|
|
break;
|
|
}
|
|
if (copy_from_user(reg_setting, (void *)conf_array.reg_setting,
|
|
conf_array.size *
|
|
sizeof(struct msm_camera_i2c_reg_array))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
kfree(reg_setting);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
conf_array.reg_setting = reg_setting;
|
|
rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table(
|
|
s_ctrl->sensor_i2c_client, &conf_array);
|
|
kfree(reg_setting);
|
|
}
|
|
break;
|
|
case CFG_WRITE_I2C_SEQ_ARRAY:
|
|
{
|
|
struct msm_camera_i2c_seq_reg_setting conf_array;
|
|
struct msm_camera_i2c_seq_reg_array *reg_setting = NULL;
|
|
|
|
CDBG("CFG_WRITE_I2C_SEQ_ARRAY");
|
|
|
|
if (copy_from_user(&conf_array,
|
|
(void *)cdata->cfg.setting,
|
|
sizeof(struct msm_camera_i2c_seq_reg_setting))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
reg_setting = kzalloc(conf_array.size *
|
|
(sizeof(struct msm_camera_i2c_seq_reg_array)),
|
|
GFP_KERNEL);
|
|
if (!reg_setting) {
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -ENOMEM;
|
|
break;
|
|
}
|
|
if (copy_from_user(reg_setting, (void *)conf_array.reg_setting,
|
|
conf_array.size *
|
|
sizeof(struct msm_camera_i2c_seq_reg_array))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
kfree(reg_setting);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
conf_array.reg_setting = reg_setting;
|
|
rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->
|
|
i2c_write_seq_table(s_ctrl->sensor_i2c_client, &conf_array);
|
|
kfree(reg_setting);
|
|
}
|
|
break;
|
|
case CFG_POWER_UP:
|
|
{
|
|
CDBG(" CFG_POWER_UP");
|
|
sr352_ctrl.streamon = 0;
|
|
sr352_ctrl.op_mode = CAMERA_MODE_INIT;
|
|
sr352_ctrl.prev_mode = CAMERA_MODE_INIT;
|
|
sr352_ctrl.settings.prev_resolution = MSM_SENSOR_RES_FULL;
|
|
sr352_ctrl.settings.resolution = MSM_SENSOR_RES_FULL;
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
flash_mode = 0;
|
|
flash_status = 0;
|
|
is_preflash = 0;
|
|
is_touchaf = 0;
|
|
focus_mode = 0;
|
|
need_main_flash = 0;
|
|
is_af_run = 0;
|
|
cur_scene_mode = 0;
|
|
#endif
|
|
sr352_check_hw_revision();
|
|
if (s_ctrl->func_tbl->sensor_power_up) {
|
|
CDBG("CFG_POWER_UP");
|
|
rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl,
|
|
&s_ctrl->sensordata->power_info,
|
|
s_ctrl->sensor_i2c_client,
|
|
s_ctrl->sensordata->slave_info,
|
|
s_ctrl->sensordata->sensor_name);
|
|
} else
|
|
rc = -EFAULT;
|
|
}
|
|
break;
|
|
case CFG_POWER_DOWN:
|
|
{
|
|
CDBG("CFG_POWER_DOWN");
|
|
if (s_ctrl->func_tbl->sensor_power_down) {
|
|
CDBG("CFG_POWER_DOWN");
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
if (flash_status)
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
sr352_actuator_softlanding(s_ctrl);
|
|
#endif
|
|
rc = s_ctrl->func_tbl->sensor_power_down(
|
|
s_ctrl,
|
|
&s_ctrl->sensordata->power_info,
|
|
s_ctrl->sensor_device_type,
|
|
s_ctrl->sensor_i2c_client);
|
|
} else
|
|
rc = -EFAULT;
|
|
#ifdef CONFIG_LOAD_FILE
|
|
sr352_regs_table_exit();
|
|
#endif
|
|
}
|
|
break;
|
|
case CFG_SET_STOP_STREAM_SETTING:
|
|
{
|
|
struct msm_camera_i2c_reg_setting *stop_setting =
|
|
&s_ctrl->stop_setting;
|
|
struct msm_camera_i2c_reg_array *reg_setting = NULL;
|
|
|
|
CDBG("CFG_SET_STOP_STREAM_SETTING");
|
|
if (copy_from_user(stop_setting, (void *)cdata->cfg.setting,
|
|
sizeof(struct msm_camera_i2c_reg_setting))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
reg_setting = stop_setting->reg_setting;
|
|
stop_setting->reg_setting = kzalloc(stop_setting->size *
|
|
(sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL);
|
|
if (!stop_setting->reg_setting) {
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
rc = -ENOMEM;
|
|
break;
|
|
}
|
|
if (copy_from_user(stop_setting->reg_setting,
|
|
(void *)reg_setting, stop_setting->size *
|
|
sizeof(struct msm_camera_i2c_reg_array))) {
|
|
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
kfree(stop_setting->reg_setting);
|
|
stop_setting->reg_setting = NULL;
|
|
stop_setting->size = 0;
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
rc = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
mutex_unlock(s_ctrl->msm_sensor_mutex);
|
|
|
|
return rc;
|
|
}
|
|
|
|
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
void sr352_ae_stable_without_af(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
is_preflash = sr352_is_required_flash(s_ctrl, flash_mode);
|
|
if (is_preflash) {
|
|
memset(&Flash, 0, sizeof(Flash));
|
|
SR352_WRITE_LIST(sr352_StartPreFlash_FlashRegTable1);
|
|
sr352_get_ev_data_flash_Off_func1(s_ctrl);
|
|
SR352_WRITE_LIST(sr352_ReadyPreFlash_FlashRegTable2);
|
|
set_led_flash(MSM_CAMERA_LED_LOW);
|
|
flash_status = MSM_CAMERA_LED_LOW;
|
|
need_main_flash = 1;
|
|
msleep(600); /* AE become stable here */
|
|
SR352_WRITE_LIST(sr352_AfterPreFlash_FlashRegTable3);
|
|
sr352_get_ev_data_preflash_func2(s_ctrl);
|
|
SR352_WRITE_LIST(sr352_EndPreFlash_FlashRegTable4);
|
|
msleep(50);
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
msleep(300);
|
|
}
|
|
}
|
|
|
|
void sr352_start_af(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
uint16_t focus_reg = 0;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
focus_reg &= 0xF7;
|
|
SR352_WRITE_ADDR(0x11, focus_reg);
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
focus_reg |= 0x01;
|
|
SR352_WRITE_ADDR(0x11, focus_reg);
|
|
CDBG("SR352 %s focus_reg[0x%2x]\n", __func__, focus_reg);
|
|
|
|
}
|
|
|
|
void sr352_set_af_mode(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
uint16_t focus_reg = 0;
|
|
uint16_t manual_af = 0;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
SR352_READ_ADDR(0x14, &manual_af);
|
|
|
|
switch(mode)
|
|
{
|
|
case CAMERA_AF_OCR:
|
|
case CAMERA_AF_MACRO:
|
|
focus_reg |= 0x40; /* set Macro Scan Mode */
|
|
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
|
|
manual_af |= 0x10; /* set Macro Lens Position start */
|
|
SR352_WRITE_ADDR(0x11, focus_reg);
|
|
SR352_WRITE_ADDR(0x14, manual_af);
|
|
SR352_WRITE_ADDR(0x03, 0xD0);
|
|
SR352_WRITE_ADDR(0x7C, 0x02);
|
|
SR352_WRITE_ADDR(0x7D, 0xB0);
|
|
msleep(130);
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x14, &manual_af);
|
|
manual_af &= 0xEF;
|
|
SR352_WRITE_ADDR(0x14, manual_af); /* set Macro Lens Position End */
|
|
break;
|
|
case CAMERA_AF_AUTO:
|
|
default:
|
|
focus_reg &= 0xBF; /* set Normal Scan Mode */
|
|
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
|
|
manual_af |= 0x10; /* set Normal Lens Position start */
|
|
SR352_WRITE_ADDR(0x11, focus_reg);
|
|
SR352_WRITE_ADDR(0x14, manual_af);
|
|
SR352_WRITE_ADDR(0x03, 0xD0);
|
|
SR352_WRITE_ADDR(0x7C, 0x00);
|
|
msleep(130);
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x14, &manual_af);
|
|
manual_af &= 0xEF;
|
|
SR352_WRITE_ADDR(0x14, manual_af); /* set Normal Lens Position End */
|
|
break;
|
|
}
|
|
|
|
CDBG("SR352 %s focus_reg[0x%2x]\n", __func__, focus_reg);
|
|
}
|
|
|
|
void sr352_set_touch_mode(struct msm_sensor_ctrl_t *s_ctrl, int mode)
|
|
{
|
|
uint16_t focus_reg = 0;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
|
|
switch(mode)
|
|
{
|
|
case 0:
|
|
/* Center focus */
|
|
focus_reg &= ~(0x02); /* clear 1st bit */
|
|
break;
|
|
case 1:
|
|
/* Touch Focus */
|
|
focus_reg |= 0x02; /* set 1st bit */
|
|
break;
|
|
default:
|
|
/* Center focus */
|
|
focus_reg &= ~(0x02); /* clear 1st bit */
|
|
break;
|
|
}
|
|
|
|
CDBG("DAFF %s focus_reg[0x%2x]\n", __func__, focus_reg);
|
|
SR352_WRITE_ADDR(0x11, focus_reg);
|
|
}
|
|
|
|
void sr352_set_touchaf_pos(struct msm_sensor_ctrl_t *s_ctrl, int x, int y)
|
|
{
|
|
uint16_t touch_x = x - XAXIS_START;
|
|
uint16_t touch_y = y - YAXIS_START;
|
|
uint16_t lcd_x = LCD_X;
|
|
uint16_t lcd_y = LCD_Y;
|
|
|
|
if (x - XAXIS_START < 0 || y - YAXIS_START < 0) {
|
|
pr_err("%s Error position x_axis[%d] y_axis[%d]\n",
|
|
__func__, x - XAXIS_START, y - YAXIS_START);
|
|
return;
|
|
}
|
|
if(sr352_ctrl.settings.resolution == MSM_SENSOR_RES_3)
|
|
{
|
|
uint32_t posX, posY;
|
|
|
|
posX = ((x * 100) * 92)/10000;
|
|
posY = y;
|
|
if(posX < 200)
|
|
posX = 200;
|
|
else if(posX > 1112)
|
|
posX = 1112;
|
|
if(posY < 200)
|
|
posY = 200;
|
|
else if(posY > 538)
|
|
posY = 538;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xD0);
|
|
|
|
SR352_WRITE_ADDR(0xFA, (posY >> 8));
|
|
SR352_WRITE_ADDR(0xFB, (posY & 0xFF));
|
|
SR352_WRITE_ADDR(0xFC, (posX >> 8));
|
|
SR352_WRITE_ADDR(0xFD, (posX & 0xFF));
|
|
}
|
|
else
|
|
{
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_WRITE_ADDR(0x15, 0xCA);
|
|
SR352_WRITE_ADDR(0x03, 0xD1);
|
|
|
|
SR352_WRITE_ADDR(0x10, (lcd_y >> 8));
|
|
SR352_WRITE_ADDR(0x11, (lcd_y & 0xFF));
|
|
SR352_WRITE_ADDR(0x12, (lcd_x >> 8));
|
|
SR352_WRITE_ADDR(0x13, (lcd_x & 0xFF));
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xD0);
|
|
|
|
SR352_WRITE_ADDR(0xFA, (touch_y >> 8));
|
|
SR352_WRITE_ADDR(0xFB, (touch_y & 0xFF));
|
|
SR352_WRITE_ADDR(0xFC, (touch_x >> 8));
|
|
SR352_WRITE_ADDR(0xFD, (touch_x & 0xFF));
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
int sr352_is_required_flash(struct msm_sensor_ctrl_t *s_ctrl, int flash_mode)
|
|
{
|
|
int rc = 0;
|
|
uint16_t bpga = 0, bpgath = 0, flashctl = 0;
|
|
|
|
if (sr352_ctrl.op_mode == CAMERA_MODE_RECORDING)
|
|
return 0;
|
|
|
|
switch(flash_mode) {
|
|
//case CAMERA_FLASH_TORCH:
|
|
case CAMERA_FLASH_ON:
|
|
rc = 1;
|
|
break;
|
|
case CAMERA_FLASH_AUTO:
|
|
SR352_WRITE_ADDR(0x03, ((FLASH_PGARO>>8) & 0xFF));
|
|
SR352_READ_ADDR((FLASH_PGARO & 0xFF), &bpga);
|
|
|
|
SR352_WRITE_ADDR(0x03, ((FLASH_PGATH>>8) & 0xFF));
|
|
SR352_READ_ADDR((FLASH_PGATH & 0xFF), &bpgath);
|
|
|
|
if (bpga >= bpgath)
|
|
rc = 1;
|
|
else
|
|
rc = 0;
|
|
break;
|
|
default:
|
|
rc = 0;
|
|
}
|
|
|
|
SR352_WRITE_ADDR(0x03, ((FLASH_CTL1>>8) & 0xFF));
|
|
SR352_READ_ADDR((FLASH_CTL1 & 0xFF), &flashctl);
|
|
if (flashctl & 0x80)
|
|
rc = 0;
|
|
|
|
CDBG("FLASHDBG mode[%2x] bpga[%2x] bpgath[%2x] flashctl[%2x] isFlash[%2x]\n",
|
|
flash_mode, bpga, bpgath, flashctl, rc);
|
|
|
|
return rc;
|
|
}
|
|
|
|
void sr352_get_sensor_ev_data(struct msm_sensor_ctrl_t *s_ctrl, uint16_t PreFlashEnable)
|
|
{
|
|
|
|
//PreFlashEnable = 0: Pre flash off timing
|
|
//PreFlashEnable = 1: Pre flash on timing
|
|
|
|
uint16_t temp;
|
|
uint16_t wRgain, wGgain, wBgain;
|
|
uint16_t Pga, Dg, Yavg, Ytgt, Step;
|
|
uint16_t wTmp1, wTmp2, wTmp3, wTmp4, wTmp5, wTmp6;
|
|
uint32_t dwTmp1, dwTmp2, dwTmp3, dwTmp4, dwExptime, dwEv;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0x20);
|
|
SR352_READ_ADDR(0xA4, &temp);
|
|
dwTmp1 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xA5, &temp);
|
|
dwTmp2 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xA6, &temp);
|
|
dwTmp3 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xA7, &temp);
|
|
dwTmp4 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xAB, &Pga);
|
|
SR352_READ_ADDR(0xAE, &Dg);
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xC7);
|
|
SR352_READ_ADDR(0x7B, &Yavg);//Y Mean
|
|
SR352_READ_ADDR(0x7C, &Ytgt);//Y Target
|
|
SR352_READ_ADDR(0x99, &Step);//BandStep
|
|
|
|
dwExptime = (dwTmp1<<24) + (dwTmp2<<16) + (dwTmp3<<8) + dwTmp4; //Org Exptime
|
|
dwEv = (uint32_t)((dwExptime * (((uint32_t)Pga*100)/32)*1)/100);
|
|
CDBG_FL("%d FLDBG func0 dwEv[%u]\n", __LINE__, dwEv);
|
|
|
|
SR352_WRITE_ADDR(0x03, 0x16);
|
|
SR352_READ_ADDR(0xC0, &temp);
|
|
wTmp1 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xC1, &temp);
|
|
wTmp2 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xC2, &temp);
|
|
wTmp3 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xC3, &temp);
|
|
wTmp4 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xC4, &temp);
|
|
wTmp5 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xC5, &temp);
|
|
wTmp6 = (uint16_t)temp;
|
|
temp=0;
|
|
wRgain = (wTmp1<<8) + wTmp2;
|
|
wBgain = (wTmp3<<8) + wTmp4;
|
|
wGgain = (wTmp5<<8) + wTmp6;
|
|
|
|
if(PreFlashEnable) {
|
|
Flash.dwPreFlashEv = dwEv; //Org Ev
|
|
Flash.dwPreExptime = dwExptime; //Org Exptime
|
|
Flash.bPrePga = Pga;
|
|
Flash.bPreDg = Dg;
|
|
Flash.bPreFlashY = Yavg; //Y Mean
|
|
Flash.bPreFlashTgt = Ytgt; //Y Target
|
|
Flash.wPreFlashRgain= wRgain;
|
|
Flash.wPreFlashGgain= wGgain;
|
|
Flash.wPreFlashBgain= wBgain;
|
|
} else {
|
|
Flash.dwOrgEv = dwEv; //Org Ev
|
|
Flash.dwOrgExptime = dwExptime; //Org Exptime
|
|
Flash.bOrgPga = Pga;
|
|
Flash.bOrgDg = Dg;
|
|
Flash.bOrgY = Yavg; //Y Mean
|
|
Flash.bOrgTgt = Ytgt; //Y Target
|
|
Flash.wOrgRgain = wRgain;
|
|
Flash.wOrgGgain = wGgain;
|
|
Flash.wOrgBgain = wBgain;
|
|
}
|
|
}
|
|
|
|
void sr352_get_ev_data_flash_Off_func1(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
uint16_t temp;
|
|
uint16_t wTmp1, wTmp2, wTmp3, wTmp4, wTmp5, wTmp6;
|
|
uint32_t dwTmp1, dwTmp2, dwTmp3, dwTmp4;
|
|
|
|
SR352_WRITE_ADDR(0x03, ((FLASH_PRE_FLASHRATE>>8)&0xFF));
|
|
SR352_READ_ADDR(FLASH_PRE_FLASHRATE &0xFF, &(Flash.bPFlashRate ));//PreFlash:20%
|
|
SR352_READ_ADDR(FLASH_MAIN_FLASHRATE&0xFF, &(Flash.bMFlashRate));//MainFlash:80%
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//For AE
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
SR352_WRITE_ADDR(0x03, 0x20);
|
|
SR352_READ_ADDR(0x51, &(Flash.bAgMax));
|
|
SR352_READ_ADDR(0x52, &(Flash.bAgMin));
|
|
SR352_READ_ADDR(0x71, &(Flash.bDgMax));
|
|
SR352_READ_ADDR(0x72, &(Flash.bDgMin));
|
|
SR352_READ_ADDR(0x24, &temp);
|
|
dwTmp1 = temp;
|
|
temp = 0;
|
|
|
|
SR352_READ_ADDR(0x25, &temp);
|
|
dwTmp2 = temp;
|
|
temp = 0;
|
|
|
|
SR352_READ_ADDR(0x26, &temp);
|
|
dwTmp3 = temp;
|
|
temp = 0;
|
|
|
|
SR352_READ_ADDR(0x27, &temp);
|
|
dwTmp4 = temp;
|
|
temp = 0;
|
|
|
|
Flash.dwExpMax = (dwTmp1<<24) + (dwTmp2<<16) + (dwTmp3<<8) + dwTmp4;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xC7);
|
|
SR352_READ_ADDR(0x38, &(Flash.bDgRatio));
|
|
SR352_READ_ADDR(0x72, &(Flash.bDgCtl));
|
|
SR352_READ_ADDR(0x73, &(Flash.bAntiFlag));
|
|
SR352_READ_ADDR(0x76, &temp);
|
|
dwTmp1 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x77, &temp);
|
|
dwTmp2 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x78, &temp);
|
|
dwTmp3 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x79, &temp);
|
|
dwTmp4 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x39, &temp);
|
|
wTmp1 = temp;
|
|
temp = 0;
|
|
SR352_READ_ADDR(0x3A, &temp);
|
|
wTmp2 = temp;
|
|
temp = 0;
|
|
Flash.dwExpBand = (dwTmp1<<24) + (dwTmp2<<16) + (dwTmp3<<8) + dwTmp4; //ExpBand
|
|
Flash.wOneLine = (wTmp1<<8) + wTmp2; //OneLine
|
|
|
|
if (Flash.bDgRatio == 0) {
|
|
pr_err("%s:%d ERROR: bDgRatio is Zero Here\n", __func__, __LINE__);
|
|
return;
|
|
}
|
|
|
|
Flash.fAgMin = ((uint32_t)Flash.bAgMin * 100)/32;
|
|
Flash.fDgMin = ((uint32_t)Flash.bDgMin * 100)/Flash.bDgRatio;
|
|
Flash.fAgMax = ((uint32_t)Flash.bAgMax * 100)/32;
|
|
Flash.fDgMax = ((uint32_t)Flash.bDgMax * 100)/Flash.bDgRatio;
|
|
|
|
Flash.dwExpMin = (uint32_t)Flash.wOneLine*4;
|
|
Flash.dwEvMin = (uint32_t)((Flash.dwExpMin * (Flash.fAgMin * 1)/100));
|
|
|
|
//Get Ev data before Pre Flash time
|
|
SR352_WRITE_ADDR(0x03, 0xC7);
|
|
SR352_READ_ADDR(0xA7, &temp);
|
|
dwTmp1 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xA8, &temp);
|
|
dwTmp2 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xA9, &temp);
|
|
dwTmp3 = (uint32_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0xAA, &temp);
|
|
dwTmp4 = (uint32_t)temp;
|
|
temp=0;
|
|
Flash.dwOrgEvRO = (dwTmp1<<24) + (dwTmp2<<16) + (dwTmp3<<8) + dwTmp4; //Sensor EV
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
//For AWB
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
SR352_WRITE_ADDR(0x03, 0xCC);
|
|
SR352_READ_ADDR(0x66, &temp);
|
|
wTmp1 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x67, &temp);
|
|
wTmp2 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x68, &temp);
|
|
wTmp3 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x69, &temp);
|
|
wTmp4 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x6E, &temp);
|
|
dwTmp1 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x6F, &temp);
|
|
dwTmp2 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x70, &temp);
|
|
dwTmp3 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x71, &temp);
|
|
dwTmp4 = (uint16_t)temp;
|
|
temp=0;
|
|
Flash.wRgainMin = (uint16_t)((wTmp1 <<8) + wTmp2);
|
|
Flash.wRgainMax = (uint16_t)((wTmp3 <<8) + wTmp4);
|
|
Flash.wBgainMin = (uint16_t)((dwTmp1<<8) + dwTmp2);
|
|
Flash.wBgainMax = (uint16_t)((dwTmp3<<8) + dwTmp4);
|
|
|
|
SR352_WRITE_ADDR(0x03, ((FLASH_AWB_YDIFF>>8)&0xFF));
|
|
SR352_READ_ADDR(FLASH_AWB_YDIFF&0xFF, &(Flash.bYdiffTh ));//YDiffTh
|
|
SR352_READ_ADDR((FLASH_AWB_TGTRGAIN&0xFF) , &temp );
|
|
wTmp1 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR((FLASH_AWB_TGTRGAIN&0xFF)+1, &temp);
|
|
wTmp2 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR((FLASH_AWB_TGTGGAIN&0xFF) , &temp);
|
|
wTmp3 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR((FLASH_AWB_TGTGGAIN&0xFF)+1, &temp);
|
|
wTmp4 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR((FLASH_AWB_TGTBGAIN&0xFF) , &temp);
|
|
wTmp5 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR((FLASH_AWB_TGTBGAIN&0xFF)+1, &temp);
|
|
wTmp6 = (uint16_t)temp;
|
|
temp=0;
|
|
Flash.wTgtRgain = (uint16_t)((wTmp1 <<8) + wTmp2);
|
|
Flash.wTgtGgain = (uint16_t)((wTmp3 <<8) + wTmp4);
|
|
Flash.wTgtBgain = (uint16_t)((wTmp5 <<8) + wTmp6);
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xCC);
|
|
SR352_READ_ADDR(0x5C, &temp);
|
|
wTmp1 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x5D, &temp);
|
|
wTmp2 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x5E, &temp);
|
|
wTmp3 = (uint16_t)temp;
|
|
temp=0;
|
|
SR352_READ_ADDR(0x5F, &temp);
|
|
wTmp4 = (uint16_t)temp;
|
|
temp=0;
|
|
Flash.wOrgRgTgt = (uint16_t)((wTmp1 <<8) + wTmp2);
|
|
Flash.wOrgBgTgt = (uint16_t)((wTmp3 <<8) + wTmp4);
|
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
//For test code
|
|
//Flash.bYdiffTh = 10;
|
|
//Flash.wTgtRgain = 0x5C0;
|
|
//Flash.wTgtGgain = 0x400;
|
|
//Flash.wTgtBgain = 0x680;
|
|
|
|
sr352_get_sensor_ev_data(s_ctrl,0);
|
|
CDBG_FL("FLDBG1[func:%s] dwOrgEv[0x%x] dwOrgExptime[0x%x] bOrgPga[0x%x] bOrgDg[0x%x] bOrgY[0x%x] bOrgTgt[0x%x] dwOrgEvRO[0x%x]\n",
|
|
__func__, Flash.dwOrgEv, Flash.dwOrgExptime, Flash.bOrgPga, Flash.bOrgDg, Flash.bOrgY, Flash.bOrgTgt, Flash.dwOrgEvRO);
|
|
}
|
|
|
|
void sr352_get_ev_data_preflash_func2(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
SR352_WRITE_ADDR(0x03,((FLASH_CTL1>>8)&0xFF));
|
|
SR352_READ_ADDR(FLASH_CTL1&0xFF, &(Flash.bFlashCtl1));
|
|
|
|
//--------------------------------------------//
|
|
//Get Ev data after end of Pre Flash time
|
|
sr352_get_sensor_ev_data(s_ctrl, 1);
|
|
//--------------------------------------------//
|
|
//Checking Ev data variation
|
|
if ((Flash.dwOrgEv >= Flash.dwPreFlashEv) && !(Flash.bFlashCtl1 & 0x80)) {
|
|
|
|
if (!Flash.bOrgY || !Flash.dwPreFlashEv || !Flash.bPFlashRate) {
|
|
pr_err("%s:%d ERROR: bOrgY[%d] dwPreFlashEv[%d] bPFlashRate[%d] Divide By ZERO\n",
|
|
__func__, __LINE__, Flash.bOrgY, Flash.dwPreFlashEv, Flash.bPFlashRate);
|
|
return;
|
|
}
|
|
Flash.fPreFlash_Ymean = (uint32_t)(((uint32_t)((Flash.dwOrgEv*100) / Flash.dwPreFlashEv) *\
|
|
((uint32_t)((uint32_t)Flash.bPreFlashY*1000) / (uint32_t)Flash.bOrgY) * Flash.bOrgY)/10000);
|
|
CDBG_FL("%d func2 FLDBG2 Flash.fPreFlash_Ymen[%u] = ([%u]/[%u])*([%u]/[%u])*[%u]\n", __LINE__,
|
|
Flash.fPreFlash_Ymean, Flash.dwOrgEv, Flash.dwPreFlashEv, Flash.bPreFlashY, Flash.bOrgY, Flash.bOrgY);
|
|
|
|
Flash.fPreFlash_Yinc = (uint32_t)((Flash.fPreFlash_Ymean * 100)/ Flash.bOrgY);
|
|
CDBG_FL("%d func2 FLDBG2 Flash.fPreFlash_Yinc[%u] = [%u]/[%u]\n", __LINE__,
|
|
Flash.fPreFlash_Yinc, Flash.fPreFlash_Ymean, Flash.bOrgY);
|
|
Flash.fMainFlash_Rate = (((uint32_t)Flash.bMFlashRate * 1000)/(uint32_t)Flash.bPFlashRate)/1000;
|
|
if (Flash.fPreFlash_Ymean >= ((uint32_t)Flash.bOrgY*10)) {
|
|
Flash.fPreFlash_YDiff = (Flash.fPreFlash_Ymean - ((uint32_t)Flash.bOrgY*10));
|
|
Flash.fMainFlash_Ymean = ((Flash.fPreFlash_YDiff * Flash.fMainFlash_Rate) + Flash.fPreFlash_Ymean)/10;
|
|
} else {
|
|
Flash.fPreFlash_YDiff = (((uint32_t)Flash.bOrgY*10) - Flash.fPreFlash_Ymean);
|
|
Flash.fMainFlash_Ymean = (Flash.fPreFlash_Ymean - (Flash.fPreFlash_YDiff * Flash.fMainFlash_Rate))/10;
|
|
}
|
|
|
|
CDBG_FL("%d func2 FLDBG2 Flash.fPreFlash_YDiff[%u] = [%u] - [%u]\n", __LINE__,
|
|
Flash.fPreFlash_YDiff, Flash.fPreFlash_Ymean, Flash.bOrgY);
|
|
|
|
if (Flash.bFlashCtl1 & 0x10) {
|
|
CDBG_FL("%d func2 FLDBG2 NEVER HERE\n", __LINE__);
|
|
|
|
SR352_WRITE_ADDR(0x03,((FLASH_CALCRATIOTH>>8)&0xFF));
|
|
SR352_READ_ADDR(FLASH_CALCRATIOTH&0xFF, &(Flash.bFlashCalcRatioTh));
|
|
SR352_READ_ADDR(FLASH_CALCRATIOMAX&0xFF, &(Flash.bFlashCalcRatioMax));
|
|
|
|
if (!Flash.bFlashCalcRatioTh) {
|
|
pr_err("%s:%d ERROR bFlashCalcRatioTh[%d] Divide By Zero!\n",
|
|
__func__, __LINE__, Flash.bFlashCalcRatioTh);
|
|
return;
|
|
}
|
|
|
|
if( Flash.fPreFlash_Yinc < 1000) {
|
|
//Flash.fFlashCalcRatio = ((((Flash.fPreFlash_Yinc-1)*100) / Flash.bFlashCalcRatioTh)/1000);
|
|
|
|
Flash.fFlashCalcRatio = ((((1000-Flash.fPreFlash_Yinc)*100) / Flash.bFlashCalcRatioTh)/1000);
|
|
} else {
|
|
Flash.fFlashCalcRatio = (((((int)Flash.fPreFlash_Yinc-1000)*100) / Flash.bFlashCalcRatioTh)/1000);
|
|
}
|
|
|
|
if(Flash.bFlashCalcRatioMax < Flash.fFlashCalcRatio)
|
|
Flash.fFlashCalcRatio = Flash.bFlashCalcRatioMax;
|
|
|
|
if( Flash.fPreFlash_Yinc < 1000) {
|
|
//Flash.fMainFlash_Ymean = (Flash.fMainFlash_Ymean * (((100-Flash.fFlashCalcRatio) * 1000)/100))/1000;
|
|
Flash.fMainFlash_Ymean = (Flash.fMainFlash_Ymean * ((100000+Flash.fFlashCalcRatio)/100000));
|
|
} else {
|
|
Flash.fMainFlash_Ymean = (Flash.fMainFlash_Ymean * ((100000-Flash.fFlashCalcRatio)/100000));
|
|
}
|
|
}
|
|
|
|
CDBG_FL("%d func2 FLDBG2 Flash.bPreFlashTgt[%u] >= Flash.fMainFlash_Ymean[%u]\n", __LINE__,
|
|
Flash.bPreFlashTgt, Flash.fMainFlash_Ymean);
|
|
if (Flash.bPreFlashTgt >= Flash.fMainFlash_Ymean) {
|
|
Flash.fYcalRate = 100;
|
|
CDBG_FL("%d func2 FLDBG2 Flash.fYcalRate[%u]\n", __LINE__, 1);
|
|
} else {
|
|
if (!Flash.bPreFlashTgt) {
|
|
pr_err("%s:%d ERROR: bPreFlashTgt[%d] Divide By Zero\n",
|
|
__func__, __LINE__, Flash.bPreFlashTgt);
|
|
return;
|
|
}
|
|
Flash.fYcalRate = ((Flash.fMainFlash_Ymean * 100)/ Flash.bPreFlashTgt);
|
|
CDBG_FL("%d func2 FLDBG2 Flash.fYcalRate[%u] = [%u]/[%u]\n", __LINE__,
|
|
Flash.fYcalRate, Flash.fMainFlash_Ymean, Flash.bPreFlashTgt);
|
|
}
|
|
|
|
if (!Flash.fYcalRate) {
|
|
pr_err("%s:%d ERROR: fYcalRate[%d] Divide By Zero\n",
|
|
__func__, __LINE__, Flash.fYcalRate);
|
|
return;
|
|
}
|
|
|
|
Flash.dwMainFlashEv = ((Flash.dwOrgEv*100) / Flash.fYcalRate);
|
|
CDBG_FL("%d func2 FLDBG2 Flash.dwMainFlashEv[%u] = [%u]/[%u]\n", __LINE__,
|
|
Flash.dwMainFlashEv, Flash.dwOrgEv, Flash.fYcalRate);
|
|
|
|
CDBG_FL("%d func2 FLDBG2 dwMainFlashEv[%u] < dwEvMin[%u]\n", __LINE__,
|
|
Flash.dwMainFlashEv, Flash.dwEvMin);
|
|
if (Flash.dwMainFlashEv < Flash.dwEvMin) {
|
|
Flash.dwMainFlashEv = Flash.dwEvMin;
|
|
}
|
|
|
|
CDBG_FL("%d func2 FLDBG2 case1[0x%0x], case2[0x%0x]\n", __LINE__,
|
|
((uint32_t)(Flash.dwMainFlashEv/(Flash.wOneLine * Flash.fAgMin * Flash.fDgMin))) * Flash.wOneLine,
|
|
((uint32_t)(Flash.dwMainFlashEv/(Flash.dwExpBand * Flash.fAgMin * Flash.fDgMin))) * Flash.dwExpBand);
|
|
|
|
//Checking whether Indoor or outdoor condition. --> //Exptime step calc
|
|
if (((Flash.bAntiFlag & ~0x02)&&(Flash.dwMainFlashEv < (Flash.dwExpBand)))\
|
|
|| ((Flash.bAntiFlag & 0x02)&&(Flash.dwMainFlashEv < (Flash.dwExpBand*2)))) {
|
|
|
|
//Outdoor condition
|
|
if (!Flash.wOneLine || !Flash.fAgMin) {
|
|
pr_err("%s:%d ERROR: wOneLine[%d], fAgMin[%d] Divide By Zero\n",
|
|
__func__, __LINE__, Flash.wOneLine, Flash.fAgMin);
|
|
return;
|
|
}
|
|
|
|
Flash.dwMainFlashBandStep = (uint32_t)(((Flash.dwMainFlashEv*10)/((Flash.wOneLine * Flash.fAgMin * 1)/100))/10);
|
|
Flash.dwMainFlashExp = Flash.dwMainFlashBandStep * Flash.wOneLine;
|
|
CDBG_FL("%d func2 FLDBG2 Outdoor [%u]\n", __LINE__, Flash.dwMainFlashExp);
|
|
} else {
|
|
|
|
//Indoor condition
|
|
if (!Flash.dwExpBand|| !Flash.fAgMin) {
|
|
pr_err("%s:%d ERROR: dwExpBand[%d], fAgMin[%d] Divide By Zero\n",
|
|
__func__, __LINE__, Flash.dwExpBand, Flash.fAgMin);
|
|
return;
|
|
}
|
|
Flash.dwMainFlashBandStep = (uint32_t)(((Flash.dwMainFlashEv*10)/(Flash.dwExpBand * (Flash.fAgMin * 1/100)))/10);
|
|
Flash.dwMainFlashExp = (Flash.dwMainFlashBandStep * Flash.dwExpBand);
|
|
CDBG_FL("%d func2 FLDBG2 Indoor[%u]\n", __LINE__, Flash.dwMainFlashExp);
|
|
}
|
|
|
|
//Check EV limit
|
|
if(Flash.dwMainFlashExp < Flash.dwExpMin) { Flash.dwMainFlashExp = Flash.dwExpMin; }
|
|
else if(Flash.dwMainFlashExp > Flash.dwExpMax) { Flash.dwMainFlashExp = Flash.dwExpMax; }
|
|
|
|
//Calc PGA
|
|
if (!Flash.dwMainFlashExp) {
|
|
pr_err("%s:%d ERROR: dwMainFlashExp[%d] Divide By Zero\n",
|
|
__func__, __LINE__, Flash.dwMainFlashExp);
|
|
return;
|
|
}
|
|
Flash.fMainFlashAg = ((Flash.dwMainFlashEv*10)/(Flash.dwMainFlashExp *1))*100/10;
|
|
if(Flash.fMainFlashAg < Flash.fAgMin){ Flash.fMainFlashAg = Flash.fAgMin; }
|
|
else if(Flash.fMainFlashAg > Flash.fAgMax){ Flash.fMainFlashAg = Flash.fAgMax; }
|
|
|
|
Flash.bMainFlashAg = (uint8_t)((Flash.fMainFlashAg * 32)/100);
|
|
|
|
//Calc DG
|
|
if(Flash.bDgCtl & 0x01) {
|
|
//DGain On
|
|
Flash.fMainFlashDg = ((Flash.dwMainFlashEv*10) / (Flash.dwMainFlashExp * Flash.fMainFlashAg/100))/10*100;
|
|
if(Flash.fMainFlashDg < Flash.fDgMin){ Flash.fMainFlashDg = Flash.fDgMin; }
|
|
else if(Flash.fMainFlashDg > Flash.fDgMax){ Flash.fMainFlashDg = Flash.fDgMax; }
|
|
Flash.bMainFlashDg = (uint8_t)((Flash.fMainFlashDg * Flash.bDgRatio)/100);
|
|
} else {
|
|
Flash.bMainFlashDg = Flash.bDgRatio;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// AWB cal
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
if(Flash.fPreFlash_Yinc < 1000) {
|
|
Flash.fPreFlash_Yinc = 1000;
|
|
}
|
|
|
|
Flash.fYdiffRatio = ((((int)Flash.fPreFlash_Yinc-1000)/((uint32_t)Flash.bYdiffTh))*100)/1000;
|
|
|
|
if(Flash.fYdiffRatio > 100){ Flash.fYdiffRatio = 100; }
|
|
else if(Flash.fYdiffRatio < 0){ Flash.fYdiffRatio = 0; }
|
|
|
|
Flash.wMainFlashRgain = (uint16_t)(((((((int)Flash.wTgtRgain-Flash.wPreFlashRgain)*10)/100) *\
|
|
(int)Flash.fYdiffRatio )/10 + Flash.wPreFlashRgain ));
|
|
Flash.wMainFlashGgain = (uint16_t)(((((((int)Flash.wTgtGgain-Flash.wPreFlashGgain)*10)/100) *\
|
|
(int)Flash.fYdiffRatio )/10 + Flash.wPreFlashGgain ));
|
|
Flash.wMainFlashBgain = (uint16_t)(((((((int)Flash.wTgtBgain-Flash.wPreFlashBgain)*10)/100) *\
|
|
(int)Flash.fYdiffRatio )/10 + Flash.wPreFlashBgain ));
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
Flash.bState = 0x01;
|
|
} else {
|
|
Flash.bState = 0x00;
|
|
}
|
|
|
|
CDBG_FL("FLDBG1[func:%s] dwPreFlashEv[0x%x] dwPreExptime[0x%x] bPrePga[0x%x] bPreDg[0x%x] bPreFlashY[0x%x] bPreFlashTgt[0x%x]"
|
|
" dwMainFlashEv[0x%x] dwMainFlashExp[0x%x] bMainFlashAg[0x%x] bMainFlashDg[0x%x]\n",
|
|
__func__, Flash.dwPreFlashEv, Flash.dwPreExptime, Flash.bPrePga, Flash.bPreDg, Flash.bPreFlashY, Flash.bPreFlashTgt,
|
|
Flash.dwMainFlashEv, Flash.dwMainFlashExp, Flash.bMainFlashAg, Flash.bMainFlashDg);
|
|
}
|
|
|
|
void sr352_set_ev_data_mainFlash_func3(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
//WriteEvDataForMainFlash
|
|
if(Flash.bState) {
|
|
|
|
SR352_WRITE_ADDR(0x03,((FLASH_CTL1>>8)&0xFF));
|
|
SR352_READ_ADDR(FLASH_CTL1&0xFF, &(Flash.bFlashCtl1));
|
|
|
|
if(!(Flash.bFlashCtl1 & 0x40)) {
|
|
|
|
//////////////////////////////////////////////////////
|
|
//AE Register Update[ ExpTime, Gain ]
|
|
//////////////////////////////////////////////////////
|
|
SR352_WRITE_ADDR(0x03, 0xC7);
|
|
SR352_WRITE_ADDR(0x44, (Flash.dwMainFlashExp>>24)&0xFF);//ExpTime
|
|
SR352_WRITE_ADDR(0x45, (Flash.dwMainFlashExp>>16)&0xFF);
|
|
SR352_WRITE_ADDR(0x46, (Flash.dwMainFlashExp>> 8)&0xFF);
|
|
SR352_WRITE_ADDR(0x47, (Flash.dwMainFlashExp )&0xFF);
|
|
SR352_WRITE_ADDR(0x40, Flash.bMainFlashAg);//Gain
|
|
SR352_WRITE_ADDR(0x41, Flash.bMainFlashDg);
|
|
//Update New ExpTime & Gain
|
|
SR352_WRITE_ADDR(0x03, 0x20);
|
|
SR352_WRITE_ADDR(0x20, (Flash.dwMainFlashExp>>24)&0xFF);
|
|
SR352_WRITE_ADDR(0x21, (Flash.dwMainFlashExp>>16)&0xFF);
|
|
SR352_WRITE_ADDR(0x22, (Flash.dwMainFlashExp>> 8)&0xFF);
|
|
SR352_WRITE_ADDR(0x23, (Flash.dwMainFlashExp )&0xFF);
|
|
SR352_WRITE_ADDR(0x50, Flash.bMainFlashAg);
|
|
SR352_WRITE_ADDR(0x70, Flash.bMainFlashDg);
|
|
//Update flag
|
|
SR352_WRITE_ADDR(0x03, 0xc7);
|
|
SR352_WRITE_ADDR(0x76, 0x00);
|
|
SR352_WRITE_ADDR(0x77, 0x00);
|
|
SR352_WRITE_ADDR(0x78, 0x00);
|
|
SR352_WRITE_ADDR(0x79, 0x00);
|
|
}
|
|
|
|
if(!(Flash.bFlashCtl1 & 0x20)) {
|
|
//////////////////////////////////////////////////////
|
|
//AWB Register Update
|
|
//////////////////////////////////////////////////////
|
|
SR352_WRITE_ADDR(0x03, 0x16);
|
|
SR352_WRITE_ADDR(0xA2, (Flash.wMainFlashRgain>>8)&0xFF);
|
|
SR352_WRITE_ADDR(0xA3, (Flash.wMainFlashRgain )&0xFF);
|
|
SR352_WRITE_ADDR(0xA4, (Flash.wMainFlashBgain>>8)&0xFF);
|
|
SR352_WRITE_ADDR(0xA5, (Flash.wMainFlashBgain )&0xFF);
|
|
SR352_WRITE_ADDR(0xA6, (Flash.wMainFlashGgain>>8)&0xFF);
|
|
SR352_WRITE_ADDR(0xA7, (Flash.wMainFlashGgain )&0xFF);
|
|
}
|
|
|
|
if(Flash.bFlashCtl1 & 0x08) {
|
|
|
|
SR352_WRITE_ADDR(0x03, 0x00);
|
|
SR352_WRITE_ADDR(0x60, (Flash.bFlashCtl1&0x07));
|
|
}
|
|
}
|
|
}
|
|
|
|
void sr352_return_ev_data_func4(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
|
|
uint16_t i, bTmp1, bTmp2;
|
|
|
|
if(Flash.bState) {
|
|
//////////////////////////////////////////////////////
|
|
//AE Register Update[ ExpTime, Gain ]
|
|
//////////////////////////////////////////////////////
|
|
SR352_WRITE_ADDR(0x03, 0x20);
|
|
SR352_WRITE_ADDR(0x20, (Flash.dwOrgExptime>>24)&0xFF); //HW ExpTime
|
|
SR352_WRITE_ADDR(0x21, (Flash.dwOrgExptime>>16)&0xFF);
|
|
SR352_WRITE_ADDR(0x22, (Flash.dwOrgExptime>> 8)&0xFF);
|
|
SR352_WRITE_ADDR(0x23, (Flash.dwOrgExptime )&0xFF);
|
|
SR352_WRITE_ADDR(0x50, Flash.bOrgPga); //HW pga
|
|
SR352_WRITE_ADDR(0x70, Flash.bOrgDg);
|
|
//Update EV
|
|
SR352_WRITE_ADDR(0x03, 0xC7);
|
|
SR352_WRITE_ADDR(0xA7, (Flash.dwOrgEvRO>>24)&0xFF); //EV
|
|
SR352_WRITE_ADDR(0xA8, (Flash.dwOrgEvRO>>16)&0xFF);
|
|
SR352_WRITE_ADDR(0xA9, (Flash.dwOrgEvRO>> 8)&0xFF);
|
|
SR352_WRITE_ADDR(0xAA, (Flash.dwOrgEvRO )&0xFF);
|
|
//Update Exp
|
|
SR352_WRITE_ADDR(0x03, 0xC7);
|
|
SR352_WRITE_ADDR(0x44, (Flash.dwOrgExptime>>24)&0xFF); //SW ExpTime
|
|
SR352_WRITE_ADDR(0x45, (Flash.dwOrgExptime>>16)&0xFF);
|
|
SR352_WRITE_ADDR(0x46, (Flash.dwOrgExptime>> 8)&0xFF);
|
|
SR352_WRITE_ADDR(0x47, (Flash.dwOrgExptime )&0xFF);
|
|
SR352_WRITE_ADDR(0x40, Flash.bOrgPga); //SW pga
|
|
SR352_WRITE_ADDR(0x41, Flash.bOrgDg);
|
|
SR352_WRITE_ADDR(0x7b, Flash.bOrgY);
|
|
//////////////////////////////////////////////////////
|
|
//AWB Register Update
|
|
//////////////////////////////////////////////////////
|
|
SR352_WRITE_ADDR(0x03, 0x16);
|
|
SR352_WRITE_ADDR(0xA2, (Flash.wOrgRgain>>8)&0xFF);
|
|
SR352_WRITE_ADDR(0xA3, (Flash.wOrgRgain )&0xFF);
|
|
SR352_WRITE_ADDR(0xA4, (Flash.wOrgBgain>>8)&0xFF);
|
|
SR352_WRITE_ADDR(0xA5, (Flash.wOrgBgain )&0xFF);
|
|
SR352_WRITE_ADDR(0xA6, (Flash.wOrgGgain>>8)&0xFF);
|
|
SR352_WRITE_ADDR(0xA7, (Flash.wOrgGgain )&0xFF);
|
|
//AWB state reset
|
|
SR352_WRITE_ADDR(0x03, 0xCA);
|
|
SR352_WRITE_ADDR(0xA1, 0x00);
|
|
SR352_WRITE_ADDR(0xA3, 0x00);
|
|
SR352_WRITE_ADDR(0x03, 0xCC);
|
|
SR352_WRITE_ADDR(0x74, 0x00);
|
|
//AWB Tgt initial
|
|
SR352_WRITE_ADDR(0x03, 0x26);
|
|
SR352_READ_ADDR(0xAA, &bTmp1);
|
|
SR352_READ_ADDR(0xAB, &bTmp2);
|
|
SR352_WRITE_ADDR(0xAA, 0x0B);
|
|
SR352_WRITE_ADDR(0xAB, 0xE7);
|
|
#if 0
|
|
Flash.wOrgRgTgt = 0x800;
|
|
Flash.wOrgBgTgt = 0x800;
|
|
#endif
|
|
SR352_WRITE_ADDR(0x03, 0xCD);
|
|
for(i=0; i<15; i++) {
|
|
SR352_WRITE_ADDR((0x10+(i*2) ), ((Flash.wOrgRgTgt>>8)&0xFF));
|
|
SR352_WRITE_ADDR((0x10+(i*2)+1), ((Flash.wOrgRgTgt )&0xFF));
|
|
SR352_WRITE_ADDR(((0x2E)+(i*2) ), ((Flash.wOrgBgTgt>>8)&0xFF));
|
|
SR352_WRITE_ADDR(((0x2E)+(i*2)+1), ((Flash.wOrgBgTgt )&0xFF));
|
|
}
|
|
|
|
SR352_WRITE_ADDR(0x03, 0x26);
|
|
SR352_WRITE_ADDR(0xAA, bTmp1);
|
|
SR352_WRITE_ADDR(0xAB, bTmp2);
|
|
|
|
Flash.bState = 0x00;
|
|
}
|
|
}
|
|
|
|
void sr352_recording_landing(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
uint16_t Recording_Pos = 0;
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x14, &Recording_Pos);
|
|
Recording_Pos |= 0x10;
|
|
SR352_WRITE_ADDR(0x14, Recording_Pos);
|
|
SR352_WRITE_ADDR(0x03, 0xD0);
|
|
SR352_WRITE_ADDR(0x7c, 0x00);
|
|
msleep(130);
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x14, & Recording_Pos);
|
|
Recording_Pos &= ~(0x10);
|
|
}
|
|
void sr352_actuator_softlanding(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
uint16_t landing_reg = 0;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x14, &landing_reg);
|
|
landing_reg |= 0x10;
|
|
SR352_WRITE_ADDR(0x14, landing_reg);
|
|
SR352_WRITE_ADDR(0x03, 0xD0);
|
|
SR352_WRITE_ADDR(0x7c, 0x00);
|
|
msleep(130);
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x14, &landing_reg);
|
|
landing_reg &= ~(0x10);
|
|
SR352_WRITE_ADDR(0x14, landing_reg);
|
|
}
|
|
|
|
void sr352_cancel_af(struct msm_sensor_ctrl_t *s_ctrl)
|
|
{
|
|
uint16_t focus_reg = 0;
|
|
|
|
SR352_WRITE_ADDR(0x03, 0xCF);
|
|
SR352_READ_ADDR(0x11, &focus_reg);
|
|
|
|
focus_reg |= 0x08; /* set 3rd bit */
|
|
|
|
CDBG("DAFF %s focus_reg[0x%2x]\n", __func__, focus_reg);
|
|
SR352_WRITE_ADDR(0x11, focus_reg);
|
|
}
|
|
|
|
int32_t sr352_set_af_status(struct msm_sensor_ctrl_t *s_ctrl, int status, int initial_pos)
|
|
{
|
|
int rc = -EINVAL;
|
|
|
|
switch(status) {
|
|
case SENSOR_AF_START:
|
|
CDBG("SENSOR_AF_START\n");
|
|
is_af_run = 1;
|
|
is_preflash = sr352_is_required_flash(s_ctrl, flash_mode);
|
|
|
|
if (is_preflash) {
|
|
memset(&Flash, 0, sizeof(Flash));
|
|
SR352_WRITE_LIST(sr352_StartPreFlash_FlashRegTable1);
|
|
sr352_get_ev_data_flash_Off_func1(s_ctrl);
|
|
SR352_WRITE_LIST(sr352_ReadyPreFlash_FlashRegTable2);
|
|
set_led_flash(MSM_CAMERA_LED_LOW);
|
|
flash_status = MSM_CAMERA_LED_LOW;
|
|
rc = SENSOR_AF_PRE_FLASH_ON;
|
|
need_main_flash = 1;
|
|
} else {
|
|
sr352_start_af(s_ctrl);
|
|
need_main_flash = 0;
|
|
rc = SENSOR_AF_START;
|
|
}
|
|
break;
|
|
case SENSOR_AF_PRE_FLASH_OFF:
|
|
CDBG("SENSOR_AF_PRE_FLASH_OFF\n");
|
|
if (is_preflash) {
|
|
SR352_WRITE_LIST(sr352_AfterPreFlash_FlashRegTable3);
|
|
sr352_get_ev_data_preflash_func2(s_ctrl);
|
|
SR352_WRITE_LIST(sr352_EndPreFlash_FlashRegTable4);
|
|
if (!is_touchaf)
|
|
msleep(100);
|
|
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
if (is_touchaf) {
|
|
is_touchaf = 0;
|
|
}
|
|
flash_status = MSM_CAMERA_LED_OFF;
|
|
is_preflash = 0;
|
|
}
|
|
rc = SENSOR_AF_PRE_FLASH_OFF;
|
|
break;
|
|
case SENSOR_AF_PRE_FLASH_AE_STABLE:
|
|
CDBG("SENSOR_AF_PRE_FLASH_AE_STABLE\n");
|
|
if (is_preflash) {
|
|
|
|
sr352_start_af(s_ctrl);
|
|
}
|
|
rc = SENSOR_AF_START;
|
|
break;
|
|
case SENSOR_AF_CANCEL:
|
|
CDBG("SENSOR_AF_CANCEL\n");
|
|
sr352_cancel_af(s_ctrl);
|
|
is_af_run = 0;
|
|
break;
|
|
default:
|
|
pr_err("%s:%d Invalid argument\n", __func__, __LINE__);
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
int32_t sr352_get_af_status(struct msm_sensor_ctrl_t *s_ctrl, int is_search_status)
|
|
{
|
|
unsigned short af_status = 0;
|
|
CDBG("is_search_status %d\n", is_search_status);
|
|
switch (is_search_status) {
|
|
case 0:
|
|
SR352_WRITE_ADDR(0x03, 0xD2);
|
|
SR352_READ_ADDR(0x11, &af_status);
|
|
CDBG("1st AF status before : %x\n", af_status);
|
|
if (af_status & 0x04)
|
|
af_status = 2; // AF completed.
|
|
else
|
|
af_status = 1; //still 1st search running.
|
|
CDBG("1st AF status after: %x\n", af_status);
|
|
break;
|
|
case 1:
|
|
SR352_WRITE_ADDR(0x03, 0xD2);
|
|
SR352_READ_ADDR(0x11, &af_status);
|
|
if (af_status & 0x02)
|
|
af_status = 0; //success
|
|
else if (af_status & 0x01)
|
|
af_status = 1; //failure
|
|
else
|
|
af_status = -1; // AF status unknown.
|
|
CDBG("2nd AF status : %d\n", af_status);
|
|
break;
|
|
default:
|
|
pr_err("%s:%d unexpected mode is coming from HAL\n", __func__, __LINE__);
|
|
}
|
|
CDBG("return_af_status = %d\n", af_status);
|
|
return af_status;
|
|
}
|
|
#endif
|
|
|
|
int32_t sr352_sensor_native_control(struct msm_sensor_ctrl_t *s_ctrl,
|
|
void __user *argp)
|
|
{
|
|
int32_t rc = 0;
|
|
struct ioctl_native_cmd *cam_info = (struct ioctl_native_cmd *)argp;
|
|
|
|
mutex_lock(s_ctrl->msm_sensor_mutex);
|
|
|
|
/*CDBG("cam_info values = %d : %d : %d : %d : %d\n", cam_info->mode, cam_info->address, cam_info->value_1, cam_info->value_2 , cam_info->value_3);*/
|
|
switch (cam_info->mode) {
|
|
case EXT_CAM_EV:
|
|
sr352_ctrl.settings.exposure = (cam_info->value_1);
|
|
if(sr352_ctrl.streamon == 1)
|
|
sr352_set_exposure_compensation(s_ctrl, sr352_ctrl.settings.exposure);
|
|
break;
|
|
case EXT_CAM_WB:
|
|
sr352_ctrl.settings.wb = (cam_info->value_1);
|
|
if(sr352_ctrl.streamon == 1)
|
|
sr352_set_white_balance(s_ctrl, sr352_ctrl.settings.wb);
|
|
break;
|
|
case EXT_CAM_METERING:
|
|
sr352_ctrl.settings.metering = (cam_info->value_1);
|
|
if(sr352_ctrl.streamon == 1)
|
|
sr352_set_metering(s_ctrl, sr352_ctrl.settings.metering);
|
|
break;
|
|
case EXT_CAM_EFFECT:
|
|
sr352_ctrl.settings.effect = (cam_info->value_1);
|
|
if(sr352_ctrl.streamon == 1)
|
|
sr352_set_effect(s_ctrl, sr352_ctrl.settings.effect);
|
|
break;
|
|
case EXT_CAM_SCENE_MODE:
|
|
sr352_ctrl.settings.scenemode = (cam_info->value_1);
|
|
cur_scene_mode_chg = 1;
|
|
if(sr352_ctrl.streamon == 1)
|
|
sr352_set_scene_mode(s_ctrl, sr352_ctrl.settings.scenemode);
|
|
break;
|
|
case EXT_CAM_SENSOR_MODE:
|
|
sr352_ctrl.prev_mode = sr352_ctrl.op_mode;
|
|
sr352_ctrl.op_mode = (cam_info->value_1);
|
|
pr_info("EXT_CAM_SENSOR_MODE = %d", sr352_ctrl.op_mode);
|
|
break;
|
|
case EXT_CAM_EXIF:
|
|
sr352_get_exif(cam_info);
|
|
if (!copy_to_user((void *)argp,
|
|
(const void *)&cam_info,
|
|
sizeof(cam_info)))
|
|
pr_err("copy failed");
|
|
|
|
break;
|
|
case EXT_CAM_SET_AE_AWB:
|
|
CDBG("EXT_CAM_SET_AE_AWB lock[%d]\n", cam_info->value_1);
|
|
sr352_ctrl.settings.aeawblock = cam_info->value_1;
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
if(!flash_mode){
|
|
CDBG("EXT_CAM_SET_AE_AWB, !flash_mode");
|
|
sr352_set_ae_awb_lock(s_ctrl, sr352_ctrl.settings.aeawblock);
|
|
}
|
|
#else
|
|
sr352_set_ae_awb_lock(s_ctrl, sr352_ctrl.settings.aeawblock);
|
|
#endif
|
|
break;
|
|
#if defined (AF_FLASH_SUPPORT)
|
|
case EXT_CAM_FOCUS:
|
|
CDBG("DAFF EXT_CAM_FOCUS focus mode[%d]\n", cam_info->value_1);
|
|
focus_mode = (cam_info->value_1);
|
|
if(sr352_ctrl.streamon == 1)
|
|
sr352_set_af_mode(s_ctrl, focus_mode);
|
|
break;
|
|
case EXT_CAM_SET_AF_STATUS:
|
|
CDBG("DAFF EXT_CAM_SET_AF_STATUS: %d : %d\n", cam_info->value_1, cam_info->value_2);
|
|
|
|
cam_info->value_1 = sr352_set_af_status(s_ctrl, cam_info->value_1,
|
|
cam_info->value_2);
|
|
|
|
if (!copy_to_user((void *)argp, (const void *)&cam_info,
|
|
sizeof(cam_info)))
|
|
pr_err("copy failed");
|
|
|
|
break;
|
|
case EXT_CAM_SET_TOUCHAF_POS:
|
|
CDBG("DAFF EXT_CAM_SET_TOUCHAF_POS: %d : %d", cam_info->value_1, cam_info->value_2);
|
|
|
|
if(cam_info->value_1 !=0 && cam_info->value_2 != 0) {
|
|
sr352_set_touchaf_pos(s_ctrl, cam_info->value_1, cam_info->value_2);
|
|
is_touchaf = 1;
|
|
} else {
|
|
is_touchaf = 0;
|
|
}
|
|
|
|
sr352_set_touch_mode(s_ctrl, is_touchaf);
|
|
|
|
break;
|
|
case EXT_CAM_GET_AF_STATUS:
|
|
CDBG("DAFF EXT_CAM_GET_AF_STATUS: %d\n", cam_info->value_1);
|
|
|
|
cam_info->value_1 = sr352_get_af_status(s_ctrl, cam_info->value_1);
|
|
if (!copy_to_user((void *)argp, (const void *)&cam_info,
|
|
sizeof(cam_info)))
|
|
pr_err("copy failed");
|
|
|
|
break;
|
|
case EXT_CAM_FLASH_MODE:
|
|
CDBG("DAFF EXT_CAM_FLASH_MODE = %d\n", (cam_info->value_1));
|
|
flash_mode = cam_info->value_1;
|
|
if((flash_mode) == CAMERA_FLASH_TORCH) {
|
|
set_led_flash(MSM_CAMERA_LED_LOW);
|
|
flash_status = MSM_CAMERA_LED_LOW;
|
|
} else {
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
flash_status = MSM_CAMERA_LED_OFF;
|
|
}
|
|
break;
|
|
case EXT_CAM_SET_FLASH:
|
|
CDBG("DAFF EXT_CAM_SET_FLASH = %d\n", (cam_info->value_1));
|
|
if (flash_mode != CAMERA_FLASH_TORCH) {
|
|
if (need_main_flash) {
|
|
if (flash_status == MSM_CAMERA_LED_HIGH) {
|
|
set_led_flash(MSM_CAMERA_LED_OFF);
|
|
flash_status = MSM_CAMERA_LED_OFF;
|
|
SR352_WRITE_LIST(sr352_AfterMainFlash_FlashRegTable6);
|
|
sr352_return_ev_data_func4(s_ctrl);
|
|
SR352_WRITE_LIST(sr352_EndMainFlash_FlashRegTable7);
|
|
need_main_flash = 0;
|
|
} else {
|
|
flash_status = cam_info->value_1;
|
|
set_led_flash(flash_status);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
rc = -EFAULT;
|
|
}
|
|
|
|
mutex_unlock(s_ctrl->msm_sensor_mutex);
|
|
|
|
return rc;
|
|
}
|
|
|
|
void sr352_set_default_settings(void)
|
|
{
|
|
sr352_ctrl.settings.metering = CAMERA_CENTER_WEIGHT;
|
|
sr352_ctrl.settings.exposure = CAMERA_EV_DEFAULT;
|
|
sr352_ctrl.settings.wb = CAMERA_WHITE_BALANCE_AUTO;
|
|
sr352_ctrl.settings.iso = CAMERA_ISO_MODE_AUTO;
|
|
sr352_ctrl.settings.effect = CAMERA_EFFECT_OFF;
|
|
sr352_ctrl.settings.scenemode = CAMERA_SCENE_AUTO;
|
|
sr352_ctrl.settings.aeawblock = 0;
|
|
}
|
|
|
|
#ifndef NO_BURST
|
|
int32_t sr352_sensor_burst_write(struct msm_sensor_ctrl_t *s_ctrl, struct msm_camera_i2c_reg_conf *reg_settings , int size)
|
|
{
|
|
int i;
|
|
int idx=0;
|
|
int burst_flag = 0;
|
|
int seq_flag = 0;
|
|
int err = -EINVAL;
|
|
unsigned char subaddr;
|
|
unsigned char value;
|
|
struct msm_camera_i2c_reg_conf def_reg_settings[]= { {0x00, 0x00,},};
|
|
|
|
// burst write related variables
|
|
struct msm_camera_i2c_burst_reg_array burst_reg_setting = { 0 ,};
|
|
struct msm_camera_i2c_reg_setting conf_array = {
|
|
.reg_setting = (void * ) &burst_reg_setting,
|
|
.size = 1,
|
|
.addr_type = MSM_CAMERA_I2C_BYTE_ADDR,
|
|
.data_type = MSM_CAMERA_I2C_BURST_DATA,
|
|
};
|
|
|
|
// seq write related variables
|
|
struct msm_camera_i2c_seq_reg_array *seq_reg_setting = NULL;
|
|
struct msm_camera_i2c_seq_reg_setting seq_conf_array = {
|
|
.reg_setting = NULL,
|
|
.size = 0,
|
|
.addr_type = MSM_CAMERA_I2C_BYTE_ADDR,
|
|
.delay = 0,
|
|
};
|
|
CDBG("E");
|
|
// allocate memory for seq reg setting
|
|
// I2C_SEQ_REG_DATA_MAX ,defined in msm_cam_sensor.h, is the limit for number of bytes
|
|
// which can be written in one seq_write call
|
|
seq_reg_setting = kzalloc((size/I2C_SEQ_REG_DATA_MAX + 1) *\
|
|
(sizeof(struct msm_camera_i2c_seq_reg_array)), GFP_KERNEL); // allocate maximum possible
|
|
if (!seq_reg_setting) {
|
|
pr_err("%s:%d failed\n", __func__, __LINE__);
|
|
err = -ENOMEM;
|
|
goto on_error;
|
|
}
|
|
seq_conf_array.reg_setting = seq_reg_setting;
|
|
|
|
// read the register settings array
|
|
for (i = 0; i < size; ++i) {
|
|
if (idx > (BURST_MODE_BUFFER_MAX_SIZE )) {
|
|
pr_err( "[%s:%d]Burst mode buffer overflow! "
|
|
"Byte Count %d\n",
|
|
__func__, __LINE__, i);
|
|
err = -EIO;
|
|
goto on_error;
|
|
}
|
|
|
|
// the register address
|
|
subaddr = reg_settings[i].reg_addr;
|
|
|
|
// the register value
|
|
value = reg_settings[i].reg_data;
|
|
|
|
if (burst_flag == 0) {
|
|
if ( (subaddr == BURST_REG) && value != 0x00) {
|
|
// set the burst flag since we encountered the burst start reg
|
|
burst_flag = 1;
|
|
}
|
|
|
|
// reset the byte count
|
|
idx = 0;
|
|
|
|
// write the register setting
|
|
def_reg_settings[0].reg_addr = subaddr;
|
|
def_reg_settings[0].reg_data = value;
|
|
err = s_ctrl->sensor_i2c_client->i2c_func_tbl->
|
|
i2c_write_conf_tbl(
|
|
s_ctrl->sensor_i2c_client, def_reg_settings,
|
|
ARRAY_SIZE( def_reg_settings),
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
} else if (burst_flag == 1) {
|
|
if (subaddr == BURST_REG && value == 0x00) {
|
|
// End Burst flag encountered
|
|
|
|
if (seq_flag) {
|
|
//seq data case
|
|
s_ctrl->sensor_i2c_client->i2c_func_tbl->\
|
|
i2c_write_seq_table(s_ctrl->sensor_i2c_client, &seq_conf_array);
|
|
if (err < 0) {
|
|
pr_err("[%s:%d]Sequential write fail!\n", __func__, __LINE__);
|
|
goto on_error;
|
|
}
|
|
} else {
|
|
//burst data case
|
|
burst_reg_setting.reg_data = burst_reg_data;
|
|
burst_reg_setting.reg_data_size = idx;
|
|
|
|
err = s_ctrl->sensor_i2c_client->i2c_func_tbl->\
|
|
i2c_write_table(s_ctrl->sensor_i2c_client, &conf_array);
|
|
if (err < 0) {
|
|
pr_err("[%s:%d]Burst write fail!\n", __func__, __LINE__);
|
|
goto on_error;
|
|
}
|
|
}
|
|
|
|
// reset the byte count and the flags
|
|
idx = 0;
|
|
burst_flag = 0;
|
|
seq_flag = 0;
|
|
|
|
def_reg_settings[0].reg_addr = subaddr;
|
|
def_reg_settings[0].reg_data = value;
|
|
err = s_ctrl->sensor_i2c_client->i2c_func_tbl->
|
|
i2c_write_conf_tbl(
|
|
s_ctrl->sensor_i2c_client, def_reg_settings,
|
|
ARRAY_SIZE( def_reg_settings),
|
|
MSM_CAMERA_I2C_BYTE_DATA);
|
|
if (err < 0) {
|
|
pr_err("[%s:%d]Burst write fail!\n", __func__, __LINE__);
|
|
goto on_error;
|
|
}
|
|
} else {
|
|
if (idx == 0) {
|
|
// Zeroth byte in the burst data
|
|
burst_reg_setting.reg_addr = subaddr;
|
|
burst_reg_data[idx++] = value;
|
|
} else {
|
|
if(idx==1 && burst_reg_setting.reg_addr!=subaddr){
|
|
// The burst data was found to be sequenced
|
|
seq_flag = 1;
|
|
seq_reg_setting[0].reg_addr = burst_reg_setting.reg_addr;
|
|
seq_reg_setting[0].reg_data[0] = burst_reg_data[0];
|
|
seq_reg_setting[0].reg_data[1] = value;
|
|
++idx;
|
|
} else {
|
|
if(!seq_flag){
|
|
burst_reg_data[idx++] = value;
|
|
} else{
|
|
// The seq data is split into blocks of I2C_SEQ_REG_DATA_MAX
|
|
if(idx % I2C_SEQ_REG_DATA_MAX == 0){
|
|
seq_reg_setting[idx/I2C_SEQ_REG_DATA_MAX].reg_addr = subaddr;
|
|
}
|
|
seq_reg_setting[idx/I2C_SEQ_REG_DATA_MAX].\
|
|
reg_data[idx%I2C_SEQ_REG_DATA_MAX] = value;
|
|
seq_reg_setting[idx/I2C_SEQ_REG_DATA_MAX].\
|
|
reg_data_size = (idx % I2C_SEQ_REG_DATA_MAX ) + 1;
|
|
seq_conf_array.size = idx/I2C_SEQ_REG_DATA_MAX+1;
|
|
++idx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
on_error:
|
|
if (unlikely(err < 0)) {
|
|
pr_err("[%s:%d] register set failed\n", __func__, __LINE__);
|
|
}
|
|
kfree(seq_reg_setting);
|
|
CDBG("X");
|
|
return err;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_LOAD_FILE
|
|
int sr352_regs_from_sd_tunning(struct msm_camera_i2c_reg_conf *settings, struct msm_sensor_ctrl_t *s_ctrl,char * name) {
|
|
char *start, *end, *reg;
|
|
int addr,rc = 0;
|
|
unsigned int value;
|
|
char reg_buf[5], data_buf1[5];
|
|
|
|
*(reg_buf + 4) = '\0';
|
|
*(data_buf1 + 4) = '\0';
|
|
|
|
if (settings != NULL) {
|
|
pr_err("sr352_regs_from_sd_tunning start address %x start data %x\n",
|
|
settings->reg_addr,settings->reg_data);
|
|
}
|
|
|
|
if (sr352_regs_table == NULL) {
|
|
pr_err("sr352_regs_table is null\n");
|
|
return -1;
|
|
}
|
|
pr_err("@@@ %s\n",name);
|
|
start = strstr(sr352_regs_table, name);
|
|
if (start == NULL){
|
|
return -1;
|
|
}
|
|
end = strstr(start, "};");
|
|
while (1) {
|
|
/* Find Address */
|
|
reg = strstr(start, "{0x");
|
|
if ((reg == NULL) || (reg > end))
|
|
break;
|
|
/* Write Value to Address */
|
|
if (reg != NULL) {
|
|
memcpy(reg_buf, (reg + 1), 4);
|
|
memcpy(data_buf1, (reg + 7), 4);
|
|
|
|
if(kstrtoint(reg_buf, 16, &addr))
|
|
pr_err("kstrtoint error .Please Align contents of the Header file!!\n") ;
|
|
|
|
if(kstrtoint(data_buf1, 16, &value))
|
|
pr_err("kstrtoint error .Please Align contents of the Header file!!\n");
|
|
|
|
if (reg)
|
|
start = (reg + 14);
|
|
|
|
if (addr == 0xff){
|
|
pr_err("delay = %dms STARTn", (int)value*10);
|
|
msleep(value * 10);
|
|
pr_err("delay END\n");
|
|
|
|
}
|
|
else {
|
|
rc=s_ctrl->sensor_i2c_client->i2c_func_tbl->
|
|
i2c_write(s_ctrl->sensor_i2c_client, addr,
|
|
value,MSM_CAMERA_I2C_BYTE_DATA);
|
|
}
|
|
}
|
|
}
|
|
pr_err("sr352_regs_from_sd_tunning end!\n");
|
|
return rc;
|
|
}
|
|
|
|
void sr352_regs_table_exit(void)
|
|
{
|
|
pr_info("%s:%d\n", __func__, __LINE__);
|
|
if (sr352_regs_table) {
|
|
vfree(sr352_regs_table);
|
|
sr352_regs_table = NULL;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void sr352_regs_table_init(char *filename)
|
|
{
|
|
struct file *filp;
|
|
char *dp;
|
|
long lsize;
|
|
loff_t pos;
|
|
int ret;
|
|
|
|
/*Get the current address space */
|
|
mm_segment_t fs = get_fs();
|
|
pr_err("%s %d", __func__, __LINE__);
|
|
/*Set the current segment to kernel data segment */
|
|
set_fs(get_ds());
|
|
|
|
filp = filp_open(filename, O_RDONLY, 0);
|
|
|
|
if (IS_ERR_OR_NULL(filp)) {
|
|
pr_err("file open error %ld",(long) filp);
|
|
return;
|
|
}
|
|
lsize = filp->f_path.dentry->d_inode->i_size;
|
|
pr_err("size : %ld", lsize);
|
|
dp = vmalloc(lsize);
|
|
if (dp == NULL) {
|
|
pr_err("Out of Memory");
|
|
filp_close(filp, current->files);
|
|
}
|
|
|
|
pos = 0;
|
|
memset(dp, 0, lsize);
|
|
ret = vfs_read(filp, (char __user *)dp, lsize, &pos);
|
|
if (ret != lsize) {
|
|
pr_err("Failed to read file ret = %d\n", ret);
|
|
vfree(dp);
|
|
filp_close(filp, current->files);
|
|
}
|
|
/*close the file*/
|
|
filp_close(filp, current->files);
|
|
|
|
/*restore the previous address space*/
|
|
set_fs(fs);
|
|
|
|
pr_err("coming to if part of string compare sr352_regs_table");
|
|
sr352_regs_table = dp;
|
|
sr352_regs_table_size = lsize;
|
|
*((sr352_regs_table + sr352_regs_table_size) - 1) = '\0';
|
|
|
|
return;
|
|
}
|
|
|
|
#endif
|