Author: quozl Date: Mon Nov 3 08:27:15 2014 New Revision: 3744 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3744
Log: OLPC XO-1.75 XO-4 - backport XO-4 EC recovery changes into the XO-1.75 EC recovery script, and test.
Modified: cpu/arm/olpc/edi.fth cpu/x86/pc/olpc/via/Notes/fix-ec-175.fth cpu/x86/pc/olpc/via/Notes/fix-ec-4.fth
Modified: cpu/arm/olpc/edi.fth ============================================================================== --- cpu/arm/olpc/edi.fth Fri Oct 31 06:29:38 2014 (r3743) +++ cpu/arm/olpc/edi.fth Mon Nov 3 08:27:15 2014 (r3744) @@ -1,7 +1,7 @@ \ See license at end of file purpose: Access and FLASH programming for KB3731 EC via its "EDI" interface
-\ The following code depends on externally-privided low-level SPI bus +\ The following code depends on externally-provided low-level SPI bus \ access primitives that are defined in "bbedi.fth" for the "native" \ case (EC and CPU on the same machine). They can also be implemented \ for tethered programming from a different machine like an XO-1.5.
Modified: cpu/x86/pc/olpc/via/Notes/fix-ec-175.fth ============================================================================== --- cpu/x86/pc/olpc/via/Notes/fix-ec-175.fth Fri Oct 31 06:29:38 2014 (r3743) +++ cpu/x86/pc/olpc/via/Notes/fix-ec-175.fth Mon Nov 3 08:27:15 2014 (r3744) @@ -3,15 +3,21 @@ \ HOWTO USE THIS \ Put this file and ecimage.bin (32768 bytes) on a USB stick, insert into XO-1.5 \ Connect 6-pin programming cable from XO-1.5 recovery driver port (J3) to -\ XO-1.75 A2 EDI "REFLASH EC HEADER" (J3) +\ XO-1.75 EDI "REFLASH EC HEADER" (J3) \ Power on XO-1.5 \ Power on XO-1.75 \ ok fload u:\fixec175.fth \ ok select /spi -\ ok recover-ec +\ ok excavate-ec u:\old.bin +\ ok recover-ec u:\ecimage.bin
dev /spi
+\ from cpu/arm/olpc/1.75/config.fth +char 4 constant expected-ec-version +h# 8000 constant /ec-flash +h# 7e80 constant ec-flags-offset \ don't program or verify this page + : pio16mhz ( -- ) h# 01 h# 6c spi-b! \ 33/(2*1) MHz h# 00 h# 6e spi-b! \ No special clocking @@ -54,6 +60,7 @@ out-ptr @ spi-b@ 8 out-ptr ! ; +: spi-start ( -- ) ;
: edi-wait-b ( -- b ) 4 #in-bytes ! @@ -79,7 +86,7 @@
\ *** Start of verbatim inclusion of edi.fth
-\ The following code depends on externally-privided low-level SPI bus +\ The following code depends on externally-provided low-level SPI bus \ access primitives that are defined in "bbedi.fth" for the "native" \ case (EC and CPU on the same machine). They can also be implemented \ for tethered programming from a different machine like an XO-1.5. @@ -91,7 +98,44 @@ \ spi-out ( byte -- ) - Send byte \ spi-in ( -- byte ) - Receive byte
+0 value edi-chip-id +: kb9010? ( -- flag ) edi-chip-id 4 = ; + +: efcfg ( -- reg# ) kb9010? if h# fead else h# fea0 then ; +: efcmd ( -- reg# ) kb9010? if h# feac else h# fea7 then ; +: efdat ( -- reg# ) kb9010? if h# feab else h# feaa then ; \ io3731 has different read and write regs +h# feab constant efdat-in +: rst8051 ( -- reg# ) kb9010? if h# ff14 else h# f010 then ; +: ecreboot ( -- reg# ) kb9010? if h# ff01 else h# f018 then ; +\ Issues with .py code +\ A14:A8 should be A15:A8 several places +\ inconsistent use of handle vs gd.handle in edi_erase_chip + +\ KB9010 stuff... +d# 59 d# 1024 * constant /kb9010-flash +h# fe80 constant wdtcfg +h# fe81 constant wdtpf +h# fe82 constant wdt +h# fea2 constant shccfg +\ h# fea5 constant xbicfg \ Unused +h# fea6 constant xbics +\ h# feae constant efdatr \ Unused +\ h# feaf constant emfburw +h# feb2 constant xbiwp +\ h# feb6 constant xbipump +\ h# feb7 constant xbifm +\ h# feb8 constant sbivr +h# feb9 constant xbis +h# ff0d constant clkcfg +h# ff0f constant pllcfg +h# ff1d constant ecsts +h# ff1f constant pllcfg2 +h# ff14 constant pxcfg + +\ end KB9010 stuff... + d# 128 constant /flash-page +defer edi-progress ' 2drop to edi-progress ( offset size -- )
: edi-cmd,adr ( offset cmd -- ) \ Send command plus 3 address bytes spi-cs-on ( offset cmd ) @@ -103,12 +147,22 @@ ; [ifndef] edi-wait-b : edi-wait-b ( -- b ) \ Wait for and receive EC response byte - d# 10 0 do - spi-in h# 50 = if - spi-in ( b ) - spi-cs-off ( b ) - unloop exit - then + d# 100 0 do + spi-in ( d ) + dup h# 5f <> if ( d ) + dup h# 50 = if ( d ) + drop + spi-in ( b ) + spi-cs-off ( b ) + unloop exit + then ( d ) + spi-cs-off ( d ) + \ The setup in the CL4 has can also report zeros when inactive. + 2dup h# ff = 00 = or abort" EDI byte in inactive" + ." Unknown EDI byte in response: " .h cr + true abort" EDI byte in confused" + then ( d ) + drop loop spi-cs-off true abort" EDI byte in timeout" @@ -142,18 +196,25 @@ ; [then] : reset-8051 ( -- ) \ Reset 8-5 - h# f010 edi-b@ 1 or h# f010 edi-b! + rst8051 edi-b@ 1 or rst8051 edi-b! ; : unreset-8051 ( -- ) \ Reset 8-5 - h# f010 edi-b@ 1 invert and h# f010 edi-b! + rst8051 edi-b@ 1 invert and rst8051 edi-b! + d# 2000 ms ;
\ 0 in bit 0 selects masked ROM as code source for 8051, 1 selects FLASH \ The 8051 should be in reset mode when changing that bit. + : select-flash ( -- ) \ Setup for access to FLASH inside the EC + kb9010? if exit then h# f011 edi-b@ 1 or h# f011 edi-b! ;
+: edi-read-id ( -- id ) + spi-cs-on h# 3e spi-out spi-in spi-cs-off +; + : probe-rdid ( -- found? ) \ Verify that the EC is the one we think it is select-flash h# f01c ['] edi-w@ catch if ( x ) @@ -163,12 +224,15 @@ 1 invert and h# 3730 = ;
+: finished? ( b -- flag ) + kb9010? if 2 and 0= else h# 80 and h# 80 = then +; : wait-flash-busy ( -- ) \ Wait for an erase/programming operation to complete get-msecs h# 1000 + ( limit ) begin ( limit ) - h# fea0 edi-b@ ( limit b ) - h# 80 and if ( limit ) - drop exit + efcfg edi-b@ ( limit b ) + finished? if ( limit ) + drop exit ( -- ) then ( limit ) dup get-msecs - 0<= ( limit timeout? ) until ( limit ) @@ -176,11 +240,12 @@ true abort" EDI FLASH busy timeout" ;
-: flash-cmd ( b -- ) h# fea7 edi-b! ; +: flash-cmd ( b -- ) efcmd edi-b! ;
: set-offset ( offset -- ) - wbsplit ( offset-low offset-hi ) - h# fea9 edi-b! h# fea8 edi-b! ( ) + lbsplit drop ( offset-low mid hi ) + kb9010? if h# feaa edi-b! else drop then ( offset-low mid ) + h# fea9 edi-b! h# fea8 edi-b! ( ) ;
: erase-page ( offset -- ) @@ -189,14 +254,19 @@ h# 20 flash-cmd ( ) ;
-: erase-chip ( -- ) wait-flash-busy h# 60 flash-cmd wait-flash-busy ; +: erase-chip ( -- ) + 0 set-offset \ New code does this (and does not wait-flash-busy) + wait-flash-busy h# 60 flash-cmd wait-flash-busy +;
-: send-byte ( b offset -- ) set-offset h# feaa edi-b! 2 flash-cmd ; +: send-byte ( b offset -- ) set-offset efdat edi-b! 2 flash-cmd ;
: edi-program-page ( adr offset -- ) \ Clear HVPL wait-flash-busy h# 80 flash-cmd ( adr offset )
+ wait-flash-busy ( adr offset ) \ Necessary? + \ Fill the page buffer swap /flash-page bounds do ( offset ) i c@ over send-byte ( offset ) @@ -206,10 +276,10 @@
\ Commit the buffer to the FLASH memory wait-flash-busy ( ) \ Redundant wait? - h# 70 flash-cmd ( ) + h# 70 flash-cmd ( ) \ Program page command wait-flash-busy ( ) ; -h# 7e80 constant ec-flags-offset + : edi-program-flash ( adr len offset -- ) cr ( adr len offset ) swap 0 ?do ( adr offset ) @@ -218,6 +288,7 @@ dup i + erase-page ( adr offset ) over i + over i + edi-program-page ( adr offset ) then ( adr offset ) + i /ec-flash edi-progress ( adr offset ) /flash-page +loop ( adr offset ) 2drop ( ) ; @@ -229,12 +300,14 @@ edi-next-b@ i c! ( ) loop ( ) ; + : trim@ ( offset -- b ) set-offset h# 90 flash-cmd wait-flash-busy - h# feab edi-b@ + efdat-in edi-b@ \ reg: efdat ; + : trim-tune ( -- ) \ firmware-id 0= if \ Read trim data and write to register (for ENE macros) @@ -293,39 +366,148 @@ then \ then ; -: edi-open ( -- ) - \ slow-edi-clock \ Target speed between 1 and 2 MHz +: set-chip-id ( -- ) + ['] edi-read-id catch if ( ) + edi-read-id ( id ) + then ( id ) + to edi-chip-id +; +: kb9010-init ( -- ) + h# 00 xbics edi-b! + h# 00 xbiwp edi-b! \ Clear XBI write protection + h# ff wdt edi-b! \ Disable WDT + h# 00 wdtcfg edi-b! + h# 00 wdtpf edi-b! + h# 00 shccfg edi-b! \ Disable SHC + h# 0c clkcfg edi-b! \ Set the 8051 to 32Mhz + h# 08 efcfg edi-b! \ Enable the embedded flash cmd mode +; +base @ hex +create special-row 1f0 w, 1f1 w, 1f2 w, 1f4 w, 1f5 w, 1f6 w, 1f3 w, +create dest-regs feb9 w, feb6 w, feb6 w, feb7 w, feb8 w, feb8 w, feb7 w, +create source-bits 1f c, 0f c, 0f c, 0f c, 07 c, 1f c, 0f c, +create dest-bits 1f c, f0 c, 0f c, 0f c, e0 c, 1f c, f0 c, +create shift-cnt 0 c, 4 c, 0 c, 0 c, 5 c, 0 c, 4 c, +base ! +: kb9010-trimtune ( -- ) + h# 1ff trim@ 0<> if + 7 0 do + special-row i wa+ w@ edi-b@ ( data ) + source-bits i ca+ c@ or ( field ) + shift-cnt i ca+ c@ lshift ( field' ) + dest-regs i wa+ w@ edi-b@ ( field dest ) + dest-bits i ca+ c@ invert and or ( dest' ) + dest-regs i wa+ w@ edi-b! ( ) + loop + wait-flash-busy + then + h# 80 trim@ h# 5a = if + ecsts edi-b@ ( old-ecsts ) + dup 4 or ecsts edi-b! ( old-ecsts ) \ chipid is now pllcfg2 + + xbis edi-b@ h# 3f and ( old-ecsts xbis-bits ) + h# 81 trim@ 3 and 6 lshift or ( old-ecsts xbis-value ) + xbis edi-b! ( old-ecsts ) + + h# 82 trim@ h# f and 4 lshift ( old-ecsts pll-high ) + h# 83 trim@ h# f0 and 4 rshift or ( old-ecsts pll-value ) + pllcfg edi-b! ( old-ecsts ) + + pllcfg2 edi-b@ h# 3f and ( old-ecsts pll2-bits ) + h# 82 trim@ h# 30 and 2 lshift or ( old-ecsts pll2-value ) + pllcfg2 edi-b! ( old-ecsts ) + + ecsts edi-b! ( ) + then +; +\ This is used to start EDI from routines where you do not want to +\ put the EC into reset. ie the mfg tag reading routines +: edi-open-active ( -- ) spi-start - \ The first operation often fails so retry it - ['] select-flash catch if select-flash then + + \ Does a dummy ready and throws away the result. + \ required to get the EDI interface enabled + h# ff22 ['] edi-b@ catch 2drop + + set-chip-id + + select-flash +; +\ Full EDI startup sequece. Used when you want to reprogram the EC. +: edi-open ( -- ) + edi-open-active + reset-8051 - trim-tune - \ fast-edi-clock \ Target speed up to 16 MHz - \ reset + + kb9010? if + kb9010-init + kb9010-trimtune + else + trim-tune + then ; + \ *** End of verbatim inclusion of edi.fth
-: recover-ec ( -- ) +\ *** Start of selective inclusion of cpu/arm/olpc/ecflash.fth + +: check-signature ( adr -- ) + /ec-flash + h# 100 - ( adr' ) + dup " XO-EC" comp abort" Bad signature in EC image" ( adr ) + dup ." EC firmware version: " cscount type cr ( adr ) + dup 6 + c@ expected-ec-version <> abort" Wrong EC version" ( adr ) + drop +; + +: ?ec-image-valid ( adr len -- ) + dup /ec-flash <> abort" Image file is the wrong size" ( adr len ) + over c@ h# 02 <> abort" Invalid EC image - must start with 02" + 2dup 0 -rot bounds ?do i l@ + /l +loop ( adr len checksum ) + abort" Incorrect EC image checksum" ( adr len ) + over check-signature ( adr len ) + 2drop +; + +0 value ec-file-loaded? +: get-ec-file ( "name" -- ) + safe-parse-word ." Reading " 2dup type cr + $read-open + load-base /ec-flash ifd @ fgets ( len ) + ifd @ fclose ( len ) + load-base swap ?ec-image-valid +; + +: ignore-ec-flags ( adr -- ) ec-flags-offset + /flash-page erase ; +: reflash-ec ( -- ) + pio1.5mhz edi-open - " u:\ecimage.bin" $read-file abort" Read error" ( adr len ) - erase-chip ( adr len ) - 2dup 0 edi-program-flash ( adr len ) - load-base 8000 0 edi-read-flash ( adr len ) - 2dup load-base swap comp if ." Different" then ( adr len ) - free-mem ( ) + erase-chip + ." Writing ..." load-base /ec-flash 0 edi-program-flash cr + ." Verifying ..." + load-base /ec-flash + /ec-flash 0 edi-read-flash + + load-base ignore-ec-flags + load-base /ec-flash + ignore-ec-flags + load-base load-base /ec-flash + /ec-flash comp + abort" Miscompare!" + cr ; +: recover-ec ( "filename" -- ) get-ec-file reflash-ec ;
-: read-ec ( -- ) +: read-ec-flash ( -- ) pio1.5mhz edi-open - load-base h# 8000 0 edi-read-flash ( ) - ." Writing EC image to u:\ecimage.bin" - " u:\ecimage.bin" $new-file ( ) - load-base h# 8000 ofd @ fputs ( ) - ofd @ fclose ( ) - ." Written" cr + flash-buf /ec-flash 0 edi-read-flash ; +: excavate-ec ( "name" -- ) + safe-parse-word $new-file + read-ec-flash + load-base /ec-flash ofd @ fputs + ofd @ fclose +; + +\ *** End of selective inclusion of cpu/arm/olpc/ecflash.fth
dend
Modified: cpu/x86/pc/olpc/via/Notes/fix-ec-4.fth ============================================================================== --- cpu/x86/pc/olpc/via/Notes/fix-ec-4.fth Fri Oct 31 06:29:38 2014 (r3743) +++ cpu/x86/pc/olpc/via/Notes/fix-ec-4.fth Mon Nov 3 08:27:15 2014 (r3744) @@ -60,6 +60,7 @@ out-ptr @ spi-b@ 8 out-ptr ! ; +: spi-start ( -- ) ;
: edi-wait-b ( -- b ) 4 #in-bytes !
openfirmware@openfirmware.info