Subject: Re: XFree keyboard handling
To: None <tech-x11@NetBSD.org>
From: Michael <macallan18@earthlink.net>
List: tech-x11
Date: 05/19/2005 08:05:49
--Signature_Thu__19_May_2005_08_05_49_-0400_tXe7v+yviu5mPbqZ
Content-Type: multipart/mixed;
 boundary=Multipart_Thu__19_May_2005_08_05_49_-0400_fp7uWxCIa_rpApGI

--Multipart_Thu__19_May_2005_08_05_49_-0400_fp7uWxCIa_rpApGI
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hello,

> The sparc64 XFree86 server works fine, as long as you have something
> like
>=20
>  Option "Protocol" "wskbd"
>  Option "Device" "/dev/wskbd0
>=20
> in your /etc/XF86Config.

Exactly.

> For completeness, and since it is the default install resulting from
> X -configure, I tried to make raw keyboard mode work.
...
> On the other hand, bsd_io.c is used and originally had no provisions
> for sun raw scancodes (via wscons). It delivers the keyboard input via
> xf86PostKbdEvent, which does not look like doing something sane in the
> "kbdSun =3D 1" case, and indeed the resulting server does not understand
> key presses.

I didn't touch the kbdSun =3D whatever stuff, but I got it to work.=20
First some explanations: With "wskbd" in the keyboard section the
Xserver reads (struct wscons_event)s from /dev/wskbd0 or whatever you
put into the Device option, translates them to AT-scancodes and feeds
them into its event queue. This usually works fine but needs some
xmodmap tweaks for some reason.=20
Without "wskbd" it simply reads from what it thinks is the console it's
running in. It calls ioctl(WSKBDIO_SETMODE, WSKBD_RAW) on the fd and
complains if the ioctl fails telling you to put Option "Protocol"
"wskbd" and so on into the keyboard section. After that it expects to
read AT-scancodes from this fd and feeds them into its event queue.
This works fine on PCs but leads to funny results on almost everything
else since Sun scancodes are only vaguely related to AT scancodes -
their usage of bit 7 as keyup/keydown indicator is the same but the
keycodes are completely different.

So to make it work I had to:
- check the keyboard type after switching to raw mode
- if it's a Sun keyboard provide translation
- translate scancodes, preserve the high bit, drop keepalives the
keyboard seems to send now and then.

The attached patch has been tested on my U1, it should work on any other
Sun with a Type 5 keyboard - no idea about older types.=20
Something similar might have to be done for Apple ADB keyboards, these
will have the same problem but need different translation.

have fun
Michael

--Multipart_Thu__19_May_2005_08_05_49_-0400_fp7uWxCIa_rpApGI
Content-Type: application/octet-stream; name=bsdkbd.patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=bsdkbd.patch

PyAuZGVwZW5kCj8gRE9ORQo/IE1ha2VmaWxlCkluZGV4OiBic2RfaW8uYwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD
UyBmaWxlOiAvY3Zzcm9vdC94c3JjL3hmcmVlL3hjL3Byb2dyYW1zL1hzZXJ2ZXIvaHcveGZyZWU4
Ni9vcy1zdXBwb3J0L2JzZC9ic2RfaW8uYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41CmRpZmYg
LXUgLXcgLXIxLjUgYnNkX2lvLmMKLS0tIGJzZF9pby5jCTI4IEZlYiAyMDAzIDIxOjQ5OjQyIC0w
MDAwCTEuNQorKysgYnNkX2lvLmMJMTkgTWF5IDIwMDUgMTE6Mzc6MjcgLTAwMDAKQEAgLTM2LDYg
KzM2LDcgQEAKIAogI2lmZGVmIFdTQ09OU19TVVBQT1JUCiAjZGVmaW5lIEtCRF9GRChpKSAoKGkp
LmtiZEZkICE9IC0xID8gKGkpLmtiZEZkIDogKGkpLmNvbnNvbGVGZCkKK3ZvaWQgeGY4NldTUmF3
U3VuS2JkRXZlbnRzKHZvaWQpOwogI2VuZGlmCiAKIHZvaWQKQEAgLTIyMyw2ICsyMjQsMTggQEAK
IAkJCQkJIk9wdGlvbiBcIlByb3RvY29sXCIgXCJ3c2tiZFwiXG4iCiAJCQkJCSJPcHRpb24gXCJE
ZXZpY2VcIiBcIi9kZXYvd3NrYmQwXCJcbiIKIAkJCQkJIlxuaW4geW91ciBYRjg2Q29uZmlnKDUp
IGZpbGVcbiIpOworCQkJLyogCisJCQkgKiB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIGV4cGVjdHMg
d3NLYmRUeXBlIHRvIGNvbnRhaW4gCisJCQkgKiBzb21ldGhpbmcgc2FuZSBzbyB3ZSBiZXR0ZXIg
aW5pdGlhbGl6ZSBpdCBoZXJlCisJCQkgKi8KKwkJCWlvY3RsKHhmODZJbmZvLmNvbnNvbGVGZCwg
V1NLQkRJT19HVFlQRSwgCisJCQkgICAgJnhmODZJbmZvLndzS2JkVHlwZSk7CisJCQlpZiAoKHhm
ODZJbmZvLndzS2JkVHlwZSA9PSBXU0tCRF9UWVBFX1NVTikgfHwgCisJCQkgICAgICh4Zjg2SW5m
by53c0tiZFR5cGUgPT0gV1NLQkRfVFlQRV9TVU41KSkgeworCQkJCXhmODZNc2coWF9JTkZPLCJG
b3VuZCBhIFN1biBrZXlib2FyZCAtIHVzaW5nICIgCQorCQkJCQkJInRyYW5zbGF0aW9uIik7CisJ
CQkJeGY4NkluZm8ua2JkRXZlbnRzID0geGY4NldTUmF3U3VuS2JkRXZlbnRzOworCQkJfQogCQl9
IGVsc2UgewogCQkJcmV0dXJuIHhmODZJbmZvLmtiZEZkOwogCQl9CkBAIC0yNzUsOCArMjg4LDcg
QEAKIHsKICAgICBzdGF0aWMgc3RydWN0IHdzY29uc19ldmVudCBldmVudHNbTlVNRVZFTlRTXTsK
ICAgICBpbnQgbiwgaTsKLQotICAgIG4gPSByZWFkKHhmODZJbmZvLmtiZEZkLCBldmVudHMsIHNp
emVvZiBldmVudHMpOworICAgIG4gPSByZWFkKEtCRF9GRCh4Zjg2SW5mbyksIGV2ZW50cywgc2l6
ZW9mIGV2ZW50cyk7CiAgICAgaWYgKG4gPD0gMCkKIAlyZXR1cm47CiAgICAgbiAvPSBzaXplb2Yo
c3RydWN0IHdzY29uc19ldmVudCk7CkBAIC0yODQsNCArMjk2LDI1IEBACiAJeGY4NlBvc3RXU0ti
ZEV2ZW50KCZldmVudHNbaV0pOwogfQogCit2b2lkCit4Zjg2V1NSYXdTdW5LYmRFdmVudHModm9p
ZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciByQnVmWzY0XTsKKwlpbnQgbkJ5dGVzLCBpOwor
CWNoYXIgY29kZSwgdHlwZSwgdHJhbnM7CisKKwlpZiAoKG5CeXRlcyA9IHJlYWQoIEtCRF9GRCh4
Zjg2SW5mbyksIChjaGFyICopckJ1Ziwgc2l6ZW9mKHJCdWYpKSkKKwkgICAgPiAwKQorCXsKKwkJ
Zm9yIChpID0gMDsgaSA8IG5CeXRlczsgaSsrKSB7CisJCQljb2RlID0gckJ1ZltpXSAmIDB4N2Y7
CisJCQlpZiAoY29kZSE9MHg3ZikgeworCQkJCXR5cGUgPSByQnVmW2ldICYgMHg4MDsKKwkJCQl0
cmFucyA9IFdTS2JkVG9LZXljb2RlKGNvZGUpOworCQkJCXhmODZQb3N0S2JkRXZlbnQodHJhbnMg
fCB0eXBlKTsKKwkJCX0KKwkJfQorCX0KK30KKwogI2VuZGlmIC8qIFdTQ09OU19TVVBQT1JUICov
Cg==

--Multipart_Thu__19_May_2005_08_05_49_-0400_fp7uWxCIa_rpApGI--

--Signature_Thu__19_May_2005_08_05_49_-0400_tXe7v+yviu5mPbqZ
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (NetBSD)

iQEVAwUBQoyBHcpnzkX8Yg2nAQIIugf6A2rhza/XM4AxWcTXxinA0ijC9YCxYBJF
XH+Mi4Yh7oLsYPN0PKO+um7T03ROB4UtmyTWZ1uRG8/yr6Erlv+WGUSgz9AZLks4
lDGCUgWIW36/sxL0KKatOrD6Xj/3dDq+PoWYDk5Ewpmpi5+1bfisOVdp0uox/8Cv
i3CwHvQ6z/6w/4SjOSNmJfYmkWy6+Oyik5TNq7cPkM+hm+Vsb+giZOSwzig+C8un
ReO4i4IE2P9xnXzhEOxF9EHOdUkhIdUlz/L8rD+pg9nMbmj/+j3PYUM6CYZq4Lhu
HIpUICTkma6Aq1W/WFkTHmXsTfwEIsanHQck67CcSKtwzFSC53NPGA==
=E2As
-----END PGP SIGNATURE-----

--Signature_Thu__19_May_2005_08_05_49_-0400_tXe7v+yviu5mPbqZ--