/*
|
******************************************************************************
|
*
|
* isp_manage.c
|
*
|
* Hawkview ISP - isp_manage.c module
|
*
|
* Copyright (c) 2016 by Allwinnertech Co., Ltd. http://www.allwinnertech.com
|
*
|
* Version Author Date Description
|
*
|
* 3.0 Yang Feng 2016/06/06 VIDEO INPUT
|
*
|
*****************************************************************************
|
*/
|
|
#include "../include/isp_comm.h"
|
#include "../include/isp_module_cfg.h"
|
#include "../include/isp_manage.h"
|
#include "../include/isp_debug.h"
|
#include "../include/isp_base.h"
|
#include "../isp_math/isp_math_util.h"
|
#include "isp_otp_golden.h"
|
|
|
unsigned int isp_manage_lib_log_param = 0;//0xffffffff;
|
unsigned int msc_update_sel;
|
|
void isp_get_saved_regs(struct isp_lib_context *isp_gen)
|
{
|
FUNCTION_LOG;
|
//isp_gen->stat.min_rgb_saved = bsp_isp_get_saved_cfa_min_rgb();
|
//isp_gen->stat.c_noise_saved = bsp_isp_get_saved_cnr_noise();
|
FUNCTION_LOG;
|
}
|
|
void isp_rolloff_set_params_helper(isp_rolloff_entity_context_t *isp_rolloff_cxt, rolloff_param_type_t cmd_type)
|
{
|
if (!isp_rolloff_cxt->rolloff_entity || !isp_rolloff_cxt->ops || !isp_rolloff_cxt->rolloff_param)
|
return;
|
|
isp_rolloff_cxt->rolloff_param->type = cmd_type;
|
isp_rolloff_cxt->ops->isp_rolloff_set_params(isp_rolloff_cxt->rolloff_entity,
|
isp_rolloff_cxt->rolloff_param, &isp_rolloff_cxt->rolloff_result);
|
}
|
|
void isp_afs_set_params_helper(isp_afs_entity_context_t *isp_afs_cxt, afs_param_type_t cmd_type)
|
{
|
if (!isp_afs_cxt->afs_entity || !isp_afs_cxt->ops || !isp_afs_cxt->afs_param)
|
return;
|
|
isp_afs_cxt->afs_param->type = cmd_type;
|
isp_afs_cxt->ops->isp_afs_set_params(isp_afs_cxt->afs_entity, isp_afs_cxt->afs_param, &isp_afs_cxt->afs_result);
|
}
|
|
void isp_iso_set_params_helper(isp_iso_entity_context_t *isp_iso_cxt, iso_param_type_t cmd_type)
|
{
|
if (!isp_iso_cxt->iso_entity || !isp_iso_cxt->ops || !isp_iso_cxt->iso_param)
|
return;
|
|
isp_iso_cxt->iso_param->type = cmd_type;
|
isp_iso_cxt->ops->isp_iso_set_params(isp_iso_cxt->iso_entity, isp_iso_cxt->iso_param, &isp_iso_cxt->iso_result);
|
}
|
|
void isp_md_set_params_helper(isp_md_entity_context_t *isp_md_cxt, md_param_type_t cmd_type)
|
{
|
if (!isp_md_cxt->md_entity || !isp_md_cxt->ops || !isp_md_cxt->md_param)
|
return;
|
|
isp_md_cxt->md_param->type = cmd_type;
|
isp_md_cxt->ops->isp_md_set_params(isp_md_cxt->md_entity, isp_md_cxt->md_param, &isp_md_cxt->md_result);
|
}
|
|
void isp_af_set_params_helper(isp_af_entity_context_t *isp_af_cxt, af_param_type_t cmd_type)
|
{
|
if (!isp_af_cxt->af_entity || !isp_af_cxt->ops || !isp_af_cxt->af_param)
|
return;
|
|
isp_af_cxt->af_param->type = cmd_type;
|
isp_af_cxt->ops->isp_af_set_params(isp_af_cxt->af_entity, isp_af_cxt->af_param, &isp_af_cxt->af_result);
|
}
|
|
void isp_awb_set_params_helper(isp_awb_entity_context_t *isp_awb_cxt, awb_param_type_t cmd_type)
|
{
|
if (!isp_awb_cxt->awb_entity || !isp_awb_cxt->ops || !isp_awb_cxt->awb_param)
|
return;
|
|
isp_awb_cxt->awb_param->type = cmd_type;
|
isp_awb_cxt->ops->isp_awb_set_params(isp_awb_cxt->awb_entity, isp_awb_cxt->awb_param, &isp_awb_cxt->awb_result);
|
}
|
|
void isp_ae_set_params_helper(isp_ae_entity_context_t *isp_ae_cxt, ae_param_type_t cmd_type)
|
{
|
if (!isp_ae_cxt->ae_entity || !isp_ae_cxt->ops || !isp_ae_cxt->ae_param)
|
return;
|
|
isp_ae_cxt->ae_param->type = cmd_type;
|
isp_ae_cxt->ops->isp_ae_set_params(isp_ae_cxt->ae_entity, isp_ae_cxt->ae_param, &isp_ae_cxt->ae_result);
|
}
|
|
void isp_gtm_set_params_helper(isp_gtm_entity_context_t *isp_gtm_cxt, gtm_param_type_t cmd_type)
|
{
|
if (!isp_gtm_cxt->gtm_entity || !isp_gtm_cxt->ops || !isp_gtm_cxt->gtm_param)
|
return;
|
|
isp_gtm_cxt->gtm_param->type = cmd_type;
|
isp_gtm_cxt->ops->isp_gtm_set_params(isp_gtm_cxt->gtm_entity, isp_gtm_cxt->gtm_param, &isp_gtm_cxt->gtm_result);
|
}
|
|
void isp_pltm_set_params_helper(isp_pltm_entity_context_t *isp_pltm_cxt, pltm_param_type_t cmd_type)
|
{
|
if (!isp_pltm_cxt->pltm_entity || !isp_pltm_cxt->ops || !isp_pltm_cxt->pltm_param)
|
return;
|
|
isp_pltm_cxt->pltm_param->type = cmd_type;
|
isp_pltm_cxt->ops->isp_pltm_set_params(isp_pltm_cxt->pltm_entity, isp_pltm_cxt->pltm_param, &isp_pltm_cxt->pltm_result);
|
}
|
|
void __isp_iso_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->iso_entity_ctx.iso_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
isp_gen->iso_entity_ctx.iso_param->iso_frame_id = isp_gen->iso_frame_cnt;
|
isp_gen->iso_entity_ctx.iso_param->cem_color2gray_th = 130;
|
isp_gen->iso_entity_ctx.iso_param->cem_color2gray_delta_min = 25;
|
isp_gen->iso_entity_ctx.iso_param->cem_color2gray_delta_max = 30;
|
}
|
|
void __isp_iso_run(struct isp_lib_context *isp_gen)
|
{
|
isp_iso_entity_context_t *isp_iso_cxt = &isp_gen->iso_entity_ctx;
|
|
isp_iso_cxt->ops->isp_iso_run(isp_iso_cxt->iso_entity, &isp_iso_cxt->iso_result);
|
}
|
|
void __isp_rolloff_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->rolloff_entity_ctx.rolloff_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
isp_gen->rolloff_entity_ctx.rolloff_param->rolloff_frame_id = isp_gen->af_frame_cnt;
|
//rolloff_sensor_info.
|
isp_gen->rolloff_entity_ctx.rolloff_param->rolloff_sensor_info = isp_gen->sensor_info;
|
isp_gen->rolloff_entity_ctx.rolloff_param->rolloff_ctrl = isp_gen->alsc_settings;
|
}
|
|
void __isp_rolloff_run(struct isp_lib_context *isp_gen)
|
{
|
unsigned short *lens_tbl = (unsigned short *)isp_gen->module_cfg.lens_table;
|
int i;
|
isp_rolloff_entity_context_t *isp_rolloff_cxt = &isp_gen->rolloff_entity_ctx;
|
|
isp_rolloff_cxt->ops->isp_rolloff_run(isp_rolloff_cxt->rolloff_entity,
|
&isp_rolloff_cxt->rolloff_stats, &isp_rolloff_cxt->rolloff_result);
|
}
|
|
void __isp_afs_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->afs_entity_ctx.afs_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
isp_gen->afs_entity_ctx.afs_param->afs_frame_id = isp_gen->af_frame_cnt;
|
isp_gen->afs_entity_ctx.afs_param->afs_sensor_info = isp_gen->sensor_info;
|
}
|
|
void __isp_afs_run(struct isp_lib_context *isp_gen)
|
{
|
isp_afs_entity_context_t *isp_afs_cxt = &isp_gen->afs_entity_ctx;
|
|
isp_afs_cxt->ops->isp_afs_run(isp_afs_cxt->afs_entity, &isp_afs_cxt->afs_stats, &isp_afs_cxt->afs_result);
|
|
if (isp_gen->ops->afs_done) {
|
isp_gen->ops->afs_done(isp_gen, &isp_afs_cxt->afs_result);
|
}
|
|
isp_gen->ae_settings.flicker_type = isp_afs_cxt->afs_result.flicker_type_output;
|
}
|
|
void __isp_md_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->md_entity_ctx.md_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
isp_gen->md_entity_ctx.md_param->md_frame_id = isp_gen->md_frame_cnt;
|
isp_gen->sensor_info.is_af_busy = (isp_gen->af_entity_ctx.af_result.af_status_output == AUTO_FOCUS_STATUS_BUSY) ? 1 : 0;
|
isp_gen->md_entity_ctx.md_param->md_sensor_info = isp_gen->sensor_info;
|
}
|
|
void __isp_md_run(struct isp_lib_context *isp_gen)
|
{
|
isp_md_entity_context_t *isp_md_cxt = &isp_gen->md_entity_ctx;
|
|
isp_md_cxt->ops->isp_md_run(isp_md_cxt->md_entity,
|
&isp_md_cxt->md_stats, &isp_md_cxt->md_result);
|
if (isp_gen->ops->md_done) {
|
isp_gen->ops->md_done(isp_gen, &isp_md_cxt->md_result);
|
}
|
isp_gen->sensor_info.motion_flag = isp_md_cxt->md_result.motion_flag;
|
}
|
|
void __isp_af_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->af_entity_ctx.af_param->af_frame_id = isp_gen->af_frame_cnt;
|
isp_gen->af_entity_ctx.af_param->focus_absolute = isp_gen->af_settings.focus_absolute;
|
isp_gen->af_entity_ctx.af_param->focus_relative = isp_gen->af_settings.focus_relative;
|
isp_gen->af_entity_ctx.af_param->af_run_mode = isp_gen->af_settings.af_mode;
|
isp_gen->af_entity_ctx.af_param->af_metering_mode = isp_gen->af_settings.af_metering_mode;
|
isp_gen->af_entity_ctx.af_param->af_range = isp_gen->af_settings.af_range;
|
isp_gen->af_entity_ctx.af_param->focus_lock = isp_gen->af_settings.focus_lock;
|
isp_gen->af_entity_ctx.af_param->sensor_info = isp_gen->sensor_info;
|
}
|
|
void __isp_af_run(struct isp_lib_context *isp_gen)
|
{
|
isp_af_entity_context_t *isp_af_cxt = &isp_gen->af_entity_ctx;
|
|
isp_af_cxt->ops->isp_af_run(isp_af_cxt->af_entity,
|
&isp_af_cxt->af_stats, &isp_af_cxt->af_result);
|
|
if (isp_gen->ops->af_done) {
|
isp_gen->ops->af_done(isp_gen, &isp_af_cxt->af_result);
|
}
|
|
isp_gen->module_cfg.af_cfg.af_sap_lim = isp_af_cxt->af_result.af_sap_lim_output;
|
}
|
|
void __isp_awb_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->awb_entity_ctx.awb_param->awb_frame_id = isp_gen->awb_frame_cnt;
|
isp_gen->awb_entity_ctx.awb_param->awb_ctrl = isp_gen->awb_settings;
|
isp_gen->awb_entity_ctx.awb_param->awb_isp_id = isp_gen->isp_id;
|
//sensor info.
|
isp_gen->awb_entity_ctx.awb_param->awb_sensor_info = isp_gen->sensor_info;
|
}
|
|
void __isp_awb_run(struct isp_lib_context *isp_gen)
|
{
|
isp_awb_entity_context_t *isp_awb_cxt = &isp_gen->awb_entity_ctx;
|
|
isp_awb_cxt->ops->isp_awb_run(isp_awb_cxt->awb_entity, &isp_awb_cxt->awb_stats, &isp_awb_cxt->awb_result);
|
|
if (isp_gen->ops->awb_done) {
|
isp_gen->ops->awb_done(isp_gen, &isp_awb_cxt->awb_result);
|
}
|
|
if (!isp_gen->isp_ini_cfg.isp_test_settings.wdr_en) {
|
isp_gen->module_cfg.wb_gain_cfg.wb_gain = isp_awb_cxt->awb_result.wb_gain_output;
|
} else {
|
isp_gen->module_cfg.wb_gain_cfg.wb_gain.r_gain = (HW_U16)sqrt((double)isp_awb_cxt->awb_result.wb_gain_output.r_gain*256);
|
isp_gen->module_cfg.wb_gain_cfg.wb_gain.gr_gain = (HW_U16)sqrt((double)isp_awb_cxt->awb_result.wb_gain_output.gr_gain*256);
|
isp_gen->module_cfg.wb_gain_cfg.wb_gain.gb_gain = (HW_U16)sqrt((double)isp_awb_cxt->awb_result.wb_gain_output.gb_gain*256);
|
isp_gen->module_cfg.wb_gain_cfg.wb_gain.b_gain = (HW_U16)sqrt((double)isp_awb_cxt->awb_result.wb_gain_output.b_gain*256);
|
}
|
|
isp_gen->stats_ctx.wb_gain_saved = isp_awb_cxt->awb_result.wb_gain_output;
|
}
|
|
void __isp_ae_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->ae_entity_ctx.ae_param->ae_frame_id = isp_gen->ae_frame_cnt;
|
isp_gen->ae_entity_ctx.ae_param->ae_isp_id = isp_gen->isp_id;
|
isp_gen->ae_entity_ctx.ae_param->ae_setting = isp_gen->ae_settings;
|
//ae_sensor_info.
|
isp_gen->ae_entity_ctx.ae_param->ae_sensor_info = isp_gen->sensor_info;
|
isp_gen->ae_entity_ctx.ae_param->ae_target_comp = isp_gen->pltm_entity_ctx.pltm_result.pltm_ae_comp;
|
}
|
|
void __isp_ae_update_sensor_info(struct isp_lib_context *isp_gen)
|
{
|
isp_sensor_info_t *sensor_info = &isp_gen->sensor_info;
|
ae_result_t *result = &isp_gen->ae_entity_ctx.ae_result;
|
HW_U32 total_vts = isp_gen->sensor_info.exp_line / 16;
|
|
sensor_info->exp_line = result->sensor_set.ev_set_curr.ev_sensor_exp_line;
|
sensor_info->ang_gain = result->sensor_set.ev_set_curr.ev_analog_gain;
|
sensor_info->dig_gain = result->sensor_set.ev_set_curr.ev_digital_gain;
|
sensor_info->total_gain = result->sensor_set.ev_set_curr.ev_total_gain;
|
|
sensor_info->ae_tbl_idx = result->sensor_set.ev_set_curr.ev_idx;
|
sensor_info->ae_tbl_idx_max = result->sensor_set.ev_idx_max;
|
|
sensor_info->is_ae_done = (result->ae_status == AE_STATUS_DONE) ? 1 : 0;
|
sensor_info->backlight = result->backlight;
|
sensor_info->ae_gain = result->ae_gain;
|
sensor_info->ae_lv = result->sensor_set.ev_set_curr.ev_lv;
|
|
if (sensor_info->vts && sensor_info->hts && sensor_info->pclk) {
|
total_vts = sensor_info->vts > total_vts ? sensor_info->vts : total_vts;
|
sensor_info->fps = sensor_info->pclk / (total_vts * sensor_info->hts);
|
} else {
|
sensor_info->fps = 30;
|
}
|
sensor_info->fps = clamp(sensor_info->fps, 1, 1000);
|
sensor_info->frame_time = 1000 / sensor_info->fps; /*ms*/
|
}
|
|
void __isp_ae_run(struct isp_lib_context *isp_gen)
|
{
|
isp_ae_entity_context_t *isp_ae_cxt = &isp_gen->ae_entity_ctx;
|
isp_ae_cxt->ops->isp_ae_run(isp_ae_cxt->ae_entity,
|
&isp_ae_cxt->ae_stats, &isp_ae_cxt->ae_result);
|
|
if (isp_gen->ops->ae_done) {
|
isp_gen->ops->ae_done(isp_gen, &isp_ae_cxt->ae_result);
|
}
|
|
__isp_ae_update_sensor_info(isp_gen);
|
config_gamma(isp_gen);
|
config_dig_gain(isp_gen, isp_ae_cxt->ae_result.sensor_set.ev_set_curr.ev_digital_gain);
|
config_wdr(isp_gen, 0);
|
}
|
|
void __isp_gtm_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_frame_id = isp_gen->gtm_frame_cnt;
|
isp_gen->gtm_entity_ctx.gtm_param->contrast = isp_gen->adjust.contrast;
|
isp_gen->gtm_entity_ctx.gtm_param->brightness = isp_gen->adjust.brightness;
|
isp_gen->gtm_entity_ctx.gtm_param->BrightPixellValue = isp_gen->ae_entity_ctx.ae_result.BrightPixellValue;
|
isp_gen->gtm_entity_ctx.gtm_param->DarkPixelValue = isp_gen->ae_entity_ctx.ae_result.DarkPixelValue;
|
//gtm_ini_cfg.
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.gtm_type = isp_gen->isp_ini_cfg.isp_tunning_settings.gtm_type;
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.gamma_type = isp_gen->isp_ini_cfg.isp_tunning_settings.gamma_type;
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.AutoAlphaEn = isp_gen->isp_ini_cfg.isp_tunning_settings.auto_alpha_en;
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.hist_pix_cnt = isp_gen->isp_ini_cfg.isp_tunning_settings.hist_pix_cnt; //[0, 256]
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.dark_minval = isp_gen->isp_ini_cfg.isp_tunning_settings.dark_minval; //[0, 128]
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.bright_minval = isp_gen->isp_ini_cfg.isp_tunning_settings.bright_minval; //[0, 128]
|
memcpy(&isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.plum_var[0], &isp_gen->isp_ini_cfg.isp_tunning_settings.plum_var[0], 9*9*sizeof(HW_S16));
|
memcpy(&isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.gtm_cfg[0], &isp_gen->ae_settings.ae_hist_eq_cfg[0], GTM_HEQ_MAX*sizeof(int));
|
isp_gtm_set_params_helper(&isp_gen->gtm_entity_ctx, ISP_GTM_INI_DATA);
|
}
|
|
void __isp_gtm_run(struct isp_lib_context *isp_gen)
|
{
|
isp_gtm_entity_context_t *isp_gtm_cxt = &isp_gen->gtm_entity_ctx;
|
|
isp_gtm_cxt->ops->isp_gtm_run(isp_gtm_cxt->gtm_entity,
|
&isp_gtm_cxt->gtm_stats,
|
&isp_gtm_cxt->gtm_result);
|
}
|
|
void __isp_pltm_set_params(struct isp_lib_context *isp_gen)
|
{
|
isp_gen->pltm_entity_ctx.pltm_param->pltm_frame_id = isp_gen->ae_frame_cnt;
|
//pltm sensor_info.
|
isp_gen->pltm_entity_ctx.pltm_param->sensor_info = isp_gen->sensor_info;
|
//pltm_ini_cfg.
|
memcpy(&isp_gen->pltm_entity_ctx.pltm_param->pltm_ini.pltm_cfg[0],
|
&isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[0], ISP_PLTM_MAX*sizeof(HW_S32));
|
memcpy(&isp_gen->pltm_entity_ctx.pltm_param->pltm_ini.pltm_dynamic_cfg[0],
|
&isp_gen->ae_settings.pltm_dynamic_cfg[0], ISP_PLTM_DYNAMIC_MAX*sizeof(HW_S32));
|
}
|
|
void __isp_pltm_run(struct isp_lib_context *isp_gen)
|
{
|
pltm_result_t *result = &isp_gen->pltm_entity_ctx.pltm_result;
|
struct isp_pltm_config *pltm_cfg = &isp_gen->module_cfg.pltm_cfg;
|
isp_pltm_entity_context_t *isp_pltm_cxt = &isp_gen->pltm_entity_ctx;
|
|
isp_pltm_cxt->ops->isp_pltm_run(isp_pltm_cxt->pltm_entity,
|
&isp_pltm_cxt->pltm_stats, &isp_pltm_cxt->pltm_result);
|
if (isp_gen->ops->pltm_done) {
|
isp_gen->ops->pltm_done(isp_gen, &isp_pltm_cxt->pltm_result);
|
}
|
memcpy(pltm_cfg->pltm_table, result->pltm_tbl, ISP_PLTM_MEM_SIZE);
|
pltm_cfg->oripic_ratio = result->pltm_oripic_ratio;
|
pltm_cfg->tr_order = result->pltm_tr_order;
|
pltm_cfg->last_order_ratio = result->pltm_last_order_ratio;
|
pltm_cfg->cal_en = result->pltm_cal_en;
|
pltm_cfg->frm_sm_en = result->pltm_frm_sm_en;
|
pltm_cfg->block_height = result->pltm_block_height;
|
pltm_cfg->block_width = result->pltm_block_width;
|
pltm_cfg->statistic_div = result->pltm_statistic_div;
|
|
pltm_cfg->lss_switch = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_LSS_SWITCH];
|
pltm_cfg->lum_ratio = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_LUM_RATIO];
|
pltm_cfg->lp_halo_res = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_LP_HALO_RES];
|
pltm_cfg->white_level = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_WHITE_LEVEL];
|
pltm_cfg->intens_asym = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_INTENS_ASYM];
|
pltm_cfg->spatial_asm = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_SPATIAL_ASM];
|
pltm_cfg->block_h_num = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_BLOCK_H_NUM];
|
pltm_cfg->block_v_num = isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[ISP_PLTM_BLOCK_V_NUM];
|
ISP_LIB_LOG(ISP_LOG_PLTM, "oripic_ratio = %d, tr_order = %d. last_order_ratio = %d, cal_en = %d, frm_sm_en = %d.\n",
|
pltm_cfg->oripic_ratio, pltm_cfg->tr_order, pltm_cfg->last_order_ratio, pltm_cfg->cal_en, pltm_cfg->frm_sm_en);
|
}
|
|
void __isp_ctx_cfg_lib(struct isp_lib_context *isp_gen)
|
{
|
//struct isp_param_config *param = &isp_gen->isp_ini_cfg;
|
struct isp_dynamic_judge_stats_s *dynamic_stats = &isp_gen->stats_ctx.dynamic_stats;
|
|
// isp_lib_context def settings
|
isp_gen->adjust.contrast = 0;
|
isp_gen->adjust.brightness = 0;
|
isp_gen->adjust.defog_value = 0;
|
|
isp_gen->tune.contrast_level = 0;
|
isp_gen->tune.brightness_level = 0;
|
isp_gen->tune.sharpness_level = 100;
|
isp_gen->tune.saturation_level = 100;
|
isp_gen->tune.tdf_level = 50;
|
isp_gen->tune.denoise_level = 50;
|
isp_gen->tune.pltmwdr_level = 0;
|
isp_gen->tune.effect = ISP_COLORFX_NONE;
|
|
isp_gen->awb_settings.wb_gain_manual.r_gain = 256;
|
isp_gen->awb_settings.wb_gain_manual.gr_gain = 256;
|
isp_gen->awb_settings.wb_gain_manual.gb_gain = 256;
|
isp_gen->awb_settings.wb_gain_manual.b_gain = 256;
|
|
// exp settings
|
isp_gen->ae_settings.exp_mode = EXP_AUTO;
|
isp_gen->ae_settings.exp_metering_mode = AE_METERING_MODE_MATRIX;
|
isp_gen->ae_settings.flash_mode = FLASH_MODE_NONE;
|
isp_gen->ae_settings.flash_switch_flag = false;
|
isp_gen->ae_settings.flash_open = 0;
|
isp_gen->ae_settings.flicker_mode = FREQUENCY_AUTO;
|
isp_gen->ae_settings.iso_mode = ISO_AUTO;
|
isp_gen->ae_settings.exposure_lock = false;
|
isp_gen->ae_settings.exp_compensation = 0;
|
|
// af settings
|
isp_gen->af_settings.af_mode = AUTO_FOCUS_CONTINUEOUS;
|
isp_gen->af_settings.af_metering_mode = AUTO_FOCUS_METERING_CENTER_WEIGHTED;
|
isp_gen->af_settings.focus_lock = false;
|
isp_gen->af_settings.af_range = AUTO_FOCUS_RANGE_AUTO;
|
|
// awb settings
|
isp_gen->awb_settings.wb_mode = WB_AUTO;
|
isp_gen->awb_settings.white_balance_lock = false;
|
|
isp_gen->awb_settings.awb_coor.x1 = H3A_PIC_OFFSET;
|
isp_gen->awb_settings.awb_coor.y1 = H3A_PIC_OFFSET;
|
isp_gen->awb_settings.awb_coor.x2 = H3A_PIC_SIZE + H3A_PIC_OFFSET;
|
isp_gen->awb_settings.awb_coor.y2 = H3A_PIC_SIZE + H3A_PIC_OFFSET;
|
isp_gen->ae_settings.ae_coor.x1 = H3A_PIC_OFFSET;
|
isp_gen->ae_settings.ae_coor.y1 = H3A_PIC_OFFSET;
|
isp_gen->ae_settings.ae_coor.x2 = H3A_PIC_SIZE + H3A_PIC_OFFSET;
|
isp_gen->ae_settings.ae_coor.y2 = H3A_PIC_SIZE + H3A_PIC_OFFSET;
|
|
isp_gen->af_settings.af_coor.x1 = H3A_PIC_OFFSET;
|
isp_gen->af_settings.af_coor.y1 = H3A_PIC_OFFSET;
|
isp_gen->af_settings.af_coor.x2 = H3A_PIC_SIZE + H3A_PIC_OFFSET;
|
isp_gen->af_settings.af_coor.y2 = H3A_PIC_SIZE + H3A_PIC_OFFSET;
|
|
isp_gen->stat.min_rgb_saved = 1023;
|
isp_gen->stat.c_noise_saved = 20;
|
|
isp_gen->stats_ctx.wb_gain_saved.r_gain = 256;
|
isp_gen->stats_ctx.wb_gain_saved.gr_gain = 256;
|
isp_gen->stats_ctx.wb_gain_saved.gb_gain = 256;
|
isp_gen->stats_ctx.wb_gain_saved.b_gain = 256;
|
|
//alsc settings
|
isp_gen->alsc_settings.frequency = 6;
|
isp_gen->alsc_settings.start = isp_gen->alsc_settings.frequency * 5;
|
isp_gen->alsc_settings.smooth_pool_size = 16;
|
isp_gen->alsc_settings.th_tableSwitch = 2;
|
isp_gen->alsc_settings.th_lowLight = 35;
|
isp_gen->alsc_settings.th_complex = 563;
|
isp_gen->alsc_settings.th_highSat = 645;
|
isp_gen->alsc_settings.th_semiFlat = 46;
|
|
//dynamic judge
|
dynamic_stats->enable = 0;
|
|
dynamic_stats->mov_th[0] = 5 * (ISP_AE_ROW-2) * (ISP_AE_COL-2);
|
dynamic_stats->mov_th[1] = 10 * (ISP_AE_ROW-2) * (ISP_AE_COL-2);
|
dynamic_stats->mov_th[2] = 16 * (ISP_AE_ROW-2) * (ISP_AE_COL-2);
|
dynamic_stats->mov_th[3] = 24 * (ISP_AE_ROW-2) * (ISP_AE_COL-2);
|
dynamic_stats->mov_th[4] = 30 * (ISP_AE_ROW-2) * (ISP_AE_COL-2);
|
dynamic_stats->mov_th[5] = 64 * (ISP_AE_ROW-2) * (ISP_AE_COL-2);
|
|
dynamic_stats->tdnf_comp[STATUS_STATIC] = 52;
|
dynamic_stats->tdnf_diff_comp[STATUS_STATIC] = 39;
|
dynamic_stats->lp_th_ratio_comp[STATUS_STATIC] = 52;
|
dynamic_stats->sharp_hfrq_comp[STATUS_STATIC] = 52;
|
dynamic_stats->sharp_edge_comp[STATUS_STATIC] = 26;
|
dynamic_stats->sharp_under_shoot_comp[STATUS_STATIC] = -77;
|
|
dynamic_stats->tdnf_comp[STATUS_SUS_STATIC] = 26;
|
dynamic_stats->tdnf_diff_comp[STATUS_SUS_STATIC] = 26;
|
dynamic_stats->lp_th_ratio_comp[STATUS_SUS_STATIC] = 26;
|
dynamic_stats->sharp_hfrq_comp[STATUS_SUS_STATIC] = 26;
|
dynamic_stats->sharp_edge_comp[STATUS_SUS_STATIC] = 13;
|
dynamic_stats->sharp_under_shoot_comp[STATUS_SUS_STATIC] = -26;
|
|
dynamic_stats->tdnf_comp[STATUS_SUS_MOTION] = -26;
|
dynamic_stats->tdnf_diff_comp[STATUS_SUS_MOTION] = 0;
|
dynamic_stats->lp_th_ratio_comp[STATUS_SUS_MOTION] = -26;
|
dynamic_stats->sharp_hfrq_comp[STATUS_SUS_MOTION] = -26;
|
dynamic_stats->sharp_edge_comp[STATUS_SUS_MOTION] = -13;
|
dynamic_stats->sharp_under_shoot_comp[STATUS_SUS_MOTION] = 13;
|
|
dynamic_stats->tdnf_comp[STATUS_MOTION] = -77;
|
dynamic_stats->tdnf_diff_comp[STATUS_MOTION] = 0;
|
dynamic_stats->lp_th_ratio_comp[STATUS_MOTION] = -52;
|
dynamic_stats->sharp_hfrq_comp[STATUS_MOTION] = -52;
|
dynamic_stats->sharp_edge_comp[STATUS_MOTION] = -26;
|
dynamic_stats->sharp_under_shoot_comp[STATUS_MOTION] = 26;
|
}
|
|
#define ISP_CTX_MODULE_EN(en_bit, ISP_FEATURES) \
|
{ \
|
if (en_bit) {\
|
mod_cfg->module_enable_flag |= ISP_FEATURES;\
|
} else {\
|
mod_cfg->module_enable_flag &= ~ISP_FEATURES;\
|
}\
|
}
|
|
int __isp_ctx_apply_enable(struct isp_lib_context *isp_gen)
|
{
|
struct isp_module_config *mod_cfg = &isp_gen->module_cfg;
|
struct isp_param_config *param = &isp_gen->isp_ini_cfg;
|
|
#if (ISP_VERSION == 500)
|
/*use linear correction instead of digital gian so we can use digital gain before wdr*/
|
if (isp_gen->sensor_info.wdr_mode == 2) {
|
param->isp_test_settings.linear_en = 0;
|
} else if (isp_gen->sensor_info.wdr_mode == 1) {
|
if (param->isp_test_settings.wdr_en)
|
param->isp_test_settings.linear_en = 1;
|
} else {
|
param->isp_test_settings.wdr_en = 0;
|
}
|
#else
|
if (isp_gen->sensor_info.wdr_mode == 0)
|
param->isp_test_settings.wdr_en = 0;
|
#endif
|
ISP_CTX_MODULE_EN(param->isp_test_settings.sharp_en , ISP_FEATURES_SHARP);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.contrast_en , ISP_FEATURES_CONTRAST);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.denoise_en , ISP_FEATURES_D2D);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.drc_en , ISP_FEATURES_RGB_DRC);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.lsc_en , ISP_FEATURES_LSC);
|
#if (ISP_VERSION >= 521)
|
ISP_CTX_MODULE_EN(param->isp_test_settings.msc_en , ISP_FEATURES_MSC);
|
#endif
|
ISP_CTX_MODULE_EN(param->isp_test_settings.gamma_en , ISP_FEATURES_GAMMA);
|
// Colorspace open in hardware as default.
|
ISP_CTX_MODULE_EN(1, ISP_FEATURES_RGB2YUV);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.cm_en , ISP_FEATURES_RGB2RGB);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.blc_en , ISP_FEATURES_BLC);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.wb_en , ISP_FEATURES_WB);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.otf_dpc_en , ISP_FEATURES_DPC);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.cfa_en , ISP_FEATURES_CFA);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.tdf_en , ISP_FEATURES_D3D);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.cnr_en , ISP_FEATURES_CNR);
|
#if (ISP_VERSION >= 521)
|
ISP_CTX_MODULE_EN(param->isp_test_settings.lca_en , ISP_FEATURES_LCA);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.gca_en , ISP_FEATURES_GCA);
|
#endif
|
ISP_CTX_MODULE_EN(param->isp_test_settings.satur_en , ISP_FEATURES_SATU);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.linear_en , ISP_FEATURES_LINEAR);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.dig_gain_en , ISP_FEATURES_DG);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.cem_en , ISP_FEATURES_CEM);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.pltm_en , ISP_FEATURES_PLTM);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.wdr_en , ISP_FEATURES_WDR);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.so_en , ISP_FEATURES_SO);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.ctc_en , ISP_FEATURES_CTC);
|
|
ISP_CTX_MODULE_EN(param->isp_test_settings.afs_en , ISP_FEATURES_AFS);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.ae_en , ISP_FEATURES_AE);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.awb_en , ISP_FEATURES_AWB);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.af_en , ISP_FEATURES_AF);
|
ISP_CTX_MODULE_EN(param->isp_test_settings.hist_en , ISP_FEATURES_HIST);
|
|
mod_cfg->module_enable_flag |= ISP_FEATURES_MODE;
|
|
isp_manage_lib_log_param = param->isp_test_settings.isp_log_param;
|
|
return 0;
|
}
|
|
static void __isp_ctx_cfg_mod(struct isp_lib_context *isp_gen)
|
{
|
//after __isp_ctx_cfg_lib
|
struct isp_module_config *mod_cfg = &isp_gen->module_cfg;
|
struct isp_param_config *param = &isp_gen->isp_ini_cfg;
|
int i = 0, j = 0;
|
|
|
if (param->isp_test_settings.wb_en == 0 ||
|
mod_cfg->wb_gain_cfg.wb_gain.r_gain == 0 ||
|
mod_cfg->wb_gain_cfg.wb_gain.gr_gain == 0 ||
|
mod_cfg->wb_gain_cfg.wb_gain.gb_gain == 0 ||
|
mod_cfg->wb_gain_cfg.wb_gain.b_gain == 0) {
|
mod_cfg->wb_gain_cfg.wb_gain.r_gain = 256;
|
mod_cfg->wb_gain_cfg.wb_gain.gr_gain = 256;
|
mod_cfg->wb_gain_cfg.wb_gain.gb_gain = 256;
|
mod_cfg->wb_gain_cfg.wb_gain.b_gain = 256;
|
}
|
mod_cfg->wb_gain_cfg.clip_val = 4092;
|
|
mod_cfg->af_cfg.af_sap_lim = ISP_AF_DIR_TH;
|
#if (ISP_VERSION >= 520)
|
mod_cfg->tdf_cfg.k3d_increase_mode = D3D_MAX;
|
#else
|
mod_cfg->sharp_cfg.sharp_max_val = 0;
|
mod_cfg->sharp_cfg.sharp_min_val = 0;
|
mod_cfg->sharp_cfg.black_level = 0;
|
mod_cfg->sharp_cfg.white_level = 0;
|
mod_cfg->sharp_cfg.black_clip = 0;
|
mod_cfg->sharp_cfg.white_clip = 0;
|
#endif
|
mod_cfg->hist_cfg.hist_mode = MAX_MODE;
|
|
mod_cfg->mode_cfg.input_fmt = isp_gen->sensor_info.input_seq;
|
|
if (isp_gen->sensor_info.wdr_mode == 2) {
|
mod_cfg->mode_cfg.wdr_mode = COMANDING_WDR;
|
isp_gen->ae_settings.ae_mode = AE_NORM;
|
} else if (isp_gen->sensor_info.wdr_mode == 1) {
|
mod_cfg->mode_cfg.wdr_mode = DOL_WDR;
|
isp_gen->ae_settings.ae_mode = AE_WDR;
|
} else {
|
isp_gen->ae_settings.ae_mode = AE_NORM;
|
}
|
mod_cfg->mode_cfg.wdr_cmp_mode = 0;
|
|
config_wdr(isp_gen, 1);
|
|
//mod_cfg->mode_cfg.isp_dpc_mode = DPC_STRONG;
|
mod_cfg->mode_cfg.saturation_mode = SATU_NORM_MODE;
|
mod_cfg->mode_cfg.hist_sel = param->isp_3a_settings.ae_hist_sel;//HIST_AFTER_CNR;
|
mod_cfg->mode_cfg.cfa_mode = CFA_NORM_MODE;
|
mod_cfg->mode_cfg.ae_mode = param->isp_3a_settings.ae_stat_sel;//AE_AFTER_CNR;
|
mod_cfg->mode_cfg.awb_mode = param->isp_3a_settings.awb_stat_sel;//AWB_AFTER_WDR;
|
mod_cfg->mode_cfg.dg_mode = DG_AFTER_SO;
|
|
mod_cfg->output_speed = 1;
|
|
config_dig_gain(isp_gen, 1024);
|
|
mod_cfg->awb_cfg.awb_r_sat_lim = AWB_SAT_DEF_LIM;
|
mod_cfg->awb_cfg.awb_g_sat_lim = AWB_SAT_DEF_LIM;
|
mod_cfg->awb_cfg.awb_b_sat_lim = AWB_SAT_DEF_LIM;
|
|
if (isp_gen->isp_ini_cfg.isp_3a_settings.ae_hist_mod_en == 1) {
|
mod_cfg->hist_cfg.hist_mode = MAX_MODE;
|
} else if (isp_gen->isp_ini_cfg.isp_3a_settings.ae_hist_mod_en == 2) {
|
mod_cfg->hist_cfg.hist_mode = MIN_MODE;
|
} else if (isp_gen->isp_ini_cfg.isp_3a_settings.ae_hist_mod_en == 3) {
|
mod_cfg->hist_cfg.hist_mode = AVG_MODE;
|
}
|
|
//CFA
|
mod_cfg->cfa_cfg.dir_th = (isp_gen->isp_ini_cfg.isp_tunning_settings.cfa_dir_th == 0) ? ISP_CFA_DIR_TH : isp_gen->isp_ini_cfg.isp_tunning_settings.cfa_dir_th;
|
#if (ISP_VERSION >= 521)
|
// demosaic use new mode.
|
mod_cfg->cfa_cfg.interp_mode = (isp_gen->isp_ini_cfg.isp_tunning_settings.cfa_interp_mode == 0) ? ISP_CFA_INTERP_MODE : isp_gen->isp_ini_cfg.isp_tunning_settings.cfa_interp_mode;
|
mod_cfg->cfa_cfg.zig_zag = (isp_gen->isp_ini_cfg.isp_tunning_settings.cfa_zig_zag == 0) ? ISP_CFA_ZIG_ZAG : isp_gen->isp_ini_cfg.isp_tunning_settings.cfa_zig_zag;
|
#endif
|
|
//ccm
|
mod_cfg->rgb2rgb_cfg.color_matrix = param->isp_tunning_settings.color_matrix_ini[0];
|
|
if (param->isp_test_settings.defog_en==1) {
|
mod_cfg->cfa_cfg.min_rgb = 1023;
|
} else {
|
mod_cfg->cfa_cfg.min_rgb = 0;
|
}
|
|
//ctc todo
|
mod_cfg->ctc_cfg.ctc_th_max = param->isp_tunning_settings.ctc_th_max;//316;
|
mod_cfg->ctc_cfg.ctc_th_min = param->isp_tunning_settings.ctc_th_min;//60;
|
mod_cfg->ctc_cfg.ctc_th_slope = param->isp_tunning_settings.ctc_th_slope;//262;
|
mod_cfg->ctc_cfg.ctc_dir_wt = param->isp_tunning_settings.ctc_dir_wt;//64;
|
mod_cfg->ctc_cfg.ctc_dir_th = param->isp_tunning_settings.ctc_dir_th;//80;
|
|
//pltm
|
mod_cfg->pltm_cfg.lss_switch = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_LSS_SWITCH];
|
mod_cfg->pltm_cfg.last_order_ratio = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_LAST_ORDER_RATIO];
|
mod_cfg->pltm_cfg.tr_order = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_TR_ORDER];
|
mod_cfg->pltm_cfg.oripic_ratio = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_ORIPIC_RATIO];
|
mod_cfg->pltm_cfg.intens_asym = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_INTENS_ASYM];
|
mod_cfg->pltm_cfg.spatial_asm = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_SPATIAL_ASM];
|
mod_cfg->pltm_cfg.white_level = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_WHITE_LEVEL];
|
mod_cfg->pltm_cfg.lp_halo_res = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_LP_HALO_RES];
|
mod_cfg->pltm_cfg.lum_ratio = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_LUM_RATIO];
|
mod_cfg->pltm_cfg.block_v_num = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_BLOCK_V_NUM];
|
mod_cfg->pltm_cfg.block_h_num = param->isp_tunning_settings.pltm_cfg[ISP_PLTM_BLOCK_H_NUM];
|
#if (ISP_VERSION >= 521)
|
// gca
|
mod_cfg->gca_cfg.gca_ct_w = (isp_gen->stat.pic_size.width - 1) / 2;
|
mod_cfg->gca_cfg.gca_ct_h = (isp_gen->stat.pic_size.height - 1) / 2;
|
|
mod_cfg->gca_cfg.gca_r_para0 = param->isp_tunning_settings.gca_cfg[ISP_GCA_R_PARA0];
|
mod_cfg->gca_cfg.gca_r_para1 = param->isp_tunning_settings.gca_cfg[ISP_GCA_R_PARA1];
|
mod_cfg->gca_cfg.gca_r_para2 = param->isp_tunning_settings.gca_cfg[ISP_GCA_R_PARA2];
|
mod_cfg->gca_cfg.gca_b_para0 = param->isp_tunning_settings.gca_cfg[ISP_GCA_B_PARA0];
|
mod_cfg->gca_cfg.gca_b_para1 = param->isp_tunning_settings.gca_cfg[ISP_GCA_B_PARA1];
|
mod_cfg->gca_cfg.gca_b_para2 = param->isp_tunning_settings.gca_cfg[ISP_GCA_B_PARA2];
|
mod_cfg->gca_cfg.gca_int_cns = param->isp_tunning_settings.gca_cfg[ISP_GCA_INT_CNS];
|
|
// lca some param update in iso
|
for(i = 0; i < 9; i++) {
|
//mod_cfg->lca_cfg.lca_pf_satu_lut[4*i +3] = param->isp_tunning_settings.lca_pf_satu_lut[4*i +0];
|
//mod_cfg->lca_cfg.lca_pf_satu_lut[4*i +2] = param->isp_tunning_settings.lca_pf_satu_lut[4*i +1];
|
//mod_cfg->lca_cfg.lca_pf_satu_lut[4*i +1] = param->isp_tunning_settings.lca_pf_satu_lut[4*i +2];
|
//mod_cfg->lca_cfg.lca_pf_satu_lut[4*i +0] = param->isp_tunning_settings.lca_pf_satu_lut[4*i +3];
|
for(j = 0; j < 4; j++) {
|
if((4*i+j) >= ISP_REG_TBL_LENGTH)
|
break;
|
mod_cfg->lca_cfg.lca_pf_satu_lut[4*i+j] = param->isp_tunning_settings.lca_pf_satu_lut[4*i+j];
|
}
|
}
|
|
for(i = 0; i < 9; i++) {
|
//mod_cfg->lca_cfg.lca_gf_satu_lut[4*i +3] = param->isp_tunning_settings.lca_gf_satu_lut[4*i +0];
|
//mod_cfg->lca_cfg.lca_gf_satu_lut[4*i +2] = param->isp_tunning_settings.lca_gf_satu_lut[4*i +1];
|
//mod_cfg->lca_cfg.lca_gf_satu_lut[4*i +1] = param->isp_tunning_settings.lca_gf_satu_lut[4*i +2];
|
//mod_cfg->lca_cfg.lca_gf_satu_lut[4*i +0] = param->isp_tunning_settings.lca_gf_satu_lut[4*i +3];
|
for(j = 0; j < 4; j++) {
|
if((4*i+j) >= ISP_REG_TBL_LENGTH)
|
break;
|
mod_cfg->lca_cfg.lca_gf_satu_lut[4*i+j] = param->isp_tunning_settings.lca_gf_satu_lut[4*i+j];
|
}
|
}
|
|
// lsc
|
if (param->isp_test_settings.lsc_en) {
|
mod_cfg->mode_cfg.rsc_mode = param->isp_tunning_settings.lsc_mode;
|
}
|
|
// msc
|
if (param->isp_test_settings.msc_en) {
|
mod_cfg->mode_cfg.msc_mode = param->isp_tunning_settings.msc_mode;
|
for(i = 0; i < ISP_MSC_TBL_LUT_SIZE; i++) {
|
mod_cfg->msc_cfg.msc_blw_lut[i] = param->isp_tunning_settings.msc_blw_lut[i];
|
}
|
for(i = 0; i < ISP_MSC_TBL_LUT_SIZE; i++) {
|
mod_cfg->msc_cfg.msc_blh_lut[i] = param->isp_tunning_settings.msc_blh_lut[i];
|
}
|
#if 0
|
for(i = 0; i < ISP_MSC_TBL_LUT_DLT_SIZE; i++) {
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[i] = param->isp_tunning_settings.msc_blw_dlt_lut[i];
|
}
|
for(i = 0; i < ISP_MSC_TBL_LUT_DLT_SIZE; i++) {
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[i] = param->isp_tunning_settings.msc_blh_dlt_lut[i];
|
}
|
#endif
|
#if 1
|
if(param->isp_tunning_settings.msc_mode >= 4) {
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[0] = clamp(4096/max(mod_cfg->msc_cfg.msc_blw_lut[0], 1), 0, 4095);
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[ISP_MSC_TBL_LUT_DLT_SIZE -1] = clamp(4096/max(mod_cfg->msc_cfg.msc_blw_lut[ISP_MSC_TBL_LUT_SIZE-1], 1), 0, 4095);
|
for(i = 1; i < ISP_MSC_TBL_LUT_DLT_SIZE; i++) {
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[i] = clamp(8192/max(mod_cfg->msc_cfg.msc_blw_lut[i]+mod_cfg->msc_cfg.msc_blw_lut[i-1], 1), 0, 4095);
|
}
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[0] = clamp(4096/max(mod_cfg->msc_cfg.msc_blh_lut[0], 1), 0, 4095);
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[ISP_MSC_TBL_LUT_DLT_SIZE -1] = clamp(4096/max(mod_cfg->msc_cfg.msc_blh_lut[ISP_MSC_TBL_LUT_SIZE-1], 1), 0, 4095);
|
for(i = 1; i < ISP_MSC_TBL_LUT_DLT_SIZE; i++) {
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[i] = clamp(8192/max(mod_cfg->msc_cfg.msc_blh_lut[i]+mod_cfg->msc_cfg.msc_blh_lut[i-1], 1), 0, 4095);
|
}
|
} else {
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[0] = clamp(4096/max(mod_cfg->msc_cfg.msc_blw_lut[0], 1), 0, 4095);
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[8] = clamp(4096/max(mod_cfg->msc_cfg.msc_blw_lut[7], 1), 0, 4095);
|
for(i = 1; i < 8; i++) {
|
mod_cfg->msc_cfg.msc_blw_dlt_lut[i] = clamp(8192/max(mod_cfg->msc_cfg.msc_blw_lut[i]+mod_cfg->msc_cfg.msc_blw_lut[i-1], 1), 0, 4095);
|
}
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[0] = clamp(4096/max(mod_cfg->msc_cfg.msc_blh_lut[0], 1), 0, 4095);
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[8] = clamp(4096/max(mod_cfg->msc_cfg.msc_blh_lut[7], 1), 0, 4095);
|
for(i = 1; i < 8; i++) {
|
mod_cfg->msc_cfg.msc_blh_dlt_lut[i] = clamp(8192/max(mod_cfg->msc_cfg.msc_blh_lut[i]+mod_cfg->msc_cfg.msc_blh_lut[i-1], 1), 0, 4095);
|
}
|
}
|
#endif
|
|
// update otp infomation
|
if(isp_gen->otp_enable == 1) {
|
/* msc */
|
for(i = 0; i < (ISP_MSC_TBL_LENGTH); i++) {
|
isp_gen->msc_golden_ratio[i] = (float)max(((HW_U16*)(isp_gen->pmsc_table))[i] ,1)/max(msc_golden[i], 1);
|
}
|
isp_gen->msc_r_ratio = (float)max(((HW_U16*)(isp_gen->pmsc_table))[0] + ((HW_U16*)(isp_gen->pmsc_table))[15] +((HW_U16*)(isp_gen->pmsc_table))[15*16] +((HW_U16*)(isp_gen->pmsc_table))[16*16 -1],1)/max(msc_golden[0] + msc_golden[15] + msc_golden[15*16] + msc_golden[16*16 -1], 1);
|
for(i = 0; i < (ISP_MSC_TBL_LENGTH); i++) {
|
if(i < 16*16) {
|
if(isp_gen->msc_r_ratio > 1.0) {
|
isp_gen->msc_golden_flag[i] = 1;
|
} else {
|
isp_gen->msc_golden_flag[i] = 0;
|
}
|
} else {
|
isp_gen->msc_golden_flag[i] = 0;
|
}
|
}
|
|
isp_gen->msc_adjust_ratio[0] = 5;
|
isp_gen->msc_adjust_ratio[1] = 5;
|
isp_gen->msc_adjust_ratio[2] = 0;
|
isp_gen->msc_adjust_ratio[3] = 10;
|
isp_gen->msc_adjust_ratio[4] = 11;
|
isp_gen->msc_adjust_ratio[5] = 11;// more less more green
|
|
isp_gen->msc_adjust_ratio_less[0] = -5;// more less more red
|
isp_gen->msc_adjust_ratio_less[1] = -5;
|
isp_gen->msc_adjust_ratio_less[2] = 0;
|
isp_gen->msc_adjust_ratio_less[3] = 0;
|
isp_gen->msc_adjust_ratio_less[4] = -6;
|
isp_gen->msc_adjust_ratio_less[5] = -8;
|
#if 0
|
isp_gen->msc_adjust_ratio_less[0] = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[0];
|
isp_gen->msc_adjust_ratio_less[1] = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[1];
|
isp_gen->msc_adjust_ratio_less[2] = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[2];
|
isp_gen->msc_adjust_ratio_less[3] = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[3];
|
isp_gen->msc_adjust_ratio_less[4] = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[4];
|
isp_gen->msc_adjust_ratio_less[5] = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[5];
|
|
ISP_LIB_LOG(ISP_LOG_LSC, "%f, %f, %f, %f, %f, %f. \n",
|
isp_gen->msc_adjust_ratio_less[0],
|
isp_gen->msc_adjust_ratio_less[1],
|
isp_gen->msc_adjust_ratio_less[2],
|
isp_gen->msc_adjust_ratio_less[3],
|
isp_gen->msc_adjust_ratio_less[4],
|
isp_gen->msc_adjust_ratio_less[5]);
|
#endif
|
|
} else {
|
for(i = 0; i < (ISP_MSC_TBL_LENGTH); i++) {
|
isp_gen->msc_golden_ratio[i] = 1.0;
|
isp_gen->msc_golden_flag[i] = 1;
|
}
|
isp_gen->msc_adjust_ratio[0] = 0;
|
isp_gen->msc_adjust_ratio[1] = 0;
|
isp_gen->msc_adjust_ratio[2] = 0;
|
isp_gen->msc_adjust_ratio[3] = 0;
|
isp_gen->msc_adjust_ratio[4] = 0;
|
isp_gen->msc_adjust_ratio[5] = 0;
|
isp_gen->msc_adjust_ratio_less[0] = 0;
|
isp_gen->msc_adjust_ratio_less[1] = 0;
|
isp_gen->msc_adjust_ratio_less[2] = 0;
|
isp_gen->msc_adjust_ratio_less[3] = 0;
|
isp_gen->msc_adjust_ratio_less[4] = 0;
|
isp_gen->msc_adjust_ratio_less[5] = 0;
|
}
|
}
|
|
|
#endif
|
|
if(isp_gen->otp_enable == 1) {
|
/* msc */
|
for(i = 0; i < AWB_CH_NUM; i++) {
|
ISP_LIB_LOG(ISP_LOG_AWB, "awb corner :%5d, golden: %d. \n", ((HW_U16*)(isp_gen->pwb_table))[i], ((HW_U16*)(isp_gen->pwb_table))[i+4]);
|
}
|
|
isp_gen->wb_golden_ratio[0] = (float)max(((HW_U16*)(isp_gen->pwb_table))[0] ,1)/(float)max(((HW_U16*)(isp_gen->pwb_table))[0+4] ,1);
|
isp_gen->wb_golden_ratio[1] = (float)max(((HW_U16*)(isp_gen->pwb_table))[1] +((HW_U16*)(isp_gen->pwb_table))[2] ,1)
|
/(float)max(((HW_U16*)(isp_gen->pwb_table))[1+4] + ((HW_U16*)(isp_gen->pwb_table))[2+4],1);
|
isp_gen->wb_golden_ratio[2] = (float)max(((HW_U16*)(isp_gen->pwb_table))[3] ,1)/(float)max(((HW_U16*)(isp_gen->pwb_table))[3+4] ,1);
|
|
ISP_LIB_LOG(ISP_LOG_AWB, "awb otp ratio r :%5f, g: %5f, b: %5f. \n", isp_gen->wb_golden_ratio[0], isp_gen->wb_golden_ratio[1], isp_gen->wb_golden_ratio[2]);
|
for(i = 0; i < param->isp_3a_settings.awb_light_num; i++) {
|
ISP_LIB_LOG(ISP_LOG_AWB, "Before awb otp adjust %5d %5d %5d \n",param->isp_3a_settings.awb_light_info[10*i + 0], param->isp_3a_settings.awb_light_info[10*i + 1], param->isp_3a_settings.awb_light_info[10*i + 2]);
|
param->isp_3a_settings.awb_light_info[10*i + 0] = (HW_S32)(param->isp_3a_settings.awb_light_info[10*i + 0]*isp_gen->wb_golden_ratio[0]);
|
param->isp_3a_settings.awb_light_info[10*i + 1] = (HW_S32)(param->isp_3a_settings.awb_light_info[10*i + 1]*isp_gen->wb_golden_ratio[1]);
|
param->isp_3a_settings.awb_light_info[10*i + 2] = (HW_S32)(param->isp_3a_settings.awb_light_info[10*i + 2]*isp_gen->wb_golden_ratio[2]);
|
ISP_LIB_LOG(ISP_LOG_AWB, "Before awb otp adjust %5d %5d %5d \n",param->isp_3a_settings.awb_light_info[10*i + 0], param->isp_3a_settings.awb_light_info[10*i + 1], param->isp_3a_settings.awb_light_info[10*i + 2]);
|
}
|
}
|
|
config_band_step(isp_gen);
|
|
//gamma table
|
if (param->isp_test_settings.gamma_en)
|
config_gamma(isp_gen);
|
|
if (param->isp_test_settings.lsc_en) {
|
config_lens_table(isp_gen, 512);
|
config_lens_center(isp_gen);
|
}
|
#if (ISP_VERSION >= 521)
|
if (param->isp_test_settings.msc_en) {
|
config_msc_table(isp_gen, 512);
|
}
|
#endif
|
|
memcpy(&mod_cfg->cem_cfg.cem_table[0], ¶m->isp_tunning_settings.isp_cem_table[0], ISP_CEM_MEM_SIZE);
|
|
//memcpy(&mod_cfg->pltm_cfg.pltm_table[0], ¶m->isp_tunning_settings.isp_pltm_table[0], ISP_PLTM_MEM_SIZE);
|
|
//memcpy(&mod_cfg->wdr_cfg.wdr_table[0], ¶m->isp_tunning_settings.isp_wdr_table[0], ISP_WDR_MEM_SIZE);
|
|
FUNCTION_LOG;
|
}
|
|
int __isp_alloc_reg_tbl(struct isp_lib_context *isp_gen)
|
{
|
unsigned int isp_default_reg[ISP_LOAD_REG_SIZE >> 2] = {
|
#if (ISP_VERSION >= 520)
|
0x00000173, 0x00530000, 0xfff00000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x1f01ba90, 0x1f01ba90, 0x1f018000, 0x00000000,
|
0x00001451, 0x00000000, 0x8000010a, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x001f0010, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00004224, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x01ce01cd, 0x0000ffff, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000cc0,
|
0x00000000, 0x00200020, 0x00200020, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x000000a0, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x04380780, 0x04380780, 0x00000000, 0x00200020,
|
0x00200020, 0x00000000, 0x00000000, 0x00000000,
|
0x0f000200, 0x01390010, 0x003c0c00, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x04000804, 0x00000000, 0x00000000, 0x00000000,
|
0x0136003c, 0x00000106, 0x00005040, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00b4c8dc, 0x1c181410, 0x00203040, 0x8360410a,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x1f1f1fff, 0x00020000, 0x00ff00ff, 0x001900ff,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00200020, 0x00200020, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x04000400, 0x04000400, 0x00000000, 0x00000000,
|
0x01000100, 0x01000100, 0x00000fff, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x30000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x40070f01, 0xfcff0080, 0x1f173c2d, 0x001845c8,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000080, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00800080, 0x00800080, 0x041f0404, 0x00000000,
|
0x00000140, 0x1f1f0018, 0x00400040, 0x00400040,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000010, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000484, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x208100a0, 0x42cc00ab, 0x008700f0, 0x01e50111,
|
0xffdffbff, 0x00000100, 0x00000100, 0x00000100,
|
0x00005100, 0xf2d33b98, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x02040107, 0x07680064, 0x01c206d6, 0x068701c2,
|
0x000007b7, 0x02000040, 0x00000200, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x000f0013, 0x00000000, 0x00000000, 0x00000000,
|
0x01080000, 0x008600f0, 0x00000000, 0x39ccf1ac,
|
0x00029391, 0x107ca5bd, 0x37e52759, 0x002d0035,
|
0x00c5027b, 0x004d009d, 0x00710088, 0x2fb00511,
|
0x2cc00414, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x000000f0,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00ff00ff, 0x000000ff, 0x000f0013, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00080008, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000008, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00000008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00000008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00000008, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x01000100, 0x01000100, 0x01000100,
|
0x01000100, 0x80808080, 0x80808080, 0x80808080,
|
0x80808080, 0x80808080, 0x80808080, 0x80808080,
|
0x80808080, 0x80808080, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00000008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00000008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00000008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00000008, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
#else
|
0x00000101, 0x00000001, 0x00004111, 0x00000087,
|
0x03c00010, 0x00000000, 0x28000000, 0x04000000,
|
0x0dc11000, 0x0dc11400, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x80000200, 0x00000004, 0x00000000, 0x0136003c,
|
0x00000106, 0x00005040, 0x00000000, 0x00000000,
|
0x00000000, 0x000f0013, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x04380780, 0x04380780,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x0f000200, 0x01390010,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x04000804, 0x00000000, 0x00000000, 0x00000000,
|
0x00021010, 0x00000000, 0x00000000, 0x00000000,
|
0x00400010, 0x01000100, 0x00200020, 0x00000100,
|
0x00200020, 0x00200020, 0x04000400, 0x04000400,
|
0x00200020, 0x00200020, 0x00ff00ff, 0x000000ff,
|
0x000f0013, 0x00000000, 0x00000000, 0x00000000,
|
0x00080008, 0x00000000, 0x00000000, 0x00000000,
|
0x40070f01, 0xfcff0080, 0x1f173c2d, 0x001845c8,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x01000100, 0x01000100, 0x00000fff, 0x00000010,
|
0x30000000, 0x00000080, 0x0003875c, 0x00400010,
|
0x02000200, 0x04000400, 0x00000000, 0x00000484,
|
0x00000808, 0x00420077, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x02040107, 0x07680064, 0x01c206d6, 0x068701c2,
|
0x000007b7, 0x02010010, 0x00000008, 0x00000000,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00000000, 0x00000000, 0x00000000,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x02108421, 0x02108421,
|
0x02108421, 0x02108421, 0x02108421, 0x02108421,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00000000, 0x00000000,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00080008, 0x00080008,
|
0x00080008, 0x00080008, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
#endif
|
};
|
|
/* REG LOAD*/
|
isp_gen->load_reg_base = malloc(ISP_LOAD_DRAM_SIZE);
|
if(isp_gen->load_reg_base == NULL) {
|
ISP_ERR("load_reg_base alloc failed, no memory!");
|
return -1;
|
}
|
memset(isp_gen->load_reg_base, 0, ISP_LOAD_REG_SIZE);
|
memcpy(isp_gen->load_reg_base, &isp_default_reg[0], ISP_LOAD_REG_SIZE);
|
|
isp_gen->module_cfg.isp_dev_id = isp_gen->isp_id;
|
isp_gen->module_cfg.isp_platform_id = ISP_PLATFORM_SUN8IW16P1;
|
|
isp_map_addr(&isp_gen->module_cfg, (unsigned long)isp_gen->load_reg_base);
|
#if (ISP_VERSION >= 520)
|
/*FE TABLE*/
|
isp_gen->module_cfg.fe_table = isp_gen->load_reg_base + ISP_LOAD_REG_SIZE;
|
memset(isp_gen->module_cfg.fe_table, 0, ISP_FE_TABLE_SIZE);
|
|
/*BAYER TABLE*/
|
isp_gen->module_cfg.bayer_table = isp_gen->module_cfg.fe_table + ISP_FE_TABLE_SIZE;
|
memset(isp_gen->module_cfg.bayer_table, 0, ISP_BAYER_TABLE_SIZE);
|
|
isp_gen->module_cfg.linear_table = isp_gen->module_cfg.bayer_table + ISP_S0_LINEAR_MEM_OFS;
|
isp_gen->module_cfg.wdr_table = isp_gen->module_cfg.bayer_table + ISP_WDR_GAMMA_FE_MEM_OFS;
|
isp_gen->module_cfg.lens_table = isp_gen->module_cfg.bayer_table + ISP_LSC_MEM_OFS;
|
isp_gen->module_cfg.tdnf_table = isp_gen->module_cfg.bayer_table + ISP_TDNF_K3D_MEM_OFS;
|
isp_gen->module_cfg.pltm_table = isp_gen->module_cfg.bayer_table + ISP_PLTM_H_MEM_OFS;
|
#if (ISP_VERSION >= 521)
|
isp_gen->module_cfg.msc_table = isp_gen->module_cfg.bayer_table + ISP_MSC_MEM_OFS;
|
#endif
|
/*RGB TABLE*/
|
isp_gen->module_cfg.rgb_table = isp_gen->module_cfg.bayer_table + ISP_BAYER_TABLE_SIZE;
|
memset(isp_gen->module_cfg.rgb_table, 0, ISP_RGB_TABLE_SIZE);
|
|
isp_gen->module_cfg.saturation_table = isp_gen->module_cfg.rgb_table + ISP_SATURATION_MEM_OFS;
|
isp_gen->module_cfg.drc_table = isp_gen->module_cfg.rgb_table + ISP_DRC_MEM_OFS;
|
isp_gen->module_cfg.gamma_table = isp_gen->module_cfg.rgb_table + ISP_GAMMA_MEM_OFS;
|
isp_gen->module_cfg.dehaze_table = isp_gen->module_cfg.rgb_table + ISP_DEHAZE_MEM_OFS;
|
|
/*YUV TABLE*/
|
isp_gen->module_cfg.yuv_table = isp_gen->module_cfg.rgb_table + ISP_RGB_TABLE_SIZE;
|
memset(isp_gen->module_cfg.yuv_table, 0, ISP_YUV_TABLE_SIZE);
|
|
isp_gen->module_cfg.cem_table = isp_gen->module_cfg.yuv_table + ISP_CEM_MEM_OFS;
|
#else
|
/* LINEAR TABLE */
|
isp_gen->module_cfg.table_mapping1 = isp_gen->load_reg_base + ISP_LOAD_REG_SIZE;
|
memset(isp_gen->module_cfg.table_mapping1, 0, ISP_TABLE_MAPPING1_SIZE);
|
|
isp_gen->module_cfg.lens_table = isp_gen->module_cfg.table_mapping1 + ISP_LSC_MEM_OFS;
|
isp_gen->module_cfg.gamma_table = isp_gen->module_cfg.table_mapping1 + ISP_GAMMA_MEM_OFS;
|
isp_gen->module_cfg.linear_table = isp_gen->module_cfg.table_mapping1 + ISP_LINEAR_MEM_OFS;
|
isp_gen->module_cfg.wdr_table = isp_gen->module_cfg.table_mapping1 + ISP_WDR_GAMMA_FE_MEM_OFS;
|
isp_gen->module_cfg.tdnf_table = isp_gen->module_cfg.table_mapping1 + ISP_TDNF_DIFF_MEM_OFS;
|
isp_gen->module_cfg.pltm_table = isp_gen->module_cfg.table_mapping1 + ISP_PLTM_H_MEM_OFS;
|
isp_gen->module_cfg.contrast_table = isp_gen->module_cfg.table_mapping1 + ISP_CONTRAST_PE_MEM_OFS;
|
|
/* DRC TABLE */
|
isp_gen->module_cfg.table_mapping2 = isp_gen->module_cfg.table_mapping1 + ISP_TABLE_MAPPING1_SIZE;
|
memset(isp_gen->module_cfg.table_mapping2, 0, ISP_TABLE_MAPPING2_SIZE);
|
|
isp_gen->module_cfg.drc_table = isp_gen->module_cfg.table_mapping2 + ISP_DRC_MEM_OFS;
|
isp_gen->module_cfg.saturation_table = isp_gen->module_cfg.table_mapping2 + ISP_SATURATION_MEM_OFS;
|
isp_gen->module_cfg.cem_table = isp_gen->module_cfg.table_mapping2 + ISP_CEM_MEM_OFS;
|
#endif
|
return 0;
|
}
|
|
int __isp_dump_reg(struct isp_lib_context *isp_gen)
|
{
|
int i, *reg;
|
printf("dump ISP%d regs :\n", isp_gen->isp_id);
|
for(i = 0; i < 0x40; i = i + 4)
|
{
|
reg = (int*)(isp_gen->load_reg_base + i);
|
if(i % 0x10 == 0)
|
printf("0x%08x: ", i);
|
printf("0x%08x, ", reg[0]);
|
if(i % 0x10 == 0xc)
|
printf("\n");
|
}
|
for(i = 0x40; i < 0x400; i = i + 4)
|
{
|
reg = (int*)(isp_gen->load_reg_base + i);
|
|
if(i % 0x10 == 0)
|
printf("0x%08x: ", i);
|
printf("0x%08x, ", reg[0]);
|
if(i % 0x10 == 0xc)
|
printf("\n");
|
}
|
|
return 0;
|
}
|
|
HW_S32 isp_ctx_stats_prepare(struct isp_lib_context *isp_gen, const void *buffer)
|
{ FUNCTION_LOG;
|
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
isp_handle_stats(isp_gen, buffer);
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
|
return 0;
|
}
|
HW_S32 isp_ctx_stats_prepare_sync(struct isp_lib_context *isp_gen, const void *buffer0, const void *buffer1)
|
{ FUNCTION_LOG;
|
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
isp_handle_stats_sync(isp_gen, buffer0, buffer1);
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
|
return 0;
|
}
|
|
|
HW_S32 isp_ctx_stats_req(struct isp_lib_context *isp_gen,
|
struct isp_stats_context *stats_ctx)
|
{ FUNCTION_LOG;
|
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
*stats_ctx = isp_gen->stats_ctx;
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
|
return 0;
|
}
|
|
HW_S32 __isp_ctx_update_iso_cfg(struct isp_lib_context *isp_gen)
|
{
|
isp_iso_entity_context_t *isp_iso_cxt = &isp_gen->iso_entity_ctx;
|
|
if (!isp_gen->iso_entity_ctx.iso_param) {
|
return -1;
|
}
|
|
isp_gen->iso_entity_ctx.iso_param->isp_gen = isp_gen;
|
isp_iso_set_params_helper(&isp_gen->iso_entity_ctx, ISP_ISO_UPDATE_PARAMS);
|
|
isp_gen->iso_entity_ctx.iso_param->cnr_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->sharpness_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->saturation_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->contrast_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->brightness_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->cem_ratio_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->denoise_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->sensor_offset_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->black_level_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->dpc_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->defog_value_adjust = true;
|
#if (ISP_VERSION != 522)
|
isp_gen->iso_entity_ctx.iso_param->pltm_dynamic_cfg_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->tdnr_adjust = true;
|
#endif
|
isp_gen->iso_entity_ctx.iso_param->ae_cfg_adjust = true;
|
isp_gen->iso_entity_ctx.iso_param->gtm_cfg_adjust = true;
|
#if (ISP_VERSION >= 521)
|
isp_gen->iso_entity_ctx.iso_param->lca_cfg_adjust = true;
|
#endif
|
#if (ISP_VERSION >= 520)
|
if((isp_gen->isp_ini_cfg.isp_test_settings.af_en == 1) || (isp_gen->isp_ini_cfg.isp_test_settings.isp_test_focus == 1))
|
isp_gen->iso_entity_ctx.iso_param->af_cfg_adjust = true;
|
else
|
isp_gen->iso_entity_ctx.iso_param->af_cfg_adjust = false;
|
#endif
|
|
isp_gen->iso_entity_ctx.iso_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
|
isp_gen->iso_entity_ctx.iso_param->isp_denoise_lp0_np_core_retio = 16;
|
isp_gen->iso_entity_ctx.iso_param->isp_denoise_lp1_np_core_retio = 20;
|
isp_gen->iso_entity_ctx.iso_param->isp_denoise_lp2_np_core_retio = 24;
|
isp_gen->iso_entity_ctx.iso_param->isp_denoise_lp3_np_core_retio = 28;
|
|
isp_iso_cxt->ops->isp_iso_run(isp_iso_cxt->iso_entity, &isp_iso_cxt->iso_result);
|
|
return 0;
|
}
|
|
HW_S32 __isp_ctx_update_af_cfg(struct isp_lib_context *isp_gen)
|
{
|
if (!isp_gen->af_entity_ctx.af_param) {
|
return -1;
|
}
|
|
//af_ini_cfg.
|
isp_gen->af_entity_ctx.af_param->af_ini.af_use_otp = isp_gen->isp_ini_cfg.isp_3a_settings.af_use_otp;
|
isp_gen->af_entity_ctx.af_param->af_ini.vcm_min_code = isp_gen->isp_ini_cfg.isp_3a_settings.vcm_min_code;
|
isp_gen->af_entity_ctx.af_param->af_ini.vcm_max_code = isp_gen->isp_ini_cfg.isp_3a_settings.vcm_max_code;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_interval_time = isp_gen->isp_ini_cfg.isp_3a_settings.af_interval_time;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_speed_ind = isp_gen->isp_ini_cfg.isp_3a_settings.af_speed_ind;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_auto_fine_en = isp_gen->isp_ini_cfg.isp_3a_settings.af_auto_fine_en;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_single_fine_en = isp_gen->isp_ini_cfg.isp_3a_settings.af_single_fine_en;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_fine_step = isp_gen->isp_ini_cfg.isp_3a_settings.af_fine_step;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_move_cnt = isp_gen->isp_ini_cfg.isp_3a_settings.af_move_cnt;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_still_cnt = isp_gen->isp_ini_cfg.isp_3a_settings.af_still_cnt;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_move_monitor_cnt = isp_gen->isp_ini_cfg.isp_3a_settings.af_move_monitor_cnt;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_still_monitor_cnt = isp_gen->isp_ini_cfg.isp_3a_settings.af_still_monitor_cnt;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_stable_min = isp_gen->isp_ini_cfg.isp_3a_settings.af_stable_min;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_stable_max = isp_gen->isp_ini_cfg.isp_3a_settings.af_stable_max;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_low_light_lv = isp_gen->isp_ini_cfg.isp_3a_settings.af_low_light_lv;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_near_tolerance = isp_gen->isp_ini_cfg.isp_3a_settings.af_near_tolerance;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_far_tolerance = isp_gen->isp_ini_cfg.isp_3a_settings.af_far_tolerance;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_tolerance_off = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_off;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_peak_th = isp_gen->isp_ini_cfg.isp_3a_settings.af_peak_th;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_dir_th = isp_gen->isp_ini_cfg.isp_3a_settings.af_dir_th;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_change_ratio = isp_gen->isp_ini_cfg.isp_3a_settings.af_change_ratio;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_move_minus = isp_gen->isp_ini_cfg.isp_3a_settings.af_move_minus;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_still_minus = isp_gen->isp_ini_cfg.isp_3a_settings.af_still_minus;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_scene_motion_th = isp_gen->isp_ini_cfg.isp_3a_settings.af_scene_motion_th;
|
isp_gen->af_entity_ctx.af_param->af_ini.af_tolerance_tbl_len = isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_tbl_len;
|
memcpy(&isp_gen->af_entity_ctx.af_param->af_ini.af_std_code_tbl[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.af_std_code_tbl[0], 20*sizeof(int));
|
memcpy(&isp_gen->af_entity_ctx.af_param->af_ini.af_tolerance_value_tbl[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.af_tolerance_value_tbl[0], 20*sizeof(int));
|
isp_af_set_params_helper(&isp_gen->af_entity_ctx, ISP_AF_INI_DATA);
|
|
isp_gen->af_entity_ctx.af_param->vcm.vcm_max_code = isp_gen->isp_ini_cfg.isp_3a_settings.vcm_max_code;
|
isp_gen->af_entity_ctx.af_param->vcm.vcm_min_code = isp_gen->isp_ini_cfg.isp_3a_settings.vcm_min_code;
|
|
isp_gen->af_entity_ctx.af_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
isp_gen->af_entity_ctx.af_param->test_cfg.isp_test_focus = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_focus;
|
isp_gen->af_entity_ctx.af_param->test_cfg.focus_start = isp_gen->isp_ini_cfg.isp_test_settings.focus_start;
|
isp_gen->af_entity_ctx.af_param->test_cfg.focus_step = isp_gen->isp_ini_cfg.isp_test_settings.focus_step;
|
isp_gen->af_entity_ctx.af_param->test_cfg.focus_end = isp_gen->isp_ini_cfg.isp_test_settings.focus_end;
|
isp_gen->af_entity_ctx.af_param->test_cfg.focus_change_interval = isp_gen->isp_ini_cfg.isp_test_settings.focus_change_interval;
|
isp_gen->af_entity_ctx.af_param->test_cfg.af_en = isp_gen->isp_ini_cfg.isp_test_settings.af_en;
|
|
return 0;
|
}
|
HW_S32 __isp_ctx_update_awb_cfg(struct isp_lib_context *isp_gen)
|
{
|
if (!isp_gen->awb_entity_ctx.awb_param) {
|
return -1;
|
}
|
|
//awb_ini_cfg.
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_interval = isp_gen->isp_ini_cfg.isp_3a_settings.awb_interval;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_speed = isp_gen->isp_ini_cfg.isp_3a_settings.awb_speed;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_color_temper_low = isp_gen->isp_ini_cfg.isp_3a_settings.awb_color_temper_low;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_color_temper_high = isp_gen->isp_ini_cfg.isp_3a_settings.awb_color_temper_high;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_base_temper = isp_gen->isp_ini_cfg.isp_3a_settings.awb_base_temper;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_green_zone_dist = isp_gen->isp_ini_cfg.isp_3a_settings.awb_green_zone_dist;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_blue_sky_dist = isp_gen->isp_ini_cfg.isp_3a_settings.awb_blue_sky_dist;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_light_num = isp_gen->isp_ini_cfg.isp_3a_settings.awb_light_num;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_ext_light_num = isp_gen->isp_ini_cfg.isp_3a_settings.awb_ext_light_num;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_skin_color_num = isp_gen->isp_ini_cfg.isp_3a_settings.awb_skin_color_num;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_special_color_num = isp_gen->isp_ini_cfg.isp_3a_settings.awb_special_color_num;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_rgain_favor = isp_gen->isp_ini_cfg.isp_3a_settings.awb_rgain_favor;
|
isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_bgain_favor = isp_gen->isp_ini_cfg.isp_3a_settings.awb_bgain_favor;
|
memcpy(&isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_light_info[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.awb_light_info[0], 320*sizeof(int));
|
memcpy(&isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_ext_light_info[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.awb_ext_light_info[0], 320*sizeof(int));
|
memcpy(&isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_skin_color_info[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.awb_skin_color_info[0], 160*sizeof(int));
|
memcpy(&isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_special_color_info[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.awb_special_color_info[0], 320*sizeof(int));
|
memcpy(&isp_gen->awb_entity_ctx.awb_param->awb_ini.awb_preset_gain[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.awb_preset_gain[0], 22*sizeof(int));
|
|
isp_awb_set_params_helper(&isp_gen->awb_entity_ctx, ISP_AWB_INI_DATA);
|
|
//test cfg.
|
isp_gen->awb_entity_ctx.awb_param->test_cfg.awb_en = isp_gen->isp_ini_cfg.isp_test_settings.awb_en;
|
isp_gen->awb_entity_ctx.awb_param->test_cfg.isp_color_temp = isp_gen->isp_ini_cfg.isp_test_settings.isp_color_temp;
|
isp_gen->awb_entity_ctx.awb_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
|
return 0;
|
}
|
HW_S32 __isp_ctx_update_ae_cfg(struct isp_lib_context *isp_gen)
|
{
|
//struct isp_param_config *param = &isp_gen->isp_ini_cfg;
|
|
if (!isp_gen->ae_entity_ctx.ae_param) {
|
return -1;
|
}
|
|
//ae_sensor_info.
|
isp_gen->ae_entity_ctx.ae_param->ae_sensor_info = isp_gen->sensor_info;
|
//ae_ini_cfg.
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.define_ae_table = isp_gen->isp_ini_cfg.isp_3a_settings.define_ae_table;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_max_lv = isp_gen->isp_ini_cfg.isp_3a_settings.ae_max_lv;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].length = isp_gen->isp_ini_cfg.isp_3a_settings.ae_table_preview_length;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].length = isp_gen->isp_ini_cfg.isp_3a_settings.ae_table_capture_length;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].length = isp_gen->isp_ini_cfg.isp_3a_settings.ae_table_video_length;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_hist_mod_en = isp_gen->isp_ini_cfg.isp_3a_settings.ae_hist_mod_en;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_ki = isp_gen->isp_ini_cfg.isp_3a_settings.ae_ki;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_ConvDataIndex = isp_gen->isp_ini_cfg.isp_3a_settings.ae_ConvDataIndex;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_blowout_pre_en = isp_gen->isp_ini_cfg.isp_3a_settings.ae_blowout_pre_en;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_blowout_attr = isp_gen->isp_ini_cfg.isp_3a_settings.ae_blowout_attr;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_delay_frame = isp_gen->isp_ini_cfg.isp_3a_settings.ae_delay_frame;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.exp_delay_frame = isp_gen->isp_ini_cfg.isp_3a_settings.exp_delay_frame;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.gain_delay_frame = isp_gen->isp_ini_cfg.isp_3a_settings.gain_delay_frame;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.exp_comp_step = isp_gen->isp_ini_cfg.isp_3a_settings.exp_comp_step;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_touch_dist_ind = isp_gen->isp_ini_cfg.isp_3a_settings.ae_touch_dist_ind;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_iso2gain_ratio = isp_gen->isp_ini_cfg.isp_3a_settings.ae_iso2gain_ratio;
|
isp_gen->ae_settings.flicker_type = isp_gen->isp_ini_cfg.isp_tunning_settings.flicker_type;
|
|
// wdr mode: 0 is default, use 256
|
isp_gen->isp_ini_cfg.isp_3a_settings.wdr_cfg[WDR_MODE] = 0;
|
|
// gain_ratio: 0
|
//isp_gen->ae_entity_ctx.ae_param->ae_ini.gain_ratio = isp_gen->isp_ini_cfg.isp_3a_settings.gain_ratio;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.gain_ratio = 0;
|
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_analog_gain_range[0], &isp_gen->isp_ini_cfg.isp_3a_settings.ae_analog_gain_range[0], 2*sizeof(int));
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_digital_gain_range[0], &isp_gen->isp_ini_cfg.isp_3a_settings.ae_digital_gain_range[0], 2*sizeof(int));
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_digital_gain_range[0] = 1024;
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_digital_gain_range[1] = 1024 * 3;
|
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_fno_step[0], &isp_gen->isp_ini_cfg.isp_3a_settings.ae_fno_step[0], 16*sizeof(int));
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.wdr_cfg[0], &isp_gen->isp_ini_cfg.isp_3a_settings.wdr_cfg[0], ISP_WDR_CFG_MAX*sizeof(int));
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].ae_tbl[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.ae_table_preview[0], 42*sizeof(int));
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].ae_tbl[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.ae_table_capture[0], 42*sizeof(int));
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].ae_tbl[0],
|
&isp_gen->isp_ini_cfg.isp_3a_settings.ae_table_video[0], 42*sizeof(int));
|
memcpy(&isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_win_weight[0], &isp_gen->isp_ini_cfg.isp_3a_settings.ae_win_weight[0], 64*sizeof(int));
|
|
isp_ae_set_params_helper(&isp_gen->ae_entity_ctx, ISP_AE_INI_DATA);
|
|
//test cfg.
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.isp_gain = isp_gen->isp_ini_cfg.isp_test_settings.isp_gain;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.isp_exp_line = isp_gen->isp_ini_cfg.isp_test_settings.isp_exp_line;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.ae_forced = isp_gen->isp_ini_cfg.isp_test_settings.ae_forced;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.lum_forced = isp_gen->isp_ini_cfg.isp_test_settings.lum_forced;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.isp_test_exptime = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_exptime;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.exp_line_start = isp_gen->isp_ini_cfg.isp_test_settings.exp_line_start;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.exp_line_step = isp_gen->isp_ini_cfg.isp_test_settings.exp_line_step;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.exp_line_end = isp_gen->isp_ini_cfg.isp_test_settings.exp_line_end;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.exp_change_interval = isp_gen->isp_ini_cfg.isp_test_settings.exp_change_interval;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.isp_test_gain = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_gain;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.gain_start = isp_gen->isp_ini_cfg.isp_test_settings.gain_start;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.gain_step = isp_gen->isp_ini_cfg.isp_test_settings.gain_step;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.gain_end = isp_gen->isp_ini_cfg.isp_test_settings.gain_end;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.gain_change_interval = isp_gen->isp_ini_cfg.isp_test_settings.gain_change_interval;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.ae_en = isp_gen->isp_ini_cfg.isp_test_settings.ae_en;
|
|
// Check ae hardware delay.
|
// When check isp wdr/dg delay, we should set ae_stat_sel equals 2, because the stat date before the wdr dealt was not changed.
|
// When check sensor exp/ag delay, we should set ae_stat_sel equals 0, because the stat date after the wdr dealt was not accurate.
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.ae_check_delay_en = 0;
|
isp_gen->ae_entity_ctx.ae_param->test_cfg.ae_delay_type = ISP_AE_DELAY_WDR_AGAIN;
|
|
isp_ae_set_params_helper(&isp_gen->ae_entity_ctx, ISP_AE_UPDATE_AE_TABLE);
|
|
//get gain range
|
isp_gen->tune.gains.ana_gain_min = isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_analog_gain_range[0];
|
isp_gen->tune.gains.ana_gain_max = isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_analog_gain_range[1];
|
isp_gen->tune.gains.dig_gain_min = isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_digital_gain_range[0]/4; /*Q10 -> Q8*/
|
isp_gen->tune.gains.dig_gain_max = isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_digital_gain_range[1]/4;
|
|
return 0;
|
}
|
|
HW_S32 __isp_ctx_update_afs_cfg(struct isp_lib_context *isp_gen)
|
{
|
if (!isp_gen->afs_entity_ctx.afs_param) {
|
return -1;
|
}
|
|
isp_gen->afs_entity_ctx.afs_param->flicker_ratio = isp_gen->isp_ini_cfg.isp_tunning_settings.flicker_ratio;
|
isp_gen->afs_entity_ctx.afs_param->flicker_type_ini = isp_gen->isp_ini_cfg.isp_tunning_settings.flicker_type;
|
isp_gen->afs_entity_ctx.afs_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
isp_gen->afs_entity_ctx.afs_param->test_cfg.afs_en = isp_gen->isp_ini_cfg.isp_test_settings.afs_en;
|
|
return 0;
|
}
|
|
HW_S32 __isp_ctx_update_md_cfg(struct isp_lib_context *isp_gen)
|
{
|
if (!isp_gen->md_entity_ctx.md_param) {
|
return -1;
|
}
|
|
isp_gen->md_entity_ctx.md_param->af_scene_motion_th = isp_gen->isp_ini_cfg.isp_3a_settings.af_scene_motion_th;
|
isp_gen->md_entity_ctx.md_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
|
return 0;
|
}
|
|
HW_S32 __isp_ctx_update_rolloff_cfg(struct isp_lib_context *isp_gen)
|
{
|
int m;
|
|
if (!isp_gen->rolloff_entity_ctx.rolloff_param) {
|
return -1;
|
}
|
|
//rolloff_sensor_info.
|
isp_gen->rolloff_entity_ctx.rolloff_param->rolloff_sensor_info = isp_gen->sensor_info;
|
|
for (m = 0; m < 11 * ROLLOFF_WIN_SIZE; m++) {
|
isp_gen->rolloff_entity_ctx.rolloff_param->rolloff_ini.Rgain[m]
|
= isp_gen->isp_ini_cfg.isp_tunning_settings.msc_tbl[(m / ROLLOFF_WIN_SIZE) + 1][m % ROLLOFF_WIN_SIZE];
|
}
|
|
isp_rolloff_set_params_helper(&isp_gen->rolloff_entity_ctx, ISP_ROLLOFF_INI_DATA);
|
|
return 0;
|
}
|
HW_S32 __isp_ctx_update_gtm_cfg(struct isp_lib_context *isp_gen)
|
{
|
if (!isp_gen->gtm_entity_ctx.gtm_param) {
|
return -1;
|
}
|
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_enable = isp_gen->isp_ini_cfg.isp_test_settings.gtm_en;
|
isp_gen->gtm_entity_ctx.gtm_param->gamma_tbl = &isp_gen->module_cfg.gamma_cfg.gamma_tbl[0];
|
isp_gen->gtm_entity_ctx.gtm_param->drc_table = &isp_gen->module_cfg.drc_cfg.drc_table[0];
|
isp_gen->gtm_entity_ctx.gtm_param->drc_table_last = &isp_gen->module_cfg.drc_cfg.drc_table_last[0];
|
//gtm_ini_cfg.
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.gtm_type = isp_gen->isp_ini_cfg.isp_tunning_settings.gtm_type;
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.gamma_type = isp_gen->isp_ini_cfg.isp_tunning_settings.gamma_type;
|
isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.AutoAlphaEn = isp_gen->isp_ini_cfg.isp_tunning_settings.auto_alpha_en;
|
memcpy(&isp_gen->gtm_entity_ctx.gtm_param->gtm_ini.gtm_cfg[0], &isp_gen->ae_settings.ae_hist_eq_cfg[0], GTM_HEQ_MAX*sizeof(int));
|
isp_gtm_set_params_helper(&isp_gen->gtm_entity_ctx, ISP_GTM_INI_DATA);
|
|
//test cfg.
|
isp_gen->gtm_entity_ctx.gtm_param->test_cfg.isp_test_mode = isp_gen->isp_ini_cfg.isp_test_settings.isp_test_mode;
|
|
return 0;
|
}
|
|
HW_S32 __isp_ctx_update_pltm_cfg(struct isp_lib_context *isp_gen)
|
{
|
if (!isp_gen->pltm_entity_ctx.pltm_param) {
|
return -1;
|
}
|
|
isp_gen->pltm_entity_ctx.pltm_param->pltm_enable = isp_gen->isp_ini_cfg.isp_test_settings.pltm_en;
|
isp_gen->pltm_entity_ctx.pltm_param->ae_enable= isp_gen->isp_ini_cfg.isp_test_settings.ae_en;
|
//pltm sensor_info.
|
isp_gen->pltm_entity_ctx.pltm_param->sensor_info = isp_gen->sensor_info;
|
//pltm table
|
isp_gen->pltm_entity_ctx.pltm_param->pltm_table = (HW_U16 *)isp_gen->isp_ini_cfg.isp_tunning_settings.isp_pltm_table;
|
//pltm_ini_cfg.
|
memcpy(&isp_gen->pltm_entity_ctx.pltm_param->pltm_ini.pltm_cfg[0],
|
&isp_gen->isp_ini_cfg.isp_tunning_settings.pltm_cfg[0], ISP_PLTM_MAX*sizeof(HW_S32));
|
memcpy(&isp_gen->pltm_entity_ctx.pltm_param->pltm_ini.pltm_dynamic_cfg[0],
|
&isp_gen->ae_settings.pltm_dynamic_cfg[0], ISP_PLTM_DYNAMIC_MAX*sizeof(HW_S32));
|
|
return 0;
|
}
|
|
void __isp_ctx_config(struct isp_lib_context *isp_gen)
|
{
|
__isp_ctx_apply_enable(isp_gen);
|
|
__isp_ctx_cfg_lib(isp_gen);
|
|
__isp_ctx_cfg_mod(isp_gen);
|
|
__isp_ctx_update_iso_cfg(isp_gen);
|
|
__isp_ctx_update_af_cfg(isp_gen);
|
|
__isp_ctx_update_ae_cfg(isp_gen);
|
|
__isp_ctx_update_awb_cfg(isp_gen);
|
|
__isp_ctx_update_gtm_cfg(isp_gen);
|
|
__isp_ctx_update_pltm_cfg(isp_gen);
|
|
__isp_ctx_update_afs_cfg(isp_gen);
|
|
__isp_ctx_update_md_cfg(isp_gen);
|
|
__isp_ctx_update_rolloff_cfg(isp_gen);
|
}
|
|
void __isp_ctx_update(struct isp_lib_context *isp_gen)
|
{
|
__isp_ctx_apply_enable(isp_gen);
|
|
__isp_ctx_cfg_mod(isp_gen);
|
|
__isp_ctx_update_iso_cfg(isp_gen);
|
|
__isp_ctx_update_af_cfg(isp_gen);
|
|
__isp_ctx_update_ae_cfg(isp_gen);
|
|
__isp_ctx_update_awb_cfg(isp_gen);
|
|
__isp_ctx_update_gtm_cfg(isp_gen);
|
|
__isp_ctx_update_pltm_cfg(isp_gen);
|
|
__isp_ctx_update_afs_cfg(isp_gen);
|
|
__isp_ctx_update_md_cfg(isp_gen);
|
|
__isp_ctx_update_rolloff_cfg(isp_gen);
|
}
|
|
int isp_ctx_algo_init(struct isp_lib_context *isp_gen, const struct isp_ctx_operations *ops)
|
{
|
//ISO init
|
isp_gen->iso_entity_ctx.iso_entity = iso_init(&isp_gen->iso_entity_ctx.ops);
|
if (isp_gen->iso_entity_ctx.iso_entity == NULL || NULL == isp_gen->iso_entity_ctx.ops) {
|
ISP_ERR("ISO Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->iso_entity_ctx.ops->isp_iso_get_params(isp_gen->iso_entity_ctx.iso_entity, &isp_gen->iso_entity_ctx.iso_param);
|
isp_gen->iso_entity_ctx.iso_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
#if ISP_LIB_USE_AF
|
//AF init
|
isp_gen->af_entity_ctx.af_entity = af_init(&isp_gen->af_entity_ctx.ops);
|
if (isp_gen->af_entity_ctx.af_entity == NULL || NULL == isp_gen->af_entity_ctx.ops) {
|
ISP_ERR("AF Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->af_entity_ctx.ops->isp_af_get_params(isp_gen->af_entity_ctx.af_entity, &isp_gen->af_entity_ctx.af_param);
|
isp_gen->af_entity_ctx.af_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
#endif
|
//AFS init
|
isp_gen->afs_entity_ctx.afs_entity = afs_init(&isp_gen->afs_entity_ctx.ops);
|
if (isp_gen->afs_entity_ctx.afs_entity == NULL || NULL == isp_gen->afs_entity_ctx.ops) {
|
ISP_ERR("AFS Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->afs_entity_ctx.ops->isp_afs_get_params(isp_gen->afs_entity_ctx.afs_entity, &isp_gen->afs_entity_ctx.afs_param);
|
isp_gen->afs_entity_ctx.afs_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
|
#if ISP_LIB_USE_MD
|
//MD init
|
isp_gen->md_entity_ctx.md_entity = md_init(&isp_gen->md_entity_ctx.ops);
|
if (isp_gen->md_entity_ctx.md_entity == NULL || NULL == isp_gen->md_entity_ctx.ops) {
|
ISP_ERR("MD Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->md_entity_ctx.ops->isp_md_get_params(isp_gen->md_entity_ctx.md_entity, &isp_gen->md_entity_ctx.md_param);
|
isp_gen->md_entity_ctx.md_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
#endif
|
|
//AWB init
|
isp_gen->awb_entity_ctx.awb_entity = awb_init(&isp_gen->awb_entity_ctx.ops);
|
if (isp_gen->awb_entity_ctx.awb_entity == NULL || NULL == isp_gen->awb_entity_ctx.ops) {
|
ISP_ERR("AWB Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->awb_entity_ctx.ops->isp_awb_get_params(isp_gen->awb_entity_ctx.awb_entity, &isp_gen->awb_entity_ctx.awb_param);
|
isp_gen->awb_entity_ctx.awb_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
|
//AE init
|
isp_gen->ae_entity_ctx.ae_entity = ae_init(&isp_gen->ae_entity_ctx.ops);
|
if (isp_gen->ae_entity_ctx.ae_entity == NULL || NULL == isp_gen->ae_entity_ctx.ops) {
|
ISP_ERR("AE Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->ae_entity_ctx.ops->isp_ae_get_params(isp_gen->ae_entity_ctx.ae_entity, &isp_gen->ae_entity_ctx.ae_param);
|
isp_gen->ae_entity_ctx.ae_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
|
//GTM init
|
isp_gen->gtm_entity_ctx.gtm_entity = gtm_init(&isp_gen->gtm_entity_ctx.ops);
|
if (isp_gen->gtm_entity_ctx.gtm_entity == NULL || NULL == isp_gen->gtm_entity_ctx.ops) {
|
ISP_ERR("GTM Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->gtm_entity_ctx.ops->isp_gtm_get_params(isp_gen->gtm_entity_ctx.gtm_entity, &isp_gen->gtm_entity_ctx.gtm_param);
|
isp_gen->gtm_entity_ctx.gtm_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
//PLTM init
|
isp_gen->pltm_entity_ctx.pltm_entity = pltm_init(&isp_gen->pltm_entity_ctx.ops);
|
if (isp_gen->pltm_entity_ctx.pltm_entity == NULL || NULL == isp_gen->pltm_entity_ctx.ops) {
|
ISP_ERR("PLTM Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->pltm_entity_ctx.ops->isp_pltm_get_params(isp_gen->pltm_entity_ctx.pltm_entity, &isp_gen->pltm_entity_ctx.pltm_param);
|
isp_gen->pltm_entity_ctx.pltm_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
|
#if ISP_LIB_USE_ROLLOFF
|
//ROLLOFF init
|
isp_gen->rolloff_entity_ctx.rolloff_entity = rolloff_init(&isp_gen->rolloff_entity_ctx.ops);
|
if (isp_gen->rolloff_entity_ctx.rolloff_entity == NULL || NULL == isp_gen->rolloff_entity_ctx.ops) {
|
ISP_ERR("ROLLOFF Entity is BUSY or NULL!\n");
|
return -1;
|
} else {
|
isp_gen->rolloff_entity_ctx.ops->isp_rolloff_get_params(isp_gen->rolloff_entity_ctx.rolloff_entity, &isp_gen->rolloff_entity_ctx.rolloff_param);
|
isp_gen->rolloff_entity_ctx.rolloff_param->isp_platform_id = isp_gen->module_cfg.isp_platform_id;
|
}
|
#endif
|
isp_gen->ops = ops;
|
|
isp_gen->af_frame_cnt = 0;
|
isp_gen->ae_frame_cnt = 0;
|
isp_gen->awb_frame_cnt = 0;
|
isp_gen->gtm_frame_cnt = 0;
|
|
isp_gen->md_frame_cnt = 0;
|
isp_gen->afs_frame_cnt = 0;
|
isp_gen->iso_frame_cnt = 0;
|
isp_gen->rolloff_frame_cnt = 0;
|
isp_gen->alg_frame_cnt = 0;
|
|
if (__isp_alloc_reg_tbl(isp_gen))
|
return -1;
|
|
pthread_mutex_init(&(isp_gen->ctx_lock), NULL);
|
return 0;
|
}
|
|
HW_S32 isp_ctx_algo_run(struct isp_lib_context *isp_gen)
|
{
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
|
isp_get_saved_regs(isp_gen);
|
|
isp_apply_settings(isp_gen);
|
|
__isp_ae_set_params(isp_gen);
|
__isp_ae_run(isp_gen);
|
__isp_stat_dynamic_judge(isp_gen);
|
|
|
__isp_iso_set_params(isp_gen);
|
__isp_iso_run(isp_gen);
|
|
if (isp_gen->isp_ini_cfg.isp_test_settings.gtm_en) {
|
__isp_gtm_set_params(isp_gen);
|
__isp_gtm_run(isp_gen);
|
}
|
|
if (isp_gen->isp_ini_cfg.isp_test_settings.pltm_en) {
|
__isp_pltm_set_params(isp_gen);
|
__isp_pltm_run(isp_gen);
|
}
|
if (isp_gen->isp_ini_cfg.isp_test_settings.afs_en) {
|
__isp_afs_set_params(isp_gen);
|
__isp_afs_run(isp_gen);
|
}
|
#if ISP_LIB_USE_MD
|
if (isp_gen->isp_ini_cfg.isp_test_settings.af_en) {
|
__isp_md_set_params(isp_gen);
|
__isp_md_run(isp_gen);
|
}
|
#endif
|
|
#if ISP_LIB_USE_AF
|
__isp_af_set_params(isp_gen);
|
__isp_af_run(isp_gen);
|
#endif
|
|
__isp_awb_set_params(isp_gen);
|
__isp_awb_run(isp_gen);
|
|
if (isp_gen->isp_ini_cfg.isp_test_settings.lsc_en) {
|
config_lens_table(isp_gen, isp_gen->af_entity_ctx.af_result.std_code_output);
|
}
|
|
#if (ISP_VERSION >= 521)
|
if (isp_gen->isp_ini_cfg.isp_test_settings.msc_en) {
|
if (isp_gen->isp_ini_cfg.isp_tunning_settings.mff_mod >= 3) {
|
__isp_rolloff_set_params(isp_gen);
|
__isp_rolloff_run(isp_gen);
|
}
|
config_msc_table(isp_gen, isp_gen->af_entity_ctx.af_result.std_code_output);
|
}
|
#endif
|
|
isp_apply_colormatrix(isp_gen);
|
|
isp_gen->module_cfg.cfa_cfg.min_rgb = isp_gen->isp_ini_cfg.isp_test_settings.defog_en ? 1023 : 0;
|
|
FUNCTION_LOG;
|
|
isp_hardware_update(&isp_gen->module_cfg);
|
|
isp_gen->awb_frame_cnt++;
|
isp_gen->ae_frame_cnt++;
|
isp_gen->af_frame_cnt++;
|
isp_gen->alg_frame_cnt ++;
|
isp_gen->gtm_frame_cnt++;
|
isp_gen->md_frame_cnt++;
|
isp_gen->afs_frame_cnt ++;
|
isp_gen->iso_frame_cnt++;
|
isp_gen->rolloff_frame_cnt++;
|
FUNCTION_LOG;
|
//if (isp_gen->awb_frame_cnt % 10 == 0)
|
// __isp_dump_reg(isp_gen);
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
FUNCTION_LOG;
|
return 0;
|
}
|
|
int isp_ctx_algo_exit(struct isp_lib_context *isp_gen)
|
{
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
#if ISP_LIB_USE_AF
|
af_exit(isp_gen->af_entity_ctx.af_entity);
|
#endif
|
afs_exit(isp_gen->afs_entity_ctx.afs_entity);
|
#if ISP_LIB_USE_MD
|
md_exit(isp_gen->md_entity_ctx.md_entity);
|
#endif
|
awb_exit(isp_gen->awb_entity_ctx.awb_entity);
|
ae_exit(isp_gen->ae_entity_ctx.ae_entity);
|
gtm_exit(isp_gen->gtm_entity_ctx.gtm_entity);
|
pltm_exit(isp_gen->pltm_entity_ctx.pltm_entity);
|
iso_exit(isp_gen->iso_entity_ctx.iso_entity);
|
#if ISP_LIB_USE_ROLLOFF
|
rolloff_exit(isp_gen->rolloff_entity_ctx.rolloff_entity);
|
#endif
|
if(isp_gen->load_reg_base != NULL) {
|
free(isp_gen->load_reg_base);
|
isp_gen->load_reg_base = NULL;
|
}
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
|
pthread_mutex_destroy(&(isp_gen->ctx_lock));
|
|
return 0;
|
}
|
|
HW_S32 isp_ctx_update_ae_tbl(struct isp_lib_context *isp_gen, int sensor_fps)
|
{
|
int i = 0;
|
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
|
for(i = 0; i < isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].length; i++) {
|
if(isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].ae_tbl[i].max_exp < sensor_fps)
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].ae_tbl[i].max_exp = sensor_fps;
|
if(isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].ae_tbl[i].min_exp < sensor_fps)
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_PREVIEW].ae_tbl[i].min_exp = sensor_fps;
|
}
|
for(i = 0; i < isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].length; i++) {
|
if(isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].ae_tbl[i].max_exp < sensor_fps)
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].ae_tbl[i].max_exp = sensor_fps;
|
if(isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].ae_tbl[i].min_exp < sensor_fps)
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_CAPTURE].ae_tbl[i].min_exp = sensor_fps;
|
}
|
for(i = 0; i < isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].length; i++) {
|
if(isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].ae_tbl[i].max_exp < sensor_fps)
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].ae_tbl[i].max_exp = sensor_fps;
|
if(isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].ae_tbl[i].min_exp < sensor_fps)
|
isp_gen->ae_entity_ctx.ae_param->ae_ini.ae_tbl_scene[SCENE_MODE_VIDEO].ae_tbl[i].min_exp = sensor_fps;
|
}
|
isp_ae_set_params_helper(&isp_gen->ae_entity_ctx, ISP_AE_INI_DATA);
|
isp_ae_set_params_helper(&isp_gen->ae_entity_ctx, ISP_AE_UPDATE_AE_TABLE);
|
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
|
return 0;
|
}
|
|
int isp_ctx_config_update(struct isp_lib_context *isp_gen)
|
{
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
|
__isp_ctx_update(isp_gen);
|
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
|
return 0;
|
}
|
|
int isp_ctx_config_reset(struct isp_lib_context *isp_gen)
|
{
|
isp_ctx_config_init(isp_gen);
|
return 0;
|
}
|
|
int isp_ctx_config_init(struct isp_lib_context *isp_gen)
|
{
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
if (isp_gen->sensor_info.sensor_height == 0) {
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
ISP_ERR("sensor attribute is not init.\n");
|
return -1;
|
}
|
FUNCTION_LOG;
|
|
__isp_ctx_config(isp_gen);
|
|
//for isp_apply_settings
|
isp_gen->isp_3a_change_flags = 0xffffffff;
|
isp_gen->isp_3a_change_flags &= ~ISP_SET_BRIGHTNESS;
|
isp_gen->isp_3a_change_flags &= ~ISP_SET_CONTRAST;
|
isp_gen->isp_3a_change_flags &= ~ISP_SET_GAIN_STR;
|
isp_apply_settings(isp_gen);
|
|
isp_hardware_update(&isp_gen->module_cfg);
|
|
memset(&isp_gen->defog_ctx.min_rgb_pre[0], 0, 8*sizeof(int));
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
FUNCTION_LOG;
|
|
return 0;
|
}
|
|
HW_S32 isp_ctx_config_exit(struct isp_lib_context *isp_gen)
|
{
|
pthread_mutex_lock(&(isp_gen->ctx_lock));
|
pthread_mutex_unlock(&(isp_gen->ctx_lock));
|
return 0;
|
}
|