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