大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是通過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主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。