一般來說:所謂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 分析儀真的
差很多啦。
以上簡單說明,就提供給有需要人參考看看吧。
現在MCU很多有 OTG功能,我也被迫有些專案要做 host FW,有些要做 device FW,隨便找個模組來就要我用usb host 在MCU支援他,有問題就說人家PC都用得好好的。(當然在windowns會正常阿,千錯萬錯不會是HID.dll的錯,參考程式抄一抄,能活用的空間也不多)
回覆刪除我才要說做純軟的知道甚麼是usb host嗎? 他們是踩在巨人的肩膀上(微軟),還有其他人的屍體(device FW)做起來的,就結果來看他們就是達成任務了,但要從 MCU做 host,想達成任務與純軟要做的事情大大的不同啊
聽到你"悲慘"的經驗,也不禁感嘆一下。
刪除其實,早在十幾年前,我也曾經動過在單晶片平台上搞個 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...真的不容易啊。
不過呢?最終你到底學到了甚麼值得大家所參考的?不妨講給大家聽聽吧。
----
最後,我還是搞不懂的是:你們最終是要賣軟體呢?還是賣硬體裝置呢?
我只知道微軟品牌的硬體裝置都賣得不怎麼樣,感覺微軟還是一家軟體公司吧。
過去曾經做出來的 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的錯
另外,之前聽老闆說的概念,總結就是想要賣硬體送軟體,我心裡在想都甚麼時代了,還在以前那種觀念,現在都是賺軟體錢,硬體漸漸不值錢了
聽你這麼說,我就想到在前一兩年也碰過一個:
刪除要搞一個類似數位機上盒,要支援一個類似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 裝置的東西呢?
還想賣硬體送軟體?那可能要麻煩老闆要不要考慮賣吃的東西,可能會比較單純一點。
譬如是饅頭包子或是雞排、蔥油餅之類的。哈~哈~
喔~ 你其中一句話,我覺得是個經典啊。
刪除要特別收錄的點出來:"代表 RD被當成許願池的時候..."
感謝你的留言。
我也是MCU USB Hostost受害者。老實說,都是行銷的錯。主要需求是行銷將USB Disk升級FW功能放進去。我則是提出直接放入SD卡再分出去做USB MSD給user使用,但電子部打槍我,說SD卡無法耐候(問題是手機都可以)。變成行銷要用USB Disk上MCU。一但上了,使用者一定會什麼裝置都上來,mouse,camera,手機全部都會上來,這些怎麼可以寫得出來?
回覆刪除其實當年我搞玩 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 的問題。
所以啦~有很多東西都不是大家、老闆或是行銷業務人員所想的那麼單純的。
只是:身為工程師的我們,到底有多少籌碼可以拿來出來說嘴的?否則啊~可能會讓自己
不禁的浪費職場生命在這些事上。然後幾年過去了,才發現:為什麼平平大家工作
那麼多年,人家可以功成名就(啊~不就是可以闖出一點名氣,或事多賺一點錢啦)。
我們還在這裡跟行銷業務在那邊討價還價的做得要死呢?不是嗎?... 唉~啊~