add ecc value to nand flash image
I use qemu-omap3 to boot linux kernel from nand. The linux image is downloaded from http://beagleboard.googlecode.com/files/uImage_OTG.
OMAP3 beagleboard.org #OMAP3 beagleboard.org # nand read 0x80000000 0x280000 0x400000NAND read: device 0 offset 0x280000, size 0x4000004194304 bytes read: ERROROMAP3 beagleboard.org # bootm 0x80000000## Booting kernel from Legacy Image at 80000000 ...Image Name: Linux-2.6.22.18-omap3Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 1856616 Bytes = 1.8 MBLoad Address: 80008000Entry Point: 80008000Verifying Checksum ... Bad Data CRCERROR: can't get kernel image!OMAP3 beagleboard.org #
It means crc error in linux image. I use qemu console command 'memsave' to dump the data from address 0x80000000 to a file and compare it to uImage_OTG. The result is that linux image in ram(from 0x80000000) is different from uImage_OTG. In every block(256 bytes), there is one bit different from uImage_OTG. The linux image is changed when using 'nand read' command to read it from nand flash image to sram.
What has happened when reading linux image from nand flash image into sram??
After debuging about half a day, I find that the data are changed by the correct_data function. I *DID NOT* save ecc value in nand flash image so u-boot thinks the ecc value in oob is wrong and correct it. Ecc can only correct one bit in an block, that is why a bit has been changed in 256 bytes.
ecc_status = this->correct_data(mtd, &data_poi[datidx], &ecc_code[j], &ecc_calc[j]);
I write a file(bb_nandflash_ecc.c) to generate ecc value for nand flash image. Now I can boot linux image using u-boot command.
OMAP3 beagleboard.org # nand read 0x80000000 0x280000 0x400000NAND read: device 0 offset 0x280000, size 0x4000004194304 bytes read: OKOMAP3 beagleboard.org # bootm 0x80000000## Booting kernel from Legacy Image at 80000000 ...Image Name: Linux-2.6.22.18-omap3Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 1856616 Bytes = 1.8 MBLoad Address: 80008000Entry Point: 80008000Verifying Checksum ... OKLoading Kernel Image ... OKOKStarting kernel ...smc 80e80414 insn 1600070Uncompressing Linux.......................................................................................................................... done, booting the kernel.<5>Linux version 2.6.22.18-omap3 (root@fedoraserver) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Thu Jul 24 15:29:36 IST 2008CPU: ARMv7 Processor [411fc082] revision 2 (ARMv7), cr=00003837Machine: OMAP3 Beagle boardMemory policy: ECC disabled, Data cache writeback<7>On node 0 totalpages: 32768<7> DMA zone: 256 pages used for memmap<7> DMA zone: 0 pages reserved<7> DMA zone: 32512 pages, LIFO batch:7<7> Normal zone: 0 pages used for memmapUnassigned mem readl 4830a204
Because of omap3 emulation is not complete, linux kernel will stop after linux kernel booting. I will work on it.