|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是通過USB Device Path來唯一指定i.MXRT設(shè)備進(jìn)行ROM/Flashloader通信。
- s0 L. x, E" v- [: G4 ]4 hi.MXRT系列高性能微控制器從2018年發(fā)布至今已有2年多了,如今這個(gè)家族系列已經(jīng)完全開枝散葉了(RT500/600/1010/1020/1050/1060/1170),型號(hào)從入門到高階鋪得挺齊全(當(dāng)然仍在繼續(xù)發(fā)展),很多i.MXRT客戶項(xiàng)目也已經(jīng)處于量產(chǎn)階段了。3 w3 f% u1 A1 U5 Y
關(guān)于量產(chǎn),除了使用第三方獨(dú)立Flash燒錄器/編程器之外,也可以使用恩智浦官方提供的配套上位機(jī)GUI工具軟件(Mfgtool2 / MCUBootUtility / MCUBootFlasher / MCUX Secure Privisioning Tool 等)連接i.MXRT芯片進(jìn)行在線量產(chǎn)。但是呢,還是有一些客戶會(huì)選擇自己設(shè)計(jì)量產(chǎn)腳本進(jìn)行定制化批量下載操作。* A' T. B0 `' C2 J
說到定制化批量下載操作就離不開恩智浦官方提供的i.MXRT配套命令行工具(sdphost/blhost),借助這兩個(gè)命令行工具,我們就可以通過UART/USB口與I.MXRT ROM/Flashloader進(jìn)行數(shù)據(jù)通信完成應(yīng)用程序下載了,不需要額外硬件。* @9 f* @& d" P+ ]" i' M
如果是串口下載,那板卡批量操作倒不會(huì)有什么問題,畢竟每個(gè)串口設(shè)備在PC上都會(huì)被分配到唯一的COM號(hào)。但是UART速度不太高,所以我們往往會(huì)選擇USB高速下載,i.MXRT的USB下載主要支持USB-HID協(xié)議,配套命令行工具如果僅通過vid,pid來識(shí)別設(shè)備,那多塊板卡操作肯定沒法同時(shí)進(jìn)行,因?yàn)樗邪蹇ǖ膙id,pid都是一樣的,那該怎么辦?痞子衡今天要介紹的USB Device Path就是解決這個(gè)問題的。
. Y9 q# S, ]! C9 J; N: r. A一、sdphost/blhost使用方法i.MXRT系列中均有BootROM,BootROM里集成了上位機(jī)通信協(xié)議(i.MXRT1xxx是SDPHost協(xié)議,i.MXRTxxx是blhost協(xié)議),i.MXRT1xxx下載還需搭配Flashloader(Flashloader里上位機(jī)通信協(xié)議是blhost協(xié)議),因此與i.MXRT進(jìn)行量產(chǎn)下載通信離不開sdphost/blhost工具。
1 g- k% U; _ c9 n關(guān)于sdphost/blhost工具用法,痞子衡寫過詳細(xì)介紹文章:《sdphost使用方法》、《blhost使用方法》。如果是單塊板卡的操作,那么僅需vid,pid信息即可完成命令行操作,畢竟在PC端通過提供的vid,pid可以找到唯一的i.MXRT設(shè)備。
+ ^9 u6 c& V# d7 Y! H命令格式:sdphost.exe -u vid,pid -- command arg- r) c9 {# R" u
命令示例:sdphost.exe -u 0x1fc9,0x0130 -- write-file 0x20002000 flashloader.bin
2 X7 Y1 C7 y: J, f; p" c8 v命令格式:blhost.exe -u vid,pid -- command arg
* W% R2 i p6 A# u, {命令示例:blhost.exe -u 0x15a2,0x0073 -- write-memory 0x60000000 bt_image.bin: O5 i1 O$ S {2 X% y, B, b
但是如果是多塊板卡同時(shí)操作,僅僅vid,pid信息就不夠用了,因?yàn)檫@些板卡的vid,pid是一樣的,PC端沒法具體識(shí)別腳本里的命令對(duì)應(yīng)的是哪塊板卡(所以可能會(huì)隨機(jī)指定,但這樣失去了意義,我們做不到精確控制下載每一塊板卡),此時(shí)我們需要給命令行工具提供usb device path來代替usb vid,pid:' A8 |! c# x m9 ~8 x$ k
命令格式:sdphost.exe/sdphost.exe -u device_path -- command arg
+ n# P; E2 w/ A% v二、什么是USB Device Path?Windows操作系統(tǒng)通過一個(gè)“設(shè)備路徑”來唯一“標(biāo)識(shí)”接入系統(tǒng)中的USB設(shè)備/接口,這個(gè)"設(shè)備路徑"就是USB Device Path。USB Device Path 常常被傳入 Win32 的API函數(shù) CreatFile() 來與USB設(shè)備建立通信。更多解釋參見 Windows USB Device Path 。
# ]; o9 e) r. c' L7 B; L4 K' L0 d三、獲取USB Device Path的方法現(xiàn)在的問題就是如何找到這個(gè)USB Device Path,我們以MIMXRT1020-EVK板卡為例來實(shí)戰(zhàn),將板卡調(diào)成SDP啟動(dòng)模式,將USB連接到PC后可在設(shè)備管理器里看到新枚舉的 HID-compliant vendor-define device 設(shè)備,這就是BootROM里集成的USB通信功能在起作用。2 V; I+ T+ a2 }
3.1 借助pywinusb庫(kù)第一種方式是借助Windows經(jīng)典的WinUSB庫(kù),WinUSB是從XP-SP2起微軟提供的一個(gè)類似libusb與usb設(shè)備通信的中間件,通過它我們就不需要再費(fèi)奏折的研究和編寫USB驅(qū)動(dòng)了。為了簡(jiǎn)便起見,我們不直接用C版本的WinUSB,而用下面的Python版本庫(kù)pywinusb來替代:
( F9 ~3 K1 r9 H3 f/ F/ l' M; qpywinusb地址:https://pypi.org/project/pywinusb/安裝好Python以及pywinusb庫(kù)后,執(zhí)行下面非常簡(jiǎn)單的幾句代碼便可找到USB Device Path:! F$ ?3 Q3 z. `
import pywinusb.hid as hid
L7 d; W# A1 x& D* F4 z2 w( q. evid = 0x1fc90 \5 x8 L) x# d
pid = 0x01304 b* K3 @: e6 |% q' {
_filter = hid.HidDeviceFilter(vendor_id = vid, product_id = pid)
3 t" G3 f+ H- ^! {, a7 ? chid_device = _filter.get_devices()
6 x% y8 F3 B% x% y4 n* ]7 ^1 \if len(hid_device) > 0:+ e: m H% S6 y H( g% L
print(hid_device[0].device_path)3 }7 y' f7 h' G
3.2 通過MCUBootFlasher工具如果你不熟悉Python,覺得上一種方法麻煩,那么推薦你第二種方法,直接使用一次 MCUBootFlasher 工具,這個(gè)工具就是借助 USB Device Path 進(jìn)行的多板卡量產(chǎn)操作。我們可以在工具GUI后面的控制臺(tái)窗口里看到實(shí)際的命令序列,序列里有你想要的USB Device Path值: |
|