大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式。   在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家介绍了i.MXRTxxx Boot的行为配置,其中第1.2节里讲了Boot有三类行为模式:Serial ISP、Serial Boot、Device Boot,后两种都是跟App启动执行相关的行为模式,而Serial ISP模式则是相对独立的Flash下载功能,有了Serial ISP,便可省去专用Flash编程器,今天痞子衡就来详细聊一聊Serial ISP模式。   痞子衡在前面已经讲过Serial ISP模式是一种串行编程模式,在这种模式下,BootROM通过指定的UART/SPI/I2C/USB-HID口来接收来自Host(恩智浦提供了上位机工具blhost.exe或者MCUBootUtility)的Application数据,并将数据下载进i.MXRTxxx支持的所有外部非易失性存储器中,为后续从外部存储器启动做准备。 一、进入Serial ISP模式   i.MXRTxxx上电永远是从ROM启动去执行BootROM程序,最顶层的Boot行为模式由OTP memory里的PRIMARY_BOOT_SRC[3:0]位和芯片外部ISP[2:0]管脚状态共同决定。假设我们正处于研发阶段,PRIMARY_BOOT_SRC[3:0]并未烧写,那想进入Serial ISP模式最直接的方式便是将ISP[2:0]输入状态拨成3'b110,在设计i.MXRTxxx的硬件板时ISP[2:0] pins应设计成可通过拨码开关选择输入电平,下图是RT600-EVK板(Rev.E)的参考设计:   拨码开关SW5应拨向SW_DIP-6的6,即设置ISP[2:0]=3'b110,此时便直接进入了Serial ISP模式。 二、blhost的使用   进入了Serial ISP模式,此时便可以用恩智浦提供的host工具与BootROM进行命令交互,host工具在 MCUBootUtility包 里。下载好MCUBootUtility包之后,在\MCUBootUtility\Tools\blhost2_3\win下可以找到用于与BootROM通信的blhost.exe。 2.1 支持的通信外设pinout   BootROM支持四种通信外设,分别是UART/SPI/I2C/USB-HID(其中UART和USB比较常用),pinout如下(Pinout适用RT600): 2.2 blhost用法   blhost.exe是命令行工具,使用blhost可以通过上述UART/SPI/I2C/USB-HID口与BootROM进行通信与命令交互。   在命令行下打开blhost.exe,输入-?命令可以看到blhost使用帮助,blhost支持的命令很多: PS D:\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe usage: D:\NXP-MCUBootUtility\tools\blhost2_3\win\blhost.exe [-?|--help] [-p|--port [,]] [-u|--usb [[[,]]]] [-t|--timeout ] -- command Options: -?/--help Show this help -p/--port [,] Connect to target over UART. Specify COM port and optionally baud rate (default=57600) If -ftbi, then port is BusPal port --ftdi spi[,,,,lsb|msb] | i2c[,
,] Use SPI or I2C for BusPal<-->Target link All parameters between square brackets are optional, but preceding parameters must be present or marked with a comma. (ex. -b spi,1000,0,1) (ex. --ftdi spi,1000,,lsb) spi: speed(KHz), polarity(0=active_high | 1=active_low), phase(0=rising_edge | 1=falling_edge), "lsb" | "msb" (default=100,1,1,msb) i2c: address(7-bit hex), speed(KHz) (default=0x10,100) -u/--usb [[[,]] | []] Connect to target over USB HID device denoted by vid/pid (default=0x15a2,0x0073) or device path -t/--timeout Set packet timeout in milliseconds (default=5000) Memory ID: Internal Memory Device internal memory space 0 Internal Memory (Default selected memory) 16 (0x10) Execute-only region on internal flash (Only used for flash-erase-all) 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 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 argument) 272 (0x110) SPI NOR/EEPROM Memory 288 (0x120) uSDHC SD Memory 289 (0x121) uSDHC MMC Memory ** Note that not all memories are supported on all platforms. Command: reset Reset the chip get-property [ | ] Return bootloader specific property. and are required by some properties. = 0, = 0, if not specified. and are ignored for the other properties. If is over the range supported by the device, bootloader will treat as = 0. 1 Bootloader version 2 Available peripherals 3 Start of program flash, is required 4 Size of program flash, is required 5 Size of flash sector, is required 6 Blocks in flash array, is required 7 Available commands 9 Last Error 10 Verify Writes flag 11 Max supported packet size 14 Start of RAM, is required 15 Size of RAM, is required 23 QuadSpi initialization status 24 Target version 25 External memory attrubutes, is required 27 Flash page size, is required 28 Interrupt notifier pin 29 FFR key store update option set-property 10 Verify Writes flag 28 Interrupt notifier pin : bit[31] for enablement, 0: disable, 1: enable bit[7:0] for GPIO pin index bit[15:8] for GPIO port index 29 FFR key store update option : 0 for Keyprovisioning 1 for write-memory flash-erase-region [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 [] [memory_id] Read memory according to [memory_id] and write to file or stdout if no file specified write-memory [[,byte_count]| {{}}] [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 [word | short | byte] Fill memory with pattern; size is word (default), short or byte receive-sb-file Receive SB file execute Execute at address with arg and stack pointer call Call address with arg configure-memory Apply configuration block at internal memory address to memory with ID key-provisioning [arguments...] Key provisioning enroll. No argument for this operation [,] Send the user key specified by to bootloader. is the binary file containing user key plaintext. If is not specified, the entire will be sent. Otherwise, only send the first bytes Generate bytes of the key specified by [memoryID] Write the key to a nonvolatile memory [memoryID] Load the key from a nonvolatile memory to bootloader [,] Send the key store to bootloader. is the binary file containing key store. If is not specified, the entire will be sent. Otherwise, only send the first bytes Read the key store from bootloader to host(PC). is the binary file to store the key store flash-image [erase] [memory_id] Write a formated image to memory with 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 [nolock/lock] Program one word of OCOTP Field is ADDR of OTP word, not the shadowed memory address. is hex digits without prefix '0x' efuse-read-once Read one word of OCOTP Field is ADDR of OTP word, not the shadowed memory address. generate-key-blob Generate the Blob for given Dek Key - input, a binary Dek Key (128 Bits) generated by CST tool. - output, a generated blob (72 Bytes) in binary format. ** Note that not all commands/properties are supported on all platforms.   当使用串口转USB模块连接i.MXRTxxx的Flexcomm UART0或者使用USB Cable连接上USB1口后可以看到PC设备管理器会识别出相关设备:   让我们尝试一下使用blhost与BootROM通信,先试一下USB通信: PS D:\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe -u 0x1fc9,0x0020 -- get-property 1 Inject command 'get-property' Response status = 0 (0x0) Success. Response word 1 = 1258487808 (0x4b030000) Current Version = K3.0.0   再接着试一下UART通信,似乎通信失败了。需要注意的是,当使用USB通信过一次之后,BootROM已经激活USB外设,不会再去检测其他外设(包括UART),如果想使用UART通信,需要将板子reset一次,使BootROM重回外设检测状态。 PS D:\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe -p COM25 -- get-property 1 Error: Initial ping failure: No response received for ping command. 三、下载更新Application示例   因为BootROM支持启动的外部存储器很多,所以Serial ISP模式下进行Application更新操作要指定具体的外部存储器类型。在上一节blhost的命令帮助里,我们可以看到Memory ID里已经给各种外部储存器分配了ID号,在使用blhost命令时使用不同的ID号即可操作相应外部存储器。   其实BootROM里已经把外部存储器的下载更新Application操作封装得很简单也很统一,我们其实只需要3步操作即可完成Application的下载。以备份启动的1bit SPI NOR为例(即Flexcomm SPI NOR Memory,Memory ID=0x110): // 在SRAM里临时存储Serial EEPROM/NOR配置数据 blhost -p COMx -- fill-memory 0x1C000 0x4 0xC0300000 // Flexcomm SPI3, NOR Flash // 使用Serial EEPROM/NOR配置数据去配置Flexcomm SPI接口 blhost -p COMx -- configure-memory 0x110 0x1C000 // 擦除Serial EEPROM/NOR并将image下载进Serial EEPROM/NOR blhost -p COMx -- flash-erase-region 0x0 0x20000 0x110 blhost -p COMx -- write-memory 0x0 bt_image.bin 0x110   其中bt_image.bin是填充了Image类型数据的Application镜像,关于上述命令的具体意义痞子衡会在后续Serial(1-bit SPI) EEPROM/NOR恢复启动的文章里详尽解释,这里只是给大家一个初步体验。   至此,恩智浦i.MX RTxxx系列MCU的Serial ISP模式痞子衡便介绍完毕了,掌声在哪里~~~ 最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。 痞子衡嵌入式-微信二维码痞子衡嵌入式-微信收款二维码痞子衡嵌入式-支付宝收款二维码 衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。 专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/ 与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com 可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。 关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。 痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。 https://www.cnblogs.com/henjay724/p/11992494.html