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
输入命令即可开始下载
下载完成后,将生成一个名为q654的目录,其中包含了q654仓库的目录文件,里面包含的子目录文件未下载
执行以下命令抓取子目录代码:
执行以下命令切换到master分支:
下载完成后,对应目录文件大小为:
3、目录结构
文件目录以及功能说明
boot |
|
|
---|---|---|
| draminit | DDR的初始化代码 |
| trusted-firmware-a | ARM 开源的固件框架(TF-A),主要用于ARM架构的处理器和设备,它提供了一组安全和可信任的软件组件,用于引导和初始化系统,本项目中实现了arm运行环境从非安全世界切换到安全世界以及电源管理的功能 |
| xboot | xboot代码,主要实现了硬件的初始化(emmc/sdcard/ddr)以及启动uboot |
| uboot | uboot源码,用于升级系统以及启动kernel |
build |
| 存放Makefile、加密以及ISP升级打包处理的工具 |
---|
crossgcc |
| 存放不同环境下编译所需的交叉工具链 |
---|
firmware |
|
|
---|---|---|
| arduino_core_sunplus | CM4基于arduino的代码,主要实现suspend/resume的控制 |
ipack |
| 用于spinor flash的打包处理,emmc/sdcard 启动不会使用 |
linux |
|
|
---|---|---|
| kernel | kernel内核源码 |
| rootfs | 文件系统目录 |
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流程即可
获取到文件系统列表以后,会显示如下的文件系统列表,根据自己的需求,选择合适的文件系统
BusyBox 一个开源的、多功能的软件套件,提供了linux常用的工具,它的主要特点是占用系统资源少、启动速度快、体积小等优势,适合一些简单的功能开发
【2】-【4】Ubuntu Server主要用于服务器类的应用,与其他的ubuntu的主要差异在于没有桌面环境
【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命令更新
首先通过emmc方式启动
将需要更新的文件放在U盘或者是SDcard内,插入到平台上
挂载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更新
执行成功后的状态如下图所示,在平台端和命令提示符都有对应的显示信息
执行完成后,重新启动平台即可完成升级操作。