10
#include <embox/unit.h>
11
#include <framework/mod/options.h>
14
#include <kernel/irq.h>
15
#include <drivers/input/input_dev.h>
16
#include <drivers/video/fb.h>
18
#if defined STM32F746xx
19
#include "stm32746g_discovery_ts.h"
20
#elif defined STM32F769xx
21
#include "stm32f769i_discovery_ts.h"
23
#error Unsupported platform
26
#define STM32_TS_INT_PIN TS_INT_PIN
27
#define STM32_TS_IRQ OPTION_GET(NUMBER, ts_irq)
28
static_assert(STM32_TS_IRQ == TS_INT_EXTI_IRQn, "");
30
EMBOX_UNIT_INIT(stm32_ts_init);
32
struct stm32_ts_indev {
34
struct input_dev input_dev;
37
static int stm32_ts_start(struct input_dev *dev) {
43
log_error("fb_lookup failed");
47
ret = BSP_TS_Init(fb->var.xres, fb->var.yres);
49
log_error("BSP_TS_Init failed");
58
static void stm32_ts_poll(struct input_dev *dev) {
59
TS_StateTypeDef ts_state;
60
struct stm32_ts_indev *ts_dev = (struct stm32_ts_indev *) dev->data;
61
struct input_event ev;
64
int touch[2] = {0, 0};
66
assert(dev && ts_dev);
68
BSP_TS_GetState(&ts_state);
70
for (i = 0; i < min(ts_state.touchDetected, 2); i++) {
71
ev.type = (TS_TOUCH_1 + i);
72
#if (TS_MULTI_TOUCH_SUPPORTED == 1)
74
ev.type |= TS_EVENT_NEXT;
76
ev.value = (ts_state.touchX[i] << 16) | (ts_state.touchY[i] & 0xffff);
77
input_dev_report_event(dev, &ev);
79
#if (TS_MULTI_TOUCH_SUPPORTED == 1)
80
ev.type = TS_TOUCH_PRESSURE;
81
ev.value = ts_state.touchWeight[i];
82
input_dev_report_event(dev, &ev);
88
for (i = 0; i < 2; i++) {
90
ts_dev->touch_active[i] = 1;
92
if (ts_dev->touch_active[i]) {
93
ev.type = TS_TOUCH_1_RELEASED + i;
94
input_dev_report_event(dev, &ev);
96
ts_dev->touch_active[i] = 0;
101
static irq_return_t stm32_ts_irq_hnd(unsigned int irq_nr, void *data) {
102
struct input_dev *dev = (struct input_dev *) data;
106
__HAL_GPIO_EXTI_CLEAR_IT(STM32_TS_INT_PIN);
111
static const struct input_dev_ops stm32_ts_input_ops = {
115
static struct stm32_ts_indev stm32_ts_dev = {
117
.ops = &stm32_ts_input_ops,
119
.type = INPUT_DEV_TOUCHSCREEN,
123
static int stm32_ts_init(void) {
126
ret = irq_attach(STM32_TS_IRQ, stm32_ts_irq_hnd, 0,
127
&stm32_ts_dev.input_dev, "stm32 touchscreen");
129
log_error("irq_attach failed");
133
ret = input_dev_register(&stm32_ts_dev.input_dev);
135
log_error("input_dev_register failed");
138
stm32_ts_dev.input_dev.data = (void *) &stm32_ts_dev;
140
ret = stm32_ts_start(NULL);
142
log_error("stm32_ts_start failed");
149
irq_detach(STM32_TS_IRQ, &stm32_ts_dev.input_dev);
153
STATIC_IRQ_ATTACH(STM32_TS_IRQ, stm32_ts_irq_hnd, &stm32_ts_dev.input_dev);