在学习uboot的过程中会经常烧录程序,每次都要敲一些下载指令。这样是不是很麻烦,有什么办法能快速的烧写呢。很简单,将需要敲击的指令编译到uboot中,以环境变量的形式存在。但是环境变量很好加,如何运行环境变量呢。这就需要自己加入run指令了。本文旨在简化uboot、Linux内核及文件系统的烧录过程。

本文基于海思的Hi3531的uboot修改,首先在uboot目录下的include/configs/godnet.h中修改加入如下代码,增加烧写的环境变量。

  1. #define CONFIG_BOOTDELAY    1
  2. #define CONFIG_BOOTARGS "mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)"
  3. #define CONFIG_NETMASK  255.255.255.0       /* talk on MY local net */
  4. #define CONFIG_IPADDR   192.168.0.251        /* static IP I currently own */
  5. #define CONFIG_SERVERIP 192.168.0.27     /* current IP of tftp server ip */
  6. #define CONFIG_ETHADDR  00:00:23:34:45:66
  7. #define CONFIG_BOOTFILE "uImage"        /* file to load */
  8. #define CONFIG_BAUDRATE         115200
  9. #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"
  10. #define CONFIG_KERNEL_BURN "mw.b 82000000 ff 400000;tftp 82000000 uImage;sf probe 0;sf erase 100000 400000;sf write 82000000 100000 400000"
  11. #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数组中加入环境变量的值。具体代码如下:

  1. uchar default_environment[] = {
  2. #ifdef  CONFIG_BOOTARGS
  3. "bootargs=" CONFIG_BOOTARGS         "\0"
  4. #endif
  5. #ifdef  CONFIG_BOOTCOMMAND
  6. "bootcmd="  CONFIG_BOOTCOMMAND      "\0"
  7. #endif
  8. #ifdef  CONFIG_RAMBOOTCOMMAND
  9. "ramboot="  CONFIG_RAMBOOTCOMMAND       "\0"
  10. #endif
  11. #ifdef  CONFIG_NFSBOOTCOMMAND
  12. "nfsboot="  CONFIG_NFSBOOTCOMMAND       "\0"
  13. #endif
  14. #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
  15. "bootdelay="    MK_STR(CONFIG_BOOTDELAY)    "\0"
  16. #endif
  17. #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
  18. "baudrate=" MK_STR(CONFIG_BAUDRATE)     "\0"
  19. #endif
  20. #ifdef  CONFIG_LOADS_ECHO
  21. "loads_echo="   MK_STR(CONFIG_LOADS_ECHO)   "\0"
  22. #endif
  23. #ifdef  CONFIG_MDIO_INTF
  24. "mdio_intf="    CONFIG_MDIO_INTF            "\0"
  25. #endif
  26. #ifdef  CONFIG_ETHADDR
  27. "ethaddr="  MK_STR(CONFIG_ETHADDR)      "\0"
  28. #endif
  29. #ifdef  CONFIG_ETH1ADDR
  30. "eth1addr=" MK_STR(CONFIG_ETH1ADDR)     "\0"
  31. #endif
  32. #ifdef  CONFIG_ETH2ADDR
  33. "eth2addr=" MK_STR(CONFIG_ETH2ADDR)     "\0"
  34. #endif
  35. #ifdef  CONFIG_ETH3ADDR
  36. "eth3addr=" MK_STR(CONFIG_ETH3ADDR)     "\0"
  37. #endif
  38. #ifdef  CONFIG_ETH4ADDR
  39. "eth4addr=" MK_STR(CONFIG_ETH4ADDR)     "\0"
  40. #endif
  41. #ifdef  CONFIG_ETH5ADDR
  42. "eth5addr=" MK_STR(CONFIG_ETH5ADDR)     "\0"
  43. #endif
  44. #ifdef  CONFIG_IPADDR
  45. "ipaddr="   MK_STR(CONFIG_IPADDR)       "\0"
  46. #endif
  47. #ifdef  CONFIG_SERVERIP
  48. "serverip=" MK_STR(CONFIG_SERVERIP)     "\0"
  49. #endif
  50. #ifdef  CONFIG_SYS_AUTOLOAD
  51. "autoload=" CONFIG_SYS_AUTOLOAD         "\0"
  52. #endif
  53. #ifdef  CONFIG_PREBOOT
  54. "preboot="  CONFIG_PREBOOT          "\0"
  55. #endif
  56. #ifdef  CONFIG_ROOTPATH
  57. "rootpath=" MK_STR(CONFIG_ROOTPATH)     "\0"
  58. #endif
  59. #ifdef  CONFIG_GATEWAYIP
  60. "gatewayip="    MK_STR(CONFIG_GATEWAYIP)    "\0"
  61. #endif
  62. #ifdef  CONFIG_NETMASK
  63. "netmask="  MK_STR(CONFIG_NETMASK)      "\0"
  64. #endif
  65. #ifdef  CONFIG_HOSTNAME
  66. "hostname=" MK_STR(CONFIG_HOSTNAME)     "\0"
  67. #endif
  68. #ifdef  CONFIG_BOOTFILE
  69. "bootfile=" MK_STR(CONFIG_BOOTFILE)     "\0"
  70. #endif
  71. #ifdef  CONFIG_LOADADDR
  72. "loadaddr=" MK_STR(CONFIG_LOADADDR)     "\0"
  73. #endif
  74. #ifdef  CONFIG_CLOCKS_IN_MHZ
  75. "clocks_in_mhz=1\0"
  76. #endif
  77. #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
  78. "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY)    "\0"
  79. #endif
  80. #ifdef CONFIG_UBOOT_BURN
  81. "uboot_burn="   CONFIG_UBOOT_BURN           "\0"
  82. #endif
  83. #ifdef CONFIG_KERNEL_BURN
  84. "kernel_burn="  CONFIG_KERNEL_BURN          "\0"
  85. #endif
  86. #ifdef CONFIG_ROOT_BURN
  87. "root_burn="    CONFIG_ROOT_BURN            "\0"
  88. #endif
  89. #ifdef  CONFIG_EXTRA_ENV_SETTINGS
  90. CONFIG_EXTRA_ENV_SETTINGS
  91. #endif
  92. "\0"
  93. };

上述红色部分为加入的环境变量,其中uboot_burn,kernel_burn,root_burn为环境变量的名称。此后在uboot指令输入界面输入printenv可以看到变量值。

至此,环境变量修改完毕。下面如何在uboot中运行环境变量呢,其实只要能让uboot_burn变量中的内容执行即可。因此需要有一条指令可以运行这个环境变量。此时就需要cmd_run.c参与了。

在学习uboot时,我们知道在/common路径下面有很多以cmd_开头的文件,这些文件即使在uboot中可以运行的指令。但是,需要在配置文件和Makefile中添加支持。

首先我们把cmd_run.c文件创建了,代码如下:

  1. /*
  2. * (C) Copyright 2000-2003
  3. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. *
  5. * See file CREDITS for list of people who contributed to this
  6. * project.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21. * MA 02111-1307 USA
  22. */
  23. #include <common.h>
  24. #include <command.h>
  25. int do_run (cmd_tbl_t * cmdtp, int flag, int argc, charchar *argv[])
  26. {
  27. int i;
  28. if (argc < 2) {
  29. cmd_usage(cmdtp);
  30. return 1;
  31. }
  32. for (i=1; i<argc; ++i) {
  33. charchar *arg;
  34. if ((arg = getenv (argv[i])) == NULL) {
  35. printf ("## Error: \"%s\" not defined\n", argv[i]);
  36. return 1;
  37. }
  38. #ifndef CONFIG_SYS_HUSH_PARSER
  39. if (run_command (arg, flag) == -1)
  40. return 1;
  41. #else
  42. if (parse_string_outer(arg,
  43. FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0)
  44. return 1;
  45. #endif
  46. }
  47. return 0;
  48. }
  49. U_BOOT_CMD(
  50. run,    CONFIG_SYS_MAXARGS, 1,  do_run,
  51. "run commands in an environment variable",
  52. "var [...]\n"
  53. "    - run the commands in the environment variable(s) 'var'"
  54. );

该C文件创建完,放入到common路径下,下面需要修改common路径下的Makefile,在文件中加入COBJS-y += cmd_run.o即可。这是将cmd_run.c加入编译选项中。在如下位置添加红色部分。

  1. COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o
  2. COBJS-$(CONFIG_CMD_IDE) += cmd_ide.o
  3. COBJS-$(CONFIG_CMD_IMMAP) += cmd_immap.o
  4. COBJS-$(CONFIG_CMD_IRQ) += cmd_irq.o
  5. COBJS-$(CONFIG_CMD_ITEST) += cmd_itest.o
  6. COBJS-$(CONFIG_CMD_JFFS2) += cmd_jffs2.o
  7. COBJS-$(CONFIG_CMD_CRAMFS) += cmd_cramfs.o
  8. COBJS-$(CONFIG_CMD_LICENSE) += cmd_license.o
  9. COBJS-y += cmd_load.o
  1. COBJS-y += cmd_run.o

至此run运行环境变量的方法已经添加完毕,按照正常的流程编译uboot,然后按照正常流程烧写。烧录成功后,在uboot运行指令界面输入run会出现如下界面

  1. U-Boot 2010.06 (Oct 26 2015 - 10:15:14)
  2. DRAM:  256 MiB
  3. NAND:  Special Nand id table Version 1.35
  4. Nand ID: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  5. No NAND device found!!!
  6. 0 MiB
  7. Check spi flash controller v300. found
  8. Spi(cs1) ID: 0xEF 0x40 0x18 0x00 0x00 0x00
  9. Spi(cs1): Block:64KB Chip:16MB Name:"W25Q128BV"
  10. In:    serial
  11. Out:   serial
  12. Err:   serial
  13. judge ddr init
  14. user init finish.
  15. Hit any key to stop autoboot:  0
  16. hisilicon # run
  17. run - run commands in an environment variable
  18. hisilicon #

现在可以去运行刚刚添加的环境变量了,输入:“run uboot_burn”试试吧

在uboot中加入cmd_run命令,运行环境变量的更多相关文章

  1. Linux中使用export命令设置环境变量

    Linux export 命令 2011-08-31 22:36:39|  分类: 命令总结|举报|字号 订阅     功能说明:设置或显示环境变量. ######################## ...

  2. 00006 - Linux中使用export命令设置环境变量

    功能说明:设置或显示环境变量. #################################################################################### ...

  3. java中获取系统属性以及环境变量

    java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...

  4. node配置运行环境变量;

    node express 在开发环境和生产环境运行的代码是不一样的, 通常是先配置好的,在开发环境运行一套代码,在生产环境运行另一套代码, 开发环境 development, 生产环境producti ...

  5. Maven项目中,系统设置的CLASSPATH环境变量问题

    在Maven项目中,系统的CLASSPATH环境变量失效了吗?在用Maven开发登录网站时,servlet-api出现错误,jdbc也出现错误,都是ClassNotFoundException,但这两 ...

  6. uboot中的mmc命令

    一:mmc的命令例如以下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc eras ...

  7. android uboot中的mmc命令

    一:mmc的命令如下: 1:对mmc读操作 mmc read addr blk# cnt 2:对mmc写操作 mmc write addr blk# cnt 3:对mmc擦除操作 mmc erase ...

  8. uboot中的mmc命令(转)

    转载地址:https://blog.csdn.net/a624731186/article/details/37700205 一:mmc的命令如下: 1:对mmc读操作 mmc read addr b ...

  9. 【转】uboot中的mmc命令

    转自:https://www.cnblogs.com/yxwkf/p/3855383.html 1:mmcinfo 输入: mmcinfo 显示结果:Manufacturer ID: 45OEM: 1 ...

随机推荐

  1. python类中的self参数和cls参数

    1. self表示一个类的实例对象本身.如果用了staticmethod就无视这个self了,就将这个方法当成一个普通的函数使用了. 2. cls表是这个类本身. # 代码为证 class A(obj ...

  2. OpenCV Cut Image via ROI 根据兴趣区域剪裁图片

    我们在使用OpenCV时,有时候需要对现有图片剪裁,比如只需要一个小窗口中的内容,那么我们可以通过OpenCV的兴趣区域 Region of Interest (ROI) 来很轻易的实现,操作也很简单 ...

  3. Oracle体系结构之参数文件管理

    参数文件作用:主要用来记录数据库配置信息,数据库在启动时,需要读取参数文件中关于控制文件的信息,分配内存,打开进程,会话等.数据库启动时第一个读取参数文件. 参数文件分类: 1)pfile:文本文件, ...

  4. Java不同压缩算法的性能比较 程序猿 2015-01-21 本文将会对常用的几个压缩算法的

    Java不同压缩算法的性能比较 程序猿 2015-01-21 本文将会对常用的几个压缩算法的

  5. php之setcookie

    注意在任何发送请求头之前不能有输出,不然会获取不到header头 setcookie(key,value, expires, 'path', domain); 在发送cookie时,会自动把cooki ...

  6. prometheus and collectd and docker

    sudo  docker run --name prometheus -d -v /data/prometheusdata/prometheus.yml:/etc/prometheus/prometh ...

  7. 学习计划 mysql 引擎

    -- 什么是引擎? 按照我现在的勒戒,就可以提供 Mysql 对不同表的处理方式,各有优缺点. 就像名字一样,把我们数据库看成法拉利的话,引擎也就是发送机,有的跑的快,有的距离长....... -- ...

  8. Jmeter之正则

    正则转换网站:http://tool.oschina.net/regex/ 后置处理器,正则表达式提取器,写正则 待匹配文本框:放你的源文件或源代码,正则表达式:也就是你关联的那句匹配结果:根据匹配结 ...

  9. sql server中的日期详解使用(convert)

    转自:http://blog.csdn.net/hehe520347/article/details/48496853 有个字段值例如2012-07-02 00:00:00.000 转化成 2012- ...

  10. 协作工具 discord 和 slack

    discord: https://discordapp.com/ slack: www.slack.com