[U-Boot] UBI / UBIFS booting from NAND support

jsanabria jsanabria at iseebcn.com
Mon Nov 27 14:53:27 UTC 2017



El 27/11/17 a las 12:31, Ladislav Michl escribió:
> Dear Jose Miguel,
>
> On Mon, Nov 27, 2017 at 11:45:11AM +0100, Jose Miguel Sanchez Sanabria wrote:
>> Hi everyone.
>>
>> I was testing the booting process from NAND using an UBI/UBIFS image in an
>> igepv2 board.
> I'm happy to see someone from ISEE being interested in mainline support
> for their own product.
>
>> However MLO tries to boot first kernel (falcon mode activated) and then
>> falls back to u-boot (as expected anyway I just wanted to load u-boot from
>> ubi) trying to load volume 0, but fails.
> Due to size restrictions, MLO does contain only limited UBI functionality,
> just enough to load image from static UBI volume.
>
>> U-Boot SPL 2017.11-dirty (Nov 24 2017 - 14:29:26)
>> Trying to boot from NAND
>> UBI warning: LEB 0 of 1 is missing
>> UBI warning: Failed to load volume 3
>> UBI warning: LEB 0 of 1 is missing
>> UBI warning: Failed to load volume 3
>> UBI warning: Failed
>> Loading Linux failed, falling back to U-Boot.
>> UBI warning: LEB 0 of 1 is missing
>> UBI warning: Failed to load volume 0
>> UBI warning: LEB 0 of 1 is missing
>> UBI warning: Failed to load volume 0
>> UBI warning: Failed
>> SPL: failed to boot from all boot devices
>> ### ERROR ### Please RESET the board ###
> As noted above, ubispl loader is rather limited and identifies volumes
> by volume id. u-boot.img is expected to be found in vol_id=0, while linux
> zImage in vol_id=3. Log above indicates there are no such volumes.
> What does u-boot's command 'ubi info l' show?
>
Heres the log of ubi info :

Volume information dump:
         vol_id          0
         reserved_pebs   82
         alignment       1
         data_pad        0
         vol_type        4
         name_len        9
         usable_leb_size 129024
         used_ebs        5
         used_bytes      539424
         last_eb_bytes   23328
         corrupted       0
         upd_marker      0
         name            ubirootfs
Volume information dump:
         vol_id          2147479551
         reserved_pebs   2
         alignment       1
         data_pad        0
         vol_type        3
         name_len        13
         usable_leb_size 129024
         used_ebs        2
         used_bytes      258048
         last_eb_bytes   2
         corrupted       0
         upd_marker      0
         name            layout volume


I created with:

ubi create ubirootfs 0xA00000 static 0

I just wanted a volume of 10 MiB (as I only pretend to load u-boot from it for now) so that went pretty good.

>> I can however mount the ubi image but suspicious log appear:
>>
>> u-boot:> ubifsmount ubi0:ubirootfs
> Now you are in u-boot, where different UBI implementation is used, so
> you can identify volumes also by name.

I was mounting only to see the correct files were there (u-boot.img and 
uEnv.txt)

>> UBIFS assert failed in ubifs_change_lp at 540
>> UBIFS assert failed in ubifs_release_lprops at 278
>> UBIFS assert failed in ubifs_change_lp at 540
>> UBIFS assert failed in ubifs_release_lprops at 278
>>
>> This has to do with the discussion about ubifs null deference so I suppose
>> it should not affect much to write operation.
> Well, I do not use UBIFS in U-Boot at all. Just UBI to read and write volumes.
>
Ahh I see I was trying to "ubi write" onto volume the ubifs image which 
contained the (u-boot.img and uEnv.txt), but if I do like on your script 
(writing directly the u-boot.img and uEnv.txt) onto the volume it works 
perfectly.
>> I would finally like to know if the ubi/ubifs support is functional; which
>> would mean I did not use the ubi tools correctly to create the ubi image.
> You will find script I'm using to bring board up at the end of this mail.
> But note, that 'fdt memory' is hacked a bit and proper implementaion is welcome:
> https://lists.denx.de/pipermail/u-boot/2017-January/279823.html
>
> Also note 'setenv fdtfile "${soc_family}-${board_name}.dtb"' line. That's also
> not in mainline as it needs also board revision too and the way it is currently
> done, we cannot distinguish rev B. and rev F. Unfortunately this article
> http://labs.isee.biz/index.php/IGEP_Technology_devices_revisions#IGEP0020_revisions
> does not explain, how all those numbers map to board revisions ISEE is using
> in vendor code.
thanks for reporting I'll keep and eye on this later.
> That said, I enabled UBIFS for IGEPv2 only localy to verify my ubifs_finddir
> reimplementation, but as I was even unable to mount ubifs, original reporter
> did not confirm that at least mount works for him and I run out of the time,
> ubifs issue is still unresolved.
>
> Best regards,
> 	ladis
I could mount ubifs using ubifsmount command but there were a bit of 
warnings and then after trying to boot the spl did not find volume at all.

Thank you for your time.
>
> echo "*** starting u-boot instalation script ***"
> nandecc hw hamming
> setenv has_onenand $?
> # MLO ...
> fatload mmc 0:1 $loadaddr MLO
> if test $has_onenand -eq 0
> then
> 	nand erase.part SPL
> 	nand write $fileaddr 0 $filesize
> 	nand write $fileaddr 20000 $filesize
> 	nand write $fileaddr 40000 $filesize
> 	nand write $fileaddr 60000 $filesize
> 	nandecc sw bch8
> 	nand read $loadaddr UBI 20000
> 	if test $? != 0
> 	then
> 		ubi detach
> 		nand erase.part UBI
> 	fi
> else
> 	ubi part UBI
> 	ubi check loader
> 	if test $? != 0
> 	then
> 		ubi detach
> 		onenand erase
> 	else
> 		onenand erase 0 80000
> 	fi
> 	onenand write $fileaddr 0 20000
> 	onenand write $fileaddr 20000 20000
> 	onenand write $fileaddr 40000 20000
> 	onenand write $fileaddr 60000 20000
> fi
>
> # UBI volumes
> ubi part UBI
>
> echo "Creating UBI volumes..."
> ubi check loader
> if test $? != 0
> then
> 	ubi createvol loader 100000 static 0
> fi
> ubi check config
> if test $? != 0
> then
> 	ubi createvol config 8000 static 1
> fi
> ubi check config_r
> if test $? != 0
> then
> 	ubi createvol   8000 static 2
> fi
> ubi check kernel
> if test $? != 0
> then
> 	ubi createvol kernel 400000 static 3
> fi
> ubi check dtb
> if test $? != 0
> then
> 	ubi createvol dtb 40000 static 4
> fi
> ubi check rootfs
> if test $? != 0
> then
> 	ubi createvol rootfs
> fi
>
> setenv fdtfile "${soc_family}-${board_name}.dtb"
>
> # U-Boot ...
> fatload mmc 0:1 $loadaddr u-boot.img
> ubi write $fileaddr loader $filesize
> # ... and root filesystem first
> fatload mmc 0:1 $loadaddr root.ubifs
> ubi write $fileaddr rootfs $filesize
> # now load FDT blob ...
> fatload mmc 0:1 $fdtaddr $fdtfile
> # and fix it...
> setenv bootargs "console=ttyO2,115200n8 root=ubi0:rootfs ubi.mtd=1 rootfstype=ubifs rw quiet"
> fdt addr $fdtaddr
> fdt resize 1000
> fdt memory
> fdt boardsetup
> fdt chosen
> fdt set /chosen bootargs "${bootargs}"
> # store FDT blob
> ubi write $fileaddr dtb 40000
> # ... and finaly kernel image
> fatload mmc 0:1 $loadaddr zImage
> ubi write $fileaddr kernel $filesize
> # boot into shinny new system
> bootz $loadaddr - $fdtaddr



More information about the U-Boot mailing list