diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp index 271ff9463a..f1c704583a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp @@ -283,6 +283,10 @@ uint16_t CordioHCIDriver::write(uint8_t type, uint16_t len, uint8_t *pData) return _transport_driver.write(type, len, pData); } +void CordioHCIDriver::on_host_stack_inactivity() +{ +} + } // namespace cordio } // namespace vendor } // namespace ble diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.h b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.h index bf83389241..737bce73de 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.h @@ -134,6 +134,16 @@ public: */ uint16_t write(uint8_t type, uint16_t len, uint8_t *pData); + /** + * React to host stack inactivity. + * + * The host stack invoke this function when it is inactive. It allows a + * driver to put its controller to sleep if all the conditions are met. + * + * Any call to write signals to the driver that the host stack is active. + */ + virtual void on_host_stack_inactivity(); + protected: /** * Return a default set of memory pool that the Cordio stack can use. diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioBLE.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioBLE.cpp index f8587f7aac..e4cadc531c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioBLE.cpp +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioBLE.cpp @@ -555,7 +555,7 @@ void BLE::callDispatcher() wsfOsDispatcher(); - static Timeout nextTimeout; + static LowPowerTimeout nextTimeout; CriticalSectionLock critical_section; if (wsfOsReadyToSleep()) { @@ -564,6 +564,9 @@ void BLE::callDispatcher() timestamp_t nextTimestamp = (timestamp_t) (WsfTimerNextExpiration(&pTimerRunning) * WSF_MS_PER_TICK) * 1000; if (pTimerRunning) { nextTimeout.attach_us(timeoutCallback, nextTimestamp); + } else { + critical_section.disable(); + _hci_driver->on_host_stack_inactivity(); } } }