加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

i.MXRTXXXX系列Boot之编程利器Flashloader

2019/12/16
112
阅读需 30 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

一、进入 Flashloader 程序

1.1 官方程序包

恩智浦提供了 Flashloader 程序包,你首先需要下载这个 Flashloader 包,Flashloader 所有相关资源全在包里面。注:每个 i.MXRTyyyy 子系列均有一个以子系列名字命名的 Flashloader 包,即 Flashloader 程序并不是通用的(偷偷告诉你,其实 RT105x 与 RT106x 是通用的),此处以 RT1050 系列为例:

  

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.MXRTyyyy 芯片 JTAG 口连接上 J-Link 调试器后,安装好 Jlink 驱动(痞子衡安装的是 v6.30e 版本),打开 J-Link Commander(即 \SEGGER\JLink_V630e\JLink.exe),连接上 i.MXRTyyyy 的 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

  

确认 elf 文件后,点击“Download & Reset Program”

  

此时 Flashloader 程序已经被下载进 i.MXRTyyyy 中,并且在 Disassembly 窗口可以看到 Flashloader 汇编源程序,底下你就可以开始调试执行 Flashloader 程序。由于下载包里的 flashloader.elf 文件并没有包含所有 Flashloader 工程的信息(至少没有包含 C 代码信息,应该是恩智浦官方故意这么做的),所以我们使用 Ozone 软件调试看不到 C 代码,稍微有点遗憾。

1.3 支持的通信外设 pinout

Flashloader 支持的通信外设与 BootROM 支持的通信外设是一模一样的,也是 USB-HID 和 UART,并且 pinout 也一样(Pinout 适用 RT105x 和 RT102x):

Note: 如果硬件板上 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)

Memory ID:

  Internal Memory              Device internal memory space

    0                            Internal Memory

                                 (Default selected memory)

  Mapped External Memory       The memories that are remapped to internal space,

                               and must be accessed by internal addresses.

                               (IDs in this group are only used for flash-erase-all and

                               configure-memory, and ignored by write-memory, read-memory,

                               flash-erase-region and flash-image(use default 0))

    1                            QuadSPI Memory

    8                            SEMC NOR Memory

    9                            FlexSPI NOR Memory

  Unmapped External Memory     Memories which cannot be remapped to internal space,

                               and only can be accessed by memories' addresses.

                               (Must be specified for all commands with <memoryId> argument)

    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

** Note that not all memories are supported on all

      Kinetis Bootloader platforms.

Command:

  reset                        Reset the chip

  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>

    10                         Verify Writes flag

  flash-erase-region <addr> <byte_count> [memory_id]

                               Erase a region of flash according to [memory_id].

  flash-erase-all [memory_id]  Erase all flash according to [memory_id],

                               excluding protected regions.

  read-memory <addr> <byte_count> [<file>] [memory_id]

                               Read memory according to [memory_id] and write to file

                               or stdout if no file specified

  write-memory <addr> [<file>[,byte_count]| {{<hex-data>}}] [memory_id]

                               Write memory according to [memory_id] from file

                               or string of hex values,

                               e.g. data.bin (writes entire file)

                               e.g. data.bin 8 (writes first 8 bytes from file)

                               e.g. "{{11 22 33 44}}" (w/quotes)

                               e.g. {{11223344}} (no spaces)

  fill-memory <addr> <byte_count> <pattern> [word | short | byte]

                               Fill memory with pattern; size is

                               word (default), short or byte

  receive-sb-file <file>       Receive SB file

  execute <addr> <arg> <stackpointer>

                               Execute at address with arg and stack pointer

  call <addr> <arg>            Call address with arg

  configure-memory <memory_id> <internal_addr>

                               Apply configuration block at internal memory address

                               <internal_addr> to memory with ID <memory_id>

  flash-image <file> [erase] [memory_id]

                               Write a formated image <file> to memory with ID

                               <memory_id>. Supported file types: SRecord

                               (.srec and .s19) and HEX (.hex). Flash is erased

                               before writing if [erase]=erase. The erase unit

                               size depends on the target and the minimum erase

                               unit size is 1K.

  list-memory                  List all on-chip Flash and RAM regions, and off-chip

                               memories, supported by current device.

                               Only the configured off-chip memory will be list.

  efuse-program-once <addr> <data>

                               Program one word of OCOTP Field

                               <addr> is ADDR of OTP word, not the shadowed memory address.

                               <data> is hex digits without prefix '0x'

  efuse-read-once <addr>

                               Read one word of OCOTP Field

                               <addr> is ADDR of OTP word, not the shadowed memory address.

  generate-key-blob <dek_file> <blob_file>

                               Generate the Blob for given Dek Key

                               <dek_file> - input, a binary Dek Key (128 Bits) generated by CST tool.

                               <blob_file> - output, a generated blob (72 Bytes) in binary format.

** Note that not all commands/properties are supported on all
     

Kinetis Bootloader platforms.
  

让我们尝试一下使用 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 的下载。以 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 的 Application 镜像数据,关于上述命令的具体意义痞子衡会在后续 Raw NAND 启动的文章里详尽解释,这里只是给大家一个初步体验。

恩智浦

恩智浦

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。收起

查看更多

相关推荐

电子产业图谱

硕士毕业于苏州大学电子信息学院,目前就职于恩智浦(NXP)半导体MCU系统部门,担任嵌入式系统应用工程师。痞子衡会定期分享嵌入式相关文章