2011年5月31日 星期二

USB DIY-- 自學計畫(十)

想瞭解之前的...可以點選以下連結:
---
關於USB 自學計畫中關於HID 的應用來說,大概就剩下關於PC Host 的軟體部分,

又因為HID 是走Microsoft 標準驅動程式的,所以,在驅動程式這邊就沒啥好說,

所以,我只要稍微點出驅動程式一些現象之後,最後我會再以原廠所附的上層

應用範例程式簡單說明一下,大概就完成了整個USB 自學計畫中的HID 部分了。

關於 USB HID 的部分真的是自學計畫啦,因為第一:我之前沒有做過USB HID

的產品,這一次要逼著學USB HID 的確是因為有系統應用上的需求,所以,

就開始著手進行了。第二:當然也是希望透過這樣子的機會,剛好也可以熟悉一下

這一家對大家來可能會比較好取得的USB MCU ,如此一來,大家也比較容易可以

跟得上我的相關學習內容的解說。當然啊,透過這樣子的解說或許對您來說:

可能還是有些許沒有交代很清楚的地方,但是,對我來說,應該是足夠我進行系統

應用開發了。至於,您認為不足的地方,我說過了:我不會拿著標準規格書一一的

比對的解說給您看的,因為:這一部份,您真的要自己好好用功念書的。

如果:您自己本身無法從標準的規格書去解讀出USB HID 或相關系統應用的方法的話,

那我會認為您真的要認真的考慮一下:您自己到底要不要走這一行了。

您也不可能想說:又想幹研發工程師,但卻又沒辦法從標準規格書去消化出工作規範,

只是想一輩子最好都有長官或前輩可以罩著您?那是不可能的...因為,很簡單:

人都會老的,永遠會有年輕力壯新生代的工程師出來的...這就是現實人生。
----------------
好吧,我們就來解說一下USB HID 所對應的PC Host 的軟體一些東西,我先說明一下,

我還是只針對Microsoft 的作業系統...唉~想一下還真感慨啦,記得我剛開始寫USB DIY

系列文章時,也只不過短短幾年而已,網路所累積的閱覽人次也才二十幾萬人次。

結果:我們就看到 Apple 之 iOS 與 Google 之Andriod 兩大陣營在科技界的較勁。

反而,昔日大家所倚賴的,或是大家認為學高科技技能所必備的就業利器的Microsoft

作業平台,竟然被冷落一旁了。現在只要您翻開一些短期進修或在職進修,乃至於

所謂就業輔導課程...幾乎都快被以上兩大陣營之行動作業平台所佔據了。

這一種幾乎不可擋的趨勢:我想Microsoft 如果不敢快想出因應對策的話,不要說:

他作業系統上的應用開發程式沒有人想學啦,我想連他自己原本強大的作業系統平台

也前途堪慮。...前幾年當Google 喊出要取代微軟的口號,我還以為是痴人說夢話,

現在我也開始有點相信了,我們當然不是說:微軟會完全被取代啦,只是人們對於

他作業系統的需求也只會停留到目前階段就夠了。已經不需要升級改版,甚至認為

沒必要再做任何未來投資了,這樣子的看法與解讀,對於所謂上市櫃公司來說:

是很危險的。因為股票市場看的是『本夢比』,沒有任何前景或願景的公司,

在股票市場一定會被唾棄的。您看我們上市櫃公司裡,尤其是高科技公司遊戲規則裡,

其實有許多公司他的營收或是獲利其實都還可以過得去,但是,股價就是被晾在那。

譬如:全年EPS  1~2 元都已經算不錯了,但因為沒有願景,也只能被定位成10 左右的

本益比...股價也頂多20~30 元,萬一市場稍微有點風吹草動的,就會被連帶的打成

票面淨值的。唉~...那就更不用說:那一些沒有跟上這一波時代潮流的高科技公司的。

您自己可以去查一下那一些主要營收項目是:微控制器的高科技公司或IC 設計公司的。

不要說營收持平,光要維持損益平衡都很辛苦了,也幾乎包辦了目前類股中低價族群。

高科技界打的是腦力密集的持續戰,不行的,就自己看著辦吧!
------------



上圖應該是我所貼圖中最長的一張圖了,先不看解說。

您可以自己看得出他是什麼東東嗎?!

其實,如果您可以從裡面看出他的USB Protocol 的話,應該算很厲害了,但如果您

還能看出微軟作業系統的USB HID 驅動程式的內容的話,那就更厲害了。

我這張圖是在 Microsoft 作業系統 XP SP2 下插拔時,USB Enumeration 時節錄的。

答案是:當我們USB HID  Device 插入PC HOST 時,作業系統的內定驅動程式會看到您的

USB HID Class 的 Get Report Descriptor 所描述內容,因為:在USB HID  Class 中,

USB Device 至少一定要定義一組 Interrupt Interface。

所以,從圖上您就可以看到當我們USB HID Device好不容易回完 Get Report Descriptor 之後,

PC Host 馬上就透過Endpoint 1 (interrupt  Interface 之Endpoint )來要資料了。

根本我們自己的上層應用程式都還沒打開呢。...這完全是PC Host 作業系統的那一支

HID 底層驅動程式搞的。其實,人家這麼做也沒錯,因為HID 本來就是要定義給

像鍵盤或滑鼠這一種人機介面(HID, Human Interface Device) 的輸出入裝置用的,當然,

當您USB Device 一掛到PC Host 之後就得要馬上動作,才能符合USB plug and play 特性。

作業系統的驅動程式只負責把USB HID 的資料抓進來擺著,您上層應用程式要不要用?

那是您上層應用程式的問題。跟他作業系統無關的。

那至於多久抓一次?其實,依據的是您自己Device Interface Descriptor 所定義的。

萬一您都沒有回的話,會如何?!我有試了一下幾分鐘都不回,作業系統也沒怎麼樣。

本來在USB 規範中,其實資料傳輸本來就是In Token 與Out token ,這樣子的東西,對於

Interrupt Interface 與Bulk Interface 來說:我們光從 USB 的匯流排分析儀來看是一樣的。

所以,只要您有正常的回NAK 完成 In/Out Token ,沒有人會說您是錯的。我講過了,

您要用NAK 擋到千年、萬年的,還是屬於USB 規範內容,就算您是微軟也不能說不對啊。

只是這樣子的擋法,一直不回PC HOST資料內容的您要作什麼用?萬一您上層應用程式

跑起來要這一部份的資料時,作業系統就有可能沒辦法回您資料...您就自己看得辦吧。

好吧,我們就把這些中間的NAK 拿掉再觀察一次:


我就可以發現:雖然我們PC Host 上層應用程式沒有跑,

其實,作業系統的那一支驅動程式,還是幫我們一直抓資料的...

而我們USB DEVICE 也是一直在送資料的。這些都跟我們有沒有打開應用程式無關。

但是我們從前面那個Packet Number 看來:也好像沒有那麼規律性的時間來抓資料,

這跟我們在PC Host 中寫MFC 程式時,用那個Timer 寫程式一樣:從來沒有人會認為

這個時間是很準的啦,...好像跟我們看電腦的時間(時鐘)一樣,沒有人會相信他的誤差

是很小的。我們還是習慣再看一下時鐘會比較安心的。
-----------------------------
好了,我們已經稍微講完USB HID 的PC Host 的驅動程式的基本動作了,最後我們會交代完

在寫上層應用程式時,所會用的一些簡單的函數庫呼叫,之後,我們就又就會將這一部份的

USB DIY 自學計畫,暫時再告一段落了。當然啊,如果有什麼新發現,或值得大家在討論的

我會找機會說明的。謝謝!
(待續)



14 則留言:

  1. Chamber 大大您好,
    既然 USB HID 傳輸在PC端有微軟的Driver 支援,不用自己寫Driver
    那為什麼還有許多家廠商自行開發Driver
    除了 通訊速率,封包大小之外
    假如客戶可以接受的話
    那 HID 有什麼缺點!!!!

    請教您的意見,謝謝.

    回覆刪除
    回覆
    1. 既然是USB HID當然就是用微軟的Driver,至於別人要在包一層他們自己
      的Driver 當然可以啊...沒有人說不可以,反正,您只要依照USB HID 的
      命令規範,您還是得依照微軟的那一隻底層的Driver。
      其實,您所說的通訊速率與封包大小就幾乎就是USB HID 的主要缺點了。
      但如果還要進一步說明的話:我個人認為USB HID 要拿來作客制化的應用,
      就是您明明就是用USB HID Class的通訊協定,但您又要做自己的特殊應用。
      我是覺得應該最大的缺點應該就是USB Device 端的韌體應用程式會比較
      難發展與維護。
      因為很簡單:USB HID Class的命令不多,就只有Get/Set Report 及
      Get/Set Feature 而已。您用微軟的驅動程式,您也沒辦法再下別的命令了。
      若是一些簡單的應用應該還可以,但如果太複雜的話,可能就有點麻煩了。
      舉個簡單的例子,譬如我們要用利用USB HID 要做一台MCU 燒錄器的話,
      一開始可能很簡單,幾個Report ID 就夠用了...但萬一,您要支援的MCU 型號
      變多了,或是功能變多了(譬如還要搞那個ICE 開發平台...等等)那可能會
      使得在Report ID 的定義會變得很複雜。相對來說,USB Device 端的韌體
      就變得複雜了。因為USB HID Class 的命令只能傳標準命令,萬一您要傳一些
      特殊指令的話(譬如要抓目標MCU 的特定位址上的資料時,您就得在
      Get/Set Report 或是Get/Set Feature 的傳輸內容(In/Out Token)中自己塞
      進自己特殊資料內容或是屬於自己應用的特殊命令,然後,
      USB Device 韌體程式自己再慢慢的解讀這些特殊命令。
      ...這樣子搞起來,不是不行,會讓韌體工程師與軟體工程師抓狂的...
      因為您必須事先批哩啪啦定義一大張的通訊協定規範書,讓兩邊依循,
      否則,不是東西搞不出來,會讓兩邊工程師天天為這個東西在吵架!
      --- 很簡單...當我看到SiLabs 那一條ICE 下載線的USB HID 的
      Get Report Descriptor 的描述內容,我就覺得還不是簡單的"落落長"而已。
      至少以我自己本身的系統應用經驗來看,應該這是比較大的應用缺點吧!

      刪除
  2. 謝謝 Chamber 大大您的意見,
    所以我如果設計的東西比較簡單,
    客戶純粹想用USB當PC與儀器之間的介面
    那 HID 就夠用了.
    因為我是使用Microchip  PIC24F 開發,
    我對USB 規格也看沒多久
    但是參考範例
    我想我應該可以設計出客戶要的東西
    只是對 Microchip 的 USB 韌體底層就沒有細看
    可否請教您,
    在我依照目前對 "USB 韌體底層就沒有細看"
    套用範例程式的狀況下,需要特別注意哪些地方.
    抱歉,自己不努力KK文件,看看用問得會不會比較快.

    回覆刪除
    回覆
    1. 您要我能說什麼呢?當然我也很能體諒您老闆(客人)給您的壓力。
      但是,往往事情就是這樣子...急就章的上機作設計的東西,
      往往搞五分鐘卻要花幾個月慢慢調適,最後只是很辛苦的貼狗皮膏藥。
      屆時,也能怪『個人造業,個人擔』了。
      PS : 如果是這樣子的學USB 技術開發,那倒不如找另一個簡單的差事幹吧。
      跑跑客戶打嘴砲的,都比這樣子都還好幹的啦。

      刪除
  3. 版主您好:
    小弟我剛走進USB這個領域,您的自學計畫真的很有幫助,可以讓我們從不同角度看USB這玩意。我現在有遇到一個問題 "關於HID Class request內的feature report"
    簡單來說我的device(i2c to USB MCU)的firmware(FW)內沒有寫這部分的code,當我用USBlyzer觀察協定時,發現host會發一個Get Report(Feature id:x Len:xx)屬於class interface,過一段時間後,device應該要回一個report利用control transfer,但是USBlyzer中看到的協定是device回應了一個control transfer canceled ! 我才發現FW內沒有寫到feature report的部分,遍尋不到解答,想請教一下版主能否給點意見。
    我的device是Cypress EZ-USB FX2開發版
    我的目的是拿來做i2c轉USB的橋樑,i2c那端是接觸控面板,feature report內主要是放max contact count也就是支援的最多指數(多點觸控)
    如果版主有興趣,我也可以寄FW給您,請您幫忙看一下
    謝謝
    也可以回信給我
    小弟Email: slewei44@yahoo.com.tw

    回覆刪除
    回覆
    1. 我想您應該沒有先用一些簡單的程式把Cypress FX2 的平台在
      您的USB HID 的應用上先做一兩個小實驗...所以,USB Device 才會
      回一個出乎您所意料以外的內容。...至於是I2C 轉USB 或是
      什麼觸控應用等等?!那都不重要的啦。--- 我應該也沒興趣看吧。
      ---
      所以,您還是先回到USB HID 最基本的定義及簡單的Interface 做一些
      簡單的實驗再說。至少,您每一個ID 外加所有的該回覆的資料內容
      先有個基本的定義與您所期望的資料時,您才把這一支基本韌體程式
      再改寫您真正要使用的環境裡去。...
      Cypress 原廠應該有一些基本的範例程式吧?!您可以先用原廠的範例程式,
      然後先自己寫一支自己要測試用的PC AP 應用程式...此時至少您可以先證明
      原廠USB Device 端的韌體可以套用到您自己的應用程式,可以先證明
      您在HID 的基本通訊協定中,您整個資料來來回回是沒有問題的...
      然後您在稍微改寫一下AP...您應該很快就會發現,您的USB Device
      應該就開始有點"秀逗"、"秀逗"了...此時您就可以發現您USB Device
      韌體就已經不聽使喚。那此時您就該動手好好研究一下 USB Device的韌體
      該怎麼改了吧!就不應該等您說:一下子要I2C 轉 USB 或是劈哩啪啦
      弄了什麼多點觸控應用等等...把自己搞得一塌糊塗時,再來發現:
      "蛤?!...我的USB Device 怎麼連一個基本的HID 的Get Feature 都
      不懂得該回什麼?!..." ....您自己都沒搞懂,您所寫的USB Device 韌體
      怎麼知道您要他做什麼?!他應該沒有人工智慧這麼聰明吧?!
      ------
      您應該跑太快了啦....還是先把USB HID 的基本東西先好好研究一下吧。
      我當然也知道如是工作需求的話,那是有一定的時程壓力,但如果長官
      既然要您搞定這個,不是要給您時間好好鑽研一下?!就是要幫您找個
      好師傅吧?! ---- 很簡單,我最近幫別人公司寫了一支HID 應用程式,
      我都已經邊做邊教了,我也相信這位工程師也很認真,但三個月過去了....
      我還是常在這位工程師臉上看到我所講的USB 的東西 :: 蛤?!蛤?!蛤?!

      :) ... :) ... :) ...
      ----
      無論如何。您還是先靜下心來,先把Cypress  USB FX2 拿出來,先用
      最基本的USB HID 範例先改寫一下 基本的Feature 的宣告,再用簡單的
      範例程式改寫一下您所對應的新的Report ID 及韌體所應該修改對應的
      Report ID ...這樣子就應該不至於回這一個Control Tranfer Canncelled ?
      ---這是什麼東西啊?!蛤?!我也是蛤?! :-/ ...正常標準的HID 韌體程式
      看不懂AP 端的內容?!應該是直接在這一個Endpoint 上直接回Stall 才對啊!
      再重新來個Clear Feature及 Set Feature 來修正吧!先搞清楚吧...
      就看您只是把學USB 這件事是當作工作而已呢?還是真的要把他學好吧!
      加油吧!
      PS : 我就不用Email回了...有問題就直接再Post 吧!

      刪除
  4. 您應該跑太快了啦....還是先把USB HID 的基本東西先好好研究一下吧。
    ==>公司沒給這麼多時間阿~上次跟同事聊天他只說 兩周搞懂USB傳輸~兩周搞定apple device傳輸~
    USB規格書重要要?遇到問題在來慢慢K吧~當然在K之前就是在網路上找答案&到處討論區問問~看看有無善心人士的回答囉(最好還會幫忙修改source code拉)~XD~多數人都這樣學習的~包括我~ :))

    回覆刪除
    回覆
    1. 所以啦...公司要的只是工程操作員~只要會敲鍵盤寫程式的人而已。
      當公司上層用這一種觀念在找人時,那我們自然而然就會被定位成
      這樣子的價值而已。...所以...找您?!或找我都是一樣的。
      我說過了~當您會這些東西,可能只是比一般菜鳥工程師好找工作一點而已。
      當老闆再找到更好,更便宜的,他就不會一定要鳥您的(意見)。
      當然您工作可以再換啊,您也一定可以再找得到...您跟老闆都沒差。
      但到了45 歲後~您跟老闆就有差了。哈~哈~ :))

      刪除
  5. 恕小弟多嘴~
    feature report內主要是放max contact count也就是支援的最多指數(多點觸控)
    ==>這表示你已經知道問題在哪了啊?  hid的報告描述元沒定義該 report (feature)啊? 該怎麼定義? Windows 7(8)的 TP補充資料有說明~ 貼上就可以了~
    至於要怎麼回feature的資料? 那就看看有無 get/set  report or protocol & idle 的範例~ copy一下貼上就可以了拉~

    回覆刪除
    回覆
    1. 唉~這個TP 的Feature Report 要怎麼定義?!我也真的沒興趣
      瞭解...因為我自己應該用不到,就算如果有一天用到了,應該就您說的:
      剪下Copy 及貼上吧。
      ----- 需要在這個地方討論這麼細節又有點不關我的事嗎?

      刪除
  6. 可是PIC kit2/3不就是走HID嗎? 難道他們真的用這麼麻煩的方法去做出MCU ICE/debug?

    另外想請問一下,AT89S5X沒有USB功能,有可能用GPIO做出USB介面嗎?

    回覆刪除
    回覆
    1. PIC kit2/3 我不懂!...會不會很麻煩去搞ICE 或Debug ?!
      如果您的MCU 產品線在市場呼風喚雨的話,根本不用您自己做,
      外面自然有一大堆專業的公司會幫您搞定!如果不是?!
      那算您自己倒楣...就自己關起門來,慢慢搞...搞到最後,又難用,
      Bug 又一大堆的,一天到晚一直在叫客人升級,更新版本。
      搞到最後~就算穩定了,大概客人也跑光去用別的MCU 了! :)) ...
      Who care you ?!
      ------------------
      同學啊...現在帶USB MCU 滿街都是了啦,就不要這麼辛苦的
      找一棵ROM Size 這麼小,又沒這個周邊,又沒那個什麼東東的...
      何必呢?!一場電影票就可以搞定一塊EV 版了啦!
      (人家的 ARM EV 都送您一片帶USB 的MCU 給您了!) 
      您在電子材料行買不到,您就不會去網路買嗎?!
      不是您在電子材料行買到什麼MCU 就只能搞什麼MCU 的啦!

      刪除
  7. 大頭鰱 已針對您的文章「USB DIY-- 自學計畫(十)」留下新意見:

    老師你好
    有一個問題想請教一下, 我在我們板子上做實驗, 分別 insmod hub 和 hid. 這兩個都是模擬的在linux 下
    insmod ko file . 有一個問題想請教一下當我 insmod hub 時候, 我有看到我們韌體收到 0,9,1,0,0
    這個 SetConfiguration 指令. 所以我有看到給hub 一個位置 3 . 但是當我再 insmod hid 時
    host 那邊我看到下 0,1,1,0,0 ClearFeature 這個命令. 這時候我發現原本的 hub 又重新給個位置 2
    hid 給的位置變成 3
    請問一下為何 hid insmod 後會發生0,1,1,0,0 ClearFeature 這個命令, 這是為何呢?

    由 大頭鰱 於 2016年3月22日 下午8:09 張貼在 ChamberPlus System Level Studio

    回覆刪除
    回覆
    1. 完了~過了這麼多年,突然有人問我USB 的問題。

      我當然不可能為了這個問題還要去翻USB 規格書。我儘量以印象來回答。

      一般會發生Clear Feature 可能是你之前回PC HID 的命令有問題,要抓USB 韌體程式BUG

      是要往前多看一兩組命令。至於為什麼會跑出 HID 位置 3 ?那可能也要看一下一開始

      HID 的宣告吧。

      如果是我的話,我就是會往前先看為什麼人家 Host 會下Clear Feature ?

      可能你們在通訊協定裡回了一個不該回或是HOST 看不懂的東西吧。

      ---
      不好意思,我只能憑印象了囉。

      刪除