uboot代码分析6:实践篇-添加一个恢复环境变量出厂设置的命令

本文介绍了如何在UBoot中创建一个名为`factory`的自定义命令,该命令用于将环境变量恢复到默认设置。首先,通过修改`Makefile`将新命令添加到编译流程中,然后编写`factory.c`源码实现恢复默认环境变量的功能。在执行`factory`命令后,环境变量`bootdelay`被重置。作者建议在函数中不应直接调用`saveenv()`,以免意外丢失用户配置,而是让用户自行决定是否保存更改。

目录

前言

1 准备工作,新建文件,并添加编译

2 编写factory.c源码

3 编译并下载测试并运行

4 恢复出厂设置执行函数中不建议调用saveenv


前言

    uboot第一次运行时,uboot使用默认的环境变量,然后用户会根据需要对其进行修改,本次我们就写一个测试命令将环境变量恢复到默认值。

1 准备工作,新建文件,并添加编译

    参考uboot代码解析5:命令集、自定义uboot命令,命令处理框架这节内容

    将上一章写的hello.c文件为factory.c

    然后将uboot的根目录的cmd文件夹中在Makefile文件中添加如下内容

obj-y += factory.o

2 编写factory.c源码

#include <common.h>
#include <command.h>

#ifdef debug
#undef debug
#endif
#define debug(format,...) printf("%s,%s,line=%d:"format"\n",__FILE__,__func__,__LINE__,##__VA_ARGS__)

static int do_factory(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	int i = 0;
	debug("set enviroment to default values");
	set_default_env(NULL);//设置内存中的环境变量为默认值
    saveenv();  //实际使用中不建议在这里调用这个函数,这个函数对应saveenv命令。
	return 0;
}

U_BOOT_CMD(
	factory,	1,	0,	do_factory,
	"set env to default value/usage",
	"\n"
	"	set env to default value\n"
	"factory command ...\n"
	"	set env to default value for lkmao"
);

3 编译并下载测试并运行

使用help命令查看新添加的factory命令

=> help factory
factory - set env to default value/usage

Usage:
factory
        set env to default value
factory command ...
        set env to default value for lkmao

 执行factory命令之前先修改bootdelay   的值为10

=> setenv bootdelay 10
=> printenv boot
  boot_fdt bootargs bootcmd bootcmd_mfg bootdelay bootscript
=> printenv bootdelay
bootdelay=10
=> saveenv
Saving Environment to MMC...
Writing to MMC(1)... done

准备完毕,执行factory,如果执行成功bootdelay会变成初始化,我的初始值是0

=> factory
cmd/factory.c,do_factory,line=19:set enviroment to default values
Using default environment

Writing to MMC(1)... done


=> printenv bootdelay
bootdelay=0

命令执行成功了。上面的打印信息中包含

Writing to MMC(1)... done

说明环境变量被保存在了(MMC(1))中了,

4 恢复出厂设置执行函数中不建议调用saveenv

个人建议不要saveenv,让使用的人自己去saveenv,这样有很多好处,使用的人可能只是想看一下默认值,并不想丢弃现在的值,如果直接saveenv就等于丢掉了当前的配置,可能其中包含重要信息。

5 saveenv命令

static int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc,
		       char * const argv[])
{
	printf("Saving Environment to %s...\n", env_name_spec);

	return saveenv() ? 1 : 0;
}

U_BOOT_CMD(
	saveenv, 1, 0,	do_env_save,
	"save environment variables to persistent storage",
	""
);

这里说明saveenv命令对应的执行函数是do_env_save,而do_env_save调用了saveenv();

总结

        纸上得来终觉浅,绝知此事要躬行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值