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