SmartAudio/lichee/linux-4.9/drivers/media/platform/sunxi-vfe/config.c

1507 lines
52 KiB
C

/*
* linux-4.9/drivers/media/platform/sunxi-vfe/config.c
*
* Copyright (c) 2007-2017 Allwinnertech Co., Ltd.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* 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.
*
*/
/*
***************************************************************************************
*
* config.c
*
* Hawkview ISP - config.c module
*
* Copyright (c) 2014 by Allwinnertech Co., Ltd. http://www.allwinnertech.com
*
* Version Author Date Description
*
* 2.0 Yang Feng 2014/03/11 Second Version
*
****************************************************************************************
*/
#include "config.h"
#include "platform_cfg.h"
#include "isp_cfg/isp_cfg.h"
#define SIZE_OF_LSC_TBL_MOD0 (7*768*2)
#define SIZE_OF_LSC_TBL_MOD1 (8*768*2)
#define SIZE_OF_LSC_TBL_MOD2 (12*768*2)
#define SIZE_OF_HDR_TBL (4*256*2)
#define SIZE_OF_GAMMA_TBL (256*2)
void set_used(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->used = *(int *)value;
vfe_dbg(0, "sensor_cfg->used = %d!\n", sensor_cfg->used);
}
void set_csi_sel(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->csi_sel = *(int *)value;
}
void set_device_sel(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->device_sel = *(int *)value;
}
void set_sensor_twi_id(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->twi_id = *(int *)value;
}
void set_power_settings_enable(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->power_settings_enable = *(int *)value;
}
void set_iovdd(struct sensor_config_init *sensor_cfg, void *value, int len)
{
strcpy(sensor_cfg->sub_power_str[ENUM_IOVDD], (char *)value);
vfe_dbg(0, "sub_power_str[ENUM_IOVDD] = %s!\n", sensor_cfg->sub_power_str[ENUM_IOVDD]);
}
void set_iovdd_vol(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->sub_power_vol[ENUM_IOVDD] = *(int *)value;
}
void set_avdd(struct sensor_config_init *sensor_cfg, void *value, int len)
{
strcpy(sensor_cfg->sub_power_str[ENUM_AVDD], (char *)value);
}
void set_avdd_vol(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->sub_power_vol[ENUM_AVDD] = *(int *)value;
}
void set_dvdd(struct sensor_config_init *sensor_cfg, void *value, int len)
{
strcpy(sensor_cfg->sub_power_str[ENUM_DVDD], (char *)value);
}
void set_dvdd_vol(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->sub_power_vol[ENUM_DVDD] = *(int *)value;
}
void set_afvdd(struct sensor_config_init *sensor_cfg, void *value, int len)
{
strcpy(sensor_cfg->sub_power_str[ENUM_AFVDD], (char *)value);
}
void set_afvdd_vol(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->sub_power_vol[ENUM_AFVDD] = *(int *)value;
}
void set_detect_sensor_num(struct sensor_config_init *sensor_cfg, void *value, int len)
{
sensor_cfg->detect_sensor_num = *(int *)value;
}
void set_sensor_name(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
strcpy(sensor_cfg->camera_inst[sel].name, (char *)value);
}
void set_sensor_twi_addr(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
sensor_cfg->camera_inst[sel].i2c_addr = *(int *)value;
}
void set_sensor_type(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
sensor_cfg->camera_inst[sel].sensor_type = *(int *)value;
}
void set_sensor_stby_mode(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
sensor_cfg->camera_inst[sel].stdby_mode = *(int *)value;
}
void set_sensor_hflip(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
sensor_cfg->camera_inst[sel].vflip = *(int *)value;
}
void set_sensor_vflip(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
sensor_cfg->camera_inst[sel].hflip = *(int *)value;
}
void set_act_name(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
strcpy(sensor_cfg->camera_inst[sel].act_name, (char *)value);
}
void set_act_twi_addr(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
sensor_cfg->camera_inst[sel].act_i2c_addr = *(int *)value;
}
void set_isp_cfg_name(struct sensor_config_init *sensor_cfg, void *value, int sel)
{
strcpy(sensor_cfg->camera_inst[sel].isp_cfg_name, (char *)value);
}
enum ini_item_type {
INTEGER,
STRING,
};
struct SensorParamAttribute {
char *sub;
int len;
enum ini_item_type type;
void (*set_param)(struct sensor_config_init *, void *, int len);
};
static struct SensorParamAttribute SensorParamCommon[] = {
{"used", 1, INTEGER, set_used,},
{"csi_sel", 1, INTEGER, set_csi_sel,},
{"device_sel", 1, INTEGER, set_device_sel,},
{"sensor_twi_id", 1, INTEGER, set_sensor_twi_id,},
{"power_settings_enable", 1, INTEGER, set_power_settings_enable,},
{"iovdd", 1, STRING, set_iovdd,},
{"iovdd_vol", 1, INTEGER, set_iovdd_vol,},
{"avdd", 1, STRING, set_avdd,},
{"avdd_vol", 1, INTEGER, set_avdd_vol,},
{"dvdd", 1, STRING, set_dvdd,},
{"dvdd_vol", 1, INTEGER, set_dvdd_vol,},
{"afvdd", 1, STRING, set_afvdd,},
{"afvdd_vol", 1, INTEGER, set_afvdd_vol,},
{"detect_sensor_num", 1, INTEGER, set_detect_sensor_num,},
};
static struct SensorParamAttribute SensorParamDetect[] = {
{"sensor_name", 1, STRING, set_sensor_name,},
{"sensor_twi_addr", 1, INTEGER, set_sensor_twi_addr,},
{"sensor_type", 1, INTEGER, set_sensor_type,},
{"sensor_stby_mode", 1, INTEGER, set_sensor_stby_mode,},
{"sensor_hflip", 1, INTEGER, set_sensor_hflip,},
{"sensor_vflip", 1, INTEGER, set_sensor_vflip,},
{"act_name", 1, STRING, set_act_name,},
{"act_twi_addr", 1, INTEGER, set_act_twi_addr,},
{"isp_cfg_name", 1, STRING, set_isp_cfg_name,},
};
int fetch_sensor_list(struct sensor_config_init *sensor_cfg_ini, char *main,
struct cfg_section *cfg_section)
{
int i, j;
struct cfg_subkey subkey;
struct SensorParamAttribute *SensorCommon;
static struct SensorParamAttribute *SensorDetect;
char sub_name[128] = {0};
SensorCommon = &SensorParamCommon[0];
/* fetch sensor common config; */
vfe_print("fetch sensor common config!\n");
for (i = 0; i < ARRAY_SIZE(SensorParamCommon); i++) {
if (main == NULL || SensorCommon->sub == NULL) {
vfe_warn("fetch_sensor_list main or SensorCommon->sub is NULL!\n");
continue;
}
if (SensorCommon->type == INTEGER) {
if (cfg_get_one_subkey(cfg_section, main, SensorCommon->sub, &subkey) != CFG_ITEM_VALUE_TYPE_INT) {
vfe_dbg(0, "Warning: %s->%s,apply default value!\n", main, SensorCommon->sub);
} else {
if (SensorCommon->set_param) {
SensorCommon->set_param(sensor_cfg_ini, (void *)&subkey.value.val, SensorCommon->len);
vfe_dbg(0, "fetch sensor cfg ini: %s->%s = %d\n", main, SensorCommon->sub, subkey.value.val);
}
}
} else if (SensorCommon->type == STRING) {
if (cfg_get_one_subkey(cfg_section, main, SensorCommon->sub, &subkey) != CFG_ITEM_VALUE_TYPE_STR) {
vfe_dbg(0, "Warning: %s->%s,apply default value!\n", main, SensorCommon->sub);
} else {
if (SensorCommon->set_param) {
if (!strcmp(subkey.value.str, "\"\""))
strcpy(subkey.value.str, "");
SensorCommon->set_param(sensor_cfg_ini, (void *)subkey.value.str, SensorCommon->len);
vfe_dbg(0, "fetch sensor cfg ini: %s->%s = %s\n", main, SensorCommon->sub, subkey.value.str);
}
}
}
SensorCommon++;
}
/* fetch sensor detect config; */
vfe_print("fetch sensor detect config!\n");
if (sensor_cfg_ini->detect_sensor_num > MAX_SENSOR_DETECT_NUM) {
vfe_err("sensor_num = %d > MAX_SENSOR_DETECT_NUM = %d\n", sensor_cfg_ini->detect_sensor_num, MAX_SENSOR_DETECT_NUM);
sensor_cfg_ini->detect_sensor_num = 1;
}
for (j = 0; j < sensor_cfg_ini->detect_sensor_num; j++) {
SensorDetect = &SensorParamDetect[0];
for (i = 0; i < ARRAY_SIZE(SensorParamDetect); i++) {
if (main == NULL || SensorDetect->sub == NULL) {
vfe_warn("fetch_sensor_list main or SensorDetect->sub is NULL!\n");
continue;
}
sprintf(sub_name, "%s%d", SensorDetect->sub, j);
if (SensorDetect->type == INTEGER) {
if (cfg_get_one_subkey(cfg_section, main, sub_name, &subkey) != CFG_ITEM_VALUE_TYPE_INT) {
vfe_dbg(0, "Warning: %s->%s,apply default value!\n", main, SensorDetect->sub);
} else {
if (SensorDetect->set_param) {
SensorDetect->set_param(sensor_cfg_ini, (void *)&subkey.value.val, j);
vfe_dbg(0, "fetch sensor cfg ini: %s->%s = %d\n", main, sub_name, subkey.value.val);
}
}
} else if (SensorDetect->type == STRING) {
if (cfg_get_one_subkey(cfg_section, main, sub_name, &subkey) != CFG_ITEM_VALUE_TYPE_STR) {
vfe_dbg(0, "Warning: %s->%s,apply default value!\n", main, sub_name);
} else {
if (SensorDetect->set_param) {
if (!strcmp(subkey.value.str, "\"\""))
strcpy(subkey.value.str, "");
SensorDetect->set_param(sensor_cfg_ini, (void *)subkey.value.str, j);
vfe_dbg(0, "fetch sensor cfg ini: %s->%s = %s\n", main, sub_name, subkey.value.str);
}
}
}
SensorDetect++;
}
}
vfe_dbg(0, "fetch sensor_list done!\n");
return 0;
}
int parse_sensor_list_info(struct sensor_config_init *sensor_cfg_ini, char *pos)
{
int ret = 0;
struct cfg_section *cfg_section;
char sensor_list_cfg[128];
vfe_print("fetch %s sensor list info start!\n", pos);
sprintf(sensor_list_cfg, "/system/etc/hawkview/sensor_list_cfg.ini");
if (strcmp(pos, "rear") && strcmp(pos, "REAR") && strcmp(pos, "FRONT") && strcmp(pos, "front"))
vfe_err("Camera position config ERR! POS = %s, please check the key <csi(x)_sensor_pos> in sys_config!\n", pos);
vfe_print("Fetch sensor list form\"%s\"\n", sensor_list_cfg);
cfg_section_init(&cfg_section);
ret = cfg_read_ini(sensor_list_cfg, &cfg_section);
if (ret == -1) {
cfg_section_release(&cfg_section);
goto parse_sensor_list_info_end;
}
if (strcmp(pos, "rear") == 0 || strcmp(pos, "REAR") == 0)
fetch_sensor_list(sensor_cfg_ini, "rear_camera_cfg", cfg_section);
else
fetch_sensor_list(sensor_cfg_ini, "front_camera_cfg", cfg_section);
cfg_section_release(&cfg_section);
parse_sensor_list_info_end:
vfe_print("fetch %s sensor list info end!\n", pos);
return ret;
}
struct ccm_config ccm0_def_cfg[] = {
{
.ccm = "ov5640",
.twi_id = 1,
.i2c_addr = 0x78,
.is_isp_used = 0,
.is_bayer_raw = 0,
.vflip = 0,
.hflip = 0,
.iovdd_str = "",
.avdd_str = "",
.dvdd_str = "",
.afvdd_str = "",
.flvdd_str = "",
.power = {
.stby_mode = 1,
.iovdd_vol = 2800000, /* voltage of sensor module for interface */
.avdd_vol = 2800000, /* voltage of sensor module for analog */
.dvdd_vol = 1500000, /* voltage of sensor module for core */
.afvdd_vol = 2800000, /* voltage of sensor module for vcm sink */
.flvdd_vol = 3300000,/* voltage of sensor module for flash led */
},
.gpio = {
[MCLK_PIN] = {.gpio = GPIOE(1)/*129*/, .mul_sel = 1, .pull = 0, .drv_level = 1, .data = 0,},
[RESET] = {GPIOE(14)/*142*/, 1, 0, 1, 0,},
[PWDN] = {GPIOE(15)/*143*/, 1, 0, 1, 0,},
[POWER_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
[FLASH_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
[FLASH_MODE] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
[AF_PWDN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
},
.flash_used = 0,
.flash_type = 0,
.act_used = 0,
.act_name = "ad5820_act",
.act_slave = 0x18,
},
};
struct ccm_config ccm1_def_cfg[] = {
};
static int get_value_int(struct device_node *np, const char *name, u32 *value)
{
int ret;
ret = of_property_read_u32(np, name, value);
if (ret) {
*value = 0;
vfe_warn("fetch %s from device_tree failed\n", name);
return -EINVAL;
}
vfe_dbg(0, "%s = %x\n", name, *value);
return 0;
}
static int get_value_string(struct device_node *np, const char *name, char *string)
{
int ret;
const char *const_str;
ret = of_property_read_string(np, name, &const_str);
if (ret) {
strcpy(string, "");
vfe_warn("fetch %s from device_tree failed\n", name);
return -EINVAL;
}
strcpy(string, const_str);
vfe_dbg(0, "%s = %s\n", name, string);
return 0;
}
static int get_gpio_info(struct device_node *np, const char *name, struct vfe_gpio_cfg *vgc)
{
unsigned int gnum;
struct gpio_config *gc = (struct gpio_config *)vgc;
gnum = of_get_named_gpio_flags(np, name, 0, (enum of_gpio_flags *)gc);
if (!gpio_is_valid(gnum)) {
vgc->gpio = GPIO_INDEX_INVALID;
vfe_warn("fetch %s from device_tree failed\n", name);
return -EINVAL;
}
vfe_dbg(0, "%s: pin=%d mul-sel=%d drive=%d pull=%d data=%d gnum=%d\n",
name,
gc->gpio,
gc->mul_sel,
gc->drv_level,
gc->pull,
gc->data,
gnum);
return 0;
}
static int get_mname(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->ccm);
}
static int get_twi_addr(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->i2c_addr);
}
static int get_twi_id(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->twi_id);
}
static int get_pos(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->sensor_pos);
}
static int get_isp_used(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->is_isp_used);
}
static int get_fmt(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->is_bayer_raw);
}
static int get_standy(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->power.stby_mode);
}
static int get_vflip(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->vflip);
}
static int get_hflip(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->hflip);
}
static int get_iovdd(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->iovdd_str);
}
static int get_iovdd_vol(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->power.iovdd_vol);
}
static int get_avdd(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->avdd_str);
}
static int get_avdd_vol(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->power.avdd_vol);
}
static int get_dvdd(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->dvdd_str);
}
static int get_dvdd_vol(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->power.dvdd_vol);
}
static int get_afvdd(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->afvdd_str);
}
static int get_afvdd_vol(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->power.afvdd_vol);
}
static int get_power_en(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_gpio_info(np, name, &cc->gpio[POWER_EN]);
}
static int get_reset(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_gpio_info(np, name, &cc->gpio[RESET]);
}
static int get_pwdn(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_gpio_info(np, name, &cc->gpio[PWDN]);
}
static int get_flash_used(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->flash_used);
}
static int get_flash_type(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->flash_type);
}
static int get_flash_en(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_gpio_info(np, name, &cc->gpio[FLASH_EN]);
}
static int get_flash_mode(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_gpio_info(np, name, &cc->gpio[FLASH_MODE]);
}
static int get_flvdd(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->flvdd_str);
}
static int get_flvdd_vol(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->power.flvdd_vol);
}
static int get_af_pwdn(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_gpio_info(np, name, &cc->gpio[AF_PWDN]);
}
static int get_act_used(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->act_used);
}
static int get_act_name(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_string(np, name, cc->act_name);
}
static int get_act_slave(struct device_node *np, const char *name, struct ccm_config *cc)
{
return get_value_int(np, name, &cc->act_slave);
}
struct FetchFunArr {
char *sub;
int flag;
int (*fun)(struct device_node *, const char *, struct ccm_config *);
};
static struct FetchFunArr fetch_fun[] = {
{"mname", 0, get_mname,},
{"twi_addr", 0, get_twi_addr,},
{"twi_id", 1, get_twi_id,},
{"pos", 1, get_pos,},
{"isp_used", 1, get_isp_used,},
{"fmt", 1, get_fmt,},
{"stby_mode", 1, get_standy,},
{"vflip", 1, get_vflip,},
{"hflip", 1, get_hflip,},
{"iovdd", 1, get_iovdd,},
{"iovdd_vol", 1, get_iovdd_vol,},
{"avdd", 1, get_avdd,},
{"avdd_vol", 1, get_avdd_vol,},
{"dvdd", 1, get_dvdd,},
{"dvdd_vol", 1, get_dvdd_vol,},
{"afvdd", 1, get_afvdd,},
{"afvdd_vol", 1, get_afvdd_vol,},
{"power_en", 1, get_power_en,},
{"reset", 1, get_reset,},
{"pwdn", 1, get_pwdn,},
{"flash_used", 1, get_flash_used,},
{"flash_type", 1, get_flash_type,},
{"flash_en", 1, get_flash_en,},
{"flash_mode", 1, get_flash_mode,},
{"flvdd", 1, get_flvdd,},
{"flvdd_vol", 1, get_flvdd_vol,},
{"af_pwdn", 1, get_af_pwdn,},
{"act_used", 1, get_act_used,},
{"act_name", 0, get_act_name,},
{"act_slave", 0, get_act_slave,},
};
int fetch_config(struct vfe_dev *dev)
{
#ifdef FPGA_VER
unsigned int i, j;
struct ccm_config *ccm_def_cfg = ccm0_def_cfg;
if (dev->id == 0)
ccm_def_cfg = ccm0_def_cfg;
else
ccm_def_cfg = ccm1_def_cfg;
dev->dev_qty = 1;
dev->vip_define_sensor_list = 0;
for (i = 0; i < dev->dev_qty; i++) {
dev->ccm_cfg[i]->twi_id = ccm_def_cfg[i].twi_id;
if (dev->ccm_cfg[i]->i2c_addr == 0xff) {
strcpy(dev->ccm_cfg[i]->ccm, ccm_def_cfg[i].ccm);
strcpy(dev->ccm_cfg[i]->isp_cfg_name, ccm_def_cfg[i].ccm);
}
dev->ccm_cfg[i]->is_isp_used = ccm_def_cfg[i].is_isp_used;
dev->ccm_cfg[i]->is_bayer_raw = ccm_def_cfg[i].is_bayer_raw;
dev->ccm_cfg[i]->power.stby_mode = ccm_def_cfg[i].power.stby_mode;
dev->ccm_cfg[i]->vflip = ccm_def_cfg[i].vflip;
dev->ccm_cfg[i]->hflip = ccm_def_cfg[i].hflip;
strcpy(dev->ccm_cfg[i]->iovdd_str, ccm_def_cfg[i].iovdd_str);
dev->ccm_cfg[i]->power.iovdd_vol = ccm_def_cfg[i].power.iovdd_vol;
strcpy(dev->ccm_cfg[i]->avdd_str, ccm_def_cfg[i].avdd_str);
dev->ccm_cfg[i]->power.avdd_vol = ccm_def_cfg[i].power.avdd_vol;
strcpy(dev->ccm_cfg[i]->dvdd_str, ccm_def_cfg[i].dvdd_str);
dev->ccm_cfg[i]->power.dvdd_vol = ccm_def_cfg[i].power.dvdd_vol;
strcpy(dev->ccm_cfg[i]->afvdd_str, ccm_def_cfg[i].afvdd_str);
dev->ccm_cfg[i]->power.afvdd_vol = ccm_def_cfg[i].power.afvdd_vol;
strcpy(dev->ccm_cfg[i]->flvdd_str, ccm_def_cfg[i].flvdd_str);
dev->ccm_cfg[i]->power.flvdd_vol = ccm_def_cfg[i].power.flvdd_vol;
dev->ccm_cfg[i]->flash_used = ccm_def_cfg[i].flash_used;
dev->ccm_cfg[i]->flash_type = ccm_def_cfg[i].flash_type;
dev->ccm_cfg[i]->act_used = ccm_def_cfg[i].act_used;
if (dev->ccm_cfg[i]->act_slave == 0xff) {
strcpy(dev->ccm_cfg[i]->act_name, ccm_def_cfg[i].act_name);
dev->ccm_cfg[i]->act_slave = ccm_def_cfg[i].act_slave;
}
for (j = 0; j < MAX_GPIO_NUM; j++) {
dev->ccm_cfg[i]->gpio[j].gpio = ccm_def_cfg[i].gpio[j].gpio;
dev->ccm_cfg[i]->gpio[j].mul_sel = ccm_def_cfg[i].gpio[j].mul_sel;
dev->ccm_cfg[i]->gpio[j].pull = ccm_def_cfg[i].gpio[j].pull;
dev->ccm_cfg[i]->gpio[j].drv_level = ccm_def_cfg[i].gpio[j].drv_level;
dev->ccm_cfg[i]->gpio[j].data = ccm_def_cfg[i].gpio[j].data;
}
}
#else
int i = 0, j = 0, NFUN = ARRAY_SIZE(fetch_fun);
struct device_node *parent = dev->pdev->dev.of_node;
struct device_node *np;
char property_name[32] = {0};
for_each_available_child_of_node(parent, np) {
if ((dev->ccm_cfg[i]->i2c_addr == 0xff) && (!strcmp(dev->ccm_cfg[0]->ccm, ""))) { /* when insmod without parm */
fetch_fun[0].flag = 1;
fetch_fun[1].flag = 1;
}
/* fetch actuator issue */
if ((dev->ccm_cfg[i]->act_slave == 0xff) && (!strcmp(dev->ccm_cfg[i]->act_name, ""))) {/* when insmod without parm */
fetch_fun[NFUN - 1].flag = 1;
fetch_fun[NFUN - 2].flag = 1;
}
for (j = 0; j < NFUN; j++) {
if (fetch_fun[j].flag) {
sprintf(property_name, "csi%d_dev%d_%s", dev->id, i, fetch_fun[j].sub);
fetch_fun[j].fun(np, property_name, dev->ccm_cfg[i]);
}
}
strcpy(dev->ccm_cfg[i]->isp_cfg_name, dev->ccm_cfg[i]->ccm);
i++;
}
dev->dev_qty = i;
if (dev->vip_define_sensor_list == 0xff) {
sprintf(property_name, "csi%d_sensor_list", dev->id);
get_value_int(parent, property_name, &dev->vip_define_sensor_list);
}
for (i = 0; i < dev->dev_qty; i++) {
sprintf(property_name, "csi%d_mck", dev->id);
get_gpio_info(parent, property_name, &dev->ccm_cfg[i]->gpio[MCLK_PIN]);
dev->ccm_cfg[i]->sensor_cfg_ini = kzalloc(sizeof(struct sensor_config_init), GFP_KERNEL);
if (!dev->ccm_cfg[i]->sensor_cfg_ini) {
vfe_err("Sensor cfg ini kzalloc failed!\n");
return -ENOMEM;
}
if (dev->vip_define_sensor_list == 1) {
if (!strcmp(dev->ccm_cfg[i]->sensor_pos, ""))
strcpy(dev->ccm_cfg[i]->sensor_pos, "rear");
parse_sensor_list_info(dev->ccm_cfg[i]->sensor_cfg_ini, dev->ccm_cfg[i]->sensor_pos);
}
}
#endif
for (i = 0; i < dev->dev_qty; i++) {
vfe_dbg(0, "dev->ccm_cfg[%d]->ccm = %s\n", i, dev->ccm_cfg[i]->ccm);
vfe_dbg(0, "dev->ccm_cfg[%d]->twi_id = %x\n", i, dev->ccm_cfg[i]->twi_id);
vfe_dbg(0, "dev->ccm_cfg[%d]->i2c_addr = %x\n", i, dev->ccm_cfg[i]->i2c_addr);
vfe_dbg(0, "dev->ccm_cfg[%d]->is_isp_used = %x\n", i, dev->ccm_cfg[i]->is_isp_used);
vfe_dbg(0, "dev->ccm_cfg[%d]->is_bayer_raw = %x\n", i, dev->ccm_cfg[i]->is_bayer_raw);
vfe_dbg(0, "dev->ccm_cfg[%d]->vflip = %x\n", i, dev->ccm_cfg[i]->vflip);
vfe_dbg(0, "dev->ccm_cfg[%d]->hflip = %x\n", i, dev->ccm_cfg[i]->hflip);
vfe_dbg(0, "dev->ccm_cfg[%d]->iovdd_str = %s\n", i, dev->ccm_cfg[i]->iovdd_str);
vfe_dbg(0, "dev->ccm_cfg[%d]->avdd_str = %s\n", i, dev->ccm_cfg[i]->avdd_str);
vfe_dbg(0, "dev->ccm_cfg[%d]->dvdd_str = %s\n", i, dev->ccm_cfg[i]->dvdd_str);
vfe_dbg(0, "dev->ccm_cfg[%d]->afvdd_str = %s\n", i, dev->ccm_cfg[i]->afvdd_str);
vfe_dbg(0, "dev->ccm_cfg[%d]->flvdd_str = %s\n", i, dev->ccm_cfg[i]->flvdd_str);
vfe_dbg(0, "dev->ccm_cfg[%d]->flash_used = %d\n", i, dev->ccm_cfg[i]->flash_used);
vfe_dbg(0, "dev->ccm_cfg[%d]->act_used = %d\n", i, dev->ccm_cfg[i]->act_used);
vfe_dbg(0, "dev->ccm_cfg[%d]->act_name = %s\n", i, dev->ccm_cfg[i]->act_name);
vfe_dbg(0, "dev->ccm_cfg[%d]->act_slave = 0x%x\n", i, dev->ccm_cfg[i]->act_slave);
}
return 0;
}
struct isp_init_config isp_init_def_cfg = {
.isp_test_settings = {
/*isp test param */
.isp_test_mode = 1,
.isp_test_exptime = 0,
.exp_line_start = 1000,
.exp_line_step = 16,
.exp_line_end = 10000,
.exp_change_interval = 5,
.isp_test_gain = 0,
.gain_start = 16,
.gain_step = 1,
.gain_end = 256,
.gain_change_interval = 3,
.isp_test_focus = 0,
.focus_start = 0,
.focus_step = 10,
.focus_end = 800,
.focus_change_interval = 2,
.isp_dbg_level = 0,
.isp_log_param = 0,
.isp_focus_len = 0,
.isp_gain = 64,
.isp_exp_line = 7680,
.isp_color_temp = 6500,
.ae_forced = 0,
.lum_forced = 40,
/*isp enable param */
.sprite_en = 0,
.lsc_en = 0,
.ae_en = 0,
.af_en = 0,
.awb_en = 0,
.drc_en = 0,
.defog_en = 0,
.satur_en = 0,
.tdf_en = 0,
.pri_contrast_en = 0,
.hdr_gamma_en = 0,
.disc_en = 0,
.linear_en = 0,
},
.isp_3a_settings = {
/*isp ae param */
.define_ae_table = 0,
.ae_max_lv = 1800,
.fno = 280,
.ae_hist_mod_en = 0,
.ae_window_overexp_weigth = 16,
.ae_hist_overexp_weight = 32,
.ae_video_speed = 4,
.ae_capture_speed = 8,
.ae_tolerance = 6,
.ae_min_frame_rate = 8,
.exp_delay_frame = 2,
.gain_delay_frame = 2,
.exp_comp_step = 8,
.adaptive_frame_rate = 1,
.high_quality_mode_en = 0,
.force_frame_rate = 0,
.ae_touch_dist_ind = 2,
.ae_lum_berfore_gamma = 0,
/*isp awb param */
.awb_interval = 4,
.awb_speed = 8,
/* .awb_mode_select = 1, */
.awb_color_temper_low = 2500,
.awb_color_temper_high = 7500,
.awb_base_temper = 6500,
.awb_skin_color_num = 0,
.awb_special_color_num = 0,
.awb_rgain_favor = 256,
.awb_bgain_favor = 256,
.af_use_otp = 0,
.vcm_min_code = 0,
.vcm_max_code = 650,
.af_interval_time = 100,
.af_speed_ind = 16, /*0~43*/
.af_auto_fine_en = 1,
.af_single_fine_en = 0,
.af_fine_step = 24,
.af_move_cnt = 4,
.af_still_cnt = 1,
.af_move_monitor_cnt = 6,
.af_still_monitor_cnt = 2,
.af_stable_min = 250,
.af_stable_max = 260,
.af_low_light_ind = 40,
.af_near_tolerance = 5,
.af_far_tolerance = 7,
.af_tolerance_off = 0,
.af_peak_th = 100,
.af_dir_th = 10,
.af_change_ratio = 20,
.af_move_minus = 1,
.af_still_minus = 1,
.af_scene_motion_th = 10,
.af_tolerance_tbl_len = 0,
},
.isp_tunning_settings = {
.flash_gain = 80,
.flash_delay_frame = 8,
.flicker_type = 1,
.flicker_ratio = 20,
/*isp_dpc_otf_param*/
.dpc_th_slop = 4,
.dpc_otf_min_th = 16,
.dpc_otf_max_th = 1024,
.cfa_dir_th = 500,
.front_camera = 0,
.defog_value = 200,
.hor_visual_angle = 60,
.ver_visual_angle = 60,
.focus_length = 425,
.use_bright_contrast = 0,
.low_bright_supp = 324,
.low_bright_drc = 24,
.color_denoise_level = 0,
/*isp tune param */
.bayer_gain_offset = {256, 256, 256, 256, 0, 0, 0, 0},
.csc_coeff = {1024, 1024, 1024, 1024, 1024, 1024},
.lsc_mod = 0,
.gamma_num = 1,
.lsc_center = {2048, 2048},
.lsc_tbl = {{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} },
.hdr_tbl = {{0}, {0}, {0}, {0} },
.gamma_tbl = {10, 20, 30, 40, 50, 60, 70, 80},
.color_matrix_ini[0] = {
.matrix = {{256, 0, 0}, {0, 256, 0}, {0, 0, 256} },
.offset = {0, 0, 0},
},
.color_matrix_ini[1] = {
.matrix = {{256, 0, 0}, {0, 256, 0}, {0, 0, 256} },
.offset = {0, 0, 0},
},
.color_matrix_ini[2] = {
.matrix = {{256, 0, 0}, {0, 256, 0}, {0, 0, 256} },
.offset = {0, 0, 0},
},
},
};
#define SET_ISP_SINGLE_VALUE(struct_name, key) \
static void set_##key(struct isp_init_config *isp_ini_cfg,\
void *value,\
int len)\
{\
isp_ini_cfg->struct_name.key = *(int *)value;\
}
#define SET_ISP_ARRAY_VALUE(struct_name, key) \
static void set_##key(struct isp_init_config *isp_ini_cfg,\
void *value,\
int len)\
{\
int i, *tmp;\
tmp = (int *)value;\
for (i = 0; i < len; i++) {\
isp_ini_cfg->struct_name.key[i] = tmp[i];\
} \
}
#define SET_ISP_ISO_VALUE(struct_name) \
static void set_##struct_name(struct isp_init_config *isp_ini_cfg,\
void *value,\
int len)\
{\
int i, *tmp, *cfg_pt;\
tmp = (int *)value;\
cfg_pt = &isp_ini_cfg->isp_iso_settings.struct_name.sharp_coeff[0];\
for (i = 0; i < len; i++) {\
cfg_pt[i] = tmp[i];\
} \
}
#define SET_ISP_CM_VALUE(num) \
static void set_color_matrix##num(struct isp_init_config *isp_ini_cfg,\
void *value,\
int len)\
{\
int *tmp = (int *)value;\
struct isp_rgb2rgb_gain_offset *color_matrix = &isp_ini_cfg->isp_tunning_settings.color_matrix_ini[num];\
color_matrix->matrix[0][0] = tmp[0];\
color_matrix->matrix[0][1] = tmp[1];\
color_matrix->matrix[0][2] = tmp[2];\
color_matrix->matrix[1][0] = tmp[3];\
color_matrix->matrix[1][1] = tmp[4];\
color_matrix->matrix[1][2] = tmp[5];\
color_matrix->matrix[2][0] = tmp[6];\
color_matrix->matrix[2][1] = tmp[7];\
color_matrix->matrix[2][2] = tmp[8];\
color_matrix->offset[0] = tmp[9];\
color_matrix->offset[1] = tmp[10];\
color_matrix->offset[2] = tmp[11];\
}
#define ISP_FILE_SINGLE_ATTR(main_key, sub_key)\
{\
#main_key, #sub_key, 1, set_##sub_key,\
}
#define ISP_FILE_ARRAY_ATTR(main_key, sub_key, len)\
{\
#main_key, #sub_key, len, set_##sub_key,\
}
#define ISP_FILE_ISO_ATTR(main_key, sub_key, len)\
{\
#main_key, #sub_key, len, set_##main_key,\
}
#define ISP_FILE_CM_ATTR(prefix, main_key, sub_key)\
{\
#prefix#main_key, #sub_key, 12, set_##main_key,\
}
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_test_mode);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_test_exptime);
SET_ISP_SINGLE_VALUE(isp_test_settings, exp_line_start);
SET_ISP_SINGLE_VALUE(isp_test_settings, exp_line_step);
SET_ISP_SINGLE_VALUE(isp_test_settings, exp_line_end);
SET_ISP_SINGLE_VALUE(isp_test_settings, exp_change_interval);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_test_gain);
SET_ISP_SINGLE_VALUE(isp_test_settings, gain_start);
SET_ISP_SINGLE_VALUE(isp_test_settings, gain_step);
SET_ISP_SINGLE_VALUE(isp_test_settings, gain_end);
SET_ISP_SINGLE_VALUE(isp_test_settings, gain_change_interval);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_test_focus);
SET_ISP_SINGLE_VALUE(isp_test_settings, focus_start);
SET_ISP_SINGLE_VALUE(isp_test_settings, focus_step);
SET_ISP_SINGLE_VALUE(isp_test_settings, focus_end);
SET_ISP_SINGLE_VALUE(isp_test_settings, focus_change_interval);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_dbg_level);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_log_param);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_focus_len);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_gain);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_exp_line);
SET_ISP_SINGLE_VALUE(isp_test_settings, isp_color_temp);
SET_ISP_SINGLE_VALUE(isp_test_settings, ae_forced);
SET_ISP_SINGLE_VALUE(isp_test_settings, lum_forced);
SET_ISP_SINGLE_VALUE(isp_test_settings, sprite_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, lsc_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, ae_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, af_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, awb_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, drc_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, defog_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, satur_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, tdf_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, pri_contrast_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, hdr_gamma_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, disc_en);
SET_ISP_SINGLE_VALUE(isp_test_settings, linear_en);
SET_ISP_SINGLE_VALUE(isp_3a_settings, define_ae_table);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_table_preview_length);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_table_capture_length);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_table_video_length);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_max_lv);
SET_ISP_SINGLE_VALUE(isp_3a_settings, fno);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_hist_mod_en);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_window_overexp_weigth);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_hist_overexp_weight);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_video_speed);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_capture_speed);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_tolerance);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_min_frame_rate);
SET_ISP_SINGLE_VALUE(isp_3a_settings, exp_delay_frame);
SET_ISP_SINGLE_VALUE(isp_3a_settings, gain_delay_frame);
SET_ISP_SINGLE_VALUE(isp_3a_settings, exp_comp_step);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_touch_dist_ind);
SET_ISP_SINGLE_VALUE(isp_3a_settings, ae_lum_berfore_gamma);
SET_ISP_SINGLE_VALUE(isp_3a_settings, high_quality_mode_en);
SET_ISP_SINGLE_VALUE(isp_3a_settings, adaptive_frame_rate);
SET_ISP_SINGLE_VALUE(isp_3a_settings, force_frame_rate);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_interval);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_speed);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_color_temper_low);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_color_temper_high);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_base_temper);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_rgain_favor);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_bgain_favor);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_light_num);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_ext_light_num);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_skin_color_num);
SET_ISP_SINGLE_VALUE(isp_3a_settings, awb_special_color_num);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_use_otp);
SET_ISP_SINGLE_VALUE(isp_3a_settings, vcm_min_code);
SET_ISP_SINGLE_VALUE(isp_3a_settings, vcm_max_code);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_interval_time);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_speed_ind);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_auto_fine_en);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_single_fine_en);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_fine_step);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_move_cnt);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_still_cnt);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_move_monitor_cnt);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_still_monitor_cnt);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_stable_min);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_stable_max);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_low_light_ind);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_near_tolerance);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_far_tolerance);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_tolerance_off);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_peak_th);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_dir_th);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_change_ratio);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_move_minus);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_still_minus);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_scene_motion_th);
SET_ISP_SINGLE_VALUE(isp_3a_settings, af_tolerance_tbl_len);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, flash_gain);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, flash_delay_frame);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, flicker_type);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, flicker_ratio);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, dpc_th_slop);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, dpc_otf_min_th);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, dpc_otf_max_th);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, cfa_dir_th);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, front_camera);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, defog_value);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, hor_visual_angle);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, ver_visual_angle);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, focus_length);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, use_bright_contrast);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, low_bright_supp);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, low_bright_drc);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, color_denoise_level);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, lsc_mod);
SET_ISP_SINGLE_VALUE(isp_tunning_settings, gamma_num);
void set_lsc_center_x(struct isp_init_config *isp_ini_cfg, void *value, int len)
{
isp_ini_cfg->isp_tunning_settings.lsc_center[0] = *(int *)value;
}
void set_lsc_center_y(struct isp_init_config *isp_ini_cfg, void *value, int len)
{
isp_ini_cfg->isp_tunning_settings.lsc_center[1] = *(int *)value;
}
SET_ISP_ARRAY_VALUE(isp_3a_settings, awb_light_info);
SET_ISP_ARRAY_VALUE(isp_3a_settings, awb_ext_light_info);
SET_ISP_ARRAY_VALUE(isp_3a_settings, awb_skin_color_info);
SET_ISP_ARRAY_VALUE(isp_3a_settings, awb_special_color_info);
SET_ISP_ARRAY_VALUE(isp_3a_settings, awb_preset_gain);
SET_ISP_ARRAY_VALUE(isp_3a_settings, ae_table_preview);
SET_ISP_ARRAY_VALUE(isp_3a_settings, ae_table_capture);
SET_ISP_ARRAY_VALUE(isp_3a_settings, ae_table_video);
SET_ISP_ARRAY_VALUE(isp_3a_settings, ae_win_weight);
SET_ISP_ARRAY_VALUE(isp_3a_settings, af_std_code_tbl);
SET_ISP_ARRAY_VALUE(isp_3a_settings, af_tolerance_value_tbl);
SET_ISP_ARRAY_VALUE(isp_tunning_settings, bayer_gain_offset);
SET_ISP_ARRAY_VALUE(isp_tunning_settings, csc_coeff);
SET_ISP_ISO_VALUE(isp_iso_100_cfg);
SET_ISP_ISO_VALUE(isp_iso_200_cfg);
SET_ISP_ISO_VALUE(isp_iso_400_cfg);
SET_ISP_ISO_VALUE(isp_iso_800_cfg);
SET_ISP_ISO_VALUE(isp_iso_1600_cfg);
SET_ISP_ISO_VALUE(isp_iso_3200_cfg);
SET_ISP_CM_VALUE(0);
SET_ISP_CM_VALUE(1);
SET_ISP_CM_VALUE(2);
struct IspParamAttribute {
char *main;
char *sub;
int len;
void (*set_param)(struct isp_init_config *, void *, int len);
};
struct FileAttribute {
char *file_name;
int param_len;
struct IspParamAttribute *pIspParam;
};
static struct IspParamAttribute IspTestParam[] = {
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_test_mode),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_test_exptime),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, exp_line_start),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, exp_line_step),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, exp_line_end),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, exp_change_interval),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_test_gain),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, gain_start),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, gain_step),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, gain_end),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, gain_change_interval),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_test_focus),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, focus_start),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, focus_step),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, focus_end),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, focus_change_interval),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_dbg_level),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_log_param),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_focus_len),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_gain),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_exp_line),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, isp_color_temp),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, ae_forced),
ISP_FILE_SINGLE_ATTR(isp_test_cfg, lum_forced),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, sprite_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, lsc_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, ae_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, af_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, awb_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, drc_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, defog_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, satur_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, tdf_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, pri_contrast_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, hdr_gamma_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, disc_en),
ISP_FILE_SINGLE_ATTR(isp_en_cfg, linear_en),
};
static struct IspParamAttribute Isp3aParam[] = {
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, define_ae_table),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_max_lv),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, fno),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_table_preview_length),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_table_capture_length),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_table_video_length),
ISP_FILE_ARRAY_ATTR(isp_ae_cfg, ae_table_preview, 28),
ISP_FILE_ARRAY_ATTR(isp_ae_cfg, ae_table_capture, 28),
ISP_FILE_ARRAY_ATTR(isp_ae_cfg, ae_table_video, 28),
ISP_FILE_ARRAY_ATTR(isp_ae_cfg, ae_win_weight, 64),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_hist_mod_en),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_window_overexp_weigth),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_hist_overexp_weight),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_video_speed),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_capture_speed),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_tolerance),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_min_frame_rate),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, exp_delay_frame),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, gain_delay_frame),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, exp_comp_step),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, high_quality_mode_en),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, adaptive_frame_rate),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, force_frame_rate),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_touch_dist_ind),
ISP_FILE_SINGLE_ATTR(isp_ae_cfg, ae_lum_berfore_gamma),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_interval),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_speed),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_color_temper_low),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_color_temper_high),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_base_temper),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_light_num),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_ext_light_num),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_skin_color_num),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_special_color_num),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_rgain_favor),
ISP_FILE_SINGLE_ATTR(isp_awb_cfg, awb_bgain_favor),
ISP_FILE_ARRAY_ATTR(isp_awb_cfg, awb_light_info, 100),
ISP_FILE_ARRAY_ATTR(isp_awb_cfg, awb_ext_light_info, 60),
ISP_FILE_ARRAY_ATTR(isp_awb_cfg, awb_skin_color_info, 40),
ISP_FILE_ARRAY_ATTR(isp_awb_cfg, awb_special_color_info, 40),
{"isp_awb_cfg", "awb_perset_gain", 22, set_awb_preset_gain,},
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_use_otp),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, vcm_min_code),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, vcm_max_code),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_interval_time),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_speed_ind),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_auto_fine_en),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_single_fine_en),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_fine_step),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_move_cnt),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_still_cnt),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_move_monitor_cnt),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_still_monitor_cnt),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_stable_min),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_stable_max),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_low_light_ind),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_near_tolerance),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_far_tolerance),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_tolerance_off),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_peak_th),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_dir_th),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_change_ratio),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_move_minus),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_still_minus),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_scene_motion_th),
ISP_FILE_SINGLE_ATTR(isp_af_cfg, af_tolerance_tbl_len),
ISP_FILE_ARRAY_ATTR(isp_af_cfg, af_std_code_tbl, 20),
ISP_FILE_ARRAY_ATTR(isp_af_cfg, af_tolerance_value_tbl, 20),
};
static struct IspParamAttribute IspIsoParam[] = {
ISP_FILE_ISO_ATTR(isp_iso_100_cfg, iso_param, 64),
ISP_FILE_ISO_ATTR(isp_iso_200_cfg, iso_param, 64),
ISP_FILE_ISO_ATTR(isp_iso_400_cfg, iso_param, 64),
ISP_FILE_ISO_ATTR(isp_iso_800_cfg, iso_param, 64),
ISP_FILE_ISO_ATTR(isp_iso_1600_cfg, iso_param, 64),
ISP_FILE_ISO_ATTR(isp_iso_3200_cfg, iso_param, 64),
};
static struct IspParamAttribute IspTuningParam[] = {
ISP_FILE_SINGLE_ATTR(isp_drc_cfg, use_bright_contrast),
ISP_FILE_SINGLE_ATTR(isp_drc_cfg, low_bright_supp),
ISP_FILE_SINGLE_ATTR(isp_drc_cfg, low_bright_drc),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, color_denoise_level),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, flash_gain),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, flash_delay_frame),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, cfa_dir_th),
ISP_FILE_SINGLE_ATTR(isp_dpc_cfg, dpc_th_slop),
ISP_FILE_SINGLE_ATTR(isp_dpc_cfg, dpc_otf_min_th),
ISP_FILE_SINGLE_ATTR(isp_dpc_cfg, dpc_otf_max_th),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, flicker_type),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, flicker_ratio),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, front_camera),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, defog_value),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, hor_visual_angle),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, ver_visual_angle),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, focus_length),
ISP_FILE_SINGLE_ATTR(isp_tuning_cfg, gamma_num),
ISP_FILE_SINGLE_ATTR(isp_lsc, lsc_mod),
ISP_FILE_SINGLE_ATTR(isp_lsc, lsc_center_x),
ISP_FILE_SINGLE_ATTR(isp_lsc, lsc_center_y),
{"isp_gain_offset", "gain_offset", 8, set_bayer_gain_offset,},
ISP_FILE_ARRAY_ATTR(isp_csc, csc_coeff, 6),
ISP_FILE_CM_ATTR(isp_, color_matrix0, matrix),
ISP_FILE_CM_ATTR(isp_, color_matrix1, matrix),
ISP_FILE_CM_ATTR(isp_, color_matrix2, matrix),
};
static struct FileAttribute FileAttr[] = {
{"isp_test_param.ini", ARRAY_SIZE(IspTestParam), &IspTestParam[0],},
{"isp_3a_param.ini", ARRAY_SIZE(Isp3aParam), &Isp3aParam[0],},
{"isp_iso_param.ini", ARRAY_SIZE(IspIsoParam), &IspIsoParam[0],},
{"isp_tuning_param.ini", ARRAY_SIZE(IspTuningParam), &IspTuningParam[0],},
};
int fetch_isp_cfg(struct isp_init_config *isp_ini_cfg,
struct cfg_section *cfg_section,
struct FileAttribute *file_attr)
{
int i, j, *array_value;
struct cfg_subkey subkey;
struct IspParamAttribute *param;
char sub_name[128] = {0};
/* fetch ISP isp_test_mode! */
for (i = 0; i < file_attr->param_len; i++) {
param = file_attr->pIspParam + i;
if (param->main == NULL || param->sub == NULL) {
vfe_warn("param->main or param->sub is NULL!\n");
continue;
}
if (param->len == 1) {
if (cfg_get_one_subkey(cfg_section, param->main, param->sub, &subkey) != CFG_ITEM_VALUE_TYPE_INT) {
vfe_dbg(0, "Warning: %s->%s,apply default value!\n", param->main, param->sub);
} else {
if (param->set_param) {
param->set_param(isp_ini_cfg, (void *)&subkey.value.val, param->len);
vfe_dbg(0, "fetch_isp_cfg_single: %s->%s = %d\n", param->main, param->sub, subkey.value.val);
}
}
} else if (param->len > 1) {
if (!strcmp(param->sub, "awb_light_info"))
param->len = 10 * isp_ini_cfg->isp_3a_settings.awb_light_num;
if (!strcmp(param->sub, "awb_ext_light_info"))
param->len = 10 * isp_ini_cfg->isp_3a_settings.awb_ext_light_num;
if (!strcmp(param->sub, "awb_skin_color_info"))
param->len = 10 * isp_ini_cfg->isp_3a_settings.awb_skin_color_num;
if (!strcmp(param->sub, "awb_special_color_info"))
param->len = 10 * isp_ini_cfg->isp_3a_settings.awb_special_color_num;
if (!strcmp(param->sub, "af_std_code_tbl"))
param->len = isp_ini_cfg->isp_3a_settings.af_tolerance_tbl_len;
if (!strcmp(param->sub, "af_tolerance_value_tbl"))
param->len = isp_ini_cfg->isp_3a_settings.af_tolerance_tbl_len;
if (param->len) {
array_value = (int *)vmalloc(param->len*sizeof(int));
memset(array_value, 0, param->len*sizeof(int));
} else
array_value = NULL;
for (j = 0; j < param->len; j++) {
sprintf(sub_name, "%s_%d", param->sub, j);
if (cfg_get_one_subkey(cfg_section, param->main, sub_name, &subkey) != CFG_ITEM_VALUE_TYPE_INT) {
if (strcmp(param->sub, "iso_param"))
vfe_warn("fetch %s from %s failed, set %s = 0!\n", sub_name, param->main, sub_name);
array_value[j] = 0;
} else {
array_value[j] = subkey.value.val;
vfe_dbg(0, "fetch_isp_cfg_array: %s->%s = %d\n", param->main, sub_name, subkey.value.val);
}
}
if (param->set_param && array_value)
param->set_param(isp_ini_cfg, (void *)array_value, param->len);
if (array_value)
vfree(array_value);
}
}
vfe_dbg(0, "fetch isp_cfg done!\n");
return 0;
}
int fetch_isp_tbl(struct isp_init_config *isp_ini_cfg, char *tbl_patch)
{
int len, ret = 0;
char isp_gamma_tbl_path[128] = "\0", isp_hdr_tbl_path[128] = "\0", isp_lsc_tbl_path[128] = "\0";
char *buf;
strcpy(isp_gamma_tbl_path, tbl_patch);
strcpy(isp_hdr_tbl_path, tbl_patch);
strcpy(isp_lsc_tbl_path, tbl_patch);
strcat(isp_gamma_tbl_path, "gamma_tbl.bin");
strcat(isp_hdr_tbl_path, "hdr_tbl.bin");
strcat(isp_lsc_tbl_path, "lsc_tbl.bin");
vfe_print("Fetch table form \"%s\", gamma num = %d\n", isp_gamma_tbl_path, isp_ini_cfg->isp_tunning_settings.gamma_num);
buf = (char *)kzalloc(SIZE_OF_LSC_TBL_MOD2, GFP_KERNEL);
/* fetch gamma_tbl table! */
if (isp_ini_cfg->isp_tunning_settings.gamma_num > 1 && isp_ini_cfg->isp_tunning_settings.gamma_num <= 5)
len = cfg_read_file(isp_gamma_tbl_path, buf, ISP_GAMMA_MEM_SIZE * isp_ini_cfg->isp_tunning_settings.gamma_num);
else
len = cfg_read_file(isp_gamma_tbl_path, buf, ISP_GAMMA_MEM_SIZE);
if (len < 0) {
vfe_warn("read gamma_tbl from gamma_tbl.bin failed!\n");
ret = -1;
} else {
if (isp_ini_cfg->isp_tunning_settings.gamma_num > 1) {
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl_ini, buf, len);
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl, buf, ISP_GAMMA_MEM_SIZE);
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl_post, buf, ISP_GAMMA_MEM_SIZE);
} else {
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl_ini, buf, len);
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl, buf, len);
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl_post, buf, len);
}
}
/* fetch lsc table! */
if (isp_ini_cfg->isp_tunning_settings.lsc_mod == 0) {
len = cfg_read_file(isp_lsc_tbl_path, buf, SIZE_OF_LSC_TBL_MOD0);
} else if (isp_ini_cfg->isp_tunning_settings.lsc_mod == 1) {
len = cfg_read_file(isp_lsc_tbl_path, buf, SIZE_OF_LSC_TBL_MOD1);
} else {
len = cfg_read_file(isp_lsc_tbl_path, buf, SIZE_OF_LSC_TBL_MOD2);
if (len != SIZE_OF_LSC_TBL_MOD2)
vfe_warn("read lsc_tbl from lsc_tbl.bin len = %d, but %d is required\n", len, SIZE_OF_LSC_TBL_MOD2);
}
if (len < 0) {
vfe_warn("read lsc_tbl from lsc_tbl.bin failed!\n");
ret = -1;
} else
memcpy(isp_ini_cfg->isp_tunning_settings.lsc_tbl, buf, len);
/* fetch hdr_tbl table!*/
if (0 != ISP_LINEAR_MEM_SIZE && 0 != ISP_DISC_MEM_SIZE) {
vfe_print("read disc and linear table!\n");
len = cfg_read_file(isp_hdr_tbl_path, buf, ISP_LINEAR_MEM_SIZE + ISP_DISC_MEM_SIZE);
if (len < 0)
vfe_warn("read hdr_tbl, linear_tbl and disc_tbl from hdr_tbl.bin failed!\n");
else {
/* memcpy(isp_ini_cfg->isp_tunning_settings.hdr_tbl, buf, 4*ISP_DRC_MEM_SIZE);*/
memcpy(isp_ini_cfg->isp_tunning_settings.linear_tbl, buf, ISP_LINEAR_MEM_SIZE);
memcpy(isp_ini_cfg->isp_tunning_settings.disc_tbl, buf + ISP_LINEAR_MEM_SIZE, ISP_DISC_MEM_SIZE);
}
}
kfree(buf);
return ret;
}
int match_isp_cfg(struct vfe_dev *dev, int isp_id)
{
int ret;
struct isp_cfg_item isp_cfg_tmp;
struct isp_init_config *isp_ini_cfg = &dev->isp_gen_set[isp_id]->isp_ini_cfg;
ret = get_isp_cfg(dev->ccm_cfg[isp_id]->isp_cfg_name, &isp_cfg_tmp);
if (ret < 0)
return -1;
isp_ini_cfg->isp_3a_settings = *isp_cfg_tmp.isp_cfg->isp_3a_settings;
isp_ini_cfg->isp_test_settings = *isp_cfg_tmp.isp_cfg->isp_test_settings;
isp_ini_cfg->isp_tunning_settings = *isp_cfg_tmp.isp_cfg->isp_tunning_settings;
isp_ini_cfg->isp_iso_settings = *isp_cfg_tmp.isp_cfg->isp_iso_settings;
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl, isp_ini_cfg->isp_tunning_settings.gamma_tbl_ini, ISP_GAMMA_MEM_SIZE);
memcpy(isp_ini_cfg->isp_tunning_settings.gamma_tbl_post, isp_ini_cfg->isp_tunning_settings.gamma_tbl_ini, ISP_GAMMA_MEM_SIZE);
return 0;
}
int read_ini_info(struct vfe_dev *dev, int isp_id, char *main_path)
{
int i, ret = 0;
char isp_cfg_path[128], isp_tbl_path[128], file_name_path[128];
struct cfg_section *cfg_section;
struct file *fp;
if (dev->ccm_cfg[isp_id] != NULL && strcmp(dev->ccm_cfg[isp_id]->isp_cfg_name, "") != 0) {
sprintf(isp_cfg_path, "%s%s/", main_path, dev->ccm_cfg[isp_id]->isp_cfg_name);
sprintf(isp_tbl_path, "%s%s/bin/", main_path, dev->ccm_cfg[isp_id]->isp_cfg_name);
/*
*sprintf(isp_cfg_path, "/system/etc/hawkview/%s/", dev->ccm_cfg[isp_id]->isp_cfg_name);
*sprintf(isp_tbl_path, "/system/etc/hawkview/%s/bin/", dev->ccm_cfg[isp_id]->isp_cfg_name);
*sprintf(isp_cfg_path, "/mnt/extsd/hawkview/%s/", dev->ccm_cfg[isp_id]->isp_cfg_name);
*sprintf(isp_tbl_path, "/mnt/extsd/hawkview/%s/bin/", dev->ccm_cfg[isp_id]->isp_cfg_name);
*/
} else {
sprintf(isp_cfg_path, "/system/etc/hawkview/camera.ini");
sprintf(isp_tbl_path, "/system/etc/hawkview/bin/");
}
sprintf(file_name_path, "%s%s", isp_cfg_path, FileAttr[0].file_name);
fp = filp_open(isp_cfg_path, O_RDONLY, 0);
if (IS_ERR(fp)) {
vfe_print("Check open %s failed!\nMatch isp cfg start!\n", file_name_path);
if (match_isp_cfg(dev, isp_id) == 0) {
vfe_print("Match isp cfg ok\n");
goto read_ini_info_end;
}
}
vfe_print("read ini start\n");
dev->isp_gen_set[isp_id]->isp_ini_cfg = isp_init_def_cfg;
for (i = 0; i < ARRAY_SIZE(FileAttr); i++) {
sprintf(file_name_path, "%s%s", isp_cfg_path, FileAttr[i].file_name);
vfe_print("Fetch ini file form \"%s\"\n", file_name_path);
cfg_section_init(&cfg_section);
ret = cfg_read_ini(file_name_path, &cfg_section);
if (ret == -1) {
cfg_section_release(&cfg_section);
goto read_ini_info_end;
}
fetch_isp_cfg(&dev->isp_gen_set[isp_id]->isp_ini_cfg, cfg_section, &FileAttr[i]);
cfg_section_release(&cfg_section);
}
ret = fetch_isp_tbl(&dev->isp_gen_set[isp_id]->isp_ini_cfg, &isp_tbl_path[0]);
if (ret == -1)
dev->isp_gen_set[isp_id]->isp_ini_cfg = isp_init_def_cfg;
read_ini_info_end:
vfe_dbg(0, "read ini end\n");
return ret;
}