Repository: incubator-mynewt-core Updated Branches: refs/heads/nrf_cputime 6db66772c -> 82f7fb15d
Un-tested but I think the changes are complete. Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/82f7fb15 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/82f7fb15 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/82f7fb15 Branch: refs/heads/nrf_cputime Commit: 82f7fb15d004676dedb2ce9ab9aba49259bc9f5f Parents: 6db6677 Author: William San Filippo <wi...@runtime.io> Authored: Mon Mar 20 09:38:23 2017 -0700 Committer: William San Filippo <wi...@runtime.io> Committed: Mon Mar 20 09:38:23 2017 -0700 ---------------------------------------------------------------------- .../controller/include/controller/ble_ll.h | 5 - .../controller/include/controller/ble_ll_xcvr.h | 2 +- net/nimble/controller/src/ble_ll_scan.c | 4 +- net/nimble/controller/src/ble_ll_sched.c | 30 +++--- net/nimble/controller/src/ble_ll_xcvr.c | 108 +++++++------------ 5 files changed, 57 insertions(+), 92 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/82f7fb15/net/nimble/controller/include/controller/ble_ll.h ---------------------------------------------------------------------- diff --git a/net/nimble/controller/include/controller/ble_ll.h b/net/nimble/controller/include/controller/ble_ll.h index cdb170f..9319c55 100644 --- a/net/nimble/controller/include/controller/ble_ll.h +++ b/net/nimble/controller/include/controller/ble_ll.h @@ -395,11 +395,6 @@ int ble_ll_rand_data_get(uint8_t *buf, uint8_t len); void ble_ll_rand_prand_get(uint8_t *prand); int ble_ll_rand_start(void); -/* Clock management */ -#ifdef BLE_XCVR_RFCLK -void ble_ll_rfclk_start(uint32_t cputime); -#endif - /* * XXX: temporary LL debug log. Will get removed once we transition to real * log http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/82f7fb15/net/nimble/controller/include/controller/ble_ll_xcvr.h ---------------------------------------------------------------------- diff --git a/net/nimble/controller/include/controller/ble_ll_xcvr.h b/net/nimble/controller/include/controller/ble_ll_xcvr.h index 0ede701..c59b009 100644 --- a/net/nimble/controller/include/controller/ble_ll_xcvr.h +++ b/net/nimble/controller/include/controller/ble_ll_xcvr.h @@ -32,13 +32,13 @@ extern "C" { #define BLE_RFCLK_STATE_SETTLED (2) int ble_ll_xcvr_rfclk_state(void); -void ble_ll_xcvr_rfclk_start(uint32_t cputime); void ble_ll_xcvr_rfclk_start_now(uint32_t now); void ble_ll_xcvr_rfclk_stop(void); void ble_ll_xcvr_rfclk_enable(void); void ble_ll_xcvr_rfclk_disable(void); uint32_t ble_ll_xcvr_rfclk_time_till_settled(void); void ble_ll_xcvr_rfclk_timer_exp(void *arg); +void ble_ll_xcvr_rfclk_timer_start(uint32_t cputime); #endif #ifdef __cplusplus http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/82f7fb15/net/nimble/controller/src/ble_ll_scan.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/src/ble_ll_scan.c b/net/nimble/controller/src/ble_ll_scan.c index 5b81219..f5eca7f 100644 --- a/net/nimble/controller/src/ble_ll_scan.c +++ b/net/nimble/controller/src/ble_ll_scan.c @@ -930,14 +930,12 @@ ble_ll_scan_event_proc(struct os_event *ev) } } - /* WWW: This should just be an enable. No need to start - cputimer here! */ /* * If clock off, start clock. Set next event time to now plus * the clock setting time. */ if (rxstate == BLE_RFCLK_STATE_OFF) { - ble_ll_xcvr_rfclk_start(now); + ble_ll_xcvr_rfclk_start_now(now); } next_event_time = now + xtal_ticks; goto rfclk_not_settled; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/82f7fb15/net/nimble/controller/src/ble_ll_sched.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/src/ble_ll_sched.c b/net/nimble/controller/src/ble_ll_sched.c index b5109dd..ffe8ef3 100644 --- a/net/nimble/controller/src/ble_ll_sched.c +++ b/net/nimble/controller/src/ble_ll_sched.c @@ -262,7 +262,7 @@ ble_ll_sched_conn_reschedule(struct ble_ll_conn_sm *connsm) #ifdef BLE_XCVR_RFCLK entry = TAILQ_FIRST(&g_ble_ll_sched_q); if (entry == sch) { - ble_ll_rfclk_start(sch->start_time); + ble_ll_xcvr_rfclk_timer_start(sch->start_time); } else { sch = entry; } @@ -572,7 +572,7 @@ ble_ll_sched_slave_new(struct ble_ll_conn_sm *connsm) #ifdef BLE_XCVR_RFCLK if (first) { - ble_ll_rfclk_start(sch->start_time); + ble_ll_xcvr_rfclk_timer_start(sch->start_time); } #endif @@ -639,7 +639,7 @@ ble_ll_sched_adv_new(struct ble_ll_sched_item *sch) #ifdef BLE_XCVR_RFCLK if (orig == sch) { - ble_ll_rfclk_start(sch->start_time); + ble_ll_xcvr_rfclk_timer_start(sch->start_time); } #endif @@ -764,7 +764,7 @@ ble_ll_sched_adv_reschedule(struct ble_ll_sched_item *sch, uint32_t *start, #ifdef BLE_XCVR_RFCLK if (sch == TAILQ_FIRST(&g_ble_ll_sched_q)) { - ble_ll_rfclk_start(sch->start_time); + ble_ll_xcvr_rfclk_timer_start(sch->start_time); } #endif } @@ -959,6 +959,15 @@ ble_ll_sched_next_time(uint32_t *next_event_time) } #ifdef BLE_XCVR_RFCLK +/** + * Checks to see if we need to restart the cputime timer which starts the + * rf clock settling. + * + * NOTE: Should only be called from the Link Layer task! + * + * Context: Link-Layer task. + * + */ void ble_ll_sched_rfclk_chk_restart(void) { @@ -974,26 +983,19 @@ ble_ll_sched_rfclk_chk_restart(void) if (ble_ll_sched_next_time(&next_time)) { /* * If the time until the next event is too close, no need to start - * the timer and leave the clock on + * the timer. Leave clock on. */ time_till_next = (int32_t)(next_time - os_cputime_get32()); if (time_till_next > g_ble_ll_data.ll_xtal_ticks) { /* Stop the clock */ stop = 1; - - /* - * Restart the timer as long as not advertising or in connection - * event - */ - if (!((ll_state == BLE_LL_STATE_ADV) || - (ll_state == BLE_LL_STATE_CONNECTION))) { - ble_ll_xcvr_rfclk_start(next_time - g_ble_ll_data.ll_xtal_ticks); - } + ble_ll_xcvr_rfclk_timer_start(next_time); } } else { stop = 1; } + /* Only disable the rfclk if doing nothing */ if (stop && (ll_state == BLE_LL_STATE_STANDBY)) { ble_ll_log(BLE_LL_LOG_ID_RFCLK_SCHED_DIS, g_ble_ll_data.ll_rfclk_state, 0, 0); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/82f7fb15/net/nimble/controller/src/ble_ll_xcvr.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/src/ble_ll_xcvr.c b/net/nimble/controller/src/ble_ll_xcvr.c index 43a2e49..50ab32e 100644 --- a/net/nimble/controller/src/ble_ll_xcvr.c +++ b/net/nimble/controller/src/ble_ll_xcvr.c @@ -25,26 +25,6 @@ #include "controller/ble_ll.h" #include "controller/ble_ll_xcvr.h" -#if 0 -#include <string.h> -#include "sysinit/sysinit.h" -#include "os/os.h" -#include "stats/stats.h" -#include "bsp/bsp.h" -#include "nimble/ble.h" -#include "nimble/nimble_opt.h" -#include "nimble/hci_common.h" -#include "nimble/ble_hci_trans.h" -#include "controller/ble_hw.h" -#include "controller/ble_ll_adv.h" -#include "controller/ble_ll_sched.h" -#include "controller/ble_ll_scan.h" -#include "controller/ble_ll_hci.h" -#include "controller/ble_ll_whitelist.h" -#include "controller/ble_ll_resolv.h" -#include "ble_ll_conn_priv.h" -#endif - #ifdef BLE_XCVR_RFCLK int ble_ll_xcvr_rfclk_state(void) @@ -61,39 +41,6 @@ ble_ll_xcvr_rfclk_state(void) return g_ble_ll_data.ll_rfclk_state; } -/** - * Start the rf clock timer running at the specified cputime. The cputime - * is when the clock should start; it will be settled after xtal ticks have - * expired. - * - * If the clock is ON or SETTLED there is no need to start the timer. If the - * clock is OFF the timer might be set for some time in the future. If it is, - * we will reset the time if 'cputime' is earlier than the expiry time. - * - * @param cputime - */ -void -ble_ll_xcvr_rfclk_start(uint32_t cputime) -{ - if (g_ble_ll_data.ll_rfclk_state == BLE_RFCLK_STATE_OFF) { - - /* - * If the timer is on the list, we need to see if its expiry is before - * 'cputime'. If the expiry is before, no need to do anything. If it - * is after, we need to stop the timer and start at new time. - */ - if (g_ble_ll_data.ll_rfclk_timer.link.tqe_prev != NULL) { - if ((int32_t)(cputime - g_ble_ll_data.ll_rfclk_timer.expiry) >= 0) { - return; - } - os_cputime_timer_stop(&g_ble_ll_data.ll_rfclk_timer); - } - os_cputime_timer_start(&g_ble_ll_data.ll_rfclk_timer, cputime); - ble_ll_log(BLE_LL_LOG_ID_RFCLK_START, g_ble_ll_data.ll_rfclk_state, 0, - g_ble_ll_data.ll_rfclk_timer.expiry); - } -} - void ble_ll_xcvr_rfclk_enable(void) { @@ -135,7 +82,9 @@ ble_ll_xcvr_rfclk_time_till_settled(void) } /** - * Called when the timer to turn on the RF CLOCK expires + * Called when the timer to turn on the RF CLOCK expires. This function checks + * the state of the clock. If the clock is off, the clock is turned on. + * Otherwise, we just exit. * * Context: Interrupt * @@ -145,16 +94,15 @@ void ble_ll_xcvr_rfclk_timer_exp(void *arg) { if (g_ble_ll_data.ll_rfclk_state == BLE_RFCLK_STATE_OFF) { - ble_ll_xcvr_rfclk_enable(); - g_ble_ll_data.ll_rfclk_start_time = g_ble_ll_data.ll_rfclk_timer.expiry; - ble_ll_log(BLE_LL_LOG_ID_RFCLK_ENABLE, g_ble_ll_data.ll_rfclk_state, 0, - g_ble_ll_data.ll_rfclk_start_time); + ble_ll_xcvr_rfclk_start_now(os_cputime_get32()); } } /** - * This API is used to turn on the rfclock without setting the cputimer timer - * to start the clock at some later point. + * This API is used to turn on the rfclock without setting the cputime timer to + * start the clock at some later point. + * + * NOTE: presumes that the state of the rf clock was checked prior to calling. * * @param now */ @@ -163,21 +111,43 @@ ble_ll_xcvr_rfclk_start_now(uint32_t now) { ble_ll_xcvr_rfclk_enable(); g_ble_ll_data.ll_rfclk_start_time = now; - ble_ll_log(BLE_LL_LOG_ID_RFCLK_ENABLE, g_ble_ll_data.ll_rfclk_state, 0, - g_ble_ll_data.ll_rfclk_start_time); + ble_ll_log(BLE_LL_LOG_ID_RFCLK_ENABLE, 0, 0, now); } -/* WWW: This is really confusing. This is called when we add something - * to schedule at the start. We want to stop the current cputime timer - * for the clock and restart it at the new time. +/** + * Starts the timer that will turn the rf clock on. The 'cputime' is + * the time at which the clock needs to be settled. * + * @param cputime Time at which rfclock should be on and settled. */ void -ble_ll_rfclk_start(uint32_t cputime) +ble_ll_xcvr_rfclk_timer_start(uint32_t cputime) { - /* If we are currently doing something, no need to start the clock */ - if (g_ble_ll_data.ll_state == BLE_LL_STATE_STANDBY) { - ble_ll_xcvr_rfclk_start(cputime - g_ble_ll_data.ll_xtal_ticks); + /* + * If we are currently in an advertising event or a connection event, + * no need to start the cputime timer + */ + if ((g_ble_ll_data.ll_state == BLE_LL_STATE_ADV) || + (g_ble_ll_data.ll_state == BLE_LL_STATE_CONNECTION)) { + return; + } + + /* Account for the settling time */ + cputime -= g_ble_ll_data.ll_xtal_ticks; + + /* + * If the timer is on the list, we need to see if its expiry is before + * 'cputime'. If the expiry is before, no need to do anything. If it + * is after, we need to stop the timer and start at new time. + */ + if (g_ble_ll_data.ll_rfclk_timer.link.tqe_prev != NULL) { + if ((int32_t)(cputime - g_ble_ll_data.ll_rfclk_timer.expiry) >= 0) { + return; + } + os_cputime_timer_stop(&g_ble_ll_data.ll_rfclk_timer); } + os_cputime_timer_start(&g_ble_ll_data.ll_rfclk_timer, cputime); + ble_ll_log(BLE_LL_LOG_ID_RFCLK_START, g_ble_ll_data.ll_rfclk_state, 0, + g_ble_ll_data.ll_rfclk_timer.expiry); } #endif