/
Q654代码下载编译及软件升级

Q654代码下载编译及软件升级

1、Q654代码下载

1、环境准备

安装依赖包和tool

依次执行以下两条命令,以安装所需的工具和软件包

sudo apt-get install pv openssl libssl-dev bison flex git make u-boot-tools libmpc-dev libgmp-dev python3-pip mtd-utils libncurses5 libncurses-dev mtools -y sudo pip install pycryptodomex pyelftools Crypto sudo ln -s /usr/bin/python3 /usr/bin/python

2、代码下载

执行下面命令获取代码:

  • Gitee:

    git clone https://gitee.com/sunplus-plus1/q654.git
  • Github:

    git clone https://github.com/sunplus-plus1/Q654.git

输入命令即可开始下载

image-20250115-114355.png

下载完成后,将生成一个名为q654的目录,其中包含了q654仓库的目录文件,里面包含的子目录文件未下载

执行以下命令抓取子目录代码:

执行以下命令切换到master分支:

下载完成后,对应目录文件大小为:

3、目录结构

文件目录以及功能说明

boot

 

 

boot

 

 

 

draminit

DDR的初始化代码

 

trusted-firmware-a

ARM 开源的固件框架(TF-A),主要用于ARM架构的处理器和设备,它提供了一组安全和可信任的软件组件,用于引导和初始化系统,本项目中实现了arm运行环境从非安全世界切换到安全世界以及电源管理的功能

 

xboot

xboot代码,主要实现了硬件的初始化(emmc/sdcard/ddr)以及启动uboot

 

uboot

uboot源码,用于升级系统以及启动kernel

build

 

存放Makefile、加密以及ISP升级打包处理的工具

build

 

存放Makefile、加密以及ISP升级打包处理的工具

crossgcc

 

存放不同环境下编译所需的交叉工具链

crossgcc

 

存放不同环境下编译所需的交叉工具链

firmware

 

 

firmware

 

 

 

arduino_core_sunplus

CM4基于arduino的代码,主要实现suspend/resume的控制

ipack

 

用于spinor flash的打包处理,emmc/sdcard 启动不会使用

linux

 

 

linux

 

 

 

kernel

kernel内核源码

 

rootfs

文件系统目录

optee

 

 

optee

 

 

 

optee_client

运行在非安全世界的,提供应用程序与optee_os的通信接口

 

optee_example

Optee 实例代码,演示如何开发使用optee

 

optee_os

运行在安全世界,提供安全执行环境运行受信任的应用程序

2、代码编译

1、软件配置

1、选择硬件平台

在代码根目录下执行 make config ,第一次运行时将自动从网下载所有必需的toolchain

下载完成后会显示硬件平台的选项,里面包含了不同客户的平台以及开发板的名字简称。

这里默认选择 【3】SP7350 MC Board,

对应的硬件平台如下:

2、选择启动方式

该硬件平台只支持EMMC和SDcard作为系统的启动方式

  • EMMC:

1、EMMC启动

输入【1】并且回车,进入eMMC大小配置选项

2、EMMC容量选择

默认核心板上EMMC的容量为32G,所以输入【6】并且回车

  • SDCARD:

输入【2】并且回车

3、文件系统选择

由于文件系统的体积较大,为了便于代码仓库的管理和下载,我们并未将文件系统直接上传至Git仓库。是在选择对应的文件系统后,再从服务器上下载到本地目录。

选择启动方式后,会加载文件系统列表,如果出现下面这种错误,可能是网络连接问题,再次重新执行make config流程即可

获取到文件系统列表以后,会显示如下的文件系统列表,根据自己的需求,选择合适的文件系统

  1. BusyBox 一个开源的、多功能的软件套件,提供了linux常用的工具,它的主要特点是占用系统资源少、启动速度快、体积小等优势,适合一些简单的功能开发

  2. 【2】-【4】Ubuntu Server主要用于服务器类的应用,与其他的ubuntu的主要差异在于没有桌面环境

  3. 【5】-【10】 ubuntu的MATE和XFCE,2个不同的桌面环境版本,XFCE提供的资源环境相对MATE更少,更加的精简

4. 【11】-【13】Buildroot/Yocto 为可定制化的文件系统

这里我们选择【5】Ubuntu MATE 20.04作为举例,输入【5】并且回车

当对应的文件系统下载完成后如下图所示,会显示下载【OK】的信息:

4、OVERLAYFS选择

此选项仅适用于EMMC设备,若以SDCARD启动,则不会显示该选项。。

OVERLAYFS是Linux内核中的一种联合文件系统,它通过叠加多个目录形成了一个单一的文件系统, 在提高性能和简化容器文件系统管理方面发挥了重要作用。特别适用于docker应用中,也可以用于备份原始rootfs使用

这里默认选择【1】使用overlayfs

5、选择加密方式

这2种方式的不同,差异在于在构建过程中,启用Secure Boot将导致编译阶段生成的镜像文件做加密和签名处理。运行时,系统必须首先执行文件的签名验证和解密,然后才能继续执行。为了确保正常运行,必须将解密的相关密钥烧录至IC的OTP存储器中,因此,在开发阶段,通常选择【1】Normal Boot,而在产品开发完成并准备部署时,转而采用【2】Secure Boot。

这里选择【1】Normal boot,不做加解密处理

选择后会自动进行预编译处理,执行完成后结果如下图所示,会显示刚才的配置信息

2、代码编译

1、整体编译

执行make all可以进行代码整体编译,会对每个目录文件进行编译,编译完成后会生成【out】目录,里面包含了升级烧录所需的文件

编译完成后如下图所示,表示编译成功【EMMC boot】

【SDCard boot】编译成功的信息如下:

2、单独编译

执行make all命令将编译整个项目,涵盖xboot、uboot、TF-A、kernel、rootfs等部分,因此整个过程较为耗时。若仅修改了特定目录下的文件,例如uboot或kernel,您可以选择仅编译该目录。相应的目标文件将生成于out目录中,之后您可以依照后续的更新流程,单独更新特定模块。

单独编译对应的执行命令和输出的文件关系为:

编译目录

执行命令

输出文件

xboot

make xboot rom

out/xboot.img

uboot

make uboot rom

out/uboot.img

TF-A

make fip rom

out/fip.img

dtb

make dtb uboot rom

out/uboot.img

kernel

make kernel rom

out/uImage

rootfs

make rootfs rom

out/rootfs.img

Dts修改:

Uboot和kernel共用同一个dts文件描述硬件设备的配置信息,C3V的dts目录下包含了多个dts文件,如下图:

要查看当前使用的dts文件,可以在根目录下执行命令make info。相应的sunplus/sp7350-mc.dts文件位于linux/kernel/arch/arm64/boot/dts目录下。

当在make config中选择MCB Board时,相应的配置文件是sp7350-mc.dts。如果您仅修改了这个文件,那么在编译过程中需要执行make dtb uboot rom命令来单独编译dtb代码。在编译命令中加入uboot的原因是dtb需要作为EXT_DTB参数编译进uboot内部。因此,在编译dtb之后,还需要编译uboot以更新u-boot.img文件。

3、out目录说明

Out目录是编译后文件生成的所在目录,在编译代码前选择不同的boot device,则输出的文件内容也不同。

在make config流程中【Select boot devices】如果选择的是【1】EMMC,对应的生成的文件目录如下【q654/out】:

各个文件的功能如下:

xboot.img

存储 X-Boot 的二进制文件,X-Boot 作为第一阶段的引导加载程序,负责 DDR SDRAM 的初始化和调校,加载 Trusted Firmware-A(TF-A)、Open Portable Trusted Execution Environment(OP-TEE)以及 U-Boot 的映像,并启动 TF-A 的执行。

u-boot.img

U-Boot 引导加载程序的镜像文件,它是第二阶段的引导加载程序,负责加载和运行 Linux 内核镜像

uImage

带有 U-Boot 头的压缩 Linux 内核的镜像文件

fip.img

包含 Trusted Firmware-A(TF-A)和开放可移植可信执行环境(OP-TEE)的映像

rootfs.img

文件系统镜像,内容根据配置时选择的rootfs决定

ISPBOOOT.BIN

EMMC烧录文件

这两个文件是由一个名为ISPBOOT.BIN的文件拆分而来,拆分的原因在于目前SD卡或U盘普遍采用FAT格式,而FAT格式限制了单个文件的大小不得超过4GB。因此将一个超过4GB的文件分割成了两个文件。

在执行EMMC烧写操作时,需要将这两个文件同时放置在U盘或SD卡中进行启动。当程序启动时,它会自动将各个image文件烧写到EMMC存储器中

如果rootfs选择不同,则可能输出的ISPBOOOT.BIN文件大小不超过4G,那么就只会生成1个ISPBOOOT.BIN文件

ISPBOOOT1.BIN

如果选择的是【2】SD Card,对应的生成的文件目录如下【q654/out/boot2linux_SDcard】:

各个文件的功能如下:

ISPBOOOT.BIN

存储 X-Boot 的二进制文件,X-Boot 作为第一阶段的引导加载程序,负责 DDR SDRAM 的初始化和调校,加载 Trusted Firmware-A(TF-A)、Open Portable Trusted Execution Environment(OP-TEE)以及 U-Boot 的映像,并启动 TF-A 的执行。

u-boot.img

U-Boot 引导加载程序的镜像文件,它是第二阶段的引导加载程序,负责加载和运行 Linux 内核映像

uImage

带有 U-Boot 头的压缩 Linux 内核的映镜像文件

fip.img

包含 Trusted Firmware-A(TF-A)和开放可移植可信执行环境(OP-TEE)的映像

uEnv.txt

U-Boot 的环境文件。U-Boot 在初始化后会从该文件导入环境变量

ISB_SD_BOOOT.img

用于烧录 SD 卡的映像文件,包含两个分区中的所有文件

4、图形化配置

若需启用或禁用代码中的特定配置选项,可以借助图形化配置界面来操作,目前只有xboot、uboot、kernel下支持图形化配置功能开关

  • xboot: 在根目录下执行 make xconfig即可打开xboot下的图形化配置菜单

打开后显示如下所示:

在Xboot环境下,默认情况下所有功能都是启用状态,包括USB、I2C、ADC等。可能需要调整的是不同型号的内存颗粒,因为不同型号的内存颗粒可能需要不同的DDR初始化参数。

内存颗粒的选择配置,通过上下键选择下面这个选项

按下回车键后,将显示支持的LPDDR4内存列表,可以通过上下键选择与硬件平台相对应的内存颗粒型号。

选择后按下回车键退出当前配置

左右键选择【Exit】后弹出确认对话框

选择【YES】保存当前修改并退出图形化配置。

 

  • Uboot: 在根目录下执行命令 make uconfig进入uboot的图形化配置菜单

  • Kernel:在根目录下执行命令 make kconfig进入kernel的图形化配置菜单

图形化配置命令(根目录下执行)

Xboot

make xconfig

Uboot

make uconfig

Kernel

make kconfig

3、镜像烧写

1、EMMC 镜像烧写

  • 文件拷贝

在虚拟机环境下将生成的最终文件 out/ISPBOOOT.BIN 和out/ISPBOOOT1.BIN拷贝到共享文件夹内,因为我们需要将该文件拷贝到U盘或者sdcard中,然后启动平台自动的烧写到EMMC中,执行命令:

cp out/ISPBOOOT*.BIN /mnt/hgfs/VMware

拷贝后在本地的共享文件夹内看到刚才拷贝的2个文件

  • 文件烧写

1、通过Sdcard烧写

将共享文件夹内的2个文件ISPBOOOT.BIN和ISPBOOT1.BIN文件拷贝到sdcard内,然后按照下图所示插入到硬件平台,拔码开关按照图中所示切换

平台通过type-c连接串口后上电,串口的波特率配置为115200,其他配置为默认。

通过串2口终端可以看到程序的烧录流程,烧录结束后会有如下的log信息

2、U盘烧写

将共享文件夹内的2个文件ISPBOOOT.BIN和ISPBOOT1.BIN文件拷贝到U盘内,切换拨码开关如下

U盘插入USB3 TYPE-A,TYPE-C以及USB2 TYPE-A接口都可以做升级使用

U盘插入USB3 TYPE-A接口(jumper不用短接)

U盘插入USB3 Type-C 接口(使用TYPE-C接口,此处的jumper必须要短接)

U盘插入USB2 TYPE-A接口

上电后会自动进入升级流程,升级完成后的log如下:

2、SDCard 镜像烧写

在虚拟机环境下将生成的最终文件 out/boot2linux_SDcard/ISP_SD_BOOOT.img 拷贝到共享文件夹内,因为我们需要将该镜像烧写到sdcard,需要在windows环境下执行,所以需要拷贝到windows环境下:

本地电脑环境下查看共享文件夹内容,已成功的拷贝到本地目录下

https://pan.baidu.com/s/18JVfz0C6UjRO1gSALbiwxw?pwd=8c9b下载Win32DiskImager-0.9.5-binary.7z并解压

解压后文件列表如下:

将SD卡插入读卡器,然后将读卡器连接到电脑。此时,SD卡将被识别为电脑上的一个盘符,例如H盘(请根据您电脑上的实际情况选择相应的盘符)。双击运行Win32DiskImager.exe程序,它将自动检测到连接的U盘设备。如果您的电脑上连接了多个U盘,请务必在Device选项下仔细确认与SD卡相对应的盘符。

然后在打开的窗口中选中共享文件夹内的ISP_SD_BOOOT.img,点击【Write】按钮

点击【Write】后会弹出确认的对话框

选择【Yes】即可开始Sdcard烧写镜像,烧写过程中会显示进度和速度。

烧写结束后电脑端的H盘内容如下:

对应的是编译完成后的out/boot2linux_SDcard路径下的文件

至此成功的将编译生成的文件烧写到sdcard中,此时可以将sdcard插入平台开机运行

4、代码运行

1、硬件连接

1、串口连接

使用type-C接口数据线连接平台,另外一端连接到电脑

电脑端打开PuTTY或者其他串口终端,配置串口波特率为115200,其他为默认配置

串口端口号可以从电脑的设备管理器上查看

2、拨码开关选择

拨码开关是一种通过手动改变开关状态来实现不同电路连接的装置,它主要用于改变启动设备的选择信号。

开发板的硬件电路设计中,拨码开关的输出连接到芯片的启动模式选择引脚。当拨码开关设置为某个状态时,它会将对应的电平信号(高电平或低电平)传输到芯片的启动模式选择引脚。不同的电平引脚在软件处理流程中对应不同的设备的初始化流程

Boot devices

1

2

3

4

eMMC boot

1

1

1

1

SDC boot

0

0

1

1

USB boot

1

0

1

1

EMMC boot 拨码开关状态

Sdcard boot 拔码开关状态

USB boot 拔码开关状态

2、代码运行log分析

1、iboot阶段

iboot阶段是一段嵌入在芯片内部的固件代码,其主要功能是加载并启动xboot。根据下方的日志信息,我们可以观察到启动方式为【sdcard】。然后iboot会进行sdcard设备的初始化,加载并校验xboot数据,最后跳转至xboot执行。

2、xboot阶段

xboot阶段主要是初始化DDR和一些硬件初始化配置,然后加载并校验TF-A、OPTEE以及uboot数据,再跳转到TF-A代码运行,log信息如下,从中可以查看到xboot的编译时间,以及启动设备为【sdcard】,这些信息可以方便确认当前运行的代码是否和编译的代码一致。

然后进入初始化DDR流程,从log中可以看到xboot配置的DDR颗粒型号

最后加载fip.img和uboot.img,并跳转到TF-A运行(CPU从开机的32bit切换到64bit)

3、TF-A阶段

TF-A阶段主要是建立安全执环境,加载并且启动TrustZone的运行,实现CPU从安全世界切换到非安全世界的切换,以及uboot的启动

4、U-boot阶段

U-Boot 是嵌入式系统中使用的引导加载程序,它在操作系统启动之前运行,负责初始化硬件设备(如处理器、内存、存储设备等)。

从启动的log信息中可以看到uboot的编译时间,可以判断当前运行程序是否和编译的一致。

加载内核数据到内存并启动kernel,完成uboot阶段的任务

5、Kernel阶段

Kernel启动的log如下,从中也可以查看到uImage的编译时间,可以用来确认运行的代码是否和编译的一致

当运行结束后,需要输入用户名和密码,默认的用户名和密码都是sunplus

4、镜像更新

1、sdcard 更新

直接将SD Card通过读卡器插入电脑,打开对应的盘符,将编译生成的out/boot2linux_SDcard文件下对应文件拷贝到SD Card即可,如果需要更新整个rootfs,则需要通过前面镜像烧写的方式整个烧写SD card。

1、xboot更新:

虚拟机环境下: 执行make xboot rom后在out/boot2linux_SDcard目录下生成ISPBOOOT.BIN,通过cp out/bootlinux_SDcard/ISPBOOOT.BIN /mnt/hgfs/VMshare命令拷贝到共享文件夹

Windows环境下:从共享文件夹VMshare下拷贝ISPBOOOT.BIN到sdcard内即可

2、Uboot更新

执行make uboot rom后,操作方法同xboot更新一致,需要拷贝u-boot.img到sdcard内

3、dts更新

执行 make dtb uboot rom后,同xboot更新一致,拷贝u-boot.img到sdcard内

4、Kernel更新

执行make kernel rom后,同xboot更新一致,需要拷贝uImage到sdcard内

5、rootfs更新

需要通过前面镜像烧写的方式整个烧写SD card

对应的更新文件如下:

2、Emmc更新

EMMC内文件的布局分区信息如下,将EMMC划分成9个分区,不同的分区存放不同的数据,如需更新指定的分区数据,则只需单独对该分区进行数据替换

  • 分区1和分区2为uboot的数据,默认加载分区2的uboot,当加载分区2的uboot时数据出错,则会加载分区1的uboot数据。

  • 分区3为fip的数据

  • 分区7和分区8是kernel的数据备份,默认加载分区7的kernel数据

  • 分区9为rootfs的数据

EMMC的更新方式为:

1、通过dd命令更新

  1. 首先通过emmc方式启动

  2. 将需要更新的文件放在U盘或者是SDcard内,插入到平台上

  3. 挂载U盘或者SDCARD,U盘的默认节点是/dev/sda1, SDCard的默认节点是/dev/mmcblk1p1,执行下面步骤挂载

或者是

此时可以看到挂载后/mnt下面显示的就是U盘或者sdcard里面的内容。

然后通过dd命令来更新对应的分区数据,按照下面的命令执行

  • xboot.img更新

  • U-boot.img更新

  • fip.img更新

  • uImage更新

  • rootfs.img更新

2、通过fastboot更新

Fastboot 是一种电脑通过 USB 数据线对手机或其他设备固件进行刷写、擦除 / 格式化、调试、传输各种指令的固件通信协议。

  • 平台端

平台上USB2接口上不插设备,USB3切换到Type-C的模式(短接SIP3),通过TypeC将平台与电脑连接。

拔码开关切换到EMMC boot模式,然后平台上电运行,在运行到uboot阶段时,通过敲击键盘回车按键进入command line,然后执行以下命令,平台就会被识别为电脑的一个USB设备

  • 电脑端

当平台执行上面命令后,通过设备管理器,可以观察到一个未知设备(USB download gadget)。

按照以下步骤安装驱动程序

https://pan.baidu.com/s/18JVfz0C6UjRO1gSALbiwxw?pwd=8c9b下载USB驱动程序(usb_driver_r13-windows)

设备管理器未知设备上【右键选择更新驱动程序】,选择【浏览我的电脑以查找驱动程序】,然后选择【从计算机上雕刻用驱动程序列表中 选取】,选择【显示所有设备】,点击【下一步】

然后选择【从磁盘安装】,选择【Android ADB Interface】,点击【下一步】,选择下载的USB驱动程序,点击【确定】,选择【是】继续安装

点击【安装】,进入安装界面,然后会自动完成安装,安装完成后,查看设备管理器,刚才的未知设备就变为【Android ADB Interface】

 

驱动程序安装完成后,安装ADB工具,从https://pan.baidu.com/s/18JVfz0C6UjRO1gSALbiwxw?pwd=8c9b下载ADB文件

解压后直接运行Minimal ADB Fastboot v1.4.3.exe安装文件完成安装。安装完成后默认的工作路径为“c:\Program Files (x86)\Minimal ADB Fastboot

打开 “命令提示符”,定位到ADB路径,如下所示:

将编译生成的需要更新的文件拷贝到Minimal ADB Fastboot目录中,(虚拟机下通过cp命令拷贝到共享文件夹,然后从共享文件夹拷贝到ADB Fastboot目录中)

执行下面命令更新程序

  • Xboot更新

  • uboot更新

  • fip更新

  • Kernel更新

  • rootfs更新

执行成功后的状态如下图所示,在平台端和命令提示符都有对应的显示信息

执行完成后,重新启动平台即可完成升级操作。

Related content

SP7350 模型训练及平台部署
SP7350 模型训练及平台部署
More like this
Ubuntu环境搭建
Ubuntu环境搭建
Read with this
Downloading and Compiling Code
Downloading and Compiling Code
More like this
5.6 Development and implementation of FPGA experiment project
5.6 Development and implementation of FPGA experiment project
More like this
Porting siemens jailhouse to SP7021
Porting siemens jailhouse to SP7021
More like this
Secure Boot User Guide
Secure Boot User Guide
More like this