📄 hal.c
字号:
// LLY.274, add protection to avoid underflow calculation
if( (__rcHALVCD30Area.wLeft+__wW99AVHDSR/2) < (__wW99AVSPHDS/2) )
__rcHALVCD30Area.wLeft=0;
else
__rcHALVCD30Area.wLeft=(__rcHALVCD30Area.wLeft+__wW99AVHDSR/2-__wW99AVSPHDS/2);
// LLY.275a, add protection for calculation underflow
if( (__rcHALVCD30Area.wRight+__wW99AVHDSR/2) < (__wW99AVSPHDS/2) )
__rcHALVCD30Area.wRight=0;
else
__rcHALVCD30Area.wRight=(__rcHALVCD30Area.wRight+__wW99AVHDSR/2-__wW99AVSPHDS/2);
// VCD30.y=(Video.y+VDS*2-SPVDS*2)
__rcHALVCD30Area.wTop=(__rcHALVCD30Area.wTop+_wHALTemp1*2-_wHALTemp1*2);
__rcHALVCD30Area.wBottom=(__rcHALVCD30Area.wBottom+_wHALTemp1*2-_wHALTemp1*2);
// LLY.103-2, must re-set SPVDS value to same as current VBI_VDS
// because VCD3.0 will refer SPVDS value
// In fact, SPVDS value is same as WIDE mode VBI_VDS while choose LB mode SPST
// But it's not suitable for VCD3.0 reference
_dwHALTemp = W99AV_ReadRegDW(VDSVDWR);
// LLY2.81, split CT9928AF & CT908, because the bit meaning is different
// CT9928: bit[8:0]=VDW, bit[17:9]=VDS
// CT908: bit[9:0]=VDW, bit[19:10]=VDS
_dwHALTemp &= 0xFFFFFC00; // clear bit[9:0], VDW, and keep bit[19:10], VDS
// Micky0.90, fix the SP+HL don't match w/ main video
// don't set SPVDSHDSR directly.
// RISC will reference DRAM_SPVDSHDS, then do adjustment.
// DRAM_SPVDSHDS, bit 0~15, SPHDS. bit 16~31, SPVDS
// W99AV_WriteRegDW(SPVDSHDSR, LOWORD(_dwHALTemp), HIWORD(_dwHALTemp));
_dwHALTemp <<= 6; // let SPVDS at bit 16~31
_dwHALTemp |= __wW99AVSPHDS; // merge SPVDS and SPHDS
W99AV_WriteDRAMData(W99AV_DRAM_SPVDSHDS, _dwHALTemp);
}
else // turn off VCD3.0 by assignment null to area
{
__rcHALVCD30Area.wLeft=0;
__rcHALVCD30Area.wRight=0;
__rcHALVCD30Area.wTop=0;
__rcHALVCD30Area.wBottom=0;
// LLY.051, recover SP/OGT relative control, ex N2P/ P2N and frame rate control
W99AV_WriteDRAMData(W99AV_DRAM_NTSC_PAL, _dwFrameRateCTL); // DRAM[0x9f]
W99AV_WriteDRAMData(W99AV_DRAM_VBICTL_98, _wVBICTLR); // DRAM[0x9b]
W99AV_WriteDRAMData(W99AV_DRAM_VBICTL_CHANGE, 0xffffffff); // DRAM[0x9a]
// LLY.103-2, must re-store SPVDS value to same as __wW99AVSPVDS
// SP will refer this value,
// and the value is different between LB and non-LB SPST mode
_dwHALTemp=__wW99AVSPVDS;
// Micky0.90, fix the SP+HL don't match w/ main video
// don't set SPVDSHDSR directly.
// RISC will reference DRAM_SPVDSHDS, then do adjustment.
// DRAM_SPVDSHDS, bit 0~15, SPHDS. bit 16~31, SPVDS
// _dwHALTemp <<= 10; // SPVDS keep in SPVDSVDWR[18:10]
_dwHALTemp <<= 16; // let SPVDS at bit 16~31
_dwHALTemp |= __wW99AVSPHDS; // merge SPVDS and SPHDS
// W99AV_WriteRegDW(SPVDSHDSR, LOWORD(_dwHALTemp), HIWORD(_dwHALTemp));
W99AV_WriteDRAMData(W99AV_DRAM_SPVDSHDS, _dwHALTemp);
}
// Issue VCD3.0 feature
__dwW99AVCmdArg[0]=3;
__dwW99AVCmdArg[1]=CMDARG_SBTAR; // command argument is 0x0009
__dwW99AVCmdArg[2]=((DWORD)__rcHALVCD30Area.wRight<<10) | (DWORD)__rcHALVCD30Area.wLeft; // ARG1
__dwW99AVCmdArg[3]=((DWORD)__rcHALVCD30Area.wBottom<<10) | (DWORD)__rcHALVCD30Area.wTop; // ARG2
W99AV_CommandN(COMMAND_SBTAR); // command index is 0x000e
#endif // #ifdef SUPPORT_VCD30_FEATURE
}
// LLY.045 create, and LLY.048 modify ...
// ***********************************************************************
// Function : HAL_VCD30_Color
// Description : Specify the desired color effect for VCD 3.0
// Arguments : bColor0, color of group 0
// bColor1, color of group 1
// bColGrp, desired color group, 0 or 1
// bContrast, desired contrast value
// Return : none
// Side Effect : default select color group 0
// ***********************************************************************
// LLY.275, remove the arguments, and refer global variables directly
//void HAL_VCD30_Color(DWORD dwColor, BYTE bContrast)
void HAL_VCD30_Color(void)
{
#ifdef SUPPORT_VCD30_FEATURE
__dwW99AVCmdArg[0]=4;
__dwW99AVCmdArg[1]=CMDARG_SBTCR; // command argument is 0x0003
__dwW99AVCmdArg[2]=__dwHALVCD30Color;
__dwW99AVCmdArg[3]=HAL_VCD30_COLOR_BLACK;
__dwW99AVCmdArg[4]=(DWORD)__bHALVCD30CR | 0x100;
W99AV_CommandN(COMMAND_SBTCR); // command index is 0x000e
// LLY.049, keep VCD3.0 relative variable in global variable
// for W99AV_InitialVideo to recover after calling W99AV_RESET_TOTAL
// LLY.275, it's unncessary becasue the caller has given the desired
// value into these two variable first
/*
__dwHALVCD30Color=dwColor;
__bHALVCD30CR=bContrast;
*/
#endif // #ifdef SUPPORT_VCD30_FEATURE
}
// LLY.275 create ...
/////////////////////////////////////////////////////////////////////////////
// Function : HAL_RedrawVCD30Area()
// Description : Redraw the VCD30 area while OSD position has updated
// And, the VCD30 must cover the OSD font
// Argument : None
// Return : None
// Side Effect : __rcHALVCD30Area value will be updated !!
/////////////////////////////////////////////////////////////////////////////
// Notice: Must add "#pramga NOAREGS" w/ each APIs if it will be called by HAL_RedrawVCD30Area()
// So, if anyone add any function with HAL_RedrawVCD30Area(), please check it more
// Current sub-APIs with will be called by HAL_RedrawVCD30Area()
// [1] HAL_RedrawVCD30Area : Done !!
#pragma NOAREGS // may be called in ISR -- LLY.276-4
void HAL_RedrawVCD30Area(void)
{
#ifndef NO_OSD
// Do this issue only while this VCD30 area is used to cover OSD font
// ie. the initial __rcHALVCD30Area value is not given by video coordination
if(__btRedrawVCD30)
{
#ifdef SUPPORT_PRINTF
printf("##### Re-draw VCD3.0 Area #####\n");
#endif // #ifdef SUPPORT_PRINTF
// Re-calculate vertical position for VCD3.0 Area
if(__bMPEGVideoMode == MPEG_VIDEO_MODE_NTSC) // PAL --> NTSC
{
__rcHALVCD30Area.wTop -= VCD30_VDS_DIFF;
__rcHALVCD30Area.wBottom -= VCD30_VDS_DIFF;
}
else if(__bMPEGVideoMode == MPEG_VIDEO_MODE_PAL) // NTSC --> PAL
{
__rcHALVCD30Area.wTop += VCD30_VDS_DIFF;
__rcHALVCD30Area.wBottom += VCD30_VDS_DIFF;
}
// Issue VCD3.0 feature
__dwW99AVCmdArg[0]=3;
__dwW99AVCmdArg[1]=CMDARG_SBTAR; // command argument is 0x0009
__dwW99AVCmdArg[2]=((DWORD)__rcHALVCD30Area.wRight<<10) | (DWORD)__rcHALVCD30Area.wLeft; // ARG1
__dwW99AVCmdArg[3]=((DWORD)__rcHALVCD30Area.wBottom<<10) | (DWORD)__rcHALVCD30Area.wTop; // ARG2
W99AV_CommandN(COMMAND_SBTAR); // command index is 0x000e
}
#endif // #ifndef NO_OSD
}
// ***********************************************************************
// Function : HAL_SetBorderColor
// Description : Set border color to match the requirement
// Arguments : bColor, specify the desired border color
// Return : None
// Side Effect :
// ***********************************************************************
void HAL_SetBorderColor(BYTE bColor)
{
switch(bColor)
{
case HAL_COLOR_BORDER:
default :
#ifdef BORDER_BLUE
W99AV_WriteRegW(BCYR,0x23); // blue border
W99AV_WriteRegW(BCUVR,0xd460);
#else // #ifdef BORDER_BLUE
W99AV_WriteRegW(BCYR,0x00); // black border
W99AV_WriteRegW(BCUVR,0x8080);
#endif // #ifdef BORDER_BLUE
break;
case HAL_COLOR_BLACK:
W99AV_WriteRegW(BCYR,0x00); // black border
W99AV_WriteRegW(BCUVR,0x8080);
break;
case HAL_COLOR_BLUE:
W99AV_WriteRegW(BCYR,0x23); // blue border
W99AV_WriteRegW(BCUVR,0xd460);
break;
case HAL_COLOR_RED:
W99AV_WriteRegW(BCYR,0x41); // red border
W99AV_WriteRegW(BCUVR,0x64d4);
break;
//alex1.24a,add color to show error for autoupgrade
case HAL_COLOR_GREEN:
W99AV_WriteRegW(BCYR,0x70); // green border
W99AV_WriteRegW(BCUVR,0x3a48);
break;
case HAL_COLOR_YELLOW:
W99AV_WriteRegW(BCYR,0xa2); // yellow border
W99AV_WriteRegW(BCUVR,0x2c8e);
break;
case HAL_COLOR_PINK:
W99AV_WriteRegW(BCYR,0x41); // ping border
W99AV_WriteRegW(BCUVR,0x90d4);
break;
case HAL_COLOR_GRAY:
W99AV_WriteRegW(BCYR,0x20); // gray border
W99AV_WriteRegW(BCUVR,0x8080);
break;
case HAL_COLOR_PURPLE:
W99AV_WriteRegW(BCYR,0x72); // purple border
W99AV_WriteRegW(BCUVR,0xAF80);
break;
}
}
//# [1] Video relative function part end
//# [2] Audio relative function part begin
// *********************************************************************
// Function : HAL_SetAudioType
// Description : Base on the desired audio type to issue relative setting:
// : 1.Call CHIPS module's internal function:
// _SetAudType() to set audio relative configure.
// 2.Set audio packet substream ID in AVIDR and
// 3.Set relative DM value for specified audio type
// Arguments : bType, the desired audio type
// Return : none
// Change : __wW99AVAVIDRLow
// Side Effect : Must call HAL_ControlParser(HAL_PARSER_AUDIO_ID,XX)
// to set correct audio ID
// *********************************************************************
void HAL_SetAudioType(BYTE bType) // LLY.276p-4, remodify the procedure
{
//Kevin2.37, clear
__bHAL1_Deemphasis = FALSE;
// DVD019, AVIDR[15:13] for packet stream ID
__wW99AVAVIDRLow &= 0x1FFF; // clear AVIDR[15:13] for packet stream ID
// *** LLY.048-2, remove the original code while don't support audio reset by DSP ***//
// TCC043, move set acfg1 here or write DM might fail after switching dsp code.
// call CHIPS internal function to set correct value to ACR
_SetAudType(bType);
// Brian2.30b
if (bType == HAL_AUDIO_MP3 || bType == HAL_AUDIO_WMA)
{
// swap buffer address
//W99AV_WriteDM(0x17B6, W99AV_ADDR_SBUFF_MP3_WMA); // start
// Brian2.41, write only 16-bit to DM, DSP will shift it
W99AV_WriteDM(0x17B6, (W99AV_ADDR_SBUFF_MP3_WMA >> 8)); // start
W99AV_WriteDM(0x17FD, 1); // continuous address
// MP3, WMA side information buffer is adjustable, we must set it
//W99AV_WriteDM(0x178D, W99AV_ADDR_SIDE_INFO_START);
// Brian2.41, write only 16-bit to DM, DSP will shift it
W99AV_WriteDM(0x178D, (W99AV_ADDR_SIDE_INFO_START >> 8));
W99AV_WriteDM(0x178E, W99AV_ADDR_SIDE_INFO_LENGTH-0x20); // For u-code implement easy, please set side buffer length 0x20 less
}
else if (bType == HAL_AUDIO_DTS)
{
// swap buffer address
//W99AV_WriteDM(0x17B6, W99AV_ADDR_SBUFF_DTS);
// Brian2.41, write only 16-bit to DM, DSP will shift it
W99AV_WriteDM(0x17B6, (W99AV_ADDR_SBUFF_DTS >> 8));
W99AV_WriteDM(0x17FD, 2);
}
else if (bType == HAL_AUDIO_AC3)//AC3 uses audio buffer 2 as swap buffer (< 1K is enough)
{
// swap buffer address
//W99AV_WriteDM(0x17B6, (W99AV_ADDR_ABUFF2 & 0x0000ffffL)<<8 );
// Brian2.41, write only 16-bit to DM, DSP will shift it
W99AV_WriteDM(0x17B6, W99AV_ADDR_ABUFF2 & 0x0000ffffL);
W99AV_WriteDM(0x17FD, 1);
}
// LLY0.81, set audio buffer size again base on different audio type
switch(bType)
{
case HAL_AUDIO_PCM:
__wW99AVAVIDRLow |= 0xA000;
W99AV_WriteDM(W99AV_DM_CRC_ENABLE, 0x0); // DM[0x7f1]
W99AV_WriteDM(W99AV_DM_QPARA1, 0x07451); // DM[0x7f8]
//Kevin0.83b, disable CDG parsing
if (__bVersionMPEG>=VERSION_AD) //AD, CA
W99AV_WriteDM(W99AV_DM_ENABLE_CDDA_CDG_RESEEK_ad, 0); //1->enable CDG parsing and reseek process; 0->normal play
else // for AC, BE
W99AV_WriteDM(W99AV_DM_ENABLE_CDDA_CDG_RESEEK_ac, 0); //1->enable CDG parsing and reseek process; 0->normal play
// Remove DTS-CDDA & pure CDDA detection action into UTL_GetCDDAFormat() -- TCC161
HAL_SetBuffer(HAL_SETBUFFER_AUDIO, HAL_BUFFERMODE_PCM);
break;
case HAL_AUDIO_MPG:
__wW99AVAVIDRLow |= 0xC000;
W99AV_WriteDM(W99AV_DM_CRC_ENABLE, 0x0); // DM[0x7f1]
W99AV_WriteDM(W99AV_DM_QPARA1, 0x07450); // DM[0x7f8]
// LLY2.80, must re-initial DM[0x81] value
// Because this value will be updated by DSP other application, ex CDROM decoding
// And, only be refered as down-sample control for MPEG bitstream
// Fix "audio playing abnormal" for "狾れ纔
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -