summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzylx <[email protected]>2019-03-14 16:35:33 +0800
committerzylx <[email protected]>2019-03-14 16:39:50 +0800
commit9818ee2d2908ffa9c1286484863a7a1ebe3c2f8e (patch)
tree16527fe21c11ff1010538b6a2c0589377baac607
parentcdb469cee9740e155ee51d00c0fa49a3d93f5b11 (diff)
[components][lwip]添加 LWIP 硬件校验和选项,修改 STM32 系列和 rt1052 系列以太网驱动,支持硬件校验和
-rw-r--r--bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c4
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/drv_eth.c39
-rw-r--r--components/net/Kconfig4
-rw-r--r--components/net/lwip-2.0.2/src/lwipopts.h12
-rw-r--r--components/net/lwip-2.1.0/src/lwipopts.h12
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