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

📄 hdecoder.c

📁 ct952 source code use for Digital Frame Photo
💻 C
📖 第 1 页 / 共 5 页
字号:
        OS_YieldThread();    }    if (blFBRMode == TRUE)    {        // Unlock mutex earily since UV part filling is designed by F/W code (not JPU)        OS_UnlockMutex(&__mutexGDIIdle);        // Start fill UV part        dwFrame_VSize /= 32;        // Get source picture width        // LLY2.31, always set source width as 720        wSrcWidth = 720; // (WORD) REG_DISP_MAIN1_CR;        wSrcWidth = wSrcWidth/16;        while(dwFrame_VSize--)        {            BYTE bx, by;            for(bx = 0; bx < wSrcWidth; bx++)            {                for(by = 0; by < 64; by+=4)                {                    (*(volatile DWORD *)(dwFrame_UV_Addr + by)) = 0x82108082;                    (*(volatile DWORD *)(dwFrame_UV_Addr + by + 0x40)) = 0x08208210;                    (*(volatile DWORD *)(dwFrame_UV_Addr + by + 0x80)) = 0x80820820;                }                dwFrame_UV_Addr += 192;            }            // LLY2.31, it's un-necessary to %4, since source width is always set as 720            //if (wSrcWidth % 4)            {                dwFrame_UV_Addr += 64;            }        }    }    else    {        // fill U-part        REG_JPU_CTRL       = TRANS_JPU_CTL(0, JPU_FC_U_OP, 1);        REG_JPU_ADDR_W_ST  = dwFrame_UV_Addr;        REG_JPU_CTRL |= JPU_GO;        while (REG_JPU_CTRL & 1)        {            // do nothing, just polling            OS_YieldThread();        }        // fill V-part        REG_JPU_CTRL       = TRANS_JPU_CTL(0, JPU_FC_V_OP, 1);        REG_JPU_ADDR_W_ST  = dwFrame_UV_Addr + 128;        REG_JPU_CTRL |= JPU_GO;        while (REG_JPU_CTRL & 1)        {            // do nothing, just polling            OS_YieldThread();        }        // Notice: can unlock mutex after UV part filling is done (since is was done by JPU)        OS_UnlockMutex(&__mutexGDIIdle);    }}//************************************************************************************// Description  :   Issue "JPU Preset Frame Buffer Command" to fill the display//                  frame buffer with desired color// Reference    :   JPU's JPEG_PresetFrameBuf()// Argument     :   bColor: the desired color mode//                  bMode: HAL_CLEAR_SCREEN_MPEG or HAL_CLEAR_SCREEN_JPEG//                  dwFrameIdx: frame index for MPEG mode// Return       :   None//************************************************************************************void    HAL_ClearScreen(BYTE bColor, BYTE bMode, DWORD dwFrameIdx) //test OK{    DWORD   dwColor=0;    DWORD   dwY_Addr, dwUV_Addr;    DWORD   dwFBRMode;    extern WORD  __wFrameWidth;    // wyc0.85a, set __dwClearBuffMode by the bMode for checking if need to clear frame buffer in HAL_RESET_VIDEO    __dwClearBuffMode = bMode;    switch(bColor)    {    case HAL_COLOR_USER_DEFINE: //CoCo1.05, Add this for CDG.        dwColor = _dwHALUserDefinedColor;        break;    case    HAL_COLOR_BLUE:        dwColor = 0x0023d460;        break;    case    HAL_COLOR_BLACK:        dwColor = 0x00008080;        break;    case    HAL_COLOR_THUMB:        dwColor = THUMBNAIL_BACKGROUND_COLOR;        break;    case    HAL_COLOR_BORDER:    default:#ifdef  BORDER_BLUE        dwColor = 0x0023d460;#else        dwColor = 0x00008080;#endif        break;    }    if (dwFrameIdx == HAL_DISP_CURRENTFRAME)    {        HAL_ReadInfo(HAL_INFO_DISPFRAME_INDEX, &dwFrameIdx);    }    // Get the structure pointer of display frame related information.    // Notice: must give the frame index at 2nd parameter first    dwY_Addr = dwUV_Addr = dwFrameIdx;    HAL_ReadInfo(HAL_INFO_DISPFRAME_YADDR, &dwY_Addr);    HAL_ReadInfo(HAL_INFO_DISPFRAME_UVADDR, &dwUV_Addr);    // Get FBR mode or not    HAL_ReadInfo(HAL_INFO_FBR_MODE, &dwFBRMode);    //DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF,    //    "ClearScreen, Idx: %lx, Y: %lx, UV: %lx, FBR: %lx\n", dwFrameIdx, dwY_Addr, dwUV_Addr, dwFBRMode);    // LLY2.22, collect clear frame procedure into another API    _ClearScreen(dwY_Addr, dwUV_Addr, (BOOL)dwFBRMode, __wFrameWidth, dwColor);}// LLY2.00, collect the procedure of waiting R/W AM command ACK//  **************************************************************************//  Function    :   _Wait_AccessAM_CMD_ACK//  Description :   Wait access AM command ACK//  Arguments   :   None//  Return      :   TRUE, ACK ok//                  FALSE, ACK fail//  Notice      :   Only used for AM command ACK//  **************************************************************************BYTE    _Wait_AccessAM_CMD_ACK(void){    DWORD   dwHALTemp;    DWORD   dwAck=1;    //Wait ACK    dwHALTemp = OS_GetSysTimer();    while( (OS_GetSysTimer() - dwHALTemp) < COUNT_200_MSEC )    {        dwAck = REG_PLAT_PARAMETER1>>30;        if (! dwAck )        {            break;        }        //release CPU resource to other threads        OS_YieldThread();    }    if (dwAck)    {        // LLY1.21a, read-back PROC2 PC by macro, don't access AIU directly        DWORD   dwPC;        MACRO_PLAT_GET_PROC2_PC(dwPC);        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "\nWait no Proc2 ACK, PC: %lx!", dwPC);        return FALSE;    }    return TRUE;}// J500CSC_2.05, for supporting runtime decompressed audio codeDWORD   HAL_LoadAudioCode( BYTE bAudioType, PDWORD pdwAudioTbl, PBYTE pbDstAddr, PBYTE dwWorkMem ){    DWORD   dwRet = 0;         // set return value as 0 (error)#ifdef RUNTIME_UNZIP_AUDIO_CODE    PSECTION_ENTRY pAudioTbl;    switch (bAudioType)    {        // wyc2.15-909S, update audio decoder re-load mechansim.        case HAL_AUDIO_PCM:        case HAL_AUDIO_LPCM:            pAudioTbl = ROMLD_GetSectionByName(0, "MPPC");            break;        case HAL_AUDIO_MPG:        case HAL_AUDIO_MP3:        case HAL_AUDIO_MP2:            pAudioTbl = ROMLD_GetSectionByName(0, "MPPC");            break;        case HAL_AUDIO_AC3:            pAudioTbl = ROMLD_GetSectionByName(0, "ACDT");            break;        case HAL_AUDIO_DTS:            pAudioTbl = ROMLD_GetSectionByName(0, "ACDT");            break;        case HAL_AUDIO_WMA:            pAudioTbl = ROMLD_GetSectionByName(0, "WMA ");            break;        case HAL_AUDIO_AAC:            pAudioTbl = ROMLD_GetSectionByName(0, "AAC ");            break;// LLY2.38a, porting Chuan's code to load JPEG decoder @ PROC2#ifdef SUPPORT_JPEGDEC_ON_PROC2        case HAL_VIDEO_JPG:            pAudioTbl = ROMLD_GetSectionByName(0, "JPEG");            break;#endif // #ifdef SUPPORT_JPEGDEC_ON_PROC2        default:            pAudioTbl = 0;            break;    }    if (pAudioTbl == 0) // 0 means audio decoder does not exist    {        return dwRet;    }    if ((dwRet = ROMLD_LoadSectionTo(pAudioTbl, (DWORD)pbDstAddr, (DWORD)dwWorkMem)) == 0)    {        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Load Audio Code Fail!!");    }    /*    PBYTE   pbSrc;    if( bAudioType > HAL_AUDIO_END )    {        return dwRet;    }    pbSrc = (PBYTE) (pdwAudioTbl[((DWORD) bAudioType) - 1]);    if( (DWORD) pbSrc == 0 )        // 0 means audio decoder does not exist    {        return dwRet;    }    dwRet = UNZIP2006_DECODE( pbSrc, pbDstAddr, dwWorkMem );    */#endif  // RUNTIME_UNZIP_AUDIO_CODE    return dwRet;}//*********************************************************************// Description :   Reset (reboot) Proc2 and load new audio decoder code// Arguments   :   bAudioType, specify the new audio type for loading audio code.// Return      :   NONE//*********************************************************************//kevin0.95, createvoid HAL_ReloadAudioDecoder(BYTE bAudioType){#ifdef SUPPORT_RUNTIME_RESET_PROC2#define FIFO_CLEAR         (*((volatile DWORD *) (REG_MCU_BASE+0x014)))#define FIFO_INTEN         (*((volatile DWORD *) (REG_MCU_BASE+0x01c)))    // Interrupt Control Register 2    DWORD dwAck=0;    DWORD dwSaveInt;    DWORD   dwTime;    DWORD dwREG_PLAT_TIMER1_RELOAD;#ifdef NO_PROC2    return ;#endif // #ifdef NO_PROC2    // 1: can runtime reset Proc2 0: can't    HAL_ReadInfo(HAL_INFO_CAN_RUNTIME_RESET_PROC2, &dwAck);    if (dwAck==FALSE)        return;    // Chuan1.10, Force PROC2 enter debug mode on IU watchpoint, and any trap.    MACRO_PLAT_HALT_PROC2();    DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "reset Proc2\n");    MACRO_MCU_DISABLE_PROTECTION(MCU_WRITE_PROTECT_AREA1_ENABLE);// Chuan1.08, Turn on PROM#ifdef SUPPORT_PROM_DISABLE    OS_DISABLE_INTERRUPTS( dwSaveInt );    REG_PLAT_CLK_GENERATOR_CONTROL &= ~(PLAT_MCLK_PROM_DISABLE);    OS_RESTORE_INTERRUPTS( dwSaveInt );    // Notice: delay a while to wait PROM enable ok    OS_DelayTime(COUNT_50_MSEC);#endif  // #ifdef SUPPORT_PROM_DISABLE    // LLY2.16, must disable PROC2 interrupt first, and clear the value    // Since, PROC1 may R/W DM (send interrupt to PROC2) during proc2 disable --> load code    // So, some un-expected phenomenone will happen.    // Notice: those procedure can be removed after we remove old DM R/W procedure.    REG_PLAT_PROC2_INT_MASK_PRIORITY = INT_CLEAR_ALL;    REG_PLAT_PROC2_INT_CLEAR = INT_SET_ALL;    //#define SECINTP2A_STAT (*(volatile int *)(0x800001b8))    //SECINTP2A_STAT = -1;    // J500KWShih_212, modify "clear audio HW" procedure for > CT909S#if 0 // only for CT909    //clear audio HW	REG_MCU_A1REM=(1<<24)|2;	FIFO_CLEAR |= (1<<2);	REG_MCU_PCMREM=(1<<24)|2;	FIFO_CLEAR |= (1<<3);	REG_MCU_SPDIFREM=(1<<24)|2;	FIFO_CLEAR |= ((1<<4)|1);	REG_AIU_AIUEN &= 0x3;	FIFO_CLEAR |= 0x7d;	FIFO_INTEN = 0;	REG_MCU_A1REM=(1<<24)|0x0;	REG_MCU_PCMREM=(1<<24)|0x0;	REG_MCU_SPDIFREM=(1<<24)|0x0;    REG_MCU_A1REM=(1<<24)|0xffffff;#endif	REG_MCU_A1REM = (MCU_REMAINDER_INIT | 0x00);	REG_MCU_PCMREM = (MCU_REMAINDER_INIT | 0x00);	REG_MCU_SPDIFREM = (MCU_REMAINDER_INIT | 0x00);	REG_MCU_MCR5 |= (MCU_RESET_AIU_MIC_WRITE_FIFO | MCU_RESET_AIU_UPK1_FIFO | MCU_RESET_AIU_PCM_READ_FIFO | MCU_RESET_AIU_SPDIF_READ_FIFO);	REG_AIU_AIUEN &= 0x0303;	REG_MCU_MCR5 |= 0x7d;	REG_MCU_MCR7 = 0;    // J500CSC_111, clear the semaphore for avoiding it is protected by PROC2    MACRO_PLAT_KEY_UNLOCK( );    //reset PC    REG_PLAT_RESET_CONTROL_ENABLE = PLAT_RESET_PROC2_ENABLE; //reset PROC2    // Chuan1.10, Reset error mode, and exit debug mode.    MACRO_PLAT_RELEASE_PROC2();    PROC2_SP = DS_PROC2_SP;    PROC2_STARTADR = DS_PROC2_STARTADDR;// J500CSC_2.05, for supporting runtime decompressed audio code    HAL_LoadAudioCode( bAudioType, (PDWORD) DS_AUDIO_TABLE_ST, (PBYTE) DS_PROC2_STARTADDR,            (PBYTE) DS_UNZIP_BUF_ST );    // LLY2.21, Porting Chuan's code to keep time1 value first    // Since, it will be updated by PROC2    dwREG_PLAT_TIMER1_RELOAD = REG_PLAT_TIMER1_RELOAD;    //audio start    (*(volatile DWORD *)(0x800007e4)) = 0x10003;    OS_REORDER_BARRIER();    OS_DISABLE_INTERRUPTS( dwSaveInt );	// Disable INT to avoid different threads accessing    REG_PLAT_RESET_CONTROL_DISABLE = PLAT_RESET_PROC2_DISABLE; //reset PROC2

⌨️ 快捷键说明

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