⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tw9906.c

📁 GM5621原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
   $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 + -