u-boot常用命令/环境变量
一、print,set,save
print是printenv的简写。
set是setenv的简写。使用方法为set name value。
save是saveenv的简写。不带参数,直接执行,作用是将内存中的环境变量的值同步保存到Flash中环境变量的分区。
二、ping
最终目的是保证开发板与虚拟机ping通。可以先烧录Linux+QT操作系统,然后再ping。虚拟机必须宣称桥接模式,并且桥接的网卡必须是与开发板相连的网卡。
三、tftp
四、nfs
启动内核命令
五、其他常用指令
1.SD卡/iNand操作指令movi
movi指令是一个命令集,有很多子命令,具体用法可以help movi查看。
movi的指令都是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存。
movi read {u-boot | kernel} {addr} 这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有)
2.NandFlash操作指令nand
3.内存操作指令:mm、mw、md
md就是memory display,用来显示内存中的内容。
mw就是memory write,将内容写到内存中
mm就是memory modify,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单元的修改内存,用mm最合适)
4.启动内核指令:bootm、go
bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm其实才是正宗的启动内核的命令,一般情况下都用这个.
go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已。go命令可以用来在uboot中执行任何的裸机程序(有一种调试裸机程序的方法就是事先启动uboot,然后在uboot中去下载裸机程序,用go命令去执行裸机程序)
六、常用环境变量
1.环境变量参与程序运行
环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份,用户可以用saveenv指令将DDR中的环境变量重新写入Flash中去更新Flash中环境变量。下次开机时又会从Flash中再读一次。
2.自动运行倒数时间:bootdelay
3.网络设置:ipaddr serverip
ipaddr是开发板的本地IP地址
serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
gatewayip是开发板的本地网关地址
netmask是子网掩码
ethaddr是开发板的本地网卡的MAC地址。
3.自动运行命令设置:bootcmd
uboot启动后会开机自动倒数bootdelay秒,如果没有人按下回车打断启动,则uboot会自动执行启动命令来启动内核。
uboot开机自动启动时实际就是在内部执行了bootcmd这个环境变量的值所对应的命令集。
bootcmd=movi read kernel 30008000; bootm 30008000 意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。
4.uboot给kernel传参:bootargs
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
参数 | 意义 |
---|---|
console=ttySAC2,115200 | 控制台使用串口2,波特率115200. |
root=/dev/mmcblk0p2 rw | 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的 |
init=/linuxrc | linux的进程1(init进程)的路径 |
rootfstype=ext3 | 根文件系统的类型是ext3 |
5.新建、更改、删除一个环境变量的方法
新建一个环境变量,使用set var value
更改一个环境变量,使用set var value
删除一个环境变量,使用set var
七、uboot中对Flash和DDR的管理
1.uboot阶段Flash的分区
uboot中无操作系统,为确保空间使用不混杂——出现使用rootfs或者kernel内存区域等情况,所以对flash必须在使用前先进行分区界定。实际上在uboot中和kernel中都有个分区表,分区表就是我们在做系统移植时对Flash的整体管理分配方法。
1.uboot必须从Flash的起始地址开始存放,取决于Soc的启动设计。uboot分区的大小必须保证uboot肯定能放下,一般设计为512KB或者1MB。因为一般uboot肯定不足512KB,所以无论如何都能工作。
2.环境变量的分区一般紧贴着uboot,大小为32kb或者更多。
3.kernel可以紧贴环境变量存放,大小一般为3MB或5MB或其他。
分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。将来在系统部署时和系统代码中的分区方法也必须一样。
uboot阶段DDR的分区
DDR的分区和Flash的分区不同,主要是因为Flash是掉电存在的,而DDR是掉电消失,因此可以说DDR是每次系统运行时才开始部署使用的。
内存的分区主要是在linux内核启动起来之前,linux内核启动后内核的内存管理模块会接管整个内存空间,那时候就不用我们来管了。
注意内存分区关键就在于内存中哪一块用来干什么必须分配好,以避免各个不同功能使用了同一块内存造成的互相冲突。