2019年12月5日 星期四

USB DIY --- USB Host 端的軟體開發(一)

這篇文章來講講在 USB DIY 系統開發中,很重要的一個關鍵:Host 端的軟體開發。

一般來說:所謂Host 端的軟體,指的就是 PC 端的應用通訊軟體。

相對於寫USB 韌體來說,系統工程師可能比較難接觸PC 端的應用軟體,

我個人經驗是覺得應該就是比較複雜的UI 人機介面,因為韌體不用管美美的畫面或

是各項按鈕、圖像或一個簡單的文字(或數字)的顯示與排列方式,而這一部分就會

牽涉到PC 作業系統的許多資源問題,如果沒有常寫PC 應用程式的人來說:真的比較

難以入門或鑽研,當然如果你是在大公司上班的,也不用擔心這個,因為公司內可能有

專門寫PC 應用軟體的工程師吧。只是要多花一點工夫溝通與協調整合吧。

當然啊~現在新一代的工程師在學校學的,應該是 Python 了,當然也有人用 Python 寫

這一種應用程式,只是以我看過的範例來說:應該都算是比較簡易的通訊程式而已。

寫寫 Debug 或甚麼的,應該還好,但如果要深入用開發複雜一點的系統應用來說:

可能不一定會事半功倍啊,因為當碰到問題時,也不一定容易Debug。尤其當你拿到

一個範例程式,從這裡往下延伸開發時,往往碰到問題之後,就容易卡住了。

這個問題在別的語言開發平台也會發生,但可能比較容易處理吧。

這篇文章,就是要說明一下:當你找到一個範例程式之後,當然也會碰到類似的問題時,

你要如何處理?

我不是任何EE 或是資工背景畢業的,這些東西完全都是靠自己自修而來,我做得到,

我相信你應該也可以的。

首先,我最早接觸的軟體是:VB 3.0 那時候啦。相對那時我已經有在摸  Turbo C 來說,

雖然 VB 3.0 的 UI 介面比較好學與上手,(那時主要還是 UART/RS232 Com port 時代)。

但後來我還是改用  VC 了。我是從 VC 6.0 MFC 才真正切入Host 端應用軟體開發的。

就一路一直採用這樣子的開發平台了。也很高興,許多原廠或網路資源的東西,也一直

有這方面的範例與資源。

一般USB  Host 端的範例程式可以在網路上找,但這一部分的資料來源會有點雜亂複雜,

找了老半天,也搞不清楚哪一版才是真正、可以相信的版本呢?尤其是在大陸網站上。

我的經驗是從原廠官方所提供的範例程式:Silabs 的 AN249 這一份官方文件說明。

當然啊,如果你真的懂得這樣 USB Host 端應用軟體開發的話,也不一定只用在Silabs

這家公司的硬體或韌體上而已,因為USB 的東西是跟 Device 端的平台硬體或韌體無關的。

所以以下你就會發現這一點很好玩的現象了:早期原廠所提供的範例程式沒有任何包裝

的 Library,所以你可以拿來應用到任何一家的USB controller 上,一家烤肉萬家香。哈~

但後來原廠可能有意識到這一點了,後來就沒有這樣子搞了。

我們就來看早期  AN249 這一份資料所提供的範例程式:


這是早在 2007 年所提供的範例程式。(現在已經沒有這一份了,同樣的檔名所提供的內容

完全不同了,以下會進一步說明)。

當初該公司總共有三個系列的 USB controller ,他都分別提供韌體與 Host 端的範例程式。

但其實Host 端的範例程式都是一樣的,因為USB的通訊協定是固定的,PC 作業系統也不會

去管誰家的晶片或韌體的。


往下目錄中,只有在 BlinkyExample 裡有提供Host 端範例程式:

當然它也有提供一版已經組譯成功可以直接執行的程式了。這個程式(HID_Blinky.exe)可以

直接執行,不需要額外的 DLL 或任何外掛檔案,簡單容易。


2007 年,當然就是當年的 Visual Studio 7.0 版的。不過,你現在用新一點版本也是可以開

啟檔案的,我目前還是停在 Visual Studio 2010 啦。


不過,這個範例程式還是有一個問題:那就是在組譯過程中,他需要Link 一些檔案,

在原廠提供的壓縮包裏沒有,你要自己去微軟公司找。(其實網路很多):那就是

HID.LIB 。但我是覺得應該路徑設定問題,否則,你直接組譯時,會發生錯誤,

就是缺這一個檔案啦。(另外一個是 Setupapi.lib,但這個檔案路徑沒問題。) 


但還是缺一個 Include 檔: hidsdi.h 。這個檔案也很好找,不用甚麼最新版本,2007 年的

也沒關係,因為 USB HID Class 很早就很完善了。
----
基本上,你只要有了這一個範例平台之後,應該就可以動手玩 USB DIY 中的 Host 端

應用程式了,你也不用擔心,萬一我的USB Controller 不是Silabs MCU 而是別家的。

怎麼辦?這個你不用擔心,我自己用這個範例平台,寫過好幾家的USB Controller ,

完全沒有違和感啊。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
好了,我一開始說過:可能原廠也發現這個問題,也想完善他自己開發平台,

所以現在你在官方網站或其他網路搜尋,應該都是找到他的新版範例程式碼了:

他新版的範例程式就完全拉出來獨立一個目錄,因為我說了:這個東西跟USB Device 的

硬體或韌體平台無關的。


一樣的,這個範例程式一樣是針對 HID_Blinky 的範例寫的。只不過看起來,他有增加

一個 HIDToUART的範例,我個人覺得沒差了。


這一版的範例程式就不需要Link 任何 Library 檔了,只不過他跑出一個SLABHIDDevice.h


所以你的組譯工作目錄下,就必須提供兩個檔案:(在上圖標示中)。很明顯的是:

原廠想藉由檔名的宣告來宣示他的主權了。哈~哈~

不過,這一支程式還是可以組譯執行的:


只是你的執行檔下必須外掛另一隻 SLABHIDDevice.DLL 了。




這樣子原廠就達到它的目的了,當然這個作法是宣示作用遠大於實質作法,

因為你還是可以用原先早期版本來規避這個問題的啦。因為畢竟USB HID 的東西技術

太成熟了。微軟早早在 20 年前就完善了,你底下 USB device 動不了甚麼的啦。

<<<<<<<<<<<<<<<<<       >>>>>>>>>>>>>>>>>>>>>>
好了,我已經把 USB host 端的軟體開發一開始的平台範例簡單的說明一下了。

因為USB HID 的東西比較容易上手入門。

但如果你問我:那如果是 USB Bulk 傳輸怎麼辦?這個就比較麻煩。

因為微軟管不到  USB Bulk 傳輸介面的通訊協定,所以這一部分你可能就要自己開發

一支屬於自己的 USB Bulk 傳輸驅動程式了。

幸好,一樣早期IC 原廠也有提供類似的範例程式:




只不過,當你組譯出這一隻 SiBulk.sys ,應該還是要過微軟的軟體認證,否則,在安裝

過程中,應該還會碰到另外的問題,不過,這些問題都只是"錢"(費用)的問題而已。

大公司花得起這個錢的啦。

============================

結論:其實,搞USB DIY的東西,都不是一天、兩天就容易上手的事。光是韌體而沒有

Host 端軟體支持,都不容易學好,所以你自己有努力在各個網路搜尋過的話,應該也可以

理解,就連滿街灑原始碼的大陸網路裡,也都未必提供完整的資料或說明,常常是

USB Controller 韌體原始碼丟給你交差了事。至於 Host  PC 端的軟體就算了,

反正他們也從別人或原廠資料搞來的。也未必真的有認真的鑽研或組譯跑一下範例。

當然啊。除了 韌體與Host 端應用軟體範例外,我個人覺得還是需要 USB 分析儀。

但你覺得你可以用 USB Sniffer 的東西,我還是強烈的建議,有USB 分析儀真的

差很多啦。

以上簡單說明,就提供給有需要人參考看看吧。


7 則留言:

  1. 現在MCU很多有 OTG功能,我也被迫有些專案要做 host FW,有些要做 device FW,隨便找個模組來就要我用usb host 在MCU支援他,有問題就說人家PC都用得好好的。(當然在windowns會正常阿,千錯萬錯不會是HID.dll的錯,參考程式抄一抄,能活用的空間也不多)

    我才要說做純軟的知道甚麼是usb host嗎? 他們是踩在巨人的肩膀上(微軟),還有其他人的屍體(device FW)做起來的,就結果來看他們就是達成任務了,但要從 MCU做 host,想達成任務與純軟要做的事情大大的不同啊

    回覆刪除
    回覆
    1. 聽到你"悲慘"的經驗,也不禁感嘆一下。

      其實,早在十幾年前,我也曾經動過在單晶片平台上搞個 USB Host 的念頭。

      因為那時候很"天真的想":對啊,市面上一大堆USB Device 的東西,而且有各式各樣,

      不同功能的USB 裝置,如果能搞個USB host 平台有多好用啊。....

      結果呢...還真的慶幸地自己沒有笨到去搞這種鳥事。因為當你真的搞過USB PC端的軟體之後,

      你就知道:有些東西,是沒辦法取代PC 上那個微軟的平台資源的。(當然啊~人家偉大的祖國,

      厲害了我的國。已經號稱要盡量不要用美國科技的東西,不知道甚麼時候可以看到大陸出品的

      PC 作業系統啊?就不禁我想起當年義和團意氣風發的偉大情操啊!)

      那為什麼還真的有人這麼認真地想用MCU 的USB OTG 搞個 USB host 呢?難道真的很天真的

      想做到我上述的那個可以兼容所有的USB device 裝置嗎?

      這樣子請教一下好了。不知道你後來完成支援了幾項外面一般市售的USB device呢?

      還是搞了老半天,只能接自己家的 USB device 呢?

      你認為萬一碰到有些不相容的 USB device 時,是要人家配合你改到兼容呢?

      還是你要改你的 USB host 的平台呢?...有這麼偉大的產品PM...真的不容易啊。

      不過呢?最終你到底學到了甚麼值得大家所參考的?不妨講給大家聽聽吧。

      ----

      最後,我還是搞不懂的是:你們最終是要賣軟體呢?還是賣硬體裝置呢?

      我只知道微軟品牌的硬體裝置都賣得不怎麼樣,感覺微軟還是一家軟體公司吧。

      刪除
    2. 過去曾經做出來的 host有 HID KEY、HID vendor、CDC,還好行銷不知道 USB disk可以更新程式,不然又要多支援一個功能,(雖然曾經也做過USB disk的device),這些都代表 RD被當成許願池的時候,如果成真了,就會覺得能用MCU就能達成的事情,不再想用PC來做,好聽的就說是IOT,其實是另一種形式的 cost down吧

      真的從host角度看 HID 鍵盤,才知道外面奇形怪狀的鍵盤這麼多,還好最後商品賣在封閉環境,非消費性市場,問題得以收斂。倒是還真的遇過HID vendor有問題,提出很多證明 device是錯的資料,人家就是不改,回到PC就好好的當理由,最後 PM 礙於時間壓力只好壓榨自家人修改host去配合 device。不要真的以為外面 usb device 很多,離開了PC,難免奇怪的問題接著就會出來

      做usb host真的有主導權嗎? 未必喔,到最後是誰要改...還不如做純軟就好,hid.dll執行下去有問題都是 they的錯

      另外,之前聽老闆說的概念,總結就是想要賣硬體送軟體,我心裡在想都甚麼時代了,還在以前那種觀念,現在都是賺軟體錢,硬體漸漸不值錢了

      刪除
    3. 聽你這麼說,我就想到在前一兩年也碰過一個:

      要搞一個類似數位機上盒,要支援一個類似PC 的USB HID keyboard遙控器,

      就是類似這個:
      https://www.rakuten.com.tw/shop/world3c/product/SV1PZUQ6I/?scid=rafop-gs949_3C_genre&utm_source=tagtoo&utm_medium=cpc&utm_term=1007%3A66%3A20020077777&utm_campaign=tagtoo&utm_content=tagtoo&pr=d79a19ad0d3b61e1

      但很好笑的是:這個東西就是在PC 上測試,怎麼測,都沒問題。但一碰到那個真正應用的

      機上盒系統時,就出現問題,還不是一直出現問題,就那麼偶而,莫名其妙地出現不明原因

      收不到鍵盤資料,人家也確定跟你說RF 沒問題。(靠~還加上RF 呢!)

      不過,這個案子我們只負責 Keyboard 這一邊,但你也知道:搞 keyboard 的"技術層次較低"

      人家搞機上盒是大系統,人家理由比較多,結果呢?我幫忙人家看了一下Keyboard 這邊的

      code 之後,我就知道沒解了。對啊~對方Host 又不是微軟。幹嘛浪費生命在這上面呢?

      該不會我們碰到的,就是你們嗎?但我相信啊~這世上應該不只有你們一家有這一種想法的人吧。

      這一種鍵盤產品沒錯,因為人家可能接PC 沒問題啊。

      就你所說的:這光只是一般Keyboard 而已,那如果還是其他 USB 裝置的東西呢?

      還想賣硬體送軟體?那可能要麻煩老闆要不要考慮賣吃的東西,可能會比較單純一點。

      譬如是饅頭包子或是雞排、蔥油餅之類的。哈~哈~



      刪除
    4. 喔~ 你其中一句話,我覺得是個經典啊。

      要特別收錄的點出來:"代表 RD被當成許願池的時候..."

      感謝你的留言。

      刪除
  2. 我也是MCU USB Hostost受害者。老實說,都是行銷的錯。主要需求是行銷將USB Disk升級FW功能放進去。我則是提出直接放入SD卡再分出去做USB MSD給user使用,但電子部打槍我,說SD卡無法耐候(問題是手機都可以)。變成行銷要用USB Disk上MCU。一但上了,使用者一定會什麼裝置都上來,mouse,camera,手機全部都會上來,這些怎麼可以寫得出來?

    回覆刪除
    回覆
    1. 其實當年我搞玩 scanner USB SOC 之後,我接下來的任務就是要協助驗證開發搞一顆

      USB 隨身碟的 SOC。也沒甚麼協助驗證開發啊,就是要完成USB 隨身碟的韌體。

      不過,也不用太驚訝,因為USB 隨身碟的韌體是不用寫 DOS file system 的。

      但搞起來也是挺累人的。幸運的是:不是我後來完成了,而是我職務轉換,不用搞了。

      (其實是我主動提出換單位的啦!)... 這一部分工作最大的挑戰倒也不是USB 的系統,

      而是 Flash Access system,NAND flash 的Access 真的需要有特殊的技巧,否則,

      一來沒效率,二來可能也會縮短 Flash 的讀寫壽命的...我們當初用的MCU 是 8 bits。

      但後來我搞 MP3 SOC 時,發現後來 NAND Flash 的架構越來越複雜,我記得有一次去聽

      SanDisk 工程師的簡報,發現人家後來都是用 32 bits MCU 來處理 ECC 的問題。

      所以啦~有很多東西都不是大家、老闆或是行銷業務人員所想的那麼單純的。

      只是:身為工程師的我們,到底有多少籌碼可以拿來出來說嘴的?否則啊~可能會讓自己

      不禁的浪費職場生命在這些事上。然後幾年過去了,才發現:為什麼平平大家工作

      那麼多年,人家可以功成名就(啊~不就是可以闖出一點名氣,或事多賺一點錢啦)。

      我們還在這裡跟行銷業務在那邊討價還價的做得要死呢?不是嗎?... 唉~啊~


      刪除