Corrected STM eth driver flagging, memory allocation and thread init

pull/6847/head
Mika Leppänen 2018-02-22 17:25:25 +02:00 committed by Kevin Bracey
parent 3c83c62ff7
commit 01b4d97cb4
1 changed files with 32 additions and 16 deletions

View File

@ -1,5 +1,3 @@
#if MBED_CONF_LWIP_ETHERNET_ENABLED
#include <stdlib.h> #include <stdlib.h>
#include "cmsis_os.h" #include "cmsis_os.h"
@ -9,6 +7,8 @@
#include "mbed_shared_queues.h" #include "mbed_shared_queues.h"
#include "netsocket/nsapi_types.h" #include "netsocket/nsapi_types.h"
#if DEVICE_EMAC
#include "stm32xx_emac_config.h" #include "stm32xx_emac_config.h"
#include "stm32xx_emac.h" #include "stm32xx_emac.h"
@ -69,7 +69,9 @@ void ETH_IRQHandler(void);
void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
{ {
STM32_EMAC &emac = STM32_EMAC::get_instance(); STM32_EMAC &emac = STM32_EMAC::get_instance();
osThreadFlagsSet(emac.thread, FLAG_RX); if (emac.thread) {
osThreadFlagsSet(emac.thread, FLAG_RX);
}
} }
/** /**
@ -85,6 +87,7 @@ void ETH_IRQHandler(void)
} }
STM32_EMAC::STM32_EMAC() STM32_EMAC::STM32_EMAC()
: thread(0)
{ {
} }
@ -247,8 +250,10 @@ emac_mem_buf_t *STM32_EMAC::low_level_input()
uint16_t len = 0; uint16_t len = 0;
uint8_t *buffer; uint8_t *buffer;
__IO ETH_DMADescTypeDef *dmarxdesc; __IO ETH_DMADescTypeDef *dmarxdesc;
uint32_t bufferoffset = 0;
uint32_t byteslefttocopy = 0; uint32_t byteslefttocopy = 0;
emac_mem_buf_t *buf = 0; emac_mem_buf_t *buf = 0;
emac_mem_buf_t *q;
uint32_t payloadoffset = 0; uint32_t payloadoffset = 0;
/* get received frame */ /* get received frame */
@ -264,23 +269,34 @@ emac_mem_buf_t *STM32_EMAC::low_level_input()
dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc; dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
if (len > 0) { if (len > 0) {
/* Allocate a contiguous memory buffer, if not available drop incoming frame */ /* Allocate a memory buffer chain from buffer pool */
buf = memory_manager->alloc_heap(len, 0); buf = memory_manager->alloc_pool(len, 0);
} }
if (buf) { if (buf != NULL) {
/* Check if the length of bytes to copy in current memory buffer is bigger than Rx buffer size*/ dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc;
while (byteslefttocopy > ETH_RX_BUF_SIZE) { bufferoffset = 0;
memcpy(static_cast<uint8_t *>(memory_manager->get_ptr(buf)) + payloadoffset, buffer, ETH_RX_BUF_SIZE); for (q = buf; q != NULL; q = memory_manager->get_next(q)) {
byteslefttocopy = memory_manager->get_len(q);
payloadoffset = 0;
/* Point to next descriptor */ /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size*/
dmarxdesc = reinterpret_cast<ETH_DMADescTypeDef *>(dmarxdesc->Buffer2NextDescAddr); while ((byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE) {
buffer = reinterpret_cast<uint8_t *>(dmarxdesc->Buffer1Addr); /* Copy data to pbuf */
memcpy(static_cast<uint8_t *>(memory_manager->get_ptr(q)) + payloadoffset, static_cast<uint8_t *>(buffer) + bufferoffset, ETH_RX_BUF_SIZE - bufferoffset);
byteslefttocopy = byteslefttocopy - ETH_RX_BUF_SIZE; /* Point to next descriptor */
payloadoffset = payloadoffset + ETH_RX_BUF_SIZE; dmarxdesc = reinterpret_cast<ETH_DMADescTypeDef *>(dmarxdesc->Buffer2NextDescAddr);
buffer = reinterpret_cast<uint8_t *>(dmarxdesc->Buffer1Addr);
byteslefttocopy = byteslefttocopy - (ETH_RX_BUF_SIZE - bufferoffset);
payloadoffset = payloadoffset + (ETH_RX_BUF_SIZE - bufferoffset);
bufferoffset = 0;
}
/* Copy remaining data in pbuf */
memcpy(static_cast<uint8_t *>(memory_manager->get_ptr(q)) + payloadoffset, static_cast<uint8_t *>(buffer) + bufferoffset, byteslefttocopy);
bufferoffset = bufferoffset + byteslefttocopy;
} }
memcpy(static_cast<uint8_t *>(memory_manager->get_ptr(buf)) + payloadoffset, buffer, byteslefttocopy);
} }
/* Release descriptors to DMA */ /* Release descriptors to DMA */