在uboot中加入cmd_run命令,运行环境变量
在学习uboot的过程中会经常烧录程序,每次都要敲一些下载指令。这样是不是很麻烦,有什么办法能快速的烧写呢。很简单,将需要敲击的指令编译到uboot中,以环境变量的形式存在。但是环境变量很好加,如何运行环境变量呢。这就需要自己加入run指令了。本文旨在简化uboot、Linux内核及文件系统的烧录过程。
本文基于海思的Hi3531的uboot修改,首先在uboot目录下的include/configs/godnet.h中修改加入如下代码,增加烧写的环境变量。
- #define CONFIG_BOOTDELAY 1
- #define CONFIG_BOOTARGS "mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)"
- #define CONFIG_NETMASK 255.255.255.0 /* talk on MY local net */
- #define CONFIG_IPADDR 192.168.0.251 /* static IP I currently own */
- #define CONFIG_SERVERIP 192.168.0.27 /* current IP of tftp server ip */
- #define CONFIG_ETHADDR 00:00:23:34:45:66
- #define CONFIG_BOOTFILE "uImage" /* file to load */
- #define CONFIG_BAUDRATE 115200
- #define CONFIG_UBOOT_BURN "mw.b 82000000 ff 100000;tftp 0x82000000 u-boot-ok.bin;sf probe 0;sf erase 0 100000;sf write 82000000 0 100000"
- #define CONFIG_KERNEL_BURN "mw.b 82000000 ff 400000;tftp 82000000 uImage;sf probe 0;sf erase 100000 400000;sf write 82000000 100000 400000"
- #define CONFIG_ROOT_BURN "mw.b 82000000 ff b00000; tftp 0x82000000 rootfs.jffs2;sf probe 0;sf erase 500000 b00000;sf write 82000000 500000 b00000"
其中,红色部分为加入的指令
CONFIG_UBOOT_BURN为烧写uboot的指令,CONFIG_KERNEL_BURN为烧写内核的指令,CONFIG_ROOT_BURN为烧写根文件系统的指令,具体指令内容不在详述;
还需要在环境变量的文件/common/env_common.c的default_environment数组中加入环境变量的值。具体代码如下:
- uchar default_environment[] = {
- #ifdef CONFIG_BOOTARGS
- "bootargs=" CONFIG_BOOTARGS "\0"
- #endif
- #ifdef CONFIG_BOOTCOMMAND
- "bootcmd=" CONFIG_BOOTCOMMAND "\0"
- #endif
- #ifdef CONFIG_RAMBOOTCOMMAND
- "ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
- #endif
- #ifdef CONFIG_NFSBOOTCOMMAND
- "nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
- #endif
- #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
- "bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
- #endif
- #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
- "baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
- #endif
- #ifdef CONFIG_LOADS_ECHO
- "loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
- #endif
- #ifdef CONFIG_MDIO_INTF
- "mdio_intf=" CONFIG_MDIO_INTF "\0"
- #endif
- #ifdef CONFIG_ETHADDR
- "ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
- #endif
- #ifdef CONFIG_ETH1ADDR
- "eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0"
- #endif
- #ifdef CONFIG_ETH2ADDR
- "eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0"
- #endif
- #ifdef CONFIG_ETH3ADDR
- "eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0"
- #endif
- #ifdef CONFIG_ETH4ADDR
- "eth4addr=" MK_STR(CONFIG_ETH4ADDR) "\0"
- #endif
- #ifdef CONFIG_ETH5ADDR
- "eth5addr=" MK_STR(CONFIG_ETH5ADDR) "\0"
- #endif
- #ifdef CONFIG_IPADDR
- "ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
- #endif
- #ifdef CONFIG_SERVERIP
- "serverip=" MK_STR(CONFIG_SERVERIP) "\0"
- #endif
- #ifdef CONFIG_SYS_AUTOLOAD
- "autoload=" CONFIG_SYS_AUTOLOAD "\0"
- #endif
- #ifdef CONFIG_PREBOOT
- "preboot=" CONFIG_PREBOOT "\0"
- #endif
- #ifdef CONFIG_ROOTPATH
- "rootpath=" MK_STR(CONFIG_ROOTPATH) "\0"
- #endif
- #ifdef CONFIG_GATEWAYIP
- "gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0"
- #endif
- #ifdef CONFIG_NETMASK
- "netmask=" MK_STR(CONFIG_NETMASK) "\0"
- #endif
- #ifdef CONFIG_HOSTNAME
- "hostname=" MK_STR(CONFIG_HOSTNAME) "\0"
- #endif
- #ifdef CONFIG_BOOTFILE
- "bootfile=" MK_STR(CONFIG_BOOTFILE) "\0"
- #endif
- #ifdef CONFIG_LOADADDR
- "loadaddr=" MK_STR(CONFIG_LOADADDR) "\0"
- #endif
- #ifdef CONFIG_CLOCKS_IN_MHZ
- "clocks_in_mhz=1\0"
- #endif
- #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
- "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"
- #endif
- #ifdef CONFIG_UBOOT_BURN
- "uboot_burn=" CONFIG_UBOOT_BURN "\0"
- #endif
- #ifdef CONFIG_KERNEL_BURN
- "kernel_burn=" CONFIG_KERNEL_BURN "\0"
- #endif
- #ifdef CONFIG_ROOT_BURN
- "root_burn=" CONFIG_ROOT_BURN "\0"
- #endif
- #ifdef CONFIG_EXTRA_ENV_SETTINGS
- CONFIG_EXTRA_ENV_SETTINGS
- #endif
- "\0"
- };
上述红色部分为加入的环境变量,其中uboot_burn,kernel_burn,root_burn为环境变量的名称。此后在uboot指令输入界面输入printenv可以看到变量值。
至此,环境变量修改完毕。下面如何在uboot中运行环境变量呢,其实只要能让uboot_burn变量中的内容执行即可。因此需要有一条指令可以运行这个环境变量。此时就需要cmd_run.c参与了。
在学习uboot时,我们知道在/common路径下面有很多以cmd_开头的文件,这些文件即使在uboot中可以运行的指令。但是,需要在配置文件和Makefile中添加支持。
首先我们把cmd_run.c文件创建了,代码如下:
- /*
- * (C) Copyright 2000-2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
- #include <common.h>
- #include <command.h>
- int do_run (cmd_tbl_t * cmdtp, int flag, int argc, charchar *argv[])
- {
- int i;
- if (argc < 2) {
- cmd_usage(cmdtp);
- return 1;
- }
- for (i=1; i<argc; ++i) {
- charchar *arg;
- if ((arg = getenv (argv[i])) == NULL) {
- printf ("## Error: \"%s\" not defined\n", argv[i]);
- return 1;
- }
- #ifndef CONFIG_SYS_HUSH_PARSER
- if (run_command (arg, flag) == -1)
- return 1;
- #else
- if (parse_string_outer(arg,
- FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0)
- return 1;
- #endif
- }
- return 0;
- }
- 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'"
- );
该C文件创建完,放入到common路径下,下面需要修改common路径下的Makefile,在文件中加入COBJS-y += cmd_run.o即可。这是将cmd_run.c加入编译选项中。在如下位置添加红色部分。
- COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o
- COBJS-$(CONFIG_CMD_IDE) += cmd_ide.o
- COBJS-$(CONFIG_CMD_IMMAP) += cmd_immap.o
- COBJS-$(CONFIG_CMD_IRQ) += cmd_irq.o
- COBJS-$(CONFIG_CMD_ITEST) += cmd_itest.o
- COBJS-$(CONFIG_CMD_JFFS2) += cmd_jffs2.o
- COBJS-$(CONFIG_CMD_CRAMFS) += cmd_cramfs.o
- COBJS-$(CONFIG_CMD_LICENSE) += cmd_license.o
- COBJS-y += cmd_load.o
- COBJS-y += cmd_run.o
至此run运行环境变量的方法已经添加完毕,按照正常的流程编译uboot,然后按照正常流程烧写。烧录成功后,在uboot运行指令界面输入run会出现如下界面
- U-Boot 2010.06 (Oct 26 2015 - 10:15:14)
- DRAM: 256 MiB
- NAND: Special Nand id table Version 1.35
- Nand ID: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
- No NAND device found!!!
- 0 MiB
- Check spi flash controller v300. found
- Spi(cs1) ID: 0xEF 0x40 0x18 0x00 0x00 0x00
- Spi(cs1): Block:64KB Chip:16MB Name:"W25Q128BV"
- In: serial
- Out: serial
- Err: serial
- judge ddr init
- user init finish.
- Hit any key to stop autoboot: 0
- hisilicon # run
- run - run commands in an environment variable
- hisilicon #
现在可以去运行刚刚添加的环境变量了,输入:“run uboot_burn”试试吧
在uboot中加入cmd_run命令,运行环境变量的更多相关文章
- Linux中使用export命令设置环境变量
Linux export 命令 2011-08-31 22:36:39| 分类: 命令总结|举报|字号 订阅 功能说明:设置或显示环境变量. ######################## ...
- 00006 - Linux中使用export命令设置环境变量
功能说明:设置或显示环境变量. #################################################################################### ...
- java中获取系统属性以及环境变量
java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...
- node配置运行环境变量;
node express 在开发环境和生产环境运行的代码是不一样的, 通常是先配置好的,在开发环境运行一套代码,在生产环境运行另一套代码, 开发环境 development, 生产环境producti ...
- Maven项目中,系统设置的CLASSPATH环境变量问题
在Maven项目中,系统的CLASSPATH环境变量失效了吗?在用Maven开发登录网站时,servlet-api出现错误,jdbc也出现错误,都是ClassNotFoundException,但这两 ...
- uboot中的mmc命令
一:mmc的命令例如以下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc eras ...
- android uboot中的mmc命令
一:mmc的命令如下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc erase ...
- uboot中的mmc命令(转)
转载地址:https://blog.csdn.net/a624731186/article/details/37700205 一:mmc的命令如下: 1:对mmc读操作 mmc read addr b ...
- 【转】uboot中的mmc命令
转自:https://www.cnblogs.com/yxwkf/p/3855383.html 1:mmcinfo 输入: mmcinfo 显示结果:Manufacturer ID: 45OEM: 1 ...
随机推荐
- OpenCV学习笔记之课后习题练习2-3
3.使用例2-10中的视频捕捉和存储方法,结合例2-5中的doPyrDown()创建一个程序,使其从摄像机读入视频数据并将缩放变换后的彩色图像存入磁盘. 例2-10中所用的方法虽然能正常运行,但却不能 ...
- 一般图的着色 - [Welch Powell法][贪心]
原本这是离散数学的期末作业,因为对图论比较熟悉,就先看了一下图论题: 引用<离散数学(左孝凌版)>(其实就是我们的离散数学课本……): 用韦尔奇·鲍威尔法对图G进行着色,其方法是: a)将 ...
- CCCC L2-005. 集合相似度
https://www.patest.cn/contests/gplt/L2-005 题解:直接set的count函数 坑 :要用容斥原理算两个集合的并,否则超时.(我还以为要打表呢) #includ ...
- Python面向对象:继承和多态
继承与多态简介: 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写. 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的. ...
- mysqli_report
MYSQLI_REPORT_OFF Turns reporting off MYSQLI_REPORT_ERROR Report errors from mysqli function calls M ...
- HTML标签_增加css样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- React-生命周期的相关介绍
1.mounting/组件插入相关 (1)componentWillMount 模板插入前 (2)render 模板插入 (3)componentDidMount 模板插入后 2.Updating/ ...
- 如何批量删除SQL注释?
如何批量删除SQL注释.. 这个,可能是用来干坏事的吧.不过有时候要做一些重构,也还是有用.嘿嘿 使用工具,notepad++,注意要选择正则表达式按钮才行. [1]删除 /* */ /\*{1, ...
- 模仿linux内核定时器代码,用python语言实现定时器
大学无聊的时候看过linux内核的定时器,如今已经想不起来了,也不知道当时有没有看懂,如今想要模仿linux内核的定时器.用python写一个定时器,已经想不起来它的设计原理了.找了一篇blog,li ...
- android 6.0之后动态获取权限
Android 6.0 动态权限申请 1. 概述 Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户.在 Android 6.0 或更高版本对权限 ...