关闭

Linux系统下访问U-BOOT环境变量

发表于:2015-8-28 10:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:eric0803    来源:51Testing软件测试网采编

  移植过U-BOOT的人,都知道:在U-BOOT中存有ENV。但U-BOOT在引导内核启动之后,U-BOOT的生命周期就结束了。那么启动LINUX内核之后,U-Boot的环境变量还在么?
  按照u-boot对Flash的规划:ENV存放在Flash的0x60000~0x80000。
  那么我们如何在Linux下查看U-boot的环境变量呢?
  其实U-BOOT源码内已经提供了这么一种方式:在tools/env/目录下,有相应的源码,通过在u-boot根目录下执行:make env就可生成fw_printenv应用程序,并将该应用程序拷贝到根文件系统中,就可以查看到U-BOOT的相应的环境变量了。
  具体实现方法,及操作步骤见下面:
  1、编译fw_printenv工具
  在你使用的uboot代码中用以下编译指令:
  make env
  这样就可以编译tools/env下的代码,编译出的fw_printenv工具有读写uboot环境变量区的能力。这个工具是针对目标机的,也就是说如果你的uboot代码之前是针对ARM编译的话,fw_printenv也是交叉编译给ARM芯片的。如果编译不成功,则按照如下操作执行:
  make distclean
  make mini2440_config
  make env
  2、安装fw_printenv工具
  到/tools/env目录中,将编译好的fw_printenv拷贝到目标机的文件系统中,并通过"ln -s fw_printenv fw_setenv",创建一个fw_setenv到fw_printenv的软链。
  这个工具还需要一个配置文件,以获取uboot的ENV区域的位置信息。默认状态下,请将fw_env.config文件拷贝到目标机的文件系统的/etc目录下。然后结合uboot配置中定义的ENV区和Linux下mtd分区的情况修改配置文件。具体的修改方法见fw_env.config文件中的说明及/tools/env/README文件。
  3、fw_printenv工具的使用
  其实fw_printenv使用起来和uboot下的printenv和setenv指令是一模一样的。
  ?打印uboot环境变量:
  1.fw_printenv [[ -n name ] | [ name ... ]]
  2.# ./fw_printenv -n baudrate
  3.115200
  4.# ./fw_printenv baudrate
  5.baudrate=115200
  如果不指定name,fw_printenv会打印出ENV区中的所有环境变量
  ?设置uboot环境变量:
  1.fw_setenv name [ value ... ]
  2.如果不指定value,表示要删除这个name的环境变量。
  3.# ./fw_setenv temp tekkaman
  4.# ./fw_printenv -n temp
  5.tekkaman
  6.# ./fw_setenv temp
  7.# ./fw_printenv -n temp
  8.## Error: "temp" not defined
  linux程序读写uboot env变量:
  分析发现uboot env的存储格式是,开始4个字节是crc32,后面是一个接一个\0结束的字符串,每个串都是envname=enavalue的格式。
  挪用uboot部分的相关代码,实现以下函数:
  int set_env_ptr(unsigned char * ptr);
  char *get_env (char *name);
  int set_env (char *varname, char *varvalue);
  int printenv(void);
  使用时,我们读取env分区的数据到内存;
  调用set_env_ptr(数据指针),该函数会进行crc校正确保env分区正确,并且返回0;
  get_env, set_env, printenv相应uboot 中的echo $envname; setenv envname envstr; printenv
  Usage: ./uboot_env read|set [envname] [value] -i envimage -o outimage
  linux 程序读写Env分区 --- mtdparts,/dev/mtd*,mtd_debug
  1. uboot $mtdparts 和 linux /dev/mtd* 的联系
  比如:
  uboot:# setenv mtdparts 'mtdparts=nx_2016:1408k@0k(boot),128k@1408k(env),-(extra);nx_2017:16m(k0),16m(k1),-(nandextra)'
  linux:# cat /proc/mtd
  dev: size erasesize name
  mtd0: 00160000 00010000 "boot"
  mtd1: 00020000 00010000 "env"
  mtd2: 00280000 00010000 "extra"
  mtd3: 00400000 00010000 "nx_2016"
  mtd4: 04000000 00004000 "nx_2017"
  mtd5: 01000000 00004000 "k0"
  mtd6: 01000000 00004000 "k1"
  mtd7: 02000000 00004000 "nandextra"
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号