source: mainline/uspace/srv/kbd/port/i8042.c@ 0cb9fa0

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

Add some missing ports and controllers (untested). Remove old parts of keyboard driver.

  • Property mode set to 100644
File size: 4.1 KB
Line 
1/*
2 * Copyright (c) 2001-2004 Jakub Jermar
3 * Copyright (c) 2006 Josef Cejka
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup kbd_port
31 * @ingroup kbd
32 * @{
33 */
34/** @file
35 * @brief i8042 port driver.
36 */
37
38#include <ipc/ipc.h>
39#include <async.h>
40#include <unistd.h>
41#include <sysinfo.h>
42#include <kbd_port.h>
43#include <kbd.h>
44#include "i8042.h"
45
46/* Interesting bits for status register */
47#define i8042_OUTPUT_FULL 0x1
48#define i8042_INPUT_FULL 0x2
49#define i8042_MOUSE_DATA 0x20
50
51/* Command constants */
52#define i8042_CMD_KBD 0x60
53#define i8042_CMD_MOUSE 0xd4
54
55/* Keyboard cmd byte */
56#define i8042_KBD_IE 0x1
57#define i8042_MOUSE_IE 0x2
58#define i8042_KBD_DISABLE 0x10
59#define i8042_MOUSE_DISABLE 0x20
60#define i8042_KBD_TRANSLATE 0x40
61
62/* Mouse constants */
63#define MOUSE_OUT_INIT 0xf4
64#define MOUSE_ACK 0xfa
65
66static irq_cmd_t i8042_cmds[2] = {
67 { CMD_PORT_READ_1, (void *) 0x64, 0, 1 },
68 { CMD_PORT_READ_1, (void *) 0x60, 0, 2 }
69};
70
71static irq_code_t i8042_kbd = {
72 2,
73 i8042_cmds
74};
75
76static void wait_ready(void) {
77 while (i8042_status_read() & i8042_INPUT_FULL)
78 ;
79}
80
81static void i8042_irq_handler(ipc_callid_t iid, ipc_call_t *call);
82
83int kbd_port_init(void)
84{
85// int i;
86 int mouseenabled = 0;
87
88 async_set_interrupt_received(i8042_irq_handler);
89 iospace_enable(task_get_id(), (void *) i8042_DATA, 5);
90
91 /* Disable kbd, enable mouse */
92 i8042_command_write(i8042_CMD_KBD);
93 wait_ready();
94 i8042_command_write(i8042_CMD_KBD);
95 wait_ready();
96 i8042_data_write(i8042_KBD_DISABLE);
97 wait_ready();
98
99 /* Flush all current IO */
100 while (i8042_status_read() & i8042_OUTPUT_FULL)
101 i8042_data_read();
102
103 /* Initialize mouse */
104/* i8042_command_write(i8042_CMD_MOUSE);
105 wait_ready();
106 i8042_data_write(MOUSE_OUT_INIT);
107 wait_ready();
108
109 int mouseanswer = 0;
110 for (i=0;i < 1000; i++) {
111 int status = i8042_status_read();
112 if (status & i8042_OUTPUT_FULL) {
113 int data = i8042_data_read();
114 if (status & i8042_MOUSE_DATA) {
115 mouseanswer = data;
116 break;
117 }
118 }
119 usleep(1000);
120 }*/
121// if (mouseanswer == MOUSE_ACK) {
122// /* enable mouse */
123// mouseenabled = 1;
124//
125// ipc_register_irq(sysinfo_value("mouse.inr"), sysinfo_value("mouse.devno"), 0, &i8042_kbd);
126// }
127
128 /* Enable kbd */
129 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &i8042_kbd);
130
131 int newcontrol = i8042_KBD_IE | i8042_KBD_TRANSLATE;
132 if (mouseenabled)
133 newcontrol |= i8042_MOUSE_IE;
134
135 i8042_command_write(i8042_CMD_KBD);
136 wait_ready();
137 i8042_data_write(newcontrol);
138 wait_ready();
139
140 return 0;
141}
142
143static void i8042_irq_handler(ipc_callid_t iid, ipc_call_t *call)
144{
145 int status = IPC_GET_ARG1(*call);
146
147 if ((status & i8042_MOUSE_DATA))
148 return 0;
149
150 int scan_code = IPC_GET_ARG2(*call);
151
152 kbd_push_scancode(scan_code);
153 return 1;
154}
155
156/**
157 * @}
158 */
Note: See TracBrowser for help on using the repository browser.