embox
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
18static struct lthread indev_handler_lt;
19
20static DLIST_DEFINE(post_indevs);
21
22EMBOX_UNIT_INIT(input_lthread_init);
23
24int input_dev_private_register(struct input_dev *inpdev) {
25dlist_head_init(&inpdev->post_link);
26
27return 0;
28}
29
30int input_dev_private_notify(struct input_dev *inpdev, struct input_event *ev) {
31if (dlist_empty(&inpdev->post_link)) {
32dlist_add_prev(&inpdev->post_link, &post_indevs);
33}
34
35lthread_launch(&indev_handler_lt);
36
37return 0;
38}
39
40static int indev_handler(struct lthread *self) {
41struct input_dev *dev;
42
43irq_lock();
44{
45dlist_foreach_entry_safe(dev, &post_indevs, post_link) {
46if (dev->event_cb) {
47irq_unlock();
48dev->event_cb(dev);
49irq_lock();
50}
51dlist_del_init(&dev->post_link);
52}
53}
54irq_unlock();
55
56return 0;
57}
58
59static int input_lthread_init(void) {
60lthread_init(&indev_handler_lt, &indev_handler);
61schedee_priority_set(&indev_handler_lt.schedee, INDEV_HND_PRIORITY);
62
63return 0;
64}
65