[U-Boot] CFI flash broken for 8-bit bus
Aaron Williams
Aaron.Williams at caviumnetworks.com
Fri Mar 18 05:02:33 CET 2011
Hi,
I am running into issues in that the CFI code is broken for flash with an 8-
bit bus. The problem is that the CFI code uses the wrong addresses for 8-bits
vs 16-bits.
The CFI function flash_map incorrectly calculates the byte offset with
Spansion flash.
In our case, we have an 8-bit Spansion S29GL-N MirrorBit flash chip on an 8-
bit bus.
According to the data sheet, in 8-bit mode the first unlock address is 0xAAA
and the second is 0x555. Basically all of the addresses are approximately
double what they are in 16-bit mode.
Most of the addresses in the CFI code are wrong for 8-bit mode.
They should be as follows:
unlock1: 0xAAA
unlock2: 0x555
CFI Query: 0xAA
Offset Device ID: 0x02, 0x1c, 0x1e
Offset Silicon Sector Factory Protect: 0x6
Sector protect verify (sector address) + 4
The problem is that the dectection code detects (incorrectly) that we're an 8-
bit device on a 16-bit bus when in fact it's an 8-bit bus.
For 16-bits, it's:
unlock1: 0x555
unlock2: 0x2aa
CFI Query: 0x55
Offset Device ID: 0x1, 0x0e, 0x0f
Now, in 16-bit mode these addresses should be effectively doubled so they
should look to be the same to software as I understand it.
This is all taken from the datasheet.
Note that the CFI code works fine with the flash hooked up as 16-bit on a 16-
bit bus.
If it's an 8-bit flash on a 16-bit bus then the addresses should be doubled.
flash detect cfi
fwc addr 1ec00000 cmd f0 f0 8bit x 8 bit
fwc addr 1ec00000 cmd ff ff 8bit x 8 bit
fwc addr 1ec00055 cmd 98 98 8bit x 8 bit <== should be 0x1ec000AA
is= cmd 51(Q) addr 1ec00010 is= 0 51
fwc addr 1ec00000 cmd f0 f0 8bit x 8 bit
fwc addr 1ec00000 cmd ff ff 8bit x 8 bit
fwc addr 1ec00555 cmd 98 98 8bit x 8 bit
is= cmd 51(Q) addr 1ec00010 is= 0 51
fwc addr 1ec00000 cmd f0 f0f0 16bit x 8 bit
fwc addr 1ec00000 cmd ff ffff 16bit x 8 bit
fwc addr 1ec000aa cmd 98 9898 16bit x 8 bit
is= cmd 51(Q) addr 1ec00020 is= 5151 5151
is= cmd 52(R) addr 1ec00022 is= 5252 5252
is= cmd 59(Y) addr 1ec00024 is= 5959 5959
device interface is 2
found port 2 chip 1 port 16 bits chip 8 bits
00 : 51 52 59 02 00 40 00 00 00 00 00 27 36 00 00 06 QRY.. at .....'6...
10 : 06 09 13 03 05 03 02 18 02 00 06 00 01 7f 00 00 ................
20 : 02 00 00 00 00 00 00 00 00 00 00 00 00 08 13 e8 ................
fwc addr 1ec00000 cmd f0 f0f0 16bit x 8 bit
fwc addr 1ec01554 cmd aa aaaa 16bit x 8 bit
fwc addr 1ec00aaa cmd 55 5555 16bit x 8 bit
fwc addr 1ec01554 cmd 90 9090 16bit x 8 bit
fwc addr 1ec00000 cmd f0 f0f0 16bit x 8 bit
fwc addr 1ec000aa cmd 98 9898 16bit x 8 bit
manufacturer is 2
manufacturer id is 0x0
device id is 0x3f
device id2 is 0x0
cfi version is 0x3133
size_ratio 1 port 16 bits chip 8 bits
found 1 erase regions
erase region 0: 0x0200007f
erase_region_count = 128 erase_region_size = 131072
fwc addr 1ec00000 cmd f0 f0 8bit x 8 bit
fwc addr 1fbe0000 cmd 70 70 8bit x 8 bit
flash_is_busy: 0
Flash: 16 MiB
-Aaron
More information about the U-Boot
mailing list