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