aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2018-08-19 19:10:36 -0400
committerKevin O'Connor <kevin@koconnor.net>2018-08-27 12:40:38 -0400
commit1ae67441c3f3301c3efea89f724b42e3f58e51f9 (patch)
treede20b63431c90a7fef153979d0369409494f87a2
parent34fe4cce1445aa5b00f38dddf8b77a0e1b211bf7 (diff)
downloadkutter-1ae67441c3f3301c3efea89f724b42e3f58e51f9.tar.gz
kutter-1ae67441c3f3301c3efea89f724b42e3f58e51f9.tar.xz
kutter-1ae67441c3f3301c3efea89f724b42e3f58e51f9.zip
avr: Add support for gpio_x_reset()
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/avr/gpio.c36
-rw-r--r--src/avr/gpio.h2
2 files changed, 26 insertions, 12 deletions
diff --git a/src/avr/gpio.c b/src/avr/gpio.c
index 15aaeae6..34de1af6 100644
--- a/src/avr/gpio.c
+++ b/src/avr/gpio.c
@@ -52,17 +52,23 @@ gpio_out_setup(uint8_t pin, uint8_t val)
struct gpio_digital_regs *regs = GPIO2REGS(pin);
if (! regs)
goto fail;
- uint8_t bit = GPIO2BIT(pin);
- irqstatus_t flag = irq_save();
- regs->out = val ? (regs->out | bit) : (regs->out & ~bit);
- regs->mode |= bit;
- irq_restore(flag);
- return (struct gpio_out){ .regs=regs, .bit=bit };
+ struct gpio_out g = { .regs=regs, .bit=GPIO2BIT(pin) };
+ gpio_out_reset(g, val);
+ return g;
fail:
shutdown("Not an output pin");
}
void
+gpio_out_reset(struct gpio_out g, uint8_t val)
+{
+ irqstatus_t flag = irq_save();
+ g.regs->out = val ? (g.regs->out | g.bit) : (g.regs->out & ~g.bit);
+ g.regs->mode |= g.bit;
+ irq_restore(flag);
+}
+
+void
gpio_out_toggle_noirq(struct gpio_out g)
{
g.regs->in = g.bit;
@@ -90,16 +96,22 @@ gpio_in_setup(uint8_t pin, int8_t pull_up)
struct gpio_digital_regs *regs = GPIO2REGS(pin);
if (! regs)
goto fail;
- uint8_t bit = GPIO2BIT(pin);
- irqstatus_t flag = irq_save();
- regs->out = pull_up > 0 ? (regs->out | bit) : (regs->out & ~bit);
- regs->mode &= ~bit;
- irq_restore(flag);
- return (struct gpio_in){ .regs=regs, .bit=bit };
+ struct gpio_in g = { .regs=regs, .bit=GPIO2BIT(pin) };
+ gpio_in_reset(g, pull_up);
+ return g;
fail:
shutdown("Not an input pin");
}
+void
+gpio_in_reset(struct gpio_in g, int8_t pull_up)
+{
+ irqstatus_t flag = irq_save();
+ g.regs->out = pull_up > 0 ? (g.regs->out | g.bit) : (g.regs->out & ~g.bit);
+ g.regs->mode &= ~g.bit;
+ irq_restore(flag);
+}
+
uint8_t
gpio_in_read(struct gpio_in g)
{
diff --git a/src/avr/gpio.h b/src/avr/gpio.h
index 2f769cb9..4b10b3d7 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_reset(struct gpio_out g, 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);
@@ -18,6 +19,7 @@ struct gpio_in {
uint8_t bit;
};
struct gpio_in gpio_in_setup(uint8_t pin, int8_t pull_up);
+void gpio_in_reset(struct gpio_in g, int8_t pull_up);
uint8_t gpio_in_read(struct gpio_in g);
struct gpio_pwm {