Button
Downstream Copy!
This sample is a copy from Zephyr with identical name and will be used for further development, improvement and preparation of changes for Zephyr within Bridle. However, the original sample still lives within the Zephyr namespace under the exactly same name: Button.
Overview
A simple button demo showcasing the use of GPIO input using a dedicated polling thread, spawned by an init function. Alternatively, it can be configured to use interrupts instead. In either mode, pressing the button will light up an led.
Requirements
The board hardware must have a push button connected via a GPIO pin. These are called “User buttons” on many of Zephyr’s Supported Boards and Shields and Bridle’s Supported Boards.
The button must be configured using the sw0
devicetree alias, usually in the
BOARD.dts file. You will see this error
if you try to build this sample for an unsupported board:
Unsupported board:sw0
devicetree alias is not defined
You may see additional build errors if the sw0
alias exists, but is not
properly defined.
Additionally, the sample requires the led0
devicetree alias.
Devicetree details
This section provides more details on devicetree configuration.
Here is a minimal devicetree fragment which supports this sample, containing
both an sw0
and an led0
alias:
/ { aliases { sw0 = &user_button; led0 = &user_lamp; }; soc { gpio0: gpio@0 { status = "okay"; gpio-controller; #gpio-cells = <2>; /* ... */ }; }; buttons { compatible = "gpio-keys"; user_button: gpio0_button { gpios = <__GPIO_CTRL_NODE__ __PIN__ __FLAGS__>; label = "User button"; }; /* ... other buttons ... */ }; leds { compatible = "gpio-leds"; user_lamp: gpio0_led { gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>; label = "User LD1"; }; /* ... other leds ... */ };
As shown:
the
sw0 = &user_button;
devicetree alias must point to a child node of a node with agpio-keys
compatible, andthe
led0 = &user_lamp;
devicetree alias must point to a child node of one with agpio-leds
compatible.
The above situation is for the common case where:
__GPIO_CTRL_NODE__
should be a reference to a node label of class GPIO controller, e.g. in nodeuser_lamp: gpio0_led {/* … */};
the referencegpios = <&gpio0 /* … */>
uses the example node labelgpio0:
and points to the given GPIO controller__PIN__
should be a pin number, like8
or0
, seeuser_lamp:
for an example__FLAGS__
should be a logical OR of GPIO configuration flags meant to apply to the button, such as(GPIO_PULL_UP | GPIO_ACTIVE_LOW)
, seeuser_lamp:
for an example
Required devicetree bindings:
This assumes the common case, where is #gpio-cells = <2>
in the
gpio0:
node, and that the GPIO controller’s devicetree
binding declares those two cells pin
and flags
in gpio-cells
like so:
properties: "#gpio-cells": type: int required: true const: 2 gpio-cells: - pin - flags
This sample requires a pin
cell in the gpios
property. The
flags
cell is optional, however, and the sample still works if the
GPIO cells do not contain flags
. This assumes the common case, where
the gpios = <&gpio0 /* … */>
property in the user_button:
and
user_lamp:
child nodes reflects an GPIO keys and leds
devicetree binding similar like so:
child-binding: properties: gpios: type: phandle-array required: true
Building and Running
This sample can be built for multiple boards, in this example we will build it for the Nucleo F413ZH board:
polling thread
west build -b nucleo_f413zh -p -d build/nucleo_f413zh-button-poll bridle/samples/button -- -DCONF_FILE=prj-poll.conf west flash -d build/nucleo_f413zh-button-poll
interrupt callback
west build -b nucleo_f413zh -p -d build/nucleo_f413zh-button-event bridle/samples/button -- -DCONF_FILE=prj-event.conf west flash -d build/nucleo_f413zh-button-event
During startup, an init function look up predefined GPIO devices, and configures their pins in input and output mode, respectively. Depending on the build configuration, an additional init function either spawns a dedicated polling thread which continuously monitors the button state and adjusts the led state to match, or sets up an interrupt that does the same whenever the button is pressed or released.