📄 main.c
字号:
/****************************************************************************
* file name : main.c
* By : hugang, hgx2000@mail.china.com
****************************************************************************/
#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 "../net/armnet.h"
volatile char which_int=0;
unsigned char default_mac[MACLEN] = {0x12,0x34,0x56,0x78,0x90,0xab};
NODE locnode;
unsigned int SERIAL_BAUD = 115200;
ETHERFRAME etherframe;
void __irq Eint3Isr(void)
{
unsigned short rxlen,ip_len;
unsigned char net_isr;
ARPKT *arp;
ETHERFRAME *efp;
IPKT *ip;
efp = ðerframe;
rI_ISPC = BIT_EINT3;
NET_INTERRUPT_DISABLE;
EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_STOP;
net_isr = EN_ISR;
if(net_isr & ENISR_RX)
{
DEBUGF(DEMO_DEBUG,("Rtl8019 Interrupted RX\n"));
EN_ISR |= ENISR_RX;
memset((unsigned char *)efp, 0, sizeof(ETHERFRAME));
rxlen = GetEthernet(efp);
SwapEther(efp);
if(IsArp(efp, rxlen))
{
arp = (ARPKT *)(efp->edata);
if(arp->op==ARPREQ && READ_PACKED(arp->dip)==locnode.ip)
{
DEBUGF(DEMO_DEBUG,("Get ARP REQUEST\n"));
ArpRcvPacket(efp);
}
}
else
{
ip_len = IsIp(efp, rxlen);
if(ip_len)
{
ip = (IPKT *)(efp->edata);
DEBUGF(DEMO_DEBUG,("Get IP\n"));
if(IsIcmp(ip, ip_len))
{
DEBUGF(ICMP_DEBUG,("Get ICMP\n"));
IcmpRcvPacket(efp);
}
else if(IsUdp(ip, ip_len))
{
DEBUGF(DEMO_DEBUG,("Get UDP\n"));
UdpRcvPacket(efp);
}
}
}
}
if(net_isr & ENISR_RX_ERR)
{
DEBUGF(DEMO_DEBUG,("Rtl8019 Interrupted RX_ERR\n"));
EN_ISR |= ENISR_RX_ERR;
}
if(net_isr & ENISR_TX)
{
DEBUGF(DEMO_DEBUG,("Rtl8019 Interrupted TX\n"));
EN_ISR |= ENISR_TX;
}
if(net_isr & ENISR_TX_ERR)
{
DEBUGF(DEMO_DEBUG,("Rtl8019 Interrupted TX_ERR\n"));
EN_ISR |= ENISR_TX_ERR;
}
EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;
NET_INTERRUPT_ENABLE;
}
//***************************************************************************
/****************************************************************************
【功能说明】中断初始化
****************************************************************************/
void Isr_Init(void)
{
rINTCON = 0x1; //中断控制寄存器设置
rINTMOD=0x0; // All=IRQ mode
rINTMSK=~(BIT_GLOBAL); //中断有效
}
void IsrNetInit(void)
{
pISR_EINT3 = (int)Eint3Isr;
rPCONG = rPCONG | 0x00c0;
rPUPG = rPUPG & 0xf7;
rEXTINT |= 0x4000;
NET_INTERRUPT_ENABLE;
}
//***************************************************************************
void NodeInit(void)
{
locnode.ip = IP4_ADDR(192,168,111,8);
locnode.mask = IP4_ADDR(255,255,255,0);
locnode.gate = IP4_ADDR(192,168,111,1);
memcpy(locnode.mac,default_mac,6);
locnode.port = 9000;
}
/****************************************************************************
【功能说明】系统主函数
****************************************************************************/
void Main(void)
{
rSYSCFG=SYSCFG_8KB; //使用8K字节的指令缓存
rNCACHBE0=((unsigned int)(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);
//在上面的数据区域不使用高速缓存
Port_Init(); //IO端口功能、方向设定
Led_Disp(); //LED来回闪烁显示
ChangePllValue(56,2,1); //修改系统主频为8倍频
Uart_Init(0,SERIAL_BAUD); //异步串行口初始化,设置波特率为115200
Delay(0);
Isr_Init(); //中断初始化
NodeInit();
ArpInit();
ResetNic();
IsrNetInit();
while(1);
}
//***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -