📄 vpc3230.c
字号:
/*********************************************************************
COPYRIGHT (C) Himax Technologies, Inc.
File name : VPC3230D.C
Description : Video Decorder VPC3230D
Author : Nice Chen
Create date : 2004/10/01
Modifications :
*********************************************************************/
#define _VPC3230_C
/********************** Include Section *****************************/
#include "vpc3230.h"
#include "i2c_control.h"
#include "rs232.h"
#include "main.h"
/**************** Function Implement Section ************************/
/* ================================================================
Name : init_VPC3230D
Purpose : initial vpc3230 video decorder
Passed : None
Notes : None
================================================================ */
/* ================================================================
Name : init_VPC3230D
Purpose : initial vpc3230 video decorder
Passed : None
Notes : None
================================================================ */
void init_VPC3230D(void)
{
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0021,0x0526);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0069,0x002a);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x006a,0x0aab);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x006d,0x0005);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0041,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0042,0x02d0);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0043,0x0640);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0044,0x03c4);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0045,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0047,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0048,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0049,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x004a,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x004b,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x004c,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x004d,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x004e,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x004f,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0050,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0052,0x0002);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0053,0x0930);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0040,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0021,0x0566);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0022,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0020,0x0040);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x80, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x81, 0x03, 0xe0);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x82, 0x03, 0xe0);
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x83,0xc7);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x84, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x85, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x86, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x87, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x88, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x89, 0x00, 0x08);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x8a, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x8c, 0x00, 0x00);
Enable_VID_3230();
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x20, 0x80);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x21, 0x03, 0x59);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x22, 0x00, 0x32);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x23, 0x06, 0x00);
/* ===========================================
Process 601 or 656
------------------------------------------- */
#if CCIR601==1
// 601
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x24, 0x20);
Puts_UART("VPC3230 Set to CCIR601\r\n");
#else
// 656
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x24, 0x38);
Puts_UART("VPC3230 Set to CCIR656\r\n");
#endif
// =============End of 601 or 656 =============
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x26, 0x00, 0x32);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x27, 0x03, 0x20);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x28, 0x00, 0x3c);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x29, 0x00, 0x00);
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x30, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x8b, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x90, 0x05, 0xd2);
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x91, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x92, 0x16, 0x50);
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x94, 0xe0);
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x95, 0x60);
VPC_Set_1Byte(VPC3230D_A_ADDR, 0x96, 0x40);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0012,0x0200);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0023,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0028,0x08d3);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0029,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x002f,0x0800);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0030,0x0816);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0039,0x0019);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x003a,0x0005);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0055,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0061,0x0036);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0065,0x0ff6);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0066,0x0004);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x006e,0x000b);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00aa,0x003c);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00ab,0x029a);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00ac,0x029a);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00b5,0x0190);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00dc,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00f7,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x00f8,0x0d30);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0148,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0167,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x016c,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x017a,0x067d);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x017d,0x0500);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x22, 0x00, 0x66);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x26, 0x00, 0x00);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x27, 0x00, 0x22);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x28, 0x00, 0x72);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x29, 0x03, 0x56);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0148,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0042,0x02d0);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0043,0x0600);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0040,0x0000);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0069,0x002a);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x006a,0x0aab);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x006d,0x0005);
}
/* ================================================================
Name : VPC_FP_Wrt
Purpose : VPC3230 Fast Processor Write Function
Passed : None
Notes : None
================================================================ */
Bool VPC_FP_Wrt (Byte DevAdr, Word index, Word val)
{
Bool iAck;
Start();
iAck = Write(DevAdr);
if (iAck)
{
iAck = Write(0x37);
if (iAck)
{
iAck = Write((Byte)(index>>8));
if (iAck)
{
iAck = Write((Byte)(index));
if (iAck)
{
Stop();
Start();
iAck = Write(DevAdr);
if (iAck)
{
iAck = Write(0x38);
if (iAck)
{
iAck = Write((Byte)(val>>8));
if (iAck)
Write((Byte)(val));
}
}
}
}
}
}
Stop();
return iAck;
}
/* ================================================================
Name : VPC_Set_1Byte
Purpose : VPC3230 General Register Write Function One Byte
Passed : None
Notes : None
================================================================ */
Bool VPC_Set_1Byte(Byte DevAdr, Byte index, Byte val)
{
Bool iAck;
Start();
iAck = Write(DevAdr);
if (iAck)
{
iAck = Write(index);
if (iAck )
Write(val);
}
Stop();
return iAck;
}
/* ================================================================
Name : VPC_Set_2Byte
Purpose : VPC3230 General Register Write Function Two Byte
Passed : None
Notes : None
================================================================ */
Bool VPC_Set_2Byte(Byte DevAdr, Byte index, Byte val, Byte val2)
{
Bool iAck;
Start();
iAck = Write(DevAdr);
if (iAck)
{
iAck = Write(index);
if (iAck)
{
iAck =Write(val);
if (iAck)
Write(val2);
}
}
Stop();
return iAck;
}
/* ================================================================
Name : SetVidSRC
Purpose : Set Vpc3230 Video Path
Passed : None
Notes : None
================================================================ */
void SetVidSRC( Byte byMode, Byte bySystem )
{
switch (byMode)
{
case _AV:
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0020,Vid_Comb[bySystem][0]);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0021,0x0865);
break;
case _YC:
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0020,Vid_Comb[bySystem][1]);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0021,0x0866);
break;
// G4 RealChip Board is not support
/*
case _Tuner:
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0020,Vid_Comb[bySystem][0]);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0021,0x0864 );
break;
case _Component:
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0020,Vid_Comb[bySystem][0]);
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0021,0x08e3 );
break;
*/
}
}
/* ================================================================
Name : Disable_VID_3230
Purpose : VPC3230 Disable Data Output
Passed : None
Notes : None
================================================================ */
void Disable_VID_3230(void)
{
VPC_FP_Wrt (VPC3230D_A_ADDR, 0x0148,0x0000);
VPC_Set_2Byte(VPC3230D_A_ADDR, 0x1f, 0x03, 0xc8);
}
/* ================================================================
Name : Check_AV_SRC
Purpose : Toggle VPC3230D to Check if H-Sync is exist ?
Passed : None
Notes : None
================================================================ */
Bool Check_AV_SRC ( void )
{
Word status=0;
Byte byCnt = 50;
Byte byLock = 0;
// Using VPC3230 check H-Sync 50 times
do
{
VPC_FP_Read(0x0013,&status);
TMR_wait_1ms(5);
if (( (status & 0x0007 )== 0x0003 ))
{
byLock++;
if (byLock >=3)
{
return TRUE;
}
}
}
while ((--byCnt) >0);
return FALSE;
}
/* ================================================================
Name : VPC_FP_Read
Purpose : Read VPC3230 one Word
Passed : None
Notes : None
================================================================ */
void VPC_FP_Read(Word index, Word *val)
{
Start();
Write(VPC3230D_A_ADDR);
Write(FPRead);
Write((Byte)(index>>8));
Write((Byte)(index));
Stop();
Start();
Write(VPC3230D_A_ADDR);
Write(FPDat);
Start();
Write(VPC3230D_A_ADDR+1);
*val = ReadWord();
Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -