📄 saa7119.c
字号:
/*
$Workfile: saa7119.c $
$Revision: 1.2 $
$Date: Aug 23 2006 22:58:42 $
*/
#define __SAA7119_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: saa7119.c
//
// USAGE: Contains Functions related to video decoder SAA7119
//
//******************************************************************************
//******************************************************************************
// 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_SAA7119))
#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
//extern gmt_RET_STAT gmp_WriteI2CSW(BYTE B_DevAddress, BYTE *Bp_Buffer,BYTE B_Length, BYTE B_Stop );
//extern gmt_RET_STAT gmp_ReadI2CSW(BYTE B_DevAddress, BYTE *Bp_Buffer,BYTE B_Length, BYTE B_Stop );
extern gmt_RET_STAT gm_WriteI2cBlock( BYTE B_Port, BYTE B_DevAddress, BYTE *Bp_Buffer, BYTE B_Length, gmt_RET_STAT B_Stop);
extern gmt_RET_STAT gm_ReadI2cBlock( BYTE B_Port, BYTE B_DevAddress, BYTE *Bp_Buffer, BYTE B_Length, gmt_RET_STAT B_Stop);
//******************************************************************************
// L O C A L D E F I N I T I O N S
//******************************************************************************
#define SAA7119_VID_MODE_STAT_MASK 0x03
#define SAA7119_VID_FIELD_FRQ_MASK 0x20
#define SAA7119_DEV_ID 0x40
// Register Address of SA7119
#define SAA7119_AIN1_ADDR 0x02
#define SAA7119_BRT_ADDR 0x0A
#define SAA7119_CON_ADDR 0x0B
#define SAA7119_SAT_ADDR 0x0C
#define SAA7119_HUE_ADDR 0x0D
#define SAA7119_DEC_STAT_ADDR 0x1E
#define SAA7119_DEC_STAT_ADDR2 0x1F
#define SAA7119_VBI_LINE_REG_NUM 23
//******************************************************************************
// 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_saa7119ConfigVideoMode (BYTE B_Mode);
static BYTE __near dev_saa7119GetVideoMode (void);
static void __near dev_saa7119SetVideoInput (BYTE B_InType);
static void __near dev_saa7119SetVideoBrightness (BYTE B_BrightVal);
static void __near dev_saa7119SetVideoContrast (BYTE B_ContrastVal);
static void __near dev_saa7119SetVideoHue (BYTE B_HueVal);
static void __near dev_saa7119SetVideoSaturation (BYTE B_SaturationVal);
static BYTE __near dev_saa7119GetVideoStatus (void);
static BYTE __near dev_saa7119GetVideoInterlace (void);
static void __near dev_saa7119PowerUp (void);
static void __near dev_saa7119PowerDown (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 = SAA7119_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 saa7119InitTable[][2] =
{
{0x01,0x18}, {0x03,0x40},
{0x06,0xeb}, {0x07,0xe0},
{0x08,0xb0}, {0x09,0x40}, {0x0a,0x80}, {0x0b,0x44},
{0x0c,0x40}, {0x0e,0x03}, {0x0f,0x2a}, {0x10,0x06},
{0x11,0x00}, {0x12,0x00}, {0x13,0x00}, {0x14,0x00},
{0x15,0x11}, {0x16,0xfe}, {0x17,0xe8}, {0x18,0x40},
{0x19,0x80}, {0x1a,0x77}, {0x1b,0x42}, {0x1c,0xA9},
{0x1d,0x01}, {0x3b,0x3f}, {0x3c,0xd1},
{0x3d,0x31}, {0x3e,0x03},
#if (SAA7119_PORT != SAA7119_OUTPUT_IPORT)
{0x80,0x90}, {0x81,0x00}, {0x83, 0},
{0x84,0xa0}, {0x85,0x10}, {0x86,0x45},
#else
{0x83,0x01},
#endif
{0x88,0x0a},
};
*/
//extern BYTE ROM saa7119InitTable[][];
BYTE ROM saa7119InitTable[][2] =
{
{0x83,0x01}, {0x3C,0x00}, {0x3c,0x40}, {0x83,0x00},
{0x88,0x00}, {0x88,0x20},
{0x00,0x11}, {0x01,0x17}, {0x02,0x00}, {0x03,0x43},
{0x04,0xa8}, {0x05,0x94}, {0x06,0xf6}, {0x07,0xee},
{0x08,0xb0}, {0x09,0x08}, {0x0a,0x80}, {0x0b,0x44},
{0x0c,0x40}, {0x0d,0x00}, {0x0e,0x0d}, {0x10,0x06},
{0x11,0x00}, {0x12,0x8f}, {0x13,0x00}, {0x14,0x74},
{0x15,0x10}, {0x16,0xfe}, {0x17,0x30}, {0x18,0x40},
{0x19,0x80}, {0x1a,0x77}, {0x1b,0x02}, {0x1c,0xdd},
{0x1d,0x02}, {0x20,0x40}, {0x21,0x03}, {0x22,0x94},
{0x23,0x94}, {0x24,0x00}, {0x25,0x00}, {0x26,0x00},
{0x27,0x00}, {0x28,0x00}, {0x29,0x00}, {0x2a,0x80},
{0x2b,0x40}, {0x2c,0x40}, {0x2d,0x00}, {0x2e,0x00},
{0x2f,0x00}, {0x30,0xbc}, {0x31,0xdf}, {0x32,0x02},
{0x34,0xcd}, {0x35,0xcc}, {0x36,0x3a}, {0x38,0x03},
{0x39,0x20}, {0x3a,0x00}, {0x3b,0x3f}, {0x3c,0xcd},
{0x3d,0x31}, {0x3e,0x03}, {0x3f,0x06}, {0x40,0x00},
{0x58,0x00},
{0x59,0x47}, {0x5a,0x06}, {0x5b,0x83}, {0x5d,0x00},
{0x5f,0x00}, {0x60,0x00}, {0x61,0x00}, {0x62,0x00},
{0x63,0x00}, {0x64,0x00}, {0x65,0x00}, {0x66,0xa6},
{0x67,0x00}, {0x68,0x00}, {0x69,0x00}, {0x6a,0x00},
{0x6b,0xa6}, {0x6c,0x00}, {0x6d,0x00}, {0x6e,0x00},
{0x6f,0x00}, {0x70,0x00}, {0x71,0x00}, {0x72,0xa6},
{0x73,0x00}, {0x74,0x00}, {0x75,0x00}, {0x76,0x00},
{0x77,0x01}, {0x78,0x00}, {0x79,0x00}, {0x7a,0x00},
{0x7b,0x00}, {0x7c,0x00}, {0x7d,0x00}, {0x7e,0x00},
{0x7f,0x00},
#if (SAA7119_PORT == SAA7119_OUTPUT_IPORT)
{0x80,0x90}, {0x81,0x00}, {0x83, 0},
{0x84,0xa0}, {0x85,0x10}, {0x86,0x45},
#else
{0x80,0x92}, {0x81,0x00}, {0x83,0x11},
{0x84,0x00}, {0x85,0x00}, {0x86,0xca},
#endif
{0x87,0x01},
{0x88,0x30}, {0x89,0x00}, {0x8a,0x00}, {0x8b,0x00},
{0x8c,0x00}, {0x8e,0x00}, {0x8f,0x0b}, {0x90,0x00},
{0x91,0x08}, {0x92,0x00}, {0x93,0xc0}, {0x94,0x02},
{0x95,0x00}, {0x96,0xd0}, {0x97,0x02}, {0x98,0x01},
{0x99,0x00}, {0x9a,0x06}, {0x9b,0x81}, {0x9c,0xd0},
{0x9d,0x02}, {0x9e,0xf0}, {0x9f,0x00}, {0xa0,0x01},
{0xa1,0x00}, {0xa2,0x00}, {0xa4,0x80}, {0xa5,0x40},
{0xa6,0x40}, {0xa8,0x00}, {0xa9,0x04}, {0xaa,0x00},
{0xac,0x00}, {0xad,0x02}, {0xae,0x00}, {0xb0,0x00},
{0xb1,0x04}, {0xb2,0x00}, {0xb3,0x04}, {0xb4,0x40},
{0xb5,0x05}, {0xb6,0x33}, {0xb7,0xc3}, {0xb8,0x00},
{0xb9,0x00}, {0xba,0x00}, {0xbb,0x00}, {0xbc,0x00},
{0xbd,0x00}, {0xbe,0x00}, {0xbf,0x00}, {0xc0,0x00},
{0xc1,0x00}, {0xc2,0x00}, {0xc3,0x00}, {0xc4,0x00},
{0xc5,0x00}, {0xc6,0x00}, {0xc7,0x00}, {0xc8,0x00},
{0xc9,0x00}, {0xca,0x00}, {0xcb,0x00}, {0xcc,0x00},
{0xcd,0x00}, {0xce,0x00}, {0xcf,0x00}, {0xd0,0x00},
{0xd1,0x00}, {0xd2,0x00}, {0xd4,0x00}, {0xd5,0x00},
{0xd6,0x00}, {0xd8,0x00}, {0xd9,0x00}, {0xda,0x00},
{0xdc,0x00}, {0xdd,0x00}, {0xde,0x00}, {0xe0,0x00},
{0xe1,0x00}, {0xe2,0x00}, {0xe3,0x00}, {0xe4,0x00},
{0xe5,0x00}, {0xe6,0x00}, {0xe7,0x00}, {0xe8,0x00},
{0xe9,0x00}, {0xea,0x00}, {0xeb,0x00}, {0xec,0x00},
{0xed,0x00}, {0xee,0x00}, {0xef,0x00},
{0x88,0x00}, {0x88,0x20},
};
#if (SAA7119_PORT == SAA7119_OUTPUT_IPORT)
BYTE ROM saa7119IPortNTSC[][2] =
{
{0x40,0x40},
#if ENABLE_CC_SUPPORT
{0x54, 0x44},
#endif
{0x58, 0x00}, {0x59, 0x47}, {0x5A, 0x06},
{0x5B, 0x83}, {0x5C, 0x00}, {0x5d, 0x06},
{0x5E, 0x00}, {0x5F, 0x00},
// enable i-port
{0x80,0x90},
{0x83,0},
{0x84,0xA0},
{0x85,0x10},
{0x86,0x45},
// select I-PORT
// {0x80, 0x90},
// {0x83,0},
{0x84,0xA0},
{0x85,0x10},
// {0x86,0x45}
};
BYTE ROM saa7119IPortPAL[][2] =
{
{0x40,0x40},
#if ENABLE_WSS_SUPPORT
{0x56,0x5f},
#endif
{0x58, 0x00}, {0x59, 0x47}, {0x5A,0x03},
{0x5B, 0x03}, {0x5C, 0x00}, {0x5d,0x06},
{0x5E, 0x00}, {0x5F,0x00},
// enable i-port
{0x80,0x90},
{0x83,0},
{0x84,0xA0},
{0x85,0x10},
{0x86,0x45},
// select I-PORT
// {0x80, 0x90},
// {0x83,0},
{0x84,0xA0},
{0x85,0x10},
// {0x86,0x45}
};
#endif
#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 SAA7119
// 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 SAA7119
// 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_saa7119ConfigVideoMode(BYTE B_Mode)
// USAGE : This function initializes SAA7119 in specified video mode
// INPUT : mode - NTSC/PAL/SECAM
// OUTPUT : None
// GLOBALS : None
// USED_REGS :
//******************************************************************************
static void __near dev_saa7119ConfigVideoMode(BYTE B_Mode)
{
WORD i,RegSize;
msg("dev_saa7119ConfigVideoMode",0);
msg("B_Mode=%d",B_Mode);
//turn VBI lines to default
for(i = 0; i < SAA7119_VBI_LINE_REG_NUM; i++)
dev_Write(0x41 + i, 0xff);
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_saa7119GetVideoMode();
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(saa7119InitTable) / 2;
for(i=0; i < RegSize; i++)
dev_Write(saa7119InitTable[i][0],saa7119InitTable[i][1]);
break;
case VDD_MODE_NTSC:
msg("VDD_MODE_NTSC",0);
// dev_Write(0x0a, 0x84);
// dev_Write(0x0e, 0x0a);
// dev_Write(0x13, 0x81);
// dev_Write(0x84, 0x00);
// dev_Write(0x85, 0x01);
dev_Write(0x0a, 0x84);
dev_Write(0x0e, 0x0b);
dev_Write(0x13, 0x80);
#if (SAA7119_PORT == SAA7119_OUTPUT_IPORT)
RegSize = sizeof(saa7119IPortNTSC) / 2;
for(i=0; i < RegSize; i++)
dev_Write(saa7119IPortNTSC[i][0], saa7119IPortNTSC[i][1]);
#else
dev_Write(0x84, 0x00);
dev_Write(0x85, 0x01);
#endif
break;
case VDD_MODE_PAL:
msg("VDD_MODE_PAL",0);
dev_Write(0x0a, 0x80);
dev_Write(0x0e, 0x82);
dev_Write(0x13, 0x80);
#if (SAA7119_PORT == SAA7119_OUTPUT_IPORT)
RegSize = sizeof(saa7119IPortPAL) / 2;
for(i=0; i < RegSize; i++)
dev_Write(saa7119IPortPAL[i][0], saa7119IPortPAL[i][1]);
#else
dev_Write(0x84, 0x00);
dev_Write(0x85, 0x01);
#endif
break;
case VDD_MODE_SECAM:
msg("VDD_MODE_SECAM",0);
dev_Write(0x0a, 0x80);
dev_Write(0x0e, 0x82);
dev_Write(0x13, 0x80);
#if (SAA7119_PORT == SAA7119_OUTPUT_IPORT)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -