embox

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

8
#include <errno.h>
9
#include <assert.h>
10
#include <embox/unit.h>
11
#include <framework/mod/options.h>
12
#include <util/log.h>
13
#include <util/math.h>
14
#include <kernel/irq.h>
15
#include <drivers/input/input_dev.h>
16
#include <drivers/video/fb.h>
17

18
#if defined STM32F746xx
19
#include "stm32746g_discovery_ts.h"
20
#elif defined STM32F769xx
21
#include "stm32f769i_discovery_ts.h"
22
#else
23
#error Unsupported platform
24
#endif
25

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, "");
29

30
EMBOX_UNIT_INIT(stm32_ts_init);
31

32
struct stm32_ts_indev {
33
	int touch_active[2];
34
	struct input_dev input_dev;
35
};
36

37
static int stm32_ts_start(struct input_dev *dev) {
38
	int ret;
39
	struct fb_info *fb;
40

41
	fb = fb_lookup(0);
42
	if (!fb) {
43
		log_error("fb_lookup failed");
44
		return -1;
45
	}
46

47
	ret = BSP_TS_Init(fb->var.xres, fb->var.yres);
48
	if (ret != TS_OK) {
49
		log_error("BSP_TS_Init failed");
50
		return -1;
51
	}
52

53
	BSP_TS_ITConfig();
54

55
	return 0;
56
}
57

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;
62
	int i;
63
	/* Only two fingers supported at once on the screen. */
64
	int touch[2] = {0, 0};
65

66
	assert(dev && ts_dev);
67

68
	BSP_TS_GetState(&ts_state);
69

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)
73
		/* We will send touched area if multi touch is supported. */
74
		ev.type |= TS_EVENT_NEXT;
75
#endif
76
		ev.value = (ts_state.touchX[i] << 16) | (ts_state.touchY[i] & 0xffff);
77
		input_dev_report_event(dev, &ev);
78

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);
83
#endif
84

85
		touch[i] = 1;
86
	}
87

88
	for (i = 0; i < 2; i++) {
89
		if (touch[i]) {
90
			ts_dev->touch_active[i] = 1;
91
		} else {
92
			if (ts_dev->touch_active[i]) {
93
				ev.type = TS_TOUCH_1_RELEASED + i;
94
				input_dev_report_event(dev, &ev);
95
			}
96
			ts_dev->touch_active[i] = 0;
97
		}
98
	}
99
}
100

101
static irq_return_t stm32_ts_irq_hnd(unsigned int irq_nr, void *data) {
102
	struct input_dev *dev = (struct input_dev *) data;
103

104
	stm32_ts_poll(dev);
105

106
	__HAL_GPIO_EXTI_CLEAR_IT(STM32_TS_INT_PIN);
107

108
	return IRQ_HANDLED;
109
}
110

111
static const struct input_dev_ops stm32_ts_input_ops = {
112
	/* Nothing to do for now, TS started at module init and running forever. */
113
};
114

115
static struct stm32_ts_indev stm32_ts_dev = {
116
	.input_dev = {
117
		.ops = &stm32_ts_input_ops,
118
		.name = "stm32-ts",
119
		.type = INPUT_DEV_TOUCHSCREEN,
120
	},
121
};
122

123
static int stm32_ts_init(void) {
124
	int ret = 0;
125

126
	ret = irq_attach(STM32_TS_IRQ, stm32_ts_irq_hnd, 0,
127
					 &stm32_ts_dev.input_dev, "stm32 touchscreen");
128
	if (ret != 0) {
129
		log_error("irq_attach failed");
130
		return ret;
131
	}
132

133
	ret = input_dev_register(&stm32_ts_dev.input_dev);
134
	if (ret != 0) {
135
		log_error("input_dev_register failed");
136
		goto err_irq_detach;
137
	}
138
	stm32_ts_dev.input_dev.data = (void *) &stm32_ts_dev;
139

140
	ret = stm32_ts_start(NULL);
141
	if (ret != 0) {
142
		log_error("stm32_ts_start failed");
143
		goto err_irq_detach;
144
	}
145

146
	return 0;
147

148
err_irq_detach:
149
	irq_detach(STM32_TS_IRQ, &stm32_ts_dev.input_dev);
150
	return ret;
151
}
152

153
STATIC_IRQ_ATTACH(STM32_TS_IRQ, stm32_ts_irq_hnd, &stm32_ts_dev.input_dev);
154

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

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

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

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