diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2018-08-19 19:10:36 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2018-08-27 12:40:38 -0400 |
commit | 1ae67441c3f3301c3efea89f724b42e3f58e51f9 (patch) | |
tree | de20b63431c90a7fef153979d0369409494f87a2 /src/avr/gpio.c | |
parent | 34fe4cce1445aa5b00f38dddf8b77a0e1b211bf7 (diff) | |
download | kutter-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>
Diffstat (limited to 'src/avr/gpio.c')
-rw-r--r-- | src/avr/gpio.c | 36 |
1 files changed, 24 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) { |