1/**
2 * \file
3 * \brief Legacy keyboard driver server.
4 */
5
6/*
7 * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
8 * All rights reserved.
9 *
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13 */
14
15#include <stdlib.h>
16#include <barrelfish/barrelfish.h>
17#include <barrelfish/nameservice_client.h>
18#include <if/keyboard_defs.h>
19#include <if/mouse_defs.h>
20
21#include "lpc_kbd.h"
22
23static const char *kservice_name = "keyboard";
24static const char *mservice_name = "mouse";
25static struct keyboard_binding *kclients = NULL;
26static struct mouse_binding *mclients = NULL;
27
28void key_event(uint8_t scancode, bool extended)
29{
30    // broadcast to all clients
31    for (struct keyboard_binding *c = kclients; c != NULL; c = c->st) {
32        errval_t err = c->tx_vtbl.key_event(c, NOP_CONT, scancode, extended);
33        if (err_is_fail(err)) {
34            DEBUG_ERR(err, "unable to send key event");
35        }
36    }
37}
38
39void mouse_event(int32_t xdelta, int32_t ydelta,
40                 bool left, bool middle, bool right)
41{
42    // broadcast to all clients
43    for (struct mouse_binding *c = mclients; c != NULL; c = c->st) {
44        errval_t err = c->tx_vtbl.mouse_event(c, NOP_CONT, xdelta, ydelta,
45                                              left, middle, right);
46        if (err_is_fail(err)) {
47            DEBUG_ERR(err, "unable to send mouse event");
48        }
49    }
50}
51
52static errval_t kconnect_handler(void *st, struct keyboard_binding *b)
53{
54    // add to list of clients
55    // XXX: abusing st pointer for list node
56    b->st = kclients;
57    kclients = b;
58    return SYS_ERR_OK;
59}
60
61
62static errval_t mconnect_handler(void *st, struct mouse_binding *b)
63{
64    // add to list of clients
65    // XXX: abusing st pointer for list node
66    b->st = mclients;
67    mclients = b;
68    return SYS_ERR_OK;
69}
70
71static void klisten_cb(void *st, errval_t err, iref_t iref)
72{
73    assert(err_is_ok(err));
74    err = nameservice_register(kservice_name, iref);
75    assert(err_is_ok(err));
76}
77
78static void mlisten_cb(void *st, errval_t err, iref_t iref)
79{
80    assert(err_is_ok(err));
81    err = nameservice_register(mservice_name, iref);
82    assert(err_is_ok(err));
83}
84
85int main(int argc, char *argv[])
86{
87    int r = drv_init();
88    if (r != 0) {
89        USER_PANIC("LPC driver failed to load: %d\n", r);
90        return r;
91    }
92
93    errval_t err;
94    err = keyboard_export(NULL, klisten_cb, kconnect_handler,
95                          get_default_waitset(), IDC_EXPORT_FLAGS_DEFAULT);
96    assert(err_is_ok(err));
97
98    err = mouse_export(NULL, mlisten_cb, mconnect_handler,
99                       get_default_waitset(), IDC_EXPORT_FLAGS_DEFAULT);
100    assert(err_is_ok(err));
101
102    messages_handler_loop();
103}
104