文章目录

  • Part1:类似Linux终端的行缓冲命令
  • Part2:有些命令有简化的别名
  • Part3:有些命令会带参数
  • Part4:命令中的特殊符号
  • Part5:有些命令是一个命令族
  • Part6:第一个命令
  • Part7:设置环境变量
  • Part8:保存环境变量的更改
  • Part9:网络测试指令
  • Part10:tftp下载指令
  • Part11:SD卡 / iNand 操作指令
  • Part12:NandFlash操作指令
  • Part13:内存操作指令
  • Part14:启动内核指令

Part1:类似Linux终端的行缓冲命令

Linux终端设计有三种缓冲机制:无缓冲、行缓冲、全缓冲

行缓冲:

当我们向终端命令行输入命令的时候
这些命令没有立即被系统识别
而是被缓冲到一个缓存区(也就是系统认为我们还没有输入完)
当我们按下回车键(换行)后系统就认为我们输入完了
然后将缓冲区中所有刚才输入的作为命令拿去分析处理


Part2:有些命令有简化的别名

printenv可以简化为print

setenv可以简化为set


Part3:有些命令会带参数

uboot中的每个命令都有事先规定好的各种格式

Tips:格式是固定的

  1. 有命令就是不带参数的

    譬如printenv / print命令

  2. 有些命令带可选的参数

    可以带也可以不带
    当然带不带参数的执行结果是不同的

  3. 有些命令带必须的参数

    譬如setenv / set命令


Part4:命令中的特殊符号

uboot的有些命令带的参数非常长

为了告诉uboot这个非常长而且中间有好多个空格的东西是给它的一个参数

使用单引号''将这个很长且中间由空格隔开的参数引起来

别的符号也许也有,而且有特定的意义
当碰到uboot的命令行有特殊符号时要注意
不是弄错了,而是可能有特别的意义


Part5:有些命令是一个命令族

命令族:

好多个命令开头都是同一个命令关键字,但是后面的参数不一样
这些命令的功能和作用也不同

同一个命令族中所有的命令都有极大的关联:

譬如movi开头的命令族都和moviNandEMMCiNand)操作有关


Part6:第一个命令

printenv / print 命令是不带参命令,作用是打印出系统中所有的环境变量

环境变量就好像程序的全局变量一样

程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用)

环境变量和全局变量不同之处在于:

全局变量的生命周期是在程序的一次运行当中
开始运行时诞生,程序结束时死亡
下一次运行程序时从头开始

环境变量被存储在Flash的另一块专门区域(Flash上有一个环境变量分区)
一旦我们在程序中保存了该环境变量
那么下次开机时该环境变量的值将维持上一次更改保存后的值


Part7:设置环境变量

用法: setenv/set [name] [value]


Part8:保存环境变量的更改

saveenv / save 命令是不带参命令

作用:

将内存中的环境变量的值同步保存到Flash中对应的环境变量的分区

Tips: 环境变量的保存是整体的覆盖保存

也就是说内存中所有的环境变量都会整体的将Flash中环境变量分区中原来的内容覆盖

总结: 彻底的更改一个环境变量的值,需要2

第一步setenv / set命令来更改内存中的环境变量
第二步用saveenv / save命令将其同步到Flash中环境变量的分区

有时候我们只是想测试下这个环境变量,不希望影响到下一次开机
那就只setenv / setsaveenv / save
这样set后当前本次运行的uboot已经起效果了
只不过没save下一次开机还是会恢复到原来的状况


Part9:网络测试指令

命令用法: ping [ip地址]

Tips: ping是测试开发板和主机之间的网络链接,注意以下步骤:

  1. 首先要插上网线。
  2. 先试图ping通主机Windows
    注意Windows中有线网卡的地址设置(设置本地连接)
    设置主机Windows的本地连接IPv4地址为192.168.1.10
  3. 第三步确认开发板中uboot里几个网络相关的环境变量的值对不对
    最重要的是ipaddr(这个环境变量表示当前开发板的IP地址)
    这个地址必须和主机Windows的IP地址在同一个网段。

网段的概念:

一个IP地址分为两部分,一部分是网段的地址
另一部分是网段内的主机地址(由子网掩码来区分哪一部分是网段地址,哪一部分是IP地址

在子网掩码是255.255.255.0的情况下
192.168.1.10这个IP地址的前三部分(192.168.1.)属于网段地址
第四部分(10)属于主机地址


Part10:tftp下载指令

uboot本身主要目标是启动内核,为了完成启动内核必须要能够部署内核

uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地Flash

uboot如何从主机(Windows或虚拟机ubuntu)下载镜像到开发板上?

有很多种方式,主流方式是:fastboottftp
fastboot的方式是通过USB线进行数据传输
tftp的方式是通过有线网络进行数据传输
典型的方式就是通过网络,fastboot是近些年才新发展的

  1. tftp方式下载时,实际上uboot扮演的是tftp客户端程序角色

    主机(Windows或虚拟机ubuntu)中必须有一个tftp服务器
    然后将要下载的镜像文件放在服务器的下载目录中
    然后开发板中使用uboottftp命令去下载即可

    有些人习惯在Linux下搭建tftp服务器

    具体步骤我会单开一篇文章整理,到时会在此处添加备注,也可以自己上网搜索一下

    有些人习惯在Windows中搭建tftp服务器,一般是用一些软件来搭建

    譬如tftpd32,使用起来比较简单

  2. 检查开发板uboot的环境变量,注意serverip必须设置为虚拟机ubuntu的IP地址

    serverip这个环境变量的意义就是主机tftp服务器的IP地址

  3. 在开发板的uboot下先ping通虚拟机ubuntu

    然后再尝试下载:tftp 0x30000000 zImage-qt

    意思是将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址处

  4. 镜像下载到开发板的DDR中后,uboot就可以用movi指令进行镜像的烧写了

Tips:

  1. 如果你是用的Windows下的tftp服务器

    ubootserverip就要设置为和Windwostftp服务器的IP地址一样

    Windows下的tftp服务器软件设置的时候就有个步骤是让你设置服务器的IP地址
    这个IP地址和主机Windows必须在一个网段

  2. 整个过程中间环节比较多,实际做的时候可能最后会下载不下来

    这时候可能的问题非常多,根据上文的思路自行排查

    譬如:
    第一步应该先保证ubootubuntu可以ping
    第二步再保证ubuntutftp服务器搭建没错
    第三步再实现tftp下载


Part11:SD卡 / iNand 操作指令

  1. 开发板如果用SD卡/EMMC/iNand等作为Flash

    则在uboot中操作Flash的指令为movi(或mmc

  2. movi指令是一个命令集,有很多子命令,具体用法可以help movi查看

  3. movi的指令都是movi readmovi write一组的

    movi read用来读取iNandDDR上,movi write用来将DDR中的内容写入iNand
    理解这些指令时一定要注意涉及到的两个个硬件:iNandDDR内存

  4. movi read {u-boot | kernel} {addr}

    这个命令使用了一种通用型的描述方法来描述:
    moviread外面没有任何标记说明每一次使用这个指令都是必选的
    一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一
    中括号[]表示可选参数(可以有也可以没有)

  5. 指令有多种用法

    譬如 movi read u-boot 0x30000000

    意思就是把iNand中的uboot分区读出到DDR0x30000000起始的位置处

    uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名
    uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区

    注意这里的0x30000000也可以直接写作30000000,意思是一样的
    (uboot的命令行中所有数字都被默认当作十六进制处理,不管你加不加0x都一样)


Part12:NandFlash操作指令

nand指令的理解方法和操作方法完全类似于movi指令


Part13:内存操作指令

mm mw md

DDR中是没有分区的

只听说过对硬盘、Flash进行分区,没听说过对内存进行分区……

但是内存使用时要注意,千万不能越界踩到别人了

因为uboot是一个裸机程序
不像操作系统会由系统整体管理所有内存
系统负责分配和管理,系统会保证内存不会随便越界。

然而裸机程序中uboot并不管理所有内存,内存是散的随便用的
所以如果程序员(使用uboot的人)自己不注意就可能出现自己把自己的数据给覆盖了
(所以思考下我们为什么把uboot放在23E00000地址处)

md就是memory display,用来显示内存中的内容

mw就是memory write,将内容写到内存中

mm就是memory modify,修改内存中的某一块,说白了还是写内存

如果需要批量的逐个单元的修改内存,用mm最合适


Part14:启动内核指令

bootm go

uboot的终极目标就是启动内核

启动内核在uboot中表现为一个指令

uboot命令行中调用这个指令就会启动内核

不管成功与否,所以这个指令是一条死路

差别:

  1. bootm启动内核同时给内核传参,而go命令启动内核不传参

  2. bootm其实才是正宗的启动内核的命令,一般情况下都用这个

  3. go命令本来不是专为启动内核设计的
    go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数
    go命令的实质就是PC直接跳转到一个内存地址去运行而已
    go命令可以用来在uboot中执行任何的裸机程序

    有一种调试裸机程序的方法就是事先启动uboot
    然后在uboot中去下载裸机程序,用go命令去执行裸机程序

uboot常用命令(printenv、setenv、movi、saveenv、ping、tftp、nand、mm、mw、md、bootm、go...)相关推荐

  1. uboot和系统移植2(uboot常用命令)

    1.5.uboot的常用命令1 1.5.1.类似linux终端的行缓冲命令行 (1)行缓冲的意思就是:当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认 ...

  2. UBoot常用命令手册

    UBoot常用命令手册 U-Boot还提供了更加详细的命令帮助,可以通过"?"显示支持的命令列表,通过help [CommandName]命令还可以查看每个命令的参数说明. 1.b ...

  3. 史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了

    Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序.这段bootloader程序会先初始化DDR等外设,然后将Linux内核从fla ...

  4. 【Tiny4412】Uboot常用命令

    00. 目录 文章目录 00. 目录 01. Uboot帮助命令 02. md命令 03. mm命令 04. printenv命令 05. setenv命令 06. saveenv命令 07. res ...

  5. uboot常用命令详解 2

    U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,在我编译的U-boot-2009.11中的命令行模式模式下支持"Tab"键的命令补全和命令的历史记录功 ...

  6. uboot常用命令汇总

    目录 前言 1.信息查询命令(bdinfo.printenv.versionn) 2.环境变量操作命令(setenv.saveenv) 3.内存操作指令(md.nm.mm.mw.cp.cmp) 4.网 ...

  7. u-boot常用命令详解(全)(MINI2440)

    U-boot发展到现在,他的命令行模式已经非常接近Linux下的shell了,命令行模式模式下支持"Tab"键的命令补全和命令的历史记录功能.而且如果你输入的命令的前几个字符和别的 ...

  8. linux驱动之系统移植-----uboot常用命令汇总

    信息查询类指令 查询所有支持的命令 : help 查询命令的用法 help <其他命令> 查询板子信息 bdinfo 查看所有环境变量 printenv 查看uboot版本 version ...

  9. linux如何使用uboot的命令,Uboot常用命令使用

    1.前言 Uboot启动后,会进入到一个倒计时,在倒计时结束之前,如果此时我们按下键盘的回车键,将进入到uboot的命令行模式,有点类似Linux系统终端模式,如果没有按下回车键的话,将直接启动Lin ...

最新文章

  1. java api 框架_java常用对象API之集合框架
  2. python使用matplotlib可视化线图(line plot)、并自定义线条的粗细(线条的宽度、 line width in Matplotlib)
  3. 神器 jupyter,终于来了!
  4. python --time()函数
  5. 恒为linux笔试题,硬件工程师面试试题及答案(转)
  6. C#接口中为什么不能像java那样使用static?
  7. VS2010常用快捷键自定义
  8. Java高并发编程详解系列-ThreadGroup介绍
  9. 和县机电工程学校工业机器人_成都机电工程学校专业有哪些
  10. 【javajni】jni入门篇
  11. php爬虫伪造请求头,Nodejs 伪造IP 爬取图片
  12. Matlab中凸优化工具包CVX的安装、注册与使用
  13. java下载excel模板文件
  14. matlab插值函数 外插,02-函数插值--Matlab插值函数
  15. 秋日登洪府滕王阁饯别序
  16. swing-基础Graphics画布
  17. linux lightdm自动登录,设置了XFCE/lightDM启用自动登录,还是需要'点击'登录两字才能进入桌面...
  18. oracle rman备份时间,Oracle RMAN备份还原方案
  19. MBA联考-20101215
  20. C-CF29A Spit Problem

热门文章

  1. Apollo 分布式部署指南
  2. mysql 算时间戳_mysql 时间戳
  3. 爆料,华为重回深圳,深圳第二个硅谷来了-龙华九龙山未来可期
  4. 大家都在这颗红萝卜的驱使下,内卷特别厉害……
  5. Linux partprobe命令详解
  6. 漫画:三分钟了解什么是囚徒困境
  7. cstring越界_[转载]C/C++ 内存操作越界略述
  8. IDS(入侵检测系统)
  9. 5个常用的机器学习python库
  10. 【干货#011】小程序页面滚动实现广告条隐藏