痞子衡嵌入式:可通過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來替代:

  安裝好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主頁知乎主頁微信公眾號 平台上。

微信搜索”痞子衡嵌入式“或者掃描下面二維碼,就可以在手機上第一時間看了哦。