/*
Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "ot_mpi_isp.h"
#include "ot_mpi_ae.h"
#include "ot_mpi_awb.h"
#include "securec.h"
#include "imx482_cmos_ex.h"
#include "imx482_cmos.h"
#define IMX482_ID 482
#define SENSOR_IMX482_WIDTH 1920
#define SENSOR_IMX482_HEIGHT 1080
#define IMX482_BLACK_LEVEL 800
#define IMX482_RATIO 64
#define higher_4bits(x) (((x) & 0xf0000) >> 16)
#define high_8bits(x) (((x) & 0xff00) >> 8)
#define low_8bits(x) ((x) & 0x00ff)
/****************************************************************************
* global variables *
****************************************************************************/
#define imx482_sensor_set_ctx(dev, ctx) ((g_imx482_sns_state[dev]) = (ctx))
#define imx482_sensor_reset_ctx(dev) (g_imx482_sns_state[dev] = TD_NULL)
static ot_isp_fswdr_mode g_fswdr_mode[OT_ISP_MAX_PIPE_NUM] = {
[0 ... OT_ISP_MAX_PIPE_NUM - 1] = OT_ISP_FSWDR_NORMAL_MODE
};
static td_u32 g_max_time_get_cnt[OT_ISP_MAX_PIPE_NUM] = {0};
static td_u32 g_init_exposure[OT_ISP_MAX_PIPE_NUM] = {0};
static td_u32 g_lines_per500ms[OT_ISP_MAX_PIPE_NUM] = {0};
static td_u16 g_init_wb_gain[OT_ISP_MAX_PIPE_NUM][OT_ISP_RGB_CHN_NUM] = {{0}};
static td_u16 g_sample_r_gain[OT_ISP_MAX_PIPE_NUM] = {0};
static td_u16 g_sample_b_gain[OT_ISP_MAX_PIPE_NUM] = {0};
static td_bool g_quick_start_en[OT_ISP_MAX_PIPE_NUM] = {TD_FALSE};
static td_bool g_ae_route_ex_valid[OT_ISP_MAX_PIPE_NUM] = {0};
static ot_isp_ae_route g_init_ae_route[OT_ISP_MAX_PIPE_NUM] = {{0}};
static ot_isp_ae_route_ex g_init_ae_route_ex[OT_ISP_MAX_PIPE_NUM] = {{0}};
static ot_isp_ae_route g_init_ae_route_sf[OT_ISP_MAX_PIPE_NUM] = {{0}};
static ot_isp_ae_route_ex g_init_ae_route_sf_ex[OT_ISP_MAX_PIPE_NUM] = {{0}};
typedef struct {
td_u8 hcg;
td_u32 brl;
td_u32 rhs1_max;
td_u32 rhs2_max;
} imx482_state;
imx482_state g_imx482_state[OT_ISP_MAX_PIPE_NUM] = {{0}};
ot_isp_sns_commbus g_imx482_bus_info[OT_ISP_MAX_PIPE_NUM] = {
[0] = { .i2c_dev = 0},
[1 ... OT_ISP_MAX_PIPE_NUM - 1] = { .i2c_dev = -1}
};
ot_isp_sns_state *g_imx482_sns_state[OT_ISP_MAX_PIPE_NUM] = {TD_NULL};
static td_bool blc_clamp_info[OT_ISP_MAX_PIPE_NUM] = {[0 ...(OT_ISP_MAX_PIPE_NUM - 1)] = TD_TRUE};
ot_isp_sns_commbus *imx482_get_bus_info(ot_vi_pipe vi_pipe)
{
return &g_imx482_bus_info[vi_pipe];
}
ot_isp_sns_state *imx482_get_ctx(ot_vi_pipe vi_pipe)
{
return g_imx482_sns_state[vi_pipe];
}
td_void imx482_set_blc_clamp_value(ot_vi_pipe vi_pipe, td_bool clamp_en)
{
blc_clamp_info[vi_pipe] = clamp_en;
}
const imx482_video_mode_tbl g_imx482_mode_tbl[IMX482_MODE_BUTT] = {
{IMX482_VMAX_1080P30_LINEAR, IMX482_FULL_LINES_MAX, 30, 0.8,
1920, 1080, 0, OT_WDR_MODE_NONE, "IMX482_SENSOR_1080P_30FPS_LINEAR_MODE"},
{IMX482_VMAX_1080P60TO30_WDR, IMX482_FULL_LINES_MAX_2TO1_WDR, 30, 16.51,
1920, 1080, 0, OT_WDR_MODE_2To1_LINE, "IMX482_SENSOR_1080P_30FPS_WDR_2TO1_MODE"},
};
/****************************************************************************
* local variables *
****************************************************************************/
/* Imx482 Register Address */
#define IMX482_SHR0_ADDR 0x3050
#define IMX482_SHR1_ADDR 0x3054
#define IMX482_SHR2_ADDR 0x3058
#define IMX482_RHS1_ADDR 0x3060
#define IMX482_RHS2_ADDR 0x3064
#define IMX482_GAIN_ADDR 0x3084
#define IMX482_HCG_ADDR 0x3034
#define IMX482_HCG_SEL1_ADDR 0x3035
#define IMX482_HCG_SEL2_ADDR 0x3036
#define IMX482_VMAX_ADDR 0x3024
#define IMX482_HMAX_ADDR 0x3028
#define IMX482_WDR_BRL 2210
#define imx482_err_mode_print(sensor_image_mode, sns_state) \
do { \
isp_err_trace("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", \
(sensor_image_mode)->width, \
(sensor_image_mode)->height, \
(sensor_image_mode)->fps, \
(sns_state)->wdr_mode); \
} while (0)
static td_void cmos_get_ae_comm_default(ot_vi_pipe vi_pipe, ot_isp_ae_sensor_default *ae_sns_dft,
const ot_isp_sns_state *sns_state)
{
ae_sns_dft->full_lines_std = sns_state->fl_std;
ae_sns_dft->flicker_freq = 50 * 256; /* light flicker freq: 50Hz, accuracy: 256 */
ae_sns_dft->full_lines_max = IMX482_FULL_LINES_MAX;
ae_sns_dft->hmax_times = (1000000000) / (sns_state->fl_std * 30); /* 1000000000ns, 30fps */
ae_sns_dft->again_accu.accu_type = OT_ISP_AE_ACCURACY_TABLE;
ae_sns_dft->again_accu.accuracy = 1;
ae_sns_dft->dgain_accu.accu_type = OT_ISP_AE_ACCURACY_TABLE;
ae_sns_dft->dgain_accu.accuracy = 1;
ae_sns_dft->isp_dgain_shift = 8; /* accuracy: 8 */
ae_sns_dft->min_isp_dgain_target = 1 << ae_sns_dft->isp_dgain_shift;
ae_sns_dft->max_isp_dgain_target = 2 << ae_sns_dft->isp_dgain_shift; /* max 2 */
if (g_lines_per500ms[vi_pipe] == 0) {
ae_sns_dft->lines_per500ms = sns_state->fl_std * 30 / 2; /* 30fps, div 2 */
} else {
ae_sns_dft->lines_per500ms = g_lines_per500ms[vi_pipe];
}
ae_sns_dft->max_iris_fno = OT_ISP_IRIS_F_NO_1_0;
ae_sns_dft->min_iris_fno = OT_ISP_IRIS_F_NO_32_0;
ae_sns_dft->ae_route_ex_valid = TD_FALSE;
ae_sns_dft->ae_route_attr.total_num = 0;
ae_sns_dft->ae_route_attr_ex.total_num = 0;
ae_sns_dft->quick_start.quick_start_enable = g_quick_start_en[vi_pipe];
ae_sns_dft->quick_start.black_frame_num = 0;
return;
}
static td_void cmos_get_ae_linear_default(ot_vi_pipe vi_pipe, ot_isp_ae_sensor_default *ae_sns_dft,
const ot_isp_sns_state *sns_state)
{
ae_sns_dft->int_time_accu.accu_type = OT_ISP_AE_ACCURACY_LINEAR;
ae_sns_dft->int_time_accu.accuracy = 2; /* accuracy 2 */
ae_sns_dft->int_time_accu.offset = 0;
ae_sns_dft->max_again = 62416; /* max 62416 */
ae_sns_dft->min_again = 1024; /* min 1024 */
ae_sns_dft->max_again_target = ae_sns_dft->max_again;
ae_sns_dft->min_again_target = ae_sns_dft->min_again;
ae_sns_dft->max_dgain = 1024; /* max 1024 */
ae_sns_dft->min_dgain = 1024; /* min 1024 */
ae_sns_dft->max_dgain_target = ae_sns_dft->max_dgain;
ae_sns_dft->min_dgain_target = ae_sns_dft->min_dgain;
ae_sns_dft->isp_dgain_shift = 8; /* accuracy: 8 */
ae_sns_dft->min_isp_dgain_target = 1 << ae_sns_dft->isp_dgain_shift;
ae_sns_dft->max_isp_dgain_target = 255 << ae_sns_dft->isp_dgain_shift; /* max 255 */
ae_sns_dft->ae_compensation = 0x38;
ae_sns_dft->ae_exp_mode = OT_ISP_AE_EXP_HIGHLIGHT_PRIOR;
ae_sns_dft->init_exposure = g_init_exposure[vi_pipe] ? g_init_exposure[vi_pipe] : 76151; /* init 76151 */
ae_sns_dft->max_int_time = sns_state->fl_std - 6; /* sub 6 */
ae_sns_dft->min_int_time = 2; /* min 2 */
ae_sns_dft->max_int_time_target = 65535; /* max 65535 */
ae_sns_dft->min_int_time_target = 1; /* min 1 */
ae_sns_dft->ae_route_ex_valid = g_ae_route_ex_valid[vi_pipe];
(td_void)memcpy_s(&ae_sns_dft->ae_route_attr, sizeof(ot_isp_ae_route),
&g_init_ae_route[vi_pipe], sizeof(ot_isp_ae_route));
(td_void)memcpy_s(&ae_sns_dft->ae_route_attr_ex, sizeof(ot_isp_ae_route_ex),
&g_init_ae_route_ex[vi_pipe], sizeof(ot_isp_ae_route_ex));
return;
}
static td_void cmos_get_ae_3to1_line_wdr_default(ot_vi_pipe vi_pipe, ot_isp_ae_sensor_default *ae_sns_dft,
const ot_isp_sns_state *sns_state)
{
ae_sns_dft->int_time_accu.accu_type = OT_ISP_AE_ACCURACY_L
sony-imx482 Arm-Linux下驱动程序源码,希望可以帮到大家
需积分: 5 70 浏览量
2023-06-28
16:07:59
上传
评论
收藏 59KB ZIP 举报
lchx8245
- 粉丝: 13
- 资源: 4
最新资源
- 基于Javascript和Python的微商城项目设计源码 - MicroMall
- 基于Java的网上订餐系统设计源码 - online ordering system
- 基于Javascript的超级美眉网络资源管理应用模块设计源码
- 基于Typescript和PHP的编程知识储备库设计源码 - study-php
- Screenshot_2024-05-28-11-40-58-177_com.tencent.mm.jpg
- 基于Dart的Flutter小提琴调音器APP设计源码 - violinhelper
- 基于JavaScript和CSS的随寻订购网页设计源码 - web-order
- 基于MATLAB的声纹识别系统设计源码 - VoiceprintRecognition
- 基于Java的微服务插件集合设计源码 - wsy-plugins
- 基于Vue和微信小程序的监理日志系统设计源码 - supervisionLog
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈