/* imx258_lib.c
*
* Copyright (c) 2015 Qualcomm Technologies, Inc.
* All Rights Reserved.
* Confidential and Proprietary - Qualcomm Technologies, Inc.
*
*/
#include <stdio.h>
#include <string.h>
#include "debug_lib.h"
#include "imx258_lib.h"
#if !defined RETURN_ERROR_ON_NULL
#define RETURN_ERROR_ON_NULL(expr)\
if ((expr) == NULL) {\
SERR("failed evaluated expression is NULL");\
return SENSOR_FAILURE;\
}
#endif
static unsigned int imx258_real_to_register_gain(float real_gain)
{
unsigned int reg_gain = 0;
if (real_gain < IMX258_MIN_AGAIN)
{
real_gain = IMX258_MIN_AGAIN;
SHIGH("IMX258 Requested gain(%f) is lower than the sensor minimum(%d)",
real_gain, IMX258_MIN_AGAIN);
}
else if (real_gain > IMX258_MAX_AGAIN)
{
real_gain = IMX258_MAX_AGAIN;
}
reg_gain = (unsigned int)(512.0 - (512.0 / real_gain));
return reg_gain;
}
/**
* FUNCTION: imx258_register_to_real_gain
*
* DESCRIPTION: Calcuate sensor real gain value
**/
static float imx258_register_to_real_gain(unsigned int reg_gain)
{
float gain;
if(reg_gain > IMX258_MAX_AGAIN_REG_VAL)
reg_gain = IMX258_MAX_AGAIN_REG_VAL;
gain = 512.0 / (512.0 - reg_gain);
return gain;
}
/**
* FUNCTION: imx258_digital_gain_calc
*
* DESCRIPTION: Calcuate the sensor digital gain
**/
static unsigned int imx258_digital_gain_calc(
float real_gain, float sensor_real_gain)
{
unsigned int reg_dig_gain = IMX258_MIN_DGAIN_REG_VAL;
float real_dig_gain = IMX258_MIN_DGAIN;
if(real_gain > IMX258_MAX_AGAIN)
{
real_dig_gain = real_gain / sensor_real_gain;
}
else
{
real_dig_gain = IMX258_MIN_DGAIN;
}
if(real_dig_gain > IMX258_MAX_DGAIN)
{
real_dig_gain = IMX258_MAX_DGAIN;
}
reg_dig_gain = (unsigned int)(real_dig_gain * 256);
return reg_dig_gain;
}
/**
* FUNCTION: sensor_calculate_exposure
*
* DESCRIPTION: Calcuate the sensor exposure
**/
int sensor_calculate_exposure(float real_gain,
unsigned int line_count, sensor_exposure_info_t *exp_info,
__attribute__((unused))float s_real_gain)
{
if (!exp_info)
{
return -1;
}
exp_info->reg_gain = imx258_real_to_register_gain(real_gain);
exp_info->sensor_real_gain =
imx258_register_to_real_gain(exp_info->reg_gain);
exp_info->sensor_digital_gain =
imx258_digital_gain_calc(real_gain, exp_info->sensor_real_gain);
exp_info->sensor_real_dig_gain =
(float)exp_info->sensor_digital_gain / IMX258_MAX_DGAIN_DECIMATOR;
exp_info->digital_gain =
real_gain /(exp_info->sensor_real_gain * exp_info->sensor_real_dig_gain);
exp_info->line_count = line_count;
return 0;
}
/**
* FUNCTION: imx258_fill_exposure_array
*
* DESCRIPTION: Fill the sensor exposure array
**/
static int sensor_fill_exposure_array(unsigned int gain,
unsigned int digital_gain, unsigned int line, unsigned int fl_lines,
__attribute__((unused)) int luma_avg,
__attribute__((unused)) unsigned int hdr_param,
struct camera_i2c_reg_setting* reg_setting,
__attribute__((unused)) unsigned int s_gain,
__attribute__((unused)) signed int s_linecount,
__attribute__((unused)) int is_hdr_enabled)
{
unsigned short i = 0;
unsigned short reg_count = 0;
if (!reg_setting)
{
return -1;
}
for (i = 0; i < sensor_lib_ptr.groupon_settings.size; i++) {
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.groupon_settings.reg_setting_a[i].reg_addr;
reg_setting->reg_setting[reg_count].reg_data =
sensor_lib_ptr.groupon_settings.reg_setting_a[i].reg_data;
reg_count = reg_count + 1;
}
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.output_reg_addr.frame_length_lines;
reg_setting->reg_setting[reg_count].reg_data = (fl_lines & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.output_reg_addr.frame_length_lines + 1;
reg_setting->reg_setting[reg_count].reg_data = (fl_lines & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.exp_gain_info.coarse_int_time_addr;
reg_setting->reg_setting[reg_count].reg_data = (line & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.exp_gain_info.coarse_int_time_addr + 1;
reg_setting->reg_setting[reg_count].reg_data = (line & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.exp_gain_info.global_gain_addr;
reg_setting->reg_setting[reg_count].reg_data = (gain & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.exp_gain_info.global_gain_addr + 1;
reg_setting->reg_setting[reg_count].reg_data = (gain & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_GR_ADDR;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_GR_ADDR + 1;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_R_ADDR;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_R_ADDR + 1;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_B_ADDR;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_B_ADDR + 1;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_GB_ADDR;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x0000FF00) >> 8;
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
reg_setting->reg_setting[reg_count].reg_addr = IMX258_DIG_GAIN_GB_ADDR + 1;
reg_setting->reg_setting[reg_count].reg_data = (digital_gain & 0x000000FF);
reg_setting->reg_setting[reg_count].delay = 0;
reg_count = reg_count + 1;
for (i = 0; i < sensor_lib_ptr.groupoff_settings.size; i++) {
reg_setting->reg_setting[reg_count].reg_addr =
sensor_lib_ptr.groupoff_settings.reg_setting_a[i].reg_addr;
reg_setting->reg_setting[reg_count].reg_data =
sensor_lib_ptr.groupoff_settings.reg_setting_a[i].reg_data;
reg_count = reg_count + 1;
}
reg_setting->size = reg_count;
reg_setting->addr_type = CAMERA_I2C_WORD_ADDR;
reg_setting->data_type = CAMERA_I2C_BYTE_DATA;
reg_setting->delay = 0;
return 0;
}
/**
* FUNCTION: sensor_open_lib
*
* DESCRIPTION: Open sensor library and returns data pointer
**/
void *sensor_open_lib(void)
{
return &sensor_lib_ptr;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
IMX258_13M_4Lane.zip (91个子文件)
IMX258_13M_4Lane
msm8953_camera.xml 5KB
chromatix_imx258_bear
common
Android.mk 1KB
chromatix_imx258_bear_common.h 169KB
chromatix_imx258_bear_common.c 930B
cpp
cpp_snapshot
chromatix_imx258_bear_snapshot_cpp.c 910B
Android.mk 1KB
chromatix_imx258_bear_snapshot_cpp.h 219KB
cpp_video
chromatix_imx258_bear_video_cpp.c 907B
Android.mk 1KB
chromatix_imx258_bear_video_cpp.h 218KB
cpp_liveshot
chromatix_imx258_bear_liveshot_cpp.c 910B
Android.mk 1KB
chromatix_imx258_bear_liveshot_cpp.h 216KB
cpp_preview
chromatix_imx258_bear_preview_cpp.h 218KB
Android.mk 1KB
chromatix_imx258_bear_preview_cpp.c 909B
Android.mk 93B
cpp_hfr_120
chromatix_imx258_bear_hfr_120_cpp.c 909B
chromatix_imx258_bear_hfr_120_cpp.h 218KB
Android.mk 1KB
cpp_hfr_90
chromatix_imx258_bear_hfr_90_cpp.h 218KB
Android.mk 1KB
chromatix_imx258_bear_hfr_90_cpp.c 908B
cpp_video_4k
chromatix_imx258_bear_video_4k_cpp.h 218KB
chromatix_imx258_bear_video_4k_cpp.c 910B
Android.mk 1KB
cpp_hfr_60
chromatix_imx258_bear_hfr_60_cpp.c 908B
Android.mk 1KB
chromatix_imx258_bear_hfr_60_cpp.h 218KB
postproc
chromatix_imx258_bear_sw_post_proc.h 25KB
Android.mk 1KB
chromatix_imx258_bear_sw_post_proc.c 926B
3A
hfr_120
chromatix_imx258_bear_hfr_120_lc898217xc.c 950B
Android.mk 1KB
chromatix_imx258_bear_hfr_120_lc898217xc.h 788KB
zsl_preview
Android.mk 1KB
chromatix_imx258_bear_zsl_preview_lc898217xc.h 789KB
chromatix_imx258_bear_zsl_preview_lc898217xc.c 954B
default_video
Android.mk 1KB
chromatix_imx258_bear_default_video_lc898217xc.h 788KB
chromatix_imx258_bear_default_video_lc898217xc.c 956B
default_preview
chromatix_imx258_bear_default_preview_lc898217xc.c 958B
chromatix_imx258_bear_default_preview_lc898217xc.h 789KB
Android.mk 1KB
hfr_90
chromatix_imx258_bear_hfr_90_lc898217xc.c 949B
chromatix_imx258_bear_hfr_90_lc898217xc.h 788KB
Android.mk 1KB
4k_preview
Android.mk 1KB
chromatix_imx258_bear_4k_preview_lc898217xc.h 788KB
chromatix_imx258_bear_4k_preview_lc898217xc.c 953B
Android.mk 93B
4k_video
chromatix_imx258_bear_4k_video_lc898217xc.h 788KB
Android.mk 1KB
chromatix_imx258_bear_4k_video_lc898217xc.c 951B
zsl_video
chromatix_imx258_bear_zsl_video_lc898217xc.c 952B
chromatix_imx258_bear_zsl_video_lc898217xc.h 788KB
Android.mk 1KB
hfr_60
chromatix_imx258_bear_hfr_60_lc898217xc.h 788KB
chromatix_imx258_bear_hfr_60_lc898217xc.c 949B
Android.mk 1KB
Android.mk 93B
isp
hfr_120
chromatix_imx258_bear_hfr_120.c 904B
Android.mk 1KB
chromatix_imx258_bear_hfr_120.h 404KB
video_4k
chromatix_imx258_bear_video_4k.c 904B
chromatix_imx258_bear_video_4k.h 404KB
Android.mk 1KB
snapshot
chromatix_imx258_bear_snapshot.c 905B
chromatix_imx258_bear_snapshot.h 403KB
Android.mk 1KB
preview
chromatix_imx258_bear_preview.c 904B
Android.mk 1KB
chromatix_imx258_bear_preview.h 404KB
video
chromatix_imx258_bear_video.h 404KB
chromatix_imx258_bear_video.c 901B
Android.mk 1KB
liveshot
chromatix_imx258_bear_liveshot.h 404KB
hfr_90
chromatix_imx258_bear_hfr_90.h 404KB
chromatix_imx258_bear_hfr_90.c 903B
Android.mk 1KB
Android.mk 93B
hfr_60
chromatix_imx258_bear_hfr_60.h 404KB
chromatix_imx258_bear_hfr_60.c 902B
Android.mk 1KB
imx258
Android.mk 1KB
imx258_lib.c 8KB
imx258_lib.h 43KB
imx258_pdaf.h 6KB
imx258_pdaf_flip_mirror.h 6KB
imx258_bear_chromatix.xml 5KB
device-vendor.mk 1KB
共 91 条
- 1
资源评论
yang涛
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功