boards/arm/stm32f7/nucleo-f767zi: enhance button support

Before this patch, the board nucleo-767zi had just one button available for the
user, which one was not working (there was no /dev/buttons on stm32_bringup.c).

Aditionally, I have changed the stm32_buttons.c to support not only the
built-in button but as well as to another four external buttons.
This commit is contained in:
vrmay23 2025-05-03 14:52:08 +02:00 committed by Alan C. Assis
parent 95cc862794
commit e086ef2d02
4 changed files with 145 additions and 19 deletions

View file

@ -312,14 +312,45 @@
/* Button definitions *******************************************************/
/* The STM32F7 Discovery supports one button: Pushbutton B1, labeled "User",
* is connected to GPIO PI11.
* A high value will be sensed when the button is depressed.
/* The STM32F7 Discovery has just one user_button natively, which one is
* connected to GPIO PC13. This button, in this context, named as BUILT_IN,
* is connected in a pulldown resistor. Thus, when it changes from default
* value (LOW) to HIGH value, it is considered as 'pressed'.
*
* Plus, we can use the same strategy like in stm32103-minimun (bluepill) to
* provide more freedom to the users. Hence, four additional buttons will be
* available now and, then, five buttons can be directly handled.
*
* Please, make sure to also use your external buttons with a pulldown
* resistor as well, otherwise it will not work as expected.
*
* For this example we'll use the availables pin at ST Zio connector CN10,
* as listed below:
*
* -------------------|----------|------------|-----------------
* button_name | pin_name | pin_number | stm32_gpio_pin
* -------------------|----------|------------|-----------------
* BUTTON_EXTERN_1 | D2 | 12 | PF_15
* BUTTON_EXTERN_2 | D1 | 14 | PG_14
* BUTTON_EXTERN_3 | D0 | 16 | PG_9
* BUTTON_EXTERN_4 | D34 | 33 | PE_0
* -------------------------------------------------------------
*
*/
#define BUTTON_USER 0
#define NUM_BUTTONS 1
#define BUTTON_USER_BIT (1 << BUTTON_USER)
#define BUTTON_BUILT_IN 0
#define BUTTON_EXTERN_1 1
#define BUTTON_EXTERN_2 2
#define BUTTON_EXTERN_3 3
#define BUTTON_EXTERN_4 4
#define BUTTON_BUILT_IN_BIT (1 << BUTTON_BUILT_IN)
#define BUTTON_EXTERN_1_BIT (1 << BUTTON_EXTERN_1)
#define BUTTON_EXTERN_2_BIT (1 << BUTTON_EXTERN_2)
#define BUTTON_EXTERN_3_BIT (1 << BUTTON_EXTERN_3)
#define BUTTON_EXTERN_4_BIT (1 << BUTTON_EXTERN_4)
#define NUM_BUTTONS 5
/* DMA channels *************************************************************/

View file

@ -56,12 +56,14 @@
* The following definitions assume the default Solder Bridges are installed.
*/
#define GPIO_LD1 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_CLEAR | \
GPIO_PORTB | GPIO_PIN0)
#define GPIO_LD2 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_CLEAR | \
GPIO_PORTB | GPIO_PIN7)
#define GPIO_LD3 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_CLEAR | \
GPIO_PORTB | GPIO_PIN14)
#define GPIO_LD1 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | \
GPIO_OUTPUT_CLEAR | GPIO_PORTB | GPIO_PIN0)
#define GPIO_LD2 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | \
GPIO_OUTPUT_CLEAR | GPIO_PORTB | GPIO_PIN7)
#define GPIO_LD3 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | \
GPIO_OUTPUT_CLEAR | GPIO_PORTB | GPIO_PIN14)
#define GPIO_LED_GREEN GPIO_LD1
#define GPIO_LED_BLUE GPIO_LD2
@ -72,6 +74,11 @@
/* BUTTONS
*
* The Blue pushbutton B1, labeled "User", is connected to GPIO PC13.
* On this context, this button is called 'GPIO_BTN_BUILT_IN'.
*
* The other buttons (GPIO_BNT_EXERN_X) are the external buttons already
* available for the user.
*
* A high value will be sensed when the button is depressed.
* Note:
* 1) That the EXTI is included in the definition to enable an interrupt
@ -80,7 +87,26 @@
* installed.
*/
#define GPIO_BTN_USER (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | GPIO_PORTC | GPIO_PIN13)
#define GPIO_BTN_BUILT_IN (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | \
GPIO_PORTC | GPIO_PIN13)
#define GPIO_BTN_EXTERN_1 (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | \
GPIO_PORTF | GPIO_PIN15)
#define GPIO_BTN_EXTERN_2 (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | \
GPIO_PORTG | GPIO_PIN14)
#define GPIO_BTN_EXTERN_3 (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | \
GPIO_PORTG | GPIO_PIN9)
#define GPIO_BTN_EXTERN_4 (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | \
GPIO_PORTE | GPIO_PIN0)
#define MIN_IRQBUTTON BUTTON_BUILT_IN
#define MAX_IRQBUTTON BUTTON_EXTERN_4
#define NUM_IRQBUTTONS (MIN_IRQBUTTON - MAX_IRQBUTTON + 1)
#define BUTTONS_DRIVER_PATH "/dev/buttons"
/* SPI **********************************************************************/
@ -278,7 +304,7 @@ int stm32_sdio_initialize(void);
* Name: stm32_usbinitialize
*
* Description:
* Called from stm32_usbinitialize very early in inialization to setup
* Called from stm32_usbinitialize very early in initialization to setup
* USB-related GPIO pins for the nucleo-f767zi board.
*
****************************************************************************/

View file

@ -60,6 +60,10 @@
# include <semaphore.h>
#endif
#ifdef CONFIG_INPUT_BUTTONS
# include <nuttx/input/buttons.h>
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -81,6 +85,17 @@
int stm32_bringup(void)
{
int ret;
#ifdef CONFIG_INPUT_BUTTONS
/* Register the BUTTON driver */
ret = btn_lower_initialize("/dev/buttons");
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret);
}
#endif
#ifdef CONFIG_I2C
int i2c_bus;
struct i2c_master_s *i2c;

View file

@ -39,6 +39,28 @@
#ifdef CONFIG_ARCH_BUTTONS
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#if defined(CONFIG_INPUT_BUTTONS) && !defined(CONFIG_ARCH_IRQBUTTONS)
# error "The NuttX Buttons Driver depends on IRQ support to work!\n"
#endif
/****************************************************************************
* Private Functions
****************************************************************************/
/* Pin configuration for each STM32F3Discovery button. This array is indexed
* by the BUTTON_* definitions in board.h
*/
static const uint32_t g_buttons[NUM_BUTTONS] =
{
GPIO_BTN_BUILT_IN, GPIO_BTN_EXTERN_1, GPIO_BTN_EXTERN_2, GPIO_BTN_EXTERN_3,
GPIO_BTN_EXTERN_4
};
/****************************************************************************
* Public Functions
****************************************************************************/
@ -56,7 +78,17 @@
uint32_t board_button_initialize(void)
{
stm32_configgpio(GPIO_BTN_USER);
int i;
/* Configure the GPIO pins as inputs. NOTE that EXTI interrupts are
* configured for all pins.
*/
for (i = 0; i < NUM_BUTTONS; i++)
{
stm32_configgpio(g_buttons[i]);
}
return NUM_BUTTONS;
}
@ -66,7 +98,26 @@ uint32_t board_button_initialize(void)
uint32_t board_buttons(void)
{
return stm32_gpioread(GPIO_BTN_USER) ? 1 : 0;
uint32_t ret = 0;
int i;
/* Check that state of each key */
for (i = 0; i < NUM_BUTTONS; i++)
{
/* A LOW value means that the key is pressed. */
bool released = stm32_gpioread(g_buttons[i]);
/* Accumulate the set of depressed (released) keys */
if (released)
{
ret |= (1 << i);
}
}
return ret;
}
/****************************************************************************
@ -96,13 +147,16 @@ int board_button_irq(int id, xcpt_t irqhandler, void *arg)
{
int ret = -EINVAL;
if (id == BUTTON_USER)
/* The following should be atomic */
if (id >= MIN_IRQBUTTON && id <= MAX_IRQBUTTON)
{
ret = stm32_gpiosetevent(GPIO_BTN_USER, true, true, true,
irqhandler, arg);
ret = stm32_gpiosetevent(g_buttons[id], true, true, true, irqhandler,
arg);
}
return ret;
}
#endif
#endif /* CONFIG_ARCH_BUTTONS */