查看: 3423|回复: 0

i.MXRT Boot之Serial Downloader模式

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3915

    主题

    7533

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39849
    最后登录
    2025-8-14
    发表于 2019-11-13 11:11:04 | 显示全部楼层 |阅读模式
    在上一篇文章 飞思卡尔i.MX RT系列微控制器启动篇(3)- Serial Downloader模式(sdphost, mfgtool) 里痞子衡为大家介绍了i.MXRT Boot的Serial Downloader模式,这种模式主要是用来引导启动Flashloader,那么Flashloader到底具有哪些功能?这是本篇文章痞子衡要为大家解惑的主题。


      痞子衡在前面提过Flashloader程序主要是用来将你的Application下载进i.MXRT支持的所有外部非易失性存储器中,为后续从外部存储器启动做准备。BootROM只有启动Application功能,没有下载更新Application功能,而Flashloader最核心的就是下载更新Application功能,所以Flashloader是BootROM的完美补充。你可能会疑问,为什么不把Flashloader的下载更新Application的功能也放进BootROM里?痞子衡个人觉得应该是芯片成本问题,ROM的空间是96KB,如果把Flashloader功能也放进BootROM里,势必要扩大ROM空间,从而导致芯片成本上升,做成二级Flashloader既不占ROM空间,也方便Flashloader程序自身的维护升级(目前RT1050的Flashloader版本是1.1,你看,这不显然升级过嘛)。


    一、进入Flashloader程序

    1.1 官方程序包
      恩智浦提供了 Flashloader程序包,你首先需要下载这个Flashloader包,Flashloader所有相关资源全在包里面。注:每个i.MXRT子系列均有一个以子系列名字命名的Flashloader包,即Flashloader程序并不是通用的,此处以RT1050系列为例:
    36.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.MXRT芯片JTAG口连接上J-Link调试器后,安装好Jlink驱动(痞子衡安装的是v6.30e版本),打开J-Link Commander(即\SEGGER\JLink_V630e\JLink.exe),连接上i.MXRT的Core,按顺序执行如下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命令用于让Core开始执行代码(Flashloader程序)。


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


    Note:关于JLink命令的详细解释请查阅JLink驱动软件安装目录下\SEGGER\JLink_V630e\Doc\UM08001_JLink.pdf文档里的3.2 J-Link Commander (Command line tool)一节。


    1.2.3 高级方式:通过Ozone

      前两种引导方式都是把Flashloader程序当做黑盒子,只需要将其启动运行即可,接下来痞子衡介绍的引导方式可以让你看到Flashloader源代码并且可以让你调试Flashloader。这第三种引导方式还是通过外接J-Link调试器,但还需要一个特殊的软件,即SEGGER公司提供的Ozone软件,去SEGGER先下载Ozone软件(痞子衡下载的版本是v2.56c),下载安装后打开Ozone软件,第一步选择CM7,第二步选择SWD,第三步选择elf文件时要选择Flashloader下载包里的flashloader.elf
    37.png
    确认elf文件后,点击“Download & Reset Program”
    38.png
    此时Flashloader程序已经被下载进i.MXRT中,并且在Disassembly窗口可以看到Flashloader汇编源程序,底下你就可以开始调试执行Flashloader程序。由于下载包里的flashloader.elf文件并没有包含所有Flashloader工程的信息(至少没有包含C代码信息,应该是恩智浦官方故意这么做的),所以我们使用Ozone软件调试看不到C代码,稍微有点遗憾。
    39.png
    1.3 支持的通信外设pinout

      Flashloader支持的通信外设与BootROM支持的通信外设是一模一样的,也是USB-HID和UART,并且pinout也一样(Pinout适用RT105x和RT102x):
    40.png
    二、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
      -p/--port <name>[,<speed>]
      -u/--usb [[[<vid>,]<pid>] | [<path>]]
      -t/--timeout <ms>


    Memory ID:
      Internal Memory
        0                            Internal Memory
      Mapped External Memory
        1                            QuadSPI Memory
        8                            SEMC NOR Memory
        9                            FlexSPI NOR Memory
      Unmapped External Memory
        256 (0x100)                  SEMC NAND Memory
        257 (0x101)                  SPI NAND Memory
        272 (0x110)                  SPI NOR/EEPROM Memory
        273 (0x111)                  I2C NOR/EEPROM Memory
        288 (0x120)                  uSDHC SD Memory
        289 (0x121)                  uSDHC MMC Memory


    Command:
      reset
      get-property <tag> [<memoryId> | <index>]
        1                          Bootloader version
        2                          Available peripherals
        7                          Available commands
        10                         Verify Writes flag
        11                         Max supported packet size
        12                         Reserved regions
        14                         Start of RAM, <index> is required
        15                         Size of RAM, <index> is required
        23                         QuadSpi initialization status
        24                         Target version
        25                         External Memory Attrubutes, <memoryId> is required.
      set-property <tag> <value>
      flash-erase-region <addr> <byte_count> [memory_id]
      flash-erase-all [memory_id]
      read-memory <addr> <byte_count> [<file>] [memory_id]
      write-memory <addr> [<file>[,byte_count]| {{<hex-data>}}] [memory_id]
      fill-memory <addr> <byte_count> <pattern> [word | short | byte]
      receive-sb-file <file>
      execute <addr> <arg> <stackpointer>
      call <addr> <arg>
      configure-memory <memory_id> <internal_addr>
      flash-image <file> [erase] [memory_id]
      list-memory
      efuse-program-once <addr> <data>
      efuse-read-once <addr>
      generate-key-blob <dek_file> <blob_file>
      让我们尝试一下使用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


    三、下载更新Application示例


      因为BootROM支持启动的外部存储器很多,所以Flashloader支持下载更新的外部存储器也与BootROM一一对应。在上一节blhost的命令帮助里,我们可以看到Memory ID里已经给各种外部储存器分配了ID号,在使用blhost命令时使用不同的ID号即可操作相应外部存储器。
      其实Flashloader已经把外部存储器的下载更新Application操作封装得很简单也很统一,我们其实只需要3步操作即可完成Application的下载。以Raw NAND为例(即SEMC NAND Memory,Memory ID=0x100):


    // 在SRAM里临时存储Raw NAND配置数据
    blhost -u -- fill-memory 0x2000 0x4 0xD0030101 // ONFI 1.0, non-EDO, Timing mode 0, 8bit IO, CSX0
    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 0x100000 0x80000 0x100    // Erase 1 block starting from block 2
    blhost -u -- write-memory 0x100000 image.bin 0x100        // Program image.bin to block 2
      其中image.bin是包含IVT的Application镜像数据,关于上述命令的具体意义痞子衡会在后续Raw NAND启动的文章里详尽解释,这里只是给大家一个初步体验。



      至此,飞思卡尔i.MX RT系列MCU的Flashloader痞子衡便介绍完毕了,掌声在哪里~~~






    作者:痞子衡                    文章出处: 痞子衡嵌入式

    qiandao qiandao
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-15 02:56 , Processed in 0.085564 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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