📄 vpc3230.c
字号:
#include "vpc3230.h"
/***********************************************************************************/
/*********本文件VPC3230.C用于控制彩色解码电路 **************/
/***********************************************************/
WORD code VpcPalStandard[] =
{
0x21, 0x035F,
0x28, 0x0088,
0x29, 0x0358
};
WORD code VpcNtscStandard[] =
{
0x21, 0x0359,
0x28, 0x0088,
0x29, 0x0358
};
BYTE code VPC_byte_data[][2] =
{
0X20, 0X02,
0X30, 0X36,
0x91, 0x00,
};
WORD code VPC_word_data[][2] =
{
0x1f, 0x0e00,
0x21, 0X0359,
0x22, 0x0087,
0X26, 0X0064,
0x27, 0x00b0,
0X28, 0X0088,
0X29, 0X0359,
0x90, 0x0a28, //03d2,OSD color
0x92, 0x3060, //1c44,OSD brightness
};
WORD code VPC_FP_data[][2] =
{
0X0039, 0X0019,
0X003A, 0X0005,
0X0042, 0X02cf,
0X0043, 0X0610,
0X0040, 0X00c0,
0X0065, 0X0000,
0X0066, 0X0000,
0X006D, 0X0005, //0005
0X0023, 0X0f80,
0X0020, 0X0021,
0x0148, 0x007f
};
/***********************************************************/
/**********写一个字节数据到VPC3230**************************/
/*形参数据:sub_address=VPC3230寄存器地址 */
/* datum=写如寄存器的数据 */
/*返回值: 无 */
/**********************************************************/
void WriteI2cToVpcByte(BYTE sub_address, BYTE datum)
{
write_to_i2c(WRITE_3230, sub_address, 1, &datum);
}
/***********************************************************/
/**********写一个字数据到VPC3230 **************************/
/*形参数据:sub_address=VPC3230寄存器地址 */
/* datum=写如寄存器的数据 */
/*返回值: 无 */
/**********************************************************/
void WriteI2cToVpcWord(BYTE sub_address, WORD datum)
{
BYTE temp[2];
temp[1] =(BYTE)(datum & 0X00ff);
datum >>=8;
temp[0] =(BYTE)(datum & 0X00ff);
write_to_i2c(WRITE_3230, sub_address, 2, temp);
}
/***********************************************************/
/**********写一个字数据到VPC3230'FP*************************/
/*形参数据:FP_address=VPC3230 FP寄存器地址 */
/* datum=写如寄存器的数据 */
/*返回值: 无 */
/**********************************************************/
void Write3230Fp(WORD FP_address, WORD FP_data)
{
BYTE temp[2];
temp[1] = (BYTE)(FP_address & 0x00ff);
FP_address >>= 8;
temp[0] = (BYTE)(FP_address & 0x00ff);
write_to_i2c(WRITE_3230, FP_WR, 2, temp);
temp[1] = (BYTE)(FP_data & 0x00ff);
FP_data >>= 8;
temp[0] = (BYTE)(FP_data & 0x00ff);
write_to_i2c(WRITE_3230, FP_RW_DATA, 2, temp);
}
/***********************************************************/
/**********从VPC3230 FP中读一个字 ************************/
/*形参数据:FP_address=VPC3230 FP寄存器地址 */
/*返回值: FP 中读出的数据 */
/**********************************************************/
WORD ReadOneWordFromVpcfp(WORD FP_address)
{
BYTE temp[2];
WORD datum;
temp[1] = (BYTE)(FP_address & 0x00ff);
FP_address >>=0x08;
temp[0] = (BYTE)(FP_address & 0x00ff);
write_to_i2c(WRITE_3230, FP_RD, 2, temp);
read_from_i2c_2b(READ_3230, FP_RW_DATA, temp);
datum = (WORD)(temp[0])*256+temp[1];
return datum;
}
/************************************************************************/
/***************初始化VPC3230 IC(刚上电时) */
/*形参数据:无,返回值:无 */
/************************************************************************/
void Init_3230D(void)
{
IBYTE i;
IBYTE adata[3];
for(i=0; i<sizeof(VPC_byte_data)/2; i++)
WriteI2cToVpcByte(VPC_byte_data[i][0], VPC_byte_data[i][1]);
for(i=0; i<sizeof(VPC_word_data)/4; i++)
WriteI2cToVpcWord(VPC_word_data[i][0],VPC_word_data[i][1]);
for(i=0; i<sizeof(VPC_FP_data)/4; i++)
Write3230Fp(VPC_FP_data[i][0], VPC_FP_data[i][1]);
for(i=0;i<=2;i++)
read_from_i2c(READ_EEPROM,ANALOG_2402+i,adata+i);
Write3230Fp(0x0052, adata[0]&0x00ff);
Write3230Fp(0x0053, adata[1]&0x00ff);
Write3230Fp(0x0030, ((WORD)adata[2])*0x0040);
Write3230Fp(0x0040, 0x0000);
}
/*************************************************************/
/********* Static Switch Mode (k=0 or k=64) *******/
/*****YCbCr_mix=(k*YCbCr_main+(64-k)*YCbCr_cip)/64 **/
/***** Parameter x=0,k=64 force YCbCr_main *******/
/***** Parameter x=1,k=0 force YCbCr_cip *******/
/***this subroutine is used to handle DVD component signal ***/
/*************************************************************/
void StaticSwitchMode(void)
{
WriteI2cToVpcByte(0x94, 0x00); //SELLIN=0;RGBDLY=0;
WriteI2cToVpcByte(0x95, 0x00); //FBMODE=11;fb=0
WriteI2cToVpcByte(0x96, 0x84); //84no OSD and select DVD component
}
/*************************************************************/
/** Static Mixer Mode,k=FBGAIN*(31-FBOFFS)+32, 0=<k<=64 ******/
/*****YCbCr_mix=(k*YCbCr_main+(64-k)*YCbCr_cip)/64 **/
/***this subroutine is statically mixed YCbCr_main **********/
/***and YCbCr_cip, the mixer operates independently of the ***/
/*** FastBlank input.FBOFFS<=31,FBGAIN=0..7 as rounding ******/
/**** this subroutine is used to select OSD and no DVD ******/
/*************************************************************/
void StaticMixerMode(void)
{
WriteI2cToVpcByte(0x94, FBGAIN*16); //SELLIN=0;RGBDLY=0;
WriteI2cToVpcByte(0x95, FBOFFS|0x40); //FBMODE=0x40,fb active
WriteI2cToVpcByte(0x96, 0x62); //FBCLP=1,fb=31-FBOFFS
}
/*************************************************************/
/***** Dynamic Mixer Mode(linear mixing coefficient is *******/
/***** used to insert a fullscreen video signal *******/
/***** k=FBGAIN*(FB-FBOFFS)+32 *******/
/*****YCbCr_mix=(k*YCbCr_main+(64-k)*YCbCr_cip)/64 **/
/*************************************************************/
void DynamicLinearMixerMode(void)
{
WriteI2cToVpcByte(0x94, FBGAIN*16); //SELLIN=0;RGBDLY=0;
WriteI2cToVpcByte(0x95, FBOFFS|0x40); //FBMODE=0x40,fb active
WriteI2cToVpcByte(0x96, 0x42); //FBCLP=0,fb normal,ADC extend +3db
}
/*************************************************************/
/***** Dynamic Mixer Mode(non-linear mixing coefficient is ***/
/***** well-suited to insert FastBlank related signal ********/
/***** like text kl=FBGAIN*(FB-FBOFFS)+32,knl=F(kl) *******/
/*****YCbCr_mix=(knl*YCbCr_main+(64-knl)*YCbCr_cip)/64 **/
/*************************************************************/
void DynamicNonLinearMixerMode(void)
{
WriteI2cToVpcByte(0x94, FBGAIN*16+0x03); //SELLIN=1;RGBDLY=1;
WriteI2cToVpcByte(0x95, FBOFFS|0x40); //FBMODE=0x40,fb active
WriteI2cToVpcByte(0x96, 0x42); //FBCLP=0,fb normal,ADC extend +3db
}
/***************************************************************/
/**** select mixer operate mode between OSD and YCbCr_main ****/
/**** x=0 static mixer mode ****/
/**** x=1 Dynamic linear mixer mode ****/
/**** x=2 Dynamic non-linear mixer mode ****/
/***************************************************************/
void SelectMixMode(BYTE x)
{
if(x==0)
StaticMixerMode();
else if(x==1)
DynamicLinearMixerMode();
else if(x==2)
DynamicNonLinearMixerMode();
else if(x==3)
StaticSwitchMode();
else
_nop_();
}
/***********************************************************/
/*自动彩色制式识别 */
/*形参数据:ColorOnOff=自动彩色制式识别开关。1:开,0=关 */
/***********************************************************/
void VpcAutoColor(BOOL ColorOnOff)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -