Files

606 lines
22 KiB
C
Raw Permalink Normal View History

/********************************** (C) COPYRIGHT *******************************
* File Name : wchnet.h
* Author : WCH
* Version : V1.90
* 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 0x1A //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