embox

Форк
0
/
stm32cube_button.c 
95 строк · 2.0 Кб
1
/*
2
 * @file
3
 *
4
 * @date 15.04.2020
5
 * @author Alexander Kalmuk
6
 */
7

8
#include <util/log.h>
9

10
#include <errno.h>
11
#include <assert.h>
12

13
#include <kernel/irq.h>
14
#include <drivers/input/input_dev.h>
15

16
#include <drivers/gpio/gpio.h>
17

18
#include <embox/unit.h>
19
#include <framework/mod/options.h>
20

21

22
EMBOX_UNIT_INIT(stm32cube_bt_init);
23

24
#define USER_BUTTON_PORT       OPTION_GET(NUMBER,pin_port)
25
#define USER_BUTTON_PIN_MASK   (1 << OPTION_GET(NUMBER,pin_num))
26

27
struct stm32cube_bt_indev {
28
	struct input_dev input_dev;
29
};
30

31
static struct stm32cube_bt_indev stm32cube_bt_dev;
32

33
static void stm32cube_bt_irq_hnd(void *data) {
34
	struct input_dev *dev;
35
	gpio_mask_t status;
36
	struct input_event ev;
37

38
	dev = &((struct stm32cube_bt_indev *)data)->input_dev;
39

40
	status = gpio_get(USER_BUTTON_PORT, USER_BUTTON_PIN_MASK);
41
	if (status) {
42
		ev.type = USER_BUTTON_PRESSED;
43
		log_debug("pressed");
44
	} else {
45
		ev.type = USER_BUTTON_UNPRESSED;
46
		log_debug("unpressed");
47
	}
48
	ev.value = 0;
49

50
	input_dev_report_event(dev, &ev);
51
}
52

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");
57
		return -1;
58
	}
59

60
	return 0;
61
}
62

63

64

65
static const struct input_dev_ops stm32cube_bt_input_ops = {
66
	/* Nothing to do for now, TS started at module init and running forever. */
67
};
68

69
static struct stm32cube_bt_indev stm32cube_bt_dev = {
70
	.input_dev = {
71
		.ops = &stm32cube_bt_input_ops,
72
		.name = "user-bt",
73
		.type = INPUT_DEV_BUTTON,
74
	},
75
};
76

77
static int stm32cube_bt_init(void) {
78
	int ret = 0;
79

80
	ret = input_dev_register(&stm32cube_bt_dev.input_dev);
81
	if (ret != 0) {
82
		log_error("input_dev_register failed");
83
		goto err_out;
84
	}
85
	stm32cube_bt_dev.input_dev.data = (void *) &stm32cube_bt_dev;
86

87
	ret = stm32cube_bt_start(NULL);
88
	if (ret != 0) {
89
		log_error("stm32_ts_start failed");
90

91
	}
92

93
err_out:
94
	return ret;
95
}
96

97

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.