📄 hal1.c
字号:
// *****************************************************************************
// FILE : HAL1.C
// Hardware control module provides TV_Encoder, AUDIO_Dac and EEPROM 24C020work function.
// 1. TV_Encoder supports Cheertek W9954
// 2. AUDIO_DAC supports Cheertek W6630, BB PCM1723,
// 3. ALL controlling procedures about these controllers are put
// -----------------------------------------------------------------------------
// Version 2.00 For HAL1.C
// -----------------------------------------------------------------------------
// Copyright (c) 2000, Cheertek Corp. All rights reserved.
// *****************************************************************************
#include "winav.h"
#include "hal.h"
#include "setup.h"
#include "cdinfo.h"
#include "cc.h"
#include "avsys.h"
#include "initial.h"
#include "chips.h"
#include "utl.h"
//Kevin1.25, for DMTech only
//#define NTSC_IRE_75 //Kevin1.24DMTech, NTSC: 7.5 IRE; otherwise, 0 IRE
#ifdef SUPPORT_SCART_IF
//kevin2.39, for SCART Macrovision: RGB sync is on the composite line
#define RGB_NO_SYNC_ON_G
#endif
#if AUDIO_DAC == DAC_WM8746 //Jeff 0730
void WM8746_Write(void);
#endif // #if AUDIO_DAC == DAC_WM8746 //Jeff 0730
#if AUDIO_DAC == DAC_PCM1742
void PCM1742_Write(void);
#endif
void Delay10us(void); // TCC275C
////////////////////////////////////////////////////////////
// control TV encoder for support I2C
#ifdef SUPPORT_I2C
BYTE _REG[26]; // used by other module only, check later
#endif // SUPPORT_I2C
///////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
extern BYTE __bTVType; // keep the current TV type
extern BYTE _bAPSType; // keep APS Type: 0, 1, 2, 3
extern BYTE _bVideoOutput; // LLY.048-3, keep __SetupInfo.bVideoOutput
extern BYTE _bHALTemp, _bHALTemp1; // KCHong, 20030115
extern DWORD _dwHALTemp; //Kevin1.07a
//extern BYTE _bDownSample; // LLY.050a, keep downsample type
extern BYTE _bSampleFreq ; // LLY.160a
/////////////////////////////////////////////////////////////
// Micky2.78+one_cpu, declare a dummy byte for code segament.
// as the batch file will assign HAL1's const code bank
// but the constant code only exist when AV system.
BYTE code aHAL1Dummy;
////////////////////////////////////////////////////////////////////////
WORD _wSampleRate; // keep sample rate for specify Audio DAC
WORD _wBitResolution; // keep bit resolution for specify Audio DAC
#ifdef SUPPORT_AV_SYSTEM
// wyc2.80, remove MSDAV / MSAV 3.0 system board control code.
BYTE __bExtCSR1; // = 0xff; //Kevin2.31, reduce code size
#endif //
////////////////////DELAY LIBRARY//////////////////////////
#define EEPROM_DELAY_MAX (1022L*CPU_SPEED/CPU_27M) //About 10ms at 27M
#define COMPENSATION_DELAY (50L*CPU_SPEED/CPU_27M) //Add to guarantee the enough delay
#define ATMEL_GPIO 0
#define STR609_GPIO (140L*CPU_SPEED/CPU_27M)
#define STR540_GPIO (160L*CPU_SPEED/CPU_27M)
#define F92AB_GPIO (300L*CPU_SPEED/CPU_27M)
#define NS75AF_GPIO (480L*CPU_SPEED/CPU_27M)
#define ATMEL_PIO (60L*CPU_SPEED/CPU_27M)
#define STR609_PIO (270L*CPU_SPEED/CPU_27M)
#define STR540_PIO (310L*CPU_SPEED/CPU_27M)
#define F92AB_PIO (460L*CPU_SPEED/CPU_27M)
#define NS75AF_PIO (620L*CPU_SPEED/CPU_27M)
#define NS55AD_PIO (650L*CPU_SPEED/CPU_27M)
#define EEPROM_WRITE_DELAY (NS55AD_PIO+COMPENSATION_DELAY)
//Kevin2.31, reduce code size
#ifdef I2C_TEST
WORD __wDelay; //= (WORD)EEPROM_WRITE_DELAY ;
#endif
//BYTE __bDelay_I2C = 16 ; //Kevin2.31, reduce code size
BYTE __bHAL1Tmp1, __bHAL1Tmp2 ;
DWORD __dwHAL1Temp;
BYTE __bHAL1_Deemphasis; //=FALSE //Kevin1.08, initialized in INITIAL_Variables()
#if IO == IO_PCI //Kevin1.07, use global vars. to record P4/P5/P5CON under EPP/PCI
DWORD __dwHAL1P4 = 0; //P4
DWORD __dwHAL1P5 = 0; //P5
DWORD __dwHAL1P5CON = 0; //P5CON
#endif
////////////////////////////////////////////////////////////////////////
//# [100] Internal function for I2C relative function
#ifdef SUPPORT_I2C
// ** Following functions come from Philips original programs
BOOL _IIC_GetACK (void);
BYTE _IIC_RxByte (void);
void _IIC_SetACK (void);
void _IIC_SetNAK (void);
void _IIC_START (void);
void _IIC_STOP (void);
void _IIC_TxByte (BYTE bValue);
// ** The following function only control and read Pin Status
void _I2C_Set_SDAT_HIGH(void);
void _I2C_Set_SDAT_LOW(void);
void _I2C_Set_SCLK_HIGH(void);
void _I2C_Set_SCLK_LOW(void);
BIT _I2C_Get_SDAT (void);
BIT _I2C_Get_SCLK (void);
void _I2C_Delay (void);
#endif //#ifdef SUPPORT_I2C
void _ProgramDACACLKInput(void);
// **************************************************************
// Function : HAL_SetSCART
// Description : Set SCART relative mode
// Arguments : bScartType, specify the desired SCART mode
// Return : None
// **************************************************************
void HAL_SetSCART (BYTE bScartType)
{
// LLY.278, always reference setup setting, ie. don't care the bitstream info.
// Becasue Mustek's request, don't care about bitstream format, just reference SETUP.
#ifdef SET_SCART_FROM_SETUP
if(__SetupInfo.bAspectRatio == SETUP_SCREEN_TV_TYPE_WIDE)
{
if(bScartType == HAL_SCART_POWER_ON)
bScartType=HAL_SCART_16_9;
}
#endif // #ifdef SET_SCART_FROM_SETUP
//Kevin1.07, add (EPP doesn't work on P4)
#ifdef SUPPORT_SCART_IF
#define PIN_SCART_SW 0x01 //P4^0
#define PIN_SCART_TV 0x02 //P4^1
#define PIN_SCART_RGB 0x04 //P4^2
#if IO == IO_PCI
switch (bScartType)
{
case HAL_SCART_CVBS:
__dwHAL1P4 &= ~PIN_SCART_RGB;
break ;
case HAL_SCART_RGB:
__dwHAL1P4 |= PIN_SCART_RGB;
break ;
case HAL_SCART_POWER_STANDBY: //TV mode
__dwHAL1P4 &= ~PIN_SCART_SW;
__dwHAL1P4 |= PIN_SCART_TV;
break ;
case HAL_SCART_POWER_ON: //4:3
__dwHAL1P4 |= PIN_SCART_SW;
__dwHAL1P4 &= ~PIN_SCART_TV;
break ;
case HAL_SCART_16_9: //16:9
__dwHAL1P4 &= ~PIN_SCART_SW;
__dwHAL1P4 &= ~PIN_SCART_TV;
break ;
}
W99AV_OutIndex(0x700000A6); //SFR P4
W99AV_OutData(__dwHAL1P4);
#else //#if IO == IO_PCI
switch (bScartType)
{
case HAL_SCART_CVBS:
P4 &= ~PIN_SCART_RGB;
break ;
case HAL_SCART_RGB:
P4 |= PIN_SCART_RGB;
break ;
case HAL_SCART_POWER_STANDBY: //TV mode
P4 &= ~PIN_SCART_SW;
P4 |= PIN_SCART_TV;
break ;
case HAL_SCART_POWER_ON: //4:3
P4 |= PIN_SCART_SW;
P4 &= ~PIN_SCART_TV;
break ;
case HAL_SCART_16_9: //16:9
P4 &= ~PIN_SCART_SW;
P4 &= ~PIN_SCART_TV;
break ;
}
#endif //#if IO == IO_PCI
#endif //#ifdef SUPPORT_SCART_IF
}
// Apogee function code end ..
// LLY.278, must add "NOARGES" because it will be called by ISR
// ISR_Timer0() --> PANEL_KeyScan() --> HAL1_ExtIOCtrl()
#pragma NOAREGS // called in ISR
#pragma DISABLE // will disable all interrupt for the duration of function
// can't use when function return is BIT
void HAL1_ExtIOCtrl(BYTE bControl)
{
#ifdef SUPPORT_AV_SYSTEM
#ifdef SYSTEM_8051
// wyc.278-3, re-define follow external IO PIN for different system.
__bExtCSR1 = 0xff; //Kevin2.31, reduce code size
if(bControl & 0x08)
__bExtCSR1 |= 0x01 << (bControl & 0x07);
else
__bExtCSR1 &= ~(0x01 << (bControl & 0x07));
__sbEXT_CS1 = 0 ;
OUTB(EXT_CS1_PORT,__bExtCSR1) ;
__sbEXT_CS1 = 1 ;
#endif // #ifdef SYSTEM_8051
#endif //
}
// wyc2.80, rename this function
#ifdef EXT_IO
// **************************************************************************
// Function : HAL1_ExtIOStatus
// Description : Setting external IO output
// Arguments :
// Return :
// Side Effect :
// ***************************************************************************
// LLY.278, must add "NOARGES" because it will be called by ISR
// [1] ISR_Timer0() --> PANEL_KeyScan() --> HAL1_ExtIOStatus()
// [2] ISR_INT1() --> HAL_AdjustTVMode() --> _TVModeSet()
// --> _IIC_GetACK() --> _I2C_GetSDAT() --> HAL1_ExtIOStatus()
#pragma NOAREGS // called in ISR
#pragma DISABLE // will disable all interrupt for the duration of function
// can't use when function return is BIT
BYTE HAL1_ExtIOStatus()
{
BYTE STATUS ;
// EA = 0;
__sbEXT_CS1 = 0 ;
STATUS = INPB(EXT_CS1_PORT) ;
__sbEXT_CS1 = 1 ;
// EA = 1;
return STATUS ;
}
#endif // #ifdef EXT_IO
#ifdef SUPPORT_ADJUST_CHROM_PHASE
//Kevin1.25, create
// *******************************************************************************
// Function : _WriteTVEGainWithChromPhase
// Description : adjust chrominance phase by calculating new Cb & Cr and write reg. GAIN_YC or GAIN_CAV
// Arguments : bReg: GAIN_YC or GAIN_CAV
// wLo: default CbCr value
// wHi: default Y
// __SetupInfo.bChromPhaseOffset: chrominance offset
// Return : None
// Side Effect : None
// *******************************************************************************
#pragma NOAREGS
void _WriteTVEGainWithChromPhase(BYTE bReg, WORD wLo, WORD wHi)
{
// Cr
// | Vc
// | /
// | / theta
// |/___________Cb
// Chrominance amplitude: Vc=sqrt(Cb^2+Cr^2)
// Chrominance phase: theta=atan(Cr/Cb)
// Adjust theta while Vc remains unchanged : Cb^2+Cb^2=Cb'^2+Cr'^2
// - CVBS & S-Video: adjust Cb/Cr in reg. GAIN_YC
// - YUV: adjust Cb/Cr in reg. GAIN_CAV
// - RGB: adjust Cb/Cr in reg. GAIN_CAV
//below definitions are adjustable
#define CHROM_PHASE_GAP_YC 4
#define CHROM_PHASE_GAP_CAV 8
if (bReg==GAIN_YC)
{
_bHALTemp = (wLo & 0x7F00)>>8; //default Cb [14:8]
_bHALTemp1 = wLo & 0x007F; //default Cr [6:0]
#ifdef SUPPORT_PRINTF
printf("GAIN_YC: org Cb=%hx Cr=%hx\n", _bHALTemp, _bHALTemp1);
#endif
_dwHALTemp = (DWORD)_bHALTemp*_bHALTemp + (DWORD)_bHALTemp1*_bHALTemp1; //Cb^2 + Cr^2
//SETUP adjusts Cr'
if (__SetupInfo.bChromPhaseOffset>SETUP_SCREEN_CHROM_PHASE_0)
{
__bTemp = (__SetupInfo.bChromPhaseOffset-SETUP_SCREEN_CHROM_PHASE_0) * CHROM_PHASE_GAP_YC;
if ((WORD)_bHALTemp1+__bTemp < 0x7F)
_bHALTemp1 += __bTemp; //Cr'
else
_bHALTemp1 = 0x7F; //Cr'
}
else
{
__bTemp = (SETUP_SCREEN_CHROM_PHASE_0-__SetupInfo.bChromPhaseOffset) * CHROM_PHASE_GAP_YC;
if (_bHALTemp1>__bTemp)
_bHALTemp1 -= __bTemp; //Cr'
else
_bHALTemp1 = 0; //Cr'
}
__dwTemp = (DWORD)_bHALTemp1*_bHALTemp1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -