Other Parts Discussed in Post: UNIFLASH

作者:Yan, Leon

1. 摘要:

AM243x 是TI SitaraTm产品线最新推出的高性能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。

  • 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 的代码会涉及到以下几个部分:
  1. 设备管理;
  2. 在 BOOT_CFG中配置boot vectors,控制 R5内核的reset释放, 需特别指出,启动过程中DMSC是R5内核的控制者;
  3. 通过主DMSS(Data Movement Subsystem)和Secure Proxy进行IPC的配置;
  4. 对R5内核和SA2UL(Security Accelerator)的PLL进行配置;
  5. X509认证的解析;
  6. 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模式;

 

芯片上电后一级启动过程可以分为三部分:

  1. Hardware 部分:这里主要指电源的上电过程,以及芯片内部逻辑的初始化;
  2. 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内核开始工作;
  3. 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 Files\OpenSSL-Win64\bin

完成后,即可导入C:\ti\mcu_plus_sdk_am243x_0x_xx_xx_xx\examples\drivers\boot 中的例程,并进行编译。这里我们导入的是 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:\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 芯片的应用开发。

 

参考文档:

  1. AM243x SitaraTm Microcontrollers datasheet (Rev. B)
  2. AM64x/AM243x Technical Reference Manual (Rev. B)
  3. AM243x MCU+ SDK 08.00.00 User Guide
  4. AM243x LP User's Guide
Anonymous