blob: 8cc2d232bf0ea479bb92f4b816e8d583caaff435 [file] [log] [blame]
/* board.c - Generic HW interaction hooks */
/*
* Copyright (c) 2021 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <bluetooth/mesh.h>
#include <drivers/gpio.h>
#include "board.h"
/* Locate led0 as alias or label by that name */
#if DT_NODE_EXISTS(DT_ALIAS(led0))
#define LED0 DT_ALIAS(led0)
#elif DT_NODE_EXISTS(DT_NODELABEL(led0))
#define LED0 DT_NODELABEL(led0)
#else
#define LED0 DT_INVALID_NODE
#endif
/* Locate button0 as alias or label by sw0 or button0 */
#if DT_NODE_EXISTS(DT_ALIAS(sw0))
#define BUTTON0 DT_ALIAS(sw0)
#elif DT_NODE_EXISTS(DT_ALIAS(button0))
#define BUTTON0 DT_ALIAS(button0)
#elif DT_NODE_EXISTS(DT_NODELABEL(sw0))
#define BUTTON0 DT_NODELABEL(sw0)
#elif DT_NODE_EXISTS(DT_NODELABEL(button0))
#define BUTTON0 DT_NODELABEL(button0)
#else
#define BUTTON0 DT_INVALID_NODE
#endif
#if DT_NODE_EXISTS(LED0)
#define LED0_DEV DT_PHANDLE(LED0, gpios)
#define LED0_PIN DT_PHA(LED0, gpios, pin)
#define LED0_FLAGS DT_PHA(LED0, gpios, flags)
static const struct device *led_dev = DEVICE_DT_GET(LED0_DEV);
#endif /* LED0 */
#if DT_NODE_EXISTS(BUTTON0)
#define BUTTON0_DEV DT_PHANDLE(BUTTON0, gpios)
#define BUTTON0_PIN DT_PHA(BUTTON0, gpios, pin)
#define BUTTON0_FLAGS DT_PHA(BUTTON0, gpios, flags)
static const struct device *button_dev = DEVICE_DT_GET(BUTTON0_DEV);
static struct k_work *button_work;
static void button_cb(const struct device *port, struct gpio_callback *cb,
gpio_port_pins_t pins)
{
k_work_submit(button_work);
}
#endif /* BUTTON0 */
static int led_init(void)
{
#if DT_NODE_EXISTS(LED0)
int err;
if (!device_is_ready(led_dev)) {
return -ENODEV;
}
err = gpio_pin_configure(led_dev, LED0_PIN,
LED0_FLAGS | GPIO_OUTPUT_INACTIVE);
if (err) {
return err;
}
#else
printk("WARNING: LEDs not supported on this board.\n");
#endif
return 0;
}
static int button_init(struct k_work *button_pressed)
{
#if DT_NODE_EXISTS(BUTTON0)
int err;
err = gpio_pin_configure(button_dev, BUTTON0_PIN,
BUTTON0_FLAGS | GPIO_INPUT);
if (err) {
return err;
}
static struct gpio_callback gpio_cb;
err = gpio_pin_interrupt_configure(button_dev, BUTTON0_PIN,
GPIO_INT_EDGE_TO_ACTIVE);
if (err) {
return err;
}
button_work = button_pressed;
gpio_init_callback(&gpio_cb, button_cb, BIT(BUTTON0_PIN));
gpio_add_callback(button_dev, &gpio_cb);
#else
printk("WARNING: Buttons not supported on this board.\n");
#endif
return 0;
}
int board_init(struct k_work *button_pressed)
{
int err;
err = led_init();
if (err) {
return err;
}
return button_init(button_pressed);
}
void board_led_set(bool val)
{
#if DT_NODE_EXISTS(LED0)
gpio_pin_set(led_dev, LED0_PIN, val);
#endif
}
void board_output_number(bt_mesh_output_action_t action, uint32_t number)
{
}
void board_prov_complete(void)
{
}