Squashed backup commit (no shallow-clone history issues) of xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2 branch, upstream commit 9eece662e) plus all fixes applied to get everpal_defconfig building clean against a modern (GCC 15.2.0) toolchain -- see the previous commit message on the lineage-23.2 branch (also in this repo history is not available here since this is a squashed snapshot; full incremental history lives in the local DL380 checkout and the upstream GitHub remote). Upstream: https://github.com/xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2)
681 lines
20 KiB
C
681 lines
20 KiB
C
/*
|
|
* Copyright (C) 2015 MediaTek Inc.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#define _USE_MATH_DEFINES
|
|
|
|
#include "OIS_func.h"
|
|
#include "OIS_coef.h"
|
|
#include "OIS_defi.h"
|
|
#include "OIS_head.h"
|
|
#include "OIS_prog.h"
|
|
|
|
/* ***************************************************** */
|
|
/* **** Program Download Function */
|
|
/* ***************************************************** */
|
|
short int func_PROGRAM_DOWNLOAD(void)
|
|
{
|
|
unsigned short int sts; /* RHM_HT 2013/04/15 Change "typedef". */
|
|
|
|
download(0, 0); /* Program Download */
|
|
sts = I2C_OIS_mem__read(_M_OIS_STS); /* Check Status */
|
|
|
|
if ((sts & 0x0004) == 0x0004) {
|
|
/* ==> RHM_HT 2013/07/10 Added */
|
|
unsigned short int u16_dat;
|
|
|
|
u16_dat = I2C_OIS_mem__read(_M_FIRMVER);
|
|
|
|
DEBUG_printf(("Firm Ver : %4d\n\n", u16_dat));
|
|
|
|
/* <== RHM_HT 2013/07/10 Added */
|
|
|
|
return ADJ_OK;
|
|
} else {
|
|
return PROG_DL_ERR;
|
|
}
|
|
}
|
|
|
|
/* ==> RHM_HT 2013/11/26 Reverted */
|
|
/* ***************************************************** */
|
|
/* **** COEF Download function */
|
|
/* ***************************************************** */
|
|
unsigned short int INTG__INPUT; /* Integral Input value szx_2014/12/24_2 */
|
|
unsigned short int
|
|
KGNTG_VALUE; /* KgxTG / KgyTG szx_2014/12/24_2 */
|
|
unsigned short int GYRSNS; /* RHM_HT 2015/01/16 Added */
|
|
|
|
void func_COEF_DOWNLOAD(unsigned short int u16_coef_type)
|
|
{
|
|
download(1, u16_coef_type); /* COEF Download */
|
|
|
|
{
|
|
unsigned short int u16_dat;
|
|
|
|
/* Coef type */
|
|
u16_dat = I2C_OIS_mem__read(_M_CEFTYP);
|
|
|
|
DEBUG_printf(
|
|
("COEF M[0x%02x] 0x%04X\n", _M_CEFTYP, u16_dat));
|
|
}
|
|
/* Get default Integ_input and KgnTG value */
|
|
INTG__INPUT = I2C_OIS_mem__read(0x38);
|
|
|
|
KGNTG_VALUE = I2C_OIS_mem__read(_M_KgxTG);
|
|
|
|
GYRSNS = I2C_OIS_mem__read(_M_GYRSNS); /* RHM_HT 2015/01/16 Added */
|
|
}
|
|
|
|
/* <== RHM_HT 2013/11/26 Reverted */
|
|
|
|
/* ***************************************************** */
|
|
/* **** Download the data */
|
|
/* ***************************************************** */
|
|
void download(unsigned short int u16_type, unsigned short int u16_coef_type)
|
|
{
|
|
/* Data Transfer Size per one I2C access */
|
|
#define DWNLD_TRNS_SIZE (7)
|
|
|
|
unsigned char temp[DWNLD_TRNS_SIZE + 1];
|
|
unsigned short int block_cnt;
|
|
unsigned short int total_cnt;
|
|
unsigned short int lp;
|
|
unsigned short int n;
|
|
unsigned short int u16_i;
|
|
|
|
if (u16_type == 0)
|
|
n = DOWNLOAD_BIN_LEN;
|
|
else
|
|
n = DOWNLOAD_COEF_LEN; /* RHM_HT 2013/07/10 Modified */
|
|
|
|
block_cnt = n / DWNLD_TRNS_SIZE + 1;
|
|
total_cnt = block_cnt;
|
|
|
|
while (1) {
|
|
/* Residual Number Check */
|
|
if (block_cnt == 1)
|
|
lp = n % DWNLD_TRNS_SIZE;
|
|
else
|
|
lp = DWNLD_TRNS_SIZE;
|
|
|
|
/* Transfer Data set */
|
|
if (lp != 0) {
|
|
if (u16_type == 0) {
|
|
temp[0] = _OP_FIRM_DWNLD;
|
|
for (u16_i = 1; u16_i <= lp; u16_i += 1)
|
|
temp[u16_i] = DOWNLOAD_BIN
|
|
[(total_cnt - block_cnt) *
|
|
DWNLD_TRNS_SIZE +
|
|
u16_i - 1];
|
|
} else {
|
|
temp[0] = _OP_COEF_DWNLD;
|
|
for (u16_i = 1; u16_i <= lp; u16_i += 1)
|
|
temp[u16_i] = DOWNLOAD_COEF
|
|
[(total_cnt - block_cnt) *
|
|
DWNLD_TRNS_SIZE +
|
|
u16_i - 1];
|
|
}
|
|
|
|
/* Data Transfer */
|
|
WR_I2C(_SLV_OIS_, lp + 1, temp);
|
|
}
|
|
|
|
/* Block Counter Decrement */
|
|
block_cnt = block_cnt - 1;
|
|
|
|
if (block_cnt == 0)
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SET_FADJ_PARAM(const struct _FACT_ADJ *param)
|
|
{
|
|
/* ********************* */
|
|
/* HALL ADJUST */
|
|
/* ********************* */
|
|
/* Set Hall Current DAC value that is FACTORY ADJUSTED */
|
|
I2C_OIS_per_write(_P_30_ADC_CH0, param->gl_CURDAT);
|
|
|
|
/* Set Hall PreAmp Offset that is FACTORY ADJUSTED */
|
|
I2C_OIS_per_write(_P_31_ADC_CH1, param->gl_HALOFS_X);
|
|
I2C_OIS_per_write(_P_32_ADC_CH2, param->gl_HALOFS_Y);
|
|
|
|
/* Set Hall-X/Y PostAmp Offset that is FACTORY ADJUSTED */
|
|
I2C_OIS_mem_write(_M_X_H_ofs, param->gl_HX_OFS);
|
|
I2C_OIS_mem_write(_M_Y_H_ofs, param->gl_HY_OFS);
|
|
|
|
/* Set Residual Offset that is FACTORY ADJUSTED */
|
|
I2C_OIS_per_write(_P_39_Ch3_VAL_1, param->gl_PSTXOF);
|
|
I2C_OIS_per_write(_P_3B_Ch3_VAL_3, param->gl_PSTYOF);
|
|
|
|
/* ********************* */
|
|
/* DIGITAL GYRO OFFSET */
|
|
/* ********************* */
|
|
I2C_OIS_mem_write(_M_Kgx00, param->gl_GX_OFS);
|
|
I2C_OIS_mem_write(_M_Kgy00, param->gl_GY_OFS);
|
|
I2C_OIS_mem_write(_M_TMP_X_, param->gl_TMP_X_);
|
|
I2C_OIS_mem_write(_M_TMP_Y_, param->gl_TMP_Y_);
|
|
|
|
/* ********************* */
|
|
/* HALL SENSE */
|
|
/* ********************* */
|
|
/* Set Hall Gain value that is FACTORY ADJUSTED */
|
|
I2C_OIS_mem_write(_M_KgxHG, param->gl_KgxHG);
|
|
I2C_OIS_mem_write(_M_KgyHG, param->gl_KgyHG);
|
|
|
|
/* Set Cross Talk Canceller */
|
|
I2C_OIS_mem_write(_M_KgxH0, param->gl_KgxH0);
|
|
I2C_OIS_mem_write(_M_KgyH0, param->gl_KgyH0);
|
|
|
|
/* ********************* */
|
|
/* LOOPGAIN */
|
|
/* ********************* */
|
|
I2C_OIS_mem_write(_M_KgxG, param->gl_KGXG);
|
|
I2C_OIS_mem_write(_M_KgyG, param->gl_KGYG);
|
|
|
|
/* Position Servo ON ( OIS OFF ) */
|
|
I2C_OIS_mem_write(_M_EQCTL, 0x0C0C);
|
|
}
|
|
|
|
/* ***************************************************** */
|
|
/* **** Scence parameter */
|
|
/* ***************************************************** */
|
|
#define ANGLE_LIMIT \
|
|
(unsigned short int)(GYRSNS * 11 / 10) /* GYRSNS * limit[deg] */
|
|
#define G_SENSE 131 /* [LSB/dps] */
|
|
|
|
short int func_SET_SCENE_PARAM(unsigned char u16_scene, unsigned char u16_mode,
|
|
unsigned char filter, unsigned char range,
|
|
const struct _FACT_ADJ *param)
|
|
{
|
|
unsigned short int u16_i;
|
|
unsigned short int u16_dat;
|
|
unsigned short int *u16_dat_SCENE_;
|
|
unsigned char size_SCENE_tbl;
|
|
|
|
/* ==> RHM_HT 2013/11/25 Modified */
|
|
unsigned char u16_adr_target[3] = {
|
|
_M_Kgxdr, _M_X_LMT, _M_X_TGT,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_NIGHT_1[3] = {
|
|
0x7FFE, 0, G_SENSE * 16,
|
|
};
|
|
unsigned short int u16_dat_SCENE_NIGHT_2[3] = {
|
|
0x7FFC, 0, G_SENSE * 16,
|
|
};
|
|
unsigned short int u16_dat_SCENE_NIGHT_3[3] = {
|
|
0x7FFA, 0, G_SENSE * 16,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_D_A_Y_1[3] = {
|
|
0x7FFE, 0, G_SENSE * 40,
|
|
};
|
|
unsigned short int u16_dat_SCENE_D_A_Y_2[3] = {
|
|
0x7FFA, 0, G_SENSE * 40,
|
|
};
|
|
unsigned short int u16_dat_SCENE_D_A_Y_3[3] = {
|
|
0x7FF0, 0, G_SENSE * 40,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_SPORT_1[3] = {
|
|
0x7FFE, 0, G_SENSE * 60,
|
|
};
|
|
unsigned short int u16_dat_SCENE_SPORT_2[3] = {
|
|
0x7FF0, 0, G_SENSE * 60,
|
|
};
|
|
unsigned short int u16_dat_SCENE_SPORT_3[3] = {
|
|
0x7FE0, 0, G_SENSE * 60,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_TEST___[3] = {
|
|
0x7FF0, 0x7FFF, 0x7FFF,
|
|
}; /* Limmiter OFF */
|
|
/* <== RHM_HT 2013/11/25 Modified */
|
|
|
|
u16_dat_SCENE_NIGHT_1[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_NIGHT_2[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_NIGHT_3[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_D_A_Y_1[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_D_A_Y_2[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_D_A_Y_3[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_SPORT_1[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_SPORT_2[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_SPORT_3[1] = ANGLE_LIMIT;
|
|
|
|
size_SCENE_tbl =
|
|
sizeof(u16_dat_SCENE_NIGHT_1) / sizeof(unsigned short int);
|
|
|
|
/* Disable OIS ( position Servo is not disable ) */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
|
|
u16_dat = (u16_dat & 0xFEFE);
|
|
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
|
|
/* Scene parameter select */
|
|
switch (u16_scene) {
|
|
case _SCENE_NIGHT_1:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_NIGHT_1;
|
|
break;
|
|
case _SCENE_NIGHT_2:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_NIGHT_2;
|
|
break;
|
|
case _SCENE_NIGHT_3:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_NIGHT_3;
|
|
break;
|
|
case _SCENE_D_A_Y_1:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_D_A_Y_1;
|
|
break;
|
|
case _SCENE_D_A_Y_2:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_D_A_Y_2;
|
|
break;
|
|
case _SCENE_D_A_Y_3:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_D_A_Y_3;
|
|
break;
|
|
case _SCENE_SPORT_1:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_SPORT_1;
|
|
break;
|
|
case _SCENE_SPORT_2:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_SPORT_2;
|
|
break;
|
|
case _SCENE_SPORT_3:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_SPORT_3;
|
|
break;
|
|
case _SCENE_TEST___:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_TEST___;
|
|
break;
|
|
default:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_TEST___;
|
|
break;
|
|
}
|
|
|
|
/* Set parameter to the OIS controller */
|
|
for (u16_i = 0; u16_i < size_SCENE_tbl; u16_i += 1)
|
|
I2C_OIS_mem_write(u16_adr_target[u16_i], u16_dat_SCENE_[u16_i]);
|
|
|
|
for (u16_i = 0; u16_i < size_SCENE_tbl; u16_i += 1)
|
|
I2C_OIS_mem_write(u16_adr_target[u16_i] + 0x80,
|
|
u16_dat_SCENE_[u16_i]);
|
|
|
|
{
|
|
u16_dat = (INTG__INPUT * 16384L) /
|
|
ANGLE_LIMIT; /* X2 * 4000h / X1 */
|
|
I2C_OIS_mem_write(0x38, u16_dat);
|
|
I2C_OIS_mem_write(0xB8, u16_dat);
|
|
|
|
/* ---------------------------------------------- */
|
|
u16_dat = (KGNTG_VALUE * ANGLE_LIMIT) /
|
|
16384L; /* X3 * X1 / 4000h */
|
|
I2C_OIS_mem_write(0x47, u16_dat);
|
|
I2C_OIS_mem_write(0xC7, u16_dat);
|
|
}
|
|
|
|
/* szx_2014/12/24 <=== */
|
|
|
|
/* Set/Reset Notch filter */
|
|
if (filter == 1) { /* Disable Filter */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat |= 0x4000;
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
} else { /* Enable Filter */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat &= 0xBFFF;
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
}
|
|
|
|
/* Clear the register of the OIS controller */
|
|
I2C_OIS_mem_write(_M_wDgx02, 0x0000);
|
|
I2C_OIS_mem_write(_M_wDgx03, 0x0000);
|
|
I2C_OIS_mem_write(_M_wDgx06, 0x7FFF);
|
|
I2C_OIS_mem_write(_M_Kgx15, 0x0000);
|
|
I2C_OIS_mem_write(_M_wDgy02, 0x0000);
|
|
I2C_OIS_mem_write(_M_wDgy03, 0x0000);
|
|
I2C_OIS_mem_write(_M_wDgy06, 0x7FFF);
|
|
I2C_OIS_mem_write(_M_Kgy15, 0x0000);
|
|
|
|
/* Set the pre-Amp offset value (X and Y) */
|
|
/* ==> RHM_HT 2013/11/25 Modified */
|
|
if (range == 1) {
|
|
I2C_OIS_per_write(_P_31_ADC_CH1, param->gl_SFTHAL_X);
|
|
I2C_OIS_per_write(_P_32_ADC_CH2, param->gl_SFTHAL_Y);
|
|
} else {
|
|
I2C_OIS_per_write(_P_31_ADC_CH1, param->gl_HALOFS_X);
|
|
I2C_OIS_per_write(_P_32_ADC_CH2, param->gl_HALOFS_Y);
|
|
}
|
|
|
|
/* <== RHM_HT 2013/11/25 Modified */
|
|
/* Enable OIS (if u16_mode = 1) */
|
|
if ((u16_mode == 1)) {
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat = (u16_dat | 0x0101);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
DEBUG_printf(("SET : EQCTL:%.4x\n", u16_dat));
|
|
} else { /* ==> RHM_HT 2013.03.23 Add for OIS control */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat = (u16_dat & 0xFEFE);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
DEBUG_printf(("SET : EQCTL:%.4x\n", u16_dat));
|
|
} /* <== RHM_HT 2013.03.23 Add for OIS control */
|
|
|
|
return ADJ_OK; /* RHM_HT 2013/04/15 Change return value */
|
|
}
|
|
|
|
short int func_SET_SCENE_PARAM_for_NewGYRO_Fil(unsigned char u16_scene,
|
|
unsigned char u16_mode,
|
|
unsigned char filter,
|
|
unsigned char range,
|
|
const struct _FACT_ADJ *param)
|
|
{
|
|
unsigned short int u16_i;
|
|
unsigned short int u16_dat;
|
|
unsigned short int *u16_dat_SCENE_;
|
|
unsigned char size_SCENE_tbl;
|
|
|
|
/* szx_2014/09/19 ---> Modified */
|
|
/* ==> RHM_HT 2013/11/25 Modified */
|
|
unsigned char u16_adr_target[4] = {
|
|
_M_Kgxdr, _M_X_LMT, _M_X_TGT, 0x1B,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_NIGHT_1[4] = {
|
|
0x7FE0, 0, G_SENSE * 16, 0x0300,
|
|
};
|
|
unsigned short int u16_dat_SCENE_NIGHT_2[4] = {
|
|
0x7FFF, 0, G_SENSE * 16, 0x0080,
|
|
};
|
|
unsigned short int u16_dat_SCENE_NIGHT_3[4] = {
|
|
0x7FF0, 0, G_SENSE * 16, 0x0300,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_D_A_Y_1[4] = {
|
|
0x7FE0, 0, G_SENSE * 40, 0x0300,
|
|
};
|
|
unsigned short int u16_dat_SCENE_D_A_Y_2[4] = {
|
|
0x7F80, 0, G_SENSE * 40, 0x0140,
|
|
};
|
|
unsigned short int u16_dat_SCENE_D_A_Y_3[4] = {
|
|
0x7F00, 0, G_SENSE * 40, 0x0300,
|
|
};
|
|
|
|
unsigned short int u16_dat_SCENE_SPORT_1[4] = {
|
|
0x7FE0, 0, G_SENSE * 60, 0x0300,
|
|
};
|
|
/* szx_2014/12/24 ===> */
|
|
unsigned short int u16_dat_SCENE_SPORT_2[4] = {
|
|
0x7F80, 0, G_SENSE * 60, 0x0000,
|
|
};
|
|
unsigned short int u16_dat_SCENE_SPORT_3[4] = {
|
|
0x7FF0, 0, G_SENSE * 60, 0x0300,
|
|
};
|
|
/* szx_2014/12/24 <=== */
|
|
unsigned short int u16_dat_SCENE_TEST___[4] = {
|
|
0x7FFF, 0x7FFF, 0x7FFF, 0x0080,
|
|
}; /* Limmiter OFF */
|
|
/* <== RHM_HT 2013/11/25 Modified */
|
|
/* szx_2014/09/19 <--- */
|
|
u16_dat_SCENE_NIGHT_1[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_NIGHT_2[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_NIGHT_3[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_D_A_Y_1[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_D_A_Y_2[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_D_A_Y_3[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_SPORT_1[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_SPORT_2[1] = ANGLE_LIMIT;
|
|
u16_dat_SCENE_SPORT_3[1] = ANGLE_LIMIT;
|
|
|
|
size_SCENE_tbl =
|
|
sizeof(u16_dat_SCENE_NIGHT_1) / sizeof(unsigned short int);
|
|
|
|
/* Disable OIS ( position Servo is not disable ) */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
|
|
u16_dat = (u16_dat & 0xFEFE);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
|
|
/* Scene parameter select */
|
|
switch (u16_scene) {
|
|
case _SCENE_NIGHT_1:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_NIGHT_1;
|
|
break;
|
|
case _SCENE_NIGHT_2:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_NIGHT_2;
|
|
break;
|
|
case _SCENE_NIGHT_3:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_NIGHT_3;
|
|
break;
|
|
case _SCENE_D_A_Y_1:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_D_A_Y_1;
|
|
break;
|
|
case _SCENE_D_A_Y_2:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_D_A_Y_2;
|
|
break;
|
|
case _SCENE_D_A_Y_3:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_D_A_Y_3;
|
|
break;
|
|
case _SCENE_SPORT_1:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_SPORT_1;
|
|
break;
|
|
case _SCENE_SPORT_2:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_SPORT_2;
|
|
break;
|
|
case _SCENE_SPORT_3:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_SPORT_3;
|
|
break;
|
|
case _SCENE_TEST___:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_TEST___;
|
|
break;
|
|
default:
|
|
u16_dat_SCENE_ = u16_dat_SCENE_TEST___;
|
|
break;
|
|
}
|
|
|
|
/* Set parameter to the OIS controller */
|
|
for (u16_i = 0; u16_i < size_SCENE_tbl; u16_i += 1)
|
|
I2C_OIS_mem_write(u16_adr_target[u16_i], u16_dat_SCENE_[u16_i]);
|
|
|
|
for (u16_i = 0; u16_i < size_SCENE_tbl; u16_i += 1)
|
|
I2C_OIS_mem_write(u16_adr_target[u16_i] + 0x80,
|
|
u16_dat_SCENE_[u16_i]);
|
|
|
|
{
|
|
u16_dat = (INTG__INPUT * 16384L) /
|
|
ANGLE_LIMIT; /* X2 * 4000h / X1 */
|
|
I2C_OIS_mem_write(0x38, u16_dat);
|
|
I2C_OIS_mem_write(0xB8, u16_dat);
|
|
|
|
/* ---------------------------------------------- */
|
|
u16_dat = (KGNTG_VALUE * ANGLE_LIMIT) /
|
|
16384L; /* X3 * X1 / 4000h */
|
|
I2C_OIS_mem_write(0x47, u16_dat);
|
|
I2C_OIS_mem_write(0xC7, u16_dat);
|
|
}
|
|
|
|
/* szx_2014/12/24 <=== */
|
|
|
|
/* Set/Reset Notch filter */
|
|
if (filter == 1) { /* Disable Filter */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat |= 0x4000;
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
} else { /* Enable Filter */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat &= 0xBFFF;
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
}
|
|
|
|
/* Set the pre-Amp offset value (X and Y) */
|
|
/* ==> RHM_HT 2013/11/25 Modified */
|
|
if (range == 1) {
|
|
I2C_OIS_per_write(_P_31_ADC_CH1, param->gl_SFTHAL_X);
|
|
I2C_OIS_per_write(_P_32_ADC_CH2, param->gl_SFTHAL_Y);
|
|
} else {
|
|
I2C_OIS_per_write(_P_31_ADC_CH1, param->gl_HALOFS_X);
|
|
I2C_OIS_per_write(_P_32_ADC_CH2, param->gl_HALOFS_Y);
|
|
}
|
|
|
|
/* <== RHM_HT 2013/11/25 Modified */
|
|
|
|
/* Enable OIS (if u16_mode = 1) */
|
|
if ((u16_mode == 1)) { /* OIS ON */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat = (u16_dat & 0xEFFF); /* Clear Halfshutter mode */
|
|
u16_dat = (u16_dat | 0x0101);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
DEBUG_printf(("SET : EQCTL:%.4x\n", u16_dat));
|
|
} else if (u16_mode ==
|
|
2) { /* Half Shutter // szx_2014/09/19 ---> */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat = (u16_dat | 0x1101);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
DEBUG_printf(("SET : EQCTL:%.4x\n", u16_dat));
|
|
} else { /* ==> RHM_HT 2013.03.23 Add for OIS control */
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat = (u16_dat & 0xFEFE);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
DEBUG_printf(("SET : EQCTL:%.4x\n", u16_dat));
|
|
} /* <== RHM_HT 2013.03.23 Add for OIS control */
|
|
return ADJ_OK; /* RHM_HT 2013/04/15 Change return value */
|
|
}
|
|
|
|
/* ==> RHM_HT 2014/11/27 Added */
|
|
/* ***************************************************** */
|
|
/* **** Enable HalfShutter */
|
|
/* ***************************************************** */
|
|
void HalfShutterOn(void)
|
|
{
|
|
unsigned short int u16_dat = 0;
|
|
|
|
u16_dat = I2C_OIS_mem__read(_M_EQCTL);
|
|
u16_dat = (u16_dat | 0x1101);
|
|
I2C_OIS_mem_write(_M_EQCTL, u16_dat);
|
|
DEBUG_printf(("SET : EQCTL:%.4x\n", u16_dat));
|
|
}
|
|
|
|
/* <== RHM_HT 2014/11/27 Added */
|
|
|
|
/* ***************************************************** */
|
|
/* **** Write to the Peripheral register < 82h > */
|
|
/* **** ------------------------------------------------ */
|
|
/* **** unsigned char adr Peripheral Address */
|
|
/* **** unsigned short int dat Write data */
|
|
/* ***************************************************** */
|
|
void I2C_OIS_per_write(unsigned char u08_adr, unsigned short int u16_dat)
|
|
{
|
|
unsigned char out[4];
|
|
|
|
out[0] = _OP_Periphe_RW;
|
|
out[1] = u08_adr;
|
|
out[2] = (u16_dat)&0xFF;
|
|
out[3] = (u16_dat >> 8) & 0xFF;
|
|
|
|
WR_I2C(_SLV_OIS_, 4, out);
|
|
}
|
|
|
|
/* ***************************************************** */
|
|
/* **** Write to the Memory register < 84h > */
|
|
/* **** ------------------------------------------------ */
|
|
/* **** unsigned char adr Memory Address */
|
|
/* **** unsigned short int dat Write data */
|
|
/* ***************************************************** */
|
|
void I2C_OIS_mem_write(unsigned char u08_adr, unsigned short int u16_dat)
|
|
{
|
|
unsigned char out[4];
|
|
|
|
out[0] = _OP_Memory__RW;
|
|
out[1] = u08_adr;
|
|
out[2] = (u16_dat)&0xFF;
|
|
out[3] = (u16_dat >> 8) & 0xFF;
|
|
|
|
WR_I2C(_SLV_OIS_, 4, out);
|
|
}
|
|
|
|
/* ***************************************************** */
|
|
/* **** Read from the Peripheral register < 82h > */
|
|
/* **** ------------------------------------------------ */
|
|
/* **** unsigned char adr Peripheral Address */
|
|
/* **** unsigned short int dat Read data */
|
|
/* ***************************************************** */
|
|
unsigned short int I2C_OIS_per__read(unsigned char u08_adr)
|
|
{
|
|
unsigned char u08_dat[2];
|
|
|
|
u08_dat[0] = _OP_Periphe_RW; /* Op-code */
|
|
u08_dat[1] = u08_adr; /* target address */
|
|
|
|
return RD_I2C(_SLV_OIS_, 2, u08_dat);
|
|
}
|
|
|
|
/* ***************************************************** */
|
|
/* **** Read from the Memory register < 84h > */
|
|
/* **** ------------------------------------------------ */
|
|
/* **** unsigned char adr Memory Address */
|
|
/* **** unsigned short int dat Read data */
|
|
/* ***************************************************** */
|
|
unsigned short int I2C_OIS_mem__read(unsigned char u08_adr)
|
|
{
|
|
unsigned char u08_dat[2];
|
|
|
|
u08_dat[0] = _OP_Memory__RW; /* Op-code */
|
|
u08_dat[1] = u08_adr; /* target address */
|
|
|
|
return RD_I2C(_SLV_OIS_, 2, u08_dat);
|
|
}
|
|
|
|
/* ***************************************************** */
|
|
/* **** Special Command 8Ah */
|
|
/* _cmd_8C_EI 0 // 0x0001 */
|
|
/* _cmd_8C_DI 1 // 0x0002 */
|
|
/* ***************************************************** */
|
|
void I2C_OIS_spcl_cmnd(unsigned char u08_on, unsigned char u08_dat)
|
|
{
|
|
if ((u08_dat == _cmd_8C_EI) || (u08_dat == _cmd_8C_DI)) {
|
|
|
|
unsigned char out[2];
|
|
|
|
out[0] = _OP_SpecialCMD;
|
|
out[1] = u08_dat;
|
|
|
|
WR_I2C(_SLV_OIS_, 2, out);
|
|
}
|
|
}
|
|
|
|
/* ***************************************************** */
|
|
/* **** F0-F3h Command NonAssertClockStretch Function */
|
|
/* ***************************************************** */
|
|
void I2C_OIS_F0123_wr_(unsigned char u08_dat0, unsigned char u08_dat1,
|
|
unsigned short int u16_dat2)
|
|
{
|
|
unsigned char out[5];
|
|
|
|
out[0] = 0xF0;
|
|
out[1] = u08_dat0;
|
|
out[2] = u08_dat1;
|
|
out[3] = u16_dat2 / 256;
|
|
out[4] = u16_dat2 % 256;
|
|
|
|
WR_I2C(_SLV_OIS_, 5, out);
|
|
}
|
|
|
|
unsigned short int I2C_OIS_F0123__rd(void)
|
|
{
|
|
unsigned char u08_dat;
|
|
|
|
u08_dat = 0xF0; /* Op-code */
|
|
|
|
return RD_I2C(_SLV_OIS_, 1, &u08_dat);
|
|
}
|
|
|
|
/* ----------------------------------------------------------- */
|
|
/* ----------------------------------------------------------- */
|
|
/* ----------------------------------------------------------- */
|