22
22
#include " platform/arm_hal_interrupt.h"
23
23
#include " nanostack/platform/arm_hal_phy.h"
24
24
#include " mbed_toolchain.h"
25
+ #include " sleepmodes.h"
25
26
26
27
#include " mbed-trace/mbed_trace.h"
27
28
#define TRACE_GROUP " SLRF"
@@ -227,6 +228,7 @@ static const RAIL_IEEE802154_Config_t config = {
227
228
};
228
229
229
230
static volatile siliconlabs_modem_state_t radio_state = RADIO_UNINIT;
231
+ static volatile bool sleep_blocked = false ;
230
232
static volatile int8_t channel = -1 ;
231
233
static volatile uint8_t current_tx_handle = 0 ;
232
234
static volatile uint8_t current_tx_sequence = 0 ;
@@ -255,7 +257,7 @@ static RAIL_Config_t railCfg = { // Must never be const
255
257
256
258
static void rf_thread_loop (const void *arg)
257
259
{
258
- SL_DEBUG_PRINT (" rf_thread_loop: starting (id: %d)\n " , rf_thread_id);
260
+ SL_DEBUG_PRINT (" rf_thread_loop: starting (id: %d)\n " , ( int ) rf_thread_id);
259
261
for (;;) {
260
262
osEvent event = osSignalWait (0 , osWaitForever);
261
263
@@ -321,7 +323,7 @@ static void rf_thread_loop(const void *arg)
321
323
} else if (event.value .signals & SL_QUEUE_FULL) {
322
324
SL_DEBUG_PRINT (" rf_thread_loop: SL_QUEUE_FULL signal received (packet dropped)\n " );
323
325
} else {
324
- SL_DEBUG_PRINT (" rf_thread_loop unhandled event status: %d value: %d\n " , event.status , event.value .signals );
326
+ SL_DEBUG_PRINT (" rf_thread_loop unhandled event status: %d value: %d\n " , event.status , ( int ) event.value .signals );
325
327
}
326
328
327
329
platform_exit_critical ();
@@ -479,6 +481,10 @@ static int8_t rf_device_register(void)
479
481
static void rf_device_unregister (void )
480
482
{
481
483
arm_net_phy_unregister (rf_radio_driver_id);
484
+ if (sleep_blocked) {
485
+ unblockSleepMode (EM1);
486
+ sleep_blocked = false ;
487
+ }
482
488
}
483
489
484
490
/*
@@ -573,11 +579,19 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
573
579
case PHY_INTERFACE_RESET:
574
580
RAIL_Idle (gRailHandle , RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true );
575
581
radio_state = RADIO_IDLE;
582
+ if (sleep_blocked) {
583
+ unblockSleepMode (EM1);
584
+ sleep_blocked = false ;
585
+ }
576
586
break ;
577
587
/* Disable PHY Interface driver */
578
588
case PHY_INTERFACE_DOWN:
579
589
RAIL_Idle (gRailHandle , RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true );
580
590
radio_state = RADIO_IDLE;
591
+ if (sleep_blocked) {
592
+ unblockSleepMode (EM1);
593
+ sleep_blocked = false ;
594
+ }
581
595
break ;
582
596
/* Enable RX */
583
597
case PHY_INTERFACE_UP:
@@ -586,6 +600,11 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
586
600
RAIL_IEEE802154_SetPromiscuousMode (gRailHandle , false );
587
601
RAIL_StartRx (gRailHandle , channel, NULL );
588
602
radio_state = RADIO_RX;
603
+ if (!sleep_blocked) {
604
+ /* RX can only happen in EM0/1*/
605
+ blockSleepMode (EM1);
606
+ sleep_blocked = true ;
607
+ }
589
608
} else {
590
609
ret_val = -1 ;
591
610
}
@@ -602,6 +621,11 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
602
621
RAIL_IEEE802154_SetPromiscuousMode (gRailHandle , true );
603
622
RAIL_StartRx (gRailHandle , channel, NULL );
604
623
radio_state = RADIO_RX;
624
+ if (!sleep_blocked) {
625
+ /* RX can only happen in EM0/1*/
626
+ blockSleepMode (EM1);
627
+ sleep_blocked = true ;
628
+ }
605
629
} else {
606
630
ret_val = -1 ;
607
631
}
0 commit comments