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

📄 bbu_dd_post.c

📁 DSP芯片自检测程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*******************************************************************************
* COPYRIGHT (C)             中国普天研究院									   *
********************************************************************************
* 源文件名: BBU_DD_Post.c                                                      *
* 功能描述:POST Testing Operation Module                                      *
* 编写者:louyajun                                                             *
* 版本:1.0.0                                                                  *
* 编制日期:07/19/2004                                                         *
* 说明:                                                                       *
* 修改历史:                                                                   *
*                                                                              *
*******************************************************************************/
#include "BBU_DD_ChipCsl.h"
#include "BBU_DD_IrqCsl.h"
#include "BBU_DD_EdmaCsl.h"
#include "BBU_DD_McbspCsl.h"
#include "BBU_DD_EmifaCsl.h"
#include "BBU_DD_GpioCsl.h"
#include "BBU_DD_HpiCsl.h"
#include "BBU_DD_Post.h"
#if 1
    #include "stdio.h"
#endif  

/******************************************************************************\
* POST Static Global Variable Definitions
\******************************************************************************/
/* Static Global structure for MPC8260 Ack to DSP by HPI */
#pragma DATA_SECTION(mpc8260Ack,".gvariable");
static HOST_Ack mpc8260Ack = {0,0xFFFFFFFF};

/* Static Global log structure for HPI to MPC8260 */
#pragma DATA_SECTION(postTestResult,".gvariable");
static POST_Log postTestResult = {11,0,0,0,0,0,0,0,0,0,0,(Uint32)&mpc8260Ack};

/* Static Global Buffer for McBSP */
#pragma DATA_SECTION(mcbspTxBuf,".gvariable");
static Uint32 mcbspTxBuf[MCBSP_PORT_CNT][MCBSP_TX_BUFFER_SIZE];

#pragma DATA_SECTION(mcbspRxBuf,".gvariable");
static Uint32 mcbspRxBuf[MCBSP_PORT_CNT][MCBSP_TX_BUFFER_SIZE];

#pragma DATA_SECTION(mcbspRxBufPing,".gvariable");
static Uint32 mcbspRxBufPing[MCBSP_PORT_CNT][MCBSP_RX_BUFFER_SIZE];

#pragma DATA_SECTION(mcbspRxBufPong,".gvariable");
static Uint32 mcbspRxBufPong[MCBSP_PORT_CNT][MCBSP_RX_BUFFER_SIZE]; 

/* Static Global Buffer for L2MEM test */
#pragma DATA_SECTION(ResBuf,".ressec");
static Uint32 ResBuf[L2MEM_RESERVE_SIZE>>2];

/* Used by Core testing */
#pragma DATA_SECTION(CSR1,".gvariable");
Uint32  CSR1;

#pragma DATA_SECTION(CSR2,".gvariable");
Uint32  CSR2;
/*----------------------------------------------------------------------------*/

/******************************************************************************\
* External Variable Definitions
\******************************************************************************/
CSLAPI  Uint32  mcbspTxIntFlag;
CSLAPI  Uint32  mcbspRxIntFlag;
CSLAPI  Uint32  timerIntCount[TIMER_DEVICE_CNT];
CSLAPI  Uint32  emifaSdramIntFlag;
CSLAPI  Uint32  emifaDpramIntFlag;
CSLAPI  Uint32  gpio5msFrameIntCount;
CSLAPI  Uint32  gpio10msSlotReadyCount;
CSLAPI  Uint32  hpiDspIntFlag;

CSLAPI  EDMA_Handle  edmaMcbspXHandle[MCBSP_PORT_CNT];
CSLAPI  EDMA_Handle  edmaMcbspRHandle[MCBSP_PORT_CNT];
CSLAPI  EDMA_Handle  edmaMcbspRLHandle1[MCBSP_PORT_CNT];
CSLAPI  EDMA_Handle  edmaMcbspRLHandle2[MCBSP_PORT_CNT];

CSLAPI  EDMA_Handle  edmaEmifaWDpramHandle,edmaEmifaRDpramHandle;
CSLAPI  EDMA_Handle  edmaEmifaWDpramCHandle1,edmaEmifaWDpramCHandle2;
CSLAPI  EDMA_Handle  edmaEmifaRDpramCHandle1,edmaEmifaRDpramCHandle2;
CSLAPI  EDMA_Handle  edmaEmifaWSdramHandle,edmaEmifaRSdramHandle;

/* GPIO Handle and  GPIO LED pin mask */ 
CSLAPI  GPIO_Handle *hCpbGpio;
CSLAPI  Uint32  led1PinMask;
CSLAPI  Uint32  led2PinMask;
CSLAPI  Uint32  led3PinMask;
CSLAPI  Uint32  led4PinMask;
/*----------------------------------------------------------------------------*/

/******************************************************************************\
* POST Function Declarations
\******************************************************************************/
CSLAPI Sint32 POST_coreTest(void);
CSLAPI Sint32 POST_gpioTest(void);
CSLAPI Sint32 POST_l2memTest(void);
CSLAPI Sint32 POST_emifaDpramTest(void);
CSLAPI Sint32 POST_emifaSdramTest(void);
CSLAPI void   POST_blockBitR(Uint32 *buffer, Uint32 bufLength);
CSLAPI Sint32 POST_blockTest(Uint32 *buffer1, Uint32 *buffer2, Uint32 bufLength, Uint32 *memErrPosition);
CSLAPI Sint32 POST_mcbspTest(Sint32 portNum);
CSLAPI Sint32 POST_timerTest(Sint32 timerNum);
CSLAPI Sint32 POST_5msFrameTest(void);
CSLAPI Sint32 POST_10msSlotReadyTest(void);
CSLAPI void   POST_errorHandle(void);
CSLAPI Sint32 POST_hpiReport(void);

/******************************************************************************\
* POST Function Definitions
\******************************************************************************/
/*******************************************************************************
* 函数名称: POST_coreTest      		    		           		               *
* 函数描述: Test the Chip's variable Instructions and chip versions            *
* 相关文档:                                                                    *
* 参数描述: 无       				                    			           *
*                                                                              *
* 返回值: 0 -- POST_OK, -1 -- POST_ERROR		                               *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI Sint32 POST_coreTest(void)
{
Uint32 cpuId,revId,siliconRevId,deviceType,endianMode;
Uint32 errCode;
	
	cpuId = CHIP_getCpuId();	
	postTestResult.cpuId = cpuId;
	if(cpuId != CHIP_CSR_CPUID_C64X)
	{
		postTestResult.errorCode = POST_CHIP_CPUID_ERROR;
    	return POST_ERROR;	
	}
	
	revId = CHIP_getRevId();
	postTestResult.revId = revId;
	if(revId != CHIP_CSR_REVID_640011)
	{
		postTestResult.errorCode = POST_CHIP_REVID_ERROR;
    	return POST_ERROR;		
	}
	
	siliconRevId = CHIP_getSiliconRevId();
	postTestResult.siliconRevId = siliconRevId;
	if((siliconRevId != DEVICE_REVID_110) && (siliconRevId != DEVICE_REVID_200))
	{
		postTestResult.errorCode = POST_CHIP_SILICONREVID_ERROR;
    	return POST_ERROR;			
	}

	deviceType = CHIP_getDeviceType();
	postTestResult.deviceType = deviceType;
	if((deviceType != DEVICE_TYPE_6416) && (deviceType != DEVICE_TYPE_6414))
	{
		postTestResult.errorCode = POST_CHIP_DEVICETYPE_ERROR;
    	return POST_ERROR;			
	}
	
	endianMode = CHIP_getEndian();
	postTestResult.endianMode = endianMode;	
	if(endianMode != CHIP_ENDIAN_BIG)
	{
		postTestResult.errorCode = POST_CHIP_ENDIANMODE_ERROR;
    	return POST_ERROR;				
	}

    CSR1=(cpuId<<24)|(revId<<16)|(endianMode<<8); //SAT=0 in CSR;
    CSR2=CSR1|(0x00000200); //SAT=1 IN CSR		
    
    errCode = Inst_Test();
    
    if(errCode != 0)
    {
        postTestResult.errorCode = POST_CHIP_CORE_ERROR + errCode;
        return POST_ERROR;
    }
		
	return POST_OK;	
}
/*----------------------------------------------------------------------------*/

/*******************************************************************************
* 函数名称: POST_gpioTest                                   		           *
* 函数描述: GPIO Port Test                                                     *
* 相关文档:                                                                    *
* 参数描述: 无 						                    			           *
*                                                                              *
* 返回值: 0 -- POST_OK, -1 -- POST_ERROR		                               *
* 说明:                                                                       * 
*******************************************************************************/
CSLAPI Sint32 POST_gpioTest(void)
{
Uint32 dspId;
	
	/* initilizing the GPIO device */
	hCpbGpio = (GPIO_Handle *)GPIO_init();
	if (hCpbGpio == GPIO_HINV)
    {
        postTestResult.errorCode = POST_GPIO_INIT_ERROR;
        return POST_ERROR;           
    }	
	
	/* get DSP ID */
	dspId = GPIO_getDspId(hCpbGpio);
	postTestResult.dspId = dspId;
	if((dspId != CCDSP_ID) && (dspId != RXDSP1_ID) && (dspId != RXDSP2_ID) && \
       (dspId != RXDSP3_ID) && (dspId != SCDSP_ID) && (dspId != TXDSP_ID)) 

	{
		postTestResult.errorCode = POST_GPIO_DSPID_ERROR;
    	return POST_ERROR;	
	}
	
	/* ligh on DSP's led */
	switch (dspId)
	{
	    case CCDSP_ID:  led1PinMask = CCDSP_HL12;
	                    led2PinMask = CCDSP_HL13;
	                    led3PinMask = CCDSP_HL14;
	                    led4PinMask = CCDSP_HL15;
	                    break;
	    case RXDSP1_ID: led1PinMask = RXDSP1_HL20; 
                        led2PinMask = RXDSP1_HL21; 
                        led3PinMask = RXDSP1_HL22; 
                        led4PinMask = RXDSP1_HL23; 
	                    break;
        case RXDSP2_ID: led1PinMask = RXDSP2_HL28; 
                        led2PinMask = RXDSP2_HL29; 
                        led3PinMask = RXDSP2_HL30; 
                        led4PinMask = RXDSP2_HL31; 
	                    break;
        case RXDSP3_ID: led1PinMask = RXDSP3_HL24; 
                        led2PinMask = RXDSP3_HL25; 
                        led3PinMask = RXDSP3_HL26; 
                        led4PinMask = RXDSP3_HL27; 
	                    break;
        case SCDSP_ID:  led1PinMask = SCDSP_HL16; 
                        led2PinMask = SCDSP_HL17; 
                        led3PinMask = SCDSP_HL18; 
                        led4PinMask = SCDSP_HL19; 
	                    break;
        case TXDSP_ID:  led1PinMask = TXDSP_HL8; 
                        led2PinMask = TXDSP_HL9; 
                        led3PinMask = TXDSP_HL10; 
                        led4PinMask = TXDSP_HL11; 
	                    break;
    }
    GPIO_setLedOn(hCpbGpio,led1PinMask | led2PinMask | led3PinMask | led4PinMask);	                    	                   
    
    /* set DSP Ready signal */
    GPIO_setDspReady(hCpbGpio,DSP_READY);   

   	return POST_OK;	
}
/*----------------------------------------------------------------------------*/

/*******************************************************************************
* 函数名称: POST_l2memTest      				            		           *
* 函数描述: L2 SRAM memory Test                                                *
* 相关文档:                                                                    *
* 参数描述: 无 						                    			           *
*                                                                              *
* 返回值: 0 -- POST_OK, -1 -- POST_ERROR		                               *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI Sint32 POST_l2memTest(void)
{
EDMA_ParaConfig qdmaConfig;
Uint32 *blockPointer;
Uint32 l2memErrPosition;
Uint32 i;
    
    /* Test memory reserved block */
    POST_blockBitR(ResBuf,(Uint32)L2MEM_RESERVE_SIZE);
    if (POST_blockTest(ResBuf, ResBuf, (Uint32)L2MEM_RESERVE_SIZE, \
                                (Uint32*)&l2memErrPosition)== POST_ERROR)
    {
        postTestResult.errorCode = POST_L2MEM_ERR;
        postTestResult.l2memPosition = l2memErrPosition;
        return POST_ERROR;
    }
 
    POST_blockBitR((Uint32*)L2MEM_BITR_BLOCK_ADD, (Uint32)L2MEM_BLOCK_SIZE);

    EDMA_intDisable(EDMA_TCC_QDMA);
        
    /* Test memory data block */
    qdmaConfig.opt = 0x213F6001;    /* EDMA_TCC_QDMA is 63 */
	qdmaConfig.idx = 0;
	qdmaConfig.rld = 0;    
    blockPointer = (Uint32*)L2MEM_TEST_START_ADD;    	    
    for (i=0;i<L2MEM_MAX_BLOCK_NUM;i++)
  	{  
	    /* Read data from data mem block to backup block */
	    qdmaConfig.src = (Uint32)blockPointer;
  	    qdmaConfig.dst = (Uint32)L2MEM_BACKUP_BLOCK_ADD;
  	    qdmaConfig.cnt = (Uint32)(L2MEM_BLOCK_SIZE >> 2);    
        QDMA_config(qdmaConfig);
        while (EDMA_intStatus(EDMA_TCC_QDMA) == 0);
        EDMA_intClear(EDMA_TCC_QDMA);   

        /* Write bit reserve block to data mem block */ 
	    qdmaConfig.src = (Uint32)L2MEM_BITR_BLOCK_ADD;
  	    qdmaConfig.dst = (Uint32)blockPointer;
  	    qdmaConfig.cnt = (Uint32)(L2MEM_BLOCK_SIZE >> 2);    
        QDMA_config(qdmaConfig);
        while (EDMA_intStatus(EDMA_TCC_QDMA) == 0);
        EDMA_intClear(EDMA_TCC_QDMA);           

	    /* Read data from data mem block to image block */
	    qdmaConfig.src = (Uint32)blockPointer;
  	    qdmaConfig.dst = (Uint32)L2MEM_IMAGE_BLOCK_ADD;
  	    qdmaConfig.cnt = (Uint32)(L2MEM_BLOCK_SIZE >> 2);    
        QDMA_config(qdmaConfig);
        while (EDMA_intStatus(EDMA_TCC_QDMA) == 0);
        EDMA_intClear(EDMA_TCC_QDMA);            

	    /* write backup data to data mem block */
	    qdmaConfig.src = (Uint32)L2MEM_BACKUP_BLOCK_ADD;
  	    qdmaConfig.dst = (Uint32)blockPointer;
  	    qdmaConfig.cnt = (Uint32)(L2MEM_BLOCK_SIZE >> 2);    

⌨️ 快捷键说明

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