文章目录

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:格式是固定的

有命令就是不带参数的

譬如printenv / print命令

有些命令带可选的参数

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

有些命令带必须的参数

譬如setenv / set命令

Part4:命令中的特殊符号

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

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

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

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

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

命令族:

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

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

譬如movi开头的命令族都和moviNand(EMMC、iNand)操作有关

Part6:第一个命令

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

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

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

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

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

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

Part7:设置环境变量

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

Part8:保存环境变量的更改

saveenv / save 命令是不带参命令

作用:

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

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

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

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

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

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

Part9:网络测试指令

命令用法: ping [ip地址]

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

首先要插上网线。先试图ping通主机Windows 注意Windows中有线网卡的地址设置(设置本地连接) 设置主机Windows的本地连接IPv4地址为192.168.1.10第三步确认开发板中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)下载镜像到开发板上?

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

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

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

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

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

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

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

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

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

在开发板的uboot下先ping通虚拟机ubuntu 然后再尝试下载:tftp 0x30000000 zImage-qt

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

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

Tips:

如果你是用的Windows下的tftp服务器 那uboot的serverip就要设置为和Windwos下tftp服务器的IP地址一样

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

整个过程中间环节比较多,实际做的时候可能最后会下载不下来 这时候可能的问题非常多,根据上文的思路自行排查

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

Part11:SD卡 / iNand 操作指令

开发板如果用SD卡/EMMC/iNand等作为Flash 则在uboot中操作Flash的指令为movi(或mmc) movi指令是一个命令集,有很多子命令,具体用法可以help movi查看 movi的指令都是movi read和movi write一组的

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

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

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

指令有多种用法 譬如 movi read u-boot 0x30000000 意思就是把iNand中的uboot分区读出到DDR的0x30000000起始的位置处

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命令行中调用这个指令就会启动内核

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

差别:

bootm启动内核同时给内核传参,而go命令启动内核不传参 bootm其实才是正宗的启动内核的命令,一般情况下都用这个 go命令本来不是专为启动内核设计的 go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数 go命令的实质就是PC直接跳转到一个内存地址去运行而已 go命令可以用来在uboot中执行任何的裸机程序

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

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。