feat: support tcp client

This commit is contained in:
Allenn
2023-12-13 19:30:37 +08:00
parent 402f25a2fd
commit f8b8ac46ca
17 changed files with 2696 additions and 36 deletions
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file connect_ethernet.h
* @brief define rvstar uart function
* @version 1.0
* @author AIIT XUOS Lab
* @date 2022-08-01
*/
#ifndef CONNECT_ETH_H
#define CONNECT_ETH_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
uint8_t InitHwEth();
void WCHNET_CreateTcpSocket(uint8_t* DESIP, uint16_t srcport, uint16_t desport, uint8_t* SocketId);
void WCHNET_CreateTcpSocketListen(uint16_t srcport, uint8_t* SocketId);
void WCHNET_HandleGlobalInt(void);
#ifdef __cplusplus
}
#endif
#endif
@@ -0,0 +1,181 @@
/********************************** (C) COPYRIGHT ************* ******************
* File Name : eth_driver.h
* Author : WCH
* Version : V1.3.0
* Date : 2022/06/02
* Description : This file contains the headers of the ETH Driver.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __ETH_DRIVER__
#define __ETH_DRIVER__
#ifdef __cplusplus
extern "C" {
#endif
#include "ch32v30x_eth.h"
#include "debug.h"
#include "wchnet.h"
/* Internal 10M PHY */
#define USE_10M_BASE 1
/* The chips supported by the MII/RMII driver are: CH182/RTL8201F, etc. */
#define USE_MAC_MII 2
#define USE_MAC_RMII 3
#define USE_MAC_RGMII 4
#ifndef PHY_MODE
#define PHY_MODE USE_10M_BASE
#endif
/* 1: interrupt 0: polling in RMII or RGMII mode */
#define LINK_STAT_ACQUISITION_METHOD 1
#define PHY_ADDRESS 1
#define ETH_DMARxDesc_FrameLengthShift 16
#define ROM_CFG_USERADR_ID 0x1FFFF7E8
#define PHY_LINK_TASK_PERIOD 50
#define PHY_ANLPAR_SELECTOR_FIELD 0x1F
#define PHY_ANLPAR_SELECTOR_VALUE 0x01 /* 5B'00001 */
#define PHY_LINK_INIT 0x00
#define PHY_LINK_SUC_P (1 << 0)
#define PHY_LINK_SUC_N (1 << 1)
#define PHY_LINK_WAIT_SUC (1 << 7)
#define PHY_PN_SWITCH_P (0 << 2)
#define PHY_PN_SWITCH_N (1 << 2)
#define PHY_PN_SWITCH_AUTO (2 << 2)
#ifndef WCHNETTIMERPERIOD
#define WCHNETTIMERPERIOD 10 /* Timer period, in Ms. */
#endif
#define GPIO_Output(a, b) \
GPIO_InitStructure.GPIO_Pin = b; \
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; \
GPIO_Init(a, &GPIO_InitStructure)
#define GPIO_Input(a, b) \
GPIO_InitStructure.GPIO_Pin = b; \
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; \
GPIO_Init(a, &GPIO_InitStructure)
#define QUERY_STAT_FLAG ((LastQueryPhyTime == (LocalTime / 1000)) ? 0 : 1)
#define ENABLE_POLLING_TO_QUERY_PHY_LINK_STAT ((PHY_MODE == USE_MAC_MII) || (((PHY_MODE == USE_MAC_RMII) || (PHY_MODE == USE_MAC_RGMII)) && !LINK_STAT_ACQUISITION_METHOD))
#define ACCELERATE_LINK_PROCESS() \
do { \
if ((TRDetectStep < 2) && (ETH_ReadPHYRegister(gPHYAddress, PHY_ANLPAR) & PHY_ANLPAR_SELECTOR_FIELD)) \
LinkTaskPeriod = 0; \
} while (0)
#define UPDATE_LINKTASKPERIOD() \
do { \
if (TRDetectStep == 1) { \
RandVal = RandVal * 214017 + 2531017; \
LinkTaskPeriod = RandVal % 100 + 50; \
} else { \
LinkTaskPeriod = 50; \
} \
} while (0)
#define PHY_RESTART_AUTONEGOTIATION() \
do { \
RegVal = ETH_ReadPHYRegister(gPHYAddress, PHY_BCR); \
RegVal &= ~0x01; \
RegVal |= PHY_Restart_AutoNegotiation; \
ETH_WritePHYRegister(gPHYAddress, PHY_BCR, RegVal); \
RegVal = ETH_ReadPHYRegister(gPHYAddress, PHY_BCR); \
RegVal |= 0x03 | PHY_Restart_AutoNegotiation; \
ETH_WritePHYRegister(gPHYAddress, PHY_BCR, RegVal); \
} while (0)
#define PHY_TR_SWITCH() \
do { \
phy_mdix = ETH_ReadPHYRegister(gPHYAddress, PHY_MDIX); \
if (phy_mdix & 0x01) { \
phy_mdix &= ~0x03; \
phy_mdix |= 1 << 1; \
} else { \
phy_mdix &= ~0x03; \
phy_mdix |= 1 << 0; \
} \
ETH_WritePHYRegister(gPHYAddress, PHY_MDIX, phy_mdix); \
PHY_RESTART_AUTONEGOTIATION(); \
} while (0)
#define PHY_TR_REVERSE() \
do { \
RegVal = ETH_ReadPHYRegister(gPHYAddress, PHY_MDIX); \
if (RegVal & 0x01) { \
RegVal &= ~0x03; \
RegVal |= 1 << 1; \
} else { \
RegVal &= ~0x03; \
RegVal |= 1 << 0; \
} \
ETH_WritePHYRegister(gPHYAddress, PHY_MDIX, RegVal); \
} while (0)
#define PHY_PN_SWITCH(PNMode) \
do { \
if (PNMode == PHY_PN_SWITCH_AUTO) { \
phyPN = PHY_PN_SWITCH_AUTO; \
} else { \
phyPN = (ETH_ReadPHYRegister(gPHYAddress, PHY_MDIX) & (~(0x03 << 2))) | PNMode; \
} \
ETH_WritePHYRegister(gPHYAddress, PHY_MDIX, phyPN); \
phyPN = PNMode; \
PHY_RESTART_AUTONEGOTIATION(); \
} while (0)
#define PHY_NEGOTIATION_PARAM_INIT() \
do { \
phyStatus = 0; \
phySucCnt = 0; \
phyLinkCnt = 0; \
TRDetectStep = 0; \
PhyPolarityDetect = 0; \
phyLinkStatus = PHY_LINK_INIT; \
phyPN = PHY_PN_SWITCH_AUTO; \
ETH_WritePHYRegister(gPHYAddress, PHY_MDIX, phyPN); \
} while (0)
#define PHY_LINK_RESET() \
do { \
ETH_WritePHYRegister(gPHYAddress, PHY_BCR, PHY_Reset); \
PHY_NEGOTIATION_PARAM_INIT(); \
} while (0)
extern ETH_DMADESCTypeDef* DMATxDescToSet;
extern ETH_DMADESCTypeDef* DMARxDescToGet;
extern SOCK_INF SocketInf[];
void ETH_PHYLink(void);
void WCHNET_ETHIsr(void);
void WCHNET_MainTask(void);
void ETH_LedConfiguration(void);
void ETH_Init(uint8_t* macAddr);
void ETH_LedLinkSet(uint8_t mode);
void ETH_LedDataSet(uint8_t mode);
void WCHNET_TimeIsr(uint16_t timperiod);
void ETH_Configuration(uint8_t* macAddr);
uint8_t ETH_LibInit(uint8_t* ip, uint8_t* gwip, uint8_t* mask, uint8_t* macaddr);
void WCHNET_MainTask(void);
#ifdef __cplusplus
}
#endif
#endif
@@ -0,0 +1,160 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : net_config.h
* Author : WCH
* Version : V1.30
* Date : 2022/06/02
* Description : This file contains the configurations of
* Ethernet protocol stack library
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __NET_CONFIG_H__
#define __NET_CONFIG_H__
#ifdef __cplusplus
extern "C" {
#endif
/*********************************************************************
* socket configuration, IPRAW + UDP + TCP + TCP_LISTEN = number of sockets
*/
#define WCHNET_NUM_IPRAW 0 /* Number of IPRAW connections */
#define WCHNET_NUM_UDP 0 /* The number of UDP connections */
#define WCHNET_NUM_TCP 1 /* Number of TCP connections */
#define WCHNET_NUM_TCP_LISTEN 0 /* Number of TCP listening */
/* The number of sockets, the maximum is 31 */
#define WCHNET_MAX_SOCKET_NUM (WCHNET_NUM_IPRAW + WCHNET_NUM_UDP + WCHNET_NUM_TCP + WCHNET_NUM_TCP_LISTEN)
#define WCHNET_TCP_MSS 1460 /* Size of TCP MSS*/
#define WCHNET_NUM_POOL_BUF (WCHNET_NUM_TCP * 2 + 2) /* The number of POOL BUFs, the number of receive queues */
/*********************************************************************
* MAC queue configuration
*/
#define ETH_TXBUFNB 2 /* The number of descriptors sent by the MAC */
#define ETH_RXBUFNB 4 /* Number of MAC received descriptors */
#ifndef ETH_MAX_PACKET_SIZE
#define ETH_RX_BUF_SZE 1520 /* MAC receive buffer length, an integer multiple of 4 */
#define ETH_TX_BUF_SZE 1520 /* MAC send buffer length, an integer multiple of 4 */
#else
#define ETH_RX_BUF_SZE ETH_MAX_PACKET_SIZE
#define ETH_TX_BUF_SZE ETH_MAX_PACKET_SIZE
#endif
/*********************************************************************
* Functional configuration
*/
#define WCHNET_PING_ENABLE 1 /* PING is enabled, PING is enabled by default */
#define TCP_RETRY_COUNT 20 /* The number of TCP retransmissions, the default value is 20 */
#define TCP_RETRY_PERIOD 10 /* TCP retransmission period, the default value is 10, the unit is 50ms */
#define SOCKET_SEND_RETRY 0 /* Send failed retry configuration, 1: enable, 0: disable */
#define HARDWARE_CHECKSUM_CONFIG 0 /* Hardware checksum checking and insertion configuration, 1: enable, 0: disable */
#define FINE_DHCP_PERIOD 8 /* Fine DHCP period, the default value is 8, the unit is 250ms */
#define CFG0_TCP_SEND_COPY 1 /* TCP send buffer copy, 1: copy, 0: not copy */
#define CFG0_TCP_RECV_COPY 1 /* TCP receive replication optimization, internal debugging use */
#define CFG0_TCP_OLD_DELETE 0 /* Delete oldest TCP connection, 1: enable, 0: disable */
#define CFG0_IP_REASS_PBUFS 0 /* Number of reassembled IP PBUFs */
#define CFG0_TCP_DEALY_ACK_DISABLE 1 /* 1: disable TCP delay ACK 0: enable TCP delay ACK */
/*********************************************************************
* Memory related configuration
*/
/* If you want to achieve a higher transmission speed,
* try to increase RECE_BUF_LEN to (WCHNET_TCP_MSS*4)
* and increase WCHNET_NUM_TCP_SEG to (WCHNET_NUM_TCP*4)*/
#define RECE_BUF_LEN (WCHNET_TCP_MSS * 2) /* socket receive buffer size */
#define WCHNET_NUM_PBUF WCHNET_NUM_POOL_BUF /* Number of PBUF structures */
#define WCHNET_NUM_TCP_SEG (WCHNET_NUM_TCP * 2) /* The number of TCP segments used to send */
#define WCHNET_MEM_HEAP_SIZE (((WCHNET_TCP_MSS + 0x10 + 54 + 8) * WCHNET_NUM_TCP_SEG) + ETH_TX_BUF_SZE + 64 + 2 * 0x18) /* memory heap size */
#define WCHNET_NUM_ARP_TABLE 50 /* Number of ARP lists */
#define WCHNET_MEM_ALIGNMENT 4 /* 4 byte alignment */
#if CFG0_IP_REASS_PBUFS
#define WCHNET_NUM_IP_REASSDATA 2 /* Number of reassembled IP structures */
/*1: When using the fragmentation function,
* ensure that the size of WCHNET_SIZE_POOL_BUF is large enough to store a single fragmented packet*/
#define WCHNET_SIZE_POOL_BUF (((1500 + 14 + 4) + 3) & ~3) /* Buffer size for receiving a single packet */
/*2: When creating a socket that can receive fragmented packets,
* ensure that "RecvBufLen" member of the "struct _SOCK_INF" structure
* (the parameter initialized when calling WCHNET_SocketCreat) is sufficient
* to receive a complete fragmented packet */
#else
#define WCHNET_NUM_IP_REASSDATA 0 /* Number of reassembled IP structures */
#define WCHNET_SIZE_POOL_BUF (((WCHNET_TCP_MSS + 40 + 14 + 4) + 3) & ~3) /* Buffer size for receiving a single packet */
#endif
/* Check receive buffer */
#if (WCHNET_NUM_POOL_BUF * WCHNET_SIZE_POOL_BUF < ETH_RX_BUF_SZE)
#error "WCHNET_NUM_POOL_BUF or WCHNET_TCP_MSS Error"
#error "Please Increase WCHNET_NUM_POOL_BUF or WCHNET_TCP_MSS to make sure the receive buffer is sufficient"
#endif
/* Check the configuration of the SOCKET quantity */
#if (WCHNET_NUM_TCP_LISTEN && !WCHNET_NUM_TCP)
#error "WCHNET_NUM_TCP Error,Please Configure WCHNET_NUM_TCP >= 1"
#endif
/* Check byte alignment must be a multiple of 4 */
#if ((WCHNET_MEM_ALIGNMENT % 4) || (WCHNET_MEM_ALIGNMENT == 0))
#error "WCHNET_MEM_ALIGNMENT Error,Please Configure WCHNET_MEM_ALIGNMENT = 4 * N, N >=1"
#endif
/* TCP maximum segment length */
#if ((WCHNET_TCP_MSS > 1460) || (WCHNET_TCP_MSS < 60))
#error "WCHNET_TCP_MSS Error,Please Configure WCHNET_TCP_MSS >= 60 && WCHNET_TCP_MSS <= 1460"
#endif
/* Number of ARP cache tables */
#if ((WCHNET_NUM_ARP_TABLE > 0X7F) || (WCHNET_NUM_ARP_TABLE < 1))
#error "WCHNET_NUM_ARP_TABLE Error,Please Configure WCHNET_NUM_ARP_TABLE >= 1 && WCHNET_NUM_ARP_TABLE <= 0X7F"
#endif
/* Check POOL BUF configuration */
#if (WCHNET_NUM_POOL_BUF < 1)
#error "WCHNET_NUM_POOL_BUF Error,Please Configure WCHNET_NUM_POOL_BUF >= 1"
#endif
/* Check PBUF structure configuration */
#if (WCHNET_NUM_PBUF < 1)
#error "WCHNET_NUM_PBUF Error,Please Configure WCHNET_NUM_PBUF >= 1"
#endif
/* Check IP Assignment Configuration */
#if (CFG0_IP_REASS_PBUFS && ((WCHNET_NUM_IP_REASSDATA > 10) || (WCHNET_NUM_IP_REASSDATA < 1)))
#error "WCHNET_NUM_IP_REASSDATA Error,Please Configure WCHNET_NUM_IP_REASSDATA < 10 && WCHNET_NUM_IP_REASSDATA >= 1 "
#endif
/* Check the number of reassembled IP PBUFs */
#if (CFG0_IP_REASS_PBUFS > WCHNET_NUM_POOL_BUF)
#error "WCHNET_NUM_POOL_BUF Error,Please Configure CFG0_IP_REASS_PBUFS < WCHNET_NUM_POOL_BUF"
#endif
/* Check Timer period, in Ms. */
#if (WCHNETTIMERPERIOD > 50)
#error "WCHNETTIMERPERIOD Error,Please Configure WCHNETTIMERPERIOD < 50"
#endif
/* Configuration value 0 */
#define WCHNET_MISC_CONFIG0 (((CFG0_TCP_SEND_COPY) << 0) | ((CFG0_TCP_RECV_COPY) << 1) | ((CFG0_TCP_OLD_DELETE) << 2) | ((CFG0_IP_REASS_PBUFS) << 3) | ((CFG0_TCP_DEALY_ACK_DISABLE) << 8))
/* Configuration value 1 */
#define WCHNET_MISC_CONFIG1 (((WCHNET_MAX_SOCKET_NUM) << 0) | ((WCHNET_PING_ENABLE) << 13) | ((TCP_RETRY_COUNT) << 14) | ((TCP_RETRY_PERIOD) << 19) | ((SOCKET_SEND_RETRY) << 25) | ((HARDWARE_CHECKSUM_CONFIG) << 26) | ((FINE_DHCP_PERIOD) << 27))
#ifdef __cplusplus
}
#endif
#endif
@@ -0,0 +1,591 @@
/********************************** (C) COPYRIGHT *******************************
* File Name : wchnet.h
* Author : WCH
* Version : V1.80
* Date : 2023/05/12
* Description : This file contains the headers of
* the Ethernet protocol stack library.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __WCHNET_H__
#define __WCHNET_H__
#include "stdint.h"
#ifndef NET_LIB
#include "net_config.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define WCHNET_LIB_VER 0x18 // the library version number
#define WCHNET_CFG_VALID 0x12345678 // Configuration value valid flag
/* LED state @LED_STAT */
#define LED_ON 0
#define LED_OFF 1
/* PHY state @PHY_STAT */
#define PHY_LINK_SUCCESS (1 << 2) // PHY connection success
#define PHY_AUTO_SUCCESS (1 << 5) // PHY auto negotiation completed
/* Library initialization state @CFG_INIT_STAT */
#define INIT_OK 0x00
#define INIT_ERR_RX_BUF_SIZE 0x01
#define INIT_ERR_TCP_MSS 0x02
#define INIT_ERR_HEAP_SIZE 0x03
#define INIT_ERR_ARP_TABLE_NEM 0x04
#define INIT_ERR_MISC_CONFIG0 0x05
#define INIT_ERR_MISC_CONFIG1 0x06
#define INIT_ERR_FUNC_SEND 0x09
#define INIT_ERR_CHECK_VALID 0xFF
/* Socket protocol type */
#define PROTO_TYPE_IP_RAW 0 // IP layer raw data
#define PROTO_TYPE_UDP 2 // UDP protocol
#define PROTO_TYPE_TCP 3 // TCP protocol
/* interrupt status */
/* The following are the states
* that GLOB_INT will generate */
#define GINT_STAT_UNREACH (1 << 0) // unreachable interrupt
#define GINT_STAT_IP_CONFLI (1 << 1) // IP conflict interrupt
#define GINT_STAT_PHY_CHANGE (1 << 2) // PHY state change interrupt
#define GINT_STAT_SOCKET (1 << 4) // socket related interrupt
/* The following are the states
* that Sn_INT will generate*/
#define SINT_STAT_RECV (1 << 2) // the socket receives data or the receive buffer is not empty
#define SINT_STAT_CONNECT (1 << 3) // connect successfully,generated in TCP mode
#define SINT_STAT_DISCONNECT (1 << 4) // disconnect,generated in TCP mode
#define SINT_STAT_TIM_OUT (1 << 6) // timeout disconnect,generated in TCP mode
/* Definitions for error constants. @ERR_T */
#define ERR_T
#define WCHNET_ERR_SUCCESS 0x00 // No error, everything OK
#define WCHNET_ERR_BUSY 0x10 // busy
#define WCHNET_ERR_MEM 0x11 // Out of memory error
#define WCHNET_ERR_BUF 0x12 // Buffer error
#define WCHNET_ERR_TIMEOUT 0x13 // Timeout
#define WCHNET_ERR_RTE 0x14 // Routing problem
#define WCHNET_ERR_ABRT 0x15 // Connection aborted
#define WCHNET_ERR_RST 0x16 // Connection reset
#define WCHNET_ERR_CLSD 0x17 // Connection closed
#define WCHNET_ERR_CONN 0x18 // Not connected
#define WCHNET_ERR_VAL 0x19 // Illegal value
#define WCHNET_ERR_ARG 0x1a // Illegal argument
#define WCHNET_ERR_USE 0x1b // Address in use
#define WCHNET_ERR_IF 0x1c // Low-level netif error
#define WCHNET_ERR_ISCONN 0x1d // Already connected
#define WCHNET_ERR_INPROGRESS 0x1e // Operation in progress
#define WCHNET_ERR_SOCKET_MEM 0X20 // Socket information error
#define WCHNET_ERR_UNSUPPORT_PROTO 0X21 // unsupported protocol type
#define WCHNET_RET_ABORT 0x5F // command process fail
#define WCHNET_ERR_UNKNOW 0xFA // unknow
/* unreachable condition related codes */
#define UNREACH_CODE_HOST 0 // host unreachable
#define UNREACH_CODE_NET 1 // network unreachable
#define UNREACH_CODE_PROTOCOL 2 // protocol unreachable
#define UNREACH_CODE_PROT 3 // port unreachable
/*For other values, please refer to the RFC792 document*/
/* TCP disconnect related codes */
#define TCP_CLOSE_NORMAL 0 // normal disconnect,a four-way handshake
#define TCP_CLOSE_RST 1 // reset the connection and close
#define TCP_CLOSE_ABANDON 2 // drop connection, and no termination message is sent
/* socket state code */
#define SOCK_STAT_CLOSED 0X00 // socket close
#define SOCK_STAT_OPEN 0X05 // socket open
/* TCP state code */
#define TCP_CLOSED 0 // TCP close
#define TCP_LISTEN 1 // TCP listening
#define TCP_SYN_SENT 2 // SYN send, connect request
#define TCP_SYN_RCVD 3 // SYN received, connection request received
#define TCP_ESTABLISHED 4 // TCP connection establishment
#define TCP_FIN_WAIT_1 5 // WAIT_1 state
#define TCP_FIN_WAIT_2 6 // WAIT_2 state
#define TCP_CLOSE_WAIT 7 // wait to close
#define TCP_CLOSING 8 // closing
#define TCP_LAST_ACK 9 // LAST_ACK
#define TCP_TIME_WAIT 10 // 2MSL wait
/* The following values are fixed and cannot be changed */
#define WCHNET_MEM_ALIGN_SIZE(size) (((size) + WCHNET_MEM_ALIGNMENT - 1) & ~(WCHNET_MEM_ALIGNMENT - 1))
#define WCHNET_SIZE_IPRAW_PCB 0x1C // IPRAW PCB size
#define WCHNET_SIZE_UDP_PCB 0x20 // UDP PCB size
#define WCHNET_SIZE_TCP_PCB 0xB4 // TCP PCB size
#define WCHNET_SIZE_TCP_PCB_LISTEN 0x24 // TCP LISTEN PCB size
#define WCHNET_SIZE_IP_REASSDATA 0x20 // IP reassembled Management
#define WCHNET_SIZE_PBUF 0x10 // Packet Buf
#define WCHNET_SIZE_TCP_SEG 0x14 // TCP SEG structure
#define WCHNET_SIZE_MEM 0x08 // sizeof(struct mem)
#define WCHNET_SIZE_ARP_TABLE 0x18 // sizeof ARP table
#define WCHNET_MEMP_SIZE ((WCHNET_MEM_ALIGNMENT - 1) + (WCHNET_NUM_IPRAW * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IPRAW_PCB)) + (WCHNET_NUM_UDP * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_UDP_PCB)) + (WCHNET_NUM_TCP * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB)) + (WCHNET_NUM_TCP_LISTEN * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB_LISTEN)) + (WCHNET_NUM_TCP_SEG * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_SEG)) + (WCHNET_NUM_IP_REASSDATA * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IP_REASSDATA)) + (WCHNET_NUM_PBUF * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF)) + (WCHNET_NUM_POOL_BUF * (WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_POOL_BUF))))
#define HEAP_MEM_ALIGN_SIZE (WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_MEM))
#define WCHNET_RAM_HEAP_SIZE (WCHNET_MEM_ALIGN_SIZE(WCHNET_MEM_HEAP_SIZE) + HEAP_MEM_ALIGN_SIZE)
#define WCHNET_RAM_ARP_TABLE_SIZE (WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_ARP_TABLE) * WCHNET_NUM_ARP_TABLE)
typedef struct
{
uint32_t length;
uint32_t buffer;
} ETHFrameType;
/* LED callback type */
typedef void (*led_callback)(uint8_t setbit);
/* net send callback type */
typedef uint32_t (*eth_tx_set)(uint16_t len, uint32_t* pBuff);
/* net receive callback type */
typedef uint32_t (*eth_rx_set)(ETHFrameType* pkt);
/* DNS callback type */
typedef void (*dns_callback)(const char* name, uint8_t* ipaddr, void* callback_arg);
/* DHCP callback type */
typedef uint8_t (*dhcp_callback)(uint8_t status, void*);
/* socket receive callback type */
struct _SOCK_INF;
typedef void (*pSockRecv)(struct _SOCK_INF*, uint32_t, uint16_t, uint8_t*, uint32_t);
/* Socket information struct */
typedef struct _SOCK_INF {
uint32_t IntStatus; // interrupt state
uint32_t SockIndex; // Socket index value
uint32_t RecvStartPoint; // Start pointer of the receive buffer
uint32_t RecvBufLen; // Receive buffer length
uint32_t RecvCurPoint; // current pointer to receive buffer
uint32_t RecvReadPoint; // The read pointer of the receive buffer
uint32_t RecvRemLen; // The length of the remaining data in the receive buffer
uint32_t ProtoType; // protocol type
uint32_t SockStatus; // Low byte Socket state, the next low byte is TCP state, only meaningful in TCP mode
uint32_t DesPort; // destination port
uint32_t SourPort; // Source port, protocol type in IPRAW mode
uint8_t IPAddr[4]; // Socket destination IP address
void* Resv1; // Reserved, for internal use, for saving individual PCBs
void* Resv2; // Reserved, used internally, used by TCP Server
pSockRecv AppCallBack; // receive callback function
} SOCK_INF;
struct _WCH_CFG {
uint32_t TxBufSize; // MAC send buffer size, reserved for use
uint32_t TCPMss; // TCP MSS size
uint32_t HeapSize; // heap memory size
uint32_t ARPTableNum; // Number of ARP lists
uint32_t MiscConfig0; // Miscellaneous Configuration 0
/* Bit 0 TCP send buffer copy 1: copy, 0: not copy */
/* Bit 1 TCP receive replication optimization, used for internal debugging */
/* bit 2 delete oldest TCP connection 1: enable, 0: disable */
/* Bits 3-7 Number of PBUFs of IP segments */
/* Bit 8 TCP Delay ACK disable */
uint32_t MiscConfig1; // Miscellaneous Configuration 1
/* Bits 0-7 Number of Sockets*/
/* Bits 8-12 Reserved */
/* Bit 13 PING enable, 1: On 0: Off */
/* Bits 14-18 TCP retransmission times */
/* Bits 19-23 TCP retransmission period, in 50 milliseconds */
/* bit 25 send failed retry, 1: enable, 0: disable */
/* bit 26 Select whether to perform IPv4 checksum check on
* the TCP/UDP/ICMP header of the received frame payload by hardware,
* and calculate and insert the checksum of the IP header and payload of the sent frame by hardware.*/
/* Bits 27-31 period (in 250 milliseconds) of Fine DHCP periodic process */
led_callback led_link; // PHY Link Status Indicator
led_callback led_data; // Ethernet communication indicator
eth_tx_set net_send; // Ethernet send
eth_rx_set net_recv; // Ethernet receive
uint32_t CheckValid; // Configuration value valid flag, fixed value @WCHNET_CFG_VALID
};
struct _NET_SYS {
uint8_t IPAddr[4]; // IP address
uint8_t GWIPAddr[4]; // Gateway IP address
uint8_t MASKAddr[4]; // subnet mask
uint8_t MacAddr[8]; // MAC address
uint8_t UnreachIPAddr[4]; // Unreachable IP address
uint32_t RetranCount; // number of retries,default is 10 times
uint32_t RetranPeriod; // Retry period, unit MS, default 500MS
uint32_t PHYStat; // PHY state code
uint32_t NetStat; // The status of the Ethernet, including whether it is open, etc.
uint32_t MackFilt; // MAC filtering, the default is to receive broadcasts, receive local MAC
uint32_t GlobIntStatus; // global interrupt
uint32_t UnreachCode; // unreachable code
uint32_t UnreachProto; // unreachable protocol
uint32_t UnreachPort; // unreachable port
uint32_t SendFlag;
uint32_t Flags;
};
/* KEEP LIVE configuration structure */
struct _KEEP_CFG {
uint32_t KLIdle; // KEEPLIVE idle time, in ms
uint32_t KLIntvl; // KEEPLIVE period, in ms
uint32_t KLCount; // KEEPLIVE times
};
/**
* @brief Library initialization .
*
* @param ip - IP address pointer
* @param gwip - Gateway address pointer
* @param mask - Subnet mask pointer
* @param macaddr - MAC address pointer
*
* @return @ERR_T
*/
uint8_t WCHNET_Init(const uint8_t* ip, const uint8_t* gwip, const uint8_t* mask, const uint8_t* macaddr);
/**
* @brief get library version
*
* @param None
*
* @return library version
*/
uint8_t WCHNET_GetVer(void);
/**
* @brief Get MAC address.
*
* @param(in) macaddr - MAC address
*
* @param(out) MAC address
*
* @return None
*/
void WCHNET_GetMacAddr(uint8_t* macaddr);
/**
* @brief Library parameter configuration.
*
* @param cfg - Configuration parameter @_WCH_CFG
*
* @return Library configuration initialization state @CFG_INIT_STAT
*/
uint8_t WCHNET_ConfigLIB(struct _WCH_CFG* cfg);
/**
* @brief Handle periodic tasks in the protocol stack
*
* @param None
*
* @return None
*/
void WCHNET_PeriodicHandle(void);
/**
* @brief Ethernet data input. Always called in the main program,
* or called after the reception interrupt is detected.
*
* @param
*
* @return None
*/
void WCHNET_NetInput(void);
/**
* @brief Ethernet interrupt service function. Called after
* Ethernet interrupt is generated.
*
* @param None
*
* @return None
*/
void WCHNET_ETHIsr(void);
/**
* @brief Get PHY status
*
* @param None
*
* @return PHY status @PHY_STAT
*/
uint8_t WCHNET_GetPHYStatus(void);
/**
* @brief Query global interrupt status.
*
* @param None
*
* @return GLOB_INT
*/
uint8_t WCHNET_QueryGlobalInt(void);
/**
* @brief Read global interrupt and clear it.
*
* @param None
*
* @return GLOB_INT
*/
uint8_t WCHNET_GetGlobalInt(void);
/**
* @brief create socket
*
* @param(in) *socketid - socket variable pointer
* @param socinf - Configuration parameters for creating sockets @SOCK_INF
*
* @param(out) *socketid - socket value
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketCreat(uint8_t* socketid, SOCK_INF* socinf);
/**
* @brief Socket sends data.
*
* @param socketid - socket id value
* @param *buf - the first address of send buffer
* @param(in) *len - pointer to the length of the data expected to be sent
*
* @param(out) *len - pointer to the length of the data sent actually
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketSend(uint8_t socketid, uint8_t* buf, uint32_t* len);
/**
* @brief Socket receives data.
*
* @param socketid - socket id value
* @param *buf - the first address of receive buffer
* @param(in) *len - pointer to the length of the data expected to be read
*
* @param(out) *buf - the first address of data buffer
* @param(out) *len - pointer to the length of the data read actually
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketRecv(uint8_t socketid, uint8_t* buf, uint32_t* len);
/**
* @brief Get socket interrupt, and clear socket interrupt.
*
* @param socketid - socket id value
*
* @return Sn_INT
*/
uint8_t WCHNET_GetSocketInt(uint8_t socketid);
/**
* @brief Get the length of the data received by socket.
*
* @param socketid - socket id value
* @param(in) *bufaddr - the first address of receive buffer
*
* @param(out) *bufaddr - the first address of data buffer
*
* @return the length of the data
*/
uint32_t WCHNET_SocketRecvLen(uint8_t socketid, uint32_t* bufaddr);
/**
* @brief TCP connect. Used in TCP Client mode.
*
* @param socketid - socket id value
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketConnect(uint8_t socketid);
/**
* @brief TCP listen. Used in TCP SERVER mode.
*
* @param socketid - socket id value
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketListen(uint8_t socketid);
/**
* @brief Close socket.
*
* @param socketid - socket id value
* @param mode - the way of disconnection.Used in TCP connection.
* @TCP disconnect related codes
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketClose(uint8_t socketid, uint8_t mode);
/**
* @brief Modify socket receive buffer.
*
* @param socketid - socket id value
* @param bufaddr - Address of the receive buffer
* @param bufsize - Size of the receive buffer
*
* @return None
*/
void WCHNET_ModifyRecvBuf(uint8_t socketid, uint32_t bufaddr, uint32_t bufsize);
/**
* @brief UDP send, specify the target IP and target port
*
* @param socketid - socket id value
* @param *buf - Address of the sent data
* @param(in) *slen - Address of the sent length
* @param *sip - destination IP address
* @param port - destination port
*
* @param(out) *slen - actual length sent
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketUdpSendTo(uint8_t socketid, uint8_t* buf, uint32_t* slen, uint8_t* sip, uint16_t port);
/**
* @brief Convert ASCII address to network address.
*
* @param *cp - ASCII address to be converted, such as "192.168.1.2"
* @param(in) *addr - First address of the memory stored in the converted network address
* @param(out) *addr - Converted network address, such as 0xC0A80102
* @return 0 - Success. Others - Failure.
*/
uint8_t WCHNET_Aton(const char* cp, uint8_t* addr);
/**
* @brief Convert network address to ASCII address.
*
* @param *ipaddr - socket id value
*
* @return Converted ASCII address
*/
uint8_t* WCHNET_Ntoa(uint8_t* ipaddr);
/**
* @brief Set socket TTL.
*
* @param socketid - socket id value
* @param ttl - TTL value
*
* @return @ERR_T
*/
uint8_t WCHNET_SetSocketTTL(uint8_t socketid, uint8_t ttl);
/**
* @brief Start TCP retry sending immediately.
*
* @param socketid - TTL value
*
* @return None
*/
void WCHNET_RetrySendUnack(uint8_t socketid);
/**
* @brief Query the packets that are not sent successfully.
*
* @param socketid - TTL value
* @param(in) *addrlist - pointer to the address of the address list
* @param lislen - Length of the list
*
* @param(out) *addrlist - Address list of the data packets that are not sent successfully
*
* @return Number of unsent and unacknowledged segments
*/
uint8_t WCHNET_QueryUnack(uint8_t socketid, uint32_t* addrlist, uint16_t lislen);
/**
* @brief Start DHCP.
*
* @param dhcp - Application layer callback function
*
* @return @ERR_T
*/
uint8_t WCHNET_DHCPStart(dhcp_callback dhcp);
/**
* @brief Stop DHCP.
*
* @param None
*
* @return @ERR_T
*/
uint8_t WCHNET_DHCPStop(void);
/**
* @brief Configure DHCP host name.
*
* @param *name - First address of DHCP host name
*
* @return 0 - Success. Others - Failure.
*/
uint8_t WCHNET_DHCPSetHostname(char* name);
/**
* @brief Initialize the resolver: set up the UDP pcb and configure the default server
*
* @param *dnsip - the IP address of dns server
* @param port - the port number of dns server
*
* @return None
*/
void WCHNET_InitDNS(uint8_t* dnsip, uint16_t port);
/**
* @brief Stop DNS.
*
* @param None
*
* @return None
*/
void WCHNET_DNSStop(void);
/**
* Resolve a hostname (string) into an IP address.
*
* @param hostname - the hostname that is to be queried
* @param addr - pointer to a struct ip_addr where to store the address if it is already
* cached in the dns_table (only valid if ERR_OK is returned!)
* @param found - a callback function to be called on success, failure or timeout (only if
* ERR_INPROGRESS is returned!)
* @param arg - argument to pass to the callback function
*
* @return @ERR_T
* WCHNET_ERR_SUCCESS if hostname is a valid IP address string or the host name is already in the local names table.
* ERR_INPROGRESS enqueue a request to be sent to the DNS server for resolution if no errors are present.
*/
uint8_t WCHNET_HostNameGetIp(const char* hostname, uint8_t* addr, dns_callback found, void* arg);
/**
* @brief Configure KEEP LIVE parameter.
*
* @param *cfg - KEEPLIVE configuration parameter
*
* @return None
*/
void WCHNET_ConfigKeepLive(struct _KEEP_CFG* cfg);
/**
* @brief Configure socket KEEP LIVE enable.
*
* @param socketid - socket id value
* @param enable - 1: Enabled. 0: Disabled.
*
* @return @ERR_T
*/
uint8_t WCHNET_SocketSetKeepLive(uint8_t socketid, uint8_t enable);
/**
* @brief Configure PHY state
*
* @param phy_stat - PHY state
*
* @return None
*/
void WCHNET_PhyStatus(uint32_t phy_stat);
#ifdef __cplusplus
}
#endif
#endif