Sitara升级U-Boot那些事!(完结)

2019-07-30 20:30发布

本帖最后由 blacksword 于 2012-3-29 13:35 编辑

最近一个Case进入最近封产品阶段。

大家都知道产品化阶段,让生产线上的工人干的活越少越好。
一件产品在生产线上的时间越短越好。

就好比生孩子,在医院的时间越短,让医生操心的事情越少,你就越少生孩子的痛,也越少伤钱袋子。2012年的医疗,你伤不起呀!

大家也知道,要想生孩子时顺利,前期锻炼少不了。

做产品也一样,咱也得把进医院前的工作做足了。


基于Sitara的产品,大家都会用到比较大的Flash,不管你用没用,反正我用了。
文件系统做出来还是比较胖的。好多人习惯性的沿用了用惯了的JFFS2来生成要烧写的文件。这样的交给生产线时不可避免的可能出现如下问题:
1. JFFS2的image是与文件系统大小一比一的,32MB的文件系统就对应32MB大小的rootfs.jffs2文件。而NAND FLASH都是有坏块的,U-Boot烧写JFFS2文件,那就是一个一个块挨着去写去,遇到坏块就跳到一下一个块。root设备对应在的分区大小是多大合适。想充分利用FLASH容量,就意味JFFS2文件很可能刷不上(或是把别人分区的数据给干掉了),而保证刷上就意味着浪费FLASH。
2. 你做的产品的寿命比别人用黑牌NAND做出来的产品还差。 不要怀疑,肯定是这样的,JFFS2的出生就是为着NOR FLASH的。

有的人说了,那我们可以用YAFFS2吧试的结果就是对于现在的NAND, 这种Page为2KiB, block为128KiB的,YAFFS确实有点老态胧肿了。

Linus说了,就像从一个小学什么女教导主任飞船式任命成女副市长一样,任命UBIFS为Linux的一个标准大容量FLASH用文件系统吧。
反正简历什么的都是国家机密,我们也整不清。那就试一下吧!
UBIFS确实不错,均衡擦写,大page大block的缓冲管理,都一级棒!

Linux从2.6.27开始支持UBIFS.

U-Boot从啥时开始支持,我不知道,我知道的是TI提供的Sitara SDK里的U-Boot不支持UBI。
那就升级U-Boot来支持吧。到哪里去升级,我就不告诉你是http://www.denx.de/wiki/U-Boot/WebHome

元旦前后分别从denx那下了两次U-Boot. 分别从beagle拷修(拷贝修改)了配置,发现元旦前的能用,而元旦后的x-loader加载完u-boot.bin后就沿任何反映了。整搞了一天,跟呀看呀,发现代码都没问题。
姥姥,最近发现元旦后的版本将CONFIG_SYS_TEXT_BASE的值从之前的0x80008000改成了0x80100000。
请朋友们注意。有升级U-Boot的,记得核对一下这个值。 0x80100000是之前SitraraSDK里的x-loader所不能正确中转的入口。留神!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
blacksword
1楼-- · 2019-07-31 00:14
如何在U-Boot中启用UBIFS

要打开UBI命令,其实简单
在你的u-boot的include/configs/your_board.h文件中加入如下宏
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define CONFIG_RBTREE
#define CONFIG_LZO   

再定义个NAND分区:
#define MTDIDS_DEFAULT "nand0=nand"

#define MTDPARTS_DEFAULT "mtdparts=nand:0x80000@0x0(x-loader),nand:0x1e0000@0x80000(u-boot),0x20000@0x260000(u-boot-envl),0x400000@0x280000(kernel), -(fs)"
#define MTD_ACTIVE_PART "nand,4"

这时编译出来的u-boot就支持了如下的命令:
  1.   mtdparts:  用来给NAND分区
  2.   nand erase.part: 用来擦除指的分区
  3.  UBI用来管理UBI分区及其上的卷
   4.  ubifsmount ubifsls ubifsload等用来对ubifs卷上的文件进行访问
blacksword
2楼-- · 2019-07-31 02:06
如何在U-Boot中创建ubifs的卷
启动目标系统进入到u-boot命令行下按如下步骤操作。
1. 设置NAND的分区
blacksword.david@gmail.com # mtdparts default
2. 对ubi要用到的NAND分区进行erase操作
blacksword.david@gmail.com # nand erase.part fs
3. 将fs分区指定成ubi分区
blacksword.david@gmail.com # ubi part fs
4. 在ubi分区fs中创建ubifs卷
blacksword.david@gmail.com # ubi create rootfs 2000000
   上面的数字表示要创建的卷的容量,为16进制数  即32MiB
5. 在ubi分区fs中删除一个ubifs卷
blacksword.david@gmail.com # ubi remove volname
blacksword
3楼-- · 2019-07-31 07:10
本帖最后由 blacksword 于 2012-2-6 14:38 编辑

如何创建用于烧于的UBIFS文件系统映像

前面我们提到了种种UBIFS的妙不可言之处。总之,看起来UBIFS就是个可人儿!

但有一种没有足够的银行数字,这个可人儿可是不会跟着你的。
想娶她吗?真的想娶她吗?
那要努力工作了,得给她置一个大额的信用卡。

UBIFS文件系统的映像就是这样的一张卡, 去哪个银行开这个卡呢?开这个卡又要注意什么样的事项呢?
UBIFS映像卡由mtd-utils银行独家发行。因此你首先需要申请办理mtd-utils银行的业务。
方法是,在你的ubuntu银行业协会提出对mtd-utils银行业务的申请,如下:
$ sudo apt-get install mtd-utils
一系列的手续过后,mtd-utils银行会给你提供一个专用工具mkfs.ubifs

由于每一个ubifs妙人儿都比较爱财,但不会太爱财,因此你需要使用mkfs.ubifs工具为其量身定制一张卡,一张个性的卡,同时这张卡里得存入一定的麻泥,但又不能太多。

那怎么知道ubifs美人的个性与喜好呢?
在上帝创造她们的时候已经给她们赋予了一定的属性,你只要找到这些属性即可。
在前面第3讲中上帝将fs分区指定成UBI分区时,那一堆输出信息里就已经有了相应的属性值。
Creating 1 MTD partitions on "nand0":
0x000000680000-0x000020000000 : "mtd=4"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name:            "mtd=4"
UBI: MTD device size:            505 MiB
UBI: number of good PEBs:        4040
UBI: number of bad PEBs:         4
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
主要就是这两个属性。
然后看一下专用开卡工具的用法
$ mkfs.ubifs --help
Usage: mkfs.ubifs [OPTIONS] target
Make a UBIFS file system image from an existing directory tree

Examples:
Build file system from directory /opt/img, writting the result in the ubifs.img file
    mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img -o ubifs.img
-m 即minimal-io-unit-size对应我们看中的ubifs美女即上面的2048.
-e 即logic-erase-block-size对应我们看中的ubifs美女即上面的129024
-r  你打算把哪麻袋钞票转化为专用卡。
-o 即是在生成的卡上的签名

但这里有个-c, 说是什么max-logic-erase-block-count。也就是给ubifs美女用时,最大允许透支多少个标准货币单位(逻辑擦除块)。这个好像真不知道是多少。没办法了,这个三维里的胸围数据,只好厚着脸皮去问ubifs美女了 。
在前面u-boot中创建完rootfs时,可以进行如下格式询问:
# ubi info l    (L的小写)
"你讨厌死了,下面是人家的资料嘛!"
UBI: volume information dump:
UBI: vol_id          0
UBI: reserved_pebs   261
UBI: alignment       1
UBI: data_pad        0
UBI: vol_type        3
UBI: name_len        6
UBI: usable_leb_size 129024
UBI: used_ebs        261
UBI: used_bytes      33675264
UBI: last_eb_bytes   129024
UBI: corrupted       0
UBI: upd_marker      0
UBI: name            rootfs

现在我们有了所有的数据,可以用专用工具开卡了!
sudo mkfs.ubifs -m 2048 -e 129024 -c 261 -x lzo -U -v -r rootfsdir -o rootfs.ubifs
blacksword
4楼-- · 2019-07-31 09:41
本帖最后由 blacksword 于 2012-2-6 14:57 编辑

如何在U-Boot中烧写UBIFS

为了迎娶UBIFS,我们前面可是做了不少的准备工作。

走,抬着花轿,接新娘去了!

将rootfs.ubifs文件复制到SD卡的boot分区。

从SD卡启动Sitara. 进入u-boot命令行
当走到新娘家的门前时先敲敲门,放个花炮!
# mmc rescan
然后将新娘从婆家背出来
#fatload mmc 0 $loadaddr rootfs.ubifs
把新娘放到花轿上抬回家
# ubi write $loadaddr rootfs BEF800
上面的BEF800为文件rootfs的16进制大小

现在UBIFS已经跟你了,你小子可得对人家好点!
blacksword
5楼-- · 2019-07-31 11:14
 精彩回答 2  元偷偷看……
sqcumt123
6楼-- · 2019-07-31 16:51
楼主将主题与生孩子类比,新鲜!

一周热门 更多>