embox

Форк
0
/
input_dev_nofs.c 
64 строки · 1.2 Кб
1
/**
2
 * @file
3
 *
4
 * @date 30.11.20
5
 * @author Alexander Kalmuk
6
 */
7

8
#include <assert.h>
9
#include <drivers/input/input_dev.h>
10
#include <embox/unit.h>
11
#include <kernel/irq.h>
12
#include <kernel/lthread/lthread.h>
13
#include <kernel/sched/schedee_priority.h>
14
#include <util/log.h>
15

16
#define INDEV_HND_PRIORITY OPTION_GET(NUMBER, hnd_priority)
17

18
static struct lthread indev_handler_lt;
19

20
static DLIST_DEFINE(post_indevs);
21

22
EMBOX_UNIT_INIT(input_lthread_init);
23

24
int input_dev_private_register(struct input_dev *inpdev) {
25
	dlist_head_init(&inpdev->post_link);
26

27
	return 0;
28
}
29

30
int input_dev_private_notify(struct input_dev *inpdev, struct input_event *ev) {
31
	if (dlist_empty(&inpdev->post_link)) {
32
		dlist_add_prev(&inpdev->post_link, &post_indevs);
33
	}
34

35
	lthread_launch(&indev_handler_lt);
36

37
	return 0;
38
}
39

40
static int indev_handler(struct lthread *self) {
41
	struct input_dev *dev;
42

43
	irq_lock();
44
	{
45
		dlist_foreach_entry_safe(dev, &post_indevs, post_link) {
46
			if (dev->event_cb) {
47
				irq_unlock();
48
				dev->event_cb(dev);
49
				irq_lock();
50
			}
51
			dlist_del_init(&dev->post_link);
52
		}
53
	}
54
	irq_unlock();
55

56
	return 0;
57
}
58

59
static int input_lthread_init(void) {
60
	lthread_init(&indev_handler_lt, &indev_handler);
61
	schedee_priority_set(&indev_handler_lt.schedee, INDEV_HND_PRIORITY);
62

63
	return 0;
64
}
65

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

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

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

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