1. 摘要:
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的整个启动过程以及程序烧录的方法。
Abstract:
This article takes the AM243x multi-core chip architecture as the entry point, briefly introduces the AM243x startup process, including Power up sequence, Boot Mode selection, ROM boot process, SBL process, SBL compiling, and SYSFW introduction. Taking the ADC demo as an example, combined with the AM243x-LP evaluation board, a complete demonstration of the RBL -> SBL -> APP startup process, briefly introduces the environment setup and operation process of programming external OSPI Flash in UART mode, which is convenient for users to quickly start the application development on AM243x chips.
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。
注意: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模块是芯片启动的主控制器.
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模式;
芯片上电后一级启动过程可以分为三部分:
当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的范围。
在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 Files\OpenSSL-Win64\bin
完成后,即可导入C:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\examples\drivers\boot 中的例程,并进行编译。这里我们导入的是 sbl_ospi 这个文件夹内的工程。
Figure 19 SBL Boot Project
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:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\source\drivers\sciclient\soc\am64x_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:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\tools\boot\signing
.\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:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\tools\boot\signing,方便命令行下操作。
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:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\examples\drivers\adc\adc_singleshot\am243x-lp\r5fss0-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:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\tools\boot\sbl_prebuilt\am243x-lp\ 这个路径拷贝过来的。
其中sbl_ospi.release.tiimage 也可以使用上面我们编译成功的 sbl_ospi 工程的 tiimage 文件。uart_uniflash.py 从C:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\tools\boot 拷贝过来。ospi_sbl+app.cfg 是根据 C:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\tools\boot\sbl_prebuilt\am243x-lp\default_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条评论
快来发表一下你的评论吧 !