source: mainline/uspace/srv/kbd/generic/kbd.c@ f89979b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since f89979b was f89979b, checked in by Jiri Svoboda <jirik.svoboda@…>, 16 years ago

Keyboard driver overhaul — organize by hardware structure. This is w.i.p. Modifier keys, as well as ppc32, ia64 and sparc64 will not work yet.

  • Property mode set to 100644
File size: 4.1 KB
RevLine 
[51d6f80]1/*
[df4ed85]2 * Copyright (c) 2006 Josef Cejka
[51d6f80]3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[231a60a]29/**
30 * @addtogroup kbdgen generic
[ce5bcb4]31 * @brief HelenOS generic uspace keyboard handler.
32 * @ingroup kbd
33 * @{
34 */
35/** @file
36 */
37
[7ee6aff]38#include <ipc/ipc.h>
39#include <ipc/services.h>
[51d6f80]40#include <stdio.h>
41#include <unistd.h>
42#include <stdlib.h>
[37458472]43#include <stdio.h>
[7ee6aff]44#include <ipc/ns.h>
[fa09449]45#include <async.h>
[51d6f80]46#include <errno.h>
[fa09449]47#include <libadt/fifo.h>
48#include <kbd/kbd.h>
49
[51d6f80]50#include <kbd.h>
[51c1b003]51#include <key_buffer.h>
[f89979b]52#include <kbd_port.h>
53#include <kbd_ctl.h>
54#include <layout.h>
[51d6f80]55
[e00938c]56#define NAME "kbd"
[854387b]57
[085bd54]58int cons_connected = 0;
59int phone2cons = -1;
60keybuffer_t keybuffer;
61
[f89979b]62void kbd_push_scancode(int scancode)
63{
64 printf("scancode: 0x%x\n", scancode);
65 kbd_ctl_parse_scancode(scancode);
66}
67
68#include <kbd/keycode.h>
69void kbd_push_ev(int type, unsigned int key, unsigned int mods)
[085bd54]70{
[fa09449]71 kbd_event_t ev;
[15039b67]72
[f89979b]73 printf("type: %d\n", type);
74 printf("mods: 0x%x\n", mods);
75 printf("keycode: %u\n", key);
[085bd54]76
[f89979b]77 ev.type = type;
78 ev.key = key;
79 ev.mods = mods;
80
81 ev.c = layout_parse_ev(&ev);
82
83 async_msg_4(phone2cons, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c);
[085bd54]84}
85
[f89979b]86//static void irq_handler(ipc_callid_t iid, ipc_call_t *call)
87//{
88// kbd_event_t ev;
89//
90// kbd_arch_process(&keybuffer, call);
91//
92// if (cons_connected && phone2cons != -1) {
93// /*
94// * One interrupt can produce more than one event so the result
95// * is stored in a FIFO.
96// */
97// while (!keybuffer_empty(&keybuffer)) {
98// if (!keybuffer_pop(&keybuffer, &ev))
99// break;
100//
101// async_msg_4(phone2cons, KBD_EVENT, ev.type, ev.key,
102// ev.mods, ev.c);
103// }
104// }
105//}
106
[085bd54]107static void console_connection(ipc_callid_t iid, ipc_call_t *icall)
108{
109 ipc_callid_t callid;
110 ipc_call_t call;
111 int retval;
112
113 if (cons_connected) {
[b74959bd]114 ipc_answer_0(iid, ELIMIT);
[085bd54]115 return;
116 }
117 cons_connected = 1;
[b74959bd]118 ipc_answer_0(iid, EOK);
[085bd54]119
120 while (1) {
121 callid = async_get_call(&call);
122 switch (IPC_GET_METHOD(call)) {
123 case IPC_M_PHONE_HUNGUP:
124 cons_connected = 0;
125 ipc_hangup(phone2cons);
126 phone2cons = -1;
[b74959bd]127 ipc_answer_0(callid, EOK);
[085bd54]128 return;
129 case IPC_M_CONNECT_TO_ME:
130 if (phone2cons != -1) {
131 retval = ELIMIT;
132 break;
133 }
[38c706cc]134 phone2cons = IPC_GET_ARG5(call);
[085bd54]135 retval = 0;
136 break;
[153a209]137 default:
138 retval = EINVAL;
[085bd54]139 }
[b74959bd]140 ipc_answer_0(callid, retval);
[085bd54]141 }
142}
143
144
[f89979b]145
[51d6f80]146int main(int argc, char **argv)
147{
[e00938c]148 printf(NAME ": HelenOS Keyboard service\n");
149
[51d6f80]150 ipcarg_t phonead;
[37458472]151
[f89979b]152 /* Initialize port driver. */
153 if (kbd_port_init())
[15039b67]154 return -1;
[51d6f80]155
156 /* Initialize key buffer */
[79460ae]157 keybuffer_init(&keybuffer);
[51d6f80]158
[d3f2cad]159 async_set_client_connection(console_connection);
[f89979b]160
161 /* Register service at nameserver. */
[38c706cc]162 if (ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, 0, &phonead) != 0)
[51d6f80]163 return -1;
[e00938c]164
165 printf(NAME ": Accepting connections\n");
[085bd54]166 async_manager();
[51c1b003]167
[f89979b]168 /* Not reached. */
[153a209]169 return 0;
[51d6f80]170}
[ce5bcb4]171
172/**
173 * @}
174 */
Note: See TracBrowser for help on using the repository browser.