1 #include <lunaix/clock.h>
2 #include <lunaix/input.h>
3 #include <lunaix/mm/page.h>
4 #include <lunaix/mm/valloc.h>
5 #include <lunaix/spike.h>
6 #include <lunaix/status.h>
8 #include <klibc/string.h>
10 static DEFINE_LLIST(listener_chain);
12 static struct device* input_devcat = NULL;
17 input_devcat = device_addcat(NULL, "input");
21 ldga_foreach(inputdev, ptr_t, i, input_dev_init)
23 ((void (*)())input_dev_init)();
28 input_fire_event(struct input_device* idev, struct input_evt_pkt* pkt)
30 pkt->timestamp = clock_systime();
31 idev->current_pkt = *pkt;
33 struct input_evt_chain *pos, *n;
34 llist_for_each(pos, n, &listener_chain, chain)
36 if (pos->evt_cb(idev) == INPUT_EVT_CATCH) {
41 // wake up all pending readers
42 pwake_all(&idev->readers);
46 input_add_listener(input_evt_cb listener)
50 struct input_evt_chain* chain = vzalloc(sizeof(*chain));
51 llist_append(&listener_chain, &chain->chain);
53 chain->evt_cb = listener;
57 __input_dev_read(struct device* dev, void* buf, size_t offset, size_t len)
59 struct input_device* idev = dev->underlay;
61 if (len < sizeof(struct input_evt_pkt)) {
66 pwait(&idev->readers);
68 memcpy(buf, &idev->current_pkt, sizeof(struct input_evt_pkt));
70 return sizeof(struct input_evt_pkt);
74 __input_dev_read_pg(struct device* dev, void* buf, size_t offset)
76 return __input_dev_read(dev, buf, offset, PG_SIZE);
80 input_add_device(char* name_fmt, ...)
84 struct input_device* idev = vzalloc(sizeof(*idev));
85 waitq_init(&idev->readers);
88 va_start(args, name_fmt);
91 device_add(input_devcat, idev, name_fmt, DEV_IFSEQ, args);
94 dev->ops.read = __input_dev_read;
95 dev->ops.read_page = __input_dev_read_pg;