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

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

 

 

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感觉就麻烦多了,稍微数据通讯出错,就要关掉机器,重新启动,非常麻烦。

 

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

USB驱动程序之USB设备驱动程序1简单编写

1、驱动编写分析 (1)usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。左边这一块已经帮我们做好了,我们要做的是右边这一块。我们要构造一个us...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年11月28日 22:28
  • 1554

写linux驱动程序的步骤

第一步:建立Linux驱动的骨架                 linux内核使用驱动时候,需要先初始化,包括建立设备文件,分配内存地址空间等,退出的时候要释放资源,删除设备文件,释放内存地址空间...
  • csdn_abcd
  • csdn_abcd
  • 2016年07月08日 14:31
  • 1123

驱动程序编写基本流程

驱动程序编写基本流程:   1.首先是一些版本信息,没什么用,但是不能少   #define __NO_VERSION__   #include   #include   char ke...
  • S510121202
  • S510121202
  • 2013年07月27日 17:36
  • 1393

网卡驱动程序框架

我们这里说的是网卡驱动程序,不是网络驱动程序,网络有七层,我们写的只是最底层的东西,网络这么多层,但是最终你还是要操作硬件啊 所以上面肯定有个硬件相关层,我们要写的就是硬件相关的驱动程序这一小块。 网...
  • fight_onlyfor_you
  • fight_onlyfor_you
  • 2017年03月30日 23:31
  • 621

手把手教你写第一个Linux驱动程序

说到写第一个linux内核驱动程序,再简单不过了。以前也写过,这次将做一个图形化的整理。我这里以我的开发环境tiny4412为主,我将在这上面写第一个驱动程序。首先,我在driver/目录下创建yan...
  • morixinguan
  • morixinguan
  • 2017年01月19日 22:57
  • 982

嵌入式驱动编写-第一个驱动程序

 打开开发板的原理图 找到操作LED的寄存器 1 确定运行环境正常 1 PC,linux虚拟机,JZ2440开发板之前可以互相ping通 查看设备类型 ...
  • joshua_love
  • joshua_love
  • 2016年11月05日 19:28
  • 3377

linux驱动编写(入门)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】    在我离职之前,工作内容几乎不涉及到驱动方面的知识。我所要做的内容就是把客户对设备的请求拆...
  • feixiaoxing
  • feixiaoxing
  • 2013年01月23日 14:21
  • 23379

设计和编写设备驱动的一般方法

我的上一篇博客《设备驱动调试和移植的一般方法》详细介绍了调试和移植的几个步骤,依照那几个步骤,按部就班,外加不屑的努力,你就可以完成驱动的调试和移植。但是当你面临的是一块崭新的芯片XXXX,当前并没有...
  • zqh2007
  • zqh2007
  • 2014年04月28日 16:33
  • 1226

Linux驱动--为Ubuntu系统编写驱动程序入门

先查看自己系统使用的内核版本: wang@wang:~$ uname -r 3.13.0-96-generic 查看需要下载的源码包: wang@wang:/usr/src$ apt-cache se...
  • WAN_EXE
  • WAN_EXE
  • 2016年10月09日 20:28
  • 783

编写第一个HelloWorld驱动程序

开发应用程序需要用到SDK,内核编程需要使用WDK(Windows Driver Kit),WDK已经自带所需要的头文件,库,C/C++语言及汇编语言的编译器与链接器,所有完全可以不用安装Visual...
  • laowu_csdn
  • laowu_csdn
  • 2016年02月16日 11:26
  • 2074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:华虹USB-KEY for WinCE.NET驱动程序的编写
举报原因:
原因补充:

(最多只允许输入30个字)