2011年8月31日 星期三

支援多組同款USB 裝置

如果您在USB 的設計使用上,需要同一系列產品同時有多組插在同一部電腦時,

您該如何處理?譬如說:您是作USB 燒錄器啊或是相關USB 輔助工具的。

您可能需要一部電腦插上好幾支同樣的USB 燒錄器時,那我在USB的系統設計上,

該如何分辨USB 系統呢?以下我們就用一個簡單的例子說明:

從上圖我們發現:有兩隻USB SiLabs 的USB Debug Adapter 插在PC 上,

我們就可以依下拉式選單來選擇特定的USB 燒錄器。

那圖中的燒錄器的序號是由誰產生的呢?當然不是PC 作業系統自行產生的,

而是由您USB 裝置的宣告給PC 作業系統的啦。

那該如何在USB 裝置中來產生這一個類似產品序號的宣告的呢?

我們就直接依照USB 插入PC 端時的 Enumeration 來看結果:

我們從上圖就發現我們在USB Device Description 中有定義了:

iManufacture 、iProduct 及 iSerial...而依序對應值就是 1、2及 3。

但注意的是在USB Enumeration 過程中,其實還有一個內定值:0 。

如果您不想定義這個東西...也可以,您只要把這些值都定義成 0 時,作業系統

連問都不會問的。也可以減少USB 系統複雜度,只是您就沒辦法做到同時支援多組

同樣產品的USB 裝置。...不是不能插到同一部電腦,而是您上層的應用軟體

無法明確的知道哪一隻USB 裝置對應到哪一個USB 接口。當然如果是

單純一部PC 只有兩個USB 接口還好,但萬一是透過USB HUB 的話,那就很難找到了。

首先我們就可以看到在USB 回覆USB 裝置中的 iProduct 的值。這是標準Unicode 的

表示方式。前面兩個值分別是長度與USB Device Descriptor 中Type值(固定為 3)。

當然要分辨兩隻實質不同的USB 裝置還是得靠  iSerial 值來區別:

第一支USB 裝置的iSerial 宣告:

----

第二支USB 裝置的iSerial 宣告:

從以上兩個不同的 iSerial 值,我們就可以發現跟我們一般上層應用程式所顯示的值一樣。

我們就知道要從USB 裝置上去區別哪一隻USB時,就是得靠USB 這一個iSerial描述值。

而光靠USB 的VID 與PID 是不夠的。

---------------

所以,當您的USB 系統應用上需要支援這一種使用方式時,您就得在USB 裝置量產上

一隻一隻的把不同USB  iSerial值...慢慢的定義進去,這一點對於那一種我們台灣喜歡搞

標準量大的MCU 產品來看:那一種要開MASK 而不支援 Flash 燒錄功能的MCU 來說。

就非常不方便了...就算是外掛的EEPROM 來說:也未必比較方便或便宜。

因為現在許多MCU 的價差真的越來越少了...這又再一次的說明:為何許多比較有附加價值

的產品,人家還是比較傾向用國外這一種USB MCU 產品系列了。

--------------------------

PS : 關於原廠所提供的那一隻HID_Blinky 範例程式是沒有提供這一項的程式演練,

所以如果您要加入這一項功能的話,您就得自己DIY 自行加入此一宣告。

--------------

 

2 則留言:

  1. 543ok.tw錄音卡片DIY2011年9月1日 上午8:43

    真是來的早,不如來的巧,,
    我正做完第一階段 多支USB 同時使用 的軟硬體,,[原先已有可工作的單支軟硬體]
    USB部份就像版主 所說的 每支USB 我都獨立改變成不同的 SerialStr 值,來辨識,
    (**我也不知有何方法可以動態改變這個值,也是土法煉鋼 多Build幾個HEX[**希望能有新方法])
     
    軟體介面呢,也是土法,,將原有單支exe 內嵌在一起,同時啟動 共同被控制,,
    做到了1對多的 同步介面(同時操作100~200個USB應該沒問題[就看USB孔,跟PC Memory了])
     
    下一步 再找時間 改進軟體 為單一exe 對多支USB了

    回覆刪除
    回覆
    1. 很好,有機會也可以聽聽您的成果分享。
      ---
      我是不知道您用哪一家的USB MCU?至於動態改變Serial String...我個人認為
      應該是沒有機會的。因為您動態改完此值之後,還是得重新Enumeration。
      結果都是一樣的。...不管您用多少個Hex Code 也沒有用的。
      ----
      至於多組EXE 同時Access USB Port ,應該還可以啦,只要您記得每一次讀寫
      USB PORT 時,要記得Open Device 再Close Device 就可以輕易做到的...
      只是自己在應用程式的Device 控制上要多留意一下流程而已。
      ---
      不過,若這類文章對大家作USB 有所幫助,那就有一點意思了。
      謝謝您的留言語回應。 =D>

      刪除