Uboot常用命令 
Uboot是一款软件,是bootloader的一个子系统
print 打印出uboot的环境变量
变量名=变量值
setenv saveenv 设置环境变量
set只保存在RAM中,saveenv才保存到flash/Nor/Nand
显示DRAM中的内容
md 20008000
(memory display)
网络层ip配置
setenv ipaddr xxx.xxx.xxx.xxx
(要保存)
传输层(tftp传输文件到开发板)
FTP底层是TCP协议,TFTP底层是UDP协议(简单)
uboot没有tcp协议,只有udp协议。使用的是基于udp的文件传输协议tftp
服务机和客服机模式S/C
- windows服务端
直接使用软件tftpd,设置服务端ip和共享文件夹 - 开发板客户端
需要知道服务端地址、端口、任务
服务端地址:通过环境变量取得setenv serverip xxx
端口:tftp端口固定为69
使用tftp 20008000 a.txt
(20008000十六进制的DRAM地址一般200xxx-300xxx)将文件a.txt的内容写到内存中 - linux服务端
32位比较简单,64位默认使用ipv6,端口号也变了,需要设置
32位直接装sudo apt-get install tftpd-hpa
64位,sudo apt-get install tftpd openbsc-xinetd
查看linux服务端是否运行了tftp:netstat -ua
(查看udp相关服务)
修改服务端某个网卡的ip:ifconfig eth1 xxx.xxx.xxx.xxx
nand
nand分块然后分页,先擦后写。
nand [动词] [内存地址] [nandflash内部地址] [搬移大小]
默认16进制
将nand flash中的第5M地址块读1k到ram的21000000中。
2^10=1K
2^20=1M —> 2进制 1000…000(20个0) —>16进制 0x100000
5M=5x1M=5x(0x100000) = 0x500000
nand read 21000000 500000 1024
将nand flash中的第5M地址块读1k到ram的21000000中
nand erase 500000 1024
擦除第5M块的。。。1024会被检测到第几块第几页
nand write 21000000 500000 1024
将ram中的起始21000000地址的1k写到nand flash中的第5M地址块(注意先擦后写)
加载内核(uboot最重要的作用)
通过uboot启动内核
bootm
启动内核,用于启动uImage,常用
go
程序pc指针,将uboot主动权交给内核,启动其他格式文件
内核可执行文件的名字 uImage(包含内核和uboot关联的数据) zImage Image bzImag
e,头格式不一致
内核启动条件
内核启动条件需要 启动参数 和 文件系统
uboot去启动内核,需要借助环境变量bootargs
,以什么样的方式启动,输出控制台是什么。
- 启动参数
setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
root=
启动的根文件系统在哪个设备中
设备信息RAM NFS flash
init=
内核启动后,第一个可执行init进程从哪里来
console=
内核启动时使用什么设备作为控制台(串口最直接) - 文件系统
文件系统可以看作一个执行程序、模块。是内核和用户交互的中介。
文件系统和内核需要介质连接,可以是nand接口、flash数据总线接口、ram总线接口、网络接口。保证内核和文件系统能够相互找得到。
文件系统的烧写
文件系统的部署方法有很多。
- Ramdisk,借助内存,内核指向那里即可
root=/dev/ram
# ram
initrd=0x21000000,8M
# ram初始地址,和文件系统需要的大小(内存基地址0x2000 0000,20008000放内核)
init=/linuxrc
# linux第一个进程
console=ttySAC0
总的需要的步骤:
1.1tftp 20008000 uImage
# 下载uImage到内存地址
1.2tftp 21000000 initrd.img.gz
# 下载文件系统到内存地址
1.3setenv bootargs root=/dev/ram initrd=0x21000000,8M init=/linuxrc console=ttySAC0,115200
# 设置启动参数
1.4bootm 20008000
# 启动内核,内核根据前面的参数加载文件系统
通过以上步骤就可以在开发板上运行linux系统了。 - NFS,借助网络,与服务器连接(调试用)
实际开发中也许flash驱动还没有完成,这时可以把网络文件系统当作root,通过网线把根文件系统挂在到内核。
使用TCP/IP协议,还是C/S架构
2.1 服务端
ubuntu默认不装NFS服务
2.1.1 安装nfs服务
sudo apt-cache search nfs-
# 搜索需要安装的服务,大致结果
sudo apt install nfs-kernel-server
# 安装nfs服务
2.1.2 配置脚本
在目录/etc/exports下,一般配置文件都在/etc下
设置共享路径 哪些主机可以访问(和文件权限)
2.1.3 重启服务
sudo /etc/init.d/nfs-kernel-server restart
重启服务。
设置好共享文件夹之后还需要把根文件系统initrd.img.gz放进去:
(1)首先解压gunzip initrd.img.gz
得到镜像文件initrd.img,
(2)然后将镜像文件挂在到swap交换区路径下,sudo mount -t ext2 initrd.img ./swap/
好像只是为了得到镜像文件的内容
(3)再把文件夹全部复制到共享路径下,注意复制时的命令参数sudo cp -a /home/...../swap/* xxx
将swap文件的所有内容复制到xxx共享路径下。
到此服务端的文件系统准备完成,包括数据都准备好了。
2.2 客户端
让内核找到服务端的具体目录的数据:一般设备文件都在/dev下
所以要设置bootargs,root=/dev/nfs nfsroot=192..168.10.110:/home/xxx
(ip:共享目录)
但是内核启动起来之后uboot就丧失主动权了,这样内核就处于无ip状态,所以还需要设置一个ip,ip=192.168.10.112
完整设置setenv bootargs root=/dev/nfs nfsroot=192.168.10.110:/home/xxx ip=192.168.10.112 init=/linuxrc console=ttySAC0,115200
# 设置环境变量
saveenv
# 保存设置的环境变量
tftp 20008000 uImage
# 下载uImage到内存
bootm 20008000
# 启动内核,根据环境变量找文件系统等等
让系统启动后自动运行程序需要删除以下两个环境变量:
bootdelay倒计时
bootcmd倒计时后运行什么
系统移植的基本步骤:
uboot设置环境变量,uboot跟内核有数据交互,内核和文件系统有数据交互。