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

📄 hal.c

📁 ct952 source code use for Digital Frame Photo
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "winav.h"
#include "ctkav.h"
#include "hal.h"
#include "srcfilter.h"
#include "parser.h"
//#include "mpeg2dec.h"
#include "comdec.h"
#include "disp.h"
#include "utl.h"
#include "ctkav_mcu.h" //kevin0.67
#include "char_subpict.h"

#ifdef ECOS909
#include "eCoscc.h"
#endif
#include "subpict.h"
#include "cc.h"
#include "chips.h"
#include "infofilter.h"
#include "setup.h"
#include "initial.h"
#include "gdi.h"
#include "jpegfmt.h"
#include "cdg.h"
#include "media.h" //CoCo2.16, add for STB
#include "mmanager.h"

//////////////////////////////////////////////////////////////////////////////////
//  Big modification history
// LLY2.01, extend the GPIO R/W API, that it can specify the group

// LLY2.04, remove the un-necessary global variables
// ex. 908 used only (register related variables)
//     temp global variables

// LLY2.05, remove the un-necessary code
// - HAL_SetSectorFormat() since nobody ues it now.

// LLY2.10, remove CT909A related code

// LLY2.11, remove pin related define to pio.h
// ex. IOMUTE/ EEPROM_SCK/ EEPROM_DAT/ SCART_SW/ SCART_TV/ SCART_RGB

////////////////////////////////////////////////////////////////////////////////
// Some define for debug code usage
// If define it, it will print-out R/W AM procdure value
//#define DEBUG_RW_AM


//#define     NONE    0 //NULL


////////////////////////////////////////////////////////////////////////////////////
///// Global Vars /////
WORD    __wHALAudioBitrate=0;
WORD    __wHALSamplesPerFrame=1150;
BYTE    __bCDDA_DTS;// =CDDA_FORMAT_UNKNOWN;
BYTE    __bMPEGVideoMode;
BYTE    __bTVType;
#ifdef SUPPORT_TFT_DIGITAL_MODE
BYTE    __bTFTMode;
BYTE    __bTFTOutput;
#endif // SUPPORT_TFT

WORD    __wPicVsize;//=240; // keep picture vertical size
WORD    __wPicHsize;//=352; // keep picture horizontal size

WORD    __wHCW, __wVCW;  // keep picture hor. & ver. size while clip command
SHORT   __wXStart=0, __wYStart=0;

WORD    __wHALAVIDRLow=0x89E0, __wHALAVIDRHigh=0x000F;

BYTE   __bZoomPos=0;  // LLY2.20, keep last zoom position status


// LLY2.04, only define _REG[26] array while enable "#define SUPPORT_TFT"
// Since, TFT related code will shared this array, and the code is same between 908 and 909
#ifdef  SUPPORT_TFT
BYTE   _REG[26];
#endif  // #ifdef SUPPORT_TFT



///// Internal Vars /////
// LLY.103, keep video display mode: WIDE/ LB/ PS. It's the real setting value of display mode
// which is relative to bitstream supporting: LB/PS/WIDE. So, it's may different from __SetupInfo.bAspectRatio value
BYTE    _bVideoDisplayMode;
BYTE    _bSampleFreq=AUDIO_FREQ_NONE;

// LLY1.50, remove it since nobody use it now.
//DWORD   _dwHALGPCDir=0x0,         _dwHALGPCData=0; //Alan0.69



///// Internal Funs /////
BYTE    _ControlDownSample(BYTE bSampleFreq);

///// Extern Vars & function prototype/////
extern  BYTE     __bNTSCBitStream;  // define in CC module
extern  WORD    __wCurrentVBuffer;
extern  BYTE    __bLOGO;
extern  BYTE    __btDriveOpen;
extern  BYTE    __bMin, __bSec, __bFrame;
extern  DWORD   __dwSTCUpdated;
extern  void    _SetAudType(BYTE bType);  // in CHIPS module

// Micky0.70, add aspect ration related begin
DWORD	__dwPicHSize;
DWORD	__dwPicVSize;
#include 	"dvdinfo.h"
#include	"navigate.h"
// Micky0.70, add aspect ration related end


// LLY2.20, porting Chuan's code to use a define for Vertical/ Horizontal start address.
// Notice: HStart + 720 must <= 858 (NTSC)
//         HStart + 720 must <= 864 (PAL)
//         VStart + 480 must <= 525 (NTSC)
//         VStart + 576 must <= 625 (PAL)
#ifdef VIDEO_LOCATE_AT_CENTER_OF_SONY_MONITOR
// Chuan, Locate at center of SONY Monitor
#define     VIDEO_HSTART_NTSC           (101)
#define     VIDEO_VSTART_NTSC           (46)
#define     VIDEO_HSTART_NTSC_PSCAN     (98)
#define     VIDEO_VSTART_NTSC_PSCAN     (43)
#define     VIDEO_HSTART_PAL            (109)
#define     VIDEO_VSTART_PAL            (48)
#define     VIDEO_HSTART_PAL_PSCAN      (109)
#define     VIDEO_VSTART_PAL_PSCAN      (45)
#else   // #ifdef VIDEO_LOCATE_AT_CENTER_OF_SONY_MONITOR
// Chuan, Locate at center of TV
#define     VIDEO_HSTART_NTSC           (113)
#define     VIDEO_VSTART_NTSC           (46)
#define     VIDEO_HSTART_NTSC_PSCAN     (110)
#define     VIDEO_VSTART_NTSC_PSCAN     (43)
#define     VIDEO_HSTART_PAL            (119)
#define     VIDEO_VSTART_PAL            (48)
#define     VIDEO_HSTART_PAL_PSCAN      (119)
#define     VIDEO_VSTART_PAL_PSCAN      (45)
#endif  // #ifdef VIDEO_LOCATE_AT_CENTER_OF_SONY_MONITOR
// Grievous2.75, Add for aspect ratio debug
// #define ASPECT_RATIO_DEBUG
// Grievous2.75, need or not to do Pan&Scan
//#define ASPECT_RATIO_PANSCAN
#define     DIVX_BORDER_PERC        (0)         //The Percent Number of Border



//********************************************************************************
// Description :   Based on the desired audio type to issue relative setting:
// Arguments   :   bType, the desired audio type
// Return      :   None
// Side Effect :   Must call HAL_ControlParser(HAL_PARSER_AUDIO_ID,XX)
//                 to set correct audio ID
//********************************************************************************
void    HAL_SetAudioType(BYTE bType)
{
    // LLY2.18, nothing need to do if audio type is unknown
    if(bType == HAL_AUDIO_NONE)
    {
        return;
    }

    __wHALAVIDRLow &= 0x1FFF; // clear AVIDR[15:13] packet stream ID

    _SetAudType(bType);

    HAL_WriteAM(HAL_AM_UPSAMPLE_EN, 0);  //kevin1.01

    // LLY2.30, always disable LPCM down-sample setting while non-LPCM audio stream
    if(bType != HAL_AUDIO_LPCM)
    {
        HAL_WriteAM(HAL_AM_DOWNSAMPLE_EN, 0);
    }

    //set audio buffer / control parameters
    switch(bType)
    {
    case    HAL_AUDIO_PCM:
        __wHALAVIDRLow |= 0xA000;
        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 3);
	    HAL_WriteAM(HAL_AM_PCM_MODE, 1); //kevin0.80, set in CHIPS_ControlHDCD

	    //CMH2.55, enable PCM audio upsample
#ifdef  SUPPORT_PCM_AUDIO_UP_SAMPLE
		HAL_WriteAM(HAL_AM_UPSAMPLE_EN, 1);
#endif  // #ifdef  SUPPORT_PCM_AUDIO_UP_SAMPLE

        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_PCM);

        break;
    case    HAL_AUDIO_MPG:
        __wHALAVIDRLow |= 0xC000;
        HAL_WriteAM(HAL_AM_START_DECODE, 1);
#ifdef  SUPPORT_MPEG_AUDIO_UP_SAMPLE
        HAL_WriteAM(HAL_AM_UPSAMPLE_EN, 1);
#endif  // #ifdef  SUPPORT_MPEG_AUDIO_UP_SAMPLE
        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 2);

        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_MPG);

        break;
    case    HAL_AUDIO_AC3:
         //the range for AC3 is 0x80 ~ 0x87
        __wHALAVIDRLow &= 0x07ff;
        __wHALAVIDRLow |= 0x8000;
        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 1);
        HAL_WriteAM(HAL_AM_ENCODE_SPDIF_RAW, 1);

        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_AC3);

        break;
    case    HAL_AUDIO_WMA:
        // LLY2.32, set audio type as 6 for WMA
        // Since, original setting procedure is removed from _ChangeDSPCode()
        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 6);

        // Notice: WMA buffer mode is same as MP3
        // LLY2.35, give audio buffer setting mode as WMA
        // Since, only WMA will use 2 audio buffer from v2.35
        //HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_MP3);
        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_WMA);

        break;
    case    HAL_AUDIO_MP3:
    case    HAL_AUDIO_MP2:
        //kevin0.80, move to MONITOR_AudioStream()
        //HAL_WriteAM(HAL_AM_START_DECODE, 0);

#ifdef  SUPPORT_MPEG_AUDIO_UP_SAMPLE
        HAL_WriteAM(HAL_AM_UPSAMPLE_EN, 1);
#endif  // #ifdef  SUPPORT_MPEG_AUDIO_UP_SAMPLE
        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 2);

        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_MP3);

        break;
    case    HAL_AUDIO_LPCM:
        __wHALAVIDRLow |= 0xA000;
        //_ControlDownSample();
        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 3);
	    HAL_WriteAM(HAL_AM_PCM_MODE, 0); //kevin0.80, fix CDDA->LPCM => all noise

        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_LPCM);

        break;
    case    HAL_AUDIO_DTS:
        //the range for DTS is 0x88 ~ 0x8F
        __wHALAVIDRLow &= 0x07ff;
        __wHALAVIDRLow |= 0x8800;

        HAL_WriteAM(HAL_AM_AUDIO_TYPE, 4);
        HAL_WriteAM(HAL_AM_ENCODE_SPDIF_RAW, 1);

		//distinguish DVD-DTS from CD-DTS
		if (__wDiscType & BOOK_DVD)
        {
            HAL_WriteAM(HAL_AM_DTS_MODE, 0);
        }
		else if (__wDiscType & BOOK_CDDA)
        {
			HAL_WriteAM(HAL_AM_DTS_MODE, 1);
        }

        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_DTS);

        break;

    // LLY2.10, new added audio format: AAC for NeroDigital
    // LLY2.17, set audio buffer for AAC
    case    HAL_AUDIO_AAC:
        HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_AUDIOBUF_AAC);
        break;

    default:
        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Not implement case for HAL_SetAudioType(): %lx\n", bType);
        break;
    }

    HAL_Reset(HAL_RESET_AUDIO) ;
}



//  ***********************************************************************************************
//  Function    :   HAL_SetAudioDAC
//  Description :   Set ACLK & Program audio DAC, it also handle down/ up sameple control
//  Arguments   :   bSampleFreq, sampleing freq.
//  Return      :   None
//  Side Effect :   None
//  ***********************************************************************************************
// If define it, it will print-out current audio frequency for ADAC
//#define DEBUG_ADAC_FREQ
void    HAL_SetAudioDAC(BYTE bSampleFreq) //test OK
{
    if (bSampleFreq > AUDIO_FREQ_END)
    {
#ifdef SUPPORT_PRINTF
        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "\nAudio freq/ Bit len out of range!") ;
#endif
        return;
    }

    // control downsampling
    // LLY2.30, remove LPCM down sample procedure outside
    // And, let controller to do it by itself.
    // bSampleFreq = _ControlDownSample(bSampleFreq);

#ifdef SUPPORT_MPEG_AUDIO_UP_SAMPLE //kevin1.11c, fix MP3 SampleRate display is wrong & time display is too slow
    if ( bSampleFreq==AUDIO_FREQ_8K || bSampleFreq==AUDIO_FREQ_16K || bSampleFreq==AUDIO_FREQ_11K || bSampleFreq==AUDIO_FREQ_22K || bSampleFreq==AUDIO_FREQ_12K || bSampleFreq==AUDIO_FREQ_24K)
    {
        if ( (__bAudioType == HAL_AUDIO_MP2) || (__bAudioType == HAL_AUDIO_MP3) || (__bAudioType == HAL_AUDIO_MPG) )
        {
            DWORD   dwLSFMode;
            HAL_ReadAM( HAL_AM_MP3_LSF, &dwLSFMode);

            switch (dwLSFMode)
            {
                case 1: //MP3 LSF
                    bSampleFreq++;
                    break;
                case 3: //MP3 2.5
                    bSampleFreq+=2;
                    break;
            }
        }
        /* //not support upsampling temp.
        else if (__bAudioType == HAL_AUDIO_WMA) //kevin1.01
        {
            _dwHALTemp2++;
        }
        */
    }
#endif

// CMH2.55, up sample PCM audio frequncy to 32k/44.1k/48k
#ifdef SUPPORT_PCM_AUDIO_UP_SAMPLE
	if((__bAudioType== HAL_AUDIO_PCM) && (__bAttrPlay == ATTR_AVI))
	{
		switch(bSampleFreq)
		{
		case 1:		//8k
		case 6:		//11k
		case 0xb:	//12k
			bSampleFreq+=2;
			break;
		case 2:		//16k
		case 7:		//22k
		case 0xc:	//24k
			bSampleFreq++;
			break;
		default:
			break;
		}
	}
#endif  // #ifdef SUPPORT_PCM_AUDIO_UP_SAMPLE


    //Kevin1.26, don't set ACLK frequency & program ADAC again if new sampling freq == previous sampling freq
    // Writting reg. ACCR to program ACLK may cause SPDIF bo noise or discont. sound
    if (bSampleFreq == _bSampleFreq) //new==previous
        return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -