Author: wmb Date: 2009-08-19 05:40:15 +0200 (Wed, 19 Aug 2009) New Revision: 1300
Added: cpu/x86/pc/olpc/via/recover.fth dev/olpc/spiflash/flashif.fth dev/olpc/spiflash/memflash.fth dev/olpc/spiflash/spiif.fth dev/via/spi/ dev/via/spi/bbspi.fth dev/via/spi/spi.fth Modified: cpu/x86/pc/olpc/devices.fth cpu/x86/pc/olpc/via/addrs.fth cpu/x86/pc/olpc/via/devices.fth dev/olpc/kb3700/ecio.fth dev/olpc/kb3700/ecserial.fth dev/olpc/kb3700/ecspi.fth dev/olpc/spiflash/spiflash.fth dev/olpc/spiflash/spiui.fth Log: Via - Tethered FLASH recovery feature.
Modified: cpu/x86/pc/olpc/devices.fth =================================================================== --- cpu/x86/pc/olpc/devices.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ cpu/x86/pc/olpc/devices.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -248,14 +248,18 @@
fload ${BP}/dev/geode/acpi.fth \ Power management
-fload ${BP}/dev/olpc/kb3700/ecspi.fth \ EC chip SPI FLASH access +fload ${BP}/dev/olpc/spiflash/flashif.fth \ Generic FLASH interface +fload ${BP}/dev/olpc/spiflash/memflash.fth \ Memory-mapped FLASH access
warning @ warning off : stand-init-io stand-init-io h# fff0.0000 to flash-base ; warning !
+fload ${BP}/dev/olpc/spiflash/spiif.fth \ Generic low-level SPI bus access +fload ${BP}/dev/olpc/spiflash/spiflash.fth \ SPI FLASH programming + +fload ${BP}/dev/olpc/kb3700/ecspi.fth \ EC chip SPI FLASH access fload ${BP}/dev/olpc/kb3700/ecserial.fth \ Serial access to EC chip - fload ${BP}/dev/olpc/kb3700/ecio.fth \ I/O space access to EC chip
fload ${BP}/cpu/x86/pc/olpc/boardrev.fth \ Board revision decoding @@ -297,7 +301,6 @@
fload ${BP}/dev/olpc/kb3700/battery.fth \ Battery status reports
-fload ${BP}/dev/olpc/spiflash/spiflash.fth \ SPI FLASH programming fload ${BP}/dev/olpc/spiflash/spiui.fth \ User interface for SPI FLASH programming fload ${BP}/dev/olpc/spiflash/recover.fth \ XO-to-XO SPI FLASH recovery : ofw-fw-filename$ " disk:\boot\olpc.rom" ;
Modified: cpu/x86/pc/olpc/via/addrs.fth =================================================================== --- cpu/x86/pc/olpc/via/addrs.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ cpu/x86/pc/olpc/via/addrs.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -56,7 +56,8 @@ \ h# fe02.8000 constant camera-pci-base h# fed0.0000 constant hpet-mmio-base h# fed3.0000 constant spi-mmio-base -\ h# fed4.0000 constant wdt-mmio-base +h# fed4.0000 constant spi0-mmio-base +h# fed5.0000 constant wdt-mmio-base h# fec0.0000 constant io-apic-mmio-base h# fee0.0000 constant apic-mmio-base
Modified: cpu/x86/pc/olpc/via/devices.fth =================================================================== --- cpu/x86/pc/olpc/via/devices.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ cpu/x86/pc/olpc/via/devices.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -45,7 +45,7 @@ : stand-init-io ( -- ) stand-init-io acpi-calibrate-tsc - d# 800 to us-factor d# 800000 to ms-factor + d# 1000 to us-factor d# 1000000 to ms-factor ; warning !
@@ -242,18 +242,21 @@
\needs md5init fload ${BP}/ofw/ppp/md5.fth \ MD5 hash
-fload ${BP}/dev/olpc/kb3700/ecspi.fth \ EC chip SPI FLASH access +fload ${BP}/dev/olpc/spiflash/flashif.fth \ Generic FLASH interface +fload ${BP}/dev/olpc/spiflash/memflash.fth \ Memory-mapped FLASH read access
warning @ warning off : stand-init-io stand-init-io h# fff0.0000 to flash-base ; warning !
-fload ${BP}/dev/olpc/kb3700/ecserial.fth \ Serial access to EC chip +fload ${BP}/dev/olpc/spiflash/spiif.fth \ Generic low-level SPI bus access +fload ${BP}/dev/olpc/spiflash/spiflash.fth \ SPI FLASH programming +fload ${BP}/dev/olpc/kb3700/ecspi.fth \ EC chip SPI FLASH access +.( XXX Implement ignore-power-button) cr : ignore-power-button ( -- ) ; +fload ${BP}/dev/olpc/kb3700/ecio.fth \ I/O space access to EC chip +fload ${BP}/dev/via/spi/spi.fth \ Driver for Via SPI controller +fload ${BP}/dev/via/spi/bbspi.fth \ Tethered SPI FLASH programming
-.( XXX Implement ignore-power-button) cr -: ignore-power-button ( -- ) ; -fload ${BP}/dev/olpc/kb3700/ecio.fth \ I/O space access to EC chip - fload ${BP}/cpu/x86/pc/olpc/via/boardrev.fth \ Board revision decoding
: cpu-mhz ( -- n ) @@ -279,15 +282,13 @@
fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data fload ${BP}/cpu/x86/pc/olpc/mfgtree.fth \ Manufacturing data in device tree -.( XXX Reinstate kbdtype.fth) cr -\ fload ${BP}/cpu/x86/pc/olpc/kbdtype.fth \ Export keyboard type +fload ${BP}/cpu/x86/pc/olpc/kbdtype.fth \ Export keyboard type
fload ${BP}/dev/olpc/kb3700/battery.fth \ Battery status reports
-fload ${BP}/dev/olpc/spiflash/spiflash.fth \ SPI FLASH programming fload ${BP}/dev/olpc/spiflash/spiui.fth \ User interface for SPI FLASH programming h# 2c to crc-offset -\ fload ${BP}/dev/olpc/spiflash/recover.fth \ XO-to-XO SPI FLASH recovery +fload ${BP}/cpu/x86/pc/olpc/via/recover.fth \ XO-to-XO SPI FLASH recovery
: ofw-fw-filename$ " disk:\boot\olpc.rom" ; ' ofw-fw-filename$ to fw-filename$
Added: cpu/x86/pc/olpc/via/recover.fth =================================================================== --- cpu/x86/pc/olpc/via/recover.fth (rev 0) +++ cpu/x86/pc/olpc/via/recover.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -0,0 +1,25 @@ +purpose: Reprogram SPI FLASH from another XO-1.5 + +\ Use a working OLPC XO-1.5 board to recover one whose firmware is bad, +\ using a 6-pin ribbon cable connected from J3 on the good machine to J2 +\ on the bad one. +\ +\ The commands are: +\ ok clone \ Copies this machine's FLASH to the dead one +\ ok recover disk:\file.rom \ Copies a ROM file to the dead one + +: (tethered-flash) ( -- ) + use-bb-spi + reflash + use-local-ec +; + +: clone ( -- ) + ." Getting a copy of this machine's FLASH" cr + slow-flash-read + true to file-loaded? + + (tethered-flash) +; + +: recover ( "filename" -- ) get-file (tethered-flash) ;
Modified: dev/olpc/kb3700/ecio.fth =================================================================== --- dev/olpc/kb3700/ecio.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ dev/olpc/kb3700/ecio.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -304,11 +304,13 @@ ;
: io-spi-start ( -- ) - ['] io-spi@ to spi@ - ['] io-spi! to spi! + ['] io-spi@ to spi@ + ['] io-spi! to spi! ['] io-spi-out to spi-out + use-ec-spi \ spi-in, spi-cs-on, spi-cs-off via EC commands + ['] io-spi-reprogrammed to spi-reprogrammed - h# fff0.0000 to flash-base + use-mem-flash-read
7 to spi-us \ Measured time for "1 fea9 ec!" is 7.9 uS
Modified: dev/olpc/kb3700/ecserial.fth =================================================================== --- dev/olpc/kb3700/ecserial.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ dev/olpc/kb3700/ecserial.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -12,6 +12,7 @@ ['] serial-spi@ to spi@ ['] serial-spi! to spi! ['] spicmd! to spi-out + use-ec-spi \ spi-in, spi-cs-on, spi-cs-off via EC commands
d# 200 to spi-us \ Approximate time to do serial-spi! ['] noop to spi-reprogrammed @@ -32,11 +33,10 @@ d# 115200 baud
d# 50 ms \ Settling time - - -1 to flash-base ; : use-serial-ec ( -- ) ['] serial-spi-start to spi-start ; use-serial-ec \ Install this as the start-spi implementation + \ LICENSE_BEGIN \ Copyright (c) 2006 FirmWorks \
Modified: dev/olpc/kb3700/ecspi.fth =================================================================== --- dev/olpc/kb3700/ecspi.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ dev/olpc/kb3700/ecspi.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -7,15 +7,8 @@ \ The implementations of these access methods are defined in other files \ because they depend on details of the host system.
--1 value flash-base \ If not -1, memory mapped FLASH address -defer spi-start ( -- ) \ Init routine for the access path to the EC defer spi@ ( reg# -- b ) \ Read an EC SPI register defer spi! ( b reg# -- ) \ Write an EC SPI register -defer spi-out ( b -- ) \ Write SPI command and wait if necessary -1 value spi-us ( -- n ) \ Approximate time in uS to do spi! - \ Used to optimize some routines -defer spi-reprogrammed ( -- ) \ What to do when done reprogramming -' noop to spi-reprogrammed
\ Symbolic names for the registers that control SPI access from the EC
@@ -38,22 +31,6 @@ : enable-flash ( -- ) spicfg@ 8 or spicfg! ; \ SPICMDWE [then]
-\ I'm not sure this delay is necessary, but the EnE code did it, so -\ I'm being safe. The EnE code did 4 PCI reads of the base address -\ which should be around 800nS. 2 uS should cover it in case I'm wrong -: short-delay ( -- ) 2 us ; - -\ Some chips (e.g. Spansion) don't work in hardware mode, so we do -\ everything in "firmware mode", where we have control over the SPI bus. -\ Every spicmd! clocks out 8 bits. To read, you have to do a dummy -\ write of the value 0, then you can read the data from the spidata register. - -\ Turning on the firmware mode bit asserts SPICS# -\ Turning off the firmware mode bit deasserts SPICS# - -: spi-cs-on ( -- ) h# 18 spicfg! short-delay ; \ 10 is the firmware mode bit -: spi-cs-off ( -- ) h# 08 spicfg! ; - \ Poll the spicfg register waiting for the busy bit to go away \ This tells you when the hardware has finished sending the byte \ out serially over the SPI lines. @@ -68,12 +45,31 @@ again ;
+\ Some chips (e.g. Spansion) don't work in hardware mode, so we do +\ everything in "firmware mode", where we have control over the SPI bus. +\ Every spicmd! clocks out 8 bits. To read, you have to do a dummy +\ write of the value 0, then you can read the data from the spidata register. + +\ Turning on the firmware mode bit asserts SPICS# +\ Turning off the firmware mode bit deasserts SPICS# + +: ec-spi-cs-on ( -- ) h# 18 spicfg! short-delay ; \ 10 is the firmware mode bit +: ec-spi-cs-off ( -- ) h# 08 spicfg! ; + \ To read a byte from SPI, the EC has to pulse the clock while the \ SPI flash device drives DO. The "0 spi-out" is a "dummy write" \ that pulses the clock 8 times. The data can then be read from the \ spidata register.
-: spi-in ( -- b ) 0 spi-out spidata@ ; +: ec-spi-in ( -- b ) 0 spi-out spidata@ ; + +: use-ec-spi ( -- ) + ['] ec-spi-in to spi-in + ['] ec-spi-cs-on to spi-cs-on + ['] ec-spi-cs-off to spi-cs-off +; +use-ec-spi + \ LICENSE_BEGIN \ Copyright (c) 2006 FirmWorks \
Added: dev/olpc/spiflash/flashif.fth =================================================================== --- dev/olpc/spiflash/flashif.fth (rev 0) +++ dev/olpc/spiflash/flashif.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -0,0 +1,35 @@ +\ See license at end of file +purpose: Generic interface for FLASH programming operations + +defer flash-write-enable ( -- ) +defer flash-write-disable ( -- ) +defer flash-write ( adr len offset -- ) +defer flash-read ( adr len offset -- ) +defer flash-verify ( adr len offset -- mismatch? ) +defer flash-erase-block ( offset -- ) +h# 10.0000 value /flash-block +h# 10000 value /flash-block + +\ LICENSE_BEGIN +\ Copyright (c) 2009 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
Added: dev/olpc/spiflash/memflash.fth =================================================================== --- dev/olpc/spiflash/memflash.fth (rev 0) +++ dev/olpc/spiflash/memflash.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -0,0 +1,34 @@ +\ See license at end of file +purpose: FLASH read for memory-mapped FLASH + +-1 value flash-base \ If not -1, memory mapped FLASH address + +: mem-read-flash ( adr len offset -- ) flash-base + -rot move ; + +: tethered? ( -- flag ) ['] flash-read behavior ['] mem-read-flash <> ; + +: use-mem-flash-read ( -- ) ['] mem-read-flash to flash-read ; + +\ LICENSE_BEGIN +\ Copyright (c) 2009 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/spiflash/spiflash.fth =================================================================== --- dev/olpc/spiflash/spiflash.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ dev/olpc/spiflash/spiflash.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -48,6 +48,11 @@
: spi-read-status ( -- b ) 5 spi-cmd spi-in spi-cs-off ; \ READSTATUS
+\ I'm not sure this delay is necessary, but the EnE code did it, so +\ I'm being safe. The EnE code did 4 PCI reads of the base address +\ which should be around 800nS. 2 uS should cover it in case I'm wrong +: short-delay ( -- ) 2 us ; + \ You have to write-enable before any command that modifes stuff \ inside the part - writes, erases, status register writes \ The write-enabled mode is mostly self-clearing; the exception @@ -212,52 +217,31 @@ spi-write-disable ;
+defer spi-reprogrammed ( -- ) \ What to do when done reprogramming +' noop to spi-reprogrammed + defer write-spi-flash ( adr len offset -- )
-\ Common start sequence for read and verify - -: setup-spi-read ( offset -- ) - \ Fast read command - no point since host access is the bottleneck - \ h# b spi-cmd spi-adr 0 spi-out ( adr len ) - - 3 spi-cmd spi-adr -; - \ Read len bytes of data from the SPI FLASH beginning at offset \ into the memory buffer at adr
: read-spi-flash ( adr len offset -- ) - flash-base -1 <> if ( adr len offset ) - flash-base + -rot move ( ) - else ( adr len offset ) - setup-spi-read ( adr len ) - bounds ?do spi-in i c! loop ( ) - spi-cs-off ( ) - then ( ) + \ Fast read command - no point since host access is the bottleneck + \ h# b spi-cmd spi-adr 0 spi-out ( adr len ) + 3 spi-cmd spi-adr ( adr len ) + bounds ?do spi-in i c! loop ( ) + spi-cs-off ( ) ;
-\ Implementation factor for verify. Throws an error on mismatch. - -: (verify-spi-flash) ( adr len -- ) - bounds ?do spi-in i c@ <> throw loop ( ) -; - \ Verify the contents of SPI FLASH starting at offset against \ the memory range adr,len . Aborts with a message on mismatch.
-: verify-spi-flash ( adr len offset -- ) - flash-base -1 <> if ( adr len offset ) - \ If the FLASH is memory mapped we can just read it directly - flash-base + swap comp ( mismatch? ) - else ( adr len offset ) - setup-spi-read - ['] (verify-spi-flash) catch ( error? ) - - \ Be sure to turn off the chip select even on a mismatch - spi-cs-off ( error? ) - then ( error? ) - - abort" Verify failed" +: verify-spi-flash ( adr len offset -- mismatch? ) + over alloc-mem >r ( adr len offset r: temp-adr ) + r@ 2 pick rot ( adr len temp-adr len offset r: temp-adr ) + flash-read ( adr len r: temp-adr ) + tuck r@ swap comp ( len mismatch? r: temp-adr ) + r> rot free-mem ( mismatch? ) ;
: jedec-id ( -- b3b2b1) @@ -312,26 +296,16 @@
: spi-flash-write-enable ( -- ) spi-start spi-identify .spi-id cr ;
-\ Create defer words for generic FLASH writing routines if necessary -[ifndef] flash-write-enable -defer flash-write-enable ( -- ) -defer flash-write-disable ( -- ) -defer flash-write ( adr len offset -- ) -defer flash-read ( adr len offset -- ) -defer flash-verify ( adr len offset -- ) -defer flash-erase-block ( offset -- ) -h# 10.0000 value /flash-block -h# 10000 value /flash-block -[then] +: use-spi-flash-read ( -- ) ['] read-spi-flash to flash-read ;
\ Install the SPI FLASH versions as their implementations. : use-spi-flash ( -- ) ['] spi-flash-write-enable to flash-write-enable ['] spi-reprogrammed to flash-write-disable ['] write-spi-flash to flash-write - ['] read-spi-flash to flash-read ['] verify-spi-flash to flash-verify ['] erase-spi-block to flash-erase-block + use-spi-flash-read \ Might be overridden h# 10.0000 to /flash /spi-eblock to /flash-block ;
Added: dev/olpc/spiflash/spiif.fth =================================================================== --- dev/olpc/spiflash/spiif.fth (rev 0) +++ dev/olpc/spiflash/spiif.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -0,0 +1,35 @@ +\ See license at end of file +purpose: Generic low-level SPI interface + +defer spi-start ( -- ) \ Init the SPI controller +defer spi-cs-on ( -- ) \ Begin SPI transaction +defer spi-cs-off ( -- ) \ End SPI transaction +defer spi-out ( b -- ) \ Write a byte to the SPI bus +defer spi-in ( -- b ) \ Read a byte from the SPI bus + +1 value spi-us ( -- n ) \ Approximate time in uS to do spi-out + \ Used to optimize some routines + +\ LICENSE_BEGIN +\ Copyright (c) 2009 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/spiflash/spiui.fth =================================================================== --- dev/olpc/spiflash/spiui.fth 2009-08-18 16:31:24 UTC (rev 1299) +++ dev/olpc/spiflash/spiui.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -1,5 +1,5 @@ \ See license at end of file -\ User interface for reflashing SPI FLASH parts +purpose: User interface for reflashing SPI FLASH parts
\ This code is concerned with the user interface for getting \ a new firmware image into memory and using it to program @@ -20,14 +20,14 @@ ?do ( adr ) \ Save time - don't write if the data is the same i .x (cr ( adr ) - flash-base -1 = if ( adr ) + spi-us d# 20 >= if ( adr ) + \ Just write if reading is slow true ( adr must-write? ) else ( adr ) - dup flash-base i + /flash-block comp ( adr must-write? ) + dup /flash-block i flash-verify ( adr must-write? ) then ( adr must-write? )
if -\ i /flash-block mod 0= if i flash-erase-block then i flash-erase-block dup /flash-block i flash-write ( adr ) then @@ -40,7 +40,7 @@ ." Verifying" cr ?do ( adr ) i .x (cr - dup /flash-block i flash-verify + dup /flash-block i flash-verify abort" Verify failed" /flash-block + ( adr' ) /flash-block +loop ( adr ) cr drop ( ) @@ -186,7 +186,7 @@ : ?move-mfg-data ( -- ) ." Merging existing manufacturing data" cr
- flash-base -1 = if + tethered? if \ Read the manufacturing data from the other FLASH \ First try the new location in the e.0000 block flash-buf mfg-data-offset + /flash-block mfg-data-offset flash-read @@ -338,7 +338,7 @@ /flash-block /string ( adr+ len- ) \ Remove EC ucode from the beginning ." Erasing ..." cr erase-spi-firmware ( adr len ) ." Programming..." 2dup /flash-block flash-write cr ( adr len ) - ." Verifying..." /flash-block flash-verify cr ( ) + ." Verifying..." /flash-block flash-verify abort" Verify failed" cr ( ) ;
: flash-bios ( -- )
Added: dev/via/spi/bbspi.fth =================================================================== --- dev/via/spi/bbspi.fth (rev 0) +++ dev/via/spi/bbspi.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -0,0 +1,111 @@ +\ See license at end of file +purpose: SPI driver for tethered SPI FLASH programming + +\ It is tempting to use the Via's SPI hardware instead of +\ bitbanging, but that turns out to be slower because the +\ special FLASH mode to make 256-byte write cycles possible +\ only work if the host system boots from SPI FLASH. +\ Without that mode, you can only send 12 data bytes per +\ "program page" transaction. That ends up being slower +\ overall than bitbanging. Bitbanging loses on the per-bit +\ time, but lets you do an efficient 256-byte page program. + +: gpo-port ( -- port# ) acpi-io-base h# 4c + ; +: gpi-port ( -- port# ) acpi-io-base h# 48 + ; + +h# 20000 constant clk-mask +h# 0008 constant cs-mask +h# 0002 constant do-mask +h# 0001 constant di-mask + +\ DI:GPI0, CLK:GPIO6, DO:GPO1, SS0#:GPO3 +: bb-spi-cs-on ( -- ) gpo-port dup pc@ 8 invert and swap pc! ; +: bb-spi-cs-off ( -- ) gpo-port dup pc@ 8 or swap pc! ; + +code bb-spi-out ( b -- ) + bx pop + + gpo-port # dx mov \ Base value for register + dx ax in + + 8 # cx mov + begin + clk-mask do-mask + invert # ax and \ Clk low for first half-cycle + h# 80 # bl test 0<> if + do-mask # ax or \ Possibly set DO + then + ax dx out \ CLK low period + clk-mask # ax or \ CLK high period + ax dx out + bl bl add \ Shift left + loopa +c; + +code bb-spi-in ( -- b ) + bp push + + gpo-port # dx mov \ Out port + dx ax in \ Base value for out register + clk-mask do-mask + invert # ax and \ Clk low for first half-cycle + ax bp mov \ Save base value in BP + + bx bx xor + + 8 # cx mov + begin + bp ax mov \ Base value + gpo-port # dx mov \ Out port + ax dx out \ CLK low + clk-mask # ax or \ CLK high + ax dx out \ Push it out + + gpi-port # dx mov \ In port + dx ax in + bx bx add \ Shift left + di-mask # ax test 0<> if + bx inc + then + loopa + bp pop + bx push +c; + +: bb-spi-start ( -- ) + ['] bb-spi-in to spi-in + ['] bb-spi-out to spi-out + ['] bb-spi-cs-on to spi-cs-on + ['] bb-spi-cs-off to spi-cs-off + d# 12 to spi-us + ['] noop to spi-reprogrammed +\ use-spi-flash-read \ Readback with SPI commands, not memory ops + use-hw-spi-flash-read + + gpo-port dup pc@ clk-mask invert and do-mask invert and cs-mask or swap pc! \ CLK, DO low, CS# high + h# 88e4 config-b@ 2 or h# 88e4 config-b! +; + +: use-bb-spi ( -- ) ['] bb-spi-start to spi-start ; + +\ LICENSE_BEGIN +\ Copyright (c) 2009 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
Added: dev/via/spi/spi.fth =================================================================== --- dev/via/spi/spi.fth (rev 0) +++ dev/via/spi/spi.fth 2009-08-19 03:40:15 UTC (rev 1300) @@ -0,0 +1,262 @@ +\ See license at end of file +purpose: Driver for Via VX8xx SPI controller, for FLASH reprogramming + +[ifndef] spi0-mmio-base h# fed4.0000 constant spi0-mmio-base [then] + +0 0 " " " /" begin-package + +" spi" device-name + +0 value spi-base +0 value spi0-base +: spi-b@ ( offset -- b ) spi0-base + c@ ; +: spi-b! ( b offset -- ) spi0-base + c! ; +: spi-w@ ( offset -- w ) spi0-base + w@ ; +: spi-w! ( w offset -- ) spi0-base + w! ; +: spi-l@ ( offset -- l ) spi0-base + l@ ; +: spi-l! ( l offset -- ) spi0-base + l! ; + +: set-spi-base ( adr -- ) + dup lbsplit h# 88be config-b! h# 88bd config-b! h# 88bc config-b! drop ( adr ) + h# 1000 " map-in" $call-parent to spi-base +; +: set-spi0-base ( adr -- ) + dup 1 or spi-base l! + h# 1000 " map-in" $call-parent to spi0-base +; +: grab-spi ( -- ) + h# 88e4 config-b@ 2 invert and h# 88e4 config-b! \ SPI mode for pins +; +: release-spi ( -- ) + 0 spi-base l! \ Disable controller + h# 88e4 config-b@ 2 or h# 88e4 config-b! \ GPIO mode for pins +; + +: pio33mhz ( -- ) \ Fastest PIO mode + h# 00 h# 6c spi-b! \ 33 MHz + h# 04 h# 6e spi-b! \ Sample on falling edge + h# 08 h# 6d spi-b! \ Dynamic clock, PIO mode, command posted write off +; +: dma16mhz ( -- ) \ Fastest DMA mode + h# 01 h# 6c spi-b! \ 33/(2*1) MHz + h# 03 h# 6e spi-b! \ Delay mode 3 + h# 48 h# 6d spi-b! \ Dynamic clock, DMA mode, command posted write off +; +: pio8mhz ( -- ) + h# 02 h# 6c spi-b! \ 33/(2*2) MHz + h# 00 h# 6e spi-b! \ No special clocking + h# 08 h# 6d spi-b! \ Dynamic clock, PIO mode, command posted write off +; +: dma8mhz ( -- ) + h# 02 h# 6c spi-b! \ 33/(2*2) MHz + h# 00 h# 6e spi-b! \ No special clocking + h# 48 h# 6d spi-b! \ Dynamic clock, DMA mode, command posted write off +; +: init-spi ( -- ) + grab-spi + spi-mmio-base set-spi-base + spi0-mmio-base set-spi0-base + h# 0c h# 00 spi-b! \ Clear RW1C status bits + h# 00 h# 70 spi-b! \ All interrupts off + h# ff h# 73 spi-b! \ Clear DMA buffer interrupts + pio8mhz +; + +: rb spi-b@ . ; : wb spi-b! ; +: rw spi-w@ . ; : ww spi-w! ; +: rl spi-l@ . ; : wl spi-l! ; + +: open ( -- okay? ) init-spi true ; +: close ( -- ) release-spi ; + +: wait-ready ( -- ) begin 0 spi-w@ 1 and 0= until ; +: wait-done ( -- ) begin 0 spi-w@ 4 and until ; +: clear-done ( -- ) 4 0 spi-w! ; +: spi-cmd! ( bits -- ) 2 spi-w! ; + +: spi-go ( -- ) + 2 spi-cmd! ( ) \ Set go bit + wait-done ( ) \ Wait for done bit + 0 spi-cmd! ( ) \ Clear go bit + \ The go bit must be cleared before clear-done, otherwise clear-done will not work + clear-done ( ) \ Clear done bit +; + +: dma-setup + h# 200000 h# 74 spi-l! \ Buffer to read from + h# 100000 h# 78 spi-l! \ Buffer to write to + h# 10001000 h# 7c spi-l! \ Buffer wraparound boundaries +; + +h# 20 buffer: (out-buf) +h# 400 buffer: (in-buf) + +\ Prevent wrap-around; the DMA address register has issues with boundaries. +: out-buf ( -- adr ) (out-buf) h# 10 round-up ; +: in-buf ( -- adr ) (in-buf) h# 200 round-up ; + +\ Return the largest length that does not fall in one of the +\ (undocumented) gaps where the DMA counter doesn't work right + +: best-length ( len -- len' ) + dup h# 1fc > if drop h# 1fc exit then ( len ) + dup h# 17d h# 183 between if drop h# 17c exit then ( len ) + dup h# 0fd h# 103 between if drop h# 0fc exit then ( len ) + dup h# 07d h# 083 between if drop h# 07c exit then ( len ) +; + +\ Read as many as possible up to len, accounting for unavailable lengths +: dma-read-some ( adr len offset -- #read ) + swap best-length swap ( adr len' offset ) + dma16mhz ( adr len offset ) + wait-ready ( adr len offset ) + + \ Setup command (3) and FLASH address + 3 out-buf c! ( adr len offset ) + lbsplit drop out-buf 1+ c! out-buf 2+ c! out-buf 3 + c! ( adr len ) + + \ Setup cycle control register with indicated read length (-1) + \ and write length for 1 command byte plus 3 data bytes + dup 1- 4 lshift h# c003 or h# 71 spi-w! ( adr len ) + + in-buf >physical h# 78 spi-l! \ Buffer to write to + out-buf >physical h# 74 spi-l! \ Buffer to read from + h# 0200.0010 h# 7c spi-l! \ Buffer wraparound boundaries + + spi-go ( adr len ) + tuck in-buf -rot move ( len ) +; +: dma-read ( adr len offset -- ) + begin over while ( adr len offset ) + 3dup dma-read-some ( adr len offset #read ) + tuck + >r ( adr len #read r: offset' ) + /string r> ( adr' len' offset' ) + repeat ( adr len offset ) + 3drop +; + +[ifdef] notdef +: dma-out ( len -- ) + h# 40 h# 6d spi-b! 0 2 spi-w! ( len ) + wait-ready ( len ) + dma-setup + + \ Write to SPI mode + h# 2000 h# 71 spi-w! ( len ) + + spi-go + 2 2 spi-w! + + + h# 200000 + ( endadr ) + begin dup h# 80 spi-l@ u<= until ( endadr ) + drop ( ) + 0 2 spi-w! ( ) +; +[then] + +[ifdef] notdef + +\ The following FLASH-mode commands don't work unless the Via chip +\ is hardware-strapped to use SPI FLASH as the boot ROM. Without +\ that strapping, the SPI controller only works in device mode, +\ ignoring the atomic cycle bits, the address register, etc. +\ That fact is undocumented, but confirmed by Via. +: cmd-setup ( -- ) + h# 06 h# 54 spi-b! \ Write enable prefix + h# 06 h# 55 spi-b! \ Write enable prefix (2) + + h# b9 h# 58 spi-b! \ 0 Deep power down + h# c7 h# 59 spi-b! \ 1 Erase all + h# d8 h# 5a spi-b! \ 2 Erase 64K + h# 02 h# 5b spi-b! \ 3 Page Program + h# 0b h# 5c spi-b! \ 4 Fast Read + h# 01 h# 5d spi-b! \ 5 Write status register + h# 05 h# 5e spi-b! \ 6 Read status register + h# ab h# 5f spi-b! \ 7 Release power down + + h# f4 h# 56 spi-b! \ 3WriteAddr, 2WriteAddr, 1Write, 0Read + h# 46 h# 57 spi-b! \ 7Write, 6Read, W5rite, 4ReadAddr +; + +: spi-addr! ( addr -- ) 4 spi-l! ; + +: sector-erase ( offset -- ) + wait-ready spi-addr! h# 0026 spi-cmd! +; +: erase-all ( -- ) wait-ready h# 0016 spi-cmd! ; +: inject-bytes ( adr len -- ) + 0 ?do ( adr ) + dup i + c@ ( adr byte ) + 8 i + spi-b! ( adr ) + loop ( adr ) + drop ( ) +; +: program-bytes ( adr len offset -- ) + wait-ready spi-addr! tuck ( len adr len ) + inject-bytes + 1- 8 lshift h# 4036 or spi-cmd! +; +: program-page ( adr len offset -- ) + wait-ready spi-addr! ( adr len ) + begin dup while ( adr len ) + 2dup d# 16 min tuck ( adr len thislen adr thislen ) + inject-bytes ( adr len thislen ) + dup 1- 8 lshift h# 4036 or ( adr len thislen cmd ) + over d# 16 = if h# 80 or then ( adr len thislen cmd' ) + spi-cmd! ( adr len thislen ) + /string ( adr' len' ) + repeat ( adr' len' ) + 2drop +; +: fast-read ( adr len offset -- ) + wait-ready spi-addr! ( adr len ) +\ dup 1- 8 lshift h# 6042 or spi-cmd! ( adr len ) + dup 1- 8 lshift h# 4043 or spi-cmd! ( adr len ) + wait-done ( adr len ) + 0 ?do ( adr ) + 8 i + spi-b@ dup i + c! ( adr ) + loop drop ( ) +; +: power-down ( -- ) wait-ready h# 0006 spi-cmd! ; +: power-up ( -- ) wait-ready h# 0072 spi-cmd! ; +: sr! ( value -- ) wait-ready 8 spi-b! h# 4056 spi-cmd! ; +: sr@ ( -- value ) + wait-ready h# 4062 spi-cmd! wait-done 8 spi-b@ +; +[then] + +end-package + +[ifdef] flash-read +: hw-flash-read ( adr len offset -- ) + " /spi" open-dev >r ( adr len offset ) + " dma-read" r@ $call-method ( ) + r> close-dev ( ) +; +: use-hw-spi-flash-read ( -- ) ['] hw-flash-read to flash-read ; +[then] + +\ LICENSE_BEGIN +\ Copyright (c) 2009 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