I got my hands on one of these sun keyboards with a compose key (and LED). uhidev0 at uhub2 port 2 configuration 1 interface 0 "Fujitsu Component Type 6 Keyboard" rev 1.00/1.02 addr 2 uhidev0: iclass 3/1 ukbd0 at uhidev0: 8 modifier keys, 6 key codes, country code 33 wskbd1 at ukbd0 mux 1 wskbd1: connecting to wsdisplay0
This diff adds support to the kernel: Index: hidkbd.c =================================================================== RCS file: /cvs/src/sys/dev/usb/hidkbd.c,v retrieving revision 1.5 diff -u -p -r1.5 hidkbd.c --- hidkbd.c 9 Nov 2011 14:22:38 -0000 1.5 +++ hidkbd.c 18 Apr 2012 23:53:55 -0000 @@ -485,6 +485,8 @@ hidkbd_set_leds(struct hidkbd *kbd, int *report |= 1 << kbd->sc_numloc.pos; if ((leds & WSKBD_LED_CAPS) && kbd->sc_capsloc.size == 1) *report |= 1 << kbd->sc_capsloc.pos; + if ((leds & WSKBD_LED_COMPOSE) && kbd->sc_compose.size == 1) + *report |= 1 << kbd->sc_compose.pos; return 1; } @@ -613,6 +615,8 @@ hidkbd_parse_desc(struct hidkbd *kbd, in id, hid_output, &kbd->sc_capsloc, NULL); hid_locate(desc, dlen, HID_USAGE2(HUP_LEDS, HUD_LED_SCROLL_LOCK), id, hid_output, &kbd->sc_scroloc, NULL); + hid_locate(desc, dlen, HID_USAGE2(HUP_LEDS, HUD_LED_COMPOSE), + id, hid_output, &kbd->sc_compose, NULL); return (NULL); } Index: hidkbdsc.h =================================================================== RCS file: /cvs/src/sys/dev/usb/hidkbdsc.h,v retrieving revision 1.2 diff -u -p -r1.2 hidkbdsc.h --- hidkbdsc.h 9 Nov 2011 14:22:38 -0000 1.2 +++ hidkbdsc.h 18 Apr 2012 23:53:55 -0000 @@ -61,6 +61,7 @@ struct hidkbd { struct hid_location sc_numloc; struct hid_location sc_capsloc; struct hid_location sc_scroloc; + struct hid_location sc_compose; int sc_leds; /* state information */ Index: ukbd.c =================================================================== RCS file: /cvs/src/sys/dev/usb/ukbd.c,v retrieving revision 1.57 diff -u -p -r1.57 ukbd.c --- ukbd.c 29 Jan 2012 11:04:19 -0000 1.57 +++ ukbd.c 18 Apr 2012 23:53:55 -0000 @@ -288,7 +288,8 @@ ukbd_attach(struct device *parent, struc } /* Flash the leds; no real purpose, just shows we're alive. */ - ukbd_set_leds(sc, WSKBD_LED_SCROLL | WSKBD_LED_NUM | WSKBD_LED_CAPS); + ukbd_set_leds(sc, WSKBD_LED_SCROLL | WSKBD_LED_NUM | + WSKBD_LED_CAPS | WSKBD_LED_COMPOSE); usbd_delay_ms(uha->parent->sc_udev, 400); ukbd_set_leds(sc, 0); And this one is my first (failed) attempt to add support to xf86-input-keyboard (it works, but comments say it all). I'm in need of a helping hand here. Index: bsd_kbd.c =================================================================== RCS file: /cvs/xenocara/driver/xf86-input-keyboard/src/bsd_kbd.c,v retrieving revision 1.17 diff -u -p -r1.17 bsd_kbd.c --- bsd_kbd.c 29 Jun 2011 20:00:23 -0000 1.17 +++ bsd_kbd.c 19 Apr 2012 01:18:31 -0000 @@ -81,6 +81,8 @@ SetKbdLeds(InputInfoPtr pInfo, int leds) if (leds & XLED3) real_leds |= LED_SCR; if (leds & XLED4) real_leds |= LED_SCR; #endif + /* XXX: no idea where 0x10 comes from */ + if (leds & 0x10) real_leds |= WSKBD_LED_COMPOSE; switch (pKbd->consType) { @@ -91,7 +93,11 @@ SetKbdLeds(InputInfoPtr pInfo, int leds) #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) case SYSCONS: case PCVT: +#if defined(WSCONS_SUPPORT) /* XXX */ + ioctl(pInfo->fd, WSKBDIO_SETLEDS, &real_leds); +#else ioctl(pInfo->fd, KDSETLED, real_leds); +#endif break; #endif #if defined(WSCONS_SUPPORT) -- Alexander Polakov | plhk.ru