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

📄 hal.c

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