From: miod Date: Tue, 25 Jul 2023 10:00:44 +0000 (+0000) Subject: Extend the PCKBC_CANT_TRANSLATE feature, specific to Tadpole/RDI hardware, X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=0c77ed638bd446250a35aa709acff10176d4c273;p=openbsd Extend the PCKBC_CANT_TRANSLATE feature, specific to Tadpole/RDI hardware, to also support scan code set #3 in addition to the existing scan code set #2. This makes the built-in keyboard on the Tadpole UltraBook IIe work. --- diff --git a/sys/arch/hppa/gsc/gsckbc.c b/sys/arch/hppa/gsc/gsckbc.c index 439316477e0..2873705aff7 100644 --- a/sys/arch/hppa/gsc/gsckbc.c +++ b/sys/arch/hppa/gsc/gsckbc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gsckbc.c,v 1.21 2022/03/13 08:04:38 mpi Exp $ */ +/* $OpenBSD: gsckbc.c,v 1.22 2023/07/25 10:00:44 miod Exp $ */ /* * Copyright (c) 2003, Miodrag Vallat. * All rights reserved. @@ -581,8 +581,9 @@ pckbc_poll_data(self, slot) } int -pckbc_xt_translation(self) +pckbc_xt_translation(self, table) pckbc_tag_t self; + int *table; { /* Translation isn't supported... */ return (-1); diff --git a/sys/arch/sparc64/dev/pckbc_ebus.c b/sys/arch/sparc64/dev/pckbc_ebus.c index 9dbc8e79695..40aaf1ad2c6 100644 --- a/sys/arch/sparc64/dev/pckbc_ebus.c +++ b/sys/arch/sparc64/dev/pckbc_ebus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pckbc_ebus.c,v 1.16 2022/10/16 01:22:39 jsg Exp $ */ +/* $OpenBSD: pckbc_ebus.c,v 1.17 2023/07/25 10:00:44 miod Exp $ */ /* * Copyright (c) 2002 Jason L. Wright (jason@thought.net) @@ -112,16 +112,42 @@ pckbc_ebus_attach(struct device *parent, struct device *self, void *aux) } /* - * The 8042 controller found on the Tadpole SPARCLE doesn't + * Tadpole/RDI systems use a 8042 controller which does not * implement XT scan code translation. - * XXX I have not checked the value of the model property on - * XXX UltraAXe boards... + * - on the SPARCLE and the Viper, which sport a PC-style + * keyboard with no L function keys, the keyboard defaults + * to scan code set #2. + * - on the UltraBook IIe, which sports a complete Sun-style + * keyboard with L function keys and diamond keys, + * the keyboard defaults to scan code set #3. */ { - char model[128]; - OF_getprop(ea->ea_node, "model", &model, sizeof model); - if (strcmp(model, "INTC,80c42") == 0) - flags = PCKBC_CANT_TRANSLATE | PCKBC_NEED_AUXWRITE; + char buf[128]; + OF_getprop(ea->ea_node, "model", buf, sizeof buf); + if (strcmp(buf, "INTC,80c42") == 0) { + /* + * This is a Tadpole/RDI system. Tell the RDI design + * (UltraBook IIe) from the Tadpole design (SPARCLE) + * by looking for a tadpmu child node in the latter. + */ + int sparcle = 0; + int node; + for (node = OF_child(sc->sc_node); node; + node = OF_peer(node)) { + if (OF_getprop(node, "name", buf, + sizeof buf) <= 0) + continue; + if (strcmp(buf, "tadpmu") == 0) { + sparcle = 1; + break; + } + } + flags = PCKBC_NEED_AUXWRITE; + if (sparcle) + flags |= PCKBC_FIXED_SET2; + else + flags |= PCKBC_FIXED_SET3; + } } if (console) { diff --git a/sys/dev/ic/pckbc.c b/sys/dev/ic/pckbc.c index a6d7ad333b4..52f634139bf 100644 --- a/sys/dev/ic/pckbc.c +++ b/sys/dev/ic/pckbc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pckbc.c,v 1.53 2019/11/30 18:18:34 cheloha Exp $ */ +/* $OpenBSD: pckbc.c,v 1.54 2023/07/25 10:00:44 miod Exp $ */ /* $NetBSD: pckbc.c,v 1.5 2000/06/09 04:58:35 soda Exp $ */ /* @@ -514,12 +514,20 @@ pckbc_poll_data(pckbc_tag_t self, pckbc_slot_t slot) * set scancode translation on */ int -pckbc_xt_translation(pckbc_tag_t self) +pckbc_xt_translation(pckbc_tag_t self, int *table) { struct pckbc_internal *t = self; - if (ISSET(t->t_flags, PCKBC_CANT_TRANSLATE)) +#ifdef __sparc64__ /* only pckbc@ebus on sparc64 uses this */ + if ((t->t_flags & PCKBC_CANT_TRANSLATE) != 0) { + /* Hardware lacks translation capability. Nothing to do! */ + if (t->t_flags & PCKBC_FIXED_SET2) + *table = 2; + else /* PCKBC_FIXED_SET3 */ + *table = 3; return (-1); + } +#endif if (t->t_cmdbyte & KC8_TRANS) return (0); diff --git a/sys/dev/ic/pckbcvar.h b/sys/dev/ic/pckbcvar.h index bc254bcf7a0..f90f6dce7f3 100644 --- a/sys/dev/ic/pckbcvar.h +++ b/sys/dev/ic/pckbcvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pckbcvar.h,v 1.16 2017/03/11 11:55:03 mpi Exp $ */ +/* $OpenBSD: pckbcvar.h,v 1.17 2023/07/25 10:00:44 miod Exp $ */ /* $NetBSD: pckbcvar.h,v 1.4 2000/06/09 04:58:35 soda Exp $ */ /* @@ -52,9 +52,14 @@ struct pckbc_internal { u_char t_cmdbyte; /* shadow */ int t_flags; -#define PCKBC_CANT_TRANSLATE 0x0001 /* can't translate to XT scancodes */ -#define PCKBC_NEED_AUXWRITE 0x0002 /* need auxwrite command to find aux */ - int t_haveaux; /* controller has an aux port */ + /* need auxwrite command to find aux */ +#define PCKBC_NEED_AUXWRITE 0x0001 + /* can't translate to XT scancodes, stuck to set #2 */ +#define PCKBC_FIXED_SET2 0x0002 + /* can't translate to XT scancodes, stuck to set #3 */ +#define PCKBC_FIXED_SET3 0x0004 +#define PCKBC_CANT_TRANSLATE (PCKBC_FIXED_SET2 | PCKBC_FIXED_SET3) + int t_haveaux; /* controller has an aux port */ struct pckbc_slotdata *t_slotdata[PCKBC_NSLOTS]; @@ -100,7 +105,7 @@ int pckbc_poll_data(pckbc_tag_t, pckbc_slot_t); int pckbc_poll_data1(bus_space_tag_t, bus_space_handle_t, bus_space_handle_t, pckbc_slot_t, int); void pckbc_set_poll(pckbc_tag_t, pckbc_slot_t, int); -int pckbc_xt_translation(pckbc_tag_t); +int pckbc_xt_translation(pckbc_tag_t, int *); void pckbc_slot_enable(pckbc_tag_t, pckbc_slot_t, int); void pckbc_attach(struct pckbc_softc *, int); diff --git a/sys/dev/pckbc/pckbd.c b/sys/dev/pckbc/pckbd.c index 8e1e0bb9b30..71ccf514758 100644 --- a/sys/dev/pckbc/pckbd.c +++ b/sys/dev/pckbc/pckbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pckbd.c,v 1.49 2023/07/24 19:29:39 miod Exp $ */ +/* $OpenBSD: pckbd.c,v 1.50 2023/07/25 10:00:44 miod Exp $ */ /* $NetBSD: pckbd.c,v 1.24 2000/06/05 22:20:57 sommerfeld Exp $ */ /*- @@ -93,8 +93,8 @@ struct pckbd_internal { pckbc_tag_t t_kbctag; pckbc_slot_t t_kbcslot; - int t_translating; - int t_table; + int t_translating; /* nonzero if hardware performs translation */ + int t_table; /* scan code set in use */ int t_lastchar; int t_extended; @@ -215,11 +215,22 @@ int pckbd_set_xtscancode(pckbc_tag_t kbctag, pckbc_slot_t kbcslot, struct pckbd_internal *id) { - int table = 3; + int table = 0; - if (pckbc_xt_translation(kbctag)) { + if (pckbc_xt_translation(kbctag, &table)) { #ifdef DEBUG printf("pckbd: enabling of translation failed\n"); +#endif +#ifdef __sparc64__ /* only pckbc@ebus on sparc64 uses this */ + /* + * If hardware lacks translation capability, stick to the + * table it is using. + */ + if (table != 0) { + id->t_translating = 0; + id->t_table = table; + return 0; + } #endif /* * Since the keyboard controller can not translate scan @@ -234,6 +245,7 @@ pckbd_set_xtscancode(pckbc_tag_t kbctag, pckbc_slot_t kbcslot, if (id != NULL) id->t_translating = 0; } else { + table = 3; if (id != NULL) { id->t_translating = 1; if (id->t_table == 0) { @@ -494,7 +506,11 @@ pckbd_enable(void *v, int on) return (0); } -const u_int8_t pckbd_xtbl[] = { +/* + * Scan code set #2 translation tables + */ + +const u_int8_t pckbd_xtbl2[] = { /* 0x00 */ 0, RAWKEY_f9, @@ -639,7 +655,7 @@ const u_int8_t pckbd_xtbl[] = { 0 /* Alt-Print Screen */ }; -const u_int8_t pckbd_xtbl_ext[] = { +const u_int8_t pckbd_xtbl2_ext[] = { /* 0x00 */ 0, 0, @@ -777,8 +793,169 @@ const u_int8_t pckbd_xtbl_ext[] = { 0 }; +#ifdef __sparc64__ /* only pckbc@ebus on sparc64 uses this */ + +/* + * Scan code set #3 translation table + */ + +const u_int8_t pckbd_xtbl3[] = { +/* 0x00 */ + 0, + RAWKEY_L5, /* Front */ + RAWKEY_L1, /* Stop */ + RAWKEY_L3, /* Props */ + 0, + RAWKEY_L7, /* Open */ + RAWKEY_L9, /* Find */ + RAWKEY_f1, + RAWKEY_Escape, + RAWKEY_L10, /* Cut */ + 0, + 0, + 0, + RAWKEY_Tab, + RAWKEY_grave, + RAWKEY_f2, +/* 0x10 */ + RAWKEY_Help, + RAWKEY_Control_L, + RAWKEY_Shift_L, + 0, + RAWKEY_Caps_Lock, + RAWKEY_q, + RAWKEY_1, + RAWKEY_f3, + 0, + RAWKEY_Alt_L, + RAWKEY_z, + RAWKEY_s, + RAWKEY_a, + RAWKEY_w, + RAWKEY_2, + RAWKEY_f4, +/* 0x20 */ + 0, + RAWKEY_c, + RAWKEY_x, + RAWKEY_d, + RAWKEY_e, + RAWKEY_4, + RAWKEY_3, + RAWKEY_f5, + RAWKEY_L4, /* Undo */ + RAWKEY_space, + RAWKEY_v, + RAWKEY_f, + RAWKEY_t, + RAWKEY_r, + RAWKEY_5, + RAWKEY_f6, +/* 0x30 */ + RAWKEY_L2, /* Again */ + RAWKEY_n, + RAWKEY_b, + RAWKEY_h, + RAWKEY_g, + RAWKEY_y, + RAWKEY_6, + RAWKEY_f7, + 0, + RAWKEY_Alt_R, + RAWKEY_m, + RAWKEY_j, + RAWKEY_u, + RAWKEY_7, + RAWKEY_8, + RAWKEY_f8, +/* 0x40 */ + 0, + RAWKEY_comma, + RAWKEY_k, + RAWKEY_i, + RAWKEY_o, + RAWKEY_0, + RAWKEY_9, + RAWKEY_f9, + RAWKEY_L6, /* Copy */ + RAWKEY_period, + RAWKEY_slash, + RAWKEY_l, + RAWKEY_semicolon, + RAWKEY_p, + RAWKEY_minus, + RAWKEY_f10, +/* 0x50 */ + 0, + 0, + RAWKEY_apostrophe, + 0, + RAWKEY_bracketleft, + RAWKEY_equal, + RAWKEY_f11, + RAWKEY_Print_Screen, + RAWKEY_Control_R, + RAWKEY_Shift_R, + RAWKEY_Return, + RAWKEY_bracketright, + RAWKEY_backslash, + 0, + RAWKEY_f12, + RAWKEY_Hold_Screen, +/* 0x60 */ + RAWKEY_Down, + RAWKEY_Left, + RAWKEY_Pause, + RAWKEY_Up, + RAWKEY_Delete, + RAWKEY_End, + RAWKEY_BackSpace, + RAWKEY_Insert, + RAWKEY_L8, /* Paste */ + RAWKEY_KP_End, + RAWKEY_Right, + RAWKEY_KP_Left, + RAWKEY_KP_Home, + RAWKEY_Next, + RAWKEY_Home, + RAWKEY_Prior, +/* 0x70 */ + RAWKEY_KP_Insert, + RAWKEY_KP_Delete, + RAWKEY_KP_Down, + RAWKEY_KP_Begin, + RAWKEY_KP_Right, + RAWKEY_KP_Up, + RAWKEY_Num_Lock, + RAWKEY_KP_Divide, + 0, + RAWKEY_KP_Enter, + RAWKEY_KP_Next, + 0, + RAWKEY_KP_Add, + RAWKEY_KP_Prior, + RAWKEY_KP_Multiply, + 0, +/* 0x80 */ + 0, + 0, + 0, + 0, + RAWKEY_KP_Subtract, + 0, + 0, + 0, + 0, + 0, + 0, + RAWKEY_Meta_L, + RAWKEY_Meta_R +}; + +#endif + /* - * Translate scan codes from set 2 to set 1 + * Translate scan codes from set 2 or 3 to set 1 */ int pckbd_scancode_translate(struct pckbd_internal *id, int datain) @@ -791,24 +968,38 @@ pckbd_scancode_translate(struct pckbd_internal *id, int datain) return 0; /* consume scancode */ } - /* - * Convert BREAK sequence (14 77 -> 1D 45) - */ - if (id->t_extended1 == 2 && datain == 0x14) - return 0x1d | id->t_releasing; - else if (id->t_extended1 == 1 && datain == 0x77) - return 0x45 | id->t_releasing; - - if (id->t_extended != 0) { - if (datain >= sizeof pckbd_xtbl_ext) - datain = 0; - else - datain = pckbd_xtbl_ext[datain] & ~0x80; - } else { - if (datain >= sizeof pckbd_xtbl) + switch (id->t_table) { + case 2: + /* + * Convert BREAK sequence (14 77 -> 1D 45) + */ + if (id->t_extended1 == 2 && datain == 0x14) + return 0x1d | id->t_releasing; + else if (id->t_extended1 == 1 && datain == 0x77) + return 0x45 | id->t_releasing; + + if (id->t_extended != 0) { + if (datain >= sizeof pckbd_xtbl2_ext) + datain = 0; + else + datain = pckbd_xtbl2_ext[datain]; + /* xtbl2_ext already has the upper bit set */ + id->t_extended = 0; + } else { + if (datain >= sizeof pckbd_xtbl2) + datain = 0; + else + datain = pckbd_xtbl2[datain] & ~0x80; + } + break; +#ifdef __sparc64__ /* only pckbc@ebus on sparc64 uses this */ + case 3: + if (datain >= sizeof pckbd_xtbl3) datain = 0; else - datain = pckbd_xtbl[datain] & ~0x80; + datain = pckbd_xtbl3[datain] & ~0x80; + break; +#endif } if (datain == 0) { @@ -1022,11 +1213,8 @@ pckbd_hookup_bell(void (*fn)(void *, u_int, u_int, u_int, int), void *arg) int pckbd_cnattach(pckbc_tag_t kbctag) { - pckbd_init(&pckbd_consdata, kbctag, PCKBC_KBD_SLOT, 1); - wskbd_cnattach(&pckbd_consops, &pckbd_consdata, &pckbd_keymapdata); - return (0); }