embox

Форк
0
/
input_dev.c 
134 строки · 2.2 Кб
1
/**
2
 * @file
3
 *
4
 * @date 20.01.13
5
 * @author Alexander Kalmuk
6
 * @author Anton Kozlov:
7
 * 	splitted with fs, simplifying
8
 */
9

10
#include <errno.h>
11
#include <string.h>
12
#include <kernel/irq.h>
13
#include <lib/libds/dlist.h>
14

15
#include <kernel/lthread/lthread.h>
16
#include <kernel/sched/schedee_priority.h>
17

18
#include <drivers/input/input_dev.h>
19

20
static DLIST_DEFINE(input_devices);
21

22
void input_dev_report_event(struct input_dev *dev, struct input_event *ev) {
23
	assert(dev);
24

25
	if (!(dev->flags & INPUT_DEV_OPENED)) {
26
		return;
27
	}
28

29
	irq_lock();
30
	{
31
		ev->devtype = dev->type;
32

33
		ring_buff_enqueue(&dev->rbuf, ev, 1);
34

35
		input_dev_private_notify(dev, ev);
36
	}
37
	irq_unlock();
38
}
39

40
int input_dev_register(struct input_dev *dev) {
41
	if (!dev || !dev->ops) {
42
		return -EINVAL;
43
	}
44
	dev->event_cb = NULL;
45

46
	ring_buff_init(&dev->rbuf, sizeof(struct input_event),
47
			INPUT_DEV_EVENT_QUEUE_LEN, &dev->event_buf);
48

49
	dlist_add_prev(dlist_head_init(&dev->dev_link), &input_devices);
50

51
	input_dev_private_register(dev);
52

53
	return 0;
54
}
55

56
int input_dev_event(struct input_dev *dev, struct input_event *ev) {
57
	int ret = 0;
58

59
	if (dev == NULL) {
60
		return -EINVAL;
61
	}
62

63
	irq_lock();
64
	{
65
		if (0 == ring_buff_get_cnt(&dev->rbuf)) {
66
			ret = -ENOENT;
67
			goto out;
68
		}
69

70
		ring_buff_dequeue(&dev->rbuf, ev, 1);
71
	}
72
out:
73
	irq_unlock();
74

75
	return ret;
76
}
77

78
int input_dev_open(struct input_dev *dev, indev_event_cb_t *event_cb) {
79
	int res;
80

81
	if (dev == NULL) {
82
		return -EINVAL;
83
	}
84
	dev->event_cb = event_cb;
85

86
	if (dev->ops->start) {
87
		res = dev->ops->start(dev);
88
		if (res < 0) {
89
			return res;
90
		}
91
	}
92

93
	dev->flags |= INPUT_DEV_OPENED;
94

95
	return 0;
96
}
97

98
int input_dev_close(struct input_dev *dev) {
99
	if (dev == NULL) {
100
		return -EINVAL;
101
	}
102

103
	dev->event_cb = NULL;
104

105
	if (dev->ops->stop) {
106
		dev->ops->stop(dev);
107
	}
108

109
	dev->flags &= ~INPUT_DEV_OPENED;
110

111
	return 0;
112
}
113

114
struct input_dev *input_dev_lookup(const char *name) {
115
	struct input_dev *dev;
116

117
	dlist_foreach_entry(dev, &input_devices, dev_link) {
118
		if (0 == strcmp(dev->name, name)) {
119
			return dev;
120
		}
121
	}
122

123
	return NULL;
124
}
125

126
struct input_dev *input_dev_iterate(struct input_dev *dev) {
127
	struct dlist_head *link;
128

129
	link = dev ? dev->dev_link.next : input_devices.next;
130
	if (link == &input_devices) {
131
		return NULL;
132
	}
133
	return member_cast_out(link, struct input_dev, dev_link);
134
}
135

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

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

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

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