[U-Boot] OMAP3 broken NAND hardware ECC generation
Dirk Behme
dirk.behme at googlemail.com
Sun Nov 9 19:51:54 CET 2008
Dear Scott and Nishanth,
we have broken OMAP3 NAND hardware ECC generation while our clean up
of OMAP3 NAND code.
I did some debugging. Do you like to have a look to
http://git.denx.de/?p=u-boot/u-boot-arm.git;a=blob;f=drivers/mtd/nand/omap_gpmc.c;h=01b79593949fe828e4b1d3da2cf4b399c1b580ab;hb=refs/heads/omap3
?
Using some well defined data in SDRAM, I used older U-Boot with
working nand ecc hw/sw implementation and our recent version to write
this data to NAND. I then compared ecc written and found that our
latest version writes the correct location, but all zero:
Working version from older U-Boot:
OOB:
ff ff ec 13 0f 00 00 00
00 00 00 00 00 00 ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
Recent version:
OOB:
ff ff 00 00 00 00 00 00
00 00 00 00 00 00 ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff
In both versions the data the ecc is calculated for is the same. In
recent version only zero is written.
Some additional debugging by adding some printf() in hw ecc functions:
OMAP3 beagleboard.org # nandecc hw
omap_hwecc_init
HW ECC selected
OMAP3 beagleboard.org # nand write 80000000 680000 1000
NAND write: device 0 offset 0x680000, size 0x1000
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
omap_calculate_ecc 0x00 0x00 0x00
4096 bytes written: OK
OMAP3 beagleboard.org #
This is the result of
printf("omap_calculate_ecc 0x%02x 0x%02x 0x%02x\n", ecc_code[2],
ecc_code[1], ecc_code[0]);
I'm not sure, but it seems to me, that omap_enable_hwecc() is never
called. An printf() in this function is not shown.
Maybe call of nand_scan_tail(mtd); in omap_nand_switch_ecc() resets
anything? Or any other idea?
Thanks for your help
Dirk
More information about the U-Boot
mailing list