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