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