123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690 |
- #include "stm32f2xx_hal.h"
- #include "lwip/timeouts.h"
- #include "netif/etharp.h"
- #include "ethernetif.h"
- #include <string.h>
- #include "myFile.h"
- #define TIME_WAITING_FOR_INPUT ( osWaitForever )
- #define INTERFACE_THREAD_STACK_SIZE ( 350 )
- #define IFNAME0 's'
- #define IFNAME1 't'
- #if defined ( __ICCARM__ )
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN ETH_DMADescTypeDef DMARxDscrTab[ETH_RXBUFNB] __ALIGN_END;
- #if defined ( __ICCARM__ )
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN ETH_DMADescTypeDef DMATxDscrTab[ETH_TXBUFNB] __ALIGN_END;
- #if defined ( __ICCARM__ )
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __ALIGN_END;
- #if defined ( __ICCARM__ )
- #pragma data_alignment=4
- #endif
- __ALIGN_BEGIN uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __ALIGN_END;
- osSemaphoreId s_xSemaphore = NULL;
- ETH_HandleTypeDef EthHandle;
- 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();
- void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
-
- HAL_ETH_RESET_INIT();
-
- 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);
-
- GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_10;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
-
-
- HAL_NVIC_SetPriority(ETH_IRQn, 0x6, 0);
- HAL_NVIC_EnableIRQ(ETH_IRQn);
-
- __HAL_RCC_ETH_CLK_ENABLE();
- HAL_ETH_SET();
- if (heth->Init.MediaInterface == ETH_MEDIA_INTERFACE_MII)
- {
-
- 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;
-
- 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);
- }
- void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
- {
- portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
- xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
- }
- 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;
-
-
- if (HAL_ETH_Init(&EthHandle) == HAL_OK)
- {
-
- netif->flags |= NETIF_FLAG_LINK_UP;
- }
-
-
- HAL_ETH_DMATxDescListInit(&EthHandle, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
-
-
- HAL_ETH_DMARxDescListInit(&EthHandle, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
-
-
- netif->hwaddr_len = ETH_HWADDR_LEN;
-
- 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;
-
- netif->mtu = 1500;
-
- netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
-
- osSemaphoreDef(SEM);
- s_xSemaphore = xSemaphoreCreateCounting(40,0);
-
- osThreadDef(EthIf, ethernetif_input, osPriorityRealtime, 0, INTERFACE_THREAD_STACK_SIZE * 3);
- osThreadCreate (osThread(EthIf), netif);
-
- HAL_ETH_Start(&EthHandle);
-
-
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_MICR, ®value);
-
- regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE);
-
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_MICR, regvalue );
-
-
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_MISR, ®value);
-
- regvalue |= PHY_MISR_LINK_INT_EN;
-
-
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_MISR, regvalue);
- }
- 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;
-
-
- for(q = p; q != NULL; q = q->next)
- {
-
- if((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
- {
- errval = ERR_USE;
- goto error;
- }
-
-
- byteslefttocopy = q->len;
- payloadoffset = 0;
-
-
- while( (byteslefttocopy + bufferoffset) > ETH_TX_BUF_SIZE )
- {
-
- memcpy( (uint8_t*)((uint8_t*)buffer + bufferoffset), (uint8_t*)((uint8_t*)q->payload + payloadoffset), (ETH_TX_BUF_SIZE - bufferoffset) );
-
-
- DmaTxDesc = (ETH_DMADescTypeDef *)(DmaTxDesc->Buffer2NextDescAddr);
-
-
- 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;
- }
-
-
- memcpy( (uint8_t*)((uint8_t*)buffer + bufferoffset), (uint8_t*)((uint8_t*)q->payload + payloadoffset), byteslefttocopy );
- bufferoffset = bufferoffset + byteslefttocopy;
- framelength = framelength + byteslefttocopy;
- }
-
-
- HAL_ETH_TransmitFrame(&EthHandle, framelength);
-
- errval = ERR_OK;
-
- error:
-
-
- if ((EthHandle.Instance->DMASR & ETH_DMASR_TUS) != (uint32_t)RESET)
- {
-
- EthHandle.Instance->DMASR = ETH_DMASR_TUS;
-
-
- EthHandle.Instance->DMATPDR = 0;
- }
- return errval;
- }
- 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;
-
-
- if(HAL_ETH_GetReceivedFrame_IT(&EthHandle) != HAL_OK)
- return NULL;
-
- len = EthHandle.RxFrameInfos.length;
- buffer = (uint8_t *)EthHandle.RxFrameInfos.buffer;
-
- if (len > 0)
- {
-
- 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;
-
-
- while( (byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE )
- {
-
- memcpy( (uint8_t*)((uint8_t*)q->payload + payloadoffset), (uint8_t*)((uint8_t*)buffer + bufferoffset), (ETH_RX_BUF_SIZE - bufferoffset));
-
-
- 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;
- }
-
- memcpy( (uint8_t*)((uint8_t*)q->payload + payloadoffset), (uint8_t*)((uint8_t*)buffer + bufferoffset), byteslefttocopy);
- bufferoffset = bufferoffset + byteslefttocopy;
- }
- }
-
-
- dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
-
- for (i=0; i< EthHandle.RxFrameInfos.SegCount; i++)
- {
- dmarxdesc->Status |= ETH_DMARXDESC_OWN;
- dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
- }
-
- EthHandle.RxFrameInfos.SegCount =0;
-
-
- if ((EthHandle.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET)
- {
-
- EthHandle.Instance->DMASR = ETH_DMASR_RBUS;
-
- EthHandle.Instance->DMARPDR = 0;
- }
- return p;
- }
- 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);
- }
- }
- }
- err_t ethernetif_init(struct netif *netif)
- {
- LWIP_ASSERT("netif != NULL", (netif != NULL));
- #if LWIP_NETIF_HOSTNAME
-
- netif->hostname = "lwip";
- #endif
- netif->name[0] = IFNAME0;
- netif->name[1] = IFNAME1;
- netif->output = etharp_output;
- netif->linkoutput = low_level_output;
-
- low_level_init(netif);
- return ERR_OK;
- }
- void ethernetif_set_link(void const *argument)
- {
- char flag;
- uint32_t regvalue = 0;
- struct link_str *link_arg = (struct link_str *)argument;
-
- for(;;)
- {
-
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_MISR, ®value);
-
-
- if((regvalue & PHY_LINK_INTERRUPT) != (uint16_t)RESET)
- {
-
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_SR, ®value);
-
-
- 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();
- }
- }
- }
- }
- void ethernetif_update_config(struct netif *netif)
- {
- __IO uint32_t tickstart = 0;
- uint32_t regvalue = 0;
-
- if(netif_is_link_up(netif))
- {
-
- if(EthHandle.Init.AutoNegotiation != ETH_AUTONEGOTIATION_DISABLE)
- {
-
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_BCR, PHY_AUTONEGOTIATION);
-
-
- tickstart = HAL_GetTick();
-
-
- do
- {
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, ®value);
-
-
- if((HAL_GetTick() - tickstart ) > 1000)
- {
-
- goto error;
- }
-
- } while (((regvalue & PHY_AUTONEGO_COMPLETE) != PHY_AUTONEGO_COMPLETE));
-
-
- HAL_ETH_ReadPHYRegister(&EthHandle, PHY_SR, ®value);
-
-
- if((regvalue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)
- {
-
- EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
- }
- else
- {
-
- EthHandle.Init.DuplexMode = ETH_MODE_HALFDUPLEX;
- }
-
- if(regvalue & PHY_SPEED_STATUS)
- {
-
- EthHandle.Init.Speed = ETH_SPEED_10M;
- }
- else
- {
-
- EthHandle.Init.Speed = ETH_SPEED_100M;
- }
- }
- else
- {
- error :
-
- assert_param(IS_ETH_SPEED(EthHandle.Init.Speed));
- assert_param(IS_ETH_DUPLEX_MODE(EthHandle.Init.DuplexMode));
-
-
- HAL_ETH_WritePHYRegister(&EthHandle, PHY_BCR, ((uint16_t)(EthHandle.Init.DuplexMode >> 3) |
- (uint16_t)(EthHandle.Init.Speed >> 1)));
- }
-
- HAL_ETH_ConfigMAC(&EthHandle, (ETH_MACInitTypeDef *) NULL);
-
- HAL_ETH_Start(&EthHandle);
- }
- else
- {
-
- HAL_ETH_Stop(&EthHandle);
- }
- ethernetif_notify_conn_changed(netif);
- }
- __weak void ethernetif_notify_conn_changed(struct netif *netif)
- {
-
-
- }
- 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");
- }
|