1 /* $NetBSD: hil.c,v 1.3 1997/10/04 17:20:19 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1997 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 /* 40 * Copyright (c) 1988 University of Utah. 41 * Copyright (c) 1990, 1993 42 * The Regents of the University of California. All rights reserved. 43 * 44 * This code is derived from software contributed to Berkeley by 45 * the Systems Programming Group of the University of Utah Computer 46 * Science Department. 47 * 48 * Redistribution and use in source and binary forms, with or without 49 * modification, are permitted provided that the following conditions 50 * are met: 51 * 1. Redistributions of source code must retain the above copyright 52 * notice, this list of conditions and the following disclaimer. 53 * 2. Redistributions in binary form must reproduce the above copyright 54 * notice, this list of conditions and the following disclaimer in the 55 * documentation and/or other materials provided with the distribution. 56 * 3. All advertising materials mentioning features or use of this software 57 * must display the following acknowledgement: 58 * This product includes software developed by the University of 59 * California, Berkeley and its contributors. 60 * 4. Neither the name of the University nor the names of its contributors 61 * may be used to endorse or promote products derived from this software 62 * without specific prior written permission. 63 * 64 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 65 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 66 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 67 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 68 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 69 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 70 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 71 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 72 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 73 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 74 * SUCH DAMAGE. 75 * 76 * from: Utah Hdr: hil.c 1.1 89/08/22 77 * 78 * @(#)hil.c 8.1 (Berkeley) 6/10/93 79 */ 80 81 /* 82 * HIL keyboard routines for the standalone ITE. 83 */ 84 85 #if defined(ITECONSOLE) && defined(HIL_KEYBOARD) 86 87 #include <sys/param.h> 88 #include <sys/device.h> /* XXX */ 89 90 #include <hp300/dev/hilreg.h> 91 #include <hp300/dev/kbdmap.h> 92 #include <hp300/dev/itevar.h> 93 94 #include <hp300/stand/common/samachdep.h> 95 #include <hp300/stand/common/kbdvar.h> 96 97 #ifndef SMALL 98 99 /* 100 * HIL cooked keyboard keymaps. 101 * Supports only unshifted, shifted and control keys. 102 */ 103 char hil_us_keymap[] = { 104 NULL, '`', '\\', ESC, NULL, DEL, NULL, NULL, 105 '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 106 NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 107 NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 108 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 109 NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 110 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 111 ESC, '\r', NULL, '\n', '0', '.', ',', '+', 112 '1', '2', '3', '-', '4', '5', '6', '*', 113 '7', '8', '9', '/', 'E', '(', ')', '^', 114 '1', '2', '3', '4', '5', '6', '7', '8', 115 '9', '0', '-', '=', '[', ']', ';', '\'', 116 ',', '.', '/', '\040', 'o', 'p', 'k', 'l', 117 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 118 'a', 's', 'd', 'f', 'g', 'h', 'j', 'm', 119 'z', 'x', 'c', 'v', 'b', 'n', NULL, NULL 120 }; 121 122 char hil_us_shiftmap[] = { 123 NULL, '~', '|', DEL, NULL, DEL, NULL, NULL, 124 '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 125 NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 126 NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 127 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 128 NULL, NULL, NULL, NULL, NULL, NULL, DEL, NULL, 129 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 130 ESC, '\r', NULL, '\n', '0', '.', ',', '+', 131 '1', '2', '3', '-', '4', '5', '6', '*', 132 '7', '8', '9', '/', '`', '|', '\\', '~', 133 '!', '@', '#', '$', '%', '^', '&', '*', 134 '(', ')', '_', '+', '{', '}', ':', '\"', 135 '<', '>', '?', '\040', 'O', 'P', 'K', 'L', 136 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 137 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'M', 138 'Z', 'X', 'C', 'V', 'B', 'N', NULL, NULL 139 }; 140 141 char hil_us_ctrlmap[] = { 142 NULL, '`', '\034', ESC, NULL, DEL, NULL, NULL, 143 '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 144 NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 145 NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 146 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 147 NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 148 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 149 ESC, '\r', NULL, '\n', '0', '.', ',', '+', 150 '1', '2', '3', '-', '4', '5', '6', '*', 151 '7', '8', '9', '/', 'E', '(', ')', '\036', 152 '1', '2', '3', '4', '5', '6', '7', '8', 153 '9', '0', '-', '=', '\033', '\035', ';', '\'', 154 ',', '.', '/', '\040', '\017', '\020', '\013', '\014', 155 '\021', '\027', '\005', '\022', '\024', '\031', '\025', '\011', 156 '\001', '\023', '\004', '\006', '\007', '\010', '\012', '\015', 157 '\032', '\030', '\003', '\026', '\002', '\016', NULL, NULL 158 }; 159 160 #ifdef UK_KEYBOARD 161 char hil_uk_keymap[] = { 162 NULL, '`', '<', ESC, NULL, DEL, NULL, NULL, 163 '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 164 NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 165 NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 166 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 167 NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 168 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 169 ESC, '\r', NULL, '\n', '0', '.', ',', '+', 170 '1', '2', '3', '-', '4', '5', '6', '*', 171 '7', '8', '9', '/', 'E', '(', ')', '^', 172 '1', '2', '3', '4', '5', '6', '7', '8', 173 '9', '0', '+', '\'', '[', ']', '*', '\\', 174 ',', '.', '-', '\040', 'o', 'p', 'k', 'l', 175 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 176 'a', 's', 'd', 'f', 'g', 'h', 'j', 'm', 177 'z', 'x', 'c', 'v', 'b', 'n', NULL, NULL 178 }; 179 180 char hil_uk_shiftmap[] = { 181 NULL, '~', '>', DEL, NULL, DEL, NULL, NULL, 182 '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 183 NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 184 NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 185 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 186 NULL, NULL, NULL, NULL, NULL, NULL, DEL, NULL, 187 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 188 ESC, '\r', NULL, '\n', '0', '.', ',', '+', 189 '1', '2', '3', '-', '4', '5', '6', '*', 190 '7', '8', '9', '/', '`', '|', '\\', '~', 191 '!', '\"', '#', '$', '%', '&', '^', '(', 192 ')', '=', '?', '/', '{', '}', '@', '|', 193 ';', ':', '_', '\040', 'O', 'P', 'K', 'L', 194 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 195 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'M', 196 'Z', 'X', 'C', 'V', 'B', 'N', NULL, NULL 197 }; 198 199 char hil_uk_ctrlmap[] = { 200 NULL, '`', '<', ESC, NULL, DEL, NULL, NULL, 201 '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 202 NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 203 NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 204 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 205 NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 206 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 207 ESC, '\r', NULL, '\n', '0', '.', ',', '+', 208 '1', '2', '3', '-', '4', '5', '6', '*', 209 '7', '8', '9', '/', 'E', '(', ')', '\036', 210 '1', '2', '3', '4', '5', '6', '7', '8', 211 '9', '0', '+', '\'', '\033', '\035', '*', '\034', 212 ',', '.', '/', '\040', '\017', '\020', '\013', '\014', 213 '\021', '\027', '\005', '\022', '\024', '\031', '\025', '\011', 214 '\001', '\023', '\004', '\006', '\007', '\010', '\012', '\015', 215 '\032', '\030', '\003', '\026', '\002', '\016', NULL, NULL 216 }; 217 #endif 218 219 /* 220 * The keyboard map table. 221 * Lookup is by hardware returned language code. 222 */ 223 struct kbdmap hilkbd_map[] = { 224 KBD_US, NULL, 225 hil_us_keymap, hil_us_shiftmap, hil_us_ctrlmap, NULL, NULL, 226 227 #ifdef UK_KEYBOARD 228 KBD_UK, NULL, 229 hil_uk_keymap, hil_uk_shiftmap, hil_uk_ctrlmap, NULL, NULL, 230 #endif 231 232 0, NULL, 233 NULL, NULL, NULL, NULL, NULL, 234 }; 235 236 char *hilkbd_keymap = hil_us_keymap; 237 char *hilkbd_shiftmap = hil_us_shiftmap; 238 char *hilkbd_ctrlmap = hil_us_ctrlmap; 239 240 int 241 hilkbd_getc() 242 { 243 int status, c; 244 struct hil_dev *hiladdr = HILADDR; 245 246 status = hiladdr->hil_stat; 247 if ((status & HIL_DATA_RDY) == 0) 248 return(0); 249 c = hiladdr->hil_data; 250 switch ((status>>KBD_SSHIFT) & KBD_SMASK) { 251 case KBD_SHIFT: 252 c = hilkbd_shiftmap[c & KBD_CHARMASK]; 253 break; 254 case KBD_CTRL: 255 c = hilkbd_ctrlmap[c & KBD_CHARMASK]; 256 break; 257 case KBD_KEY: 258 c = hilkbd_keymap[c & KBD_CHARMASK]; 259 break; 260 default: 261 c = 0; 262 break; 263 } 264 return(c); 265 } 266 #endif /* SMALL */ 267 268 void 269 hilkbd_nmi() 270 { 271 struct hil_dev *hiladdr = HILADDR; 272 273 HILWAIT(hiladdr); 274 hiladdr->hil_cmd = HIL_CNMT; 275 HILWAIT(hiladdr); 276 hiladdr->hil_cmd = HIL_CNMT; 277 HILWAIT(hiladdr); 278 } 279 280 int 281 hilkbd_init() 282 { 283 struct hil_dev *hiladdr = HILADDR; 284 struct kbdmap *km; 285 u_char lang; 286 287 /* 288 * Determine the existence of a HIL keyboard. 289 */ 290 HILWAIT(hiladdr); 291 hiladdr->hil_cmd = HIL_READKBDSADR; 292 HILDATAWAIT(hiladdr); 293 lang = hiladdr->hil_data; 294 if (lang == 0) 295 return (0); 296 297 HILWAIT(hiladdr); 298 hiladdr->hil_cmd = HIL_SETARR; 299 HILWAIT(hiladdr); 300 hiladdr->hil_data = ar_format(KBD_ARR); 301 HILWAIT(hiladdr); 302 hiladdr->hil_cmd = HIL_READKBDLANG; 303 HILDATAWAIT(hiladdr); 304 lang = hiladdr->hil_data; 305 for (km = hilkbd_map; km->kbd_code; km++) { 306 if (km->kbd_code == lang) { 307 hilkbd_keymap = km->kbd_keymap; 308 hilkbd_shiftmap = km->kbd_shiftmap; 309 hilkbd_ctrlmap = km->kbd_ctrlmap; 310 } 311 } 312 HILWAIT(hiladdr); 313 hiladdr->hil_cmd = HIL_INTON; 314 } 315 #endif /* ITECONSOLE && HIL_KEYBOARD */ 316