aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Huth <thuth@linux.vnet.ibm.com>2011-12-20 17:36:28 +0100
committerThomas Huth <thuth@linux.vnet.ibm.com>2011-12-20 17:56:48 +0100
commitdeb63aa40e3de657edb426355a01fe7850cf05e9 (patch)
treef36ea85060eee045cf4ddbd4e605bed1a02e33ab
parent760473678d3c20b9e2ed876b8912f5b724e691e4 (diff)
downloadSLOF-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.fs34
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