新路程------imx6 uboot环境变量的初始化(2)

在初始化uboot运行中,有log很奇怪,我就看了一下,之前说了环境变量从哪里来

在main.c中,有个地方会等待在那边等你输入新的环境变量,这里等了三秒

void main_loop (void)
{

s = getenv ("bootdelay");  //获取等待的时间,是3s

s = getenv ("bootdelay");  //从哪里启动,这里是emmc

### main_loop: bootcmd="run bootcmd_mmc"

if (bootdelay >= 0 && s && !abortboot (bootdelay)) //这个abortboot 就是等待3s中有输入的情况

   run_command (s, 0);没有输入走这个函数



argv[i]=“bootargs_mmc”
arg = getenv (argv[i])) == NULL这个函数之前
之后就变成了
setenv bootargs ${bootargs} ip=none root=/dev/mmcblk0p1 rootwait
然后又变成了
"setenv bootargs console=ttymxc0,115200 video=mxcfb0:dev=ldb,CH
B_8WVGALVDS_V1,if=RGB666,bpp=16 ldb=sin0 video=mxcfb1:off video=mxcfb2:off video
=mxcfb3:off ip=none root=/dev/mmcblk0p1 rootwait"
其实也就是${bootargs} 被填充了,也就是先run_command的参数是bootcmd_mmc,经过循环调用getenv 
最后变成了长长的一串,一开始我还没看明白,每次经过
arg = getenv (argv[i])和process_macros (token, finaltoken);这个函数之后,cmdline都会变长
process_macros (token, finaltoken);这个函数负责把${}转化为具体的cmd,其实这两个函数最后都用到了getenv 

里面的

return ((char *)env_get_addr(val));其实也是一样到某个地址里去取环境变量

uchar *env_get_addr (int index)
{
if (gd->env_valid) {
return ( ((uchar *)(gd->env_addr + index)) );  gd终于出现了
} else {
return (&default_environment[index]);
}
}

获取到了环境变量之后,执行int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])

在此期间也会循环调用rum_command,直到没有任何$[],或者高级环境变量的存在之后,执行

if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {
rc = -1;
}

这个cmdtp->cmd是个

struct cmd_tbl_s {
char *name;/* Command Name*/
int maxargs;/* maximum number of arguments*/
int repeatable;/* autorepeat allowed?*/
/* Implementation function*/
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage;/* Usage message(short)*/
#ifdef CONFIG_SYS_LONGHELP
char *help;/* Help  message(long)*/
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};里面有个对应的执行函数

比如./common/cmd_nvedit.c里

U_BOOT_CMD(
run, CONFIG_SYS_MAXARGS,1,do_run,
"run commands in an environment variable",
"var [...]\n"
"    - run the commands in the environment variable(s) 'var'"
);

U_BOOT_CMD(
setenv, CONFIG_SYS_MAXARGS, 0, do_setenv,
"set environment variables",
"name value ...\n"
"    - set environment variable 'name' to 'value ...'\n"
"setenv name\n"
"    - delete environment variable 'name'"
);

获取到环境变量之后都是去设置,也就是如果环境变量有变化则更新,没有变化则单纯从emmc中读取到内存中。


如果要修改cmdline则在

int run_command (const char *cmd, int flag)
{

char *str2="bootargs";

if(strstr(token,str2))
{
strcpy(finaltoken,"setenv bootargs console=ttymxc0,115200 video=m\
xcfb0:dev=ldb,CHB_8WVGALVDS_V1,if=RGB24,bpp=24 ldb=sin0 video=mxcfb1:off video=\
mxcfb2:off video=mxcfb3:off ip=none root=/dev/mmcblk0p1 rootwait");
printf ("===============finaltoken1: \"%s\"\n", finaltoken);
}

也就是将含有bootargs的改了

然后cat  /proc/cmdline查看即可

如果想要修改固定初始值cmdline,则修改

Mx6q_sabresd.h (include\configs): "bootargs_base=
Mx6q_sabresd.h(include\configs): "           bootargs_base=
Mx6q_sabresd_sd.h (include\configs): "bootargs_base=setenv b

这里头的参数即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值