提交 9818ee2d 编写于 作者: Z zylx

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

上级 cdb469ce
...@@ -668,6 +668,10 @@ static void _enet_config(void) ...@@ -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);
......
...@@ -44,10 +44,8 @@ struct rt_stm32_eth ...@@ -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,7 +89,11 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev) ...@@ -91,7 +89,11 @@ 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);
...@@ -190,29 +192,13 @@ rt_err_t rt_stm32_eth_tx(rt_device_t dev, struct pbuf *p) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -261,6 +261,10 @@ config RT_USING_LWIP ...@@ -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
......
...@@ -383,6 +383,18 @@ ...@@ -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
......
...@@ -390,6 +390,18 @@ ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册