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

📄 hal1.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
// *****************************************************************************
// 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 + -