Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/sys/dev/uart/uart_kbd_sun.c 162711 2006-09-27 19:57:02Z ru $");
---
> __FBSDID("$FreeBSD: head/sys/dev/uart/uart_kbd_sun.c 163890 2006-11-02 00:01:15Z marius $");
31a32
> #include "opt_sunkbd.h"
32a34,38
> #if (defined(SUNKBD_EMULATE_ATKBD) && defined(SUNKBD_DFLT_KEYMAP)) || \
> !defined(SUNKBD_EMULATE_ATKBD)
> #define KBD_DFLT_KEYMAP
> #endif
>
39,40c45
< #include <sys/malloc.h>
< #include <sys/ktr.h>
---
> #include <sys/limits.h>
43d47
< #include <machine/resource.h>
45,46d48
< #include <sys/rman.h>
<
47a50
> #include <dev/kbd/kbdtables.h>
53a57
> #if !defined(SUNKBD_EMULATE_ATKBD)
54a59
> #endif
55a61,63
> #if defined(SUNKBD_EMULATE_ATKBD) && defined(SUNKBD_DFLT_KEYMAP)
> #include "sunkbdmap.h"
> #endif
58c66
< #define SUNKBD_BUF_SIZE 128
---
> #define SUNKBD_DRIVER_NAME "sunkbd"
66a75,76
> int sc_checked_key;
>
70a81,83
> int sc_composed_char;
> int sc_flags;
> #define KPCOMPOSE (1 << 0)
74a88,91
>
> #if defined(SUNKBD_EMULATE_ATKBD)
> int sc_buffered_char[2];
> #endif
99a117,119
> #if defined(SUNKBD_EMULATE_ATKBD)
> static int keycode2scancode(int keycode, int shift, int up);
> #endif
128,152c148,177
< static fkeytab_t fkey_tab[96] = {
< /* 01-04 */ {"\033[M", 3}, {"\033[N", 3}, {"\033[O", 3}, {"\033[P", 3},
< /* 05-08 */ {"\033[Q", 3}, {"\033[R", 3}, {"\033[S", 3}, {"\033[T", 3},
< /* 09-12 */ {"\033[U", 3}, {"\033[V", 3}, {"\033[W", 3}, {"\033[X", 3},
< /* 13-16 */ {"\033[Y", 3}, {"\033[Z", 3}, {"\033[a", 3}, {"\033[b", 3},
< /* 17-20 */ {"\033[c", 3}, {"\033[d", 3}, {"\033[e", 3}, {"\033[f", 3},
< /* 21-24 */ {"\033[g", 3}, {"\033[h", 3}, {"\033[i", 3}, {"\033[j", 3},
< /* 25-28 */ {"\033[k", 3}, {"\033[l", 3}, {"\033[m", 3}, {"\033[n", 3},
< /* 29-32 */ {"\033[o", 3}, {"\033[p", 3}, {"\033[q", 3}, {"\033[r", 3},
< /* 33-36 */ {"\033[s", 3}, {"\033[t", 3}, {"\033[u", 3}, {"\033[v", 3},
< /* 37-40 */ {"\033[w", 3}, {"\033[x", 3}, {"\033[y", 3}, {"\033[z", 3},
< /* 41-44 */ {"\033[@", 3}, {"\033[[", 3}, {"\033[\\",3}, {"\033[]", 3},
< /* 45-48 */ {"\033[^", 3}, {"\033[_", 3}, {"\033[`", 3}, {"\033[{", 3},
< /* 49-52 */ {"\033[H", 3}, {"\033[A", 3}, {"\033[I", 3}, {"-" , 1},
< /* 53-56 */ {"\033[D", 3}, {"\033[E", 3}, {"\033[C", 3}, {"+" , 1},
< /* 57-60 */ {"\033[F", 3}, {"\033[B", 3}, {"\033[G", 3}, {"\033[L", 3},
< /* 61-64 */ {"\177", 1}, {"\033[J", 3}, {"\033[~", 3}, {"\033[}", 3},
< /* 65-68 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 69-72 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 73-76 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 77-80 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 81-84 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 85-88 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 89-92 */ {"", 0} , {"", 0} , {"", 0} , {"", 0} ,
< /* 93-96 */ {"", 0} , {"", 0} , {"", 0} , {"", 0}
---
> #if defined(SUNKBD_EMULATE_ATKBD)
>
> #define SCAN_PRESS 0x000
> #define SCAN_RELEASE 0x080
> #define SCAN_PREFIX_E0 0x100
> #define SCAN_PREFIX_E1 0x200
> #define SCAN_PREFIX_CTL 0x400
> #define SCAN_PREFIX_SHIFT 0x800
> #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
> SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
>
> #define NOTR 0x0 /* no translation */
>
> static const uint8_t sunkbd_trtab[] = {
> NOTR, 0x6d, 0x78, 0x6e, 0x79, 0x3b, 0x3c, 0x44, /* 0x00 - 0x07 */
> 0x3d, 0x57, 0x3e, 0x58, 0x3f, 0x5d, 0x40, NOTR, /* 0x08 - 0x0f */
> 0x41, 0x42, 0x43, 0x38, 0x5f, 0x68, 0x5c, 0x46, /* 0x10 - 0x17 */
> 0x61, 0x6e, 0x70, 0x64, 0x62, 0x01, 0x02, 0x03, /* 0x18 - 0x1f */
> 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, /* 0x20 - 0x27 */
> 0x0c, 0x0d, 0x29, 0x0e, 0x66, 0x77, 0x5b, 0x37, /* 0x28 - 0x2f */
> 0x7a, 0x71, 0x53, 0x72, 0x5e, 0x0f, 0x10, 0x11, /* 0x30 - 0x37 */
> 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, /* 0x38 - 0x3f */
> 0x1a, 0x1b, 0x67, 0x6b, 0x47, 0x48, 0x49, 0x4a, /* 0x40 - 0x47 */
> 0x73, 0x74, 0x63, NOTR, 0x1d, 0x1e, 0x1f, 0x20, /* 0x48 - 0x4f */
> 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, /* 0x50 - 0x57 */
> 0x2b, 0x1c, 0x59, 0x4b, 0x4c, 0x4d, 0x52, 0x75, /* 0x58 - 0x5f */
> 0x60, 0x76, 0x45, 0x2a, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x60 - 0x67 */
> 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, NOTR, /* 0x68 - 0x6f */
> 0x4f, 0x50, 0x51, NOTR, NOTR, NOTR, 0x6c, 0x3a, /* 0x70 - 0x77 */
> 0x69, 0x39, 0x6a, 0x65, 0x56, 0x4e, NOTR, NOTR /* 0x78 - 0x7f */
154a180,181
> #endif
>
158c185
< int tries;
---
> int c, id, ltries, tries;
161,162d187
< int ltries;
<
170a196
> id = -1;
172c198,199
< if (uart_poll(di) == SKBD_RSP_IDLE)
---
> switch (c = uart_poll(di)) {
> case -1:
173a201,205
> case SKBD_RSP_IDLE:
> return (id);
> default:
> id = c;
> }
176,181d207
< if (ltries == 0)
< continue;
< uart_putc(di, SKBD_CMD_LAYOUT);
< if (uart_getc(di) != SKBD_RSP_LAYOUT)
< break;
< return (uart_getc(di));
215c241
< if (sunkbd_probe_keyboard(&uart_keyboard) == -1)
---
> if (sunkbd_probe_keyboard(&uart_keyboard) != KB_SUN4)
220,221c246
< sc->sc_repeat_key = -1;
< sc->sc_repeating = 0;
---
> sunkbd_clear_state(&sc->sc_kbd);
223c248,253
< kbd_init_struct(&sc->sc_kbd, "sunkbd", KB_OTHER, 0, 0, 0, 0);
---
> #if defined(SUNKBD_EMULATE_ATKBD)
> kbd_init_struct(&sc->sc_kbd, SUNKBD_DRIVER_NAME, KB_101, 0, 0, 0, 0);
> kbd_set_maps(&sc->sc_kbd, &key_map, &accent_map, fkey_tab,
> sizeof(fkey_tab) / sizeof(fkey_tab[0]));
> #else
> kbd_init_struct(&sc->sc_kbd, SUNKBD_DRIVER_NAME, KB_OTHER, 0, 0, 0, 0);
226a257
> #endif
287d317
<
292a323
>
299a331
>
306a339
>
313a347
>
320a355
>
327a363
>
334a371
>
341a379
>
349,350c387,409
< TODO;
< return (0);
---
> struct sunkbd_softc *sc;
>
> if (!KBD_IS_ACTIVE(kbd))
> return (FALSE);
>
> sc = (struct sunkbd_softc *)kbd;
>
> #if defined(SUNKBD_EMULATE_ATKBD)
> if (sc->sc_buffered_char[0])
> return (TRUE);
> #endif
>
> if (sc->sc_repeating)
> return (TRUE);
>
> if (sc->sc_uart != NULL && !uart_rx_empty(sc->sc_uart))
> return (TRUE);
>
> if (sc->sc_polling != 0 && sc->sc_sysdev != NULL &&
> (sc->sc_checked_key = uart_poll(sc->sc_sysdev)) != -1)
> return (TRUE);
>
> return (FALSE);
357,358c416
< int action;
< int key;
---
> int key, release, repeated, suncode;
360a419,434
>
> #if defined(SUNKBD_EMULATE_ATKBD)
> if (sc->sc_mode == K_RAW && sc->sc_buffered_char[0]) {
> key = sc->sc_buffered_char[0];
> if (key & SCAN_PREFIX) {
> sc->sc_buffered_char[0] = key & ~SCAN_PREFIX;
> return ((key & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
> } else {
> sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
> sc->sc_buffered_char[1] = 0;
> return (key);
> }
> }
> #endif
>
> repeated = 0;
361a436
> repeated = 1;
365,370c440,441
< key = sc->sc_repeat_key;
< if (sc->sc_mode == K_RAW)
< return (key);
< else
< return genkbd_keyaction(kbd, key & 0x7f, key & 0x80,
< &sc->sc_state, &sc->sc_accents);
---
> suncode = sc->sc_repeat_key;
> goto process_code;
372a444,449
> if (sc->sc_checked_key != -1) {
> suncode = sc->sc_checked_key;
> sc->sc_checked_key = -1;
> goto process_code;
> }
>
374c451,458
< /* XXX compose */
---
> next_code:
> if (!(sc->sc_flags & KPCOMPOSE) && (sc->sc_composed_char > 0)) {
> key = sc->sc_composed_char;
> sc->sc_composed_char = 0;
> if (key > UCHAR_MAX)
> return (ERRKEY);
> return (key);
> }
377c461
< key = uart_rx_get(sc->sc_uart);
---
> suncode = uart_rx_get(sc->sc_uart);
380,381c464,465
< key = uart_getc(sc->sc_sysdev);
< else if ((key = uart_poll(sc->sc_sysdev)) == -1)
---
> suncode = uart_getc(sc->sc_sysdev);
> else if ((suncode = uart_poll(sc->sc_sysdev)) == -1)
387c471
< switch (key) {
---
> switch (suncode) {
391d474
< ++kbd->kb_count;
393,398c476,485
< if ((key & 0x80) == 0) {
< callout_reset(&sc->sc_repeat_callout, hz / 2,
< sunkbd_repeat, sc);
< sc->sc_repeat_key = key;
< } else {
< if (sc->sc_repeat_key == (key & 0x7f)) {
---
> process_code:
> ++kbd->kb_count;
> key = SKBD_KEY_CHAR(suncode);
> release = suncode & SKBD_KEY_RELEASE;
> if (!repeated) {
> if (release == 0) {
> callout_reset(&sc->sc_repeat_callout,
> hz / 2, sunkbd_repeat, sc);
> sc->sc_repeat_key = suncode;
> } else if (sc->sc_repeat_key == key) {
404c491,541
< if (sc->sc_mode == K_RAW)
---
> #if defined(SUNKBD_EMULATE_ATKBD)
> key = sunkbd_trtab[key];
> if (key == NOTR)
> return (NOKEY);
>
> if (!repeated) {
> switch (key) {
> case 0x1d: /* ctrl */
> if (release != 0)
> sc->sc_flags &= ~CTLS;
> else
> sc->sc_flags |= CTLS;
> break;
> case 0x2a: /* left shift */
> case 0x36: /* right shift */
> if (release != 0)
> sc->sc_flags &= ~SHIFTS;
> else
> sc->sc_flags |= SHIFTS;
> break;
> case 0x38: /* alt */
> case 0x5d: /* altgr */
> if (release != 0)
> sc->sc_flags &= ~ALTS;
> else
> sc->sc_flags |= ALTS;
> break;
> }
> }
> if (sc->sc_mode == K_RAW) {
> key = keycode2scancode(key, sc->sc_flags,
> release);
> if (key & SCAN_PREFIX) {
> if (key & SCAN_PREFIX_CTL) {
> sc->sc_buffered_char[0] =
> 0x1d | (key & SCAN_RELEASE);
> sc->sc_buffered_char[1] =
> key & ~SCAN_PREFIX;
> } else if (key & SCAN_PREFIX_SHIFT) {
> sc->sc_buffered_char[0] =
> 0x2a | (key & SCAN_RELEASE);
> sc->sc_buffered_char[1] =
> key & ~SCAN_PREFIX_SHIFT;
> } else {
> sc->sc_buffered_char[0] =
> key & ~SCAN_PREFIX;
> sc->sc_buffered_char[1] = 0;
> }
> return ((key & SCAN_PREFIX_E0) ?
> 0xe0 : 0xe1);
> }
405a543,553
> }
> switch (key) {
> case 0x5c: /* print screen */
> if (sc->sc_flags & ALTS)
> key = 0x54; /* sysrq */
> break;
> case 0x68: /* pause/break */
> if (sc->sc_flags & CTLS)
> key = 0x6c; /* break */
> break;
> }
407c555,632
< action = genkbd_keyaction(kbd, key & 0x7f, key & 0x80,
---
> if (sc->sc_mode == K_CODE)
> return (key | release);
> #else
> if (sc->sc_mode == K_RAW || sc->sc_mode == K_CODE)
> return (suncode);
> #endif
>
> #if defined(SUNKBD_EMULATE_ATKBD)
> if (key == 0x38) { /* left alt (KP compose key) */
> #else
> if (key == 0x13) { /* left alt (KP compose key) */
> #endif
> if (release != 0) {
> if (sc->sc_flags & KPCOMPOSE) {
> sc->sc_flags &= ~KPCOMPOSE;
> if (sc->sc_composed_char > UCHAR_MAX)
> sc->sc_composed_char = 0;
> }
> } else {
> if (!(sc->sc_flags & KPCOMPOSE)) {
> sc->sc_flags |= KPCOMPOSE;
> sc->sc_composed_char = 0;
> }
> }
> }
> if (sc->sc_flags & KPCOMPOSE) {
> switch (suncode) {
> case 0x44: /* KP 7 */
> case 0x45: /* KP 8 */
> case 0x46: /* KP 9 */
> sc->sc_composed_char *= 10;
> sc->sc_composed_char += suncode - 0x3d;
> if (sc->sc_composed_char > UCHAR_MAX)
> return (ERRKEY);
> goto next_code;
> case 0x5b: /* KP 4 */
> case 0x5c: /* KP 5 */
> case 0x5d: /* KP 6 */
> sc->sc_composed_char *= 10;
> sc->sc_composed_char += suncode - 0x58;
> if (sc->sc_composed_char > UCHAR_MAX)
> return (ERRKEY);
> goto next_code;
> case 0x70: /* KP 1 */
> case 0x71: /* KP 2 */
> case 0x72: /* KP 3 */
> sc->sc_composed_char *= 10;
> sc->sc_composed_char += suncode - 0x6f;
> if (sc->sc_composed_char > UCHAR_MAX)
> return (ERRKEY);
> goto next_code;
> case 0x5e: /* KP 0 */
> sc->sc_composed_char *= 10;
> if (sc->sc_composed_char > UCHAR_MAX)
> return (ERRKEY);
> goto next_code;
>
> case 0x44 | SKBD_KEY_RELEASE: /* KP 7 */
> case 0x45 | SKBD_KEY_RELEASE: /* KP 8 */
> case 0x46 | SKBD_KEY_RELEASE: /* KP 9 */
> case 0x5b | SKBD_KEY_RELEASE: /* KP 4 */
> case 0x5c | SKBD_KEY_RELEASE: /* KP 5 */
> case 0x5d | SKBD_KEY_RELEASE: /* KP 6 */
> case 0x70 | SKBD_KEY_RELEASE: /* KP 1 */
> case 0x71 | SKBD_KEY_RELEASE: /* KP 2 */
> case 0x72 | SKBD_KEY_RELEASE: /* KP 3 */
> case 0x5e | SKBD_KEY_RELEASE: /* KP 0 */
> goto next_code;
> default:
> if (sc->sc_composed_char > 0) {
> sc->sc_flags &= ~KPCOMPOSE;
> sc->sc_composed_char = 0;
> return (ERRKEY);
> }
> }
> }
>
> key = genkbd_keyaction(kbd, key, release,
409,411c634,635
< if (action != NOKEY)
< return (action);
< break;
---
> if (key != NOKEY || repeated)
> return (key);
420,421c644,653
< TODO;
< return (0);
---
> struct sunkbd_softc *sc;
>
> if (!KBD_IS_ACTIVE(kbd))
> return (FALSE);
>
> sc = (struct sunkbd_softc *)kbd;
> if (!(sc->sc_flags & KPCOMPOSE) && (sc->sc_composed_char > 0))
> return (TRUE);
>
> return (sunkbd_check(kbd));
428c660
< int error;
---
> int c, error;
480c712
< if (sc->sc_uart == NULL)
---
> if (sc->sc_sysdev == NULL)
482,484c714
< sc->sc_uart->sc_txdatasz = 2;
< sc->sc_uart->sc_txbuf[0] = SKBD_CMD_SETLED;
< sc->sc_uart->sc_txbuf[1] = 0;
---
> c = 0;
486c716
< sc->sc_uart->sc_txbuf[1] |= SKBD_LED_CAPSLOCK;
---
> c |= SKBD_LED_CAPSLOCK;
488c718
< sc->sc_uart->sc_txbuf[1] |= SKBD_LED_NUMLOCK;
---
> c |= SKBD_LED_NUMLOCK;
490,491c720,724
< sc->sc_uart->sc_txbuf[1] |= SKBD_LED_SCROLLLOCK;
< UART_TRANSMIT(sc->sc_uart);
---
> c |= SKBD_LED_SCROLLLOCK;
> uart_lock(sc->sc_sysdev->hwmtx);
> sc->sc_sysdev->ops.putc(&sc->sc_sysdev->bas, SKBD_CMD_SETLED);
> sc->sc_sysdev->ops.putc(&sc->sc_sysdev->bas, c);
> uart_unlock(sc->sc_sysdev->hwmtx);
526a760
>
534c768,783
< /* TODO; */
---
> struct sunkbd_softc *sc;
>
> sc = (struct sunkbd_softc *)kbd;
> sc->sc_checked_key = -1;
> sc->sc_repeat_key = -1;
> sc->sc_accents = 0;
> sc->sc_composed_char = 0;
> sc->sc_flags = 0;
> sc->sc_polling = 0;
> sc->sc_repeating = 0;
> sc->sc_state &= LOCK_MASK; /* Preserve locking key state. */
>
> #if defined(SUNKBD_EMULATE_ATKBD)
> sc->sc_buffered_char[0] = 0;
> sc->sc_buffered_char[1] = 0;
> #endif
539a789
>
546a797
>
566a818
>
582a835,876
>
> #if defined(SUNKBD_EMULATE_ATKBD)
> static int
> keycode2scancode(int keycode, int shift, int up)
> {
> static const int scan[] = {
> /* KP enter, right ctrl, KP divide */
> 0x1c , 0x1d , 0x35 ,
> /* print screen */
> 0x37 | SCAN_PREFIX_SHIFT,
> /* right alt, home, up, page up, left, right, end */
> 0x38, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x4f,
> /* down, page down, insert, delete */
> 0x50, 0x51, 0x52, 0x53,
> /* pause/break (see also below) */
> 0x46,
> /*
> * MS: left window, right window, menu
> * also Sun: left meta, right meta, compose
> */
> 0x5b, 0x5c, 0x5d,
> /* Sun type 6 USB */
> /* help, stop, again, props, undo, front, copy */
> 0x68, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
> /* open, paste, find, cut, audiomute, audiolower, audioraise */
> 0x64, 0x65, 0x66, 0x67, 0x25, 0x1f, 0x1e,
> /* power */
> 0x20
> };
> int scancode;
>
> scancode = keycode;
> if ((keycode >= 89) && (keycode < 89 + sizeof(scan) / sizeof(scan[0])))
> scancode = scan[keycode - 89] | SCAN_PREFIX_E0;
> /* pause/break */
> if ((keycode == 104) && !(shift & CTLS))
> scancode = 0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL;
> if (shift & SHIFTS)
> scancode &= ~SCAN_PREFIX_SHIFT;
> return (scancode | (up ? SCAN_RELEASE : SCAN_PRESS));
> }
> #endif