/******************************************************************************* * Network Interface file * * Summary: * Network Interface file for FreeRTOS-Plus-TCP stack * * Description: * - Interfaces PIC32 to the FreeRTOS TCP/IP stack *******************************************************************************/ /******************************************************************************* * File Name: pic32_NetworkInterface.c * Copyright 2017 Microchip Technology Incorporated and its subsidiaries. * * 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 *******************************************************************************/ #ifndef PIC32_USE_ETHERNET #include #include "FreeRTOS.h" #include "semphr.h" #include "event_groups.h" #include "FreeRTOS_IP.h" #include "FreeRTOS_IP_Private.h" #include "NetworkInterface.h" #include "NetworkBufferManagement.h" #include "peripheral/eth/plib_eth.h" #include "system_config.h" #include "system/console/sys_console.h" #include "system/debug/sys_debug.h" #include "system/command/sys_command.h" #include "driver/ethmac/drv_ethmac.h" #include "driver/miim/drv_miim.h" #include "m2m_types.h" #include "tcpip/tcpip.h" #include "tcpip/src/tcpip_private.h" #include "tcpip/src/link_list.h" #include "wilc1000_task.h" #include "NetworkConfig.h" #include "aws_wifi.h" /* local definitions and data */ /* FreeRTOS implementation functions */ BaseType_t xNetworkInterfaceInitialise( void ) { WIFINetworkParams_t xNetworkParams; xNetworkParams.pcSSID = clientcredentialWIFI_SSID; xNetworkParams.ucSSIDLength = sizeof( clientcredentialWIFI_SSID ); xNetworkParams.pcPassword = clientcredentialWIFI_PASSWORD; xNetworkParams.ucPasswordLength = sizeof( clientcredentialWIFI_PASSWORD ); xNetworkParams.xSecurity = clientcredentialWIFI_SECURITY; xNetworkParams.cChannel = M2M_WIFI_CH_ALL; /* Scan all channels (255) */ /*Turn WiFi ON */ if( WIFI_On() != eWiFiSuccess ) { return pdFAIL; } /* Connect to the AP */ if( WIFI_ConnectAP( &xNetworkParams ) != eWiFiSuccess ) { return pdFAIL; } return pdPASS; } /*-----------------------------------------------------------*/ BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor, BaseType_t xReleaseAfterSend ) { BaseType_t retRes = pdFALSE; if( ( pxDescriptor != 0 ) && ( pxDescriptor->pucEthernetBuffer != 0 ) && ( pxDescriptor->xDataLength != 0 ) ) { /* There you go */ if( WDRV_EXT_DataSend( pxDescriptor->xDataLength, pxDescriptor->pucEthernetBuffer ) == 0 ) { retRes = pdTRUE; } /* The buffer has been sent so can be released. */ if( xReleaseAfterSend != pdFALSE ) { vReleaseNetworkBufferAndDescriptor( pxDescriptor ); } } return retRes; } /************************************* Section: helper functions ************************************************** */ /* */ /************************************* Section: worker code ************************************************** */ /* */ void xNetworkFrameReceived( uint32_t len, uint8_t const * const frame ) { bool pktSuccess, pktLost; NetworkBufferDescriptor_t * pxNetworkBuffer = NULL; IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL }; pktSuccess = pktLost = false; while( true ) { if( eConsiderFrameForProcessing( frame ) != eProcessBuffer ) { break; } /* get the network descriptor (no data buffer) to hold this packet */ pxNetworkBuffer = pxGetNetworkBufferWithDescriptor( len, 0 ); if( pxNetworkBuffer == NULL ) { pktLost = true; break; } /* Set the actual packet length, in case a larger buffer was returned. */ pxNetworkBuffer->xDataLength = len; /* Copy the packet. */ memcpy( pxNetworkBuffer->pucEthernetBuffer, frame, len ); /* Send the data to the TCP/IP stack. */ xRxEvent.pvData = ( void * ) pxNetworkBuffer; if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ) { /* failed */ pktLost = true; } else { /* success */ pktSuccess = true; iptraceNETWORK_INTERFACE_RECEIVE(); } break; } if( !pktSuccess ) { /* smth went wrong; nothing sent to the */ if( pxNetworkBuffer != NULL ) { pxNetworkBuffer->pucEthernetBuffer = 0; vReleaseNetworkBufferAndDescriptor( pxNetworkBuffer ); } if( pktLost ) { iptraceETHERNET_RX_EVENT_LOST(); } } } #endif /* #ifndef PIC32_USE_ETHERNET */