sam3x: Add gpio_init convenience function.
This commit is contained in:
parent
f311966f09
commit
614e26a3b1
@ -22,6 +22,19 @@
|
|||||||
|
|
||||||
#include <libopencm3/sam3x/pio.h>
|
#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)
|
static inline void gpio_set(u32 gpioport, u32 gpios)
|
||||||
{
|
{
|
||||||
PIO_SODR(gpioport) = gpios;
|
PIO_SODR(gpioport) = gpios;
|
||||||
|
@ -19,6 +19,40 @@
|
|||||||
|
|
||||||
#include <libopencm3/sam3x/gpio.h>
|
#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)
|
void gpio_toggle(u32 gpioport, u32 gpios)
|
||||||
{
|
{
|
||||||
u32 odsr = PIO_ODSR(gpioport);
|
u32 odsr = PIO_ODSR(gpioport);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user