u-boot修改操作指南
本文将介绍hieuler 提供的u-boot的启动逻辑以及修改和操作方法。
u-boot的主要逻辑是:修改uboot代码以实现必要的命令,使用脚本实现具体的功能。
例如固件升级功能:在uboot中实现cpfile的命令用于文件拷贝,在脚本中实现具体的升级功能,将文件拷贝到emmc中
因此hieuler u-boot功能修改的重点在于脚本的修改,下面将简要介绍u-boot中重要的环境变量以及发布的脚本
1、u-boot启动流程
上图展示了u-boot的启动路径。下面介绍几个修改样例:
修改升级文件的目录(可在同一个SD卡中放入多个系统或多个版本,修改配置文件快速切换)
在SD卡的/boot/env_append.txt中修改file_path和固件的名称,以openeuler系统为例:
# SD卡目录结构 boot ├── env_append.txt ├── linux │ ├── boot_env_8G.bin │ ├── boot_image_8G.bin │ ├── kernel │ └── rootfs.ext4 └── openeuler ├── boot_env_8G.bin ├── boot_image_8G.bin ├── kernel ├── openeuler-image-sd3403-20240326044655.rootfs.ext4 ├── openeuler-image-sd3403-20240327055458.rootfs.ext4 ├── openeuler-image-sd3403-20240327070110.rootfs.ext4 ├── openeuler-image-sd3403-20240327080923.rootfs.ext4 └── openeuler-image-sd3403-20240327090933.rootfs.ext4
# 升级文件所在目录 file_path=/boot/openeuler # 升级文件的文件名,boot_image和boot_env会自动加上_${total_mem_size}.bin file.boot_image=boot_image file.boot_env=boot_env file.kernel=kernel file.rootfs=openeuler-image-sd3403-20240326044655.rootfs.ext4
插入SD卡从SD卡启动,不插入从EMMC启动(SD卡启动时,可快速将系统切换到其它板卡,无需设置,即插即用)
在SD卡的/boot/env_append.txt中删除bootcmd判断boot_media选择启动介质的部分。修改之后如下:
bootcmd=\ load mmc 1:1 ${buffer_addr} ${file.kernel};\ setenv bootargs "${bootargs} mem=${os_mem_size} total_mem_size=${total_mem_size} root=/dev/mmcblk1p2";\ bootm ${buffer_addr};
不进行SD卡升级(可防止误触导致意外的系统升级,导致系统内系统丢失)
在SD卡的/boot/env_append.txt中删除append_preboot
2、环境变量
u-boot中的环境变量类似于其它系统中的环境变量,可以在命令行或脚本中对环境变量进行获取、修改、删除等操作。环境变量也可参与循环、判断、计算等过程。
u-boot中有一些环境变量有固定的作用,具体作用如下所示(分为三部分进行介绍,一部分是u-boot通用的,一部分是hieuler的u-boot中加入的,最后一分部是通过脚本引入的)。
表1 通用环境变量
变量名 | 作用 |
---|---|
bootdelay | 在启动之前等待进入中断的时间,单位为秒,等待超时后直接启动 |
bootcmd | bootdelay等待超时之后执行的脚本(脚本中的命令用于启动) |
bootargs | 在启动Linux内核会将此参数传递给内核,进入系统之后可通过cat /proc/cmdline查询本次启动的bootargs |
filesize | 在执行load操作时,会将文件大小做为返回值写入filesize |
表2 Hieuler中的环境变量
变量名 | 作用 |
---|---|
preboot | 在进入u-boot终端之前会执行该命令中的脚本 |
update | 在上电时若update按键是按下的状态则会自动置为yes,也可手动配置。可以通过判断该变量进行自动升级 |
partcnt | 用于存储mmc partcnt的返回值 |
表3 通过脚本引入的环境变量
【注】:这部分环境变量由脚本引入,针对当前发布的脚本有效,若脚本修改或更新则可能失效
变量 | 作用 |
---|---|
append_preboot | 在加载SD卡中的env_append.txt环境变量之后执行的脚本 |
buffer_addr;buffer_size | 升级或加载脚本时的内存缓冲区地址及大小(一般不做修改) |
part_uboot;part_env;part_kernel | emmc前三个分区的大小,供升级时使用,以字节为单位 |
total_mem_size;os_mem_size | 整体内存大小与Linux使用内存大小(剩余的内存大小需要给海思音视频及算法相关提供物理内存,若没有明确文档不建议修改) |
3、额外的命令
mmc partcnt [dev]
该命令用于获取指定mmc设备分区的个数,结果存储与partcnt环境变量中
# 获取当前mmc设备的分区个数 mmc partcnt # 获取指定mmc设备的分区个数 mmc partcnt 1 # 查看分区个数 echo $partcnt
cpfile
cpfile命令将源和目标分为两类,一种是有文件系统的,另一种是无文件系统的。例如板端emmc镜像中内核就是无文件系统的直接存储到分区。
cpfille将使用环境变量
buffer_addr;buffer_size
指定的位置和大小作为拷贝的缓冲区# 升级内核,将mmc1第一分区的/boot/kernel文件拷贝到mmc0偏移地址为offset的位置 cpfile "mmc 1:1 /boot/kernel" "mmc 0 0x${offset}" # 从emmc中拷贝内核到文件,需要指定大小 cpfile "mmc 0 0x${offset} 0x${size}" "mmc 1:1 /boot/kernel" # cpfile的返回值可以作为if的判断条件,因此if后可以直接跟cpfile命令可以判断拷贝是否成功 if cpfile "mmc 1:${update_part} /boot/kernel" "mmc 0 0x${offset}";then echo "ok";fi
4、脚本参考
以下直接将注释添加到命令旁以方便分析,不可直接拷贝使用。关于脚本的循环、判断、计算等功能详细可参考《u-boot脚本编写基础》
preboot=\
setenv part_num 0;\
setenv partcnt 0;\
setenv filesize 0;\
mmc partcnt 1;\ # 获取SD卡的分区个数
# 如果part_num小于等于分区总数则执行后续操作
# 此处应注意每次0分区都会被扫描,0分区时由于磁盘不创建分区表直接创建文件系统而产生,因此0分区不会被mmc partcnt检测到,所以每次必须扫描
while test "${part_num}" -le "${partcnt}";do \
load mmc 1:${part_num} ${import_addr} /boot/env_append.txt;\ # 尝试加载env_append.txt文件
if test "${filesize}" != "0";then \ # 如果加载成功filesize不为0
env import -t -r ${import_addr} ${filesize};\ # 导入环境变量-t 指示以文本方式导入,-r指示去除\r符号并允许使用\进行换行
if test "$append_preboot" != "";then \ # 如果append_preboot不为空则执行
run append_preboot;\
fi;\
exit 0;\
fi;\
setexpr part_num ${part_num} + 1; \
done;\
- 分享
- 举报
-
浏览量:979次2023-08-19 14:25:08
-
浏览量:592次2024-03-29 11:02:56
-
浏览量:1197次2023-12-06 12:30:38
-
浏览量:1088次2023-12-04 13:11:50
-
浏览量:600次2023-12-06 16:50:25
-
浏览量:1770次2020-05-07 17:16:14
-
浏览量:1101次2024-03-29 10:57:19
-
浏览量:1994次2020-03-30 17:12:36
-
浏览量:1277次2023-03-28 19:19:22
-
浏览量:3478次2017-11-20 11:05:33
-
浏览量:1396次2023-03-28 19:37:31
-
浏览量:3320次2023-04-03 16:45:01
-
浏览量:1627次2024-03-16 11:19:01
-
浏览量:1018次2024-03-29 11:19:21
-
浏览量:2517次2023-03-17 18:38:40
-
浏览量:1687次2023-04-03 15:28:29
-
浏览量:1736次2023-04-03 15:51:40
-
浏览量:5513次2022-09-21 14:30:18
-
浏览量:3489次2017-11-16 11:30:55
- Lighttpd 1.4.53 移植指南(openEuler 20.03 LTS SP1)
- openEuler操作系统安装在树莓派的方法介绍之启用树莓派
- 海鸥派pip3环境安装oebuild
- 易百纳携工业控制系列解决方案“海鸥派”参展2024鲲鹏昇腾开发者大会
- Memcached 1.5.12 移植指南(openEuler 20.03 LTS SP1)
- 易百纳诚挚邀请,Meetup&易百纳技术社区工程师见面会,与您不见不散!
- Dubbo 2.6.8 移植指南(openEuler 20.03 LTS SP1)
- 2024慕尼黑AIoT创新应用论坛——工业物联网商业模式分析及案例分享
- Eulerpi uboot源码编译及SD卡固件升级流程
- 【易百纳新品】欧拉派——基于海思主控SD3403、华为星闪技术的面向工业控制/机器视觉的生态开发板,兼容树莓派,预售799!
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
四叶草~
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明