aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/avr/gpio.c8
-rw-r--r--src/avr/gpio.h1
-rw-r--r--src/generic/gpio.h1
-rw-r--r--src/gpiocmds.c2
-rw-r--r--src/linux/gpio.h1
-rw-r--r--src/pru/gpio.c8
-rw-r--r--src/pru/gpio.h1
-rw-r--r--src/sam3x8e/gpio.c10
-rw-r--r--src/sam3x8e/gpio.h1
-rw-r--r--src/simulator/gpio.c2
-rw-r--r--src/stepper.c10
-rw-r--r--src/stm32f1/gpio.c10
-rw-r--r--src/stm32f1/gpio.h1
13 files changed, 46 insertions, 10 deletions
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,12 +63,18 @@ 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)
{
irqstatus_t flag = irq_save();
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,12 +104,18 @@ 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)
{
volatile uint32_t *reg = g.reg;
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,13 +69,21 @@ 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)
{
Pio *regs = g.regs;
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,12 +72,20 @@ 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)
{
if (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);