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
|
||||
|
|
|
@ -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 <hardware_ethernetif.h>
|
||||
#include <hc32_ll_eth.h>
|
||||
#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>
|
||||
|
||||
#include <xs_isr.h>
|
||||
|
||||
/**
|
||||
* @addtogroup HC32F4A0_DDL_Examples
|
||||
* @{
|
||||
|
@ -71,33 +72,7 @@ Modification:
|
|||
/*******************************************************************************
|
||||
* 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')
|
||||
|
@ -111,19 +86,6 @@ static char txBuf[] = "Ethernet Loop-Back Test";
|
|||
* 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')
|
||||
|
@ -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.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
static void Ethernet_GpioInit(void)
|
||||
void Ethernet_GpioInit(void)
|
||||
{
|
||||
/* ETH_RST */
|
||||
stc_gpio_init_t stcGpioInit;
|
||||
|
@ -228,241 +180,12 @@ static void Ethernet_GpioInit(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
*/
|
||||
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 *ethernetif_config_enet_set(uint8_t enet_port) {
|
||||
return NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 = 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;
|
||||
void Time_Update_LwIP(void) {
|
||||
//no need to do
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -486,8 +209,8 @@ err_t ethernetif_init(struct netif *netif)
|
|||
* 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
|
||||
* is available...) */
|
||||
netif->output = ðarp_output;
|
||||
netif->linkoutput = &low_level_output;
|
||||
netif->output = etharp_output;
|
||||
netif->linkoutput = low_level_output;
|
||||
#endif
|
||||
|
||||
/* initialize the hardware */
|
||||
|
@ -499,34 +222,38 @@ err_t ethernetif_init(struct netif *netif)
|
|||
* @param netif The network interface structure for this ethernetif.
|
||||
* @retval None
|
||||
*/
|
||||
void ethernetif_input(struct netif *netif)
|
||||
void ethernetif_input(void *netif_arg)
|
||||
{
|
||||
err_t err;
|
||||
struct pbuf *p;
|
||||
struct netif *netif = (struct netif *)netif_arg;
|
||||
x_base critical_lock;
|
||||
|
||||
/* 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
|
||||
/* No packet could be read, silently ignore this */
|
||||
if (NULL == p) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Entry point to the LwIP stack */
|
||||
err = netif->input(p, netif);
|
||||
if (err != (err_t)ERR_OK) {
|
||||
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
|
||||
(void)pbuf_free(p);
|
||||
}
|
||||
/* Entry point to the LwIP stack */
|
||||
if (p != NULL) {
|
||||
if (netif->input(p, netif) != ERR_OK) {
|
||||
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
|
||||
KPrintf("ethernetif_input: IP input error\n");
|
||||
pbuf_free(p);
|
||||
p = NULL;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
#else
|
||||
/* No packet could be read, silently ignore this */
|
||||
if (p != NULL) {
|
||||
EthernetIF_InputCallback(netif, p);
|
||||
free(p);
|
||||
}
|
||||
#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
|
||||
* @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 */
|
||||
#ifdef ETHERNET_LOOPBACK_TEST
|
||||
if ((0 == (memcmp(p->payload, txPbuf.payload, p->len))) && (p->len == txPbuf.len)) {
|
||||
|
|
|
@ -22,11 +22,47 @@
|
|||
#define CONNECT_ETHERNET_H
|
||||
|
||||
#include "hardware_ethernetif.h"
|
||||
#include <sys_arch.h>
|
||||
#include <hc32_ll_eth.h>
|
||||
#include <hardware_irq.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -133,9 +133,37 @@ extern "C"
|
|||
* @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);
|
||||
void ethernetif_input(struct netif *netif);
|
||||
err_t low_level_output(struct netif *netif, struct pbuf *p);
|
||||
void ethernetif_input(void *netif);
|
||||
// err_t low_level_output(struct netif *netif, struct pbuf *p);
|
||||
|
||||
void EthernetIF_CheckLink(struct netif *netif);
|
||||
void EthernetIF_UpdateLink(struct netif *netif);
|
||||
|
|
|
@ -2,10 +2,12 @@ SRC_DIR += api
|
|||
SRC_DIR += arch
|
||||
SRC_DIR += core
|
||||
SRC_DIR += netif
|
||||
SRC_DIR += apps
|
||||
|
||||
LWIP_DIR += api
|
||||
LWIP_DIR += arch
|
||||
LWIP_DIR += core
|
||||
LWIP_DIR += netif
|
||||
LWIP_DIR += apps
|
||||
|
||||
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__
|
||||
#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
|
||||
* 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
|
||||
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
|
||||
sends a lot of data out of ROM (or other static memory), this
|
||||
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
|
||||
per active UDP "connection". */
|
||||
#define MEMP_NUM_UDP_PCB 4
|
||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
||||
connections. */
|
||||
#define MEMP_NUM_TCP_PCB 4
|
||||
#define MEMP_NUM_TCP_PCB 64
|
||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
||||
connections. */
|
||||
#define MEMP_NUM_TCP_PCB_LISTEN 2
|
||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
||||
segments. */
|
||||
#define MEMP_NUM_TCP_SEG 20
|
||||
#define MEMP_NUM_TCP_SEG 256
|
||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
||||
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_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. */
|
||||
// #define PBUF_POOL_BUFSIZE 1024
|
||||
#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 ---------- */
|
||||
#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
|
||||
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. */
|
||||
#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)
|
||||
|
||||
/* 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 ---------- */
|
||||
#define LWIP_ICMP 1
|
||||
|
||||
|
@ -127,7 +379,6 @@ a lot of data that needs to be copied, this should be set high. */
|
|||
|
||||
|
||||
/* ---------- Statistics options ---------- */
|
||||
#define LWIP_STATS 0
|
||||
#define LWIP_PROVIDE_ERRNO 1
|
||||
|
||||
/* ---------- 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.
|
||||
*/
|
||||
#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_UDP_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_STACKSIZE 1024
|
||||
|
||||
#define TCPIP_THREAD_NAME "tcp"
|
||||
#define TCPIP_THREAD_STACKSIZE 8192
|
||||
#define TCPIP_MBOX_SIZE 8
|
||||
#define TCPIP_THREAD_PRIO 15
|
||||
#define TCPIP_THREAD_STACKSIZE 4096
|
||||
#define TCPIP_MBOX_SIZE 16
|
||||
#define TCPIP_THREAD_PRIO 20
|
||||
|
||||
/*
|
||||
----------------------------------------
|
||||
---------- Lwip Debug options ----------
|
||||
----------------------------------------
|
||||
*/
|
||||
#define LWIP_DEBUG 1
|
||||
|
||||
#define LWIP_IPV4 1
|
||||
#define LWIP_RAW 1
|
||||
#define LWIP_DNS 1
|
||||
|
|
|
@ -69,17 +69,17 @@
|
|||
#include "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_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_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_gwaddr[20] = {192, 168, 131, 23};
|
||||
char lwip_eth1_gwaddr[20] = {192, 168, 130, 23};
|
||||
|
||||
char lwip_flag = 0;
|
||||
|
||||
|
@ -89,8 +89,7 @@ struct sys_timeouts {
|
|||
struct sys_timeo *next;
|
||||
};
|
||||
|
||||
struct timeoutlist
|
||||
{
|
||||
struct timeoutlist {
|
||||
struct sys_timeouts timeouts;
|
||||
int32 pid;
|
||||
};
|
||||
|
@ -101,40 +100,40 @@ static struct timeoutlist s_timeoutlist[SYS_THREAD_MAX];
|
|||
|
||||
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
|
||||
sys_jiffies(void)
|
||||
{
|
||||
sys_jiffies(void) {
|
||||
lwip_sys_now = CurrentTicksGain();
|
||||
return lwip_sys_now;
|
||||
}
|
||||
|
||||
u32_t
|
||||
sys_now(void)
|
||||
{
|
||||
sys_now(void) {
|
||||
lwip_sys_now = CurrentTicksGain();
|
||||
return lwip_sys_now;
|
||||
return CalculateTimeMsFromTick(lwip_sys_now);
|
||||
}
|
||||
|
||||
void
|
||||
sys_init(void)
|
||||
{
|
||||
sys_init(void) {
|
||||
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].timeouts.next = NULL;
|
||||
}
|
||||
s_nextthread = 0;
|
||||
}
|
||||
|
||||
struct sys_timeouts *sys_arch_timeouts(void)
|
||||
{
|
||||
struct sys_timeouts *sys_arch_timeouts(void) {
|
||||
int i;
|
||||
int32 pid;
|
||||
struct timeoutlist *tl;
|
||||
pid = (int32)GetKTaskDescriptor()->id.id;
|
||||
for(i = 0; i < s_nextthread; i++)
|
||||
{
|
||||
for(i = 0; i < s_nextthread; i++) {
|
||||
tl = &(s_timeoutlist[i]);
|
||||
if(tl->pid == pid)
|
||||
{
|
||||
|
@ -144,21 +143,18 @@ struct sys_timeouts *sys_arch_timeouts(void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
sys_prot_t sys_arch_protect(void)
|
||||
{
|
||||
sys_prot_t sys_arch_protect(void) {
|
||||
return CriticalAreaLock();
|
||||
}
|
||||
|
||||
void sys_arch_unprotect(sys_prot_t pval)
|
||||
{
|
||||
void sys_arch_unprotect(sys_prot_t pval) {
|
||||
CriticalAreaUnLock(pval);
|
||||
}
|
||||
|
||||
#if !NO_SYS
|
||||
|
||||
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);
|
||||
|
||||
#if SYS_STATS
|
||||
|
@ -170,8 +166,7 @@ sys_sem_new(sys_sem_t *sem, u8_t count)
|
|||
|
||||
if(*sem >= 0)
|
||||
return ERR_OK;
|
||||
else
|
||||
{
|
||||
else {
|
||||
#if SYS_STATS
|
||||
++lwip_stats.sys.sem.err;
|
||||
#endif /* SYS_STATS */
|
||||
|
@ -181,8 +176,7 @@ sys_sem_new(sys_sem_t *sem, u8_t count)
|
|||
}
|
||||
|
||||
void
|
||||
sys_sem_free(sys_sem_t *sem)
|
||||
{
|
||||
sys_sem_free(sys_sem_t *sem) {
|
||||
#if SYS_STATS
|
||||
--lwip_stats.sys.sem.used;
|
||||
#endif /* SYS_STATS */
|
||||
|
@ -190,19 +184,16 @@ sys_sem_free(sys_sem_t *sem)
|
|||
*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);
|
||||
}
|
||||
|
||||
void
|
||||
sys_sem_set_invalid(sys_sem_t *sem)
|
||||
{
|
||||
sys_sem_set_invalid(sys_sem_t *sem) {
|
||||
*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 ;
|
||||
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)
|
||||
return ((CurrentTicksGain()-start_tick)*MS_PER_SYSTICK);
|
||||
return CalculateTimeMsFromTick(CurrentTicksGain()-start_tick);
|
||||
else
|
||||
return SYS_ARCH_TIMEOUT;
|
||||
}
|
||||
|
||||
void sys_sem_signal(sys_sem_t *sem)
|
||||
{
|
||||
if(KSemaphoreAbandon( *sem ) != EOK)
|
||||
void sys_sem_signal(sys_sem_t *sem) {
|
||||
if(KSemaphoreAbandon(*sem) != EOK)
|
||||
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();
|
||||
if(*mutex > SYS_MRTEX_NULL)
|
||||
if (*mutex > SYS_MRTEX_NULL)
|
||||
return ERR_OK;
|
||||
else
|
||||
{
|
||||
else {
|
||||
KPrintf("[sys_arch]:new mutex fail!\n");
|
||||
return ERR_MEM;
|
||||
}
|
||||
}
|
||||
|
||||
void sys_mutex_free(sys_mutex_t *mutex)
|
||||
{
|
||||
void sys_mutex_free(sys_mutex_t *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;
|
||||
}
|
||||
|
||||
void sys_mutex_lock(sys_mutex_t *mutex)
|
||||
{
|
||||
KMutexObtain(*mutex,
|
||||
WAITING_FOREVER);
|
||||
void sys_mutex_lock(sys_mutex_t *mutex) {
|
||||
KMutexObtain(*mutex, WAITING_FOREVER);
|
||||
}
|
||||
|
||||
void sys_mutex_unlock(sys_mutex_t *mutex)
|
||||
{
|
||||
KMutexAbandon( *mutex );
|
||||
void sys_mutex_unlock(sys_mutex_t *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;
|
||||
handle = KTaskCreate(name,
|
||||
function,
|
||||
arg,
|
||||
(uint32)stacksize,
|
||||
(uint8)prio);
|
||||
if (handle >= 0)
|
||||
{
|
||||
if (handle >= 0) {
|
||||
StartupKTask(handle);
|
||||
lw_print("lw: [%s] create %s handle %x\n", __func__, name, handle);
|
||||
return handle;
|
||||
|
@ -283,8 +264,7 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg
|
|||
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);
|
||||
|
||||
#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;
|
||||
}
|
||||
#endif /* SYS_STATS */
|
||||
if(*mbox < 0)
|
||||
{
|
||||
if(*mbox < 0) {
|
||||
lw_print("lw: [%s] alloc %d mbox %p failed\n", __func__, size, mbox);
|
||||
return ERR_MEM;
|
||||
}
|
||||
|
@ -303,44 +282,38 @@ err_t sys_mbox_new(sys_mbox_t *mbox, int size)
|
|||
return ERR_OK;
|
||||
}
|
||||
|
||||
void sys_mbox_free(sys_mbox_t *mbox)
|
||||
{
|
||||
void sys_mbox_free(sys_mbox_t *mbox) {
|
||||
KDeleteMsgQueue(*mbox);
|
||||
}
|
||||
|
||||
int sys_mbox_valid(sys_mbox_t *mbox)
|
||||
{
|
||||
int sys_mbox_valid(sys_mbox_t *mbox) {
|
||||
if (*mbox <= SYS_MBOX_NULL)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sys_mbox_set_invalid(sys_mbox_t *mbox)
|
||||
{
|
||||
void sys_mbox_set_invalid(sys_mbox_t *mbox) {
|
||||
*mbox = SYS_MBOX_NULL;
|
||||
}
|
||||
|
||||
void sys_mbox_post(sys_mbox_t *q, void *msg)
|
||||
{
|
||||
while(KMsgQueueSendwait( *q, &msg, sizeof(void *), WAITING_FOREVER) != EOK);
|
||||
void sys_mbox_post(sys_mbox_t *q, void *msg) {
|
||||
KMsgQueueSendwait(*q, &msg, sizeof(void *), WAITING_FOREVER);
|
||||
}
|
||||
|
||||
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)
|
||||
return ERR_OK;
|
||||
else
|
||||
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);
|
||||
}
|
||||
|
||||
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 ;
|
||||
int32 wait_time = 0;
|
||||
|
||||
|
@ -351,17 +324,15 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout)
|
|||
else
|
||||
wait_time = timeout;
|
||||
|
||||
if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), wait_time) == EOK)
|
||||
return ((CurrentTicksGain()-start_tick)*MS_PER_SYSTICK);
|
||||
else{
|
||||
*msg = NULL;
|
||||
if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), wait_time) == EOK) {
|
||||
return CalculateTimeMsFromTick(CurrentTicksGain() - start_tick);
|
||||
} else {
|
||||
return SYS_ARCH_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
||||
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
|
||||
{
|
||||
if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), 0) == EOK)
|
||||
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg) {
|
||||
if (KMsgQueueRecv(*q, &(*msg), sizeof(void *), 0) == EOK)
|
||||
return ERR_OK;
|
||||
else
|
||||
return SYS_MBOX_EMPTY;
|
||||
|
@ -374,97 +345,15 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
|
|||
#endif /* !NO_SYS */
|
||||
|
||||
/* Variables Initialization */
|
||||
struct netif gnetif;
|
||||
ip4_addr_t ipaddr;
|
||||
ip4_addr_t netmask;
|
||||
ip4_addr_t gw;
|
||||
|
||||
void lwip_tcp_init(void)
|
||||
{
|
||||
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)
|
||||
{
|
||||
void lwip_config_input(struct netif *net) {
|
||||
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) {
|
||||
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;
|
||||
char* eth_cfg;
|
||||
|
||||
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__);
|
||||
|
||||
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_up(&gnetif);
|
||||
|
||||
if(chk_lwip_bit(LWIP_PRINT_FLAG))
|
||||
{
|
||||
if(chk_lwip_bit(LWIP_PRINT_FLAG)) {
|
||||
lw_notice("\r\n************************************************\r\n");
|
||||
lw_notice(" Network Configuration\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);
|
||||
}
|
||||
|
||||
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 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
|
||||
//#define FSL_RTOS_XIUOS
|
||||
|
@ -99,6 +100,7 @@ extern char lwip_eth1_netmask[];
|
|||
extern char lwip_eth1_gwaddr[];
|
||||
|
||||
extern struct netif gnetif;
|
||||
extern sys_sem_t* get_eth_recv_sem();
|
||||
|
||||
void lwip_tcp_init(void);
|
||||
void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw);
|
||||
|
|
|
@ -142,18 +142,22 @@
|
|||
#endif
|
||||
|
||||
#ifdef LWIP_DEBUG
|
||||
#define LWIP_DEBUG_FLAG 1
|
||||
#define LWIP_DEBUGF(debug, message) do { \
|
||||
if ( \
|
||||
((debug) & LWIP_DBG_ON) && \
|
||||
((debug) & LWIP_DBG_TYPES_ON) && \
|
||||
((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
|
||||
((LWIP_DEBUG_FLAG) & LWIP_DBG_ON) && \
|
||||
((LWIP_DEBUG_FLAG) & LWIP_DBG_TYPES_ON) && \
|
||||
((s16_t)((LWIP_DEBUG_FLAG) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
|
||||
LWIP_PLATFORM_DIAG(message); \
|
||||
if ((debug) & LWIP_DBG_HALT) { \
|
||||
if ((LWIP_DEBUG_FLAG) & LWIP_DBG_HALT) { \
|
||||
while(1); \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
// #define LWIP_DEBUGF(debug, message) do { \
|
||||
// LWIP_PLATFORM_DIAG(message); \
|
||||
// } while(0)
|
||||
#else /* LWIP_DEBUG */
|
||||
#define LWIP_DEBUGF(debug, message)
|
||||
#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
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <sys_arch.h>
|
||||
#include "lwip/sockets.h"
|
||||
#include <netdb.h>
|
||||
#include <lwiperf.h>
|
||||
|
||||
#define IPERF_PORT 5001
|
||||
#define IPERF_BUFSZ (4 * 1024)
|
||||
|
@ -33,9 +34,9 @@ typedef struct{
|
|||
} IPERF_PARAM;
|
||||
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_gw[] = {192, 168, 131, 1};
|
||||
char tcp_iperf_gw[] = {192, 168, 130, 1};
|
||||
|
||||
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){
|
||||
tick2 = CurrentTicksGain();
|
||||
if (tick2 - tick1 >= TICK_PER_SECOND * 5){
|
||||
long data;
|
||||
int integer, decimal;
|
||||
double speed;
|
||||
// int integer, decimal;
|
||||
KTaskDescriptorType tid;
|
||||
|
||||
tid = GetKTaskDescriptor();
|
||||
data = sentlen * TICK_PER_SECOND / 125 / (tick2 - tick1);
|
||||
integer = data/1000;
|
||||
decimal = data%1000;
|
||||
KPrintf("%s: %d.%03d0 Mbps!\n", tid->task_base_info.name, integer, decimal);
|
||||
speed = (double)(sentlen * TICK_PER_SECOND / 125 / (tick2 - tick1));
|
||||
speed = speed / 1000.0f;
|
||||
printf("%s: %2.4f Mbps!\n", tid->task_base_info.name, speed);
|
||||
tick1 = tick2;
|
||||
sentlen = 0;
|
||||
}
|
||||
|
@ -301,14 +301,15 @@ void iperf_server(void *thread_param)
|
|||
FD_ZERO(&readset);
|
||||
FD_SET(sock, &readset);
|
||||
|
||||
if (select(sock + 1, &readset, NULL, NULL, &timeout) == 0)
|
||||
if (select(sock + 1, &readset, NULL, NULL, &timeout) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
sin_size = sizeof(struct sockaddr_in);
|
||||
|
||||
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));
|
||||
|
||||
int flag = 1;
|
||||
|
@ -318,33 +319,36 @@ void iperf_server(void *thread_param)
|
|||
(void *) &flag, /* the cast is historical cruft */
|
||||
sizeof(int)); /* length of option value */
|
||||
|
||||
printf(" \n"); //BUG
|
||||
|
||||
recvlen = 0;
|
||||
tick1 = CurrentTicksGain();
|
||||
while (param.mode != IPERF_MODE_STOP){
|
||||
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;
|
||||
|
||||
tick2 = CurrentTicksGain();
|
||||
if (tick2 - tick1 >= TICK_PER_SECOND * 5){
|
||||
long data;
|
||||
int integer, decimal;
|
||||
if (tick2 - tick1 >= TICK_PER_SECOND * 5) {
|
||||
double speed;
|
||||
// int integer, decimal;
|
||||
KTaskDescriptorType tid;
|
||||
|
||||
tid = GetKTaskDescriptor();
|
||||
data = recvlen * TICK_PER_SECOND / 125 / (tick2 - tick1);
|
||||
integer = data/1000;
|
||||
decimal = data%1000;
|
||||
KPrintf("%s: %d.%03d0 Mbps!\n", tid->task_base_info.name, integer, decimal);
|
||||
speed = (double)(recvlen * TICK_PER_SECOND / (125 * (tick2 - tick1)));
|
||||
speed = speed / 1000.0f;
|
||||
printf("%s: %2.4f Mbps!\n", tid->task_base_info.name, speed);
|
||||
tick1 = tick2;
|
||||
recvlen = 0;
|
||||
}
|
||||
}
|
||||
KPrintf("client disconnected (%s, %d)\n",
|
||||
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
|
||||
if (connected >= 0) closesocket(connected);
|
||||
connected = -1;
|
||||
}
|
||||
|
@ -399,6 +403,7 @@ int iperf(int argc, char **argv)
|
|||
{
|
||||
/* stop iperf */
|
||||
param.mode = IPERF_MODE_STOP;
|
||||
printf("iperf stop.\n");
|
||||
return 0;
|
||||
}
|
||||
else if (strcmp(argv[index], "-s") == 0)
|
||||
|
@ -506,5 +511,39 @@ __usage:
|
|||
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),
|
||||
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
|
||||
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[])
|
||||
|
@ -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]);
|
||||
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),
|
||||
|
|
|
@ -19,13 +19,13 @@
|
|||
*/
|
||||
|
||||
#include "board.h"
|
||||
#include "lwip_demo.h"
|
||||
#include "sys_arch.h"
|
||||
#include "lwip/sockets.h"
|
||||
#include "tcpecho_raw.h"
|
||||
#include <shell.h>
|
||||
#include <sys.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_ip[] = {192, 168, 250, 252};
|
||||
u16_t tcp_demo_port = LWIP_TARGET_PORT;
|
||||
|
|
|
@ -211,7 +211,9 @@ ping_recv(int s)
|
|||
|
||||
LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
|
||||
ip_addr_debug_print_val(PING_DEBUG, fromaddr);
|
||||
#ifdef LWIP_DEBUG
|
||||
LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now() - ping_time)));
|
||||
#endif
|
||||
|
||||
/* todo: support ICMP6 echo */
|
||||
#if LWIP_IPV4
|
||||
|
@ -235,7 +237,9 @@ ping_recv(int s)
|
|||
}
|
||||
|
||||
if (len == 0) {
|
||||
#ifdef LWIP_DEBUG
|
||||
LWIP_DEBUGF( PING_DEBUG, ("ping: recv - %"U32_F" ms - timeout\n", (sys_now()-ping_time)));
|
||||
#endif
|
||||
}
|
||||
|
||||
/* do some ping result processing */
|
||||
|
@ -524,8 +528,10 @@ int get_url_ip(char* url)
|
|||
#endif /* LWIP_DEBUG */
|
||||
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,
|
||||
ttl, sys_now() - ping_time);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue