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

📄 saa7119.c

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