2019年9月27日 星期五

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

(補充說明:從我過去的許多工作與學習的經驗來說:有時候,大家都非常汲汲於要趕快

學會一個東西,或是想很快的完成甚麼一件事,當然有這樣子的積極進取心是很好的。

但有些事情卻未必都可以用這樣子的想法或方法。有時候,或許你可以試著靜下心來,

讓自己沉澱一下,或許你可以"靜思一得",換個角度就可以看到不同的事物與想法。

像我當年在工作上會搞USB   系統,也會寫一些韌體程式,但就是一直埋頭苦幹,寫程式、


Debug。跑客人~市場。然後不斷的一步一步像陀螺般地完成上級老闆所交付的任務。

我也拿到我應該拿到的薪酬。煩了~老闆還會問你說:你想不想換個產品線做啊?

(這還算比較好的老闆,也可能是聽完你的抱怨之後,安慰你的一句話吧!)

後來我覺得我真的該找個時間與空間的讓自己好好的沉澱思考一下。所以,

我真的就花了三~五個月的時間,讓自己不管是從生活或自己學習的方式,讓自己有個

屬於自己想做而一直沒有完成的事,可以以自己的步調一步一步地完成,

我就選了   USB   ROM   Emulator   一個產品目標的,把他從硬體、韌體及MFC   應用軟體好好地

走一遍。我做到了。老天爺也非常照顧我。我不但賺回我這幾個月的原本的薪酬,

而且也讓我更有信心地用自己眼光與角度去面對自己的人生。

所以,有時候,真的不能從每天從像個陀螺般地轉,以為只要天天有薪水領,那就一份

好的工作或是一個好人生。因為再好的人事物,也總有散席的時候,那你要自己如何面對呢?

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
USB DIY 講座 (三) --- USB 特質(續)
------------------------------------------------------------------------------------------------
     我會利用這個章節,很快的把USB 的基本幾個我認為比較實務的特質講完後,

下一個章節就直接切入實務操作面,當然,在這個章節裡,我也會稍微提到相關的

應用觀念。最早,我進入USB時,也是很惶恐,尤其我也不是真正念電子電機出身的,

但或許真的進入的比較早,大家都是從頭學起,所以,也就沒什麼感覺了。

所以從此我真的可以深深的體會到,唯有新領域新東西,才有新的研發動力。

否則,若已經進入大量生產時,就沒什麼研發了,剩下的就是生產管理。

這也就是為什麼喜歡浸淫在研發工作的原因。但是一般人的觀念都是:

看到哪一家公司成名了,在想進去,其實,那時最辛苦的,因為多多少少多了

一點生產管理,少了那麼一點研發的氣息了。
        
不多說,就開始下一個章節單元。

-----------------------------------------------------------------------------------------------
特質七:USB Data Travels in Packets

<<>>   Identified by "Packet ID"(PID)規格第八章,看了您也不懂在講什麼?因為您不是作IC設計的。

<<>>    Token packet tells what's coming有點像傳輸的表頭。

<<>>     Data packets deliver bytes協定的最終的目的就是傳資料。

<<>>     Handshake packets report success or otherwise 就協定就是有來有往。

我想一般USB的書都會給您這張圖:您應該不陌生!


請問有多少人看了這張圖有感覺或會體會的到呢?您有發現他是3X3 所構成的東西嗎?

什麼? 3x3 ?就是上圖中有三種顏色,每個顏色裡又分成三大packets 。

這就是USB protocol 最基本的精神。

說真的,您若看不懂這張圖,您大概就不太會寫USB Device 的程式了。

因為絕大部分的USB Controller IC 都是依據這個Protocol 發訊息中斷給您的8051 。

因為在許多不同的應用中,有可能您USB沒有 Isochronous/Interrupt/Bulk 傳輸介面,

但一定要有Control Token ! 所以,才有這張圖。看不太懂?!我換個方式您就懂:


這張圖SHOW是一個Vendor Command ,(就是下一個我自己定義的命令給我的 

USB Device),所以,他是Setup-Out-In ! 

什麼是Vendor Command ? 就是Setup 裡面那個0x40 (規格書裡的第九章)。

Out 的內容是我的命令參數或資料。最後一個 Null In ,把整個Protocol 給完成掉。

至於我下完命令後,USB Device 怎麼回答我呢?或是我的命令中要USB Device 傳

一些資料給我,我該怎麼辦?答案如下:


再下一個Setup-In-Out 的Control Token !就可以把資料抓進來了。

        這張圖裡還透露了許多您用USB 產品時您所不知的玄機:

第一:每一個小protocol 都是在SOF 之後,這就是我所說的:UHCI 介面的USB 南橋。

所以,就可以看出他是Intel 授權(或他本身)的南橋晶片。

那OHCI是長什麼樣子呢?就是這3x3 全擠在兩個SOF之間。

所以,您要用USB Controller 時就得小心,因為OHCI的Procotol 會很快,

您USB Controller IC 最好強壯一點。所以,是要跟您說的是USB Controller IC 不要隨便用,

要不然相容性問題會讓您作不完。

第二:您有沒有留意到我圖中,Packet # 都是連號的!哈~哈~因為我USB Controller 

中的MCU 性能好,所以沒不會有任何遲疑。別人的可能都還要回幾個NAK 讓PC 主機

等一下。

第三:就是我上述所說的第二點:每一個ACK 都可以不用急得回 HOST PC 。

既然MCU 速度不夠就讓他等,但是,Setup 後面那的ACK不能用NAK擋~

否則,您USB 裝置當場就會被PC給踢出去!(要重新插拔,甚至要重新開機)。

放心好了,您不用擔心,這個問題IC會把您解決掉這個問題的。也輪不到您擔心


第四:很明顯的,一般USB Controller IC 會在每一個ACK 時發個中斷訊息給您的

所以,我才跟您說:看不懂這張圖,就不用寫USB Device Firmware 了。

----------------------------------------------------------------------------------------------------------------
特質八:Bulk/Ctrl/Int Transfers Have Error Recovery

<<>>   Success = ACK token您MCU大部分會有中斷訊息被告知。

<<>>   Error = No response (timeout)千萬不要有這個問題發生。

<<>>   Busy = NAK token (try again later)您的MCU性能不好的話,可以多加利用。規格沒有規定NAK一定在某一個時間內得結束。您愛用NAK檔到明天也不會有事。

看了我上面那張圖就什麼也不必附加說明了。

------------------------------------------------------------------------------------------------------------
特質九:USB Projects Require a Significant Code Development Effort

<<>>   Device Side
    <<<>>>   USB housekeeping firmware。這一部份我想您要寫得好,USB功力要一定的程度。
    <<<>>>   Application firmware。就是寫一般8051 ,要我講,就是污辱您了。

<<>>   Host side
    <<<>>>   Driver (maybe)。這一部份一般都用Microsoft DDK 寫。
    <<<>>>   Application software。這一部份我都是用Visual C++ 寫,因為跟底層好連接。

我想這一部份大概就是想 USB DIY 最痛苦的地方了,我們中國人就是歹命,

有時認為跟別人很難溝通,又溝通不來,最好什麼都自己作,結果,現在的東西要學

的實在太多了,好不容易搞懂 USB 的東西後,竟然還有 PC的東西要搞清楚,

偏偏現在 PC 的作業系統儼然像隻大怪獸一樣。MFC 看起來很容易,

(因為程式小小的卻可以做出漂漂亮亮的視窗程式),但都抓不到頭緒。

唉~說真的,說到這兒,我也不知道該如何教您了。就求求老天爺給您一天 48 小時,

外加兩個頭腦。否則,我也不知道有更好的方法嗎?

-----------------------------------------------------------------------------------------------------------
特質十:Conform to a standard USB device class, and you won't need
             to write a driver

<<>>   BIG incentive您因為大家不想歹命啊。

<<>>   Spend effort making firmware class-compliant這是老外的看法,我想K英文規格還不如動手寫程式還比較快一點。

<<>>   In Win 98 您大概不會想理他了。
    <<<>>>   HID (Human Interface Device)。您拿USB只作這個?太辛苦了吧。(PS:這句話,我當年講錯了!)
    <<<>>>   Speakers。ISO 的東西,您還要我講什麼呢?

<<>>   Additional Win 2000 and Millennium device
    <<<>>>   Mass Storage (MSDC)。我也做過,就是照表操課,玩過一次就好。
    <<<>>>   Still image。有時為了配合上層的應用程式,還是很辛苦。

最後這兩項說明了在USB DIY過程中,您將面臨很大的心裡掙扎,我要不要學軟體?

說真的,標準Class 驅動程式好像很吸引人,但我跟您說:這是留給做大量產品用的。

給那些人多勢眾的公司作的,不要以為用這些驅動程式的公司裡就不必養軟體工程師,

我跟您說:養的才多呢。因為要去分析到底Microsoft 在驅動程式裡埋了那些機關?

又這些標準的驅動程式的上層應用程式也未必比較好寫。

我是覺得您既然要用USB 就是只是想拿他作一個介面,也不想搞這麼多支枝旁節的,

所以,就套一個簡單方便,又別人認證過的東西最快。這樣子,您懂嗎?!

-----------------------------------------------------------------------------------------------------------------
最後的總結:

        我講這麼多一些基本實務上的概念性的東西,倒不是在賣弄學問,規格書白紙黑字,

大家都可以人手一本好好的K他好幾遍,但是,當您碰到實際問題時,您根本對不到

問題是指向規格的哪一部份?或甚至說,規格沒提到我怎麼辦?!

規格是死的,應用是靈活的。我提的那些細節的東西都是很實際的問題。

同樣是依循同一個規格,為什麼人家作出來的東西這麼好,我的東西就比較差?!

這是因為您只是輕描淡寫的去面對您所面對的問題。
       
 當然,當您真正動手作的時候,尤其是DIY 時,您就不得不自己去面對許多技術上的

問題,不會的可以問人家,但是問不到或連要問也不知道怎麼問的時候您怎麼辦?!

相信我所相信的:若許多東西,如果沒有一點訣竅在裡面的話,很多東西也輪不到您作了。

為什麼?您台大畢業,人家也是台大畢業,您一天24 小時,別人也是一天24 小時,

您覺得您的優勢在哪?!您可能要好好的思考這個問題,因為接下來我就要開始動手作了。

沒有留言:

張貼留言