// SPDX-License-Identifier: GPL-2.0
|
/********************************************************************************
|
*
|
* Copyright (C) 2017 NEXTCHIP Inc. All rights reserved.
|
* Module : video_auto_detect.c
|
* Description :
|
* Author :
|
* Date :
|
* Version : Version 1.0
|
*
|
********************************************************************************
|
* History :
|
*
|
*
|
********************************************************************************/
|
#include <linux/string.h>
|
#include <linux/delay.h>
|
#include "nvp6158_common.h"
|
#include "nvp6158_video_auto_detect.h"
|
#include "nvp6158_video.h"
|
|
#define ACC_GAIN_NORMAL 0
|
#define ACC_GAIN_DEBUG 1
|
|
extern int nvp6158_chip_id[4];
|
extern unsigned int nvp6158_iic_addr[4];
|
|
NC_VIVO_CH_FORMATDEF nvp6158_arrVfcType[0x100] = {
|
/* 0x00 */ AHD20_SD_H960_2EX_Btype_NT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x10 */ AHD20_SD_H960_2EX_Btype_PAL,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x20 */ AHD20_720P_30P_EX_Btype, AHD20_720P_25P_EX_Btype, AHD20_720P_60P, AHD20_720P_50P,0,
|
/* 0x25 */ TVI_HD_30P_EX, TVI_HD_25P_EX, TVI_HD_60P, TVI_HD_50P, TVI_HD_B_30P_EX, TVI_HD_B_25P_EX,
|
/* 0x2B */ CVI_HD_30P_EX, CVI_HD_25P_EX, CVI_HD_60P, CVI_HD_50P,0,
|
/* 0x30 */ AHD20_1080P_30P, AHD20_1080P_25P, 0,TVI_FHD_30P, TVI_FHD_25P,CVI_FHD_30P, CVI_FHD_25P, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x40 */ AHD30_3M_30P, AHD30_3M_25P, AHD30_3M_18P, 0,TVI_3M_18P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TVI_4M_15P,
|
/* 0x50 */ AHD30_4M_30P, AHD30_4M_25P, AHD30_4M_15P, 0,CVI_4M_30P, CVI_4M_25P, 0,TVI_4M_30P, TVI_4M_25P, TVI_4M_15P, 0, 0, 0, 0, 0, 0,
|
/* 0x60 */ AHD30_8M_X_30P, AHD30_8M_X_25P, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x70 */ AHD30_5M_20P, AHD30_5M_12_5P, AHD30_5_3M_20P, TVI_5M_12_5P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x80 */ AHD30_8M_15P, AHD30_8M_7_5P, AHD30_8M_12_5P, CVI_8M_15P, CVI_8M_12_5P, TVI_8M_15P, TVI_8M_12_5P, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x90 */ AHD30_6M_18P, AHD30_6M_20P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0xA0 */
|
};
|
|
NC_VIVO_CH_FORMATDEF nvp6158_arrVfcType_ahd[0x100] = {
|
/* 0x00 */ AHD20_SD_H960_2EX_Btype_NT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x10 */ AHD20_SD_H960_2EX_Btype_PAL,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x20 */ AHD20_720P_30P_EX_Btype, AHD20_720P_25P_EX_Btype, AHD20_720P_60P, AHD20_720P_50P,0,
|
/* 0x25 */ 0, 0, 0, 0, 0, 0,
|
/* 0x2B */ AHD20_720P_30P_EX_Btype, AHD20_720P_25P_EX_Btype, AHD20_720P_60P, AHD20_720P_50P,0,
|
/* 0x30 */ AHD20_1080P_30P, AHD20_1080P_25P, 0,0, 0,AHD20_1080P_30P, AHD20_1080P_25P, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x40 */ AHD30_3M_30P, AHD30_3M_25P, AHD30_3M_18P, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x50 */ AHD30_4M_30P, AHD30_4M_25P, AHD30_4M_15P, 0,0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x60 */ AHD30_8M_X_30P, AHD30_8M_X_25P, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x70 */ AHD30_5M_20P, AHD30_5M_12_5P, AHD30_5_3M_20P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x80 */ AHD30_8M_15P, AHD30_8M_7_5P, AHD30_8M_12_5P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x90 */ AHD30_6M_18P, AHD30_6M_20P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0xA0 */
|
};
|
|
NC_VIVO_CH_FORMATDEF nvp6158_arrVfcType_cvi[0x100] = {
|
/* 0x00 */ AHD20_SD_H960_2EX_Btype_NT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x10 */ AHD20_SD_H960_2EX_Btype_PAL,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x20 */ CVI_HD_30P_EX, CVI_HD_25P_EX, CVI_HD_60P, CVI_HD_50P,0,
|
/* 0x25 */ 0, 0, 0, 0, 0, 0,
|
/* 0x2B */ CVI_HD_30P_EX, CVI_HD_25P_EX, CVI_HD_60P, CVI_HD_50P,0,
|
/* 0x30 */ CVI_FHD_30P, CVI_FHD_25P, 0,0, 0,CVI_FHD_30P, CVI_FHD_25P, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x40 */ 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x50 */ 0, 0, 0, 0,CVI_4M_30P, CVI_4M_25P, 0,0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x60 */ 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x70 */ CVI_5M_20P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x80 */ 0, 0, 0, CVI_8M_15P, CVI_8M_12_5P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0xA0 */
|
};
|
|
NC_VIVO_CH_FORMATDEF nvp6158_arrVfcType_tvi[0x100] = {
|
/* 0x00 */ AHD20_SD_H960_2EX_Btype_NT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x10 */ AHD20_SD_H960_2EX_Btype_PAL,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x20 */ 0, 0, 0, 0, 0,
|
/* 0x25 */ TVI_HD_30P_EX, TVI_HD_25P_EX, TVI_HD_60P, TVI_HD_50P, TVI_HD_B_30P_EX, TVI_HD_B_25P_EX,
|
/* 0x2B */ TVI_4M_15P, 0, 0, 0,0,
|
/* 0x30 */ 0, 0, 0,TVI_FHD_30P, TVI_FHD_25P,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x40 */ 0, 0, 0, 0,TVI_3M_18P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TVI_4M_15P,
|
/* 0x50 */ 0, 0, 0, 0, 0, 0, 0, TVI_4M_30P, TVI_4M_25P, TVI_4M_15P, 0, 0, 0, 0, 0, 0,
|
/* 0x60 */ 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x70 */ TVI_5M_20P, 0, 0, TVI_5M_12_5P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x80 */ 0, 0, 0, TVI_8M_15P, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0xA0 */
|
};
|
|
NC_VIVO_CH_FORMATDEF nvp6158_arrVfcType_raptor4[0x100] = {
|
/* 0x00 */ AHD20_SD_H960_2EX_Btype_NT,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x10 */ AHD20_SD_H960_2EX_Btype_PAL,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x20 */ AHD20_720P_30P_EX_Btype, AHD20_720P_25P_EX_Btype, AHD20_720P_60P, AHD20_720P_50P,
|
0,
|
/* 0x25 */ TVI_HD_30P_EX, TVI_HD_25P_EX, TVI_HD_60P, TVI_HD_50P, TVI_HD_B_30P_EX, TVI_HD_B_25P_EX,
|
/* 0x2B */ CVI_HD_30P_EX, CVI_HD_25P_EX, CVI_HD_60P, CVI_HD_50P,
|
0,
|
/* 0x30 */ AHD20_1080P_30P, AHD20_1080P_25P,
|
0,
|
/* 0x33 */ TVI_FHD_30P, TVI_FHD_25P,
|
/* 0x35 */ CVI_FHD_30P, CVI_FHD_25P,
|
0,
|
/* 0x38 */ AHD20_1080P_60P, AHD20_1080P_50P,
|
/* 0x3A */ TVI_FHD_60P, TVI_FHD_50P,
|
/* 0x3C */ AHD20_1080P_15P_EX, AHD20_1080P_12_5P_EX,
|
0, 0,
|
/* 0x40 */ AHD30_3M_30P, AHD30_3M_25P, AHD30_3M_18P,
|
0,
|
/* 0x44 */ TVI_3M_18P,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x50 */ AHD30_4M_30P, AHD30_4M_25P, AHD30_4M_15P,
|
0,
|
/* 0x54 */ CVI_4M_30P, CVI_4M_25P,
|
0,
|
/* 0x57 */ TVI_4M_30P, TVI_4M_25P, TVI_4M_15P,
|
0, 0, 0, 0, 0, 0,
|
/* 0x60 */ AHD30_8M_X_30P, AHD30_8M_X_25P, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x70 */ AHD30_5M_20P, AHD30_5M_12_5P, AHD30_5_3M_20P,
|
/* 0x73 */ TVI_5M_12_5P, TVI_5M_20P,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x80 */ AHD30_8M_15P, AHD30_8M_7_5P, AHD30_8M_12_5P, CVI_8M_15P, CVI_8M_12_5P, TVI_8M_15P, TVI_8M_12_5P,
|
0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0x90 */ AHD30_6M_18P, AHD30_6M_20P,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
/* 0xA0 */ AHD20_960P_30P, AHD20_960P_25P, AHD20_960P_60P, AHD20_960P_50P,
|
};
|
|
//unsigned char current_fmt[16] = {NVP6158_DET_MODE_AUTO, NVP6158_DET_MODE_AUTO, NVP6158_DET_MODE_AUTO, NVP6158_DET_MODE_AUTO};
|
extern unsigned char nvp6158_det_mode[16];
|
NC_VIVO_CH_FORMATDEF NVP6158_NC_VD_AUTO_VFCtoFMTDEF(unsigned char ch, unsigned char VFC)
|
{
|
if((nvp6158_chip_id[ch/4] == NVP6168C_R0_ID) || (nvp6158_chip_id[ch/4] == NVP6168_R0_ID))
|
{
|
return nvp6158_arrVfcType_raptor4[VFC];
|
}
|
else
|
{
|
if(nvp6158_det_mode[ch] == NVP6158_DET_MODE_AUTO)
|
return nvp6158_arrVfcType[VFC];
|
else if(nvp6158_det_mode[ch] == NVP6158_DET_MODE_CVI)
|
return nvp6158_arrVfcType_cvi[VFC];
|
else if(nvp6158_det_mode[ch] == NVP6158_DET_MODE_TVI)
|
return nvp6158_arrVfcType_tvi[VFC];
|
else
|
return nvp6158_arrVfcType_ahd[VFC];
|
}
|
}
|
|
static void _nvp6158_video_input_auto_detect_vafe_set(video_input_auto_detect *vin_auto_det)
|
{
|
unsigned char val_1x7A;
|
unsigned char val_5678x00;
|
unsigned char val_5678x01;
|
unsigned char val_5678x58;
|
unsigned char val_5678x59;
|
unsigned char val_5678x5B;
|
unsigned char val_5678x5C;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x01);
|
val_1x7A = gpio_i2c_read(nvp6158_iic_addr[vin_auto_det->devnum], 0x7A);
|
val_1x7A |= (1 << vin_auto_det->ch);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x7A, val_1x7A);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x00);
|
//B0 0x00/1/2/3 gain[4], powerdown[0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x00 + vin_auto_det->ch, ((vin_auto_det->vafe.gain & 0x01) << 4) |
|
(vin_auto_det->vafe.powerdown & 0x01));
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x01);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x84 + vin_auto_det->ch, 0x00);
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//B5/6/7/8
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x05 + vin_auto_det->ch);
|
|
//B5/6/7/8 0x01 spd[2], lpf_back_band[1:0]
|
val_5678x00 = gpio_i2c_read(nvp6158_iic_addr[vin_auto_det->devnum], 0x00);
|
val_5678x00 &= ~(0xF << 4);
|
val_5678x00 |= vin_auto_det->vafe.spd << 4;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x00, val_5678x00);
|
|
val_5678x01 = ((vin_auto_det->vafe.ctrlreg << 6) | (vin_auto_det->vafe.ctrlibs << 4) | (vin_auto_det->vafe.adcspd << 2) | (vin_auto_det->vafe.clplevel));
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x01, val_5678x01 );
|
|
//B5/6/7/8 0x58 eq_band[7:4], lpf_front_band[1:0]
|
val_5678x58 = ((vin_auto_det->vafe.eq_band << 4) | (vin_auto_det->vafe.lpf_front_band));
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x58, val_5678x58);
|
|
//B5/6/7/8 0x5B ref_vol[1:0]
|
val_5678x59 = ((vin_auto_det->vafe.clpmode << 7) | (vin_auto_det->vafe.f_lpf_bypass << 4) | (vin_auto_det->vafe.clproff << 3) | (vin_auto_det->vafe.b_lpf_bypass));
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x59, val_5678x59);
|
|
val_5678x5B = ((vin_auto_det->vafe.duty << 4) | (vin_auto_det->vafe.ref_vol));
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x5B, val_5678x5B);
|
|
val_5678x5C = ((vin_auto_det->vafe.lpf_back_band << 4) | (vin_auto_det->vafe.clk_sel << 3) | (vin_auto_det->vafe.eq_gainsel));
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x5C, val_5678x5C);
|
}
|
|
void nvp6158_video_input_manual_mode_set(video_input_manual_mode *vin_manual_det)
|
{
|
unsigned char val_0x30;
|
unsigned char val_0x31;
|
unsigned char val_0x32;
|
|
unsigned char val_1x7A;
|
|
unsigned char val_9x44;
|
//B13 0x30 AUTO_FMT_SET_EN_2[3:0], AUTO_FMT_SET_EN [3:0]
|
//B13 0x31 AUTO_FMT_SET_EN_4[3:0], AUTO_FMT_SET_EN_3 [3:0]
|
//B13 0x32 [ RESERVED ], NOVIDEO_VFC_INIT_EN[3:0]
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x01);
|
val_1x7A = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x7A);
|
val_1x7A &= ~(1 << vin_manual_det->ch);
|
val_1x7A |= (1 << vin_manual_det->ch);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x7A, val_1x7A);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x23 + (vin_manual_det->ch*4), 0x41);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x13);
|
val_0x30 = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x30);
|
val_0x31 = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x31);
|
val_0x32 = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x32);
|
|
val_0x30 &= (~(1 << (vin_manual_det->ch + 4)) & (~(1 << vin_manual_det->ch)));
|
val_0x31 &= (~(1 << (vin_manual_det->ch + 4)) & (~(1 << vin_manual_det->ch)));
|
val_0x32 &= (~(1 << vin_manual_det->ch));
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x30, val_0x30);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x31, val_0x31);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x32, val_0x32);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x05 + vin_manual_det->ch);
|
//B5/6/7/8 0xB9 HAFC_LPF_SEL[7:6] GAIN1[5:4] GAIN2[3:0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xB9, 0xB2);
|
|
|
// EXT PN VALUE Disable
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF,0x09);
|
val_9x44 = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x44);
|
val_9x44 &= ~(1 << vin_manual_det->ch);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x44, val_9x44);
|
}
|
|
void nvp6168_video_input_manual_mode_set(video_input_manual_mode *vin_manual_det)
|
{
|
unsigned char val_1x7A;
|
unsigned char val_9x44;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x01);
|
val_1x7A = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x7A);
|
val_1x7A &= ~(1 << vin_manual_det->ch);
|
val_1x7A |= (1 << vin_manual_det->ch);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x7A, val_1x7A);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x30, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x70, 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x05 + vin_manual_det->ch);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xB9, 0x72);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0xFF, 0x09);
|
val_9x44 = gpio_i2c_read(nvp6158_iic_addr[vin_manual_det->dev_num], 0x44);
|
val_9x44 &= ~(1 << vin_manual_det->ch);
|
gpio_i2c_write(nvp6158_iic_addr[vin_manual_det->dev_num], 0x44, val_9x44);
|
}
|
|
void nvp6158_video_input_auto_detect_set(video_input_auto_detect *vin_auto_det)
|
{
|
unsigned char val_0x30;
|
unsigned char val_0x31;
|
unsigned char val_0x32;
|
|
vin_auto_det->vafe.powerdown = 0x00;
|
vin_auto_det->vafe.gain = 0x01;
|
vin_auto_det->vafe.spd = 0x0d;
|
vin_auto_det->vafe.ctrlreg = 0x01;
|
vin_auto_det->vafe.ctrlibs = 0x02;
|
vin_auto_det->vafe.adcspd = 0x00;
|
vin_auto_det->vafe.clplevel = 0x02;
|
vin_auto_det->vafe.eq_band = 0x00;
|
vin_auto_det->vafe.lpf_front_band = 0x07;
|
vin_auto_det->vafe.clpmode = 0x00;
|
vin_auto_det->vafe.f_lpf_bypass = 0x01;
|
vin_auto_det->vafe.clproff = 0x00;
|
vin_auto_det->vafe.b_lpf_bypass = 0x00;
|
vin_auto_det->vafe.duty = 0x04;
|
vin_auto_det->vafe.ref_vol = 0x03;
|
vin_auto_det->vafe.lpf_back_band = 0x07;
|
vin_auto_det->vafe.clk_sel = 0x01;
|
vin_auto_det->vafe.eq_gainsel = 0x07;
|
|
vin_auto_det->d_cmp = 0x3f;
|
vin_auto_det->slice_level = 0x5a;
|
vin_auto_det->stable_mode_1 = 0x04;
|
vin_auto_det->stable_mode_2 = 0x00;
|
vin_auto_det->novid_det = 0x41;
|
|
_nvp6158_video_input_auto_detect_vafe_set(vin_auto_det);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x05 + vin_auto_det->ch);
|
|
//B5/6/7/8 0x03 Digital Clamp
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x03, vin_auto_det->d_cmp);
|
//B5/6/7/8 0x08 Slice Level
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x08, vin_auto_det->slice_level);
|
//B5/6/7/8 0xB9 HAFC_LPF_SEL[7:6] GAIN1[5:4] GAIN2[3:0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xB9, 0x72);
|
|
//B5/6/7/8 0xCA ADV_V_DELAY_AD[4] ADV_V_DELAY_ON[0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xCA, 0x10);
|
|
//B13 0x30 AUTO_FMT_SET_EN_2[3:0], AUTO_FMT_SET_EN [3:0]
|
//B13 0x31 AUTO_FMT_SET_EN_4[3:0], AUTO_FMT_SET_EN_3 [3:0]
|
//B13 0x32 [ RESERVED ], NOVIDEO_VFC_INIT_EN[3:0]
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x13);
|
val_0x30 = gpio_i2c_read(nvp6158_iic_addr[vin_auto_det->devnum], 0x30);
|
val_0x31 = gpio_i2c_read(nvp6158_iic_addr[vin_auto_det->devnum], 0x31);
|
val_0x32 = gpio_i2c_read(nvp6158_iic_addr[vin_auto_det->devnum], 0x32);
|
val_0x30 |= ((1 << (vin_auto_det->ch + 4)) | (1 << vin_auto_det->ch));
|
val_0x31 |= ((1 << (vin_auto_det->ch + 4)) | (1 << vin_auto_det->ch));
|
val_0x32 |= ((1 << vin_auto_det->ch) & 0xF);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x30, val_0x30);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x31, val_0x31);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x32, val_0x32);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x36, 0x0A);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x37, 0x82);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x81+vin_auto_det->ch, 0x0A);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x85+vin_auto_det->ch, 0x02);
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//B13
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x13);
|
//B13 0x00 Stable Mode set
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x00, vin_auto_det->stable_mode_1);
|
//B13 0x01 Stable Mode Set
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x01, ((vin_auto_det->stable_mode_2) & 0x3));
|
//B13 0x40 VFC_EQ_BAND_SEL[7:4] VFC_LPF_F_SEL[1:0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x40, 0x07);
|
//B13 0x41 VFC_REF_VTG
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x41, 0x01);
|
//B13 0x42 VFC_D_CMP_SET
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x42, 0x3F);
|
//B13 0x43 VFC_SLICE_VALUE
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x43, 0x5A);
|
//B13 0x44 VFC_SLICE_MD2
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x44, 0x30);
|
//B13 0x45 VFC_CONTROL_MODES
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x45, 0xEE);
|
//B13 0x46 VFC_GDF_FIX_COEFF
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x46, 0xC6);
|
//B13 0x47 VFC_DFE_REF_SEL_OLD[4] VFC_DFE_REF_SEL_NEW[0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x47, 0x00);
|
//B13 0x48 VFC_D_BLK_CNT_NEW[[7:4] VFC_HAFC_BYPASS_NEW[1] VFC_UPDN_SEL[0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x48, 0x80);
|
//B13 0x49 VFC_OLD_WPD_ON[4] VFC_NEW_WPD_ON[0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x49, 0x00);
|
//B13 0x4A VFC_D_CMP_FZ_OLD[4] VFC_D_CMP_FZ_NEW[1]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x4A, 0x11);
|
//B13 0x4B VFC_AUTO_GNOS_MODE
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x4B, 0x7F);
|
//B13 0x4C VFC_AUTO_SYNC_MODE
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x4C, 0x00);
|
//B13 0x4D VFC_HAFC_BYPASS[7] ??? [6:0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x4D, 0xB9);
|
//B13 0x4E VFC_VAFE_B_LPF_SEL[6:4] VFC_VAFE_CKSEL[3] VFC_VAFE_EQ_GAIN_SEL[2:0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x4E, 0x78);
|
//B13 0x4F VFC_VAFE_CTRL_RES[7:6] VFC_VAFE_IBS_CTRL[5:4] VFC_VAFE_SPD[2] VFC_VAFE_CLP_LEVEL[1:0]
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x4F, 0x62);
|
|
//B0 0x23/0x27/0x2B/0x2F No Video Detect
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x0);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x23 + ((vin_auto_det->ch) * 4), vin_auto_det->novid_det);
|
|
/* clock set */
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x1);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x84 + vin_auto_det->ch, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x8c + vin_auto_det->ch, 0x55);
|
|
}
|
|
void nvp6168_video_input_auto_detect_set(video_input_auto_detect *vin_auto_det)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xFF, 0x13);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x12, 0x04);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x2E, 0x10);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x30, 0x7f);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x31, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x32, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x33, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x77, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x3a, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x3b, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x3c, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x3d, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x3e, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x3f, 0xff);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x70, 0xf0);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x72, 0x05);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x7A, 0x10);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x61, 0x0A);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x62, 0x02);
|
//gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x60, 0x01);
|
//gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x60, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x07, 0x47);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x59, 0x24);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x01, 0x0c);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x2f, 0xc8);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x73, 0x23);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xff, 0x09 );
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0x96, 0x03);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xB6, 0x03);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xD6, 0x03);
|
gpio_i2c_write(nvp6158_iic_addr[vin_auto_det->devnum], 0xF6, 0x03);
|
}
|
|
void nvp6158_video_input_vfc_read(video_input_vfc *vin_vfc)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_vfc->devnum], 0xFF, 0x13);
|
vin_vfc->vfc = gpio_i2c_read(nvp6158_iic_addr[vin_vfc->devnum], 0xF0 + vin_vfc->ch);
|
}
|
|
void nvp6168_video_input_vfc_read(video_input_vfc *vin_vfc)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_vfc->devnum], 0xFF, 0x05 + vin_vfc->ch);
|
vin_vfc->vfc = gpio_i2c_read(nvp6158_iic_addr[vin_vfc->devnum], 0xF0);
|
}
|
|
void nvp6158_video_input_novid_read(video_input_novid *vin_novid)
|
{
|
unsigned char val_0xA8;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_novid->devnum], 0xFF, 0x00);
|
val_0xA8 = gpio_i2c_read(nvp6158_iic_addr[vin_novid->devnum], 0xA8);
|
|
vin_novid->novid = (((val_0xA8 >> vin_novid->ch) & 0x1)) ;
|
}
|
|
|
void nvp6158_video_input_no_video_set(video_input_novid *auto_novid)
|
{
|
unsigned char val_13x30;
|
unsigned char val_13x31;
|
unsigned char val_13x32;
|
unsigned char val_9x44;
|
unsigned char val_1x7A;
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x21 + (auto_novid->ch * 4), 0x82);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x23 + (auto_novid->ch * 4), 0x41);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x09);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x80 + (auto_novid->ch * 0x20), 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x81 + (auto_novid->ch * 0x20), 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x0A+auto_novid->ch/2);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x3D + ((auto_novid->ch%2) * 0x80), 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x3C + ((auto_novid->ch%2) * 0x80), 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x05 + auto_novid->ch);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x2C, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x01, 0x62);
|
|
/* Before 08/28 */
|
//gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x58, 0x07);
|
//gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x5C, 0x78);
|
/* After 08/28 */
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x47, 0xEE);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x50, 0xc6); //recovery to std value.
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x58, 0x47);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x5C, 0x7f);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x6E, 0x00); //VBLK default setting
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x6F, 0x00);
|
/* Low-Poass Filter (LPF) Bypass Enable Bank5/6/7/8 0x59 */
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x59, 0x10);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xB8, 0xB9);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xB9, 0xB2);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x43, 0x5a);
|
|
val_13x30 = gpio_i2c_read(nvp6158_iic_addr[auto_novid->devnum], 0x30);
|
val_13x31 = gpio_i2c_read(nvp6158_iic_addr[auto_novid->devnum], 0x31);
|
val_13x32 = gpio_i2c_read(nvp6158_iic_addr[auto_novid->devnum], 0x32);
|
val_13x30 |= ((1 << (auto_novid->ch + 4)) | (1 << auto_novid->ch));
|
val_13x31 |= ((1 << (auto_novid->ch + 4)) | (1 << auto_novid->ch));
|
val_13x32 |= ((1 << auto_novid->ch) & 0xF);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x30, val_13x30);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x31, val_13x31);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x32, val_13x32);
|
|
/* disable Bank11 0x00, if before setting format TVI 5M 20P when onvideo */
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x11);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x00 + ( auto_novid->ch * 0x20 ), 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x09);
|
val_9x44 = gpio_i2c_read(nvp6158_iic_addr[auto_novid->devnum], 0x44);
|
val_9x44 |= (1 << auto_novid->ch);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x50 + (auto_novid->ch*4) , 0x30);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x51 + (auto_novid->ch*4) , 0x6F);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x52 + (auto_novid->ch*4) , 0x67);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x53 + (auto_novid->ch*4) , 0x48);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x44 , val_9x44);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x81+auto_novid->ch, 0x0A);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x85+auto_novid->ch, 0x02);
|
/* clock set */
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x01);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x84 + auto_novid->ch, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x8c + auto_novid->ch, 0x55);
|
val_1x7A = gpio_i2c_read(nvp6158_iic_addr[auto_novid->devnum], 0x7A);
|
val_1x7A |= (1 << auto_novid->ch);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x7A, val_1x7A);
|
}
|
|
void nvp6168_video_input_no_video_set(video_input_novid *auto_novid)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x21 + (auto_novid->ch * 4), 0x82);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x23 + (auto_novid->ch * 4), 0x41);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x09);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x80 + (auto_novid->ch * 0x20), 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x81 + (auto_novid->ch * 0x20), 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xff, (auto_novid->ch < 2 ? 0x0a : 0x0b) );
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x3d + (auto_novid->ch%2 * 0x80), 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x3c + (auto_novid->ch%2 * 0x80), 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x05 + auto_novid->ch);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x01, 0x62);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x2C, 0x00);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x50, 0xc6);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x58, 0x47);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x59, 0x10);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x5C, 0x7f);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xB8, 0xB8);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xB9, 0x72);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x6E, 0x00); //VBLK default setting
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x6F, 0x00);
|
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0xFF, 0x11);
|
gpio_i2c_write(nvp6158_iic_addr[auto_novid->devnum], 0x00 + ( auto_novid->ch * 0x20 ), 0x00);
|
}
|
|
void nvp6158_video_input_cable_dist_read(video_input_cable_dist *vin_cable_dist)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_cable_dist->devnum], 0xFF, 0x13);
|
|
//B13 0xA0 [3:0] Cable Distance Value
|
vin_cable_dist->dist = gpio_i2c_read(nvp6158_iic_addr[vin_cable_dist->devnum], 0xA0 + vin_cable_dist->ch ) & 0xF;
|
}
|
|
|
|
void nvp6158_video_input_sam_val_read(video_input_sam_val *vin_sam_val )
|
{
|
unsigned char val1, val2;
|
|
// Channel Change Sequence
|
gpio_i2c_write(nvp6158_iic_addr[vin_sam_val->devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[vin_sam_val->devnum], 0x2B, vin_sam_val->ch);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_sam_val->devnum], 0xFF, 0x13); /* + vin_sam_val->ch ); */
|
//B13 0xC9 [7:0] SAM Value
|
val1 = gpio_i2c_read(nvp6158_iic_addr[vin_sam_val->devnum], 0xC9) ;
|
//B13 0xC8 [9:8] SAM Value
|
val2 = gpio_i2c_read(nvp6158_iic_addr[vin_sam_val->devnum], 0xC8) & 0x3;
|
|
vin_sam_val->sam_val = ((val2 << 8) | val1);
|
}
|
|
void nvp6158_video_input_hsync_accum_read(video_input_hsync_accum *vin_hsync_accum )
|
{
|
unsigned char val01, val02, val03, val04;
|
unsigned char val11, val12, val13, val14;
|
|
unsigned char h_lock;
|
unsigned int val_1;
|
unsigned int val_2;
|
unsigned int val_result;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x00);
|
h_lock = (gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xE2) >> vin_hsync_accum->ch) & 0x1;
|
|
vin_hsync_accum->h_lock = h_lock;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0x2B, vin_hsync_accum->ch);
|
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x13); /* + vin_sam_val->ch */
|
|
//B13 0xB4 [ 7:0] Hsync Accumulation Value
|
val01 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD0); // 170214 0xB4 -> 0xD0 Fix
|
//B13 0xB5 [15:8] Hsync Accumulation Value
|
val02 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD1); // 170214 0xB5 -> 0xD1 Fix
|
//B13 0xB6 [23:16] Hsync Accumulation Value
|
val03 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD2); // 170214 0xB6 -> 0xD2 Fix
|
//B13 0xB7 [31:24] Hsync Accumulation Value
|
val04 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD3); // 170214 0xB7 -> 0xD3 Fix
|
|
//B13 0xB4 [ 7:0] Hsync Accumulation Value
|
val11 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD4); // 170214 0xB8 -> 0xD4 Fix
|
//B13 0xB5 [15:8] Hsync Accumulation Value
|
val12 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD5); // 170214 0xB9 -> 0xD5 Fix
|
//B13 0xB6 [23:16] Hsync Accumulation Value
|
val13 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD6); // 170214 0xBA -> 0xD6 Fix
|
//B13 0xB7 [31:24] Hsync Accumulation Value
|
val14 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD7); // 170214 0xBB -> 0xD7 Fix
|
|
val_1 = ((val04 << 24) | (val03 << 16) | (val02 << 8) | val01);
|
val_2 = ((val14 << 24) | (val13 << 16) | (val12 << 8) | val11);
|
|
val_result = val_1 - val_2;
|
|
vin_hsync_accum->hsync_accum_val1 = val_1;
|
vin_hsync_accum->hsync_accum_val2 = val_2;
|
vin_hsync_accum->hsync_accum_result = val_result;
|
}
|
|
static int nvp6168_get_eq_read_cnt(unsigned char devnum, unsigned char ch)
|
{
|
unsigned char vfc;
|
int ret = 50;
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x05 + ch);
|
vfc = gpio_i2c_read(nvp6158_iic_addr[devnum], 0xF0);
|
|
switch(vfc)
|
{
|
// 25fps, 3frame=120ms
|
case 0x10 :
|
case 0x21 :
|
case 0x26 :
|
case 0x2A :
|
case 0x2C :
|
case 0x31 :
|
case 0x34 :
|
case 0x36 :
|
case 0x41 :
|
case 0x51 :
|
case 0x55 :
|
case 0x58 :
|
case 0x61 :
|
case 0xA1 :
|
case 0xA5 :
|
ret = 24;
|
break;
|
|
// 30fps, 3frame=100ms
|
case 0x00 :
|
case 0x20 :
|
case 0x25 :
|
case 0x29 :
|
case 0x2B :
|
case 0x30 :
|
case 0x33 :
|
case 0x35 :
|
case 0x40 :
|
case 0x50 :
|
case 0x54 :
|
case 0x57 :
|
case 0x60 :
|
case 0xA0 :
|
case 0xA4 :
|
ret = 20;
|
break;
|
|
// 50fps, 3frame=60ms
|
case 0x23 :
|
case 0x28 :
|
case 0x2E :
|
case 0x39 :
|
case 0x3B :
|
case 0xA3 :
|
case 0xA7 :
|
ret = 12;
|
break;
|
|
// 60fps, 3frame=50ms
|
case 0x22 :
|
case 0x27 :
|
case 0x2D :
|
case 0x38 :
|
case 0x3A :
|
case 0xA2 :
|
case 0xA6 :
|
ret = 10;
|
break;
|
|
// 20fps, 3frame=150ms
|
case 0x70 :
|
case 0x72 :
|
case 0x74 :
|
ret = 30;
|
break;
|
|
// 18fps, 3frame=167ms
|
case 0x42 :
|
case 0x44 :
|
case 0x90 :
|
ret = 34;
|
break;
|
|
// 15fps, 3frame=200ms
|
case 0x3C :
|
case 0x52 :
|
case 0x59 :
|
case 0x80 :
|
case 0x83 :
|
case 0x85 :
|
ret = 40;
|
break;
|
|
// 12.5fps, 3frame=240ms
|
case 0x3D :
|
case 0x71 :
|
case 0x73 :
|
case 0x82 :
|
case 0x84 :
|
case 0x86 :
|
ret = 48;
|
break;
|
|
// 7.5fps, 3frame=400ms
|
case 0x81 :
|
ret = 80;
|
break;
|
|
default :
|
break;
|
}
|
|
return ret;
|
}
|
|
void nvp6168_video_input_hsync_accum_read(video_input_hsync_accum *vin_hsync_accum )
|
{
|
unsigned char val01, val02, val03, val04;
|
unsigned char val11, val12, val13, val14;
|
|
unsigned int val_1 = 0;
|
unsigned int val_2 = 0;
|
unsigned int val_result;
|
|
static unsigned int pre_val_1;
|
static unsigned int pre_val_2;
|
|
unsigned char rst_reg = 1<<vin_hsync_accum->ch;
|
unsigned char vfc, video_loss;
|
int read_cnt=0, total_cnt;
|
video_input_novid s_auto_novid;
|
|
total_cnt = nvp6168_get_eq_read_cnt(vin_hsync_accum->devnum, vin_hsync_accum->ch);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0x2B, vin_hsync_accum->ch);
|
|
while(read_cnt < total_cnt)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x00);
|
video_loss = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xA8);
|
video_loss = (((video_loss >> vin_hsync_accum->ch) & 0x1)) ;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x05 + vin_hsync_accum->ch);
|
vfc = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xF0);
|
|
if((video_loss == 1) && (vfc == 0xFF))
|
{
|
printk("[%s] CH:%d, video_loss:%02X, vfc:0x%X \r\n", __func__, vin_hsync_accum->ch, video_loss, vfc);
|
vin_hsync_accum->hsync_accum_val1 = 0;
|
vin_hsync_accum->hsync_accum_val2 = 0;
|
vin_hsync_accum->hsync_accum_result = 0xffffffff;
|
s_auto_novid.ch = vin_hsync_accum->ch;
|
s_auto_novid.devnum = vin_hsync_accum->devnum;
|
nvp6168_video_input_no_video_set(&s_auto_novid);
|
return;
|
}
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xFF, 0x13);
|
//B13 0xB4 [ 7:0] Hsync Accumulation Value
|
val01 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD0); // 170214 0xB4 -> 0xD0 Fix
|
//B13 0xB5 [15:8] Hsync Accumulation Value
|
val02 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD1); // 170214 0xB5 -> 0xD1 Fix
|
//B13 0xB6 [23:16] Hsync Accumulation Value
|
val03 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD2); // 170214 0xB6 -> 0xD2 Fix
|
//B13 0xB7 [31:24] Hsync Accumulation Value
|
val04 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD3); // 170214 0xB7 -> 0xD3 Fix
|
|
//B13 0xB4 [ 7:0] Hsync Accumulation Value
|
val11 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD4); // 170214 0xB8 -> 0xD4 Fix
|
//B13 0xB5 [15:8] Hsync Accumulation Value
|
val12 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD5); // 170214 0xB9 -> 0xD5 Fix
|
//B13 0xB6 [23:16] Hsync Accumulation Value
|
val13 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD6); // 170214 0xBA -> 0xD6 Fix
|
//B13 0xB7 [31:24] Hsync Accumulation Value
|
val14 = gpio_i2c_read(nvp6158_iic_addr[vin_hsync_accum->devnum], 0xD7); // 170214 0xBB -> 0xD7 Fix
|
|
val_1 = ((val04 << 24) | (val03 << 16) | (val02 << 8) | val01);
|
val_2 = ((val14 << 24) | (val13 << 16) | (val12 << 8) | val11);
|
|
//printk("[%s] CH:%d, video_loss:%02X, vfc:0x%X val1:%08X / val2:%08X \r\n", __func__, vin_hsync_accum->ch, video_loss, vfc, val_1, val_2);
|
|
if((val_1 != 0) && (val_2 != 0))
|
{
|
if((pre_val_1 != val_1) || (pre_val_2 != val_2))
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0x7A, rst_reg);
|
gpio_i2c_write(nvp6158_iic_addr[vin_hsync_accum->devnum], 0x7A, 0x10);
|
pre_val_1 = val_1;
|
pre_val_2 = val_2;
|
break;
|
}
|
}
|
msleep(10);
|
read_cnt++;
|
}
|
val_result = val_1 - val_2;
|
|
vin_hsync_accum->hsync_accum_val1 = val_1;
|
vin_hsync_accum->hsync_accum_val2 = val_2;
|
vin_hsync_accum->hsync_accum_result = val_result;
|
}
|
|
void nvp6158_video_input_agc_val_read(video_input_agc_val *vin_agc_val)
|
{
|
unsigned char agc_lock;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_agc_val->devnum], 0xFF, 0x00);
|
agc_lock = (gpio_i2c_read(nvp6158_iic_addr[vin_agc_val->devnum], 0xE0) >> vin_agc_val->ch) & 0x1;
|
|
vin_agc_val->agc_lock = agc_lock;
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_agc_val->devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[vin_agc_val->devnum], 0x2B, vin_agc_val->ch);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_agc_val->devnum], 0xFF, 0x13); /* + vin_sam_val->ch ); */
|
|
//B13 0xB8 [ 7:0] Hsync Accumulation Value
|
vin_agc_val->agc_val = gpio_i2c_read(nvp6158_iic_addr[vin_agc_val->devnum], 0xC4); // 170213 0xA9 -> 0xC5 // 170310 0xC5 -> 0xC4
|
}
|
|
void nvp6158_video_input_fsc_val_read(video_input_fsc_val *vin_fsc_val)
|
{
|
unsigned char val01, val02, val03, val04;
|
unsigned char val11, val12, val13, val14;
|
unsigned char val21, val22, val23, val24;
|
|
unsigned int val_1, val_2, val_final;
|
|
// Channel Change Sequence
|
gpio_i2c_write(nvp6158_iic_addr[vin_fsc_val->devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[vin_fsc_val->devnum], 0x2B, vin_fsc_val->ch);
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_fsc_val->devnum], 0xFF, 0x13);
|
|
//B13 0xB4 [ 7:0] r_fsc_line_diff_sts
|
val01 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xB4);
|
//B13 0xB5 [15:8] r_fsc_line_diff_sts
|
val02 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xB5);
|
//B13 0xB6 [23:16] r_fsc_line_diff_sts
|
val03 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xB6);
|
//B13 0xB7 [31:24] r_fsc_line_diff_sts
|
val04 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xB7);
|
|
//B13 0xB4 [ 7:0] r_fsc_line2_diff_sts
|
val11 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xB8);
|
//B13 0xB5 [15:8] r_fsc_line2_diff_sts
|
val12 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xB9);
|
//B13 0xB6 [23:16] r_fsc_line2_diff_sts
|
val13 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xBA);
|
//B13 0xB7 [31:24] r_fsc_line2_diff_sts
|
val14 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xBB);
|
|
//B13 0xB4 [ 7:0] r_fsc_line_diff_final
|
val21 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xBC);
|
//B13 0xB5 [15:8] r_fsc_line_diff_final
|
val22 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xBD);
|
//B13 0xB6 [23:16] r_fsc_line_diff_final
|
val23 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xBE);
|
//B13 0xB7 [31:24] r_fsc_line_diff_final
|
val24 = gpio_i2c_read(nvp6158_iic_addr[vin_fsc_val->devnum], 0xBF);
|
|
|
val_1 = ((val04 << 24) | (val03 << 16) | (val02 << 8) | val01);
|
val_2 = ((val14 << 24) | (val13 << 16) | (val12 << 8) | val11);
|
val_final = ((val24 << 24) | (val23 << 16) | (val22 << 8) | val21);
|
|
vin_fsc_val->fsc_val1 = val_1;
|
vin_fsc_val->fsc_val2 = val_2;
|
vin_fsc_val->fsc_final = val_final;
|
}
|
|
// 170420 RAPTOR3 DR2 DEMO ONLY
|
void nvp6158_video_input_aeq_val_set(video_input_aeq_set *vin_aeq_val) // 170214 aeq value set
|
{
|
// if(vin_aeq_val->aeq_val == 0x00)
|
// {
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0xFF, 0x05 + vin_aeq_val->ch);
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x58, 0x03);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x59, 0x00);
|
// }
|
//
|
// else if(vin_aeq_val->aeq_val == 0x02)
|
// {
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0xFF, 0x05 + vin_aeq_val->ch);
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x58, 0xD3);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x59, 0x11);
|
// }
|
|
}
|
|
// 170420 RAPTOR3 DR2 DEMO ONLY
|
void nvp6158_video_input_deq_val_set(video_input_deq_set *vin_deq_val) // 170214 deq value set
|
{
|
// B9 0x80/0xA0/0xC0/0xE0 [3:0]
|
// if(vin_deq_val->deq_val == 0x00)
|
// {
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0xFF, 0x09);
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x80 + ((vin_deq_val->ch)*0x20), 0x00);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x84 + ((vin_deq_val->ch)*0x20), 0x21);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x85 + ((vin_deq_val->ch)*0x20), 0x60);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x86 + ((vin_deq_val->ch)*0x20), 0xF6);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x87 + ((vin_deq_val->ch)*0x20), 0x20);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x88 + ((vin_deq_val->ch)*0x20), 0x00);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x89 + ((vin_deq_val->ch)*0x20), 0xDC);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x8a + ((vin_deq_val->ch)*0x20), 0x02);
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0xFF, 0x00);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x30, 0x18);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x3C, 0x90);
|
// }
|
// else if(vin_deq_val->deq_val == 0x02)
|
// {
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0xFF, 0x09);
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x80 + ((vin_deq_val->ch)*0x20), 0xA7);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x84 + ((vin_deq_val->ch)*0x20), 0x21);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x85 + ((vin_deq_val->ch)*0x20), 0x60);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x86 + ((vin_deq_val->ch)*0x20), 0xF6);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x87 + ((vin_deq_val->ch)*0x20), 0x20);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x88 + ((vin_deq_val->ch)*0x20), 0x00);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x89 + ((vin_deq_val->ch)*0x20), 0xDC);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x8a + ((vin_deq_val->ch)*0x20), 0x02);
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0xFF, 0x00);
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x30, 0x16);
|
// }
|
|
// val = gpio_i2c_read(nvp6158_iic_addr[chip_num], 0x80 + ((vin_deq_val->ch)*0x20));
|
// val = (vin_deq_val->deq_val & 0xF) | val;
|
//
|
// gpio_i2c_write(nvp6158_iic_addr[chip_num], 0x80 + ((vin_deq_val->ch)*0x20), val);
|
}
|
|
void nvp6158_video_input_acc_gain_val_read(video_input_acc_gain_val *vin_acc_gain) // 170215 acc gain read
|
{
|
unsigned char val1, val2;
|
|
if(vin_acc_gain->func_sel == ACC_GAIN_NORMAL) {
|
|
gpio_i2c_write(nvp6158_iic_addr[vin_acc_gain->devnum], 0xFF, 0x05 + vin_acc_gain->ch);
|
|
val1 = gpio_i2c_read(nvp6158_iic_addr[vin_acc_gain->devnum],0xE2) & 0x7; // B5 0xE2 acc gain [10:8]
|
val2 = gpio_i2c_read(nvp6158_iic_addr[vin_acc_gain->devnum],0xE3); // B5 0xE3 acc gain [7:0]
|
}
|
else if(vin_acc_gain->func_sel == ACC_GAIN_DEBUG) { // DEBUG
|
gpio_i2c_write(nvp6158_iic_addr[vin_acc_gain->devnum], 0xFF, 0x00);
|
val1 = 0;
|
val2 = gpio_i2c_read(nvp6158_iic_addr[vin_acc_gain->devnum],0xD8 + vin_acc_gain->ch); // B13 0xC6 acc gain [9:8]
|
}
|
else
|
{
|
gpio_i2c_write(nvp6158_iic_addr[vin_acc_gain->devnum], 0xFF, 0x05);
|
|
val1 = gpio_i2c_read(nvp6158_iic_addr[vin_acc_gain->devnum],0xE2) & 0x7; // B5 0xE2 acc gain [10:8]
|
val2 = gpio_i2c_read(nvp6158_iic_addr[vin_acc_gain->devnum],0xE3); // B5 0xE3 acc gain [7:0]
|
}
|
|
vin_acc_gain->acc_gain_val = val1 << 8 | val2;
|
}
|
|
void nvp6158_video_output_data_out_mode_set(video_output_data_out_mode *vo_data_out_mode)
|
{
|
unsigned char temp_val = 0x0;
|
|
// Show/Hide mode is using register Bank 0 0x7A, 7B
|
// CH2 CH1 CH4 CH3
|
// 0x7A [7 : 4][3 : 0] 0x7B [7 : 4][3 : 0]
|
gpio_i2c_write(nvp6158_iic_addr[vo_data_out_mode->devnum], 0xFF, 0x00);
|
|
switch(vo_data_out_mode -> ch)
|
{
|
case CH1 :
|
case CH2 : temp_val = gpio_i2c_read(nvp6158_iic_addr[vo_data_out_mode->devnum], 0x7A);
|
break;
|
case CH3 :
|
case CH4 : temp_val = gpio_i2c_read(nvp6158_iic_addr[vo_data_out_mode->devnum], 0x7B);
|
break;
|
}
|
|
switch(vo_data_out_mode -> ch)
|
{
|
case CH1 :
|
case CH3 : temp_val = ((temp_val & 0xF0) | (vo_data_out_mode -> set_val & 0xF));
|
break;
|
case CH2 :
|
case CH4 : temp_val = ((temp_val & 0x0F) | ((vo_data_out_mode -> set_val & 0xF) << 4));
|
break;
|
}
|
|
// printk("[%s:%s] : %s >>>> temp_val [ %x ]\n", __FILE__, __LINE__, __FUNCTION__,temp_val);
|
switch(vo_data_out_mode -> ch)
|
{
|
case CH1 :
|
case CH2 : gpio_i2c_write(nvp6158_iic_addr[vo_data_out_mode->devnum], 0x7A, temp_val);
|
break;
|
case CH3 :
|
case CH4 : gpio_i2c_write(nvp6158_iic_addr[vo_data_out_mode->devnum], 0x7B, temp_val);
|
break;
|
}
|
}
|
|
|
unsigned char __nvp6158_IsOver3MRTVideoFormat( decoder_dev_ch_info_s *decoder_info )
|
{
|
unsigned char ret = 0; //
|
|
if(
|
(decoder_info->fmt_def == AHD30_3M_30P) ||
|
(decoder_info->fmt_def == AHD30_3M_25P) ||
|
(decoder_info->fmt_def == AHD30_4M_30P) ||
|
(decoder_info->fmt_def == AHD30_4M_25P) ||
|
(decoder_info->fmt_def == AHD30_5M_20P) ||
|
(decoder_info->fmt_def == AHD30_5_3M_20P) ||
|
(decoder_info->fmt_def == AHD30_6M_18P) ||
|
(decoder_info->fmt_def == AHD30_6M_20P) ||
|
(decoder_info->fmt_def == AHD30_8M_12_5P) ||
|
(decoder_info->fmt_def == AHD30_8M_15P) ||
|
(decoder_info->fmt_def == TVI_4M_30P) ||
|
(decoder_info->fmt_def == TVI_4M_25P) ||
|
(decoder_info->fmt_def == TVI_5M_20P) ||
|
(decoder_info->fmt_def == TVI_8M_12_5P) ||
|
(decoder_info->fmt_def == TVI_8M_15P) ||
|
(decoder_info->fmt_def == CVI_4M_25P) ||
|
(decoder_info->fmt_def == CVI_4M_30P) ||
|
(decoder_info->fmt_def == CVI_5M_20P) ||
|
(decoder_info->fmt_def == CVI_8M_15P) ||
|
(decoder_info->fmt_def == CVI_8M_12_5P)
|
)
|
{
|
ret = 1;
|
}
|
return ret; // 0:Over 3M RT, 1:other formation
|
}
|
|
unsigned char nvp6158_s_only_onetime_run[32] = {0, };
|
void nvp6158_video_input_onvideo_set(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char format_3M_RT;
|
|
printk("onvideo_set dev_num[%x] ch_num[%x] fmt_def[%d]", decoder_info->devnum, decoder_info->ch, decoder_info->fmt_def);
|
|
|
|
/* after 09/12 */
|
format_3M_RT = __nvp6158_IsOver3MRTVideoFormat(decoder_info);
|
|
if(format_3M_RT)
|
{
|
/* DECI_FILTER_ON */
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0xFF, 0x05 + decoder_info->ch);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x50, 0x76);
|
}
|
else
|
{
|
/* DECI_FILTER_OFF */
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0xFF, 0x05 + decoder_info->ch);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x50, 0xc6);
|
}
|
|
|
if( decoder_info->fmt_def == CVI_HD_30P ||
|
decoder_info->fmt_def == CVI_HD_30P_EX ||
|
decoder_info->fmt_def == AHD20_720P_30P ||
|
decoder_info->fmt_def == AHD20_720P_30P_EX ||
|
decoder_info->fmt_def == AHD20_720P_30P_EX_Btype)
|
{
|
//meant to remove pre-connection issue. 07.31
|
if( nvp6158_s_only_onetime_run[decoder_info->ch + 4 * decoder_info->devnum] == 0)
|
{
|
nvp6158_video_input_vafe_reset(decoder_info);
|
nvp6158_s_only_onetime_run[decoder_info->ch + 4 * decoder_info->devnum] = 1;
|
}
|
}
|
else
|
{
|
if( nvp6158_s_only_onetime_run[decoder_info->ch + 4 * decoder_info->devnum] == 0)
|
{
|
nvp6158_s_only_onetime_run[decoder_info->ch + 4 * decoder_info->devnum] = 1;
|
}
|
}
|
|
}
|
|
void nvp6168_video_input_onvideo_set(decoder_dev_ch_info_s *decoder_info)
|
{
|
// unsigned char format_3M_RT;
|
unsigned char ch = decoder_info->ch % 4;
|
unsigned char devnum = decoder_info->devnum;
|
unsigned char val_9x44;
|
#ifndef _NVP6168_USE_MANUAL_MODE_
|
unsigned char set_done=0xF0;
|
#endif
|
printk("onvideo_set dev_num[%x] ch_num[%x] fmt_def[%d]", decoder_info->devnum, decoder_info->ch, decoder_info->fmt_def);
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x09);
|
val_9x44 = gpio_i2c_read(nvp6158_iic_addr[devnum], 0x44);
|
val_9x44 &= ~(1 << ch);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x44, val_9x44);
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x50 + (ch*4) , 0x30);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x51 + (ch*4) , 0x6F);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x52 + (ch*4) , 0x67);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x53 + (ch*4) , 0x48);
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x11);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x00 + (ch*0x20), 0x00);
|
#ifndef _NVP6168_USE_MANUAL_MODE_
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x13);
|
set_done |= gpio_i2c_read(nvp6158_iic_addr[devnum], 0x70);
|
set_done |= (1<<ch);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x70, set_done);
|
|
set_done = gpio_i2c_read(nvp6158_iic_addr[devnum], 0x71);
|
set_done |= (1<<ch);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x71, set_done);
|
#endif
|
}
|
|
void nvp6158_video_input_onvideo_check_data(video_input_vfc *vin_vfc)
|
{
|
unsigned char val_5678xF0;
|
gpio_i2c_write(nvp6158_iic_addr[vin_vfc->devnum], 0xFF, 0x05 + vin_vfc->ch);
|
val_5678xF0 = gpio_i2c_read(nvp6158_iic_addr[vin_vfc->devnum], 0xF0);
|
vin_vfc->vfc = val_5678xF0;
|
}
|
|
void nvp6158_video_input_auto_ch_sw_rst(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char val_1x97;
|
//Software Reset
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0xFF,0x01);
|
val_1x97 = gpio_i2c_read(nvp6158_iic_addr[decoder_info->devnum], 0x97);
|
val_1x97 &= ~(1 << decoder_info->ch);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x97, val_1x97);
|
msleep(10);
|
val_1x97 = gpio_i2c_read(nvp6158_iic_addr[decoder_info->devnum], 0x97);
|
val_1x97 |= (1 << decoder_info->ch);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x97, val_1x97);
|
|
printk("[DRV] Decoder CH[%d] Software Reset done\n",decoder_info->ch);
|
}
|
|
void nvp6158_video_input_vafe_reset(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char val_0x00;
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0xFF, 0x00);
|
val_0x00 = gpio_i2c_read(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch);
|
_SET_BIT(val_0x00, 0);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch, val_0x00);
|
msleep(10);
|
_CLE_BIT(val_0x00, 0);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch, val_0x00);
|
printk("[DRV] AFE CH:[%d] Reset done\n", decoder_info->ch);
|
}
|
|
void nvp6158_video_input_manual_agc_stable_endi(decoder_dev_ch_info_s *decoder_info, int endi)
|
{
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0xFF, 0x05+decoder_info->ch);
|
if( endi == 1 )
|
{
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x82, 0xff);
|
printk("[DRV] MANUAL AGC STABLE ENABLE CH:[%d]\n", decoder_info->ch);
|
}
|
else
|
{
|
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x82, 0x00);
|
printk("[DRV] MANUAL AGC STABLE ENABLE CH:[%d]\n", decoder_info->ch);
|
}
|
}
|
|
void nvp6158_video_input_vafe_control(decoder_dev_ch_info_s *decoder_info, int cmd)
|
{
|
unsigned char val_0x00;
|
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0xFF, 0x00);
|
|
if(cmd == 0)
|
{
|
val_0x00 = gpio_i2c_read(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch);
|
_SET_BIT(val_0x00, 0);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch, val_0x00);
|
|
printk("[DRV] [Ch:%d] AFE Power Down ... \n", decoder_info->ch);
|
|
msleep(10);
|
}
|
else if(cmd == 1)
|
{
|
val_0x00 = gpio_i2c_read(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch);
|
_CLE_BIT(val_0x00, 0);
|
gpio_i2c_write(nvp6158_iic_addr[decoder_info->devnum], 0x00 + decoder_info->ch, val_0x00);
|
|
printk("[DRV] [Ch:%d] AFE Power Up ... \n", decoder_info->ch);
|
|
msleep(10);
|
}
|
}
|
|
static __maybe_unused unsigned int __nvp6158_s_max_min_exclude_avg_func(unsigned int* input_arry, int cnt)
|
{
|
unsigned int max, min, sum = 0, result = 0;
|
unsigned int ii;
|
|
max = input_arry[0];
|
min = input_arry[0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
max = max > input_arry[ii] ? max : input_arry[ii];
|
min = min > input_arry[ii] ? input_arry[ii] : min;
|
|
sum += input_arry[ii];
|
}
|
|
result = sum - (max + min);
|
|
if(result == 0)
|
{
|
return 0;
|
}
|
else
|
{
|
result /= ( cnt - 2 );
|
}
|
|
return result;
|
}
|
|
static unsigned int __nvp6158_s_distinguish_5M_ahd_tvi_func(unsigned int* input_arry, int cnt)
|
{
|
unsigned int chk1, chk2;
|
unsigned int max, max_idx = 0;
|
unsigned int calc_array[10][10] = { {0, 0}, };
|
unsigned int need_update = 0;
|
unsigned int find_idx = 0;
|
unsigned int ii, ij;
|
unsigned int inner_idx = 0;
|
|
chk1 = input_arry[0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
chk2 = input_arry[ii];
|
|
if( chk1 == chk2)
|
{
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk1;
|
}
|
else if( chk1 != chk2 )
|
{
|
for(ij = 0; ij < ii; ij++)
|
{
|
if( calc_array[1][ij] == chk2 )
|
{
|
find_idx = ij;
|
calc_array[0][find_idx] += 1;
|
calc_array[1][find_idx] = chk2;
|
need_update = 0;
|
break;
|
}
|
need_update = 1;
|
}
|
|
if(need_update)
|
{
|
inner_idx += 1;
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk2;
|
}
|
}
|
|
chk1 = chk2;
|
}
|
|
max = calc_array[0][0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
if( max < calc_array[0][ii] )
|
{
|
max_idx = ii;
|
max = calc_array[0][ii];
|
}
|
}
|
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
printk("[DRV] [ idx %d ] [ num %d ] [ val %x ]\n", ii, calc_array[0][ii], calc_array[1][ii]);
|
}
|
|
printk("[DRV] [ max_idx : %d ]\n", max_idx);
|
printk("[DRV] [ inner_idx : %d ]\n", inner_idx);
|
|
return calc_array[1][max_idx];
|
}
|
|
|
void nvp6158_video_input_ahd_tvi_distinguish(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char ch = decoder_info->ch;
|
unsigned char devnum = decoder_info->devnum;
|
unsigned char fmtdef = decoder_info->fmt_def;
|
unsigned char ii;
|
unsigned int check_point;
|
|
unsigned char check_time = 10;
|
|
|
#if 1
|
unsigned int B5xF5_F4[10];
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x05 + ch);
|
|
for(ii = 0; ii < check_time; ii++)
|
{
|
msleep(100);
|
B5xF5_F4[ii] = ( gpio_i2c_read(nvp6158_iic_addr[devnum], 0xF5) << 8 ) | gpio_i2c_read(nvp6158_iic_addr[devnum], 0xF4);
|
printk("[DRV] [Ch:%d] %d time B5xF3_F4 : %x \n", ch, ii, B5xF5_F4[ii]);
|
}
|
|
check_point = __nvp6158_s_distinguish_5M_ahd_tvi_func( B5xF5_F4, check_time );
|
|
if( fmtdef == AHD30_5M_20P )
|
{
|
if( ( check_point & 0xfff ) == 0x7c2)
|
{
|
decoder_info->fmt_def = TVI_5M_20P;
|
printk("[DRV] [Ch:%d] Get Format : AHD 5M 20P, Change Format : TVI 5M 20P\n", decoder_info->ch);
|
}
|
else if( ( check_point & 0xfff ) == 0x7c4)
|
{
|
decoder_info->fmt_def = CVI_5M_20P;
|
printk("[DRV] [Ch:%d] Get Format : AHD 5M 20P, Change Format : CVI 5M 20P\n", decoder_info->ch);
|
}
|
else
|
{
|
|
printk("[DRV] [Ch:%d] Get Format : AHD 5M 20P, Not Change Format\n", decoder_info->ch);
|
}
|
}
|
else if( fmtdef == 0x2B)
|
{
|
if( ( check_point & 0xfff ) >= 0x673)
|
{
|
decoder_info->fmt_def = TVI_4M_15P;
|
printk("[DRV] [Ch:%d] Get Format : AHD 4M15P #0P, Change Format : TVI 4M 15P\n", decoder_info->ch);
|
}
|
}
|
else
|
{
|
decoder_info->fmt_def = fmtdef;
|
}
|
|
|
#else
|
unsigned int B5xE8_E9[10] = {0, };
|
unsigned int B5xEA_EB[10] = {0, };
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x05 + ch);
|
|
|
for(ii = 0; ii < check_time; ii++)
|
{
|
msleep(10);
|
B5xE8_E9[ii] = ( gpio_i2c_read(nvp6158_iic_addr[devnum], 0xE8) << 8 ) | gpio_i2c_read(nvp6158_iic_addr[devnum], 0xE9);
|
B5xEA_EB[ii] = ( gpio_i2c_read(nvp6158_iic_addr[devnum], 0xEA) << 8 ) | gpio_i2c_read(nvp6158_iic_addr[devnum], 0xEB);
|
printk("[DRV] [Ch:%d] %d time 0xE8_0xE9 : %x \n", decoder_info->ch, ii, B5xE8_E9[ii]);
|
printk("[DRV] [Ch:%d] %d time 0xEA_0xEB : %x \n", decoder_info->ch, ii, B5xEA_EB[ii]);
|
}
|
|
check_point1 = __nvp6158_s_max_min_exclude_avg_func( B5xE8_E9, check_time );
|
check_point2 = __nvp6158_s_max_min_exclude_avg_func( B5xEA_EB, check_time );
|
|
printk("[DRV] [Ch:%d] AVG 0xE8_0xE9 : %x \n", decoder_info->ch, check_point1);
|
printk("[DRV] [Ch:%d] AVG 0xEA_0xEB : %x \n", decoder_info->ch, check_point2);
|
|
if( ( check_point1 < 0x30 ) && ( check_point2 < 0x30 ) )
|
{
|
if( fmtdef == AHD30_5M_20P )
|
{
|
decoder_info->fmt_def = TVI_5M_20P;
|
|
printk("[DRV] [Ch:%d] Get Format : AHD 5M 20P, Change Format : TVI 5M 20P\n", decoder_info->ch);
|
}
|
else if( fmtdef == AHD30_3M_30P ) /* Not Yet Support , only add item */
|
{
|
decoder_info->fmt_def = TVI_4M_15P;
|
|
printk("[DRV] [Ch:%d] Get Format : AHD 3M #0P, Change Format : TVI 4M 15P\n", decoder_info->ch);
|
}
|
else
|
{
|
decoder_info->fmt_def = fmtdef;
|
}
|
}
|
else
|
{
|
decoder_info->fmt_def = fmtdef;
|
}
|
#endif
|
}
|
|
void nvp6168_video_input_cvi_tvi_5M20p_distinguish(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char ch = decoder_info->ch;
|
unsigned char devnum = decoder_info->devnum;
|
// unsigned char fmtdef = decoder_info->fmt_def;
|
unsigned char ii;
|
unsigned int check_point;
|
|
unsigned char check_time = 10;
|
|
|
unsigned int B5xF5_F4[10];
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x05 + ch);
|
|
for(ii = 0; ii < check_time; ii++)
|
{
|
msleep(100);
|
B5xF5_F4[ii] = ( gpio_i2c_read(nvp6158_iic_addr[devnum], 0xF5) << 8 ) | gpio_i2c_read(nvp6158_iic_addr[devnum], 0xF4);
|
printk("[DRV] [Ch:%d] %d time B5xF3_F4 : %x \n", ch, ii, B5xF5_F4[ii]);
|
}
|
|
check_point = __nvp6158_s_distinguish_5M_ahd_tvi_func( B5xF5_F4, check_time );
|
|
if( ( check_point & 0xfff ) == 0x7c4)
|
{
|
decoder_info->fmt_def = CVI_5M_20P;
|
printk("[DRV] [Ch:%d] Get Format : AHD 5M 20P, Change Format : CVI 5M 20P\n", decoder_info->ch);
|
}
|
else
|
{
|
|
decoder_info->fmt_def = TVI_5M_20P;
|
printk("[DRV] [Ch:%d] Get Format : AHD 5M 20P, Change Format : TVI 5M 20P\n", decoder_info->ch);
|
}
|
|
}
|
|
|
static unsigned int __nvp6158_s_distinguish_8M_cvi_tvi_func(unsigned int* input_arry, int cnt)
|
{
|
unsigned int chk1, chk2;
|
unsigned int max, max_idx = 0;
|
unsigned int calc_array[10][10] = { {0, 0}, };
|
unsigned int need_update = 0;
|
unsigned int find_idx = 0;
|
unsigned int ii, ij;
|
unsigned int inner_idx = 0;
|
|
chk1 = input_arry[0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
chk2 = input_arry[ii];
|
|
if( chk1 == chk2)
|
{
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk1;
|
}
|
else if( chk1 != chk2 )
|
{
|
for(ij = 0; ij < ii; ij++)
|
{
|
if( calc_array[1][ij] == chk2 )
|
{
|
find_idx = ij;
|
calc_array[0][find_idx] += 1;
|
calc_array[1][find_idx] = chk2;
|
need_update = 0;
|
break;
|
}
|
need_update = 1;
|
}
|
|
if(need_update)
|
{
|
inner_idx += 1;
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk2;
|
}
|
}
|
|
chk1 = chk2;
|
}
|
|
max = calc_array[0][0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
if( max < calc_array[0][ii] )
|
{
|
max_idx = ii;
|
max = calc_array[0][ii];
|
}
|
}
|
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
printk("[DRV] [ idx %d ] [ num %d ] [ val %x ]\n", ii, calc_array[0][ii], calc_array[1][ii]);
|
}
|
|
printk("[DRV] [ max_idx : %d ]\n", max_idx);
|
printk("[DRV] [ inner_idx : %d ]\n", inner_idx);
|
|
return calc_array[1][max_idx];
|
}
|
|
|
int nvp6158_video_input_cvi_tvi_distinguish(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char ch = decoder_info->ch;
|
unsigned char devnum = decoder_info->devnum;
|
unsigned char fmtdef = decoder_info->fmt_def;
|
unsigned char ii;
|
unsigned int check_point;
|
|
unsigned char check_time = 10;
|
|
unsigned int B13xAB[10], B13xAB_zerocnt=0;
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x2B, ch % 4 );
|
|
for(ii = 0; ii < check_time; ii++)
|
{
|
msleep(100);
|
B13xAB[ii] = gpio_i2c_read(nvp6158_iic_addr[devnum], 0xAB);
|
if(B13xAB[ii] == 0)
|
{
|
B13xAB_zerocnt ++;
|
}
|
printk("[DRV] [Ch:%d] %d time B13xAB : %x \n", ch, ii, B13xAB[ii]);
|
}
|
|
if(B13xAB_zerocnt > 2)
|
return -1;
|
|
check_point = __nvp6158_s_distinguish_8M_cvi_tvi_func( B13xAB, check_time );
|
|
if( fmtdef == CVI_8M_15P || fmtdef == CVI_8M_12_5P )
|
{
|
if( ( check_point & 0xff ) > 0x1A )
|
{
|
if( fmtdef == CVI_8M_12_5P )
|
{
|
decoder_info->fmt_def = TVI_8M_12_5P;
|
printk("[DRV] [Ch:%d] Get Format : CVI 8M 12_5P, Change Format : TVI 8M 12_5P\n", decoder_info->ch);
|
}
|
else
|
{
|
decoder_info->fmt_def = TVI_8M_15P;
|
printk("[DRV] [Ch:%d] Get Format : CVI 8M 15P, Change Format : TVI 8M 15P\n", decoder_info->ch);
|
}
|
}
|
else
|
{
|
printk("[DRV] [Ch:%d] Get Format : CVI 8M, Not Change Format\n", decoder_info->ch);
|
}
|
}
|
else
|
{
|
decoder_info->fmt_def = fmtdef;
|
}
|
return 0;
|
}
|
|
static unsigned int __nvp6158_s_distinguish_ahd_nrt_func(unsigned int* input_arry, int cnt)
|
{
|
unsigned int chk1, chk2;
|
unsigned int max, max_idx = 0;
|
unsigned int calc_array[10][10] = { {0, 0}, };
|
unsigned int need_update = 0;
|
unsigned int find_idx = 0;
|
unsigned int ii, ij;
|
unsigned int inner_idx = 0;
|
|
chk1 = input_arry[0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
chk2 = input_arry[ii];
|
|
if( chk1 == chk2)
|
{
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk1;
|
}
|
else if( chk1 != chk2 )
|
{
|
for(ij = 0; ij < ii; ij++)
|
{
|
if( calc_array[1][ij] == chk2 )
|
{
|
find_idx = ij;
|
calc_array[0][find_idx] += 1;
|
calc_array[1][find_idx] = chk2;
|
need_update = 0;
|
break;
|
}
|
need_update = 1;
|
}
|
|
if(need_update)
|
{
|
inner_idx += 1;
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk2;
|
}
|
}
|
|
chk1 = chk2;
|
}
|
|
max = calc_array[0][0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
if( max < calc_array[0][ii] )
|
{
|
max_idx = ii;
|
max = calc_array[0][ii];
|
}
|
}
|
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
printk("[DRV] [ idx %d ] [ num %d ] [ val %x ]\n", ii, calc_array[0][ii], calc_array[1][ii]);
|
}
|
|
printk("[DRV] [ max_idx : %d ]\n", max_idx);
|
printk("[DRV] [ inner_idx : %d ]\n", inner_idx);
|
|
return calc_array[1][max_idx];
|
}
|
|
|
void nvp6158_video_input_ahd_nrt_distinguish(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char ch = decoder_info->ch;
|
unsigned char devnum = decoder_info->devnum;
|
unsigned char ii;
|
unsigned int check_point;
|
|
unsigned char check_time = 10;
|
|
unsigned int B5xF3[10];
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x05 + ch);
|
|
for(ii = 0; ii < check_time; ii++)
|
{
|
msleep(30);
|
B5xF3[ii] = gpio_i2c_read(nvp6158_iic_addr[devnum], 0xF3);
|
printk("[DRV] [Ch:%d] %d time B5xF3 : %x \n", ch, ii, B5xF3[ii]);
|
}
|
|
check_point = __nvp6158_s_distinguish_ahd_nrt_func( B5xF3, check_time );
|
|
if( ( check_point & 0xff ) == 0x14 )
|
{
|
decoder_info->fmt_def = AHD20_1080P_12_5P_EX;
|
printk("[DRV] [Ch:%d] Get Format : AHD 1080P 12.5P\n", decoder_info->ch);
|
}
|
else if( ( check_point & 0xff ) == 0x11 )
|
{
|
decoder_info->fmt_def = AHD20_1080P_15P_EX;
|
printk("[DRV] [Ch:%d] Get Format : AHD 1080P 15P\n", decoder_info->ch);
|
}
|
else
|
{
|
decoder_info->fmt_def = NC_VIVO_CH_FORMATDEF_UNKNOWN;
|
printk("[DRV] [Ch:%d] Get Format : Unknown Format \n", decoder_info->ch);
|
}
|
}
|
|
static unsigned int __nvp6158_s_distinguish_2M_cvi_ahd_func(unsigned int* input_arry, int cnt)
|
{
|
unsigned int chk1, chk2;
|
unsigned int max, max_idx = 0;
|
unsigned int calc_array[10][10] = { {0, 0}, };
|
unsigned int need_update = 0;
|
unsigned int find_idx = 0;
|
unsigned int ii, ij;
|
unsigned int inner_idx = 0;
|
|
chk1 = input_arry[0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
chk2 = input_arry[ii];
|
|
if( chk1 == chk2)
|
{
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk1;
|
}
|
else if( chk1 != chk2 )
|
{
|
for(ij = 0; ij < ii; ij++)
|
{
|
if( calc_array[1][ij] == chk2 )
|
{
|
find_idx = ij;
|
calc_array[0][find_idx] += 1;
|
calc_array[1][find_idx] = chk2;
|
need_update = 0;
|
break;
|
}
|
need_update = 1;
|
}
|
|
if(need_update)
|
{
|
inner_idx += 1;
|
calc_array[0][inner_idx] += 1;
|
calc_array[1][inner_idx] = chk2;
|
}
|
}
|
|
chk1 = chk2;
|
}
|
|
max = calc_array[0][0];
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
if( max < calc_array[0][ii] )
|
{
|
max_idx = ii;
|
max = calc_array[0][ii];
|
}
|
}
|
|
|
for(ii = 0; ii < cnt; ii++)
|
{
|
printk("[DRV] [ idx %d ] [ num %d ] [ val %x ]\n", ii, calc_array[0][ii], calc_array[1][ii]);
|
}
|
|
printk("[DRV] [ max_idx : %d ]\n", max_idx);
|
printk("[DRV] [ inner_idx : %d ]\n", inner_idx);
|
|
return calc_array[1][max_idx];
|
}
|
|
|
void nvp6158_video_input_cvi_ahd_1080p_distinguish(decoder_dev_ch_info_s *decoder_info)
|
{
|
unsigned char ch = decoder_info->ch;
|
unsigned char devnum = decoder_info->devnum;
|
unsigned char fmtdef = decoder_info->fmt_def;
|
unsigned char ii;
|
unsigned int check_point;
|
|
unsigned char check_time = 10;
|
|
unsigned int B13xAB[10];
|
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0xFF, 0x13);
|
gpio_i2c_write(nvp6158_iic_addr[devnum], 0x2B, ch % 4 );
|
|
for(ii = 0; ii < check_time; ii++)
|
{
|
msleep(100);
|
B13xAB[ii] = gpio_i2c_read(nvp6158_iic_addr[devnum], 0xAB);
|
printk("[DRV] [Ch:%d] %d time B13xAB : %x \n", ch, ii, B13xAB[ii]);
|
}
|
|
check_point = __nvp6158_s_distinguish_2M_cvi_ahd_func( B13xAB, check_time );
|
|
if( fmtdef == CVI_FHD_25P )
|
{
|
if( ( check_point & 0xff ) <= 0x09 )
|
{
|
|
decoder_info->fmt_def = AHD20_1080P_25P;
|
printk("[DRV] [Ch:%d] Get Format : CVI 2M 25P, Change Format : AHD 2M 25P\n", decoder_info->ch);
|
}
|
else
|
{
|
printk("[DRV] [Ch:%d] Get Format : CVI 2M, Not Change Format\n", decoder_info->ch);
|
}
|
}
|
else
|
{
|
decoder_info->fmt_def = fmtdef;
|
}
|
}
|