/*
|
* Licensed to the Apache Software Foundation (ASF) under one
|
* or more contributor license agreements. See the NOTICE file
|
* distributed with this work for additional information
|
* regarding copyright ownership. The ASF licenses this file
|
* to you under the Apache License, Version 2.0 (the
|
* "License"); you may not use this file except in compliance
|
* with the License. You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing,
|
* software distributed under the License is distributed on an
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
* KIND, either express or implied. See the License for the
|
* specific language governing permissions and limitations
|
* under the License.
|
*/
|
|
#ifndef H_BLE_LL_TMR_
|
#define H_BLE_LL_TMR_
|
|
#include "os/os_cputime.h"
|
#include "controller/ble_ll.h"
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
#define USECS_PER_TICK ((1000000 + MYNEWT_VAL(OS_CPUTIME_FREQ) - 1) / \
|
MYNEWT_VAL(OS_CPUTIME_FREQ))
|
|
#define LL_TMR_LT(_t1, _t2) ((int32_t)((_t1) - (_t2)) < 0)
|
#define LL_TMR_GT(_t1, _t2) ((int32_t)((_t1) - (_t2)) > 0)
|
#define LL_TMR_GEQ(_t1, _t2) ((int32_t)((_t1) - (_t2)) >= 0)
|
#define LL_TMR_LEQ(_t1, _t2) ((int32_t)((_t1) - (_t2)) <= 0)
|
|
typedef void (ble_ll_tmr_cb)(void *arg);
|
|
struct ble_ll_tmr {
|
struct hal_timer t;
|
};
|
|
static inline uint32_t
|
ble_ll_tmr_get(void)
|
{
|
return os_cputime_get32();
|
}
|
|
static inline uint32_t
|
ble_ll_tmr_t2u(uint32_t ticks)
|
{
|
#if MYNEWT_VAL(OS_CPUTIME_FREQ) == 31250
|
return ticks * 32;
|
#endif
|
|
return os_cputime_ticks_to_usecs(ticks);
|
}
|
|
static inline uint32_t
|
ble_ll_tmr_u2t(uint32_t usecs)
|
{
|
#if MYNEWT_VAL(OS_CPUTIME_FREQ) == 31250
|
return usecs / 32;
|
#endif
|
#if MYNEWT_VAL(OS_CPUTIME_FREQ) == 32768
|
if (usecs <= 31249) {
|
return (usecs * 137439) / 4194304;
|
}
|
#endif
|
|
return os_cputime_usecs_to_ticks(usecs);
|
}
|
|
static inline uint32_t
|
ble_ll_tmr_u2t_up(uint32_t usecs)
|
{
|
return ble_ll_tmr_u2t(usecs + (USECS_PER_TICK - 1));
|
}
|
|
static inline uint32_t
|
ble_ll_tmr_u2t_r(uint32_t usecs, uint8_t *rem_us)
|
{
|
uint32_t ticks;
|
|
ticks = ble_ll_tmr_u2t(usecs);
|
*rem_us = usecs - ble_ll_tmr_t2u(ticks);
|
if (*rem_us == USECS_PER_TICK) {
|
*rem_us = 0;
|
ticks++;
|
}
|
|
return ticks;
|
}
|
|
static inline void
|
ble_ll_tmr_add(uint32_t *ticks, uint8_t *rem_us, uint32_t usecs)
|
{
|
uint32_t t_ticks;
|
uint8_t t_rem_us;
|
|
t_ticks = ble_ll_tmr_u2t_r(usecs, &t_rem_us);
|
|
*ticks += t_ticks;
|
*rem_us += t_rem_us;
|
if (*rem_us >= USECS_PER_TICK) {
|
*rem_us -= USECS_PER_TICK;
|
*ticks += 1;
|
}
|
}
|
|
static inline void
|
ble_ll_tmr_add_u(uint32_t *ticks, uint8_t *rem_us, uint8_t usecs)
|
{
|
BLE_LL_ASSERT(usecs < USECS_PER_TICK);
|
|
*rem_us += usecs;
|
if (*rem_us >= USECS_PER_TICK) {
|
*rem_us -= USECS_PER_TICK;
|
*ticks += 1;
|
}
|
}
|
|
static inline void
|
ble_ll_tmr_sub(uint32_t *ticks, uint8_t *rem_us, uint32_t usecs)
|
{
|
uint32_t t_ticks;
|
uint8_t t_rem_us;
|
|
if (usecs <= *rem_us) {
|
*rem_us -= usecs;
|
return;
|
}
|
|
usecs -= *rem_us;
|
*rem_us = 0;
|
|
t_ticks = ble_ll_tmr_u2t_r(usecs, &t_rem_us);
|
if (t_rem_us) {
|
t_ticks += 1;
|
*rem_us = USECS_PER_TICK - t_rem_us;
|
}
|
|
*ticks -= t_ticks;
|
}
|
|
static inline void
|
ble_ll_tmr_init(struct ble_ll_tmr *tmr, ble_ll_tmr_cb *cb, void *arg)
|
{
|
os_cputime_timer_init(&tmr->t, cb, arg);
|
}
|
|
static inline void
|
ble_ll_tmr_start(struct ble_ll_tmr *tmr, uint32_t tgt)
|
{
|
os_cputime_timer_start(&tmr->t, tgt);
|
}
|
|
static inline void
|
ble_ll_tmr_stop(struct ble_ll_tmr *tmr)
|
{
|
os_cputime_timer_stop(&tmr->t);
|
}
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif /* H_BLE_LL_TMR_ */
|