?? 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 "../inc/rtc.h"
#include "../net/armnet.h"
#include "../inc/shell.h"
#include "../inc/flash.h"
#include "../inc/nand.h"
volatile char which_int=0;
unsigned char default_mac[MACLEN] = {0x12,0x34,0x56,0x78,0x90,0xab};
NODE locnode;
unsigned int SERIAL_BAUD = 115200; //串口波特率設定
#ifdef SDT251
ETHERFRAME etherframe;
#endif
#ifdef ADS120
ETHERFRAME __align(4) etherframe;
#endif
TIME_STRUC SysTime;
unsigned int IP_ADDRESS;
unsigned int GATE_ADDRESS;
unsigned int MASK_ADDRESS;
unsigned char MCLK_M;
unsigned char MCLK_P;
unsigned char MCLK_S;
unsigned long prog_s_addr;
unsigned long prog_r_addr;
unsigned int download_addr;
unsigned int download_begin;
unsigned int download_end;
unsigned int download_len;
extern char *WeekDay[7] ;
void NetSever(void)
{
unsigned short rxlen,ip_len;
unsigned char net_isr;
ARPKT *arp;
ETHERFRAME *efp;
IPKT *ip;
efp = ðerframe;
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(READ_PACKED(arp->dip)==locnode.ip &&(arp->op==ARPREQ || arp->op==ARPRESP))
{
DEBUGF(ARP_DEBUG,("Get ARP\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;
}
}
//***************************************************************************
void NodeInit(void)
{
ResetNic();
locnode.ip = IP_ADDRESS;
locnode.mask = MASK_ADDRESS;
locnode.gate = GATE_ADDRESS;
memcpy(locnode.mac,default_mac,6);
locnode.port = 9000;
}
void NetIntPreInit(void)
{
rPCONG = rPCONG | 0x00c0;
rPUPG = rPUPG & 0xf7;
rEXTINT |= 0x4000;
}
/****************************************************************************
【功能說明】系統主函數
****************************************************************************/
void Main(void)
{
rSYSCFG = SYSCFG_8KB; //使用8K字節的指令緩存
rNCACHBE0 = ((unsigned int)(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);
//在上面的數據區域不使用高速緩存
Port_Init(); //IO端口功能、方向設定
#if (defined FS44B0)||(defined ST44B0)
rPCONC &= ~(0xf<<16);
rPCONC |= 0x5<<16; //FS4B0,ST44B0中GPC8,9作LCD控制
rPDATC |= (1<<8); //LCD-OFF
rPDATC |= (1<<9); //1 for ST44B0, 0 for FS44B0 BACK-LIGHT ON
#endif
rPCONG &= 0x00ff;
if(LoadEnv(0, NULL)) {
MCLK_M = 114; MCLK_P = 8; MCLK_S = 1;
ChangePllValue(MCLK_M,MCLK_P,MCLK_S); //修改系統主頻為61MHz
SERIAL_BAUD = 115200;
Uart_Init(0,SERIAL_BAUD); //異步串行口初始化,設置波特率為115200
IP_ADDRESS = IP4_ADDR(192,168,0,100);
MASK_ADDRESS = IP4_ADDR(255,255,255,0);
GATE_ADDRESS = IP4_ADDR(192,168,0,1);
}
Delay(0); //利用系統時鐘校準延時函數
Led_Disp(); //LED來回閃爍顯示
NodeInit();
NetIntPreInit();
ArpInit();
Uart_Select(0);
Uart_Printf("\n **************************************\n");
Uart_Printf("* *\n");
Uart_Printf("* BIOS for FS44B0 CORE Board V2.00 *\n");
Uart_Printf("* Http://www.uCdragon.com *\n");
Uart_Printf("* *\n");
Uart_Printf(" ***************************************\n");
GetFlashID();
GetNandFlashChip();
// Uart_Printf("IP address : %u.%u.%u.%u\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&0xff);
Uart_Printf("Build date : %s--%s\n", __DATE__, __TIME__);
// Uart_Printf(__DATE__);
// Uart_Printf( "--" );
// Uart_Printf(__TIME__);
// Uart_Printf("\n");
// RtcGetTime(&SysTime);
// Uart_Printf("Current date: %d-%x-%x %s\n", SysTime.year, SysTime.month, SysTime.day, WeekDay[SysTime.weekday]);
// Uart_Printf("Current time: %2x:%2x:%2x\n", SysTime.hour, SysTime.min, SysTime.sec);
ShellIn();
}
//***************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -