123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690 |
- /**
- ******************************************************************************
- * @file LwIP/LwIP_HTTP_Server_Socket_RTOS/Src/ethernetif.c
- * @author MCD Application Team
- * @brief This file implements Ethernet network interface drivers for lwIP
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f2xx_hal.h"
- #include "lwip/timeouts.h"
- #include "netif/etharp.h"
- #include "ethernetif.h"
- #include <string.h>
- #include "myFile.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* The time to block waiting for input. */
- #define TIME_WAITING_FOR_INPUT ( osWaitForever )
- /* Stack size of the interface thread */
- #define INTERFACE_THREAD_STACK_SIZE ( 350 )
- /* Define those to better describe your network interface. */
- #define IFNAME0 's'
- #define IFNAME1 't'
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN ETH_DMADescTypeDef DMARxDscrTab[ETH_RXBUFNB] __ALIGN_END;/* Ethernet Rx MA Descriptor */
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN ETH_DMADescTypeDef DMATxDscrTab[ETH_TXBUFNB] __ALIGN_END;/* Ethernet Tx DMA Descriptor */
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __ALIGN_END; /* Ethernet Receive Buffer */
- #if defined ( __ICCARM__ ) /*!< IAR Compiler */
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __ALIGN_END; /* Ethernet Transmit Buffer */
- /* Semaphore to signal incoming packets */
- osSemaphoreId s_xSemaphore = NULL;
- /* Global Ethernet handle*/
- ETH_HandleTypeDef EthHandle;
- /* Private function prototypes -----------------------------------------------*/
- static void ethernetif_input( void const * argument );
- static void vTaskUserIF(void *pvParameters);
- void HAL_ETH_RESET();
- void HAL_ETH_SET();
- void HAL_ETH_RESET_INIT();
- /* Private functions ---------------------------------------------------------*/
- /*******************************************************************************
- Ethernet MSP Routines
- *******************************************************************************/
- /**
- * @brief Initializes the ETH MSP.
- * @param heth: ETH handle
- * @retval None
- */
- void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* Enable GPIOs clocks */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- /* Ethernet pins configuration ************************************************/
- /*
- ETH_MDIO -------------------------> PA2 PA2
- ETH_MDC --------------------------> PC1 PC1
- ETH_MII_CRS ----------------------> PH2 PA0
- ETH_MII_COL ----------------------> PH3 PA3
- ETH_MII_RX_ER --------------------> PI10 PB10
- ETH_MII_RXD2 ---------------------> PH6 PB0
- ETH_MII_RXD3 ---------------------> PH7 PB1
- ETH_MII_TX_CLK -------------------> PC3 PC3
- ETH_MII_TXD2 ---------------------> PC2 PC2
- ETH_MII_TXD3 ---------------------> PB8 PB8
- ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1 PA1
- ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7 PA7
- ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4 PC4
- ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5 PC5
- ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PG11 PG11
- ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13 PG13
- ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14 PG14
- */
- HAL_ETH_RESET_INIT();
- /* Configure PA0,PA1, PA2 , PA3 , PA7 */
- GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_7;
- GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
- GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStructure.Pull = GPIO_NOPULL;
- GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
- /* Configure PB0 , PB1 ,PB8 , PB10 */
- GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_10;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
- /* Configure PC1, PC2, PC3, PC4 and PC5 */
- GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
- /* Configure PG11 PG14 and PG13 */
- GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
-
- /* Enable the Ethernet global Interrupt */
- HAL_NVIC_SetPriority(ETH_IRQn, 0x6, 0);
- HAL_NVIC_EnableIRQ(ETH_IRQn);
- /* Enable ETHERNET clock */
- __HAL_RCC_ETH_CLK_ENABLE();
- HAL_ETH_SET();
- if (heth->Init.MediaInterface == ETH_MEDIA_INTERFACE_MII)
- {
- /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */
- HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
- }
- }
- /*
- *
- */
- void HAL_ETH_RESET_INIT()
- {
- __HAL_RCC_GPIOE_CLK_ENABLE();
-
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Configure PE2*/
- GPIO_InitStructure.Pin = GPIO_PIN_2 ;
- GPIO_InitStructure.Speed=GPIO_SPEED_LOW;
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStructure.Pull = GPIO_PULLDOWN;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
-
- }
- void HAL_ETH_RESET()
- {
- HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_RESET);
- }
- void HAL_ETH_SET()
- {
- HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET);
- }
- /**
- * @brief Ethernet Rx Transfer completed callback
- * @param heth: ETH handle
- * @retval None
- */
- void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
- {
- // LED2_TOGGLE;
- portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
- xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
- }
- /*******************************************************************************
- LL Driver Interface ( LwIP stack --> ETH)
- *******************************************************************************/
- /**
- * @brief In this function, the hardware should be initialized.
- * Called from ethernetif_init().
- *
- * @param netif the already initialized lwip network interface structure
- * for this ethernetif
- */
- static void low_level_init(struct netif *netif)
- {
- uint32_t regvalue = 0;
- uint8_t macaddress[6]= { MAC_ADDR0, MAC_ADDR1, MAC_ADDR2, MAC_ADDR3, MAC_ADDR4, MAC_ADDR5 };
-
- EthHandle.Instance = ETH;
- EthHandle.Init.MACAddr = macaddress;
- EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
- EthHandle.Init.Speed = ETH_SPEED_100M;
- EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
- EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_MII;
- EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE;
- EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
- EthHandle.Init.PhyAddress = DP83848_PHY_ADDRESS;
-
- /* configure ethernet peripheral (GPIOs, clocks, MAC, DMA) */
- if (HAL_ETH_Init(&EthHandle) == HAL_OK)
- {
- /* Set netif link flag */
- netif->flags |= NETIF_FLAG_LINK_UP;
- }
-
- /* Initialize Tx Descriptors list: Chain Mode */
- HAL_ETH_DMATxDescListInit(&EthHandle, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
-
- /* Initialize Rx Descriptors list: Chain Mode */
- HAL_ETH_DMARxDescListInit(&EthHandle, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
-
- /* set netif MAC hardware address length */
- netif->hwaddr_len = ETH_HWADDR_LEN;
- /* set netif MAC hardware address */
- netif->hwaddr[0] = MAC_ADDR0;
- netif->hwaddr[1] = MAC_ADDR1;
- netif->hwaddr[2] = MAC_ADDR2;
- netif->hwaddr[3] = MAC_ADDR3;
- netif->hwaddr[4] = MAC_ADDR4;
- netif->hwaddr[5] = MAC_ADDR5;
- /* set netif maximum transfer unit */
- netif->mtu = 1500;
- /* Accept broadcast address and ARP traffic */
- netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
- /* create a binary semaphore used for informing ethernetif of frame reception */
- osSemaphoreDef(SEM);
- s_xSemaphore = xSemaphoreCreateCounting(40,0);
- /* create the task that handles the ETH_MAC */
- osThreadDef(EthIf, ethernetif_input, osPriorityRealtime, 0, INTERFACE_THREAD_STACK_SIZE * 3);
- osThreadCreate (osThread(EthIf), netif);
- /* Enable MAC and DMA transmission and reception */
- HAL_ETH_Start(&EthHandle);
- /**** Configure PHY to generate an interrupt when Eth Link state changes ****/
- /* Read Register Configuration */
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_MICR, ®value);
-
- regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE);
- /* Enable Interrupts */
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_MICR, regvalue );
-
- /* Read Register Configuration */
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_MISR, ®value);
-
- regvalue |= PHY_MISR_LINK_INT_EN;
-
- /* Enable Interrupt on change of link status */
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_MISR, regvalue);
- }
- /**
- * @brief This function should do the actual transmission of the packet. The packet is
- * contained in the pbuf that is passed to the function. This pbuf
- * might be chained.
- *
- * @param netif the lwip network interface structure for this ethernetif
- * @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)
- * @return ERR_OK if the packet could be sent
- * an err_t value if the packet couldn't be sent
- *
- * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to
- * strange results. You might consider waiting for space in the DMA queue
- * to become available since the stack doesn't retry to send a packet
- * dropped because of memory failure (except for the TCP timers).
- */
- static err_t low_level_output(struct netif *netif, struct pbuf *p)
- {
- err_t errval;
- struct pbuf *q;
- uint8_t *buffer = (uint8_t *)(EthHandle.TxDesc->Buffer1Addr);
- __IO ETH_DMADescTypeDef *DmaTxDesc;
- uint32_t framelength = 0;
- uint32_t bufferoffset = 0;
- uint32_t byteslefttocopy = 0;
- uint32_t payloadoffset = 0;
- DmaTxDesc = EthHandle.TxDesc;
- bufferoffset = 0;
-
- /* copy frame from pbufs to driver buffers */
- for(q = p; q != NULL; q = q->next)
- {
- /* Is this buffer available? If not, goto error */
- if((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
- {
- errval = ERR_USE;
- goto error;
- }
-
- /* Get bytes in current lwIP buffer */
- byteslefttocopy = q->len;
- payloadoffset = 0;
-
- /* Check if the length of data to copy is bigger than Tx buffer size*/
- while( (byteslefttocopy + bufferoffset) > ETH_TX_BUF_SIZE )
- {
- /* Copy data to Tx buffer*/
- memcpy( (uint8_t*)((uint8_t*)buffer + bufferoffset), (uint8_t*)((uint8_t*)q->payload + payloadoffset), (ETH_TX_BUF_SIZE - bufferoffset) );
-
- /* Point to next descriptor */
- DmaTxDesc = (ETH_DMADescTypeDef *)(DmaTxDesc->Buffer2NextDescAddr);
-
- /* Check if the buffer is available */
- if((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
- {
- errval = ERR_USE;
- goto error;
- }
-
- buffer = (uint8_t *)(DmaTxDesc->Buffer1Addr);
-
- byteslefttocopy = byteslefttocopy - (ETH_TX_BUF_SIZE - bufferoffset);
- payloadoffset = payloadoffset + (ETH_TX_BUF_SIZE - bufferoffset);
- framelength = framelength + (ETH_TX_BUF_SIZE - bufferoffset);
- bufferoffset = 0;
- }
-
- /* Copy the remaining bytes */
- memcpy( (uint8_t*)((uint8_t*)buffer + bufferoffset), (uint8_t*)((uint8_t*)q->payload + payloadoffset), byteslefttocopy );
- bufferoffset = bufferoffset + byteslefttocopy;
- framelength = framelength + byteslefttocopy;
- }
-
- /* Prepare transmit descriptors to give to DMA */
- HAL_ETH_TransmitFrame(&EthHandle, framelength);
-
- errval = ERR_OK;
-
- error:
-
- /* When Transmit Underflow flag is set, clear it and issue a Transmit Poll Demand to resume transmission */
- if ((EthHandle.Instance->DMASR & ETH_DMASR_TUS) != (uint32_t)RESET)
- {
- /* Clear TUS ETHERNET DMA flag */
- EthHandle.Instance->DMASR = ETH_DMASR_TUS;
-
- /* Resume DMA transmission*/
- EthHandle.Instance->DMATPDR = 0;
- }
- return errval;
- }
- /**
- * @brief Should allocate a pbuf and transfer the bytes of the incoming
- * packet from the interface into the pbuf.
- *
- * @param netif the lwip network interface structure for this ethernetif
- * @return a pbuf filled with the received packet (including MAC header)
- * NULL on memory error
- */
- static struct pbuf * low_level_input(struct netif *netif)
- {
- struct pbuf *p = NULL, *q = NULL;
- uint16_t len = 0;
- uint8_t *buffer;
- __IO ETH_DMADescTypeDef *dmarxdesc;
- uint32_t bufferoffset = 0;
- uint32_t payloadoffset = 0;
- uint32_t byteslefttocopy = 0;
- uint32_t i=0;
-
- /* get received frame */
- if(HAL_ETH_GetReceivedFrame_IT(&EthHandle) != HAL_OK)
- return NULL;
- /* Obtain the size of the packet and put it into the "len" variable. */
- len = EthHandle.RxFrameInfos.length;
- buffer = (uint8_t *)EthHandle.RxFrameInfos.buffer;
-
- if (len > 0)
- {
- /* We allocate a pbuf chain of pbufs from the Lwip buffer pool */
- p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
- }
-
- if (p != NULL)
- {
- dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
- bufferoffset = 0;
-
- for(q = p; q != NULL; q = q->next)
- {
- byteslefttocopy = q->len;
- payloadoffset = 0;
-
- /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size */
- while( (byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE )
- {
- /* Copy data to pbuf */
- memcpy( (uint8_t*)((uint8_t*)q->payload + payloadoffset), (uint8_t*)((uint8_t*)buffer + bufferoffset), (ETH_RX_BUF_SIZE - bufferoffset));
-
- /* Point to next descriptor */
- dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
- buffer = (uint8_t *)(dmarxdesc->Buffer1Addr);
-
- byteslefttocopy = byteslefttocopy - (ETH_RX_BUF_SIZE - bufferoffset);
- payloadoffset = payloadoffset + (ETH_RX_BUF_SIZE - bufferoffset);
- bufferoffset = 0;
- }
- /* Copy remaining data in pbuf */
- memcpy( (uint8_t*)((uint8_t*)q->payload + payloadoffset), (uint8_t*)((uint8_t*)buffer + bufferoffset), byteslefttocopy);
- bufferoffset = bufferoffset + byteslefttocopy;
- }
- }
- /* Release descriptors to DMA */
- /* Point to first descriptor */
- dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
- /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
- for (i=0; i< EthHandle.RxFrameInfos.SegCount; i++)
- {
- dmarxdesc->Status |= ETH_DMARXDESC_OWN;
- dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
- }
- /* Clear Segment_Count */
- EthHandle.RxFrameInfos.SegCount =0;
-
- /* When Rx Buffer unavailable flag is set: clear it and resume reception */
- if ((EthHandle.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
- {
- /* Clear RBUS ETHERNET DMA flag */
- EthHandle.Instance->DMASR = ETH_DMASR_RBUS;
- /* Resume DMA reception */
- EthHandle.Instance->DMARPDR = 0;
- }
- return p;
- }
- /**
- * @brief This function is the ethernetif_input task, it is processed when a packet
- * is ready to be read from the interface. It uses the function low_level_input()
- * that should handle the actual reception of bytes from the network
- * interface. Then the type of the received packet is determined and
- * the appropriate input function is called.
- *
- * @param netif the lwip network interface structure for this ethernetif
- */
- void ethernetif_input( void const * argument )
- {
- struct pbuf *p;
- struct netif *netif = (struct netif *) argument;
- for( ;; )
- {
- if (xSemaphoreTake( s_xSemaphore, portMAX_DELAY ) == pdTRUE)
- {
- do
- {
- p = low_level_input( netif );
- if (p != NULL)
- {
- if (netif->input( p, netif) != ERR_OK )
- {
- pbuf_free(p);
- }
- }
- }while(p!=NULL);
- }
- }
- }
- /**
- * @brief Should be called at the beginning of the program to set up the
- * network interface. It calls the function low_level_init() to do the
- * actual setup of the hardware.
- *
- * This function should be passed as a parameter to netif_add().
- *
- * @param netif the lwip network interface structure for this ethernetif
- * @return ERR_OK if the loopif is initialized
- * ERR_MEM if private data couldn't be allocated
- * any other err_t on error
- */
- err_t ethernetif_init(struct netif *netif)
- {
- LWIP_ASSERT("netif != NULL", (netif != NULL));
- #if LWIP_NETIF_HOSTNAME
- /* Initialize interface hostname */
- netif->hostname = "lwip";
- #endif /* LWIP_NETIF_HOSTNAME */
- netif->name[0] = IFNAME0;
- netif->name[1] = IFNAME1;
- netif->output = etharp_output;
- netif->linkoutput = low_level_output;
- /* initialize the hardware */
- low_level_init(netif);
- return ERR_OK;
- }
- /**
- * @brief This function sets the netif link status.
- * @param netif: the network interface
- * @retval None
- */
- void ethernetif_set_link(void const *argument)
- {
- char flag; // ÍøÂç±ê־λ
- uint32_t regvalue = 0;
- struct link_str *link_arg = (struct link_str *)argument;
-
- for(;;)
- {
- // if (osSemaphoreWait( link_arg->semaphore, osWaitForever)== osOK)
- // {
- /* Read PHY_MISR*/
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_MISR, ®value);
-
- /* Check whether the link interrupt has occurred or not */
- if((regvalue & PHY_LINK_INTERRUPT) != (uint16_t)RESET)
- {
- /* Read PHY_SR*/
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_SR, ®value);
-
- /* Check whether the link is up or down*/
- if((regvalue & PHY_LINK_STATUS)!= (uint16_t)RESET)
- {
- flag = 1;
- write_file("ETH.txt",&flag,1);
- netif_set_link_up(link_arg->netif);
- __set_PRIMASK(1);
- NVIC_SystemReset();
- }
- else
- {
- flag = 0;
- portENTER_CRITICAL();
- write_file("ETH.txt",&flag,1);
- portEXIT_CRITICAL();
- netif_set_link_down(link_arg->netif);
- __set_PRIMASK(1);
- NVIC_SystemReset();
- }
- }
- // }
- }
- }
- /**
- * @brief Link callback function, this function is called on change of link status
- * to update low level driver configuration.
- * @param netif: The network interface
- * @retval None
- */
- void ethernetif_update_config(struct netif *netif)
- {
- __IO uint32_t tickstart = 0;
- uint32_t regvalue = 0;
-
- if(netif_is_link_up(netif))
- {
- /* Restart the auto-negotiation */
- if(EthHandle.Init.AutoNegotiation != ETH_AUTONEGOTIATION_DISABLE)
- {
- /* Enable Auto-Negotiation */
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_BCR, PHY_AUTONEGOTIATION);
-
- /* Get tick */
- tickstart = HAL_GetTick();
-
- /* Wait until the auto-negotiation will be completed */
- do
- {
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, ®value);
-
- /* Check for the Timeout ( 1s ) */
- if((HAL_GetTick() - tickstart ) > 1000)
- {
- /* In case of timeout */
- goto error;
- }
-
- } while (((regvalue & PHY_AUTONEGO_COMPLETE) != PHY_AUTONEGO_COMPLETE));
-
- /* Read the result of the auto-negotiation */
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_SR, ®value);
-
- /* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */
- if((regvalue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)
- {
- /* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */
- EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
- }
- else
- {
- /* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */
- EthHandle.Init.DuplexMode = ETH_MODE_HALFDUPLEX;
- }
- /* Configure the MAC with the speed fixed by the auto-negotiation process */
- if(regvalue & PHY_SPEED_STATUS)
- {
- /* Set Ethernet speed to 10M following the auto-negotiation */
- EthHandle.Init.Speed = ETH_SPEED_10M;
- }
- else
- {
- /* Set Ethernet speed to 100M following the auto-negotiation */
- EthHandle.Init.Speed = ETH_SPEED_100M;
- }
- }
- else /* AutoNegotiation Disable */
- {
- error :
- /* Check parameters */
- assert_param(IS_ETH_SPEED(EthHandle.Init.Speed));
- assert_param(IS_ETH_DUPLEX_MODE(EthHandle.Init.DuplexMode));
-
- /* Set MAC Speed and Duplex Mode to PHY */
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_BCR, ((uint16_t)(EthHandle.Init.DuplexMode >> 3) |
- (uint16_t)(EthHandle.Init.Speed >> 1)));
- }
- /* ETHERNET MAC Re-Configuration */
- HAL_ETH_ConfigMAC(&EthHandle, (ETH_MACInitTypeDef *) NULL);
- /* Restart MAC interface */
- HAL_ETH_Start(&EthHandle);
- }
- else
- {
- /* Stop MAC interface */
- HAL_ETH_Stop(&EthHandle);
- }
- ethernetif_notify_conn_changed(netif);
- }
- /**
- * @brief This function notify user about link status changement.
- * @param netif: the network interface
- * @retval None
- */
- __weak void ethernetif_notify_conn_changed(struct netif *netif)
- {
- /* NOTE : This is function could be implemented in user file
- when the callback is needed,
- */
- }
- u32_t sys_now(void)
- {
- return HAL_GetTick();
- }
- static void vTaskUserIF(void *pvParameters)
- {
- uint8_t pcWriteBuffer[500];
- while(1)
- {
- vTaskList((char *)&pcWriteBuffer);
- osDelay(100);
- }
- }
- void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
- {
- printf("eth err\n");
- }
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|