浏览代码

[components][lwip]添加 LWIP 硬件校验和选项,修改 STM32 系列和 rt1052 系列以太网驱动,支持硬件校验和

zylx 6 年之前
父节点
当前提交
9818ee2d29

+ 4 - 0
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);

+ 6 - 33
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)

+ 4 - 0
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

+ 12 - 0
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

+ 12 - 0
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