TACHYON [~
FORGET S25FL127.fth
pub S25FL127.fth ." SPANSION 16Mbyte SPI FLASH 150327-0000 " ;
{ STATS (not including utilities)
NAMES: $54D8...74C2 for 8,170 bytes (+171)
CODE: $0924...480D for 16,105 bytes (+243)
}
{ serial flash utility listing
lsfl
SERIAL FLASH DEVICE MFG:01 DEVICE:17 V1.3
Memory size: 16,777,216 bytes
Buffer size: 256 bytes
Erase block regions 2=Boot device
Erase block info #1 16 sectors x 4,096 bytes
Erase block info #2 255 sectors x 65,536 bytes
Voltage range 2.7V min 3.6V max
Word programming time: 64us typ 256us max
Buffer programming time: 1024us typ 4096us max
Sector erase time: 256us typ 2048us max
Chip erase time: 32768us typ 262144us max
}
--- Initialize the serial flash I/O
pub !SFIO
&23.24.26.25 SPIPINS ( ce.miso.mosi.clk --- )
#P26 HIGH --- shouldn't need to set this - check SPIPINS code
;
--- end the serial flash transfer by setting chip select high
pub SFEND &SFCS OUTSET ;
--- send a command to the serial flash
pub SFCMD ( cmd -- ) SFEND SPIWRB DROP ;
--- send a 24-bit address to the chip
pub SFADR ( addr -- ) 8 SHL 3 FOR SPIWR NEXT DROP ;
( serial flash commands )
--- write enable
pub WREN 6 SFCMD ;
pub WRDI 4 SFCMD ;
--- read configuration register
pub RDCR $35 SFCMD 0 SPIRD SFEND ;
--- read a status register (0 or 1)
pub RDSR ( n -- ) 2* 5 + SFCMD 0 SPIRD SFEND ;
pub BANK! ( addr -- ) $17 SFCMD SPIWRB DROP SFEND ;
pub BANK@ ( addr -- bank ) $16 SFCMD 0 SPIRD SFEND ;
pub SFREAD ( dst len cmd -- ) SFCMD ADO 0 SPIRD I C! LOOP SFEND ;
pub READ ( src dst cnt -- ) 3 SFCMD ROT SFADR ADO 0 SPIRD I C! LOOP SFEND ;
--- PAGE PROGRAM - program up to a page from src to dst for cnt
pub PP ( src dst cnt -- ) 2 SFCMD SWAP SFADR ADO I C@ SPIWRB DROP LOOP SFEND ;
--- single byte program
pub SFC! ( byte addr -- ) 2 SFCMD SFADR SPIWRB DROP SFEND ;
--- single word program
pub SFW! ( word addr -- ) 2 SFCMD SFADR DUP SPIWRB DROP 8 SHR SPIWRB DROP SFEND ;
--- single long program -- long is broken up into bytes to get the correct order
pub SF! ( long addr -- ) 2 SFCMD SFADR DUP SPIWRB DROP 8 SHR DUP SPIWRB DROP 8 SHR DUP SPIWRB DROP 8 SHR SPIWRB DROP SFEND ;
--- SECTOR ERASE
pub SE ( addr -- ) $D8 SFCMD SFADR SFEND ;
{HELP WRR ( data -- )
Write registers
The Write Registers (WRR) command allows new values to be written to Status Register 1, Configuration
Register, and Status Register 2
}
pub WRR ( data cnt -- ) 1 SFCMD FOR DUP SPIWRB 8 SHR NEXT DROP SFEND ;
--- serial flash soft reset
pub SFRST $F0 SFCMD SFEND ;
( Serial flash reporting utilies )
--- add some tabbing extensions for formatting
BYTE xtab
: XTAB ( n -- ) xtab C@ - SPACES ; BEGIN xtab C@ OVER < WHILE SPACE REPEAT DROP ;
: (XTAB) DUP (EMIT) DUP $0D = IF 0 xtab C! THEN $1F > IF xtab C++ THEN ;
: !XTAB ' (XTAB) uemit W! ;
pub @RDID BUFFERS + ;
pub RDID@ @RDID C@ ;
pub RDID2@ @RDID C@++ SWAP C@ 8 SHL + ;
pub .VR DUP 4 SHR $30 + EMIT "." EMIT >N $30 + EMIT "V" EMIT SPACE ;
pub .RD ( offset -- )
#30 XTAB
DUP RDID@ |< DUP $0A .NUM PRINT" us typ"
#50 XTAB
SWAP 4 + RDID@ |< * $0A .NUM PRINT" us max"
;
pub .BLKINFO ( blk -- )
DUP 4 * $2D +
CR PRINT" Erase block info #" SWAP 1+ PRINT
30 XTAB DUP RDID2@ 1+ 0 PRINTDEC PRINT" sectors x "
2+ RDID2@ $2A RDID@ |< * 0 PRINTDEC PRINT" bytes"
;
pub lsfl
!XTAB !SFIO
CR PRINT" SERIAL FLASH DEVICE"
$90 SFCMD 0 SFADR 0 SPIRD
30 XTAB PRINT" MFG:" .BYTE
50 XTAB PRINT" DEVICE:" 0 SPIRD .BYTE SFEND
BUFFERS 384 $9F SFREAD
$43 RDID@ PRINT" V" EMIT "." EMIT $44 RDID@ EMIT
CR PRINT" Memory size:" 30 XTAB $27 RDID@ |< 0 PRINTDEC PRINT" bytes"
CR PRINT" Buffer size:" 30 XTAB $2A RDID@ |< 0 PRINTDEC PRINT" bytes"
CR PRINT" Erase block regions" 30 XTAB $2C RDID@ DUP . 1 =
IF PRINT" =Uniform" ELSE PRINT" =Boot" THEN PRINT" device"
0 .BLKINFO 1 .BLKINFO
CR PRINT" Voltage range " 30 XTAB $1B RDID@ .VR PRINT" min" 50 XTAB $1C RDID@ .VR PRINT" max"
CR PRINT" Word programming time: " $1F .RD
CR PRINT" Buffer programming time: " $20 .RD
CR PRINT" Sector erase time: " $21 .RD
CR PRINT" Chip erase time: " $22 .RD
CR PRINT" Device ID and CFI dump "
0 384 BUFFERS BDUMP
CR PRINT" SERIAL FLASH DISCOVERABLE PARAMETERS"
BUFFERS BL $5A SFREAD
0 BL BUFFERS BDUMP
;
--- temporary testers
: L BUFFERS $100 DUMP ;
: SFL ( cmd -- ) SFCMD 81 FOR 0 SPIRD SPACE .BYTE NEXT SFEND ;
]~
END
lsfl