u-boot修改操作指南

u-boot修改操作指南 四叶草~ 2024-03-29 11:08:20 119

本文将介绍hieuler 提供的u-boot的启动逻辑以及修改和操作方法。

u-boot的主要逻辑是:修改uboot代码以实现必要的命令,使用脚本实现具体的功能。

例如固件升级功能:在uboot中实现cpfile的命令用于文件拷贝,在脚本中实现具体的升级功能,将文件拷贝到emmc中

因此hieuler u-boot功能修改的重点在于脚本的修改,下面将简要介绍u-boot中重要的环境变量以及发布的脚本

1、u-boot启动流程

上图展示了u-boot的启动路径。下面介绍几个修改样例:

  1. 修改升级文件的目录(可在同一个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
    
  2. 插入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};
    
  3. 不进行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、额外的命令

  1. mmc partcnt [dev]

    该命令用于获取指定mmc设备分区的个数,结果存储与partcnt环境变量中

    # 获取当前mmc设备的分区个数
    mmc partcnt
    # 获取指定mmc设备的分区个数
    mmc partcnt 1
    
    # 查看分区个数
    echo $partcnt
    
  2. 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;\
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
四叶草~
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区