📄 hal.c
字号:
#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 + -