modemif.c

来自「三星s3c2460开发板完整功能测试代码」· C语言 代码 · 共 334 行

C
334
字号
//===================================================================
// NAME		: modemif.c	
// DESC		: S3C2460X DPSRAM test 
// History	: 07.08.2004 ver 0.0 by Tark
//===================================================================
#include <stdio.h>
#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	(0x3)<<12	// 2clk
#if 0	//with SMDK2460
#define MI_Tacc	(0x2)<<8	// 4clk
#else	//with mDiracIII
#define MI_Tacc	(0x3)<<8	// 10clk
#endif
#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 HALFWORD				(FALSE)
#define _DPSRAM_BASE_MODEM		(0x41100000)// 2460 modem
#define _DPSRAM_BASE_PSEUDOMMSM	(0x05000000)// nCS2 

#define INT2AP_ADR	0xffe
#define INT2MSM_ADR	0xffc

#if !HALFWORD	// x8
	#define _DPSRAM_MAX		0x40//(0xFC0)	// others are mapped SFR		
#else			// x16	
	#define _DPSRAM_MAX		0x20//(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 Test(void);

void * func_modem_test[][2]=
{	
//								"123456789012345678"
    (void *)Run_Modem,			"Run modem I/F     ",
	(void *)Run_PseudoMSM,		"Run pseudo MSM    ",
	
    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;

	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
	printf("8-bit bus Test\n");
	rMIFCON |= ( (3<<2)|(1<<0) );
#else			// x16
	printf("16-bit bus Test\n");
	rMIFCON |= (3<<2);
#endif

	//Clear the previous pending states
	rEINTPEND |= (BIT_EINT_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 &= ~(BIT_EINT_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|0x80;
#else			// x16
			*(unsigned short *)(_DPSRAM_BASE_MODEM+i*2)=i|0x80;
#endif
		}
	}
	else
	{
		for(i=0;i<_DPSRAM_MAX;i++)
		{
#if	!HALFWORD	// x8
			*(char *)(_DPSRAM_BASE_MODEM+i)=(_DPSRAM_MAX-i-1)|0x80;
#else			// x16
			*(unsigned short *)(_DPSRAM_BASE_MODEM+i*2)=(_DPSRAM_MAX-i-1)|0x80;
#endif
		}
	}
	count++;

	printf("__irq EINT0 Tx Done..\n");
	
	*(char *)(_DPSRAM_BASE_MODEM+INT2MSM_ADR)=0x8;	// Request INT to MSM
}



/* For pseudo modem I/F */
void PseudoMSM_IF_Init(void)
{
#if	!HALFWORD
	printf("8-bit bus Test\n");
	rSROM_BW= ( rSROM_BW & ~(7<<3) );	// nGCS2: nWBE[1:0], no nWAIT, 8-bit
#else
	printf("16-bit bus Test\n");
	rSROM_BW= ( rSROM_BW & ~(7<<3) ) | (1<<3);	// nGCS2: nWBE[1:0], no nWAIT, 16-bit
#endif
	rSROM_BC1= 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 |= ( (BIT_EINT_14) | (BIT_EINT_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 &= ~( (BIT_EINT_14) | (BIT_EINT_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 |= BIT_EINT_15;
	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	!HALFWORD	// x8
		printf("%02x ", *(char *)(_DPSRAM_BASE_PSEUDOMMSM+i));
#else			// x16
		printf("%04x ", *(unsigned short *)(_DPSRAM_BASE_PSEUDOMMSM+i*2));
#endif
		j++;
		if (j==16){
			printf("\n");
			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++;

	printf("__irq EINT0 Tx Done..\n");

	*(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 + -
显示快捷键?