返回学习汇总贴环境变量保存到NAND FLASH0.开始之前:
(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 61.编译
(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重新编辑 ]