// //****************************************************************************** // MStar Software // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved. // All software, firmware and related documentation herein ("MStar Software") are // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by // law, including, but not limited to, copyright law and international treaties. // Any use, modification, reproduction, retransmission, or republication of all // or part of MStar Software is expressly prohibited, unless prior written // permission has been granted by MStar. // // By accessing, browsing and/or using MStar Software, you acknowledge that you // have read, understood, and agree, to be bound by below terms ("Terms") and to // comply with all applicable laws and regulations: // // 1. MStar shall retain any and all right, ownership and interest to MStar // Software and any modification/derivatives thereof. // No right, ownership, or interest to MStar Software and any // modification/derivatives thereof is transferred to you under Terms. // // 2. You understand that MStar Software might include, incorporate or be // supplied together with third party`s software and the use of MStar // Software may require additional licenses from third parties. // Therefore, you hereby agree it is your sole responsibility to separately // obtain any and all third party right and license necessary for your use of // such third party`s software. // // 3. MStar Software and any modification/derivatives thereof shall be deemed as // MStar`s confidential information and you agree to keep MStar`s // confidential information in strictest confidence and not disclose to any // third party. // // 4. MStar Software is provided on an "AS IS" basis without warranties of any // kind. Any warranties are hereby expressly disclaimed by MStar, including // without limitation, any warranties of merchantability, non-infringement of // intellectual property rights, fitness for a particular purpose, error free // and in conformity with any international standard. You agree to waive any // claim against MStar for any loss, damage, cost or expense that you may // incur related to your use of MStar Software. // In no event shall MStar be liable for any direct, indirect, incidental or // consequential damages, including without limitation, lost of profit or // revenues, lost or damage of data, and unauthorized system use. // You agree that this Section 4 shall still apply without being affected // even if MStar Software has been modified by MStar in accordance with your // request or instruction for your use, except otherwise agreed by both // parties in writing. // // 5. If requested, MStar may from time to time provide technical supports or // services in relation with MStar Software to you for your use of // MStar Software in conjunction with your or your customer`s product // ("Services"). // You understand and agree that, except otherwise agreed by both parties in // writing, Services are provided on an "AS IS" basis and the warranty // disclaimer set forth in Section 4 above shall apply. // // 6. Nothing contained herein shall be construed as by implication, estoppels // or otherwise: // (a) conferring any license or right to use MStar name, trademark, service // mark, symbol or any other identification; // (b) obligating MStar or any of its affiliates to furnish any person, // including without limitation, you and your customers, any assistance // of any kind whatsoever, or any information; or // (c) conferring any license or right under any intellectual property right. // // 7. These terms shall be governed by and construed in accordance with the laws // of Taiwan, R.O.C., excluding its conflict of law rules. // Any and all dispute arising out hereof or related hereto shall be finally // settled by arbitration referred to the Chinese Arbitration Association, // Taipei in accordance with the ROC Arbitration Law and the Arbitration // Rules of the Association by three (3) arbitrators appointed in accordance // with the said Rules. // The place of arbitration shall be in Taipei, Taiwan and the language shall // be English. // The arbitration award shall be final and binding to both parties. // //****************************************************************************** // //////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2008-2009 MStar Semiconductor, Inc. // All rights reserved. // // Unless otherwise stipulated in writing, any and all information contained // herein regardless in any format shall remain the sole proprietary of // MStar Semiconductor Inc. and be kept in strict confidence // ("MStar Confidential Information") by the recipient. // Any unauthorized act including without limitation unauthorized disclosure, // copying, use, reproduction, sale, distribution, modification, disassembling, // reverse engineering and compiling of the contents of MStar Confidential // Information is unlawful and strictly prohibited. MStar hereby reserves the // rights to any and all damages, losses, costs and expenses resulting therefrom. // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // file halRASP.c // @brief RASP HAL // @author MStar Semiconductor,Inc. //////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef MSOS_TYPE_LINUX_KERNEL #include #endif #include "MsCommon.h" #include "regNDSRASP.h" #include "halNDSRASP.h" //-------------------------------------------------------------------------------------------------- // Driver Compiler Option //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- // TSP Hardware Abstraction Layer //-------------------------------------------------------------------------------------------------- static MS_U32 _u32RegBase = 0; static REG_RASP* _RASPReg[RASP_NUM] = {NULL , NULL}; static MS_U32 _u32RASP_PidfltBase[RASP_NUM] = {NULL , NULL}; static MS_U32 _u32RASP_EcmPidfltBase[RASP_NUM] = {NULL , NULL}; static MS_U32 _u32RASP_EventMaskBase[RASP_NUM] = {NULL , NULL}; static MS_U32 _u32RASP_PayloadMaskBase[RASP_NUM] = {NULL , NULL}; static MS_U32 _g32RASPHalDbgLv = RASP_DBGLV_DEBUG; // Some register has write order, for example, writing PCR_L will disable PCR counter // writing PCR_M trigger nothing, writing PCR_H will enable PCR counter #define _HAL_REG32_W(reg, value) { \ do { (reg)->L = ((value) & 0x0000FFFF); \ (reg)->H = ((value) >> 16); } while(0); } #define _HAL_REG16_W(reg, value) { \ (reg)->data = ((value) & 0x0000FFFF); } #define RASP_NUM_CHECK(idx) if( (MS_U32)idx >= (MS_U32)RASP_NUM ) \ { printf("[RASP][ERR] Rasp Engine [%d] not exist ! \n",idx); \ return ; } #define RASP_NUM_CHECK_RET(idx) if( (MS_U32)idx >= (MS_U32)RASP_NUM ) \ { printf("[RASP][ERR] Rasp Engine [%d] not exist ! \n",idx); \ return 0; } #define HALRASP_DBG(lv, x, args...) if (lv <= _g32RASPHalDbgLv ) \ { printf("%s, ",__FUNCTION__); \ printf(x, ##args); } //////////////////////////////////////////////////////////////////////////////// // Local variable //////////////////////////////////////////////////////////////////////////////// //K2 RASP1 MIU setting static REG16* _REG_RASP1_MIU; #define _REG_RASP1_MIU_BASE (0x2460) #define _RASP1_MIU_EN (0x4000) static MS_U32 _gRaspFileIn_Addr[RASP_NUM]; static MS_U32 _gRaspEng_Addr[RASP_NUM]; static MS_U32 _gChipTp_Addr; static MS_U32 _gClkGen_Addr; static MS_U32 _gClkGen2_Addr; //-------------------------------------------------------------------------------------------------- // Forward declaration //-------------------------------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// // Local Function //////////////////////////////////////////////////////////////////////////////// void HAL_RFILEIN_WriteReg_Word(MS_U32 rasp_eng, MS_U32 u32RegAddr, MS_U16 u16Data) { MS_U32 u32reg; u32reg = (u32RegAddr*4) + _gRaspFileIn_Addr[rasp_eng]; (*(volatile MS_U16*)(u32reg)) = u16Data; } MS_U16 HAL_RFILEIN_ReadReg_Word(MS_U32 rasp_eng, MS_U32 u32RegAddr) { MS_U32 u32reg; MS_U16 u16Data; u32reg = (u32RegAddr*4) + _gRaspFileIn_Addr[rasp_eng]; u16Data = (*(volatile MS_U16*)(u32reg)); return u16Data; } void HAL_RFILEIN_WriteReg_DWord(MS_U32 rasp_eng, MS_U32 u32RegAddr, MS_U32 u32Data) { MS_U32 u32reg; u32reg = (u32RegAddr*4) + _gRaspFileIn_Addr[rasp_eng]; (*(volatile MS_U16*)(u32reg)) = (MS_U16)(u32Data&0xffff); //printf("(reg,value) = (%x,%x)\n", u32RegAddr, *(volatile MS_U16*)(u32reg) ); u32reg += 4; (*(volatile MS_U16*)(u32reg)) = (MS_U16)((u32Data>>16)&0xffff); //printf("(reg,value) = (%x,%x)\n", u32RegAddr+1, *(volatile MS_U16*)(u32reg) ); } MS_U32 HAL_RFILEIN_ReadReg_DWord(MS_U32 rasp_eng, MS_U32 u32RegAddr) { MS_U32 u32reg,u32Data; MS_U16 u16Data1,u16Data2; u32reg = (u32RegAddr*4) + _gRaspFileIn_Addr[rasp_eng]; u16Data1 = (*(volatile MS_U16*)(u32reg)); u32reg += 4; u16Data2 = (*(volatile MS_U16*)(u32reg)); u32Data = (MS_U32)(u16Data1) + ( ((MS_U32)u16Data2)<<16 ); return u32Data; } void HAL_RASP_WriteReg_Word(MS_U32 rasp_eng, MS_U32 u32RegAddr, MS_U16 u16Data) { MS_U32 u32reg; u32reg = (u32RegAddr*4) + _gRaspEng_Addr[rasp_eng]; (*(volatile MS_U16*)(u32reg)) = u16Data; //printf("(reg,value) = (%x,%x)\n",u32reg,u16Data); } MS_U16 HAL_RASP_ReadReg_Word(MS_U32 rasp_eng, MS_U32 u32RegAddr) { MS_U32 u32reg; MS_U16 u16Data; u32reg = (u32RegAddr*4) + _gRaspEng_Addr[rasp_eng]; u16Data = (*(volatile MS_U16*)(u32reg)); return u16Data; } #if 0 void HAL_NDSRASP_WriteOtherBank_Word(MS_U32 bank, MS_U32 u32RegAddr, MS_U16 u16Data) { MS_U32 u32reg; MS_U16 temp; u32reg = (u32RegAddr*4) + bank; temp = (*(volatile MS_U16*)(u32reg)); temp |= u16Data; (*(volatile MS_U16*)(u32reg)) = temp; } void HAL_NDSRASP_MaskOtherBank_Word(MS_U32 bank, MS_U32 u32RegAddr, MS_U16 u16MaskData) { MS_U32 u32reg; MS_U16 temp; u32reg = (u32RegAddr*4) + bank; temp = (*(volatile MS_U16*)(u32reg)); temp &= u16MaskData; (*(volatile MS_U16*)(u32reg)) = temp; } #endif void HAL_RASP_WriteReg_DWord(MS_U32 rasp_eng, MS_U32 u32RegAddr, MS_U32 u32Data) { MS_U32 u32reg; u32reg = (u32RegAddr*4) + _gRaspEng_Addr[rasp_eng]; (*(volatile MS_U16*)(u32reg)) = (MS_U16)(u32Data&0xffff); u32reg += 4; (*(volatile MS_U16*)(u32reg)) = (MS_U16)((u32Data>>16)&0xffff); } MS_U32 HAL_RASP_ReadReg_DWord(MS_U32 rasp_eng, MS_U32 u32RegAddr) { MS_U32 u32reg,u32Data; MS_U16 u16Data1,u16Data2; u32reg = (u32RegAddr*4) + _gRaspEng_Addr[rasp_eng]; u16Data1 = (*(volatile MS_U16*)(u32reg)); u32reg += 4; u16Data2 = (*(volatile MS_U16*)(u32reg)); u32Data = (u16Data1) + ((MS_U32)u16Data2<<16); return u32Data; } #if 0 static void _delay(void) { volatile MS_U32 i; for (i = 0; i< 0xFFFF; i++); } #endif #ifdef REG32__ static MS_U32 _HAL_REG32_R(REG32 *reg) { MS_U32 value = 0; value = (reg)->H << 16; value |= (reg)->L; return value; } #endif static MS_U16 _HAL_REG16_R(REG16 *reg) { MS_U16 value; value = (reg)->data; return value; } //-------------------------------------------------------------------------------------------------- // For MISC part //-------------------------------------------------------------------------------------------------- void HAL_NDSRASP_SetBank(MS_U32 u32BankAddr) { HALRASP_DBG(RASP_DBGLV_ALERT,"u32BankAddr = %x\n",u32BankAddr); _u32RegBase = u32BankAddr; _RASPReg[0] = (REG_RASP*)(_u32RegBase + RASP0_BANK0_REG_CTRL_BASE); _u32RASP_PidfltBase[0] = _u32RegBase + RASP0_BANK0_PIDFLT_BASE; _u32RASP_EventMaskBase[0] = _u32RegBase + RASP0_BANK1_EVENT_MASK_BASE; _u32RASP_PayloadMaskBase[0] = _u32RegBase + RASP0_BANK1_PAYLOAD_MASK_BASE; _u32RASP_EcmPidfltBase[0] = _u32RegBase + RASP0_BANK1_ECM_PIDFLT_BASE; _RASPReg[1] = (REG_RASP*)(_u32RegBase + RASP1_BANK0_REG_CTRL_BASE); _u32RASP_PidfltBase[1] = _u32RegBase + RASP1_BANK0_PIDFLT_BASE; _u32RASP_EventMaskBase[1] = _u32RegBase + RASP1_BANK1_EVENT_MASK_BASE; _u32RASP_PayloadMaskBase[1] = _u32RegBase + RASP1_BANK1_PAYLOAD_MASK_BASE; _u32RASP_EcmPidfltBase[1] = _u32RegBase + RASP1_BANK1_ECM_PIDFLT_BASE; //K2 RASP1 MIU setting _REG_RASP1_MIU = (REG16*)(_u32RegBase + _REG_RASP1_MIU_BASE); _gRaspFileIn_Addr[0] = _u32RegBase + REG_RASP0_FILE_BASE; _gRaspFileIn_Addr[1] = _u32RegBase + REG_RASP1_FILE_BASE; _gRaspEng_Addr[0] = _u32RegBase + REG_RASP0_BASE; _gRaspEng_Addr[1] = _u32RegBase + REG_RASP1_BASE; _gChipTp_Addr = _u32RegBase + REG_CHIPTOP_RP_BASE; _gClkGen_Addr = _u32RegBase + REG_CLKGEN_RP_BASE; _gClkGen2_Addr = _u32RegBase + REG_CLKGEN2_BASE; } static void HAL_NDSRASP_Str2MIU_Reset(MS_U32 u32RASPEng) { MS_U16 HWCtrl1; HWCtrl1 = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_HW_CTRL1); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL1, (HWCtrl1 | RASP_STR2MIU_RST_WADDR)); MsOS_DelayTaskUs(10); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL1, (HWCtrl1 & ~(RASP_STR2MIU_RST_WADDR)) ); } static void HAL_NDSRASP_ECM2MIU_Reset(MS_U32 u32RASPEng) { MS_U16 HWCtrl3; HWCtrl3 = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_HW_CTRL3); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL3, (HWCtrl3 | RASP_ECM2MIU_RST_WADDR)); MsOS_DelayTaskUs(10); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL3, (HWCtrl3 & ~(RASP_ECM2MIU_RST_WADDR)) ); } static void HAL_NDSRASP_PAYLD2MIU_Reset(MS_U32 u32RASPEng) { MS_U16 HWCtrl3; HWCtrl3 = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_HW_CTRL3); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL3, (HWCtrl3 | RASP_PAYLD2MIU_RST_WADDR)); MsOS_DelayTaskUs(10); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL3, (HWCtrl3 & ~(RASP_PAYLD2MIU_RST_WADDR)) ); } void HAL_NDSRASP_Init(MS_U32 u32RASPEng) { HALRASP_DBG(RASP_DBGLV_INFO, "RASPEng = %x\n", u32RASPEng); RASP_NUM_CHECK(u32RASPEng); #if 1 MS_U32 addr; addr = _u32RegBase + (0x161300*2 + 0x00*4); //$ enable MIUCrossbar (*((volatile MS_U16*)(addr))) = 0x000f; addr = _u32RegBase + (0x161300*2 + 0x1b*4); //$ enable gate clock (*((volatile MS_U16*)(addr))) = 0x0003; #endif MS_U16 HWCtrl0; //Clear all ctrl HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL0, 0x0); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL1, 0x0); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL2, 0x0); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL3, 0x0); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL4, 0x0); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_CORPT_PKTSIZE, (RASP_PKT_SIZE_188<HAL_NDSRASP_EVENT_SetThreshold, HAL_NDSRASP_SetTime_Timeout void HAL_NDSRASP_SetTimerWaterMark(MS_U32 u32RASPEng, MS_U16 u16TimerWaterMask) { MS_U16 HWCtrl2; HWCtrl2 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL2); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL2, (HWCtrl2 | (u16TimerWaterMask< 31) { HALRASP_DBG(RASP_DBGLV_ERR, "THRESHOLD Value exceeds maximum value\n"); return FALSE; } HWCtrl2 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL2); HWCtrl2 &= (~RASP_INT_EVENT_MASK); u32threshold <<= RASP_INT_EVENT_SHIFT; u32threshold &= RASP_INT_EVENT_MASK; HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL2, HWCtrl2 | u32threshold ); return TRUE; } void HAL_NDSRASP_EVENT_TimeWM_Enable(MS_U32 u32RASPEng, MS_BOOL enable) { MS_U16 HWCtrl2; //MS_U16 HWCtrl0; //HWCtrl0 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL0); HWCtrl2 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL2); if (enable) { //HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL0, (HWCtrl0 | RASP_REC_EVENT_FIFO_EN) ); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL2, (HWCtrl2 | RASP_INT_TIMER_EN) ); } else { //HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL0, (HWCtrl0 & (~RASP_REC_EVENT_FIFO_EN)) ); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL2, (HWCtrl2 & (~RASP_INT_TIMER_EN)) ); } } MS_BOOL HAL_NDSRASP_EVENT_SetTimerThreshold(MS_U32 u32RASPEng, MS_U16 u16timeout) { MS_U16 HWCtrl2; HALRASP_DBG(RASP_DBGLV_ERR, "Rasp ID [0x%x]\n", u32RASPEng); RASP_NUM_CHECK_RET(u32RASPEng); if (u16timeout > 3) { HALRASP_DBG(RASP_DBGLV_ERR, "TIMEOUT Value exceeds maximum value\n"); return FALSE; } HWCtrl2 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL2); HWCtrl2 &= (~RASP_INT_TIMER_MASK); u16timeout <<= RASP_INT_TIMER_SHIFT; u16timeout &= RASP_INT_TIMER_MASK; HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL2, HWCtrl2 | u16timeout ); return TRUE; } MS_U16 HAL_NDSRASP_EVENT_GetEventNum(MS_U32 u32RASPEng) { MS_U16 FifoStatus = 0 ; RASP_NUM_CHECK_RET(u32RASPEng); FifoStatus = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_EVENTLOG_STATUS); //Current amount of stored evens in the FIFO return (FifoStatus & RASP_EVENT_FIFO_NUM_MASK); } MS_BOOL HAL_NDSRASP_EVENT_GetEventDescriptor(MS_U32 u32RASPEng,MS_U32 *DataArray , MS_U32 ArrSize ) { MS_U16 FifoStatus = 0; FifoStatus = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_EVENTLOG_STATUS); HALRASP_DBG(RASP_DBGLV_INFO, "FifoStatus = [%x]\n", (MS_U32)FifoStatus); if (FifoStatus & RASP_EVENT_FIFO_NUM_MASK) { HAL_NDSRASP_EVENT_EFrame_Read(u32RASPEng); // read event from event FIFO if (ArrSize >= 5 ) { // [NOTE] NDS structure for 20 bytes.. DataArray[0] = HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_EVENT_DESCR_L); DataArray[1] = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_EVENT_PKT_PID); DataArray[2] = HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_EVENT_PKT_NUM_L); DataArray[3] = HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_EVENT_PKT_TIMER_L); DataArray[4] = HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_EVENT_PKT_PCR_L); //DataArray[5] = FifoStatus; return TRUE; } else { HALRASP_DBG(RASP_DBGLV_ERR, "Even descriptor size not enough.\n"); return FALSE; } } else { HALRASP_DBG(RASP_DBGLV_ERR, "No event in Event FIFO.\n"); return FALSE; } return FALSE; } //Reset Event Counter in Event FIFO MS_BOOL HAL_NDSRASP_EVENT_RstCounter(MS_U32 u32RASPEng) { HALRASP_DBG(RASP_DBGLV_INFO, "u32RASPEng = 0x%x \n",u32RASPEng); MS_U32 addr; addr = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_PKT_SET); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_PKT_SET, (addr & ~RASP_PKT_RESET_NUMBER)); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_PKT_SET, (addr | RASP_PKT_RESET_NUMBER)); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_PKT_SET, (addr & ~RASP_PKT_RESET_NUMBER)); return TRUE; } //Reset Event Timer in Event FIFO MS_BOOL HAL_NDSRASP_EVENT_RstTimer(MS_U32 u32RASPEng) { HALRASP_DBG(RASP_DBGLV_INFO, "u32RASPEng = 0x%x \n",u32RASPEng); MS_U32 addr; addr = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_PKT_SET); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_PKT_SET, (addr & ~RASP_PKT_RESET_TIMER)); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_PKT_SET, (addr | RASP_PKT_RESET_TIMER)); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_PKT_SET, (addr & ~RASP_PKT_RESET_TIMER)); return TRUE; } // It reads event FIFO into offset 0x50-0x0x59. Per read, event buffer level decreased. MS_BOOL HAL_NDSRASP_EVENT_EFrame_Read(MS_U32 u32RASPEng) { HALRASP_DBG(RASP_DBGLV_INFO, "u32RASPEng = 0x%x \n",u32RASPEng); MS_U32 addr; addr = HAL_RASP_ReadReg_Word(u32RASPEng, REG_RASP_HW_CTRL1); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL1, (addr & ~RASP_EVENT_FIFO_READ)); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL1, (addr | RASP_EVENT_FIFO_READ)); HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL1, (addr & ~RASP_EVENT_FIFO_READ)); return TRUE; } void HAL_NDSRASP_SetDataSwap(MS_U32 u32RASPEng, MS_BOOL bEn) { MS_U16 HWCtrl0; HWCtrl0 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL0); if(bEn) { HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL0, (HWCtrl0 | RASP_TSIF2_DATA_SWP) ); } else { HAL_RASP_WriteReg_Word(u32RASPEng, REG_RASP_HW_CTRL0, (HWCtrl0 & (~RASP_TSIF2_DATA_SWP)) ); } } //TODO:what this function for MS_BOOL HAL_NDSRASP_SetStream_47_48(MS_U32 u32RASPEng, MS_U32 StreamSel) { if(0x47 == StreamSel) { _HAL_REG16_W(&_RASPReg[u32RASPEng][0].RASP_HW_CTRL4, RESET_FLAG1(_HAL_REG16_R(&_RASPReg[u32RASPEng][0].RASP_HW_CTRL4), RASP_AUTO_STREAM_47_48)); // '0' for 47, '1' for 48 return TRUE; } else if(0x48 == StreamSel) { _HAL_REG16_W(&_RASPReg[u32RASPEng][0].RASP_HW_CTRL4, SET_FLAG1(_HAL_REG16_R(&_RASPReg[u32RASPEng][0].RASP_HW_CTRL4), RASP_AUTO_STREAM_47_48));// '0' for 47, '1' for 48 return TRUE; } else { return FALSE; } } MS_U32 HAL_NDSRASP_GetPktTimer(MS_U32 u32RASPEng) { RASP_NUM_CHECK_RET(u32RASPEng); return HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_PKT_TIMER_L); } MS_U32 HAL_NDSRASP_GetPktNum(MS_U32 u32RASPEng) { RASP_NUM_CHECK_RET(u32RASPEng); return HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_PKT_NUM_L); } MS_U32 HAL_NDSRASP_GetEcmPktNum(MS_U32 u32RASPEng) { RASP_NUM_CHECK_RET(u32RASPEng); return HAL_RASP_ReadReg_DWord(u32RASPEng, REG_RASP_ECM_PACKET_NUM_L); } void HAL_NDSRASP_SetBufferBlockLevel(MS_U32 u32RASPEng, MS_U32 bufBlockLv) { MS_U16 HWCtrl4; HWCtrl4 = HAL_RASP_ReadReg_Word(u32RASPEng,REG_RASP_HW_CTRL4); HWCtrl4 &= (~RASP_TS_FF_FULL_SEL_MASK); HWCtrl4 |= (bufBlockLv<>16)&0xFFFF)); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_SIZE_L, (MS_U16) (FileInSize&0xFFFF)); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_SIZE_H, (MS_U16) ((FileInSize>>16)&0xFFFF)); return TRUE; } MS_U32 HAL_RASP_FileIn_Start(MS_U32 RaspEng) { HALRASP_DBG(RASP_DBGLV_INFO, "%s: RaspEng = 0x%x\n", __FUNCTION__, RaspEng); RASP_NUM_CHECK_RET(RaspEng); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_START, RASP_FILEIN_START); return TRUE; } MS_U32 HAL_RASP_SetFileIn_Timer(MS_U32 RaspEng, MS_U16 u16Timer) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, u16Timer = %x\n", RaspEng,u16Timer); RASP_NUM_CHECK_RET(RaspEng); /*FileIn speed. By Byte delay*/ MS_U16 u16Reg; u16Reg = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CTRL_0); u16Reg |= 0x0400; HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_0, u16Reg); //file timer HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_TIMER, u16Timer); return TRUE; } //TODO: this API not necessary, flowset and filein_packetmode can do it MS_U32 HAL_RASP_SetFileIn_PktSize(MS_U32 RaspEng, MS_U16 PktSize) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, PktSize = %x\n", RaspEng,PktSize); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16Reg; u16Reg = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CTRL_0); if(PktSize == 188) { // 188-Mode HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_0, u16Reg | REG_RFILEIN_PKT_CHK_SIZE_188 ); //hard code first } else if(PktSize == 192) { // 192-Mode HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_0, u16Reg | REG_RFILEIN_PKT_CHK_SIZE_192); //hard code first } return TRUE; } MS_BOOL HAL_RASP_IsFileIn_Done(MS_U32 RaspEng) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16FileInStatus = 0; MS_U16 u16CMDQStatus = 0; // trigger u16FileInStatus = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_START); u16FileInStatus &= 0x1; u16CMDQStatus = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CMDQ_STATUS); HALRASP_DBG(RASP_DBGLV_INFO, "FileInStat[%x], CMDQStat[%x]\n", (MS_U32)u16FileInStatus, (MS_U32)u16CMDQStatus); if( (u16FileInStatus == 0) && (u16CMDQStatus & RFILEIN_CMD_FIFO_EMPTY) ) { return TRUE; } else { return FALSE; } } MS_BOOL HAL_RASP_FileIn_IsCMDQ_Full (MS_U32 RaspEng) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); MS_U16 u16CMDQStatus = 0; u16CMDQStatus = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CMDQ_STATUS); if( u16CMDQStatus & RFILEIN_CMD_FIFO_FULL ) { return TRUE; } else { return FALSE; } } MS_BOOL HAL_RASP_FileIn_IsCMDQ_Empty (MS_U32 RaspEng) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); MS_U16 u16CMDQStatus = 0; u16CMDQStatus = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CMDQ_STATUS); if( u16CMDQStatus & RFILEIN_CMD_FIFO_EMPTY ) { return TRUE; } else { return FALSE; } } MS_BOOL HAL_RASP_FileIn_GetCmdQueueLevel (MS_U32 RaspEng, MS_U8 *CmdQLvl) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); MS_U16 u16CMDQStatus = 0; u16CMDQStatus = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CMDQ_STATUS); HALRASP_DBG(RASP_DBGLV_INFO, "CMDQStatus = %x\n", (MS_U32)u16CMDQStatus); u16CMDQStatus &= RFILEIN_CMD_WR_LEVEL_MASK; u16CMDQStatus >>= 8; *CmdQLvl = (MS_U8) u16CMDQStatus; return TRUE; } MS_BOOL HAL_RASP_FileIn_GetEmptyNum (MS_U32 RaspEng, MS_U8 *CmdQLvl) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); MS_U16 u16CMDQStatus = 0; u16CMDQStatus = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CMDQ_STATUS); u16CMDQStatus &= RFILEIN_CMD_WR_COUNT_MASK; *CmdQLvl = (MS_U8) (16 - u16CMDQStatus); //we have 16slots in CMDQ return TRUE; } MS_U32 HAL_RASP_FileIn_Flush(MS_U32 RaspEng) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16Reg; // flush data u16Reg = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CTRL_1); u16Reg &= ~REG_RFILEIN_FLUSH; HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, u16Reg); u16Reg |= REG_RFILEIN_FLUSH; HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, u16Reg); u16Reg &= ~REG_RFILEIN_FLUSH; HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, u16Reg); return TRUE; } MS_U32 HAL_RASP_FileIn_BlockTimeStamp(MS_U32 RaspEng, MS_BOOL enbl) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16Reg, u16Reg2, u16Reg3, u16Reg4; u16Reg = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CTRL_0); if(enbl) { u16Reg |= RASP_RFILEIN_PKT192_EN; //enable 192, but timestamp blocked u16Reg &= ~RASP_RFILEIN_PKT192_BLK_DIS; //enable timestamp block scheme // patch, 20150519 u16Reg2 = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CTRL_1); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16Reg2|REG_RFILEIN_LPCR2_LOAD|REG_RFILEIN_TIMER_192FIX) ); //4 please remain it as set, HW patch //set RST_PKT_TSTAMP to reset packet timestamp to zero, and check u16Reg2 = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_CTRL_1); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16Reg2 | REG_RFILEIN_RST_PKT_TSTAMP) ); u16Reg3 = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_STREAM_TIMESTAMP_L); u16Reg4 = HAL_RFILEIN_ReadReg_Word(RaspEng, REG_RFILEIN_STREAM_TIMESTAMP_H); if ( (u16Reg3 == 0x0) && (u16Reg4 == 0x0) ) { printf("==========bank, 0x2f[0], 0x30[0]\n"); //if equal to zero, reset RST_PKT_TSTAMP register HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16Reg2 & ~REG_RFILEIN_RST_PKT_TSTAMP) ); } else { printf("==========bank, 0x2f[%x], 0x30[%x], FAIL\n", (MS_U32)u16Reg3, (MS_U32)u16Reg4); } // patch ends, 20150519 } else { u16Reg &= ~RASP_RFILEIN_PKT192_EN; //disable 192 u16Reg |= RASP_RFILEIN_PKT192_BLK_DIS; //disable timestamp block scheme } HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_0, u16Reg); return TRUE; } MS_U32 HAL_RASP_FileIn_SetPlaybackTimeStamp(MS_U32 RaspEng , MS_U32 u32Stamp) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); RASP_NUM_CHECK_RET(RaspEng); MS_U16 HWCtrl4; HAL_RFILEIN_WriteReg_DWord(RaspEng, REG_RFILEIN_LPCR2_BUF_L, u32Stamp); HWCtrl4 = HAL_RFILEIN_ReadReg_Word(RaspEng,REG_RFILEIN_CTRL_1); //send initial value to lpcr2 timer HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (HWCtrl4 | REG_RFILEIN_LPCR2_WLD) ); MsOS_DelayTaskUs(10); //Read lpcr2 initial timer before start HAL_RASP_FileIn_GetPlaybackTimeStamp(RaspEng); //start lpcr2 timer HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (HWCtrl4 & ~REG_RFILEIN_LPCR2_WLD) ); MsOS_DelayTaskUs(10); return TRUE; } MS_U32 HAL_RASP_FileIn_GetPlaybackTimeStamp(MS_U32 RaspEng) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16value; MS_U32 u32TimeStamp; u16value = HAL_RFILEIN_ReadReg_Word(RaspEng,REG_RFILEIN_CTRL_1); //update 90k ctr for read HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16value | REG_RFILEIN_LPCR2_LOAD)); //latch 90k ctr HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16value & (~REG_RFILEIN_LPCR2_LOAD) )); //get counter u32TimeStamp = HAL_RFILEIN_ReadReg_DWord(RaspEng, REG_RFILEIN_LPCR2_RD_L); HALRASP_DBG(RASP_DBGLV_INFO, "u32TimeStamp = 0x%x\n", u32TimeStamp); return u32TimeStamp; } MS_U32 HAL_RASP_FileIn_Timer(MS_U32 RaspEng, MS_BOOL bEnFileinTimer, MS_U16 u16TimerValue) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, TimerValue = 0x%x\n", RaspEng, (MS_U32)u16TimerValue); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16value, u16value2; u16value = HAL_RFILEIN_ReadReg_Word(RaspEng,REG_RFILEIN_CTRL_0); if (TRUE == bEnFileinTimer) { //enable delay timer HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_0, (u16value | RASP_RFILEIN_TIMER_EN)); //set timer value HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_TIMER, u16TimerValue ); //patch, since Kris u16value2 = HAL_RFILEIN_ReadReg_Word(RaspEng,REG_RFILEIN_CTRL_1); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, u16value2 | REG_RFILEIN_TIMER_192FIX ); } else { HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_0, (u16value & ~RASP_RFILEIN_TIMER_EN)); } return TRUE; } MS_U32 HAL_RASP_FileIn_Reset_TStamp(MS_U32 RaspEng, MS_BOOL bResetPktTimeStamp) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x\n", RaspEng); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16value; u16value = HAL_RFILEIN_ReadReg_Word(RaspEng,REG_RFILEIN_CTRL_1); if (TRUE == bResetPktTimeStamp) { //@ IMPORTANT: Initialize timestamp latch buffer to zero //@ IMPORTANT: In normal scenario, timestamp latch buffer is updated by Filein packet timestamp //HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16value & ~REG_RFILEIN_RST_PKT_TSTAMP)); HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16value | REG_RFILEIN_RST_PKT_TSTAMP)); //HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16value & ~REG_RFILEIN_RST_PKT_TSTAMP)); } else { HAL_RFILEIN_WriteReg_Word(RaspEng, REG_RFILEIN_CTRL_1, (u16value & ~REG_RFILEIN_RST_PKT_TSTAMP)); } return TRUE; } /**************************************************************************************************************************/ MS_U32 HAL_RASP_SetPVRDstBuf(MS_U32 RaspEng, MS_U32 u32StartAddr0, MS_U32 u32EndAddr0, MS_U32 u32StartAddr1, MS_U32 u32EndAddr1) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, u32StartAddr0 = %x, u32EndAddr0 = %x\n", RaspEng,u32StartAddr0,u32EndAddr0); RASP_NUM_CHECK_RET(RaspEng); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_STR2MIU_HEAD1_L, MIU(u32StartAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_STR2MIU_MID1_L, MIU(u32EndAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_STR2MIU_TAIL1_L, MIU(u32EndAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_STR2MIU_HEAD2_L, MIU(u32StartAddr1)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_STR2MIU_MID2_L, MIU(u32EndAddr1)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_STR2MIU_TAIL2_L, MIU(u32EndAddr1)); MsOS_DelayTaskUs(10); HAL_NDSRASP_Str2MIU_Reset(RaspEng); return TRUE; } MS_U32 HAL_RASP_SetPayloadDstBuf(MS_U32 RaspEng, MS_U32 u32StartAddr0, MS_U32 u32MidAddr0, MS_U32 u32EndAddr0, MS_U32 u32StartAddr1, MS_U32 u32MidAddr1, MS_U32 u32EndAddr1) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, u32StartAddr0 = %x, u32EndAddr0 = %x\n",RaspEng,u32StartAddr0,u32EndAddr0); RASP_NUM_CHECK_RET(RaspEng); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_PAYLOAD2MIU_HEAD1_L, MIU(u32StartAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_PAYLOAD2MIU_MID1_L, MIU(u32MidAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_PAYLOAD2MIU_TAIL1_L, MIU(u32EndAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_PAYLOAD2MIU_HEAD2_L, MIU(u32StartAddr1)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_PAYLOAD2MIU_MID2_L, MIU(u32MidAddr1)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_PAYLOAD2MIU_TAIL2_L, MIU(u32EndAddr1)); MsOS_DelayTaskUs(10); HAL_NDSRASP_PAYLD2MIU_Reset(RaspEng); return TRUE; } MS_U32 HAL_RASP_SetECMDstBuf(MS_U32 RaspEng, MS_U32 u32StartAddr0, MS_U32 u32MidAddr0, MS_U32 u32EndAddr0) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, u32StartAddr0 = %x, u32EndAddr0 = %x\n",RaspEng,u32StartAddr0,u32EndAddr0); RASP_NUM_CHECK_RET(RaspEng); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_ECM2MIU_HEAD1_L, MIU(u32StartAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_ECM2MIU_MID1_L, MIU(u32MidAddr0)); HAL_RASP_WriteReg_DWord(RaspEng, REG_RASP_ECM2MIU_TAIL1_L, MIU(u32EndAddr0)); MsOS_DelayTaskUs(10); //HAL_NDSRASP_ECM2MIU_Reset(RaspEng); return TRUE; } MS_U32 HAL_RASP_RecOpenPid(MS_U32 RaspEng, MS_U16 Pid, MS_U8 RaspFltId) { HALRASP_DBG(RASP_DBGLV_INFO, "RaspEng = 0x%x, Pid = %x, RaspFltId = %x\n", RaspEng,Pid,RaspFltId); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16Reg; // enable record.... u16Reg = HAL_RASP_ReadReg_Word(RaspEng, REG_RASP_HW_CTRL1); if(u16Reg & RASP_REC_PID) { //already enable...skip... } else { u16Reg |= RASP_REC_PID; HAL_RASP_WriteReg_Word(RaspEng, REG_RASP_HW_CTRL1, u16Reg); } HAL_RASP_WriteReg_Word(RaspEng, REG_RASP_PIDFLT_N(RaspFltId), Pid); return TRUE; } MS_U32 HAL_RASP_DisableRec(MS_U32 RaspEng) { MS_U16 u16Reg; // dsiable record.... u16Reg = HAL_RASP_ReadReg_Word(RaspEng, REG_RASP_HW_CTRL1); u16Reg &= (~RASP_REC_PID); HAL_RASP_WriteReg_Word(RaspEng, REG_RASP_HW_CTRL1, u16Reg); return TRUE; } //ask Stephen what is the real trigger start register... MS_BOOL HAL_NDSRASP_SetFileinConfig(MS_U32 RaspEng, MS_BOOL bFileIn, MS_U16 BlockLevel) { HALRASP_DBG(RASP_DBGLV_INFO,"RaspEng = %x, bFileIn = %d, BlockLevel = %x\n",RaspEng, bFileIn, BlockLevel); RASP_NUM_CHECK_RET(RaspEng); MS_U16 u16RegCtrl0, u16RegBlockLevel; // read control 0.... u16RegCtrl0 = HAL_RASP_ReadReg_Word(RaspEng, REG_RASP_HW_CTRL0); u16RegBlockLevel = HAL_RASP_ReadReg_Word(RaspEng, REG_RASP_HW_CTRL4); if(bFileIn) { u16RegCtrl0 &= (~RASP_FILEIN_EN); u16RegBlockLevel = (u16RegBlockLevel & ~RASP_TS_FF_FULL_SEL_MASK) | (BlockLevel<