1
- #if MBED_CONF_LWIP_ETHERNET_ENABLED
2
-
3
- #include < stdlib.h>
1
+ #include < stdlib.h>
4
2
5
3
#include " cmsis_os.h"
6
4
9
7
#include " mbed_shared_queues.h"
10
8
#include " netsocket/nsapi_types.h"
11
9
10
+ #if DEVICE_EMAC
11
+
12
12
#include " stm32xx_emac_config.h"
13
13
#include " stm32xx_emac.h"
14
14
@@ -69,7 +69,9 @@ void ETH_IRQHandler(void);
69
69
void HAL_ETH_RxCpltCallback (ETH_HandleTypeDef *heth)
70
70
{
71
71
STM32_EMAC &emac = STM32_EMAC::get_instance ();
72
- osThreadFlagsSet (emac.thread , FLAG_RX);
72
+ if (emac.thread ) {
73
+ osThreadFlagsSet (emac.thread , FLAG_RX);
74
+ }
73
75
}
74
76
75
77
/* *
@@ -85,6 +87,7 @@ void ETH_IRQHandler(void)
85
87
}
86
88
87
89
STM32_EMAC::STM32_EMAC ()
90
+ : thread(0 )
88
91
{
89
92
}
90
93
@@ -247,8 +250,10 @@ emac_mem_buf_t *STM32_EMAC::low_level_input()
247
250
uint16_t len = 0 ;
248
251
uint8_t *buffer;
249
252
__IO ETH_DMADescTypeDef *dmarxdesc;
253
+ uint32_t bufferoffset = 0 ;
250
254
uint32_t byteslefttocopy = 0 ;
251
255
emac_mem_buf_t *buf = 0 ;
256
+ emac_mem_buf_t *q;
252
257
uint32_t payloadoffset = 0 ;
253
258
254
259
/* get received frame */
@@ -264,23 +269,34 @@ emac_mem_buf_t *STM32_EMAC::low_level_input()
264
269
dmarxdesc = EthHandle.RxFrameInfos .FSRxDesc ;
265
270
266
271
if (len > 0 ) {
267
- /* Allocate a contiguous memory buffer, if not available drop incoming frame */
268
- buf = memory_manager->alloc_heap (len, 0 );
272
+ /* Allocate a memory buffer chain from buffer pool */
273
+ buf = memory_manager->alloc_pool (len, 0 );
269
274
}
270
275
271
- if (buf) {
272
- /* Check if the length of bytes to copy in current memory buffer is bigger than Rx buffer size*/
273
- while (byteslefttocopy > ETH_RX_BUF_SIZE) {
274
- memcpy (static_cast <uint8_t *>(memory_manager->get_ptr (buf)) + payloadoffset, buffer, ETH_RX_BUF_SIZE);
275
-
276
- /* Point to next descriptor */
277
- dmarxdesc = reinterpret_cast <ETH_DMADescTypeDef *>(dmarxdesc->Buffer2NextDescAddr );
278
- buffer = reinterpret_cast <uint8_t *>(dmarxdesc->Buffer1Addr );
279
-
280
- byteslefttocopy = byteslefttocopy - ETH_RX_BUF_SIZE;
281
- payloadoffset = payloadoffset + ETH_RX_BUF_SIZE;
276
+ if (buf != NULL ) {
277
+ dmarxdesc = EthHandle.RxFrameInfos .FSRxDesc ;
278
+ bufferoffset = 0 ;
279
+ for (q = buf; q != NULL ; q = memory_manager->get_next (q)) {
280
+ byteslefttocopy = memory_manager->get_len (q);
281
+ payloadoffset = 0 ;
282
+
283
+ /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size*/
284
+ while ((byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE) {
285
+ /* Copy data to pbuf */
286
+ memcpy (static_cast <uint8_t *>(memory_manager->get_ptr (q)) + payloadoffset, static_cast <uint8_t *>(buffer) + bufferoffset, ETH_RX_BUF_SIZE - bufferoffset);
287
+
288
+ /* Point to next descriptor */
289
+ dmarxdesc = reinterpret_cast <ETH_DMADescTypeDef *>(dmarxdesc->Buffer2NextDescAddr );
290
+ buffer = reinterpret_cast <uint8_t *>(dmarxdesc->Buffer1Addr );
291
+
292
+ byteslefttocopy = byteslefttocopy - (ETH_RX_BUF_SIZE - bufferoffset);
293
+ payloadoffset = payloadoffset + (ETH_RX_BUF_SIZE - bufferoffset);
294
+ bufferoffset = 0 ;
295
+ }
296
+ /* Copy remaining data in pbuf */
297
+ memcpy (static_cast <uint8_t *>(memory_manager->get_ptr (q)) + payloadoffset, static_cast <uint8_t *>(buffer) + bufferoffset, byteslefttocopy);
298
+ bufferoffset = bufferoffset + byteslefttocopy;
282
299
}
283
- memcpy (static_cast <uint8_t *>(memory_manager->get_ptr (buf)) + payloadoffset, buffer, byteslefttocopy);
284
300
}
285
301
286
302
/* Release descriptors to DMA */
0 commit comments