主题 : Barebox for tiny 210 - step 7 ENVFS 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 54261
精华: 9
发帖: 43
金钱: 665 两
威望: 133 点
贡献值: 9 点
综合积分: 266 分
注册时间: 2011-08-27
最后登录: 2014-08-08
楼主  发表于: 2013-04-11 22:54

 Barebox for tiny 210 - step 7 ENVFS

管理提醒: 本帖被 xoom 执行加亮操作(2013-04-12)
返回学习汇总贴
环境变量保存到NAND FLASH

0.开始之前:
    (1) ENVFS是barebox保存配置数据(环境变量?)的机制,实际上是一堆被打包在一起的脚本,默认存放在/dev/env0,启动时解包到/env目录,执行/env/bin/init (common/startup.c),有点像linux initrd ?
    (2) /env目录下的脚本可以修改(edit命令),可以保存(saveenv命令),也可以加载(loadenv命令)
    (3) 如果从/dev/env0解包失败,则加载原始环境defaultenv,该环境内嵌在barebox映像中,所有脚本来源于defaultenv-2/base和arch/arm/boards/friendlyarm-tiny210/env目录
    (4) 分析脚本如何设置环境变量,以arch/arm/boards/friendlyarm-tiny210/env/init/config-board中语句global.linux.bootargs.base="console=ttySAC0,115200"为例,该语句实际上是创建全局变量linux.bootargs.base并赋值为"console=ttySAC0,115200"。大致流程为
        global.c::do_global() -> global.c::globalvar_set() -> globalvar.c::globalvar_add_simple() -> parameter.c::dev_add_param()
                                                                                            -> env.c::setenv() -> parameter.c::dev_set_param() -> parameter.c::dev_param_set_generic()
    (5) 分析barebox如何使用全局变量,以linux.bootargs.base为例,它和其他相同前缀的变量(如 linux.bootargs.dyn.root等)一起组成全局linux.bootargs变量,大致流程为
        linux_bootargs_get() ->  bootargs = globalvar_get_match("linux.bootargs.", " ") 所有linux.bootargs.开头的全局变量连接在一起
        也就是 bootargs = ${linux.bootargs.base} ${linux.bootargs.dyn.root} = "console=ttySCA0,115200 root=/dev/nfs nfsroot=..."
    (6)掌握 Barebox for tiny 210 - step 6
1.编译
    (1) 更新源码到对应版本
        cd ~/s5pv210/github/loader/barebox && git checkout 7b65282b5412f3c921833e2dcaef4701b5f4b082
    (2) 配置编译
        cp arch/arm/configs/friendlyarm_tiny210_defconfig .config
        make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
                禁用General Settings -> [ ]run machine low-level init
                启用commands  ---> scripting  ---> [*] edit
                启用commands  ---> scripting  ---> [*] saveenv
        make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- && sudo cp barebox.bin /srv/tftp/
        编译生成的barebox.bin放到tftp根目录下
2.运行
        通过串口终端执行update命令,单板下载barebox.bin到RAM并运行,三秒内按任意键中断autoboot
        查看/env目录中的脚本,执行edit env/network/eth0命令修改该脚本(比如改IP地址)
        执行saveenv命令保存ENVFS,执行loadenv命令加载ENVFS,确认掉电是否会丢失
3.源码分析
        本人纯属新手,不是什么“牛人”,只是依葫芦画瓢的一些些小修补,见笑了!!!
        前言里分析了,ENVFS的默认存取位置是/dev/env0,不知道为啥这个路径在代码里写死了,改成在defconfig里可配置不更好么?各种不懂...
        学习其他单板的源码,搞清楚了大致意思,建一个nand.bb分区,名叫/dev/env0
        arch/arm/boards/friendlyarm-tiny210/tiny210.c
        @@ -143,6 +143,13 @@ static int tiny210_devices_init(void)
                 add_generic_device("s3c_nand", DEVICE_ID_DYNAMIC, NULL,
                                  S3C_NAND_BASE, 0x40000, IORESOURCE_MEM, NULL);

        +#ifdef CONFIG_PARTITION
        +  devfs_add_partition("nand0", 0x00000, SZ_512K, DEVFS_PARTITION_FIXED, "self_raw");  // 新增NAND分区 /dev/self_raw
        +  dev_add_bb_dev("self_raw", "self0");  // self_raw对应的bb设备 /dev/self0
        +  devfs_add_partition("nand0", SZ_512K, SZ_512K, DEVFS_PARTITION_FIXED, "env_raw");  // 新增NAND分区 /dev/env_raw
        +  dev_add_bb_dev("env_raw", "env0");  // self_raw对应的bb设备 /dev/env0
        +#endif
        +
4.继续之前
        分析loadenv和saveenv源码
        分析env和environment源码
        ENVFS保存在NAND中以后,升级barebox并不能升级ENVFS,要升级有两种方法:
                a.擦除/dev/nand0.bareboxenv分区,强制加载内嵌的ENVFS;
                b.制作独立的env.bin,用loadenv和saveenv命令更新
[ 此帖被mei5150在2013-04-13 20:45重新编辑 ]