zephyr/subsys/bluetooth/shell/ticker.c

130 lines
2.8 KiB
C

/** @file
* @brief Bluetooth Controller Ticker functions
*
*/
/*
* Copyright (c) 2017-2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <shell/shell.h>
#include <misc/printk.h>
#if defined(CONFIG_SOC_FAMILY_NRF)
#include "../controller/hal/nrf5/ticker.h"
#endif /* CONFIG_SOC_FAMILY_NRF */
#include "../controller/util/memq.h"
#include "../controller/util/mayfly.h"
#include "../controller/ticker/ticker.h"
#define TICKER_SHELL_MODULE "ticker"
#if defined(CONFIG_BT_MAX_CONN)
#define TICKERS_MAX (CONFIG_BT_MAX_CONN + 2)
#else
#define TICKERS_MAX 2
#endif
static void ticker_op_done(u32_t err, void *context)
{
*((u32_t volatile *)context) = err;
}
int cmd_ticker_info(int argc, char *argv[])
{
struct {
u8_t id;
u32_t ticks_to_expire;
} tickers[TICKERS_MAX];
u32_t ticks_to_expire;
u32_t ticks_current;
u8_t tickers_count;
u8_t ticker_id;
u8_t retry;
u8_t i;
ticker_id = TICKER_NULL;
ticks_to_expire = 0;
ticks_current = 0;
tickers_count = 0;
retry = 4;
do {
u32_t volatile err_cb = TICKER_STATUS_BUSY;
u32_t ticks_previous;
u32_t err;
ticks_previous = ticks_current;
err = ticker_next_slot_get(0, MAYFLY_CALL_ID_PROGRAM,
&ticker_id, &ticks_current,
&ticks_to_expire,
ticker_op_done, (void *)&err_cb);
if (err == TICKER_STATUS_BUSY) {
while (err_cb == TICKER_STATUS_BUSY) {
ticker_job_sched(0, MAYFLY_CALL_ID_PROGRAM);
}
}
if ((err_cb != TICKER_STATUS_SUCCESS) ||
(ticker_id == TICKER_NULL)) {
printk("Query done (0x%02x, err= %u).\n", ticker_id,
err);
break;
}
if (ticks_current != ticks_previous) {
retry--;
if (!retry) {
printk("Retry again, tickers too busy now.\n");
return -EAGAIN;
}
if (tickers_count) {
tickers_count = 0;
printk("Query reset, %u retries remaining.\n",
retry);
}
}
tickers[tickers_count].id = ticker_id;
tickers[tickers_count].ticks_to_expire = ticks_to_expire;
tickers_count++;
} while (tickers_count < TICKERS_MAX);
printk("Tickers: %u.\n", tickers_count);
printk("Tick: %u (%uus).\n", ticks_current,
HAL_TICKER_TICKS_TO_US(ticks_current));
if (!tickers_count) {
return 0;
}
printk("---------------------\n");
printk(" id offset offset\n");
printk(" (tick) (us)\n");
printk("---------------------\n");
for (i = 0; i < tickers_count; i++) {
printk("%03u %08u %08u\n", tickers[i].id,
tickers[i].ticks_to_expire,
HAL_TICKER_TICKS_TO_US(tickers[i].ticks_to_expire));
}
printk("---------------------\n");
return 0;
}
static const struct shell_cmd ticker_commands[] = {
{ "info", cmd_ticker_info, "Enumerate active ticker details."},
{ NULL, NULL, NULL}
};
SHELL_REGISTER(TICKER_SHELL_MODULE, ticker_commands);