浏览代码

[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.interrupt = 0xFFFFFFFF;
     config.miiSpeed = imxrt_eth_device.speed;
     config.miiSpeed = imxrt_eth_device.speed;
     config.miiDuplex = imxrt_eth_device.duplex;
     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. */
     /* Set SMI to get PHY link status. */
     sysClock = CLOCK_GetFreq(kCLOCK_AhbClk);
     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 ETH_DMADescTypeDef *DMARxDscrTab, *DMATxDscrTab;
 static rt_uint8_t *Rx_Buff, *Tx_Buff;
 static rt_uint8_t *Rx_Buff, *Tx_Buff;
-static rt_bool_t tx_is_waiting = RT_FALSE;
 static  ETH_HandleTypeDef EthHandle;
 static  ETH_HandleTypeDef EthHandle;
 static struct rt_stm32_eth stm32_eth_device;
 static struct rt_stm32_eth stm32_eth_device;
-static struct rt_semaphore tx_wait;
 
 
 #if defined(ETH_RX_DUMP) || defined(ETH_TX_DUMP)
 #if defined(ETH_RX_DUMP) || defined(ETH_TX_DUMP)
 #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
 #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.DuplexMode = ETH_MODE_FULLDUPLEX;
     EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
     EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
     EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE;
     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;
     EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE;
-
+#endif
+    
     HAL_ETH_DeInit(&EthHandle);
     HAL_ETH_DeInit(&EthHandle);
 
 
     /* configure ethernet peripheral (GPIOs, clocks, MAC, DMA) */
     /* 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;
     DmaTxDesc = EthHandle.TxDesc;
     bufferoffset = 0;
     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 */
     /* copy frame from pbufs to driver buffers */
     for (q = p; q != NULL; q = q->next)
     for (q = p; q != NULL; q = q->next)
     {
     {
         /* Is this buffer available? If not, goto error */
         /* Is this buffer available? If not, goto error */
         if ((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
         if ((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
         {
         {
-            LOG_E("buffer not valid");
+            LOG_D("buffer not valid");
             ret = ERR_USE;
             ret = ERR_USE;
             goto error;
             goto error;
         }
         }
@@ -391,15 +377,6 @@ void ETH_IRQHandler(void)
     rt_interrupt_leave();
     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)
 void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
 {
 {
     rt_err_t result;
     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_rx     = rt_stm32_eth_rx;
     stm32_eth_device.parent.eth_tx     = rt_stm32_eth_tx;
     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 */
     /* register eth device */
     state = eth_device_init(&(stm32_eth_device.parent), "e0");
     state = eth_device_init(&(stm32_eth_device.parent), "e0");
     if (RT_EOK == state)
     if (RT_EOK == state)

+ 4 - 0
components/net/Kconfig

@@ -261,6 +261,10 @@ config RT_USING_LWIP
             bool "Enable lwIP statistics"
             bool "Enable lwIP statistics"
             default n
             default n
 
 
+        config RT_LWIP_USING_HW_CHECKSUM
+            bool "Enable hardware checksum"
+            default n
+
         menuconfig RT_LWIP_DEBUG
         menuconfig RT_LWIP_DEBUG
             bool "Enable lwIP Debugging Options"
             bool "Enable lwIP Debugging Options"
             default n
             default n

+ 12 - 0
components/net/lwip-2.0.2/src/lwipopts.h

@@ -383,6 +383,18 @@
 #define ARP_TABLE_SIZE              10
 #define ARP_TABLE_SIZE              10
 #define ARP_QUEUEING                1
 #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 ---------- */
 /* ---------- IP options ---------- */
 /* Define IP_FORWARD to 1 if you wish to have the ability to forward
 /* 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
    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_TABLE_SIZE              10
 #define ARP_QUEUEING                1
 #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 ---------- */
 /* ---------- IP options ---------- */
 /* Define IP_FORWARD to 1 if you wish to have the ability to forward
 /* 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
    IP packets across network interfaces. If you are going to run lwIP