3.3 开发阶段系统的部署和启动的流程的步骤
1》拷贝uImage和stm32mp157a-fsmp1a.dtb文件到ubuntu的~/tftpboot目录下
命令:略
2》使用tftp命令下载uImage到开发板的内存中
FSMP1A> tftp 0xc2000000 uImage
注:只能将uImage下载的内存地址为0xc2000000
3》使用tftp命令下载stm32mp157a-fsmp1a.dtb文件到开发板的内存中
FSMP1A> tftp 0xc4000000 stm32mp157a-fsmp1a.dtb
4》设置u-boot中的自启动参数的环境变量bootargs
-
bootargs环境变量的作用?
u-boot在加载内核启动内核时,需要通过bootargs环境变量给内核传递启动的参数,
参数中包含:根文件系统的挂载方式,使用的哪个串口及串口的波特率等。 -
设置u-boot中的bootargs环境变量?
FSMP1A> setenv bootargs root=/dev/nfs nfsroot=192.168.5.250:/home/linux/rootfs,tcp,v4 rw console=ttySTM0,115200 init=/linuxrc ip=192.168.5.222
FSMP1A> saveenv
- bootargs环境变量的解析
root=/dev/nfs ---> 使用根文件系统的类型,NFS网络文件系统
nfsroot=192.168.5.250:/home/linux/rootfs,
---> 根文件系统的服务器的IP地址及路径,
需要需改为自己服务器的IP地址和路径
tcp,v4 ---> 基于TCP协议,V4版本
rw ---> 可读可写权限
console=ttySTM0,115200 ---> linux内核使用的串口及串口的波特率
init=/linuxrc ---> linux内核挂载根文件系统之后,运行的第一个进程
ip=192.168.5.222 ---> 开发板的IP地址,需改为自己的开发板的IP地址
5》启动linux系统
FSMP1A> bootm 0xc2000000 - 0xc4000000
| | | |---> linux内核的设备数的加载地址
| | |---> 占位符,前后必须有空格
| |---> linux内核的加载地址
|---> 启动linux内核的命令
linux内核启动成功之后,如下图所示:
image-20230923115048694
6》设置开发板的启动方式为自启动的方式
-
u-boot的工作模式?
u-boot有两种工作模式:自启动模式,交互模式 -
交互模式
开发板上电之后,在u-boot的倒计时减到0之前,按下电脑键盘的任意键,
就可以进入到u-boot的交互模式,此时可以输入u-boot命令和u-boot进行交互。
比如ARM裸机开发中使用的loadb和go命令。 -
自启动模式
开发板上电之后,在u-boot的倒计时减到0之前,不要按下电脑键盘的任意键,
就可以进入到u-boot的自启动模式,此时u-boot会自动的执行bootcmd环境变量
中的u-boot命令。 -
bootcmd环境变量
自启动的命令的环境变量,当进入到自启动模式时,
自动执行bootcmd环境变量中的命令。 -
bootcmd环境变量的格式
bootcmd=u-boot命令1;u-boot命令2;u-boot命令3;… -
设置bootcmd环境变量的格式
FSMP1A> setenv bootcmd u-boot命令1;u-boot命令2;u-boot命令3;…或者:
FSMP1A> setenv bootcmd “u-boot命令1;u-boot命令2;u-boot命令3;…”
-
设置bootcmd环境变量,让开发板可以自动启动linux系统
FSMP1A> setenv bootcmd tftp 0xc2000000 uImage;tftp 0xc4000000 stm32mp157a-fsmp1a.dtb;bootm 0xc2000000 - 0xc4000000
FSMP1A> saveenv设置完成之后,给开发板重新上电。
问题1:tftp下载不成功的可能原因,(前提:使用ping命令测试网络可以通)1> 如果开发板和ubuntu之间网络都无法ping通,先检查网络不同的可能原因
2> 如果不是网络的问题,可以重新tftp服务
sudo service tftpd-hpa restart
问题2:nfs挂载根文件系统不成功1> 检查bootargs参数,查看服务器的IP地址或者根文件系统的路径是否正确
2> 尝试重启nfs服务
sudo service nfs-kernel-server restart
4.4 产品阶段系统的部署和启动的步骤
1》拷贝uImage, stm32mp157a-fsmp1a.dtb和ramdisk.img文件到~/tftpboot目录下略
2》部署uImage镜像文件到TF卡中FSMP1A> mmc dev 0 —> 选择tf卡作为当前的存储设备
FSMP1A> tftp 0xc2000000 uImage —> 下载uImage到内存中
FSMP1A> mmc erase 0x2000 0x4000 —> 擦除tf卡中的数据
FSMP1A> mmc write 0xc2000000 0x2000 0x4000 —>将内存中的uImage写到tf卡中问题1:为什么从0x2000块开始写?
分区编号 起始块号 结束块号 分区名字
4 0x00001422 0x00021421 “bootfs”只要起始块号大于0x1422即可。
问题2:为什么要写0x4000块?
Bytes transferred = 7497520 (726730 hex)只要搬移的块数大于(7497520 / 512 = 14643 = 0x3933)
3》部署stm32mp157a-fsmp1a.dtb文件到tf卡中
FSMP1A> mmc dev 0 ---> 选择tf卡作为当前的存储设备,
如果没有重新上电可以省略此命令
FSMP1A> tftp 0xc2000000 stm32mp157a-fsmp1a.dtb
FSMP1A> mmc erase 0x10000 0x200
FSMP1A> mmc write 0xc2000000 0x10000 0x200
问题1:为什么从0x10000块开始写?
分区编号 起始块号 结束块号 分区名字
4 0x00001422 0x00021421 "bootfs"
只要起始块号大于(0x2000 + 0x4000)即可。
问题2:为什么要写0x200块?
Bytes transferred = 76186 (1299a hex)
只要搬移的块数大于(76186 / 512 = 0x94)
4》部署ramdisk.img镜像文件到TF卡中
FSMP1A> mmc dev 0 ---> 选择tf卡作为当前的存储设备,
如果没有重新上电可以省略此命令
FSMP1A> tftp 0xc2000000 ramdisk.img
FSMP1A> mmc erase 0x21500 0x21500
FSMP1A> mmc write 0xc2000000 0x21500 0x21500
问题1:为什么从0x21500块开始写?
分区编号 起始块号 结束块号 分区名字
5 0x00021422 0x0075ffde "rootfs"
只要起始块号大于(0x21422)即可。
问题2:为什么要写0x21500块?
Bytes transferred = 16345960 (f96b68 hex)
只要搬移的块数大于(16345960 / 512 = 0x7CB5)
5》设置bootargs自启动的参数
FSMP1A> setenv bootargs root=/dev/ram console=ttySTM0,115200 initrd=0xc5000040,0x1000000 rw init=/linuxrc rootfstype=ext4
FSMP1A> saveenv
解释:
root=/dev/ram ---> 使用ram类型的文件系统
console=ttySTM0,115200 ---> 使用哪个串口及串口的波特率
initrd=0xc5000040,0x1000000 ---> 根文件系统的加载地址,根文件系统的大小
---> 0xC5000000 + 0x40 : 跳过ramdisk.img的64字节的文件头
rw ---> 可读可写的权限
init=/linuxrc :系统启动之后运行的第一个程序
rootfstype=ext4 : 根文件系统的类型
6》启动开发板的linux系统
FSMP1A> mmc dev 0
FSMP1A> mmc read 0xc2000000 0x2000 0x4000
FSMP1A> mmc read 0xc4000000 0x10000 0x200
FSMP1A> mmc read 0xc5000000 0x21500 0x21500
FSMP1A> bootm 0xc2000000 0xc5000000 0xc4000000
| | |---> 内核设备树的加载地址
| |---> 根文件系统的加载地址
|---> linux内核的加载地址
7》设置开发板的启动方式为自启动的方式
设置bootcmd自启动的环境变量:
FSMP1A> setenv bootcmd "mmc dev 0;mmc read 0xc2000000 0x2000 0x4000;mmc read 0xc4000000 0x10000 0x200;mmc read 0xc5000000 0x21500 0x21500;bootm 0xc2000000 0xc5000000 0xc4000000"
FSMP1A> saveenv