📄 tw9906.c
字号:
/*
$Workfile: tw9906.c $
$Revision: 1.3 $
$Date: Aug 23 2006 22:58:44 $
*/
#define __TW9906_C__
//******************************************************************************
//
// Copyright (C) 2002. GENESIS MICROCHIP INC.
// All rights reserved. No part of this program may be reproduced.
//
// Genesis Microchip Inc., 165 Commerce Valley Dr. West
// Thornhill, Ontario, Canada, L3T 7V8
//
//==============================================================================
//
// MODULE: TW9906.c
//
// USAGE: Contains Functions related to video decoder TW9906
//
//******************************************************************************
//******************************************************************************
// I N C L U D E F I L E S
//******************************************************************************
#include "inc\all.h"
#if (USE_VPORT && USE_GSEL_DRVR_MODEL && (DEV_VIDEO_DECODER == DEV_TW9906))
#define DEBUG_VDD 0
#define DEBUG_VDD_EX 0
#if DEBUG_VDD && DEBUG_MSG
#define msg(a,b) gm_Print((const char far *)a,b)
#else
#define msg(a,b)
#endif
#if DEBUG_VDD_EX && DEBUG_MSG
#define msgx(a,b) gm_Print((const char far *)a,b)
#else
#define msgx(a,b)
#endif
//******************************************************************************
// L O C A L D E F I N I T I O N S
//******************************************************************************
#define TW9906_VID_MODE_STAT_MASK 0x70
#define TW9906_VID_FIELD_FRQ_MASK 0x01
#define TW9906_DEV_ID 0x88
// Register Address of TW9906
#define TW9906_INFORM_ADDR 0x02
#define TW9906_OUTPUT_FORMAT_CTRL 0x03
#define TW9906_ANALOG_CONTRL_REG 0x06
#define TW9906_BRT_ADDR 0x10
#define TW9906_CON_ADDR 0x11
#define TW9906_SAT_U_ADDR 0x13
#define TW9906_SAT_V_ADDR 0x14
#define TW9906_HUE_ADDR 0x15
#define TW9906_SDT_ADDR 0x1C
#define TW9906_STATUS1_ADDR 0x01
#define TW9906_STATUS2_ADDR 0x31
#define TW9906_VBI_LINE_REG_NUM 21
//******************************************************************************
// G L O B A L F U N C T I O N P R O T O T Y P E S
//******************************************************************************
//static BYTE __near dev_Read(BYTE B_RegAddr);
//static void __near dev_Write(BYTE B_RegAddr, BYTE B_Value);
static void __near dev_TW9906ConfigVideoMode (BYTE B_Mode);
static BYTE __near dev_TW9906GetVideoMode (void);
static void __near dev_TW9906SetVideoInput (BYTE B_InType);
static void __near dev_TW9906SetVideoBrightness (BYTE B_BrightVal);
static void __near dev_TW9906SetVideoContrast (BYTE B_ContrastVal);
static void __near dev_TW9906SetVideoHue (BYTE B_HueVal);
static void __near dev_TW9906SetVideoSaturation (BYTE B_SaturationVal);
static BYTE __near dev_TW9906GetVideoStatus (void);
static BYTE __near dev_TW9906GetVideoInterlace (void);
static void __near dev_TW9906PowerUp (void);
static void __near dev_TW9906PowerDown (void);
//******************************************************************************
// G L O B A L V A R I A B L E S
//******************************************************************************
//******************************************************************************
// S T A T I C V A R I A B L E S
//******************************************************************************
static BYTE VID_DECODER_ID = TW9906_DEV_ID; // used when more than one decoder used in a system.
//static BYTE TWO_WIRE_PORT;
//******************************************************************************
// S T A T I C F U N C T I O N P R O T O T Y P E S
//******************************************************************************
BYTE ROM TW9906InitTable[][2] =
{
{0x06, 0x40},
{0x02, 0x70},
{0x03, 0xa2}, // ITU.BT 656 8Bit Format
{0x05, 0x81},
{0x08, 0x13},
{0x09, 0xf2},
#if defined(RD3_57XX) && (BOARD==RD3_57XX)
{0x10, 0xed},
{0x11, 0x62},
{0x12, 0x23},
{0x13, 0xa5},
{0x14, 0xa5},
#else
{0x10, 0xec},
{0x11, 0x6c},
{0x12, 0x23},
{0x13, 0x93},
{0x14, 0x93},
#endif
{0x19, 0x57},
{0x1a, 0x0f},
{0x1b, 0x40},
{0x21, 0x42},
{0x23, 0xf0},
{0x2c, 0x50},
{0x33, 0x08},
{0x35, 0x08},
{0x55, 0x00},
{0x6b, 0x26},
{0x6c, 0x36},
{0x6d, 0xF0},
{0x6e, 0x41},
{0x02, 0x40},
{0x06, 0xc0},
};
BYTE ROM TW9906IPortNTSC[][2] =
{
{0x08, 0x13},
{0x09, 0xf2},
};
BYTE ROM TW9906IPortPAL[][2] =
{
{0x08, 0x19},
{0x09, 0x1f},
};
#if DEBUG_VDD && DEBUG_MSG
BYTE VideoModeType;
#endif
//******************************************************************************
// C O D E
//******************************************************************************
//******************************************************************************
//
// FUNCTION : static BYTE dev_Read(BYTE B_RegAddr)
// USAGE : Wrapper function for 2-Wire Read for TW9906
// INPUT : the register address that need to be read
// OUTPUT : The value read from the register
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static BYTE __near dev_Read(BYTE B_RegAddr)
//BYTE dev_Read(BYTE B_RegAddr)
{
BYTE B_Value;
// msgx("Dev_Read: B_RegAddr=0x%x", B_RegAddr);
gm_WriteI2cBlock(0,VID_DECODER_ID, &B_RegAddr, 1, 0);
gm_ReadI2cBlock(0,VID_DECODER_ID, &B_Value, 1, 1);
// msgx("Dev_Read: Value=0x%x", B_Value);
msgx("Read VID: SubAddr[0x%x]", B_RegAddr);
msgx(" = 0x%x", B_Value);
return B_Value;
}
//******************************************************************************
//
// FUNCTION : static void dev_Write(BYTE B_RegAddr, BYTE B_Value)
// USAGE : Wrapper function for 2-Wire Write for TW9906
// INPUT : the register address , the value
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_Write(BYTE B_RegAddr, BYTE B_Value)
//void dev_Write(BYTE B_RegAddr, BYTE B_Value)
{
WORD temp;
// msg("Dev_Write: B_RegAddr=0x%x ", B_RegAddr);
// msg(" B_Value =0x%x ", B_Value);
((BYTE *)&temp)[0] = B_RegAddr;
((BYTE *)&temp)[1] = B_Value;
msgx("Write VID: SubAddr[0x%x]", B_RegAddr);
msgx(" = 0x%x", B_Value);
gm_WriteI2cBlock(0,VID_DECODER_ID,(BYTE *)&temp, 2, 1);
}
//******************************************************************************
//
// FUNCTION : void dev_TW9906ConfigVideoMode(BYTE B_Mode)
// USAGE : This function initializes TW9906 in specified video mode
// INPUT : mode - NTSC/PAL/SECAM
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_TW9906ConfigVideoMode(BYTE B_Mode)
{
WORD i,RegSize;
msg("dev_TW9906ConfigVideoMode",0);
msg("B_Mode=%d",B_Mode);
//turn VBI lines to default
for(i = 0; i < TW9906_VBI_LINE_REG_NUM; i++)
dev_Write(0x56 + i, 0x00);
if(B_Mode == VDD_MODE_CHANGE)
{
msg("VDD_MODE_CHANGE", 0);
//determine input type by hw means and do the same as for manually passed signal system
B_Mode = dev_TW9906GetVideoMode();
if(B_Mode == VDD_MODE_NOVIDEO)
{
//try to start from NTSC
B_Mode = VDD_MODE_NTSC;
}
}
switch (B_Mode)
{
case VDD_MODE_INIT:
msg("VDD_MODE_INIT",0);
RegSize = sizeof(TW9906InitTable) / 2;
for(i=0; i < RegSize; i++)
dev_Write(TW9906InitTable[i][0],TW9906InitTable[i][1]);
break;
case VDD_MODE_NTSC:
msg("VDD_MODE_NTSC",0);
RegSize = sizeof(TW9906IPortNTSC) / 2;
for(i=0; i < RegSize; i++)
dev_Write(TW9906IPortNTSC[i][0], TW9906IPortNTSC[i][1]);
break;
case VDD_MODE_PAL:
msg("VDD_MODE_PAL",0);
RegSize = sizeof(TW9906IPortPAL) / 2;
for(i=0; i < RegSize; i++)
dev_Write(TW9906IPortPAL[i][0], TW9906IPortPAL[i][1]);
break;
case VDD_MODE_SECAM:
msg("VDD_MODE_SECAM",0);
RegSize = sizeof(TW9906IPortPAL) / 2;
for(i=0; i < RegSize; i++)
dev_Write(TW9906IPortPAL[i][0], TW9906IPortPAL[i][1]);
break;
default:
break;
} // end switch - mode
}
//******************************************************************************
//
// FUNCTION : BYTE dev_TW9906GetVideoMode(void)
// USAGE : This function returns the current input video mode
// INPUT : None
// OUTPUT : returns the mode - NO_VIDEO, NTSC, PAL, SECAM
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static BYTE __near dev_TW9906GetVideoMode(void)
{
BYTE B_Status;
B_Status = (dev_Read(TW9906_SDT_ADDR) & TW9906_VID_MODE_STAT_MASK)>>4;
#if DEBUG_VDD && DEBUG_MSG
if (B_Status!=VideoModeType)
{
msg("Previous Video mode=0x%x",VideoModeType);
msg("New Get Video mode=0x%x",B_Status);
VideoModeType=B_Status;
switch (B_Status)
{
case 0x00:
msg("TW9906:GetVideoMode =NTSC",0);
break;
case 0x01:
msg("TW9906:GetVideoMode =PAL",0);
break;
case 0x02:
msg("TW9906:GetVideoMode =SECAM",0);
break;
default:
(dev_Read(TW9906_STATUS1_ADDR) & TW9906_VID_FIELD_FRQ_MASK) ? msg("TW9906:GetVideoMode =PAL",0) : msg("TW9906:GetVideoMode =NTSC",0);
break;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -