Skip to content

Commit edcde1c

Browse files
authored
Merge pull request ARMmbed#10796 from NXPmicro/tickless
NXP: Enable MBED_TICKLESS on various NXP platforms
2 parents d0c917c + d68d800 commit edcde1c

File tree

38 files changed

+2865
-1460
lines changed

38 files changed

+2865
-1460
lines changed

features/nanostack/targets/TARGET_NXP/TARGET_KW41Z/NanostackRfPhyKw41z.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
#include "mbed_power_mgmt.h"
1617
#include "common_functions.h"
1718
#include "platform/arm_hal_interrupt.h"
1819
#include "platform/arm_hal_phy.h"
@@ -87,8 +88,9 @@ static uint8_t MAC64_addr[8];
8788

8889
static xcvrState_t mPhySeqState;
8990
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;
9294

9395
static NanostackRfPhyKw41z *rf = NULL;
9496

@@ -155,6 +157,11 @@ static int8_t rf_device_register(void)
155157
static void rf_device_unregister(void)
156158
{
157159
arm_net_phy_unregister(rf_radio_driver_id);
160+
161+
if (sleep_blocked) {
162+
sleep_manager_unlock_deep_sleep();
163+
sleep_blocked = false;
164+
}
158165
}
159166

160167
/*
@@ -209,23 +216,41 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
209216
/*Reset PHY driver and set to idle*/
210217
case PHY_INTERFACE_RESET:
211218
rf_abort();
219+
if (sleep_blocked) {
220+
sleep_manager_unlock_deep_sleep();
221+
sleep_blocked = false;
222+
}
212223
break;
213224
/*Disable PHY Interface driver*/
214225
case PHY_INTERFACE_DOWN:
215226
rf_abort();
227+
if (sleep_blocked) {
228+
sleep_manager_unlock_deep_sleep();
229+
sleep_blocked = false;
230+
}
216231
break;
217232
/*Enable PHY Interface driver*/
218233
case PHY_INTERFACE_UP:
219234
if (PhyPlmeSetCurrentChannelRequest(rf_channel, 0)) {
220235
return 1;
221236
}
237+
if (!sleep_blocked) {
238+
/* Disable enter to deep sleep when transfer active */
239+
sleep_manager_lock_deep_sleep();
240+
sleep_blocked = true;
241+
}
222242
rf_receive();
223243
break;
224244
/*Enable wireless interface ED scan mode*/
225245
case PHY_INTERFACE_RX_ENERGY_STATE:
226246
if (PhyPlmeSetCurrentChannelRequest(rf_channel, 0)) {
227247
return 1;
228248
}
249+
if (!sleep_blocked) {
250+
/* Disable enter to deep sleep when transfer active */
251+
sleep_manager_lock_deep_sleep();
252+
sleep_blocked = true;
253+
}
229254
rf_abort();
230255
rf_mac_ed_state_enable();
231256
break;
@@ -234,6 +259,11 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
234259
if (PhyPlmeSetCurrentChannelRequest(rf_channel, 0)) {
235260
return 1;
236261
}
262+
if (!sleep_blocked) {
263+
/* Disable enter to deep sleep when transfer active */
264+
sleep_manager_lock_deep_sleep();
265+
sleep_blocked = true;
266+
}
237267
rf_receive();
238268
break;
239269
}

features/netsocket/emac-drivers/TARGET_Freescale_EMAC/kinetis_emac.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
#include "kinetis_emac_config.h"
4848
#include "kinetis_emac.h"
49+
#include "mbed_power_mgmt.h"
4950

5051
enet_handle_t g_handle;
5152
// TX Buffer descriptors
@@ -496,6 +497,9 @@ bool Kinetis_EMAC::power_up()
496497
return false;
497498
}
498499

500+
// Can't enter deep sleep as long as Ethernet is active
501+
sleep_manager_lock_deep_sleep();
502+
499503
/* Worker thread */
500504
thread = create_new_thread("Kinetis_EMAC_thread", &Kinetis_EMAC::thread_function, this, THREAD_STACKSIZE, THREAD_PRIORITY, &thread_cb);
501505

@@ -580,7 +584,8 @@ void Kinetis_EMAC::set_all_multicast(bool all)
580584

581585
void Kinetis_EMAC::power_down()
582586
{
583-
/* No-op at this stage */
587+
// Ethernet went down, can enter deep sleep
588+
sleep_manager_unlock_deep_sleep();
584589
}
585590

586591
void Kinetis_EMAC::set_memory_manager(EMACMemoryManager &mem_mngr)

features/netsocket/emac-drivers/TARGET_NXP_EMAC/TARGET_IMX/imx_emac.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
#include "imx_emac_config.h"
4848
#include "imx_emac.h"
49+
#include "mbed_power_mgmt.h"
4950

5051
enet_handle_t g_handle;
5152
// RX packet buffer pointers
@@ -500,6 +501,9 @@ bool Kinetis_EMAC::power_up()
500501
return false;
501502
}
502503

504+
// Can't enter deep sleep as long as Ethernet is active
505+
sleep_manager_lock_deep_sleep();
506+
503507
/* Worker thread */
504508
thread = create_new_thread("Kinetis_EMAC_thread", &Kinetis_EMAC::thread_function, this, THREAD_STACKSIZE, THREAD_PRIORITY, &thread_cb);
505509

@@ -584,7 +588,8 @@ void Kinetis_EMAC::set_all_multicast(bool all)
584588

585589
void Kinetis_EMAC::power_down()
586590
{
587-
/* No-op at this stage */
591+
// Ethernet went down, can enter deep sleep
592+
sleep_manager_unlock_deep_sleep();
588593
}
589594

590595
void Kinetis_EMAC::set_memory_manager(EMACMemoryManager &mem_mngr)

0 commit comments

Comments
 (0)