小猫爪:i.MX RT1050学习笔记18-安全启动2-elftosb和MfgTool(sdphost,blhost)的使用

小猫爪:i.MX RT1050学习笔记18-安全启动2-elftosb和MfgTool(sdphost,blhost)的使用

1 前言

在介绍RT1050的相关加密操作之前,我们先来介绍一下一些工具的使用。elftosb工具主要负责程序镜像格式的转换,以及给程序镜像添加相应的头信息;MfgTool则是一个简单的图形化下载解密,再使用该工具下载时,它首先会调用sdphost与bootROM通讯,并把Flashloader的镜像下载进RAM中,并跳转至Flashloader运行,再调用blhost与Flashloader通讯,完成代码的传输和下载。

2 准备工作

2.1 下载Flashloader

下载网址:<<Flashloader_i.MX RT1050>>

下载下来解压后,如下图:
在这里插入图片描述
并在Tools文件夹下新建一个文件夹cst备用,如下图:
在这里插入图片描述

2.2 准备镜像

找一个链接地址在nor FLASH(也可以是其他版本,但是后面对其进行操作的时候需要使用对应的bd文件)的镜像工程,在编译选项中去掉XIP头的宏定义,XIP_BOOT_HEADER_ENABLE=0。以IAR为例,KEIL同理。如下图:
在这里插入图片描述keil如下图:
在这里插入图片描述然后还需要两个IDE的链接文件中将头信息部分去掉。之后编译生成可执行文件。
(注意:当然也可以不去掉头信息,这样下面就可以直接省略使用elftosb加头信息的过程。这里为了体验一下完整的过程,就给去掉了。)

3 具体操作

3.1 生成启动sb文件

①将之前生成的可执行文件拷贝至文件夹***\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

在这里插入图片描述

之后就会生成添加之后的bin文件。如下图:
在这里插入图片描述

④但是这样还是不够的,因为对于存储在外部启动存储设备的镜像文件,还需要对其加上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文件。如下图:

在这里插入图片描述

3.2 烧写

①复制在上一步生成的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

在这里插入图片描述可以看到Flashloader已经启动成功。

⑥使用blhost下载sb文件:

blhost.exe -u 0x15a2,0x0073 -- receive-sb-file boot_image.sb

在这里插入图片描述
至此,程序就下载就完成了。

注意:我们还可以直接使用blhost下载镜像文件,将sb文件中的脚本指令通过blhost来完成,具体操作就不在这里演示了,推荐大家使用NXP MCUBootUtility这个软件,可以一键实现上面所有的步骤,不要太爽哦。下载链接为https://github.com/JayHeng/NXP-MCUBootUtility。)

END

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值