diff --git a/src/avr/gpio.c b/src/avr/gpio.c index 0ae7e52f..ce89b1be 100644 --- a/src/avr/gpio.c +++ b/src/avr/gpio.c @@ -63,11 +63,17 @@ fail: } void -gpio_out_toggle(struct gpio_out g) +gpio_out_toggle_noirq(struct gpio_out g) { g.regs->in = g.bit; } +void +gpio_out_toggle(struct gpio_out g) +{ + gpio_out_toggle_noirq(g); +} + void gpio_out_write(struct gpio_out g, uint8_t val) { diff --git a/src/avr/gpio.h b/src/avr/gpio.h index 6e12efe0..515e4c9a 100644 --- a/src/avr/gpio.h +++ b/src/avr/gpio.h @@ -9,6 +9,7 @@ struct gpio_out { uint8_t bit : 8; }; struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val); +void gpio_out_toggle_noirq(struct gpio_out g); void gpio_out_toggle(struct gpio_out g); void gpio_out_write(struct gpio_out g, uint8_t val); diff --git a/src/generic/gpio.h b/src/generic/gpio.h index fcb785d4..e6ef1280 100644 --- a/src/generic/gpio.h +++ b/src/generic/gpio.h @@ -7,6 +7,7 @@ struct gpio_out { uint8_t pin; }; struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val); +void gpio_out_toggle_noirq(struct gpio_out g); void gpio_out_toggle(struct gpio_out g); void gpio_out_write(struct gpio_out g, uint8_t val); diff --git a/src/gpiocmds.c b/src/gpiocmds.c index 54465459..cc221fc3 100644 --- a/src/gpiocmds.c +++ b/src/gpiocmds.c @@ -115,7 +115,7 @@ static uint_fast8_t soft_pwm_toggle_event(struct timer *timer) { struct soft_pwm_s *s = container_of(timer, struct soft_pwm_s, timer); - gpio_out_toggle(s->pin); + gpio_out_toggle_noirq(s->pin); s->flags ^= SPF_ON; uint32_t waketime = s->timer.waketime; if (s->flags & SPF_ON) diff --git a/src/linux/gpio.h b/src/linux/gpio.h index 74d9db37..b18e5d3d 100644 --- a/src/linux/gpio.h +++ b/src/linux/gpio.h @@ -7,6 +7,7 @@ struct gpio_out { uint32_t pin; }; struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val); +void gpio_out_toggle_noirq(struct gpio_out g); void gpio_out_toggle(struct gpio_out g); void gpio_out_write(struct gpio_out g, uint8_t val); diff --git a/src/pru/gpio.c b/src/pru/gpio.c index ba4ba935..dfa7567b 100644 --- a/src/pru/gpio.c +++ b/src/pru/gpio.c @@ -104,11 +104,17 @@ fail: } void -gpio_out_toggle(struct gpio_out g) +gpio_out_toggle_noirq(struct gpio_out g) { gpio_out_write(g, !(*g.reg & g.bit)); } +void +gpio_out_toggle(struct gpio_out g) +{ + gpio_out_toggle_noirq(g); +} + void gpio_out_write(struct gpio_out g, uint8_t val) { diff --git a/src/pru/gpio.h b/src/pru/gpio.h index fc5e16b9..b3dd5508 100644 --- a/src/pru/gpio.h +++ b/src/pru/gpio.h @@ -9,6 +9,7 @@ struct gpio_out { uint32_t bit; }; struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val); +void gpio_out_toggle_noirq(struct gpio_out g); void gpio_out_toggle(struct gpio_out g); void gpio_out_write(struct gpio_out g, uint8_t val); diff --git a/src/sam3x8e/gpio.c b/src/sam3x8e/gpio.c index 205528d5..acfe0d90 100644 --- a/src/sam3x8e/gpio.c +++ b/src/sam3x8e/gpio.c @@ -69,12 +69,20 @@ fail: } void -gpio_out_toggle(struct gpio_out g) +gpio_out_toggle_noirq(struct gpio_out g) { Pio *regs = g.regs; regs->PIO_ODSR ^= g.bit; } +void +gpio_out_toggle(struct gpio_out g) +{ + irqstatus_t flag = irq_save(); + gpio_out_toggle_noirq(g); + irq_restore(flag); +} + void gpio_out_write(struct gpio_out g, uint8_t val) { diff --git a/src/sam3x8e/gpio.h b/src/sam3x8e/gpio.h index 1cab4614..e7016665 100644 --- a/src/sam3x8e/gpio.h +++ b/src/sam3x8e/gpio.h @@ -10,6 +10,7 @@ struct gpio_out { uint32_t bit; }; struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val); +void gpio_out_toggle_noirq(struct gpio_out g); void gpio_out_toggle(struct gpio_out g); void gpio_out_write(struct gpio_out g, uint8_t val); diff --git a/src/simulator/gpio.c b/src/simulator/gpio.c index 08359679..327c05ce 100644 --- a/src/simulator/gpio.c +++ b/src/simulator/gpio.c @@ -9,6 +9,8 @@ struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val) { return (struct gpio_out){.pin=pin}; } +void gpio_out_toggle_noirq(struct gpio_out g) { +} void gpio_out_toggle(struct gpio_out g) { } void gpio_out_write(struct gpio_out g, uint8_t val) { diff --git a/src/stepper.c b/src/stepper.c index 521e0ab8..2b967413 100644 --- a/src/stepper.c +++ b/src/stepper.c @@ -88,7 +88,7 @@ stepper_load_next(struct stepper *s, uint32_t min_next_time) } if (m->flags & MF_DIR) { s->position = -s->position + m->count; - gpio_out_toggle(s->dir_pin); + gpio_out_toggle_noirq(s->dir_pin); } else { s->position += m->count; } @@ -108,24 +108,24 @@ stepper_event(struct timer *t) if (CONFIG_NO_UNSTEP_DELAY) { // On slower mcus it is possible to simply step and unstep in // the same timer event. - gpio_out_toggle(s->step_pin); + gpio_out_toggle_noirq(s->step_pin); uint16_t count = s->count - 1; if (likely(count)) { s->count = count; s->time.waketime += s->interval; - gpio_out_toggle(s->step_pin); + gpio_out_toggle_noirq(s->step_pin); if (s->flags & SF_HAVE_ADD) s->interval += s->add; return SF_RESCHEDULE; } uint_fast8_t ret = stepper_load_next(s, 0); - gpio_out_toggle(s->step_pin); + gpio_out_toggle_noirq(s->step_pin); return ret; } // On faster mcus, it is necessary to schedule the unstep event uint32_t min_next_time = timer_read_time() + UNSTEP_TIME; - gpio_out_toggle(s->step_pin); + gpio_out_toggle_noirq(s->step_pin); s->count--; if (likely(s->count & 1)) // Schedule unstep event diff --git a/src/stm32f1/gpio.c b/src/stm32f1/gpio.c index 74bb72af..f988700a 100644 --- a/src/stm32f1/gpio.c +++ b/src/stm32f1/gpio.c @@ -72,11 +72,19 @@ fail: } void -gpio_out_toggle(struct gpio_out g) +gpio_out_toggle_noirq(struct gpio_out g) { LL_GPIO_TogglePin(g.regs, g.bit); } +void +gpio_out_toggle(struct gpio_out g) +{ + irqstatus_t flag = irq_save(); + gpio_out_toggle_noirq(g); + irq_restore(flag); +} + void gpio_out_write(struct gpio_out g, uint8_t val) { diff --git a/src/stm32f1/gpio.h b/src/stm32f1/gpio.h index b5a8621e..52e944f1 100644 --- a/src/stm32f1/gpio.h +++ b/src/stm32f1/gpio.h @@ -11,6 +11,7 @@ struct gpio_out { uint32_t bit; }; struct gpio_out gpio_out_setup(uint8_t pin, uint8_t val); +void gpio_out_toggle_noirq(struct gpio_out g); void gpio_out_toggle(struct gpio_out g); void gpio_out_write(struct gpio_out g, uint8_t val);