samples: button: update to use new GPIO API

Update gpio_pin_configure() to take into account GPIO flags defined by
the devicetree. Use gpio_pin_get/gpio_pin_set to verify reading/writing
of logical pin values. Use gpio_pin_interrupt_configure() to configure
interrupts.

Signed-off-by: Piotr Mienkowski <piotr.mienkowski@gmail.com>
This commit is contained in:
Piotr Mienkowski 2019-06-03 12:29:18 +02:00 committed by Carles Cufí
parent ebc5bc62b0
commit 951f91071a

View file

@ -11,79 +11,83 @@
#include <sys/printk.h>
#include <inttypes.h>
/* change this to use another GPIO port */
#ifndef DT_ALIAS_SW0_GPIOS_CONTROLLER
#ifdef SW0_GPIO_NAME
#define DT_ALIAS_SW0_GPIOS_CONTROLLER SW0_GPIO_NAME
#else
#error SW0_GPIO_NAME or DT_ALIAS_SW0_GPIOS_CONTROLLER needs to be set in board.h
#endif
#endif
#define PORT DT_ALIAS_SW0_GPIOS_CONTROLLER
#define SLEEP_TIME_MS 1
/* change this to use another GPIO pin */
#ifdef DT_ALIAS_SW0_GPIOS_PIN
#define PIN DT_ALIAS_SW0_GPIOS_PIN
#else
#error DT_ALIAS_SW0_GPIOS_PIN needs to be set in board.h
#endif
/* change to use another GPIO pin interrupt config */
#ifdef DT_ALIAS_SW0_GPIOS_FLAGS
#define EDGE (DT_ALIAS_SW0_GPIOS_FLAGS | GPIO_INT_EDGE)
#else
/*
* If DT_ALIAS_SW0_GPIOS_FLAGS not defined used default EDGE value.
* Change this to use a different interrupt trigger
*/
#define EDGE (GPIO_INT_EDGE | GPIO_INT_ACTIVE_LOW)
#endif
/* change this to enable pull-up/pull-down */
#ifndef DT_ALIAS_SW0_GPIOS_FLAGS
#ifdef DT_ALIAS_SW0_GPIOS_PIN_PUD
#define DT_ALIAS_SW0_GPIOS_FLAGS DT_ALIAS_SW0_GPIOS_PIN_PUD
#else
#define DT_ALIAS_SW0_GPIOS_FLAGS 0
#endif
#ifndef DT_ALIAS_LED0_GPIOS_FLAGS
#define DT_ALIAS_LED0_GPIOS_FLAGS 0
#endif
#define PULL_UP DT_ALIAS_SW0_GPIOS_FLAGS
/* Sleep time */
#define SLEEP_TIME 500
void button_pressed(struct device *gpiob, struct gpio_callback *cb,
void button_pressed(struct device *dev, struct gpio_callback *cb,
u32_t pins)
{
printk("Button pressed at %" PRIu32 "\n", k_cycle_get_32());
}
static struct gpio_callback gpio_cb;
static struct gpio_callback button_cb_data;
void main(void)
{
struct device *gpiob;
struct device *dev_button;
int ret;
printk("Press the user defined button on the board\n");
gpiob = device_get_binding(PORT);
if (!gpiob) {
printk("error\n");
dev_button = device_get_binding(DT_ALIAS_SW0_GPIOS_CONTROLLER);
if (dev_button == NULL) {
printk("Error: didn't find %s device\n",
DT_ALIAS_SW0_GPIOS_CONTROLLER);
return;
}
gpio_pin_configure(gpiob, PIN,
GPIO_DIR_IN | GPIO_INT | PULL_UP | EDGE);
ret = gpio_pin_configure(dev_button, DT_ALIAS_SW0_GPIOS_PIN,
DT_ALIAS_SW0_GPIOS_FLAGS | GPIO_INPUT);
if (ret != 0) {
printk("Error %d: failed to configure pin %d '%s'\n",
ret, DT_ALIAS_SW0_GPIOS_PIN, DT_ALIAS_SW0_LABEL);
return;
}
gpio_init_callback(&gpio_cb, button_pressed, BIT(PIN));
ret = gpio_pin_interrupt_configure(dev_button, DT_ALIAS_SW0_GPIOS_PIN,
GPIO_INT_EDGE_TO_ACTIVE);
if (ret != 0) {
printk("Error %d: failed to configure interrupt on pin %d '%s'\n",
ret, DT_ALIAS_SW0_GPIOS_PIN, DT_ALIAS_SW0_LABEL);
return;
}
gpio_add_callback(gpiob, &gpio_cb);
gpio_pin_enable_callback(gpiob, PIN);
gpio_init_callback(&button_cb_data, button_pressed,
BIT(DT_ALIAS_SW0_GPIOS_PIN));
gpio_add_callback(dev_button, &button_cb_data);
#ifdef DT_ALIAS_LED0_GPIOS_CONTROLLER
struct device *dev_led;
dev_led = device_get_binding(DT_ALIAS_LED0_GPIOS_CONTROLLER);
if (dev_led == NULL) {
printk("Error: didn't find %s device\n",
DT_ALIAS_LED0_GPIOS_CONTROLLER);
return;
}
ret = gpio_pin_configure(dev_led, DT_ALIAS_LED0_GPIOS_PIN,
DT_ALIAS_LED0_GPIOS_FLAGS | GPIO_OUTPUT);
if (ret != 0) {
printk("Error %d: failed to configure pin %d '%s'\n",
ret, DT_ALIAS_LED0_GPIOS_PIN, DT_ALIAS_LED0_LABEL);
return;
}
#endif
printk("Press %s on the board\n", DT_ALIAS_SW0_LABEL);
while (1) {
u32_t val = 0U;
#ifdef DT_ALIAS_LED0_GPIOS_CONTROLLER
bool val;
gpio_pin_read(gpiob, PIN, &val);
k_sleep(SLEEP_TIME);
val = gpio_pin_get(dev_button, DT_ALIAS_SW0_GPIOS_PIN);
gpio_pin_set(dev_led, DT_ALIAS_LED0_GPIOS_PIN, val);
k_sleep(SLEEP_TIME_MS);
#endif
}
}