blob: 2d79427b639e35fc8a8491634260123e2d128a23 [file] [log] [blame]
/*
* 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_ */