Add support for IPC notifications even for polled ns16550 based keyboard.
[helenos.git] / uspace / kbd / arch / sparc64 / src / kbd.c
blob365c3fcd3305a01761aeba97842231237356a34e
1 /*
2 * Copyright (C) 2006 Martin Decky
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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.
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.
29 /** @addtogroup kbdsparc64 sparc64
30 * @brief HelenOS sparc64 arch dependent parts of uspace keyboard handler.
31 * @ingroup kbd
32 * @{
33 */
34 /** @file
37 #include <arch/kbd.h>
38 #include <ipc/ipc.h>
39 #include <sysinfo.h>
40 #include <kbd.h>
41 #include <keys.h>
42 #include <stdio.h>
43 #include <types.h>
44 #include <genarch/kbd.h>
46 #define KBD_KEY_RELEASE 0x80
47 #define KBD_ALL_KEYS_UP 0x7f
49 /** Top-half pseudocode for z8530. */
50 irq_cmd_t z8530_cmds[] = {
52 CMD_MEM_READ_1,
53 0, /**< Address. Will be patched in run-time. */
54 0, /**< Value. Not used. */
55 1 /**< Arg 1 will contain the result. */
59 irq_code_t z8530_kbd = {
61 z8530_cmds
64 /** Top-half pseudocode for ns16550. */
65 irq_cmd_t ns16550_cmds[] = {
67 CMD_MEM_READ_1,
68 0, /**< Address. Will be patched in run-time. */
69 0, /**< Value. Not used. */
70 1 /**< Arg 1 will contain the result. */
74 irq_code_t ns16550_kbd = {
76 ns16550_cmds
79 #define KBD_Z8530 1
80 #define KBD_NS16550 2
82 int kbd_arch_init(void)
84 int type = sysinfo_value("kbd.type");
85 switch (type) {
86 case KBD_Z8530:
87 z8530_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual") + 6;
88 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &z8530_kbd);
89 break;
90 case KBD_NS16550:
91 ns16550_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual");
92 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ns16550_kbd);
93 break;
94 default:
95 break;
97 return 0;
100 /** Process keyboard events */
101 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
103 int scan_code = IPC_GET_ARG1(*call);
105 if (scan_code == KBD_ALL_KEYS_UP)
106 return 1;
108 if (scan_code & KBD_KEY_RELEASE)
109 key_released(keybuffer, scan_code ^ KBD_KEY_RELEASE);
110 else
111 key_pressed(keybuffer, scan_code);
113 return 1;
116 /** @}