4141#include "FreeRTOS_Sockets.h"
4242#include "FreeRTOS_IP_Private.h"
4343#include "FreeRTOS_DNS.h"
44+ #include "FreeRTOS_Routing.h"
4445#include "NetworkBufferManagement.h"
4546#include "NetworkInterface.h"
4647
@@ -105,6 +106,8 @@ static SemaphoreHandle_t xTransmissionMutex;
105106static ETH_HandleTypeDef xEthHandle ;
106107static ETH_TxPacketConfig xTxConfig ;
107108
109+ static NetworkInterface_t * pxMyInterface = NULL ;
110+
108111/*
109112 * About the section ".ethernet_data" : the DMA wants the descriptors and buffers allocated in the
110113 * RAM3 memory, which can be added to the .LD file as follows::
@@ -170,6 +173,24 @@ static void vClearOptionBit( volatile uint32_t * pulValue,
170173
171174static size_t uxGetOwnCount ( ETH_HandleTypeDef * heth );
172175
176+ /* FreeRTOS+TCP/multi :
177+ * Each network device has 3 access functions:
178+ * - Initialise the device
179+ * - Output a network packet
180+ * - Return the PHY Link-Status (LS)
181+ * They can be defined as static because the function addresses
182+ * addresses will be stored in struct NetworkInterface_t. */
183+
184+ static BaseType_t xSTM32H_NetworkInterfaceInitialise ( NetworkInterface_t * pxInterface );
185+
186+ static BaseType_t xSTM32H_NetworkInterfaceOutput ( NetworkInterface_t * pxInterface ,
187+ NetworkBufferDescriptor_t * const pxBuffer ,
188+ BaseType_t xReleaseAfterSend );
189+
190+ static BaseType_t xSTM32H_GetPhyLinkStatus ( NetworkInterface_t * pxInterface );
191+
192+ NetworkInterface_t * pxSTM32Hxx_FillInterfaceDescriptor ( BaseType_t xEMACIndex ,
193+ NetworkInterface_t * pxInterface );
173194/*-----------------------------------------------------------*/
174195
175196static EthernetPhy_t xPhyObject ;
@@ -205,21 +226,27 @@ static uint8_t * pucGetRXBuffer( size_t uxSize )
205226}
206227/*-----------------------------------------------------------*/
207228
208- BaseType_t xNetworkInterfaceInitialise ( void )
229+ static BaseType_t xSTM32H_NetworkInterfaceInitialise ( NetworkInterface_t * pxInterface )
209230{
210231 BaseType_t xResult ;
232+ NetworkEndPoint_t * pxEndPoint ;
211233 HAL_StatusTypeDef xHalEthInitStatus ;
212234 size_t uxIndex = 0 ;
213235
214236 if ( xMacInitStatus == eMACInit )
215237 {
238+ pxMyInterface = pxInterface ;
239+
240+ pxEndPoint = FreeRTOS_FirstEndPoint ( pxInterface );
241+ configASSERT ( pxEndPoint != NULL );
242+
216243 /*
217244 * Initialize ETH Handler
218245 * It assumes that Ethernet GPIO and clock configuration
219246 * are already done in the ETH_MspInit()
220247 */
221248 xEthHandle .Instance = ETH ;
222- xEthHandle .Init .MACAddr = ( uint8_t * ) FreeRTOS_GetMACAddress () ;
249+ xEthHandle .Init .MACAddr = ( uint8_t * ) pxEndPoint -> xMACAddress . ucBytes ;
223250 xEthHandle .Init .MediaInterface = HAL_ETH_RMII_MODE ;
224251 xEthHandle .Init .TxDesc = DMATxDscrTab ;
225252 xEthHandle .Init .RxDesc = DMARxDscrTab ;
@@ -325,7 +352,7 @@ BaseType_t xNetworkInterfaceInitialise( void )
325352}
326353/*-----------------------------------------------------------*/
327354
328- BaseType_t xGetPhyLinkStatus ( void )
355+ static BaseType_t xSTM32H_GetPhyLinkStatus ( NetworkInterface_t * pxInterface )
329356{
330357 BaseType_t xReturn ;
331358
@@ -342,34 +369,73 @@ BaseType_t xGetPhyLinkStatus( void )
342369}
343370/*-----------------------------------------------------------*/
344371
345- BaseType_t xNetworkInterfaceOutput ( NetworkBufferDescriptor_t * const pxDescriptor ,
346- BaseType_t xReleaseAfterSend )
372+ #if ( ipconfigCOMPATIBLE_WITH_SINGLE != 0 )
373+
374+ /* Do not call the following function directly. It is there for downward compatibility.
375+ * The function FreeRTOS_IPInit() will call it to initialice the interface and end-point
376+ * objects. See the description in FreeRTOS_Routing.h. */
377+ NetworkInterface_t * pxFillInterfaceDescriptor ( BaseType_t xEMACIndex ,
378+ NetworkInterface_t * pxInterface )
379+ {
380+ pxSTM32Hxx_FillInterfaceDescriptor ( xEMACIndex , pxInterface );
381+ }
382+
383+ #endif /* ( ipconfigCOMPATIBLE_WITH_SINGLE != 0 ) */
384+ /*-----------------------------------------------------------*/
385+
386+ NetworkInterface_t * pxSTM32Hxx_FillInterfaceDescriptor ( BaseType_t xEMACIndex ,
387+ NetworkInterface_t * pxInterface )
388+ {
389+ static char pcName [ 17 ];
390+
391+ /* This function pxSTM32Hxx_FillInterfaceDescriptor() adds a network-interface.
392+ * Make sure that the object pointed to by 'pxInterface'
393+ * is declared static or global, and that it will remain to exist. */
394+
395+ snprintf ( pcName , sizeof ( pcName ), "eth%u" , ( unsigned ) xEMACIndex );
396+
397+ memset ( pxInterface , '\0' , sizeof ( * pxInterface ) );
398+ pxInterface -> pcName = pcName ; /* Just for logging, debugging. */
399+ pxInterface -> pvArgument = ( void * ) xEMACIndex ; /* Has only meaning for the driver functions. */
400+ pxInterface -> pfInitialise = xSTM32H_NetworkInterfaceInitialise ;
401+ pxInterface -> pfOutput = xSTM32H_NetworkInterfaceOutput ;
402+ pxInterface -> pfGetPhyLinkStatus = xSTM32H_GetPhyLinkStatus ;
403+
404+ FreeRTOS_AddNetworkInterface ( pxInterface );
405+
406+ return pxInterface ;
407+ }
408+ /*-----------------------------------------------------------*/
409+
410+ static BaseType_t xSTM32H_NetworkInterfaceOutput ( NetworkInterface_t * pxInterface ,
411+ NetworkBufferDescriptor_t * const pxBuffer ,
412+ BaseType_t xReleaseAfterSend )
347413{
348414 BaseType_t xResult = pdFAIL ;
349415 TickType_t xBlockTimeTicks = pdMS_TO_TICKS ( 100U );
350416 uint8_t * pucTXBuffer ;
351417
352418 #if ( ipconfigZERO_COPY_TX_DRIVER != 0 )
353419 /* Zero-copy method, pass the buffer. */
354- pucTXBuffer = pxDescriptor -> pucEthernetBuffer ;
420+ pucTXBuffer = pxBuffer -> pucEthernetBuffer ;
355421
356422 /* As the buffer is passed to the driver, it must exist.
357423 * The library takes care of this. */
358424 configASSERT ( xReleaseAfterSend != pdFALSE );
359425 #else
360426 pucTXBuffer = Tx_Buff [ xEthHandle .TxDescList .CurTxDesc ];
361427 /* The copy method, left here for educational purposes. */
362- configASSERT ( pxDescriptor -> xDataLength <= sizeof ( Tx_Buff [ 0 ] ) );
428+ configASSERT ( pxBuffer -> xDataLength <= sizeof ( Tx_Buff [ 0 ] ) );
363429 #endif
364430
365431 ETH_BufferTypeDef xTransmitBuffer =
366432 {
367433 .buffer = pucTXBuffer ,
368- .len = pxDescriptor -> xDataLength ,
434+ .len = pxBuffer -> xDataLength ,
369435 .next = NULL /* FreeRTOS+TCP does not use linked buffers. */
370436 };
371437 /* This is the total length, which is equal to the buffer. */
372- xTxConfig .Length = pxDescriptor -> xDataLength ;
438+ xTxConfig .Length = pxBuffer -> xDataLength ;
373439 xTxConfig .TxBuffer = & ( xTransmitBuffer );
374440
375441 /* This counting semaphore counts the number of free TX DMA descriptors. */
@@ -395,7 +461,7 @@ BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescript
395461 }
396462 #else
397463 {
398- memcpy ( pucTXBuffer , pxDescriptor -> pucEthernetBuffer , pxDescriptor -> xDataLength );
464+ memcpy ( pucTXBuffer , pxBuffer -> pucEthernetBuffer , pxBuffer -> xDataLength );
399465
400466 /* A memory barrier to make sure that the outgoing packets has been written
401467 * to the physical memory. */
@@ -418,7 +484,7 @@ BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescript
418484
419485 if ( xReleaseAfterSend != pdFALSE )
420486 {
421- vReleaseNetworkBufferAndDescriptor ( pxDescriptor );
487+ vReleaseNetworkBufferAndDescriptor ( pxBuffer );
422488 }
423489
424490 return xResult ;
@@ -638,6 +704,9 @@ static BaseType_t prvNetworkInterfaceInput( void )
638704 .pvData = ( void * ) pxReceivedBuffer
639705 };
640706
707+ pxReceivedBuffer -> pxInterface = pxMyInterface ;
708+ pxReceivedBuffer -> pxEndPoint = FreeRTOS_MatchingEndpoint ( pxMyInterface , pxReceivedBuffer -> pucEthernetBuffer );
709+
641710 /* Send the data to the TCP/IP stack. */
642711 if ( xSendEventStructToIPTask ( & ( xRxEvent ), 0 ) != pdFALSE )
643712 {
0 commit comments