[openfirmware] [commit] r1815 - dev/olpc/keyboard
repository service
svn at openfirmware.info
Thu Jun 3 21:20:54 CEST 2010
Author: wmb
Date: Thu Jun 3 21:20:54 2010
New Revision: 1815
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1815
Log:
OLPC keyboard selftest - added support for new mechanical keyboard.
Modified:
dev/olpc/keyboard/selftest.fth
Modified: dev/olpc/keyboard/selftest.fth
==============================================================================
--- dev/olpc/keyboard/selftest.fth Thu Jun 3 21:15:38 2010 (r1814)
+++ dev/olpc/keyboard/selftest.fth Thu Jun 3 21:20:54 2010 (r1815)
@@ -7,6 +7,9 @@
dev /8042/keyboard
hex
+\ This is 1 for the original rubber keyboard and 2 for the mechanical keyboard
+1 value keyboard-type
+
\ There are two scancode tables:
\ 1. simple scancode (down values); up value is f0 + scancode
\ 2. e0 + scancode (down values); up value is e0 + f0 + scancode
@@ -74,7 +77,7 @@
;
: make-button ( x y -- ) button-w button-h (make-key) ;
-: make-keys ( -- )
+: make-keys1 ( -- )
0 to #keys
top-key-row
2 0 do make-single-key loop
@@ -101,8 +104,38 @@
make-space-key
5 0 do make-single-key loop
;
+: make-narrower-key ( -- ) d# 65 make-key&gap ;
+: make-wider-key ( -- ) d# 83 make-key&gap ;
+: make-keys2 ( -- )
+ 0 to #keys
+ top-key-row
+ d# 15 0 do d# 69 make-key&gap loop \ exc, f1-f12,ins,del
+ next-key-row
+ make-narrower-key \ `
+ d# 10 0 do make-wider-key loop \ 1-0
+ make-narrower-key \ -
+ d# 95 make-key&gap \ bksp
+ next-key-row
+ d# 95 make-key&gap \ Tab
+ d# 10 0 do make-wider-key loop \ Q-P
+ make-narrower-key make-narrower-key \ []
+ next-key-row
+ d# 125 make-key&gap \ ctrl
+ d# 9 0 do make-wider-key loop \ A-L
+ make-narrower-key \ ;
+ d# 125 make-key&gap \ enter
+
+ next-key-row
+ d# 160 make-key&gap \ lshift
+ d# 7 0 do make-wider-key loop
+ d# 3 0 do make-narrower-key loop
+ d# 125 make-key&gap \ rshift
+ next-key-row
+ make-wider-key make-wider-key make-narrower-key make-wider-key \ fn hand \ alt
+ d# 330 make-key&gap \ space
+ 7 0 do d# 60 make-key&gap loop \ altgr,+,",left,down,up,right
+;
: make-buttons
- h# 59 to #keys
d# 80 d# 30 make-button \ Rocker up 65
d# 30 d# 80 make-button \ Rocker left 67
d# 130 d# 80 make-button \ Rocker right 68
@@ -172,11 +205,27 @@
-1 to last-1 -1 to last-2
;
-h# ffd5ab57 constant funny-map
-create all-keys-bitmap
+\ Funny-map1 has bits clear at the locations of intermediate
+\ slider keys. Those keys are only active by pressing the fn
+\ key, and need not be tested during operator finger-sweeps of the
+\ keyboard. It is okay if the operator tests them, so we mask
+\ off those bits if they happen to be set in the bitmap.
+h# ffd5ab57 constant funny-map1
+
+create all-keys-bitmap1
57 c, ab c, d5 c, ff c, ff c, ff c, ff c, ff c, \ Omits the intermediate slider keys
ff c, ff c, ff c, ff c, 03 c, 00 c, 00 c, 00 c,
+\ The mechanical keyboard has no slider keys. All displayed button locations are
+\ activated by pressing single keystrokes, so the map is dense
+h# ffffff constant funny-map2
+create all-keys-bitmap2
+ff c, ff c, ff c, ff c, ff c, ff c, ff c, ff c,
+ff c, ff c, 3f c, 00 c, 00 c, 00 c, 00 c, 00 c,
+
+: all-keys-bitmap ( -- adr ) keyboard-type 2 = if all-keys-bitmap2 else all-keys-bitmap1 then ;
+: funny-map ( -- adr ) keyboard-type 2 = if funny-map2 else funny-map1 then ;
+
defer all-tested?
: all-keys-tested? ( -- flag )
key-bitmap @ funny-map and key-bitmap !
@@ -184,9 +233,15 @@
;
' all-keys-tested? to all-tested?
-: all-buttons-tested? ( -- flag )
+: all-buttons-tested?1 ( -- flag )
key-bitmap h# b + w@ h# 3fe and h# 3fe =
;
+: all-buttons-tested?2 ( -- flag )
+ key-bitmap h# 9 + w@ h# 3fe0 and h# 3fe0 =
+;
+: all-buttons-tested? ( -- flag )
+ keyboard-type 2 = if all-buttons-tested?1 else all-buttons-tested?2 then
+;
\ This table is indexed by the (unescaped) scanset1 code, giving
\ an IBM physical key number.
@@ -218,14 +273,14 @@
h# 38 of d# 62 endof \ R ALT
\ For a standard PC keyboard
-\ h# 1c of d# 64 endof \ Numeric enter
-\ h# 1d of d# 64 endof \ R CTRL
-\ h# 52 of d# 75 endof \ Insert
-\ h# 53 of d# 76 endof \ Delete
-\ h# 47 of d# 80 endof \ Home
-\ h# 4f of d# 81 endof \ End
-\ h# 49 of d# 85 endof \ PageUp
-\ h# 51 of d# 86 endof \ PageDown
+( \ ) h# 1c of d# 64 endof \ Numeric enter
+( \ ) h# 1d of d# 64 endof \ R CTRL
+ h# 52 of d# 75 endof \ Insert
+ h# 53 of d# 76 endof \ Delete
+( \ ) h# 47 of d# 80 endof \ Home
+( \ ) h# 4f of d# 81 endof \ End
+( \ ) h# 49 of d# 85 endof \ PageUp
+( \ ) h# 51 of d# 86 endof \ PageDown
h# 3b of d# 112 endof \ Fn 1
h# 3c of d# 113 endof \ Fn 2
@@ -292,7 +347,7 @@
\ "ibm#" is the key number as shown on the original IBM PC documents
\ These keynum values are from the ALPS spec "CL1-matrix-20060920.pdf"
decimal
-create ibm#s
+create ibm#s1
\ Top row, key#s 0x00-0x18
110 c, 135 c, \ ESC, view source
112 c, 136 c, 113 c, 137 c, 114 c, 138 c, 115 c, \ Left bar
@@ -319,9 +374,47 @@
150 c, 151 c, 152 c, 153 c, \ Rocker up, left, right, down
154 c, \ Rotate
156 c, 157 c, 158 c, 159 c, \ Game O, square, check, X
-here ibm#s - constant /ibm#s
+here ibm#s1 - constant /ibm#s1
hex
+\ "key#" is a physical location on the screen
+\ "ibm#" is the key number as shown on the original IBM PC documents
+\ The actual #s for F6 and F7 are 146 and 147, but the EC does some magic
+decimal
+create ibm#s2
+ \ Top row, key#s 0x00-0x18
+ 110 c, \ ESC
+ 112 c, 113 c, 114 c, 115 c, 116 c, 117 c, \ F1-F6
+ 118 c, 119 c, 120 c, 121 c, 122 c, 123 c, \ F6-F12
+\ 148 c, 149 c, \ ins, del
+ 75 c, 76 c, \ ins, del
+
+ \ Number row
+ 1 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, 8 c, 9 c, 10 c, 11 c, 12 c, 15 c, \ 1 is really 150
+
+ \ Top alpha row - tab QWERTYUIOP []
+ 16 c, 17 c, 18 c, 19 c, 20 c, 21 c, 22 c, 23 c, 24 c, 25 c, 26 c, 27 c, 28 c, \ 28 is really 151
+
+ \ Middle alpha row - ctrl ASDFGHIJKL ; enter
+ 58 c, 31 c, 32 c, 33 c, 34 c, 35 c, 36 c, 37 c, 38 c, 39 c, 40 c, 43 c,
+
+ \ Bottom alpha row - shift ZXCVBNM , . / shift
+ 44 c, 46 c, 47 c, 48 c, 49 c, 50 c, 51 c, 52 c, 53 c, 54 c, 55 c, 57 c,
+
+ \ Function row - fn grab \ alt space altgr .. left down up right 29 is really 152, 13>153, 41>154
+ 59 c, 127 c, 29 c, 60 c, 61 c, 62 c, 13 c, 41 c, 79 c, 84 c, 83 c, 89 c,
+
+ \ Game buttons - key#s 0x59 - 0x61 (these IBM#s are made up just for this program)
+ 150 c, 151 c, 152 c, 153 c, \ Rocker up, left, right, down
+ 154 c, \ Rotate
+ 156 c, 157 c, 158 c, 159 c, \ Game O, square, check, X
+here ibm#s2 - constant /ibm#s2
+hex
+
+: make-keys ( -- ) keyboard-type 2 = if make-keys2 else make-keys1 then ;
+: ibm#s ( -- adr ) keyboard-type 2 = if ibm#s2 else ibm#s1 then ;
+: /ibm#s ( -- len ) keyboard-type 2 = if /ibm#s2 else /ibm#s1 then ;
+
: ibm#>key# ( ibm# -- true | key# false )
/ibm#s 0 ?do ( ibm# )
dup ibm#s i + c@ = if
@@ -468,8 +561,8 @@
clear-key-bitmap
get-msecs to last-timestamp
begin
- get-data? if
- process-raw
+ get-data? if ( scancode )
+ process-raw ( exit? )
get-msecs to last-timestamp
else
final-test? smt-test? or if
@@ -484,10 +577,21 @@
: toss-keys ( -- ) begin key? while key drop repeat ;
+: set-keyboard-type ( -- )
+ " KM" find-tag if ( adr len )
+ -null ( adr' len' )
+ " olpc2" $= if 2 else 1 then ( type )
+ else ( )
+ 1 ( type )
+ then ( type )
+ to keyboard-type
+;
warning @ warning off
: selftest ( -- error? )
open 0= if true exit then
+ set-keyboard-type
+
\ Being able to open the keyboard is good enough in SMT mode
\ smt-test? if close false exit then
More information about the openfirmware
mailing list