/* * FreeRTOS+TCP <DEVELOPMENT BRANCH> * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * http://aws.amazon.com/freertos * http://www.FreeRTOS.org */ /* Standard includes. */ #include <stdint.h> /* FreeRTOS includes. */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" /* FreeRTOS+TCP includes. */ #include "FreeRTOS_UDP_IP.h" #include "FreeRTOS_Sockets.h" #include "NetworkBufferManagement.h" /* Hardware includes. */ #include "hwEthernet.h" /* Demo includes. */ #include "NetworkInterface.h" #if ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES != 1 #define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eProcessBuffer #else #define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eConsiderFrameForProcessing( ( pucEthernetBuffer ) ) #endif /* When a packet is ready to be sent, if it cannot be sent immediately then the * task performing the transmit will block for niTX_BUFFER_FREE_WAIT * milliseconds. It will do this a maximum of niMAX_TX_ATTEMPTS before giving * up. */ #define niTX_BUFFER_FREE_WAIT ( ( TickType_t ) 2UL / portTICK_PERIOD_MS ) #define niMAX_TX_ATTEMPTS ( 5 ) /* The length of the queue used to send interrupt status words from the * interrupt handler to the deferred handler task. */ #define niINTERRUPT_QUEUE_LENGTH ( 10 ) /*-----------------------------------------------------------*/ /* * A deferred interrupt handler task that processes */ extern void vEMACHandlerTask( void * pvParameters ); /*-----------------------------------------------------------*/ /* The queue used to communicate Ethernet events with the IP task. */ extern QueueHandle_t xNetworkEventQueue; /* The semaphore used to wake the deferred interrupt handler task when an Rx * interrupt is received. */ SemaphoreHandle_t xEMACRxEventSemaphore = NULL; /*-----------------------------------------------------------*/ BaseType_t xNetworkInterfaceInitialise( void ) { BaseType_t xStatus, xReturn; /* Initialise the MAC. */ vInitEmac(); while( lEMACWaitForLink() != pdPASS ) { vTaskDelay( 20 ); } vSemaphoreCreateBinary( xEMACRxEventSemaphore ); configASSERT( xEMACRxEventSemaphore ); /* The handler task is created at the highest possible priority to * ensure the interrupt handler can return directly to it. */ xTaskCreate( vEMACHandlerTask, "EMAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); xReturn = pdPASS; return xReturn; } /*-----------------------------------------------------------*/ BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxNetworkBuffer ) { extern void vEMACCopyWrite( uint8_t * pucBuffer, uint16_t usLength ); vEMACCopyWrite( pxNetworkBuffer->pucBuffer, pxNetworkBuffer->xDataLength ); /* Finished with the network buffer. */ vReleaseNetworkBufferAndDescriptor( pxNetworkBuffer ); return pdTRUE; } /*-----------------------------------------------------------*/