背景

基本上,本文转载自:《ARM板移植Linux系统启动(五)Uboot命令行》

上次说到uboot的启动方式,最后会使用autoboot(自主模式)尝试引导kernel,如果失败或者被手动取消,则进入uboot的命令行(下载模式)。

最新的uboot命令行已经发展得比较完善,很大程度上接近shell,包含了各种基本的驱动和完整的工具。这些工具的源码大多在u-boot/cmd下,查看Makefile可以看到,根据不同的配置编译出很多命令,你也可以通过搜索字符串U_BOOT_CMD(来查找这些命令的命名。这些命令的列表可以通过命令行输入help来查看,大致分成几个大类。

Boot

以boot开头的命令,围绕引导kernel的启动过程,有boot, bootm, bootz, bootefi, bootp等等。这其中boot和bootd只是重复调用了autoboot的过程,适用于手动设置参数后启动的情况;其他的boot命令,则适用于不同kernel镜像数据来源。

bootm, bootz, booti

这几个都是从内存中的某个地址获得kernel image。bootz是启动zImage,而bootm和booti是启动uImage,其中booti专门用来启动ARM64的kernel image。

它们的基本语法是:bootX ,这里的address都是指内存的物理地址,需要提前把image和file加载到内存中,其中根文件系统的地址可以省略(包含在kernel image中),用-来代替。

在常规的启动引导过程中,uboot的各种启动方式实际上最后都是调用bootz的,但之前会设置很多环境变量作为启动的参数。在调试过程中,我们也同样可以手动设置好参数,直接用bootX系列来启动系统。

bootefi, bootp, nboot

这三个命令用于不同来源的kernel image,一个来自efi分区中的启动image,一个来自于网络,一个来自nand flash。它们只是比bootz多了一步加载行为,即将kernel image从某个设备拷贝到内存中,本质上是一样的。类似的命令还有tftpboot, usbboot, dhcp, nfs, rarpboot等。 其他boot系的命令也是大同小异,通过help能够看到对应的说明,需要自己根据情况选择使用。

Env

uboot的环境变量跟shell的很相似,是存放在内存中的一些字符串。一个完整的evn包括名字(name)和值(value),可以通过$XXXX来完成嵌套和调用。它们服务于最后的boot行为,用来定义启动过程中的各种顺序、参数、路径、IP地址等等,你可以通过printenv来查看当前所有的环境变量。

askenv :查询某个变量的值

editenv :修改某个变量的值,一般用于比较value比较长的情况

saveenv:将所有环境变量保存在存储装置中。这个装置可以是nand flash, nor flash, 或者EEPROM,由uboot的源码来定义存储的位置和地址等信息:

if defined(CONFIG_ENV_IS_IN_NAND)
#define CONFIG_ENV_OFFSET 0x001c0000
#define CONFIG_ENV_OFFSET_REDUND 0x001e0000
#define CONFIG_SYS_ENV_SECT_SIZE CONFIG_SYS_NAND_BLOCK_SIZE
#elif !defined(CONFIG_ENV_IS_NOWHERE)
/* Not NAND, SPI, NOR or eMMC env, so put ENV in a file on FAT */
#define CONFIG_ENV_IS_IN_FAT
#define FAT_ENV_INTERFACE "mmc"
#define FAT_ENV_DEVICE_AND_PART "0:1"
#define FAT_ENV_FILE "uboot.env"
#endif/
define CONFIG_ENV_SIZE (128 << 10)

setenv <name> <value> :修改某个变量的值,如果value为空则表示删除这个变量

常用的环境变量

在调试中,特别是网络调试中,环境变量的设置很重要。一般的网络操作包括ping, boot等等都需要事先设定好正确的环境变量。这里列举几个常用的:

baudrate,串口控制台的波特率

netmask,网络掩码

ethaddr,MAC地址

serverip & ipaddr,TFTP服务器端的IP地址以及本地的IP地址

bootfile,默认的启动文件名,在网络启动模式中也是默认的下载文件名

bootargs,传递给Linux内核的启动参数

fdtfile & fdtaddr,dts文件默认文件名以及load的内存地址

外部设备

uboot自带很多外设的驱动,包括USB,MMC,Nand,Nor,GPIO,SPI,MII,I2C……具体的使用帮助可以通过help 来查看。例如USB,在插入U盘的情况下,使用usb start便能看到有partition被检测到,接下来可以通过文件系统的支持来读取和查看U盘上的文件和目录。

文件系统

我使用的这个uboot version为2017.03版本,其中已经包含了对fat, ext(2,3,4), cramfs, cbfs, jffs2, ubifs, yaffs2,zfs, reiserfs等相当多的文件系统支持。这其中用得最多的应该是fat和extX了。

以fat为例,几个最重要的命令如下:

fatinfo :显示某个设备或分区的信息,如fatinfo mmc 0

fatload [bytes]:将某个文件前X byte加载到指定的内存地址中,最后一个参数为空时加载整个文件,如fatload usb 0:1 zImage 0x80000000会把U盘上的zImage拷贝到内存的0x80000000处

fatls [directory] :读取并打印目录中的文件列表,如fatls mmc 1:1会打印mmc1 partition1的根目录文件列表

fatwrite [bytes]:将指定内存开始的X byte保存为文件,如fatwrite mmc 0:1 0x80000000 img 0x1000会将内存0x80000000起始的4K数据保存在emmc0的第一个分区

其他几个不同的文件系统的工具可照葫芦画瓢。

文件系统的支持不但意味着在uboot命令行我们可以手动进行文件的读写,还意味着在启动阶段,uboot可以从支持的文件系统分区中读取相应的数据,也就是说,从一个ext4的partition找到zImage并启动是可行的。这给我们配置启动参数以更大的灵活性和可定制性,从TF等设备启动系统也是基于这样的支持。

获取数据和处理

uboot关于数据的处理都是基于物理地址的,除了source和destination的地址,还有一种长度参数length,表示按照字节、字、长来处理内存数据。其中.b以字节为单位;.w以字为单位;.l以长字为单位。注意tool\中间不能有空格,例如需要直接输入cmp.b XXX XXX XXX

cmp <len> <addr1> <addr2> <count> :比较addr1和add2的长度为count的(基于length计算)数据

cp <len> <src> <dst> <count> :把count个数据从src复制到dst

mw <len> <addr> <vaule> [count]:把addr开始的count个数据设为vaule

md <len> addr count:读取并显示addr开始的数据内容

crc32 addr count res:使用crc32校验addr开始的长度为count的数据,将结果存放在地址res中

从串口获取和发送数据

在调试中经常需要从串口传输少量数据,虽然用起来比较麻烦,但有时也是必须的。跟串口传输相关的几个tool有:

loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)

它们除了传输协议不同,别的都是一样的。一般的调用格式为:loadX <addr> <baudrate>,波特率一般都是115200,addr则是数据加载到的目的内存地址,默认为kernel加载地址,定义在

include/configs/ti_armv7_common.h:#define CONFIG_SYS_LOAD_ADDR 0x82000000

这几个工具的使用,因为是全命令行的,步骤比较多,但网上教程也很多,需要自查即可。

其他命令

其他还有一些普通命令,大多跟shell很像,比如ping, echo, unzip等等。不太常用,也很简单,就不啰嗦了,需要的可以自己用help看看用法。

Uboot 命令行 介绍的更多相关文章

  1. 多版本uboot命令行分析

    1.1.6 经典版本: 1.uboot第二阶段第一个函数void start_armboot (void),一路gd参数设置.设备初始化.控制台初始化.端口初始化,最后到main_loop ()命令行 ...

  2. 【转发】【composer】composer 命令行介绍

    首页 入门 下载 安装包列表 中国镜像 命令行 你已经学会了如何使用命令行界面做一些事情.本章将向你介绍所有可用的命令. 为了从命令行获得帮助信息,请运行 composer 或者 composer l ...

  3. Linux命令行介绍

    一.Linux命令行结尾的提示符有“#”和“$”两种不同的符号,代码如下所示: [root@localhost ~]# ls anaconda-ks.cfg Desktop Documents min ...

  4. U-BOOT 命令的介绍

    U­BOOT 常用命令 通常使用 help(或者只使用问号?),来查看所有的 U­BOOT 命令.将会列出在当前配置下所有支持的命令. 但是我们要注意,尽管 U­BOOT 提供了很多配置选项,并不是所 ...

  5. Windows 常用 CMD 命令行介绍

    看下面的链接: http://www.jianshu.com/p/76ff5d16f113

  6. 记录ok6410 jlink 命令行调试uboot

    1\启动ok6410 进入uboot命令行 2\启动JLinkGDBServer -device ARM11 3\arm-none-eabi-gdb u-boot 初始化脚本 # Connect to ...

  7. uboot下的命令行

    1.典型嵌入式linux系统启动过程: 嵌入式系统上电后先执行uboot.然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就 ...

  8. Git命令行(转用于学习和记录)

    Git命令行介绍和使用说明(持续更新) 参见:<Git 中文简体教程> 一. 命令“git”或者“git help”查询常用命令 [add]: “git add”——不但是用来添加不在版本 ...

  9. 巧用TexturePacker命令行

    游戏开发使用TexturePacker来生成图片的atlas sheet, 工具非常好用. 一般GUI的方法, 新建一个tps文件, 将要图片加载进来,调整参数和输出路径, 最后点publish. 在 ...

随机推荐

  1. 第四节:Vuejs组件及组件之间的交互

    一. 组件及其交互 1.组件的注册 (1).全局注册 Vue.component('组件名称', { }) 第1个参数是标签名称,第2个参数是一个选项对象. 选项参数包括 data:必须是一个func ...

  2. String方法阅读笔记

    String类常用方法 1.int Length(): 参数:无 返回值:调用此方法的字符串的长度(int) 实例: public class Test { public static void ma ...

  3. centos7搭建hadoop2.10完全分布式

    本篇介绍在centos7中大家hadoop2.10完全分布式,首先准备4台机器:1台nn(namenode);3台dn(datanode) IP hostname 进程 192.168.30.141 ...

  4. 「JSOI2014」序列维护

    「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...

  5. Django 学习之Rest Framework 视图集与Routers与扩展功能

    一.视图集使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数 ...

  6. [read -p应用]插拔光模块去检查port present状态

    #!/bin/bash path="/sys/devices/platform/soc/fd880000.i2c-pld/i2c-0/i2c-4/i2c-15/15-0060" a ...

  7. 从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp

    P90 .1-从零构建和部署去中心化投票App-01 P91 .2-从零构建和部署去中心化投票App-02 P92 .3-从零构建和部署去中心化投票App-03 参考博文:http://liyuech ...

  8. @override编译报错

    今天突然遇到一个问题,明明我重写的接口的方法,编译的时候一直报@override is not override a method from superclass,查了一下资料,这个@override ...

  9. 1013 Battle Over Cities (25分) DFS | 并查集

    1013 Battle Over Cities (25分)   It is vitally important to have all the cities connected by highways ...

  10. 夯实Java基础(二十一)——Java反射机制

    1.反射机制概述 Java反射机制是指程序在运行状态中,对于任何一个类,我们都能够知道这个类的所有属性和方法(包括private.protected等).对于任何一个对象,我们都能够对它的属性和方法进 ...