大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信

  i.MXRT系列高性能微控制器从2018年发布至今已有2年多了,如今这个家族系列已经完全开枝散叶了(RT500/600/1010/1020/1050/1060/1170),型号从入门到高阶铺得挺齐全(当然仍在继续发展),很多i.MXRT客户项目也已经处于量产阶段了。

  关于量产,除了使用第三方独立Flash烧录器/编程器之外,也可以使用恩智浦官方提供的配套上位机GUI工具软件(Mfgtool2 / MCUBootUtility / MCUBootFlasher / MCUX Secure Privisioning Tool 等)连接i.MXRT芯片进行在线量产。但是呢,还是有一些客户会选择自己设计量产脚本进行定制化批量下载操作。

  说到定制化批量下载操作就离不开恩智浦官方提供的i.MXRT配套命令行工具(sdphost/blhost),借助这两个命令行工具,我们就可以通过UART/USB口与I.MXRT ROM/Flashloader进行数据通信完成应用程序下载了,不需要额外硬件。

  如果是串口下载,那板卡批量操作倒不会有什么问题,毕竟每个串口设备在PC上都会被分配到唯一的COM号。但是UART速度不太高,所以我们往往会选择USB高速下载,i.MXRT的USB下载主要支持USB-HID协议,配套命令行工具如果仅通过vid,pid来识别设备,那多块板卡操作肯定没法同时进行,因为所有板卡的vid,pid都是一样的,那该怎么办?痞子衡今天要介绍的USB Device Path就是解决这个问题的。

一、sdphost/blhost使用方法

  i.MXRT系列中均有BootROM,BootROM里集成了上位机通信协议(i.MXRT1xxx是SDPHost协议,i.MXRTxxx是blhost协议),i.MXRT1xxx下载还需搭配Flashloader(Flashloader里上位机通信协议是blhost协议),因此与i.MXRT进行量产下载通信离不开sdphost/blhost工具。

  关于sdphost/blhost工具用法,痞子衡写过详细介绍文章:《sdphost使用方法》《blhost使用方法》。如果是单块板卡的操作,那么仅需vid,pid信息即可完成命令行操作,毕竟在PC端通过提供的vid,pid可以找到唯一的i.MXRT设备。

命令格式:sdphost.exe -u vid,pid -- command arg
命令示例:sdphost.exe -u 0x1fc9,0x0130 -- write-file 0x20002000 flashloader.bin 命令格式:blhost.exe -u vid,pid -- command arg
命令示例:blhost.exe -u 0x15a2,0x0073 -- write-memory 0x60000000 bt_image.bin

  但是如果是多块板卡同时操作,仅仅vid,pid信息就不够用了,因为这些板卡的vid,pid是一样的,PC端没法具体识别脚本里的命令对应的是哪块板卡(所以可能会随机指定,但这样失去了意义,我们做不到精确控制下载每一块板卡),此时我们需要给命令行工具提供usb device path来代替usb vid,pid:

命令格式:sdphost.exe/sdphost.exe -u device_path -- command arg

二、什么是USB Device Path?

  Windows操作系统通过一个“设备路径”来唯一“标识”接入系统中的USB设备/接口,这个"设备路径"就是USB Device Path。USB Device Path 常常被传入 Win32 的API函数 CreatFile() 来与USB设备建立通信。更多解释参见 Windows USB Device Path

三、获取USB Device Path的方法

  现在的问题就是如何找到这个USB Device Path,我们以MIMXRT1020-EVK板卡为例来实战,将板卡调成SDP启动模式,将USB连接到PC后可在设备管理器里看到新枚举的 HID-compliant vendor-define device 设备,这就是BootROM里集成的USB通信功能在起作用。

3.1 借助pywinusb库

  第一种方式是借助Windows经典的WinUSB库,WinUSB是从XP-SP2起微软提供的一个类似libusb与usb设备通信的中间件,通过它我们就不需要再费奏折的研究和编写USB驱动了。为了简便起见,我们不直接用C版本的WinUSB,而用下面的Python版本库pywinusb来替代:

  安装好Python以及pywinusb库后,执行下面非常简单的几句代码便可找到USB Device Path:

import pywinusb.hid as hid

vid = 0x1fc9
pid = 0x0130 _filter = hid.HidDeviceFilter(vendor_id = vid, product_id = pid)
hid_device = _filter.get_devices() if len(hid_device) > 0:
print(hid_device[0].device_path)

3.2 通过MCUBootFlasher工具

  如果你不熟悉Python,觉得上一种方法麻烦,那么推荐你第二种方法,直接使用一次 MCUBootFlasher 工具,这个工具就是借助 USB Device Path 进行的多板卡量产操作。我们可以在工具GUI后面的控制台窗口里看到实际的命令序列,序列里有你想要的USB Device Path值:

3.3 看设备管理器和系统注册表

  如果你觉得第二种方法还是麻烦,不想额外安装软件,得了,那就直接在Windows里查看吧。打开设备管理器,找到vid,pid是0x1fc9,0x0130(其他i.MXRT型号可能不是这个,具体查看芯片参考手册System Boot章节)的设备,右击属性里找到 Device instance path,别急,这还不是全部的USB Device Path。

  在系统命令行里输入 "regedit" 打开系统注册表,在里面搜索 "HumanInterfaceDevice",可以找到 {4d1e55b2-f16f-11cf-88cb-001111000030},这是Windows本身对HID设备的类型标识(这个其实是确定的,记住就好,不用每次都查找一次)。

  最终 USB Device Path 组成格式是:\\?\(第一部分,固定的), hid#vid_1fc9&pid_0130#a&2eb8245&0&0000(第二部分,即Device instance path,\用#替换), #{4d1e55b2-f16f-11cf-88cb-001111000030}"(第三部分,HID类型标识值前加个#)。另外注意在脚本里写入此参数时需要用双引号括起来,即如下:

"\\?\hid#vid_1fc9&pid_0130#6&20AC856D&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"

  至此,通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:可通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信的更多相关文章

  1. 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南

    NXP MCU Boot Utility English | 中文 1 软件概览 1.1 介绍 NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP M ...

  2. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial Downloader模式. 在上一篇文章 Boot配置(BOOT Pin, eFUSE) ...

  3. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(4)- Flashloader初体验(blhost)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Flashloader. 在上一篇文章 Serial Downloader模式(sdphost, mf ...

  4. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...

  5. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(9)- 从Parallel NOR启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Parallel NOR启动. 上一篇讲i.MXRT从Raw NAND启动的文章 从Raw NAND启 ...

  6. 痞子衡嵌入式:MCUBootUtility v2.3发布,这次不再放过任何一款Flash

    -- 痞子衡的 NXP-MCUBootUtility 开源项目自2018年8月27日第一笔提交至今已有21个月,目前累计代码已近50000行.相信这个工具为大家开发 i.MXRT 项目提供了一些便利, ...

  7. 痞子衡嵌入式:为下一代智能可穿戴设备而生 - i.MXRT500

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT500. 自2018年i.MXRTxxx系列首款芯片i.MXRT600(主打智能语 ...

  8. 痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响. 事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小 ...

  9. 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是以i.MXRT的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程. 在痞子衡旧文 <串口(UART)自动波特率识 ...

随机推荐

  1. 题解 洛谷P1990 覆盖墙壁

    DP康复训练题 原题:洛谷P1990 核心:递推/DP 题源应该是铺地砖,所以采用一摸一样的思路,只是有两种不同的方块 我们先用最最简单的方式尝试一下枚举当最后一行被填满的情况: 1.如果我们只用第一 ...

  2. python常用数据处理库

    Python之所以能够成为数据分析与挖掘领域的最佳语言,是有其独特的优势的.因为他有很多这个领域相关的库可以用,而且很好用,比如Numpy.SciPy.Matploglib.Pandas.Scikit ...

  3. JS 字符数组和数字数组转换

    var newArr = ['1','2','3'].map(Number):// [1,2,3] var newArr =[1,2,3].map(String):// ['1','2','3']

  4. Quartz基础使用

    Quartz基本组成部分: 调度器:Scheduler 任务:JobDetail 触发器:Trigger,包括SimpleTrigger和CronTrigger . using Quartz; usi ...

  5. Jmeter(三十八) - 从入门到精通进阶篇 - 命令行运行JMeter详解(详解教程)

    1.简介 前边一篇文章介绍了如何生成测试报告,细心地小伙伴或者同学们可以看到宏哥启动Jmeter生成测试报告不是在gui页面操作的,而是在gui页面设置好保存以后,用命令行来生成测试报告的.这一篇宏哥 ...

  6. [组合][DP]luogu P3643 [APIO2016]划艇

    题面 https://www.luogu.com.cn/problem/P3643 对于一个序列,第i项可取的值在{0}∪[ai,bi]之间,求使序列非零部分单调递增的方案数 分析 设 $f[i][j ...

  7. [GDKOI2021] 提高组 Day 1 总结

    [ G D K O I 2021 ]    提 高 组    D a y   1    总 结 [GDKOI2021]~~ 提高组~~ Day~1~~ 总结 [GDKOI2021]  提高组  Day ...

  8. 神奇的魔方阵--(MagicSquare)(1)

    本篇文章只对奇数阶以及偶数阶中阶数n = 4K的魔方阵进行讨论.下面就让我们进入正题: 1 :魔方阵的相关信息:(百度百科) https://baike.baidu.com/item/%E9%AD%9 ...

  9. ubuntu apt出错

    whitedream@ubuntu:~$ sudo apt-get update Reading package lists... Done E: Could not get lock /var/li ...

  10. C语言利用for循环打印菱形

    C语言利用for循环打印菱形(高度为奇数) 这次用的方法是上下部分分开打印,先打印上部分,再打印下部分. 先举个简单的例子打印,再改进代码,登堂入室从而理解. 例:打印一个高度(高度必须为奇数)为 5 ...