Boot 简介

1. Boot 环境变量
Boot 环境变量是指Boot 运行时的环境变量和引导内核启动的参数配置,通常会在
Flash 划分一块区域来存储Boot 环境变量,即bootargs 分区。
fastboot 启动时会打印出bootargs 分区的位置和大小,如:
Boot Env on eMMC
Env Offset: 0x00100000
Env Size: 0x00010000
miniboot 启动时会打印出bootargs 分区的位置和大小,如:
Env: Load Env from eMMC, start:0x100000, size:0x10000


1.1 Boot 网络配置
配置目标板的MAC地址:
setenv ethaddr xx:xx:xx:xx:xx:xx
配置目标板的IP地址:
setenv ipaddr xxx.xxx.xxx.xxx
配置目标板的子网掩码:
setenv netmask 255.255.xxx.0
配置目标板的网关:
setenv gatewayip xxx.xxx.xxx.xxx
配置目标板tftp 服务器的IP 地址:
setenv serverip xxx.xxx.xxx.xxx
配置完成后使用ping 命令测试目标板的网络环境是否正确。
miniboot 不支持网络,不需要配置。


1.2 bootargs 参数配置
bootargs 是Boot 传给内核的启动参数,其中包含了内存大小、串口、根文件系统和分
区表等配置。
Boot 启动过程中读取目标板的内存大小,选择对应的bootargs 内存配置变量与booargs
变量组合成bootargs 传递给内核。


1.2.1 bootargs 内存配置变量
Boot 支持不同DDR 容量的内存配置,支持bootargs_512M、bootargs_1G、
bootargs_2G、bootargs_768M、bootargs_1536M 等,启动时读取目标板的DDR 容量选
择对应的内存配置。如目标板DDR 容量为1G,则使用bootargs_1G。
bootargs 内存配置变量有如下配置选项:
? mem —— 配置内核可用内存大小,一般配置为DDR 的实际容量,使用安全OS
时配置为DDR 的实际容量减65MB,保留出来的65MB 内存给安全OS 使用。
? mmz —— 从内核可用内存中划分出一段物理上连续的内存,提供给需要使用连
续物理内存的模块使用。
? vmalloc —— 32 位内核时需要指定vmalloc 空间的大小。
bootargs 内存配置变量的配置方法可参考configs\芯片名称\prebuilts\bootargs.txt。


1.2.2 bootargs 变量
bootargs 变量有如下配置选项:
? console —— 配置内核的打印控制台,一般配置为ttyAMA0,115200,表示使用串
口0 作为控制台设备,波特率为115200。
? root —— 指定根文件系统所在的设备。
− UBI 根文件系统时配置为root=ubi0:ubifs ubi.mtd=rootfs;
− mtdparts 分区表中的分区从0 开始编号,设备为/dev/mtdblockX,X 为根文件系
统的分区号;
− blkdevparts 分区表中的分区从1 开始编号,设备为/dev/mmcblk0pX,X 为根文
件系统的分区号。
? rootfstype —— 指定根文件系统的类型,支持ext4、squashfs、cramfs、ubifs、
yaffs2、jffs2。
? rootwait —— 表示等待根文件系统所在的设备就绪后再尝试挂载根文件系统,只
有eMMC Flash 增加此选项。
? Flash 分区表 —— 根据目标板的Flash 类型配置。
− SPI Flash 分区表格式:mtdparts=hi_sfc:size(name),size(name),...
− NAND Flash 分区表格式:mtdparts=hinand:size(name),size(name),...
− 同时使用 SPI Flash 和NAND Flash 的分区表格式:
mtdparts=hi_sfc:size(name),size(name),...;hinand:size(name),size(name),...
− eMMC Flash 分区表格式:blkdevparts=mmcblk0:size(name),size(name),…
其中:
size(name)表示一个分区,size 指定分区的大小,name 指定分区的名字
bootargs 变量的配置方法可参考configs\芯片名称\prebuilts\bootargs.txt。


1.3 bootcmd 变量
bootcmd 变量用于引导内核,配置方法可参考configs\芯片名称\prebuilts\bootargs.txt。


2 Boot 常用命令

2.1 printenv 命令
打印出所有的Boot 环境变量。
2.2 setenv 命令
设置或修改Boot 环境变量。
setenv 命令的格式:setenv 变量名 变量值
其中:
? 变量值中有空格时需要使用单引号将变量值包含起来;
? 变量值中有多个命令时使用分号分隔;
例:
setenv bootcmd 'mmc read 0 0x1FFFFC0 0x33000 0x10000;bootm 0x1FFFFC0'

2.3 saveenv 命令
将Boot 环境变量保存到bootargs 分区。
2.4 reset 命令
重启Boot。
2.5 tftp 命令
fastboot 支持tftp 客户端,可以从tftp 服务端下载文件到指定地址的DDR 区域,或者
将指定DDR 地址的内容上传到服务端。
tftp 命令的用法:
tftp [loadAddress] [bootfilename] <upload_size>
其中:
? loadAddress:DDR 地址
? bootfilename:要下载或上传的文件名
? upload_size:可选项
− 如果不指定,即表示下载文件
− 如果指定了,即表示上传指定大小的 DDR 内容到服务端
upload_size 的单位是Byte。
miniboot 不支持网络,无法使用tftp 命令。
2.6 Flash 分区烧录命令
为了便于说明在fastboot 命令行烧录Flash 分区,以表3-1Flash 分区表为例:
表3-1 Flash 分区表
分区名称 Flash 偏移 长度 大小
Boot 0x00000000 0x00080000 512KB
bootargs 0x00080000 0x00100000 512KB
kernel 0x00100000 0x00400000 3MB
rootfs 0x00500000 0x06000000 91MB
偏移是相对Flash 首地址的偏移。Flash 可以为SPI Flash/Nand/SPI Nand/eMMC,用户需要根据目
标板的配置合理安排分区。
通常0x1000000 以下的DDR 空间预留给Boot 使用,因此,我们选择0x1000000 以后
的空间用于镜像下载。

2.6.1 nand 命令
NAND Flash 和SPI NAND 使用nand 命令烧录。
fastboot# help nand
nand info - show available NAND devices
nand device [dev] - show or set current device
nand read - addr off|partition size
nand write[.yaffs] - addr off|partition size
read/write 'size' bytes starting at offset 'off'
to/from memory address 'addr', skipping bad blocks.
nand erase [clean] [off size] - erase 'size' bytes from
offset 'off' (entire device if not specified)
nand bad - show bad blocks
nand dump[.oob] off - dump page
nand scrub - really clean NAND erasing bad blocks (UNSAFE)
其中:
? nand read 和nand write:分别是读nand 分区和写Nand 分区命令
? addr:要读和写的DDR 缓存地址
? off:nand 分区的起始位置
? size:要读或写的大小,off 和size 都是以Bytes 为单位。
? nand write.yaffs:将yaffs 文件系统写入Nand 分区的命令,与nand write 的区别是
nand write.yaffs 会将yaffs OOB 数据写入到Nand 的OOB 区域。
? nand erase:擦除Nand 分区的命令,可以指定偏移off 和大小size 擦除,如果不输
入从参数,则整片擦除,但是此命令会跳过坏块。
? nand dump:可以打印指定偏移off 处的Nand 页面数据。
? nand bad:命令可以显示当前Nand 器件中的坏块。
? nand scrub:命令会擦除整片Nand,包括坏块。
以下是用nand 命令烧录表3-1 Flash 分区的示例:
步骤 1 烧录Boot:
将fastboot-burn.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 fastboot-burn.bin
擦除flash 上0x0~0x80000 空间:
nand erase 0x0 0x80000
把DDR 0x1000000~0x180000 的内容(fastboot-burn.bin)写入flash 0x0~0x80000 的空间:
nand write 0x1000000 0x0 0x80000
步骤 2 烧录bootargs:
将bootargs.bin 下载到0x1000000 开始的DDR 缓存:

tftp 0x1000000 bootargs.bin
擦除flash 上0x80000~0x100000 空间:
nand erase 0x80000 0x80000
把DDR 0x1000000~0x180000 的内容(bootargs.bin)写入flash 0x80000~0x100000 的空
间:
nand write 0x1000000 0x80000 0x80000
步骤 3 烧录Kernel(Linux 内核):
将hi_kernel.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 hi_kernel.bin
擦除flash 上0x100000~0x500000 空间:
nand erase 0x100000 0x400000
把DDR 0x1000000~0x1400000 的内容(hi_kernel.bin)写入flash 0x100000~0x500000 的空
间:
nand write 0x1000000 0x100000 0x400000
步骤 4 烧录rootfs(使用yaffs):
将rootfs.yaffs 文件下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 rootfs.yaffs
擦除flash 上0x500000~0x6500000 空间:
nand erase 0x500000 0x6000000
把DDR 0x1000000~0x7000000 的内容(rootfs.yaffs)写入flash
0x500000~(0x500000+$(filesize))的空间:
nand write.yaffs 0x1000000 0x500000 $(filesize)
此处用的是write.yaffs 命令,$(filesize)是tftp 命令设置的rootfs.yaffs 文件的大小。
NAND Flash 上也可以使用cramfs/squashfs/UBI 文件系统,如果要烧录这三种文件系统,应该使
用nand write 命令。
----结束


2.6.2 sf 命令
SPI Flash 使用sf 命令烧录。
fastboot# help sf
sf probe [bus:]cs [hz] [mode] - init flash device on given SPI bus
and chip select
sf read addr offset len - read `len' bytes starting at
`offset' to memory at `addr'
sf write addr offset len - write `len' bytes from memory
at `addr' to flash at `offset'
sf erase offset len - erase `len' bytes from `offset'
sf 命令与nand 命令类似,不同点在于SPI Flash 烧录前需要执行一次sf probe 0,0 表示
SPI Flash 设备号,通常海思只支持一片SPI Flash,因此设备号为0。
以下是使用sf 命令烧录表3-1 Flash 分区的示例:
步骤 1 探测一下是否存在SPI Flash
sf probe 0
每次重启后,都需要执行此步骤才能继续后续的操作。
步骤 2 烧录Boot:
将fastboot-burn.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 fastboot-burn.bin
擦除flash 上0x0~0x80000 空间:
sf erase 0x0 0x80000
把DDR 0x1000000~0x180000 的内容(fastboot-burn.bin)写入flash 0x0~0x80000 的空间:
sf write 0x1000000 0x0 0x80000
步骤 3 烧录bootargs:
将bootargs.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 bootargs.bin
擦除flash 上0x80000~0x100000 空间:
sf erase 0x80000 0x80000
把DDR 0x1000000~0x180000 的内容(bootargs.bin)写入flash 0x80000~0x100000 的空
间:
sf write 0x1000000 0x80000 0x80000
步骤 4 烧录Kernel(Linux 内核):
将hi_kernel.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 hi_kernel.bin
擦除flash 上0x100000~0x500000 空间:
sf erase 0x100000 0x400000
把DDR 0x1000000~0x1400000 的内容(hi_kernel.bin)写入flash 0x100000~0x500000 的空
间:
sf write 0x1000000 0x100000 0x400000
步骤 5 烧录rootfs(使用jffs2):
将rootfs.jffs2 文件下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 rootfs.jffs2
擦除flash 上0x500000~0x6500000 空间:
nand erase 0x500000 0x6000000
把DDR 0x1000000~0x7000000 的内容(rootfs.jffs2)写入flash
0x500000~(0x500000+$(filesize))的空间:
sf write 0x1000000 0x500000 $(filesize)
$(filesize)是tftp 命令设置的rootfs.jffs2 文件的大小。
SPI Flash 上可以使用jffs2/cramfs/squashfs,cramfs 和squashfs 也是使用sf write 命令烧录。
----结束


2.6.3 mmc 命令
eMMC Flash 使用mmc 命令烧录。
fastboot# help mmc
mmc read <device num> addr blk# cnt
mmc write <device num> addr blk# cnt
mmc erase <device num> blk# cnt
mmc write.ext4sp <device num> addr blk# cnt
mmc bootread <device num> addr blk# cnt
mmc bootwrite <device num> addr blk# cnt
mmc rescan <device num>
mmc list - lists available devices
mmc reg <device num>
eMMC Flash 读写操作的单位是块,块大小为512Bytes,与SPI Flash 和Nand Flash 不同,eMMC
在写入之前不需要擦除。
其中:
? mmc read 和mmc write:读写eMMC 分区的命令。
? <device num>:eMMC 设备号,通常海思芯片只支持一片eMMC 器件,因此,设
备号为0。
? addr:DDR 缓存的地址。
? blk#和cnt:需要读或写的起始块号和块的数量,例如需要在1M~1.5M 之间写入
512K 的数据,则blk#是0x800 (即1024*1024/512),cnt 是0x400(即
512*1024/512)。
? mmc erase:eMMC 擦除命令,虽然eMMC 可以不用擦除就写,但是eMMC 协议
还是提供了擦除的命令,用于可靠地将器件上的数据清除,但依赖于eMMC 器件
的实现。
? mmc write.ext4sp:烧写ext4 文件系统的命令。
? mmc bootread 和mmc bootwrite:用于读写eMMC Boot 分区。
? mmc rescan:可以用于重新扫描eMMC 总线上的器件,通常在eMMC 初始化失败
时,用于尝试再初始化eMMC,便于定位问题。
? mmc list:用于查询可用的eMMC 器件。
? mmc reg:用于查询eMMC 器件内部的OCR/CID/CSD/RCA/EXT_CSD 等寄存器。
mmc erase 命名能否将器件的数据彻底清除,依赖于器件本身,不同eMMC 厂家对
eMMC 擦除命令的处理方式不同,因此需要与eMMC 厂家确认。
以下是用mmc 命令烧录表3-1 Flash 分区的示例:
步骤 1 烧录Boot:
将fastboot-burn.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 fastboot-burn.bin
把DDR 0x1000000~0x180000 的内容(fastboot-burn.bin)写入flash 0x0~0x80000 的空间:
mmc write 0x1000000 0x0 0x400
步骤 2 烧录bootargs:
将bootargs.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 bootargs.bin
把DDR 0x1000000~0x180000 的内容(bootargs.bin)写入flash 0x80000~0x100000 的空
间:
mmc write 0x1000000 0x400 0x400
步骤 3 烧录Kernel(Linux 内核):
将hi_kernel.bin 下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 hi_kernel.bin
把DDR 0x1000000~0x1400000 的内容(hi_kernel.bin)写入flash 0x100000~0x500000 的空
间:
mmc write 0x1000000 0x800 0x2000
步骤 4 烧录rootfs(使用ext4):
将rootfs.ext4 文件下载到0x1000000 开始的DDR 缓存:
tftp 0x1000000 rootfs.ext4
把DDR 0x1000000~0x7000000 的内容(rootfs.ext4)写入flash
0x500000~(0x500000+0x6500000)的空间:
mmc write.ext4sp 0x1000000 0x2800 0x80000
mmc write.ext4sp 最后一个参数是根据分区大小计算出来的eMMC 块数。
eMMC Flash 上可以使用ext4/cramfs/squashfs,cramfs 和squashfs 使用mmc write 命令烧录。
----结束

转载于:https://www.cnblogs.com/simon-wong/p/6408529.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jeecg-Boot是一款基于BPM的低代码平台,采用前后端分离架构,使用了SpringBoot 2.x,Ant Design&Vue,Mybatis-plus,Shiro,JWT等技术。它提供了强大的代码生成器,可以一键生成前后端代码,无需手动编写。这样可以帮助Java项目快速提高开发效率,节省研发成本,同时又保持了灵活性。此外,Jeecg-Boot还具备其他强大的低代码能力,如Online表单、Online报表、Online图表、表单设计、流程设计、报表设计、大屏设计等等。对于新手来说,可以通过Jeecg-Boot的入门教程快速学习和上手使用。\[3\] #### 引用[.reference_title] - *1* [jeecg-boot学习及调通步骤](https://blog.csdn.net/weixin_44361102/article/details/113060665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [jeecg-boot简单使用](https://blog.csdn.net/xixingzhe2/article/details/126782765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Jeecg-Boot简介](https://blog.csdn.net/daqiang012/article/details/108292618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值