forked from xuos/xiuos
				
			Trying to support lwip with w5500.
This commit is contained in:
		
							parent
							
								
									a5a809aa0a
								
							
						
					
					
						commit
						8b32c2f4ed
					
				|  | @ -19,7 +19,7 @@ export CXXFLAGS := -mcmodel=medany -march=rv64imafdc -mabi=lp64d -fno-common -ff | |||
| export CROSS_COMPILE ?=/opt/gnu-mcu-eclipse/riscv-none-gcc/8.2.0-2.1-20190425-1021/bin/riscv-none-embed- | ||||
| 
 | ||||
| 
 | ||||
| export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO | ||||
| export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO -DRISCV_LWIP | ||||
| 
 | ||||
| export ARCH = risc-v | ||||
| export MCU =  k210 | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
| 
 | ||||
| config BSP_USING_W5500 | ||||
|     bool "Using w5500" | ||||
|     select BSP_USING_LWIP | ||||
|     default y | ||||
| 
 | ||||
| config BSP_WIZ_RST_PIN | ||||
|  | @ -15,3 +16,8 @@ config BSP_WIZ_INT_PIN | |||
| config BSP_WIZ_USE_IPERF | ||||
|     bool "Using iperf" | ||||
|     default y | ||||
| 
 | ||||
| menuconfig BSP_USING_LWIP | ||||
|     bool "Using LwIP device" | ||||
|     default n | ||||
|     select RESOURCES_LWIP | ||||
|  | @ -1,3 +1,4 @@ | |||
| SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c wiz_ping.c connect_w5500_test.c wiz_iperf.c | ||||
| # SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c wiz_ping.c connect_w5500_test.c wiz_iperf.c
 | ||||
| SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c  connect_w5500_test.c w5x00_lwip.c | ||||
| 
 | ||||
| include $(KERNEL_ROOT)/compiler.mk | ||||
|  | @ -14,6 +14,8 @@ | |||
| #include "socket.h" | ||||
| #include "w5500.h" | ||||
| 
 | ||||
| #include "connect_ethernet.h" | ||||
| 
 | ||||
| #define SPI_LORA_FREQUENCY 10000000 | ||||
| 
 | ||||
| // spi operations
 | ||||
|  | @ -258,6 +260,27 @@ int HwWiznetInit(void) { | |||
|     return ERROR; | ||||
|   } | ||||
| 
 | ||||
|   extern uint8_t wiz_mac[6]; | ||||
|   setSHAR(wiz_mac); | ||||
|   ctlwizchip(CW_RESET_PHY, 0); | ||||
| 
 | ||||
|   setSn_MR(0, Sn_MR_MFEN | Sn_MR_MACRAW | Sn_MR_MIP6B | Sn_MR_MMB); | ||||
|   // setSn_RXBUF_SIZE(0, 16);
 | ||||
|   // setSn_TXBUF_SIZE(0, 16);
 | ||||
| #define SOCK_ANY_PORT_NUM 0xC000 | ||||
|   wiz_socket(0, Sn_MR_MACRAW, SOCK_ANY_PORT_NUM, 0x00); | ||||
|   // setSn_CR(0, Sn_CR_OPEN);
 | ||||
|   // setSn_CR(0, Sn_CR_CONNECT);
 | ||||
| 
 | ||||
|   uint8_t sock_sr = 0; | ||||
|   while (1) { | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] sock_sr: %x, MACRAW: %x\n", __func__, sock_sr = getSn_SR(0), SOCK_MACRAW)); | ||||
|     if (sock_sr == SOCK_MACRAW) { | ||||
|         SYS_KDEBUG_LOG(WIZNET_DEBUG, ("Socket 0 MACRAW mdoe established\r\n")); | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   network_init(); | ||||
| 
 | ||||
|   return EOK; | ||||
|  |  | |||
|  | @ -0,0 +1,370 @@ | |||
| /**
 | ||||
|  * Copyright (c) 2022 WIZnet Co.,Ltd | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-3-Clause | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Includes | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #include "connect_ethernet.h" | ||||
| 
 | ||||
| #include "socket.h" | ||||
| 
 | ||||
| #include "netif/etharp.h" | ||||
| 
 | ||||
| #include <xs_kdbg.h> | ||||
| 
 | ||||
| #include <xizi.h> | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Macros | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Variables | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| uint8_t wiz_mac[6] = { 0x00, 0x08, 0xDC, 0x12, 0x34, 0x56 }; | ||||
| 
 | ||||
| static uint8_t tx_frame[1542]; | ||||
| static const uint32_t ethernet_polynomial_le = 0xedb88320U; | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Functions | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| void* ethernetif_config_enet_set(uint8_t enet_port) | ||||
| { | ||||
|     return NONE; | ||||
| } | ||||
| 
 | ||||
| void Time_Update_LwIP(void) | ||||
| { | ||||
|     // no need to do
 | ||||
| } | ||||
| 
 | ||||
| int32_t send_lwip(uint8_t sn, uint8_t* buf, uint16_t len) | ||||
| { | ||||
|     uint8_t tmp = 0; | ||||
|     uint16_t freesize = 0; | ||||
| 
 | ||||
|     tmp = getSn_SR(sn); | ||||
| 
 | ||||
|     // freesize = getSn_TxMAX(sn);
 | ||||
|     // freesize = getSn_TXBUF_SIZE(sn);
 | ||||
|     freesize = getSn_TX_FSR(sn); | ||||
| 
 | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] sending len: %d, free size: %d\n", __func__, len, freesize)); | ||||
|     if (len > freesize) | ||||
|         len = freesize; // check size not to exceed MAX size.
 | ||||
| 
 | ||||
|     wiz_send_data(sn, buf, len); | ||||
|     setSn_CR(sn, Sn_CR_SEND); | ||||
|     while (getSn_CR(sn)) | ||||
|         ; | ||||
| 
 | ||||
|     while (1) { | ||||
|         uint8_t IRtemp = getSn_IR(sn); | ||||
|         if (IRtemp & Sn_IR_SENDOK) { | ||||
|             setSn_IR(sn, Sn_IR_SENDOK); | ||||
|             // printf("Packet sent ok\n");
 | ||||
|             break; | ||||
|         } else if (IRtemp & Sn_IR_TIMEOUT) { | ||||
|             setSn_IR(sn, Sn_IR_TIMEOUT); | ||||
|             // printf("Socket is closed\n");
 | ||||
|             //  There was a timeout
 | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return (int32_t)len; | ||||
| } | ||||
| 
 | ||||
| int32_t recv_lwip(uint8_t sn, uint8_t* buf, uint16_t len) | ||||
| { | ||||
|     uint8_t head[2]; | ||||
|     uint16_t pack_len = 0; | ||||
| 
 | ||||
|     pack_len = getSn_RX_RSR(sn); | ||||
| 
 | ||||
|     if (pack_len > 0) { | ||||
|         wiz_recv_data(sn, head, 2); | ||||
|         setSn_CR(sn, Sn_CR_RECV); | ||||
| 
 | ||||
|         // byte size of data packet (2byte)
 | ||||
|         pack_len = head[0]; | ||||
|         pack_len = (pack_len << 8) + head[1]; | ||||
|         pack_len -= 2; | ||||
| 
 | ||||
|         if (pack_len > len) { | ||||
|             // Packet is bigger than buffer - drop the packet
 | ||||
|             // wiz_recv_ignore(sn, pack_len);
 | ||||
|             // setSn_CR(sn, Sn_CR_RECV);
 | ||||
|             // return 0;
 | ||||
|             pack_len = len; | ||||
|         } | ||||
| 
 | ||||
|         wiz_recv_data(sn, buf, pack_len); // data copy
 | ||||
|         setSn_CR(sn, Sn_CR_RECV); | ||||
|         SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] recved len: %d, len: %d\n", __func__, pack_len, len)); | ||||
|     } | ||||
| 
 | ||||
|     return (int32_t)pack_len; | ||||
| } | ||||
| 
 | ||||
| err_t netif_output(struct netif* netif, struct pbuf* p) | ||||
| { | ||||
|     uint32_t send_len = 0; | ||||
|     uint32_t tot_len = 0; | ||||
| 
 | ||||
|     memset(tx_frame, 0x00, sizeof(tx_frame)); | ||||
| 
 | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] pbuf len: %d, totlen: %d\n", __func__, p->len, p->tot_len)); | ||||
|     for (struct pbuf* q = p; q != NULL; q = q->next) { | ||||
|         memcpy(tx_frame + tot_len, q->payload, q->len); | ||||
| 
 | ||||
|         tot_len += q->len; | ||||
| 
 | ||||
|         if (q->len == q->tot_len) { | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (tot_len < 60) { | ||||
|         // pad
 | ||||
|         tot_len = 60; | ||||
|     } | ||||
| 
 | ||||
|     uint32_t crc = ethernet_frame_crc(tx_frame, tot_len); | ||||
| 
 | ||||
|     send_len = send_lwip(0, tx_frame, tot_len); | ||||
| 
 | ||||
|     return ERR_OK; | ||||
| } | ||||
| 
 | ||||
| static uint16_t wiz_sendFrame(uint8_t* buf, uint16_t len) | ||||
| { | ||||
|     // Wait for space in the transmit buffer
 | ||||
|     // while (1) {
 | ||||
|     //     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] looping for freesize, sock state: %x\n", __func__, getSn_SR(0)));
 | ||||
|     //     uint16_t freesize = getSn_TX_FSR(0);
 | ||||
| 
 | ||||
|     //     if (len <= freesize) {
 | ||||
|     //         break;
 | ||||
|     //     }
 | ||||
|     // };
 | ||||
| 
 | ||||
|     wiz_send_data(0, buf, len); | ||||
|     setSn_CR(0, Sn_CR_SEND); | ||||
| 
 | ||||
|     while (1) { | ||||
|         SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] looping for sendok\n", __func__)); | ||||
|         uint8_t tmp = getSn_IR(0); | ||||
|         if (tmp & Sn_IR_SENDOK) { | ||||
|             setSn_IR(0, Sn_IR_SENDOK); | ||||
|             // Packet sent ok
 | ||||
|             break; | ||||
|         } else if (tmp & Sn_IR_TIMEOUT) { | ||||
|             setSn_IR(0, Sn_IR_TIMEOUT); | ||||
|             // There was a timeout
 | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return len; | ||||
| } | ||||
| 
 | ||||
| // void ethernetif_input(void* netif_arg)
 | ||||
| // {
 | ||||
| //     struct netif* netif = (struct netif*)netif_arg;
 | ||||
| //     struct pbuf* p;
 | ||||
| //     uint16_t pack_len = 0;
 | ||||
| //     uint8_t* pack = malloc(ETHERNET_MTU);
 | ||||
| //     while (1) {
 | ||||
| //         wiz_getsockopt(SOCKET_MACRAW, SO_RECVBUF, &pack_len);
 | ||||
| //         if (pack_len > 0) {
 | ||||
| //             pack_len = recv_lwip(SOCKET_MACRAW, (uint8_t*)pack, pack_len);
 | ||||
| //             if (pack_len) {
 | ||||
| //                 p = pbuf_alloc(PBUF_RAW, pack_len, PBUF_POOL);
 | ||||
| //                 pbuf_take(p, pack, pack_len);
 | ||||
| //                 free(pack);
 | ||||
| //                 pack = malloc(ETHERNET_MTU);
 | ||||
| //             } else {
 | ||||
| //                 printf(" No packet received\n");
 | ||||
| //             }
 | ||||
| //             if (pack_len && p != NULL) {
 | ||||
| //                 LINK_STATS_INC(link.recv);
 | ||||
| //                 if (netif->input(p, netif) != ERR_OK) {
 | ||||
| //                     pbuf_free(p);
 | ||||
| //                 }
 | ||||
| //             }
 | ||||
| //         }
 | ||||
| //     }
 | ||||
| // }
 | ||||
| 
 | ||||
| void netif_link_callback(struct netif* netif) | ||||
| { | ||||
|     printf("netif link status changed %s\n", netif_is_link_up(netif) ? "up" : "down"); | ||||
| } | ||||
| 
 | ||||
| void netif_status_callback(struct netif* netif) | ||||
| { | ||||
|     printf("netif status changed %s\n", ip4addr_ntoa(netif_ip4_addr(netif))); | ||||
| } | ||||
| 
 | ||||
| static void wiz_transmit_pbuf(struct pbuf* p) | ||||
| { | ||||
| 
 | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("+++++++")); | ||||
|     uint16_t freeSize = getSn_TX_FSR(0); | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] max tx len: %d, current tx len: %d\n", __func__, getSn_TxMAX(0), freeSize)); | ||||
|     uint16_t length = p->tot_len; | ||||
| 
 | ||||
|     if (freeSize < length) { | ||||
|         /* TODO: Handle insufficent space in buffer */ | ||||
|         SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] max tx len: %d, current tx len: %d\n", __func__, getSn_TxMAX(0), freeSize)); | ||||
|         setSn_CR(0, Sn_CR_SEND); | ||||
|         return; | ||||
|     } | ||||
|     while (1) { | ||||
|         SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] pbuf len: %d, totlen: %d\n", __func__, p->len, p->tot_len)); | ||||
|         // wiz_send_data(0, p->payload, p->len);
 | ||||
|         wiz_sendFrame((uint8_t*)p->payload, p->len); | ||||
|         if (p->len == p->tot_len) | ||||
|             break; | ||||
|         p = p->next; | ||||
|     } | ||||
|     setSn_CR(0, Sn_CR_SEND); | ||||
| } | ||||
| 
 | ||||
| static int wiz_read_receive_pbuf(struct pbuf** buf) | ||||
| { | ||||
|     //  uint8_t header[6];
 | ||||
|     uint16_t length; | ||||
|     //  uint16_t readlen;
 | ||||
|     uint16_t framelen; | ||||
|     //  struct pbuf * p;
 | ||||
| 
 | ||||
|     if (*buf != NULL) | ||||
|         return 1; | ||||
| 
 | ||||
|     // uint16_t rxRd = getSn_RX_RD(0);
 | ||||
| 
 | ||||
|     length = getSn_RX_RSR(0); | ||||
|     if (length < 4) { | ||||
|         /* This could be indicative of a crashed (brown-outed?) controller */ | ||||
|         goto end; | ||||
|     } | ||||
| 
 | ||||
|     wiz_recv_data(0, (uint8_t*)&framelen, 2); | ||||
|     setSn_CR(0, Sn_CR_RECV); | ||||
|     //__bswap16(framelen); //!< didn't work for me
 | ||||
|     framelen = (framelen << 8) | (framelen >> 8); | ||||
| 
 | ||||
|     /* workaround for https://savannah.nongnu.org/bugs/index.php?50040 */ | ||||
|     if (framelen > 32000) { | ||||
|         wiz_recv_ignore(0, framelen); | ||||
|         setSn_CR(0, Sn_CR_RECV); | ||||
|         goto end; | ||||
|     } | ||||
| 
 | ||||
|     framelen -= 2; | ||||
| 
 | ||||
|     *buf = pbuf_alloc(PBUF_RAW, (framelen), PBUF_RAM); | ||||
| 
 | ||||
|     if (*buf == NULL) { | ||||
|         goto end; | ||||
|     } | ||||
| 
 | ||||
|     wiz_recv_data(0, (*buf)->payload, framelen); | ||||
|     setSn_CR(0, Sn_CR_RECV); | ||||
| 
 | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] recved data: framelen: %d\n", __func__, framelen)); | ||||
| 
 | ||||
| end: | ||||
|     return (*buf == NULL) ? 2 : 0; | ||||
| } | ||||
| 
 | ||||
| void spi_if_clr(void) | ||||
| { | ||||
|     setSn_IR(0, 0x1F); | ||||
|     setSIR(0); | ||||
| } | ||||
| 
 | ||||
| void ethernetif_input(void* netif_arg) | ||||
| { | ||||
|     struct netif* netif = (struct netif*)netif_arg; | ||||
|     struct pbuf* p = NULL; | ||||
|     uint8_t res = 0; | ||||
|     uint16_t epktcnt; | ||||
|     for (;;) { | ||||
|         spi_if_clr(); | ||||
|         p = NULL; | ||||
|         res = wiz_read_receive_pbuf(&p); | ||||
|         if (p != NULL) { | ||||
|             LWIP_DEBUGF(NETIF_DEBUG, ("incoming: %d packages, first read into %x\n", epktcnt, (uintptr_t)(p))); | ||||
|             if (ERR_OK != netif->input(p, netif)) { | ||||
|                 pbuf_free(p); | ||||
|                 p = NULL; | ||||
|             } else { | ||||
|                 p = NULL; | ||||
|             } | ||||
|         } else { | ||||
|             // LWIP_DEBUGF(NETIF_DEBUG, ("didn't receive.\n"));
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static err_t spi_if_linkoutput(struct netif* netif, struct pbuf* p) | ||||
| { | ||||
|     while (!(getSn_SR(0) & SOCK_MACRAW)) | ||||
|         ; /* TODO: Implement wait timeout */ | ||||
| 
 | ||||
|     SYS_KDEBUG_LOG(WIZNET_DEBUG, ("[%s] data output, len: %d\n", __func__, p->tot_len)); | ||||
|     wiz_transmit_pbuf(p); | ||||
|     LWIP_DEBUGF(NETIF_DEBUG, ("sent %d bytes.\n", p->tot_len)); | ||||
|     /* TODO: Set up result value */ | ||||
|     return ERR_OK; | ||||
| } | ||||
| 
 | ||||
| err_t netif_initialize(struct netif* netif) | ||||
| { | ||||
|     netif->linkoutput = spi_if_linkoutput; | ||||
|     // netif->linkoutput = netif_output;
 | ||||
|     netif->output = etharp_output; | ||||
|     netif->mtu = ETHERNET_MTU; | ||||
|     netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6; | ||||
|     netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; | ||||
|     SMEMCPY(netif->hwaddr, wiz_mac, sizeof(netif->hwaddr)); | ||||
|     netif->hwaddr_len = sizeof(netif->hwaddr); | ||||
|     netif->name[0] = 'e'; | ||||
|     netif->name[1] = '0'; | ||||
|     return ERR_OK; | ||||
| } | ||||
| 
 | ||||
| static uint32_t ethernet_frame_crc(const uint8_t* data, int length) | ||||
| { | ||||
|     uint32_t crc = 0xffffffff; /* Initial value. */ | ||||
| 
 | ||||
|     while (--length >= 0) { | ||||
|         uint8_t current_octet = *data++; | ||||
| 
 | ||||
|         for (int bit = 8; --bit >= 0; current_octet >>= 1) { | ||||
|             if ((crc ^ current_octet) & 1) { | ||||
|                 crc >>= 1; | ||||
|                 crc ^= ethernet_polynomial_le; | ||||
|             } else | ||||
|                 crc >>= 1; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return ~crc; | ||||
| } | ||||
|  | @ -304,7 +304,7 @@ __exit: | |||
|     if (recv_data) free(recv_data); | ||||
| } | ||||
| 
 | ||||
| void iperf_usage(void) | ||||
| static void iperf_usage(void) | ||||
| { | ||||
|     KPrintf("Usage: iperf [-s|-c host] [options] [multi-threaded]\n"); | ||||
|     KPrintf("       iperf [-h|--stop]\n"); | ||||
|  | @ -326,7 +326,7 @@ void iperf_usage(void) | |||
|     return; | ||||
| } | ||||
| 
 | ||||
| int iperf(int argc, char **argv) | ||||
| int wiz_iperf(int argc, char** argv) | ||||
| { | ||||
|     int mode = 0; /* server mode */ | ||||
|     char *host = NULL; | ||||
|  | @ -460,6 +460,6 @@ __usage: | |||
|     return 0; | ||||
| } | ||||
| SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), | ||||
|                  iperf, iperf, | ||||
|                  iperf throughput test); | ||||
|     wiz_iperf, wiz_iperf, | ||||
|     iperf throughput test); | ||||
| #endif | ||||
|  |  | |||
|  | @ -0,0 +1,118 @@ | |||
| /**
 | ||||
|  * Copyright (c) 2022 WIZnet Co.,Ltd | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-3-Clause | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _W5x00_LWIP_H_ | ||||
| #define _W5x00_LWIP_H_ | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Includes | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| #include "lwip/netif.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Macros | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| /* LWIP */ | ||||
| #define ETHERNET_MTU 1500 | ||||
| #define SOCKET_MACRAW 0 | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Variables | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  * Functions | ||||
|  * ---------------------------------------------------------------------------------------------------- | ||||
|  */ | ||||
| /*! \brief send an ethernet packet
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *  It is used to send outgoing data to the socket. | ||||
|  * | ||||
|  *  \param sn socket number | ||||
|  *  \param buf a pointer to the data to send | ||||
|  *  \param len the length of data in packet | ||||
|  *  \return he sent data size | ||||
|  */ | ||||
| int32_t send_lwip(uint8_t sn, uint8_t* buf, uint16_t len); | ||||
| 
 | ||||
| /*! \brief read an ethernet packet
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *  It is used to read incoming data from the socket. | ||||
|  * | ||||
|  *  \param sn socket number | ||||
|  *  \param buf a pointer buffer to read incoming data | ||||
|  *  \param len the length of the data in the packet | ||||
|  *  \return the real received data size | ||||
|  */ | ||||
| int32_t recv_lwip(uint8_t sn, uint8_t* buf, uint16_t len); | ||||
| 
 | ||||
| /*! \brief callback function
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *  This function is called by ethernet_output() when it wants | ||||
|  *  to send a packet on the interface. This function outputs | ||||
|  *  the pbuf as-is on the link medium. | ||||
|  * | ||||
|  *  \param netif a pre-allocated netif structure | ||||
|  *  \param p main packet buffer struct | ||||
|  *  \return ERR_OK if data was sent. | ||||
|  */ | ||||
| err_t netif_output(struct netif* netif, struct pbuf* p); | ||||
| 
 | ||||
| /*! \brief callback function
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *  Callback function for link. | ||||
|  * | ||||
|  *  \param netif a pre-allocated netif structure | ||||
|  */ | ||||
| void netif_link_callback(struct netif* netif); | ||||
| 
 | ||||
| /*! \brief callback function
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *   Callback function for status. | ||||
|  * | ||||
|  *   \param netif a pre-allocated netif structure | ||||
|  */ | ||||
| void netif_status_callback(struct netif* netif); | ||||
| 
 | ||||
| /*! \brief callback function
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *  Callback function that initializes the interface. | ||||
|  * | ||||
|  *  \param netif a pre-allocated netif structure | ||||
|  *  \return ERR_OK if Network interface initialized | ||||
|  */ | ||||
| err_t netif_initialize(struct netif* netif); | ||||
| 
 | ||||
| /*! \brief ethernet frame cyclic redundancy check
 | ||||
|  *  \ingroup w5x00_lwip | ||||
|  * | ||||
|  *  Perform cyclic redundancy check on ethernet frame | ||||
|  * | ||||
|  *  \param data a pointer to the ethernet frame | ||||
|  *  \param length the total length of ethernet frame | ||||
|  *  \return an ethernet frame cyclic redundancy check result value | ||||
|  */ | ||||
| static uint32_t ethernet_frame_crc(const uint8_t* data, int length); | ||||
| 
 | ||||
| void ethernetif_input(void* netif_arg); | ||||
| void* ethernetif_config_enet_set(uint8_t enet_port); | ||||
| void Time_Update_LwIP(void); | ||||
| #define NETIF_ENET0_INIT_FUNC netif_initialize | ||||
| 
 | ||||
| #endif /* _W5x00_LWIP_H_ */ | ||||
|  | @ -46,6 +46,7 @@ extern "C" { | |||
| #define FILESYS_DEBUG 0 | ||||
| #define NETDEV_DEBUG 0 | ||||
| #define WEBNET_DEBUG 0 | ||||
| #define WIZNET_DEBUG 1 | ||||
| 
 | ||||
| #define SYS_KDEBUG_LOG(section, information) \ | ||||
|     do {                                     \ | ||||
|  |  | |||
|  | @ -112,6 +112,21 @@ KERNELPATHS += \ | |||
| 	-I$(BSP_ROOT)/third_party_driver/drivers \
 | ||||
| 	-I$(BSP_ROOT)/third_party_driver/lcd \
 | ||||
| 	-I$(KERNEL_ROOT)/include # | ||||
| 
 | ||||
| ifeq ($(CONFIG_RESOURCES_LWIP),y) | ||||
| KERNELPATHS += \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/compat \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/netif \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/apps \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/priv \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/prot \
 | ||||
| 	-I$(KERNEL_ROOT)/resources/ethernet/LwIP/arch  | ||||
| 
 | ||||
| KERNELPATHS += -I$(KERNEL_ROOT)/resources/include/netdev | ||||
| endif  | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(BSP_ROOT),$(KERNEL_ROOT)/board/kd233) | ||||
|  |  | |||
|  | @ -35,6 +35,11 @@ | |||
| /* ---------- Debug options ---------- */ | ||||
| #ifndef LWIP_DEBUG | ||||
| #define LWIP_DEBUG  1 | ||||
| // #define LWIP_SOCKET_DEBUG
 | ||||
| // #define LWIP_TCPIP_DEBUG
 | ||||
| // #define LWIP_TCP_INPUT_DEBUG
 | ||||
| // #define LWIP_TCP_OUTPUT_DEBUG
 | ||||
| // #define LWIP_NETIF_DEBUG
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef LWIP_DEBUG | ||||
|  | @ -219,6 +224,7 @@ | |||
| #define LWIP_SOCKET_SELECT      1 | ||||
| #define LWIP_SOCKET_POLL        1 | ||||
| 
 | ||||
| #define LWIP_DHCP_DOES_ACD_CHECK 0 | ||||
| /**
 | ||||
|  * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain | ||||
|  * critical regions during buffer allocation, deallocation and memory | ||||
|  | @ -242,7 +248,11 @@ | |||
| /* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
 | ||||
|    lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 | ||||
|    byte alignment -> define MEM_ALIGNMENT to 2. */ | ||||
| #ifndef RISCV_LWIP | ||||
| #define MEM_ALIGNMENT           4 | ||||
| #else | ||||
| #define MEM_ALIGNMENT 8 | ||||
| #endif | ||||
| 
 | ||||
| /* MEM_SIZE: the size of the heap memory. If the application will send
 | ||||
| a lot of data that needs to be copied, this should be set high. */ | ||||
|  | @ -287,7 +297,7 @@ a lot of data that needs to be copied, this should be set high. */ | |||
| 
 | ||||
| /* Controls if TCP should queue segments that arrive out of
 | ||||
|    order. Define to 0 if your device is low on memory. */ | ||||
| #define TCP_QUEUE_OOSEQ         1 | ||||
| #define TCP_QUEUE_OOSEQ 0 | ||||
| 
 | ||||
| /* TCP Maximum segment size. */ | ||||
| #define TCP_MSS                 (1500 - 40)	  /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */ | ||||
|  | @ -442,7 +452,11 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums | |||
| /**
 | ||||
|  * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) | ||||
|  */ | ||||
| #ifndef RISCV_LWIP | ||||
| #define LWIP_NETCONN                    1 | ||||
| #else | ||||
| #define LWIP_NETCONN 0 | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|    ------------------------------------ | ||||
|  |  | |||
|  | @ -338,11 +338,11 @@ void lwip_config_input(struct netif* net) | |||
| 
 | ||||
|     th_id = sys_thread_new("eth_input", ethernetif_input, net, LWIP_TASK_STACK_SIZE, 30); | ||||
| 
 | ||||
|     if (th_id >= 0) { | ||||
|         lw_print("%s %d successfully!\n", __func__, th_id); | ||||
|     } else { | ||||
|         lw_print("%s failed!\n", __func__); | ||||
|     } | ||||
|     // if (th_id >= 0) {
 | ||||
|     //     lw_print("%s %d successfully!\n", __func__, th_id);
 | ||||
|     // } else {
 | ||||
|     //     lw_print("%s failed!\n", __func__);
 | ||||
|     // }
 | ||||
| } | ||||
| 
 | ||||
| void lwip_config_tcp(uint8_t enet_port, char* ip, char* mask, char* gw) | ||||
|  |  | |||
|  | @ -200,7 +200,9 @@ typedef uintptr_t mem_ptr_t; | |||
| #include <unistd.h> | ||||
| #endif | ||||
| #else /* SSIZE_MAX */ | ||||
| #ifndef RISCV_LWIP | ||||
| typedef int ssize_t; | ||||
| #endif | ||||
| #define SSIZE_MAX INT_MAX | ||||
| #endif /* SSIZE_MAX */ | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue