查看: 4592|回复: 6

Sitara升级U-Boot那些事!

[复制链接]
  • TA的每日心情
    开心
    2015-1-1 01:21
  • 签到天数: 354 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-1-7 00:51:55 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 xinxincaijq 于 2013-1-7 08:57 编辑

    声明:本贴转自于21ic,由 blacksword 大侠写的,因为这一段时间在弄这一部分,又常来EEBoard,查着方便!同时与大家分享

    最近一个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所不能正确中转的入口。留神!

    如何在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卷上的文件进行访问

    如何在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

    如何创建用于烧于的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

    如何在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已经跟你了,你小子可得对人家好点!

    在Linux中使用UBIFS文件系统

    UBIFS这个妮子狠PL,我心犹动!
    也花了大力气,准备了好大一顶大花轿,准备去抢回来当押寨人!
    且莫急,先检查一下咱这个寨子是不是适合养这个妮子的。别人抢回来了却养不住!
    兼容性山寨:Linux 2.6.27以上版本的山寨
    如果山寨等级太低,还是先去升级山寨吧!
    升级完山寨的,怎么办呢!
    当然是装修山寨,使整体风格符合美人的要求!
    具体装修过程如下面三幅图。
    12032716233561cdbac36ad50e.png
    12032716239aeb668ec656df12.png
    120327162341a80269ea2bcb71.png

    装修完,就可以去抢人了。
    抢人方法有两种。
    抢为大夫人的(用作root文件系统):
           在uboot的bootargs中设置:
                  root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
          即root为ubi0上的rootfs分区, ubi0是mtd设备上的第4个区块
    抢为妾的(不用作root文件系统):
          在linux中使用如下命令即可挂载ubifs文件系统:
                $ ubiattach /dev/ubictrl
                $ mount -t ubifs ubi0:fspart /mnt
           /mnt目录下即是ubifs文件系统

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-4 08:32
  • 签到天数: 773 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-1-7 08:30:38 | 显示全部楼层
    抢沙发支持王子神作。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-1-7 08:58:30 | 显示全部楼层
    多谢楼主分享~~~帮你排版了一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-1-1 01:21
  • 签到天数: 354 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-1-7 21:23:14 | 显示全部楼层
    xinxincaijq 发表于 2013-1-7 08:58
    多谢楼主分享~~~帮你排版了一下

    哈哈!谢谢xinxin!昨天太晚了!没不得及详细整!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-5-28 19:02
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-1-23 21:33:21 | 显示全部楼层
    嗯~ 不错~~~不错~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-1-1 01:21
  • 签到天数: 354 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-1-23 22:47:55 | 显示全部楼层
    E08610225 发表于 2013-1-23 21:33
    嗯~ 不错~~~不错~~~~

    哈哈,共同学习!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-3 11:13
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-2-10 09:54:14 | 显示全部楼层
    神作啊,拜读
    呵呵
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-11 07:12 , Processed in 0.154910 second(s), 28 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.