Author: wmb Date: Wed Nov 24 21:33:20 2010 New Revision: 2036 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2036
Log: OLPC XO-1.75 - implemented a bunch of EC commands.
Added: dev/olpc/kb3700/eccmds.fth Modified: cpu/arm/olpc/1.75/devices.fth cpu/arm/olpc/1.75/ecflash.fth dev/olpc/kb3700/spicmd.fth
Modified: cpu/arm/olpc/1.75/devices.fth ============================================================================== --- cpu/arm/olpc/1.75/devices.fth Wed Nov 24 21:29:04 2010 (r2035) +++ cpu/arm/olpc/1.75/devices.fth Wed Nov 24 21:33:20 2010 (r2036) @@ -228,6 +228,7 @@
devalias keyboard /ec-spi/keyboard
+fload ${BP}/dev/olpc/kb3700/eccmds.fth fload ${BP}/cpu/arm/olpc/1.75/ecflash.fth
0 0 " d4208000" " /" begin-package \ USB Host Controller
Modified: cpu/arm/olpc/1.75/ecflash.fth ============================================================================== --- cpu/arm/olpc/1.75/ecflash.fth Wed Nov 24 21:29:04 2010 (r2035) +++ cpu/arm/olpc/1.75/ecflash.fth Wed Nov 24 21:33:20 2010 (r2036) @@ -1,20 +1,6 @@ \ See license at end of file purpose: Reflash the EC code
-0 value ec-ih -: open-ec ( -- ) - ec-ih 0= if - " /eccmd" open-dev to ec-ih - then - ec-ih 0= abort" Can't open eccmd node" -; -: close-ec ( -- ) - ec-ih if - ec-ih close-dev - 0 to ec-ih - then -; - h# 10000 value /ec-flash
char 3 value expected-ec-version @@ -45,24 +31,20 @@ ; : flash-ec ( "filename" -- ) get-ec-file - open-ec - " enter-updater" ec-ih $call-method - ." Erasing ..." " erase-flash" ec-ih $call-method cr - ." Writing ..." load-base /ec-flash 0 " write-flash" ec-ih $call-method cr + " enter-updater" $call-ec + ." Erasing ..." " erase-flash" $call-ec cr + ." Writing ..." load-base /ec-flash 0 " write-flash" $call-ec cr ." Verifying ..." - load-base /ec-flash + /ec-flash 0 " read-flash" ec-ih $call-method + load-base /ec-flash + /ec-flash 0 " read-flash" $call-ec load-base load-base /ec-flash + /ec-flash comp abort" Miscompare!" cr - " reboot-ec" ec-ih $call-method - close-ec + reset-ec ; : read-ec-flash ( -- ) - open-ec - " enter-updater" ec-ih $call-method - flash-buf /ec-flash 0 " read-flash" ec-ih $call-method -\ " reboot-ec" ec-ih $call-method - close-ec + " enter-updater" $call-ec + flash-buf /ec-flash 0 " read-flash" $call-ec +\ " reboot-ec" $call-ec ; : save-ec-flash ( "name" -- ) safe-parse-word $new-file
Added: dev/olpc/kb3700/eccmds.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ dev/olpc/kb3700/eccmds.fth Wed Nov 24 21:33:20 2010 (r2036) @@ -0,0 +1,116 @@ +\ See license at end of file +purpose: EC Commands for XO-1.75 and later + +0 value ec-ih +: $call-ec ( ... adr len -- ... ) ec-ih $call-method ; +: do-ec-cmd ( [ args ] #args #results cmd-code -- [ results ] ) + " ec-command" $call-ec abort" EC command failed" +; +stand-init: EC + " /ec-spi" open-dev to ec-ih +; + +: too-many-retries ( -- ) true abort" Too many EC command retries" ; +d# 10 constant #ec-retries + +: ec-cmd ( cmd -- ) 0 0 rot do-ec-cmd ; +: ec-cmd-b@ ( cmd -- w ) 0 1 rot do-ec-cmd bwjoin ; +: ec-cmd-w@ ( cmd -- w ) 0 2 rot do-ec-cmd bwjoin ; +: ec-cmd-l@ ( cmd -- l ) 0 4 rot do-ec-cmd bljoin ; +: ec-cmd-b! ( b cmd -- ) 1 0 rot do-ec-cmd ; +: ec-cmd-w! ( w cmd -- ) >r wbsplit 2 0 r> do-ec-cmd ; +: ec-cmd-l! ( l cmd -- ) >r lbsplit 4 0 r> do-ec-cmd ; + +: ec-api-ver@ ( -- b ) h# 08 ec-cmd-b@ ; +: bat-voltage@ ( -- w ) h# 10 ec-cmd-w@ ; +: bat-current@ ( -- w ) h# 11 ec-cmd-w@ ; +: bat-acr@ ( -- w ) h# 12 ec-cmd-w@ ; +: bat-temp@ ( -- w ) h# 13 ec-cmd-w@ ; +: ambient-temp@ ( -- w ) h# 14 ec-cmd-w@ ; +: bat-status@ ( -- b ) h# 15 ec-cmd-b@ ; +: bat-soc@ ( -- b ) h# 16 ec-cmd-b@ ; + +: (bat-gauge-id@) ( -- sn0 .. sn7 ) 0 8 h# 17 do-ec-cmd ; +: bat-gauge-id@ ( -- sn0 .. sn7 ) + #ec-retries 0 do + ['] (bat-gauge-id@) catch 0= if unloop exit then + loop + too-many-retries +; +: (bat-gauge@) ( -- b ) h# 31 1 1 h# 18 do-ec-cmd ; \ 31 is the EEPROM address +: bat-gauge@ ( -- b ) + #ec-retries 0 do + ['] (bat-gauge@) catch 0= if unloop exit then + loop + too-many-retries +; + +: (bat-type@) ( -- b ) h# 5f 1 1 h# 18 do-ec-cmd ; \ 5f is the EEPROM address +: bat-type@ ( -- b ) + #ec-retries 0 do + ['] (bat-type@) catch 0= if unloop exit then + loop + too-many-retries +; + +: board-id ( -- n ) h# 19 ec-cmd-w@ ; +: reset-ec ( -- ) h# 28 ec-cmd ; + +: autowack-on ( -- ) 1 33 ec-cmd-b! ; +: autowack-off ( -- ) 0 33 ec-cmd-b! ; + +: ec-echo ( ... n -- ... ) dup h# 52 do-ec-cmd ; + +[ifdef] notdef +#define CMD_READ_BATT_ERR_CODE 0x1f +#define CMD_READ_BATTERY_TYPE 0x2c +#define CMD_SET_EC_WAKEUP_TIMER 0x36 +#define CMD_READ_EXT_SCI_MASK 0x37 +#define CMD_WRITE_EXT_SCI_MASK 0x38 +#define CMD_CLEAR_EC_WAKEUP_TIMER 0x39 +#define CMD_ENABLE_RUNIN_DISCHARGE 0x3B +#define CMD_DISABLE_RUNIN_DISCHARGE 0x3C +#define CMD_READ_MPPT_ACTIVE 0x3d +#define CMD_READ_MPPT_LIMIT 0x3e +#define CMD_SET_MPPT_LIMIT 0x3f +#define CMD_DISABLE_MPPT 0x40 +#define CMD_ENABLE_MPPT 0x41 +#define CMD_READ_VIN 0x42 +#define CMD_EXT_SCI_QUERY 0x43 +#define CMD_READ_LOCATION 0x44 +#define CMD_WRITE_LOCATION 0x45 +#define CMD_KEYBOARD_CMD 0x46 +#define CMD_TOUCHPAD_CMD 0x47 +#define RSP_KEYBOARD_DATA 0x48 +#define RSP_TOUCHPAD_DATA 0x49 +#define CMD_GET_FW_VER 0x4a +#define CMD_POWER_CYCLE 0x4b +#define CMD_POWER_OFF 0x4c +#define CMD_RESET_EC_SOFT 0x4d +#define CMD_READ_GUAGE_U16 0x4e +#define CMD_ENABLE_MOUSE 0x4f +[then] + +\ LICENSE_BEGIN +\ Copyright (c) 2010 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
Modified: dev/olpc/kb3700/spicmd.fth ============================================================================== --- dev/olpc/kb3700/spicmd.fth Wed Nov 24 21:29:04 2010 (r2035) +++ dev/olpc/kb3700/spicmd.fth Wed Nov 24 21:33:20 2010 (r2036) @@ -280,7 +280,6 @@
0 instance value port# : set-port ( port# -- ) to port# ; -\ : put-data ( byte -- ) port# 2 0 d# 99 ec-command ; \ XXX : get-data? ( -- false | data true ) port# deque? ( false | data true ) poll @@ -292,7 +291,6 @@ loop true \ abort" Timeout waiting for data from device" ; -\ : put-get-data ( cmd -- data | -1 ) put-data get-data ; \ Wait until the device stops sending data : clear-out-buf ( -- ) begin d# 120 ms get-data? while drop repeat ;
@@ -331,16 +329,6 @@ >r >r >r 0 0 0 r> r> r> data-command ;
-new-device -" " " 2" set-args -" eccmd" name -my-space " reg" integer-property -: open ( -- flag ) - my-unit " set-port" $call-parent - true -; -: close ( -- ) -; 8 buffer: ec-cmdbuf d# 16 buffer: ec-respbuf : expected-response-length ( -- n ) ec-cmdbuf 1+ c@ h# f and ; @@ -357,11 +345,12 @@ dup 5 > abort" Too many EC command arguments" ec-cmdbuf 3 + swap bounds ?do i c! loop ( ) ; -: timed-get-data ( -- b ) +: timed-get-results ( -- b ) get-msecs d# 20 + begin ( limit ) - " get-data?" $call-parent if ( limit data ) - nip exit + 2 deque? if ( limit b ) + nip exit ( -- b ) then ( limit ) + poll ( limit ) dup get-msecs - 0< ( limit ) until ( limit ) drop @@ -370,7 +359,7 @@
: get-results ( -- [ results ] ) ec-respbuf #results bounds ?do - timed-get-data i c! + timed-get-results i c! loop
#results 0 ?do \ XXX maybe this loop should go backwards? @@ -380,19 +369,28 @@ : ec-command ( [ args ] #args #results cmd-code -- [ results ] error? ) 0 set-cmdbuf
- ec-cmdbuf 8 false " no-data-command" $call-parent + ec-cmdbuf 8 false no-data-command
get-results false ; +: put-data ( byte -- ) + 1 0 + port# case + 3 of h# 46 endof + 4 of h# 47 endof + ( default ) 3drop exit + endcase ( byte #args #results cmd ) + ec-command drop +; +: put-get-data ( cmd -- data | -1 ) put-data get-data ; + : enter-updater ( -- ) 0 0 h# 50 1 set-cmdbuf
- ec-respbuf 1 true ec-cmdbuf 8 true " data-command" $call-parent + ec-respbuf 1 true ec-cmdbuf 8 true data-command ;
-: reboot-ec ( -- ) 0 0 h# 28 ec-command drop ; - create pgm-cmd h# 51 c, h# 84 c, d# 16 c, h# 02 c, h# 00 c, 0 c, 0 c, 0 c, create read-cmd h# 51 c, h# 04 c, d# 16 c, h# 03 c, h# 00 c, 0 c, 0 c, 0 c, create rdstat-cmd h# 51 c, h# 01 c, d# 01 c, h# 05 c, h# 80 c, 0 c, 0 c, 0 c, @@ -405,9 +403,8 @@ lbsplit drop ( low mid hi r: template ) r@ 4 + c! r@ 5 + c! r> 6 + c! ; -: flash-command ( datadr datlen in? template -- ) - 8 true " data-command" $call-parent -; +: flash-command ( datadr datlen in? template -- ) data-command ; + : write-flash-chunk ( adr len offset -- ) \ len limited to 16 bytes for now over pgm-cmd set-offset&len ( adr len ) false pgm-cmd flash-command ( ) @@ -459,8 +456,6 @@ drop ( ) ;
-finish-device - new-device " " " 3" set-args fload ${BP}/dev/pckbd.fth