Forums » Software Development »
Writing UBIFS rootfs to AM3354 with 512MB NAND
Added by Kim Weller over 11 years ago
What's the procedure for creating and writing the Linux UBIFS rootfs to the AM3354 512MB NAND? What ECC is used for the UBIFS partitions?
-Kim
Replies (18)
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Tim Iskander over 11 years ago
Kim
TI has a few pages on this.. check out http://processors.wiki.ti.com/index.php/UBIFS_Support
As long as you program the ubifs from linux there should not be an issue.
There is currently a disconnect between ECC used by u-boot and that used by linux on the 4kB page size NAND devices (like the 512MB NAND)
cheers
/Tim
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Kim Weller over 11 years ago
Hi Tim,
I've been following this steps and it looks like the ubi.img is writing to NAND, but I get error 28 (No space left on device) when trying to attach. Here are my steps for writing ubi.img:
root@mityarm335x:~# ubiformat /dev/mtd8 -f ubi.img -s 1024 -O 4096 ubiformat: mtd8 (nand), size 528220160 bytes (503.8 MiB), 2015 eraseblocks of 262144 bytes (256.0 KiB), min. I/O size 4096 bytes libscan: scanning eraseblock 2014 -- 100 % complete ubiformat: 2015 eraseblocks are supposedly empty ubiformat: flashing eraseblock 15 -- 100 % complete ubiformat: formatting eraseblock 2014 -- 100 % complete root@mityarm335x:~# ubiattach /dev/ubi_ctrl -m 8 -O 4096 ubiattach: error!: cannot attach mtd8 error 28 (No space left on device) root@mityarm335x:~# flash_erase /dev/mtd8 0 0 Erasing 256 Kibyte @ 1f780000 -- 100 % complete root@mityarm335x:~# mtdinfo /dev/mtd8 mtd8 Name: File System Type: nand Eraseblock size: 262144 bytes, 256.0 KiB Amount of eraseblocks: 2015 (528220160 bytes, 503.8 MiB) Minimum input/output unit size: 4096 bytes Sub-page size: 1024 bytes OOB size: 224 bytes Character device major/minor: 90:16 Bad blocks are allowed: true Device is writable: true root@mityarm335x:~# ubiformat /dev/mtd8 -f ubi.img -s 1024 -O 4096 ubiformat: mtd8 (nand), size 528220160 bytes (503.8 MiB), 2015 eraseblocks of 262144 bytes (256.0 KiB), min. I/O size 4096 bytes libscan: scanning eraseblock 2014 -- 100 % complete ubiformat: 2015 eraseblocks are supposedly empty ubiformat: flashing eraseblock 15 -- 100 % complete ubiformat: formatting eraseblock 2014 -- 100 % complete root@mityarm335x:~# ubiattach /dev/ubi_ctrl -m 8 -O 4096 ubiattach: error!: cannot attach mtd8 error 28 (No space left on device) root@mityarm335x:~#
Any suggestions?
Thanks,
Kim
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Kim Weller over 11 years ago
Here some additional information that maybe helpful. After ubiformat the erase blocks are all marked BAD.
root@mityarm335x:~# cat /proc/mtd dev: size erasesize name mtd0: 00800000 00010000 "NOR User Defined" mtd1: 00040000 00040000 "SPL" mtd2: 00040000 00040000 "SPL.backup1" mtd3: 00040000 00040000 "SPL.backup2" mtd4: 00040000 00040000 "SPL.backup3" mtd5: 00200000 00040000 "U-Boot" mtd6: 00040000 00040000 "U-Boot Env" mtd7: 00500000 00040000 "Kernel" mtd8: 1f7c0000 00040000 "File System" root@mityarm335x:~# mtdinfo -M /dev/mtd7 mtd7 Name: Kernel Type: nand Eraseblock size: 262144 bytes, 256.0 KiB Amount of eraseblocks: 20 (5242880 bytes, 5.0 MiB) Minimum input/output unit size: 4096 bytes Sub-page size: 1024 bytes OOB size: 224 bytes Character device major/minor: 90:14 Bad blocks are allowed: true Device is writable: true Eraseblock map: 0: 00000000 1: 00040000 2: 00080000 3: 000c0000 4: 00100000 5: 00140000 6: 00180000 7: 001c0000 8: 00200000 9: 00240000 10: 00280000 11: 002c0000 12: 00300000 13: 00340000 14: 00380000 15: 003c0000 16: 00400000 17: 00440000 18: 00480000 19: 004c0000 root@mityarm335x:~# ubiformat /dev/mtd7 ubiformat: mtd7 (nand), size 5242880 bytes (5.0 MiB), 20 eraseblocks of 262144 bytes (256.0 KiB), min. I/O size 4096 bytes libscan: scanning eraseblock 19 -- 100 % complete ubiformat: 20 eraseblocks are supposedly empty ubiformat: formatting eraseblock 19 -- 100 % complete root@mityarm335x:~# mtdinfo -M /dev/mtd7 mtd7 Name: Kernel Type: nand Eraseblock size: 262144 bytes, 256.0 KiB Amount of eraseblocks: 20 (5242880 bytes, 5.0 MiB) Minimum input/output unit size: 4096 bytes Sub-page size: 1024 bytes OOB size: 224 bytes Character device major/minor: 90:14 Bad blocks are allowed: true Device is writable: true Eraseblock map: 0: 00000000 BAD 1: 00040000 BAD 2: 00080000 BAD 3: 000c0000 BAD 4: 00100000 BAD 5: 00140000 BAD 6: 00180000 BAD 7: 001c0000 BAD 8: 00200000 BAD 9: 00240000 BAD 10: 00280000 BAD 11: 002c0000 BAD 12: 00300000 BAD 13: 00340000 BAD 14: 00380000 BAD 15: 003c0000 BAD 16: 00400000 BAD 17: 00440000 BAD 18: 00480000 BAD 19: 004c0000 BAD
-Kim
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Tim Iskander over 11 years ago
Kim
I am not super familiar with ubifs, but it seems it can be a bit tricky to master. I know it can be done, as some of our customers are using it. One thing I have seen is to make sure the subpage size is the same as the page size (4k in this case).
There are a few posts on the TI e2e site about using ubifs.
http://e2e.ti.com/support/arm/sitara_arm/f/791/t/248144.aspx and http://e2e.ti.com/support/arm/sitara_arm/f/791/p/197671/706390.aspx#706390 (to start)
If you haven't seen the UBIFS FAQ and HOWTO, its here http://www.linux-mtd.infradead.org/faq/ubifs.html#L_free_space_fixup
cheers
/Tim
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Kim Weller over 11 years ago
Hi Tim,
Could someone at Critical Link send me the commands used for creating the ubifs image and writing it to the 512MB NAND flash on your MityARM development board?
Thanks,
Kim
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Kim,
I tried to do the ubiformat on a 512MB nand som here and I ran into the same problem. It marked the whole nand as bad.
I was able to reset the bad block count by running the following in u-boot. Note: This will delete all data on the nand including the bad block messages. If you have the list of bad blocks before its recommended to mark them bad with nand markbad.
U-Boot# nand scrub.chip
Unfortunately this doesn't help getting ubifs working. I'd like to see if jffs2 will work to determine if the issue is with ubifs or with some configuration in the kernel, etc.
-Jonathan
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Testing on a 256MB nand som, I was able to format mtd8 and mount it. See output:See output:
root@mityarm-335x:~# mtdinfo /dev/mtd8 mtd8 Name: File System Type: nand Eraseblock size: 131072 bytes, 128.0 KiB Amount of eraseblocks: 1988 (260571136 bytes, 248.5 MiB) Minimum input/output unit size: 2048 bytes Sub-page size: 512 bytes OOB size: 64 bytes Character device major/minor: 90:16 Bad blocks are allowed: true Device is writable: true root@mityarm-335x:~#flash_eraseall /dev/mtd8 flash_eraseall has been replaced by `flash_erase <mtddev> 0 0`; please use it Erasing 128 Kibyte @ f860000 -- 100 % complete root@mityarm-335x:~# ubiformat /dev/mtd8 -s 512 -O 2048 ubiformat: mtd8 (nand), size 260571136 bytes (248.5 MiB), 1988 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes libscan: scanning eraseblock 1987 -- 100 % complete ubiformat: 1988 eraseblocks are supposedly empty ubiformat: formatting eraseblock 1987 -- 100 % complete root@mityarm-335x:~# ubiattach /dev/ubi_ctrl -m 8 -O 2048 [ 142.800522] UBI: attaching mtd8 to ubi0 [ 142.804973] UBI: physical eraseblock size: 131072 bytes (128 KiB) [ 142.811824] UBI: logical eraseblock size: 126976 bytes [ 142.817782] UBI: smallest flash I/O unit: 2048 [ 142.823009] UBI: sub-page size: 512 [ 142.828139] UBI: VID header offset: 2048 (aligned 2048) [ 142.834728] UBI: data offset: 4096 [ 145.275129] UBI: max. sequence number: 0 [ 145.299781] UBI: attached mtd8 to ubi0 [ 145.304086] UBI: MTD device name: "File System" [ 145.310129] UBI: MTD device size: 248 MiB [ 145.315629] UBI: number of good PEBs: 1988 [ 145.320847] UBI: number of bad PEBs: 0 [ 145.325805] UBI: number of corrupted PEBs: 0 [ 145.330752] UBI: max. allowed volumes: 128 [ 145.335891] UBI: wear-leveling threshold: 4096 [ 145.341268] UBI: number of internal volumes: 1 [ 145.346235] UBI: number of user volumes: 0 [ 145.351185] UBI: available PEBs: 1965 [ 145.356414] UBI: total number of reserved PEBs: 23 [ 145.361723] UBI: number of PEBs reserved for bad PEB handling: 19 [ 145.368402] UBI: max/mean erase counter: 0/0 [ 145.373175] UBI: image sequence number: 1898092567 [ 145.378609] UBI: background thread "ubi_bgt0d" started, PID 2265 UBI device number 0, total 1988 LEBs (252428288 bytes, 240.7 MiB), available 1965 LEBs (249507840 bytes, 237.9 MiB), LEB size 126976 bytes (124.0 KiB) root@mityarm-335x:~# ubimkvol /dev/ubi0 -N rootfs -s 10MiB Volume ID 0, size 83 LEBs (10539008 bytes, 10.1 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "rootfs", alignment 1 root@mityarm-335x:~# mount -t ubifs ubi0:rootfs /media/card/ [ 409.740743] UBIFS: default file-system created [ 409.860855] UBIFS: mounted UBI device 0, volume 0, name "rootfs" [ 409.867501] UBIFS: file system size: 9396224 bytes (9176 KiB, 8 MiB, 74 LEBs) [ 409.875456] UBIFS: journal size: 1015809 bytes (992 KiB, 0 MiB, 6 LEBs) [ 409.883224] UBIFS: media format: w4/r0 (latest is w4/r0) [ 409.889621] UBIFS: default compressor: lzo [ 409.894216] UBIFS: reserved for root: 443806 bytes (433 KiB) root@mityarm-335x:~# sync root@mityarm-335x:~# mount rootfs on / type rootfs (rw) /dev/root on / type ext3 (rw,relatime,errors=continue,barrier=1,data=ordered) proc on /proc type proc (rw,relatime) tmpfs on /mnt/.splash type tmpfs (rw,relatime,size=40k) sysfs on /sys type sysfs (rw,relatime) none on /dev type tmpfs (rw,relatime,size=1024k,nr_inodes=8192,mode=755) /dev/mmcblk0p2 on /media/mmcblk0p2 type ext3 (rw,relatime,errors=continue,barrier=1,data=ordered) /dev/mmcblk0p3 on /media/mmcblk0p3 type ext3 (rw,relatime,errors=continue,barrier=1,data=ordered) /dev/mmcblk0p1 on /media/mmcblk0p1 type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620) usbfs on /proc/bus/usb type usbfs (rw,relatime) tmpfs on /var/volatile type tmpfs (rw,relatime,size=16384k) tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777) tmpfs on /media/ram type tmpfs (rw,relatime,size=16384k) ubi0:rootfs on /media/card type ubifs (rw,relatime)
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
For our 512mb nand, I believe the format command should be ubiformat /dev/mtd8 -s 1024 -O 4096
but it doesn't work.
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Kim,
Due to the long holiday weekend, i'm not sure this will get looked at until atleast Monday.
Also what is the part number and model number of your module?
Thanks
Jonathan
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Kim Weller over 11 years ago
Tim,
Thanks for testing this. My module PN: 80-000517RC-1B.
I believe the problem is with the lower MTD NAND driver for NAND part MT29F4G08ABAEAWP. Simple NAND writes are giving me problems.
Kim
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Michael Karasoff over 11 years ago
To boot from UBI with the 512MB NAND, I had to modify the 2013.01 branch bootloader:
Viewing: 'include/configs/mityarm335x.h' 53c53 < #define CONFIG_SYS_MALLOC_LEN (512 << 10) /* UBI needs >= 512K) (CONFIG_ENV_SIZE + (32 * 1024))*/ --- > /*Increase to support UBI mount*/ > #define CONFIG_SYS_MALLOC_LEN (4096 << 10) /* UBI needs >= 512K) (CONFIG_ENV_SIZE + (32 * 1024))*/
Viewing: 'drivers/mtd/nand/nand_base.c' 3143c3143,3144 < if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && --- > /*Subpage shift for hardware ECC is always 0*/ > /*if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && 3155c3156,3159 < } --- > }*/ > > mtd->subpage_sft = 0; >
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Michael,
You should be able to replace your second change with:
diff --git a/drivers/mtd/nand/omap_gpmc.c b/drivers/mtd/nand/omap_gpmc.c
index 52b46d8..f76302e 100644
--- a/drivers/mtd/nand/omap_gpmc.c
+++ b/drivers/mtd/nand/omap_gpmc.c
@@ -867,6 +867,8 @@ int board_nand_init(struct nand_chip *nand)
nand->ecc.calculate = omap_calculate_ecc_bch;
nand->ecc.read_page = omap_read_page_bch;
omap_hwecc_init_bch(nand, NAND_ECC_READ);
+ /* ECC engine doesn't support subpage writes */
+ nand->options |= NAND_NO_SUBPAGE_WRITE;
This option was set in linux but didn't make it to u-boot. Could you test it and verify it has the same effect as your change. I'm assuming that mtd->subpage_sft is set to 0 by default.
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Do you have a reference for your first change? Or did you find this through trial and error?
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Michael Karasoff over 11 years ago
U-Boot# ubifsmount kernel UBIFS: static UBI volume - read-only mode UBIFS error (pid 0): ubifs_mount: Error reading superblock on volume 'ubi:configuration' *errno=-12!*
-12 -> ENOMEM?
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Ok cool. We've never tried storing the kernel in a ubifs partition. If you have it working I'd be interested in your procedure.
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Michael,
I've added your changes including my alternative change to a test branch on my machine. If you could test my alternative change I'll happily post it up on our site.
Thanks
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Michael Karasoff over 11 years ago
The procedure is simple - I create a UBI image (mkfs.ubifs & ubinize) with uImage and rootfile system volumes and programmed it into flash. There are lots of places on the web that explain this process, and once you have a UBI image you can program from u-boot or linux. The key gotchas in making images is that IO size and Sub-Page are both 4096. My understanding is that the 4096 subpage (essentially no subpage) is due to limitation on how the GPMC hardware handles ECC on these larger flash pages. Also, I make the image size smaller than the physical size by about 10% - for various reasons UBI needs the extra space, and 10% overhead seems about right. Obviously, you need to make sure the kernel is compiles to support UBI.
For the uboot, assuming that I have the ubi image named "usr0" with volume "kernel" (uImage) and "rootfs" (root file system) loaded into a partition called "linux" in mtdparts:
U-Boot# mtdparts
device nand0 <nand>, # parts = 7
#: name size offset mask_flags
0: mlo 0x00040000 0x00000000 0
1: mlo1 0x00040000 0x00040000 0
2: mlo2 0x00040000 0x00080000 0
3: mlo3 0x00040000 0x000c0000 0
4: uboot 0x001c0000 0x00100000 0
5: env 0x00040000 0x002c0000 0
6: linux 0x00a00000 0x00300000 0
The procedure for UBI boot (both kernel and uImage in UBI) is as follows:
U-Boot# ubi part linux
Creating 1 MTD partitions on "nand0":
0x000000d00000-0x00000a800000 : "mtd=6"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 262144 bytes (256 KiB)
UBI: logical eraseblock size: 253952 bytes
UBI: smallest flash I/O unit: 4096
UBI: VID header offset: 4096 (aligned 4096)
UBI: data offset: 8192
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=6"
UBI: MTD device size: 155 MiB
UBI: number of good PEBs: 620
UBI: number of bad PEBs: 0
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 2
UBI: available PEBs: 0
UBI: total number of reserved PEBs: 620
UBI: number of PEBs reserved for bad PEB handling: 6
UBI: max/mean erase counter: 172/10
U-Boot# ubifsmount kernel
UBIFS: static UBI volume - read-only mode
UBIFS: mounted UBI device 0, volume 0, name "kernel"
UBIFS: mounted read-only
UBIFS: file system size: 3555328 bytes (3472 KiB, 3 MiB, 14 LEBs)
UBIFS: journal size: 2285569 bytes (2232 KiB, 2 MiB, 8 LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor: LZO
UBIFS: reserved for root: 0 bytes (0 KiB)
U-Boot# ubifsload ${kloadaddr} uImage
Loading file 'uImage' to addr 0x80007fc0 with size 2710280 (0x00295b08)...
Done
U-Boot# ubifsumount
U-Boot# setenv bootargs console=ttyO0,115200n8 ubi.mtd=7 root=ubi0:rootfs rootfstype=ubifs noinitrd rootwait=1 ip=none
U-Boot# bootm ${kloadaddr}
Because of the time to mount the ubi volumes, the boot time here is a bit longer than normal ~30sec.
RE: Writing UBIFS rootfs to AM3354 with 512MB NAND - Added by Jonathan Cormier over 11 years ago
Thanks for the procedure. In case you weren't aware I wrote up a guide on doing this without the kernel being stored in the ubifs partition. UBIFS_Nand_Boot
I'll definitely try to take some time to add your method as an alternative. The benefit of using ubifs for both of these as i understand it, is that ubi will do wear leveling so that overtime your flash will last longer (assuming you don't use nand erase on this partition which will destroy the ubifs wear leveling info). The added boot time however may not be worth it. The kernel is rarely flashed/updated so for most cases I think its still better to save it straight to flash.
Your correct about the 4096 subpage size. The ecc hardware the 335x uses can't handle subpage writes, at least not well. The older driver used to be able to support it for jffs2 but I guess didn't work very efficiently.
The 10% margin seems a good size. Also assuming the ubinize.cfg is set to autoresize, the first mount will auto fit to the partition so you can create an image that will work on various partition sizes. It will take into account the needed ubi reserved size.