13
#include <kernel/irq.h>
14
#include <drivers/input/input_dev.h>
16
#include <drivers/gpio/gpio.h>
18
#include <embox/unit.h>
19
#include <framework/mod/options.h>
22
EMBOX_UNIT_INIT(stm32cube_bt_init);
24
#define USER_BUTTON_PORT OPTION_GET(NUMBER,pin_port)
25
#define USER_BUTTON_PIN_MASK (1 << OPTION_GET(NUMBER,pin_num))
27
struct stm32cube_bt_indev {
28
struct input_dev input_dev;
31
static struct stm32cube_bt_indev stm32cube_bt_dev;
33
static void stm32cube_bt_irq_hnd(void *data) {
34
struct input_dev *dev;
36
struct input_event ev;
38
dev = &((struct stm32cube_bt_indev *)data)->input_dev;
40
status = gpio_get(USER_BUTTON_PORT, USER_BUTTON_PIN_MASK);
42
ev.type = USER_BUTTON_PRESSED;
45
ev.type = USER_BUTTON_UNPRESSED;
46
log_debug("unpressed");
50
input_dev_report_event(dev, &ev);
53
static int stm32cube_bt_start(struct input_dev *dev) {
54
gpio_setup_mode(USER_BUTTON_PORT, USER_BUTTON_PIN_MASK, GPIO_MODE_INT_MODE_RISING_FALLING);
55
if (0 > gpio_irq_attach(USER_BUTTON_PORT, USER_BUTTON_PIN_MASK, stm32cube_bt_irq_hnd, &stm32cube_bt_dev)) {
56
log_error("Failed to attach IRQ handler");
65
static const struct input_dev_ops stm32cube_bt_input_ops = {
69
static struct stm32cube_bt_indev stm32cube_bt_dev = {
71
.ops = &stm32cube_bt_input_ops,
73
.type = INPUT_DEV_BUTTON,
77
static int stm32cube_bt_init(void) {
80
ret = input_dev_register(&stm32cube_bt_dev.input_dev);
82
log_error("input_dev_register failed");
85
stm32cube_bt_dev.input_dev.data = (void *) &stm32cube_bt_dev;
87
ret = stm32cube_bt_start(NULL);
89
log_error("stm32_ts_start failed");