Author: wmb Date: Thu May 26 01:13:22 2011 New Revision: 2225 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2225
Log: OLPC trac #10888 - Handle XO-1.75 game buttons in keyboard selftest.
Modified: cpu/arm/olpc/1.75/fw.bth dev/olpc/keyboard/selftest.fth
Modified: cpu/arm/olpc/1.75/fw.bth ============================================================================== --- cpu/arm/olpc/1.75/fw.bth Wed May 25 23:41:47 2011 (r2224) +++ cpu/arm/olpc/1.75/fw.bth Thu May 26 01:13:22 2011 (r2225) @@ -156,19 +156,6 @@ : close ; end-package
-fload ${BP}/dev/logdev.fth -0 value smt-test? \ !!! -0 value final-test? \ !!! -fload ${BP}/cpu/x86/pc/olpc/disptest.fth -fload ${BP}/dev/olpc/keyboard/selftest.fth \ Keyboard diagnostic -fload ${BP}/dev/olpc/touchpad/syntpad.fth \ Touchpad diagnostic -fload ${BP}/cpu/x86/pc/olpc/gridmap.fth \ Gridded display tools -fload ${BP}/cpu/x86/pc/olpc/via/copynand.fth -fload ${BP}/cpu/arm/olpc/1.75/exc7200-touchscreen.fth \ Touchscreen driver and diagnostic - -fload ${BP}/cpu/arm/olpc/1.75/pinch.fth \ Touchscreen gestures -: pinch " pinch" screen-ih $call-method ; - fload ${BP}/cpu/arm/mmp2/keypad.fth [ifndef] cl2-a1 stand-init: keypad @@ -210,6 +197,20 @@ ;
fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth + +fload ${BP}/dev/logdev.fth +0 value smt-test? \ !!! +0 value final-test? \ !!! +fload ${BP}/cpu/x86/pc/olpc/disptest.fth +fload ${BP}/dev/olpc/keyboard/selftest.fth \ Keyboard diagnostic +fload ${BP}/dev/olpc/touchpad/syntpad.fth \ Touchpad diagnostic +fload ${BP}/cpu/x86/pc/olpc/gridmap.fth \ Gridded display tools +fload ${BP}/cpu/x86/pc/olpc/via/copynand.fth +fload ${BP}/cpu/arm/olpc/1.75/exc7200-touchscreen.fth \ Touchscreen driver and diagnostic + +fload ${BP}/cpu/arm/olpc/1.75/pinch.fth \ Touchscreen gestures +: pinch " pinch" screen-ih $call-method ; + : emacs ( -- ) false to already-go? boot-getline to boot-file " rom:emacs" $boot
Modified: dev/olpc/keyboard/selftest.fth ============================================================================== --- dev/olpc/keyboard/selftest.fth Wed May 25 23:41:47 2011 (r2224) +++ dev/olpc/keyboard/selftest.fth Thu May 26 01:13:22 2011 (r2225) @@ -575,6 +575,97 @@ false ;
+\ For XO-1.75, the game buttons are connected directly to the CPU SoC, +\ instead of going through the EC. To preserve the rest of the test +\ logic, we generate a stream of up-down events from the game button +\ mask information. + +0 value pending-scancode \ One-byte queue for scancodes that follow an e0 prefix +0 value pending-buttons \ Bitmask of button changes that haven't been sent yet +0 value last-buttons \ State of game keys the last time we looked + +\ Finds the rightmost one bit in mask +: choose-bit ( mask -- bit# ) + d# 32 0 do ( mask ) + dup 1 and if ( mask ) + drop i unloop exit ( -- bit# ) + then ( mask ) + u2/ ( mask' ) + loop ( mask ) + drop -1 ( bit# ) \ Shouldn't happen +; + +\ Maps bit number to scancode sequence + +create button-scancodes +\ square check up down left right rotate o x +\ 0 1 2 3 4 5 6 7 8 + e067 w, e068 w, 65 w, 66 w, 67 w, 68 w, 69 w, e065 w, e066 w, + +\ If the scancode has an e0 prefix, bit#>scancode returns e0 and puts +\ the suffix scancode in pending-scancode where it will be picked up +\ the next time. +: bit#>scancode ( bit# -- scancode ) + button-scancodes over wa+ w@ ( bit# scancode ) + \ Or in the 80 bit on an "up" transition + 1 rot lshift last-buttons and 0= if ( scancode ) + h# 80 or ( scancode' ) + then ( scancode ) + dup h# ff00 and if ( scancode ) + h# ff and to pending-scancode ( scancode ) + h# e0 ( e0 ) + then ( scancode ) +; + +\ Returns the next button-related scancode byte. +: button-event? ( -- false | scancode true ) + \ Handle the suffix of an e0-scancode sequence + pending-scancode if ( ) + pending-scancode 0 to pending-scancode true ( scancode true ) + exit ( -- scancode true ) + then ( ) + + \ If the pending-buttons change mask is 0, we don't have anymore + \ events to generate from the last time around, so reread the + \ game buttons and set pending-buttons to the ones that have + \ changed. + pending-buttons 0= if + game-key@ ( new-buttons ) + dup last-buttons xor to pending-buttons ( new-buttons ) + to last-buttons ( ) + then + + \ If there are bits set in pending-buttons, generate an event from + \ the leftmost set bit and remove that bit from pending-buttons. + pending-buttons if ( ) + \ Find the rightmost changed bit + pending-buttons choose-bit ( bit# ) + + \ Remove that bit from pending-buttons so it won't be reported again + 1 over lshift invert ( bit# clear-mask ) + pending-buttons and to pending-buttons ( bit# ) + + \ Generate an up or down scancode sequence corresponding to that bit + dup bit#>scancode true ( scancode true ) + else ( ) + false ( false ) + then ( false | scancode true ) +; + +\ Check for a change in button state if necessary. +: or-button? ( [scancode] key? -- [scancode] flag ) + \ If there is already a key from get-data?, handle it before checking the game buttons + dup if exit then ( [scancode] key? phandle ) + + \ If the /ec-spi device node is present, the game buttons are directly connected + \ so we must handle them here. Otherwise the EC will handle them and fold their + \ events into the keyboard scancode stream. + " /ec-spi" find-package if ( false phandle ) + 2drop ( ) + button-event? ( [scancode] flag ) + then ( [scancode] flag ) +; + 0 value last-timestamp : selftest-keys ( -- ) false to esc? @@ -584,8 +675,8 @@ final-test? smt-test? or if key-stuck? if exit then then - get-data? if ( scancode ) - process-raw ( exit? ) + get-data? or-button? if ( scancode ) + process-raw ( exit? ) get-msecs to last-timestamp else final-test? smt-test? or if