uboot开发阶段系统的部署和 产品阶段系统的部署和启动的步骤

本文详细描述了STM32MP157A开发板在3.3和4.4产品阶段的系统部署和启动流程,包括uImage和dtb文件的部署,bootargs设置,以及自启动方式的配置,涉及TFTP传输,MMC操作,和NFS挂载等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  1. bootargs环境变量的作用?
    u-boot在加载内核启动内核时,需要通过bootargs环境变量给内核传递启动的参数,
    参数中包含:根文件系统的挂载方式,使用的哪个串口及串口的波特率等。

  2. 设置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
  1. 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》设置开发板的启动方式为自启动的方式

  1. u-boot的工作模式?
    u-boot有两种工作模式:自启动模式,交互模式

  2. 交互模式
    开发板上电之后,在u-boot的倒计时减到0之前,按下电脑键盘的任意键,
    就可以进入到u-boot的交互模式,此时可以输入u-boot命令和u-boot进行交互。
    比如ARM裸机开发中使用的loadb和go命令。

  3. 自启动模式
    开发板上电之后,在u-boot的倒计时减到0之前,不要按下电脑键盘的任意键,
    就可以进入到u-boot的自启动模式,此时u-boot会自动的执行bootcmd环境变量
    中的u-boot命令。

  4. bootcmd环境变量
    自启动的命令的环境变量,当进入到自启动模式时,
    自动执行bootcmd环境变量中的命令。

  5. bootcmd环境变量的格式
    bootcmd=u-boot命令1;u-boot命令2;u-boot命令3;…

  6. 设置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;…”

  7. 设置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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值