/******************************************************************************* | |
* 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 <sys/kmem.h> | |
#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 "iot_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 */ |