diff --git a/drivers/counter/counter_gecko_rtcc.c b/drivers/counter/counter_gecko_rtcc.c index 295de8e1548..16c17e6f625 100644 --- a/drivers/counter/counter_gecko_rtcc.c +++ b/drivers/counter/counter_gecko_rtcc.c @@ -172,7 +172,7 @@ static int counter_gecko_set_alarm(struct device *dev, u8_t chan_id, return -EBUSY; } - if (alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) != 0) { ccv = alarm_cfg->ticks; } else { if (top_value == 0) { diff --git a/drivers/counter/counter_ll_stm32_rtc.c b/drivers/counter/counter_ll_stm32_rtc.c index c8f30acb133..1b8e96b1b8d 100644 --- a/drivers/counter/counter_ll_stm32_rtc.c +++ b/drivers/counter/counter_ll_stm32_rtc.c @@ -42,7 +42,6 @@ struct rtc_stm32_data { counter_alarm_callback_t callback; u32_t ticks; void *user_data; - bool absolute; }; @@ -129,9 +128,8 @@ static int rtc_stm32_set_alarm(struct device *dev, u8_t chan_id, data->callback = alarm_cfg->callback; data->user_data = alarm_cfg->user_data; - data->absolute = alarm_cfg->absolute; - if (!alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) == 0) { ticks += now; } diff --git a/drivers/counter/counter_mcux_gpt.c b/drivers/counter/counter_mcux_gpt.c index c610b285f04..3f882d0f060 100644 --- a/drivers/counter/counter_mcux_gpt.c +++ b/drivers/counter/counter_mcux_gpt.c @@ -63,7 +63,7 @@ static int mcux_gpt_set_alarm(struct device *dev, u8_t chan_id, return -EINVAL; } - if (!alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) == 0) { ticks += current; } diff --git a/drivers/counter/counter_mcux_rtc.c b/drivers/counter/counter_mcux_rtc.c index 0bf2848e877..5ff1dee0e67 100644 --- a/drivers/counter/counter_mcux_rtc.c +++ b/drivers/counter/counter_mcux_rtc.c @@ -101,7 +101,7 @@ static int mcux_rtc_set_alarm(struct device *dev, u8_t chan_id, return -EBUSY; } - if (!alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) == 0) { ticks += current; } diff --git a/drivers/counter/counter_nrfx_rtc.c b/drivers/counter/counter_nrfx_rtc.c index 74cbc591cec..d76aa6236dc 100644 --- a/drivers/counter/counter_nrfx_rtc.c +++ b/drivers/counter/counter_nrfx_rtc.c @@ -101,7 +101,7 @@ static int counter_nrfx_set_alarm(struct device *dev, u8_t chan_id, return -EBUSY; } - if (alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) != 0) { cc_val = alarm_cfg->ticks; } else { /* As RTC is 24 bit there is no risk of overflow. */ diff --git a/drivers/counter/counter_nrfx_timer.c b/drivers/counter/counter_nrfx_timer.c index 76b81a98280..b21acf17045 100644 --- a/drivers/counter/counter_nrfx_timer.c +++ b/drivers/counter/counter_nrfx_timer.c @@ -99,7 +99,7 @@ static inline u32_t counter_nrfx_get_cc_value(struct device *dev, u32_t cc_val; u32_t ticks = alarm_cfg->ticks; - if (alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) != 0) { return ticks; } diff --git a/drivers/counter/counter_sam0_tc32.c b/drivers/counter/counter_sam0_tc32.c index 7315c01d5ed..75feb5a487d 100644 --- a/drivers/counter/counter_sam0_tc32.c +++ b/drivers/counter/counter_sam0_tc32.c @@ -194,7 +194,7 @@ static int counter_sam0_tc32_set_alarm(struct device *dev, u8_t chan_id, data->ch.callback = alarm_cfg->callback; data->ch.user_data = alarm_cfg->user_data; - if (alarm_cfg->absolute) { + if ((alarm_cfg->flags & COUNTER_ALARM_CFG_ABSOLUTE) != 0) { tc->CC[1].reg = alarm_cfg->ticks; wait_synchronization(tc); tc->INTFLAG.reg = TC_INTFLAG_MC1; diff --git a/include/drivers/counter.h b/include/drivers/counter.h index e5f4e36d9cd..9b6116ff455 100644 --- a/include/drivers/counter.h +++ b/include/drivers/counter.h @@ -61,6 +61,19 @@ extern "C" { /**@} */ +/**@defgroup COUNTER_ALARM_FLAGS Counter device capabilities + * @{ */ + +/** + * @brief Counter alarm absolute value flag. + * + * Ticks relation to counter value. If set ticks are treated as absolute value, + * else it is relative to the counter reading performed during the call. + */ +#define COUNTER_ALARM_CFG_ABSOLUTE BIT(0) + +/**@} */ + /** @brief Alarm callback * * @param dev Pointer to the device structure for the driver instance. @@ -84,15 +97,13 @@ typedef void (*counter_alarm_callback_t)(struct device *dev, * Alternatively, counter implementation may count asynchronous * events. * @param user_data User data returned in callback. - * @param absolute Ticks relation to counter value. If true ticks are treated as - * absolute value, else it is relative to the counter reading - * performed during the call. + * @param flags Alarm flags. */ struct counter_alarm_cfg { counter_alarm_callback_t callback; u32_t ticks; void *user_data; - bool absolute; + u32_t flags; }; /** @brief Callback called when counter turns around. diff --git a/samples/drivers/counter/alarm/src/main.c b/samples/drivers/counter/alarm/src/main.c index deca3f47809..bee2343542d 100644 --- a/samples/drivers/counter/alarm/src/main.c +++ b/samples/drivers/counter/alarm/src/main.c @@ -47,7 +47,7 @@ void main(void) counter_start(counter_dev); - alarm_cfg.absolute = false; + alarm_cfg.flags = 0; alarm_cfg.ticks = counter_us_to_ticks(counter_dev, DELAY); alarm_cfg.callback = test_counter_interrupt_fn; alarm_cfg.user_data = &alarm_cfg; diff --git a/tests/drivers/counter/counter_basic_api/src/test_counter.c b/tests/drivers/counter/counter_basic_api/src/test_counter.c index 82be14e9e27..ba0dd2fae22 100644 --- a/tests/drivers/counter/counter_basic_api/src/test_counter.c +++ b/tests/drivers/counter/counter_basic_api/src/test_counter.c @@ -200,7 +200,7 @@ void test_single_shot_alarm_instance(const char *dev_name, bool set_top) ticks = counter_us_to_ticks(dev, COUNTER_PERIOD_US); top_cfg.ticks = ticks; - alarm_cfg.absolute = false; + alarm_cfg.flags = 0; alarm_cfg.ticks = ticks; alarm_cfg.callback = alarm_handler; alarm_cfg.user_data = &alarm_cfg; @@ -312,12 +312,12 @@ void test_multiple_alarms_instance(const char *dev_name) ticks = counter_us_to_ticks(dev, COUNTER_PERIOD_US); top_cfg.ticks = ticks; - alarm_cfg.absolute = true; + alarm_cfg.flags = COUNTER_ALARM_CFG_ABSOLUTE; alarm_cfg.ticks = counter_us_to_ticks(dev, 2000); alarm_cfg.callback = alarm_handler2; alarm_cfg.user_data = &alarm_cfg; - alarm_cfg2.absolute = false; + alarm_cfg2.flags = 0; alarm_cfg2.ticks = counter_us_to_ticks(dev, 2000); alarm_cfg2.callback = alarm_handler2; alarm_cfg2.user_data = &alarm_cfg2; @@ -382,7 +382,7 @@ void test_all_channels_instance(const char *dev_name) dev = device_get_binding(dev_name); ticks = counter_us_to_ticks(dev, COUNTER_PERIOD_US); - alarm_cfgs.absolute = false; + alarm_cfgs.flags = 0; alarm_cfgs.ticks = ticks; alarm_cfgs.callback = alarm_handler2; alarm_cfgs.user_data = NULL;