关闭

华虹USB-KEY for WinCE.NET驱动程序的编写

2221人阅读 评论(2) 收藏 举报
自从上世纪七十年代,智能卡在法国诞生后,由于其技术先进性以及人们对其的理解认同,使得各国政府对他非常重视和支持,广大的厂商争相加入对他的追捧和投入。目前它以惊人的速度发展,已经广泛应用于金融、公交、社保、通讯、医疗卫生等诸多领域,并始终保持着不断扩大的趋势。到如今,智能卡已经与我们的衣、食、住、行息息相关,在我们生活中所占的比重也越来越大。这一切,使得智能卡行业形成了一个巨大的市场。

 

 

WBT作为一个新兴的事务,到目前已经蓬勃发展起来,随着技术的进步以及人们对这种应用模式的认可,对其他的外设的支持也已经提出了很多的要求,作为国内NC第一大厂――福建升腾资讯有限公司(前身是实达终端设备有限公司)在这方面做了很多的研究和支持,目前升腾资讯有限公司公司的WBT已经可以支持SmartCard的本地应用和登陆到服务器上使用WBT本地的SmartCard。

 

在我国SmartCard也是蓬勃发展,很多厂商推出了自己拥有自主知识产权的SmartCard。在其之中,上海华虹推出了拥有自主知识产权的USB-KEY,我们就以usb-key为例,做一个简单的介绍。

 

下面简单介绍一下华虹usb-key的简单介绍:

SHC1401(USB-KEY)

 

 

SHC1401芯片的触点尺寸和位置、物理特性、电信号及传输协议符合ISO/IEC7816系列国际标准。 卡上集成了8位微处理器、32K字节的程序存储器(MASK ROM)、256字节内部SRAM、1K+792字节外部SRAM、32K字节的数据存储器 (EEPROM)、64位随机数电路、1024位的RSA协处理器、符合USB1.1的 USB 接口以及其它辅助电路。SHC1401芯片采用0.35um HHNEC CMOS 工艺并提供安全机制的检查功能。

处理器

—采用Turbo51内核

—指令执行速度是标准mcs8051的4到6倍

存储器

—256 字节内部SRAM, 1K +792字节外部SRAM

—32K 字节程序存储器 (32K x 8 bit ROM)

—32K 字节数据存储器 (32K x 8 bit EEPROM)

随机数发生器 (RNG)

—64位随机数发生器

—可作为移位协处理器

外围接口

—2个16位可编程定时器/计数器

—I/O 接口中断

 

RSA协处理器

—提供1024位的RSA加密协处理器

—加一次密需400-500ms

—采用杨氏算法

USB 接口

—符合USB1.1的规格

—1.5Mbps 传输速率

—支持控制传输,传输中断

—内嵌USB收发器

工作频率

—USB模式为6MHZ

详细的资料介绍请见华虹的网站http://www.shhic.com/new/pro_view.asp?id=25

 

要想要一个设备能够在WBT上使用,就需要编写设备的驱动程序,WinCE.NET是微软推出的一个比较成熟的嵌入式操作系统。我们仅以此操作系统为例,当然Linux,vxworks都是不错的选择,但是设备工作的原理弄清楚了,移植到不同的操作系统上都是比较容易的。

 

工欲善其事 必先利其器,同样我们在开始做一个设备驱动程序时,必须做好以下工具的准备,首先我们要现在PC机上安装usb-key的设备驱动程序,大家要记住,每次在做USB驱动程序的时候,要特别注意,首先要取得USB设备的接口信息和管道类型信息。

 

Win2k/XP DDK上有个很好的工具,叫做usbview.exe,当然也有源代码的,在DDK安装目录里面查找下,有兴趣也可以自己扩展做出点东西来。

 

运行usbview.exe后,选中usbkey设备。可以看到以下的信息:

Device Descriptor:

bcdUSB: 0x0110

bDeviceClass: 0x00

bDeviceSubClass: 0x00

bDeviceProtocol: 0x00

bMaxPacketSize0: 0x08 (8)

idVendor: 0x4242

idProduct: 0x4201

bcdDevice: 0x0100

iManufacturer: 0x01

iProduct: 0x02

iSerialNumber: 0x00

bNumConfigurations: 0x01

 

ConnectionStatus: DeviceConnected

Current Config Value: 0x01

Device Bus Speed: Low

Device Address: 0x01

Open Pipes: 2

 

Endpoint Descriptor:

bEndpointAddress: 0x81

Transfer Type: Interrupt

wMaxPacketSize: 0x0008 (8)

bInterval: 0x0A

 

Endpoint Descriptor:

bEndpointAddress: 0x02

Transfer Type: Interrupt

wMaxPacketSize: 0x0008 (8)

bInterval: 0x0A

 

大家可以看出,此设备使用的时USB 1.1的协议,厂商ID为0x4242,产品ID为0x4201,另外有三个Pipe,Pipe0是每个USB设备都有的,Pipe81是中断传输管道,最大数据报大小为8字节, Pipe02也是中断传输管道,最大数据报也是8个字节。有了这些信息我们驱动的架子就基本上搞定了,找个类似的USB驱动程序,将我们特定的设备信息填写进去,就OK,呵呵,现在我们的设备可以加载/卸载成功了。

 

此外需要指出的是,此USB设备虽然也是流式接口,但是其实,他的实质的东西并不是以流式接口直接提供给应用程序。设备驱动程序需要直接和SmartCard管理器打交道的,有些类似U盘驱动程序,需要和FileSystem Manager打交道。所以需要在设备初始化的时候,需要将SMARTCARD_EXTENSION结构需要的信息填写进去。在此之中,比较重要的是几个回调函数,剩下的按照设备的信息填写进去就可以了:

smartcardExtension->ReaderFunction[RDF_CARD_POWER] = CBCardPower;

smartcardExtension->ReaderFunction[RDF_TRANSMIT] = CBTransmit;

smartcardExtension->ReaderFunction[RDF_CARD_TRACKING] = CBCardTracking;

smartcardExtension->ReaderFunction[RDF_SET_PROTOCOL] = CBSetProtocol;

smartcardExtension->ReaderFunction[RDF_IOCTL_VENDOR] = VendorIoctl;

RDF_CARD_POWER函数是上电、下电、复位函数,每次设备初始化的时候都会调用;RDF_TRANSMIT要求的是数据传输的函数;RDF_CARD_TRACKING是跟踪函数;RDF_SET_PROTOCOL是设置传输协议,无非T0(字符传输),T1(块传输),或者RAW格式,华虹的仅仅支持T0传输方式;RDF_IOCTL_VENDOR就是厂商特殊命令接口。

 

其中对于华虹的usb-key来讲,最主要的,是CBCardPower和CBTransmit函数,其他的比较简单些。

 

CBCardPower中需要注意的是一定要把ATR的Buffer的内容和长度告诉SmartCard管理器。ATR(Answer to Reset)是指复位应答,是指复位后卡返回的信息,SmartCard管理器使用此返回信息作为读取其他信息的基础。

 

CBTransmit实现数据交换,基本是所有的数据读取都是通过此函数实现的,这个函数是个核心函数。它其实不真正关心具体的命令格式,它仅仅负责和具体的物理设备打交道,实现数据交换。

 

另外需要注意的是华虹usb-key其实是读写器和卡融合在一起的设备,所以不需要探测卡是否存在的线程,只要将卡的状态一直设置为SCARD_PRESENT就可以了。

 

这几个函数搞定了,基本上USB-KEY就可以使用了。真正弄明白了系统的原理后,感觉编写一个SmartCard的驱动程序真是简单,我花了一晚上,做完了,第二天调试通过后,感觉索然无味,太easy了。等我再回头看看WINXP DDK中的驱动程序例程,一个道理的,只是多了些IRP的请求处理和一些自旋锁的处理。

 

另外在做驱动的时候要注意不要尽信手册,要勤于思考,多动手,我看了华虹给我的手册,很多东西都是没有的,类似的也有啊,去看看威盛的南桥的手册,说得非常简单,很多芯片的配置信息都要靠自己摸索,才能搞定的。

 

其次一定要要善于使用工具,以下几个工具是必备的:

1.USB监控程序—BusHound, 可以抓出所有的USB数据进出的报,这样所有的细节都不会逃过你的眼睛。也可以加强你的判断分析能力,类似工具其实很多,usbsniffer以及Compuware公司的wdmsniff都是一些不错的选择。

2.IdaPro - 大名鼎鼎的反汇编工具,这个是必备的,如果有了一个PC上的驱动,你对汇编程序很熟悉,反汇编看看,无异于阅读源代码了,肯定受益匪浅了。

3.WinDriver也是个不错的选择,可以直接读写Pipe,用来验证我们的命令是否正确,当然BusHound 5.0版本也提供了类似的功能。

 

当我开始做GemPlus Usb SmartCard Reader的驱动的时候,心中感觉还是国外的设备做的比较完善,考虑的东西也比较全面,也更加稳定些。联想到很久前我为国内一款PDA做了一个数据交换的驱动程序时,感觉国内还是和国外的有很大的差距,特别在稳定性方面尤为欠缺。看看柯达的数码相机,我在做PTP传输协议的驱动程序时,感觉真是非常稳定,调试起来非常顺手,在调试PDA感觉就麻烦多了,稍微数据通讯出错,就要关掉机器,重新启动,非常麻烦。

 

一直讲我们科技落后,其实很多时候都是一些细节上的差距,还是希望能够将我们知道的东西公布出来,带动一大批有志之士,将我们的产品都做的更精更细,更加稳定,更加完善些,带动我们整体一代或者几代人的科技水平。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:272477次
    • 积分:3700
    • 等级:
    • 排名:第9209名
    • 原创:11篇
    • 转载:153篇
    • 译文:0篇
    • 评论:57条
    最新评论