1、zz 我学习 USB 设计的历程献给即将学习 USB 和对此感兴趣的朋友 作者:duoduohttp:/最初想学习 USB 的原因在于当时非常非常想有一台通用编程器,商用的编程器虽然功能好,但是价格昂贵,仅仅为了编程几种芯片就去买一个似乎很可惜(我现在已经买了编程器了:)。于是想自己做一个很简单的,用串口?并口?一想到要加个又大又笨的外置电源就不喜欢,用 USB,不错,有总线供电,这点很吸引人,就是当时我对 USB 一窍不通,那就找资料看看吧。当时 USB 技术刚刚兴起,USB 器件在电子市场上还是很少见,在网上逛了很多天,最后决定用 Philips 公司的 PDIUSBD12 作为 USB控
2、制器,主要原因是 Philips 提供的技术文档比较详细。看了 Philips公司的相关资料,似乎硬件电路并不难,于是自己画了原理图,检查了 N 遍,应该没问题了,然后制 PCB,初步硬件调试,一切都很顺利。接下来就是考虑软件怎么写。一提到软件,这下头大了。看了几天PDIUSBD12 的数据手册,天啊,这么多稀奇古怪的寄存器都是些什么呀,见鬼。看来不了解 USB 的协议根本就无法去对 PDIUSBD12 进行程序设计。于是只好去翻 USB1.1 规范,那可是 200 多页的英文哪,又不是 74 系列的手册那样几个参数一看就 OK 了,好在我的专业英语还不算太差,硬着头皮看吧。当时看了近一个月,
3、简直象进了迷宫一样,根本搞不清东西南北。当时书店关于 USB 的书只有一本国防科大的 USB 总线接口开发指南,买回来回来仔细一看,天,简直是英文USB1.1 规范的中文简化版,有些英文的术语一翻译过来怎么着看都不舒服,而且省略了很多部分,一样看的不得其门而入,于是扔掉了书(冤枉国防科大的这本书了,后来讲 USB 的书满天飞,我都翻过,不敢说它们都是垃圾,但是我认为国大的书的编者言语之间对 USB 确实还是了解很深的,其他大多数书的编者/译者,有的竟然能把 pullup resistor of collector 翻译成“向上电阻收集器”,嘿嘿,我就不多说了),继续研究 E 文。当时另外一个朋
4、友在我的极力鼓吹下也跟我一起没日没夜热情高涨地研究了很多天,可惜后来没有修成正果:)。当时身边虽然博士教授们一大堆,可是没有人研究过 USB,只好装上猎狗的鼻子,去网上四处搜索,倒是有一些线索,可是没有很有用的。这时一个网友给了我一份传说是 Philips 的 C51 固件代码,我大喜过望,兴冲冲编译一下,天,无数的 Error。硬着头皮去改,发现源文件残缺不全,注释也非常的少,一点点地自己摸索着把代码补上来,这期间我把代码和 USB 规范结合着看,模模糊糊有些明白了,就这样磕磕绊绊地又搞了一个月,熬了无数通宵,程序终于编译通过了。当我颤抖着手把我的板插上 USB 电缆的时候,奇迹竟然出现了,
5、硬盘一阵狂响之后,Windows 赫然蹦出一个发现新硬件的对话筐。My God!我成功了也!欢喜还没过去,装上 Philips 的驱动程序,想看看我的板上的开关呀、灯呀的动一动,这才发现我的硬件和 Philips 的不完全一样,所以和 Philips 的应用程序不能完全兼容,虽然驱动装上了,板子上的灯啊、开关呀却无法控制。看来得改改程序了。这一改程序才知道自己现在对 USB 协议不过仅仅是略懂了一些皮毛,当按照自己的理解去做了修改以后,PC 根本就不能正确识别出我的设备。然后我明白,没有真正理解 USB 协议,就不会真正地写出自己的程序,更谈不上开发 USB 接口产品。好在这一段时间的摸索得到
6、了一些经验,对 USB 也有了一些基本正确的认识,精神上受到了一些鼓舞,于是我继续研究 USB E 文规范。一个月过去了,又一个月过去了,我感觉虽然理解了很多了,但是有些关键的地方仍然没有真正透彻理解,似乎只差薄薄的一层半透明的纸了,只要稍稍有人点拨一下就能顿悟了,可惜仙人没有出现,因此我的程序始终存在问题,此时我真的有些绝望了,USB 开发暂时搁置。不久我到一家公司从事 USB 方面的工作,接触到了一种 SOC 的 USB 程序设计。生存的压力使我不得不努力去克服对 USB 通讯的心理恐惧,仔细研读 USB 协议,此时 USB 的相关资料也渐渐丰富了,并且现在手边有了逻辑分析仪、高档示波器等
7、设备,我甚至用逻辑分析仪仔细捕捉过 USB 通讯的协议实现的物理过程,也用 Verilog HDL 写过 USB host 的行为仿真模型提供给 FPGA 系统模拟。两个月以后,我终于对 USB 的理解有了质的飞跃,对 USB 传输数据流过程已经很熟悉,对那片 SOC,我可以仅用不到 600 字节的代码使 PC 发现新硬件。后来我捡起从前的那块 PDIUSBD12 USB 板,按照自己对 USB 的理解完全重新做了程序设计,这次非常顺利,完成 PC 主机对 USB 设备的枚举过程已经是轻松的事情了。但是要完全完成一个 USB 设备的设计,这只是走过了第一个阶段,下一个艰苦的过程则是驱动程序的设
8、计,没有驱动程序,用 PC 软件控制 USB 设备根本就是天方夜谈。最初我用 Windriver 做了硬件诊断,一切都 OK 之后,可以选择用 Windriver 生成一个驱动程序和测试台应用程序,但是 Windriver 的驱动程序安装方法让我觉得很别扭,我认为一个可以商用级的 USB 设备不应该采用这种方法。另外,Windriver502 版本似乎和 Xilinx 的 ISE6.1 软件冲突,ISE 安装过程经常蓝屏,而且这个版本的 Windriver 在 Win2K SP3 以上系统中安装必定会导致系统黑屏。另外有一个近于专业级的驱动程序开发工具 DriverStudio,我看过一段时间
9、,感觉它外表和Windows DDK 完全不同,但是实际上它并没有把 DDK 做过于严实的封装,处处可以看到 DDK 的影子,掌握 DriverStudio 其实也同样需要对 DDK 有较多的理解。我选择了 Windows DDK 作为驱动设计工具,虽然我还没有计划做一个专业级的驱动程序设计者,但是在这方面多做一些深入的理解决没有坏处。DDK 有很多驱动程序的例子,其中有一个 bulkusb 的例子,仔细看过之后,其实把它修改一下就可以变成自己设备的驱动,这也正是 Microsoft 推荐驱动设计者开发设备驱动程序的方法。DDK 确实过于博大精深,我想,能够达到自己的设备驱动可以正常工作这个目
10、的就可以了,没有必要搞清楚驱动程序设计中的每一个细节。当时我也曾经花了很大的力气才终于达到这个目的,其中的艰难到读者自己去经历的时候就能够体会了(你可能会把 Microsoft 号称非常稳定的 Win2K 整的死去活来:))。好,现在是最后一个阶段了:设计应用程序。这个应该是整个设计中最轻松的阶段了,通过驱动程序控制硬件设备,VC+是很好的工具,当然这个并不是每个人都必然的选择。当写完最后一句代码,运行程序,看到设备在鼠标键盘点动之间随心所欲受你的控制的时候,那种令人飘然的成就感真的是难以形容。现在,带 USB 接口的器件很多了,而且有很多已经是 USB2.0 High speed 设备了。我
11、有幸见识了许多 USB 器件的应用,感觉不论是 USB full speed 还是 High speed,也不管这个器件到底只是一个 USB控制器还是复杂的 SOC,USB 通讯部分其实大家都是大同小异的。现在 USB OTG 技术经过几年有些沉默的发展之后终于柳暗花明,开发USB OTG 设备应该是 USB 通讯技术下一阶段的热点。其间还曾出现了一类 USB Host 器件,算是弥补 USB1.1 和 USB OTG 之间暂时的空白吧。也许我悟性太差,学习 USB 的历程真的是非常艰难,还有许多朋友也许会有和我一样的痛苦,我把自己的 USB 学习经历写出来,希望能够给后来者一些有益的启示,同
12、时也希望能够给大家一些鼓舞:再大的困难,只要肯努力,也是能够克服的;USB 通讯完全不同 RS232,要能够硬着头皮看 E 文,要有懂 USB 的朋友指点,要有很好的参考代码,要自己肯动脑筋去思考,要有强烈的兴趣和恒心,这样的话,即使时间稍长一点,最终你也是能掌握 USB 的。我不希望我的经历让想学习 USB 的朋友感到恐怖,在你学习 USB之前,先要给自己定一个将要达到的标准:如果你希望自己能够完全掌握 USB 通讯技术,达到能够设计 USB physical 和 SIE 部分的水平,那麽这就是 USB 硬件设计的至高境界了,不过只有 IC 设计公司集中若干人力花费若干年时间投入若干经费才能够做得了的。如果你想掌握硬固件编程、驱动程序设计,那么你需要准备吃点苦;如果你不需要关心 USB 通讯的具体过程,只是固件应用中和底层简单的进行数据交换,或者是 PC 应用程序设计,呵呵,恭喜了,你会发现 USB 通讯其实很简单。