[components][lwip]添加 LWIP 硬件校验和选项,修改 STM32 系列和 rt1052 系列以太网驱动,支持硬件校验和
This commit is contained in:
parent
cdb469cee9
commit
9818ee2d29
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue