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 | |
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>
-rw-r--r-- | src/avr/gpio.c | 36 | ||||
-rw-r--r-- | src/avr/gpio.h | 2 |
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 { |