Linux下修改uboot环境变量
背景:业务需求,需要设计系统升级功能,预言使用用户层设置uboot环境变量,接着uboot层检测该标记判断是否升级系统的功能。
一、fw_printenv / fw_setenv工具介绍
在linux下可以通过fw_setenv工具读写uboot的环境变量。Linux应用程序可以通过uboot/tools/env目录下的fw_printenv程序 ,查看,修改,删除Uboot的环境变量。
二、制作生成fw_printenv / fw_setenv工具
1.到uboot/tool/env目录下
make env ARCH=arm CROSS_COMPILE-arm-hisiv300-linux-
生成fw_printenv和fw_env.config文件。
2.将fw_printenv放在内核/usr/bin/下
cd /usr/bin
tftp -gl fw_printenv xx.xx.xxx.xx
chmod 777 ./fw_printenv
3.创建fw_printenv的软链接
In -s /usr/bin/fw_printenv/usr/bin/fw_setenv
4.修改配置文件
Device offset , Env size和Flash sector size应该分别对应于uboot源码目录中
include/configs/hi3536.h相关文件中的CONFIG_ENV_OFFSET,CONFIG_ENV_SIZE和
CONFIG_ENV_ SECT_ SIZE三个宏定义。
MTD device name是环境变量所放的分区,在uboot代码中有分区信息。或者可以cat /proc/mtd 查看分区信息。
方法1:修改iw_env.config文件,并放下etc/下
# 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/mtdO 0x80000 0x40000 0x40000
#/dev/mtd2 0x0000 0x4000 0x4000
# NAND example
#/dev/mtdO 0x4000 0x4000 0x20000
tftp -gl fw_env.config 10.13.113.19
cd /etc
方法2:修改uboot/tool/env/fw_env.h
/*
* To build the utility with the run-time configuration
* uncomment the next line.
* See included "fw_env.config" sample file (TRAB board)
* for notes on configuration.
*/ //#define CONFIG_FILE
"/etc/fw_env.config"
//#define HAVE_REDUND /* For systems with 2 env sectors */ #define DEVICE1_ENVSECTORS 1 #define DEVICE NAME
"/dev/mtdO"
//#define DEVICE2_NAME
"/dev/mtd2"
#define DEVICE1 OFFSET
0x80000
#define ENV1_ SIZE
0x40000
#define DEVICE1 ESIZE
0×40000
//#define DEVICE2_OFFSET
0x0000
//#define ENV2_SIZE
0x4000
//#define DEVICE2_ESIZE
0x4000
#define CONFIG_BAUDRATE
115200
#define CONFIG_BOOTDELAY
5
* autoboot after 5 seconds */
#define CONFIG_BOOTCOMMAND
\
"bootp;"
"setenv bootargs root=/dev/nfs nfsroot=${serverip}: ${rootpath} "
"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off;
"
"bootm"
extern int fw_printenv(int argc, char *argv[]);
extern char *fw_getenv (char *name);
extern int fw_setenv (int argc, char *argv[]);
extern unsigned long crc32 (unsigned long, const unsigned char *, unsigned);
完成。
三、使用测试
和uboot下使用环境变量一样。
1.打印环境变量
/usr/bin # fw_printenv
slave_bootargs=mem=64M console=ttyAMA0,115200
bootdelay=3
baudrate=115200 bootfile="uImage"
bootargs=mem=512M console=ttyama0,115200 root=/dev/ram devip=10.13.113.202
hikargs=up
bootargs=mem=512M console=ttyama0,115200 root=/dev/ram serip=10.13.113.19
filesize=2747C3
fileaddr=43000000
gatewayip=10.13.113.254
netmask=255.255.255.0
ipaddr=10.13.113.202
serverip=10.13.113.19
stdin=serial stdout=serial stderr=serial verify=n ethaddr=00:40:65:4:b1:6b
ver=U-Boot 2010.06 (Nov 12 2019 - 16:14:32)
bootcmd=fsload 42000000 Image;fsload 43000000 cramfs.initrd.img; bootm 0x42000000 0×43000000
2.设置环境变量
/usr/bin # fw_setenv updateuboot ON
/usr/bin # fw_printenv
slave_bootargs=mem=64M console=ttyaMA0,115200
bootdelay=3
baudrate=115200 bootfile="uImage"
bootargs=mem=512M console=ttyAMa0,115200 root=/dev/ram devip=10.13.113.202
hikargs=up
bootargs=mem=512м console=ttyAMa0,115200 root=/dev/ram serip=10.13.113.19
filesize=2747C3
fileaddr=43000000
gatewayip=10.13.113.254
netmask=255.255.255.0
ipaddr=10.13.113.202
serverip=10.13.113.19
stdin=serial stdout=serial stderr=serial verify=n ethaddr=00:40:65:4:b1:6b
ver=U-Boot 2010.06 (Nov 12 2019 - 16:14:32)
bootcmd=fsload 42000000 Image; fsload 43000000 cramfs.initrd.img;bootm 0×42000000 0x43000000
UpdataUboot=ON
uboot下查看是否添加环境变量
uboot>> printenv
Slave_bootargs=mem=64M console=ttyaMA0, 115200
bootdelay=3
baudrate=115200 bootfile="uImage"
bootargs=mem=512M console=ttyama0,115200 root=/dev/ram devip=10.13.113.202
hikargs=up
bootargs=mem=512M console=ttyama0, 115200 root=/dev/ram serip=10.13.113.19
filesize=2747C3
fileaddr=43000000
gatewayip=10.13.113.254
netmask=255.255.255.0
ipaddr=10.13.113.202
serverip=10.13.113.19
bootcmd=fsload 42000000 uImage; fsload 43000000 cramfs.initrd.img; bootm 0x42000000 0x43000000
Updateuboot=ON stdin=serial stdout=serial stderr=serial verify=n ethaddr=00:40:65:e4:b1:66
ver=U-Boot 2010.06 (Nov 12 2019 - 16:14:32)
Environment size: 624/262140 bytes
检验确实添加环境变量。
注:修改环境变量,删除环境变量和uboot下操作是一样的,这里不再演示,fw_setenv = setenv + saveenv.
原理上是对同一块设备的地址进行读写修改,根据本原理实现了user层、kernel层、uboot层对统一存储设备读写的功能,此功能可以实现很多的业务应用,由于涉及公司敏感信息,这里不再叙述。