From 9818ee2d2908ffa9c1286484863a7a1ebe3c2f8e Mon Sep 17 00:00:00 2001 From: zylx Date: Thu, 14 Mar 2019 16:35:33 +0800 Subject: [PATCH] =?UTF-8?q?[components][lwip]=E6=B7=BB=E5=8A=A0=20LWIP=20?= =?UTF-8?q?=E7=A1=AC=E4=BB=B6=E6=A0=A1=E9=AA=8C=E5=92=8C=E9=80=89=E9=A1=B9?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=20STM32=20=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E5=92=8C=20rt1052=20=E7=B3=BB=E5=88=97=E4=BB=A5=E5=A4=AA?= =?UTF-8?q?=E7=BD=91=E9=A9=B1=E5=8A=A8=EF=BC=8C=E6=94=AF=E6=8C=81=E7=A1=AC?= =?UTF-8?q?=E4=BB=B6=E6=A0=A1=E9=AA=8C=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Libraries/imxrt1050/drivers/drv_eth.c | 4 ++ bsp/stm32/libraries/HAL_Drivers/drv_eth.c | 39 +++---------------- components/net/Kconfig | 4 ++ components/net/lwip-2.0.2/src/lwipopts.h | 12 ++++++ components/net/lwip-2.1.0/src/lwipopts.h | 12 ++++++ 5 files changed, 38 insertions(+), 33 deletions(-) diff --git a/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c b/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c index 54666a7b1c..0d72acbdd8 100644 --- a/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c +++ b/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c @@ -668,6 +668,10 @@ static void _enet_config(void) //config.interrupt = 0xFFFFFFFF; config.miiSpeed = imxrt_eth_device.speed; config.miiDuplex = imxrt_eth_device.duplex; +#ifdef RT_LWIP_USING_HW_CHECKSUM + config.rxAccelerConfig = ENET_RACC_PRODIS_MASK | ENET_RACC_IPDIS_MASK; + config.txAccelerConfig = ENET_TACC_IPCHK_MASK | ENET_TACC_PROCHK_MASK; +#endif /* Set SMI to get PHY link status. */ sysClock = CLOCK_GetFreq(kCLOCK_AhbClk); diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_eth.c b/bsp/stm32/libraries/HAL_Drivers/drv_eth.c index 315c1b9890..493f4190ad 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_eth.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_eth.c @@ -44,10 +44,8 @@ struct rt_stm32_eth static ETH_DMADescTypeDef *DMARxDscrTab, *DMATxDscrTab; static rt_uint8_t *Rx_Buff, *Tx_Buff; -static rt_bool_t tx_is_waiting = RT_FALSE; static ETH_HandleTypeDef EthHandle; static struct rt_stm32_eth stm32_eth_device; -static struct rt_semaphore tx_wait; #if defined(ETH_RX_DUMP) || defined(ETH_TX_DUMP) #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') @@ -91,8 +89,12 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev) EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX; EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE; +#ifdef RT_LWIP_USING_HW_CHECKSUM + EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; +#else EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE; - +#endif + HAL_ETH_DeInit(&EthHandle); /* configure ethernet peripheral (GPIOs, clocks, MAC, DMA) */ @@ -190,29 +192,13 @@ rt_err_t rt_stm32_eth_tx(rt_device_t dev, struct pbuf *p) DmaTxDesc = EthHandle.TxDesc; bufferoffset = 0; - /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ - while ((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET) - { - rt_err_t result; - rt_uint32_t level; - - level = rt_hw_interrupt_disable(); - tx_is_waiting = RT_TRUE; - rt_hw_interrupt_enable(level); - - /* it's own bit set, wait it */ - result = rt_sem_take(&tx_wait, RT_WAITING_FOREVER); - if (result == RT_EOK) break; - if (result == -RT_ERROR) return -RT_ERROR; - } - /* copy frame from pbufs to driver buffers */ for (q = p; q != NULL; q = q->next) { /* Is this buffer available? If not, goto error */ if ((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET) { - LOG_E("buffer not valid"); + LOG_D("buffer not valid"); ret = ERR_USE; goto error; } @@ -391,15 +377,6 @@ void ETH_IRQHandler(void) rt_interrupt_leave(); } -void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth) -{ - if (tx_is_waiting == RT_TRUE) - { - tx_is_waiting = RT_FALSE; - rt_sem_release(&tx_wait); - } -} - void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) { rt_err_t result; @@ -635,10 +612,6 @@ static int rt_hw_stm32_eth_init(void) stm32_eth_device.parent.eth_rx = rt_stm32_eth_rx; stm32_eth_device.parent.eth_tx = rt_stm32_eth_tx; - /* init tx semaphore */ - rt_sem_init(&tx_wait, "tx_wait", 0, RT_IPC_FLAG_FIFO); - LOG_D("initialize tx wait semaphore"); - /* register eth device */ state = eth_device_init(&(stm32_eth_device.parent), "e0"); if (RT_EOK == state) diff --git a/components/net/Kconfig b/components/net/Kconfig index cef3ceacd3..cfeaca5a51 100644 --- a/components/net/Kconfig +++ b/components/net/Kconfig @@ -261,6 +261,10 @@ config RT_USING_LWIP bool "Enable lwIP statistics" default n + config RT_LWIP_USING_HW_CHECKSUM + bool "Enable hardware checksum" + default n + menuconfig RT_LWIP_DEBUG bool "Enable lwIP Debugging Options" default n diff --git a/components/net/lwip-2.0.2/src/lwipopts.h b/components/net/lwip-2.0.2/src/lwipopts.h index 07901c3fa1..f90ef1a825 100644 --- a/components/net/lwip-2.0.2/src/lwipopts.h +++ b/components/net/lwip-2.0.2/src/lwipopts.h @@ -383,6 +383,18 @@ #define ARP_TABLE_SIZE 10 #define ARP_QUEUEING 1 +/* ---------- Checksum options ---------- */ +#ifdef RT_LWIP_USING_HW_CHECKSUM +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 +#define CHECKSUM_CHECK_ICMP 0 +#endif + /* ---------- IP options ---------- */ /* Define IP_FORWARD to 1 if you wish to have the ability to forward IP packets across network interfaces. If you are going to run lwIP diff --git a/components/net/lwip-2.1.0/src/lwipopts.h b/components/net/lwip-2.1.0/src/lwipopts.h index 4e65fd65ba..405e95ce64 100644 --- a/components/net/lwip-2.1.0/src/lwipopts.h +++ b/components/net/lwip-2.1.0/src/lwipopts.h @@ -390,6 +390,18 @@ #define ARP_TABLE_SIZE 10 #define ARP_QUEUEING 1 +/* ---------- Checksum options ---------- */ +#ifdef RT_LWIP_USING_HW_CHECKSUM +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 +#define CHECKSUM_CHECK_ICMP 0 +#endif + /* ---------- IP options ---------- */ /* Define IP_FORWARD to 1 if you wish to have the ability to forward IP packets across network interfaces. If you are going to run lwIP