在uboot里面添加环境变量使用run来执行


Author:杨正  Date2014.11.11   Emailyz2012ww@gmail.com QQ:1209758756

 

         在移植uboot的时候,可以在uboot里面添加定义一些自己的环境变量,这些环境变量可以大大提高以后的工作效率,比如我在uboot里面添加如下环境变量:

bbl=sf probe 0;mw.b 82000000 ff 80000;loady0x82000000 uboot_logo.bin;sf erase 0 80000;sf write 82000000 0 80000

然后使用run命令来执行:

hisilicon # run bbl         

16384 KiB hi_sfc at 0:0 is now currentdevice

## Ready for binary (ymodem) download to0x82000000 at 115200 bps...

CCC

Starting ymodem transfer.  Press Ctrl+C to cancel.

 100%     222 KB    6 KB/s 00:00:36       1 Errors

 

## Total Size      = 0x000379ec = 227820 Bytes

Erasing at 0x80000 -- 100% complete.

Writing at 0x80000 -- 100% complete.

那么这样就不用每次都输入很长的一串字符串,如:

hisilicon # sf probe 0;mw.b 82000000 ff80000;loady 0x82000000 uboot_logo.bin;sf erase 0 80000;sf write 82000000 080000

那么方法如下:

 

一、            在uboot里面添加环境变量

1、  在u-boot-2010.06/include/configs目录下的xxx.h(xxx是board,如hi3520d.h)里面定义环境变量:

/* Burn bootloader, linux kernel and rootfscommand */

#define CONFIG_BURNBL       "sf probe 0;mw.b 82000000 ff80000;loady 0x82000000 uboot_logo.bin;sf erase 0 80000;sf write 82000000 0 8

0000"

#define CONFIG_BURNKERNEL"sf probe 0;mw.b 82000000 ff 480000;loady 82000000 root_cramfs.img;sferase 80000 0x480000;sf write 8200000

0 80000 480000"

#define CONFIG_BURN_APP"sf probe 0;mw.b 82000000 ff 0xa00000;loady 82000000 app_jffs2.img;sferase 500000 0xa00000;sf write 82000000

 500000 0xa00000"

#define CONFIG_BURN_FLASH"sf probe 0;mw.b 82000000 ff 1000000;loady 0x82000000ZMD-PROGRAMMING-FLASH.binl;sf erase 0 1000000;sf writ

e 82000000 0 1000000"

 

2、  然后在u-boot-2010.06/common目录下的evn_common.c里面添加如下代码:

 

#ifdef CONFIG_BURNBL       /* Burn bootloader image to SPIflash*/

    "bbl=" CONFIG_BURNBL "\0"

#endif             

#ifdef CONFIG_BURNKERNEL    /* Burn kernel image to SPIflash*/

    "blx="CONFIG_BURNKERNEL   "\0"

#endif

#ifdef CONFIG_BURN_APP       /* Burn APP image to SPIflash*/

    "bapp= "CONFIG_BURN_APP  "\0"

#endif

#ifdef CONFIG_BURN_FLASH    /* Burn Flash APP image to SPIflash*/                                                                   

    "bfl="CONFIG_BURN_FLASH  "\0"                

#endif

 

3、  重新编译uboot,并烧录到单板,用printenv或pri可以看到已定义的环境变量:

hisilicon # pr

bootargs=mem=96M console=ttyAMA0,115200root=1f01 rootfstype=cramfsmtdparts=hi_sfc:512K(boot),4M(romfs),10M(app),1536K(config)

bootcmd=sf probe 0;sf read 86000000 500000x1B6B2;decjpg;setvobg  0 0x00;stopvo0;startvo 0 4 15;startvo 0 32 15;startgx 0 0x86000000 2560 0 0 1280 1024;sfread 0x84000000 0x80000 0x400000;cramfsload;bootm 0x82000000

bootdelay=1

baudrate=115200

ethaddr=00:00:23:34:45:66

ipaddr=192.168.28.110

jpeg_addr=0x86000000

jpeg_size=0x1b6b2

vobuf=0x86000000

cramfsaddr=0x84000000

cramfsldaddr=0x82000000

serverip=192.168.28.100

netmask=255.255.255.0

bootfile=/boot/hikernel

bbl=sf probe 0;mw.b82000000 ff 80000;loady 0x82000000 uboot_logo.bin;sf erase 0 80000;sf write82000000 0 80000

blx=sf probe 0;mw.b82000000 ff 480000;loady 82000000 root_cramfs.img;sf erase 80000 0x480000;sfwrite 82000000 80000 480000

bapp= sf probe 0;mw.b82000000 ff 0xa00000;loady 82000000 app_jffs2.img;sf erase 500000 0xa00000;sfwrite 82000000 500000 0xa00000

bfl=sf probe 0;mw.b82000000 ff 1000000;loady 0x82000000 ZMD-PROGRAMMING-FLASH.binl;sf erase 01000000;sf write 82000000 0 1000000

stdin=serial

stdout=serial

stderr=serial

verify=n

ver=U-Boot 2010.06 (Nov 11 2014 - 21:27:51)

filesize=379EC

 

Environment size: 1202/65532 bytes

 

二、            在uboot里面添加run命令

1、  在u-boot-2010.06/common目录下添加一个文件cmd_run.c,代码如下:

/*********************************************************************************                                                  

 *     Copyright:  (C) 2014 YangZheng<yz2012ww@gmail.com> 

 *                  All rights reserved.

 *

 *      Filename:  cmd_run.c

 *   Description:  This file

 *                

 *       Version:  1.0.0(11/11/2014~)

 *        Author:  Yang Zheng<yz2012ww@gmail.com>

 *     ChangeLog:  1, Release initialversion on "11/11/2014 09:05:08 PM"

 *                

 ********************************************************************************/

#include <common.h>

#include <watchdog.h>

#include <command.h>

#include <image.h>

#include <malloc.h>

#include <u-boot/zlib.h>

#include <bzlib.h>

#include <environment.h>

#include <lmb.h>

#include <linux/ctype.h>

#include <asm/byteorder.h>

 

int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char **argv)

   if (argc < 2)

   {

       cmd_usage(cmdtp);

       return 1;

   }

   if (run_command (getenv (argv[1]), flag)< 0)

    {

       return -1;

    }

 

   return 0;

}

U_BOOT_CMD(

   boot,   1,  1, do_run

   "boot default, i.e., run 'bootcmd'",

   ""

);  

 

2、  然后在u-boot-2010.06/include/configs目录的xxx.h(xxx是board,如hi3520d.h)里面添加如下宏定义:

#define CONFIG_CMD_RUN

3、在u-boot-2010.06/common目录的Makefile中添加如下代码:

COBJS-$(CONFIG_CMD_RUN) += cmd_run.o

4、  重新编译uboot,并烧录到单板

 

三、            运行

hisilicon # run bbl

16384 KiB hi_sfc at 0:0 is now current device

## Ready for binary (ymodem) download to0x82000000 at 115200 bps...

C

 

<think>好的,用户想了解U-Boot环境变量的配置和使用示例。首先,我需要回忆一下U-Boot的基本知识,环境变量在U-Boot中的作用,以及如何操作它们。根据用户提供的引用内容,环境变量存储在flash中,默认值来自源代码,用户可以通过命令进行设置和保存。 首先,我应该解释什么是U-Boot环境变量,它们的作用是什么。然后,详细说明如何查看、设置、保存环境变量,并提供一些常见的使用示例,比如设置网络参数或启动命令。需要确保步骤清晰,命令正确,并且符合用户的实际操作需求。 用户可能想知道具体的命令语法,比如printenv、setenv、saveenv的使用方法。还要注意环境变量的优先级,当变量为空时使用默认值,否则使用用户设置的值。可能需要提到一些常见变量,如serverip、ipaddr、ethaddr、bootcmd和bootargs,这些在引用中都有涉及。 另外,用户可能需要示例来更好地理解,比如设置serverip的步骤,或者配置启动参数。需要确保示例准确,并且命令格式正确。同时,要注意用户可能的错误,比如忘记保存环境变量,导致重启后配置丢失,所以需要强调saveenv的重要性。 还要考虑用户可能遇到的问题,比如如何恢复默认设置,或者处理环境变量存储损坏的情况。可以简要提到这些情况,但主要焦点还是放在配置和使用示例上。 最后,根据用户的要求生成相关问题,这些问题应该与U-Boot环境变量的高级配置、存储位置、调试方法等相关,帮助用户进一步学习。</think>### U-Boot 环境变量的配置与使用详解 U-Boot 环境变量是嵌入式系统启动过程中用于存储配置参数的关键机制,其优先级规则为:若变量值为空则使用代码默认值,若已设置则优先使用用户定义值[^1]。以下从基础操作到典型场景逐步说明: #### 一、环境变量基础操作 1. **查看所有环境变量** ```bash => printenv baudrate=115200 bootcmd=run distro_bootcmd serverip=192.168.1.100 # 未设置时使用默认值 ``` 通过该命令可验证当前生效的变量值[^3]。 2. **设置/修改变量** ```bash => setenv serverip 192.168.1.100 => setenv bootdelay 3 # 修改启动等待时间 ``` 变量修改后仅在内存中生效,需执行保存操作才能持久化[^1]。 3. **保存到存储设备** ```bash => saveenv Saving Environment to SPI Flash... OK ``` 该操作将当前环境变量写入NOR Flash或eMMC等存储介质。 #### 二、典型配置场景示例 1. **网络参数配置** ```bash => setenv ipaddr 192.168.1.50 # 设备IP => setenv serverip 192.168.1.100 # TFTP服务器IP => setenv netmask 255.255.255.0 => saveenv ``` 这些参数直接影响`tftp`命令下载内核镜像等网络操作[^2]。 2. **MAC地址设置** ```bash => setenv ethaddr 00:0a:35:12:34:56 => saveenv ``` 注意:MAC地址首次设置后不可修改,需清除环境变量分区才能重置[^2]。 3. **自定义启动流程** ```bash => setenv bootcmd 'tftp 0x82000000 zImage; bootm 0x82000000' => setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 => saveenv ``` `bootcmd`定义自动执行的启动命令,`bootargs`向内核传递参数[^2]。 #### 三、高级操作技巧 1. **多环境备份机制** 修改`envsize`和`envnumber`实现多份环境备份: ```bash => setenv envsize 0x20000 # 单个环境区大小 => setenv envnumber 2 # 双备份配置 => saveenv ``` 2. **环境变量恢复** ```bash => env default -f # 恢复所有默认值 => saveenv # 清除自定义设置 ``` 3. **脚本化配置** 通过`;`分隔多个命令实现批量配置: ```bash => setenv init_cmd 'setenv ipaddr 192.168.1.10; setenv serverip 192.168.1.100; saveenv' => run init_cmd ``` #### 四、调试与验证 1. **变量值有效性检查** ```bash => env info env_valid = valid env_ready = true env_use_default = false ``` 该命令显示环境变量存储状态[^3]。 2. **Android系统读取验证** 通过`envtool`工具验证变量是否传递到系统层: ```bash # envtool r factory_test ubootenv init successful.(0) on ``` 这确认了U-Boot环境变量与Android系统的集成效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值