/
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仓库的目录文件,里面包含的子目录文件未下载

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

git submodule update --init --recursive

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

git submodule foreach git checkout 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,

对应的硬件平台如下:

1.png

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内,然后按照下图所示插入到硬件平台,拔码开关按照图中所示切换

sd.png

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

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

2、U盘烧写

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

usb.png

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

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

aa.png

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

u3c.png

U盘插入USB2 TYPE-A接口

bb.png

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

2、SDCard 镜像烧写

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

cp out/boot2linux_SDcard/ISP_SD_BOOOT.img /mnt/hgfs/VMware

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

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接口数据线连接平台,另外一端连接到电脑

cc.png

电脑端打开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 拨码开关状态

emmc.png

Sdcard boot 拔码开关状态

sd.png

USB boot 拔码开关状态

usb.png

2、代码运行log分析

1、iboot阶段

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

2、xboot阶段

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

image-20250115-115934.png

然后进入初始化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,执行下面步骤挂载

sudo mount /dev/sda1 /mnt

或者是

sudo mount /dev/mmcblk1p1 /mnt

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

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

  • xboot.img更新

echo 0 | sudo tee /sys/block/mmcblk0boot0/force_ro sudo dd if=/mnt/xboot.img of=/dev/mmcblk0boot0 conv=fsync echo 1 | sudo tee /sys/block/mmcblk0boot0/force_ro
  • U-boot.img更新

sudo dd if=/mnt/u-boot.img of=/dev/mmcblk0p2 conv=fsync
  • fip.img更新

sudo dd if=/mnt/fip.img of=/dev/mmcblk0p3 conv=fsync
  • uImage更新

sudo dd if=/mnt/uImage of=/dev/mmcblk0p7 conv=fsync
  • rootfs.img更新

sudo dd if=/mnt/rootfs.img of=/dev/mmcblk0p9 conv=fsync

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更新

fastboot flash mmc0boot0 xboot.img
  • uboot更新

fastboot flash uboot2 u-boot.img
  • fip更新

fastboot flash fip fip.img
  • Kernel更新

fastboot flash kernel uImage
  • rootfs更新

fastboot flash rootfs rootfs.img

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

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

Related content