Author: wmb Date: Tue Nov 2 06:52:25 2010 New Revision: 1998 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1998
Log: XO-1.75 - USB is sort of working, and the ROM image uses dropin format, versioning, and is checksummed.
Added: cpu/arm/Linux/inflate.ld cpu/arm/build/inflate.bin (contents, props changed) cpu/arm/olpc/1.75/fw-version.fth cpu/arm/olpc/1.75/olpc.bth cpu/arm/olpc/1.75/sourceurl.fth dev/nonmmflash.fth Modified: cpu/arm/Linux/Makefile cpu/arm/basefw.bth cpu/arm/marvell/tim.fth cpu/arm/mmp2/sspspi.fth cpu/arm/olpc/1.75/addrs.fth cpu/arm/olpc/1.75/build/ (props changed) cpu/arm/olpc/1.75/build/Makefile cpu/arm/olpc/1.75/devices.fth cpu/arm/olpc/1.75/prefw.bth cpu/x86/pc/olpc/via/olpc.bth dev/olpc/spiflash/flashif.fth dev/olpc/spiflash/spiflash.fth dev/usb2/hcd/ehci/probe.fth
Modified: cpu/arm/Linux/Makefile ============================================================================== --- cpu/arm/Linux/Makefile Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/Linux/Makefile Tue Nov 2 06:52:25 2010 (r1998) @@ -2,7 +2,7 @@
BP=../../..
-CFLAGS = -DARM -mlittle-endian +CFLAGS = -O -DARM -mlittle-endian
WRTAIL = forth/wrapper WRDIR = ${BP}/${WRTAIL} @@ -13,7 +13,7 @@
OBJS = wrapper.o logger.o ${ZIPOBJS}
-all: forth +all: forth inflate.bin
# Use forth when you just need to run Forth but don't care what # native instruction set it is on. @@ -30,6 +30,15 @@ armforth.static: ${OBJS} ${CC} ${CFLAGS} ${LFLAGS} -static -o $@ ${OBJS}
+inflate.lo: ${ZIPDIR}/inflate.c + ${CC} -c ${CFLAGS} -O $< -o $@ + +inflate.o: inflate.lo + ${LD} -T inflate.ld $< -o $@ + +../build/inflate.bin: inflate.o + objcopy -O binary $< $@ + %.o: ${WRDIR}/%.c ${CC} -c ${CFLAGS} $< -o $@
Added: cpu/arm/Linux/inflate.ld ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/Linux/inflate.ld Tue Nov 2 06:52:25 2010 (r1998) @@ -0,0 +1,6 @@ +SECTIONS +{ + . = 0x00000; + .text : { *(.text_inflate) } + .text_spare : { *(.text) } +}
Modified: cpu/arm/basefw.bth ============================================================================== --- cpu/arm/basefw.bth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/basefw.bth Tue Nov 2 06:52:25 2010 (r1998) @@ -86,6 +86,12 @@ \ XXX remove the OS file commands from tools.dic fload ${BP}/ofw/core/filecmds.fth \ File commands: dir, del, ren, etc.
+\ Defined by CPU core +h# 1000 to pagesize +d# 12 to pageshift +h# 10.0000 constant /section +h# 4000 constant /page-table + [ifndef] no-heads resident dispose 0 0 set-transize \ true is suppress-transient
Added: cpu/arm/build/inflate.bin ============================================================================== Binary file. No diff available.
Modified: cpu/arm/marvell/tim.fth ============================================================================== --- cpu/arm/marvell/tim.fth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/marvell/tim.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -10,6 +10,8 @@
0 value image-size 0 value image-adr +: tim$ ( -- adr len ) image-adr image-size ; + 0 value new-image-size : ?realloc-image ( new-size -- ) dup image-size > if ( new-size )
Modified: cpu/arm/mmp2/sspspi.fth ============================================================================== --- cpu/arm/mmp2/sspspi.fth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/mmp2/sspspi.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -35,8 +35,6 @@ : ssp-spi-in ( -- b ) 0 ssp-spi-out-in ;
: safe-spi-start - disable-interrupts - ignore-power-button ssp-spi-start \ The following clears out some glitches so the chip will respond \ to the ab-id command.
Modified: cpu/arm/olpc/1.75/addrs.fth ============================================================================== --- cpu/arm/olpc/1.75/addrs.fth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/olpc/1.75/addrs.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -6,9 +6,10 @@
fb-pa constant available-ram-size
+h# 20000 constant dropin-offset \ Offset to dropin driver area in SPI FLASH +h# 100000 constant /rom \ Total size of SPI FLASH
: (memory?) ( phys -- flag ) total-ram-size u< ; -' (memory?) to memory?
\ OFW implementation choices \ h# 1fe0.0000 constant fw-pa @@ -32,9 +33,3 @@ heap-size constant initial-heap-size
h# 40.0000 constant page-table-pa - -\ Defined by CPU core -h# 1000 to pagesize -d# 12 to pageshift -h# 10.0000 constant /section -h# 4000 constant /page-table
Modified: cpu/arm/olpc/1.75/build/Makefile ============================================================================== --- cpu/arm/olpc/1.75/build/Makefile Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/olpc/1.75/build/Makefile Tue Nov 2 06:52:25 2010 (r1998) @@ -1,4 +1,4 @@ -ROMNAME=ofw +ROMNAME=olpc
BASEDIR= `(cd ../../../../..; pwd;)`
Modified: cpu/arm/olpc/1.75/devices.fth ============================================================================== --- cpu/arm/olpc/1.75/devices.fth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/olpc/1.75/devices.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -21,7 +21,7 @@ h# 40 1 uart! \ Marvell-specific UART Enable bit 3 3 uart! \ 8 bits, no parity 7 2 uart! \ Clear and enable FIFOs - d# 38400 baud + d# 115200 baud ;
fload ${BP}/forth/lib/sysuart.fth \ Set console I/O vectors to UART @@ -100,6 +100,7 @@ fload ${BP}/dev/olpc/spiflash/flashif.fth \ Generic FLASH interface
fload ${BP}/dev/olpc/spiflash/spiif.fth \ Generic low-level SPI bus access + fload ${BP}/dev/olpc/spiflash/spiflash.fth \ SPI FLASH programming
: ignore-power-button ; \ XXX implement me @@ -109,6 +110,26 @@
fload ${BP}/cpu/arm/mmp2/sspspi.fth \ Synchronous Serial Port SPI interface
+\ Create the top-level device node to access the entire boot FLASH device +0 0 " d4035000" " /" begin-package + " flash" device-name + + h# 10.0000 value /device + my-address my-space h# 100 reg + fload ${BP}/dev/nonmmflash.fth +end-package + +\ Create a node below the top-level FLASH node to accessing the portion +\ containing the dropin modules +0 0 " 20000" " /flash" begin-package + " dropins" device-name + + h# e0000 constant /device + fload ${BP}/dev/subrange.fth +end-package + +devalias dropins /dropins + fload ${BP}/cpu/arm/olpc/1.75/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" ; @@ -174,32 +195,33 @@ my-address my-space /regs reg : my-map-in ( len -- adr ) my-space swap " map-in" $call-parent h# 100 + ( adr ) - 3 over h# a8 + rl! ( adr ) \ Force host mode ; : my-map-out ( adr len -- ) swap h# 100 - swap " map-out" $call-parent ; false constant has-dbgp-regs? false constant needs-dummy-qh? : grab-controller ( config-adr -- error? ) drop false ; fload ${BP}/dev/usb2/hcd/ehci/loadpkg.fth + : otg-set-host-mode 3 h# a8 ehci-reg! ; \ Force host mode + ' otg-set-host-mode to set-host-mode + end-package
-: usb-power-on ( -- ) 1 gpio-set ; -: unreset-usb-hub ( -- ) d# 146 gpio-set ; +\ : usb-power-on ( -- ) 1 gpio-set ; +: usb-power-on ( -- ) ; \ The EC controls the USB power +: reset-usb-hub ( -- ) d# 146 gpio-set d# 10 ms d# 146 gpio-set ;
fload ${BP}/cpu/arm/marvell/utmiphy.fth
-: start-usb ( -- ) +: init-usb ( -- ) h# 9 h# d428285c l! \ Enable clock to USB block - unreset-usb-hub + reset-usb-hub init-usb-phy ;
-0 [if] stand-init: Init USB Phy \ usb-power-on \ The EC now controls the USB power - start-usb + init-usb ; -[then]
fload ${BP}/dev/olpc/mmp2camera/loadpkg.fth
Added: cpu/arm/olpc/1.75/fw-version.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/fw-version.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -0,0 +1,3 @@ +\ The overall firmware revision +macro: FW_MAJOR A +macro: FW_MINOR 00
Added: cpu/arm/olpc/1.75/olpc.bth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/olpc.bth Tue Nov 2 06:52:25 2010 (r1998) @@ -0,0 +1,232 @@ +purpose: Construct the Open Firmware module collection + +command: &builder &this +in: ${BP}/cpu/arm/olpc/1.75/build/fw.img +build-now + +fload ${BP}/cpu/arm/olpc/1.75/fw-version.fth + +" macro: FW_VERSION Q4${FW_MAJOR}${FW_MINOR}" expand$ eval + +fload ${BP}/cpu/arm/olpc/1.75/config.fth + +\ Always re-create the builton.fth file when we make a new rom.img +fload ${BP}/cpu/x86/pc/builton.bth +fload ${BP}/cpu/arm/olpc/1.75/sourceurl.fth + +fload ${BP}/forth/lib/crc32.fth + +hex + +: pad-file ( location -- ) + ofd @ fsize + 2dup u< abort" The ROM image is too large" + ?do h# ff ofd @ fputc loop +; + +fload ${BP}/cpu/arm/marvell/tim.fth + +\ Marvel Trusted Image Module image creation script for +\ XO-1.75 platform. + +tim: 00030102 0 Sky! PXA688 +flash: SPI'10 +timh: TIMH 0 d101f000 +\ Main Processor code loaded into DRAM +image: OBMI 800 d101c000 ${BP}/cpu/arm/olpc/1.75/dummy.img +\ Secure Processor code loaded into SRAM +image: WTMI 1000 d1018000 /scratchbox/users/wmb/home/wmb/cforth.git/build/arm-xo-1.75/shim.img +image: CFTH 2000 d1000000 /scratchbox/users/wmb/home/wmb/cforth.git/build/arm-xo-1.75/app.img +\ anonymous: 20000 ${BP}/cpu/arm/olpc/1.75/build/fw.img +reserved: +\ fload ${BP}/cpu/arm/olpc/1.75/ddr_samsung_1g.fth + term: +end-reserved +end-tim + +.( --- Saving as ) +" ${FW_VERSION}.rom" expand$ 2dup lower ( adr len ) +2dup type cr ( adr len ) +$new-file + tim$ ofd @ fputs + + dropin-offset pad-file + +\ Loads the set of drivers that is common to different output formats + + " ${BP}/cpu/arm/build/inflate.bin" " inflate" $add-dropin + " fw.img" " firmware" $add-deflated-dropin +\ " fw.img" " firmware" $add-dropin + +\ " ${BP}/dev/usb2/hcd/ehci/build/ehci.fc" " class0c0320" $add-deflated-dropin + " ${BP}/dev/usb2/device/hub/build/hub.fc" " usb,class9" $add-deflated-dropin + " ${BP}/dev/usb2/device/generic/build/generic.fc" " usbdevice" $add-deflated-dropin + " ${BP}/dev/usb2/device/net/build/usbnet.fc" " usbnet" $add-deflated-dropin + " ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc" " usb,class3,1" $add-deflated-dropin + " ${BP}/dev/usb2/device/serial/build/usbserial.fc" " usbserial" $add-deflated-dropin + " ${BP}/dev/usb2/device/storage/build/usbstorage.fc" " usbstorage" $add-deflated-dropin + + +0 [if] + " ${BP}/dev/mmc/sdhci/build/sdhci2.fc" " class080501" $add-deflated-dropin +[then] + +0 [if] + " ${BP}/dev/mmc/sdhci/build/sdmmc.fc" " sdmmc" $add-deflated-dropin + " ${BP}/dev/mmc/sdhci/mv8686/build/mv8686.fc" " mv8686" $add-deflated-dropin +[then] + +0 [if] + " sd8686_helper.bin" " helper_sd.bin" $add-deflated-dropin + " sd8686.bin" " sd8686.bin" $add-deflated-dropin +[then] + + " builton.fth" " probe-" $add-dropin + +0 [if] + " ${BP}/clients/emacs/x86/emacs" " emacs" $add-deflated-dropin + " ${BP}/clients/emacs/x86/emacs.rc" " emacs.rc" $add-deflated-dropin + " ${BP}/clients/emacs/emacs.hlp" " emacs.hlp" $add-deflated-dropin +[then] + + " ${BP}/ofw/fcode/memtest.fth" " memtest.fth" $add-deflated-dropin + +0 [if] + " ${BP}/dev/hdaudio/build/hdaudio.fc" " class040300" $add-deflated-dropin + + " ${BP}/ofw/inet/telnetd.fth" " telnetd" $add-deflated-dropin +[then] + +0 [if] +\ " ${BP}/cpu/x86/pc/olpc/images/warnings.565" " warnings.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/lightdot.565" " lightdot.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/yellowdot.565" " yellowdot.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/darkdot.565" " darkdot.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/lock.565" " lock.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/unlock.565" " unlock.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/plus.565" " plus.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/minus.565" " minus.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/x.565" " x.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/sad.565" " sad.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/bigdot.565" " bigdot.565" $add-deflated-dropin + + " ${BP}/cpu/x86/pc/olpc/images/check.565" " check.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/xogray.565" " xogray.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/ethernet.565" " ethernet.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/usbkey.565" " disk.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/wireless.565" " wlan.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/laptop.565" " int.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/sd.565" " ext.565" $add-deflated-dropin +[then] + +0 [if] + " ${BP}/ofw/termemu/15x30pc.psf" " font" $add-deflated-dropin +[then] + +0 [if] + " memtest" " memtest" $add-deflated-dropin +[then] + +0 [if] + " verify.img" " verify" $add-deflated-dropin + " os.public" " ospubkey" $add-dropin \ Incompressible + " fw.public" " fwpubkey" $add-dropin \ Incompressible + " fs.public" " fspubkey" $add-dropin \ Incompressible + " lease.public" " leasepubkey" $add-dropin \ Incompressible + " developer.public" " develpubkey" $add-dropin \ Incompressible +[then] + " sourceurl" " sourceurl" $add-dropin + +0 [if] + " ${BP}/cpu/x86/pc/olpc/images/Edge1-8k-EQ-Comp-Amp-Short.wav" " splash" $add-deflated-dropin + + \ icons for mfg test gui + " testicons/play.565" " play.565" $add-deflated-dropin + " testicons/quit.565" " quit.565" $add-deflated-dropin + " testicons/cpu.565" " cpu.565" $add-deflated-dropin + " testicons/spi.565" " spi.565" $add-deflated-dropin + " testicons/ram.565" " ram.565" $add-deflated-dropin + " testicons/sdcard.565" " sdcard.565" $add-deflated-dropin + " testicons/keyboard.565" " keyboard.565" $add-deflated-dropin + " testicons/display.565" " display.565" $add-deflated-dropin + " testicons/touchpad.565" " touchpad.565" $add-deflated-dropin + " testicons/audio.565" " audio.565" $add-deflated-dropin + " testicons/usb.565" " usb.565" $add-deflated-dropin + " testicons/battery.565" " battery.565" $add-deflated-dropin + " testicons/camera.565" " camera.565" $add-deflated-dropin + " testicons/wifi.565" " wifi.565" $add-deflated-dropin + " testicons/clock.565" " clock.565" $add-deflated-dropin + " testicons/timer.565" " timer.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/bigx.di" $add-file + " ${BP}/cpu/x86/pc/olpc/images/bigcheck.di" $add-file + " ${BP}/cpu/x86/pc/olpc/images/leds.di" $add-file + " ${BP}/cpu/x86/pc/olpc/images/ebook.di" $add-file + + " ${BP}/cpu/x86/pc/olpc/via/build/nandblaster15_rx.bin" " nb15_rx" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/via/build/nandblaster_tx.bin" " nb_tx" $add-deflated-dropin + + " ${BP}/cpu/x86/pc/olpc/images/winlogo.565" " winlogo.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/tux.565" " tux.565" $add-deflated-dropin + " ${BP}/cpu/x86/pc/olpc/images/settings.565" " settings.565" $add-deflated-dropin +[then] + +.( Dropin top is ) ofd @ fsize .x cr + +/rom pad-file + +\ Insert the revision signature +/rom h# 40 - ofd @ fseek +h# 10 buffer: signature +signature h# 10 blank +" CL1" signature swap move +" ${FW_VERSION}" expand$ signature 6 + swap move +" Q4${FW_MAJOR}" expand$ signature d# 13 + swap move +signature h# 10 ofd @ fputs + +/l buffer: crcbuf +/rom buffer: filebuf + +\ Read the entire image, compute the CRC, and store it h# 28 from the end +0 ofd @ fseek +filebuf /rom ofd @ fgets /rom <> abort" Can't read back image" +0 crctab filebuf /rom ($crc) crcbuf ! + +/rom h# 2c - ofd @ fseek +crcbuf /l ofd @ fputs + +ofd @ fclose + +\ Creating olpc.version serves two purposes: +\ a) It reports the firmware revision for use by external scripts +\ b) It provides an olpc.* artifact for the builder dependency management. + +writing olpc.version +" ${FW_VERSION}" expand$ 2dup lower ofd @ fputs +ofd @ fclose + + + +\ 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: cpu/arm/olpc/1.75/prefw.bth ============================================================================== --- cpu/arm/olpc/1.75/prefw.bth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/arm/olpc/1.75/prefw.bth Tue Nov 2 06:52:25 2010 (r1998) @@ -12,6 +12,7 @@ ' noop is include-hook
fload ${BP}/cpu/arm/olpc/1.75/config.fth +' (memory?) to memory?
: headerless ; : headers ; : headerless0 ;
Added: cpu/arm/olpc/1.75/sourceurl.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/sourceurl.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -0,0 +1,8 @@ +\ Make a file containing the URL of the source code + +show-rebuilds? false to show-rebuilds? \ We don't need to see these commands + +" svn info ../../../../.. | grep URL: | cut -d ' ' -f 2 | tr \n ' ' >sourceurl" $sh +" svnversion -n ../../../../.. >>sourceurl" $sh + +to show-rebuilds?
Modified: cpu/x86/pc/olpc/via/olpc.bth ============================================================================== --- cpu/x86/pc/olpc/via/olpc.bth Tue Nov 2 06:34:33 2010 (r1997) +++ cpu/x86/pc/olpc/via/olpc.bth Tue Nov 2 06:52:25 2010 (r1998) @@ -41,7 +41,7 @@
fload ${BP}/cpu/x86/pc/olpc/via/fw-version.fth
-" macro: FW_VERSION Q3${FW_MAJOR}${FW_MINOR}" expand$ eval +" macro: FW_VERSION Q4${FW_MAJOR}${FW_MINOR}" expand$ eval
fload ${BP}/cpu/x86/pc/olpc/via/config.fth
Added: dev/nonmmflash.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ dev/nonmmflash.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -0,0 +1,168 @@ +purpose: Package for non-memory-mapped FLASH ROM device +\ See license at end of file + +headerless +0 value open-count +0 instance value seek-ptr + +: clip-size ( adr len -- len' adr len' ) + seek-ptr + /device min seek-ptr - ( adr len' ) + tuck +; +: update-ptr ( len' -- len' ) dup seek-ptr + to seek-ptr ; + +headers +external +: seek ( d.offset -- status ) + 0<> over /device u> or if drop true exit then \ Seek offset too big + to seek-ptr + false +; + +: open ( -- flag ) + \ This lets us open the node during compilation + standalone? 0= if true exit then + + open-count dup 1+ to open-count 0= if ( ) + flash-open ( ) + then ( ) + 0 to seek-ptr ( ) + true ( true ) +; +: close ( -- ) + \ This lets us open the node during compilation + standalone? 0= if exit then + + open-count dup 1- 0 max to open-count ( old-count ) + 1 = if then +; +: size ( -- d.size ) /device u>d ; +: read ( adr len -- actual ) + clip-size ( len' adr len' ) + seek-ptr flash-read ( len' ) + update-ptr ( len' ) +; + +0 [if] +\ Write support is complicated by the need to erase before +\ writing and the possibly-different erase and write granularity. +\ +\ For NOR FLASH, where you can write as many times as you want +\ while turning 1's into 0's, the algorithm is: +\ +\ Break the entire write range into pieces each contained in one +\ erase unit. For each piece: +\ +\ Compare the existing and new contents to see if the unit needs erasing +\ +\ If no bits need to go from 0 to 1, erase is unnecessary, so just write. +\ (It's a little more complicated if the write granularity is >1 byte.) +\ +\ Otherwise, copy the existing contents of the erase unit to a buffer, +\ merge in the new data, erase, then write back the buffer. +[then] + +: left-in-block ( len offset -- #left ) + \ Determine how many bytes are left in the page containing offset + /flash-block swap /flash-block 1- and - ( len left-in-page ) + min ( #left ) +; + +0 value /tmp +0 value 'tmp +: must-erase? ( adr len -- flag ) + dup to /tmp + /tmp alloc-mem to 'tmp ( adr len ) + 'tmp /tmp seek-ptr flash-read ( adr len ) + 'tmp swap 0 ?do ( adr dev-adr ) + over i + c@ over i + c@ ( adr dev-adr new-byte old-byte ) + \ Must erase if a bit in old-byte is 0 and that bit in new-byte is 1 + invert and if ( adr dev-adr ) + 'tmp /tmp free-mem ( adr dev-adr ) + 2drop true unloop exit ( -- flag ) + then ( adr dev-adr ) + loop ( adr dev-adr ) + 'tmp /tmp free-mem ( adr dev-adr ) + 2drop false ( flag ) +; + +: erase+write ( adr len -- ) + dup /flash-block = if + \ If we are going to overwrite the entire block, there's no need to + \ preserve the old data. This can only happen if we are already + \ aligned on an erase block boundary. + seek-ptr flash-erase-block ( adr len ) + seek-ptr flash-write ( ) + else + \ Allocate a buffer to save the old block contents + /flash-block alloc-mem >r ( adr len ) + + seek-ptr /flash-block round-down ( adr len block-start ) + + \ Copy existing data from FLASH block to the buffer + r@ /flash-block 2 pick flash-read ( adr len block-start ) + + \ Merge new bytes into the buffer + -rot ( block-start adr len ) + seek-ptr /flash-block mod ( block-start adr len buf-offset ) + r@ + swap move ( block-start ) + + \ Erase the block and rewrite it from the buffer + dup flash-erase-block ( block-start ) + r@ /flash-block rot flash-write ( ) + + \ Release the buffer + r> /flash-block free-mem + then +; + +: handle-block ( adr len -- adr' len' ) + dup seek-ptr left-in-block ( adr len #left ) + >r ( adr len r: #left ) + over r@ must-erase? if ( adr len r: #left ) + over r@ erase+write ( adr len r: #left ) + else ( adr len r: #left ) + over r@ seek-ptr flash-write ( adr len r: #left ) + then ( adr len r: #left ) + seek-ptr r@ + to seek-ptr ( adr len r: #left ) + r> /string ( adr' len' ) +; + +: write ( adr len -- #written ) + flash-write-enable + tuck ( len adr len ) + begin dup while handle-block repeat ( len adr' remain' ) + 2drop ( len ) + flash-write-disable +; + +\ These permit subordinate nodes for subranges of the device, for +\ purposes like dropin driver collections, configuration variables, etc. +1 " #address-cells" integer-property + +: decode-unit ( adr len -- phys ) push-hex $number if 0 then pop-base ; +: encode-unit ( phys -- adr len ) push-hex (u.) pop-base ; + +\ 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/spiflash/flashif.fth ============================================================================== --- dev/olpc/spiflash/flashif.fth Tue Nov 2 06:34:33 2010 (r1997) +++ dev/olpc/spiflash/flashif.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -1,6 +1,7 @@ \ See license at end of file purpose: Generic interface for FLASH programming operations
+defer flash-open ( -- ) defer flash-write-enable ( -- ) defer flash-write-disable ( -- ) defer flash-write ( adr len offset -- )
Modified: dev/olpc/spiflash/spiflash.fth ============================================================================== --- dev/olpc/spiflash/spiflash.fth Tue Nov 2 06:34:33 2010 (r1997) +++ dev/olpc/spiflash/spiflash.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -298,12 +298,20 @@ then ;
-: spi-flash-write-enable ( -- ) spi-start spi-identify .spi-id cr ; + +: spi-flash-open ( -- ) + \ One retry + spi-start ['] spi-identify catch if + spi-start spi-identify + then +; +: spi-flash-write-enable ( -- ) flash-open .spi-id cr ;
: use-spi-flash-read ( -- ) ['] read-spi-flash to flash-read ;
\ Install the SPI FLASH versions as their implementations. : use-spi-flash ( -- ) + ['] spi-flash-open to flash-open ['] spi-flash-write-enable to flash-write-enable ['] spi-reprogrammed to flash-write-disable ['] write-spi-flash to flash-write
Modified: dev/usb2/hcd/ehci/probe.fth ============================================================================== --- dev/usb2/hcd/ehci/probe.fth Tue Nov 2 06:34:33 2010 (r1997) +++ dev/usb2/hcd/ehci/probe.fth Tue Nov 2 06:52:25 2010 (r1998) @@ -119,6 +119,9 @@ init-extra ;
+\ Some OTG controllers need to do something after reset-usb to go into host mode +defer set-host-mode ' noop to set-host-mode + \ This is a sneaky way to determine if the hardware has been turned off without the software's knowledge : suspended? ( -- flag ) asynclist@ 0= qh-ptr 0<> and ;
@@ -138,6 +141,7 @@ then 0 ehci-reg@ h# ff and to op-reg-offset reset-usb + set-host-mode do-resume then suspended? if do-resume then
openfirmware@openfirmware.info