AM243x 是TI Sitara产品线推出的高性能MCU+产品,是一种性能强劲的多核异构MCU,拥有4颗800MHz 主频的Cortex R5F核心和1颗400MHz 主频的Cortex M4F,以及专门针对多协议工业通信总线的2个PRU_ICSSG(2× Gigabit Industrial Communication Subsystems)模块,可以实现Profinet IRT,Profinet RT,EtherNet/IP,EtherCAT等通信方式。
在这类多核异构MCU / CPU产品开发中,由于芯片在电源轨上的复杂性以及外设的丰富程度,不可避免的会接触到系统复杂的boot环节,以及多核调试带来的挑战,本文以AM243x-LP评估板为例,对AM243x的booting相关内容进行了初步的介绍,并完整演示了RBL-SBL-APP的整个启动过程以及程序烧录的方法。
本文以AM243x多核芯片体系结构为切入点,简要介绍了AM243x的启动过程,包括加电顺序、引导模式选择、ROM引导过程、SBL过程、SBL-编译和SYSFW介绍。以ADC演示为例,结合AM243x LP评估板,完整演示了RBL->SBL->APP启动过程,简要介绍了在UART模式下编程外部OSPI Flash的环境设置和操作过程,方便用户在AM243x芯片上快速启动应用程序开发。
2. AM243x 上电后的Booting环节:
下图是AM243x完整的boot流程:
ROWER ON -> ROM Bootloader(RBL) -> Secondary Bootloader(SBL) -> Application Binary。 上电后,芯片进行内部逻辑的初始化,之后先执行ROM中的BOOT代码,再执行用户自定义的二级BOOT代码,最后执行应用程序.
Figure 1 BOOT 启动流程
2.1 上电时序和启动方式介绍
AM243x 芯片拥有多个电源域,为不同的内部逻辑和外设供电,,下图是AM243x的上电时序图,可以在datasheet找到更详细的介绍。
Figure 2 Power Sequence
在满足供电时序的情况下,MCU_PORz信号最终释放了对内核复位的控制, MCU_PORz的上升沿会锁存SYS_BOOTMODE[0:15]这些管脚的上下拉状态,并由此确定芯片的启动模式和启动介质,然后由ROM Bootloader来读取启动信息。
AM243x 有两种主要的启动方式:Host boot modes 和 Memory boot modes。
Host boot modes:MCU从不同的外设进行启动,比如从UART、Ethernet、USB等接口启动;
Memory boot modes:MCU从不同的外部存储介质,比如QSPI Flash、I2C EEPROM、SD卡、U盘等存储器启动;
注意:AM243x 有Primary Boot和Backup Boot功能,这意味着AM243x在Primary Boot失败的情况下可以用 Backup Boot 来启动,这个可以由 BOOTMODE 管脚进行设置。
关于 BOOTMODE 管脚配置,我们可以看到是由16根信号线组成,其中高两位为Reserved。其16bit对应的是BOOTMODE 00-15这16根信号线,原理图中对应的管脚为GPMC0_AD0 – 15。
Figure 3 BOOTMODE Pin Mapping
PLL Config 针对不同的外部晶振频率进行配置。
Figure 4 PLL Reference Clock Selection
Primary Boot 模式如下:
Figure 5 Primary Boot Mode Selection
Backup Boot 模式如下:(注意Backup模式下可启动的方式较少)
Figure 6 Backup Mode Selection
注意:由于ROM Code对不同的启动接口或介质使用的管脚是固定的,在设计的过程中需要注意选择对应的管脚,详细的管脚信息可以在Technical Reference Manual中查看。
2.2 ROM启动过程介绍
AM243x的ROM Code分为两部分,分别是DMSC ROM code和Public ROM code,这里DMSC的全称为Device Management Security Controller,内部是一个主频250MHz 的Cortex M3协处理器, DMSC模块是芯片启动的主控制器.
DMSC ROM code:DMSC ROM 的代码会涉及到以下几个部分:
设备管理;
在 BOOT_CFG中配置boot vectors,控制 R5内核的reset释放, 需特别指出,启动过程中DMSC是R5内核的控制者;
通过主DMSS(Data Movement Subsystem)和Secure Proxy进行IPC的配置;
对R5内核和SA2UL(Security Accelerator)的PLL进行配置;
X509认证的解析;
SHA512算法对image integrity check的SA2UL配置;
Public ROM code:下图是Public ROM code的框架。
Figure 7 Public ROM Code Architecture
Main Module是整个Public ROM code的顶层代码循环,它可以调用X509密码认证模块、Log Trace模块、System模块以及外设驱动的相关功能代码,在这里会重复执行直到MCU接收到完整的boot image,也可以被 DMSC置于sleep模式;
芯片上电后一级启动过程可以分为三部分:
Hardware 部分:这里主要指电源的上电过程,以及芯片内部逻辑的初始化;
DMSC部分:DMSC ROM Code 会首先配置启动过程中看门狗WDT的溢出时间为180秒,接下来配置MCU PLL,根据不同Boot Mode进行相应的Firewall配置,MCU的Secure Proxy/Ring Accelerator,然后DMSC会给MCU发送Boot Mode Info,最终DMSC释放R5内核的Reset信号,R5内核开始工作;
R5 内核部分:R5 内核拿到DMSC发送的Boot Device Info(由BOOTMODE管脚的配置决定)后,通过对应的Boot模式开始启动,R5内核会请求DMSC对接收到的image代码进行image integrity check,如果成功则继续向下执行,如果Primary Boot的image无效,R5会切换到Backup Mode 进行boot image接收并再次调用DMSC进行image integrity check,这样重复执行调用,直到180秒看门狗溢出为止,这时MCU会被复位,重复上面的所有流程。
当image integrity check成功后,R5内核会对Main Domain的PLL进行配置,接下来DMSC会停止Clock并且Reset R5,R5在复位结束后开始执行Boot Image(这里在RAM里面的Boot Image不受R5复位的影响,处于保持状态),整个Boot流程完成,芯片开始二级BOOT流程。
Figure 8 Boot Process
2.3 二级SBL启动过程介绍
SBL的全称是Second boot loader,用于完成芯片的一些初始配置,拷贝DMSC的SYSFW到片内RAM以及加载多核应用代码。 下图是一个典型的SBL流程. DMSC模块会再次启动WDT看门狗并设定开门狗溢出时间为180秒。 R5 core 0执行SBL代码,先拷贝FLASH上的DMSC SYSFW到片内RAM, DMSC ROM代码对SYSFW image 进行完整性检查后,将SYSFW加载到DMSC模块,之后DMSC模块会跳出DMSC ROM代码,改为执行DMSC SYSFW代码。 SBL会继续加载和解析R5核的应用代码并根据Image信息设定启动地址,完成后会请求DMSC 释放其他R5核的复位信号,所有内核开始执行程序.
Figure 9 SBL Boot Process
3. AM243x-LP 使用介绍:
AM243x-LP评估板提供了丰富的功能和接口,XDS110调试器也被集成在电路板上面,方便用户的烧录调试,同时USB转UART功能也通过同一USB接口实现,用于串口log信息的打印。
Figure 10 System Architecture
评估板上的另一个USB Type C接口用来供电,整板的电流会在2A左右,这里建议先连接Micro USB,建立串口连接后,然后再连接USB Type C接口。USB Type C的连接线需要使用标准的全功能连接线,否则无法与评估板上的CC逻辑控制器TUSB320LAIRWBR进行正常通信,造成输出电流配置不正常,无法正确对评估板供电。
Figure 11 AM243x-LP Board
正常连接两根USB线之后,板子上会有4个LED灯点亮,分别是LD6、LD7、LD8和LD11四个绿色LED灯。LD9红色灯会在USB Type C插入的瞬间亮一次,之后熄灭,如果常亮,则代表供电有问题。
Figure 12 AM243x-LP Board LED Status
在Micro USB线连接后,Windows系统会进行XDS110的驱动安装(CCS安装时会自带驱动),安装完成后,会在设备管理器里面出现两个对应设备,如下图。
Figure 13 AM243x-LP Board USB Port
User UART对应的是用户可用的USB转串口打印log的端口,在AM243x-LP评估板中对应的是AM243x的MAIN_UART0接口。
下图是AM243x-LP评估板上的四个按键,其功能分别如下:
Figure 14 AM243x-LP Board Push Buttons
在理解这几种不同的Reset之前,我们先看看AM243x整个芯片构成的两个Domain,分别是MCU Domain和Main Domain,它们分别由下面的子模块构成。
Figure 15 AM243x Power Domain
我们可以看到在不同的Domain里面包含了不同的模块和外设,这个就决定了不同Domain对不同外设和模块的控制权。在Reset部分,可以通过不同的Reset源对不同的Domain进行独立控制,也可以通过配置改变其控制Domain的范围。
MCU_PORz:可以看作整个芯片(MCU+MAIN)的冷启动复位,可以进行动态Boot Mode更改而不用断电;
MCU_RESETz:MCU Domain的热复位;
SoC_RESET_REQz: Main Domain的热复位;
在AM243x-LP评估板上可以由8位拨码开关来更改Boot配置,其中第8位没有使用,是悬空状态,下面的表格列出了这7位配置对应的Boot Mode情况。
Figure 16 AM243x LP Boot Mode Selection Table
其中常用的三种模式如下图所示:
Figure 17-1 AM243x LP Boot Mode Switch
关于 Backup Boot Mode,在AM243x-LP是默认配置为NONE模式(BOOTMODE13:10 = x 0 0 0),这里暂时不用关心。
Figure 17-2 AM243x LP Boot Mode Switch (Backup Mode Configuration)
可以在断电状态下更改拨码开关的配置,然后重新上电。或者在通电的情况下改变拨码开关,然后用SW1按钮实现MCU_PORz冷复位以使得新的Boot Mode生效。
4. SDK 例程中 SBL 的介绍:
如果要对 SDK 中的 SBL 程序在CCS中进行编译,需要额外安装OpenSSL,可以在下面的地址下载light版本,
https://slproweb.com/download/Win64OpenSSL_Light-3_0_0.exe
在安装的过程中,注意选择 The Windows system directory选项。
Figure 18 OpenSSL Installation
安装完成后,需要在windows系统的Path变量中加入下面的路径。
C:Program FilesOpenSSL-Win64bin
完成后,即可导入C:timcu_plus_sdk_am243x_0x_xx_xx_xxexamplesdriversboot 中的例程,并进行编译。这里我们导入的是 sbl_ospi 这个文件夹内的工程。
Figure 19 SBL Boot Project
SBL NULL:这个SBL只做了MCU的初始化并且把内核至于WFI模式(Wait For Interrupt);
SBL OSPI:初始化MCU并且从OSPI Flash 的 0x80000地址读取并启动多核appimage代码;
SBL OSPI Multi-Partition:初始化MCU并且从OSPI Flash 不同的偏移地址读取各个内核的代码;
SBL UART:初始化MCU并且从UART通过Xmodem协议读取并启动多核appimage代码;
SBL UART Uniflash:配合py脚本的flash writer程序,用来烧录OSPI Flash;
4.1 SBL boot image 创建
SBL 与一般的应用程序类似,可以通过CCS来创建并编译,在从 .out文件到boot image的转化过程,其详细情况如下:
虽然SBL工程与应用程序类似,但SBL 的入口地址与用户应用程序的入口地址有所不同。在AM243x 的 ROM code 会把程序的入口地址同时配置给 both R5FSS0-0 和R5FSS0-1两个内核。 考虑到SBL只运行在R5SS0-0上,我们需要把R5FSS0-1置于WFI模式,只运行R5FSS0-0内核,这个操作可以通过增加link参数 -e_vectors_sbl 来实现。
Figure 20 AM243x Link Command
在进入main()函数之后,首先必须调用Bootloader_socLoadSysFw 来加载 SYSFW 到 DMSC 的Cortex M3内核,进行 board config 操作。
备注:SYSFW默认以 .h 头文件的形式被编译链接到SBL,启动过程中会发送到DMSC内核的专有RAM区域,SYSFW的文件内容在 C:timcu_plus_sdk_am243x_0x_xx_xx_xxsourcedriverssciclientsocam64x_am243x sysfw_signed.h 里面。
Figure 21 Bootloader_socLoadSysFw
在SBL里,vectors默认被链接到0x7000000,而且SBL中不能使用ATCM(A Tightly-Coupled Memory)和BTCM(B Tightly-Coupled Memory)的地址空间,SBL 只能使用 0x70000000到0x70080000这个地址范围的空间,包含code、data、stack之类。
在编译后,SBL的 .out 文件会通过GCC的objcopy转换成 .bin 文件,接下来会通过 Signing Scripts 签名生成可启动的 .tiimage 文件,在这里会使用一个默认的key来签名,即使是非安全启动MCU芯片也需要走这个流程。这个 Signing Script 会用到前面安装的 OpenSSL。
RBL在加载SBL的时候是需要SBL为被签名的格式,可以通过下面的命令来对SBL进行签名。
cd C:timcu_plus_sdk_am243x_0x_xx_xx_xxtoolsbootsigning
.x509CertificateGen.ps1 -b {BOOTIMAGE_BIN_NAME} -o {BOOTIMAGE_NAME} -c R5 -l 0x70000000 -k rom_degenerateKey.pem -d DEBUG -j DBG_FULL_ENABLE -m SPLIT_MODE
这里我们用一个例程生成的bin文件来演示一下,首先拷贝CCS生成的bin文件到C:timcu_plus_sdk_am243x_0x_xx_xx_xxtoolsbootsigning,方便命令行下操作。
Figure 22 Signing Files Folder
注意:这里要用到 Windows 10下面的Powershell命令行环境,在开始菜单输入Powershell并执行,即可进入界面,公司的电脑有可能对Powershell的执行权限有限制,这个在执行的时候会提示。
.x509CertificateGen.ps1 -b sbl_ospi_am243x-lp_r5fss0-0_nortos_ti-arm-clang.bin -o sbl_ospi_am243x-lp.tiimage -c R5 -l 0x70000000 -k rom_degenerateKey.pem -d DEBUG -j DBG_FULL_ENABLE -m SPLIT_MODE
至此,我们在这里可以看到最终生成的可以用来启动的SBL的 tiimage 文件。
Figure 23 Powershell console command execution
Figure 24 Signing result of tiimage
5. SBL 烧录并引导应用程序运行:
下面我们快速验证一下SBL配合用户应用程序进行boot并运行的情况。
5.1 安装Phython 脚本
板载外部QSPI Flash需要通过python脚本进行烧录,所需的Python 3 环境下载地址如下。
https://www.python.org/downloads/windows/
注意安装Python的时候需要选择把Python的路径加入到系统路径,安装完成后可以在CMD Console下验证是否安装成功。
Figure 25 Python Installation
Figure 26 Python Environment Check
接下来需要执行下面的命令安装与串口下载相关的组件,注意需要在管理员模式打开cmd窗口。
pip install --upgrade pip
pip install pyserial xmodem tqdm
Figure 27 Python toolset installation
5.2 生成应用代码Image
打开 CCS后,导入SDK的ADC驱动例程,路径如下。
C:timcu_plus_sdk_am243x_0x_xx_xx_xxexamplesdriversadcadc_singleshotam243x-lpr5fss0-0_freertos
Figure 28 Import SDK ADC example into CCS
Figure 29 Confirm the example import
Figure 30 Build the example
编译完工程后,我们可以看到生成的相关文件,其中.appimage是应用程序要烧录到外部 SPI Flash的文件。
5.3 使用UART 启动模式烧录OSPI SBL文件和应用代码Image
接下来的烧录操作需要在windows的command console里操作,为了方便这个流程,我们可以利用bat文件来直接执行,提高效率。
在ccs的workspace目录中adc_singleshot_am243x-lp_r5fss0-0_freertos_ti-arm-clang工程目录下,我们新建一个文件夹,暂且命名为AM243xProgFlash,如下图:
Figure 31 UART programing script files
在这个文件夹里面,@Prog-Boot+App.bat 是手工创建的,里面执行了简单的python命令,sbl_ospi.release.tiimage、sbl_uart_uniflash.release.tiimag是从 C:timcu_plus_sdk_am243x_0x_xx_xx_xxtoolsbootsbl_prebuiltam243x-lp 这个路径拷贝过来的。
其中sbl_ospi.release.tiimage 也可以使用上面我们编译成功的 sbl_ospi 工程的 tiimage 文件。uart_uniflash.py 从C:timcu_plus_sdk_am243x_0x_xx_xx_xxtoolsboot 拷贝过来。ospi_sbl+app.cfg 是根据 C:timcu_plus_sdk_am243x_0x_xx_xx_xxtoolsbootsbl_prebuiltam243x-lpdefault_sbl_ospi.cfg 文件修改的。
下面是 @Prog-Boot+App.bat和 ospi_sbl+app.cfg 两个文件的内容。
@Prog-Boot+App.bat 文件:这里需要注意 COM17 根据自己的情况来修改PC端烧录端口。
@echo off
echo+
echo+
echo **********************************************************************
echo Start to Program "QSPI Bootloader" and "App Image" to QSPI Flash......
echo **********************************************************************
echo+
echo+
python uart_uniflash.py -p COM17 --cfg= ospi_sbl+app.cfg
echo+
echo+
echo ******** Finished!!! ********
echo+
echo+
pause
ospi_sbl+app.cfg 文件:这里注意黄色标识部分的路径和文件名。
#-----------------------------------------------------------------------------#
# #
# DEFAULT CONFIGURATION FILE TO BE USED WITH THE FLASHWRITER SCRIPT #
# #
#-----------------------------------------------------------------------------#
#
# By default this config file,
# - points to pre-built flash writer, bootloader for this LP
# - The application image points to relative path of the ipc echo application image for this LP
# - Make sure this application is built before running this script
# - You can customized this config file to point to your own bootloader and/or application images
# - You can use --operation=flashverify if you just want to verify the flash contents and not flash the file.
#
# First point to sbl_uart_uniflash binary, which function's as a server to flash one or more files
--flash-writer=sbl_uart_uniflash.release.tiimage
# Now send one or more files to flash or flashverify as needed. The order of sending files does not matter
# Program the OSPI PHY tuning attack vector
--operation=flash-phy-tuning-data
# When sending bootloader make sure to flash at offset 0x0. ROM expects bootloader at offset 0x0
--file=sbl_ospi.release.tiimage --operation=flash --flash-offset=0x0
# When sending application image, make sure to flash at offset 0x80000 (default) or to whatever offset your bootloader is configured for
--file=../Debug/adc_singleshot_am243x-lp_r5fss0-0_freertos_ti-arm-clang.appimage --operation=flash --flash-offset=0x80000
# send the XIP image for this application, no need to specify flash offset since flash offset is specified within the image itself
#--file=../Debug/adc_singleshot_am243x-lp_r5fss0-0_freertos_ti-arm-clang.appimage_xip --operation=flash-xip
准备好这些文件后,把AM243x-LP配置为UART boot后上电,双击执行@Prog-Boot+App.bat即可烧录。
Figure 32 UART Programing Result
5.4 使用UART 启动模式烧录QPSI SBL文件和应用代码Image
烧录完成后,切换AM243x-LP为 QSPI BOOT 模式,用按键SW1 MCU_PORZ复位系统,可以看到串口输出的信息,这里可以看到OSPI Bootloader 的信息和 ADC demo 的信息输出,到此完成了 RBL-SBL-APP 的启动过程。
Figure 33 ADC Program Running Result
6. 总 结:
由于此类多核异构MCU的构架与通用MCU的构架差异较大,在启动和调试带来的挑战也是显而易见的。本文以AM243x的芯片构架为切入点,简要的介绍了AM243x的启动流程以及涉及到的SBL相关内容,以ADC demo为例,结合AM243x-LP评估板,完整演示了RBL-SBL-APP 的启动过程,简要介绍了 UART 模式烧录外部OSPI Flash的环境搭建和操作流程,方便用户快速进入AM243x 芯片的应用开发。
全部0条评论
快来发表一下你的评论吧 !