diff options
author | Thomas Huth <thuth@linux.vnet.ibm.com> | 2011-12-20 17:36:28 +0100 |
---|---|---|
committer | Thomas Huth <thuth@linux.vnet.ibm.com> | 2011-12-20 17:56:48 +0100 |
commit | deb63aa40e3de657edb426355a01fe7850cf05e9 (patch) | |
tree | f36ea85060eee045cf4ddbd4e605bed1a02e33ab | |
parent | 760473678d3c20b9e2ed876b8912f5b724e691e4 (diff) | |
download | SLOF-deb63aa40e3de657edb426355a01fe7850cf05e9.zip SLOF-deb63aa40e3de657edb426355a01fe7850cf05e9.tar.gz SLOF-deb63aa40e3de657edb426355a01fe7850cf05e9.tar.bz2 |
Fixes for using the USB keyboard driver on QEMU
For some reasons, interrupt transfers do not work right on QEMU, so we use
control transfers there instead. Also digest one key scancode at a time only
to avoid the problem with phantom keypresses.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
-rw-r--r-- | slof/fs/usb/usb-keyboard.fs | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/slof/fs/usb/usb-keyboard.fs b/slof/fs/usb/usb-keyboard.fs index cc09d9f..c811542 100644 --- a/slof/fs/usb/usb-keyboard.fs +++ b/slof/fs/usb/usb-keyboard.fs @@ -25,6 +25,16 @@ s" EN" encode-string s" language" property 2 constant CapsLk 4 constant ScrLk +TRUE VALUE use-interrupt-transfers? + +\ Check whether we're running on QEMU - in this case we disable the +\ interrupt transfers since they are not working very well there yet. +s" model" s" /" find-node get-property 0= IF + 2dup s" qemu" find-substr = TO use-interrupt-transfers? + drop +THEN + + 00 value kbd-addr to kbd-addr \ save speed bit @@ -121,6 +131,15 @@ s" usb-kbd-device-support.fs" included THEN ; +: kbd-get-report ( -- ) + use-interrupt-transfers? IF + int-get-report + ELSE + ctl-get-report + THEN +; + + : set-led ( led -- ) dup to led-state kbd-addr control-cls-set-report drop @@ -311,7 +330,7 @@ s" usb-kbd-device-support.fs" included 63 of [char] . endof \ keypad . dup of ret endof \ other keys are no change endcase - to ret \ overwirte new char + to ret \ overwrite new char then ret \ return char ; @@ -321,10 +340,10 @@ s" usb-kbd-device-support.fs" included true \ multi scan code key was pressed... so key is available EXIT \ done THEN - kbd-scan 0 = IF \ if no kbd-scan code is currently available - int-get-report \ check for one using int-get-report + kbd-scan 0 = IF \ if no kbd-scan code is currently available + kbd-get-report \ check for new scan codes THEN - kbd-scan 0 <> \ if a kbd-scan is available, report true, else false + kbd-scan 0 <> \ if a kbd-scan is available, report true, else false ; : usb-kread ( -- char|false ) \ usb key read for control transfer @@ -335,17 +354,14 @@ s" usb-kbd-device-support.fs" included \ check for new scan code only, if kbd-scan is not set, e.g. \ by a previous call to key-available? kbd-scan 0 = IF - \ if interrupt transfer - int-get-report \ read report (interrupt transfer) - \ else control transfer - \ ctl-get-report \ read report (control transfer) - \ end of interrupt/control switch + kbd-get-report \ read scan-code report THEN kbd-scan 0 <> if \ scan code exist? begin kbd-scan ff and dup 00 = while \ get a last scancode in report buffer kbd-scan 8 rshift to kbd-scan \ This algorithm is wrong --> must be fixed! drop \ KBD doesn't set scancode in pressed order!!! repeat + ff and dup to kbd-scan \ we can only digest one key at a time dup key-old <> if \ if the scancode is new dup to key-old \ save current scan code get-ukbd-char \ translate scan code --> char |