新路程------imx6 uboot环境变量的初始化(2)
来源:互联网 发布:淘宝如何快速刷销量 编辑:程序博客网 时间:2024/05/20 21:48
在初始化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查看即可
- 新路程------imx6 uboot环境变量的初始化(2)
- 新路程------imx6 uboot环境变量的初始化(1)
- 新路程------英飞凌imx6的lvds驱动
- 新路程------imx6的uart小结(1)
- 新路程------uboot环境变量没生效
- 新路程------imx6 lvds ioctl
- 新路程------imx6关闭屏保
- 新路程------imx6 gpio设置
- 新路程------imx6 wtd摘要
- 新路程------imx6的模块编译的Makefile
- 新路程------imx6的sd 和emmc部分(1)
- 新路程------imx6 spi cc1101遇到的坑
- 新路程------imx6测试网卡phy
- 新路程------imx6 网卡驱动(1)
- 新路程------imx6 uart和串口(1)
- 新路程------imx6 uart和串口(4)
- 新路程------imx6 lvds屏设置fbinfo
- 新路程------imx6动态修改lvds channel
- jquery使用 Form submission canceled because the form is not connected
- 在shader调用unity内置lightmap和Light Probes
- 产品经理之产品运营-全栈工程师熊盼
- 克鲁斯卡尔算法的java实现
- 第五节:Scala-基本运算
- 新路程------imx6 uboot环境变量的初始化(2)
- 分布式memcache 一致性哈希算法(采用环状数据结构)
- 第六节:判断与循环
- Android 运行时请求权限
- 我的音乐播放器。
- sublime及插件安装
- Python文本读取笔记
- Spring boot运行时添加定时任务
- loadrunner录制websocket