我學習USB設計的歷程

kimishen發表於2008-09-02
我學習USB設計的歷程

-獻給即將學習USB和對此感興趣的朋友



作者:duoduo


最初想學習USB的原因在於當時非常非常想有一臺通用程式設計器,商用的程式設計器雖然功能好,但是價格昂貴,僅僅為了程式設計幾種晶片就去買一個似乎很可惜(我現在已經買了程式設計器了:))。於是想自己做一個很簡單的,用串列埠?並口?一想到要加個又大又笨的外接電源就不喜歡,用USB,不錯,有匯流排供電,這點很吸引人,就是當時我對USB一竅不通,那就找資料看看吧。


當時USB技術剛剛興起,USB器件在電子市場上還是很少見,在網上逛了很多天,最後決定用Philips公司的PDIUSBD12作為USB控制器,主要原因是Philips提供的技術文件比較詳細。看了Philips公司的相關資料,似乎硬體電路並不難,於是自己畫了原理圖,檢查了N遍,應該沒問題了,然後制PCB,初步硬體除錯,一切都很順利。接下來就是考慮軟體怎麼寫。一提到軟體,這下頭大了。看了幾天PDIUSBD12的資料手冊,天啊,這麼多稀奇古怪的暫存器都是些什麼呀,見鬼。看來不瞭解USB的協議根本就無法去對PDIUSBD12進行程式設計。於是只好去翻USB1.1規範,那可是200多頁的英文哪,又不是74系列的手冊那樣幾個引數一看就OK了,好在我的專業英語還不算太差,硬著頭皮看吧。當時看了近一個月,簡直象進了迷宮一樣,根本搞不清東西南北。當時書店關於USB的書只有一本國防科大的USB匯流排介面開發指南,買回來回來仔細一看,天,簡直是英文USB1.1規範的中文簡化版,有些英文的術語一翻譯過來怎麼著看都不舒服,而且省略了很多部分,一樣看的不得其門而入,於是扔掉了書(冤枉國防科大的這本書了,後來講USB的書滿天飛,我都翻過,不敢說它們都是垃圾,但是我認為國大的書的編者言語之間對USB確實還是瞭解很深的,其他大多數書的編者/譯者,有的竟然能把pullup resistor of collector翻譯成“向上電阻收集器”,嘿嘿,我就不多說了),繼續研究E文。當時另外一個朋友在我的極力鼓吹下也跟我一起沒日沒夜熱情高漲地研究了很多天,可惜後來沒有修成正果:)。當時身邊雖然博士教授們一大堆,可是沒有人研究過USB,只好裝上獵狗的鼻子,去網上四處搜尋,倒是有一些線索,可是沒有很有用的。


這時一個網友給了我一份傳說是Philips的C51韌體程式碼,我大喜過望,興沖沖編譯一下,天,無數的Error。硬著頭皮去改,發現原始檔殘缺不全,註釋也非常的少,一點點地自己摸索著把程式碼補上來,這期間我把程式碼和USB規範結合著看,模模糊糊有些明白了,就這樣磕磕絆絆地又搞了一個月,熬了無數通宵,程式終於編譯通過了。當我顫抖著手把我的板插上USB電纜的時候,奇蹟竟然出現了,硬碟一陣狂響之後,Windows赫然蹦出一個發現新硬體的對話筐。My God!我成功了也!!歡喜還沒過去,裝上Philips的驅動程式,想看看我的板上的開關呀、燈呀的動一動,這才發現我的硬體和Philips的不完全一樣,所以和Philips的應用程式不能完全相容,雖然驅動裝上了,板子上的燈啊、開關呀卻無法控制。看來得改改程式了。


這一改程式才知道自己現在對USB協議不過僅僅是略懂了一些皮毛,當按照自己的理解去做了修改以後,PC根本就不能正確識別出我的裝置。然後我明白,沒有真正理解USB協議,就不會真正地寫出自己的程式,更談不上開發USB介面產品。好在這一段時間的摸索得到了一些經驗,對USB也有了一些基本正確的認識,精神上受到了一些鼓舞,於是我繼續研究USB E文規範。一個月過去了,又一個月過去了,我感覺雖然理解了很多了,但是有些關鍵的地方仍然沒有真正透徹理解,似乎只差薄薄的一層半透明的紙了,只要稍稍有人點撥一下就能頓悟了,可惜仙人沒有出現,因此我的程式始終存在問題,此時我真的有些絕望了,USB開發暫時擱置。


不久我到一家公司從事USB方面的工作,接觸到了一種SOC的USB程式設計。生存的壓力使我不得不努力去克服對USB通訊的心理恐懼,仔細研讀USB協議,此時USB的相關資料也漸漸豐富了,並且現在手邊有了邏輯分析儀、高檔示波器等裝置,我甚至用邏輯分析儀仔細捕捉過USB通訊的協議實現的物理過程,也用Verilog HDL寫過USB host的行為模擬模型提供給FPGA系統模擬。兩個月以後,我終於對USB的理解有了質的飛躍,對USB傳輸資料流過程已經很熟悉,對那片SOC,我可以僅用不到600位元組的程式碼使PC發現新硬體。


後來我撿起從前的那塊PDIUSBD12 USB板,按照自己對USB的理解完全重新做了程式設計,這次非常順利,完成PC主機對USB裝置的列舉過程已經是輕鬆的事情了。但是要完全完成一個USB裝置的設計,這只是走過了第一個階段,下一個艱苦的過程則是驅動程式的設計,沒有驅動程式,用PC軟體控制USB裝置根本就是天方夜談。最初我用Windriver做了硬體診斷,一切都OK之後,可以選擇用Windriver生成一個驅動程式和測試臺應用程式,但是Windriver的驅動程式安裝方法讓我覺得很彆扭,我認為一個可以商用級的USB裝置不應該採用這種方法。另外,Windriver502版本似乎和Xilinx的ISE6.1軟體衝突,ISE安裝過程經常藍屏,而且這個版本的Windriver在Win2K SP3以上系統中安裝必定會導致系統黑屏。另外有一個近於專業級的驅動程式開發工具DriverStudio,我看過一段時間,感覺它外表和Windows DDK完全不同,但是實際上它並沒有把DDK做過於嚴實的封裝,處處可以看到DDK的影子,掌握DriverStudio其實也同樣需要對DDK有較多的理解。我選擇了Windows DDK作為驅動設計工具,雖然我還沒有計劃做一個專業級的驅動程式設計者,但是在這方面多做一些深入的理解決沒有壞處。DDK有很多驅動程式的例子,其中有一個bulkusb的例子,仔細看過之後,其實把它修改一下就可以變成自己裝置的驅動,這也正是Microsoft推薦驅動設計者開發裝置驅動程式的方法。DDK確實過於博大精深,我想,能夠達到自己的裝置驅動可以正常工作這個目的就可以了,沒有必要搞清楚驅動程式設計中的每一個細節。當時我也曾經花了很大的力氣才終於達到這個目的,其中的艱難到讀者自己去經歷的時候就能夠體會了(你可能會把Microsoft號稱非常穩定的Win2K整的死去活來:))。好,現在是最後一個階段了:設計應用程式。這個應該是整個設計中最輕鬆的階段了,通過驅動程式控制硬體裝置,VC++是很好的工具,當然這個並不是每個人都必然的選擇。當寫完最後一句程式碼,執行程式,看到裝置在滑鼠鍵盤點動之間隨心所欲受你的控制的時候,那種令人飄然的成就感真的是難以形容。


現在,帶USB介面的器件很多了,而且有很多已經是USB2.0 High speed裝置了。我有幸見識了許多USB器件的應用,感覺不論是USB full speed還是High speed,也不管這個器件到底只是一個USB控制器還是複雜的SOC,USB通訊部分其實大家都是大同小異的。現在USB OTG技術經過幾年有些沉默的發展之後終於柳暗花明,開發USB OTG裝置應該是USB通訊技術下一階段的熱點。其間還曾出現了一類USB Host器件,算是彌補USB1.1和USB OTG之間暫時的空白吧。


也許我悟性太差,學習USB的歷程真的是非常艱難,還有許多朋友也許會有和我一樣的痛苦,我把自己的USB學習經歷寫出來,希望能夠給後來者一些有益的啟示,同時也希望能夠給大家一些鼓舞:再大的困難,只要肯努力,也是能夠克服的;USB通訊完全不同RS232,要能夠硬著頭皮看E文,要有懂USB的朋友指點,要有很好的參考程式碼,要自己肯動腦筋去思考,要有強烈的興趣和恆心,這樣的話,即使時間稍長一點,最終你也是能掌握USB的。


我不希望我的經歷讓想學習USB的朋友感到恐怖,在你學習USB之前,先要給自己定一個將要達到的標準:如果你希望自己能夠完全掌握USB通訊技術,達到能夠設計USB physical和SIE部分的水平,那麼這就是USB硬體設計的至高境界了,不過只有IC設計公司集中若干人力花費若干年時間投入若干經費才能夠做得了的。如果你想掌握硬韌體程式設計、驅動程式設計,那麼你需要準備吃點苦;如果你不需要關心USB通訊的具體過程,只是韌體應用中和底層簡單的進行資料交換,或者是PC應用程式設計,呵呵,恭喜了,你會發現USB通訊其實很簡單。

相關文章