sam3x: Add gpio_init convenience function.
This commit is contained in:
parent
f311966f09
commit
614e26a3b1
@ -22,6 +22,19 @@
|
||||
|
||||
#include <libopencm3/sam3x/pio.h>
|
||||
|
||||
/* flags may be or'd together, but only contain one of
|
||||
* GPOUTPUT, PERIPHA and PERIPHB */
|
||||
enum gpio_flags {
|
||||
GPIO_FLAG_GPINPUT = 0,
|
||||
GPIO_FLAG_GPOUTPUT = 1,
|
||||
GPIO_FLAG_PERIPHA = 2,
|
||||
GPIO_FLAG_PERIPHB = 3,
|
||||
GPIO_FLAG_OPEN_DRAIN = 4,
|
||||
GPIO_FLAG_PULL_UP = 8,
|
||||
};
|
||||
|
||||
void gpio_init(u32 gpioport, u32 pins, enum gpio_flags flags);
|
||||
|
||||
static inline void gpio_set(u32 gpioport, u32 gpios)
|
||||
{
|
||||
PIO_SODR(gpioport) = gpios;
|
||||
|
@ -19,6 +19,40 @@
|
||||
|
||||
#include <libopencm3/sam3x/gpio.h>
|
||||
|
||||
void gpio_init(u32 port, u32 pins, enum gpio_flags flags)
|
||||
{
|
||||
switch (flags & 3) {
|
||||
case GPIO_FLAG_GPINPUT:
|
||||
/* input mode doesn't really exist, so we make a high
|
||||
* output in open-drain mode
|
||||
*/
|
||||
PIO_SODR(port) = pins;
|
||||
flags |= GPIO_FLAG_OPEN_DRAIN;
|
||||
/* fall through */
|
||||
case GPIO_FLAG_GPOUTPUT:
|
||||
PIO_OER(port) = pins;
|
||||
PIO_PER(port) = pins;
|
||||
break;
|
||||
case GPIO_FLAG_PERIPHA:
|
||||
PIO_ABSR(port) &= ~pins;
|
||||
PIO_PDR(port) = pins;
|
||||
break;
|
||||
case GPIO_FLAG_PERIPHB:
|
||||
PIO_ABSR(port) |= pins;
|
||||
PIO_PDR(port) = pins;
|
||||
}
|
||||
|
||||
if (flags & GPIO_FLAG_OPEN_DRAIN)
|
||||
PIO_MDER(port) = pins;
|
||||
else
|
||||
PIO_MDDR(port) = pins;
|
||||
|
||||
if (flags & GPIO_FLAG_PULL_UP)
|
||||
PIO_PUER(port) = pins;
|
||||
else
|
||||
PIO_PUDR(port) = pins;
|
||||
}
|
||||
|
||||
void gpio_toggle(u32 gpioport, u32 gpios)
|
||||
{
|
||||
u32 odsr = PIO_ODSR(gpioport);
|
||||
|
Loading…
x
Reference in New Issue
Block a user