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

📄 modemif_test.c

📁 s3c6400 ADS下官方测试程序
💻 C
字号:

//===================================================================
// NAME		: modemif_test.c	
// DESC		: S3C6400X DPSRAM test 
// History	: 01.03.2007 ver 0.0 by JAE GEUN. SONG
//===================================================================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "option.h"
#include "sfr6400.h"
#include "def.h"
#include "intc.h"
#include "library.h"
#include "sysc.h"
#include "nand.h"
#include "modemif.h"
#include "gpio.h"
#include "timer.h"
#include "dma.h"


static DMAC oModemif0;

extern volatile int g_ApDataCnt;
extern volatile int g_MsmDataCnt;
extern volatile int g_DmaDone;
extern volatile int g_MsmReadDone;


//MODEM DMA ISR
void __irq Dma0Done_MSM(void)
{
  	DMACH_ClearIntPending(&oModemif0);
	//printf ("DMA ISR %d\n", g_DmaDone);

	if (g_DmaDone == 0)
		Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0xff00);

	else 
		Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0xee00);
	
	g_DmaDone++;
	
	DMACH_Setup(DMA_A, 0x0, MSM_TX_BUFFER+(g_DmaDone*0x1000) , 0, MSM_TX_Queue, 0, WORD, 0x400, DEMAND, MEM, MEM, BURST4, &oModemif0);

	INTC_ClearVectAddr();
}

void Test_AP_TX(void)
{

	u32 length,i;
	u32	*txdata;
	u32 *aptx_buf;

	//Message
	printf("AP TX\n");

	g_MsmReadDone = 0;
	
	txdata = (u32 *)(AP_TX_BUFFER);

	// Modem i/f setting
	MODEMIF_AP_Init(true, true);

	// AP TX Buffer data
	for(length=0 ; length <= (AP_TX_BUFLEN*BLK_COUNT) ; length++)
	{
		*(txdata+length) = length;
	}

	Outp16(DPSRAM_BASE_AP+INT2MSM_ADR, 0x00ff);
	while(!g_MsmReadDone);

	for(i=0 ; i<BLK_COUNT ; i++)
	{
		g_MsmReadDone = 0;
		
		// TX Buffer pointer setting
		txdata = (u32 *)(AP_TX_BUFFER+(i*AP_TX_BUFLEN));
		aptx_buf = (u32 *)(AP_TX_Queue);

		for (length = 0 ; length < AP_TX_BUFLEN ; length++)
		{
			*(u32 *)(aptx_buf ++) = *(txdata++);
		}

		Outp16(DPSRAM_BASE_AP+INT2MSM_ADR, 0x00ee);
		
		while(!g_MsmReadDone);
		printf(" i = 0x%x\n", i);
	}

	Outp16(DPSRAM_BASE+INT2MSM_ADR, 0x0011);
	printf("AP TX END\n");

}

void Test_AP_RX(void)
{
	g_ApDataCnt = 0;
	
	MODEMIF_AP_Init(true, true);

	while(!(g_ApDataCnt == DMA_COUNT));
	//printf("cnt = 0x%x, dma_cnt = 0x%x\n", g_ApDataCnt, DMA_COUNT);
	
	INTC_Disable(NUM_MSM);
}


void Test_MODEM_TX(void)
{
	u32 length;
	u32	*txdata;

	printf("MODEM TX TEST!!!\n\n");
	
	g_DmaDone = 0;

	txdata = (u32 *)(MSM_TX_BUFFER);
	
	MODEMIF_MODEM_Init(true, true);

	for(length=0 ; length <= DMA_COUNT*MODEM_TX_BUFLEN ; length++)
	{
		*(txdata+length) = length;
	}

	// DMA Init & Setup
     	DMAC_InitCh(DMA0, DMA_ALL, &oModemif0);
	INTC_SetVectAddr(NUM_DMA0,  Dma0Done_MSM);
	INTC_Enable(NUM_DMA0);
	DMACH_Setup(DMA_A, 0x0, MSM_TX_BUFFER, 0, MSM_TX_Queue, 0, WORD, 0x400, DEMAND, MEM, MEM, BURST4, &oModemif0);

        // DMA start
        printf("[ MODEM DMA START!!!]\n");	
	DMACH_Start(&oModemif0);

	// Wait Tx
	while(g_DmaDone < DMA_COUNT);

	INTC_Disable(NUM_DMA0);
	
	// to AP message "STOP"
	Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0x1100);

}

void Test_MODEM_RX(void)
{
	g_MsmDataCnt = 0;
	
	MODEMIF_MODEM_Init(true, true);

	//while(!Getc());

	while(!(g_MsmDataCnt == BLK_COUNT));
	printf("cnt = 0x%x, dma_cnt = 0x%x\n", g_MsmDataCnt, BLK_COUNT);
	
	INTC_Disable(NUM_EINT1);
}

extern NAND_oInform NAND_Inform[NAND_CONNUM];

void Test_AP_Booting(void)
{
	// MODEM I/F GPIO Setting
	MODEMIF_SetPort();

	// MODEM bootloader copy to DPSRAM
	NAND_Inform[0].uNandType = NAND_Normal8bit;
	NAND_Inform[0].uAddrCycle = 4;
	NAND_Inform[0].uBlockNum = 4096;
	NAND_Inform[0].uPageNum = 32;
	NAND_Inform[0].uPageSize = NAND_PAGE_512;
	NAND_Inform[0].uSpareSize = NAND_SPARE_16;
	NAND_Inform[0].uECCtest = 0;
	NAND_Inform[0].uTacls = 0;
	NAND_Inform[0].uTwrph0 = 35+10;	//Pad delay : about 10ns
	NAND_Inform[0].uTwrph1 = 15+5;	//tWH : 15ns
	
	NAND_Init(0);
	NAND_ReadMultiPage(0, 10, 0, (u8 *)0x74100000, 0x1000);
	Delay(100);

	// AP Booting MODEM Reset
	MODEMIF_MODEM_Reset();

}

void Test_SleepWakeup(void)
{
	Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0xff00);
	Outp32(SLEEP_WAKEUP, 0xffff);
}

void Test_WakeupClear(void)
{
	Outp32(SLEEP_WAKEUP_CLEAR, 0xffff);
}

void Test_MODEM_Performance(void)
{

	u32 length, temp;
	u32	*txdata;

	//Message
	printf("MODEM I/F Performance Test!!!\n");

	g_DmaDone = 0;
	
	txdata = (u32 *)(MSM_TX_BUFFER);

	// Modem i/f setting
	MODEMIF_MODEM_Init(true, true);

	// MODEM TX Buffer data
	for(length=0 ; length <= DMA_COUNT*MODEM_TX_BUFLEN ; length++)
		*(txdata+length) = length;
	
     	DMAC_InitCh(DMA0, DMA_ALL, &oModemif0);
	INTC_SetVectAddr(NUM_DMA0,  Dma0Done_MSM);
	INTC_Enable(NUM_DMA0);

        // DMA Channel Set-up
	DMACH_Setup(DMA_A, 0x0, MSM_TX_BUFFER, 0, MSM_TX_Queue, 0, WORD, 0x400, DEMAND, 
	                       MEM, MEM, BURST4, &oModemif0);

	StartTimer(0);

	Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0xff00);

        // Enable DMA
	DMACH_Start(&oModemif0);

	while(g_DmaDone < DMA_COUNT);

	INTC_Disable(NUM_DMA0);
	
	Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0x1100);

	temp = StopTimer(0);
	printf("%dKB R/W Time = %dus\n",(4*DMA_COUNT), temp);

	INTC_Disable(NUM_EINT1);

}


void Test_Display_MEM(void)
{
	u32 i, length, add, size;

	printf("\nMEM DUMP Address : ");
	add = GetIntNum();
	printf("add = 0x%x\n", add);

	printf("\nMEM DUMP Size : ");
	size = GetIntNum();
	printf("size = 0x%x\n", size);

	printf("Press any key and DPSRAM R/W test start!!!\n");
	Getc();
	
		for (length = 0 ; length <= size ; length+=4)
		{
				i = Inp32(add + length);
				printf("%08x    ", i);
		}

	printf("\nDPSRAM Test........OK!!!\n");

}

void Test_DPSRAM(void)
{
	// ALL DPSRAM TEST
	u32 i, length;

	printf("Press any key and DPSRAM R/W test start!!!\n");
	Getc();
	
	for(i=0; i<=0xffffffff; i++)
	{
		for (length = 0 ; length <= 0x1ffc ; length+=4)
		{
			*(unsigned int *)(DPSRAM_BASE + length) = i;

			if(*(unsigned int *)(DPSRAM_BASE + length) != i)
				printf("Error: %08x\n", DPSRAM_BASE + length);
		}
			printf("%08x ", i);
	}	

	printf("DPSRAM Test........OK!!!\n");

}



//////////////////////////////////////////////////////////////////////////////
void MODEM_Test(void)
{
	int i=0, nSel;

	const testFuncMenu modemif_function[]=
	{
		0,                          			"Exit",	
		Test_AP_TX,					"Test AP TX	",
		Test_AP_RX,					"Test AP RX	",

		Test_MODEM_TX,				"Test MODEM TX	",
		Test_MODEM_RX,				"Test MODEM RX    ",

		Test_AP_Booting,			"Test AP Booting		",
		Test_SleepWakeup,			"Test Wake-Up Sleep Mode		",
		Test_WakeupClear, 			"Test Wake-Up Sleep Mode Clear		",

		Test_MODEM_Performance,	"Test MODEM I/F Performance	",

		Test_Display_MEM,			"Dump Memory	",
		Test_DPSRAM,				"Test DPSRAM (AP side)	",
		0,							0
	};
	
	while (1)
	{
		printf("\n");
		for (i=0; (int)(modemif_function[i].desc)!=0; i++)
		{
			printf("%2d: %s\n", i,modemif_function[i].desc);
		}

		printf("==========================================================\n");			
		printf("\nSelect the function to test : ");

		nSel = GetIntNum();

		printf("\n");

		if (nSel == 0)
			break;
		if (nSel>0 && nSel<(sizeof(modemif_function)/8-1))
			 (modemif_function[nSel].func)();
	}		
}

⌨️ 快捷键说明

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