[openfirmware] [commit] r3419 - dev/olpc/spiflash
repository service
svn at openfirmware.info
Thu Nov 8 08:42:52 CET 2012
Author: wmb
Date: Thu Nov 8 08:42:50 2012
New Revision: 3419
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3419
Log:
OLPC SPI FLASH driver - converted nested case statements to tables.
Modified:
dev/olpc/spiflash/spiflash.fth
Modified: dev/olpc/spiflash/spiflash.fth
==============================================================================
--- dev/olpc/spiflash/spiflash.fth Wed Nov 7 22:38:16 2012 (r3418)
+++ dev/olpc/spiflash/spiflash.fth Thu Nov 8 08:42:50 2012 (r3419)
@@ -303,46 +303,87 @@
0 value spi-id#
0 value jedec-id#
0 0 2value spi-id$
+
+: (.spi-id) ( -- )
+ push-hex
+ spi-id# 2 .r [char] . emit jedec-id# 6 .r
+ pop-base
+;
+
+create jedec-spi-table
+ \ JEDEC-ID /flash Name
+
+ \ XO-4
+ h# 1540c8 , h# 20.0000 , ," GD25Q16B" \ GigaDevice 3V3
+ h# 1560c8 , h# 20.0000 , ," GD25LQ16" \ GigaDevice 1V8
+ h# 1540ef , h# 20.0000 , ," W25Q16" \ Winbond 3V3
+ h# 1520c2 , h# 20.0000 , ," MX25L1606E" \ Macronix 3V3 also MX25L1605D which is EOL (CS# rise time problem)
+ h# 1524c2 , h# 20.0000 , ," MX25L1633E" \ Macronix 3V3 (this is the preferred Macronyx part)
+ h# 1525c2 , h# 20.0000 , ," MX25L1635E" \ Macronix 1V8 (CS# rise time problem)
+ h# 3525c2 , h# 20.0000 , ," MX25U1635E" \ Macronix 1V8
+
+ \ XO-1.75 and XO-3 and XO-4 A2
+ h# 3425c2 , h# 10.0000 , ," MX25U8035" \ Macronix 3V3
+
+ \ XO-1 and XO-1.5
+ h# 1430ef , h# 10.0000 , ," WX25X80" \ Winbond (AB-ID is 13)
+ h# 130201 , h# 10.0000 , ," S25FL008A" \ Spansion (AB-ID is 13)
+ h# 8e25bf , h# 10.0000 , ," SST25VF080B" \ SST (AB-ID is bf)
+ \ ST M25P80 does not support the JEDEC ID command (AB-ID is 13)
+
+ 0 , \ End of list
+
+\ I don't think this table will ever be used, because the only part
+\ that was actually shipped on XO-1 and XO-1.5 was Winbond WX25X80
+create ab-spi-table
+ \ AB-ID /flash Name
+ h# 13 , h# 10.0000 , ," Spansion, Winbond, or ST"
+ h# bf , h# 10.0000 , ," SST"
+
+\ An infrequent HW error on XO-1 B1 used to falsely report 14 instead of 13
+\ h# 14 , h# 10.0000 , ," Unknown"
+
+ 0 , \ End of list
+
+create unknown-spi-flash
+ \ /flash Name
+ 10.0000 , ," Unknown"
+
+: search-spi-table ( value table-adr -- true | entry-adr false )
+ begin dup @ while ( value adr )
+ 2dup @ = if ( value adr )
+ nip na1+ ( entry-adr )
+ false exit ( entry-adr false )
+ then ( value adr )
+ 2 na+ +str ( value adr' )
+ repeat ( value adr )
+ 2drop true ( true )
+;
+
: spi-identify ( -- )
ab-id to spi-id#
jedec-id to jedec-id#
- " Unknown" to spi-id$
- spi-id# case
- h# 13 of
- ['] common-write 1mb-flash
- " Spansion, Winbond, or ST" to spi-id$
- endof
- h# 14 of
- ['] common-write 1mb-flash
- jedec-id# h# 1520c2 = if 2mb-flash " MX25L1605D" to spi-id$ then
- jedec-id# h# 1540c8 = if 2mb-flash " GD25Q16B" to spi-id$ then
- jedec-id# h# 1540ef = if 2mb-flash " W25Q16" to spi-id$ then
- endof
- h# 24 of
- ['] common-write 2mb-flash
- jedec-id# h# 1524c2 = if 2mb-flash " MX25L1633E" to spi-id$ then
- endof
- h# 25 of
- ['] common-write 1mb-flash
- jedec-id# h# 1525c2 = if 2mb-flash " MX25L1635E" to spi-id$ then
- endof
- h# 34 of
- ['] common-write 1mb-flash
- " Macronyx" to spi-id$
- jedec-id# h# 3425c2 = if 1mb-flash " MX25E8035" to spi-id$ then
- endof
- h# 35 of
- ['] common-write 2mb-flash
- jedec-id# h# 3525c2 = if 2mb-flash " MX25U1635E" to spi-id$ then
- endof
- \ the SST part with its unique auto-increment address writing scheme
- h# bf of
- ['] sst-write 1mb-flash
- " SST" to spi-id$
- endof
- ( default ) ." Bad SPI FLASH ID " dup . cr ['] null-write swap
- endcase ( writer )
- to write-spi-flash
+
+ ['] common-write to write-spi-flash \ The usual case
+
+ \ Special case for an uncommon part
+ spi-id# h# bf = if ['] sst-write to write-spi-flash then
+
+ jedec-id# jedec-spi-table search-spi-table if ( )
+ \ If we don't find it in the JEDEC ID table, fall back to the AB ID table
+
+ ab-id ab-spi-table search-spi-table if ( )
+ \ If we still don't find it, complain and disable writes
+
+ ." Unsupported SPI FLASH ID " (.spi-id) cr
+ ['] null-write to write-spi-flash
+
+ unknown-spi-flash ( entry-adr )
+ then ( entry-adr )
+ then ( entry-adr )
+ dup @ to /flash ( entry-adr' )
+ na1+ count to spi-id$ ( )
+
spi-unprotect
;
@@ -350,7 +391,7 @@
: .spi-id ( -- )
." SPI FLASH is type "
- spi-id# 2 .r [char] . emit jedec-id# 6 .r
+ (.spi-id)
." , " spi-id$ type
." , " /flash h# 100000 / .d ." MB."
;
More information about the openfirmware
mailing list