📄 usb-key for wince.net驱动程序.htm
字号:
<P class=newtext>—符合USB1.1的规格</P>
<P class=newtext>—1.5Mbps 传输速率</P>
<P class=newtext>—支持控制传输,传输中断</P>
<P class=newtext>—内嵌USB收发器</P>
<P class=newtext>工作频率</P>
<P class=newtext>—USB模式为6MHZ</P>
<P
class=newtext>详细的资料介绍请见华虹的网站http://www.shhic.com/new/pro_view.asp?id=25</P>
<P class=newtext></P>
<P
class=newtext>要想要一个设备能够在WBT上使用,就需要编写设备的驱动程序,WinCE.NET是微软推出的一个比较成熟的嵌入式操作系统。我们仅以此操作系统为例,当然Linux,vxworks都是不错的选择,但是设备工作的原理弄清楚了,移植到不同的操作系统上都是比较容易的。</P>
<P class=newtext></P>
<P class=newtext>工欲善其事
必先利其器,同样我们在开始做一个设备驱动程序时,必须做好以下工具的准备,首先我们要现在PC机上安装usb-key的设备驱动程序,大家要记住,每次在做USB驱动程序的时候,要特别注意,首先要取得USB设备的接口信息和管道类型信息。</P>
<P class=newtext></P>
<P class=newtext>Win2k/XP
DDK上有个很好的工具,叫做usbview.exe,当然也有源代码的,在DDK安装目录里面查找下,有兴趣也可以自己扩展做出点东西来。</P>
<P class=newtext></P>
<P
class=newtext>运行usbview.exe后,选中usbkey设备。可以看到以下的信息:</P>
<P class=newtext>Device Descriptor:</P>
<P class=newtext>bcdUSB: 0x0110</P>
<P class=newtext>bDeviceClass: 0x00</P>
<P class=newtext>bDeviceSubClass: 0x00</P>
<P class=newtext>bDeviceProtocol: 0x00</P>
<P class=newtext>bMaxPacketSize0: 0x08 (8)</P>
<P class=newtext>idVendor: 0x4242</P>
<P class=newtext>idProduct: 0x4201</P>
<P class=newtext>bcdDevice: 0x0100</P>
<P class=newtext>iManufacturer: 0x01</P>
<P class=newtext>iProduct: 0x02</P>
<P class=newtext>iSerialNumber: 0x00</P>
<P class=newtext>bNumConfigurations: 0x01</P>
<P class=newtext></P>
<P class=newtext>ConnectionStatus:
DeviceConnected</P>
<P class=newtext>Current Config Value: 0x01</P>
<P class=newtext>Device Bus Speed: Low</P>
<P class=newtext>Device Address: 0x01</P>
<P class=newtext>Open Pipes: 2</P>
<P class=newtext></P>
<P class=newtext>Endpoint Descriptor:</P>
<P class=newtext>bEndpointAddress: 0x81</P>
<P class=newtext>Transfer Type: Interrupt</P>
<P class=newtext>wMaxPacketSize: 0x0008 (8)</P>
<P class=newtext>bInterval: 0x0A</P>
<P class=newtext></P>
<P class=newtext>Endpoint Descriptor:</P>
<P class=newtext>bEndpointAddress: 0x02</P>
<P class=newtext>Transfer Type: Interrupt</P>
<P class=newtext>wMaxPacketSize: 0x0008 (8)</P>
<P class=newtext>bInterval: 0x0A</P>
<P class=newtext></P>
<P class=newtext>大家可以看出,此设备使用的时USB
1.1的协议,厂商ID为0x4242,产品ID为0x4201,另外有三个Pipe,Pipe0是每个USB设备都有的,Pipe81是中断传输管道,最大数据报大小为8字节,
Pipe02也是中断传输管道,最大数据报也是8个字节。有了这些信息我们驱动的架子就基本上搞定了,找个类似的USB驱动程序,将我们特定的设备信息填写进去,就OK,呵呵,现在我们的设备可以加载/卸载成功了。</P>
<P class=newtext></P>
<P
class=newtext>此外需要指出的是,此USB设备虽然也是流式接口,但是其实,他的实质的东西并不是以流式接口直接提供给应用程序。设备驱动程序需要直接和SmartCard管理器打交道的,有些类似U盘驱动程序,需要和FileSystem
Manager打交道。所以需要在设备初始化的时候,需要将SMARTCARD_EXTENSION结构需要的信息填写进去。在此之中,比较重要的是几个回调函数,剩下的按照设备的信息填写进去就可以了:</P>
<P
class=newtext>smartcardExtension->ReaderFunction[RDF_CARD_POWER]
= CBCardPower;</P>
<P
class=newtext>smartcardExtension->ReaderFunction[RDF_TRANSMIT]
= CBTransmit;</P>
<P
class=newtext>smartcardExtension->ReaderFunction[RDF_CARD_TRACKING]
= CBCardTracking;</P>
<P
class=newtext>smartcardExtension->ReaderFunction[RDF_SET_PROTOCOL]
= CBSetProtocol;</P>
<P
class=newtext>smartcardExtension->ReaderFunction[RDF_IOCTL_VENDOR]
= VendorIoctl;</P>
<P
class=newtext>RDF_CARD_POWER函数是上电、下电、复位函数,每次设备初始化的时候都会调用;RDF_TRANSMIT要求的是数据传输的函数;RDF_CARD_TRACKING是跟踪函数;RDF_SET_PROTOCOL是设置传输协议,无非T0(字符传输),T1(块传输),或者RAW格式,华虹的仅仅支持T0传输方式;RDF_IOCTL_VENDOR就是厂商特殊命令接口。</P>
<P class=newtext></P>
<P
class=newtext>其中对于华虹的usb-key来讲,最主要的,是CBCardPower和CBTransmit函数,其他的比较简单些。</P>
<P class=newtext></P>
<P
class=newtext>CBCardPower中需要注意的是一定要把ATR的Buffer的内容和长度告诉SmartCard管理器。ATR(Answer
to
Reset)是指复位应答,是指复位后卡返回的信息,SmartCard管理器使用此返回信息作为读取其他信息的基础。</P>
<P class=newtext></P>
<P
class=newtext>CBTransmit实现数据交换,基本是所有的数据读取都是通过此函数实现的,这个函数是个核心函数。它其实不真正关心具体的命令格式,它仅仅负责和具体的物理设备打交道,实现数据交换。</P>
<P class=newtext></P>
<P
class=newtext>另外需要注意的是华虹usb-key其实是读写器和卡融合在一起的设备,所以不需要探测卡是否存在的线程,只要将卡的状态一直设置为SCARD_PRESENT就可以了。</P>
<P class=newtext></P>
<P
class=newtext>这几个函数搞定了,基本上USB-KEY就可以使用了。真正弄明白了系统的原理后,感觉编写一个SmartCard的驱动程序真是简单,我花了一晚上,做完了,第二天调试通过后,感觉索然无味,太easy了。等我再回头看看WINXP
DDK中的驱动程序例程,一个道理的,只是多了些IRP的请求处理和一些自旋锁的处理。</P>
<P class=newtext></P>
<P
class=newtext>另外在做驱动的时候要注意不要尽信手册,要勤于思考,多动手,我看了华虹给我的手册,很多东西都是没有的,类似的也有啊,去看看威盛的南桥的手册,说得非常简单,很多芯片的配置信息都要靠自己摸索,才能搞定的。</P>
<P class=newtext></P>
<P class=newtext>其次一定要要善于使用工具,以下几个工具是必备的:</P>
<P class=newtext>1.USB监控程序—BusHound,
可以抓出所有的USB数据进出的报,这样所有的细节都不会逃过你的眼睛。也可以加强你的判断分析能力,类似工具其实很多,usbsniffer以及Compuware公司的wdmsniff都是一些不错的选择。</P>
<P class=newtext>2.IdaPro -
大名鼎鼎的反汇编工具,这个是必备的,如果有了一个PC上的驱动,你对汇编程序很熟悉,反汇编看看,无异于阅读源代码了,肯定受益匪浅了。</P>
<P
class=newtext>3.WinDriver也是个不错的选择,可以直接读写Pipe,用来验证我们的命令是否正确,当然BusHound
5.0版本也提供了类似的功能。</P>
<P class=newtext></P>
<P class=newtext>当我开始做GemPlus Usb SmartCard
Reader的驱动的时候,心中感觉还是国外的设备做的比较完善,考虑的东西也比较全面,也更加稳定些。联想到很久前我为国内一款PDA做了一个数据交换的驱动程序时,感觉国内还是和国外的有很大的差距,特别在稳定性方面尤为欠缺。看看柯达的数码相机,我在做PTP传输协议的驱动程序时,感觉真是非常稳定,调试起来非常顺手,在调试PDA感觉就麻烦多了,稍微数据通讯出错,就要关掉机器,重新启动,非常麻烦。</P>
<P class=newtext></P>
<P
class=newtext>一直讲我们科技落后,其实很多时候都是一些细节上的差距,还是希望能够将我们知道的东西公布出来,带动一大批有志之士,将我们的产品都做的更精更细,更加稳定,更加完善些,带动我们整体一代或者几代人的科技水平。</P></TD></TR>
<TR height=1>
<TD align=right></TD></TR></TBODY></TABLE></TD>
<TD width=10> </TD></TR>
<TR>
<TD width=10> </TD>
<TD align=right width=520>
<TABLE width="100%">
<TBODY>
<TR>
<TD align=right>(网页编辑:<A
href="mailto:applic@ccw.com.cn">编程浪子</A>)</TD></TR></TBODY></TABLE></TD>
<TD width=10> </TD></TR>
<TR>
<TD width=10> </TD>
<TD width=520>
<TABLE cellSpacing=1 cellPadding=0 width=520
bgColor=#dfdfdf border=0>
<TBODY>
<TR>
<TD width=520
bgColor=#ffffff></TD></TR></TBODY></TABLE></TD>
<TD width=10> </TD></TR>
<TR>
<TD> </TD>
<TD> </TD>
<TD> </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD>
<TD vAlign=top width=180 bgColor=#e0f5f3>
<TABLE cellSpacing=0 cellPadding=0 width=180 bgColor=#cccccc
border=0>
<TBODY>
<TR bgColor=#069cfd>
<TD background="USB-KEY for WinCE.NET驱动程序.files/03_back_01.gif"
bgColor=#00cccc><IMG height=5
src="F:\download\USB-KEY for WinCE.NET驱动程序.files\empty(2).gif"
width=1></TD></TR>
<TR align=middle bgColor=#f0f0f0>
<TD align=left bgColor=#f0fffd><STRONG class="t14 white"><IMG
height=11 hspace=8
src="USB-KEY for WinCE.NET驱动程序.files/arrow_azury_r.png"
width=11 align=absMiddle vspace=8 width+><SPAN
class=azury>检索</SPAN></STRONG></TD></TR>
<TR align=middle bgColor=#ffffff>
<TD align=middle bgColor=#e0f5f3>
<FORM name=search action=/cio/gsearch_cio.asp method=post>
<TABLE cellSpacing=1 cellPadding=0 width=176 border=0>
<TBODY>
<TR>
<TD vAlign=top colSpan=5 height=8><IMG height=1
src="F:\download\USB-KEY for WinCE.NET驱动程序.files\empty(2).gif"
width=1></TD></TR>
<TR>
<TD width=10 height=24> </TD>
<TD width=170 colSpan=4 height=24><SELECT
class=input_combobox
style="BORDER-RIGHT: #b8b8b8 1px solid; BORDER-TOP: #b8b8b8 1px solid; BORDER-LEFT: #b8b8b8 1px solid; WIDTH: 75px; BORDER-BOTTOM: #b8b8b8 1px solid; HEIGHT: 16px"
name=D1> <OPTION value=601 selected>网站内搜索</OPTION>
<OPTION value=602>频道内搜索</OPTION> <OPTION
value=603>研究</OPTION> <OPTION value=604>数据</OPTION>
<OPTION value=605>--CCW数据</OPTION> <OPTION
value=606>--政府数据</OPTION> <OPTION
value=607>--其他数据</OPTION> <OPTION
value=608>--CCW报告</OPTION> <OPTION
value=609>CIO生活</OPTION></SELECT> <SELECT
class=defaultFont name=CgryID> <OPTION value=0
selected>选择行业</OPTION> <OPTION
value={F4C51098-D282-4C7C-BEAC-966984CFFD89}>政府机关</OPTION>
<OPTION
value={583FC19E-A49C-4A13-8B44-9235DC5040A3}>工商税务</OPTION>
<OPTION
value={C03971DC-9B5F-4E55-A382-354A67959AA4}>财会审计</OPTION>
<OPTION
value={61BB2497-9B4B-4837-B06A-249417A29805}>司法公安</OPTION>
<OPTION
value={74A41D48-D58E-4696-B590-112C37D6C459}>海关国防</OPTION>
<OPTION
value={28531BD5-4794-415D-9996-B8FA717BC421}>水土环保</OPTION>
<OPTION
value={02F8FD64-C75A-4571-AA6D-F851E1DDFA25}>农 业</OPTION>
<OPTION
value={BD6B45AF-C10C-40C5-880E-FBAC00F02936}>银 行</OPTION>
<OPTION
value={91534ACE-A3C3-43AB-BAC6-81C59F505B36}>证券期货</OPTION>
<OPTION
value={058B4CE9-40D3-44AB-8ECB-2CE38C8A1D72}>航运交通</OPTION>
<OPTION
value={18616947-7429-4F5C-A929-E3B08EF4AA5F}>仓储物流</OPTION>
<OPTION
value={21412070-5781-4572-9C95-5C3B875A245C}>商业贸易</OPTION>
<OPTION
value={A542AC3E-BE9F-4A96-A9E8-0FE7CADB2C7F}>保 险</OPTION>
<OPTION
value={86A5D8F7-6AAF-44CC-A841-589BEF2C711E}>电
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -