文章目录
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
命令去执行裸机程序