void SPI::lock_deep_sleep() { if (_deep_sleep_locked == false) { sleep_manager_lock_deep_sleep(); _deep_sleep_locked = true; } }
void Timer::start() { core_util_critical_section_enter(); if (!_running) { if(_lock_deepsleep) { sleep_manager_lock_deep_sleep(); } _start = ticker_read_us(_ticker_data); _running = 1; } core_util_critical_section_exit(); }
void wait_us(int us) { const ticker_data_t *const ticker = get_us_ticker_data(); uint32_t start = ticker_read(ticker); if ((us >= 1000) && core_util_are_interrupts_enabled()) { // Use the RTOS to wait for millisecond delays if possible sleep_manager_lock_deep_sleep(); Thread::wait((uint32_t)us / 1000); sleep_manager_unlock_deep_sleep(); } // Use busy waiting for sub-millisecond delays, or for the whole // interval if interrupts are not enabled while ((ticker_read(ticker) - start) < (uint32_t)us); }
/* * \brief Function gives the control of RF states to MAC. * * \param new_state RF state * \param rf_channel RF channel * * \return 0 Success */ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_t rf_channel) { int8_t ret_val = 0; switch (new_state) { /* Reset PHY driver and set to idle */ case PHY_INTERFACE_RESET: RAIL_Idle(gRailHandle, RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true); radio_state = RADIO_IDLE; if(sleep_blocked) { sleep_manager_unlock_deep_sleep(); sleep_blocked = false; } break; /* Disable PHY Interface driver */ case PHY_INTERFACE_DOWN: RAIL_Idle(gRailHandle, RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true); radio_state = RADIO_IDLE; if(sleep_blocked) { sleep_manager_unlock_deep_sleep(); sleep_blocked = false; } break; /* Enable RX */ case PHY_INTERFACE_UP: if(rail_checkAndSwitchChannel(rf_channel)) { RAIL_Idle(gRailHandle, RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true); RAIL_IEEE802154_SetPromiscuousMode(gRailHandle, false); RAIL_StartRx(gRailHandle, channel, NULL); radio_state = RADIO_RX; if(!sleep_blocked) { /* RX can only happen in EM0/1*/ sleep_manager_lock_deep_sleep(); sleep_blocked = true; } } else { ret_val = -1; } break; /* Enable wireless interface ED scan mode */ case PHY_INTERFACE_RX_ENERGY_STATE: SL_DEBUG_PRINT("rf_interface_state_control: Energy det req\n"); // TODO: implement energy detection break; /* Enable RX in promiscuous mode (aka no address filtering) */ case PHY_INTERFACE_SNIFFER_STATE: if(rail_checkAndSwitchChannel(rf_channel)) { RAIL_Idle(gRailHandle, RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true); RAIL_IEEE802154_SetPromiscuousMode(gRailHandle, true); RAIL_StartRx(gRailHandle, channel, NULL); radio_state = RADIO_RX; if(!sleep_blocked) { /* RX can only happen in EM0/1*/ sleep_manager_lock_deep_sleep(); sleep_blocked = true; } } else { ret_val = -1; } break; } return ret_val; }
void CyH4TransportDriver::bt_host_wake_irq_handler(void) { sleep_manager_lock_deep_sleep(); CyH4TransportDriver::on_controller_irq(); sleep_manager_unlock_deep_sleep(); }