我學(xué)習USB設計的歷程
當時(shí)USB技術(shù)剛剛興起,USB器件在電子市場(chǎng)上還是很少見(jiàn),在網(wǎng)上逛了很多天,最后決定用Philips公司的PDIUSBD12作為USB控制器,主要原因是Philips提供的技術(shù)文檔比較詳細??戳薖hilips公司的相關(guān)資料,似乎硬件電路并不難,于是自己畫(huà)了原理圖,檢查了N遍,應該沒(méi)問(wèn)題了,然后制PCB,初步硬件調試,一切都很順利。接下來(lái)就是考慮軟件怎么寫(xiě)。一提到軟件,這下頭大了??戳藥滋霵DIUSBD12的數據手冊,天啊,這么多稀奇古怪的寄存器都是些什么呀,見(jiàn)鬼??磥?lái)不了解USB的協(xié)議根本就無(wú)法去對PDIUSBD12進(jìn)行程序設計。于是只好去翻USB1.1規范,那可是200多頁(yè)的英文哪,又不是74系列的手冊那樣幾個(gè)參數一看就OK了,好在我的專(zhuān)業(yè)英語(yǔ)還不算太差,硬著(zhù)頭皮看吧。當時(shí)看了近一個(gè)月,簡(jiǎn)直象進(jìn)了迷宮一樣,根本搞不清東西南北。當時(shí)書(shū)店關(guān)于USB的書(shū)只有一本國防科大的USB總線(xiàn)接口開(kāi)發(fā)指南,買(mǎi)回來(lái)回來(lái)仔細一看,天,簡(jiǎn)直是英文USB1.1規范的中文簡(jiǎn)化版,有些英文的術(shù)語(yǔ)一翻譯過(guò)來(lái)怎么著(zhù)看都不舒服,而且省略了很多部分,一樣看的不得其門(mén)而入,于是扔掉了書(shū)(冤枉國防科大的這本書(shū)了,后來(lái)講USB的書(shū)滿(mǎn)天飛,我都翻過(guò),不敢說(shuō)它們都是垃圾,但是我認為國大的書(shū)的編者言語(yǔ)之間對USB確實(shí)還是了解很深的,其他大多數書(shū)的編者/譯者,有的竟然能把pullup resistor of collector翻譯成“向上電阻收集器”,嘿嘿,我就不多說(shuō)了),繼續研究E文。當時(shí)另外一個(gè)朋友在我的極力鼓吹下也跟我一起沒(méi)日沒(méi)夜熱情高漲地研究了很多天,可惜后來(lái)沒(méi)有修成正果:)。當時(shí)身邊雖然博士教授們一大堆,可是沒(méi)有人研究過(guò)USB,只好裝上獵狗的鼻子,去網(wǎng)上四處搜索,倒是有一些線(xiàn)索,可是沒(méi)有很有用的。
這時(shí)一個(gè)網(wǎng)友給了我一份傳說(shuō)是Philips的C51固件代碼,我大喜過(guò)望,興沖沖編譯一下,天,無(wú)數的Error。硬著(zhù)頭皮去改,發(fā)現源文件殘缺不全,注釋也非常的少,一點(diǎn)點(diǎn)地自己摸索著(zhù)把代碼補上來(lái),這期間我把代碼和USB規范結合著(zhù)看,模模糊糊有些明白了,就這樣磕磕絆絆地又搞了一個(gè)月,熬了無(wú)數通宵,程序終于編譯通過(guò)了。當我顫抖著(zhù)手把我的板插上USB電纜的時(shí)候,奇跡竟然出現了,硬盤(pán)一陣狂響之后,Windows赫然蹦出一個(gè)發(fā)現新硬件的對話(huà)筐。My God!我成功了也??!歡喜還沒(méi)過(guò)去,裝上Philips的驅動(dòng)程序,想看看我的板上的開(kāi)關(guān)呀、燈呀的動(dòng)一動(dòng),這才發(fā)現我的硬件和Philips的不完全一樣,所以和Philips的應用程序不能完全兼容,雖然驅動(dòng)裝上了,板子上的燈啊、開(kāi)關(guān)呀卻無(wú)法控制??磥?lái)得改改程序了。
這一改程序才知道自己現在對USB協(xié)議不過(guò)僅僅是略懂了一些皮毛,當按照自己的理解去做了修改以后,PC根本就不能正確識別出我的設備。然后我明白,沒(méi)有真正理解USB協(xié)議,就不會(huì )真正地寫(xiě)出自己的程序,更談不上開(kāi)發(fā)USB接口產(chǎn)品。好在這一段時(shí)間的摸索得到了一些經(jīng)驗,對USB也有了一些基本正確的認識,精神上受到了一些鼓舞,于是我繼續研究USB E文規范。一個(gè)月過(guò)去了,又一個(gè)月過(guò)去了,我感覺(jué)雖然理解了很多了,但是有些關(guān)鍵的地方仍然沒(méi)有真正透徹理解,似乎只差薄薄的一層半透明的紙了,只要稍稍有人點(diǎn)撥一下就能頓悟了,可惜仙人沒(méi)有出現,因此我的程序始終存在問(wèn)題,此時(shí)我真的有些絕望了,USB開(kāi)發(fā)暫時(shí)擱置。
不久我到一家公司從事USB方面的工作,接觸到了一種SOC的USB程序設計。生存的壓力使我不得不努力去克服對USB通訊的心理恐懼,仔細研讀USB協(xié)議,此時(shí)USB的相關(guān)資料也漸漸豐富了,并且現在手邊有了邏輯分析儀、高檔示波器等設備,我甚至用邏輯分析儀仔細捕捉過(guò)USB通訊的協(xié)議實(shí)現的物理過(guò)程,也用Verilog HDL寫(xiě)過(guò)USB host的行為仿真模型提供給FPGA系統模擬。兩個(gè)月以后,我終于對USB的理解有了質(zhì)的飛躍,對USB傳輸數據流過(guò)程已經(jīng)很熟悉,對那片SOC,我可以?xún)H用不到600字節的代碼使PC發(fā)現新硬件。
后來(lái)我撿起從前的那塊PDIUSBD12 USB板,按照自己對USB的理解完全重新做了程序設計,這次非常順利,完成PC主機對USB設備的枚舉過(guò)程已經(jīng)是輕松的事情了。但是要完全完成一個(gè)USB設備的設計,這只是走過(guò)了第一個(gè)階段,下一個(gè)艱苦的過(guò)程則是驅動(dòng)程序的設計,沒(méi)有驅動(dòng)程序,用PC軟件控制USB設備根本就是天方夜談。最初我用Windriver做了硬件診斷,一切都OK之后,可以選擇用Windriver生成一個(gè)驅動(dòng)程序和測試臺應用程序,但是Windriver的驅動(dòng)程序安裝方法讓我覺(jué)得很別扭,我認為一個(gè)可以商用級的USB設備不應該采用這種方法。另外,Windriver502版本似乎和Xilinx的ISE6.1軟件沖突,ISE安裝過(guò)程經(jīng)常藍屏,而且這個(gè)版本的Windriver在Win2K SP3以上系統中安裝必定會(huì )導致系統黑屏。另外有一個(gè)近于專(zhuān)業(yè)級的驅動(dòng)程序開(kāi)發(fā)工具DriverStudio,我看過(guò)一段時(shí)間,感覺(jué)它外表和Windows DDK完全不同,但是實(shí)際上它并沒(méi)有把DDK做過(guò)于嚴實(shí)的封裝,處處可以看到DDK的影子,掌握DriverStudio其實(shí)也同樣需要對DDK有較多的理解。我選擇了Windows DDK作為驅動(dòng)設計工具,雖然我還沒(méi)有計劃做一個(gè)專(zhuān)業(yè)級的驅動(dòng)程序設計者,但是在這方面多做一些深入的理解決沒(méi)有壞處。DDK有很多驅動(dòng)程序的例子,其中有一個(gè)bulkusb的例子,仔細看過(guò)之后,其實(shí)把它修改一下就可以變成自己設備的驅動(dòng),這也正是Microsoft推薦驅動(dòng)設計者開(kāi)發(fā)設備驅動(dòng)程序的方法。DDK確實(shí)過(guò)于博大精深,我想,能夠達到自己的設備驅動(dòng)可以正常工作這個(gè)目的就可以了,沒(méi)有必要搞清楚驅動(dòng)程序設計中的每一個(gè)細節。當時(shí)我也曾經(jīng)花了很大的力氣才終于達到這個(gè)目的,其中的艱難到讀者自己去經(jīng)歷的時(shí)候就能夠體會(huì )了(你可能會(huì )把Microsoft號稱(chēng)非常穩定的Win2K整的死去活來(lái):))。好,現在是最后一個(gè)階段了:設計應用程序。這個(gè)應該是整個(gè)設計中最輕松的階段了,通過(guò)驅動(dòng)程序控制硬件設備,VC++是很好的工具,當然這個(gè)并不是每個(gè)人都必然的選擇。當寫(xiě)完最后一句代碼,運行程序,看到設備在鼠標鍵盤(pán)點(diǎn)動(dòng)之間隨心所欲受你的控制的時(shí)候,那種令人飄然的成就感真的是難以形容。
現在,帶USB接口的器件很多了,而且有很多已經(jīng)是USB2.0 High speed設備了。我有幸見(jiàn)識了許多USB器件的應用,感覺(jué)不論是USB full speed還是High speed,也不管這個(gè)器件到底只是一個(gè)USB控制器還是復雜的SOC,USB通訊部分其實(shí)大家都是大同小異的?,F在USB OTG技術(shù)經(jīng)過(guò)幾年有些沉默的發(fā)展之后終于柳暗花明,開(kāi)發(fā)USB OTG設備應該是USB通訊技術(shù)下一階段的熱點(diǎn)。其間還曾出現了一類(lèi)USB Host器件,算是彌補USB1.1和USB OTG之間暫時(shí)的空白吧。
也許我悟性太差,學(xué)習USB的歷程真的是非常艱難,還有許多朋友也許會(huì )有和我一樣的痛苦,我把自己的USB學(xué)習經(jīng)歷寫(xiě)出來(lái),希望能夠給后來(lái)者一些有益的啟示,同時(shí)也希望能夠給大家一些鼓舞:再大的困難,只要肯努力,也是能夠克服的;USB通訊完全不同RS232,要能夠硬著(zhù)頭皮看E文,要有懂USB的朋友指點(diǎn),要有很好的參考代碼,要自己肯動(dòng)腦筋去思考,要有強烈的興趣和恒心,這樣的話(huà),即使時(shí)間稍長(cháng)一點(diǎn),最終你也是能掌握USB的。
我不希望我的經(jīng)歷讓想學(xué)習USB的朋友感到恐怖,在你學(xué)習USB之前,先要給自己定一個(gè)將要達到的標準:如果你希望自己能夠完全掌握USB通訊技術(shù),達到能夠設計USB physical和SIE部分的水平,那麼這就是USB硬件設計的至高境界了,不過(guò)只有IC設計公司集中若干人力花費若干年時(shí)間投入若干經(jīng)費才能夠做得了的。如果你想掌握硬固件編程、驅動(dòng)程序設計,那么你需要準備吃點(diǎn)苦;如果你不需要關(guān)心USB通訊的具體過(guò)程,只是固件應用中和底層簡(jiǎn)單的進(jìn)行數據交換,或者是PC應用程序設計,呵呵,恭喜了,你會(huì )發(fā)現USB通訊其實(shí)很簡(jiǎn)單。
評論