📄 modemif_test.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 + -