U-Boot: using nand write to flash an ubi image, ubi part fails
Lars Michael
lh_post at yahoo.com
Wed Jun 1 03:57:07 EDT 2011
Hello,
Using mkfs.ubifs and ubinize I have created an image with 5 volumes. In Linux I could flash it using "ubiformat /dev/mtd1 -f /root/ubi.img" and attach it using "ubiattach /dev/ubi_ctrl -m 1". It worked.
In production I would prefer to write the image from U-Boot. So in U-Boot I used "nand erase" then "nand write" to flash the image. Then I want to attach by "ubi part" command - but this fails: "UBI error: ubi_init: UBI error: cannot initialize UBI, error -17"
Then I booted Linux (via nfs) and tried to re-format+attach, but now it fails. Format complains about eraseblock contents and missing erase counters:
ubiformat: warning!: 1099 of 2036 eraseblocks contain non-ubifs data
ubiformat: warning!: only 937 of 2036 eraseblocks have valid erase counter
The ubiattach now reports lots of:
...
UBI error: check_corruption: PEB 0 contains corrupted VID header, and the data does not contain all 0xFF, this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection
UBI warning: process_eb: valid VID header but corrupted EC header at PEB 4
...
I realize that the U-Boot 'nand erase' does not preserve the erase counters. So what would be the correct way to erase and write in U-Boot? And why is the ubiformat not able to correct the problems?
My kernel is 2.6.29 patched with 165 patched from the ubi back port tree.
U-Boot is 2009.08 with ubifs support, but I am not sure if there are relevant patches. The CPU is a v4 ColdFire and 256MB Micron NAND.
Any help is appreciated, thanks. Below are the detailed listing:
-> mtd
device nand0 <NAND>, # parts = 2
#: name size offset mask_flags
0: u-boot 0x00100000 0x00000000 0
1: ubi 0x0ff00000 0x00100000 0
active partition: nand0,0 - (u-boot) 0x00100000 @ 0x00000000
defaults:
mtdids : nand0=NAND
mtdparts: mtdparts=NAND:1m(u-boot),-(ubi)
-> nand erase ubi
NAND erase: device 0 offset 0x100000, size 0xff00000
Erasing at 0x100000 -- 0% complete.
<cut>
Erasing at 0xfd60000 -- 99% complete.
Skipping bad block at 0x0ff80000
Skipping bad block at 0x0ffa0000
Skipping bad block at 0x0ffc0000
Skipping bad block at 0x0ffe0000
OK
Using FEC0 device
TFTP from server 10.28.151.113; our IP address is 10.28.151.112
Filename '/twr5441x/ubi.img'.
Load address: 0x40010000
Loading: *#################################################################
#################################################################
<cut>
#################################################################
########################################################
done
Bytes transferred = 58064896 (3760000 hex)
-> md 40010000 100
40010000: 55424923 01000000 00000000 00000000 UBI#............
40010010: 00000800 00001000 27162ae3 00000000 ........'.*.....
40010020: 00000000 00000000 00000000 00000000 ................
40010030: 00000000 00000000 00000000 7d780a89 ............}x..
40010040: ffffffff ffffffff ffffffff ffffffff ................
<cut>
400113f0: 00000000 00000000 00000000 00000000 ................
-> nand write ${loadaddr} 100000 ${filesize}
NAND write: device 0 offset 0x100000, size 0x3760000
58064896 bytes written: OK
-> ubi part ubi
Creating 1 MTD partitions on "nand0":
0x000000100000-0x000010000000 : "mtd=1"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 126976 bytes
UBI: smallest flash I/O unit: 2048
UBI: VID header offset: 2048 (aligned 2048)
UBI: data offset: 4096
UBI warning: process_lvol: volume table copy #1 is corrupted
UBI: create volume table (copy #1)
UBI: volume table was restored
UBI: volume 5 ("datafs") re-sized from 133 to 1316 LEBs
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=1"
UBI: MTD device size: 255 MiB
UBI: number of good PEBs: 2036
UBI: number of bad PEBs: 4
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 5
UBI: available PEBs: 0
UBI: total number of reserved PEBs: 2036
UBI: number of PEBs reserved for bad PEB handling: 20
UBI: max/mean erase counter: 5/0
UBI error: ubi_init: cannot attach mtd1
UBI: mtd1 is detached from ubi0
UBI error: ubi_init: UBI error: cannot initialize UBI, error -17
UBI init error -17
exit not allowed from main input shell.
------------------
[root at M54418TWR root]# ubiformat /dev/mtd1 -f /root/ubi.img
ubiformat: mtd1 (NAND), size 267386880 bytes (255.0 MiB), 131072 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 0 -- 0 % complete
...
libscan: scanning eraseblock 2039 -- 100 % complete
ubiformat: 303 eraseblocks have valid erase counter, mean value is 0
ubiformat: 643 eraseblocks are supposedly empty
ubiformat: bad eraseblocks: 2036, 2037, 2038, 2039
ubiformat: warning!: 1090 of 2036 eraseblocks contain non-ubifs data
ubiformat: continue? (yes/no) yes
ubiformat: warning!: only 303 of 2036 eraseblocks have valid erase counter
ubiformat: erase counter 0 will be used for all eraseblocks
ubiformat: note, arbitrary erase counter value may be specified using -e option
ubiformat: continue? (yes/no) yes
ubiformat: use erase counter 0 for all eraseblocks
ubiformat: flashing eraseblock 0 -- 0 % complete
...
ubiformat: flashing eraseblock 442 -- 100 % complete
ubiformat: formatting eraseblock 443 -- 0 % complete
...
ubiformat: formatting eraseblock 2039 -- 100 % complete
[root at M54418TWR root]# ubiattach /dev/ubi_ctrl -m 1
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 126976 bytes
UBI: smallest flash I/O unit: 2048
UBI: VID header offset: 2048 (aligned 2048)
UBI: data offset: 4096
UBI error: check_corruption: PEB 0 contains corrupted VID header, and the data does not contain all 0xFF, this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection
UBI warning: process_eb: valid VID header but corrupted EC header at PEB 4
UBI warning: process_eb: valid VID header but corrupted EC header at PEB 7
UBI warning: process_eb: valid VID header but corrupted EC header at PEB 8
UBI warning: process_eb: valid VID header but corrupted EC header at PEB 12
UBI error: check_corruption: PEB 16 contains corrupted VID header, and the data does not contain all 0xFF, this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection
UBI warning: process_eb: valid VID header but corrupted EC header at PEB 22
...
Thanks,
- Lars
More information about the linux-mtd
mailing list