2013年1月23日 星期三

常見與常用的USB Class

之前我有介紹關於 NXP LPC11U14 EV Board 中,它是一棵 帶USB 的ARM Cortex M0。
在我進入實際驗證 8 bits 與32 bits MCU 在於 USB 系統應用端之前,
我們先整理一下我們在這一些原廠所提供的USB 範例程式中,
所常見到的USB Class 的種類。
---


我想第一順位就是 USBHID 。您當然不會是拿來做鍵盤滑鼠的,因為我想做鍵盤滑鼠,
因為不必用到32 bits ARM 來玩吧。USB HID 有個基本好處的地方就是他基本上有提供
一個 Interrupt Pipe ,所以可以拿來主動傳輸資料給Host ...這是一些基本系統應用基礎,
因為USB 基本上就是主從架構與觀念,USB Device 都是屬於被動狀態,雖然當USB
Device 插入USB HOST 時,主機會知道,但隨後如果主機沒有主動發出Token 的話,
基本上,USB Device 都是處於Stand-by 狀態。但是如果您是USB HID 的話,
因為他基本上有所謂的 Interrupt Pipe 宣告,所以它是可以隨時通知主機的。
這一點可以讓我們在系統應用上可以主動通知主機...當然啊~必要時,您也可以寫一支
Host 端的常駐程式來處理。--- 譬如在系統應用上我們可以拿來量測或偵測東西。
再直接傳輸告知PC Host 端。
---
第二種就是USB MSC (Mass storage Class)...這是讓您的USB 可以模擬成一棵
隨身碟,也就是一棵硬碟啦。用最簡單的檔案複製或讀寫方式來存取。...
他的好處就是連PC HOST 端的上層應用軟體也不用寫了,直接用檔案管理員來玩。
...只不過,因為侷限於USB Device 端本身的記憶體容量有限,所以您所能宣告的
硬碟容量有限的。---但這不重點,因為您不會真的拿這麼一棵ARM MCU當儲存裝置的!
另外,使用USB MSC 有個好處,就是他基本上是一個 DOS File System...所以,
如果您的USB Device 韌體支援DOS File system 的話,您也就更不用管USB的傳輸
內容,也不用管什麼USB 命令啊,或什麼 Class Command 等等,而且用 32 bits
的ARM 來寫一個 DOS File System 更是如魚得水,駕輕就熟...只不過,要去那邊
找一個DOS File System ?!我想一般MCU 原廠應該都不會主動提供範例,
您自個兒可能要在茫茫網路世界裡搜尋吧,要注意的是:DOS File System 是有分
FAT16 及 FAT32 的...好像一般講FAT 的,都已經是指32 bits 的!...另外,
您也可以依您的系統應用需求,可以只支援 Read Only...因為畢竟一個完整的
Read/Write DOS File System 的韌體程式也不小啊!幾十K 跑不掉吧!
-----
第三種就是  USB CDC (Communication Device Class)這就是我們一般所熟稱的
Virtual COM ,就是常見的USB 轉 RS232 啦,但這個東西還是有點相容性的問題,
您可別以為RS232 就只是 Tx/Rx 而已...其實他還包括其他的DTR/CTS等等...
做到完整也會搞死人的...不過,原廠會提供這樣子的範例程式,也不是要您弄一棵
USB 轉 RS232 晶片出來搞市場的,還尤其用32 bits ARM。(雖然,國產的晶片
市場也算做到爛了!)....主要我想應該是希望可以提供一個在系統應用端的相容性與
整合性吧!譬如說:以前您是用一棵 8 bits MCU 做一些有RS232 的系統應用,
但是呢?您的對手軟體還是停留在RS232 ,以前的話還要外掛一棵USB 轉RS232,
這下就不用了,您就直接套用這樣子的韌體程式,又可以省一棵USB 轉RS232...
反正,一棵 32 bits ARM 外加遠比以前強大計算能力與程式容量的記憶體,
相信可以輕輕鬆鬆的應付以前韌體程式的功能...唉~32 bits ARM MCU 又多了
一個邊際效益,將一個以前都覺得還可以搞的IC 產品給搞掉了。
---
第三種就是 USB Audio Class...這一點根本就是衝著32 bits ARM 的強大計算能力,
因為:要完成USB Audio Class 無非就是要將 Audio 數位化後,再以USB 介面傳輸,
這就牽涉到audio 的解/編碼的計算能力...要不然,說真的啦...Audio 經由編碼
數位化之後,其實他的資料傳輸量是不大的...以一般語音來說:超過16kbps 的
bitstream 的語音資料都已經清晰可辨了。所以可以輕易的經由USB 介面傳輸。
最重要的就是:此一類的USB 傳輸是屬於ISO token 的傳輸介面,也算是綜合以上
諸項應用,可以將USB 幾個基本傳輸Token 給全面表現出來。多完美啊!
只是還是偷偷遞給他"偷雞"一下,其實以USB 的應用來說:還是有一項給忽略了,
就是同屬Audio Class 這一級的影像傳輸,譬如PC Camera...但這一項真的就比較
難了,影像的壓縮所需的計算能力就可不是一般跑幾十個MIPS 的ARM 可以勝任的,
當然也要留意的是:這裡的Audio 指的也是 語音而已,您說要拿來搞個MP3的
解編碼...還是有點強人所難啦!
----------
最後一項:應該指的就是一般人比較討厭的東西,就是一般還要外掛屬於自己
USB 驅動程式的 USB 基本應用,但其實,他的範例程式是最簡單,也是最基本型,
當然使用上也是最有彈性...只是我想可能很多人都不太會想去碰他吧!
我在以前很基礎的USB 簡介中也有提過,您要能真正發揮USB 傳輸效能就得要靠
這一種傳輸方式,我想:如果真要測試與驗證8 bits 與 32 bits USB MCU 效能差異
的化...這一種USB 傳輸方式最能表現效果的,更何況現在許多 32 bits ARM MCU
都有提供一定程度的DMA 介面功能,這一點對於USB 傳輸來說:尤其加分的!
就看每個人的看法吧!
---
以下就是 NXP 的LPC11U14 的附的USB 範例程式:
USBDriver
    These files are shared by all the USB class drivers.
    -- usb.h   USB header
    -- usbhw.h   USB hardware header
    -- usbhw.c   USB hardware APIs
    -- usbcore.h  USB Core header
    -- usbcore.c  USB Core APIs
USBHID
    -- hid.h   USB HID related header
    -- hiduser.h  USB HID user specific header
    -- hiduser.c  USB HID user APIs
    -- usbcfg.h   USB configuration header
    -- usbdesc.h  USB descriptor header
    -- usbdesc.c  USB descriptor APIs
    -- usbuser.h  USB user header
    -- useuser.c  USB user APIs
    -- io_event.h  USB Remote Wakeup test header
    -- io_event.c  USB Remote wakeup test APIs
    -- demo.c   USB HID test module main entry
    -- demo.h                   header file for main entry
    -- usbhid.uvproj  uVision 4.x project file

USBMEM
    -- msc.h   USB MSC related header
    -- mscuser.h  USB MSC user specific header
    -- mscuser.c  USB MSC user APIs
    -- usbcfg.h   USB configuration header
    -- usbdesc.h  USB descriptor header
    -- usbdesc.c  USB descriptor APIs
    -- usbuser.h  USB user header
    -- useuser.c  USB user APIs
    -- diskimg.c                USB Virtual file page
    -- memory.c   USB MSC test module main entry
    -- memory.h                 header file for main entry
    -- usbmem.uvproj  uVision 4.x project file
USBAudio
    -- usbaudio.h  USB Audio related header
    -- adcuser.h  USB Audio user specific header
    -- adcuser.c  USB Audio user APIs
    -- usbcfg.h   USB configuration header
    -- usbdesc.h  USB descriptor header
    -- usbdesc.c  USB descriptor APIs
    -- usbuser.h  USB user header
    -- useuser.c  USB user APIs
    -- usbdmain.c  USB MSC test module main entry
    -- usbdmain.h  header file for main entry
    -- usbaudio.uvproj  uVision 4.x project file
USBCDC  
    -- cdc.h   USB CDC related header
    -- cdcuser.h  USB CDC Device Class user specific header
    -- cdcuser.c  USB CDC Device Class user APIs
    -- usbcfg.h   USB configuration header
    -- usbdesc.h  USB descriptor header
    -- usbdesc.c  USB descriptor APIs
    -- usbuser.h  USB user header
    -- usbuser.c  USB user APIs
    -- vcomdemo.h  header for VCOM demo
    -- vcomdemo.c  USB CDC(Virtual COM) test module, main entry
    -- virtualCom.uvproj uVision 4.x project file
    -- serial.h   Header for UART port
    -- serial.c   UART module APIs
    -- lpc11xx-vcom.inf  The host side driver installation file



4 則留言:

  1. 但是如果您是USB HID 的話,因為他基本上有所謂的 Interrupt Pipe 宣告,所以它是可以隨時通知主機的。
    ==>這個我不懂?我一直以為是輪詢時到~然後MCU 也剛好將資料填入 FIFO中~才會被讀取走的~ 而不是MCU主動"發"訊息給主機來取資料.

    "隨時通知主機"==> 我想到的是類似遠端喚醒(裝置喚醒主機,  是裝置會將D- & D+ 做了某動作~ 而主機才會醒過來)~ 而HID的方式也是這樣嗎?

    回覆刪除
    回覆
    1. ... 我不是有提到說:如果您有寫一支常駐程式的話,那肯定是可以
      輪詢到這一個Interrupt pipe 的資料的啦。
      所以我之前也有提過:用Interrupt Pipe 抓資料會不會掉資料?!
      我個人認為:如果是大量資料的話,那肯定會的,那不是OS 掉資料,
      而是您的應用程式掉資料。
      ----
      規格是死的,應用是活的...如何巧妙應用就端看每個人對於規格與
      技術的解讀而已吧!
      PS :  您講的D-& D+ 做特殊動作,那是硬體規格,我前面講的東西
      都是純粹指軟體的功能與呈現的效果。所以啦...學USB ,有機會還是學著
      寫一點簡單的上層應用程式吧,您就會有更進一步的體會與領悟吧!

      刪除
    2. interrupt pipe 不會掉資料阿 在OS 端有queue , application 去 access像 ReadFile / WriteFile 只是對 OS 的queue做access, queue可以根據OS設定大小 , 所以不會掉資料的

      刪除
    3. 我想在系統應用上會用Interrupt pipe ,我想大概都不是為了傳輸大量資料用。

      如果為了大量資料且保證不掉資料。USB 裡還有其他 Pipe line 可以供宣告使用。

      我上面也說了~如果您PC 端所寫App 功力很好,可以做到不掉資料,而且在如此應用中

      這些不掉的資料對你APP 都很重要的話...我也只能跟你拍拍手。

      但老闆會不會因此給你加薪?我不知道!

      對我來說:這麼簡單的應用與上手介面~已經綽綽有餘了。反正Interrupt pipe 的最小單位是

      mSec....對許多所謂 uSec 級世界來說:這樣的介面還是"掉資料"的啦!....

      刪除