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
Line 
1/*
2 * Copyright (c) 2006 Josef Cejka
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
29/**
30 * @addtogroup kbdgen generic
31 * @brief HelenOS generic uspace keyboard handler.
32 * @ingroup kbd
33 * @{
34 */
35/** @file
36 */
37
38#include <ipc/ipc.h>
39#include <ipc/services.h>
40#include <stdio.h>
41#include <unistd.h>
42#include <stdlib.h>
43#include <stdio.h>
44#include <ipc/ns.h>
45#include <async.h>
46#include <errno.h>
47#include <libadt/fifo.h>
48#include <kbd/kbd.h>
49
50#include <kbd.h>
51#include <key_buffer.h>
52#include <kbd_port.h>
53#include <kbd_ctl.h>
54#include <layout.h>
55
56#define NAME "kbd"
57
58int cons_connected = 0;
59int phone2cons = -1;
60keybuffer_t keybuffer;
61
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)
70{
71 kbd_event_t ev;
72
73 printf("type: %d\n", type);
74 printf("mods: 0x%x\n", mods);
75 printf("keycode: %u\n", key);
76
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);
84}
85
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
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) {
114 ipc_answer_0(iid, ELIMIT);
115 return;
116 }
117 cons_connected = 1;
118 ipc_answer_0(iid, EOK);
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;
127 ipc_answer_0(callid, EOK);
128 return;
129 case IPC_M_CONNECT_TO_ME:
130 if (phone2cons != -1) {
131 retval = ELIMIT;
132 break;
133 }
134 phone2cons = IPC_GET_ARG5(call);
135 retval = 0;
136 break;
137 default:
138 retval = EINVAL;
139 }
140 ipc_answer_0(callid, retval);
141 }
142}
143
144
145
146int main(int argc, char **argv)
147{
148 printf(NAME ": HelenOS Keyboard service\n");
149
150 ipcarg_t phonead;
151
152 /* Initialize port driver. */
153 if (kbd_port_init())
154 return -1;
155
156 /* Initialize key buffer */
157 keybuffer_init(&keybuffer);
158
159 async_set_client_connection(console_connection);
160
161 /* Register service at nameserver. */
162 if (ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, 0, &phonead) != 0)
163 return -1;
164
165 printf(NAME ": Accepting connections\n");
166 async_manager();
167
168 /* Not reached. */
169 return 0;
170}
171
172/**
173 * @}
174 */
Note: See TracBrowser for help on using the repository browser.