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

📄 modemif.c

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

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


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

volatile int g_ApDataCnt;
volatile int g_MsmDataCnt;

volatile int g_MsmReadDone;

extern volatile int g_DmaDone;

//static DMAC oModemif0;
//static DMAC oModemif_ap0;

//for MODEM EINT
void __irq Isr_AP2MODEM(void)
{
	u32 lengh, temp;
	u32 *rx_data, *rx_buf;

	// ENT Pending Clear & AP2MODEM INT Clear & Message
	GPIO_EINT0ClrPend(4);

	temp = MODEMIF_IntClear_Int2MSM();
	//printf("temp = 0x%x\n", temp);

	//////////////////////////////
	////// MODEM TX ISR //////////
	/////////////////////////////

	if (temp == 0xff00)
		printf("[AP start data transfer]\n");

	else if (temp == 0xee00)
	{
		//printf("[ MODEM DMA START!!!]\n");	

		//DMA START
		Outp32(0x75000114, 0x8001);
	}

	else if (temp ==0x1100)
	{
		//printf("[MODEC TX completed.]\n\n");
	}
	

	//////////////////////////
	////// AP TX ISR //////////
	/////////////////////////

	else if (temp == 0x00ff)
	{
		printf("[AP TX Started.....MODEM OK!!!]\n");
		Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0x00ff);
	}
		
	else if (temp == 0x00ee)
	{
		printf("[AP transfer data to SDRAM]\n");

		rx_buf = (u32 *)(MSM_RX_BUFFER+(g_MsmDataCnt*AP_TX_BUFLEN));
		rx_data = (u32 *)(MSM_RX_Queue);
		//printf("rx_buf = 0x%x, rx_data = 0x%x\n", rx_buf, rx_data);

		for (lengh = 0 ; lengh <= AP_TX_BUFLEN ; lengh++)
			*(u32 *)(rx_buf++) = *(rx_data++);

		printf("[g_MsmDataCnt= 0x%x ]\n", g_MsmDataCnt);	
		g_MsmDataCnt++;

		//if(g_MsmDataCnt < BLK_COUNT)
		if(g_MsmDataCnt <= BLK_COUNT)
			Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0x00ee);
		else
			Outp16(DPSRAM_BASE_MODEM+INT2AP_ADR, 0x0011);

	}

	else if (temp == 0x0011)
	{
		printf("[MODEM RX Done]\n");
	}

	else
		printf("Error = 0x%04x\n",temp);		
	
	INTC_ClearVectAddr();

}


//for AP ISR
void __irq Isr_MODEM2AP(void)
{
	u32 lengh, temp;
	u32 *rx_data, *rx_buf;

	INTC_Disable(NUM_MSM);
	
	temp = (Inp16(DPSRAM_BASE_AP + INT2AP_ADR))&0xffff;
	MODEMIF_IntClear_Int2AP();

	//////////////////////////////
	////// MODEM TX ISR //////////
	/////////////////////////////
	
	if( temp == 0xff00)
	{
		//printf("[MODEM start data transfer]\n");

		rx_buf = (u32 *)(AP_RX_BUFFER);
		rx_data = (u32 *)(AP_RX_Queue);
		//printf("rx_buf = 0x%x, rx_data = 0x%x\n", rx_buf, rx_data);

		#if 1	// C code

			for (lengh = 0 ; lengh <= MODEM_TX_BUFLEN ; lengh++)
				*(u32 *)(rx_buf++) = *(rx_data++);

		#else	// Assembly


		#endif

		g_ApDataCnt++;

		if(g_ApDataCnt < DMA_COUNT)
			Outp16(DPSRAM_BASE+INT2MSM_ADR, 0xee00);
		else
			Outp16(DPSRAM_BASE+INT2MSM_ADR, 0x1100);
	}
	
	else if(temp == 0xee00)
	{
		//printf("\n[AP transfer data to SDRAM]\n");
		
		rx_buf = (u32 *)(AP_RX_BUFFER+(g_ApDataCnt*MODEM_TX_BUFLEN));
		rx_data = (u32 *)(AP_RX_Queue);
		//printf("rx_buf = 0x%x, rx_data = 0x%x\n", rx_buf, rx_data);

		#if 1	// C code
		
			for (lengh = 0 ; lengh <= MODEM_TX_BUFLEN ; lengh++)
				*(u32 *)(rx_buf++) = *(rx_data++);
			
		#else	// Assembly


		#endif
		
		//printf("[CNT= 0x%x ]\n", g_ApDataCnt);	
		g_ApDataCnt++;

		if(g_ApDataCnt < DMA_COUNT)
			Outp16(DPSRAM_BASE+INT2MSM_ADR, 0xee00);
		else
			Outp16(DPSRAM_BASE+INT2MSM_ADR, 0x1100);

	}

	else if(temp == 0x1100)
	{
		//printf("[AP completed data reading]\n");
	}

	/////////////////////
	////// AP TX ISR /////
	////////////////////
	else if (temp == 0x00ff)
	{
		printf("MODEM RX READY OK....\n");
		g_MsmReadDone = 1;
	}

	else if (temp == 0x00ee)
	{
		printf("MODEM RX....\n");
		g_MsmReadDone = 1;
		//printf("\n[MODEM READ OK], g_MsmReadDone = 0x%x\n", g_MsmReadDone);
	}	

	else if (temp == 0x0011)
	{
		printf("[AP TX Done!!!]\n");
		//Outp16(DPSRAM_BASE+INT2MSM_ADR, 0x0011);
	}
	
	else
	printf("[Error!!!: 0x%x ]\n",temp);	

	INTC_Enable(NUM_MSM);
	INTC_ClearVectAddr();

}

void MODEMIF_Int2AP(u32 int_add)
{
	Outp32(rINT2AP, int_add);
}

void MODEMIF_Int2Modem(u32 int_add)
{
	Outp32(rINT2MSM, int_add);
}
void MODEMIF_IntClear_Int2AP(void)
{
	Outp32(rMSMINTCLR, 0xffff);
}

u16 MODEMIF_IntClear_Int2MSM(void)
{
	u16 temp;

	temp = (Inp16(DPSRAM_BASE_MODEM+INT2MSM_ADR))&0xffff;
	Outp16(DPSRAM_BASE_MODEM+INT2MSM_ADR, temp);

	return temp;
}

void MODEMIF_Set_Modem_Booting_Port(void)
{
	//Set MODEM I/F GPIO Port
	GPIO_SetFunctionAll(eGPIO_N, 0x55555555, 0);	 //GPN3 : AP Reset, GPN8 : MODEM Reset Output
}

void MODEMIF_SetPort(void)
{
	//Set MODEM I/F GPIO Port
	GPIO_SetFunctionAll(eGPIO_K, 0x22222222, 0x22222222);	 //GPN[31:0] -> DATA[15:0]
	GPIO_SetFunctionAll(eGPIO_L, 0x22222222, 0x2222222);	 //GPN[31:0] -> ADDR[17:0]
	GPIO_SetFunctionAll(eGPIO_M, 0x222222, 0);	 //GPM[23:0] -> HOST I/F CS, CSn_MAIN, CSn_SUB, WEn, OEn, INTRn
	GPIO_SetFunctionAll(eGPIO_N, 0x55555555, 0);	 //GPN3 : AP Reset, GPN8 : MODEM Reset Output
}

void MODEMIF_MODEM_Reset(void)
{
	GPIO_SetDataEach(eGPIO_N, eGPIO_8, 1);
	Delay(10);
	GPIO_SetDataEach(eGPIO_N, eGPIO_8, 0);
	Delay(10);
	GPIO_SetDataEach(eGPIO_N, eGPIO_8, 1);
	Delay(10);
}

void MODEMIF_AP_Reset(void)
{
	GPIO_SetDataEach(eGPIO_N, eGPIO_3, 1);
	Delay(10);
	GPIO_SetDataEach(eGPIO_N, eGPIO_3, 0);
	Delay(10);
	GPIO_SetDataEach(eGPIO_N, eGPIO_3, 1);
	Delay(10);
}

void MODEMIF_AP_Init(bool INT2MSMEN, bool INT2APEN)
{
	// Modem I/F Set Port
	MODEMIF_SetPort();

	//Interrupt Setting (MODEM, EINT)Isr_AP2MODEM
	INTC_SetVectAddr(NUM_MSM, Isr_MODEM2AP);		// for Modem Rx
	INTC_Enable(NUM_MSM);

	//MODEM I/F Interrupt enable
	Outp32(rMIFCON, (INT2MSMEN<<3)|(INT2APEN<<2));

	//INT Address Setting
	//MODEMIF_Int2AP(INT2AP_ADR);		
	//MODEMIF_Int2Modem(INT2MSM_ADR);

	//INT2AP Clear
	MODEMIF_IntClear_Int2AP();
}

void MODEMIF_MODEM_Init(bool INT2MSMEN, bool INT2APEN)
{
	//write
	//*(volatile unsigned *)0x70000004 =(0<<28)|(1<<24)|(0x3<<16)|(0<<12)|(1<<8)|(0<<4)|(0<<0);
	*(volatile unsigned *)0x70000004 =(0<<28)|(2<<24)|(0x7<<16)|(1<<12)|(2<<8)|(0<<4)|(0<<0);

 	// ROM Bus 16bit setting
	SYSC_16bitBUS();
	
	// Modem I/F Interrupt request GPIO setting
	GPIO_SetPullUpDownEach(eGPIO_N, eGPIO_4, 0x0); // Pull Down Disable
	GPIO_SetEint0(4, Falling_Edge, eDLYFLT, 0);

	// Interrupt Setting (MODEM : EINT)
	INTC_SetVectAddr(NUM_EINT1, Isr_AP2MODEM);		// NUM_EINT1 : Eint[11:4]
	INTC_Enable(NUM_EINT1);

	// MODEM I/F Interrupt enable
	Outp32(rMIFCON, (INT2MSMEN<<3)|(INT2APEN<<2));

	// Clear the previous pending states
	GPIO_EINT0ClrPend(4);
	GPIO_EINT0DisMask(4);

	// AP2MODEM Interrupt Clear
	MODEMIF_IntClear_Int2MSM();
}

⌨️ 快捷键说明

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