|

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信。$ _6 Y/ i N4 F" U
i.MXRT系列高性能微控制器从2018年发布至今已有2年多了,如今这个家族系列已经完全开枝散叶了(RT500/600/1010/1020/1050/1060/1170),型号从入门到高阶铺得挺齐全(当然仍在继续发展),很多i.MXRT客户项目也已经处于量产阶段了。
7 t; q' z' _# d/ M关于量产,除了使用第三方独立Flash烧录器/编程器之外,也可以使用恩智浦官方提供的配套上位机GUI工具软件(Mfgtool2 / MCUBootUtility / MCUBootFlasher / MCUX Secure Privisioning Tool 等)连接i.MXRT芯片进行在线量产。但是呢,还是有一些客户会选择自己设计量产脚本进行定制化批量下载操作。
$ _- i$ b6 \+ O- ]说到定制化批量下载操作就离不开恩智浦官方提供的i.MXRT配套命令行工具(sdphost/blhost),借助这两个命令行工具,我们就可以通过UART/USB口与I.MXRT ROM/Flashloader进行数据通信完成应用程序下载了,不需要额外硬件。4 A/ }; M% }3 d% C) V2 V- f' T; v
如果是串口下载,那板卡批量操作倒不会有什么问题,毕竟每个串口设备在PC上都会被分配到唯一的COM号。但是UART速度不太高,所以我们往往会选择USB高速下载,i.MXRT的USB下载主要支持USB-HID协议,配套命令行工具如果仅通过vid,pid来识别设备,那多块板卡操作肯定没法同时进行,因为所有板卡的vid,pid都是一样的,那该怎么办?痞子衡今天要介绍的USB Device Path就是解决这个问题的。2 Q+ d6 v1 e. l. S- m( e
一、sdphost/blhost使用方法i.MXRT系列中均有BootROM,BootROM里集成了上位机通信协议(i.MXRT1xxx是SDPHost协议,i.MXRTxxx是blhost协议),i.MXRT1xxx下载还需搭配Flashloader(Flashloader里上位机通信协议是blhost协议),因此与i.MXRT进行量产下载通信离不开sdphost/blhost工具。) o% g0 b. r/ X) a, r% S6 l/ v
关于sdphost/blhost工具用法,痞子衡写过详细介绍文章:《sdphost使用方法》、《blhost使用方法》。如果是单块板卡的操作,那么仅需vid,pid信息即可完成命令行操作,毕竟在PC端通过提供的vid,pid可以找到唯一的i.MXRT设备。
+ D! w! O3 v+ o; `0 k! l( O7 W命令格式:sdphost.exe -u vid,pid -- command arg
1 \ k' z P9 Y2 E命令示例:sdphost.exe -u 0x1fc9,0x0130 -- write-file 0x20002000 flashloader.bin; z- q3 N' w4 R; o1 m
命令格式:blhost.exe -u vid,pid -- command arg
7 {7 l& y* q" C; w3 n8 `- {8 q命令示例:blhost.exe -u 0x15a2,0x0073 -- write-memory 0x60000000 bt_image.bin
5 O) o# W5 D4 C8 F& u) l但是如果是多块板卡同时操作,仅仅vid,pid信息就不够用了,因为这些板卡的vid,pid是一样的,PC端没法具体识别脚本里的命令对应的是哪块板卡(所以可能会随机指定,但这样失去了意义,我们做不到精确控制下载每一块板卡),此时我们需要给命令行工具提供usb device path来代替usb vid,pid:# l8 C* N# j) q$ X
命令格式:sdphost.exe/sdphost.exe -u device_path -- command arg2 o7 Q3 ^$ a' w9 v& i
二、什么是USB Device Path?Windows操作系统通过一个“设备路径”来唯一“标识”接入系统中的USB设备/接口,这个"设备路径"就是USB Device Path。USB Device Path 常常被传入 Win32 的API函数 CreatFile() 来与USB设备建立通信。更多解释参见 Windows USB Device Path 。/ n1 K/ F9 U% j* M* U
三、获取USB Device Path的方法现在的问题就是如何找到这个USB Device Path,我们以MIMXRT1020-EVK板卡为例来实战,将板卡调成SDP启动模式,将USB连接到PC后可在设备管理器里看到新枚举的 HID-compliant vendor-define device 设备,这就是BootROM里集成的USB通信功能在起作用。; J8 I" w* F- b6 p2 M0 H
3.1 借助pywinusb库第一种方式是借助Windows经典的WinUSB库,WinUSB是从XP-SP2起微软提供的一个类似libusb与usb设备通信的中间件,通过它我们就不需要再费奏折的研究和编写USB驱动了。为了简便起见,我们不直接用C版本的WinUSB,而用下面的Python版本库pywinusb来替代:, V/ g. {% i9 N1 o. \; Z5 V
pywinusb地址:https://pypi.org/project/pywinusb/安装好Python以及pywinusb库后,执行下面非常简单的几句代码便可找到USB Device Path:/ M- f Y2 R# g. _1 \" u2 s2 |6 o
import pywinusb.hid as hid
# R2 l; z* B. H- \% rvid = 0x1fc9. k1 u& o, l1 C
pid = 0x0130
2 N: t) n f6 K_filter = hid.HidDeviceFilter(vendor_id = vid, product_id = pid)
/ ~, {1 {; c. V. C+ W! c# [hid_device = _filter.get_devices()
8 {1 `9 ?% C% R# M. c2 ^+ xif len(hid_device) > 0:* E! W7 m' n4 D: i6 W# K4 [) i( V4 P
print(hid_device[0].device_path)! A/ P% ?0 x5 J4 r7 e( x
3.2 通过MCUBootFlasher工具如果你不熟悉Python,觉得上一种方法麻烦,那么推荐你第二种方法,直接使用一次 MCUBootFlasher 工具,这个工具就是借助 USB Device Path 进行的多板卡量产操作。我们可以在工具GUI后面的控制台窗口里看到实际的命令序列,序列里有你想要的USB Device Path值: |
|