2019年10月25日 星期五

Hinet 網頁系列 --- USB DIY 系列(七)---USB DIY 講座 (五) Enumeration

(補充說明:玩USB 系統的東西,你很難說:我只要顧著韌體或軟體就可以了,

甚至有時候,你還得看得懂硬體,也是要做一點硬體Debug 的東西。但你說有必要這麼累嗎?

對啊~就是那麼一份薪水嘛!何必呢?是啊~ 就像很多年輕人也會說:結婚嘛!

何必一定要生小孩?現在房價或生活這麼苦,幹嘛這麼辛苦呢?其實,這並不是辛不辛苦的

問題,而是成就人生的一個過程,可以真正的用心去體會人生。國慶連假回南部一趟,有個

長輩講了一段話給我聽,聽起來也蠻有道理的:話說現在很多和尚或是所謂的"師父"、"上人"。

吃的是信徒的供養,住的是捐建的廟寺...你頂多就是幫信徒念念經,你怎麼做也都還不了

這些信徒的"恩惠",你又怎麼修道及得道呢?


好像又有點道理,既然要修道,當然就是要忍受各種心靈與肉身的折磨,這才能悟到一些

別人所不能體會的人生道理,俗話說:不經一番寒徹,哪得梅花撲鼻香?

同樣的道理,當你在學習系統的東西時,你怎能老是要靠著別人的"供養",又想修得一身

系統的好功力呢?我很幸運的是:當我入行要搞系統時,剛好碰上了USB這個東西,

雖然有點辛苦,但這也成就了我在系統應用端很好的根基,雖然不一定是賺了大錢,

但我還是有從搞系統工程的人生觀裡,圓滿了我在工程上的人生。)
>>>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Enumeration 這個字要怎麼翻譯會比較得體呢? 答案是:照原文唸。

說真的,有些英文照原來字面上來念還比較懂,但是您硬要拗成中文就很難傳達原來的

神韻了。您不要覺得凡是所有的字都要翻成中文(我不是在說彼岸那邊),除非所有的

規格是我們訂的。否則,說真的,我們頭腦裡面的思維模式不是用英文式的,

所以,根本無法很傳神的表達他原來的意思,這些專有名詞有時還是滿好用的,

比如您跟老外討論工程時,句子講得不怎麼樣,但這一兩個專有名詞就可以很清楚

告訴他您想說什麼了?就像您聽一個老外說中文時,雖然他說的『二二六六』的時,

但有時您還是知道他要說的是什麼一件事的道理是一樣的。怎麼上起英文課了?!
        
USB DIY 第一個步驟就是USB Plug and Play,第一個動作就是Enumeration 。

但很多人都被他搞得痛苦。因為規格寫的是死的,所以,這部分也完全照規格。

沒有多大應用上的變化,自然很多人反而搞不懂。就是照著規格第九章作就對了,

這也是最有名的『Chapter 9』,一般USB Controller IC 大部分都已經幫您做完大部分的

工作了,所以,說真的您也不需要花太多心思。您只要稍微瞭解一下他的動作步驟就

可以了,怎麼瞭解?不要在K規格了,再K就要K人了。直接看圖說故事:
------------------------------------------------------------------------------------------------------------------

(麻煩自己點一下圖放大看)

我就把幾個重點講一下就好了,您也不要問我為什麼?因為這順序步驟規格書裡沒說,

是Microsoft 他愛怎麼玩就怎麼玩,反正您把Chapter 9 所有的命令都準備好就是了。

(若不清楚的,還可以參考一下我另一篇USB 文章 : MP3 系統應用--USB篇)

>>>   Get Device Descriptor  : 反正一開始,也不知道字串長度,就來個0x40,後來才知道0x12
 (搞不懂微軟?規格不是明明說好是18 長度?您還用64 問?我還沒看過不是18 的,有看到的麻煩傳一份
給我參考!)

>>> Set Address : 一開始先給零再Assign 2,從此就是 2 了。這個位置有沒有意義?
不知道,以前作IC時,是拿來DEBUG用的,後來,就再也沒用到了。(您的IC若連這個2 都看不懂,就完了
-- 串列上別人的Token 搶過來亂傳。)

>>>  定義有多少Endpoint ?方向為何?
(您的功力可不可以不用翻規格就可以從螢幕內容他是什麼?哈~。)

>>> 定義USB裝置的描述字串。(注意:他是 Unicode,對不起,除了英文識別碼外,我還沒看過別的!)

>>> 省略的原因是:煩死了,來來回回好幾遍,也不知道Microsoft 是什麼意思?
存心要玩死別人似的。

>>>   最後一個:Set Configuration (是告訴您,可以了,Enumeration 完成。別太高興,
這中間過程中,軟體的驅動程式是要掛起來的!否則,您就沒得玩。然後,當然您也可以騙微軟,
隨便掛一個,但您的應用程式找不到驅動程式,也不關微軟的事。)

話說這個Enumeration 過程是蠻平凡的,實在不值一提,不講,人家還以為我只是呼攏您

而已。不過,對我們USB DIY 一族來說:當您用自己的String desciptor 外加自己改寫的

驅動程式裡的 inf 檔掛起來,看到微軟的『裝置管理員』把您的字串SHOW出來時,

那種成就感是別人無法比擬的。這是比作那些RS232 或Parallel 好玩的地方。

(另外,我是不知道一般USB DIY一族中 您們的VID是用誰的? CYPRESS ? 這個可不能

隨便自己取的,這是登記有案的,當您去參加所謂『插拔大會』(不知道這年頭誰還有

興趣去做?),可是要有自己的VID 的。
-----------------------------------------------------------------------------------------------------------
        若講完上面那一部份就結束,那我也不會特定寫這麼一篇囉。當然,雖然在USB Device 端

的韌體或軟體針對這部分是沒什麼好講的,但您知道嗎?在硬體上他確有一個很好玩的

應用。USB 裝置他厲害的地方(相對RS232 或 Parallel 來說),他是可以供電給我們

USB Device 的。在Enumeration 您會回是Bus Power 或Self-Power 。但有些應用是我們可能

要先從USB BUS上先取得電源,為我們的系統作Initialize 的動作,卻不太想理有關USB 

的 Protocol 的東西(因為會有太多中斷影響我們程式),例子喔?!很簡單:

MP3 產品就是囉。因為MP3 系統裡有個類似DOS 的File System,他的 Initialize 是比較長

的時間(當然有時您也會感覺不出來,但對USB來說算是慢了),那我們該怎麼作?

答案也是看圖:


 這張圖說明了整個步驟,USB 的電源先進來,系統 Initialize 過程中檢查一下那根 Input pin,

有被拉成LOW,就代表您的電源是由USB供的。當您所有的事情全作完了,

想跟您HOST PC上應用程式溝通時,再把那根 Output 拉High

(注意我圖上那的R30 標的是N.C. 喔) ,PC 就會對您作Enumeration 了,講完了,

江湖一點訣,講破沒意思~我說了會怎樣?我跟您說:您USB Controller IC 您還是

不敢隨便用的耶。因為USB 的東西有太多您看不到的盲點,我講了這些也只不過

冰山一角了。

(注意:這根Output pin 您最好是找一根default 是tri-state 的 ,否則在USB BUS 上您還是

會看到一個:


雖然可能馬上變成RESET 狀態,但終究這樣的現象是不合理的。USB 的速度真的很快的

(就算是 1.1 也是的),只要您稍微讓D+  稍微High 一下,南橋IC立刻發訊號並通知OS 。

我想這是您在所有的地方都不會跟您說的。就算您用錯了,您可能也不知道。因為您也

沒發現,但哪天出問題了~您就頭大了。所以,為何USB Controller IC 大家喜歡用Cypress ,

因為,錯誤他都幫您扛了。當然,用我的方案也不會有這個問題。我一開始就會留意的

        所以,人家前輩(CYPRESS)開宗明義就跟您說:USB is not simple  !! 他講的還

只不過是韌體或軟體而已。還沒跟您硬體呢!!

您知道您 USB Device Suspend Current 有沒有超過 500 uA ?! 對不對?!

您的USB Device  Suspend 之後,會不會一覺不醒?回不來(resume)?

這些都是跟硬體有關的耶。好好加油。


沒有留言:

張貼留言