driver: counter: esp32: make sure callback is executed
User callback can be used to re-trigger the alarm. In such case, copy current callback before it is overritten. Signed-off-by: Sylvio Alves <sylvio.alves@espressif.com>
This commit is contained in:
parent
293b8d6003
commit
ad3df1d0f2
1 changed files with 5 additions and 7 deletions
|
@ -165,11 +165,7 @@ static int counter_esp32_set_alarm(const struct device *dev, uint8_t chan_id,
|
||||||
|
|
||||||
if (absolute == 0) {
|
if (absolute == 0) {
|
||||||
ticks += now;
|
ticks += now;
|
||||||
if (ticks > data->top_data.ticks) {
|
timer_ll_set_alarm_value(data->hal_ctx.dev, data->hal_ctx.timer_id, ticks);
|
||||||
ticks -= (data->top_data.ticks + 1);
|
|
||||||
}
|
|
||||||
timer_ll_set_alarm_value(data->hal_ctx.dev, data->hal_ctx.timer_id,
|
|
||||||
(now + alarm_cfg->ticks));
|
|
||||||
} else {
|
} else {
|
||||||
irq_on_late = alarm_cfg->flags & COUNTER_ALARM_CFG_EXPIRE_WHEN_LATE;
|
irq_on_late = alarm_cfg->flags & COUNTER_ALARM_CFG_EXPIRE_WHEN_LATE;
|
||||||
max_rel_val = top - data->top_data.guard_period;
|
max_rel_val = top - data->top_data.guard_period;
|
||||||
|
@ -334,17 +330,19 @@ static void counter_esp32_isr(void *arg)
|
||||||
{
|
{
|
||||||
const struct device *dev = (const struct device *)arg;
|
const struct device *dev = (const struct device *)arg;
|
||||||
struct counter_esp32_data *data = dev->data;
|
struct counter_esp32_data *data = dev->data;
|
||||||
|
counter_alarm_callback_t cb = data->alarm_cfg.callback;
|
||||||
|
void *cb_data = data->alarm_cfg.user_data;
|
||||||
uint32_t now;
|
uint32_t now;
|
||||||
|
|
||||||
counter_esp32_get_value(dev, &now);
|
counter_esp32_get_value(dev, &now);
|
||||||
|
|
||||||
if (data->alarm_cfg.callback) {
|
if (cb) {
|
||||||
data->alarm_cfg.callback(dev, 0, now, data->alarm_cfg.user_data);
|
|
||||||
timer_ll_enable_intr(data->hal_ctx.dev,
|
timer_ll_enable_intr(data->hal_ctx.dev,
|
||||||
TIMER_LL_EVENT_ALARM(data->hal_ctx.timer_id), false);
|
TIMER_LL_EVENT_ALARM(data->hal_ctx.timer_id), false);
|
||||||
timer_ll_enable_alarm(data->hal_ctx.dev, data->hal_ctx.timer_id, TIMER_ALARM_DIS);
|
timer_ll_enable_alarm(data->hal_ctx.dev, data->hal_ctx.timer_id, TIMER_ALARM_DIS);
|
||||||
data->alarm_cfg.callback = NULL;
|
data->alarm_cfg.callback = NULL;
|
||||||
data->alarm_cfg.user_data = NULL;
|
data->alarm_cfg.user_data = NULL;
|
||||||
|
cb(dev, 0, now, cb_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->top_data.callback) {
|
if (data->top_data.callback) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue