drivers: counter: Add user_data to alarm callback
Modify alarm callback to return user_data and channel_id. Set_alarm and disable_alarm updated accordingly. Renamed counter_*_ch_alarm to counter_*_channel_alarm. Updated test and nrf implementations. Updated doxygen comments. Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
parent
5bfe8612a2
commit
b745355315
|
@ -28,9 +28,14 @@ struct counter_nrfx_data {
|
|||
u32_t wrap;
|
||||
};
|
||||
|
||||
struct counter_nrfx_ch_data {
|
||||
counter_alarm_callback_t callback;
|
||||
void *user_data;
|
||||
};
|
||||
|
||||
struct counter_nrfx_config {
|
||||
struct counter_config_info info;
|
||||
const struct counter_alarm_cfg **alarm_cfgs;
|
||||
struct counter_nrfx_ch_data *ch_data;
|
||||
nrfx_rtc_t rtc;
|
||||
|
||||
LOG_INSTANCE_PTR_DECLARE(log);
|
||||
|
@ -67,7 +72,7 @@ static u32_t counter_nrfx_read(struct device *dev)
|
|||
return nrfx_rtc_counter_get(&get_nrfx_config(dev)->rtc);
|
||||
}
|
||||
|
||||
static int counter_nrfx_set_alarm(struct device *dev,
|
||||
static int counter_nrfx_set_alarm(struct device *dev, u8_t chan_id,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
{
|
||||
const struct counter_nrfx_config *nrfx_config = get_nrfx_config(dev);
|
||||
|
@ -78,7 +83,7 @@ static int counter_nrfx_set_alarm(struct device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nrfx_config->alarm_cfgs[alarm_cfg->channel_id]) {
|
||||
if (nrfx_config->ch_data[chan_id].callback) {
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
@ -86,9 +91,10 @@ static int counter_nrfx_set_alarm(struct device *dev,
|
|||
0 : nrfx_rtc_counter_get(rtc));
|
||||
cc_val = (cc_val > get_dev_data(dev)->wrap) ?
|
||||
(cc_val - get_dev_data(dev)->wrap) : cc_val;
|
||||
nrfx_config->alarm_cfgs[alarm_cfg->channel_id] = alarm_cfg;
|
||||
nrfx_config->ch_data[chan_id].callback = alarm_cfg->callback;
|
||||
nrfx_config->ch_data[chan_id].user_data = alarm_cfg->user_data;
|
||||
|
||||
nrfx_rtc_cc_set(rtc, ID_TO_CC(alarm_cfg->channel_id), cc_val, true);
|
||||
nrfx_rtc_cc_set(rtc, ID_TO_CC(chan_id), cc_val, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -98,13 +104,12 @@ static void _disable(struct device *dev, u8_t id)
|
|||
const struct counter_nrfx_config *config = get_nrfx_config(dev);
|
||||
|
||||
nrfx_rtc_cc_disable(&config->rtc, ID_TO_CC(id));
|
||||
config->alarm_cfgs[id] = NULL;
|
||||
config->ch_data[id].callback = NULL;
|
||||
}
|
||||
|
||||
static int counter_nrfx_disable_alarm(struct device *dev,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
static int counter_nrfx_disable_alarm(struct device *dev, u8_t chan_id)
|
||||
{
|
||||
_disable(dev, alarm_cfg->channel_id);
|
||||
_disable(dev, chan_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -121,7 +126,7 @@ static int counter_nrfx_set_wrap(struct device *dev, u32_t ticks,
|
|||
/* Overflow can be changed only when all alarms are
|
||||
* disables.
|
||||
*/
|
||||
if (nrfx_config->alarm_cfgs[i]) {
|
||||
if (nrfx_config->ch_data[i].callback) {
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
@ -145,13 +150,17 @@ static u32_t counter_nrfx_get_pending_int(struct device *dev)
|
|||
static void alarm_event_handler(struct device *dev, u32_t id)
|
||||
{
|
||||
const struct counter_nrfx_config *config = get_nrfx_config(dev);
|
||||
const struct counter_alarm_cfg *alarm_cfg = config->alarm_cfgs[id];
|
||||
counter_alarm_callback_t clbk = config->ch_data[id].callback;
|
||||
u32_t cc_val;
|
||||
|
||||
if (!clbk) {
|
||||
return;
|
||||
}
|
||||
|
||||
cc_val = nrf_rtc_cc_get(config->rtc.p_reg, ID_TO_CC(id));
|
||||
|
||||
_disable(dev, id);
|
||||
alarm_cfg->handler(dev, alarm_cfg, cc_val);
|
||||
clbk(dev, id, cc_val, config->ch_data[id].user_data);
|
||||
}
|
||||
|
||||
static void event_handler(nrfx_rtc_int_type_t int_type, void *p_context)
|
||||
|
@ -244,8 +253,8 @@ static const struct counter_driver_api counter_nrfx_driver_api = {
|
|||
return init_rtc(dev, &config, rtc_##idx##_handler); \
|
||||
} \
|
||||
static struct counter_nrfx_data counter_##idx##_data; \
|
||||
static const struct counter_alarm_cfg \
|
||||
*counter##idx##_alarm_cfgs[CC_TO_ID(RTC##idx##_CC_NUM)]; \
|
||||
static struct counter_nrfx_ch_data \
|
||||
counter##idx##_ch_data[CC_TO_ID(RTC##idx##_CC_NUM)]; \
|
||||
LOG_INSTANCE_REGISTER(LOG_MODULE_NAME, idx, CONFIG_COUNTER_LOG_LEVEL); \
|
||||
static const struct counter_nrfx_config nrfx_counter_##idx##_config = {\
|
||||
.info = { \
|
||||
|
@ -255,7 +264,7 @@ static const struct counter_driver_api counter_nrfx_driver_api = {
|
|||
.count_up = true, \
|
||||
.channels = CC_TO_ID(RTC##idx##_CC_NUM) \
|
||||
}, \
|
||||
.alarm_cfgs = counter##idx##_alarm_cfgs, \
|
||||
.ch_data = counter##idx##_ch_data, \
|
||||
.rtc = NRFX_RTC_INSTANCE(idx), \
|
||||
LOG_INSTANCE_PTR_INIT(log, LOG_MODULE_NAME, idx) \
|
||||
}; \
|
||||
|
|
|
@ -30,9 +30,14 @@ struct counter_nrfx_data {
|
|||
void *wrap_user_data;
|
||||
};
|
||||
|
||||
struct counter_nrfx_ch_data {
|
||||
counter_alarm_callback_t callback;
|
||||
void *user_data;
|
||||
};
|
||||
|
||||
struct counter_nrfx_config {
|
||||
struct counter_config_info info;
|
||||
const struct counter_alarm_cfg **alarm_cfgs;
|
||||
struct counter_nrfx_ch_data *ch_data;
|
||||
nrfx_timer_t timer;
|
||||
|
||||
LOG_INSTANCE_PTR_DECLARE(log);
|
||||
|
@ -70,7 +75,7 @@ static u32_t counter_nrfx_read(struct device *dev)
|
|||
COUNTER_READ_CC);
|
||||
}
|
||||
|
||||
static int counter_nrfx_set_alarm(struct device *dev,
|
||||
static int counter_nrfx_set_alarm(struct device *dev, u8_t chan_id,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
{
|
||||
const struct counter_nrfx_config *nrfx_config = get_nrfx_config(dev);
|
||||
|
@ -81,16 +86,16 @@ static int counter_nrfx_set_alarm(struct device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nrfx_config->alarm_cfgs[alarm_cfg->channel_id]) {
|
||||
if (nrfx_config->ch_data[chan_id].callback) {
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
cc_val = alarm_cfg->ticks + (alarm_cfg->absolute ?
|
||||
0 : nrfx_timer_capture(timer, COUNTER_READ_CC));
|
||||
nrfx_config->alarm_cfgs[alarm_cfg->channel_id] = alarm_cfg;
|
||||
nrfx_config->ch_data[chan_id].callback = alarm_cfg->callback;
|
||||
nrfx_config->ch_data[chan_id].user_data = alarm_cfg->user_data;
|
||||
|
||||
nrfx_timer_compare(timer, ID_TO_CC(alarm_cfg->channel_id),
|
||||
cc_val, true);
|
||||
nrfx_timer_compare(timer, ID_TO_CC(chan_id), cc_val, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -100,17 +105,17 @@ static void _disable(struct device *dev, u8_t id)
|
|||
const struct counter_nrfx_config *config = get_nrfx_config(dev);
|
||||
|
||||
nrfx_timer_compare_int_disable(&config->timer, ID_TO_CC(id));
|
||||
config->alarm_cfgs[id] = NULL;
|
||||
config->ch_data[id].callback = NULL;
|
||||
}
|
||||
|
||||
static int counter_nrfx_disable_alarm(struct device *dev,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
static int counter_nrfx_disable_alarm(struct device *dev,u8_t chan_id)
|
||||
{
|
||||
_disable(dev, alarm_cfg->channel_id);
|
||||
_disable(dev, chan_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int counter_nrfx_set_wrap(struct device *dev, u32_t ticks,
|
||||
counter_wrap_callback_t callback,
|
||||
void *user_data)
|
||||
|
@ -123,7 +128,7 @@ static int counter_nrfx_set_wrap(struct device *dev, u32_t ticks,
|
|||
/* Overflow can be changed only when all alarms are
|
||||
* disables.
|
||||
*/
|
||||
if (nrfx_config->alarm_cfgs[i]) {
|
||||
if (nrfx_config->ch_data[i].callback) {
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
@ -147,18 +152,17 @@ static u32_t counter_nrfx_get_pending_int(struct device *dev)
|
|||
|
||||
static void alarm_event_handler(struct device *dev, u32_t id)
|
||||
{
|
||||
const nrfx_timer_t *timer = &get_nrfx_config(dev)->timer;
|
||||
const struct counter_alarm_cfg *alarm_cfg =
|
||||
get_nrfx_config(dev)->alarm_cfgs[id];
|
||||
const struct counter_nrfx_config *config = get_nrfx_config(dev);
|
||||
counter_alarm_callback_t clbk = config->ch_data[id].callback;
|
||||
u32_t cc_val;
|
||||
|
||||
if (!alarm_cfg->handler) {
|
||||
if (!clbk) {
|
||||
return;
|
||||
}
|
||||
|
||||
cc_val = nrfx_timer_capture_get(timer, ID_TO_CC(id));
|
||||
cc_val = nrfx_timer_capture_get(&config->timer, ID_TO_CC(id));
|
||||
_disable(dev, id);
|
||||
alarm_cfg->handler(dev, alarm_cfg, cc_val);
|
||||
clbk(dev, id, cc_val, config->ch_data[id].user_data);
|
||||
}
|
||||
|
||||
static void event_handler(nrf_timer_event_t event_type, void *p_context)
|
||||
|
@ -234,8 +238,8 @@ static const struct counter_driver_api counter_nrfx_driver_api = {
|
|||
return init_timer(dev, &config); \
|
||||
} \
|
||||
static struct counter_nrfx_data counter_##idx##_data; \
|
||||
static const struct counter_alarm_cfg \
|
||||
*counter##idx##_alarm_cfgs[CC_TO_ID(TIMER##idx##_CC_NUM)]; \
|
||||
static struct counter_nrfx_ch_data \
|
||||
counter##idx##_ch_data[CC_TO_ID(TIMER##idx##_CC_NUM)]; \
|
||||
LOG_INSTANCE_REGISTER(LOG_MODULE_NAME, idx, CONFIG_COUNTER_LOG_LEVEL); \
|
||||
static const struct counter_nrfx_config nrfx_counter_##idx##_config = {\
|
||||
.info = { \
|
||||
|
@ -246,7 +250,7 @@ static const struct counter_driver_api counter_nrfx_driver_api = {
|
|||
.count_up = true, \
|
||||
.channels = CC_TO_ID(TIMER##idx##_CC_NUM), \
|
||||
}, \
|
||||
.alarm_cfgs = counter##idx##_alarm_cfgs, \
|
||||
.ch_data = counter##idx##_ch_data, \
|
||||
.timer = NRFX_TIMER_INSTANCE(idx), \
|
||||
LOG_INSTANCE_PTR_INIT(log, LOG_MODULE_NAME, idx) \
|
||||
}; \
|
||||
|
|
|
@ -29,45 +29,37 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct counter_alarm_cfg;
|
||||
|
||||
/** @brief Alarm callback
|
||||
*
|
||||
* @param dev Pointer to the device structure for the driver instance.
|
||||
* @param cfg Original structure owning this handler.
|
||||
* @param ticks Counter value that triggered the callback.
|
||||
* @param dev Pointer to the device structure for the driver instance.
|
||||
* @param chan_id Channel ID.
|
||||
* @param ticks Counter value that triggered the callback.
|
||||
* @param user_data User data.
|
||||
*/
|
||||
typedef void (*counter_alarm_callback_t)(struct device *dev,
|
||||
const struct counter_alarm_cfg *cfg,
|
||||
u32_t ticks);
|
||||
u8_t chan_id, u32_t ticks,
|
||||
void *user_data);
|
||||
|
||||
/** @brief Alarm callback structure.
|
||||
*
|
||||
* Used to set an alarm.
|
||||
* Beware such structure should not be allocated on stack.
|
||||
* @param callback Callback called on alarm (cannot be NULL).
|
||||
* @param ticks Ticks that triggers the alarm. In case of absolute flag is set,
|
||||
* maximal value that can be set equals wrap value
|
||||
* (counter_get_wrap). Otherwise counter_get_max_relative_alarm()
|
||||
* returns maximal value that can be set. If counter is clock
|
||||
* driven then ticks can be converted to microseconds (see @ref
|
||||
* counter_ticks_to_us). 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.
|
||||
*/
|
||||
struct counter_alarm_cfg {
|
||||
counter_alarm_callback_t handler; /*!< handler called on alarm
|
||||
* (cannot be NULL).
|
||||
*/
|
||||
|
||||
u32_t ticks; /*!< In case of absolute flag is set, maximal value that
|
||||
* can be set equals wrap value (counter_get_wrap).
|
||||
* Otherwise counter_get_max_relative_alarm() returns
|
||||
* maximal value that can be set. If counter is clock
|
||||
* driven then ticks can be converted to microseconds
|
||||
* (see @ref counter_ticks_to_us). Alternatively,
|
||||
* counter implementation may count asynchronous events.
|
||||
*/
|
||||
|
||||
u8_t channel_id; /*!< Channel ID. Number of channels is driver
|
||||
* dependent.
|
||||
*/
|
||||
|
||||
bool absolute; /*!< If true ticks are treated as absolute value, else
|
||||
* it is relative to the counter reading performed
|
||||
* during the call.
|
||||
*/
|
||||
counter_alarm_callback_t callback;
|
||||
u32_t ticks;
|
||||
void *user_data;
|
||||
bool absolute;
|
||||
};
|
||||
|
||||
/** @brief Wrap callback
|
||||
|
@ -77,32 +69,29 @@ struct counter_alarm_cfg {
|
|||
*/
|
||||
typedef void (*counter_wrap_callback_t)(struct device *dev, void *user_data);
|
||||
|
||||
/** @brief Structure with generic counter features. */
|
||||
/** @brief Structure with generic counter features.
|
||||
*
|
||||
* @param max_wrap Maximal (default) wrap value on which counter is reset
|
||||
* (cleared or reloaded).
|
||||
* @param freq Frequency of the source clock if synchronous events are counted.
|
||||
* @param count_up Flag indicating direction of the counter. If true counter is
|
||||
* counting up else counting down.
|
||||
* @param channels Number of channels that can be used for setting alarm,
|
||||
* see @ref counter_set_alarm.
|
||||
*/
|
||||
struct counter_config_info {
|
||||
u32_t max_wrap; /*!< Maximal (default) wrap value on which counter is
|
||||
* reset (cleared or reloaded).
|
||||
*/
|
||||
|
||||
u32_t freq; /*!< Frequency of the source clock if synchronous events
|
||||
* are counted.
|
||||
*/
|
||||
|
||||
bool count_up; /*!< Flag indicating direction of the counter. If true
|
||||
* counter is counting up else counting down.
|
||||
*/
|
||||
|
||||
u8_t channels; /*!< Number of channels that can be used for setting
|
||||
* alarm, see @ref counter_set_alarm.
|
||||
*/
|
||||
u32_t max_wrap;
|
||||
u32_t freq;
|
||||
bool count_up;
|
||||
u8_t channels;
|
||||
};
|
||||
|
||||
typedef int (*counter_api_start)(struct device *dev);
|
||||
typedef int (*counter_api_stop)(struct device *dev);
|
||||
typedef u32_t (*counter_api_read)(struct device *dev);
|
||||
typedef int (*counter_api_set_alarm)(struct device *dev,
|
||||
const struct counter_alarm_cfg *alarm_cfg);
|
||||
typedef int (*counter_api_disable_alarm)(struct device *dev,
|
||||
typedef int (*counter_api_set_alarm)(struct device *dev, u8_t chan_id,
|
||||
const struct counter_alarm_cfg *alarm_cfg);
|
||||
typedef int (*counter_api_disable_alarm)(struct device *dev, u8_t chan_id);
|
||||
typedef int (*counter_api_set_wrap)(struct device *dev, u32_t ticks,
|
||||
counter_wrap_callback_t callback,
|
||||
void *user_data);
|
||||
|
@ -133,7 +122,7 @@ struct counter_driver_api {
|
|||
* @retval true if counter is counting up.
|
||||
* @retval false if counter is counting down.
|
||||
*/
|
||||
static inline bool counter_count_up(const struct device *dev)
|
||||
static inline bool counter_is_counting_up(const struct device *dev)
|
||||
{
|
||||
const struct counter_config_info *config = dev->config->config_info;
|
||||
|
||||
|
@ -273,6 +262,7 @@ static inline u32_t _impl_counter_read(struct device *dev)
|
|||
* counter_get_max_relative_alarm.
|
||||
*
|
||||
* @param dev Pointer to the device structure for the driver instance.
|
||||
* @param chan_id Channel ID.
|
||||
* @param alarm_cfg Alarm configuration.
|
||||
*
|
||||
* @retval 0 If successful.
|
||||
|
@ -280,39 +270,38 @@ static inline u32_t _impl_counter_read(struct device *dev)
|
|||
* interrupts or requested channel).
|
||||
* @retval -EINVAL if alarm settings are invalid.
|
||||
*/
|
||||
static inline int counter_set_ch_alarm(struct device *dev,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
static inline int counter_set_channel_alarm(struct device *dev, u8_t chan_id,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
{
|
||||
const struct counter_driver_api *api = dev->driver_api;
|
||||
|
||||
if (alarm_cfg->channel_id >= counter_get_num_of_channels(dev)) {
|
||||
if (chan_id >= counter_get_num_of_channels(dev)) {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return api->set_alarm(dev, alarm_cfg);
|
||||
return api->set_alarm(dev, chan_id, alarm_cfg);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Disable an alarm on a channel.
|
||||
*
|
||||
* @param dev Pointer to the device structure for the driver instance.
|
||||
* @param alarm_cfg Alarm configuration. It must be the same address as the
|
||||
* one used for @ref counter_set_alarm.
|
||||
* @param chan_id Channel ID.
|
||||
*
|
||||
* @retval 0 If successful.
|
||||
* @retval -ENOTSUP if request is not supported or the counter was not started
|
||||
* yet.
|
||||
*/
|
||||
static inline int counter_disable_ch_alarm(struct device *dev,
|
||||
const struct counter_alarm_cfg *alarm_cfg)
|
||||
static inline int counter_disable_channel_alarm(struct device *dev,
|
||||
u8_t chan_id)
|
||||
{
|
||||
const struct counter_driver_api *api = dev->driver_api;
|
||||
|
||||
if (alarm_cfg->channel_id >= counter_get_num_of_channels(dev)) {
|
||||
if (chan_id >= counter_get_num_of_channels(dev)) {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return api->disable_alarm(dev, alarm_cfg);
|
||||
return api->disable_alarm(dev, chan_id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -402,9 +391,12 @@ static inline u32_t _impl_counter_get_max_relative_alarm(struct device *dev)
|
|||
return api->get_max_relative_alarm(dev);
|
||||
}
|
||||
|
||||
/* Deprecated */
|
||||
/* Deprecated counter callback. */
|
||||
typedef void (*counter_callback_t)(struct device *dev, void *user_data);
|
||||
|
||||
/**
|
||||
* @brief Deprecated function.
|
||||
*/
|
||||
__deprecated static inline int counter_set_alarm(struct device *dev,
|
||||
counter_callback_t callback,
|
||||
u32_t count, void *user_data)
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
#include <ztest.h>
|
||||
#include <kernel.h>
|
||||
|
||||
static volatile int wrap_cnt;
|
||||
static volatile int alarm_cnt;
|
||||
static volatile u32_t wrap_cnt;
|
||||
static volatile u32_t alarm_cnt;
|
||||
|
||||
static void wrap_handler(struct device *dev, void *user_data);
|
||||
|
||||
|
@ -83,12 +83,11 @@ static void wrap_handler(struct device *dev, void *user_data)
|
|||
wrap_cnt++;
|
||||
}
|
||||
|
||||
#include <nrf_gpio.h>
|
||||
void test_wrap_alarm_instance(const char *dev_name)
|
||||
{
|
||||
struct device *dev;
|
||||
int err;
|
||||
int cnt;
|
||||
u32_t cnt;
|
||||
u32_t ticks;
|
||||
|
||||
wrap_cnt = 0;
|
||||
|
@ -120,11 +119,10 @@ void test_wrap_alarm(void)
|
|||
test_all_instances(test_wrap_alarm_instance);
|
||||
}
|
||||
|
||||
static void alarm_handler(struct device *dev,
|
||||
const struct counter_alarm_cfg *cfg,
|
||||
u32_t counter)
|
||||
static void alarm_handler(struct device *dev, u8_t chan_id, u32_t counter,
|
||||
void *user_data)
|
||||
{
|
||||
zassert_true(&alarm_cfg == cfg, "Unexpected callback\n");
|
||||
zassert_true(&alarm_cfg == user_data, "Unexpected callback\n");
|
||||
alarm_cnt++;
|
||||
}
|
||||
|
||||
|
@ -137,10 +135,10 @@ void test_single_shot_alarm_instance(const char *dev_name)
|
|||
dev = device_get_binding(dev_name);
|
||||
ticks = counter_us_to_ticks(dev, WRAP_PERIOD_US);
|
||||
|
||||
alarm_cfg.channel_id = 0;
|
||||
alarm_cfg.absolute = true;
|
||||
alarm_cfg.ticks = ticks + 1;
|
||||
alarm_cfg.handler = alarm_handler;
|
||||
alarm_cfg.callback = alarm_handler;
|
||||
alarm_cfg.user_data = &alarm_cfg;
|
||||
|
||||
alarm_cnt = 0;
|
||||
|
||||
|
@ -150,11 +148,11 @@ void test_single_shot_alarm_instance(const char *dev_name)
|
|||
err = counter_set_wrap(dev, ticks, wrap_handler, exp_user_data);
|
||||
zassert_equal(0, err, "Counter failed to set wrap\n");
|
||||
|
||||
err = counter_set_ch_alarm(dev, &alarm_cfg);
|
||||
err = counter_set_channel_alarm(dev, 0, &alarm_cfg);
|
||||
zassert_equal(-EINVAL, err, "Counter should return error because ticks exceeded the limit set alarm\n");
|
||||
|
||||
alarm_cfg.ticks = ticks - 100;
|
||||
err = counter_set_ch_alarm(dev, &alarm_cfg);
|
||||
|
||||
err = counter_set_channel_alarm(dev, 0, &alarm_cfg);
|
||||
zassert_equal(0, err, "Counter set alarm failed\n");
|
||||
|
||||
k_busy_wait(1.2*counter_ticks_to_us(dev, ticks));
|
||||
|
@ -164,7 +162,7 @@ void test_single_shot_alarm_instance(const char *dev_name)
|
|||
k_busy_wait(counter_ticks_to_us(dev, 2*ticks));
|
||||
zassert_equal(1, alarm_cnt, "Expecting alarm callback\n");
|
||||
|
||||
err = counter_disable_ch_alarm(dev, &alarm_cfg);
|
||||
err = counter_disable_channel_alarm(dev, 0);
|
||||
zassert_equal(0, err, "Counter disabling alarm failed\n");
|
||||
|
||||
err = counter_set_wrap(dev, counter_get_max_wrap(dev), NULL, NULL);
|
||||
|
@ -179,13 +177,12 @@ void test_single_shot_alarm(void)
|
|||
test_all_instances(test_single_shot_alarm_instance);
|
||||
}
|
||||
|
||||
static const struct counter_alarm_cfg *clbks[2];
|
||||
static void *clbk_data[2];
|
||||
|
||||
static void alarm_handler2(struct device *dev,
|
||||
const struct counter_alarm_cfg *cfg,
|
||||
u32_t counter)
|
||||
static void alarm_handler2(struct device *dev, u8_t chan_id, u32_t counter,
|
||||
void *user_data)
|
||||
{
|
||||
clbks[alarm_cnt] = cfg;
|
||||
clbk_data[alarm_cnt] = user_data;
|
||||
alarm_cnt++;
|
||||
}
|
||||
|
||||
|
@ -204,15 +201,15 @@ void test_multiple_alarms_instance(const char *dev_name)
|
|||
dev = device_get_binding(dev_name);
|
||||
ticks = counter_us_to_ticks(dev, WRAP_PERIOD_US);
|
||||
|
||||
alarm_cfg.channel_id = 0;
|
||||
alarm_cfg.absolute = true;
|
||||
alarm_cfg.ticks = counter_us_to_ticks(dev, 2000);
|
||||
alarm_cfg.handler = alarm_handler2;
|
||||
alarm_cfg.callback = alarm_handler2;
|
||||
alarm_cfg.user_data = &alarm_cfg;
|
||||
|
||||
alarm_cfg2.channel_id = 1;
|
||||
alarm_cfg2.absolute = false;
|
||||
alarm_cfg2.ticks = counter_us_to_ticks(dev, 2000);
|
||||
alarm_cfg2.handler = alarm_handler2;
|
||||
alarm_cfg2.callback = alarm_handler2;
|
||||
alarm_cfg2.user_data = &alarm_cfg2;
|
||||
|
||||
alarm_cnt = 0;
|
||||
|
||||
|
@ -222,24 +219,26 @@ void test_multiple_alarms_instance(const char *dev_name)
|
|||
err = counter_set_wrap(dev, ticks, wrap_handler, exp_user_data);
|
||||
zassert_equal(0, err, "Counter failed to set wrap\n");
|
||||
|
||||
k_busy_wait(1.2*counter_ticks_to_us(dev, alarm_cfg.ticks));
|
||||
k_busy_wait(1.4*counter_ticks_to_us(dev, alarm_cfg.ticks));
|
||||
|
||||
err = counter_set_ch_alarm(dev, &alarm_cfg);
|
||||
err = counter_set_channel_alarm(dev, 0, &alarm_cfg);
|
||||
zassert_equal(0, err, "Counter set alarm failed\n");
|
||||
|
||||
err = counter_set_ch_alarm(dev, &alarm_cfg2);
|
||||
err = counter_set_channel_alarm(dev, 1, &alarm_cfg2);
|
||||
zassert_equal(0, err, "Counter set alarm failed\n");
|
||||
|
||||
k_busy_wait(1.2*counter_ticks_to_us(dev, 2*ticks));
|
||||
zassert_equal(2, alarm_cnt, "Counter set alarm failed\n");
|
||||
zassert_equal(&alarm_cfg2, clbks[0], "Expected different order or callbacks\n");
|
||||
zassert_equal(&alarm_cfg, clbks[1], "Expected different order or callbacks\n");
|
||||
zassert_equal(&alarm_cfg2, clbk_data[0],
|
||||
"Expected different order or callbacks\n");
|
||||
zassert_equal(&alarm_cfg, clbk_data[1],
|
||||
"Expected different order or callbacks\n");
|
||||
|
||||
/* tear down */
|
||||
err = counter_disable_ch_alarm(dev, &alarm_cfg);
|
||||
err = counter_disable_channel_alarm(dev, 0);
|
||||
zassert_equal(0, err, "Counter disabling alarm failed\n");
|
||||
|
||||
err = counter_disable_ch_alarm(dev, &alarm_cfg2);
|
||||
err = counter_disable_channel_alarm(dev, 1);
|
||||
zassert_equal(0, err, "Counter disabling alarm failed\n");
|
||||
}
|
||||
|
||||
|
@ -262,17 +261,16 @@ void test_all_channels_instance(const char *str)
|
|||
ticks = counter_us_to_ticks(dev, WRAP_PERIOD_US);
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
alarm_cfgs[i].channel_id = i;
|
||||
alarm_cfgs[i].absolute = false;
|
||||
alarm_cfgs[i].ticks = ticks-100;
|
||||
alarm_cfgs[i].handler = alarm_handler2;
|
||||
alarm_cfgs[i].callback = alarm_handler2;
|
||||
}
|
||||
|
||||
err = counter_start(dev);
|
||||
zassert_equal(0, err, "Counter failed to start");
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
err = counter_set_ch_alarm(dev, &alarm_cfgs[i]);
|
||||
err = counter_set_channel_alarm(dev, i, &alarm_cfgs[i]);
|
||||
if ((err == 0) && !limit_reached) {
|
||||
nchan++;
|
||||
} else if (err == -ENOTSUP) {
|
||||
|
@ -283,12 +281,12 @@ void test_all_channels_instance(const char *str)
|
|||
}
|
||||
|
||||
for (int i = 0; i < nchan; i++) {
|
||||
err = counter_disable_ch_alarm(dev, &alarm_cfgs[i]);
|
||||
err = counter_disable_channel_alarm(dev, i);
|
||||
zassert_equal(0, err, "Unexpected error on disabling alarm");
|
||||
}
|
||||
|
||||
for (int i = nchan; i < n; i++) {
|
||||
err = counter_disable_ch_alarm(dev, &alarm_cfgs[i]);
|
||||
err = counter_disable_channel_alarm(dev, i);
|
||||
zassert_equal(-ENOTSUP, err, "Unexpected error on disabling alarm\n");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue