embox

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

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

19
#include "stm32f429i_discovery_ts.h"
20

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

25
EMBOX_UNIT_INIT(stm32_ts_init);
26

27
struct stm32_ts_indev {
28
	int touch_active[2];
29
	struct input_dev input_dev;
30
};
31

32
static int stm32_ts_start(struct input_dev *dev) {
33
	int ret;
34
	struct fb_info *fb;
35

36
	fb = fb_lookup(0);
37
	if (!fb) {
38
		log_error("fb_lookup failed");
39
		return -1;
40
	}
41

42
	ret = BSP_TS_Init(fb->var.xres, fb->var.yres);
43
	if (ret != TS_OK) {
44
		log_error("BSP_TS_Init failed");
45
		return -1;
46
	}
47

48
	BSP_TS_ITConfig();
49

50
	return 0;
51
}
52

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

61
	assert(dev && ts_dev);
62

63
	BSP_TS_GetState(&ts_state);
64

65
    for (i = 0; i < min(ts_state.TouchDetected, 2); i++) {
66
        ev.type = (TS_TOUCH_1 + i);
67

68
        ev.value = (ts_state.X << 16) | (ts_state.Y & 0xffff);
69
        input_dev_report_event(dev, &ev);
70

71
        touch[i] = 1;
72

73
//         printf("type %d . x %d . y %d\n", ev.type, ts_state.X, ts_state.Y);
74
    }
75

76
    for (i = 0; i < 2; i++) {
77
        if (touch[i]) {
78
            ts_dev->touch_active[i] = 1;
79
        } else {
80
            if (ts_dev->touch_active[i]) {
81
                ev.type = TS_TOUCH_1_RELEASED + i;
82
                input_dev_report_event(dev, &ev);
83
            }
84
            ts_dev->touch_active[i] = 0;
85
        }
86
    }
87
}
88

89
static irq_return_t stm32_ts_irq_hnd(unsigned int irq_nr, void *data) {
90
 	struct input_dev *dev = (struct input_dev *) data;
91

92
 	stm32_ts_poll(dev);
93

94
    BSP_TS_ITClear();
95
    __HAL_GPIO_EXTI_CLEAR_IT(STM32_TS_INT_PIN);
96

97
 	return IRQ_HANDLED;
98
}
99

100
static const struct input_dev_ops stm32_ts_input_ops = {
101
	/* Nothing to do for now, TS started at module init and running forever. */
102
};
103

104
static struct stm32_ts_indev stm32_ts_dev = {
105
	.input_dev = {
106
		.ops = &stm32_ts_input_ops,
107
		.name = "stm32-ts",
108
		.type = INPUT_DEV_TOUCHSCREEN,
109
	},
110
};
111

112
static int stm32_ts_init(void) {
113
	int ret = 0;
114

115
    ret = irq_attach(STM32_TS_IRQ, stm32_ts_irq_hnd, 0,
116
                     &stm32_ts_dev.input_dev, "stm32 touchscreen");
117
    if (ret != 0) {
118
        log_error("irq_attach failed");
119
        return ret;
120
    }
121

122
	ret = input_dev_register(&stm32_ts_dev.input_dev);
123
	if (ret != 0) {
124
		log_error("input_dev_register failed");
125
		goto err_irq_detach;
126
	}
127
	stm32_ts_dev.input_dev.data = (void *) &stm32_ts_dev;
128

129
	ret = stm32_ts_start(NULL);
130
	if (ret != 0) {
131
		log_error("stm32_ts_start failed");
132
		goto err_irq_detach;
133
	}
134

135
	return 0;
136

137
 err_irq_detach:
138
     irq_detach(STM32_TS_IRQ, &stm32_ts_dev.input_dev);
139
 	return ret;
140
}
141

142
STATIC_IRQ_ATTACH(STM32_TS_IRQ, stm32_ts_irq_hnd, &stm32_ts_dev.input_dev);
143

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

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

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

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