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

This commit is contained in:
zylx 2019-03-14 16:35:33 +08:00
parent cdb469cee9
commit 9818ee2d29
5 changed files with 38 additions and 33 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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