forked from xuos/xiuos
				
			23/07/11 Fix Lwip TCP Rx Speed.
This commit is contained in:
		
							parent
							
								
									42e3b261ab
								
							
						
					
					
						commit
						1086321a63
					
				| 
						 | 
					@ -1 +1,3 @@
 | 
				
			||||||
 | 
					config BSP_USING_ETH
 | 
				
			||||||
 | 
					    bool 
 | 
				
			||||||
 | 
					    default y
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,3 @@
 | 
				
			||||||
SRC_FILES := ethernetif.c 
 | 
					SRC_FILES := ethernetif.c eth_driver.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,279 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* @file ethernetif.c
 | 
				
			||||||
 | 
					* @brief support hc32f4a0-board ethernetif function and register to Lwip
 | 
				
			||||||
 | 
					* @version 3.0 
 | 
				
			||||||
 | 
					* @author AIIT XUOS Lab
 | 
				
			||||||
 | 
					* @date 2022-12-05
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <connect_ethernet.h>
 | 
				
			||||||
 | 
					#include <hc32_ll_gpio.h>
 | 
				
			||||||
 | 
					#include <hc32_ll_utility.h>
 | 
				
			||||||
 | 
					#include <hc32_ll_fcg.h>
 | 
				
			||||||
 | 
					#include <lwip/timeouts.h>
 | 
				
			||||||
 | 
					#include <netif/etharp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void eth_irq_handler(void) {
 | 
				
			||||||
 | 
					    static x_base eth_irq_lock;
 | 
				
			||||||
 | 
					    eth_irq_lock = DISABLE_INTERRUPT();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // handle irq
 | 
				
			||||||
 | 
					    if (RESET != ETH_DMA_GetStatus(ETH_DMA_FLAG_RIS)) {
 | 
				
			||||||
 | 
					        sys_sem_signal(get_eth_recv_sem());
 | 
				
			||||||
 | 
					        ETH_DMA_ClearStatus(ETH_DMA_FLAG_RIS | ETH_DMA_FLAG_NIS);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ENABLE_INTERRUPT(eth_irq_lock);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief  In this function, the hardware should be initialized.
 | 
				
			||||||
 | 
					 * @param  netif                         The already initialized network interface structure for this ethernetif.
 | 
				
			||||||
 | 
					 * @retval int32_t:
 | 
				
			||||||
 | 
					 *           - LL_OK: Initialize success
 | 
				
			||||||
 | 
					 *           - LL_ERR: Initialize failed
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int32_t low_level_init(struct netif *netif)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int32_t i32Ret = LL_ERR;
 | 
				
			||||||
 | 
					    stc_eth_init_t stcEthInit;
 | 
				
			||||||
 | 
					    uint16_t u16RegVal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable ETH clock */
 | 
				
			||||||
 | 
					    FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_ETHMAC, ENABLE);
 | 
				
			||||||
 | 
					    /* Init Ethernet GPIO */
 | 
				
			||||||
 | 
					    Ethernet_GpioInit();
 | 
				
			||||||
 | 
					    /* Reset ETHERNET */
 | 
				
			||||||
 | 
					    (void)ETH_DeInit();
 | 
				
			||||||
 | 
					    /* Configure structure initialization */
 | 
				
			||||||
 | 
					    (void)ETH_CommStructInit(&EthHandle.stcCommInit);
 | 
				
			||||||
 | 
					    (void)ETH_StructInit(&stcEthInit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ETH_INTERFACE_RMII
 | 
				
			||||||
 | 
					    EthHandle.stcCommInit.u32Interface  = ETH_MAC_IF_RMII;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    EthHandle.stcCommInit.u32Interface  = ETH_MAC_IF_MII;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    // stcEthInit.stcMacInit.u32ReceiveAll = ETH_MAC_RX_ALL_ENABLE;
 | 
				
			||||||
 | 
					    EthHandle.stcCommInit.u32ReceiveMode = ETH_RX_MD_INT;
 | 
				
			||||||
 | 
					    // EthHandle.stcCommInit.u32ChecksumMode = ETH_MAC_CHECKSUM_MD_SW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // install irq
 | 
				
			||||||
 | 
					    sys_sem_new(get_eth_recv_sem(), 0);
 | 
				
			||||||
 | 
					    hc32_install_irq_handler(ð_irq_config, eth_irq_handler, ENABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Configure ethernet peripheral */
 | 
				
			||||||
 | 
					    if (LL_OK == ETH_Init(&EthHandle, &stcEthInit)) {
 | 
				
			||||||
 | 
					        u8EthInitStatus = 1U;
 | 
				
			||||||
 | 
					        i32Ret = LL_OK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ETHERNET_LOOPBACK_TEST
 | 
				
			||||||
 | 
					    /* Enable PHY loopback */
 | 
				
			||||||
 | 
					    (void)ETH_PHY_LoopBackCmd(&EthHandle, ENABLE);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Initialize Tx Descriptors list: Chain Mode */
 | 
				
			||||||
 | 
					    (void)ETH_DMA_TxDescListInit(&EthHandle, EthDmaTxDscrTab, &EthTxBuff[0][0], ETH_TX_BUF_NUM);
 | 
				
			||||||
 | 
					    /* Initialize Rx Descriptors list: Chain Mode  */
 | 
				
			||||||
 | 
					    (void)ETH_DMA_RxDescListInit(&EthHandle, EthDmaRxDscrTab, &EthRxBuff[0][0], ETH_RX_BUF_NUM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* set MAC hardware address length */
 | 
				
			||||||
 | 
					    netif->hwaddr_len = 6U;
 | 
				
			||||||
 | 
					    /* set MAC hardware address */
 | 
				
			||||||
 | 
					    EthHandle.stcCommInit.u16AutoNego = ETH_AUTO_NEGO_DISABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    netif->hwaddr[0] = (EthHandle.stcCommInit).au8MacAddr[0];
 | 
				
			||||||
 | 
					    netif->hwaddr[1] = (EthHandle.stcCommInit).au8MacAddr[1];
 | 
				
			||||||
 | 
					    netif->hwaddr[2] = (EthHandle.stcCommInit).au8MacAddr[2];
 | 
				
			||||||
 | 
					    netif->hwaddr[3] = (EthHandle.stcCommInit).au8MacAddr[3];
 | 
				
			||||||
 | 
					    netif->hwaddr[4] = (EthHandle.stcCommInit).au8MacAddr[4];
 | 
				
			||||||
 | 
					    netif->hwaddr[5] = (EthHandle.stcCommInit).au8MacAddr[5];
 | 
				
			||||||
 | 
					    /* maximum transfer unit */
 | 
				
			||||||
 | 
					    netif->mtu = 1500U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* device capabilities */
 | 
				
			||||||
 | 
					    netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Enable MAC and DMA transmission and reception */
 | 
				
			||||||
 | 
					    (void)ETH_Start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Configure PHY LED mode */
 | 
				
			||||||
 | 
					    u16RegVal = PHY_PAGE_ADDR_7;
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
				
			||||||
 | 
					    (void)ETH_PHY_ReadReg(&EthHandle, PHY_P7_IWLFR, &u16RegVal);
 | 
				
			||||||
 | 
					    MODIFY_REG16(u16RegVal, PHY_LED_SELECT, PHY_LED_SELECT_10);
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_P7_IWLFR, u16RegVal);
 | 
				
			||||||
 | 
					    u16RegVal = PHY_PAGE_ADDR_0;
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ETH_INTERFACE_RMII
 | 
				
			||||||
 | 
					    /* Disable Power Saving Mode */
 | 
				
			||||||
 | 
					    (void)ETH_PHY_ReadReg(&EthHandle, PHY_PSMR, &u16RegVal);
 | 
				
			||||||
 | 
					    CLR_REG16_BIT(u16RegVal, PHY_EN_PWR_SAVE);
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSMR, u16RegVal);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Configure PHY to generate an interrupt when Eth Link state changes */
 | 
				
			||||||
 | 
					    u16RegVal = PHY_PAGE_ADDR_7;
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
				
			||||||
 | 
					    /* Enable Interrupt on change of link status */
 | 
				
			||||||
 | 
					    (void)ETH_PHY_ReadReg(&EthHandle, PHY_P7_IWLFR, &u16RegVal);
 | 
				
			||||||
 | 
					    SET_REG16_BIT(u16RegVal, PHY_INT_LINK_CHANGE);
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_P7_IWLFR, u16RegVal);
 | 
				
			||||||
 | 
					    u16RegVal = PHY_PAGE_ADDR_0;
 | 
				
			||||||
 | 
					    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return i32Ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief  This function should do the actual transmission of the packet.
 | 
				
			||||||
 | 
					 * @param  netif                        The network interface structure for this ethernetif.
 | 
				
			||||||
 | 
					 * @param  p                            The MAC packet to send.
 | 
				
			||||||
 | 
					 * @retval int32_t:
 | 
				
			||||||
 | 
					 *           - LL_OK: The packet could be sent
 | 
				
			||||||
 | 
					 *           - LL_ERR: The packet couldn't be sent
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					err_t low_level_output(struct netif *netif, struct pbuf *p)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    err_t i32Ret;
 | 
				
			||||||
 | 
					    struct pbuf *q;
 | 
				
			||||||
 | 
					    uint8_t *txBuffer;
 | 
				
			||||||
 | 
					    __IO stc_eth_dma_desc_t *DmaTxDesc;
 | 
				
			||||||
 | 
					    uint32_t byteCnt;
 | 
				
			||||||
 | 
					    uint32_t frameLength = 0UL;
 | 
				
			||||||
 | 
					    uint32_t bufferOffset;
 | 
				
			||||||
 | 
					    uint32_t payloadOffset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DmaTxDesc = EthHandle.stcTxDesc;
 | 
				
			||||||
 | 
					    txBuffer = (uint8_t *)((EthHandle.stcTxDesc)->u32Buf1Addr);
 | 
				
			||||||
 | 
					    bufferOffset = 0UL;
 | 
				
			||||||
 | 
					    /* Copy frame from pbufs to driver buffers */
 | 
				
			||||||
 | 
					    for (q = p; q != NULL; q = q->next) {
 | 
				
			||||||
 | 
					        /* If this buffer isn't available, goto error */
 | 
				
			||||||
 | 
					        if (0UL != (DmaTxDesc->u32ControlStatus & ETH_DMA_TXDESC_OWN)) {
 | 
				
			||||||
 | 
					            i32Ret = (err_t)ERR_USE;
 | 
				
			||||||
 | 
					            goto error;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Get bytes in current buffer */
 | 
				
			||||||
 | 
					        byteCnt = q->len;
 | 
				
			||||||
 | 
					        payloadOffset = 0UL;
 | 
				
			||||||
 | 
					        /* Check if the length of data to copy is bigger than Tx buffer size */
 | 
				
			||||||
 | 
					        while ((byteCnt + bufferOffset) > ETH_TX_BUF_SIZE) {
 | 
				
			||||||
 | 
					            /* Copy data to Tx buffer*/
 | 
				
			||||||
 | 
					            (void)memcpy((uint8_t *) & (txBuffer[bufferOffset]), (uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (ETH_TX_BUF_SIZE - bufferOffset));
 | 
				
			||||||
 | 
					            /* Point to next descriptor */
 | 
				
			||||||
 | 
					            DmaTxDesc = (stc_eth_dma_desc_t *)(DmaTxDesc->u32Buf2NextDescAddr);
 | 
				
			||||||
 | 
					            /* Check if the buffer is available */
 | 
				
			||||||
 | 
					            if (0UL != (DmaTxDesc->u32ControlStatus & ETH_DMA_TXDESC_OWN)) {
 | 
				
			||||||
 | 
					                i32Ret = (err_t)ERR_USE;
 | 
				
			||||||
 | 
					                goto error;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            txBuffer = (uint8_t *)(DmaTxDesc->u32Buf1Addr);
 | 
				
			||||||
 | 
					            byteCnt = byteCnt - (ETH_TX_BUF_SIZE - bufferOffset);
 | 
				
			||||||
 | 
					            payloadOffset = payloadOffset + (ETH_TX_BUF_SIZE - bufferOffset);
 | 
				
			||||||
 | 
					            frameLength = frameLength + (ETH_TX_BUF_SIZE - bufferOffset);
 | 
				
			||||||
 | 
					            bufferOffset = 0UL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* Copy the remaining bytes */
 | 
				
			||||||
 | 
					        (void)memcpy((uint8_t *) & (txBuffer[bufferOffset]), (uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), byteCnt);
 | 
				
			||||||
 | 
					        bufferOffset = bufferOffset + byteCnt;
 | 
				
			||||||
 | 
					        frameLength = frameLength + byteCnt;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* Prepare transmit descriptors to give to DMA */
 | 
				
			||||||
 | 
					    if(LL_OK != ETH_DMA_SetTransFrame(&EthHandle, frameLength)) {
 | 
				
			||||||
 | 
					        KPrintf("[%s] Error sending eth DMA frame\n", __func__);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    i32Ret = (err_t)ERR_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error:
 | 
				
			||||||
 | 
					    /* When Transmit Underflow flag is set, clear it and issue a Transmit Poll Demand to resume transmission */
 | 
				
			||||||
 | 
					    if (RESET != ETH_DMA_GetStatus(ETH_DMA_FLAG_UNS)) {
 | 
				
			||||||
 | 
					        /* Clear DMA UNS flag */
 | 
				
			||||||
 | 
					        ETH_DMA_ClearStatus(ETH_DMA_FLAG_UNS);
 | 
				
			||||||
 | 
					        /* Resume DMA transmission */
 | 
				
			||||||
 | 
					        WRITE_REG32(CM_ETH->DMA_TXPOLLR, 0UL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return i32Ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief  Should allocate a pbuf and transfer the bytes of the incoming packet from the interface into the pbuf.
 | 
				
			||||||
 | 
					 * @param  netif                        The network interface structure for this ethernetif.
 | 
				
			||||||
 | 
					 * @retval A pbuf filled with the received packet (including MAC header) or NULL on memory error.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct pbuf *low_level_input(struct netif *netif)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct pbuf *p = NULL;
 | 
				
			||||||
 | 
					    struct pbuf *q;
 | 
				
			||||||
 | 
					    uint32_t len;
 | 
				
			||||||
 | 
					    uint8_t *rxBuffer;
 | 
				
			||||||
 | 
					    __IO stc_eth_dma_desc_t *DmaRxDesc;
 | 
				
			||||||
 | 
					    uint32_t byteCnt;
 | 
				
			||||||
 | 
					    uint32_t bufferOffset;
 | 
				
			||||||
 | 
					    uint32_t payloadOffset;
 | 
				
			||||||
 | 
					    uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Get received frame */
 | 
				
			||||||
 | 
					    if (LL_OK != ETH_DMA_GetReceiveFrame(&EthHandle)) {
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Obtain the size of the packet */
 | 
				
			||||||
 | 
					    len = (EthHandle.stcRxFrame).u32Len;
 | 
				
			||||||
 | 
					    rxBuffer = (uint8_t *)(EthHandle.stcRxFrame).u32Buf;
 | 
				
			||||||
 | 
					    if (len > 0UL) {
 | 
				
			||||||
 | 
					        /* Allocate a pbuf chain of pbufs from the buffer */
 | 
				
			||||||
 | 
					        p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
 | 
				
			||||||
 | 
					        // p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (p != NULL) {
 | 
				
			||||||
 | 
					        DmaRxDesc = (EthHandle.stcRxFrame).pstcFSDesc;
 | 
				
			||||||
 | 
					        bufferOffset = 0UL;
 | 
				
			||||||
 | 
					        for (q = p; q != NULL; q = q->next) {
 | 
				
			||||||
 | 
					            byteCnt = q->len;
 | 
				
			||||||
 | 
					            payloadOffset = 0UL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size */
 | 
				
			||||||
 | 
					            while ((byteCnt + bufferOffset) > ETH_RX_BUF_SIZE) {
 | 
				
			||||||
 | 
					                /* Copy data to pbuf */
 | 
				
			||||||
 | 
					                (void)memcpy((uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (uint8_t *) & (rxBuffer[bufferOffset]), (ETH_RX_BUF_SIZE - bufferOffset));
 | 
				
			||||||
 | 
					                /* Point to next descriptor */
 | 
				
			||||||
 | 
					                DmaRxDesc = (stc_eth_dma_desc_t *)(DmaRxDesc->u32Buf2NextDescAddr);
 | 
				
			||||||
 | 
					                rxBuffer = (uint8_t *)(DmaRxDesc->u32Buf1Addr);
 | 
				
			||||||
 | 
					                byteCnt = byteCnt - (ETH_RX_BUF_SIZE - bufferOffset);
 | 
				
			||||||
 | 
					                payloadOffset = payloadOffset + (ETH_RX_BUF_SIZE - bufferOffset);
 | 
				
			||||||
 | 
					                bufferOffset = 0UL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Copy remaining data in pbuf */
 | 
				
			||||||
 | 
					            (void)memcpy((uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (uint8_t *) & (rxBuffer[bufferOffset]), byteCnt);
 | 
				
			||||||
 | 
					            bufferOffset = bufferOffset + byteCnt;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* Release descriptors to DMA */
 | 
				
			||||||
 | 
					    DmaRxDesc = (EthHandle.stcRxFrame).pstcFSDesc;
 | 
				
			||||||
 | 
					    for (i = 0UL; i < (EthHandle.stcRxFrame).u32SegCount; i++) {
 | 
				
			||||||
 | 
					        DmaRxDesc->u32ControlStatus |= ETH_DMA_RXDESC_OWN;
 | 
				
			||||||
 | 
					        DmaRxDesc = (stc_eth_dma_desc_t *)(DmaRxDesc->u32Buf2NextDescAddr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* Clear Segment_Count */
 | 
				
			||||||
 | 
					    (EthHandle.stcRxFrame).u32SegCount = 0UL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* When Rx Buffer unavailable flag is set, clear it and resume reception */
 | 
				
			||||||
 | 
					    if (RESET != ETH_DMA_GetStatus(ETH_DMA_FLAG_RUS)) {
 | 
				
			||||||
 | 
					        /* Clear DMA RUS flag */
 | 
				
			||||||
 | 
					        ETH_DMA_ClearStatus(ETH_DMA_FLAG_RUS);
 | 
				
			||||||
 | 
					        /* Resume DMA reception */
 | 
				
			||||||
 | 
					        WRITE_REG32(CM_ETH->DMA_RXPOLLR, 0UL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,14 +46,15 @@ Modification:
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
 * Include files
 | 
					 * Include files
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
#include <hardware_ethernetif.h>
 | 
					#include <connect_ethernet.h>
 | 
				
			||||||
#include <hc32_ll_eth.h>
 | 
					 | 
				
			||||||
#include <hc32_ll_gpio.h>
 | 
					#include <hc32_ll_gpio.h>
 | 
				
			||||||
#include <hc32_ll_utility.h>
 | 
					#include <hc32_ll_utility.h>
 | 
				
			||||||
#include <hc32_ll_fcg.h>
 | 
					#include <hc32_ll_fcg.h>
 | 
				
			||||||
#include <lwip/timeouts.h>
 | 
					#include <lwip/timeouts.h>
 | 
				
			||||||
#include <netif/etharp.h>
 | 
					#include <netif/etharp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <xs_isr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @addtogroup HC32F4A0_DDL_Examples
 | 
					 * @addtogroup HC32F4A0_DDL_Examples
 | 
				
			||||||
 * @{
 | 
					 * @{
 | 
				
			||||||
| 
						 | 
					@ -71,33 +72,7 @@ Modification:
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
 * Local pre-processor symbols/macros ('#define')
 | 
					 * Local pre-processor symbols/macros ('#define')
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
/* Define those to better describe your network interface. */
 | 
					 | 
				
			||||||
#define IFNAME0                         'h'
 | 
					 | 
				
			||||||
#define IFNAME1                         'd'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PHY hardware reset time */
 | 
					 | 
				
			||||||
#define PHY_HW_RST_DELAY                (0x40U)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ETH_RST = PH11 */
 | 
					 | 
				
			||||||
#define ETH_RST_PORT                    (GPIO_PORT_H)
 | 
					 | 
				
			||||||
#define ETH_RST_PIN                     (GPIO_PIN_11)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ETH_LINK_LED = PD00 LED2 */
 | 
					 | 
				
			||||||
#define ETH_LINK_LED_PORT               (GPIO_PORT_D)
 | 
					 | 
				
			||||||
#define ETH_LINK_LED_PIN                (GPIO_PIN_00)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//#define ETHERNET_LOOPBACK_TEST
 | 
					 | 
				
			||||||
#ifdef ETHERNET_LOOPBACK_TEST
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define USER_KEY_PORT                  (GPIO_PORT_I)
 | 
					 | 
				
			||||||
#define USER_KEY_PIN                   (GPIO_PIN_07)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ethe global netif */
 | 
					 | 
				
			||||||
static struct netif testnetif;
 | 
					 | 
				
			||||||
/* eth tx buffer */
 | 
					 | 
				
			||||||
static struct pbuf txPbuf;
 | 
					 | 
				
			||||||
static char txBuf[] = "Ethernet Loop-Back Test";
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
 * Global variable definitions (declared in header file with 'extern')
 | 
					 * Global variable definitions (declared in header file with 'extern')
 | 
				
			||||||
| 
						 | 
					@ -111,19 +86,6 @@ static char txBuf[] = "Ethernet Loop-Back Test";
 | 
				
			||||||
 * Local variable definitions ('static')
 | 
					 * Local variable definitions ('static')
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Global Ethernet handle*/
 | 
					 | 
				
			||||||
static stc_eth_handle_t EthHandle;
 | 
					 | 
				
			||||||
/* Ethernet Tx DMA Descriptor */
 | 
					 | 
				
			||||||
__ALIGN_BEGIN static stc_eth_dma_desc_t EthDmaTxDscrTab[ETH_TX_BUF_NUM];
 | 
					 | 
				
			||||||
/* Ethernet Rx DMA Descriptor */
 | 
					 | 
				
			||||||
__ALIGN_BEGIN static stc_eth_dma_desc_t EthDmaRxDscrTab[ETH_RX_BUF_NUM];
 | 
					 | 
				
			||||||
/* Ethernet Transmit Buffer */
 | 
					 | 
				
			||||||
__ALIGN_BEGIN static uint8_t EthTxBuff[ETH_TX_BUF_NUM][ETH_TX_BUF_SIZE];
 | 
					 | 
				
			||||||
/* Ethernet Receive Buffer */
 | 
					 | 
				
			||||||
__ALIGN_BEGIN static uint8_t EthRxBuff[ETH_RX_BUF_NUM][ETH_RX_BUF_SIZE];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Ethernet link status */
 | 
					 | 
				
			||||||
static uint8_t u8PhyLinkStatus = 0U, u8EthInitStatus = 0U;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*******************************************************************************
 | 
					/*******************************************************************************
 | 
				
			||||||
 * Function implementation - global ('extern') and local ('static')
 | 
					 * Function implementation - global ('extern') and local ('static')
 | 
				
			||||||
| 
						 | 
					@ -133,22 +95,12 @@ static uint8_t u8PhyLinkStatus = 0U, u8EthInitStatus = 0U;
 | 
				
			||||||
 * @{
 | 
					 * @{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *ethernetif_config_enet_set(uint8_t enet_port)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return NONE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Time_Update_LwIP(void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    //no need to do
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief  Initializes the Ethernet GPIO.
 | 
					 * @brief  Initializes the Ethernet GPIO.
 | 
				
			||||||
 * @param  None
 | 
					 * @param  None
 | 
				
			||||||
 * @retval None
 | 
					 * @retval None
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void Ethernet_GpioInit(void)
 | 
					void Ethernet_GpioInit(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* ETH_RST */
 | 
					    /* ETH_RST */
 | 
				
			||||||
    stc_gpio_init_t stcGpioInit;
 | 
					    stc_gpio_init_t stcGpioInit;
 | 
				
			||||||
| 
						 | 
					@ -228,241 +180,12 @@ static void Ethernet_GpioInit(void)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					void *ethernetif_config_enet_set(uint8_t enet_port) {
 | 
				
			||||||
 * @brief  In this function, the hardware should be initialized.
 | 
					    return NONE;
 | 
				
			||||||
 * @param  netif                         The already initialized network interface structure for this ethernetif.
 | 
					 | 
				
			||||||
 * @retval int32_t:
 | 
					 | 
				
			||||||
 *           - LL_OK: Initialize success
 | 
					 | 
				
			||||||
 *           - LL_ERR: Initialize failed
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int32_t low_level_init(struct netif *netif)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int32_t i32Ret = LL_ERR;
 | 
					 | 
				
			||||||
    stc_eth_init_t stcEthInit;
 | 
					 | 
				
			||||||
    uint16_t u16RegVal;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Enable ETH clock */
 | 
					 | 
				
			||||||
    FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_ETHMAC, ENABLE);
 | 
					 | 
				
			||||||
    /* Init Ethernet GPIO */
 | 
					 | 
				
			||||||
    Ethernet_GpioInit();
 | 
					 | 
				
			||||||
    /* Reset ETHERNET */
 | 
					 | 
				
			||||||
    (void)ETH_DeInit();
 | 
					 | 
				
			||||||
    /* Configure structure initialization */
 | 
					 | 
				
			||||||
    (void)ETH_CommStructInit(&EthHandle.stcCommInit);
 | 
					 | 
				
			||||||
    (void)ETH_StructInit(&stcEthInit);
 | 
					 | 
				
			||||||
#ifdef ETH_INTERFACE_RMII
 | 
					 | 
				
			||||||
    EthHandle.stcCommInit.u32Interface  = ETH_MAC_IF_RMII;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    EthHandle.stcCommInit.u32Interface  = ETH_MAC_IF_MII;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    stcEthInit.stcMacInit.u32ReceiveAll = ETH_MAC_RX_ALL_ENABLE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Configure ethernet peripheral */
 | 
					 | 
				
			||||||
    if (LL_OK == ETH_Init(&EthHandle, &stcEthInit)) {
 | 
					 | 
				
			||||||
        u8EthInitStatus = 1U;
 | 
					 | 
				
			||||||
        i32Ret = LL_OK;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef ETHERNET_LOOPBACK_TEST
 | 
					 | 
				
			||||||
    /* Enable PHY loopback */
 | 
					 | 
				
			||||||
    (void)ETH_PHY_LoopBackCmd(&EthHandle, ENABLE);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Initialize Tx Descriptors list: Chain Mode */
 | 
					 | 
				
			||||||
    (void)ETH_DMA_TxDescListInit(&EthHandle, EthDmaTxDscrTab, &EthTxBuff[0][0], ETH_TX_BUF_NUM);
 | 
					 | 
				
			||||||
    /* Initialize Rx Descriptors list: Chain Mode  */
 | 
					 | 
				
			||||||
    (void)ETH_DMA_RxDescListInit(&EthHandle, EthDmaRxDscrTab, &EthRxBuff[0][0], ETH_RX_BUF_NUM);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* set MAC hardware address length */
 | 
					 | 
				
			||||||
    netif->hwaddr_len = 6U;
 | 
					 | 
				
			||||||
    /* set MAC hardware address */
 | 
					 | 
				
			||||||
    netif->hwaddr[0] = (EthHandle.stcCommInit).au8MacAddr[0];
 | 
					 | 
				
			||||||
    netif->hwaddr[1] = (EthHandle.stcCommInit).au8MacAddr[1];
 | 
					 | 
				
			||||||
    netif->hwaddr[2] = (EthHandle.stcCommInit).au8MacAddr[2];
 | 
					 | 
				
			||||||
    netif->hwaddr[3] = (EthHandle.stcCommInit).au8MacAddr[3];
 | 
					 | 
				
			||||||
    netif->hwaddr[4] = (EthHandle.stcCommInit).au8MacAddr[4];
 | 
					 | 
				
			||||||
    netif->hwaddr[5] = (EthHandle.stcCommInit).au8MacAddr[5];
 | 
					 | 
				
			||||||
    /* maximum transfer unit */
 | 
					 | 
				
			||||||
    netif->mtu = 1500U;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* device capabilities */
 | 
					 | 
				
			||||||
    netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Enable MAC and DMA transmission and reception */
 | 
					 | 
				
			||||||
    (void)ETH_Start();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Configure PHY LED mode */
 | 
					 | 
				
			||||||
    u16RegVal = PHY_PAGE_ADDR_7;
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
					 | 
				
			||||||
    (void)ETH_PHY_ReadReg(&EthHandle, PHY_P7_IWLFR, &u16RegVal);
 | 
					 | 
				
			||||||
    MODIFY_REG16(u16RegVal, PHY_LED_SELECT, PHY_LED_SELECT_10);
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_P7_IWLFR, u16RegVal);
 | 
					 | 
				
			||||||
    u16RegVal = PHY_PAGE_ADDR_0;
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef ETH_INTERFACE_RMII
 | 
					 | 
				
			||||||
    /* Disable Power Saving Mode */
 | 
					 | 
				
			||||||
    (void)ETH_PHY_ReadReg(&EthHandle, PHY_PSMR, &u16RegVal);
 | 
					 | 
				
			||||||
    CLR_REG16_BIT(u16RegVal, PHY_EN_PWR_SAVE);
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSMR, u16RegVal);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Configure PHY to generate an interrupt when Eth Link state changes */
 | 
					 | 
				
			||||||
    u16RegVal = PHY_PAGE_ADDR_7;
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
					 | 
				
			||||||
    /* Enable Interrupt on change of link status */
 | 
					 | 
				
			||||||
    (void)ETH_PHY_ReadReg(&EthHandle, PHY_P7_IWLFR, &u16RegVal);
 | 
					 | 
				
			||||||
    SET_REG16_BIT(u16RegVal, PHY_INT_LINK_CHANGE);
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_P7_IWLFR, u16RegVal);
 | 
					 | 
				
			||||||
    u16RegVal = PHY_PAGE_ADDR_0;
 | 
					 | 
				
			||||||
    (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return i32Ret;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					void Time_Update_LwIP(void) {
 | 
				
			||||||
 * @brief  This function should do the actual transmission of the packet.
 | 
					    //no need to do
 | 
				
			||||||
 * @param  netif                        The network interface structure for this ethernetif.
 | 
					 | 
				
			||||||
 * @param  p                            The MAC packet to send.
 | 
					 | 
				
			||||||
 * @retval int32_t:
 | 
					 | 
				
			||||||
 *           - LL_OK: The packet could be sent
 | 
					 | 
				
			||||||
 *           - LL_ERR: The packet couldn't be sent
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
err_t low_level_output(struct netif *netif, struct pbuf *p)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    err_t i32Ret;
 | 
					 | 
				
			||||||
    struct pbuf *q;
 | 
					 | 
				
			||||||
    uint8_t *txBuffer;
 | 
					 | 
				
			||||||
    __IO stc_eth_dma_desc_t *DmaTxDesc;
 | 
					 | 
				
			||||||
    uint32_t byteCnt;
 | 
					 | 
				
			||||||
    uint32_t frameLength = 0UL;
 | 
					 | 
				
			||||||
    uint32_t bufferOffset;
 | 
					 | 
				
			||||||
    uint32_t payloadOffset;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    DmaTxDesc = EthHandle.stcTxDesc;
 | 
					 | 
				
			||||||
    txBuffer = (uint8_t *)((EthHandle.stcTxDesc)->u32Buf1Addr);
 | 
					 | 
				
			||||||
    bufferOffset = 0UL;
 | 
					 | 
				
			||||||
    /* Copy frame from pbufs to driver buffers */
 | 
					 | 
				
			||||||
    for (q = p; q != NULL; q = q->next) {
 | 
					 | 
				
			||||||
        /* If this buffer isn't available, goto error */
 | 
					 | 
				
			||||||
        if (0UL != (DmaTxDesc->u32ControlStatus & ETH_DMA_TXDESC_OWN)) {
 | 
					 | 
				
			||||||
            i32Ret = LL_ERR;
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /* Get bytes in current buffer */
 | 
					 | 
				
			||||||
        byteCnt = q->len;
 | 
					 | 
				
			||||||
        payloadOffset = 0UL;
 | 
					 | 
				
			||||||
        /* Check if the length of data to copy is bigger than Tx buffer size */
 | 
					 | 
				
			||||||
        while ((byteCnt + bufferOffset) > ETH_TX_BUF_SIZE) {
 | 
					 | 
				
			||||||
            /* Copy data to Tx buffer*/
 | 
					 | 
				
			||||||
            (void)memcpy((uint8_t *) & (txBuffer[bufferOffset]), (uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (ETH_TX_BUF_SIZE - bufferOffset));
 | 
					 | 
				
			||||||
            /* Point to next descriptor */
 | 
					 | 
				
			||||||
            DmaTxDesc = (stc_eth_dma_desc_t *)(DmaTxDesc->u32Buf2NextDescAddr);
 | 
					 | 
				
			||||||
            /* Check if the buffer is available */
 | 
					 | 
				
			||||||
            if (0UL != (DmaTxDesc->u32ControlStatus & ETH_DMA_TXDESC_OWN)) {
 | 
					 | 
				
			||||||
                i32Ret = LL_ERR;
 | 
					 | 
				
			||||||
                goto error;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            txBuffer = (uint8_t *)(DmaTxDesc->u32Buf1Addr);
 | 
					 | 
				
			||||||
            byteCnt = byteCnt - (ETH_TX_BUF_SIZE - bufferOffset);
 | 
					 | 
				
			||||||
            payloadOffset = payloadOffset + (ETH_TX_BUF_SIZE - bufferOffset);
 | 
					 | 
				
			||||||
            frameLength = frameLength + (ETH_TX_BUF_SIZE - bufferOffset);
 | 
					 | 
				
			||||||
            bufferOffset = 0UL;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        /* Copy the remaining bytes */
 | 
					 | 
				
			||||||
        (void)memcpy((uint8_t *) & (txBuffer[bufferOffset]), (uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), byteCnt);
 | 
					 | 
				
			||||||
        bufferOffset = bufferOffset + byteCnt;
 | 
					 | 
				
			||||||
        frameLength = frameLength + byteCnt;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /* Prepare transmit descriptors to give to DMA */
 | 
					 | 
				
			||||||
    (void)ETH_DMA_SetTransFrame(&EthHandle, frameLength);
 | 
					 | 
				
			||||||
    i32Ret = LL_OK;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
    /* When Transmit Underflow flag is set, clear it and issue a Transmit Poll Demand to resume transmission */
 | 
					 | 
				
			||||||
    if (RESET != ETH_DMA_GetStatus(ETH_DMA_FLAG_UNS)) {
 | 
					 | 
				
			||||||
        /* Clear DMA UNS flag */
 | 
					 | 
				
			||||||
        ETH_DMA_ClearStatus(ETH_DMA_FLAG_UNS);
 | 
					 | 
				
			||||||
        /* Resume DMA transmission */
 | 
					 | 
				
			||||||
        WRITE_REG32(CM_ETH->DMA_TXPOLLR, 0UL);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return i32Ret;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief  Should allocate a pbuf and transfer the bytes of the incoming packet from the interface into the pbuf.
 | 
					 | 
				
			||||||
 * @param  netif                        The network interface structure for this ethernetif.
 | 
					 | 
				
			||||||
 * @retval A pbuf filled with the received packet (including MAC header) or NULL on memory error.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static struct pbuf *low_level_input(struct netif *netif)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    struct pbuf *p = NULL;
 | 
					 | 
				
			||||||
    struct pbuf *q;
 | 
					 | 
				
			||||||
    uint32_t len;
 | 
					 | 
				
			||||||
    uint8_t *rxBuffer;
 | 
					 | 
				
			||||||
    __IO stc_eth_dma_desc_t *DmaRxDesc;
 | 
					 | 
				
			||||||
    uint32_t byteCnt;
 | 
					 | 
				
			||||||
    uint32_t bufferOffset;
 | 
					 | 
				
			||||||
    uint32_t payloadOffset;
 | 
					 | 
				
			||||||
    uint32_t i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Get received frame */
 | 
					 | 
				
			||||||
    if (LL_OK != ETH_DMA_GetReceiveFrame(&EthHandle)) {
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Obtain the size of the packet */
 | 
					 | 
				
			||||||
    len = (EthHandle.stcRxFrame).u32Len;
 | 
					 | 
				
			||||||
    rxBuffer = (uint8_t *)(EthHandle.stcRxFrame).u32Buf;
 | 
					 | 
				
			||||||
    if (len > 0UL) {
 | 
					 | 
				
			||||||
        /* Allocate a pbuf chain of pbufs from the buffer */
 | 
					 | 
				
			||||||
        p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (p != NULL) {
 | 
					 | 
				
			||||||
        DmaRxDesc = (EthHandle.stcRxFrame).pstcFSDesc;
 | 
					 | 
				
			||||||
        bufferOffset = 0UL;
 | 
					 | 
				
			||||||
        for (q = p; q != NULL; q = q->next) {
 | 
					 | 
				
			||||||
            byteCnt = q->len;
 | 
					 | 
				
			||||||
            payloadOffset = 0UL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size */
 | 
					 | 
				
			||||||
            while ((byteCnt + bufferOffset) > ETH_RX_BUF_SIZE) {
 | 
					 | 
				
			||||||
                /* Copy data to pbuf */
 | 
					 | 
				
			||||||
                (void)memcpy((uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (uint8_t *) & (rxBuffer[bufferOffset]), (ETH_RX_BUF_SIZE - bufferOffset));
 | 
					 | 
				
			||||||
                /* Point to next descriptor */
 | 
					 | 
				
			||||||
                DmaRxDesc = (stc_eth_dma_desc_t *)(DmaRxDesc->u32Buf2NextDescAddr);
 | 
					 | 
				
			||||||
                rxBuffer = (uint8_t *)(DmaRxDesc->u32Buf1Addr);
 | 
					 | 
				
			||||||
                byteCnt = byteCnt - (ETH_RX_BUF_SIZE - bufferOffset);
 | 
					 | 
				
			||||||
                payloadOffset = payloadOffset + (ETH_RX_BUF_SIZE - bufferOffset);
 | 
					 | 
				
			||||||
                bufferOffset = 0UL;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* Copy remaining data in pbuf */
 | 
					 | 
				
			||||||
            (void)memcpy((uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (uint8_t *) & (rxBuffer[bufferOffset]), byteCnt);
 | 
					 | 
				
			||||||
            bufferOffset = bufferOffset + byteCnt;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /* Release descriptors to DMA */
 | 
					 | 
				
			||||||
    DmaRxDesc = (EthHandle.stcRxFrame).pstcFSDesc;
 | 
					 | 
				
			||||||
    for (i = 0UL; i < (EthHandle.stcRxFrame).u32SegCount; i++) {
 | 
					 | 
				
			||||||
        DmaRxDesc->u32ControlStatus |= ETH_DMA_RXDESC_OWN;
 | 
					 | 
				
			||||||
        DmaRxDesc = (stc_eth_dma_desc_t *)(DmaRxDesc->u32Buf2NextDescAddr);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /* Clear Segment_Count */
 | 
					 | 
				
			||||||
    (EthHandle.stcRxFrame).u32SegCount = 0UL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* When Rx Buffer unavailable flag is set, clear it and resume reception */
 | 
					 | 
				
			||||||
    if (RESET != ETH_DMA_GetStatus(ETH_DMA_FLAG_RUS)) {
 | 
					 | 
				
			||||||
        /* Clear DMA RUS flag */
 | 
					 | 
				
			||||||
        ETH_DMA_ClearStatus(ETH_DMA_FLAG_RUS);
 | 
					 | 
				
			||||||
        /* Resume DMA reception */
 | 
					 | 
				
			||||||
        WRITE_REG32(CM_ETH->DMA_RXPOLLR, 0UL);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return p;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -486,8 +209,8 @@ err_t ethernetif_init(struct netif *netif)
 | 
				
			||||||
    * You can instead declare your own function an call etharp_output()
 | 
					    * You can instead declare your own function an call etharp_output()
 | 
				
			||||||
    * from it if you have to do some checks before sending (e.g. if link
 | 
					    * from it if you have to do some checks before sending (e.g. if link
 | 
				
			||||||
    * is available...) */
 | 
					    * is available...) */
 | 
				
			||||||
    netif->output = ðarp_output;
 | 
					    netif->output = etharp_output;
 | 
				
			||||||
    netif->linkoutput = &low_level_output;
 | 
					    netif->linkoutput = low_level_output;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* initialize the hardware */
 | 
					    /* initialize the hardware */
 | 
				
			||||||
| 
						 | 
					@ -499,34 +222,38 @@ err_t ethernetif_init(struct netif *netif)
 | 
				
			||||||
 * @param  netif                        The network interface structure for this ethernetif.
 | 
					 * @param  netif                        The network interface structure for this ethernetif.
 | 
				
			||||||
 * @retval None
 | 
					 * @retval None
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void ethernetif_input(struct netif *netif)
 | 
					void ethernetif_input(void *netif_arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    err_t err;
 | 
					 | 
				
			||||||
    struct pbuf *p;
 | 
					    struct pbuf *p;
 | 
				
			||||||
 | 
					    struct netif *netif = (struct netif *)netif_arg;
 | 
				
			||||||
 | 
					    x_base critical_lock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Move received packet into a new pbuf */
 | 
					    /* Move received packet into a new pbuf */
 | 
				
			||||||
    p = low_level_input(netif);
 | 
					    while (1) {
 | 
				
			||||||
 | 
					        sys_arch_sem_wait(get_eth_recv_sem(), WAITING_FOREVER);
 | 
				
			||||||
 | 
					        while(1) {
 | 
				
			||||||
 | 
					            p = low_level_input(netif);
 | 
				
			||||||
#ifndef ETHERNET_LOOPBACK_TEST
 | 
					#ifndef ETHERNET_LOOPBACK_TEST
 | 
				
			||||||
    /* No packet could be read, silently ignore this */
 | 
					            /* Entry point to the LwIP stack */
 | 
				
			||||||
    if (NULL == p) {
 | 
					            if (p != NULL) {
 | 
				
			||||||
        return;
 | 
					                if (netif->input(p, netif) != ERR_OK) {
 | 
				
			||||||
    }
 | 
					                    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
 | 
				
			||||||
 | 
					                    KPrintf("ethernetif_input: IP input error\n");
 | 
				
			||||||
    /* Entry point to the LwIP stack */
 | 
					                    pbuf_free(p);
 | 
				
			||||||
    err = netif->input(p, netif);
 | 
					                    p = NULL;
 | 
				
			||||||
    if (err != (err_t)ERR_OK) {
 | 
					                }
 | 
				
			||||||
        LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
 | 
					            } else {
 | 
				
			||||||
        (void)pbuf_free(p);
 | 
					                break;
 | 
				
			||||||
    }
 | 
					            }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            /* No packet could be read, silently ignore this */
 | 
				
			||||||
 | 
					            if (p != NULL) {
 | 
				
			||||||
 | 
					                EthernetIF_InputCallback(netif, p);
 | 
				
			||||||
 | 
					                free(p);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef ETHERNET_LOOPBACK_TEST
 | 
					        }
 | 
				
			||||||
    /* No packet could be read, silently ignore this */
 | 
					 | 
				
			||||||
    if (p != NULL) {
 | 
					 | 
				
			||||||
        EthernetIF_InputCallback(netif, p);
 | 
					 | 
				
			||||||
        free(p);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -726,8 +453,7 @@ __WEAKDEF void EthernetIF_NotifyLinkChange(struct netif *netif)
 | 
				
			||||||
 * @param  p                            The MAC packet to receive
 | 
					 * @param  p                            The MAC packet to receive
 | 
				
			||||||
 * @retval None
 | 
					 * @retval None
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
__WEAKDEF void EthernetIF_InputCallback(struct netif *netif, struct pbuf *p)
 | 
					__WEAKDEF void EthernetIF_InputCallback(struct netif *netif, struct pbuf *p) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /* This is function could be implemented in user file when the callback is needed */
 | 
					    /* This is function could be implemented in user file when the callback is needed */
 | 
				
			||||||
#ifdef ETHERNET_LOOPBACK_TEST
 | 
					#ifdef ETHERNET_LOOPBACK_TEST
 | 
				
			||||||
    if ((0 == (memcmp(p->payload, txPbuf.payload, p->len))) && (p->len == txPbuf.len)) {
 | 
					    if ((0 == (memcmp(p->payload, txPbuf.payload, p->len))) && (p->len == txPbuf.len)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,11 +22,47 @@
 | 
				
			||||||
#define CONNECT_ETHERNET_H
 | 
					#define CONNECT_ETHERNET_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "hardware_ethernetif.h"
 | 
					#include "hardware_ethernetif.h"
 | 
				
			||||||
 | 
					#include <sys_arch.h>
 | 
				
			||||||
 | 
					#include <hc32_ll_eth.h>
 | 
				
			||||||
 | 
					#include <hardware_irq.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 extern "C" {
 | 
					 extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct hc32_irq_config
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    IRQn_Type       irq_num;
 | 
				
			||||||
 | 
					    uint32_t        irq_prio;
 | 
				
			||||||
 | 
					    en_int_src_t    int_src;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Global Ethernet handle*/
 | 
				
			||||||
 | 
					static stc_eth_handle_t EthHandle;
 | 
				
			||||||
 | 
					/* Ethernet Tx DMA Descriptor */
 | 
				
			||||||
 | 
					__ALIGN_BEGIN static stc_eth_dma_desc_t EthDmaTxDscrTab[ETH_TX_BUF_NUM];
 | 
				
			||||||
 | 
					/* Ethernet Rx DMA Descriptor */
 | 
				
			||||||
 | 
					__ALIGN_BEGIN static stc_eth_dma_desc_t EthDmaRxDscrTab[ETH_RX_BUF_NUM];
 | 
				
			||||||
 | 
					/* Ethernet Transmit Buffer */
 | 
				
			||||||
 | 
					__ALIGN_BEGIN static uint8_t EthTxBuff[ETH_TX_BUF_NUM][ETH_TX_BUF_SIZE];
 | 
				
			||||||
 | 
					/* Ethernet Receive Buffer */
 | 
				
			||||||
 | 
					__ALIGN_BEGIN static uint8_t EthRxBuff[ETH_RX_BUF_NUM][ETH_RX_BUF_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Ethernet link status */
 | 
				
			||||||
 | 
					static uint8_t u8PhyLinkStatus = 0U, u8EthInitStatus = 0U;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct Hc32IrqConfig eth_irq_config = {
 | 
				
			||||||
 | 
					    .irq_num    = BSP_ETH_IRQ_NUM,
 | 
				
			||||||
 | 
					    .irq_prio   = BSP_ETH_IRQ_PRIO,                     
 | 
				
			||||||
 | 
					    .int_src    = INT_SRC_ETH_GLB_INT, 
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Ethernet_GpioInit(void);
 | 
				
			||||||
 | 
					int32_t low_level_init(struct netif *netif);
 | 
				
			||||||
 | 
					err_t low_level_output(struct netif *netif, struct pbuf *p);
 | 
				
			||||||
 | 
					struct pbuf *low_level_input(struct netif *netif);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,9 +133,37 @@ extern "C"
 | 
				
			||||||
 * @addtogroup ETH_IF_Global_Functions
 | 
					 * @addtogroup ETH_IF_Global_Functions
 | 
				
			||||||
 * @{
 | 
					 * @{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					/* Define those to better describe your network interface. */
 | 
				
			||||||
 | 
					#define IFNAME0                         'h'
 | 
				
			||||||
 | 
					#define IFNAME1                         'd'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* PHY hardware reset time */
 | 
				
			||||||
 | 
					#define PHY_HW_RST_DELAY                (0x40U)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ETH_RST = PH11 */
 | 
				
			||||||
 | 
					#define ETH_RST_PORT                    (GPIO_PORT_H)
 | 
				
			||||||
 | 
					#define ETH_RST_PIN                     (GPIO_PIN_11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ETH_LINK_LED = PD00 LED2 */
 | 
				
			||||||
 | 
					#define ETH_LINK_LED_PORT               (GPIO_PORT_D)
 | 
				
			||||||
 | 
					#define ETH_LINK_LED_PIN                (GPIO_PIN_00)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#define ETHERNET_LOOPBACK_TEST
 | 
				
			||||||
 | 
					#ifdef ETHERNET_LOOPBACK_TEST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define USER_KEY_PORT                  (GPIO_PORT_I)
 | 
				
			||||||
 | 
					#define USER_KEY_PIN                   (GPIO_PIN_07)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ethe global netif */
 | 
				
			||||||
 | 
					static struct netif testnetif;
 | 
				
			||||||
 | 
					/* eth tx buffer */
 | 
				
			||||||
 | 
					static struct pbuf txPbuf;
 | 
				
			||||||
 | 
					static char txBuf[] = "Ethernet Loop-Back Test";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_t   ethernetif_init(struct netif *netif);
 | 
					err_t   ethernetif_init(struct netif *netif);
 | 
				
			||||||
void    ethernetif_input(struct netif *netif);
 | 
					void    ethernetif_input(void *netif);
 | 
				
			||||||
err_t low_level_output(struct netif *netif, struct pbuf *p);
 | 
					// err_t low_level_output(struct netif *netif, struct pbuf *p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void    EthernetIF_CheckLink(struct netif *netif);
 | 
					void    EthernetIF_CheckLink(struct netif *netif);
 | 
				
			||||||
void    EthernetIF_UpdateLink(struct netif *netif);
 | 
					void    EthernetIF_UpdateLink(struct netif *netif);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,10 +2,12 @@ SRC_DIR += api
 | 
				
			||||||
SRC_DIR += arch
 | 
					SRC_DIR += arch
 | 
				
			||||||
SRC_DIR += core
 | 
					SRC_DIR += core
 | 
				
			||||||
SRC_DIR += netif
 | 
					SRC_DIR += netif
 | 
				
			||||||
 | 
					SRC_DIR += apps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LWIP_DIR += api
 | 
					LWIP_DIR += api
 | 
				
			||||||
LWIP_DIR += arch
 | 
					LWIP_DIR += arch
 | 
				
			||||||
LWIP_DIR += core
 | 
					LWIP_DIR += core
 | 
				
			||||||
LWIP_DIR += netif
 | 
					LWIP_DIR += netif
 | 
				
			||||||
 | 
					LWIP_DIR += apps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					SRC_FILES += lwiperf/lwiperf.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,193 @@
 | 
				
			||||||
#ifndef __LWIPOPTS_H__
 | 
					#ifndef __LWIPOPTS_H__
 | 
				
			||||||
#define __LWIPOPTS_H__
 | 
					#define __LWIPOPTS_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- Debug options ---------- */
 | 
				
			||||||
 | 
					#ifndef LWIP_DEBUG
 | 
				
			||||||
 | 
					#define LWIP_DEBUG 
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_DEBUG
 | 
				
			||||||
 | 
					#ifdef LWIP_SYS_DEBUG
 | 
				
			||||||
 | 
					#define SYS_DEBUG                   LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SYS_DEBUG                   LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_ETHARP_DEBUG
 | 
				
			||||||
 | 
					#define ETHARP_DEBUG                LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define ETHARP_DEBUG                LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_PPP_DEBUG
 | 
				
			||||||
 | 
					#define PPP_DEBUG                   LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define PPP_DEBUG                   LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_MEM_DEBUG
 | 
				
			||||||
 | 
					#define MEM_DEBUG                   LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define MEM_DEBUG                   LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_MEMP_DEBUG
 | 
				
			||||||
 | 
					#define MEMP_DEBUG                  LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define MEMP_DEBUG                  LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_PBUF_DEBUG
 | 
				
			||||||
 | 
					#define PBUF_DEBUG                  LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define PBUF_DEBUG                  LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_API_LIB_DEBUG
 | 
				
			||||||
 | 
					#define API_LIB_DEBUG               LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define API_LIB_DEBUG               LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_API_MSG_DEBUG
 | 
				
			||||||
 | 
					#define API_MSG_DEBUG               LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define API_MSG_DEBUG               LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCPIP_DEBUG
 | 
				
			||||||
 | 
					#define TCPIP_DEBUG                 LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCPIP_DEBUG                 LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_NETIF_DEBUG
 | 
				
			||||||
 | 
					#define NETIF_DEBUG                 LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define NETIF_DEBUG                 LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_SOCKETS_DEBUG
 | 
				
			||||||
 | 
					#define SOCKETS_DEBUG               LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SOCKETS_DEBUG               LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_DNS_DEBUG
 | 
				
			||||||
 | 
					#define DNS_DEBUG                   LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define DNS_DEBUG                   LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_AUTOIP_DEBUG
 | 
				
			||||||
 | 
					#define AUTOIP_DEBUG                LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define AUTOIP_DEBUG                LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_DHCP_DEBUG
 | 
				
			||||||
 | 
					#define DHCP_DEBUG                  LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define DHCP_DEBUG                  LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_IP_DEBUG
 | 
				
			||||||
 | 
					#define IP_DEBUG                    LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define IP_DEBUG                    LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_IP_REASS_DEBUG
 | 
				
			||||||
 | 
					#define IP_REASS_DEBUG              LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define IP_REASS_DEBUG              LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_ICMP_DEBUG
 | 
				
			||||||
 | 
					#define ICMP_DEBUG                  LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define ICMP_DEBUG                  LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_IGMP_DEBUG
 | 
				
			||||||
 | 
					#define IGMP_DEBUG                  LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define IGMP_DEBUG                  LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_UDP_DEBUG
 | 
				
			||||||
 | 
					#define UDP_DEBUG                   LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define UDP_DEBUG                   LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_DEBUG
 | 
				
			||||||
 | 
					#define TCP_DEBUG                   LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_DEBUG                   LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_INPUT_DEBUG
 | 
				
			||||||
 | 
					#define TCP_INPUT_DEBUG             LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_INPUT_DEBUG             LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_OUTPUT_DEBUG
 | 
				
			||||||
 | 
					#define TCP_OUTPUT_DEBUG            LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_OUTPUT_DEBUG            LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_RTO_DEBUG
 | 
				
			||||||
 | 
					#define TCP_RTO_DEBUG               LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_RTO_DEBUG               LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_CWND_DEBUG
 | 
				
			||||||
 | 
					#define TCP_CWND_DEBUG              LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_CWND_DEBUG              LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_WND_DEBUG
 | 
				
			||||||
 | 
					#define TCP_WND_DEBUG               LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_WND_DEBUG               LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_FR_DEBUG
 | 
				
			||||||
 | 
					#define TCP_FR_DEBUG                LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_FR_DEBUG                LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_QLEN_DEBUG
 | 
				
			||||||
 | 
					#define TCP_QLEN_DEBUG              LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_QLEN_DEBUG              LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LWIP_TCP_RST_DEBUG
 | 
				
			||||||
 | 
					#define TCP_RST_DEBUG               LWIP_DBG_ON
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define TCP_RST_DEBUG               LWIP_DBG_OFF
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* LWIP_DEBUG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LWIP_TIMEVAL_PRIVATE    0
 | 
				
			||||||
 | 
					#define LWIP_NO_UNISTD_H        0
 | 
				
			||||||
 | 
					#define LWIP_NO_STDDEF_H        0
 | 
				
			||||||
 | 
					#define LWIP_NO_STDINT_H        0
 | 
				
			||||||
 | 
					#define LWIP_NO_INTTYPES_H      0
 | 
				
			||||||
 | 
					#define LWIP_NO_LIMITS_H        0
 | 
				
			||||||
 | 
					#define LWIP_NO_CTYPE_H         0
 | 
				
			||||||
 | 
					#define LWIP_SOCKET_SELECT      1
 | 
				
			||||||
 | 
					#define LWIP_SOCKET_POLL        1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
 | 
					 * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
 | 
				
			||||||
 * critical regions during buffer allocation, deallocation and memory
 | 
					 * critical regions during buffer allocation, deallocation and memory
 | 
				
			||||||
| 
						 | 
					@ -57,35 +244,40 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* MEM_SIZE: the size of the heap memory. If the application will send
 | 
					/* MEM_SIZE: the size of the heap memory. If the application will send
 | 
				
			||||||
a lot of data that needs to be copied, this should be set high. */
 | 
					a lot of data that needs to be copied, this should be set high. */
 | 
				
			||||||
#define MEM_SIZE                (25*1024)
 | 
					#define MEM_SIZE                (64*1024)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
 | 
					/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
 | 
				
			||||||
   sends a lot of data out of ROM (or other static memory), this
 | 
					   sends a lot of data out of ROM (or other static memory), this
 | 
				
			||||||
   should be set high. */
 | 
					   should be set high. */
 | 
				
			||||||
#define MEMP_NUM_PBUF           15
 | 
					#define MEMP_NUM_PBUF           32
 | 
				
			||||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
 | 
					/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
 | 
				
			||||||
   per active UDP "connection". */
 | 
					   per active UDP "connection". */
 | 
				
			||||||
#define MEMP_NUM_UDP_PCB        4
 | 
					#define MEMP_NUM_UDP_PCB        4
 | 
				
			||||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
 | 
					/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
 | 
				
			||||||
   connections. */
 | 
					   connections. */
 | 
				
			||||||
#define MEMP_NUM_TCP_PCB        4
 | 
					#define MEMP_NUM_TCP_PCB        64
 | 
				
			||||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
 | 
					/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
 | 
				
			||||||
   connections. */
 | 
					   connections. */
 | 
				
			||||||
#define MEMP_NUM_TCP_PCB_LISTEN 2
 | 
					#define MEMP_NUM_TCP_PCB_LISTEN 2
 | 
				
			||||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
 | 
					/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
 | 
				
			||||||
   segments. */
 | 
					   segments. */
 | 
				
			||||||
#define MEMP_NUM_TCP_SEG        20
 | 
					#define MEMP_NUM_TCP_SEG        256
 | 
				
			||||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
 | 
					/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
 | 
				
			||||||
   timeouts. */
 | 
					   timeouts. */
 | 
				
			||||||
#define MEMP_NUM_SYS_TIMEOUT    6
 | 
					// #define MEMP_NUM_SYS_TIMEOUT    6
 | 
				
			||||||
 | 
					#define MEMP_NUM_SYS_TIMEOUT       (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + (2*LWIP_IPV6)) : 0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ---------- Pbuf options ---------- */
 | 
					/* ---------- Pbuf options ---------- */
 | 
				
			||||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
 | 
					/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
 | 
				
			||||||
#define PBUF_POOL_SIZE          20
 | 
					#define PBUF_POOL_SIZE          255
 | 
				
			||||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
 | 
					/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
 | 
				
			||||||
 | 
					// #define PBUF_POOL_BUFSIZE       1024
 | 
				
			||||||
#define PBUF_POOL_BUFSIZE       LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
 | 
					#define PBUF_POOL_BUFSIZE       LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- ARP options ---------- */
 | 
				
			||||||
 | 
					#define LWIP_ARP                    1
 | 
				
			||||||
 | 
					#define ARP_TABLE_SIZE              10
 | 
				
			||||||
 | 
					#define ARP_QUEUEING                1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ---------- TCP options ---------- */
 | 
					/* ---------- TCP options ---------- */
 | 
				
			||||||
#define LWIP_TCP                1
 | 
					#define LWIP_TCP                1
 | 
				
			||||||
| 
						 | 
					@ -93,7 +285,7 @@ a lot of data that needs to be copied, this should be set high. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Controls if TCP should queue segments that arrive out of
 | 
					/* Controls if TCP should queue segments that arrive out of
 | 
				
			||||||
   order. Define to 0 if your device is low on memory. */
 | 
					   order. Define to 0 if your device is low on memory. */
 | 
				
			||||||
#define TCP_QUEUE_OOSEQ         0
 | 
					#define TCP_QUEUE_OOSEQ         1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TCP Maximum segment size. */
 | 
					/* TCP Maximum segment size. */
 | 
				
			||||||
#define TCP_MSS                 (1500 - 40)	  /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
 | 
					#define TCP_MSS                 (1500 - 40)	  /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
 | 
				
			||||||
| 
						 | 
					@ -107,9 +299,69 @@ a lot of data that needs to be copied, this should be set high. */
 | 
				
			||||||
#define TCP_SND_QUEUELEN        (8* TCP_SND_BUF/TCP_MSS)
 | 
					#define TCP_SND_QUEUELEN        (8* TCP_SND_BUF/TCP_MSS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TCP receive window. */
 | 
					/* TCP receive window. */
 | 
				
			||||||
#define TCP_WND                 (12*TCP_MSS)
 | 
					#define TCP_WND                 8192
 | 
				
			||||||
 | 
					// #define TCP_WND                 (12 * TCP_MSS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Maximum number of retransmissions of data segments. */
 | 
				
			||||||
 | 
					#define TCP_MAXRTX                  12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Maximum number of retransmissions of SYN segments. */
 | 
				
			||||||
 | 
					#define TCP_SYNMAXRTX               4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT
 | 
				
			||||||
 | 
					 * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set
 | 
				
			||||||
 | 
					 * in seconds. (does not require sockets.c, and will affect tcp.c)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef LWIP_TCP_KEEPALIVE
 | 
				
			||||||
 | 
					#define LWIP_TCP_KEEPALIVE              1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * LWIP_NETIF_HOSTNAME==1: Support netif hostname
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef LWIP_NETIF_HOSTNAME
 | 
				
			||||||
 | 
					#define LWIP_NETIF_HOSTNAME             1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * LWIP_NETIF_API==1: Support netif api (in netifapi.c)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef LWIP_NETIF_API
 | 
				
			||||||
 | 
					#define LWIP_NETIF_API                  1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and
 | 
				
			||||||
 | 
					 * SO_SNDTIMEO processing.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef LWIP_SO_SNDTIMEO
 | 
				
			||||||
 | 
					#define LWIP_SO_SNDTIMEO                1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and
 | 
				
			||||||
 | 
					 * SO_RCVTIMEO processing.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef LWIP_SO_RCVTIMEO
 | 
				
			||||||
 | 
					#define LWIP_SO_RCVTIMEO                1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef LWIP_SO_RCVBUF
 | 
				
			||||||
 | 
					#define LWIP_SO_RCVBUF                  1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef RECV_BUFSIZE_DEFAULT
 | 
				
			||||||
 | 
					#define RECV_BUFSIZE_DEFAULT            8192
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ---------- ICMP options ---------- */
 | 
					/* ---------- ICMP options ---------- */
 | 
				
			||||||
#define LWIP_ICMP               1
 | 
					#define LWIP_ICMP               1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +379,6 @@ a lot of data that needs to be copied, this should be set high. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ---------- Statistics options ---------- */
 | 
					/* ---------- Statistics options ---------- */
 | 
				
			||||||
#define LWIP_STATS              0
 | 
					 | 
				
			||||||
#define LWIP_PROVIDE_ERRNO      1
 | 
					#define LWIP_PROVIDE_ERRNO      1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ---------- link callback options ---------- */
 | 
					/* ---------- link callback options ---------- */
 | 
				
			||||||
| 
						 | 
					@ -225,7 +476,50 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums
 | 
				
			||||||
     /**
 | 
					     /**
 | 
				
			||||||
      * LWIP_SO_LINGER==1: Enable SO_LINGER processing.
 | 
					      * LWIP_SO_LINGER==1: Enable SO_LINGER processing.
 | 
				
			||||||
      */
 | 
					      */
 | 
				
			||||||
#define LWIP_SO_LINGER                  1
 | 
					// #define LWIP_SO_LINGER                  1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- 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
 | 
				
			||||||
 | 
					   on a device with only one network interface, define this to 0. */
 | 
				
			||||||
 | 
					#define IP_FORWARD                  0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* IP reassembly and segmentation.These are orthogonal even
 | 
				
			||||||
 | 
					 * if they both deal with IP fragments */
 | 
				
			||||||
 | 
					#ifdef LWIP_REASSEMBLY_FRAG
 | 
				
			||||||
 | 
					#define IP_REASSEMBLY               1
 | 
				
			||||||
 | 
					#define IP_FRAG                     1
 | 
				
			||||||
 | 
					#define IP_REASS_MAX_PBUFS          10
 | 
				
			||||||
 | 
					#define MEMP_NUM_REASSDATA          10
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define IP_REASSEMBLY               0
 | 
				
			||||||
 | 
					#define IP_FRAG                     0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- ICMP options ---------- */
 | 
				
			||||||
 | 
					#define ICMP_TTL                    255
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- DHCP options ---------- */
 | 
				
			||||||
 | 
					/* Define LWIP_DHCP to 1 if you want DHCP configuration of
 | 
				
			||||||
 | 
					   interfaces. */
 | 
				
			||||||
 | 
					#define LWIP_DHCP                   1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 1 if you want to do an ARP check on the offered address
 | 
				
			||||||
 | 
					   (recommended). */
 | 
				
			||||||
 | 
					#define DHCP_DOES_ARP_CHECK         (LWIP_DHCP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- AUTOIP options ------- */
 | 
				
			||||||
 | 
					#define LWIP_AUTOIP                 0
 | 
				
			||||||
 | 
					#define LWIP_DHCP_AUTOIP_COOP       (LWIP_DHCP && LWIP_AUTOIP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LWIP_UDPLITE                0
 | 
				
			||||||
 | 
					#define UDP_TTL                     255
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ---------- Statistics options ---------- */
 | 
				
			||||||
 | 
					#define LWIP_STATS                  1
 | 
				
			||||||
 | 
					#define LWIP_STATS_DISPLAY          1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
   ---------------------------------
 | 
					   ---------------------------------
 | 
				
			||||||
| 
						 | 
					@ -236,23 +530,21 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums
 | 
				
			||||||
#define DEFAULT_RAW_RECVMBOX_SIZE       8
 | 
					#define DEFAULT_RAW_RECVMBOX_SIZE       8
 | 
				
			||||||
#define DEFAULT_UDP_RECVMBOX_SIZE       8
 | 
					#define DEFAULT_UDP_RECVMBOX_SIZE       8
 | 
				
			||||||
#define DEFAULT_TCP_RECVMBOX_SIZE       8
 | 
					#define DEFAULT_TCP_RECVMBOX_SIZE       8
 | 
				
			||||||
#define DEFAULT_ACCEPTMBOX_SIZE         8
 | 
					#define DEFAULT_ACCEPTMBOX_SIZE         10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_THREAD_PRIO             20
 | 
					#define DEFAULT_THREAD_PRIO             20
 | 
				
			||||||
#define DEFAULT_THREAD_STACKSIZE        1024
 | 
					#define DEFAULT_THREAD_STACKSIZE        1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCPIP_THREAD_NAME               "tcp"
 | 
					#define TCPIP_THREAD_NAME               "tcp"
 | 
				
			||||||
#define TCPIP_THREAD_STACKSIZE          8192
 | 
					#define TCPIP_THREAD_STACKSIZE          4096
 | 
				
			||||||
#define TCPIP_MBOX_SIZE                 8
 | 
					#define TCPIP_MBOX_SIZE                 16
 | 
				
			||||||
#define TCPIP_THREAD_PRIO               15
 | 
					#define TCPIP_THREAD_PRIO               20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
   ----------------------------------------
 | 
					   ----------------------------------------
 | 
				
			||||||
   ---------- Lwip Debug options ----------
 | 
					   ---------- Lwip Debug options ----------
 | 
				
			||||||
   ----------------------------------------
 | 
					   ----------------------------------------
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define LWIP_DEBUG                      1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define LWIP_IPV4                       1
 | 
					#define LWIP_IPV4                       1
 | 
				
			||||||
#define LWIP_RAW                        1
 | 
					#define LWIP_RAW                        1
 | 
				
			||||||
#define LWIP_DNS                        1
 | 
					#define LWIP_DNS                        1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,17 +69,17 @@
 | 
				
			||||||
#include "ethernet.h"
 | 
					#include "ethernet.h"
 | 
				
			||||||
#include "connect_ethernet.h"
 | 
					#include "connect_ethernet.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char lwip_ipaddr[20] = {192, 168, 131, 77};
 | 
					char lwip_ipaddr[20] = {192, 168, 130, 77};
 | 
				
			||||||
char lwip_netmask[20] = {255, 255, 254, 0};
 | 
					char lwip_netmask[20] = {255, 255, 254, 0};
 | 
				
			||||||
char lwip_gwaddr[20] = {192, 168, 131, 23};
 | 
					char lwip_gwaddr[20] = {192, 168, 130, 1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char lwip_eth0_ipaddr[20] = {192, 168, 131, 77};
 | 
					char lwip_eth0_ipaddr[20] = {192, 168, 130, 77};
 | 
				
			||||||
char lwip_eth0_netmask[20] = {255, 255, 254, 0};
 | 
					char lwip_eth0_netmask[20] = {255, 255, 254, 0};
 | 
				
			||||||
char lwip_eth0_gwaddr[20] = {192, 168, 131, 23};
 | 
					char lwip_eth0_gwaddr[20] = {192, 168, 130, 1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char lwip_eth1_ipaddr[20] = {192, 168, 131, 99};
 | 
					char lwip_eth1_ipaddr[20] = {192, 168, 130, 99};
 | 
				
			||||||
char lwip_eth1_netmask[20] = {255, 255, 254, 0};
 | 
					char lwip_eth1_netmask[20] = {255, 255, 254, 0};
 | 
				
			||||||
char lwip_eth1_gwaddr[20] = {192, 168, 131, 23};
 | 
					char lwip_eth1_gwaddr[20] = {192, 168, 130, 23};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char lwip_flag = 0;
 | 
					char lwip_flag = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,8 +89,7 @@ struct sys_timeouts {
 | 
				
			||||||
  struct sys_timeo *next;
 | 
					  struct sys_timeo *next;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct timeoutlist
 | 
					struct timeoutlist {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  struct sys_timeouts timeouts;
 | 
					  struct sys_timeouts timeouts;
 | 
				
			||||||
  int32 pid;
 | 
					  int32 pid;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -101,40 +100,40 @@ static struct timeoutlist s_timeoutlist[SYS_THREAD_MAX];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u16_t s_nextthread = 0;
 | 
					static u16_t s_nextthread = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct netif gnetif;
 | 
				
			||||||
 | 
					sys_sem_t* get_eth_recv_sem() {
 | 
				
			||||||
 | 
					    static sys_sem_t g_recv_sem = 0;
 | 
				
			||||||
 | 
					    return &g_recv_sem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32_t
 | 
					u32_t
 | 
				
			||||||
sys_jiffies(void)
 | 
					sys_jiffies(void) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  lwip_sys_now = CurrentTicksGain();
 | 
					  lwip_sys_now = CurrentTicksGain();
 | 
				
			||||||
  return lwip_sys_now;
 | 
					  return lwip_sys_now;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32_t
 | 
					u32_t
 | 
				
			||||||
sys_now(void)
 | 
					sys_now(void) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  lwip_sys_now = CurrentTicksGain();
 | 
					  lwip_sys_now = CurrentTicksGain();
 | 
				
			||||||
  return lwip_sys_now;
 | 
					  return CalculateTimeMsFromTick(lwip_sys_now);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
sys_init(void)
 | 
					sys_init(void) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  int i;
 | 
					  int i;
 | 
				
			||||||
  for(i = 0; i < SYS_THREAD_MAX; i++)
 | 
					  for(i = 0; i < SYS_THREAD_MAX; i++) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    s_timeoutlist[i].pid = 0;
 | 
					    s_timeoutlist[i].pid = 0;
 | 
				
			||||||
    s_timeoutlist[i].timeouts.next = NULL;
 | 
					    s_timeoutlist[i].timeouts.next = NULL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  s_nextthread = 0;
 | 
					  s_nextthread = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sys_timeouts *sys_arch_timeouts(void)
 | 
					struct sys_timeouts *sys_arch_timeouts(void) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  int i;
 | 
					  int i;
 | 
				
			||||||
  int32 pid;
 | 
					  int32 pid;
 | 
				
			||||||
  struct timeoutlist *tl;
 | 
					  struct timeoutlist *tl;
 | 
				
			||||||
  pid = (int32)GetKTaskDescriptor()->id.id;
 | 
					  pid = (int32)GetKTaskDescriptor()->id.id;
 | 
				
			||||||
  for(i = 0; i < s_nextthread; i++)
 | 
					  for(i = 0; i < s_nextthread; i++) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    tl = &(s_timeoutlist[i]);
 | 
					    tl = &(s_timeoutlist[i]);
 | 
				
			||||||
    if(tl->pid == pid)
 | 
					    if(tl->pid == pid)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -144,21 +143,18 @@ struct sys_timeouts *sys_arch_timeouts(void)
 | 
				
			||||||
  return NULL;
 | 
					  return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sys_prot_t sys_arch_protect(void)
 | 
					sys_prot_t sys_arch_protect(void) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  return CriticalAreaLock();
 | 
					  return CriticalAreaLock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_arch_unprotect(sys_prot_t pval)
 | 
					void sys_arch_unprotect(sys_prot_t pval) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  CriticalAreaUnLock(pval);
 | 
					  CriticalAreaUnLock(pval);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !NO_SYS
 | 
					#if !NO_SYS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_t
 | 
					err_t
 | 
				
			||||||
sys_sem_new(sys_sem_t *sem, u8_t count)
 | 
					sys_sem_new(sys_sem_t *sem, u8_t count) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  *sem = KSemaphoreCreate((uint16)count);
 | 
					  *sem = KSemaphoreCreate((uint16)count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if SYS_STATS
 | 
					#if SYS_STATS
 | 
				
			||||||
| 
						 | 
					@ -170,8 +166,7 @@ sys_sem_new(sys_sem_t *sem, u8_t count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(*sem >= 0)
 | 
					  if(*sem >= 0)
 | 
				
			||||||
    return ERR_OK;
 | 
					    return ERR_OK;
 | 
				
			||||||
  else
 | 
					  else {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
#if SYS_STATS
 | 
					#if SYS_STATS
 | 
				
			||||||
    ++lwip_stats.sys.sem.err;
 | 
					    ++lwip_stats.sys.sem.err;
 | 
				
			||||||
#endif /* SYS_STATS */
 | 
					#endif /* SYS_STATS */
 | 
				
			||||||
| 
						 | 
					@ -181,8 +176,7 @@ sys_sem_new(sys_sem_t *sem, u8_t count)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
sys_sem_free(sys_sem_t *sem)
 | 
					sys_sem_free(sys_sem_t *sem) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#if SYS_STATS
 | 
					#if SYS_STATS
 | 
				
			||||||
   --lwip_stats.sys.sem.used;
 | 
					   --lwip_stats.sys.sem.used;
 | 
				
			||||||
#endif /* SYS_STATS */
 | 
					#endif /* SYS_STATS */
 | 
				
			||||||
| 
						 | 
					@ -190,19 +184,16 @@ sys_sem_free(sys_sem_t *sem)
 | 
				
			||||||
  *sem = SYS_SEM_NULL;
 | 
					  *sem = SYS_SEM_NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int sys_sem_valid(sys_sem_t *sem)
 | 
					int sys_sem_valid(sys_sem_t *sem) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  return (*sem > SYS_SEM_NULL);
 | 
					  return (*sem > SYS_SEM_NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
sys_sem_set_invalid(sys_sem_t *sem)
 | 
					sys_sem_set_invalid(sys_sem_t *sem) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  *sem = SYS_SEM_NULL;
 | 
					  *sem = SYS_SEM_NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
 | 
					u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  x_ticks_t start_tick = 0 ;
 | 
					  x_ticks_t start_tick = 0 ;
 | 
				
			||||||
  int32 wait_time = 0;
 | 
					  int32 wait_time = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,61 +211,51 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(KSemaphoreObtain(*sem, wait_time) == EOK)
 | 
					  if(KSemaphoreObtain(*sem, wait_time) == EOK)
 | 
				
			||||||
    return ((CurrentTicksGain()-start_tick)*MS_PER_SYSTICK);
 | 
					    return CalculateTimeMsFromTick(CurrentTicksGain()-start_tick);
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    return SYS_ARCH_TIMEOUT;
 | 
					    return SYS_ARCH_TIMEOUT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_sem_signal(sys_sem_t *sem)
 | 
					void sys_sem_signal(sys_sem_t *sem) {
 | 
				
			||||||
{
 | 
					  if(KSemaphoreAbandon(*sem) != EOK)
 | 
				
			||||||
  if(KSemaphoreAbandon( *sem ) != EOK)
 | 
					 | 
				
			||||||
    KPrintf("[sys_arch]:sem signal fail!\n");
 | 
					    KPrintf("[sys_arch]:sem signal fail!\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_t sys_mutex_new(sys_mutex_t *mutex)
 | 
					err_t sys_mutex_new(sys_mutex_t *mutex) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  *mutex = KMutexCreate();
 | 
					  *mutex = KMutexCreate();
 | 
				
			||||||
  if(*mutex > SYS_MRTEX_NULL)
 | 
					  if (*mutex > SYS_MRTEX_NULL)
 | 
				
			||||||
    return ERR_OK;
 | 
					    return ERR_OK;
 | 
				
			||||||
  else
 | 
					  else {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    KPrintf("[sys_arch]:new mutex fail!\n");
 | 
					    KPrintf("[sys_arch]:new mutex fail!\n");
 | 
				
			||||||
    return ERR_MEM;
 | 
					    return ERR_MEM;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mutex_free(sys_mutex_t *mutex)
 | 
					void sys_mutex_free(sys_mutex_t *mutex) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  KMutexDelete(*mutex);
 | 
					  KMutexDelete(*mutex);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mutex_set_invalid(sys_mutex_t *mutex)
 | 
					void sys_mutex_set_invalid(sys_mutex_t *mutex) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  *mutex = SYS_MRTEX_NULL;
 | 
					  *mutex = SYS_MRTEX_NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mutex_lock(sys_mutex_t *mutex)
 | 
					void sys_mutex_lock(sys_mutex_t *mutex) {
 | 
				
			||||||
{
 | 
					  KMutexObtain(*mutex, WAITING_FOREVER);
 | 
				
			||||||
  KMutexObtain(*mutex,
 | 
					 | 
				
			||||||
                 WAITING_FOREVER);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mutex_unlock(sys_mutex_t *mutex)
 | 
					void sys_mutex_unlock(sys_mutex_t *mutex) {
 | 
				
			||||||
{
 | 
					  KMutexAbandon(*mutex);
 | 
				
			||||||
  KMutexAbandon( *mutex );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)
 | 
					sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  sys_thread_t handle = -1;
 | 
					  sys_thread_t handle = -1;
 | 
				
			||||||
  handle =  KTaskCreate(name,
 | 
					  handle =  KTaskCreate(name,
 | 
				
			||||||
                         function,
 | 
					                         function,
 | 
				
			||||||
                         arg,
 | 
					                         arg,
 | 
				
			||||||
                         (uint32)stacksize,
 | 
					                         (uint32)stacksize,
 | 
				
			||||||
                         (uint8)prio);
 | 
					                         (uint8)prio);
 | 
				
			||||||
  if (handle >= 0)
 | 
					  if (handle >= 0) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    StartupKTask(handle);
 | 
					    StartupKTask(handle);
 | 
				
			||||||
    lw_print("lw: [%s] create %s handle %x\n", __func__, name, handle);
 | 
					    lw_print("lw: [%s] create %s handle %x\n", __func__, name, handle);
 | 
				
			||||||
    return handle;
 | 
					    return handle;
 | 
				
			||||||
| 
						 | 
					@ -283,8 +264,7 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg
 | 
				
			||||||
  return -ERROR;
 | 
					  return -ERROR;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
 | 
					err_t sys_mbox_new(sys_mbox_t *mbox, int size) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  *mbox = KCreateMsgQueue(sizeof(void *), size);
 | 
					  *mbox = KCreateMsgQueue(sizeof(void *), size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if SYS_STATS
 | 
					#if SYS_STATS
 | 
				
			||||||
| 
						 | 
					@ -293,8 +273,7 @@ err_t sys_mbox_new(sys_mbox_t *mbox, int size)
 | 
				
			||||||
         lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used;
 | 
					         lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif /* SYS_STATS */
 | 
					#endif /* SYS_STATS */
 | 
				
			||||||
  if(*mbox < 0)
 | 
					  if(*mbox < 0) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    lw_print("lw: [%s] alloc %d mbox %p failed\n", __func__, size, mbox);
 | 
					    lw_print("lw: [%s] alloc %d mbox %p failed\n", __func__, size, mbox);
 | 
				
			||||||
    return ERR_MEM;
 | 
					    return ERR_MEM;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -303,44 +282,38 @@ err_t sys_mbox_new(sys_mbox_t *mbox, int size)
 | 
				
			||||||
  return ERR_OK;
 | 
					  return ERR_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mbox_free(sys_mbox_t *mbox)
 | 
					void sys_mbox_free(sys_mbox_t *mbox) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  KDeleteMsgQueue(*mbox);
 | 
					  KDeleteMsgQueue(*mbox);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int sys_mbox_valid(sys_mbox_t *mbox)
 | 
					int sys_mbox_valid(sys_mbox_t *mbox) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (*mbox <= SYS_MBOX_NULL)
 | 
					  if (*mbox <= SYS_MBOX_NULL)
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mbox_set_invalid(sys_mbox_t *mbox)
 | 
					void sys_mbox_set_invalid(sys_mbox_t *mbox) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  *mbox = SYS_MBOX_NULL;
 | 
					  *mbox = SYS_MBOX_NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sys_mbox_post(sys_mbox_t *q, void *msg)
 | 
					void sys_mbox_post(sys_mbox_t *q, void *msg) {
 | 
				
			||||||
{
 | 
					  KMsgQueueSendwait(*q, &msg, sizeof(void *), WAITING_FOREVER);
 | 
				
			||||||
  while(KMsgQueueSendwait( *q, &msg, sizeof(void *), WAITING_FOREVER) != EOK);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_t sys_mbox_trypost(sys_mbox_t *q, void *msg)
 | 
					err_t sys_mbox_trypost(sys_mbox_t *q, void *msg) {
 | 
				
			||||||
{
 | 
					  // if(KMsgQueueSend(*q, &msg, sizeof(void *)) == EOK)
 | 
				
			||||||
  if(KMsgQueueSend(*q, &msg, sizeof(void *)) == EOK)
 | 
					  if(KMsgQueueSend(*q, &msg, sizeof(void *)) == EOK)
 | 
				
			||||||
    return ERR_OK;
 | 
					    return ERR_OK;
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    return ERR_MEM;
 | 
					    return ERR_MEM;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
err_t sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg)
 | 
					err_t sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  return sys_mbox_trypost(q, msg);
 | 
					  return sys_mbox_trypost(q, msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32_t sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout)
 | 
					u32_t sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  x_ticks_t start_tick = 0 ;
 | 
					  x_ticks_t start_tick = 0 ;
 | 
				
			||||||
  int32 wait_time = 0;
 | 
					  int32 wait_time = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -351,17 +324,15 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout)
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    wait_time = timeout;
 | 
					    wait_time = timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), wait_time) == EOK)
 | 
					  if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), wait_time) == EOK) {
 | 
				
			||||||
    return ((CurrentTicksGain()-start_tick)*MS_PER_SYSTICK);
 | 
					    return CalculateTimeMsFromTick(CurrentTicksGain() - start_tick);
 | 
				
			||||||
  else{
 | 
					  } else {
 | 
				
			||||||
    *msg = NULL;
 | 
					 | 
				
			||||||
    return SYS_ARCH_TIMEOUT;
 | 
					    return SYS_ARCH_TIMEOUT;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
 | 
					u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg) {
 | 
				
			||||||
{
 | 
					  if (KMsgQueueRecv(*q, &(*msg), sizeof(void *), 0) == EOK)
 | 
				
			||||||
  if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), 0) == EOK)
 | 
					 | 
				
			||||||
    return ERR_OK;
 | 
					    return ERR_OK;
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    return SYS_MBOX_EMPTY;
 | 
					    return SYS_MBOX_EMPTY;
 | 
				
			||||||
| 
						 | 
					@ -374,97 +345,15 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
 | 
				
			||||||
#endif /* !NO_SYS */
 | 
					#endif /* !NO_SYS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Variables Initialization */
 | 
					/* Variables Initialization */
 | 
				
			||||||
struct netif gnetif;
 | 
					 | 
				
			||||||
ip4_addr_t ipaddr;
 | 
					ip4_addr_t ipaddr;
 | 
				
			||||||
ip4_addr_t netmask;
 | 
					ip4_addr_t netmask;
 | 
				
			||||||
ip4_addr_t gw;
 | 
					ip4_addr_t gw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lwip_tcp_init(void)
 | 
					void lwip_config_input(struct netif *net) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  tcpip_init(NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* IP addresses initialization */
 | 
					 | 
				
			||||||
  /* USER CODE BEGIN 0 */
 | 
					 | 
				
			||||||
#if LWIP_DHCP
 | 
					 | 
				
			||||||
  ip_addr_set_zero_ip4(&ipaddr);
 | 
					 | 
				
			||||||
  ip_addr_set_zero_ip4(&netmask);
 | 
					 | 
				
			||||||
  ip_addr_set_zero_ip4(&gw);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
  IP4_ADDR(&ipaddr, lwip_ipaddr[0], lwip_ipaddr[1], lwip_ipaddr[2], lwip_ipaddr[3]);
 | 
					 | 
				
			||||||
  IP4_ADDR(&netmask, lwip_netmask[0], lwip_netmask[1], lwip_netmask[2], lwip_netmask[3]);
 | 
					 | 
				
			||||||
  IP4_ADDR(&gw, lwip_gwaddr[0], lwip_gwaddr[1], lwip_gwaddr[2], lwip_gwaddr[3]);
 | 
					 | 
				
			||||||
#endif /* USE_DHCP */
 | 
					 | 
				
			||||||
  /* USER CODE END 0 */
 | 
					 | 
				
			||||||
  /* Initilialize the LwIP stack without RTOS */
 | 
					 | 
				
			||||||
  /* add the network interface (IPv4/IPv6) without RTOS */
 | 
					 | 
				
			||||||
#ifdef NETIF_ENET0_INIT_FUNC
 | 
					 | 
				
			||||||
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, NETIF_ENET0_INIT_FUNC, &tcpip_input);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Registers the default network interface */
 | 
					 | 
				
			||||||
  netif_set_default(&gnetif);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (netif_is_link_up(&gnetif))
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    /* When the netif is fully configured this function must be called */
 | 
					 | 
				
			||||||
    KPrintf("%s : netif_set_up\n", __func__);
 | 
					 | 
				
			||||||
    netif_set_up(&gnetif);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    /* When the netif link is down this function must be called */
 | 
					 | 
				
			||||||
    KPrintf("%s : netif_set_down\n", __func__);
 | 
					 | 
				
			||||||
    netif_set_down(&gnetif);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if LWIP_DHCP
 | 
					 | 
				
			||||||
  int err;
 | 
					 | 
				
			||||||
  /*  Creates a new DHCP client for this interface on the first call.
 | 
					 | 
				
			||||||
  Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
 | 
					 | 
				
			||||||
  the predefined regular intervals after starting the client.
 | 
					 | 
				
			||||||
  You can peek in the netif->dhcp struct for the actual DHCP status.*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  err = dhcp_start(&gnetif);
 | 
					 | 
				
			||||||
  if(err == ERR_OK)
 | 
					 | 
				
			||||||
    KPrintf("lwip dhcp init success...\n\n");
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    KPrintf("lwip dhcp init fail...\n\n");
 | 
					 | 
				
			||||||
  while(ip_addr_cmp(&(gnetif.ip_addr),&ipaddr))
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    DelayKTask(1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  KPrintf("\n\nIP:%d.%d.%d.%d\n\n",  \
 | 
					 | 
				
			||||||
        ((gnetif.ip_addr.addr)&0x000000ff),       \
 | 
					 | 
				
			||||||
        (((gnetif.ip_addr.addr)&0x0000ff00)>>8),  \
 | 
					 | 
				
			||||||
        (((gnetif.ip_addr.addr)&0x00ff0000)>>16), \
 | 
					 | 
				
			||||||
        ((gnetif.ip_addr.addr)&0xff000000)>>24);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// lwip input thread to get network packet
 | 
					 | 
				
			||||||
void lwip_input_thread(void *param)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  struct netif *net = param;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  while (1)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
#ifdef FSL_RTOS_XIUOS
 | 
					 | 
				
			||||||
    if (lwip_obtain_semaphore(net) == EOK)
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        /* Poll the driver, get any outstanding frames */
 | 
					 | 
				
			||||||
        ethernetif_input(net);
 | 
					 | 
				
			||||||
        sys_check_timeouts(); /* Handle all system timeouts for all core protocols */
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void lwip_config_input(struct netif *net)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  sys_thread_t th_id = 0;
 | 
					  sys_thread_t th_id = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  th_id = sys_thread_new("eth_input", lwip_input_thread, net, LWIP_TASK_STACK_SIZE, 15);
 | 
					  extern void ethernetif_input(void *netif_arg);
 | 
				
			||||||
 | 
					  th_id = sys_thread_new("eth_input", ethernetif_input, net, LWIP_TASK_STACK_SIZE, 20);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (th_id >= 0) {
 | 
					  if (th_id >= 0) {
 | 
				
			||||||
    lw_print("%s %d successfully!\n", __func__, th_id);
 | 
					    lw_print("%s %d successfully!\n", __func__, th_id);
 | 
				
			||||||
| 
						 | 
					@ -473,15 +362,65 @@ void lwip_config_input(struct netif *net)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw)
 | 
					void lwip_config_tcp(uint8_t enet_port, char *ip, char *mask, char *gw) {
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  ip4_addr_t net_ipaddr, net_netmask, net_gw;
 | 
					  ip4_addr_t net_ipaddr, net_netmask, net_gw;
 | 
				
			||||||
  char* eth_cfg;
 | 
					  char* eth_cfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  eth_cfg = ethernetif_config_enet_set(enet_port);
 | 
					  eth_cfg = ethernetif_config_enet_set(enet_port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(chk_lwip_bit(LWIP_INIT_FLAG))
 | 
					  if(chk_lwip_bit(LWIP_INIT_FLAG)) {
 | 
				
			||||||
  {
 | 
					    lw_print("lw: [%s] already ...\n", __func__);
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set_lwip_bit(LWIP_INIT_FLAG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tcpip_init(NULL, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lw_print("lw: [%s] start ...\n", __func__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]);
 | 
				
			||||||
 | 
					  IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]);
 | 
				
			||||||
 | 
					  IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (0 == enet_port) {
 | 
				
			||||||
 | 
					#ifdef NETIF_ENET0_INIT_FUNC
 | 
				
			||||||
 | 
					    printf("[%s:%d] call netif_add\n", __func__, __LINE__);
 | 
				
			||||||
 | 
					    netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET0_INIT_FUNC,
 | 
				
			||||||
 | 
					        tcpip_input);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  } else if (1 == enet_port) {
 | 
				
			||||||
 | 
					#ifdef NETIF_ENET1_INIT_FUNC
 | 
				
			||||||
 | 
					    netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET1_INIT_FUNC,
 | 
				
			||||||
 | 
					        tcpip_input);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  netif_set_default(&gnetif);
 | 
				
			||||||
 | 
					  netif_set_up(&gnetif);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lw_print("\r\n************************************************\r\n");
 | 
				
			||||||
 | 
					  lw_print(" Network Configuration\r\n");
 | 
				
			||||||
 | 
					  lw_print("************************************************\r\n");
 | 
				
			||||||
 | 
					  lw_print(" IPv4 Address   : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1],
 | 
				
			||||||
 | 
					       ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]);
 | 
				
			||||||
 | 
					  lw_print(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1],
 | 
				
			||||||
 | 
					       ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]);
 | 
				
			||||||
 | 
					  lw_print(" IPv4 Gateway   : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1],
 | 
				
			||||||
 | 
					       ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]);
 | 
				
			||||||
 | 
					  lw_print("************************************************\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lwip_config_input(&gnetif);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw) {
 | 
				
			||||||
 | 
					  ip4_addr_t net_ipaddr, net_netmask, net_gw;
 | 
				
			||||||
 | 
					  char* eth_cfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  eth_cfg = ethernetif_config_enet_set(enet_port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(chk_lwip_bit(LWIP_INIT_FLAG)) {
 | 
				
			||||||
    lw_print("lw: [%s] already ...\n", __func__);
 | 
					    lw_print("lw: [%s] already ...\n", __func__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]);
 | 
					    IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]);
 | 
				
			||||||
| 
						 | 
					@ -521,8 +460,7 @@ void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw)
 | 
				
			||||||
  netif_set_default(&gnetif);
 | 
					  netif_set_default(&gnetif);
 | 
				
			||||||
  netif_set_up(&gnetif);
 | 
					  netif_set_up(&gnetif);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(chk_lwip_bit(LWIP_PRINT_FLAG))
 | 
					  if(chk_lwip_bit(LWIP_PRINT_FLAG)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    lw_notice("\r\n************************************************\r\n");
 | 
					    lw_notice("\r\n************************************************\r\n");
 | 
				
			||||||
    lw_notice(" Network Configuration\r\n");
 | 
					    lw_notice(" Network Configuration\r\n");
 | 
				
			||||||
    lw_notice("************************************************\r\n");
 | 
					    lw_notice("************************************************\r\n");
 | 
				
			||||||
| 
						 | 
					@ -537,55 +475,3 @@ void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw)
 | 
				
			||||||
  lwip_config_input(&gnetif);
 | 
					  lwip_config_input(&gnetif);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lwip_config_tcp(uint8_t enet_port, char *ip, char *mask, char *gw)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  ip4_addr_t net_ipaddr, net_netmask, net_gw;
 | 
					 | 
				
			||||||
  char* eth_cfg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  eth_cfg = ethernetif_config_enet_set(enet_port);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if(chk_lwip_bit(LWIP_INIT_FLAG))
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    lw_print("lw: [%s] already ...\n", __func__);
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  set_lwip_bit(LWIP_INIT_FLAG);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tcpip_init(NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  lw_print("lw: [%s] start ...\n", __func__);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]);
 | 
					 | 
				
			||||||
  IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]);
 | 
					 | 
				
			||||||
  IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if(0 == enet_port) {
 | 
					 | 
				
			||||||
#ifdef NETIF_ENET0_INIT_FUNC
 | 
					 | 
				
			||||||
    netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET0_INIT_FUNC,
 | 
					 | 
				
			||||||
        ethernet_input);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  } else if (1 == enet_port) {
 | 
					 | 
				
			||||||
#ifdef NETIF_ENET1_INIT_FUNC
 | 
					 | 
				
			||||||
    netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET1_INIT_FUNC,
 | 
					 | 
				
			||||||
        ethernet_input);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  netif_set_default(&gnetif);
 | 
					 | 
				
			||||||
  netif_set_up(&gnetif);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  lw_print("\r\n************************************************\r\n");
 | 
					 | 
				
			||||||
  lw_print(" Network Configuration\r\n");
 | 
					 | 
				
			||||||
  lw_print("************************************************\r\n");
 | 
					 | 
				
			||||||
  lw_print(" IPv4 Address   : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1],
 | 
					 | 
				
			||||||
       ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]);
 | 
					 | 
				
			||||||
  lw_print(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1],
 | 
					 | 
				
			||||||
       ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]);
 | 
					 | 
				
			||||||
  lw_print(" IPv4 Gateway   : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1],
 | 
					 | 
				
			||||||
       ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]);
 | 
					 | 
				
			||||||
  lw_print("************************************************\r\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  lwip_config_input(&gnetif);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,8 @@ typedef int32 sys_mbox_t;
 | 
				
			||||||
typedef int32 sys_thread_t;
 | 
					typedef int32 sys_thread_t;
 | 
				
			||||||
typedef x_base sys_prot_t;
 | 
					typedef x_base sys_prot_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MS_PER_SYSTICK (1000 / TICK_PER_SECOND)
 | 
					#define MS_PER_SYSTICK (float)(1000 / TICK_PER_SECOND)
 | 
				
			||||||
 | 
					#define TICKS_PER_MS (TICK_PER_SECOND / 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//debug rtos with IRQ
 | 
					//debug rtos with IRQ
 | 
				
			||||||
//#define FSL_RTOS_XIUOS
 | 
					//#define FSL_RTOS_XIUOS
 | 
				
			||||||
| 
						 | 
					@ -99,6 +100,7 @@ extern char lwip_eth1_netmask[];
 | 
				
			||||||
extern char lwip_eth1_gwaddr[];
 | 
					extern char lwip_eth1_gwaddr[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct netif gnetif;
 | 
					extern struct netif gnetif;
 | 
				
			||||||
 | 
					extern sys_sem_t* get_eth_recv_sem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lwip_tcp_init(void);
 | 
					void lwip_tcp_init(void);
 | 
				
			||||||
void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw);
 | 
					void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,18 +142,22 @@
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LWIP_DEBUG
 | 
					#ifdef LWIP_DEBUG
 | 
				
			||||||
 | 
					#define LWIP_DEBUG_FLAG 1
 | 
				
			||||||
#define LWIP_DEBUGF(debug, message) do { \
 | 
					#define LWIP_DEBUGF(debug, message) do { \
 | 
				
			||||||
                               if ( \
 | 
					                               if ( \
 | 
				
			||||||
                                   ((debug) & LWIP_DBG_ON) && \
 | 
					                                   ((LWIP_DEBUG_FLAG) & LWIP_DBG_ON) && \
 | 
				
			||||||
                                   ((debug) & LWIP_DBG_TYPES_ON) && \
 | 
					                                   ((LWIP_DEBUG_FLAG) & LWIP_DBG_TYPES_ON) && \
 | 
				
			||||||
                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
 | 
					                                   ((s16_t)((LWIP_DEBUG_FLAG) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
 | 
				
			||||||
                                 LWIP_PLATFORM_DIAG(message); \
 | 
					                                 LWIP_PLATFORM_DIAG(message); \
 | 
				
			||||||
                                 if ((debug) & LWIP_DBG_HALT) { \
 | 
					                                 if ((LWIP_DEBUG_FLAG) & LWIP_DBG_HALT) { \
 | 
				
			||||||
                                   while(1); \
 | 
					                                   while(1); \
 | 
				
			||||||
                                 } \
 | 
					                                 } \
 | 
				
			||||||
                               } \
 | 
					                               } \
 | 
				
			||||||
                             } while(0)
 | 
					                             } while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// #define LWIP_DEBUGF(debug, message) do { \
 | 
				
			||||||
 | 
					//                                  LWIP_PLATFORM_DIAG(message); \
 | 
				
			||||||
 | 
					//                              } while(0)
 | 
				
			||||||
#else  /* LWIP_DEBUG */
 | 
					#else  /* LWIP_DEBUG */
 | 
				
			||||||
#define LWIP_DEBUGF(debug, message)
 | 
					#define LWIP_DEBUGF(debug, message)
 | 
				
			||||||
#endif /* LWIP_DEBUG */
 | 
					#endif /* LWIP_DEBUG */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
SRC_FILES := ping.c lwip_ping_demo.c lwip_tcp_demo.c lwip_udp_demo.c tcpecho_raw.c lwip_config_demo.c lwip_dhcp_demo.c iperf.c
 | 
					SRC_FILES := ping.c lwip_ping_demo.c lwip_tcp_demo.c tcpecho_raw.c lwip_config_demo.c lwip_dhcp_demo.c iperf.c
 | 
				
			||||||
 | 
					# SRC_FILES := ping.c lwip_ping_demo.c lwip_tcp_demo.c lwip_udp_demo.c tcpecho_raw.c lwip_config_demo.c lwip_dhcp_demo.c iperf.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include $(KERNEL_ROOT)/compiler.mk
 | 
					include $(KERNEL_ROOT)/compiler.mk
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@
 | 
				
			||||||
#include <sys_arch.h>
 | 
					#include <sys_arch.h>
 | 
				
			||||||
#include "lwip/sockets.h"
 | 
					#include "lwip/sockets.h"
 | 
				
			||||||
#include <netdb.h>
 | 
					#include <netdb.h>
 | 
				
			||||||
 | 
					#include <lwiperf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IPERF_PORT          5001
 | 
					#define IPERF_PORT          5001
 | 
				
			||||||
#define IPERF_BUFSZ         (4 * 1024)
 | 
					#define IPERF_BUFSZ         (4 * 1024)
 | 
				
			||||||
| 
						 | 
					@ -33,9 +34,9 @@ typedef struct{
 | 
				
			||||||
} IPERF_PARAM;
 | 
					} IPERF_PARAM;
 | 
				
			||||||
static IPERF_PARAM param = {IPERF_MODE_STOP, NULL, IPERF_PORT};
 | 
					static IPERF_PARAM param = {IPERF_MODE_STOP, NULL, IPERF_PORT};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char tcp_iperf_ip[] = {192, 168, 131, 77};
 | 
					char tcp_iperf_ip[] = {192, 168, 130, 77};
 | 
				
			||||||
char tcp_iperf_mask[] = {255, 255, 254, 0};
 | 
					char tcp_iperf_mask[] = {255, 255, 254, 0};
 | 
				
			||||||
char tcp_iperf_gw[] = {192, 168, 131, 1};
 | 
					char tcp_iperf_gw[] = {192, 168, 130, 1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void iperf_udp_client(void *thread_param)
 | 
					static void iperf_udp_client(void *thread_param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -226,15 +227,14 @@ static void iperf_client(void *thread_param)
 | 
				
			||||||
        while (param.mode != IPERF_MODE_STOP){
 | 
					        while (param.mode != IPERF_MODE_STOP){
 | 
				
			||||||
            tick2 = CurrentTicksGain();
 | 
					            tick2 = CurrentTicksGain();
 | 
				
			||||||
            if (tick2 - tick1 >= TICK_PER_SECOND * 5){
 | 
					            if (tick2 - tick1 >= TICK_PER_SECOND * 5){
 | 
				
			||||||
                long data;
 | 
					                double speed;
 | 
				
			||||||
                int integer, decimal;
 | 
					                // int integer, decimal;
 | 
				
			||||||
                KTaskDescriptorType tid;
 | 
					                KTaskDescriptorType tid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                tid = GetKTaskDescriptor();
 | 
					                tid = GetKTaskDescriptor();
 | 
				
			||||||
                data = sentlen * TICK_PER_SECOND / 125 / (tick2 - tick1);
 | 
					                speed = (double)(sentlen * TICK_PER_SECOND / 125 / (tick2 - tick1));
 | 
				
			||||||
                integer = data/1000;
 | 
					                speed = speed / 1000.0f;
 | 
				
			||||||
                decimal = data%1000;
 | 
					                printf("%s: %2.4f Mbps!\n", tid->task_base_info.name, speed);
 | 
				
			||||||
                KPrintf("%s: %d.%03d0 Mbps!\n", tid->task_base_info.name, integer, decimal);
 | 
					 | 
				
			||||||
                tick1 = tick2;
 | 
					                tick1 = tick2;
 | 
				
			||||||
                sentlen = 0;
 | 
					                sentlen = 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -301,14 +301,15 @@ void iperf_server(void *thread_param)
 | 
				
			||||||
        FD_ZERO(&readset);
 | 
					        FD_ZERO(&readset);
 | 
				
			||||||
        FD_SET(sock, &readset);
 | 
					        FD_SET(sock, &readset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (select(sock + 1, &readset, NULL, NULL, &timeout) == 0)
 | 
					        if (select(sock + 1, &readset, NULL, NULL, &timeout) == 0) {
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sin_size = sizeof(struct sockaddr_in);
 | 
					        sin_size = sizeof(struct sockaddr_in);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
 | 
					        connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        KPrintf("new client connected from (%s, %d)",
 | 
					        printf("new client connected from (%s, %d)\n",
 | 
				
			||||||
                   inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
 | 
					                   inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int flag = 1;
 | 
					        int flag = 1;
 | 
				
			||||||
| 
						 | 
					@ -318,33 +319,36 @@ void iperf_server(void *thread_param)
 | 
				
			||||||
                    (void *) &flag,  /* the cast is historical cruft */
 | 
					                    (void *) &flag,  /* the cast is historical cruft */
 | 
				
			||||||
                    sizeof(int));    /* length of option value */
 | 
					                    sizeof(int));    /* length of option value */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        printf(" \n");  //BUG
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        recvlen = 0;
 | 
					        recvlen = 0;
 | 
				
			||||||
        tick1 = CurrentTicksGain();
 | 
					        tick1 = CurrentTicksGain();
 | 
				
			||||||
        while (param.mode != IPERF_MODE_STOP){
 | 
					        while (param.mode != IPERF_MODE_STOP){
 | 
				
			||||||
            bytes_received = recv(connected, recv_data, IPERF_BUFSZ, 0);
 | 
					            bytes_received = recv(connected, recv_data, IPERF_BUFSZ, 0);
 | 
				
			||||||
            if (bytes_received <= 0) break;
 | 
					            if (bytes_received == 0) {
 | 
				
			||||||
 | 
					                KPrintf("client disconnected (%s, %d)\n",
 | 
				
			||||||
 | 
					                   inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            } else if (bytes_received < 0) {
 | 
				
			||||||
 | 
					                KPrintf("recv error, client: (%s, %d)\n",
 | 
				
			||||||
 | 
					                   inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            recvlen += bytes_received;
 | 
					            recvlen += bytes_received;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            tick2 = CurrentTicksGain();
 | 
					            tick2 = CurrentTicksGain();
 | 
				
			||||||
            if (tick2 - tick1 >= TICK_PER_SECOND * 5){
 | 
					            if (tick2 - tick1 >= TICK_PER_SECOND * 5) {
 | 
				
			||||||
                long data;
 | 
					                double speed;
 | 
				
			||||||
                int integer, decimal;
 | 
					                // int integer, decimal;
 | 
				
			||||||
                KTaskDescriptorType tid;
 | 
					                KTaskDescriptorType tid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                tid = GetKTaskDescriptor();
 | 
					                tid = GetKTaskDescriptor();
 | 
				
			||||||
                data = recvlen * TICK_PER_SECOND / 125 / (tick2 - tick1);
 | 
					                speed = (double)(recvlen * TICK_PER_SECOND / (125 * (tick2 - tick1)));
 | 
				
			||||||
                integer = data/1000;
 | 
					                speed = speed / 1000.0f;
 | 
				
			||||||
                decimal = data%1000;
 | 
					                printf("%s: %2.4f Mbps!\n", tid->task_base_info.name, speed);
 | 
				
			||||||
                KPrintf("%s: %d.%03d0 Mbps!\n", tid->task_base_info.name, integer, decimal);
 | 
					 | 
				
			||||||
                tick1 = tick2;
 | 
					                tick1 = tick2;
 | 
				
			||||||
                recvlen = 0;
 | 
					                recvlen = 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        KPrintf("client disconnected (%s, %d)\n",
 | 
					 | 
				
			||||||
                   inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
 | 
					 | 
				
			||||||
        if (connected >= 0) closesocket(connected);
 | 
					        if (connected >= 0) closesocket(connected);
 | 
				
			||||||
        connected = -1;
 | 
					        connected = -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -399,6 +403,7 @@ int iperf(int argc, char **argv)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        /* stop iperf */
 | 
					        /* stop iperf */
 | 
				
			||||||
        param.mode = IPERF_MODE_STOP;
 | 
					        param.mode = IPERF_MODE_STOP;
 | 
				
			||||||
 | 
					        printf("iperf stop.\n");
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (strcmp(argv[index], "-s") == 0)
 | 
					    else if (strcmp(argv[index], "-s") == 0)
 | 
				
			||||||
| 
						 | 
					@ -506,5 +511,39 @@ __usage:
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if LWIP_TCP
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					lwiperf_report(void *arg, enum lwiperf_report_type report_type,
 | 
				
			||||||
 | 
					  const ip_addr_t* local_addr, u16_t local_port, const ip_addr_t* remote_addr, u16_t remote_port,
 | 
				
			||||||
 | 
					  u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  LWIP_UNUSED_ARG(arg);
 | 
				
			||||||
 | 
					  LWIP_UNUSED_ARG(local_addr);
 | 
				
			||||||
 | 
					  LWIP_UNUSED_ARG(local_port);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  printf("IPERF report: type=%d, remote: %s:%d, total bytes: %"U32_F", duration in ms: %"U32_F", kbits/s: %"U32_F"\n",
 | 
				
			||||||
 | 
					    (int)report_type, ipaddr_ntoa(remote_addr), (int)remote_port, bytes_transferred, ms_duration, bandwidth_kbitpsec);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* LWIP_TCP */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					lwiperf_example_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if LWIP_TCP
 | 
				
			||||||
 | 
					  ip4_addr_t ipaddr;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 lwiperf_start_tcp_server_default(lwiperf_report, NULL);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  // IP4_ADDR(&ipaddr,192,168,0,181);
 | 
				
			||||||
 | 
					  // lwiperf_start_tcp_client_default(&ipaddr, lwiperf_report, NULL);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(8),
 | 
					SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(8),
 | 
				
			||||||
    iperf, iperf, netutils iperf);
 | 
					    iperf, iperf, netutils iperf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void *lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg);
 | 
				
			||||||
 | 
					SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(8),
 | 
				
			||||||
 | 
					    lwiperf_tcp_server, lwiperf_example_init, netutils lwipperf);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ static void LwipSetIPTask(void *param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint8_t enet_port = *(uint8_t *)param; ///< test enet port 
 | 
					    uint8_t enet_port = *(uint8_t *)param; ///< test enet port 
 | 
				
			||||||
    printf("lw: [%s] config netport id[%d]\n", __func__, enet_port);
 | 
					    printf("lw: [%s] config netport id[%d]\n", __func__, enet_port);
 | 
				
			||||||
    lwip_config_net(enet_port, lwip_ipaddr, lwip_netmask, lwip_gwaddr);
 | 
					    lwip_config_tcp(enet_port, lwip_ipaddr, lwip_netmask, lwip_gwaddr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LwipSetIPTest(int argc, char *argv[])
 | 
					void LwipSetIPTest(int argc, char *argv[])
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,8 @@ void LwipSetIPTest(int argc, char *argv[])
 | 
				
			||||||
        sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]);
 | 
					        sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]);
 | 
				
			||||||
        memcpy(lwip_eth0_ipaddr, lwip_ipaddr, strlen(lwip_ipaddr));
 | 
					        memcpy(lwip_eth0_ipaddr, lwip_ipaddr, strlen(lwip_ipaddr));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    sys_thread_new("SET ip address", LwipSetIPTask, &enet_id, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
 | 
					    // sys_thread_new("SET ip address", LwipSetIPTask, &enet_id, LWIP_TASK_STACK_SIZE, LWIP_DEMO_TASK_PRIO);
 | 
				
			||||||
 | 
					    LwipSetIPTask(&enet_id);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(5),
 | 
					SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(5),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,13 +19,13 @@
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "board.h"
 | 
					#include "board.h"
 | 
				
			||||||
#include "lwip_demo.h"
 | 
					 | 
				
			||||||
#include "sys_arch.h"
 | 
					#include "sys_arch.h"
 | 
				
			||||||
#include "lwip/sockets.h"
 | 
					 | 
				
			||||||
#include "tcpecho_raw.h"
 | 
					 | 
				
			||||||
#include <shell.h>
 | 
					#include <shell.h>
 | 
				
			||||||
#include <sys.h>
 | 
					#include <sys.h>
 | 
				
			||||||
#include <xizi.h>
 | 
					#include <xizi.h>
 | 
				
			||||||
 | 
					#include "lwip_demo.h"
 | 
				
			||||||
 | 
					#include "lwip/sockets.h"
 | 
				
			||||||
 | 
					#include "tcpecho_raw.h"
 | 
				
			||||||
char tcp_demo_msg[LWIP_TEST_MSG_SIZE] = { 0 };
 | 
					char tcp_demo_msg[LWIP_TEST_MSG_SIZE] = { 0 };
 | 
				
			||||||
char tcp_demo_ip[] = {192, 168, 250, 252};
 | 
					char tcp_demo_ip[] = {192, 168, 250, 252};
 | 
				
			||||||
u16_t tcp_demo_port = LWIP_TARGET_PORT;
 | 
					u16_t tcp_demo_port = LWIP_TARGET_PORT;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,9 @@ ping_recv(int s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
 | 
					      LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
 | 
				
			||||||
      ip_addr_debug_print_val(PING_DEBUG, fromaddr);
 | 
					      ip_addr_debug_print_val(PING_DEBUG, fromaddr);
 | 
				
			||||||
 | 
					#ifdef LWIP_DEBUG
 | 
				
			||||||
      LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now() - ping_time)));
 | 
					      LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now() - ping_time)));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* todo: support ICMP6 echo */
 | 
					      /* todo: support ICMP6 echo */
 | 
				
			||||||
#if LWIP_IPV4
 | 
					#if LWIP_IPV4
 | 
				
			||||||
| 
						 | 
					@ -235,7 +237,9 @@ ping_recv(int s)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (len == 0) {
 | 
					  if (len == 0) {
 | 
				
			||||||
 | 
					#ifdef LWIP_DEBUG
 | 
				
			||||||
    LWIP_DEBUGF( PING_DEBUG, ("ping: recv - %"U32_F" ms - timeout\n", (sys_now()-ping_time)));
 | 
					    LWIP_DEBUGF( PING_DEBUG, ("ping: recv - %"U32_F" ms - timeout\n", (sys_now()-ping_time)));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* do some ping result processing */
 | 
					  /* do some ping result processing */
 | 
				
			||||||
| 
						 | 
					@ -524,8 +528,10 @@ int get_url_ip(char* url)
 | 
				
			||||||
#endif /* LWIP_DEBUG */
 | 
					#endif /* LWIP_DEBUG */
 | 
				
			||||||
            if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0)
 | 
					            if ((recv_len = lwip_ping_recv(s, &ttl)) >= 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					#ifdef LWIP_DEBUG
 | 
				
			||||||
                lw_notice("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt,
 | 
					                lw_notice("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, inet_ntoa(ina), cnt,
 | 
				
			||||||
                ttl, sys_now() - ping_time);
 | 
					                ttl, sys_now() - ping_time);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue