13
13
* See the License for the specific language governing permissions and
14
14
* limitations under the License.
15
15
*/
16
+ #include " mbed_power_mgmt.h"
16
17
#include " common_functions.h"
17
18
#include " platform/arm_hal_interrupt.h"
18
19
#include " platform/arm_hal_phy.h"
@@ -87,8 +88,9 @@ static uint8_t MAC64_addr[8];
87
88
88
89
static xcvrState_t mPhySeqState ;
89
90
static uint8_t rf_mac_handle;
90
- volatile uint8_t rf_ed_value = 0 ;
91
- static bool rf_ack_pending_state = false ;
91
+ static volatile uint8_t rf_ed_value = 0 ;
92
+ static volatile bool rf_ack_pending_state = false ;
93
+ static volatile bool sleep_blocked = false ;
92
94
93
95
static NanostackRfPhyKw41z *rf = NULL ;
94
96
@@ -155,6 +157,11 @@ static int8_t rf_device_register(void)
155
157
static void rf_device_unregister (void )
156
158
{
157
159
arm_net_phy_unregister (rf_radio_driver_id);
160
+
161
+ if (sleep_blocked) {
162
+ sleep_manager_unlock_deep_sleep ();
163
+ sleep_blocked = false ;
164
+ }
158
165
}
159
166
160
167
/*
@@ -209,23 +216,41 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
209
216
/* Reset PHY driver and set to idle*/
210
217
case PHY_INTERFACE_RESET:
211
218
rf_abort ();
219
+ if (sleep_blocked) {
220
+ sleep_manager_unlock_deep_sleep ();
221
+ sleep_blocked = false ;
222
+ }
212
223
break ;
213
224
/* Disable PHY Interface driver*/
214
225
case PHY_INTERFACE_DOWN:
215
226
rf_abort ();
227
+ if (sleep_blocked) {
228
+ sleep_manager_unlock_deep_sleep ();
229
+ sleep_blocked = false ;
230
+ }
216
231
break ;
217
232
/* Enable PHY Interface driver*/
218
233
case PHY_INTERFACE_UP:
219
234
if (PhyPlmeSetCurrentChannelRequest (rf_channel, 0 )) {
220
235
return 1 ;
221
236
}
237
+ if (!sleep_blocked) {
238
+ /* Disable enter to deep sleep when transfer active */
239
+ sleep_manager_lock_deep_sleep ();
240
+ sleep_blocked = true ;
241
+ }
222
242
rf_receive ();
223
243
break ;
224
244
/* Enable wireless interface ED scan mode*/
225
245
case PHY_INTERFACE_RX_ENERGY_STATE:
226
246
if (PhyPlmeSetCurrentChannelRequest (rf_channel, 0 )) {
227
247
return 1 ;
228
248
}
249
+ if (!sleep_blocked) {
250
+ /* Disable enter to deep sleep when transfer active */
251
+ sleep_manager_lock_deep_sleep ();
252
+ sleep_blocked = true ;
253
+ }
229
254
rf_abort ();
230
255
rf_mac_ed_state_enable ();
231
256
break ;
@@ -234,6 +259,11 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
234
259
if (PhyPlmeSetCurrentChannelRequest (rf_channel, 0 )) {
235
260
return 1 ;
236
261
}
262
+ if (!sleep_blocked) {
263
+ /* Disable enter to deep sleep when transfer active */
264
+ sleep_manager_lock_deep_sleep ();
265
+ sleep_blocked = true ;
266
+ }
237
267
rf_receive ();
238
268
break ;
239
269
}
0 commit comments