下载 u-boot-2010.06
官网下载
ftp://ftp.denx.de/pub/u-boot/
积分多的可以去这里下载,网速会快一点
https://download.csdn.net/download/laifu_ma/5688297
解压 uboot
tar -jxf u-boot-2010.06.tar.bz2
fw_printenv 的源码在 u-boot-2010.06/tools/env
单独编译 fw_printenv
cd u-boot-2010.06
make ARCH=arm CROSS_COMPILE=arm-linux- smdk6400_config
make ARCH=arm CROSS_COMPILE=arm-linux- clean
make ARCH=arm CROSS_COMPILE=arm-linux- env
新版本是:make ARCH=arm CROSS_COMPILE=arm-linux- envtools
如果编译报重复定义的错,则屏蔽掉 include/linux/types.h 里面的这两行即可
include/linux/types.h:154:36: error: conflicting types for ‘uintmax_t’ typedef u_int32_t uintmax_t;
include/linux/types.h:155:36: error: conflicting types for ‘intmax_t’ typedef int32_t intmax_t;
拷贝 fw_printenv 到目标板,并在目标板上创建软链接 fw_setenv
ln -s fw_printenv fw_setenv
修改并拷贝配置文件到目标板的 /etc 目录下
vi u-boot-2010.06/tools/env/fw_env.config
如果你的env区域是一个单独的分区并且在uboot分区之后,一般uboot分区是第一个分区名为 /dev/mtd0,则env分区就是 /dev/mtd1
我的env分区是256KB,配置文件可以这样写,如:
/dev/mtd1 0x0 0x40000 0x40000
0x0 表示这些环境变量在 /dev/mtd1 内的起始地址
0x40000 表示这个env分区的大小
0x40000 表示扇区大小?不清楚,貌似改成别的也不影响,但要是前一个参数的倍数
如果你的env区域是和uboot同在一个分区,一般uboot分区是第一个分区名为 /dev/mtd0
则可以参考 一下 u-boot-2010.06/include/configs/smdk6400.h 里面的 CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE
可以这样写,如:
/dev/mtd0 0x0040000 0x4000 0x4000
如果没配置好 fw_env.config, 会出现如下各种报错
1. Cannot read bad block mark: Invalid argument
2. Warning: Bad CRC, using default environment
3. Too few good blocks within range
运行
1. 直接执行 fw_printenv 是打印全部环境变量
2. fw_printenv env_name, 打印单个环境变量,打印如下
~ # fw_printenv baudrate
baudrate=115200
3. fw_printenv -n env_name, 也是打印单个环境变量,自己体会下
~ # fw_printenv -n baudrate
115200
4. fw_setenv env_name env_value, 设置某个环境变量,如: fw_setenv bootdelay 5
5. fw_setenv env_name, 删除某个环境变量,如: fw_setenv bootdelay
高级
该工具默认是不能设置 ethaddr 网卡物理地址的,如需支持则要改代码
修改 u-boot-2010.06/tools/env/fw_env.c 中的 fw_setenv 函数代码如下
if ((strcmp (name, "ethaddr") == 0) ||
把0改为1
if ((strcmp (name, "ethaddr") == 1) ||