static int lpc17_configalternate(lpc17_pinset_t cfgset, unsigned int port, unsigned int pin, uint32_t alt) { /* First, configure the port as an input so that we have a known * starting point and consistent behavior during the re-configuration. */ (void)lpc17_configinput(DEFAULT_INPUT, port, pin); /* Set up PINSEL registers */ /* Configure as GPIO */ lpc17_pinsel(port, pin, alt); /* Set pull-up mode */ lpc17_pullup(cfgset, port, pin); /* Check for open drain output */ if ((cfgset & GPIO_OPEN_DRAIN) != 0) { /* Select open drain output */ lpc17_setopendrain(port, pin); } return OK; }
int lpc17_configgpio(lpc17_pinset_t cfgset) { unsigned int port; unsigned int pin; int ret = -EINVAL; /* Verify that this hardware supports the select GPIO port */ port = (cfgset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; if (port < GPIO_NPORTS) { /* Get the pin number and select the port configuration register for that pin */ pin = (cfgset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; /* Handle according to pin function */ switch (cfgset & GPIO_FUNC_MASK) { case GPIO_INPUT: /* GPIO input pin */ ret = lpc17_configinput(cfgset, port, pin); break; case GPIO_INTFE: /* GPIO interrupt falling edge */ case GPIO_INTRE: /* GPIO interrupt rising edge */ case GPIO_INTBOTH: /* GPIO interrupt both edges */ ret = lpc17_configinterrupt(cfgset, port, pin); break; case GPIO_OUTPUT: /* GPIO outpout pin */ ret = lpc17_configoutput(cfgset, port, pin); break; case GPIO_ALT1: /* Alternate function 1 */ ret = lpc17_configalternate(cfgset, port, pin, PINCONN_PINSEL_ALT1); break; case GPIO_ALT2: /* Alternate function 2 */ ret = lpc17_configalternate(cfgset, port, pin, PINCONN_PINSEL_ALT2); break; case GPIO_ALT3: /* Alternate function 3 */ ret = lpc17_configalternate(cfgset, port, pin, PINCONN_PINSEL_ALT3); break; default: break; } }
static inline int lpc17_configinterrupt(lpc17_pinset_t cfgset, unsigned int port, unsigned int pin) { /* First, configure the port as a generic input so that we have a known * starting point and consistent behavior during the re-configuration. */ (void)lpc17_configinput(cfgset, port, pin); /* Then just remember the rising/falling edge interrupt enabled */ DEBUGASSERT(port == 0 || port == 2); #ifdef CONFIG_GPIO_IRQ lpc17_setintedge(port, pin, (cfgset & GPIO_EDGE_MASK) >> GPIO_EDGE_SHIFT); #endif return OK; }
static inline int lpc17_configoutput(lpc17_pinset_t cfgset, unsigned int port, unsigned int pin) { uint32_t fiobase; uint32_t regval; /* First, configure the port as a generic input so that we have a known * starting point and consistent behavior during the re-configuration. */ (void)lpc17_configinput(DEFAULT_INPUT, port, pin); /* Check for open drain output */ if ((cfgset & GPIO_OPEN_DRAIN) != 0) { /* Set pull-up mode. This normally only applies to input pins, but does have * meaning if the port is an open drain output. */ lpc17_pullup(cfgset, port, pin); /* Select open drain output */ lpc17_setopendrain(port, pin); } /* Set the initial value of the output */ lpc17_gpiowrite(cfgset, ((cfgset & GPIO_VALUE) != GPIO_VALUE_ZERO)); /* Now, reconfigure the pin as an output */ fiobase = g_fiobase[port]; regval = getreg32(fiobase + LPC17_FIO_DIR_OFFSET); regval |= (1 << pin); putreg32(regval, fiobase + LPC17_FIO_DIR_OFFSET); return OK; }