11
#include <embox/unit.h>
12
#include <framework/mod/options.h>
15
#include <kernel/irq.h>
16
#include <drivers/input/input_dev.h>
17
#include <drivers/video/fb.h>
19
#include "stm32f429i_discovery_ts.h"
21
#define STM32_TS_INT_PIN STMPE811_INT_PIN
22
#define STM32_TS_IRQ OPTION_GET(NUMBER, ts_irq)
23
static_assert(STM32_TS_IRQ == STMPE811_INT_EXTI, "");
25
EMBOX_UNIT_INIT(stm32_ts_init);
27
struct stm32_ts_indev {
29
struct input_dev input_dev;
32
static int stm32_ts_start(struct input_dev *dev) {
38
log_error("fb_lookup failed");
42
ret = BSP_TS_Init(fb->var.xres, fb->var.yres);
44
log_error("BSP_TS_Init failed");
53
void stm32_ts_poll(struct input_dev *dev) {
54
TS_StateTypeDef ts_state;
55
struct stm32_ts_indev *ts_dev = (struct stm32_ts_indev *) dev->data;
56
struct input_event ev;
59
int touch[2] = {0, 0};
61
assert(dev && ts_dev);
63
BSP_TS_GetState(&ts_state);
65
for (i = 0; i < min(ts_state.TouchDetected, 2); i++) {
66
ev.type = (TS_TOUCH_1 + i);
68
ev.value = (ts_state.X << 16) | (ts_state.Y & 0xffff);
69
input_dev_report_event(dev, &ev);
76
for (i = 0; i < 2; i++) {
78
ts_dev->touch_active[i] = 1;
80
if (ts_dev->touch_active[i]) {
81
ev.type = TS_TOUCH_1_RELEASED + i;
82
input_dev_report_event(dev, &ev);
84
ts_dev->touch_active[i] = 0;
89
static irq_return_t stm32_ts_irq_hnd(unsigned int irq_nr, void *data) {
90
struct input_dev *dev = (struct input_dev *) data;
95
__HAL_GPIO_EXTI_CLEAR_IT(STM32_TS_INT_PIN);
100
static const struct input_dev_ops stm32_ts_input_ops = {
104
static struct stm32_ts_indev stm32_ts_dev = {
106
.ops = &stm32_ts_input_ops,
108
.type = INPUT_DEV_TOUCHSCREEN,
112
static int stm32_ts_init(void) {
115
ret = irq_attach(STM32_TS_IRQ, stm32_ts_irq_hnd, 0,
116
&stm32_ts_dev.input_dev, "stm32 touchscreen");
118
log_error("irq_attach failed");
122
ret = input_dev_register(&stm32_ts_dev.input_dev);
124
log_error("input_dev_register failed");
127
stm32_ts_dev.input_dev.data = (void *) &stm32_ts_dev;
129
ret = stm32_ts_start(NULL);
131
log_error("stm32_ts_start failed");
138
irq_detach(STM32_TS_IRQ, &stm32_ts_dev.input_dev);
142
STATIC_IRQ_ATTACH(STM32_TS_IRQ, stm32_ts_irq_hnd, &stm32_ts_dev.input_dev);