在介绍RT1050的相关加密操作之前,我们先来介绍一下一些工具的使用。elftosb工具主要负责程序镜像格式的转换,以及给程序镜像添加相应的头信息;MfgTool则是一个简单的图形化下载解密,再使用该工具下载时,它首先会调用sdphost与bootROM通讯,并把Flashloader的镜像下载进RAM中,并跳转至Flashloader运行,再调用blhost与Flashloader通讯,完成代码的传输和下载。
下载网址:<
下载下来解压后,如下图:
并在Tools文件夹下新建一个文件夹cst备用,如下图:
找一个链接地址在nor FLASH(也可以是其他版本,但是后面对其进行操作的时候需要使用对应的bd文件)的镜像工程,在编译选项中去掉XIP头的宏定义,XIP_BOOT_HEADER_ENABLE=0。以IAR为例,KEIL同理。如下图:
keil如下图:
然后还需要两个IDE的链接文件中将头信息部分去掉。之后编译生成可执行文件。
(注意:当然也可以不去掉头信息,这样下面就可以直接省略使用elftosb加头信息的过程。这里为了体验一下完整的过程,就给去掉了。)
①将之前生成的可执行文件拷贝至文件夹***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win下。
②开启一个cmd命令创建,切换路径至***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win。如下图:
③输入以下指令给镜像添加IVT,bootdata等头信息,如果是加密镜像,则还有csf信息(如果在准备镜像中,没有去掉头信息,这一步则可以省略):
在添加IVT头信息之前,还需要修改一下bd文件中的几个参数,目的就是保证IVT头信息的正确性,这样才能保证程序的正常运行,bd文件中相关ivt部分的修改意见列在下面 ,我们找到flexnor对应的bd文件(Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\bd_file\imx10xx\imx-flexspinor-normal-unsigned.bd),如下:
options {
/*flags标明了最后生成镜像的种类,每一位标明了一个特征
• bit 2 - Encrypted image flag 加密
• bit 3 - Signed image flag 签名
• bit 4 - Plugin image flag 插件
比如:
• 0x00 - unsigned image
• 0x08 - signed image
• 0x04 - encrypted image (encrypted image is always a signed image)
• 0x18 - signed plugin image */
flags = 0x00;
/*该值就是整个镜像存储的地址*/
startAddress = 0x60000000;
/*该值是ivt存储地址相对startAddress 的偏移地址,一般为0x1000和0x400,这个值需要根据启动设备
类型来判定,一般对于XIP设备是0x1000,对于non-XIP设备时0x400*/
ivtOffset = 0x1000;
/*APP可执行代码相对startAddress的偏移地址,也就是中断向量表相对startAddress的偏移量*/
initialLoadSize = 0x2000;
/*DCD数据的路径,必须是有效路径,如果没有DCD数据,直接注释掉*/
//DCDFilePath = "dcd.bin";
/*查看map文件,找到Reset_Handler的链接地址,或者直接查看镜像文件,找到入口地址
当然同时你也可以设置其他的入口地址,但是默认设置Reset_Handler*/
entryPointAddress = 0x60002415;
#Please set the entryPointAddress to Reset_Handler address
}
sources {
elfFile = extern(0);
}
section (0)
{
}
再输入以下命令:
elftosb.exe -f imx -V -c ../../bd_file/imx10xx/imx-flexspinor-normal-unsigned.bd -o iled_blinky.bin iled_blinky.s19
④但是这样还是不够的,因为对于存储在外部启动存储设备的镜像文件,还需要对其加上FCB和脚本等信息才能保证镜像下载进FLASH以及镜像的正常启动。我们可以打开一个生成sb文件bd文件看一下,比如program_flexspinor_image_hyperflash.bd:
sources {
myBinFile = extern (0);
}
constants {
kAbsAddr_Start= 0x60000000;
kAbsAddr_Ivt = 0x60001000;
kAbsAddr_App = 0x60002000;
}
# The section block specifies the sequence of boot commands to be written to the SB file
section (0) {
#1. Prepare Flash option
load 0xc0233007 > 0x2000;
# Configure HyperFLASH using option a address 0x2000
enable flexspinor 0x2000;
#2 Erase flash as needed.(Here only 1MBytes are erased)
erase 0x60000000..0x60100000;
#3. Program config block
# 0xf000000f is the tag to notify Flashloader to program FlexSPI NOR config block to the start of device
load 0xf000000f > 0x3000;
# Notify Flashloader to response the option at address 0x3000
enable flexspinor 0x3000;
#5. Program image
load myBinFile > kAbsAddr_Ivt;
}
可以看到其类似一个运行脚本,其实这就是Flashloader的运行脚本,这些步骤相当于在给Flashloader发送命令和参数,让Flashloader完成一系列的操作,最终完成程序的组成和下载。
输入以下命令生成sb文件(因为我使用的板子上的flash是hyperflash,所以我选择的bd文件是program_flexspinor_image_hyperflash.bd,大家需根据实际情况自己选择):
elftosb.exe -f kinetis -V -c ../../bd_file/imx10xx/program_flexspinor_image_hyperflash.bd -o boot_image.sb iled_blinky_nopadding.bin
①复制在上一步生成的sb文件boot_image.sb去文件夹***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware下,如下图:
②使BOOT_CFG=0x01,进入Serial Download模式,然后连接PC与芯片。
③进入文件夹***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel下,双击打开MfgTool2.exe。
点击Start下载程序。
这样程序就下载完成了,切换RT1050使其从FLASH启动。
前面说到mfgtools其实是sdphost,blhost的图形化封装形式,接下来我们看看我们怎么使用sdphost,blhost实现代码的下载。
①首先在\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools下新建一个test文件夹,并把Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\sdphost\win\sdphost.exe和Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\blhost\win\blhost.exe两个文件拷贝至test文件夹下(编译操作),再将flashloader镜像(Flashloader_RT1050_1.1_2_encrypted\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware\ivt_flashloader.bin)和经过elftosb.exe转换后的sb镜像文件也拷贝至该文件夹下, 如下:
②使BOOT_CFG=0x01,进入Serial Download模式,然后连接PC与芯片。开启cmd命令窗口,并切换路径至test文件夹下,使用sdphost命令确认板子是否连接成功:
sdphost.exe -u 0x1fc9,0x0130 -- error-status
③打开ivt_flashloader.bin查看bootdata数据,找到start地址(flashloader默认连接地址都是一样的):
然后使用sdphost将ivt_flashloader.bin烧写至bootdata的start地址处,我的地址为0x20000000,所以我的命令如下:
sdphost.exe -u 0x1fc9,0x0130 -- write-file 0x20000000 ivt_flashloader.bin
④使用sdphost跳转命令,跳转至flashloader的IVT头处:
sdphost.exe -u 0x1fc9,0x0130 -- jump-address 0x20000400
至此,Flashloader就算启动完成了,jump-address命令执行完成之后,会发现USB设备被重新枚举了,此时新枚举的USB-HID设备是Flashloader里的通信外设。
⑤使用blhost确认Flashloader是否成功启动:
blhost.exe -u 0x15a2,0x0073 -- get-property 1
⑥使用blhost下载sb文件:
blhost.exe -u 0x15a2,0x0073 -- receive-sb-file boot_image.sb
(注意:我们还可以直接使用blhost下载镜像文件,将sb文件中的脚本指令通过blhost来完成,具体操作就不在这里演示了,推荐大家使用NXP MCUBootUtility这个软件,可以一键实现上面所有的步骤,不要太爽哦。下载链接为:https://github.com/JayHeng/NXP-MCUBootUtility。)