(二)ubuntu学习前传—uboot常见命令
1、uboot命令类似于linux行缓冲命令行,当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认为我换没有输入完),当我们按下回车键(换行)后,系统就认为我没问你输入完了,然后将缓冲区中所有刚才输入的命令拿去处理。
2、linux终端设计有3种缓冲机制:
无缓冲(输入一个执行一个);
行缓冲(看回车);
全缓冲(按什么都没用,全部缓存下来,当缓冲区满的时候才处理)
3、有些命令有简化的别名:
(1)比如在uboot命令行环境下printenv命令可以简化为print;
(2)uboot没有自动补全的功能,按table没用,uboot可以简化命令;
(3)我们可以在uboot命令行界面查询命令功能,在命令行输入help 命令,比如:
help printenv 然后按回车
只输入help可将系统内所有所有命令打印出来;
(4)有些命令可以带参数,uboot的每个命令都有特定格式,有些命令不带参数printenv/print;有些命令带可选参数(可以带,也可以不带,执行结果是不同的);有些命令带必须的。参数(比如setenv命令),在uboot终端输入:help setenv 就懂了
(5)命令中的特殊符号(比如单引号):uboot有些命令非常长,为了告诉uboot这个非常长而且中间有好多个空格的东西是给他的一整个参数,所以用这个很长且中间有空格隔开的参数 引出来;
(6)有些命令是一个命令族(比如movi)
命令族意思就是好多命令开头都是用一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同,这就叫一个命令族;同一个命令族中的所有命令都有极大的关联,比如movi开头的命令族都和moviNand(EMMC、iNand)操作有关。
4、第一个命令:printenv/print
(1)print命令不用带参数,作用是打印出系统中所有的环境变量。
(2)环境变量就好像程序的全局变量一样,程序中任何地方都可以根据需要去调用或者更改环境变量(一般都调用),环境变量和全局变量不同之处在于:全局变量的生命周期在程序的一次运行当中,开始运行时诞生程序结束时死亡;但是环境变量被存储在Flah的一块专门区域(Flash上有一个环境变量分区),一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改后保存的值。
5、设置添加/更改环境变量:setenv/set
(1)用法:set name value
例如:set bootdelay 3 //输入print可以看到,bootdelay已经改为3,但是重启linux后,再输入print看到bootdelay又改回去了。这改的是内存里的环境变量,flash里的环境变量没改
6、保存环境变量的更改:saveenv/save
(1)saveenv/save命令不带参数,直接执行,作用是将内存中的环境变量的值同步保存到flash中环境变量的分区。注意:环境变量的保存是整体的覆盖保存,也就是内存中的所有环境变量都会整体的将flash中的环境变量分区中原来的内容全部覆盖。改一个和改几个成本是一样的。
(2)总结:彻底更改一个环境变量的值,需要两步,第一步:set命令更改内存中的环境变量;第二部:用save命令将其同步到flash中环境变量的分区。
(3)有时候我们只是想测试下这个环境变量,不希望影响到下次开机,那就只set不save。这样本次运行的uboot已经起效果了,只不过下次开机还是会恢复到原来的状况。
7、网络测试指令:ping
(1)命令用法:ping IP地址
注意:平时测试开发板与主机之间的网络连接,注意以下步骤:
1:)首先插上网线。
2:)先ping通windows,注意windows有线网卡的ip设置(设置本地连接),设置为192.168.1.10
3:)第三步确认开发板中uboot中几个网络相关的环境变量的值对不对。ethaddr 随便设,netmask(掩码),ipaddr(最重要,当前开发板的IP地址),这个地址必须和主机windwos在同一个网段。在uboot命令行设置开发板IP地址在同一网段,set ipaddr 192.168.1.20
4:)设置好了后开始ping windows ip,ping 192.168.1.10,能ping通说明建立网络连接。
8、tftp下载命令
(1)一般是ubuntu从主机上下载东西的,uboot本身主要的目标是启动内核,为了完成启动内核必须要能够部署内核,uboot要部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中,uboot如何从我们的主机(ubuntu后者windows)?有很多种方式,主流方式是:fastboot和tftpfastboot是通过USB线进行数据传输;tftp是通过有线网络进行数据传输。典型的方式就是通过tftp;fastboot是近些年才推出来的。
(2)tftp方式下载时,实际上uboot扮演的是tftp客户端程序角色,主机windows或虚拟机ubuntu中必须有一个tftp服务器,然后将要下载的镜像文件放在服务器的下载目录中,然后开发板使用ubuntu的tftp命令下载即可。
(3)虚拟机搭建的时候,我们设置tftp下载目录是/tftpboot,将被下载的镜像(zImage-qt)复制到这个目录下。
(4)然后再开发板的uboot下,先ping通我们的ubuntu,然后尝试下载:tftp 0x30000000 zImage-qt(将服务器上名为zImage-qt的文件下载到开发板的0x30000000开始的地址处)我们uboot开发板上IP下载地址从0x30000000到0x50000000,之间的地址都行。
(5)检查开发板的uboot环境变量,注意serverip必须设置为虚拟机ubuntu的ip地址。(serverip这个环境变量的意义就是主机tftp服务器的ip地址)
(6)然后在开发板的uboot环境下先Ping通虚拟机Ubuntu,然后尝试下载:tftp 0x30000000 zImage-qt。
(7)镜像下载到开发板内存DDR中后,uboot就可以用movi指令进行镜像的烧写了。
注意:
1)如果你是用的windows下的tftp服务器,那uboot的serverip就要设置为和windwos下tftp服务器的ip地址一样(windows下的tftp服务器软件设置的时候就有个步骤是让你设置服务器的ip地址,这个ip地址和主机windows必须在一个网段)。
2)整个过程中间环节比较多,实际做的时候可能最后会下载不下来。这时候可能的问题非常多,不要问我,自己对照视频课程讲的思路来排查。(譬如:第一步应该先保证uboot和ubuntu可以ping通;第二步再保证ubuntu中tftp服务器搭建没错;第三步再实现tftp下载。如果第一步有问题参考网络设置部分,第二步有问题(tftp本地测试下载ok,但是开发板就是不行),有一个解决方案就是使用windows下的tftp服务器)
9、SD卡/iNand的操作指令movi
(1)开发板如果用SD卡/EMMC/iNand等作为Flash,则在uboot中操作flash的指令为movi(或mmc)
(2)movi指令是一个命令集,有很多子命令,具体用法可以help movi查看。
(3)movi的指令都是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存。
(4)movi read {u-boot | kernel} {addr} 这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有)
(5)指令有多种用法,譬如 movi read u-boot 0x30000000,意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。(uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样的(uboot的命令行中所有数字都被默认当作十六进制处理,不管你加不加0x都一样)。
10、内存操作指令:mm、mw、md
(1)DDR中是没有分区的(只听说过对硬盘、Flash进行分区,没听说过对内存进行分区····),但是内存使用时要注意,千万不能越界踩到别人了。因为uboot是一个裸机程序,不像操作系统会由系统整体管理所有内存,系统负责分配和管理,系统会保证内存不会随便越界。然后裸机程序中uboot并不管理所有内存,内存是散的随便用的,所以如果程序员(使用uboot的人)自己不注意就可能出现自己把自己的数据给覆盖了。(所以你思考下我们为什么把uboot放在23E00000地址处)
(2)md就是memory display,用来显示内存中的内容。
md.b 30000000 //md.b是以字节为单位显示的
md.w 30000000//md.w是以两个字节为单位显示的
md.l 30000000 //md.l是以四个字节为单位显示的,相当于md 30000000
我们也可以控制显示的字节数
md.b 30000000 10 //这里10是0x10,3000000是0x30000000,显示16个字节
(3)mw就是memory write,将内容写到内存中
(4)mm就是memory modify,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单元的修改内存,用mm最合适)
11、启动内核指令:bootm、go
(1)uboot的终极目标就是启动内核,启动内核在uboot中表现为一个指令,uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。除了重启,没有别的方法恢复到uboot里面了。
(2)差别:bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm其实才是正宗的启动内核的命令,一般情况下都用这个;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已。go命令可以用来在uboot中执行任何的裸机程序(有一种调试裸机程序的方法就是事先启动uboot,然后在uboot中去下载裸机程序,用go命令去执行裸机程序)
12、重启系统:reset
(二)ubuntu学习前传—uboot常见命令的更多相关文章
- (三)ubuntu学习前传—uboot常见环境变量
1.环境变量如何参与程序运行(1)环境变量有2份,一份在Flash中,另一份在DDR中.uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR ...
- (四)ubuntu学习前传—uboot中对Flash和DDR的管理
1.uboot阶段Flash的分区 (1)所谓分区,就是说对Flash进行分块管理.(2)PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮我们管 ...
- 【Linux学习】2.Linux常见命令行
记录学习Linux 系统的相关知识点,欢迎大家拍砖交流,一起成长:QQ:2712192471 作者背景:前端开发工程师 | Python | web安全爱好者 Linux命令行: 系统关机重启 s ...
- VB6.0编程笔记——(2)开发环境准备&学习前导入
工欲善其事必先利其器,着手开始学习写代码之前,我们需要先准备好需要用到的工具.这篇文章会教大家部署好环境,同时会告知前期我们需要知道的一点内容(可以不用特别理解,只要记住用法就行,后续会深入展开介绍) ...
- Caffe学习笔记(二):Caffe前传与反传、损失函数、调优
Caffe学习笔记(二):Caffe前传与反传.损失函数.调优 在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程:损失函数(loss)是学习的驱动 ...
- Linux常见命令(二)
随着Linux应用的扩展许多同学开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力.Li ...
- 【Oracle】曾经的Oracle学习笔记(1-3) 数据库常见用语,常见命令,创建测试表
一.数据库的登录 二.数据库常用语 三.测试表的创建,测试数据初始化 四.常见命令介绍 五.测试 user:jeffreysn:jeffrey user:systemsn:jeffrey 浏览器中输入 ...
- matlab学习笔记8 基本绘图命令-初级二维绘图/交互式绘图
一起来学matlab-matlab学习笔记8 基本绘图命令_5 初级二维绘图/交互式绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
- linux学习:【第2篇】之常见命令
linux之常见命令 创建一个目录 /data mkdir /data ls -l /data/ cd /data/ pwd 相对路径与绝对路径 1.绝对路径 从根开始的路径 /data 2.相对路径 ...
随机推荐
- python day6 面向对象
把一个类变成具体的实例化的过程叫做类 实例化:把一个类变成一个具体对象的过程 __init__ 构造函数,在实例化时初始化数据 __init__方法的第一个参数永远是self,表示创建的实例本身,因 ...
- Y2K Accounting Bug 分类: POJ 2015-06-16 16:55 14人阅读 评论(0) 收藏
Y2K Accounting Bug Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11222 Accepted: 56 ...
- UVa(1658),Admiral,海军上将,拆点,MCMF
题目链接:https://uva.onlinejudge.org/external/16/1658.pdf 题意:求1到N的两条路(不能相交),距离和最小. 分析: 第一次做拆点,有点意思.刚开始一直 ...
- MDK中 use microlib
microlib 与缺省 C 库之间的主要差异是: microlib 不符合 ISO C 库标准. 不支持某些 ISO 特性,并且其他特性具有的功能也较少. microlib 不符合 IEEE 754 ...
- myDatePinker设置开始时间不能大于结束时间
操作时间起: <input type="text" name="startTime" id="startTime" style=& ...
- 如何把drawing图像转换成wpf控件的source
此例以canvas为例 <Canvas> <Image Stretch="Fill" Width="100" Height="10 ...
- 2016年6月28日 星期二 --出埃及记 Exodus 14:25
2016年6月28日 星期二 --出埃及记 Exodus 14:25 He made the wheels of their chariots come off so that they had di ...
- zookeeper系列之四—coordinate
http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html
- Linux各发行版本简介
简介 Linux 主要作为Linux发行版(通常被称为"distro")的一部分而使用.这些发行版由个人,松散组织的团队,以及商业机构和志愿者组织编写.它们通常包括了其他的系统软件 ...
- [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
1 平台 转http://blog.csdn.net/misskissc/article/details/43063419 1.1 硬件 Table 1. 硬件(lscpu) Architecture ...