跳转至

裸烧及非裸烧升级 使用手册

前言

概述

本文档用于指导调试裸烧及非裸烧升级。

说明:

本文仅支持 musl 工具链arm-v01c02-linux-musleabi。本文以Hi3516CV610为例,未有特殊说明,Hi3516CV608与Hi3516CV610内容一致。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

Hi3516C

V608

HI3516C

V610

读者对象

本文档(本指南)主要适用于以下工程师:

  • 技术支持工程师
  • 软件开发工程师

修改记录

文档版本

发布日期

修改说明

00B01

2026-03-20

第1次临时版本发布

裸烧使用说明

操作准备

操作准备如下:

  • 编译镜像,如表1所示;
  • 制作升级包;
  • 存储介质准备(FAT32格式的SD卡)。

表 1 升级所需的镜像

启动方案

镜像

非安全启动

boot_image、env、uImage(kernel)、rootfs

Non-TEE安全启动

TEE安全启动

boot_image、env、uImage(kernel)、rootfs、tee_image

裸烧流程

裸烧流程如图1所示。

图 1 裸烧流程图

操作过程

  1. 根据表1,安全启动或非安全启动镜像编译,具体编译方法请参考《Hi35xxVxxx 安全启动使用指南》,有如下注意事项。

    eMMC启动的uboot中SDIO驱动默认是开启的,其他启动介质编译uboot镜像时,需进入SDK版本包third_party/u-boot目录中的u-boot-xxx源码目录下,使用make ARCH=arm CROSS_COMPILE=arm-v01c02-linux-musleabi- menuconfig打开下面的宏开关。

    Device Drivers  --->
        MMC Host controller Support  --->
            [*] MMC/SD/SDIO card support   --->
            [*] Secure Digital Host Controller Interface support
            [*]   Support SDHCI ADMA2
    
        Vendor driver support  --->
            [*] SDHCI support for the Soct SD/SDIO/eMMC controller
    Product  --->
        [*] auto update
            [*] auto sd update
                    [*]     auto sd update is in sdio0
            [*] auto usb update
            [*] auto update adaptation
    

    eMMC启动的单板会被限制为只能使用的sdio1作为sd卡升级端口,auto sd update is in sdio0这个宏不会显示在menuconfig下,因为sdio0已经被emmc占用了,无法使用;如果使用的是其他启动介质单板,uboot下默认使用sdio0作为sd卡升级端口;如果需要使用sdio1,则关闭下面的宏开关:

    Product  --->
        [*] auto update
            [*] auto sd update
                    [ ]     auto sd update is in sdio0
            [*] auto usb update
            [*] auto update adaptation
    
  2. 根据使用的启动方案制作升级包。

    • 非安全启动和Non-TEE安全启动升级包制作方法

      创建config文本文件,并把和镜像匹配的bootargs和bootcmd拷贝至其中,分区大小单位需要大写,格式如下:

      • SPI NOR Flash

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock3 rootfstype=jffs2 rw mtdparts=sfc:512K(u-boot.bin),512K(env),4M(kernel),10M(rootfs.jffs2)';
        setenv bootcmd 'sf probe 0; sf read 0x47000000 0x100000 0x400000; bootm 0x47000000'; sa
        
      • SPI NAND Flash:

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=3 mtdparts=nand:512K(u-boot.bin),512K(env),4M(kernel),32M(rootfs.ubifs)'; sa
        setenv bootcmd 'nand read 0x47000000 0x100000 0x400000; bootm 0x47000000'; sa
        
      • eMMC:

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(u-boot.bin),512K(env),4M(kernel),96M(rootfs.ext4)';
        setenv bootcmd 'mmc read 0 0x47000000 0x800 0x2000; bootm 0x47000000'; sa
        

      升级包参考如下:

      • u-boot.bin为image_map脚本生成的boot_image.bin镜像;
      • env为xxx_env.bin镜像;
      • kernel为Linux Kernel镜像;
      • 对于非安全启动和Non-TEE安全启动,u-boot.bin为image_map脚本生成的boot_image.bin镜像。
    • TEE安全启动升级包制作方法

      创建config文本文件,并把和镜像匹配的bootargs和bootcmd拷贝至其中,格式如下:

      • SPI NOR Flash

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock3 rootfstype=jffs2 rw mtdparts=sfc:512K(u-boot.bin),512K(env),4M(kernel),10M(rootfs.jffs2),1M(tee)';
        setenv bootcmd 'sf probe 0; sf read 0x47000000 0xf00000 0x100000; dcache flush; smc 0xc2fffa00 0x47000000; sf read 0x50000000 0x100000 0x400000; bootm 0x50000000'; sa
        
      • SPI NAND Flash:

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=3 mtdparts=nand:512K(u-boot.bin),512K(env),4M(kernel),32M(rootfs.ubifs),1M(tee)'; sa
        setenv bootcmd 'nand read 0x47000000 0x2500000 0x100000; dcache flush; smc 0xc2fffa00 0x47000000; nand read 0x50000000 0x100000 0x400000; bootm 0x50000000'; sa
        
      • eMMC:

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(u-boot.bin),512K(env),4M(kernel),96M(rootfs.ext4),1M(tee)';
        setenv bootcmd 'mmc read 0 0x47000000 0x32800 0x800; dcache flush; smc 0xc2fffa00 0x47000000; mmc read 0 0x50000000 0x800 0x2000; bootm 0x50000000'; sa
        

      升级包参考如下:

      • u-boot.bin为image_map脚本生成的boot_image.bin镜像;
      • env为xxx_tee_env.bin镜像;
      • kernel为Linux Kernel镜像;
      • tee为image_map脚本生成的tee_image.bin镜像。
  3. 插入存放有升级包的FAT32格式的SD卡至SDIO0卡槽,按住UPDATE按键,启动单板。

    进入u-boot升级流程时,松开UPDATE按键即可,例如,当出现类似操作示例打印log,即代表已进入u-boot升级流程。

    说明:

    • 把升级包放置在SD卡前,请先把SD卡进行格式化操作。
    • 升级包里的u-boot或boot_image镜像名必须为u-boot.bin,升级包里的镜像名必须和bootargs一致,如4M(kernel),则Linux内核镜像名应为kernel;
    • 可烧写多个文件系统镜像;
    • ubifs文件系统镜像的文件名中必须包含ubifs字符串,其他镜像的文件名中必须不能包含ubifs字符串。
    • ext4文件系统镜像的文件名中必须包含ext4字符串,其他镜像的文件名中必须不能包含ext4字符串。

操作示例

  • 格式化SD卡为FAT32格式;
  • 将操作过程中制作的升级包拷贝到格式化好的SD卡中。格式化SD卡具体方法请参考《外围设备驱动 操作指南》附录;
  • 裸烧打印以及打印说明如下(以SPI NOR Flash非安全启动举例):

    //bootrom读取u-boot.bin至内存并执行
    //读取升级配置文件
    [0]=u-boot.bin       start=0x00000000 end=0x0007ffff size=0x00080000
    [1]=env              start=0x00080000 end=0x000fffff size=0x00080000
    [2]=kernel           start=0x00180000 end=0x00e7ffff size=0x00d00000
    [3]=rootfs.jffs2     start=0x00e80000 end=0x0167ffff size=0x00800000
    //读取并烧写u-boot.bin
    spinor erase...
    spinor write...
    //读取并烧写env
    spinor erase...
    spinor write...
    //读取并烧写kernel
    spinor erase...
    spinor write...
    //读取并烧写rootfs.jffs2
    spinor erase...
    spinor write...
    //保存环境变量
    Saving Environment to SPI Flash... Erasing SPI flash...Writing to SPI flash...done
    OK
    //接下来将自动启动新系统
    

操作中需要注意的问题

  • SD卡必须格式化成FAT32格式;
  • 若SD卡有多个分区时,升级包必须放在第一个分区,否则扫描不到升级包;
  • u-boot或boot_image镜像名称必须为u-boot.bin;
  • 裸烧会自动保存config中的bootargs和bootcmd环境变量;
  • 没有config文件时,仅会烧写bootrom读取的u-boot.bin镜像。

设置eMMC扩展CSD寄存器

如果用SD卡裸烧的方式烧写,u-boot会利用自带的eMMC驱动对eMMC扩展CSD寄存器进行设置,不需要额外设置。但如果使用烧录器方式进行烧写,则需要烧录器配置eMMC扩展CSD寄存器。此部分主要说明在烧录器操作界面上,需要配置 eMMC 的哪些寄存器及寄存器的值。

eMMC 器件包含有BOOT1、BOOT2和 USER DATA分区,同时支持 n_RST 管脚和下电复位。boot 从 USER DATA分区启动,所有镜像数据都烧录到 USER DATA分区,同时只支持 n_RST 管脚复位器件,因此,烧录器必须按下表配置寄存器的值,否则单板无法启动。

寄存器编号

寄存器值

说明

179

0x38

此寄存器用于配置 boot分区,默认从 USER DATA区开始配置。

177

0x2

此寄存器用于配置 eMMC 在 boot 模式下的总线宽度。用户需要根据硬件设计使用的总线宽度进行设置(0x1:4-bit 0x2:8-bit)。

167

0x1f

此寄存器用于配置 eMMC 器件的写可靠性。该寄存器需配置成 0x1f。

162

0x1

此寄存器用于配置 eMMC 器件的 n_RST 管脚是否有效。默认使用 n_RST 管脚,该寄存器必须配置成 0x1。

177寄存器配置如表1所示。

表 1 177寄存器配置说明

寄存器域

寄存器域说明

配置值

Bit[4:3]

BOOT_MODE(nonvolatile)

00:单沿 DS模式;

01:单沿 HS模式;

10:双沿boot模式;

11:保留。

0x0

Bit[2]

RESET_BOOT_BUS_CONDITIONS(nonvolatile)

0:boot之后,复位BOOT_BUS_WIDTH为x1,单沿,DS模式;

1:boot之后,保留BOOT_BUS_WIDTH。

默认值:0;

必须配置为默认值

Bit[1:0]

BOOT_BUS_WIDTH

00:x1 (单沿) or x4 (双沿)总线boot;

01:x4 (单沿/双沿)总线boot;

10:x8 (单沿/双沿)总线boot;

11:保留。

用户需要根据硬件设计使用的总线宽度进行设置:

单板4线:0x1

单板8线:0x2

说明:

  • 必须在烧录之前完成eMMC 扩展寄存器的配置。
  • 部分烧录器可能不支持设置扩展CSD寄存器的功能,需烧录器厂家支持。

具体的设置由于各厂家的eMMC烧录器不同而存在差异,请参考烧录器手册来配置。

非裸烧升级使用说明

操作准备

升级操作准备如下:

  • 编译镜像,参考表1;
  • 制作升级包;
  • 存储介质准备(FAT32格式的SD卡或U盘);

升级流程

升级流程如图1所示。

图 1 升级流程图

操作过程

  1. 根据表1编译镜像,安全启动或非安全启动镜像编译,具体编译方法请参考《Hi35xxVxxx 安全启动使用指南》,有如下注意事项。

    • 编译u-boot镜像时,需进入u-boot源码目录下,使用make ARCH=arm CROSS_COMPILE=arm-v01c02-linux-musleabi- menuconfig打开宏开关。

      Device Drivers  --->
          MMC Host controller Support  --->
              [*] MMC/SD/SDIO card support   --->
              [*] Secure Digital Host Controller Interface support
              [*]   Support SDHCI ADMA2
          Vendor driver support  --->
              [*] SDHCI support for the Soct SD/SDIO/eMMC controller
      Product  --->
          [*] auto update
              [*] auto sd update
                      [*]     auto sd update is in sdio0
              [*] auto usb update
              [*] auto update adaptation
      

      uboot下默认使用sdio0,如果需要使用sdio1,需要关闭下面的宏开关:

      Product  --->
          [*] auto update
              [*] auto sd update
                      [ ]     auto sd update is in sdio0
              [*] auto usb update
              [*] auto update adaptation
      
    • 对于非裸烧场景,如果不希望使用UPDATE按键,可以屏蔽u-boot按键识别代码,修改board/vendor/hi3516cv610/hi3516cv610.c中函数is_auto_update为:

      static int is_auto_update(void)  {
              writel(0x11f1, 0x10260028);
              writel(0x11e1, 0x1026002c);
              writel(0x11e1, 0x10260030);
              writel(0x12a1, 0x10260034);
              writel(0x11e1, 0x10260038);
              writel(0x11e1, 0x1026003c);
              writel(0x11e1, 0x10260040);
              writel(0x11f1, 0x10260044);
              return 1;
      }
      

      配置完成后,即u-boot启动默认会进入sd(sdio0)升级流程。

      或者将函数is_auto_update为:

      static int is_auto_update(void)  {
              writel(0x11f1, 0x11130038);
              writel(0x11e1, 0x1113003c);
              writel(0x11e1, 0x11130040);
              writel(0x12a1, 0x11130044);
              writel(0x11e1, 0x11130048);
              writel(0x11e1, 0x1113004c);
              writel(0x11e1, 0x11130050);
              writel(0x11f1, 0x11130054);
              return 1;
      }
      
      即u-boot启动默认会进入sd(sdio1)升级流程。
      
  2. 根据使用的启动方案制作升级包。

    • 非安全启动和Non-TEE安全启动升级包制作方法。

      创建config文本文件,并把和镜像匹配的bootargs和bootcmd拷贝至其中,分区大小单位(K、M)需要大写,格式如下:

      • SPI NOR Flash

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock3 rootfstype=jffs2 rw mtdparts=sfc:512K(u-boot.bin),512K(env),4M(kernel),10M(rootfs.jffs2)';
        setenv bootcmd 'sf probe 0; sf read 0x47000000 0x100000 0x400000; bootm 0x47000000'; sa
        
      • SPI NAND Flash

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=3 mtdparts=nand:512K(u-boot.bin),512K(env),4M(kernel),32M(rootfs.ubifs)'; sa
        setenv bootcmd 'nand read 0x47000000 0x100000 0x400000; bootm 0x47000000'; sa
        
      • eMMC

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(u-boot.bin),512K(env),4M(kernel),96M(rootfs.ext4)';
        setenv bootcmd 'mmc read 0 0x47000000 0x800 0x2000; bootm 0x47000000'; sa
        

      升级包参考如下:

      • u-boot.bin为image_map脚本生成的boot_image.bin镜像;
      • env为xxx_env.bin镜像

      • kernel为Linux Kernel镜像;

      • 对于非安全启动和Non-TEE安全启动,u-boot.bin为image_map脚本生成的boot_image.bin镜像。
    • TEE安全启动升级包制作方法

      创建config文本文件,并把和镜像匹配的bootargs和bootcmd拷贝至其中,格式如下:

      • SPI NOR Flash

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock3 rootfstype=jffs2 rw mtdparts=sfc:512K(u-boot.bin),512K(env),4M(kernel),10M(rootfs.jffs2),1M(tee)';
        setenv bootcmd 'sf probe 0; sf read 0x47000000 0xf00000 0x100000; dcache flush; smc 0xc2fffa00 0x47000000; sf read 0x50000000 0x100000 0x400000; bootm 0x50000000'; sa
        
      • SPI NAND Flash

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=3 mtdparts=nand:512K(u-boot.bin),512K(env),4M(kernel),32M(rootfs.ubifs),1M(tee)'; sa
        setenv bootcmd 'nand read 0x47000000 0x2500000 0x100000; dcache flush; smc 0xc2fffa00 0x47000000; nand read 0x50000000 0x100000 0x400000; bootm 0x50000000'; sa
        
      • eMMC

        setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(u-boot.bin),512K(env),4M(kernel),96M(rootfs.ext4),1M(tee)';
        setenv bootcmd 'mmc read 0 0x47000000 0x32800 0x800; dcache flush; smc 0xc2fffa00 0x47000000; mmc read 0 0x50000000 0x800 0x2000; bootm 0x50000000'; sa
        

      升级包参考如下:

      • u-boot.bin为image_map脚本生成的boot_image.bin镜像;
      • env为xxx_tee_env.bin镜像;
      • kernel为Linux Kernel镜像;
      • tee为image_map脚本生成的tee_image.bin镜像。
  3. 插入存放有升级包的FAT32格式的SD卡(SDIO0)或U盘,按住UPDATE按键,启动单板,升级系统。

    进入u-boot升级流程时,松开UPDATE按键即可。例如:当出现类似升级示例打印log,即代表已进入u-boot升级流程。

    说明:

    • 把升级包放置在SD卡或U盘前,请先把SD卡或U盘进行格式化操作。
    • 升级包里的u-boot或boot_image镜像名必须为u-boot.bin,升级包里的镜像名必须和bootargs一致,如4M(kernel),则Linux内核镜像名应为kernel;
    • 如果镜像文件不存在则不升级对应项;
    • 支持升级多个文件系统镜像;
    • 如果想继续使用u-boot中的环境变量bootargs和bootcmd,则不需要准备config文件;
    • ubifs文件系统镜像的文件名中必须包含ubifs字符串,其他镜像的文件名中必须不能包含ubifs字符串。
    • ext4文件系统镜像的文件名中必须包含ext4字符串,其他镜像的文件名中必须不能包含ext4字符串。

操作示例

分段升级

分段升级适用于低内存芯片平台,当内存较小且升级的文件系统较大时可考虑打开此选项,打开此选项时只需要使用16M大小的内存 buffer,反之升级文件将占用文件大小的内存。

操作过程如下:

  1. 打开分段升级宏(CONFIG_VENDOR_UPGRADE_BY_SEGMENT)

    ARM architecture --->
        vendor_setup --->
        [*] Upgrade by segment write
    
  2. 打开升级开关和识别sd卡、usb所需要的宏开关,和操作过程步骤1一致。

升级示例

  • 将u-boot镜像烧写到flash(spinor或nand)中或直接下载到内存中运行;
  • 格式化SD卡或U盘为FAT格式;
  • 将操作过程中制作的升级包拷贝到格式化好的SD卡或U盘中。格式化SD卡或U盘具体方法请参考《外围设备驱动 操作指南》附录;
  • 开发板上电,u-boot启动,开始自动升级。
  • 升级打印以及打印说明如下(以SPI NOR Flash非安全启动举例):

    //读取升级配置文件
    [0]=u-boot.bin       start=0x00000000 end=0x0007ffff size=0x00080000
    [1]=env              start=0x00080000 end=0x000fffff size=0x00080000
    [2]=kernel           start=0x00180000 end=0x00e7ffff size=0x00d00000
    [3]=rootfs.jffs2     start=0x00e80000 end=0x0167ffff size=0x00800000
    //读取并烧写u-boot.bin
    spinor erase...
    spinor write...
    //读取并烧写env
    spinor erase...
    spinor write...
    //读取并烧写kernel
    spinor erase...
    spinor write...
    //读取并烧写rootfs.jffs2
    spinor erase...
    spinor write...
    //保存环境变量
    Saving Environment to SPI Flash... Erasing SPI flash...Writing to SPI flash...done
    OK
    //接下来将自动启动新系统
    

操作中需要注意的问题

  • SD卡或U盘必须格式化成FAT格式;
  • 若SD卡或U盘有多个分区时,升级包必须放在第一个分区,否则扫描不到升级包;
  • 升级u-boot会自动保存config中的bootargs和bootcmd环境变量。