Linux preempt-rt

Check our new training course

Real-Time Linux with PREEMPT_RT

Check our new training course
with Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
 *
 * Copyright (c) 2018 Vikrant More
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <drivers/gpio.h>

#include "app_gpio.h"
#include "publisher.h"

const struct device *led_device[4];
const struct device *button_device[4];

K_WORK_DEFINE(button_work, publish);

static void button_pressed(const struct device *dev,
			   struct gpio_callback *cb, uint32_t pins)
{
	k_work_submit(&button_work);
}

#define LED0_NODE DT_ALIAS(led0)
#define LED1_NODE DT_ALIAS(led1)
#define LED2_NODE DT_ALIAS(led2)
#define LED3_NODE DT_ALIAS(led3)

#define SW0_NODE DT_ALIAS(sw0)
#define SW1_NODE DT_ALIAS(sw1)
#define SW2_NODE DT_ALIAS(sw2)
#define SW3_NODE DT_ALIAS(sw3)

void app_gpio_init(void)
{
	static struct gpio_callback button_cb[4];

	/* LEDs configuration & setting */

	led_device[0] = device_get_binding(DT_GPIO_LABEL(LED0_NODE, gpios));
	gpio_pin_configure(led_device[0], DT_GPIO_PIN(LED0_NODE, gpios),
			   DT_GPIO_FLAGS(LED0_NODE, gpios) |
			   GPIO_OUTPUT_INACTIVE);

#ifndef ONE_LED_ONE_BUTTON_BOARD
	led_device[1] = device_get_binding(DT_GPIO_LABEL(LED1_NODE, gpios));
	gpio_pin_configure(led_device[1], DT_GPIO_PIN(LED1_NODE, gpios),
			   DT_GPIO_FLAGS(LED1_NODE, gpios) |
			   GPIO_OUTPUT_INACTIVE);

	led_device[2] = device_get_binding(DT_GPIO_LABEL(LED2_NODE, gpios));
	gpio_pin_configure(led_device[2], DT_GPIO_PIN(LED2_NODE, gpios),
			   DT_GPIO_FLAGS(LED2_NODE, gpios) |
			   GPIO_OUTPUT_INACTIVE);

	led_device[3] = device_get_binding(DT_GPIO_LABEL(LED3_NODE, gpios));
	gpio_pin_configure(led_device[3], DT_GPIO_PIN(LED3_NODE, gpios),
			   DT_GPIO_FLAGS(LED3_NODE, gpios) |
			   GPIO_OUTPUT_INACTIVE);
#endif
	/* Buttons configuration & setting */

	k_work_init(&button_work, publish);

	button_device[0] = device_get_binding(DT_GPIO_LABEL(SW0_NODE, gpios));
	gpio_pin_configure(button_device[0], DT_GPIO_PIN(SW0_NODE, gpios),
			   GPIO_INPUT | GPIO_INT_DEBOUNCE |
			   DT_GPIO_FLAGS(SW0_NODE, gpios));
	gpio_pin_interrupt_configure(button_device[0],
				     DT_GPIO_PIN(SW0_NODE, gpios),
				     GPIO_INT_EDGE_TO_ACTIVE);
	gpio_init_callback(&button_cb[0], button_pressed,
			   BIT(DT_GPIO_PIN(SW0_NODE, gpios)));
	gpio_add_callback(button_device[0], &button_cb[0]);

#ifndef ONE_LED_ONE_BUTTON_BOARD
	button_device[1] = device_get_binding(DT_GPIO_LABEL(SW1_NODE, gpios));
	gpio_pin_configure(button_device[1], DT_GPIO_PIN(SW1_NODE, gpios),
			   GPIO_INPUT | GPIO_INT_DEBOUNCE |
			   DT_GPIO_FLAGS(SW1_NODE, gpios));
	gpio_pin_interrupt_configure(button_device[1],
				     DT_GPIO_PIN(SW1_NODE, gpios),
				     GPIO_INT_EDGE_TO_ACTIVE);
	gpio_init_callback(&button_cb[1], button_pressed,
			   BIT(DT_GPIO_PIN(SW1_NODE, gpios)));
	gpio_add_callback(button_device[1], &button_cb[1]);

	button_device[2] = device_get_binding(DT_GPIO_LABEL(SW2_NODE, gpios));
	gpio_pin_configure(button_device[2], DT_GPIO_PIN(SW2_NODE, gpios),
			   GPIO_INPUT | GPIO_INT_DEBOUNCE |
			   DT_GPIO_FLAGS(SW2_NODE, gpios));
	gpio_pin_interrupt_configure(button_device[2],
				     DT_GPIO_PIN(SW2_NODE, gpios),
				     GPIO_INT_EDGE_TO_ACTIVE);
	gpio_init_callback(&button_cb[2], button_pressed,
			   BIT(DT_GPIO_PIN(SW2_NODE, gpios)));
	gpio_add_callback(button_device[2], &button_cb[2]);

	button_device[3] = device_get_binding(DT_GPIO_LABEL(SW3_NODE, gpios));
	gpio_pin_configure(button_device[3], DT_GPIO_PIN(SW3_NODE, gpios),
			   GPIO_INPUT | GPIO_INT_DEBOUNCE |
			   DT_GPIO_FLAGS(SW3_NODE, gpios));
	gpio_pin_interrupt_configure(button_device[3],
				     DT_GPIO_PIN(SW3_NODE, gpios),
				     GPIO_INT_EDGE_TO_ACTIVE);
	gpio_init_callback(&button_cb[3], button_pressed,
			   BIT(DT_GPIO_PIN(SW3_NODE, gpios)));
	gpio_add_callback(button_device[3], &button_cb[3]);
#endif
}