2008年11月25日 星期二

USB DIY-- 自學計畫(一)


想跟版主重新學新的USB Controller 的人有福了,因為版主最近會嘗試使用另一家

USB Controller 了,所以,就藉由這個機會跟大家分享一下這個USB DIY 的自學計畫。

而版主預計整個自學計畫預估約為期一個月。我也不敢誇口說那種"30 天學會 USB "!

這種賣書廣告啊...就等我有機會出書時,再寫啦。

但是我希望這是一個目標...而既然是目標,當然就要努力去達成,

而達成的目標的過程是需要方法與一定的程序的,在正確的方法與程序指導之下,

方可順利達到目標!接下來所要記錄的,便是這一過程。

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

首先當然要稍微K一下原廠所提供的Datasheet ...不過,這一部份只要稍微瀏覽過一遍即可。

因為真正的使用還是得從實作中去體會比較快啦。(K 原廠的Datasheet 花個一天就可以了...

不要太浪費時間,不如等做過一遍再看,印象會比較深刻!)

一開始還是藉由原廠所提供的Demo 程式與環境去走一遍韌體與軟體。

這樣子就比較容易進入狀況。也避免走一些冤枉路。

軟體部分,前兩天有稍微提到原廠所提供的原始碼,這一部份是由C 語言的MFC 所寫的。

所以,應該還可以隨時接手,就暫時先擱一邊。

我們就從USB Controller 的韌體開始看吧。---

老話一句:工欲善其事,必先利其器。....我們先把輔助工具搞好再來看韌體會比較快。

------

我們都知道,不管您是哪一家的USB Controller ,他的USB Housekeeper 程式一定

Interrupt drive的韌體架構。只是每一家對於USB Token 所發的中斷會有所不同。

這是我們一開始要搞清楚的,否則啦...您會根本沒機會敢去改這一部份啊。

而接下來呢...您就根本就沒信心的進行下一階段的USB 學習了,自然您USB 就學不起來。

首先呢,您們或許都不知道:CATC 的USB 分析儀有一塊外接的Breakout Board:

我們看一下原始的使用手冊:

    到底這塊外接Breakout Board有何作用呢?!又該如何用呢?!...

很多人都不清楚,在此我就稍微說明一下,但是呢?!很不幸的。我也沒有這一塊版子。

以前問過原廠,他們也不鳥我,電路圖也找不到。...只好自己打開機器找一下電路,

我就自己DIY 作了一塊Breakout Board,看來還可以,不錯用的。

我們從原廠的使用手冊看到:他有提供四組User Signal Data input#0~3 !

這可以讓我們系統的控制訊號與他的分析軟體同步。---這是比示波器好用的地方。

他的接法很簡單:DB37 接頭 ...我只要拉上述的四條線就好了...其他的,

我是覺得要拉的機會也不大,因為我們不是要搞USB IC設計的。

而他們主要的四條分別如下圖所示:(看來我DIY的功夫還不錯哩!)連那條連接線也是自己作的!

好了...接下來我們來看一下:這塊版子神奇的地方。...

----

我們一開始要用哪一支原廠的範例程式呢?!...用HID?!用一般的自有的USB Driver ?!

以我個人的意見呢?!...應該是後者!---一般的自有的USB Driver。

走一般的 USB Control/Bulk Token 就好了!(雖然很多人會很怕啊!)

因為您必需先搞清楚整個韌體---驅動程式到PC應用程式。---否則,當您用HID class ,

劈哩八啦,架起來玩了一次,好像都可以用了 ...然後呢?! 整個USB 還是搞不太清楚!

然後呢...心裡的那個惰性會讓您不想再回頭看很基礎的 Control/Bulk 控制方式!

結果呢....您的USB 又是半桶水的拿不上台面上來作其他相關應用。

這是純個人意見,如果您覺得不妥,您還是可依照自己的方法學與搞USB!

原因是因為:Bulk Token 基本上是跟Control Token 很像的...

所以,對於PC 的 AP 端來說:是比較單純的...其實,韌體也是一樣的!

但是呢:HID 反而還要多一組Interrupt Token ,而且他是走HID  Class,

您還得去K 一下HID Class規格 ,搞得懂所有Report 的定義與用法,

一開始學USB 不用搞這麼複雜吧....一開始越單純,學得越快啊!

我提到的一個月...最終也會包括HID的....我自己認為那只是另一個很簡單的轉換而已!)

-----

好吧,我們來看這塊Breakout Board 好用之處:

首先我們先在韌體的USB 中斷程式的進入點加了一段I/O Toggle程式,

讓每一次USB 產生中斷時,就Toggle 一下I/O ,我們再把這跟I/O 接到

Breakout Board的 User Signal Data input 上:

我們就可以在其USB 分析軟體上同步看到這跟訊號的變化:

(粗的代表為 High ...細的代表為Low...藍色為USR_D0...綠色為USR_D1...依此類推!)

上圖是USB 插拔過程中:Enumeration 過程韌體所回的 Device  Description 。

這一部份鐵定是由韌體所回的....我們可以觀察到:他的每一個Ack Token 處,

都會產生一組USB 中斷...這樣子,您就知道您的USB 韌體的控制流程了!

因為:原廠所附的範例程式,在USB Reset 時,也是Enable USB Interrupt 的,...

所以,我們也看到最後一個 Reset 產生的USB 中斷。

最後呢...我們也看到:雖然Get Device Description (Device Configuration)及

Set Configuration 都會連帶有一組Zero Length 的Out/In Token ,

但是呢,我們的USB Controller 都還是會再進一次USB 中斷程式的。

這樣子,是不是讓您比對參考解讀USB 韌體時,很方便嗎?! ...

-----

當然啊,這樣的流程,您只要走過一遍,您大概就很清楚,以後也不用每次都要如此的啦。

(待續)

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

1. 改寫原廠的USB應用程式


2. 改寫原廠的USB應用程式(續一

3.改寫原廠的USB應用程式(續二)

5.USB DIY-- 自學計畫(二)

6.USB DIY-- 自學計畫(三)

7.USB DIY-- 自學計畫(四)

8.USB DIY-- 自學計畫(五)

16 則留言:

  1. 沒有Cat-C 要學USB還真是要天馬行空阿.
    不知你要學那一家公司的??S的F32x嗎?
    我也是有興趣阿.

    回覆刪除
  2. 學usb 小弟有榮幸可以參一腳嗎?

    回覆刪除
  3. CATC真的很重要,我看過靠USB FW吃飯的RD幾乎都有一台...不過這種東西也不是一般人消費得起

    回覆刪除
  4. 跟CATC代理商聊過, 用到外接port的人斷數都很高.
    我只用過特殊USB信號 trigger out 到 LA 上抓波形 & timing 來bebug.

    回覆刪除
  5. 賈老師的真老公2008年11月26日 下午2:01

    您們不能老是怪自己沒有 CATC 啊...而作USB 的人也不能或不是一天到晚都靠CATC 啊。
    我之所以用CATC 只要要讓大家比較容易瞭解我所說的。
    如果,您在規劃USB 架構時,都得靠CATC的話,那只能說您的功力還不夠。
    講難聽一點:如果要老是要靠USB的 CATC 分析儀來看東西的話,
    第一個該被檢討的應該是: Microsoft 公司裡負責寫底層Driver 的人。
    因為其實,USB 通訊協定的東西是很固定的...他也不是一天到晚變來變去的。
    而是我們在規劃USB 系統架構時,一定要對USB 基本觀念有全盤的瞭解與體會。
    否則,您也不清楚自己USB 系統的真正應用價值啊。

    回覆刪除
  6. Chamber大大:

    我想大家一致的想法是,有台CATC學習起來事半功倍,就像對I2C、SPI debug時不要說有LA,起碼也要有台scope debug吧?總不能用猜的吧!...

    要不然有沒有不用CATC就能學會USB的方法? ... =D>

    回覆刪除
    回覆
    1. 有啊...就直接看原廠所附的參考原始碼。
      大家不就是如此的嗎?!只是看大家是要學皮毛?!還是學得紮實一點?!
      ---不代表學皮毛就不能做USB產品開發。
      就看每個人的基本想法啊。

      刪除
  7. 您好:
    是否能跟您請教一下,是關於硬體的問題。
    假設我有兩顆MCU,有顆有USB介面、但另一顆沒有。如果我要把它layout成共用,我是否能把D+與D-用跳JUMP的方式處理,會不會對於USB傳輸上有何影響?
    不知在這問是否適當。謝謝!
    frederick

    回覆刪除
    回覆
    1. 不是很懂您的意思?!...一般所謂有USB 介面的MCU..
      不是他的MCU IC的腳上有專用的兩根D+ 與D- 腳嗎?!
      沒有USB 介面的那一棵MCU哪來的D+ 與D- 的腳啊?! :(  ?!
      您要怎麼跳JUMP啊?!????????????????????????
      ---您不就用那顆有USB MCU做完USB傳輸之後,
      再用MCU本身的基本介面:如UART 、SPI或是I2C
       跟另一棵MCU 溝通不就好了嗎?!
      ---您是不是把原本簡單的問題想得太複雜了?!????

      刪除
  8. 我都是使用bus-hound來debug, 這是一套軟體的分析匯流排軟體,可以看到 pc與 usb之間的通訊資料,不過當然沒有分析儀那樣完整,但是大部分都看的到,小細節就很難囉,而且這軟體還可以自己傳送usb通訊協定喔。還滿不錯用的。 USBLAB miller 上

    回覆刪除
    回覆
    1. 我想最主要的差異是看不到...USB transaction上的頻寬情況。
      至於,只是看傳輸的資料內容來說:只要您軟體或是系統Debug 功力夠的話,
      我想這個Bus-hound也不一定真的有用...當然啊...
      我懶得架USB 分析儀時,也會偷懶用這套軟體的! :)) ...

      刪除
  9. 想請教大大一個問題,我目前想作ㄧ個用USB搖桿作ㄧ個介面,轉成並列的那種Hi,Lo高低準位的訊號請問有可以推薦的書嗎??或是中間那訊號轉換的IC,PDIUSBD12這顆可以達到我所需的要求嗎???
    謝謝

    回覆刪除
  10. 前輩您好, 請問在 LeCroy USB Protocol Sute USB Protocol Analyzer V4.32, Build 1125 上, 要怎設定才能看到 Breakout Board的 User Signal Data input 呢 ? 謝謝指點!!


     

    回覆刪除
    回覆
    1. 對不起...您所說的是新版的USB 分析儀吧,我沒有玩過,不清楚。
      但從他第一版的軟體大概也不容易瞭解這個東西的設定...
      我所用的是第一版的...他設定的位置在下圖:
      (我想應該是意思類似吧...您就自己翻找一下吧!)
       

      刪除
  11. 前輩您好, 謝謝您的告知, 我再找時間試試!! Thanks!!

    回覆刪除