📄 main.c
字号:
/****************************************************************************
【文 件 名 称】main.c
【功 能 描 述】三星S3C44B0X板demo程序代码
【程 序 版 本】4.0
【创建人及创建日期】hugnag//2002年11月19日19:26
【修改人及修改日期】hugnag//2003年4月26日20:24
****************************************************************************/
//***************************************************************************
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\cache.h"
#include "..\inc\rtc.h"
#include "..\inc\lcd.h"
#include "..\inc\adc.h"
#include "..\inc\timer.h"
#include "..\inc\LCD_Bmp.h"
#include "..\net\necfg.h"
#include "..\net\ne2000.h"
#include "..\net\ip.h"
#include "..\net\udp.h"
extern unsigned char mymac[MACLEN];
volatile char which_int=0;
unsigned char arp_received=0;
unsigned char icmp_received=0;
unsigned char tftp_start;
unsigned char default_mac[MACLEN] = {0x12,0x34,0x56,0x78,0x90,0xab};
unsigned char rem_mac[MACLEN] = {0x00,0x50,0xba,0x74,0x21,0x28};
NODE locnode;
NODE remnode;
ETHERFRAME etherframe;
//***************************************************************************
/****************************************************************************
【功能说明】中断响应函数
****************************************************************************/
void __irq Eint4567Isr(void)
{
unsigned char c_cr;
unsigned int i;
unsigned char *data;
short txlen;
unsigned short rxlen;
char *filename;
char *mode;
which_int = rEXTINTPND;
rEXTINTPND = 0xf; //clear EXTINTPND reg.
rI_ISPC = BIT_EINT4567; //clear pending_bit
Delay(500); //延时若干个100us,消除抖动
rPCONG &= 0x00ff;
if( (rPDATG&0xf0) != 0xf0)
{
switch(which_int)
{
case 1:
{
/*
EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_STOP;
c_cr = EN_CR;
Uart_Printf("en_cr= %x\n",c_cr);
c_cr = EN_CLDA0;
Uart_Printf("en_clda0= %x\n",c_cr);
c_cr = EN_CLDA1;
Uart_Printf("en_clda1= %x\n",c_cr);
c_cr = EN_BNRY;
Uart_Printf("en_bnry= %x\n",c_cr);
c_cr = EN_TSR;
Uart_Printf("en_tsr= %x\n",c_cr);
c_cr = EN_NCR;
Uart_Printf("en_ncr= %x\n",c_cr);
c_cr = EN_FIFO;
Uart_Printf("en_fifo= %x\n",c_cr);
c_cr = EN_ISR;
Uart_Printf("en_isr= %x\n",c_cr);
c_cr = EN_CRDA0;
Uart_Printf("en_crda0= %x\n",c_cr);
c_cr = EN_CRDA1;
Uart_Printf("en_crda1= %x\n",c_cr);
c_cr = EN_8019ID0;
Uart_Printf("en_8019id0= %x\n",c_cr);
c_cr = EN_8019ID1;
Uart_Printf("en_8019id1= %x\n",c_cr);
c_cr = EN_RSR;
Uart_Printf("en_rsr= %x\n",c_cr);
c_cr = EN_CNTR0;
Uart_Printf("en_cntr0= %x\n",c_cr);
c_cr = EN_CNTR1;
Uart_Printf("en_cntr1= %x\n",c_cr);
c_cr = EN_CNTR2;
Uart_Printf("en_cntr2= %x\n\n",c_cr);
EN_CR = ENCR_PAGE1 + ENCR_NODMA + ENCR_STOP;
c_cr = EN_CR;
Uart_Printf("en_cr= %x\n",c_cr);
c_cr = EN_PAR0;
Uart_Printf("en_par0= %x\n",c_cr);
c_cr = EN_PAR1;
Uart_Printf("en_par1= %x\n",c_cr);
c_cr = EN_PAR2;
Uart_Printf("en_par2= %x\n",c_cr);
c_cr = EN_PAR3;
Uart_Printf("en_par3= %x\n",c_cr);
c_cr = EN_PAR4;
Uart_Printf("en_par4= %x\n",c_cr);
c_cr = EN_PAR5;
Uart_Printf("en_par5= %x\n",c_cr);
c_cr = EN_CURR;
Uart_Printf("en_curr= %x\n",c_cr);
c_cr = EN_MAR0;
Uart_Printf("en_mar0= %x\n",c_cr);
c_cr = EN_MAR1;
Uart_Printf("en_mar1= %x\n",c_cr);
c_cr = EN_MAR2;
Uart_Printf("en_mar2= %x\n",c_cr);
c_cr = EN_MAR3;
Uart_Printf("en_mar3= %x\n",c_cr);
c_cr = EN_MAR4;
Uart_Printf("en_mar4= %x\n",c_cr);
c_cr = EN_MAR5;
Uart_Printf("en_mar5= %x\n",c_cr);
c_cr = EN_MAR6;
Uart_Printf("en_mar6= %x\n",c_cr);
c_cr = EN_MAR7;
Uart_Printf("en_mar7= %x\n\n",c_cr);
EN_CR = ENCR_PAGE2 + ENCR_NODMA + ENCR_STOP;
c_cr = EN_CR;
Uart_Printf("en_cr= %x\n",c_cr);
c_cr = EN_PSTART;
Uart_Printf("en_pstart= %x\n",c_cr);
c_cr = EN_PSTOP;
Uart_Printf("en_pstop= %x\n",c_cr);
c_cr = EN_TPSR;
Uart_Printf("en_tpsr= %x\n",c_cr);
c_cr = EN_RCR;
Uart_Printf("en_rcr= %x\n",c_cr);
c_cr = EN_TCR;
Uart_Printf("en_tcr= %x\n",c_cr);
c_cr = EN_DCR;
Uart_Printf("en_dcr= %x\n",c_cr);
c_cr = EN_IMR;
Uart_Printf("en_imr= %x\n\n",c_cr);
EN_CR = ENCR_PAGE3 + ENCR_NODMA + ENCR_STOP;
c_cr = EN_CR;
Uart_Printf("en_cr= %x\n",c_cr);
c_cr = EN_9346CR;
Uart_Printf("en_9346cr = %x\n",c_cr);
c_cr = EN_BPAGE;
Uart_Printf("en_bpage = %x\n",c_cr);
c_cr = EN_CONFIG0;
Uart_Printf("en_config0 = %x\n",c_cr);
c_cr = EN_CONFIG1;
Uart_Printf("en_config1 = %x\n",c_cr);
c_cr = EN_CONFIG2;
Uart_Printf("en_config2 = %x\n",c_cr);
c_cr = EN_CONFIG3;
Uart_Printf("en_config3 = %x\n",c_cr);
c_cr = EN_INTR;
Uart_Printf("en_intr = %x\n",c_cr);
c_cr = EN_CONFIG4;
Uart_Printf("en_config4 = %x\n\n\n",c_cr);
*/
Uart_Printf("\nGet_Etherner\n");
rxlen = Get_Ethernet(ðerframe);
data = (unsigned char *)ðerframe;
for(i=0;i<rxlen;i++)
{
Uart_Printf("%2.2x ", data[i]);
}
}
break;
case 2:
{
Uart_Printf("\nUDP test\n");
txlen = Make_UDP(ðerframe, &locnode, &remnode, 10);
Put_Ethernet(ðerframe, txlen); /* Send packet */
data = (unsigned char *)ðerframe;
for(i=0;i<txlen;i++)
{
Uart_Printf("%2.2x ",data[i]);
}
}
break;
case 4:
{
Uart_Printf("\n\n regsier\n");
EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;
c_cr = EN_CLDA0;
Uart_Printf("en_clda0= %x\n",c_cr);
c_cr = EN_CLDA1;
Uart_Printf("en_clda1= %x\n",c_cr);
c_cr = EN_CRDA0;
Uart_Printf("en_crda0= %x\n",c_cr);
c_cr = EN_CRDA1;
Uart_Printf("en_crda1= %x\n",c_cr);
c_cr = EN_BNRY;
Uart_Printf("en_bnry= %x\n",c_cr);
c_cr = EN_ISR;
Uart_Printf("en_isr= %x\n",c_cr);
EN_CR = ENCR_PAGE1 + ENCR_NODMA + ENCR_START;
c_cr = EN_CURR;
Uart_Printf("en_curr= %x\n",c_cr);
EN_CR = ENCR_PAGE2 + ENCR_NODMA + ENCR_START;
c_cr = EN_DCR;
Uart_Printf("en_dcr= %x\n",c_cr);
}
break;
case 8:
{
Uart_Printf("\n\nMake TFTP Test\n");
locnode.port = 1069;
remnode.port = 69;
filename = "model.txt";
mode = "octet";
memset((unsigned char *)ðerframe, 0, 100);
txlen = Make_TFTP_Req(ðerframe, &locnode, &remnode, TFTP_OP_WRITE, filename, mode);
Put_Ethernet(ðerframe, txlen); /* Send packet */
data = (unsigned char *)ðerframe;
for(i=0;i<txlen;i++)
{
Uart_Printf("%2.2x ",data[i]);
}
Uart_Printf("\n");
}
break;
default :
break;
}
Beep(1800); //蜂鸣器鸣叫若干个100us
}
while((rPDATG&0xf0) != 0xf0); //按键没有松开就一直等待
rPCONG = rPCONG | 0xff00; //GPG4、5、6、7设为中断引脚
}
void __irq Eint3Isr(void)
{
unsigned char *data;
unsigned short rxlen,ip_len,icmp_len,udp_len;
unsigned int i;
ARPKT *arp;
ETHERFRAME *efp;
IPKT *ip;
ICMPKT *icmp;
efp = ðerframe;
rI_ISPC = BIT_EINT3;
rINTMSK = rINTMSK | BIT_EINT3;
EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_STOP;
Delay(100);
if(EN_ISR & ENISR_RX)
{
Uart_Printf("\n\nRtl8019 Interrupted RX\n");
EN_ISR |= ENISR_RX;
rxlen = Get_Ethernet(efp);
data = (unsigned char *)efp;
for(i=0;i<rxlen;i++)
{
Uart_Printf("%2.2x ", data[i]);
}
Uart_Printf("\n");
Swap_Ether(efp);
if(Is_ARP(efp, rxlen))
{
arp = (ARPKT *)(efp->edata);
if(arp->op==ARPREQ && Get_ARP_Destip(arp)==locnode.ip)
{
Uart_Printf("Get ARP REQUEST\n");
arp_received = 1;
}
}
ip_len = Is_IP(efp, rxlen);
if(ip_len)
{
ip = (IPKT *)(efp->edata);
Uart_Printf("Get IP\n");
icmp_len = Is_ICMP(ip, ip_len);
if(icmp_len)
{
Uart_Printf("Get ICMP\n");
icmp = (ICMPKT *)(efp->edata);
if(icmp->c.type == ICREQ)
{
Uart_Printf("Get ICMP ECHO_REQUEST\n");
icmp_received = 1;
}
}
udp_len = Is_UDP(ip, ip_len);
if(udp_len)
{
Uart_Printf("Get UDP\n");
Get_UDP_Dest(efp, &locnode);
Get_UDP_Srce(efp, &remnode);
if(locnode.port == TFTPORT)
{
Uart_Printf("Get TFPT\n");
tftp_start ++;
}
}
}
}
if(EN_ISR & ENISR_RX_ERR)
{
Uart_Printf("\nRtl8019 Interrupted RX_ERR\n");
EN_ISR |= ENISR_RX_ERR;
}
if(EN_ISR & ENISR_TX)
{
Uart_Printf("\nRtl8019 Interrupted TX\n");
EN_ISR |= ENISR_TX;
}
if(EN_ISR & ENISR_TX_ERR)
{
Uart_Printf("\nRtl8019 Interrupted TX_ERR\n");
EN_ISR |= ENISR_TX_ERR;
}
EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;
rINTMSK = rINTMSK & (~BIT_EINT3);
}
//***************************************************************************
/****************************************************************************
【功能说明】中断初始化
****************************************************************************/
void Isr_Init(void)
{
rINTCON = 0x1; //中断控制寄存器设置
rINTMOD=0x0; // All=IRQ mode
pISR_EINT4567 = (int)Eint4567Isr;
rPCONG = rPCONG | 0xff00; //GPG4、5、6、7设为中断引脚
rPUPG = rPUPG & 0x0f; //GPG4、5、6、7上拉电阻有效
rEXTINT=0x0; //低电平触发
rINTMSK=~(BIT_GLOBAL|BIT_EINT4567); //中断有效
}
void Isr_RTL8019_Init(void)
{
pISR_EINT3 = (int)Eint3Isr;
rPCONG = rPCONG | 0x00c0;
rPUPG = rPUPG & 0xf7;
rEXTINT |= 0x4000;
rINTMSK = rINTMSK & (~BIT_EINT3);
}
//***************************************************************************
void Node_Init(void)
{
locnode.ip = 0xc0a86f08;
locnode.mask = 0xffffff00;
locnode.gate = 0xc0a86f01;
memcpy(locnode.mac,default_mac,6);
memcpy(mymac,default_mac,6);
locnode.port = 9000;
remnode.ip = 0xc0a86fbc;
remnode.mask = 0xffffff00;
remnode.gate = 0xc0a86f01;
memcpy(remnode.mac,rem_mac,6);
remnode.port = 8000;
}
/****************************************************************************
【功能说明】系统主函数
****************************************************************************/
void Main(void)
{
unsigned char *data;
unsigned short txlen;
unsigned int i;
ARPKT *arp;
ETHERFRAME *efp;
ICMPKT *icmp;
TFTP_DATA *tftpd;
efp = ðerframe;
rSYSCFG=SYSCFG_8KB; //使用8K字节的指令缓存
rNCACHBE0=((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);
//在上面的数据区域不使用高速缓存
Port_Init(); //IO端口功能、方向设定
Led_Disp(); //LED来回闪烁显示
ChangePllValue(56,2,1); //修改系统主频为8倍频
Uart_Init(0,115200); //异步串行口初始化,设置波特率为115200
Delay(0);
Isr_Init(); //中断初始化
Node_Init();
Reset_NIC();
Isr_RTL8019_Init();
while(1){
if(arp_received == 1)
{
arp = (ARPKT *)(efp->edata);
remnode.ip = Get_ARP_Srceip(arp); /* Make ARP response */
memcpy(remnode.mac, (unsigned char *)arp->smac, MACLEN);
txlen = Make_ARP(efp, &locnode, &remnode, ARPRESP);
Uart_Printf("Put ARP REPLY\n");
data = (unsigned char*)efp;
for(i=0;i<txlen;i++)
{
Uart_Printf("%2.2x ",data[i]);
}
Uart_Printf("\n");
Put_Ethernet(efp, txlen); /* Send packet */
arp_received = 0;
}
if(icmp_received == 1)
{
icmp = (ICMPKT *)(efp->edata);
Uart_Printf("Put ICMP ECHO_REPLY\n");
txlen = Make_ICMP(efp, &locnode, &remnode, ICREP, 0, icmp->c.ident, icmp->c.seq, 0);
data = (unsigned char*)efp;
for(i=0;i<txlen;i++)
{
Uart_Printf("%2.2x ",data[i]);
}
Uart_Printf("\n");
Put_Ethernet(ðerframe, txlen); /* Send packet */
icmp_received = 0;
}
if(tftp_start == 1)
{
tftpd = (TFTP_DATA *)(efp->edata);
Uart_Printf("Put TFTP ACK\n");
locnode.port = 1077;
memset((unsigned char *)efp, 0, 100);
txlen = Make_TFTP_Ack(efp, &locnode, &remnode, TFTP_OP_ACK, 0);
data = (unsigned char*)efp;
for(i=0;i<txlen;i++)
{
Uart_Printf("%2.2x ",data[i]);
}
Uart_Printf("\n");
Put_Ethernet(ðerframe, txlen); /* Send packet */
tftp_start = 0;
}
}
}
//***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -