查看: 1946|回复: 0

i.MX RT系列MCU启动那些事(4)- Flashloader初体验

[复制链接]
  • TA的每日心情
    开心
    2021-12-31 14:33
  • 签到天数: 45 天

    [LV.5]常住居民I

    48

    主题

    131

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1129
    最后登录
    2024-3-29
    发表于 2019-6-17 10:17:48 | 显示全部楼层 |阅读模式
    i.MX RT没有内置Flash,只有一块ROM区用于启动系统,并运行放在片外存储器中的代码。本站将连载痞子衡撰写的,关于i.MX RT产品启动相关的一系列文章,下面是系列中的第四篇。点击下面链接阅读前三篇:i.MX RT系列MCU启动那些事(1)- Boot简介
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT系列MCU的Flashloader。

    在上一篇文章“串行下载模式”里,痞子衡为大家介绍了i.MX RT中Boot的Serial Downloader模式,这种模式主要是用来引导启动Flashloader,那么Flashloader到底具有哪些功能?这是本篇文章痞子衡要为大家解惑的主题。

    痞子衡在前面提过,Flashloader程序主要是用来将你的应用程序,下载进i.MX RT支持的所有外部非易失性存储器中,为后续从外部存储器启动做准备。BootROM只有启动应用程序功能,没有下载更新应用程序功能,而Flashloader最核心的就是下载更新应用程序功能,所以Flashloader是BootROM的完美补充。

    你可能会问,为什么不把Flashloader的下载更新应用程序的功能,也放进BootROM里?痞子衡个人觉得应该是芯片成本问题,ROM的空间是有限的(RT102x和RT105x的ROM为96KB,RT106x的ROM是128KB),如果把Flashloader功能也放进BootROM里,势必要扩大ROM空间,有可能导致芯片成本上升。做成二级Flashloader既不占ROM空间,也可以方便Flashloader程序自身的维护升级,目前RT1050的Flashloader版本是1.1,你看,这不显然升级过嘛。

    站长认为,不把Flashloader放进ROM的一大好处是,用户可以按照自己的需要,定制自己的Flashloader。

    一、进入Flashloader程序

    1.1 官方程序包
    恩智浦提供了 Flashloader程序包,你首先需要下载这个Flashloader包,Flashloader所有相关资源全在包里面。注:每个i.MX RT子系列均有一个以子系列名字命名的Flashloader包,即Flashloader程序并不是通用的,此处以RT1050系列为例:
    010.png
    Flashloader程序是:

    \Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Flashloader\flashloader.elf

    Flashloader工具在这个目录下:

    \Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools

    1.2 三种引导方式
    其实引导启动Flashloader的方式并不唯一,Flashloader就是一段运行在SRAM中的应用程序而已,只要能有工具将Flashloader下载进SRAM,并将CPU的PC指针指向Flashloader的程序入口便可启动Flashloader。下面痞子衡分别介绍3种引导方式:

    1.2.1 标准方式:通过sdphost
    第一种引导方式是通过BootROM的Serial Downloader模式和sdphost.exe工具,这是恩智浦官方推荐的方式,这种方式在上一篇文章里已经详细介绍过了,这里不再赘述。

    这种方式的优点是不需要外接调试器,缺点是涉及到BootROM启动以及IVT的知识,需要有BootROM相关知识储备。

    1.2.2 简便方式:通过J-Link Commander
    第二种引导方式是通过外接J-Link调试器和J-Link Commander工具(JLink.exe)。

    i.MX RT芯片JTAG口连接上J-Link调试器后,安装好Jlink驱动(痞子衡安装的是v6.30e版本),打开J-Link Commander(即\SEGGER\JLink_V630e\JLink.exe),连接上i.MX RT的核心,按顺序执行如下JLink命令:

    J-Link>loadfile C:\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Flashloader\flashloader.srec

    Downloading file [C:\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Flashloader\flashloader.srec]...
    O.K.
    J-Link>mem32 0x20002000 2

    20002000 = 20215A70 20014B91
    J-Link>wreg MSP 20215A70

    MSP = 0x20215A70
    J-Link>wreg PSP 20215A70

    PSP = 0x20215A70
    J-Link>SetPC 20014B91
    J-Link>g

    到这里Flashloader就已经被成功启动了,可能有朋友看不懂上面的一串JLink命令,痞子衡为大家解释一下:
    > loadfile命令用于将Flashloader程序数据(.srec格式,含地址信息)下载进SRAM(0x20002000)中;
    > mem32命令用于从起始下载地址(0x20002000)读回部分数据(8字节),确认上一步的下载操作是否成功,并且获取Flashloader的起始SP和PC值。
    > wreg命令用于设置R13(MSP/PSP)寄存器的值,使其等于Flashloader的初始SP值。
    > SetPC命令用于设置R15(PC)寄存器的值,使其指向Flashloader的初始PC。
    > g命令用于让CPU核心开始执行代码(Flashloader程序)。

    这种方式的优点是不需要借助BootROM,即你可以不用了解BootROM相关工具用法,缺点是需要额外准备一个J-Link调试器。

    注:关于JLink命令的详细解释请查阅JLink驱动软件安装目录下:

    \SEGGER\JLink_V630e\Doc\UM08001_JLink.pdf文档里的3.2 J-Link Commander (Command line tool)一节。

    1.2.3 高级方式:通过Ozone
    前两种引导方式都是把Flashloader程序当做黑盒子,只需要将其启动运行即可,接下来痞子衡介绍的引导方式,可以让你看到Flashloader源代码,并且可以让你调试Flashloader。
    100.png
    确认elf文件后,点击“Download & Reset Program”
    200 .png
    这第三种引导方式还是通过外接J-Link调试器,但还需要一个特殊的软件,即SEGGER公司提供的Ozone软件,去SEGGER先下载Ozone软件(痞子衡下载的版本是v2.56c),下载安装后打开Ozone软件,第一步选择CM7,第二步选择SWD,第三步选择elf文件时要选择Flashloader下载包里的flashloader.elf

    此时Flashloader程序已经被下载进i.MX RT中,并且在Disassembly(反汇编)窗口可以看到Flashloader汇编源程序,接下来你就可以开始调试执行Flashloader程序。

    由于下载包里的flashloader.elf文件,并没有包含所有Flashloader工程的信息(至少没有包含C代码信息),所以我们使用Ozone软件调试看不到C代码,稍微有点遗憾。
    300.png
    1.3 支持的通信外设引脚
    Flashloader支持的通信外设,与BootROM支持的通信外设是一模一样的,也是USB-HID和UART,并且引脚也一样(适用RT105x和RT102x):
    400.png
    注: 如果硬件板上UART_RX引脚没有接上拉电阻,可能会导致USB-HID设备枚举成功率降低,因为UART_RX悬空输入会有干扰数据,使得Flashloader误以为UART是active peripheral,所以为安全起见,请保证UART_RX引脚连接上拉电阻。

    二、blhost/elftosb/mfgtool的使用

    Flashloader配套上位机工具有3个

    elftosb.exe用于生成sb格式文件(这个工具后续会详细介绍),

    mfgtool是GUI软件(上一篇文章已经介绍过,其主要配合sb文件使用),

    blhost.exe是痞子衡在这里要着重介绍的软件。

    blhost.exe是命令行工具,使用blhost既可以通过UART口,也可以通过USB口与Flashloader进行通信与命令交互。
    在命令行下打开blhost.exe,输入-?命令可以看到blhost使用帮助,相比sdphost,blhost支持的命令更多:

    PS C:\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\blhost\win> .\blhost.exe -?
    usage: C:\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\blhost\win\blhost.exe
                           [-?|--help]
                           [-p|--port <name>[,<speed>]]
                           [-u|--usb [[[<vid>,]<pid>]]]
                           [-t|--timeout <ms>]
                           -- command <args...>

    Options:
      -?/--help                    Show this help
      -p/--port <name>[,<speed>]   Connect to target over UART. Specify COM port
                                   and optionally baud rate
                                     (default=COM1,57600)
                                     If -b, then port is BusPal port
      -u/--usb [[[<vid>,]<pid>] | [<path>]]
                                   Connect to target over USB HID device denoted by
                                   vid/pid (default=0x15a2,0x0073) or device path
      -t/--timeout <ms>            Set packet timeout in milliseconds
                                     (default=5000)

    以下省略若干行.....

    让我们尝试一下使用blhost与Flashloader通信(通过USB-HID),如果能得到如下结果,说明Flashloader工作正常,可以进行后续操作。

    PS C:\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\blhost\win> .\blhost.exe -u 0x15a2,0x0073 -- get-property 1

    Inject command 'get-property'
    Response status = 0 (0x0) Success.
    Response word 1 = 1258422528 (0x4b020100)
    Current Version = K2.1.0

    三、下载更新应用程序示例

    因为BootROM支持启动的外部存储器很多,所以Flashloader支持下载更新的外部存储器,也与BootROM一一对应。在上一节blhost的命令帮助里,我们可以看到Memory ID里已经给各种外部存储器分配了ID号,在使用blhost命令时使用不同的ID号,即可操作相应外部存储器。

    其实Flashloader已经把外部存储器的下载更新应用程序操作,封装得很简单也很统一,我们其实只需要3步操作,即可完成应用程序的下载。

    以Block Size为128KB的Raw NAND为例,即SEMC NAND Memory,Memory ID=0x100:

    // 在SRAM里临时存储Raw NAND配置数据
    blhost -u -- fill-memory 0x2000 0x4 0xD0010101 // ONFI 1.0, non-EDO, Timing mode 0, 8bit IO, CSX0, HW ECC Check, inital HW ECC is enabled
    blhost -u -- fill-memory 0x2004 0x4 0x00010101 // image copy = 1, search stride = 1, search count = 1
    blhost -u -- fill-memory 0x2008 0x4 0x00020001 // block index = 2, block count = 1

    // 使用Raw NAND配置数据去配置Raw NAND接口
    blhost -u -- configure-memory 0x100 0x2000

    // 擦除Raw NAND并将image下载进Raw NAND
    blhost -u -- flash-erase-region 0x40000 0x20000 0x100    // Erase 1 block starting from block 2
    blhost -u -- write-memory 0x40000 ivt_image.bin 0x100    // Program ivt_image.bin to block 2
    其中image.bin是包含IVT的应用程序镜像数据,关于上述命令的具体意义,痞子衡会在后续Raw NAND启动的文章里详尽解释,这里只是给大家一个初步体验。

    至此,恩智浦i.MX RT系列MCU的Flashloader,痞子衡便介绍完毕了,掌声在哪里~~~

    作者:痞子衡    文章出处:恩智浦MCU加油站


    11111签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-25 08:45 , Processed in 0.107107 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表