Skip to content

Commit df8ebd7

Browse files
Add RMII watchdog, add power test, fix unittests build
1 parent b4e04f8 commit df8ebd7

File tree

8 files changed

+68
-1268
lines changed

8 files changed

+68
-1268
lines changed

connectivity/drivers/emac/TARGET_STM/STM32EthMACv1.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <Timer.h>
2222
#include <mbed_trace.h>
2323
#include "mbed_error.h"
24+
#include "mbed_events.h"
25+
#include "CriticalSectionLock.h"
2426

2527
#define TRACE_GROUP "STEMACv1"
2628

@@ -219,6 +221,29 @@ void STM32EthMACv1::MACDriver::ETH_SetMDIOClockRange(ETH_TypeDef * const base) {
219221
base->MACMIIAR = (uint32_t)tempreg;
220222
}
221223

224+
#if ENABLE_ERRATA_2_21_6_WORKAROUND
225+
void STM32EthMACv1::MACDriver::rmiiWatchdog() {
226+
CriticalSectionLock lock;
227+
228+
if(!rmiiWatchdogRunning) {
229+
// Already canceled by main thread, bail
230+
return;
231+
}
232+
233+
/* some good packets are received */
234+
if (base->MMCRGUFCR > 0) {
235+
/* RMII Init is OK - cancel watchdog task */
236+
mbed_event_queue()->cancel(rmiiWatchdogRunning);
237+
rmiiWatchdogRunning = false;
238+
} else if (base->MMCRFCECR > 10) {
239+
/* ETH received too many packets with CRC errors, resetting RMII */
240+
SYSCFG->PMC &= ~SYSCFG_PMC_MII_RMII_SEL;
241+
SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;
242+
base->MMCCR |= ETH_MMCCR_CR;
243+
}
244+
}
245+
#endif
246+
222247
CompositeEMAC::ErrCode STM32EthMACv1::MACDriver::init() {
223248
sleep_manager_lock_deep_sleep();
224249

@@ -277,13 +302,29 @@ CompositeEMAC::ErrCode STM32EthMACv1::MACDriver::init() {
277302
// in that case.
278303
base->DMAIER = ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE | ETH_DMAIER_FBEIE | ETH_DMAIER_AISE;
279304

305+
#if ENABLE_ERRATA_2_21_6_WORKAROUND
306+
// Start RMII watchdog task
307+
rmiiWatchdogHandle = mbed_event_queue()->call_every(std::chrono::milliseconds(MBED_CONF_NSAPI_EMAC_PHY_POLL_PERIOD),
308+
callback(this, &STM32EthMACv1::MACDriver::rmiiWatchdog));
309+
rmiiWatchdogRunning = true;
310+
#endif
311+
280312
return CompositeEMAC::ErrCode::SUCCESS;
281313
}
282314

283315
CompositeEMAC::ErrCode STM32EthMACv1::MACDriver::deinit() {
284316
// Disable interrupt
285317
HAL_NVIC_DisableIRQ(ETH_IRQn);
286318

319+
#if ENABLE_ERRATA_2_21_6_WORKAROUND
320+
// Disable RMII watchdog if still running
321+
if(rmiiWatchdogRunning) {
322+
CriticalSectionLock lock;
323+
mbed_event_queue()->cancel(rmiiWatchdogRunning);
324+
rmiiWatchdogRunning = false;
325+
}
326+
#endif
327+
287328
// Unlock deep sleep
288329
sleep_manager_unlock_deep_sleep();
289330

connectivity/drivers/emac/TARGET_STM/STM32EthMACv1.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
#include "CacheAlignedBuffer.h"
2222
#include "GenericEthDMA.h"
2323

24+
#if TARGET_STM32F7
25+
#define ENABLE_ERRATA_2_21_6_WORKAROUND 1
26+
#endif
27+
2428
namespace mbed
2529
{
2630

@@ -100,6 +104,13 @@ class STM32EthMACv1 : public CompositeEMAC
100104
*/
101105
static void ETH_SetMDIOClockRange(ETH_TypeDef * const base);
102106

107+
#if ENABLE_ERRATA_2_21_6_WORKAROUND
108+
// Workaround for ETH errata 2.21.6 from the STM32F7 errata sheet
109+
int rmiiWatchdogHandle;
110+
std::atomic<bool> rmiiWatchdogRunning = false;
111+
void rmiiWatchdog();
112+
#endif
113+
103114
public:
104115
explicit MACDriver(ETH_TypeDef * const base):
105116
base(base)

0 commit comments

Comments
 (0)