一)、概述

Linux应用程序可以通过uboot/tools/env目录下的fw_printenv程序,查看,修改,删除Uboot的环境变量。

如:system("/usr/sbin/fw_setenv   ipaddr   192.168.17.100");

或者在命令行 # /usr/sbin/fw_setenv   ipaddr   192.168.17.100

(二)、编译

1.确保Fw_env.h文件中存在以下定义:

#define CONFIG_FILE     "/etc/fw_env.config"

上面的定义使得fw_setenv程序会从/etc/fw_env.config中获取配置参数。具体参见

Fw_env.c中parse_config ()源码。

static int parse_config ()

{

struct stat st;

#if defined(CONFIG_FILE)

/* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */

if (get_config (CONFIG_FILE)) {

fprintf (stderr,

"Cannot parse config file: %s\n", strerror (errno));

return -1;

}

#else

strcpy (DEVNAME (0), DEVICE1_NAME);

DEVOFFSET (0) = DEVICE1_OFFSET;

ENVSIZE (0) = ENV1_SIZE;

DEVESIZE (0) = DEVICE1_ESIZE;

ENVSECTORS (0) = DEVICE1_ENVSECTORS;

.....

#endif

.....

}

2.在uboot根目录执行

Make env

3.将uboot/tools/env/fw_printenv 拷贝到目标机的/ust/sbin目录下,并通过“ln -s fw_printenv fw_setenv”创建一个fw_setenv到fw_printenv的软连接。

4.将uboot/tools/env/fw_env.config拷贝到目标机的/etc/目录下,并修改为合适值。

(三)、修改配置

1、fw_env.config默认配置如下:

[root@localhost env]# vi fw_env.config 

# Configuration file for fw_(printenv/saveenv) utility.

# Up to two entries are valid, in this case the redundant

# environment sector is assumed present.

# Notice, that the "Number of sectors" is ignored on NOR.

# MTD device name       Device offset   Env. size       Flash sector size       Number of sectors

/dev/mtd1               0x0000          0x4000          0x4000

/dev/mtd2               0x0000          0x4000          0x4000

# NAND example

#/dev/mtd0              0x4000          0x4000          0x20000       2

2、我使用的是NAND FLASH

先在目标机执行cat /proc/mtd,获得配置参数MTD device name和  Flash sector size

cat  /proc/mtd

dev:    size         erasesize   name

mtd0: 00040000 00020000 "u-boot"

mtd1: 00040000 00020000 "u-bootenv"

mtd2: 00280000 00020000 "kernel"

mtd3: 00200000 00020000 "data"

mtd4: 07b00000 00020000 "rootfs"

简单解释下配置文件中一个字符串的含义

MTD device name : "u-bootenv"对应“mtd1”

Device offset : 环境变量在mtd1中的偏移地址

Env. size  : 环境变量大小

Flash sector size  :NAND flash 块大小 擦除大小 0x20000

3.一般NAND flash 会保存两次环境变量(在两个地方),也就是RedundEnv。

在uboot命令行执行saveenv 也会发现执行了两次write nand 操作:

执行两次的原因是定义了CONFIG_ENV_OFFSET_REDUND。

firetux # saveenv

Saving Environment to NAND...

Erasing redundant Nand...

Erasing at 0x60000 -- 100% complete.

Writing to redundant Nand... Erasing Nand...

Erasing at 0x40000 -- 100% complete.

Writing to Nand... done

firetux #

4.查看uboot/include/autoconfig.mk文件,获取配置参数Device offset, Env. size 。

CONFIG_ENV_OFFSET="0x40000"

CONFIG_ENV_OFFSET_REDUND="0x60000"

CONFIG_ENV_SIZE="0x20000"

可见,环境变量存放的位置有两个。

第一个:0x40000开始,大小是0x20000 .

第二个:0x60000开始,大小是0x20000 .

0x40000,0x0x60000都是相对有mtd0(0x00000)而言,相对于mtd1而言就是0x0000和0x20000

所以配置文件应该修改为

# Configuration file for fw_(printenv/saveenv) utility.

# Up to two entries are valid, in this case the redundant

# environment sector is assumed present.

# Notice, that the "Number of sectors" is ignored on NOR.

# MTD device name Device offset Env. size Flash sector size Number of sectors

/dev/mtd1 0x0000 0x20000 0x20000           1

/dev/mtd1 0x20000 0x20000 0x20000           1

(四)、备注

Fw_setenv 不能修改或者删除"ethaddr", "serial#"这两个环境变量。

当然可以通过修改fw_env.c中的fw_env_write函数,来越过此限制。

屏蔽下面代码

if ((strcmp (name, "ethaddr") == 0) ||

(strcmp (name, "serial#") == 0)) {

fprintf (stderr, "Can't overwrite \"%s\"\n", name);

errno = EROFS;

return -1;

}
--------------------- 
作者:nanaoxue 
来源:CSDN 
原文:https://blog.csdn.net/nanaoxue/article/details/22158171 
版权声明:本文为博主原创文章,转载请附上博文链接!

fw_printenv 配置文件 nand flash相关推荐

  1. nor flash 和nand flash 的区别

    ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...

  2. NAND Flash和NOR Flash的区别

    1. 区别     NOR的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中.优点是可以直接从FLASH中运行程序 ...

  3. Nand Flash VS Nor Flash

    NOR Flash 生产厂商有 Intel和ST, Nand Flash厂商有Hynix,micon,Samsung,Toshiba和Fujitsu等.     2006年NAND将占据59%的闪存市 ...

  4. Nand Flash与Nor Flash

    Nand Flash与Nor Flash经常在一些地方被提到,以下是他们的 一些对比: NOR的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行 ...

  5. NOR和NAND Flash存储器的区别

    NOR和NAND是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面.紧接着,1989年,东芝公司发表了 ...

  6. jz2440开发板修改UBOOT支持NAND FLASH

    很多天没有看嵌入式的东西了,今天来看一下,继续之前移植uboot到jz2440开发板.今天我们来实现Uboot支持NAND FLASH. 在之前的文章里(点击连接查看之前的记录),我们为了编译通过把N ...

  7. Nand Flash数据存储单元的整体架构

    http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 简单说就是, ...

  8. nor flash和nand flash

    FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低 ...

  9. arm 基础:Nand Flash与Nor Flash的区别

    Nand Flash与Nor Flash NOR的特点是芯片内执行(XIP,eXecute In  Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中.优点是可以直 ...

最新文章

  1. 【原创】CSSOO的思想及CSS框架的应用(未整理完)
  2. [转]ELF文件结构简述
  3. 2020ICPC(上海) - Sum of Log(数位dp)
  4. 为什么喜欢听钢琴+小提琴
  5. mysql rs.next_JDBC结果集rs.next()注意事项
  6. 拿着6位数工资,没写一行代码!为何还能成为最佳员工?
  7. EXCEL导入SQL的语句
  8. 我常去的编程技术网站
  9. Python 处理 PDF 的神器 -- PyMuPDF(下)
  10. 2414905-34-1,Thalidomide-O-PEG5-Tosyl它与亲核物质如胺、含羟基的分子反应
  11. c语言将整数赋值给指针,在c语言只能够允许将一个整数赋值给指针变量。
  12. STM32外部中断触发
  13. openwrt怎么做ap_终于把无线AP鸡肋的系统刷成openwrt,从此山鸡变凤凰!
  14. 关于lego-loam的总结(一)
  15. MATLAB中simulink的SIL测试
  16. ES6的Lambda表达式
  17. 南京邮电大学计算机考研专硕初试经验分享
  18. 菜鸟教程:Python练习实例1~10
  19. 2022大数据十大关键词-记录
  20. 2845 ACM 豆子 beans

热门文章

  1. LintCode领扣算法问题答案:150. 买卖股票的最佳时机 II
  2. 皮皮安学习Java第五天(今日闲聊)
  3. 91三网话费接口渠道文档分享
  4. 合并数组与非合并数组——SystemVerilog
  5. 《黑客与画家 》--- 地铁系列
  6. 荣耀20青春版刷鸿蒙os,华为不忘老用户 5年前的华为手机也能升级鸿蒙OS 具体升级名单出炉...
  7. Java面试题(杭州面试初级总结)
  8. 护卫神apache大师3.0.0 php,护卫神Apache大师(PHP环境套件)V3.2.0 官方免费版
  9. 老魔杖(博弈 大数取模)
  10. GNSS基本概念(1):仰角和方位角(Elevation and Azimuth)