687 lines
14 KiB
C
687 lines
14 KiB
C
|
|
|
|||
|
|
#define _IN_ETHERNET_C
|
|||
|
|
#include "ethernet.h"
|
|||
|
|
#include "inout.h"
|
|||
|
|
#include "delay.h"
|
|||
|
|
#include "tcpserver.h"
|
|||
|
|
#include "tcpclient.h"
|
|||
|
|
#include "udptrans.h"
|
|||
|
|
#include "trigger.h"
|
|||
|
|
#include "cpuid.h"
|
|||
|
|
#include "crc16.h"
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
void W5500IntConfig(void);
|
|||
|
|
void RegNetCallBack(void);
|
|||
|
|
void LoadDefNetParas(void);
|
|||
|
|
int ChipParaConfig(void);
|
|||
|
|
void NetworkParaConfig(void);
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
void InitEthernet(void)
|
|||
|
|
{
|
|||
|
|
W5500IntConfig(); // <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
InitWNetSpi(); // <20><>ʼ<EFBFBD><CABC>SpiͨѶ
|
|||
|
|
|
|||
|
|
RegNetCallBack(); // <20><><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
LoadDefNetParas(); // Ĭ<>ϲ<EFBFBD><CFB2><EFBFBD>
|
|||
|
|
|
|||
|
|
InitNetConfig(); // <20><><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void InitNetConfig(void)
|
|||
|
|
{
|
|||
|
|
ChipParaConfig(); // оƬ<D0BE><C6AC><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
#if (SERVER_NUM > 0)
|
|||
|
|
InitTcpServer();
|
|||
|
|
SetTcpKeepAlive();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if (CLIENT_NUM > 0)
|
|||
|
|
InitTcpClient();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
NetworkParaConfig(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// W5500 <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void W5500IntConfig(void)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD>
|
|||
|
|
#define SPI_CrisEnter EnterCritical
|
|||
|
|
|
|||
|
|
// <20>˳<EFBFBD><CBB3>ٽ<EFBFBD><D9BD><EFBFBD>
|
|||
|
|
#define SPI_CrisExit ExitCritical
|
|||
|
|
|
|||
|
|
// Ƭѡ<C6AC>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ
|
|||
|
|
#define SPI_CS_Select WNetNceOn
|
|||
|
|
|
|||
|
|
// Ƭѡ<C6AC>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
|
|||
|
|
#define SPI_CS_Deselect WNetNceOff
|
|||
|
|
|
|||
|
|
#define SPI_ReadByte WNetSpiReadByte
|
|||
|
|
|
|||
|
|
#define SPI_WriteByte WNetSpiWriteByte
|
|||
|
|
|
|||
|
|
|
|||
|
|
void RegNetCallBack(void)
|
|||
|
|
{
|
|||
|
|
// ע<><D7A2><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);
|
|||
|
|
|
|||
|
|
// ע<><D7A2>SPIƬѡ<C6AC>źź<C5BA><C5BA><EFBFBD>
|
|||
|
|
reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);
|
|||
|
|
|
|||
|
|
// ע<><D7A2><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte);
|
|||
|
|
|
|||
|
|
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
// reg_wizchip_spiburst_cbfunc(,);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
void SetNetAddr(u32 ip, u32 mask, u32 gateway, u32 dns)
|
|||
|
|
{
|
|||
|
|
// ԴIP<49><50>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49><50>
|
|||
|
|
g_netInfo.ip[0] = GETIP1(ip);
|
|||
|
|
g_netInfo.ip[1] = GETIP2(ip);
|
|||
|
|
g_netInfo.ip[2] = GETIP3(ip);
|
|||
|
|
g_netInfo.ip[3] = GETIP4(ip);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
g_netInfo.sn[0] = GETIP1(mask);
|
|||
|
|
g_netInfo.sn[1] = GETIP2(mask);
|
|||
|
|
g_netInfo.sn[2] = GETIP3(mask);
|
|||
|
|
g_netInfo.sn[3] = GETIP4(mask);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>IP
|
|||
|
|
g_netInfo.gw[0] = GETIP1(gateway);
|
|||
|
|
g_netInfo.gw[1] = GETIP2(gateway);
|
|||
|
|
g_netInfo.gw[2] = GETIP3(gateway);
|
|||
|
|
g_netInfo.gw[3] = GETIP4(gateway);
|
|||
|
|
|
|||
|
|
// DNS<4E><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP
|
|||
|
|
g_netInfo.dns[0] = GETIP1(dns);
|
|||
|
|
g_netInfo.dns[1] = GETIP2(dns);
|
|||
|
|
g_netInfo.dns[2] = GETIP3(dns);
|
|||
|
|
g_netInfo.dns[3] = GETIP4(dns);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// ͨ<><CDA8>CPUID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
void MakeMacAddr(u8 * mac)
|
|||
|
|
{
|
|||
|
|
CpuId cpuid;
|
|||
|
|
u16 crc;
|
|||
|
|
u8 chrcksum;
|
|||
|
|
|
|||
|
|
GetCpuID(&cpuid);
|
|||
|
|
|
|||
|
|
crc = CalcCrc16(cpuid.buff, CPUID_LEN);
|
|||
|
|
|
|||
|
|
chrcksum = CalcCheckSum(cpuid.buff, CPUID_LEN);
|
|||
|
|
|
|||
|
|
if (mac != NULL)
|
|||
|
|
{
|
|||
|
|
mac[0] = 0x52;
|
|||
|
|
mac[1] = 0x50; // <20>Զ<EFBFBD><D4B6>峧<EFBFBD><E5B3A7><EFBFBD><EFBFBD> "RP"
|
|||
|
|
mac[2] = 0x4E; // <20><>Ʒ<EFBFBD><C6B7>ʶ<EFBFBD><CAB6>N<EFBFBD><4E>
|
|||
|
|
mac[3] = HIBYTE(crc);
|
|||
|
|
mac[4] = LOBYTE(crc);
|
|||
|
|
mac[5] = chrcksum;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void LoadDefNetParas(void)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
g_phyConfig.by = PHY_CONFBY_SW; // ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
g_phyConfig.mode = PHY_MODE_MANUAL; // <20>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
g_phyConfig.speed = PHY_SPEED_100; // 100
|
|||
|
|
g_phyConfig.duplex = PHY_DUPLEX_FULL; // ȫ˫<C8AB><CBAB>
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// Դ<><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
|
MakeMacAddr(g_netInfo.mac);
|
|||
|
|
|
|||
|
|
g_localIP = LOCAL_IP;
|
|||
|
|
g_netMask = NET_MASK;
|
|||
|
|
g_gateWay = GATE_WAY;
|
|||
|
|
g_dnsIP = DNS_IP;
|
|||
|
|
|
|||
|
|
SetNetAddr(g_localIP, g_netMask, g_gateWay, g_dnsIP);
|
|||
|
|
|
|||
|
|
// DHCPģʽ
|
|||
|
|
g_netInfo.dhcp = NETINFO_STATIC;
|
|||
|
|
|
|||
|
|
// ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// ARPTO = time_100us x 0.1ms x (retry_cnt+1)
|
|||
|
|
|
|||
|
|
g_netTimeout.retry_cnt = 3;
|
|||
|
|
g_netTimeout.time_100us = 2000;
|
|||
|
|
|
|||
|
|
// TCPTO = (2000) x 0.1ms // retry_cnt == 0
|
|||
|
|
// (2000 + 4000) x 0.1ms // retry_cnt == 1
|
|||
|
|
// (2000 + 4000 + 8000) x 0.1ms // retry_cnt == 2
|
|||
|
|
// (2000 + 4000 + 8000 + 16000) x 0.1ms // retry_cnt == 3
|
|||
|
|
// (2000 + 4000 + 8000 + 16000 + 32000 + ((retry_cnt - 4) x 64000)) x 0.1ms // retry_cnt >= 4
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void GetChipConfig(void)
|
|||
|
|
{
|
|||
|
|
ctlwizchip(CW_GET_PHYCONF, (void*)(&g_phyConfig));
|
|||
|
|
|
|||
|
|
printf("after set config, phy config is:\r\n");
|
|||
|
|
if (g_phyConfig.by == PHY_CONFBY_SW)
|
|||
|
|
{
|
|||
|
|
printf("config by software:\r\n");
|
|||
|
|
}
|
|||
|
|
else if(g_phyConfig.by == PHY_CONFBY_HW)
|
|||
|
|
{
|
|||
|
|
printf("config by hardware:\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("config by %d:\r\n", g_phyConfig.by);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (g_phyConfig.mode == PHY_MODE_AUTONEGO)
|
|||
|
|
{
|
|||
|
|
printf("mode is PHY_MODE_AUTONEGO:\r\n");
|
|||
|
|
}
|
|||
|
|
else if (g_phyConfig.mode == PHY_MODE_MANUAL)
|
|||
|
|
{
|
|||
|
|
printf("mode is PHY_MODE_MANUAL:\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("mode is %d:\r\n", g_phyConfig.mode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (g_phyConfig.speed == PHY_SPEED_100)
|
|||
|
|
{
|
|||
|
|
printf("speed is PHY_SPEED_100:\r\n");
|
|||
|
|
}
|
|||
|
|
else if (g_phyConfig.speed == PHY_SPEED_10)
|
|||
|
|
{
|
|||
|
|
printf("speed is PHY_SPEED_10:\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("speed is %d:\r\n", g_phyConfig.speed);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (g_phyConfig.duplex == PHY_DUPLEX_FULL)
|
|||
|
|
{
|
|||
|
|
printf("duplex is PHY_DUPLEX_FULL:\r\n");
|
|||
|
|
}
|
|||
|
|
else if (g_phyConfig.duplex == PHY_DUPLEX_HALF)
|
|||
|
|
{
|
|||
|
|
printf("duplex is PHY_DUPLEX_HALF:\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("duplex is %d:\r\n", g_phyConfig.duplex);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC>оƬ<D0BE><C6AC><EFBFBD><EFBFBD>
|
|||
|
|
int ChipParaConfig(void)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
u8 tmp8;
|
|||
|
|
u16 tmp16;
|
|||
|
|
u8 chipId[6];
|
|||
|
|
|
|||
|
|
u8 memsize[2][8] = {
|
|||
|
|
{2,2,2,2,2,2,2,2},
|
|||
|
|
{2,2,2,2,2,2,2,2},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <20><>λоƬ
|
|||
|
|
ctlwizchip(CW_RESET_WIZCHIP, 0);
|
|||
|
|
|
|||
|
|
DelayMs(10);
|
|||
|
|
|
|||
|
|
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ctlwizchip(CW_RESET_PHY, 0);
|
|||
|
|
|
|||
|
|
DelayMs(10);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ctlwizchip(CW_SET_PHYCONF, (void*)(&g_phyConfig));
|
|||
|
|
|
|||
|
|
DelayMs(10);
|
|||
|
|
|
|||
|
|
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ctlwizchip(CW_RESET_PHY, 0);
|
|||
|
|
|
|||
|
|
DelayMs(10);
|
|||
|
|
|
|||
|
|
#if (1)
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
GetChipConfig();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
// WIZCHIP SOCKET <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
rslt = ctlwizchip(CW_INIT_WIZCHIP, (void*)(memsize));
|
|||
|
|
if(rslt == -1)
|
|||
|
|
{
|
|||
|
|
printf("WIZCHIP Initialized fail.\r\n");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>Դģʽ
|
|||
|
|
ctlwizchip(CW_GET_PHYPOWMODE, (void*)(&tmp8));
|
|||
|
|
|
|||
|
|
printf("powermode is %d:\r\n", tmp8);
|
|||
|
|
|
|||
|
|
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
|
tmp16 = 0
|
|||
|
|
| IK_IP_CONFLICT // IP<49><50>ͻ
|
|||
|
|
| IK_DEST_UNREACH // Ŀ<>겻<EFBFBD>ɴ<EFBFBD>
|
|||
|
|
| IK_PPPOE_TERMINATED // PPPOE<4F><45><EFBFBD>ӹر<D3B9>
|
|||
|
|
| IK_WOL // <20><><EFBFBD>绽<EFBFBD><E7BBBD>
|
|||
|
|
// | IK_SOCK_ALL // <20><><EFBFBD>е<EFBFBD>SOCKET<45>ж<EFBFBD>
|
|||
|
|
| 0;
|
|||
|
|
|
|||
|
|
ctlwizchip(CW_SET_INTRMASK, (void*)(&tmp16));
|
|||
|
|
ctlwizchip(CW_GET_INTRMASK, (void*)(&tmp16));
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|||
|
|
ctlwizchip(CW_GET_INTERRUPT, (void*)(&tmp16));
|
|||
|
|
tmp16 = 0
|
|||
|
|
| IK_IP_CONFLICT // IP<49><50>ͻ
|
|||
|
|
| IK_DEST_UNREACH // Ŀ<>겻<EFBFBD>ɴ<EFBFBD>
|
|||
|
|
| IK_PPPOE_TERMINATED // PPPOE<4F><45><EFBFBD>ӹر<D3B9>
|
|||
|
|
| IK_WOL // <20><><EFBFBD>绽<EFBFBD><E7BBBD>
|
|||
|
|
| IK_SOCK_ALL; // <20><><EFBFBD>е<EFBFBD>SOCKET<45>ж<EFBFBD>
|
|||
|
|
ctlwizchip(CW_CLR_INTERRUPT, (void*)(&tmp16));
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
|
tmp16 = 25;
|
|||
|
|
ctlwizchip(CW_SET_INTRTIME, (void*)(&tmp16));
|
|||
|
|
ctlwizchip(CW_GET_INTRTIME, (void*)(&tmp16));
|
|||
|
|
|
|||
|
|
printf("intrtime is %d:\r\n", tmp16);
|
|||
|
|
|
|||
|
|
// <20><>ȡоƬID
|
|||
|
|
ctlwizchip(CW_GET_ID, (void*)(&chipId));
|
|||
|
|
printf("chip ID is %x %x %x %x %x %x\r\n", chipId[0],chipId[1],chipId[2],chipId[3],chipId[4],chipId[5]);
|
|||
|
|
|
|||
|
|
// PHY<48><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
|
|||
|
|
rslt = ctlwizchip(CW_GET_PHYLINK, (void*)(&tmp8));
|
|||
|
|
if(rslt == -1)
|
|||
|
|
{
|
|||
|
|
printf("Unknown PHY Link stauts.\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (tmp8 == PHY_LINK_ON)
|
|||
|
|
{
|
|||
|
|
printf("PHY Link ON.\r\n");
|
|||
|
|
}
|
|||
|
|
else if (tmp8 == PHY_LINK_OFF)
|
|||
|
|
{
|
|||
|
|
printf("PHY Link OFF.\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void NetworkParaConfig(void)
|
|||
|
|
{
|
|||
|
|
u8 tmp8;
|
|||
|
|
u8 tmpstr[6];
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
tmp8 = 0
|
|||
|
|
// | NM_FORCEARP // ǿ<><C7BF>ARP
|
|||
|
|
// | NM_WAKEONLAN // <20><><EFBFBD>绽<EFBFBD><E7BBBD>
|
|||
|
|
// | NM_PINGBLOCK // ping <20><><EFBFBD><EFBFBD>
|
|||
|
|
// | NM_PPPOE // PPPoE ģʽ
|
|||
|
|
| 0;
|
|||
|
|
ctlnetwork(CN_SET_NETMODE, (void*)(&tmp8));
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7>IP<49><50>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬DNS<4E><53>DHCP<43><50>
|
|||
|
|
ctlnetwork(CN_SET_NETINFO, (void*)(&g_netInfo));
|
|||
|
|
DelayMs(10);
|
|||
|
|
ctlnetwork(CN_GET_NETINFO, (void*)(&g_netInfo));
|
|||
|
|
|
|||
|
|
ctlwizchip(CW_GET_ID, (void*)(tmpstr));
|
|||
|
|
|
|||
|
|
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#if (1)
|
|||
|
|
printf("\r\n=== %s NET CONF ===\r\n",(char*)(tmpstr));
|
|||
|
|
printf("MAC: %X:%X:%X:%X:%X:%X\r\n",g_netInfo.mac[0],g_netInfo.mac[1],g_netInfo.mac[2],
|
|||
|
|
g_netInfo.mac[3],g_netInfo.mac[4],g_netInfo.mac[5]);
|
|||
|
|
printf("SIP: %d.%d.%d.%d\r\n", g_netInfo.ip[0],g_netInfo.ip[1],g_netInfo.ip[2],g_netInfo.ip[3]);
|
|||
|
|
printf("GAW: %d.%d.%d.%d\r\n", g_netInfo.gw[0],g_netInfo.gw[1],g_netInfo.gw[2],g_netInfo.gw[3]);
|
|||
|
|
printf("SUB: %d.%d.%d.%d\r\n", g_netInfo.sn[0],g_netInfo.sn[1],g_netInfo.sn[2],g_netInfo.sn[3]);
|
|||
|
|
printf("DNS: %d.%d.%d.%d\r\n", g_netInfo.dns[0],g_netInfo.dns[1],g_netInfo.dns[2],g_netInfo.dns[3]);
|
|||
|
|
if (g_netInfo.dhcp == 1)
|
|||
|
|
{
|
|||
|
|
printf("alloc ip static\r\n");
|
|||
|
|
}
|
|||
|
|
else if (g_netInfo.dhcp == 2)
|
|||
|
|
{
|
|||
|
|
printf("alloc ip by dhcp\r\n");
|
|||
|
|
}
|
|||
|
|
printf("======================\r\n");
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ctlnetwork(CN_SET_TIMEOUT, (void*)(&g_netTimeout));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20>жϴ<D0B6><CFB4><EFBFBD>
|
|||
|
|
void EthernetIntProc(void)
|
|||
|
|
{
|
|||
|
|
u16 intr;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
ctlwizchip(CW_GET_INTERRUPT, &intr); // <20><>ȡ<EFBFBD>ж<EFBFBD>
|
|||
|
|
ctlwizchip(CW_CLR_INTERRUPT, &intr); // <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
|
|||
|
|
|
|||
|
|
#if (1)
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if ((intr & IK_WOL) != 0) // <20><><EFBFBD>绽<EFBFBD><E7BBBD>
|
|||
|
|
{
|
|||
|
|
printf("Wake on LAN\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((intr & IK_PPPOE_TERMINATED) != 0) // PPPOE<4F><45><EFBFBD>ӹر<D3B9>
|
|||
|
|
{
|
|||
|
|
printf("PPPOE terminated\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((intr & IK_DEST_UNREACH) != 0) // Ŀ<>겻<EFBFBD>ɴ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("Destination Unreachable\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((intr & IK_IP_CONFLICT) != 0) // IP<49><50>ͻ
|
|||
|
|
{
|
|||
|
|
printf("IP conflict\r\n");
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
int IsSocketErr(int err)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
rslt = 0;
|
|||
|
|
|
|||
|
|
switch(err)
|
|||
|
|
{
|
|||
|
|
case SOCK_OK:
|
|||
|
|
printf("Result is OK about socket process.\r\n");
|
|||
|
|
break;
|
|||
|
|
case SOCK_BUSY:
|
|||
|
|
printf("Socket is busy on processing the operation. Valid only Non-block IO Mode.\r\n");
|
|||
|
|
break;
|
|||
|
|
case SOCK_FATAL:
|
|||
|
|
printf("Result is fatal error about socket process.\r\n");
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKNUM:
|
|||
|
|
printf("Invalid socket number\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKOPT:
|
|||
|
|
printf("Invalid socket option\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKINIT:
|
|||
|
|
printf("Socket is not initialized or SIPR is Zero IP address when Sn_MR_TCP\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKCLOSED:
|
|||
|
|
printf("Socket unexpectedly closed.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKMODE:
|
|||
|
|
printf("Invalid socket mode for socket operation.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKFLAG:
|
|||
|
|
printf("Invalid socket flag\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_SOCKSTATUS:
|
|||
|
|
printf("Invalid socket status for socket operation.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_ARG:
|
|||
|
|
printf("Invalid argument.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_PORTZERO:
|
|||
|
|
printf("Port number is zero\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_IPINVALID:
|
|||
|
|
printf("Invalid IP address\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_TIMEOUT:
|
|||
|
|
printf("Timeout occurred\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_DATALEN:
|
|||
|
|
printf("Data length is zero or greater than buffer max size.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKERR_BUFFER:
|
|||
|
|
printf("Socket buffer is not enough for data communication.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
case SOCKFATAL_PACKLEN:
|
|||
|
|
printf("Invalid packet length. Fatal Error.\r\n");
|
|||
|
|
rslt = -1;
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
rslt = err;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
EthernetServiceRun();
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// Ethernet <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pDatBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// len, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>أ<EFBFBD> >= 0, ʵ<>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>أ<EFBFBD> -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2, <20><><EFBFBD>ƽṹû<E1B9B9>г<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
// -3, <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
|
|||
|
|
|
|||
|
|
int EthernetSendData(SocketCtrl * pCtrl, u8 * pDatBuf, int len)
|
|||
|
|
{
|
|||
|
|
int rslt, err;
|
|||
|
|
rslt = 0;
|
|||
|
|
|
|||
|
|
if (pCtrl->type == TCP_SERVER || pCtrl->type == TCP_CLIENT)
|
|||
|
|
{
|
|||
|
|
if (pCtrl->status == STA_CONNECT) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
err = send(pCtrl->socket, pDatBuf, len);
|
|||
|
|
|
|||
|
|
rslt = IsSocketErr(err);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("socket not connect\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#if (UDP_NUM > 0)
|
|||
|
|
else if (pCtrl->type == UDP_COMM)
|
|||
|
|
{
|
|||
|
|
err = UdpTransData(pDatBuf, len); // sendto
|
|||
|
|
rslt = IsSocketErr(err);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴӽ<DDB4><D3BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pDat<61><74><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// expectLen<65><6E>ϣ<EFBFBD><CFA3><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݵĴ<DDB5>С
|
|||
|
|
// <20><><EFBFBD>أ<EFBFBD> >= 0<><30>ʵ<EFBFBD>ʵõ<CAB5><C3B5><EFBFBD><EFBFBD>ݵĴ<DDB5>С
|
|||
|
|
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
// -3, <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
|
|||
|
|
|
|||
|
|
int EthernetGetData(SocketCtrl * pCtrl, u8 * pDat, int expectLen)
|
|||
|
|
{
|
|||
|
|
int rslt, err;
|
|||
|
|
rslt = 0;
|
|||
|
|
if (pCtrl->type == TCP_SERVER || pCtrl->type == TCP_CLIENT)
|
|||
|
|
{
|
|||
|
|
if (pCtrl->status == STA_CONNECT) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
err = recv(pCtrl->socket, pDat, expectLen);
|
|||
|
|
rslt = IsSocketErr(err);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("socket not connect\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#if (UDP_NUM > 0)
|
|||
|
|
else if (pCtrl->type == UDP_COMM)
|
|||
|
|
{
|
|||
|
|
err = UdpRecvData(pDat, expectLen); // recvfrom
|
|||
|
|
rslt = IsSocketErr(err);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Ethernet <20>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
int EthernetGetRsLen(SocketCtrl * pCtrl)
|
|||
|
|
{
|
|||
|
|
if (pCtrl->status == STA_CONNECT ||
|
|||
|
|
#if (UDP_NUM > 0)
|
|||
|
|
pCtrl->type == UDP_COMM ||
|
|||
|
|
#endif
|
|||
|
|
0 ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return getSn_RX_RSR(pCtrl->socket);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// printf("socket not connect\r\n");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>
|
|||
|
|
int EthernetGetSdFreeLen(SocketCtrl * pCtrl)
|
|||
|
|
{
|
|||
|
|
if (pCtrl->status == STA_CONNECT ||
|
|||
|
|
#if (UDP_NUM > 0)
|
|||
|
|
pCtrl->type == UDP_COMM ||
|
|||
|
|
#endif
|
|||
|
|
0 ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
return getSn_TX_FSR(pCtrl->socket);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// printf("socket not connect\r\n");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
SocketCtrl * GetCtrlFromSocketIdx(int sIdx)
|
|||
|
|
{
|
|||
|
|
if (sIdx < UDP_SN_BEG+UDP_NUM)
|
|||
|
|
{
|
|||
|
|
return GetUdpCtrlFromSocketId(sIdx-UDP_SN_BEG);
|
|||
|
|
}
|
|||
|
|
#if (SERVER_NUM > 0)
|
|||
|
|
else if (sIdx < TCP_SERVER_SN_BEG+SERVER_NUM)
|
|||
|
|
{
|
|||
|
|
return GetTcpServerCtrlFromSocketId(sIdx-TCP_SERVER_SN_BEG);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#if (CLIENT_NUM > 0)
|
|||
|
|
else if (sIdx < TCP_CLIENT_SN_BEG+CLIENT_NUM)
|
|||
|
|
{
|
|||
|
|
return GetTcpClientCtrlFromSocketId(sIdx-TCP_CLIENT_SN_BEG);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void EthernetServiceRun()
|
|||
|
|
{
|
|||
|
|
#if (SERVER_NUM > 0)
|
|||
|
|
TcpServerRun();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if (CLIENT_NUM > 0)
|
|||
|
|
TcpClientRun();
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if (UDP_NUM > 0)
|
|||
|
|
// UdpTransRun();
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|