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