optical/NxFuncs/network/ethernet.c

687 lines
14 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#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
}