时间:2018.3.17 作者:Tom 工作:HWE 说明:如需转载,请注明出处。
说明:本文主要参考朱有鹏老师linux嵌入式,已注明转载。
Uboot命令行的行缓冲:
1)行缓冲的意思就是:当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认为我们还没有输入完),当我们按下回车键(换行)后系统就认为我们输入完了,然后将缓冲区中所有刚才输入的作为命令拿去分析处理。
2)linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲
没有提到的命令,请到这个博客中,比较全:http://blog.csdn.net/qq_29350001/article/details/50888277。
1.命令1:help或?功能:查看当前uboot版本中支持的所有命令。
一般情况下我们拿到板子,刷了uboot,首先要看下当前uboot版本中支持的所有命令。Help或者?功能:查看当前uboot版本中支持的所有命令。
需要注意的是:uboot命令行输入一个命令之后回车执行指令,再回车打印结果一直是执行这个命令,如果想停掉必须按ctrl+C停止当前指令的再次输入。
如果你想获取某条命令的更详细的帮助,可以使用:
help <你想要查的指令>
或者 ? <你想要查的指令> ,
甚至 h <你想要查的指令缩写>。
2.命令2:version或者v。功能:查看当前uboot版本号。
3.printenv或者print。功能:打印出系统中所有的环境变量。
环境变量就好像程序的全局变量一样。程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用),环境变量和全局变量不同之处在于:全局变量的生命周期是在程序的一次运行当中,开始运行时诞生程序结束时死亡,下次运行程序时从头开始;但是环境变量被存储在Flash的另一块专门区域(Flash上有一个环境变量分区),一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改保存后的值。
4.setenv或者set。功能:设置或者更改环境变量。
用法:set name value
5.saveenv或者save。功能:保存环境变量。
saveenv/save命令不带参数,直接执行,作用是将内存中的环境变量的值同步保存到Flash中环境变量的分区。注意:环境变量的保存是整体的覆盖保存,也就是说内存中所有的环境变量都会整体的将Flash中环境变量分区中原来的内容整体覆盖。
总结:彻底更改一个环境变量的值,需要2步:第一步set命令来更改内存中的环境变量,第二步用save命令将其同步到Flash中环境变量的分区。
6.uboot命令行删除环境变量
方法还是使用setenv或者set。
setenv name value
第1个参数是环境变量的名称。
第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量
7.网络测试命令ping。功能:ping是测试开发板和主机之间的网络链接。
网段的概念:一个IP地址分为2部分,一部分是网段地址,另一部分是网段内的主机地址(由子网掩码来区分哪一部分是网段地址,哪一部分是IP地址)。在子网掩码是255.255.255.0的情况下,192.168.1.88这个IP地址的前三部分(192.168.1.)属于网段地址,第4部分(10)属于主机地址。
这个是什么意思?意思就是用子网掩码与ip转换成2进制进行位与,结果再转换成十进制,结果就是网段。剩下的就是主机地址的选择范围。
8.tftp。功能:将内核镜像从主机中下载过来然后烧录到本地flash中。
需要注意的是:使用tftp功能,必须是uboot有这个功能,有的板子是没有这个功能的。其次必须配置服务器的ip地址,例如上述打印中可以看出服务器的ip地址为:192.168.1.101。
下面是一些说明:
1)uboot本身主要目标是启动内核,为了完成启动内核必须要能够部署内核,uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中。uboot如何从主机(windows或者虚拟机ubuntu)下载镜像到开发板上?有很多种方式,主流方式是:fastboot和tftp。
fastboot的方式是通过USB线进行数据传输。
tftp的方式是通过有线网络的。典型的方式就是通过网络,fastboot是近些年才新发展的。
2)tftp方式下载时实际上uboot扮演的是tftp客户端程序角色,主机windows或虚拟机ubuntu中必须有一个tftp服务器,然后将要下载的镜像文件放在服务器的下载目录中,然后开发板中使用uboot的tftp命令去下载即可。
3)有些人习惯在windows中搭建tftp服务器,一般是用一些软件来搭建(譬如tftpd32,使用起来比较简单);有些人习惯在linux下搭建tftp服务器,可以参考网盘中的虚拟机下载目录下的一个教程《嵌入式开发环境搭建-基于14.04.pdf》,这里面有ubuntu中搭建tftp服务器的教程,也可以自己上网搜索教程尝试。(如果你直接就用我的虚拟机,那就已经搭建好了,不用再搭建了;如果是自己新装的那就参考文档搭建;如果你的版本和我的不一样那搭建过程可能不一样)
4)我的虚拟机搭建的时候设置的tftp下载目录是/tftpboot,将要被下载的镜像复制到这个目录下。
5)检查开发板uboot的环境变量,注意serverip必须设置为虚拟机ubuntu的ip地址。(serverip这个环境变量的意义就是主机tftp服务器的ip地址)
6)然后在开发板的uboot下先ping通虚拟机ubuntu,然后再尝试下载:tftp 0x30000000 zImage-qt(意思是将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址处。)
7)镜像下载到开发板的DDR中后,uboot就可以用movi指令进行镜像的烧写了。
9.bootm、go。功能:启动内核。
1)uboot的终极目标就是启动内核,启动内核在uboot中表现为一个指令,uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。
2)差别:bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm其实才是正宗的启动内核的命令,一般情况下都用这个;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已。go命令可以用来在uboot中执行任何的裸机程序(有一种调试裸机程序的方法就是事先启动uboot,然后在uboot中去下载裸机程序,用go命令去执行裸机程序)
10.movi、mmc。功能: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都一样)。
11.mm、mw、md。功能:内存操作指令。
1)DDR中是没有分区的(只听说过对硬盘、Flash进行分区,没听说过对内存进行分区••••),但是内存使用时要注意,千万不能越界踩到别人了。因为uboot是一个裸机程序,不像操作系统会由系统整体管理所有内存,系统负责分配和管理,系统会保证内存不会随便越界。然后裸机程序中uboot并不管理所有内存,内存是散的随便用的,所以如果程序员(使用uboot的人)自己不注意就可能出现自己把自己的数据给覆盖了。(所以你思考下我们为什么把uboot放在23E00000地址处?)
nm 修改内存值 (指定地址)
格式: nm [.b, .w, .l] address
mm 修改内存值(地址自动加一)
格式: mm [.b, .w, .l] address
md 显示内存值
格式: md [.b, .w, .l] address [# of objects]
mw 用指定的数据填充内存
格式: mw [.b, .w, .l] address value [count]
cp 内存的拷贝(包括内存与Nor Flash间的数据拷贝)
格式:cp [.b, .w, .l] source target count
上面是查看和修改内存值的指令,可以查看和修改SDRAM和寄存器值。
[.b, .w, .l]代表了查看和修改形式:bit、word、long
mw [内存地址] [值] [长度]
例如:
mw 0x30008000 0 128
表示修改地址为0x02000000~0x02000000+128的内存值为0.
//-----------------------------------------------------------------------
显示:
md [内存地址] [长度]
例如:
md 0x30008000 10
表示显示0x30008000的内存数据,长度为10个32bit.
12.NandFlash操作指令nand。功能:nand存储操作指令。
理解方法和操作方法完全类似于movi指令。
13.reset。功能:重启CPU。