跳转至

Hi35xxVxxx U-boot 移植应用开发指南

前言

概述

本文档主要介绍在Hi3516CV610单板上如何移植和烧写U-boot(Hi3516CV610单板的Bootloader)的相关操作及如何使用ARM调试工具。

说明:

本文仅支持musl库工具链arm-v01c02-linux-musleabi-gcc 本文描述以Hi3516CV610为例,无特殊说明,Hi3516CV608的描述与Hi3516CV610一致。

产品版本

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

产品名称

产品版本

Hi3516C

V608

Hi3516C

V610

读者对象

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

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

修订记录

修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。

文档版本

发布日期

修改说明

00B01

2026-03-20

第1次临时版本发布

概述

概述

Hi3516CV610单板的Bootloader采用gsl进行ddr初始化后启动U-boot方式。当选用的外围芯片的型号与单板上外围芯片的型号不同时,需要修改gsl使用的寄存器表格配置文件,主要包括存储器配置、管脚复用。

U-boot目录结构

U-boot的主要目录结构如表1所示,详细目录说明请阅读U-boot目录下的README文档。

表 1 U-boot的主要目录结构

目录名

描述

arch

各种芯片架构的相关代码、U-boot入口代码。

board

各种单板的相关代码,主要包括存储器驱动等。

board/vendor/hi3516cv610

Hi3516CV610单板相关代码。

arch/xxx/lib

各种体系结构的相关代码,如ARM、MIPS的通用代码。

include

头文件。

include/configs

各种单板的配置文件。

common

各种功能(命令)实现文件。

drivers

网口、Flash、串口等的驱动代码。

net

网络协议实现文件。

fs

文件系统实现文件。

product/update

SD卡升级、USB升级功能实现

product/ot_osd

dec、hdmi接口、vo、mipi功能实现

product/i2c

i2c功能实现文件

product/security_subsys

安全模块功能实现文件

product/tzasc

tzasc 接口

移植U-boot

U-boot硬件环境

Hi3516CV610 DMEB板上的外围设备包括DDR SDRAM、eMMC、SPI Nor Flash和SPI-NAND Flash。

编译U-boot

当所有移植步骤完成后,就可以编译U-boot,进入U-boot源码目录,执行 make all 命令编译。

编译成功后,将在U-boot目录下生成u-boot-hi3516cv610.bin

注:可根据需要,使用参数 UBOOT_CONFIG 可调整编译使用的defconfig配置文件。

配置DDR存储器

在Windows下打开SDK中的“boards/dmeb/tools/pc/boot_tools/”目录下的配置表格。当选用不同的DDR SDRAM时,需要针对不同器件的特性,对配置工作表中的DDR相关标签页进行修改。

配置管脚复用

如果管脚复用有变化,还需要对配置表格中的管脚复用相关标签页进行修改。

生成最终使用的U-boot镜像

U-boot镜像生成步骤如下:

  1. 完成配置表格的修改后,保存表格。
  2. 单击表格第一个标签页上的按钮【Generate reg bin file】或者使用xlsm_to_bin.py脚本, 参考readme:boards/dmeb/tools/pc/boot_tools/readme_zh.txt,生成临时文件reg_info.bin。
  3. 进入boards/dmeb/目录,执行以下操作来制作非安全镜像:

    cd components/
    cd gsl
    make clean
    make CHIP=hi3516cv610
    cd ../../
    cp components/gsl/pub/gsl.bin ./tools/pc/image_tool/input
    cp ../../third_party/u-boot/u-boot-2022.07/u-boot-hi3516cv610.bin ./tools/pc/image_tool/input/u-boot-original.bin
    cp tools/pc/boot_tools/reg_info.bin ./tools/pc/image_tool/input
    cd tools/pc/image_tool
    python oem/oem_quick_build.py
    (执行该步骤前需要先确认image_tool/oem/quick_build_config.json中默认适配项与input目录中文件名是否一致,不一致请适配一致后再执行该步骤,否则会因找不到文件报错)
    

    tools/pc/image_tool/image/oem/下生成的boot_image.bin即为“非安全启动”能在单板上运行的U-Boot镜像。

烧写U-boot

概述

如果待移植单板中已有U-boot运行,则可以通过串口或网口与服务器连接,直接更新U-boot。

如果是第一次烧写,则需要使用ToolPlatform或者DS-5工具进行烧写。由于芯片特性,在使用DS-5时必须要对存储器和芯片进行初始化。在Hi3516CV610 SDK中提供了相应的初始化脚本,当选用了不同的外围芯片,则需要重新配置初始化脚本才能使用。

通过bootrom工具烧写U-boot

具体操作方式请参考《BurnTool工具使用指南》。

Flash的U-boot烧写方法

SPI-Nor Flash烧写方法

SPI-Nor Flash烧写方法如下:

  1. 在内存中运行起来之后在超级终端中输入:

    # mw.b <ddr_addr> 0xff 0x80000      /* 对内存初始化*/
    # tftp <ddr_addr> boot_image.bin     /*U-boot下载到内存*/
    # sf probe 0                      /*探测并初始化SPI-Nor flash*/
    # sf erase 0x0 0x80000              /*擦除 512k大小*/
    # sf write <ddr_addr> 0x0 0x80000  /*从内存写入SPI-Nor Flash*/
    

    说明:

    Hi3516CV610平台的<ddr_addr>可用地址0x41000000。

  2. 上述步骤操作完成后,重启系统可以看到U-boot烧写成功。

SPI-Nand Flash烧写方法

SPI-Nand Flash烧写方法如下:

  1. 在内存中运行起来之后在超级终端中输入:

    # nand erase 0 0x80000              /*擦除512k大小*/
    # mw.b <ddr_addr> 0xff 0x80000         /* 对内存初始化*/
    # tftp <ddr_addr> boot_image.bin     /*U-boot下载到内存*/
    # nand write <ddr_addr> 0 0x80000 /*从内存写入NAND Flash*/
    

    说明:

    Hi3516CV610平台的<ddr_addr>可用地址0x41000000。

  2. 重启系统可以看到U-boot烧写成功。

eMMC的U-boot烧写方法

eMMC烧写方法如下:

  1. 在内存中运行起来之后在超级终端中输入:

    # mw.b <ddr_addr> 0xff 0x80000               /* 对内存初始化*/
    # tftp <ddr_addr> boot_image.bin    /*U-boot下载到内存*/
    # mmc write 0 <ddr_addr> 0 0x400   /*从内存写入eMMC*/
    

    说明:

    <ddr_addr>可用地址0x41000000。 mmc write命令说明: 格式:mmc write <device num> addr blk# cnt 参数:

    • <device num>:设备号
    • addr:源地址
    • blk#:目的地址的块序号
    • cnt:块的数目,块大小为512字节
  2. 重启系统可以看到U-boot烧写成功。

附录

U-boot命令说明

tftp命令的使用限制

uboot下include/configs/Hi3516CV610.h文件中PHYS_SDRAM_1_SIZE宏的大小定义限制了tftp命令的地址范围。默认发布包中,PHYS_SDRAM_1_SIZE宏定义为0x4000000,即通过tftp命令只能把文件下载到ddr前64M的地址空间。

tftp命令使用示例如下所示:

tftp命令中第一个参数只能是ddr前64M地址空间,即0x40000000至0x43ffffff。

备注:如果需要把文件下载到64M以上的地址空间,则可以先通过tftp命令把文件下载到64M以内的地址空间,再通过cp.b命令把文件从64M以内的地址空间拷贝到64M以上的地址空间。cp.b 命令使用示例如下:

上述cp.b命令中,第一个参数为源地址,第二个参数为目的地址,第三个参数为长度。

U-boot环境变量使用说明

通过U-boot命令行配置bootargs/bootcmd到介质分区

bootargs有多组配置项时,不同配置项之间需要以空格间隔,如mem与console之间;同一个配置项的多个内容之间需要以逗号间隔,如分区信息参数blkdevparts、mtdparts。

bootcmd有多组命令操作时,不同命令操作需要以分号间隔,命令操作格式取决于具体命令要求,一般以空格间隔。其中介质偏移地址与长度需要根据实际需求适配修改;spi nor与spi nand器件的地址偏移与长度以byte为单位计算,按byte填写读取介质偏移与长度既可;emmc介质的地址偏移与长度以扇区为单位,需要按扇区计算偏移与长度,例如读取emmc器件偏移为0x100000,长度为0x80000数据时,mmc read命令的介质偏移与长度需要分别除以512,即偏移为0x800,长度为0x400(mmc read 0 0x40010000 0x800 0x400);具体如下所示:

  • emmc介质配置示例

    setenv bootargs 'mem=96m console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(boot),512K(env),4M(kernel),96M(rootfs)';
    setenv bootcmd 'mmc read 0 0x47000000 0x800 0x2000; bootm 0x47000000'; sa
    
  • nand介质配置示例

    setenv bootargs 'mem=96m console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=3 mtdparts=nand:512K(boot),512K(env),4M(kernel),32M(rootfs)'; save
    setenv bootcmd 'nand read 0x47000000 0x100000 0x400000; bootm 0x47000000'; save
    
  • nor介质配置示例

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

通过U-boot config配置环境bootargs/bootcmd到介质分区

U-boot 支持在配置文件中配置bootargs与bootcmd,配置后编译到U-boot,无需再次通过命令行方式配置,配置方法如下:

  1. 进入menuconfig配置页面。
  2. 填充需要的bootargs与bootcmd字符串, 以emmc介质为例:

    Boot options  --->
    [*] Enable boot arguments
    (mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(boot),512K(env),4M(kernel),96M(rootfs))
    [*] Enable a default value for bootcmd
    (mmc read 0 0x47000000 0x800 0x2000; bootm 0x47000000)
    

    注意:删除原有默认字符串可能需要“Shift+Backspace”

  3. 继续执行,生成U-boot镜像。

mount一个空文件系统方法

  1. emmc介质bootargs新增一个大小为200M的ext4文件系统分区/dev/mmcblk0p5,分区名为ext4_partition_test

    1. 查看当前系统分区信息,确认新添加分区dev节点:/dev/mmcblk0p5

      ls /dev/mmcblk0p*
      /dev/mmcblk0p1  /dev/mmcblk0p3  
      /dev/mmcblk0p2  /dev/mmcblk0p4
      
    2. U-boot bootargs添加分区/dev/mmcblk0p5,分区名ext4_partition_test

      setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:512K(boot),512K(env),4M(kernel),96M(rootfs),200M(ext4_partition_test)';save
      
    3. 启动至内核,格式化新增分区/dev/mmcblk0p5为ext4文件系统

      mkfs.ext4 /dev/mmcblk0p5
      
    4. mount至mnt目录后,即可按实际需求使用该格式化后分区

      mount -t ext4 /dev/mmcblk0p5 /mnt/
      
  2. nand介质bootargs新增一个大小为32M的ubifs文件系统分区/dev/mtd4,分区名为ubifs_partition_test

    setenv bootargs 'mem=96M console=ttyAMA0,115200 clk_ignore_unused root=ubi0:ubifs rootfstype=ubifs rw ubi.mtd=3 mtdparts=nand:512K(boot),512K(env),4M(kernel),32M(rootfs),32M(ubifs_partition_test)';save
    

    按《UBI 文件系统使用指南》中“mount 一个空 UBIFS 文件系统”操作流程,挂载一个ubifs_partition_test分区至内核后,即可按实际需求使用该格式化后分区

  3. nor介质bootargs新增一个10M jffs2文件系统分区 /dev/mtdblock4, 分区名为jffs2_partition_test

    1. U-boot bootargs添加分区/dev/mtdblock4,分区名jffs2_partition_test

      setenv bootargs 'mem=132928K console=ttyAMA0,115200 clk_ignore_unused root=/dev/mtdblock3 rootfstype=jffs2 rw mtdparts=sfc:512K(boot),512K(env),4M(kernel),10M(rootfs),10M(jffs2_partition_test)';save
      
    2. 启动至内核,格式化新增分区/dev/mtdblock4为jffs2文件系统

      flash_erase /dev/mtd4 0 0 
      
    3. mount至mnt目录后,即可按实际需求使用该格式化后分区

      mount -t jffs2 /dev/mtdblock4 /mnt/

mount一个已制作完成文件系统

  1. bootargs新增一个文件系统分区,参考"mount一个新增空文件系统"中设置bootargs方式;
  2. 制作新增分区文件系统镜像,具体可参考SDK版本包boards/dmeb/readme_cn.txt“制作文件系统镜像”章节;
  3. 烧写新增分区文件系统镜像,烧写方法请参考《BurnTool 工具使用指南》中“按分区烧写”章节;
  4. 启动至内核环境,直接mount新增分区到mnt目录,参考"mount一个新增空文件系统"中mount方式。

    须知:

    • 以上bootargs/bootcmd参数、分区大小仅为示例参数,具体参数、分区大小需要根据实际使用场景配置;
    • 以上所用文件系统工具放在SDK版本包编译后目录:boards/dmeb/pub/bin/board_xxx,board_xxx路径的命名与编译时选择的工具链以及产品相关,请按需取用。