Author: wmb Date: Mon Oct 25 14:42:14 2010 New Revision: 1991 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1991
Log: OLPC XO-1.75 - checkpoint of partially working version - SD works and "flash" works (except that you have to issue the command 3 times to sync with the chip).
Added: cpu/arm/mmp2/draminit.fth cpu/arm/mmp2/sspspi.fth cpu/arm/olpc/1.75/addrs.fth cpu/arm/olpc/1.75/config.fth cpu/arm/olpc/1.75/fw.bth cpu/arm/olpc/1.75/ofw.bth cpu/arm/olpc/1.75/probemem.fth cpu/arm/olpc/1.75/sdhci.fth cpu/arm/olpc/1.75/sdregs.fth cpu/arm/olpc/1.75/spiui.fth Modified: cpu/arm/mmp2/clockset.fth cpu/arm/mmp2/mfpr.fth cpu/arm/olpc/1.75/boardgpio.fth cpu/arm/olpc/1.75/devices.fth cpu/x86/pc/biosload/config.fth cpu/x86/pc/olpc/versions.fth cpu/x86/pc/olpc/via/fw-version.fth dev/mmc/sdhci/sdhci.fth dev/olpc/kb3700/spicmd.fth dev/olpc/spiflash/spiflash.fth
Modified: cpu/arm/mmp2/clockset.fth ============================================================================== --- cpu/arm/mmp2/clockset.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/arm/mmp2/clockset.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -13,7 +13,8 @@ 0021db00 d4050034 l! \ PMUM_PLL2_CTRL2 \ same plus enable 28600322 d4050414 l! \ PMUM_PLL2_CTRL1 \ same as above plus release PLL loop filter \ select clock source, PJ4-PLL1, SP-PLL1/2, AXI/DDR-PLL1 - 20800000 d4050008 l! \ PMUM_FCCR PLL1 > PJ4 (bits 31:29), PLL1/2 > SP (bits 28:26), PLL1 > AXI&DDR (bits 25:23) +\ 20800000 d4050008 l! \ PMUM_FCCR PLL1 > PJ4 (bits 31:29), PLL1/2 > SP (bits 28:26), PLL1 > AXI&DDR (bits 25:23) + 24800000 d4050008 l! \ PMUM_FCCR PLL1 > PJ4 (bits 31:29), PLL1 > SP (bits 28:26), PLL1 > AXI&DDR (bits 25:23) \ divider setting and frequency change request, core-800, ddr-400, axi-200 08fd8248 d4282800 l! \ PMUA_CC_SP \ speed change voting, ACLK:7, DCLK:5, BACLK1:1, PCLK:0 78fd8248 d4282804 l! \ PMUA_CC_PJ \
Added: cpu/arm/mmp2/draminit.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/mmp2/draminit.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,67 @@ +h# d101c000 constant load-base +: dl + load-base ( adr ) + begin key dup control d <> while ( adr char ) + over c! 1+ ( adr' ) + repeat ( adr char ) + drop ( adr ) + load-base tuck - evaluate +; +: \ h# d parse 2drop ; immediate + +: init-mem + d0004d56 d0000010 l! \ CONFIG_DECODE_ADDR + 000c0001 d0000100 l! \ MMAP0 + 100c0001 d0000110 l! \ MMAP1 + 00006420 d0000020 l! \ SDRAM_CONFIG_TYPE1-CS0 + 00006420 d0000030 l! \ SDRAM_CONFIG_TYPE1-CS1 + 00000000 d0000b40 l! \ SDRAM_CONFIG_TYPE2-CS0 + 00000000 d0000b50 l! \ SDRAM_CONFIG_TYPE2-CS1 + 488700c5 d0000050 l! \ SDRAM_TIMING1 !4cda00c5 tRTP 2>3, tWTR 2>3, tRC 7>1a (7>26) + 323300d2 d0000060 l! \ SDRAM_TIMING2 !94860342 tRP 3>9, tRRD 2>4, tRCD 3>8, tWR 3>6, tRFC d>34 + 20000e12 d0000190 l! \ SDRAM_TIMING3 !2000381b ACS_EXIT_DLY 0>3, ACS_TIMER e>8, OUTEN 0>1, RSVD 0>1 + 3023009d d00001c0 l! \ SDRAM_TIMING4 + 00050082 d0000650 l! \ SDRAM_TIMING5 ! 110142 tRAS 5>11, tFAW 8>14 + 00909064 d0000660 l! \ SDRAM_TIMING6 ! 2424190 tZQCS 9>24, tZQOPER 24>90, tZQINIT 64>190 + 00005000 d0000080 l! \ SDRAM_CTRL1 + 00080010 d0000090 l! \ SDRAM_CTRL2 + c0000000 d00000f0 l! \ SDRAM_CTRL3 + 20c08115 d00001a0 l! \ SDRAM_CTRL4 + 01010101 d0000280 l! \ SDRAM_CTRL5_ARB_WEIGHTS + 00000000 d0000760 l! \ SDRAM_CTRL6_SDRAM_ODT_CTRL + 03000000 d0000770 l! \ SDRAM_CTRL7_SDRAM_ODT_CTRL2 + 00000133 d0000780 l! \ SDRAM_CTRL8_SDRAM_ODT_CTRL2 + 01010101 d00007b0 l! \ SDRAM_CTRL11_ARB_WEIGTHS_FAST_QUEUE + 0000000f d00007d0 l! \ SDRAM_CTRL13 + 00000000 d00007e0 l! \ SDRAM_CTRL14 + 00000000 d0000540 l! \ MCB_CTRL4 + 00000001 d0000570 l! \ MCB_SLFST_SEL + 00000000 d0000580 l! \ MCB_SLFST_CTRL0 + 00000000 d0000590 l! \ MCB_SLFST_CTRL1 + 00000000 d00005a0 l! \ MCB_SLFST_CTRL2 + 00000000 d00005b0 l! \ MCB_SLFST_CTRL3 + 00000000 d0000180 l! \ CM_WRITE_PROTECTION + 00000000 d0000210 l! \ PHY_CTRL11 + 80000000 d0000240 l! \ PHY_CTRL14 - PHY sync enable + 2000ce00 d0000240 l! \ PHY_CTRL14 - PHY DLL Reset (20000000) + 0000ce00 d0000240 l! \ PHY_CTRL14 - release reset + 0011ce00 d0000200 l! \ PHY_CTRL10 + 0010311c d0000200 l! \ PHY_CTRL10 + 20004422 d0000140 l! \ PHY_CTRL3 !20004444 PHY_RFIFO_RPTR_DLY_VAL 2>4, DQ_EXT_DLY 2>4 + 13300559 d00001d0 l! \ PHY_CTRL7 (0x2330_0339 / 0x133C_2559) + 03300990 d00001e0 l! \ PHY_CTRL8 + 00000077 d00001f0 l! \ PHY_CTRL9 + 20000088 d0000230 l! \ PHY_CTRL13 (0x2000_0108 / 0x2024_0109) + 00000080 d0000e10 l! \ PHY_DLL_CTRL1 + 00000080 d0000e20 l! \ PHY_DLL_CTRL2 + 00000080 d0000e30 l! \ PHY_DLL_CTRL3 + 00000000 d0000e40 l! \ PHY_CTRL_WL_SELECT + 00000000 d0000e50 l! \ PHY_CTRL_WL_CTRL0 + 03000001 d0000120 l! \ USER_INITIATED_COMMAND0 - init command to both CS (need to wait 200 us for tINIT3) + 0302003f d0000410 l! \ USER_INITIATED_COMMAND1 - MRW MR63 (RESET) to both CS (need to wait RESET_COUNT) + 01001000 d0000120 l! \ USER_INITIATED_COMMAND0 - MRW MR10 (ZQ long cal) to CS0 (need 360 ns delay for tZQCS) + 02001000 d0000120 l! \ USER_INITIATED_COMMAND0 - MRW MR10 (ZQ long cal) to CS1 (need 360 ns delay for tZQCS) + 03020001 d0000410 l! \ USER_INITIATED_COMMAND1 - MRW MR1 to both CS + 03020002 d0000410 l! \ USER_INITIATED_COMMAND1 - MRW MR2 to both CS + 03020003 d0000410 l! \ USER_INITIATED_COMMAND1 - MRW MR3 to both CS +;
Modified: cpu/arm/mmp2/mfpr.fth ============================================================================== --- cpu/arm/mmp2/mfpr.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/arm/mmp2/mfpr.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -49,5 +49,6 @@ : af@ ( gpio# -- function# ) gpio>mfpr l@ ; : af! ( function# gpio# -- ) gpio>mfpr l! ; : af, ( n -- ) h# c0 + w, ; +: +fast ( n -- n' ) h# 1800 or ; : pull-up, ( n -- ) h# c0c0 + w, ; : pull-dn, ( n -- ) h# a0c0 + w, ;
Added: cpu/arm/mmp2/sspspi.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/mmp2/sspspi.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,76 @@ +\ See license at end of file +\ Access primitives for SPI FLASH using Marvell MMP2 SSP + +\ 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. + +h# d4035000 value ssp-base \ SSP1 +: ssp-sscr0 ( -- adr ) ssp-base ; +: ssp-sscr1 ( -- adr ) ssp-base la1+ ; +: ssp-sssr ( -- adr ) ssp-base 2 la+ ; +: ssp-ssdr ( -- adr ) ssp-base 4 la+ ; + + +: ssp-spi-start ( -- ) + h# 07 ssp-sscr0 l! + 0 ssp-sscr1 l! + h# 87 ssp-sscr0 l! + d# 46 gpio-set + d# 46 gpio-dir-out + h# c0 d# 46 af! +; +: ssp-spi-cs-on ( -- ) d# 46 gpio-clr ; +: ssp-spi-cs-off ( -- ) d# 46 gpio-set ; + +: ssp-spi-out-in ( bo -- bi ) + begin ssp-sssr l@ 4 and until \ Tx not full + ssp-ssdr l! + begin ssp-sssr l@ 8 and until \ Rx not empty + ssp-ssdr l@ +; + +: ssp-spi-out ( b -- ) ssp-spi-out-in drop ; +: ssp-spi-in ( -- b ) 0 ssp-spi-out-in ; + +: safe-spi-start + disable-interrupts + ignore-power-button + ssp-spi-start +; + +: use-ssp-spi ( -- ) + ['] safe-spi-start to spi-start + ['] ssp-spi-in to spi-in + ['] ssp-spi-out to spi-out + ['] ssp-spi-cs-on to spi-cs-on + ['] ssp-spi-cs-off to spi-cs-off + ['] ssp-spi-reprogrammed to spi-reprogrammed + use-spi-flash-read +; +use-ssp-spi + +\ 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
Added: cpu/arm/olpc/1.75/addrs.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/addrs.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,40 @@ +\ Platform design choices +h# 2000.0000 constant total-ram-size + +h# 1fc0.0000 constant fb-pa +h# 40.0000 constant fb-size \ The screen use a little more than 3 MiB at 1200x900x24 + +fb-pa constant available-ram-size + + +: (memory?) ( phys -- flag ) total-ram-size u< ; +' (memory?) to memory? + +\ OFW implementation choices +\ h# 1fe0.0000 constant fw-pa +0 constant fw-pa + +[ifdef] virtual-mode +h# f700.0000 constant fw-virt-base +h# 0100.0000 constant fw-virt-size \ 16 megs of mapping space +[else] +fw-pa value fw-virt-base +0 value fw-virt-size +[then] + +h# 0020.0000 constant /fw-ram + +h# 0110.0000 constant def-load-base + +\ The heap starts at RAMtop, which on this system is "fw-pa /fw-ram +" + +h# 10.0000 constant heap-size +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/boardgpio.fth ============================================================================== --- cpu/arm/olpc/1.75/boardgpio.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/arm/olpc/1.75/boardgpio.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -22,11 +22,13 @@ d# 58 gpio-dir-out \ WLAN_RESET# d# 73 gpio-dir-out \ CAM_RST
+ d# 125 gpio-set d# 125 gpio-dir-out \ EC_SPI_ACK d# 145 gpio-dir-out \ EN_CAM_PWR d# 146 gpio-dir-out \ HUB_RESET# d# 151 gpio-dir-out \ DCONLOAD - d# 151 gpio-dir-out \ EC_SPI_CMD + d# 155 gpio-clr + d# 155 gpio-dir-out \ EC_SPI_CMD
d# 162 gpio-dir-out \ DCON_SCL d# 163 gpio-dir-out \ DCON_SDA @@ -160,7 +162,7 @@ 1 af, \ GPIO_110 - (ND_IO[13]) - Not connected (TP43) 1 af, \ GPIO_111 - (ND_IO[8]) - Not connected (TP108) 0 af, \ GPIO_112 - ND_RDY[0] - 3 af, \ GPIO_113 - (SM_RDY) - MSD_CMD + 3 af, \ GPIO_113 - (SM_RDY) - MSD_CMD (externally pulled up) 1 af, \ GPIO_114 - G_CLK_OUT - Not connected (TP93)
4 af, \ GPIO_115 - UART3_TXD (J4) @@ -175,22 +177,24 @@ 3 af, \ GPIO_123 - 32 KHz_CLK_OUT - Not connected (TP92)
0 af, \ GPIO_124 - DCONIRQ - 0 af, \ GPIO_125 - EC_SPI_ACK +\ 0 af, \ GPIO_125 - EC_SPI_ACK + 0 pull-up, \ GPIO_125 - EC_SPI_ACK
- 3 af, \ GPIO_126 - MSD_DATA2 - 3 af, \ GPIO_127 - MSD_DATA0 + 3 pull-up, \ GPIO_126 - MSD_DATA2 + 3 pull-up, \ GPIO_127 - MSD_DATA0 0 af, \ GPIO_128 - EB_MODE# 0 af, \ GPIO_129 - LID_SW# - 3 af, \ GPIO_130 - MSD_DATA3 - 1 af, \ GPIO_131 - SD_DATA3 - 1 af, \ GPIO_132 - SD_DATA2 - 1 af, \ GPIO_133 - SD_DATA1 - 1 af, \ GPIO_134 - SD_DATA0 - 3 af, \ GPIO_135 - MSD_DATA1 - 1 af, \ GPIO_136 - SD_CMD + 3 pull-up, \ GPIO_130 - MSD_DATA3 + 1 +fast pull-up, \ GPIO_131 - SD_DATA3 + 1 +fast pull-up, \ GPIO_132 - SD_DATA2 + 1 +fast pull-up, \ GPIO_133 - SD_DATA1 + 1 +fast pull-up, \ GPIO_134 - SD_DATA0 + 3 pull-up, \ GPIO_135 - MSD_DATA1 +\ 1 +fast pull-up, \ GPIO_136 - SD_CMD + 1 +fast af, \ GPIO_136 - SD_CMD - CMD is pulled up externally no-update, \ GPIO_137 - Not connected (TP111) - 3 af, \ GPIO_138 - MSD_CLK - 1 af, \ GPIO_139 - SD_CLK + 3 pull-up, \ GPIO_138 - MSD_CLK + 1 +fast pull-up, \ GPIO_139 - SD_CLK no-update, \ GPIO_140 - Not connected if R130 is nopop \ 1 af, \ GPIO_140 - (SD_CD# if R130 is populated) 1 af, \ GPIO_141 - SD_WP @@ -209,7 +213,7 @@ 1 af, \ GPIO_152 - (SM_BELn) - Not connected (TP40) 1 af, \ GPIO_153 - (SM_BEHn) - Not connected (TP105) 0 af, \ GPIO_154 - (SM_INT) - EC_IRQ# - 1 af, \ GPIO_155 - (EXT_DMA_REQ0) - EC_SPI_CMD + 1 pull-dn, \ GPIO_155 - (EXT_DMA_REQ0) - EC_SPI_CMD no-update, \ GPIO_156 - PRI_TDI (JTAG) no-update, \ GPIO_157 - PRI_TDS (JTAG) no-update, \ GPIO_158 - PRI_TDK (JTAG)
Added: cpu/arm/olpc/1.75/config.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/config.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,4 @@ +create debug-startup + +fload ${BP}/cpu/arm/olpc/1.75/addrs.fth +fload ${BP}/cpu/arm/mmp2/hwaddrs.fth
Modified: cpu/arm/olpc/1.75/devices.fth ============================================================================== --- cpu/arm/olpc/1.75/devices.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/arm/olpc/1.75/devices.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -1,5 +1,6 @@ fload ${BP}/dev/omap/diaguart.fth \ OMAP UART -h# d4030000 to uart-base \ UART# base address on MMP2 +h# d4018000 to uart-base \ UART3 base address on MMP2 +\ h# d4030000 to uart-base \ UART1 base address on MMP2 d# 26000000 to uart-clock-frequency
: init-clocks @@ -12,7 +13,6 @@ h# c1 h# d401e0cc l! \ GPIO30 = af1 for UART1 TXD h# c4 h# d401e260 l! \ GPIO115 = af4 for UART3 RXD h# c4 h# d401e264 l! \ GPIO116 = af4 for UART3 TXD - h# 1b h# d4282854 l! \ SD0 clocks ;
: inituarts ( -- ) @@ -51,17 +51,17 @@ fload ${BP}/cpu/arm/mmp2/mfpr.fth fload ${BP}/cpu/arm/mmp2/gpio.fth
-fload ${BP}/cpu/arm/olpc/1.75/boardtwsi.fth +\ fload ${BP}/cpu/arm/olpc/1.75/boardtwsi.fth fload ${BP}/cpu/arm/olpc/1.75/boardgpio.fth : init-stuff - set-camera-domain-voltage +\ set-camera-domain-voltage acgr-clocks-on init-mfprs set-gpio-directions init-timers init-twsi - power-on-dsi - power-on-sd +\ power-on-dsi +\ power-on-sd ; stand-init: init-stuff @@ -71,19 +71,39 @@
fload ${BP}/cpu/arm/mmp2/watchdog.fth \ reset-all using watchdog timer
-0 0 " d4030000" " /" begin-package \ UART1 +0 0 " d4018000" " /" begin-package \ UART3 fload ${BP}/cpu/arm/mmp2/uart.fth end-package devalias com1 /uart : com1 " com1" ; ' com1 is fallback-device
-0 0 " d4018000" " /" begin-package \ UART3 +0 0 " d4030000" " /" begin-package \ UART1 fload ${BP}/cpu/arm/mmp2/uart.fth end-package devalias com2 /uart : com2 " com2" ;
+\needs md5init fload ${BP}/ofw/ppp/md5.fth \ MD5 hash + +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 +: ssp-spi-reprogrammed ; +: ?erased ( adr len -- flag ) 2drop true ; +: ?enough-power ( -- ) ; + +fload ${BP}/cpu/arm/mmp2/sspspi.fth \ Synchronous Serial Port SPI interface + +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" ; +' ofw-fw-filename$ to fw-filename$ + +0 [if] 0 0 " d420b000" " /" begin-package " display" name fload ${BP}/cpu/arm/olpc/1.75/lcdcfg.fth @@ -122,10 +142,12 @@ devalias keyboard /keyboard
fload ${BP}/ofw/termemu/cp881-16.fth +[then]
-fload ${BP}/cpu/arm/mmp2/sdhcimmp2.fth +fload ${BP}/cpu/arm/olpc/1.75/sdhci.fth
-devalias ext /sd/disk@1 +devalias int /sd@d4281000/disk +devalias ext /sd@d4280000/disk
fload ${BP}/dev/olpc/kb3700/spicmd.fth
@@ -145,10 +167,12 @@
: usb-power-on ( -- ) d# 82 gpio-set ; \ 1 instead of 82 for XO
+0 [if] fload ${BP}/cpu/arm/marvell/utmiphy.fth stand-init: Init USB Phy init-usb-phy ; +[then]
\ LICENSE_BEGIN \ Copyright (c) 2010 FirmWorks
Added: cpu/arm/olpc/1.75/fw.bth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/fw.bth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,519 @@ +purpose: Build OFW Forth dictionary for OLPC XO-1.75 +\ See license at end of file + +dictionary: ${BP}/cpu/arm/build/basefw.dic +command: &armforth &dictionary &this +build-now + +" fw.tag" r/w create-file drop tag-file ! + +hex +\ ' $report-name is include-hook +' noop is include-hook + +fload ${BP}/cpu/arm/olpc/1.75/config.fth + +: headerless ; : headers ; : headerless0 ; + +' (quit) to quit + +: \Tags [compile] \ ; immediate +: \NotTags [compile] \ ; immediate + +: RAMbase ( -- adr ) fw-virt-base ; +: RAMtop ( -- adr ) RAMbase /fw-ram + ; + +def-load-base ' load-base set-config-int-default + +\ use-movable-vector-base \ Marvell CPU core has a movable vector base + +true ' fcode-debug? set-config-int-default +\ false ' auto-boot? set-config-int-default + + + +[ifdef] serial-console +" com1" ' output-device set-config-string-default +" com1" ' input-device set-config-string-default +[then] + + +fload ${BP}/cpu/arm/mmp2/rootnode.fth \ Root node mapping - physical mode +dev / + " olpc,XO-1.75" model + " Marvell,Armada 610" encode-string " architecture" property +\ The clock frequency of the root bus may be irrelevant, since the bus is internal to the SOC +\ d# 1,000,000,000 " clock-frequency" integer-property +device-end + +: (cpu-arch ( -- adr len ) + " architecture" ['] root-node get-package-property drop + get-encoded-string +; +' (cpu-arch to cpu-arch + +\ Memory management services +[ifdef] virtual-mode +fload ${BP}/ofw/core/clntmem1.fth \ client services for memory +[else] +fload ${BP}/ofw/core/clntphy1.fth \ client services for memory +: >physical ( va -- pa ) + dup fw-virt-base - fw-virt-size u< if ( va ) + fw-virt-base - fw-pa + + then +; +[then] +fload ${BP}/ofw/core/memlist.fth \ Resource list common routines +fload ${BP}/ofw/core/showlist.fth \ Linked list display tool +fload ${BP}/ofw/core/allocph1.fth \ S Physical memory allocator +fload ${BP}/ofw/core/availpm.fth \ Available memory list + +fload ${BP}/cpu/arm/olpc/1.75/probemem.fth \ Memory probing + +stand-init: Probing memory + " probe" memory-node @ $call-method +; + +[ifdef] virtual-mode +fload ${BP}/cpu/arm/loadvmem.fth \ /mmu node +stand-init: MMU + " /mmu" open-dev mmu-node ! +; +fload ${BP}/ofw/core/initdict.fth \ Dynamic dictionary allocation +fload ${BP}/arch/arm/loadarea.fth \ Allocate and map program load area +[else] +fload ${BP}/cpu/arm/mmp2/mmuon.fth +[then] + +\ XXX should be elsewhere +dev /client-services +: chain ( len args entry size virt -- ) + release ( len args entry ) + h# 8000 alloc-mem h# 8000 + (init-program) ( len args ) + to r1 to r2 + go +; +device-end + +fload ${BP}/cpu/arm/crc32.fth \ Assembly language Zip CRC calculation +fload ${BP}/forth/lib/crc32.fth \ High-level portion of CRC calculation + +[ifdef] resident-packages + +\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation +support-package: ext2-file-system + fload ${BP}/ofw/fs/ext2fs/ext2fs.fth \ Linux file system +end-support-package + +[ifdef] jffs2-support +\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation +support-package: jffs2-file-system + fload ${BP}/ofw/fs/jffs2/jffs2.fth \ Journaling flash file system 2 +end-support-package +[then] + +support-package: zip-file-system + fload ${BP}/ofw/fs/zipfs.fth \ Zip file system +end-support-package +[then] + +fload ${BP}/ofw/core/osfile.fth \ For testing + +\ Load file format handlers + +: call32 ; + +fload ${BP}/ofw/core/allocsym.fth \ Allocate memory for symbol table +fload ${BP}/ofw/core/symcif.fth +fload ${BP}/ofw/core/symdebug.fth +: release-load-area ( boundary-adr -- ) drop ; + +[ifdef] use-elf +fload ${BP}/ofw/elf/elf.fth +fload ${BP}/ofw/elf/elfdebug.fth +[ifdef] virtual-mode +\ Depends on the assumption that physical memory is mapped 1:1 already +: (elf-map-in) ( va size -- ) 0 mem-claim drop ; +[else] +: (elf-map-in) ( va size -- ) 2drop ; +[then] +' (elf-map-in) is elf-map-in +[then] + +\ Reboot and re-entry code +fload ${BP}/ofw/core/reboot.fth \ Restart the client program +fload ${BP}/ofw/core/reenter.fth \ Various entries into Forth + +headerless +[ifdef] virtual-mode +: (initial-heap) ( -- adr len ) sp0 @ ps-size - dict-limit tuck - ; +[else] + \ : (initial-heap) ( -- adr len ) RAMtop heap-size ; +: (initial-heap) ( -- adr len ) limit heap-size ; +[then] +' (initial-heap) is initial-heap +headers + +" /openprom" find-device + " FirmWorks,3.0" encode-string " model" property +device-end + +[ifdef] virtual-mode +fload ${BP}/cpu/arm/mmusetup.fth \ Initial values for MMU lists +[then] + +: background-rgb ( -- r g b ) h# ff h# ff h# ff ; + +fload ${BP}/cpu/arm/olpc/1.75/devices.fth + +[ifndef] virtual-mode +warning off +: stand-init-io + stand-init-io + go-fast \ From mmuon.fth +; +warning on +[then] + +true ' local-mac-address? set-config-int-default +[ifdef] resident-packages +support-package: nfs + fload ${BP}/ofw/fs/nfs/loadpkg.fth +end-support-package + +[then] +devalias nfs net//obp-tftp:last//nfs + +fload ${BP}/cpu/arm/linux.fth +h# 20.0000 to linux-params \ The Jasper Linux kernel fails unless the params are between 0x20.0000 and 0x20.4000 +d# 9999 to arm-linux-machine-type \ Marvell Jasper + +\ Add a tag describing the linear frame buffer +: mmp-fb-tag, ( -- ) + 8 tag-l, + h# 54410008 tag-l, \ ATAG_VIDEOLFB + d# 1200 tag-w, \ Width + d# 900 tag-w, \ Height + d# 24 tag-w, \ Depth + d# 1200 3 * tag-w, \ Pitch + fb-pa tag-l, \ Base address + d# 1200 3 * d# 900 * tag-l, \ Total size - perhaps could be larger + 8 tag-b, \ Red size + d# 0 tag-b, \ Red position + 8 tag-b, \ Green size + d# 8 tag-b, \ Green position + 8 tag-b, \ Blue size + d# 16 tag-b, \ Blue position + 0 tag-b, \ Rsvd size + d# 24 tag-b, \ Rsvd position +; +\ ' mmp-fb-tag, to fb-tag, + +\ fload ${BP}/cpu/arm/mmp2/usb.fth + +\ false to stand-init-debug? +true to stand-init-debug? + +: protect-fw ( -- ) ; + +hex +: i-key-wait ( ms -- pressed? ) + cr ." Type 'i' to interrupt stand-init sequence" cr ( ms ) + 0 do + ukey? if + ukey upc ascii I = if true unloop exit then + then + 1 ms + loop + false +; + +warning @ warning off +: init +\ initial-heap add-memory + init + + standalone? if + disable-interrupts + d# 1000 + i-key-wait if +\ protect-fw + ." Interacting" cr hex interact + then + \ Turn on USB power here to overlap the time with other startup actions + usb-power-on + then +; +warning ! +[then] + +: (.firmware) ( -- ) + ." Open Firmware " .built cr + ." Copyright 2010 FirmWorks All Rights Reserved" cr +; +' (.firmware) to .firmware + +fload ${BP}/ofw/gui/bmptools.fth +fload ${BP}/dev/null.fth +fload ${BP}/ofw/core/bailout.fth + +\ GUI +false value gui-safeboot? + +: 2tuck ( d1 d2 -- d2 d1 d2 ) 2swap 2over ; +: user-ok "ok" ; \ This is supposed to check for authorization +true value user-mode? + +fload ${BP}/ofw/gui/loadmenu.fth +\ fload ${BP}/ofw/gui/insticon.fth + +\ Uninstall the diag menu from the general user interface vector +\ so exiting from emacs doesn't invoke the diag menu. +' quit to user-interface + +: screen-#lines ( -- n ) + screen-ih 0= if default-#lines exit then + screen-ih package( #lines )package +; +' screen-#lines to lines/page + +true value text-on? +: text-off ( -- ) + text-on? if + screen-ih remove-output + false to text-on? + then +; +: text-on ( -- ) + text-on? 0= if + screen-ih add-output + cursor-on + true to text-on? + then +; + +fload ${BP}/cpu/x86/pc/olpc/help.fth + +[ifdef] notyet +fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth + +: emacs ( -- ) + false to already-go? + boot-getline to boot-file " rom:emacs" $boot +; + +fload ${BP}/ofw/gui/ofpong.fth +fload ${BP}/cpu/x86/pc/olpc/life.fth +[then] + +" u:\boot\olpc.fth ext:\boot\olpc.fth int:\boot\olpc.fth ext:\zimage /prober /usb/ethernet /usb/wlan" + ' boot-device set-config-string-default + +\needs ramdisk " " d# 128 config-string ramdisk +" " ' boot-file set-config-string-default \ Let the boot script set the cmdline + +\ Eliminate 4 second delay in install console for the case where +\ there is no keyboard. The delay is unnecessary because the screen +\ does not go blank when the device is closed. +patch drop ms install-console + +alias reboot bye + +alias crcgen drop ( crc byte -- crc' ) + +\ Dictionary growth size for the ARM Image Format header +\ 1 section before origin section table +h# 10.0000 h# 8000 - h# 4000 - dictionary-size ! + +fload ${BP}/cpu/arm/saverom.fth \ Save the dictionary for standalone startup + +fload ${BP}/forth/lib/selstr.fth + +fload ${BP}/ofw/inet/loadtcp.fth + +support-package: http + fload ${BP}/ofw/inet/http.fth \ HTTP client +end-support-package + +[ifdef] notyet +fload ${BP}/cpu/x86/pc/olpc/memtest.fth +[then] + +[ifdef] notyet +fload ${BP}/ofw/wifi/wifi-cfg.fth +support-package: supplicant +fload ${BP}/ofw/wifi/loadpkg.fth +end-support-package + +: ofw-ssids ( -- $ ) " OFWSSID" ; +' ofw-ssids to default-ssids +[then] + +fload ${BP}/ofw/inet/sntp.fth +: olpc-ntp-servers ( -- ) + " DHCP time 172.18.0.1 0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org" +; +' olpc-ntp-servers to ntp-servers +: ntp-time&date ( -- s m h d m y ) + ntp-timestamp abort" Can't contact NTP server" + ntp>time&date +; +: .clock ( -- ) + time&date .date space .time ." UTC" cr +; +: ntp-set-clock ( -- ) + ntp-time&date " set-time" clock-node @ $call-method + .clock +; + +[ifdef] use-ppp +fload ${BP}/ofw/ppp/loadppp.fth +[then] + +" dhcp" ' ip-address set-config-string-default + +[ifdef] notyet +: c1-idle ( -- ) interrupts-enabled? if halt then ; +' c1-idle to stdin-idle +[then] + +fload ${BP}/ofw/core/countdwn.fth \ Startup countdown + +: console-start ( -- ) + install-mux-io +\ cursor-off + true to text-on? + + " //null" open-dev to null-ih \ For text-off state +; + +: interpreter-init ( -- ) + hex + warning on + only forth also definitions + +\ install-alarm + + page-mode + #line off + +\ .built cr +; + +[ifdef] notyet +: ?games ( -- ) + rocker-right game-key? if + protect-fw + time&date 5drop 1 and if + ['] pong guarded + else + ['] life-demo guarded + then + power-off + then +; +: ?diags ( -- ) + rocker-left game-key? if + protect-fw + text-on " test-all" ['] eval guarded + ." Tests complete - powering off" cr d# 5000 ms power-off + then +; + +: ?scan-nand ( -- ) + rocker-up game-key? if + protect-fw text-on ['] scan-nand guarded + then +; +: ?fs-update ( -- ) + button-check button-x or button-o or button-square or ( mask ) + game-key-mask = if protect-fw try-fs-update then +; +[then] + +: startup ( -- ) + standalone? 0= if exit then + +\ block-exceptions + no-page + + console-start + +[ifdef] notyet + read-game-keys +[then] + +\ text-off + + " probe-" do-drop-in + +[ifdef] notyet + sound + ?games +[then] + + ['] false to interrupt-auto-boot? +[ifdef] probe-usb + probe-usb + report-disk + report-keyboard +[then] + " probe+" do-drop-in + + interpreter-init +[ifdef] notyet + ?scan-nand + ?diags + ?fs-update +[then] +\ unblock-exceptions + ['] (interrupt-auto-boot?) to interrupt-auto-boot? +\ ?usb-keyboard + auto-banner? if banner then + + auto-boot + + cr cr + + quit +; + +\ This helps with TeraTerm, which sends ESC-O as the arrow key prefix +also hidden also keys-forth definitions +warning @ warning off +: esc-o key lastchar ! [""] esc-[ do-command ; +warning ! +previous previous definitions + +tag-file @ fclose tag-file off + +.( --- Saving fw.dic ...) +" fw.dic" $save-forth cr + +fload ${BP}/cpu/arm/mmp2/rawboot.fth + +.( --- Saving fw.img --- ) cr " fw.img" $save-rom + +\ 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
Added: cpu/arm/olpc/1.75/ofw.bth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/ofw.bth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,55 @@ +purpose: Build Open Firmware for OLPC XO-1.75 +\ See license at end of file + +\ in: sp.img +\ in: fw.img +command: &builder &this +build-now + +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 +\ image: OFW0 20000 00000000 ${BP}/cpu/arm/olpc/1.75/build/fw.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 + +save-image: ofw.rom + +\ 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
Added: cpu/arm/olpc/1.75/probemem.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/probemem.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,30 @@ +purpose: Memory probing +copyright: Copyright 1994 FirmWorks All Rights Reserved + +" /memory" find-device + +headerless + +h# ffff.ffff value low +h# 0 value high + +: log&release ( adr len -- ) + over low umin to low ( adr len ) + 2dup + high umax to high ( adr len ) + release +; + +headers +: probe ( -- ) + 0 available-ram-size log&release +\ h# 2000.0000 h# 1000.0000 log&release + + 0 0 encode-bytes ( adr 0 ) + physavail ['] make-phys-memlist find-node ( adr len prev 0 ) + 2drop " reg" property + + \ Claim the memory used by OFW +\ high h# 10.0000 - h# 10.0000 0 claim drop +; + +device-end
Added: cpu/arm/olpc/1.75/sdhci.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/sdhci.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,79 @@ +purpose: Load file for SDHCI (Secure Digital Host Controller Interface) + +0 0 " d4280000" " /" begin-package + + fload ${BP}/cpu/arm/olpc/1.75/sdregs.fth + fload ${BP}/dev/mmc/sdhci/sdhci.fth + + true to avoid-high-speed? + + hex + \ The new clock divisor layout is low 8 bits in [15:8] and high 2 bits in [7:6] + \ The resulting 10-bit value is multiplied by 2 to form the divisor for the + \ 200 MHz base clock. + patch 403 103 card-clock-25 \ n is 4, divisor is 8, clk is 25 MHz + patch 203 003 card-clock-50 \ n is 2, divisor is 4, clk is 50 MHz + patch 043 8003 card-clock-slow \ n is h# 100 (high 2 bits in [7:6], for divisor of 512 from 200 MHz clock + + : gpio-card-inserted? ( -- flag ) d# 31 gpio-pin@ 0= ; + ' gpio-card-inserted? to card-inserted? + + : gpio-power-on ( -- ) sdhci-card-power-on d# 35 gpio-set ; + ' gpio-power-on to card-power-on + + : gpio-power-off ( -- ) d# 35 gpio-clr sdhci-card-power-off ; + ' gpio-power-off to card-power-off + +\ new-device +\ 2 encode-int " reg" property +\ " mv8686" " $load-driver" eval drop +\ finish-device + + new-device + 1 encode-int " reg" property + fload ${BP}/dev/mmc/sdhci/sdmmc.fth + \ fload ${BP}/dev/mmc/sdhci/selftest.fth + " external" " slot-name" string-property + finish-device + +end-package + +0 0 " d4281000" " /" begin-package + + fload ${BP}/cpu/arm/olpc/1.75/sdregs.fth + fload ${BP}/dev/mmc/sdhci/sdhci.fth + + true to avoid-high-speed? + + hex + \ The new clock divisor layout is low 8 bits in [15:8] and high 2 bits in [7:6] + \ The resulting 10-bit value is multiplied by 2 to form the divisor for the + \ 200 MHz base clock. + patch 403 103 card-clock-25 \ n is 4, divisor is 8, clk is 25 MHz + patch 203 003 card-clock-50 \ n is 2, divisor is 4, clk is 50 MHz + patch 043 8003 card-clock-slow \ n is h# 100 (high 2 bits in [7:6], for divisor of 512 from 200 MHz clock + + ' true to card-inserted? + + : gpio-power-on ( -- ) sdhci-card-power-on d# 33 gpio-set ; + ' gpio-power-on to card-power-on + + : gpio-power-off ( -- ) d# 33 gpio-clr sdhci-card-power-off ; + ' gpio-power-off to card-power-off + + + new-device + 1 encode-int " reg" property + fload ${BP}/dev/mmc/sdhci/sdmmc.fth + \ fload ${BP}/dev/mmc/sdhci/selftest.fth + " internal" " slot-name" string-property + finish-device + +end-package + +stand-init: \ SDHC clocks + h# 41b h# d4282854 l! \ SD0 (external SD) clocks, plus set master clock divisor + h# 1b h# d42828e8 l! \ SD2 (internal microSD) clocks + h# 70a h# d4200104 l! \ Clock gating + h# 70a h# d4201104 l! \ Clock gating +;
Added: cpu/arm/olpc/1.75/sdregs.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/sdregs.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,22 @@ +h# 200 value /regs \ SDHCI register block +1 value #slots + +0 instance value slot +0 instance value chip + +my-space /regs reg + +: map-regs ( -- ) + chip if exit then + slot 1- h# 800 * my-space + /regs " map-in" $call-parent + to chip +; +: unmap-regs ( -- ) + chip 0= if exit then + chip /regs " map-out" $call-parent + 0 to chip +; + +: vendor-modes ( -- ) ; +: ?cafe-fpga-quirk ( -- ) ; +: ?via-quirk ( -- ) ;
Added: cpu/arm/olpc/1.75/spiui.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ cpu/arm/olpc/1.75/spiui.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -0,0 +1,391 @@ +\ See license at end of file +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 +\ a FLASH device from that image. The details of how to actually +\ access the FLASH device are defined elsewhere. + +h# 4000 constant /chunk \ Convenient sized piece for progress reports + +[ifdef] use-flash-nvram +h# d.0000 constant nvram-offset +[then] + +[ifdef] mfg-data-top +h# e.0000 constant mfg-data-offset +mfg-data-offset /flash-block + constant mfg-data-end-offset +: mfg-data-range ( -- adr len ) mfg-data-top dup last-mfg-data tuck - ; + +[ifdef] $call-method +: make-sn-name ( -- filename$ ) + " SN" find-tag 0= abort" No serial number in mfg data" ( sn$ ) + dup if ( sn$ ) + 2dup + 1- c@ 0= if ( sn$ ) + 1- ( sn$' ) \ Remove Null + then ( sn$ ) + then ( sn$ ) + d# 11 over - dup 0> if ( sn$' #excess ) + /string ( sn$' ) \ Keep last 11 characters + else ( sn$' #excess ) + drop ( sn$ ) + then ( sn$ ) + + " disk:" "temp place ( sn$' ) + + dup 8 > if ( sn$ ) + over 8 "temp $cat ( sn$ ) + 8 /string ( sn$' ) + " ." "temp $cat ( sn$ ) + then ( sn$ ) + "temp $cat ( ) + "temp count ( filename$ ) +; + +: save-mfg-data ( -- ) + make-sn-name ( name$ ) + ." Creating " 2dup type cr + $create-file ( ihandle ) + dup 0= abort" Can't create file" >r ( r: ihandle ) + mfg-data-range " write" r@ $call-method ( r: ihandle ) + r> close-dev +; +: restore-mfg-data ( "filename" -- ) + reading + ifd @ fsize dup /flash-block > if ( len ) + drop ifd @ fclose ( ) + true abort" File is too big" + then ( len ) + mfg-data-buf swap ( adr len ) + 2dup ifd @ fgets drop ( adr len ) + ifd @ fclose + + flash-write-enable + mfg-data-offset flash-erase-block ( adr len ) + mfg-data-end-offset over - ( adr len offset ) + flash-write ( ) + flash-write-disable ( ) +; +[then] + +: ?move-mfg-data ( -- ) + ." Merging existing manufacturing data" cr + + tethered? if + \ Read the manufacturing data from the other FLASH + flash-buf mfg-data-offset + /flash-block mfg-data-offset flash-read + exit + then + + \ Copy the entire block containing the manufacturing data into the + \ memory buffer. This make verification easier. + + mfg-data-top /flash-block - ( src-adr ) + flash-buf mfg-data-offset + ( src-adr dst-adr ) + /flash-block move ( ) +; +[then] + +: write-flash-range ( adr end-offset start-offset -- ) + ." Writing" cr + ?do ( adr ) + \ Save time - don't write if the data is the same + i .x (cr ( adr ) + spi-us d# 20 >= if ( adr ) + \ Just write if reading is slow + true ( adr must-write? ) + else ( adr ) + dup /flash-block i flash-verify ( adr must-write? ) + then ( adr must-write? ) + + if + i flash-erase-block + dup /flash-block i flash-write ( adr ) + then + /flash-block + ( adr' ) + /flash-block +loop ( adr ) + cr drop ( ) +; + +: verify-flash-range ( adr end-offset start-offset -- ) + ." Verifying" cr + ?do ( adr ) + i .x (cr + dup /flash-block i flash-verify abort" Verify failed" + /flash-block + ( adr' ) + /flash-block +loop ( adr ) + cr drop ( ) +; + + +\ Perform a series of sanity checks on the new firmware image. + +: check-firmware-image ( adr len -- adr len ) + dup /flash <> abort" Wrong image length" ( adr len ) + 2dup + h# 40 - ( adr len signature-adr ) + dup " CL1" comp abort" No firmware signature" ( adr len signature-adr ) + ." Firmware: " h# 10 type ( adr len ) + \ XXX add some more sanity checks +; + +[ifdef] load-base +: flash-buf load-base ; +: mfg-data-buf load-base /flash + ; +[else] +/flash buffer: flash-buf +/flash-block buffer: mfg-data-buf +[then] +0 value file-loaded? + +h# 30 constant crc-offset \ From end (modified in devices.fth for XO 1.5) + +: crc ( adr len -- crc ) 0 crctab 2swap ($crc) ; + +: ?crc ( -- ) + ." Checking integrity ..." cr + + flash-buf /flash + crc-offset - ( crc-adr ) + dup l@ >r ( crc-adr r: crc ) + -1 over l! ( crc-adr r: crc ) + + flash-buf /flash crc ( crc-adr calc-crc r: crc ) + r@ rot l! ( calc-crc r: crc ) + r> <> abort" Firmware image has bad internal CRC" +; + +[ifdef] mfg-data-offset +: ?image-valid ( len -- ) + /flash <> abort" Image file is the wrong length" + + ." Got firmware version: " + flash-buf h# f.ffc0 + dup h# 10 type cr ( adr ) + " CL1" comp abort" Wrong machine type" + + ?crc + + flash-buf mfg-data-offset + /flash-block ['] ?erased catch + abort" Firmware image has data in the manufacturing data block" +[ifdef] use-flash-nvram + flash-buf nvram-offset + /flash-block ['] ?erased catch + abort" Firmware image has data in the NVRAM block" +[then] +; +[else] +: ?image-valid ( len -- ) + drop +; +[then] + +: $get-file ( "filename" -- ) + $read-open + flash-buf /flash ifd @ fgets ( len ) + ifd @ fclose + + ?image-valid + + true to file-loaded? +; + +: ?file ( -- ) + file-loaded? 0= if + ." You must first load a valid FLASH image file with" cr + ." get-file filename" cr + abort + then +; + +: read-flash ( "filename" -- ) + writing + /flash 0 do + i .x (cr + flash-buf i + /chunk i flash-read + /chunk +loop + flash-buf /flash ofd @ fputs + ofd @ fclose +; + +: verify ( -- ) ?file flash-buf /flash 0 verify-flash-range ; + +[ifdef] mfg-data-offset +: verify-firmware ( -- ) +[ifdef] use-flash-nvram + flash-buf nvram-offset 0 verify-flash-range \ Verify first part +[else] + flash-buf mfg-data-offset 0 verify-flash-range \ Verify first part +[then] + + \ Don't verify the block containing the manufacturing data + flash-buf mfg-data-end-offset + /flash mfg-data-end-offset verify-flash-range \ Verify last part +; +: write-firmware ( -- ) +[ifdef] use-flash-nvram + flash-buf nvram-offset 0 write-flash-range \ Write first part +[else] + flash-buf mfg-data-offset 0 write-flash-range \ Write first part +[then] + + \ Don't write the block containing the manufacturing data + + flash-buf mfg-data-end-offset + /flash mfg-data-end-offset write-flash-range \ Write last part +; +[else] +: verify-firmware ( -- ) + flash-buf /flash 0 verify-flash-range \ Verify entire FLASH +; +: write-firmware ( -- ) + flash-buf /flash 0 write-flash-range \ Write entire FLASH +; +[then] + +: .verify-msg ( -- ) + ." Type verify if you want to verify the data just written." cr + ." Verification will take about 17 minutes if the host is running Linux" cr + ." or about 5 minutes if the host is running OFW." cr +; + +: reflash ( -- ) \ Flash from data already in memory + ?file + flash-write-enable + +[ifdef] ?move-mfg-data + ?move-mfg-data +[then] + + write-firmware + + spi-us d# 20 < if + ['] verify-firmware catch if + ." Verify failed. Retrying once" cr + spi-identify + write-firmware + verify-firmware + then + flash-write-disable + else + .verify-msg + then +; + +defer fw-filename$ ' null$ to fw-filename$ + +: get-file ( ["filename"] -- ) + parse-word ( adr len ) + dup 0= if 2drop fw-filename$ then ( adr len ) + ." Reading " 2dup type cr ( adr len ) + $get-file +; + +: flash ( ["filename"] -- ) get-file ?enough-power reflash ; +: flash! ( ["filename"] -- ) get-file reflash ; + +0 [if] +\ This is a slower version of "rom-va flash-buf /flash lmove" +\ It works around the problem that continuous CPU access to the +\ SPI FLASH starves the EC of instruction fetch cycles, often +\ causing it to turn off the system. +0 value rom-va +: slow-flash-read ( -- ) + rom-pa /flash root-map-in to rom-va + /flash 0 do + rom-va i + flash-buf i + h# 1.0000 lmove + d# 200 ms + h# 1.0000 +loop + rom-va /flash root-map-out 0 to rom-va +; + +[ifdef] dev +dev /flash +: selftest ( -- error? ) + .mfg-data cr + + ." Checking SPI FLASH CRC ..." + slow-flash-read + \ Replace the manufacturing data block with all FF + flash-buf mfg-data-offset + /flash-block h# ff fill + + \ Get the CRC and then replace it with -1 + flash-buf /flash + crc-offset - dup l@ swap + -1 swap l! + + flash-buf /flash crc <> + dup if ." FAILED" else ." passed" then cr +; +device-end +[then] +[then] + +0 [if] +\ Erase the first block containing the EC microcode. This is dangerous... + +: erase-ec ( -- ) 0 flash-erase-block ; +\ Erase everything after the first sector, thus preserving +\ the EC microcode in the first sector. + +: erase-firmware ( -- ) + h# 100000 /flash-block do (cr i .x i flash-erase-block /flash-block +loop cr +; + +: reprogram-firmware ( adr len -- ) + check-firmware-image ( adr len ) + /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 abort" Verify failed" cr ( ) +; + +: flash-bios ( -- ) + ?file + + \ Don't overwrite the EC code + flash-buf /ec + /flash /ec write-flash-range + + .verify-msg +; +: verify-bios ( -- ) flash-buf /ec + /flash /ec verify-flash-range ; + +: flash-ec ( -- ) + ?file + + \ Write only the EC code + flash-buf /ec 0 write-flash-range + + ." Type verify-ec if you want to verify the data just written." cr + ." Verification will take about 1 minute..." cr +; +: verify-ec ( -- ) ?file flash-buf /ec 0 verify-flash-range ; + +: flash-all ( -- ) + ?file + + \ Write everything, EC code and BIOS + flash-buf /flash 0 write-flash-range + + ." Type verify-all if you want to verify the data just written." cr + ." Verification will take about 17 minutes..." cr +; + +[then] + +\ LICENSE_BEGIN +\ Copyright (c) 2006 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/x86/pc/biosload/config.fth ============================================================================== --- cpu/x86/pc/biosload/config.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/x86/pc/biosload/config.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -1,34 +1,25 @@ \ See license at end of file -purpose: Configuration for loading from a USB key via Syslinux +purpose: Establish configuration definitions
\ --- The environment that "boots" OFW --- \ - Image Format - Example Media - previous stage bootloader
-\ - (Syslinux) COM32 format - USB Key w/ FAT FS - Syslinux -create syslinux-loaded - -create via-demo - create debug-startup - -create virtual-mode -create linux-support \ create serial-console -\ create use-usb-debug-port -create pc - -\ create pseudo-nvram create resident-packages create addresses-assigned \ Don't reassign PCI addresses \ create virtual-mode -create use-root-isa -\ create use-isa-ide +\ create use-root-isa +create use-timestamp-counter +create use-pci-isa +create use-isa-ide create use-ega create use-elf +\ create use-ne2000 create use-watch-all -\ create use-null-nvram create pseudo-nvram -create no-floppy-node +\ create use-null-nvram +\ create no-floppy-node
fload ${BP}/cpu/x86/pc/biosload/addrs.fth
Modified: cpu/x86/pc/olpc/versions.fth ============================================================================== --- cpu/x86/pc/olpc/versions.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/x86/pc/olpc/versions.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -2,7 +2,7 @@
\ The overall firmware revision macro: FW_MAJOR E -macro: FW_MINOR 44d +macro: FW_MINOR 44e
\ The EC microcode macro: EC_VERSION e34
Modified: cpu/x86/pc/olpc/via/fw-version.fth ============================================================================== --- cpu/x86/pc/olpc/via/fw-version.fth Mon Oct 25 14:34:03 2010 (r1990) +++ cpu/x86/pc/olpc/via/fw-version.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -1,3 +1,3 @@ \ The overall firmware revision macro: FW_MAJOR A -macro: FW_MINOR 58 +macro: FW_MINOR 58b
Modified: dev/mmc/sdhci/sdhci.fth ============================================================================== --- dev/mmc/sdhci/sdhci.fth Mon Oct 25 14:34:03 2010 (r1990) +++ dev/mmc/sdhci/sdhci.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -85,7 +85,8 @@ \ sitting around waiting for insertion/removal events. \ The debouncer takes about 300 ms to stabilize.
-: card-inserted? ( -- flag ) +defer card-inserted? +: sdhci-card-inserted? ( -- flag ) get-msecs d# 500 + begin ( time-limit ) \ When the stable bit is set, we can believe the answer present-state@ h# 20000 and if ( time-limit ) @@ -99,11 +100,14 @@ ." SD Card detect unstable!" cr ( ) false ( flag ) ; +' sdhci-card-inserted? to card-inserted? : write-protected? ( -- flag ) present-state@ h# 80000 and 0= ;
-: card-power-on ( -- ) +defer card-power-on +defer card-power-off +: sdhci-card-power-on ( -- ) \ Card power on does not work if a removal interrupt is pending h# c0 isr! \ Clear any pending insert/remove events
@@ -117,7 +121,10 @@ dup h# 29 cb! ( voltage ) \ First set the voltage 1 or h# 29 cb! ( ) \ Then turn it on ; -: card-power-off ( -- ) 0 h# 29 cb! ; +: sdhci-card-power-off ( -- ) 0 h# 29 cb! ; + +' sdhci-card-power-on to card-power-on +' sdhci-card-power-off to card-power-off
: internal-clock-on ( -- ) h# 2c cw@ 1 or h# 2c cw!
Modified: dev/olpc/kb3700/spicmd.fth ============================================================================== --- dev/olpc/kb3700/spicmd.fth Mon Oct 25 14:34:03 2010 (r1990) +++ dev/olpc/kb3700/spicmd.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -94,7 +94,7 @@ select-ssp3-pins ssp3-clk-on h# 07 ssp-sscr0 rl! \ 8-bit data, SPI normal mode - h# 1380.0000 ssp-sscr1 rl! \ SCFR=1, slave mode, Rx w/o Tx + h# 1380.0010 ssp-sscr1 rl! \ SCFR=1, slave mode, Rx w/o Tx, early phase \ The enable bit must be set last, after all configuration is done h# 87 ssp-sscr0 rl! \ Enable, 8-bit data, SPI normal mode wait-clk-sync @@ -115,8 +115,8 @@ ;
\ Set the direction on the ACK and CMD GPIOs -d# 78 constant cmd-gpio# -d# 79 constant ack-gpio# +d# 151 constant cmd-gpio# +d# 125 constant ack-gpio# : init-ec-spi-gpios ( -- ) cmd-gpio# gpio-dir-out ack-gpio# gpio-dir-out @@ -125,7 +125,9 @@ : set-cmd ( -- ) cmd-gpio# gpio-set ; : clr-ack ( -- ) ack-gpio# gpio-clr ; : set-ack ( -- ) ack-gpio# gpio-set ; -: pulse-ack ( -- ) clr-ack set-ack ; +: fast-ack ( -- ) set-ack clr-ack ; +: slow-ack ( -- ) d# 10 ms set-ack d# 10 ms clr-ack ; +defer pulse-ack ' slow-ack to pulse-ack \ FIXME !!!
0 value ec-spi-cmd-done \ 0 - still waiting, 1 - successful send, 2 - timeout
@@ -189,7 +191,7 @@ init-ssp-in-slave-mode set-ssp-receive-w/o-transmit clr-cmd - set-ack + clr-ack \ Tell EC that it is okay to send ['] ec-spi-upstream to ec-spi-state ;
@@ -208,6 +210,7 @@ ['] ec-spi-upstream to ec-spi-state exit then + ec-spi-handle-message ;
: ec-command ( [ args ] #args #results cmd-code -- [ results ] error? )
Modified: dev/olpc/spiflash/spiflash.fth ============================================================================== --- dev/olpc/spiflash/spiflash.fth Mon Oct 25 14:34:03 2010 (r1990) +++ dev/olpc/spiflash/spiflash.fth Mon Oct 25 14:42:14 2010 (r1991) @@ -262,15 +262,16 @@ \ those commands. The AB command seems to be supported by all \ of them, so it's a good starting point.
+0 value spi-id# : spi-identify ( -- ) - ab-id ( id ) - + ab-id to spi-id# \ ST, Spansion, and WinBond all identify as 13 \ For now, we only need to distinguish between if it's \ a common page-write part or the SST part with its \ unique auto-increment address writing scheme. - case + spi-id# case h# 13 of ['] common-write endof + h# 34 of ['] common-write endof h# bf of ['] sst-write endof h# 14 of ." The SPI FLASH ID reads as 14. This is due to an infrequent hardware problem." cr @@ -290,7 +291,10 @@ ['] write-spi-flash behavior ['] sst-write = if ." SST" else - ." type 13 - Spansion, Winbond, or ST" + spi-id# case + h# 13 of ." type 13 - Spansion, Winbond, or ST" endof + h# 34 of ." type 34 - Macronyx" endof + endcase then ;