|
|
@ -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); |
|
|
|