diff --git a/boards/xtensa/esp32/esp32-wrover-kit/include/board.h b/boards/xtensa/esp32/esp32-wrover-kit/include/board.h index f12dcec9eab..e5f083bbb8a 100644 --- a/boards/xtensa/esp32/esp32-wrover-kit/include/board.h +++ b/boards/xtensa/esp32/esp32-wrover-kit/include/board.h @@ -107,7 +107,8 @@ /* GPIO pins used by the GPIO Subsystem */ -#define BOARD_NGPIOOUT 3 /* Amount of GPIO Output pins */ +#define BOARD_NGPIOIN 1 /* Amount of GPIO Input pins */ +#define BOARD_NGPIOOUT 1 /* Amount of GPIO Output pins */ #define BOARD_NGPIOINT 1 /* Amount of GPIO Input w/ Interruption pins */ #endif /* __BOARDS_XTENSA_ESP32_ESP32_WROVER_KIT_INCLUDE_BOARD_H */ diff --git a/boards/xtensa/esp32/esp32-wrover-kit/src/esp32_gpio.c b/boards/xtensa/esp32/esp32-wrover-kit/src/esp32_gpio.c index 748526af1d9..0453dc14b1f 100644 --- a/boards/xtensa/esp32/esp32-wrover-kit/src/esp32_gpio.c +++ b/boards/xtensa/esp32/esp32-wrover-kit/src/esp32_gpio.c @@ -48,11 +48,23 @@ # error "NGPIOINT is > 0 and GPIO interrupts aren't enabled" #endif +/* Output pins. GPIO16 is used as an example, any other outputs could be + * used. + */ + +#define GPIO_OUT1 16 + +/* Input pins. GPIO17 is used as an example, any other inputs could be + * used. + */ + +#define GPIO_IN1 17 + /* Interrupt pins. GPIO22 is used as an example, any other inputs could be * used. */ -#define GPIO_IRQPIN 22 +#define GPIO_IRQPIN1 22 /**************************************************************************** * Private Types @@ -79,6 +91,10 @@ static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value); static int gpout_write(FAR struct gpio_dev_s *dev, bool value); #endif +#if BOARD_NGPIOIN > 0 +static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value); +#endif + #if BOARD_NGPIOINT > 0 static int gpint_read(FAR struct gpio_dev_s *dev, FAR bool *value); static int gpint_attach(FAR struct gpio_dev_s *dev, @@ -103,12 +119,31 @@ static const struct gpio_operations_s gpout_ops = static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] = { - GPIO_LED1, GPIO_LED2, GPIO_LED3 + GPIO_OUT1 }; static struct esp32gpio_dev_s g_gpout[BOARD_NGPIOOUT]; #endif +#if BOARD_NGPIOIN > 0 +static const struct gpio_operations_s gpin_ops = +{ + .go_read = gpin_read, + .go_write = NULL, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as INTERRUPT INPUTS */ + +static const uint32_t g_gpioinputs[BOARD_NGPIOIN] = +{ + GPIO_IN1 +}; + +static struct esp32gpio_dev_s g_gpin[BOARD_NGPIOIN]; +#endif + #if BOARD_NGPIOINT > 0 static const struct gpio_operations_s gpint_ops = { @@ -122,7 +157,7 @@ static const struct gpio_operations_s gpint_ops = static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] = { - GPIO_IRQPIN, + GPIO_IRQPIN1, }; static struct esp32gpint_dev_s g_gpint[BOARD_NGPIOINT]; @@ -166,6 +201,24 @@ static int gpout_write(FAR struct gpio_dev_s *dev, bool value) } #endif +/**************************************************************************** + * Name: gpin_read + ****************************************************************************/ + +#if BOARD_NGPIOIN > 0 +static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value) +{ + FAR struct esp32gpio_dev_s *esp32gpio = (FAR struct esp32gpio_dev_s *)dev; + + DEBUGASSERT(esp32gpio != NULL && value != NULL); + DEBUGASSERT(esp32gpio->id < BOARD_NGPIOIN); + gpioinfo("Reading... pin %d\n", g_gpioinputs[esp32gpio->id]); + + *value = esp32_gpioread(g_gpioinputs[esp32gpio->id]); + return OK; +} +#endif + /**************************************************************************** * Name: esp32gpio_interrupt ****************************************************************************/ @@ -296,6 +349,28 @@ int esp32_gpio_init(void) } #endif + pincount = 0; + +#if BOARD_NGPIOIN > 0 + for (i = 0; i < BOARD_NGPIOIN; i++) + { + /* Setup and register the GPIO pin */ + + g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN; + g_gpin[i].gpio.gp_ops = &gpin_ops; + g_gpin[i].id = i; + gpio_pin_register(&g_gpin[i].gpio, pincount); + + /* Configure the pins that will be used as INPUT */ + + esp32_configgpio(g_gpioinputs[i], INPUT_FUNCTION_3); + + pincount++; + } +#endif + + pincount = 0; + #if BOARD_NGPIOINT > 0 for (i = 0; i < BOARD_NGPIOINT; i++) {