痞子衡嵌入式:可通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是通过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来替代:
- pywinusb地址: https://pypi.org/project/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通信的更多相关文章
- 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南
NXP MCU Boot Utility English | 中文 1 软件概览 1.1 介绍 NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP M ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial Downloader模式. 在上一篇文章 Boot配置(BOOT Pin, eFUSE) ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(4)- Flashloader初体验(blhost)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Flashloader. 在上一篇文章 Serial Downloader模式(sdphost, mf ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(9)- 从Parallel NOR启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Parallel NOR启动. 上一篇讲i.MXRT从Raw NAND启动的文章 从Raw NAND启 ...
- 痞子衡嵌入式:MCUBootUtility v2.3发布,这次不再放过任何一款Flash
-- 痞子衡的 NXP-MCUBootUtility 开源项目自2018年8月27日第一笔提交至今已有21个月,目前累计代码已近50000行.相信这个工具为大家开发 i.MXRT 项目提供了一些便利, ...
- 痞子衡嵌入式:为下一代智能可穿戴设备而生 - i.MXRT500
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT500. 自2018年i.MXRTxxx系列首款芯片i.MXRT600(主打智能语 ...
- 痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响. 事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小 ...
- 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是以i.MXRT的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程. 在痞子衡旧文 <串口(UART)自动波特率识 ...
随机推荐
- 「NOIP模拟赛」Round 3
Tag 计数+LIS, 二分+ST表, 计数+记搜 A. 改造二叉树 Description 题面 Solution 如果目标序列非严格递增,或者说目标序列是不下降的,那么答案就是 \(n\) 减去最 ...
- 一款适用于windows10的反间谍工具
Free antispy tool for Windows 10 前言 看标题的话,可能觉得"我要这款工具能干啥?",我刚开始也有这种疑惑,但后来我对于这款软件仔细想了想,这款还是 ...
- 你只会用 map.put?试试 Java 8 compute ,操作 Map 更轻松!
今天栈长分享一个实用的 Java 8 开发技能,那就是 Map 接口中增加的 compute 方法,给 Map 集合计算更新用的. compute简介 如下所示,Java 8 在 Map 和 Conc ...
- JWT加密解密方法
public static string Key { get; set; } = "123456789987654321";//解密串 /// <summary> // ...
- 想了解FlinkX-Oracle Logminer?那就不要错过这篇文章
FlinkX-Oracle Logminer模块是FlinkX基于Logminer对Oracle重做日志进行实时采集分析,可对Oracle进行实时同步也可以通过指定SCN或者时间戳从某个节点进行同步, ...
- 搞懂 ZooKeeper 集群的数据同步
本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...
- 历史性突破:使用 .net core 日处理消息量超过 1.7 万条!
业余时间用 .net core 写了一个在线客服系统.并在博客园写了一个系列的文章,写介绍这个开发过程: .net core 和 WPF 开发升讯威在线客服系统:目录 https://blog.she ...
- SpringBoot-08 SpringSecurity
SpringBoot-08 SpringSecurity 创建了一个新项目,创建时选择导入starter-web 1.环境搭建 1.1 导入thymeleaf <dependency> & ...
- 201871010203-陈鹏昱 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 学习软件工程的理论和知识,掌握软件开发流程,增强实践能力 这个作业在哪些方面帮助我实现学习目标 体验软件项目开发中 ...
- 动态的创建Class对象方法及调用方式性能分析
有了Class对象,能做什么? 创建类的对象:调用Class对象的newInstance()方法 类必须有一个无参数的构造器. 类的构造器的访问权限需要足够. 思考?没有无参的构造器就不能创建对象吗? ...