modemif_o.c
来自「三星s3c2460开发板完整功能测试代码」· C语言 代码 · 共 357 行
C
357 行
//===================================================================
// NAME : modemif.c
// DESC : S3C2460X DPSRAM test
// History : 04.15.2003 ver 0.0 ky.shim
// 07.08.2004 modify for 2460
//===================================================================
#include <stdlib.h>
#include <string.h>
#include "option.h"
#include "2460addr.h"
#include "2460lib.h"
#include "def.h"
#include "modemif.h"
/*
#define MI_Tacs (0x0)<<14 // 0clk
#define MI_Tcos (0x1)<<12 // 2clk
#define MI_Tacc (0x1)<<8 // 3clk
#define MI_Tcoh (0x1)<<6 // 2clk
#define MI_Tah (0x1)<<4 // 2clk
#define MI_Tacp (0x0)<<2 // 2clk
#define MI_PMC (0x0)<<0 // normal
*/
#define MI_Tacs (0x3)<<14 // 0clk
#define MI_Tcos (0x3)<<12 // 2clk
#define MI_Tacc (0x7)<<8 // 3clk
#define MI_Tcoh (0x3)<<6 // 2clk
#define MI_Tah (0x3)<<4 // 2clk
#define MI_Tacp (0x0)<<2 // 2clk
#define MI_PMC (0x0)<<0 // normal
#define HALFWORD (TRUE)
#define _DPSRAM_BASE_MODEM (0x41100000)// 2460 modem
#define _DPSRAM_BASE_PSEUDOMMSM (0x08000000)// nCS2
#define INT2AP_ADR 0xffe
#define INT2MSM_ADR 0xffc
#if !HALFWORD // x8
#define _DPSRAM_MAX 0x20//(0xFC0) // others are mapped SFR
#else // x16
#define _DPSRAM_MAX 0x10//(0xFC0/2)
#endif
void Run_Modem(void);
void Run_PseudoMSM(void);
void __irq PseudoMSM_Int(void);
void __irq Modem_Int(void);
void __irq Tx_Trig_pseudoMSM(void);
void __irq Tx_Trig_Modem(void);
static volatile int count=0;
void * func_modem_test[][2]=
{
// "123456789012345678"
(void *)Run_Modem, "Run modem I/F ",
(void *)Run_PseudoMSM, "Run pseudo MSM b'd",
0,0
};
void Ch27_MODEM(void)
{
int i;
printf("\nModem I/F test.\n");
while(1)
{
i=0;
printf("\n\n");
while(1)
{ //display menu
printf("%2d:%s",i,func_modem_test[i][1]);
i++;
if((int)(func_modem_test[i][0])==0)
{
printf("\n");
break;
}
if((i%3)==0)
printf("\n");
}
printf("\nSelect (\"-1\" to exit) : ");
i = GetIntNum();
if(i==-1)
break; // return.
if(i>=0 && (i<((sizeof(func_modem_test)-1)/8)) ) // select and execute...
( (void (*)(void)) (func_modem_test[i][0]) )();
}
printf("\nModem I/F test end.\n");
}
void Modem_IF_Init(void)
{
rINT2AP=INT2AP_ADR;
rINT2MSM=INT2MSM_ADR;
// printf("rINT2AP,rINT2MSM 0x%3x 0x%3x\n",rINT2AP,rINT2MSM);
rGPJCON = ( rGPJCON & ~(3<<0) ) | (2<<0); //EINT0(GPJ0)
rEINTCON0= ( rEINTCON0 & ~(7<<0) ) | (2<<0);//falling edge
// Modem I/F
rGPECON = 0xaaaaaaaa;
rGPFCON = 0xaaaaaaaa;
#if !HALFWORD // x8
rMIFCON |= ( (3<<2)|(1<<0) );
#else // x16
rMIFCON |= (3<<2);
#endif
//Clear the previous pending states
rEINTPEND |= (1<<0);
rSUBSRCPND |= BIT_SUB_MSM;
ClearPending(BIT_EXT0_3);
ClearPending(BIT_MODEM);//to clear the previous pending states
pISR_EXT0_3= (unsigned)Tx_Trig_Modem; // for Modem Tx
pISR_MODEM= (unsigned)Modem_Int;// for Modem Rx
rINTSUBMSK &= ~(BIT_SUB_MSM);
rEINTMASK &= ~(1<<0);
rINTMSK &= ~(BIT_MODEM | BIT_EXT0_3);
}
void Run_Modem(void)
{
Modem_IF_Init();
printf("\n[Modem test: 2460] Press EINT0 button to Tx..\n");
printf("To exit press any key...\n");
while(!Uart_GetKey());
rINTMSK |= (BIT_MODEM|BIT_EXT0_3);
}
void __irq Modem_Int(void)
{
int i, j=0;
rSUBSRCPND |= BIT_SUB_MSM;
ClearPending(BIT_MODEM);
printf("__isr Modem\n");
for(i=0;i<_DPSRAM_MAX;i++)
{
if(j<16)
{
#if !HALFWORD // x8
printf("%02x ", *(char *)(_DPSRAM_BASE_MODEM+i));
#else // x16
printf("%04x ", *(unsigned short *)(_DPSRAM_BASE_MODEM+i*2));
#endif
j++;
}
else
{
printf("\n");
#if !HALFWORD // x8
printf("%02x ", *(char *)(_DPSRAM_BASE_MODEM+i));
#else // x16
printf("%04x ", *(unsigned short *)(_DPSRAM_BASE_MODEM+i*2));
#endif
j=0;
}
}
printf("\n");
}
void __irq Tx_Trig_Modem(void)
{
int i;
Delay(5000); // to remove key bounce.....
rEINTPEND=BIT_EINT_0;
ClearPending(BIT_EXT0_3);
if(count%2)
{
for(i=0;i<_DPSRAM_MAX;i++)
{
#if !HALFWORD // x8
*(char *)(_DPSRAM_BASE_MODEM+i)=i;
#else // x16
*(unsigned short *)(_DPSRAM_BASE_MODEM+i*2)=i;
#endif
}
}
else
{
for(i=0;i<_DPSRAM_MAX;i++)
{
#if !HALFWORD // x8
*(char *)(_DPSRAM_BASE_MODEM+i)=_DPSRAM_MAX-i-1;
#else // x16
*(unsigned short *)(_DPSRAM_BASE_MODEM+i*2)=_DPSRAM_MAX-i-1;
#endif
}
}
count++;
*(char *)(_DPSRAM_BASE_MODEM+INT2MSM_ADR)=0x8; // Request INT to MSM
}
/* For pseudo modem I/F */
void PseudoMSM_IF_Init(void)
{
#if !HALFWORD
rSROM_BW= ( rSROM_BW & ~(7<<6) ) | (4<<6); // nGCS2: nUB/nLB, no nWAIT, 8-bit
#else
rSROM_BW= ( rSROM_BW & ~(7<<6) ) | (5<<6); // nGCS2: nUB/nLB, no nWAIT, 16-bit
#endif
rSROM_BC2= MI_Tacs|MI_Tcos|MI_Tacc|MI_Tcoh|MI_Tah|MI_Tacp|MI_PMC;
rGPJCON = ( rGPJCON & ~( (3<<28) | (3<<0) ) ) | (2<<28) | (2<<0); //EINT0/14(GPJ0/14)
rEINTCON1= ( rEINTCON1 & ~(7<<24) ) | (2<<24); //falling edge
rEINTCON0= ( rEINTCON0 & ~(7<<0) ) | (2<<0); //falling edge
//Clear the previous pending states
rEINTPEND |= ( (1<<14) | (1<<0) );
ClearPending(BIT_EXT12_15);
ClearPending(BIT_EXT0_3);
pISR_EXT12_15= (unsigned)PseudoMSM_Int; // for pseudo MSM Rx
pISR_EXT0_3= (unsigned)Tx_Trig_pseudoMSM; // for pseudo MSM Tx
rINTMSK &= ~(BIT_EXT12_15|BIT_EXT0_3);
rEINTMASK &= ~( (1<<14) | (1<<0) );
}
void Run_PseudoMSM(void)
{
int i, j=0;
PseudoMSM_IF_Init();
printf("\n[Modem test: MSM] Press EINT0 button to Tx..\n");
printf("To exit press any key...\n");
while(!Uart_GetKey());
rEINTMASK |= (1<<14);
rINTMSK |= (BIT_EXT12_15|BIT_EXT0_3);
}
void __irq PseudoMSM_Int(void)
{
int i, j=0;
rEINTPEND=BIT_EINT_14;
ClearPending(BIT_EXT12_15);
*(char *)(_DPSRAM_BASE_PSEUDOMMSM+INT2MSM_ADR)=0x8;// Clear nMIIRQ pending
printf("__isr EINT14\n");
for(i=0;i<_DPSRAM_MAX;i++)
{
if(j<16)
{
#if !HALFWORD // x8
printf("%02x ", *(char *)(_DPSRAM_BASE_PSEUDOMMSM+i));
#else // x16
printf("%04x ", *(unsigned short *)(_DPSRAM_BASE_PSEUDOMMSM+i*2));
#endif
j++;
}
else
{
printf("\n");
#if !HALFWORD // x8
printf("%02x ", *(char *)(_DPSRAM_BASE_PSEUDOMMSM+i));
#else // x16
printf("%04x ", *(unsigned short *)(_DPSRAM_BASE_PSEUDOMMSM+i*2));
#endif
j=0;
}
}
printf("\n");
}
void __irq Tx_Trig_pseudoMSM(void)
{
int i;
Delay(5000); // to remove key bounce.....
rEINTPEND=BIT_EINT_0;
ClearPending(BIT_EXT0_3);
if(count%2)
{
for(i=0;i<_DPSRAM_MAX;i++)
{
#if !HALFWORD // x8
*(char *)(_DPSRAM_BASE_PSEUDOMMSM+i)=i;
#else // x16
*(unsigned short *)(_DPSRAM_BASE_PSEUDOMMSM+i*2)=i;
#endif
}
}
else
{
for(i=0;i<_DPSRAM_MAX;i++)
{
#if !HALFWORD // x8
*(char *)(_DPSRAM_BASE_PSEUDOMMSM+i)=_DPSRAM_MAX-i-1;
#else // x16
*(unsigned short *)(_DPSRAM_BASE_PSEUDOMMSM+i*2)=_DPSRAM_MAX-i-1;
#endif
}
}
count++;
for(i=0;i<_DPSRAM_MAX;i++)
printf("%x ", *(unsigned short *)(_DPSRAM_BASE_PSEUDOMMSM+i*2) );
*(char *)(_DPSRAM_BASE_PSEUDOMMSM+INT2AP_ADR)=0x8; // Request INT to 2460
}
void Run_PseudoMSM_DMA(void)
{
}
void Test_Modem_Wakeup(void)
{
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?