CN101719054A - 一种实现多卡槽访问的方法和装置 - Google Patents
一种实现多卡槽访问的方法和装置 Download PDFInfo
- Publication number
- CN101719054A CN101719054A CN200910243881A CN200910243881A CN101719054A CN 101719054 A CN101719054 A CN 101719054A CN 200910243881 A CN200910243881 A CN 200910243881A CN 200910243881 A CN200910243881 A CN 200910243881A CN 101719054 A CN101719054 A CN 101719054A
- Authority
- CN
- China
- Prior art keywords
- draw
- ccid
- command
- groove
- equipment
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/382—Information transfer, e.g. on bus using universal interface adapter
- G06F13/385—Information transfer, e.g. on bus using universal interface adapter for adaptation of a particular data processing system to different peripheral devices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/40—Bus structure
- G06F13/4004—Coupling between buses
- G06F13/4022—Coupling between buses using switching circuits, e.g. switching matrix, connection or expansion network
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2213/00—Indexing scheme relating to interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F2213/38—Universal adapter
- G06F2213/3804—Memory card connected to a computer port directly or by means of a reader/writer
Abstract
本发明公开了一种实现多卡槽访问的方法和装置,属于数据通信领域。方法包括:多卡槽的CCID设备与主机建立连接,将至少一对用来实现应答管道和命令管道的IN/OUT端点声明为BULK-IN和BULK-OUT端点,将至少一个用来实现事件通知管道的IN端点声明为中断端点,并向所述主机声明其自身是符合CCID接口标准的设备以及自身支持的卡槽数;主机对所述多卡槽的CCID设备进行访问;所述多卡槽的CCID设备接收BULK-OUT数据包,并根据所述BULK-OUT数据包判断所述主机下发的CCID命令的类型;当所述CCID命令类型是通道扩展命令时,则判断所述通道扩展命令是否是通道切换命令;如果所述通道扩展命令是通道切换命令时,则解析所述通道切换命令,并激活所述主机欲访问的相应卡槽。
Description
技术领域
本发明涉及数据通讯领域,特别涉及一种实现多卡槽访问的方法和装置。
背景技术
CCID(USB Chip/Smart Card Interface Devices-USB,芯片智能卡接口设备)标准是由几大国际级IT企业共同制定的一个标准,它提供了一种智能卡读写设备与主机或其他嵌入式主机之间实现相互通讯的可能。CCID标准规定了CCID设备是一种芯片/智能卡接口设备,设备通过USB接口与主机或其他嵌入式主机连接,进行符合CCID标准的数据通信,同时设备通过符合7816标准协议的接口与智能卡进行通讯。微软公司在其WINDOWS2000及以上的操作系统上提供并支持CCID驱动,使设备生产厂商可以轻松的开发使用符合CCID接口标准的设备。同时,CCID接口标准支持PC(Personal Computer个人计算机)/SC(Smart Card智能卡)接口调用,使广大开发者可以方便的对智能密钥设备进行开发操作。在其他开源操作系统如LINUX的众多版本上,也有许多开源的CCID驱动可供开发者和使用者使用。
在实现本发明的过程中,发明人发现现有技术至少存在以下缺点:
CCID协议是一个单通道协议,支持多卡槽的访问,但微软的CCID驱动在对读卡器操作时,仅可以对一个卡槽进行访问。
发明内容
为了实现CCID协议下的多卡槽访问,本发明实施例提供了一种实现多卡座访问的方法和装置。所述技术方案如下:
一种实现多卡槽访问的方法,其特征在于,所述方法包括:
多卡槽的CCID设备与主机建立连接,将至少一对用来实现应答管道和命令管道的IN/OUT端点声明为BULK-IN和BULK-OUT端点,将至少一个用来实现事件通知管道的IN端点声明为中断端点,并向所述主机声明其自身是符合CCID接口标准的设备以及自身支持的卡槽数;
主机对所述多卡槽的CCID设备进行访问;
所述多卡槽的CCID设备接收BULK-OUT数据包,并根据所述BULK-OUT数据包判断所述主机下发的CCID命令的类型;
当所述CCID命令类型是通道扩展命令时,则判断所述通道扩展命令是否是通道切换命令;如果所述通道扩展命令是通道切换命令时,则解析所述通道切换命令,并激活所述主机欲访问的相应卡槽;如果所述通道扩展命令不是通道切换命令时,则根据所述通道扩展命令的命令类型进行相应的处理;
当所述CCID命令的类型不是通道扩展命令,则根据所述CCID命令类型进行相应的处理。
向所述主机声明其自身支持的卡槽数,具体包括:
所述CCID设备向所述主机发送卡槽描述符,所述卡槽描述符中使用一个字节表示CCID设备自身支持的卡槽数。
根据所述BULK-OUT数据包判断所述主机下发的CCID命令的类型,具体包括:
所述CCID设备解析符合CCID标准的命令流,拆分所述命令流的包头中的第一个字节,得到该命令流的命令类型;
其中,当所述第一个字节为6B时,表示通道扩展命令。
判断所述通道扩展命令是否是通道切换命令,具体包括:
所述CCID设备解析所述通道扩展命令,根据所述通道扩展命令中的标识符字段得到该命令的的命令类型;
其中,所述标识符是自定义标识符。
解析所述通道切换命令,并激活所述主机欲访问的相应卡槽,具体包括:
所述CCID设备中的固件程序拆分所述通道切换命令的包头;
通过计算所述通道切换命令包头中的数据长度标志,获知数据包的长度及所述数据包在所述CCID设备收发缓冲中的位置,得到所述通道切换命令数据包中的标识符,所述标识符用于标识所述通道切换命令的具体用途;
如果所述标识符表示该通道切换命令是用于卡槽切换的,则查看所述通道切换命令的第13个字节,得到本条通道切换命令所要访问的卡槽序号;
通过所述CCID设备的电路控制程序单元将所述卡槽序号所对应的卡槽激活。
所述方法还包括:判断被激活卡槽中是否有智能卡插拔事件信息;
如果有,则向所述主机返回符合CCID标准的智能卡插拔事件信息;
如果没有,则继续执行所述多卡槽的CCID设备接收BULK-OUT数据包的步骤。
所述判断是否有智能卡插拔事件信息,具体包括:
判断所述CCID设备的收发缓冲中是否有所述智能卡插拔事件信息,所述智能卡插拔事件信息由所述CCID设备在接收到有智能卡插入或拔出的中断信号时写入到所述收发缓冲中。
一种多卡槽的CCID设备,所述设备包括:接口模块、主控模块、判断模块和卡槽切换电路模块;
所述接口模块,分别与主机和所述主控模块相连接,用于实现所述主机与所述主控模块之间的信息交互;
所述主控模块,分别与所述接口模块和所述判断模块相连接,用于控制所述接口模块接收主机下发的命令流,控制所述判断模块接收智能卡发送的应答,控制所述判断模块发送命令流中的数据包到所述智能卡,控制所述接口模块发送符合CCID标准的应答数据包到所述主机;
所述判断模块,分别与所述主控模块和所述卡槽切换电路模块相连接,用于判断CCID设备中是否有智能卡插拔事件信息,并将所述智能卡插拔事件信息通过所述主控模块返回给所述主机,
所述卡槽切换电路模块,分别与所述判断模块和卡槽相连接,用于接收所述主控模块发送的命令流;如果接收到所述主控模块发送的通道切换命令,则根据卡槽序列号激活相应的卡槽;如果接收到所述主控模块发送的其他命令,则将所述其他命令发送给所述智能卡,并将所述智能卡的应答数据包发送给所述判断模块。
所述接口模块具体包括:描述符设置单元和端点设置单元;
所述描述符设置单元,用于设置符合CCID标准中规定的设备类型描述符及卡槽描述符;所述CCID设备通过所述设备类型描述符向主机声明自身是CCID设备,通过所述卡槽描述符向主机声明自身支持的卡槽数;
所述端点设置单元,用于将至少一对用来实现应答管道和命令管道的IN/OUT端点设置为BULK-IN和BULK-OUT端点,将至少一个用来实现事件通知管道的IN端点声明为中断端点。
所述主控模块具体包括:
接收单元,用于接收所述主机通过所述接口模块发送的命令流,及接收智能卡通过所述判断模块返回的应答;
解析单元,用于解析所述接收单元接收到的所述命令流;
拆分单元,用于拆分所述解析单元解析出来的命令流的包头中的第一个字节,得到该命令流的命令类型,其中,当第一个字节为6B时,表示通道扩展命令;
计算单元,用于根据所述接收单元接收到的命令流中的数据长度标志,确定命令流中的数据包长度和所述数据包在所述CCID设备收发缓冲中的位置;
应答组成单元,用于将应答组成符合CCID标准的应答数据包;
第一判断单元,用于根据所述接收模块接收到的BULK-OUT数据包判断主机下发的CCID命令的类型;
第二判断单元,用于当所述第一判断单元的判断结果为通道扩展命令时,判断所述通道扩展命令是否是通道切换命令;
第一处理单元,用于如果所述第一判断单元的判断结果为不是通道扩展命令时,根据所述CCID命令类型进行相应的处理;
第二处理单元,用于如果所述第二判断单元的判断结果为通道扩展命令不是通道切换命令时,根据所述通道扩展命令的命令类型进行相应的处理;
发送单元,用于发送所述主机下发的命令流给所述智能卡,及发送智能卡返回的应答给所述主机。
所述第二判断单元具体包括:
拆分子单元,用于拆分通道切换命令的包头;
第一获得子单元,用于通过计算通道切换命令包头中的数据长度标志,获知数据包的长度及所述数据包在CCID设备收发缓冲中的位置,得到通道切换命令数据包中的标识符,所述标识符用于标识通道切换命令的具体用途;
第二获得子单元,用于当所述第一获得单元获得的标识符表示该通道切换命令是用于卡槽切换时,查看通道切换命令的第13个字节,得到本条通道切换命令所要访问的卡槽序号。
所述判断模块具体用于:
判断CCID设备的收发缓冲中是否有智能卡插拔事件信息,智能卡插拔事件信息由CCID设备在接收到有智能卡插入或拔出的中断信号时写入到收发缓冲中。
本发明实施例提供的技术方案带来的有益效果是:
实现微软windows下的读卡器驱动能够支持多卡槽访问,并且还支持linux下的读卡器驱动的多卡槽访问。
附图说明
图1是本发明实施例1中提供的一种以查询方式实现多卡槽访问的方法流程图;
图2是本发明实施例2中提供的一种以查询方式实现多卡槽访问的方法流程图;
图3是本发明实施例3中提供的一种以中断方式实现多卡槽访问的方法流程图;
图4是本发明实施例4中提供的一种实现多卡槽访问的装置结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
在描述本发明具体实施例之前,这里需要说明的是,根据CCID协议,符合CCID接口标准的设备,其端点需要包括如下特征:至少一对IN/OUT端点声明为BULK-IN、BULK-OUT端点,用来实现应答和命令管道;至少一个IN端点声明为中断端点,用来实现事件通知管道。符合CCID接口标准的设备,其描述符需要包括如下特征:在接口描述符中,字节0是描述符的字节长度,值为09h,字节1是固定终端,值为04h,字节4代表其所支持的终端号(除了终端0),值为02h或03h,字节5是类代码,值为0Bh,字节6为子类代码,值为00h,字节7是协议代码,值为00h;在类型描述符中,字节0是描述符的字节长度,值为36h,字节2是CCID规范的版本号,它是用二进制代码表示的小数,值为0100h,字节52是PIN码支持,值为00h-03h。符合CCID接口标准的设备的其它描述符中的字节,如设备描述符、配置描述符中的字节以及上述接口描述符和类型描述符中其它字节仍按照USB协议中的规定设置。
实施例1
本发明实施例1提供了一种实现多卡槽访问的方法,本实施例以多卡槽读卡器这种常见的CCID设备为例,并假设与该多卡槽读卡器连接的主机中安装有微软的CCID协议的读卡器驱动,多卡槽读卡器通过自定义通道切换命令、并配合卡槽切换电路实现了多卡槽读卡器中的多个卡槽共享一条USB总线与主机进行通信。其中需要说明的是,主机与CCID设备之间可以通过两条通信管道进行通信,一条为批量传输管道,用于进行数据的传输,如上电、下电指令、执行APDU(Application Protocol Data Unit应用协议数据单元)、主机与CCID设备按照一应一答的方式通过批量传输管道进行数据的交互;一条为中断传输管道,用于传输异步事件,如插卡、拔卡及卡短路等,CCID设备就会通过中断传输管道向主机发送信号。参见图1,该方法包括:
步骤101:CCID设备与主机建立连接,进行初始化;
在本实施例中,该CCID设备通过USB接口与主机建立连接。
具体的,CCID设备的初始化过程可以包括:初始化中断向量、初始化I/O信号等。其中的中断可以包括USB中断、插拔卡事件中断等。
步骤102:初始化完成后,CCID设备设置至少一对用来实现应答和命令管道的IN/OUT端点声明为BULK-IN和BULK-OUT端点,设置至少一个用来实现事件通知管道的IN端点,并声明为中断端点,并向主机声明其自身是符合CCID接口标准的设备;
其中,可以采用设备类型描述符的形式实现声明其自身是CCID设备,具体包括:CCID设备向与其建立连接的主机发送CCID类型的设备描述符,主机接收到该CCID类型的设备描述符后,根据该CCID类型的设备描述符识别该建立连接的设备为CCID设备。
步骤103:CCID设备向主机声明自身支持的卡槽数;
其中,可以采用设备卡槽描述符的形式实现声明其自身支持的卡槽数,具体包括:CCID设备向与其建立连接的主机发送卡槽描述符,卡槽描述符中用一个字节表示CCID设备自身支持的卡槽数,例如,当卡槽描述符为“00”时,表示CCID设备支持一个卡槽;当卡槽描述符为“01”时,表示CCID设备支持两个卡槽,当卡槽描述符为“02”时,表示CCID设备支持三个卡槽,等等。
主机接收到卡槽描述符后,主机加载的读卡器驱动即为读卡器的卡槽创建物理设备对象。其中,如果主机加载的是微软的CCID协议的读卡器驱动,则主机在接收到卡槽描述符时,为多卡槽读卡器创建一个物理设备对象,即为默认的卡槽创建物理设备对象,与默认卡槽(如1号卡槽)相对应;如果主机加载Linux下的CCID协议的读卡器驱动,则主机在接收到卡槽描述符时,根据卡槽描述符携带的卡槽数,创建相应数目的物理设备对象,分别与读卡器的各个卡槽相对应。
步骤104:CCID设备检查USB标志,判断USB标志是否为接收到BULK-OUT包的标志;
如果是,则执行步骤105;
如果否,则执行步骤113;
其中,USB标志是由CCID设备中的硬件电路设置或清除的。USB标志包括数据包长度标志、数据包类型标志和接收到的数据包标志等。例如,接收到的USB标志是SETUP包的标志、IN包的标志、BULK-OUT包的标志、BULK-OUT包长度标志等。
步骤105:CCID设备接收BULK-OUT包,并判断是否正确接收到BULK-OUT数据包;
如果是,执行步骤106;
如果否,执行步骤104;
其中,判断是否正确接收到BULK-OUT数据包的过程可以为:根据接收到的数据包长度标志及数据包的发送长度标志进行判断,如果接收到的数据包长度与数据包的发送长度标志一致,则认为是正确接收到了BULK-OUT数据包。
步骤106:CCID设备解析BULK-OUT数据包的内容,并判断是何种类型的CCID命令;
如果是通道扩展命令,则执行步骤108;
如果不是通道扩展命令,则执行步骤107。
其中,判断数据包中的内容是何种类型的CCID命令的过程可以为:CCID设备解析符合CCID标准的命令流,拆分命令流的包头中的第一个字节,得到该命令流的命令类型。例如,第一个字节为6B,表示通道扩展命令;第一个字节为62,表示上电命令;第一个字节为61,表示设置参数命令;等等。
其中,通道扩展命令是CCID协议标准留给生产厂家自己定义的扩展命令,通过该扩展命令可以对CCID设备进行区别于其他CCID协议标准的操作,生成厂家可以修改该通道扩展命令的第11、12字节(即标识符字段)的内容,用于实现一些自定义的命令功能,如用于通道切换、对传输通道上的数据进行加解密操作等。
步骤107:CCID设备根据CCID命令类型进行相应的处理,并将处理结果组装成符合CCID接口标准的数据包,且并将所述数据包保存至CCID设备缓冲区中,执行步骤111;
其中,根据CCID命令类型进行相应的处理可以包括:当CCID命令类型为对智能卡进行上电或下电,则CCID设备对其卡槽中的智能卡进行上电或下电处理;当CCID命令类型为对智能卡进行PPS(Protocol and Parameter Select变频协商),则CCID设备对其卡槽中的智能卡进行变频协商;当CCID命令类型为对智能卡中的数据进行读写等操作,则CCID设备对智能卡中的数据进行读写等操作。
还需要知道的是,CCID命令中的第6个字节(即命令中的Slot字段)表示的是该智能卡操作命令所对应的多卡槽CCID设备卡槽的编号;
另外,还需要知道的是:如果主机加载微软的CCID协议的读卡器驱动,则CCID命令中的第6个字节(即命令中的Slot字段)是固定的00;
如果主机加载Linux下的CCID协议读卡器驱动,则CCID命令中的第6个字节(即命令中的Slot字段)表示的是该智能卡操作命令对应的多卡槽CCID设备卡槽的编号,如:
6f 05 00 00 00 00 10 00 00 00 00 84 00 00 08
表示1号卡座的取随机数指令,第6位字节00表示1号卡槽
62 00 00 00 00 01 21 01 00 00
表示2号卡座的上电指令,第6位字节01表示2号卡槽
当多卡槽CCID设备接收到符合CCID标准的命令后,根据上述卡槽号对相应的卡槽进行操作。
优选的,本实施例中主机中安装的是微软的CCID协议的读卡器驱动。
步骤108:CCID设备判断通道扩展命令是否是通道切换命令;
如果是通道切换命令,则执行步骤110;
如果是其他通道扩展命令,则执行步骤109;
本步骤中所涉及到的判断,具体过程为:CCID设备中的固件程序拆分接收到的通道扩展命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备缓冲区中的位置,得到该命令流数据包中的标识符(命令中的第11、12个字节),该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如:Ox5aa5表示该通道扩展命令是通道切换命令,用于多卡槽CCID设备卡槽切换,当然该标识符也可以是Oxa55a等,取决于生产厂家的定义。
步骤109:执行其他通道扩展命令相应的操作后,执行步骤111;
例如,该通道扩展命令是用于对传输通道上的数据进行加解密操作、读flash或写flash操作等,则CCID设备执行相应的操作即可。具体的命令例如:
6B 05 00 00 00 00 00 00 00 00 6066 84 00 08
表示对CCID设备进行flash读操作,第11、12位字节6066是自定义的,表示读flash
6B 05 00 00 00 00 00 00 00 00 6660 84 00 08
表示对CCID设备进行flash写操作,第11、12为字节6660是自定义的,表示写flash
步骤110:CCID设备中的固件程序对接收到的通道切换命令进行解析,得到该条命令对应的卡槽,通过卡槽切换电路激活命令中指定的卡槽;
CCID设备中的固件程序查看该通道切换命令的第13个字节,可以得到本条命令所要激活的卡槽序号,然后通过CCID设备的电路控制程序单元将卡槽序号所对应的卡槽激活。
具体在本实施例中,以使用的是微软的CCID协议的读卡器驱动为例,符合CCID标准的通道切换命令中的Slot字段(第6个字节)是固定的00。
假设CCID设备接收到的通道切换命令具体为:
6B 04 00 00 00 00 00 00 00 00 5a a5 00 ff
该通道切换命令表示1号卡槽的随机数指令,该条指令的第13个字节00表示1号卡槽;
6B 04 00 00 00 00 00 00 00 00 5a a5 01 ff
该通道切换命令表示2号卡槽的随机数指令,该条指令的第13个字节01表示2号卡槽。
具体的,CCID设备通过电路控制程序单元将卡槽序号所对应的卡槽激活,具体实现过程可以如下:
一种优选的方式为,CCID设备的卡槽切换电路包括CPU(Central Processing Unit,中央处理单元)、一个CPU接口、多路选择开关和电路控制程序单元;多路选择开关分别与CCID设备中的各个卡槽(例如卡槽1、卡槽2、卡槽3等)相连接;当CCID设备分析得到卡槽的序号后,电路控制程序单元控制多路选择开关将相应的卡槽之间的电路进行连通。
另一种优选的方式,CCID设备卡槽切换电路包括CPU、多个CPU接口和电路控制程序单元;多个CPU接口分别与CCID设备中的各个卡槽(例如卡槽1、卡槽2、卡槽3等)相连接,当CCID设备分析得到卡槽的编号后,电路控制程序单元将CPU接口与相应的卡槽之间的电路进行连通。
步骤111:CCID设备检测缓冲区中是否有智能卡插拔事件信息;
如果有,则执行步骤112;
如果否,则返回步骤104;
其中,智能卡插拔事件信息在CCID设备判断到有智能卡插入或拔出时写入到缓冲区中。
在本发明实施例中的卡槽有两种情况,包括有卡和无卡;如果卡槽中没有卡片插入或者卡片从卡槽中拔出,卡槽就处于无卡状态,产生无卡的中断信号;如果卡片插入卡槽,就处于有卡未上电状态,产生有卡的中断信号;主机下发上电指令,智能卡响应并成功返回ATR(Answer To Reset,复位应答)后,卡槽的状态变为有卡已上电;主机下发下电指令,智能卡的卡槽状态变为有卡未上电状态。
当某一卡槽为激活的卡槽时,如果卡槽中有智能卡的插入,则会产生有卡的中断信号0x5003;如果卡槽中有智能卡的拔出,则会产生无卡的中断信号0x5002;当某一卡槽为未激活的卡槽时,发生插拔事件不会产生中断信号。
需要说明的是,如果主机加载微软的CCID协议的读卡器驱动,则多卡槽CCID设备中卡槽中有卡的插拔动作时都将会产生相同的插拔卡中断信息,例如:
1号卡槽插入卡 0x5003
2号卡槽插入卡 0x5003
3号卡槽插入卡 0x5003
1号卡槽拔卡 0x5002
2号卡槽拔卡 0x5002
3号卡槽拔卡 0x5002
如果主机中加载Linux下的CCID协议的读卡器驱动,则多卡槽CCID设备中卡槽中有卡的插拔动作时,不同的卡槽将产生不同的插拔卡中断信息,例如:
1号卡槽插入卡 0x5003
2号卡槽插入卡 0x500c
3号卡槽插入卡 0x5030
1号卡槽拔卡 0x5002
2号卡槽拔卡 0x5008
3号卡槽拔卡 0x5020
步骤112:CCID设备将智能卡插入或拔出事件信息组装成符合CCID接口标准的数据包返回给主机,并执行步骤104;
步骤113:CCID设备进行其他操作,并返回步骤104。
本发明实施例提供了一种实现多卡槽访问的方法,实现微软windows下的读卡器驱动能够支持多卡槽访问,并且还支持linux下的读卡器驱动的多卡槽访问。
实施例2
本发明实施例2提供了一种实现多卡槽访问的方法,本实施例以多卡槽读卡器这种常见的CCID设备为例,并假设与该多卡槽读卡器连接的主机中安装有微软的CCID协议的读卡器驱动,多卡槽读卡器通过自定义通道切换命令、并配合卡槽切换电路实现了多卡槽读卡器中的多个卡槽共享一条USB总线与主机进行通信。其中需要说明的是,主机与CCID设备之间可以通过两条通信管道进行通信,一条为批量传输管道,用于进行数据的传输,如上电、下电指令、执行APDU、主机与CCID设备按照一应一答的方式通过批量传输管道进行数据的交互;一条为中断传输管道,用于传输异步事件,如插卡、拔卡及卡短路等,CCID设备就会通过中断传输管道向主机发送信号。参见图2,该方法包括:
步骤201:CCID设备与主机建立连接,进行初始化;
在本实施例中,该CCID设备通过USB接口与主机建立连接。
具体的,CCID设备的初始化过程可以包括:初始化中断向量、初始化I/O信号等。其中的中断可以包括USB中断、插拔卡事件中断等。
步骤202:初始化完成后,CCID设备设置至少一对用来实现应答和命令管道的IN/OUT端点声明为BULK-IN和BULK-OUT端点,设置至少一个用来实现事件通知管道的IN端点声明为中断端点,并向主机声明其自身是符合CCID接口标准的设备;
其中,可以采用设备类型描述符的形式实现声明其自身是CCID设备,具体包括:CCID设备向与其建立连接的主机发送CCID类型的设备描述符,主机接收到该CCID类型的设备描述符后,根据该CCID类型的设备描述符识别该建立连接的设备为CCID设备。
步骤203:CCID设备向主机声明自身支持的卡槽数;
其中,可以采用设备卡槽描述符的形式实现声明其自身支持的卡槽数,具体包括:CCID设备向与其建立连接的主机发送卡槽描述符,卡槽描述符中用一个字节表示CCID设备自身支持的卡槽数,例如,当卡槽描述符为“00”时,表示CCID设备支持一个卡槽;当卡槽描述符为“01”时,表示CCID设备支持两个卡槽。
主机接收到卡槽描述符后,主机加载的读卡器驱动即为读卡器的卡槽创建物理设备对象。其中,如果主机加载的是微软的CCID协议的读卡器驱动,则主机在接收到卡槽描述符时,为多卡槽读卡器创建一个物理设备对象,即为默认的卡槽创建物理设备对象,与默认卡槽(如1号卡槽)相对应;如果主机加载的Linux下的CCID协议的读卡器驱动,则主机在接收到卡槽描述符时,根据卡槽描述符携带的卡槽数,创建相应数目的物理设备对象,分别与读卡器的各个卡槽相对应。
步骤204:CCID设备检测缓冲区中是否有智能卡插拔事件信息;
如果是,执行步骤205;
如果否,执行步骤206;
其中,智能卡插拔事件信息在CCID设备判断到有智能卡插入或拔出时写入到缓冲区中。
在本发明实施例中的卡槽有两种情况,包括有卡和无卡;如果卡槽中没有卡片插入或者卡片从卡槽中拔出,卡槽就处于无卡状态,产生无卡的中断信号;如果卡片插入卡槽,就处于有卡未上电状态,产生有卡的中断信号;主机下发上电指令,智能卡响应并成功返回ATR(Answer To Reset,复位应答)后,卡槽的状态变为有卡已上电;主机下发下电指令,智能卡的卡槽状态变为有卡未上电状态。
当某一卡槽为激活的卡槽时,如果卡槽中有智能卡的插入,则会产生有卡的中断信号0x5003;如果卡槽中有智能卡的拔出,则会产生无卡的中断信号0x5002;当某一卡槽为未激活的卡槽时,发生插拔事件不会产生中断信号。
需要说明的是,如果主机加载微软的CCID协议的读卡器驱动,则多卡槽CCID设备中卡槽中有卡的插拔动作时都将会产生相同的插拔卡中断信息,例如:
1号卡槽插入卡 0x5003
2号卡槽插入卡 0x5003
3号卡槽插入卡 0x5003
1号卡槽拔卡 0x5002
2号卡槽拔卡 0x5002
3号卡槽拔卡 0x5002
如果主机中加载Linux下的CCID协议的读卡器驱动,则多卡槽CCID设备中卡槽中有卡的插拔动作时,不同的卡槽将产生不同的插拔卡中断信息,例如:
1号卡槽插入卡 0x5003
2号卡槽插入卡 0x500c
3号卡槽插入卡 0x5030
1号卡槽拔卡 0x5002
2号卡槽拔卡 0x5008
3号卡槽拔卡 0x5020
步骤205:CCID设备将智能卡插入或拔出事件信息组装成符合CCID接口标准的数据包返回给主机,并执行步骤204;
步骤206:CCID设备检查USB标志,判断USB标志是否为接收到BULK-OUT包的标志;
如果是,则执行步骤207;
如果否,则执行步骤213。
其中,USB标志是由CCID设备中的硬件电路设置或清除的。USB标志包括长度标志、数据包类型标志和接收到的数据包标志等。例如,接收到的USB标志是SETUP包的标志、IN包的标志、BULK-OUT包的标志、BULK-OUT包长度标志等。
步骤207:CCID设备接收BULK-OUT包,并判断是否正确接收到BULK-OUT数据包;
如果是,执行步骤208;
如果否,执行步骤204;
其中,判断是否正确接收到BULK-OUT数据包的过程可以为:根据接收到的数据包长度标志及数据包的发送长度标志进行判断,如果接收到的数据包长度与数据包的发送长度标志一致,则认为是正确接收到了BULK-OUT数据包。
其中,通道扩展命令是CCID协议标准留给生产厂家自己定义的扩展命令,通过该扩展命令可以对CCID设备进行区别于其他CCID协议标准的操作,生成厂家可以修改该通道扩展命令的第11、12字节的内容,用于实现一些自定义的命令功能,如用于通道切换、对传输通道上的数据进行加解密操作等。
步骤208:CCID设备解析BULK-OUT数据包的内容,并判断是何种类型的CCID命令;
如果是通道扩展命令,则执行步骤210;
如果不是通道扩展命令,则执行步骤209;
其中,判断数据包中的内容是何种类型的CCID命令的过程可以为:CCID设备解析符合CCID标准的命令流,拆分命令流的包头中的第一个字节,得到该命令流的命令类型。例如,第一个字节为6B,表示通道扩展命令;第一个字节为62,表示上电命令;第一个字节为61,表示设置参数命令;等等。
步骤209:CCID设备根据CCID命令类型进行相应的处理,并将处理结果组装成符合CCID接口标准的数据包,且并将所述数据包保存至CCID设备缓冲区,执行步骤204;
其中,根据CCID命令类型进行相应的处理可以包括:当CCID命令类型为对智能卡进行上电或下电,则CCID设备对其卡槽中的智能卡进行上电或下电处理;当CCID命令类型为对智能卡进行变频协商,则CCID设备对其卡槽中的智能卡进行变频协商;当CCID命令类型为对智能卡中的数据进行读写等操作,则CCID设备对智能卡中的数据进行读写等操作。
还需要知道的是,CCID命令中的第6个字节(即命令中的Slot字段)表示的是该智能卡操作命令所对应的多卡槽CCID设备卡槽的编号;
另外,还需要知道的是:如果主机加载微软的CCID协议的读卡器驱动,则CCID命令中的第6个字节(即命令中的Slot字段)是固定的00;
如果主机加载Linux下的CCID协议读卡器驱动,则CCID命令中的第6个字节(即命令中的Slot字段)显示的是该智能卡操作命令对应的多卡槽CCID设备卡槽的编号,如:
6f 05 00 00 00 00 10 00 00 00 00 84 00 00 08
表示1号卡座的取随机数指令,第6位字节00表示1号卡槽
62 00 00 00 00 01 21 01 00 00
表示2号卡座的上电指令,第6位字节01表示2号卡槽
当多卡槽CCID设备接收到上述命令后,根据上述卡槽号对相应的卡槽进行操作。
优选的,本实施例中主机中安装的是微软的CCID协议的读卡器驱动。
步骤210:CCID设备判断通道扩展命令是否是通道切换命令;
如果是通道切换命令,则执行步骤212;
如果其他通道扩展命令,则执行步骤211;
本步骤中所涉及到的判断具体过程为:CCID设备中的固件程序拆分接收到的通道切换命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备缓冲区中的位置,得到该命令流数据包中的标识符(命令中的第11、12个字节),该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如:Ox5aa5表示该通道扩展命令是通道切换命令,用于多卡槽CCID设备卡槽切换,当然该标识符也可以是Oxa55a等,取决于生产厂家的定义。
步骤211:执行其他通道扩展命令相应的操作,并返回步骤204;
例如,该通道扩展命令是用于对传输通道上的数据进行加解密操作、读flash或写flash操作等,则CCID设备执行相应的操作即可。具体的命令例如:
6B 05 00 00 00 00 00 00 00 00 6066 84 00 08
表示对CCID设备进行flash读操作,第11、12位字节6066是自定义的,表示读flash
6B 05 00 00 00 00 00 00 00 00 6660 84 00 08
表示对CCID设备进行flash写操作,第11、12为字节6660是自定义的,表示写flash
步骤212:CCID设备中的固件程序对接收到的通道切换命令进行解析,得到该条命令对应的卡槽,通过卡槽切换电路激活命令中指定的卡槽,返回步骤204;
其中,CCID设备中的固件程序拆分接收到的通道切换命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备缓冲区中的位置,得到该命令流数据包中的标识符,该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如果该标识符表示该通道切换命令是用于卡槽切换的,通过查看该命令的第13个字节,可以得到本条命令所要激活的卡槽序号,然后通过CCID设备的电路控制程序单元将卡槽序号所对应的卡槽激活。
具体在本实施例中,以使用的是微软的CCID协议的读卡器驱动为例,符合CCID标准的通道切换命令中的Slot字段(第6个字节)是固定的00。
假设CCID设备接收到的通道切换命令具体为:
6B 04 00 00 00 00 00 00 00 00 5a a5 00 ff
该通道切换命令表示1号卡槽的随机数指令,该条指令的第13个字节00表示1号卡槽;
6B 04 00 00 00 00 00 00 00 00 5a a5 01 ff
该通道切换命令表示2号卡槽的随机数指令,该条指令的第13个字节01表示2号卡槽。
具体的,CCID设备通过电路控制程序单元将卡槽序号所对应的卡槽(例如卡槽1、卡槽2、卡槽3)激活,具体实现过程可以如下:
一种优选的方式为,CCID设备的卡槽切换电路包括CPU、一个CPU接口、多路选择开关和电路控制程序单元;多路选择开关分别与CCID设备中的各个卡槽相连接;当CCID设备分析得到卡槽的序号后,电路控制程序单元控制多路选择开关将相应的卡槽之间的电路进行连通。
另一种优选的方式,CCID设备卡槽切换电路包括CPU、多个CPU接口和电路控制程序单元;多个CPU接口分别与CCID设备中的各个卡槽相连接,当CCID设备分析得到卡槽的编号后,电路控制程序单元将CPU接口与相应的卡槽之间的电路进行连通。
步骤213:CCID设备进行其他操作,并返回步骤204。
本发明实施例提供了一种实现多卡槽访问的方法,实现微软windows下的读卡器驱动能够支持多卡槽访问,并且还支持linux下的读卡器驱动的多卡槽访问。
实施例3
本发明实施例3提供了一种实现多卡槽访问的方法,本实施例以多卡槽读卡器这种常见的CCID设备为例,并假设与该多卡槽读卡器连接的主机中安装有微软的CCID协议的读卡器驱动,多卡槽读卡器通过自定义通道切换命令、并配合卡槽切换电路实现了多卡槽读卡器中的多个卡槽共享一条USB总线与主机进行通信。其中需要说明的是,主机与CCID设备之间可以通过两条通信管道进行通信,一条为批量传输管道,用于进行数据的传输,如上电、下电指令、执行APDU、主机与CCID设备按照一应一答的方式通过批量传输管道进行数据的交互;一条为中断传输管道,用于传输异步事件,如插卡、拔卡及卡短路等,CCID设备就会通过中断传输管道向主机发送信号。参见图3,该方法包括:
步骤301:CCID设备与主机建立连接,进行初始化;
在本实施例中,该CCID设备通过USB接口与主机建立连接。
具体的,CCID设备的初始化过程可以包括:初始化中断向量、初始化I/O信号等。其中的中断可以包括USB中断、插拔卡事件中断等。
步骤302:初始化完成后,CCID设备设置至少一对用来实现应答和命令管道的IN/OUT端点声明为BULK-IN和BULK-OUT端点,设置至少一个用来实现事件通知管道的IN端点声明为中断端点,并向主机声明其自身是符合CCID接口标准的设备;
其中,可以采用设备类型描述符的形式实现声明其自身是CCID设备,具体包括:CCID设备向与其建立连接的主机发送CCID类型的设备描述符,主机接收到该CCID类型的设备描述符后,根据该CCID类型的设备描述符识别该建立连接的设备为CCID设备。
步骤303:CCID设备向主机声明自身支持的卡槽数;
其中,可以采用设备卡槽描述符的形式实现声明其自身支持的卡槽数,具体包括:CCID设备向与其建立连接的主机发送卡槽描述符,卡槽描述符中用一个字节表示CCID设备自身支持的卡槽数,例如,当卡槽描述符为“00”时,表示CCID设备支持一个卡槽;当卡槽描述符为“01”时,表示CCID设备支持两个卡槽。
主机接收到卡槽描述符后,主机加载的读卡器驱动即为读卡器的卡槽创建物理设备对象。其中,如果主机加载的是微软的CCID协议的读卡器驱动,则主机在接收到卡槽描述符时,为多卡槽读卡器创建一个物理设备对象,即为默认的卡槽创建物理设备对象,与默认卡槽(如1号卡槽)相对应;如果主机加载的Linux下的CCID协议的读卡器驱动,则主机在接收到卡槽描述符时,根据卡槽描述符携带的卡槽数,创建相应数目的物理设备对象,分别与读卡器的各个卡槽相对应。
步骤304:CCID设备等待中断;
如果有中断出现,则执行步骤305(即,CCID设备进入中断服务);
如果没有中断出现,则继续等待;
其中,优选的,USB中断或者插拔卡事件中断均采用一个中断入口进入中断服务;或者,USB中断和插拔卡事件中断采用不同的中断入口,则USB中断使得CCID设备进入USB中断服务;插拔卡事件中断使得CCID设备进入插拔卡事件中断服务。
步骤305:CCID设备进入中断服务;
步骤306:CCID设备判断出现的中断是否为BULK-OUT中断;
如果是,则执行步骤307;
如果否,则执行步骤313;
步骤307:CCID设备接收BULK-OUT包,并判断是否正确接收到BULK-OUT数据包;
如果是,执行步骤308;
如果否,执行步骤316;
步骤308:CCID设备解析BULK-OUT数据包的内容,并判断是何种类型的CCID命令;
如果是通道扩展命令,则执行步骤310;
如果不是通道扩展命令,则执行步骤309。
其中,通道扩展命令是CCID协议标准留给生产厂家自己定义的扩展命令,通过该扩展命令可以对CCID设备进行区别于其他CCID协议标准的操作,生成厂家可以修改该通道扩展命令的第11、12字节的内容,用于实现一些自定义的命令功能,如用于通道切换、对传输通道上的数据进行加解密操作等。
步骤309:CCID设备根据CCID命令类型进行相应的处理,程序的其他模块将处理结果组装成符合CCID接口标准的数据包,并将数据包保存至缓冲区,执行步骤316;
其中,根据CCID命令类型进行相应的处理可以包括:当CCID命令类型为对智能卡进行上电或下电,则CCID设备对其卡槽中的智能卡进行上电或下电处理;当CCID命令类型为对智能卡进行变频协商,则CCID设备对其卡槽中的智能卡进行变频协商;当CCID命令类型为对智能卡中的数据进行读写等操作,则CCID设备对智能卡中的数据进行读写等操作。
还需要知道的是,CCID命令中的第6个字节(即命令中的Slot字段)表示的是该智能卡操作命令所对应的多卡槽CCID设备卡槽的编号;
另外,还需要知道的是:如果主机加载微软的CCID协议的读卡器驱动,则CCID命令中的第6个字节(即命令中的Slot字段)是固定的00;
如果主机加载Linux下的CCID协议读卡器驱动,则CCID命令中的第6个字节(即命令中的Slot字段)显示的是该智能卡操作命令对应的多卡槽CCID设备卡槽的编号,如:
6f 05 00 00 00 00 10 00 00 00 00 84 00 00 08
表示1号卡座的取随机数指令,第6位字节00表示1号卡槽
62 00 00 00 00 01 21 01 00 00
表示2号卡座的上电指令,第6位字节01表示2号卡槽
当多卡槽CCID设备接收到上述命令后,根据上述卡槽号对相应的卡槽进行操作。
优选的,本实施例中主机中安装的是微软的CCID协议的读卡器驱动。
步骤310:CCID设备判断通道扩展命令是否是通道切换命令;
如果是通道切换命令,则执行步骤312;
如果其他通道扩展命令,则执行步骤311;
本步骤中所涉及到的判断具体过程为:CCID设备中的固件程序拆分接收到的通道切换命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备缓冲区中的位置,得到该命令流数据包中的标识符(命令中的第11、12个字节),该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如:Ox5aa5表示该通道扩展命令是通道切换命令,用于多卡槽CCID设备卡槽切换,当然该标识符也可以是Oxa55a等,取决于生产厂家的定义。
步骤311:执行其他通道扩展命令相应的操作,执行步骤316;
例如,该通道扩展命令是用于对传输通道上的数据进行加解密操作、读flash或写flash操作等,则CCID设备执行相应的操作即可。具体的命令例如:
6B 05 00 00 00 00 00 00 00 00 6066 84 00 08
表示对CCID设备进行flash读操作,第11、12位字节6066是自定义的,表示读flash
6B 05 00 00 00 00 00 00 00 00 6660 84 00 08
表示对CCID设备进行flash写操作,第11、12为字节6660是自定义的,表示写flash
步骤312:CCID设备中的固件程序对接收到的通道切换命令进行解析,得到该条命令对应的卡槽,通过卡槽切换电路激活命令中指定的卡槽,执行步骤316;
其中,CCID设备中的固件程序拆分接收到的通道切换命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备缓冲区中的位置,得到该命令流数据包中的标识符,该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如果该标识符表示该通道切换命令是用于卡槽切换的,通过查看该命令的第13个字节,可以得到本条命令所要激活的卡槽序号,然后通过CCID设备的电路控制程序单元将卡槽序号所对应的卡槽激活。
具体在本实施例中,以使用的是微软的CCID协议的读卡器驱动为例,符合CCID标准的通道切换命令中的Slot字段(第6个字节)是固定的00。
假设CCID设备接收到的通道切换命令具体为:
6B 04 00 00 00 00 00 00 00 00 5a a5 00 ff
该通道切换命令表示1号卡槽的随机数指令,该条指令的第13个字节00表示1号卡槽;
6B 04 00 00 00 00 00 00 00 00 5a a5 01 ff
该通道切换命令表示2号卡槽的随机数指令,该条指令的第13个字节01表示2号卡槽。
具体的,CCID设备通过电路控制程序单元将卡槽序号所对应的卡槽激活,具体实现过程可以如下:
一种优选的方式为,CCID设备的卡槽切换电路包括CPU、一个CPU接口、多路选择开关和电路控制程序单元;多路选择开关分别与CCID设备中的各个卡槽相连接;当CCID设备分析得到卡槽的序号后,电路控制程序单元控制多路选择开关将相应的卡槽之间的电路进行连通。
另一种优选的方式,CCID设备卡槽切换电路包括CPU、多个CPU接口和电路控制程序单元;多个CPU接口分别与CCID设备中的各个卡槽相连接,当CCID设备分析得到卡槽的编号后,电路控制程序单元将CPU接口与相应的卡槽之间的电路进行连通。
步骤313:CCID设备判断该中断是否是插拔卡中断;
如果是,执行步骤314;
如果否,执行步骤315;
步骤314:CCID设备将智能卡插入或拔出事件信息组装成符合CCID接口标准的数据包返回给主机,返回步骤316;
在本发明实施例中的卡槽有两种情况,包括有卡和无卡;如果卡槽中没有卡片插入或者卡片从卡槽中拔出,卡槽就处于无卡状态,产生无卡的中断信号;如果卡片插入卡槽,就处于有卡未上电状态,产生有卡的中断信号;主机下发上电指令,智能卡响应并成功返回ATR(Answer To Reset,复位应答)后,卡槽的状态变为有卡已上电;主机下发下电指令,智能卡的卡槽状态变为有卡未上电状态。
当某一卡槽为激活的卡槽时,如果卡槽中有智能卡的插入,则会产生有卡的中断信号0x5003;如果卡槽中有智能卡的拔出,则会产生无卡的中断信号0x5002;当某一卡槽为未激活的卡槽时,发生插拔事件不会产生中断信号。
步骤315:CCID设备执行其他操作,执行步骤316;
步骤316:中断返回。
对于本实施例需要说明的是,上述步骤301至步骤314是当USB中断或者插拔卡事件中断均采用一个中断入口进入中断服务程序时的处理方法;当USB中断和插拔卡事件中断采用不同的中断入口时,步骤305至步骤314还可以使用如下步骤代替:
步骤305’:当接收到的中断为USB中断时,CCID设备进入USB中断服务;
步骤306’:CCID设备判断出现的中断是否为BULK-OUT中断;
如果是,则执行步骤307’;
如果否,则执行步骤313’;
步骤307’:CCID设备接收BULK-OUT包,并判断是否正确接收到BULK-OUT数据包;
如果是,执行步骤308’;
如果否,执行相应的操作,执行步骤313’。
步骤308’:CCID设备解析BULK-OUT数据包的内容,并判断是何种类型的CCID命令;
如果是通道扩展命令,则执行步骤310’;
如果不是通道扩展命令,则执行步骤309’。
步骤309’:CCID设备根据CCID命令类型进行相应的处理,并将处理结果组装成符合CCID接口标准的数据包,并将数据包保存至缓冲区;
步骤310’:CCID设备判断通道扩展命令是否是通道切换命令;
如果是通道切换命令,则执行步骤312’;
如果其他通道扩展命令,则执行步骤311’;
本步骤中所涉及到的判断具体过程为:CCID设备中的固件程序拆分接收到的通道切换命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备缓冲区中的位置,得到该命令流数据包中的标识符(命令中的第11、12个字节),该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如:Ox5aa5表示该通道扩展命令是通道切换命令,用于多卡槽CCID设备卡槽切换,当然该标识符也可以是Oxa55a等,取决于生产厂家的定义。
步骤311’:执行其他通道扩展命令相应的操作,执行步骤313’;
例如,该通道扩展命令是用于对传输通道上的数据进行加解密操作、读flash或写flash操作等,则CCID设备执行相应的操作即可。具体的命令例如:
6B 05 00 00 00 00 00 00 00 00 6066 84 00 08
表示对CCID设备进行flash读操作,第11、12位字节6066是自定义的,表示读flash
6B 05 00 00 00 00 00 00 00 00 6660 84 00 08
表示对CCID设备进行flash写操作,第11、12为字节6660是自定义的,表示写flash
步骤312’:CCID设备中的固件程序对接收到的通道切换命令进行解析,得到该条命令对应的卡槽,通过卡槽切换电路激活命令中指定的卡槽,执行步骤313’;
其中,CCID设备中的固件程序拆分接收到的通道切换命令的包头,并通过计算该命令包头中的数据长度标志,获知数据包的长度及其在CCID设备收发缓冲中的位置,得到该命令流数据包中的标识符,该标识符是CCID可以是生产厂家自己定制的,可以通过该标识符获知该通道切换命令的具体用途。如果该标识符表示该通道切换命令是用于卡槽切换的,通过查看该命令的第13个字节,可以得到本条命令所要激活的卡槽序号,然后通过CCID设备的电路控制程序单元将卡槽序号所对应的卡槽激活。
具体在本实施例中,以使用的是微软的CCID协议的读卡器驱动为例,符合CCID标准的通道切换命令中的Slot字段(第6个字节)是固定的00。
假设CCID设备接收到的通道切换命令具体为:
6B 04 00 00 00 00 00 00 00 00 5a a5 00 ff
该通道切换命令表示1号卡槽的随机数指令,该条指令的第13个字节00表示1号卡槽;
6B 04 00 00 00 00 00 00 00 00 5a a5 01 ff
该通道切换命令表示2号卡槽的随机数指令,该条指令的第13个字节01表示2号卡槽。
具体的,CCID设备通过电路控制程序单元将卡槽序号所对应的卡槽激活,具体实现过程可以如下:
一种优选的方式为,CCID设备的卡槽切换电路包括CPU、一个CPU接口、多路选择开关和电路控制程序单元;多路选择开关分别与CCID设备中的各个卡槽相连接;当CCID设备分析得到卡槽的序号后,电路控制程序单元控制多路选择开关将相应的卡槽之间的电路进行连通。
另一种优选的方式,CCID设备卡槽切换电路包括CPU、多个CPU接口和电路控制程序单元;多个CPU接口分别与CCID设备中的各个卡槽相连接,当CCID设备分析得到卡槽的编号后,电路控制程序单元将CPU接口与相应的卡槽之间的电路进行连通。
步骤313’:中断返回。
对于本实施例需要说明的是,当USB中断和插拔卡事件中断采用不同的中断入口时,步骤305至步骤314还可以使用如下步骤代替:
步骤305”:当接收到的中断为插拔卡事件中断时,CCID进入插拔卡事件中断服务;
步骤306”:CCID设备将智能卡插入或拔出事件信息组装成符合CCID接口标准的数据包返回给主机;
步骤307”:中断返回。
本发明实施例提供了一种实现多卡槽访问的方法,实现微软windows下的读卡器驱动能够支持多卡槽访问,并且还支持linux下的读卡器驱动的多卡槽访问。
实施例4
本发明实施例提供了一种多卡槽的CCID设备,该设备的具体工作方法可以参见实施例1至3中的具体描述,此处不做详述。参见图4,该设备包括:
接口模块401,分别与主机和主控模块402相连接,用于实现主机与主控模块402之间进行信息交互,本实施例中接口模块401具体可以是USB接口模块;
主控模块402,分别与接口模块401和判断模块403相连接,用于控制接口模块401接收主机下发的命令流,控制判断模块403接收通过卡槽切换电路模块404上传的智能卡发送的应答,控制判断模块403发送命令流中的数据包经过卡槽切换电路模块404到智能卡,控制接口模块401发送符合CCID标准的应答数据包到主机;
判断模块403,分别与主控模块403和卡槽切换电路模块404相连接,用于判断CCID设备中是否有智能卡插拔事件信息,并将智能卡插拔事件信息通过主控模块402返回给主机,
卡槽切换电路模块404,分别与判断模块403和卡槽相连接,用于接收主控模块402发送的命令流,如果接收到主控模块402发送的通道切换命令,根据卡槽序列号激活相应的卡槽,如果接收到主控模块402发送的其他命令,则将所述命令发送给智能卡,并将智能卡的应答发送给判断模块403。
其中,卡槽切换电路模块404与卡槽1、卡槽2、……、卡槽n相连接,而卡槽1、卡槽2、……、卡槽n可以分别与智能卡1、智能卡2、……、智能卡n相连接。
例如,卡槽切换电路模块404分别与多卡槽CCID设备中的卡槽1、卡槽2、卡槽3相连接,当主控模块402获得通道切换命令中所要访问的卡槽序列号时,卡槽切换电路模块404将卡槽序列号对应的卡槽切换连通,进行激活,例如,当主控模块402获知通道切换命令的卡槽序列号是“Ox00”时,卡槽切换电路模块404则将与其相连接的卡槽1激活,当主控模块402获知通道切换命令的卡槽序列号是“Ox02”时,卡槽切换电路模块404则将与其相连接的卡槽3激活等。
其中,接口模块401还具体包括:描述符设置单元和端点设置单元;
描述符设置单元,用于设置符合CCID标准中规定的描述符及其对应的值,本实施例中具体包括设备类型描述符及卡槽描述符;
本实施例中,CCID设备通过设备类型描述符向主机声明自身是CCID设备,通过卡槽描述符向主机声明自身支持的卡槽数;
端点设置单元,用于将至少一对用来实现应答和命令管道的IN/OUT端点设置为BULK-IN和BULK-OUT端点,将至少一个用来实现事件通知管道的IN端点声明为中断端点。
其中,主控模块402还具体包括:接收单元、解析单元、拆分单元、计算单元、应答组成单元、第一判断单元、第二判断单元、第一处理单元、第二处理单元、发送单元;
接收单元,用于接收主机通过接口模块401发送的命令流,及接收智能卡返回的应答;
解析单元,用于解析接收到的命令流的含义;
拆分单元,用于拆分解析单元解析出来的命令流的包头中的第一个字节,得到该命令流的命令类型;其中,第一个字节为6B时,表示通道扩展命令;
计算单元,用于根据接收到的命令流中的数据长度标志,确定命令流中的数据包长度和其在CCID设备收发缓冲中的位置;
应答组成单元,用于将应答组成符合CCID标准的应答数据包;
第一判断单元,用于根据接收模块接收到的BULK-OUT数据包判断主机下发的CCID命令的类型;
第二判断单元,用于当第一判断单元的判断结果为CCID命令类型是通道扩展命令时,判断通道扩展命令是否是通道切换命令;
第一处理单元,用于如果第一判断单元的判断结果为CCID命令的类型不是通道扩展命令,根据CCID命令类型进行相应的处理。
第二处理单元,用于如果第二判断单元的判断结果为通道扩展命令不是通道切换命令时,根据通道扩展命令的命令类型进行相应的处理;
发送单元,用于发送主机下发的命令流给智能卡,及发送智能卡返回的应答给主机;
其中,第二判断单元还具体包括:
拆分子单元,用于拆分通道切换命令的包头;
第一获得子单元,用于通过计算通道切换命令包头中的数据长度标志,获知数据包的长度及其在CCID设备收发缓冲中的位置,得到通道切换命令数据包中的标识符,标识符用于标识通道切换命令的具体用途;
第二获得子单元,用于如果第一获得单元获得的标识符表示该通道切换命令是用于卡槽切换的,查看通道切换命令的第13个字节,得到本条通道切换命令所要访问的卡槽序号。
本发明实施例提供了一种实现多卡槽防CCID设备,实现微软windows下的读卡器驱动能够支持多卡槽访问,并且还支持linux下的读卡器驱动的多卡槽访问。
以上仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (12)
1.一种实现多卡槽访问的方法,其特征在于,所述方法包括:
多卡槽的CCID设备与主机建立连接,将至少一对用来实现应答管道和命令管道的IN/OUT端点声明为BULK-IN和BULK-OUT端点,将至少一个用来实现事件通知管道的IN端点声明为中断端点,并向所述主机声明其自身是符合CCID接口标准的设备以及自身支持的卡槽数;
主机对所述多卡槽的CCID设备进行访问;
所述多卡槽的CCID设备接收BULK-OUT数据包,并根据所述BULK-OUT数据包判断所述主机下发的CCID命令的类型;
当所述CCID命令类型是通道扩展命令时,则判断所述通道扩展命令是否是通道切换命令;如果所述通道扩展命令是通道切换命令时,则解析所述通道切换命令,并激活所述主机欲访问的相应卡槽;如果所述通道扩展命令不是通道切换命令时,则根据所述通道扩展命令的命令类型进行相应的处理;
当所述CCID命令的类型不是通道扩展命令,则根据所述CCID命令类型进行相应的处理。
2.如权利要求1所述的实现多卡槽访问的方法,其特征在于,向所述主机声明其自身支持的卡槽数,具体包括:
所述CCID设备向所述主机发送卡槽描述符,所述卡槽描述符中使用一个字节表示CCID设备自身支持的卡槽数。
3.如权利要求1所述的实现多卡槽访问的方法,其特征在于,根据所述BULK-OUT数据包判断所述主机下发的CCID命令的类型,具体包括:
所述CCID设备解析符合CCID标准的命令流,拆分所述命令流的包头中的第一个字节,得到该命令流的命令类型;
其中,当所述第一个字节为6B时,表示通道扩展命令。
4.如权利要求1所述的实现多卡槽访问的方法,其特征在于,判断所述通道扩展命令是否是通道切换命令,具体包括:
所述CCID设备解析所述通道扩展命令,根据所述通道扩展命令中的标识符字段得到该命令的的命令类型;
其中,所述标识符是自定义标识符。
5.如权利要求1所述的实现多卡槽访问的方法,其特征在于,解析所述通道切换命令,并激活所述主机欲访问的相应卡槽,具体包括:
所述CCID设备中的固件程序拆分所述通道切换命令的包头;
通过计算所述通道切换命令包头中的数据长度标志,获知数据包的长度及所述数据包在所述CCID设备收发缓冲中的位置,得到所述通道切换命令数据包中的标识符,所述标识符用于标识所述通道切换命令的具体用途;
如果所述标识符表示该通道切换命令是用于卡槽切换的,则查看所述通道切换命令的第13个字节,得到本条通道切换命令所要访问的卡槽序号;
通过所述CCID设备的电路控制程序单元将所述卡槽序号所对应的卡槽激活。
6.如权利要求1所述的实现多卡槽访问的方法,其特征在于,所述方法还包括:判断被激活卡槽中是否有智能卡插拔事件信息;
如果有,则向所述主机返回符合CCID标准的智能卡插拔事件信息;
如果没有,则继续执行所述多卡槽的CCID设备接收BULK-OUT数据包的步骤。
7.如权利要求6所述的实现多卡槽访问的方法,其特征在于,所述判断是否有智能卡插拔事件信息,具体包括:
判断所述CCID设备的收发缓冲中是否有所述智能卡插拔事件信息,所述智能卡插拔事件信息由所述CCID设备在接收到有智能卡插入或拔出的中断信号时写入到所述收发缓冲中。
8.一种多卡槽的CCID设备,其特征在于,所述设备包括:接口模块、主控模块、判断模块和卡槽切换电路模块;
所述接口模块,分别与主机和所述主控模块相连接,用于实现所述主机与所述主控模块之间的信息交互;
所述主控模块,分别与所述接口模块和所述判断模块相连接,用于控制所述接口模块接收主机下发的命令流,控制所述判断模块接收智能卡发送的应答,控制所述判断模块发送命令流中的数据包到所述智能卡,控制所述接口模块发送符合CCID标准的应答数据包到所述主机;
所述判断模块,分别与所述主控模块和所述卡槽切换电路模块相连接,用于判断CCID设备中是否有智能卡插拔事件信息,并将所述智能卡插拔事件信息通过所述主控模块返回给所述主机,
所述卡槽切换电路模块,分别与所述判断模块和卡槽相连接,用于接收所述主控模块发送的命令流;如果接收到所述主控模块发送的通道切换命令,则根据卡槽序列号激活相应的卡槽;如果接收到所述主控模块发送的其他命令,则将所述其他命令发送给所述智能卡,并将所述智能卡的应答数据包发送给所述判断模块。
9.如权利要求8所述的多卡槽的CCID设备,其特征在于,所述接口模块具体包括:描述符设置单元和端点设置单元;
所述描述符设置单元,用于设置符合CCID标准中规定的设备类型描述符及卡槽描述符;所述CCID设备通过所述设备类型描述符向主机声明自身是CCID设备,通过所述卡槽描述符向主机声明自身支持的卡槽数;
所述端点设置单元,用于将至少一对用来实现应答管道和命令管道的IN/OUT端点设置为BULK-IN和BULK-OUT端点,将至少一个用来实现事件通知管道的IN端点声明为中断端点。
10.如权利要求8所述的多卡槽的CCID设备,其特征在于,所述主控模块具体包括:
接收单元,用于接收所述主机通过所述接口模块发送的命令流,及接收智能卡通过所述判断模块返回的应答;
解析单元,用于解析所述接收单元接收到的所述命令流;
拆分单元,用于拆分所述解析单元解析出来的命令流的包头中的第一个字节,得到该命令流的命令类型,其中,当第一个字节为6B时,表示通道扩展命令;
计算单元,用于根据所述接收单元接收到的命令流中的数据长度标志,确定命令流中的数据包长度和所述数据包在所述CCID设备收发缓冲中的位置;
应答组成单元,用于将应答组成符合CCID标准的应答数据包;
第一判断单元,用于根据所述接收模块接收到的BULK-OUT数据包判断主机下发的CCID命令的类型;
第二判断单元,用于当所述第一判断单元的判断结果为通道扩展命令时,判断所述通道扩展命令是否是通道切换命令;
第一处理单元,用于如果所述第一判断单元的判断结果为不是通道扩展命令时,根据所述CCID命令类型进行相应的处理;
第二处理单元,用于如果所述第二判断单元的判断结果为通道扩展命令不是通道切换命令时,根据所述通道扩展命令的命令类型进行相应的处理;
发送单元,用于发送所述主机下发的命令流给所述智能卡,及发送智能卡返回的应答给所述主机。
11.如权利要求10所述的多卡槽的CCID设备,其特征在于,所述第二判断单元具体包括:
拆分子单元,用于拆分通道切换命令的包头;
第一获得子单元,用于通过计算通道切换命令包头中的数据长度标志,获知数据包的长度及所述数据包在CCID设备收发缓冲中的位置,得到通道切换命令数据包中的标识符,所述标识符用于标识通道切换命令的具体用途;
第二获得子单元,用于当所述第一获得单元获得的标识符表示该通道切换命令是用于卡槽切换时,查看通道切换命令的第13个字节,得到本条通道切换命令所要访问的卡槽序号。
12.如权利要求8所述的多卡槽的CCID设备,其特征在于,所述判断模块具体用于:
判断CCID设备的收发缓冲中是否有智能卡插拔事件信息,智能卡插拔事件信息由CCID设备在接收到有智能卡插入或拔出的中断信号时写入到收发缓冲中。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009102438819A CN101719054B (zh) | 2009-12-24 | 2009-12-24 | 一种实现多卡槽访问的方法和装置 |
PCT/CN2010/078052 WO2011076035A1 (zh) | 2009-12-24 | 2010-10-25 | 一种实现多卡槽访问的方法和装置 |
US13/125,156 US8443120B2 (en) | 2009-12-24 | 2010-10-25 | Method for accessing multiple card slots and apparatus for the same |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009102438819A CN101719054B (zh) | 2009-12-24 | 2009-12-24 | 一种实现多卡槽访问的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101719054A true CN101719054A (zh) | 2010-06-02 |
CN101719054B CN101719054B (zh) | 2011-05-18 |
Family
ID=42433634
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009102438819A Active CN101719054B (zh) | 2009-12-24 | 2009-12-24 | 一种实现多卡槽访问的方法和装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US8443120B2 (zh) |
CN (1) | CN101719054B (zh) |
WO (1) | WO2011076035A1 (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011076035A1 (zh) * | 2009-12-24 | 2011-06-30 | 北京飞天诚信科技有限公司 | 一种实现多卡槽访问的方法和装置 |
CN102141968A (zh) * | 2011-03-28 | 2011-08-03 | 北京飞天诚信科技有限公司 | 一种实现多卡槽访问的方法 |
CN102307100A (zh) * | 2011-09-08 | 2012-01-04 | 飞天诚信科技股份有限公司 | 一种数据处理装置及其数据处理方法 |
CN102314405A (zh) * | 2011-06-13 | 2012-01-11 | 上海哈诚电子科技有限公司 | 一种ccid协议处理电路 |
CN102315940A (zh) * | 2011-09-08 | 2012-01-11 | 飞天诚信科技股份有限公司 | 一种数据的传输与处理系统及方法 |
CN102591699A (zh) * | 2011-12-29 | 2012-07-18 | 飞天诚信科技股份有限公司 | 一种转换命令模式的方法及装置 |
CN103516749A (zh) * | 2012-06-21 | 2014-01-15 | 浙江大华技术股份有限公司 | 一种采用多卡发送数据的方法以及装置 |
CN107395398A (zh) * | 2017-06-23 | 2017-11-24 | 联想(北京)有限公司 | 一种控制方法及终端 |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9602557B2 (en) | 2012-10-15 | 2017-03-21 | Wowza Media Systems, LLC | Systems and methods of communication using a message header that includes header flags |
CN103310175B (zh) * | 2013-06-24 | 2016-01-20 | 飞天诚信科技股份有限公司 | 一种基于标准ccid协议的多卡槽读卡器的工作方法 |
CN103544037B (zh) * | 2013-10-29 | 2016-08-17 | 飞天诚信科技股份有限公司 | 一种支持OpenSC的软硬件驱动的实现方法 |
JP2017220022A (ja) * | 2016-06-07 | 2017-12-14 | 富士通株式会社 | 情報処理装置、情報処理装置の制御方法および情報処理装置の制御プログラム |
DE102018124106A1 (de) * | 2018-09-28 | 2020-04-02 | Rockwell Collins Deutschland Gmbh | Datenverarbeitungsvorrichtung mit mehreren Prozessoren und mehreren Schnittstellen |
GB2580159B (en) * | 2018-12-21 | 2021-01-06 | Graphcore Ltd | Scheduling messages |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6945454B2 (en) * | 2003-04-22 | 2005-09-20 | Stmicroelectronics, Inc. | Smart card device used as mass storage device |
US7748636B2 (en) * | 2004-11-16 | 2010-07-06 | Dpd Patent Trust Ltd. | Portable identity card reader system for physical and logical access |
US20060214003A1 (en) | 2005-03-15 | 2006-09-28 | Neil Morrow | Method and apparatus for contactless ICC connectivity |
CN100424664C (zh) * | 2006-11-21 | 2008-10-08 | 北京飞天诚信科技有限公司 | 一种实现ccid设备的方法和装置 |
CN100424665C (zh) * | 2006-12-06 | 2008-10-08 | 北京飞天诚信科技有限公司 | 一种实现ccid设备的方法和装置 |
CN101719054B (zh) * | 2009-12-24 | 2011-05-18 | 北京飞天诚信科技有限公司 | 一种实现多卡槽访问的方法和装置 |
-
2009
- 2009-12-24 CN CN2009102438819A patent/CN101719054B/zh active Active
-
2010
- 2010-10-25 US US13/125,156 patent/US8443120B2/en active Active
- 2010-10-25 WO PCT/CN2010/078052 patent/WO2011076035A1/zh active Application Filing
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011076035A1 (zh) * | 2009-12-24 | 2011-06-30 | 北京飞天诚信科技有限公司 | 一种实现多卡槽访问的方法和装置 |
CN102141968A (zh) * | 2011-03-28 | 2011-08-03 | 北京飞天诚信科技有限公司 | 一种实现多卡槽访问的方法 |
CN102141968B (zh) * | 2011-03-28 | 2013-05-15 | 飞天诚信科技股份有限公司 | 一种实现多卡槽访问的方法 |
CN102314405A (zh) * | 2011-06-13 | 2012-01-11 | 上海哈诚电子科技有限公司 | 一种ccid协议处理电路 |
CN102315940A (zh) * | 2011-09-08 | 2012-01-11 | 飞天诚信科技股份有限公司 | 一种数据的传输与处理系统及方法 |
CN102307100A (zh) * | 2011-09-08 | 2012-01-04 | 飞天诚信科技股份有限公司 | 一种数据处理装置及其数据处理方法 |
CN102307100B (zh) * | 2011-09-08 | 2013-09-18 | 飞天诚信科技股份有限公司 | 一种数据处理装置及其数据处理方法 |
CN102315940B (zh) * | 2011-09-08 | 2013-09-18 | 飞天诚信科技股份有限公司 | 一种数据的传输与处理系统及方法 |
CN102591699A (zh) * | 2011-12-29 | 2012-07-18 | 飞天诚信科技股份有限公司 | 一种转换命令模式的方法及装置 |
CN102591699B (zh) * | 2011-12-29 | 2014-10-29 | 飞天诚信科技股份有限公司 | 一种转换命令模式的方法及装置 |
CN103516749A (zh) * | 2012-06-21 | 2014-01-15 | 浙江大华技术股份有限公司 | 一种采用多卡发送数据的方法以及装置 |
CN107395398A (zh) * | 2017-06-23 | 2017-11-24 | 联想(北京)有限公司 | 一种控制方法及终端 |
CN107395398B (zh) * | 2017-06-23 | 2020-07-24 | 联想(北京)有限公司 | 一种控制方法及终端 |
Also Published As
Publication number | Publication date |
---|---|
WO2011076035A1 (zh) | 2011-06-30 |
CN101719054B (zh) | 2011-05-18 |
US20120278508A1 (en) | 2012-11-01 |
US8443120B2 (en) | 2013-05-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101719054B (zh) | 一种实现多卡槽访问的方法和装置 | |
EP2050005B1 (en) | A multi-function peripheral device, corresponding method and electronic system having a peripheral and a host communicating via a single interface | |
EP1643372B1 (en) | USB device with secondary USB on-the-go function | |
CN1240019C (zh) | 将usb设备连接至usb总线的单连接点的装置和方法 | |
CN101957807B (zh) | USB设备识别主机Windows操作系统版本类型的方法 | |
US9411990B2 (en) | Working method of a multi-slot card reader based on the standard CCID protocol | |
EP1457901A2 (en) | System and method for simulating USB smart cards connected to USB host | |
CN103414497B (zh) | 为电子设备之间通信借助转发的控制方法和相应的设备 | |
CN100468440C (zh) | 一种主机与智能卡信息交互的方法和装置 | |
CN104517146A (zh) | Nfc标签、通信方法和系统 | |
CN100414556C (zh) | 一种主机与智能卡信息交互的方法和装置 | |
CN102968325A (zh) | 一种usb设备及其自动初始化的方法和装置 | |
CN101401113B (zh) | 支持大尺寸存储器的ic芯片及其方法 | |
CN1853149A (zh) | 用于电子处理器的多功能便携设备 | |
CN102549605B (zh) | 用于互连智能卡芯片的电子电路 | |
US7185119B2 (en) | Method and apparatus for checking and analyzing the state of peripherals wherein state information is converted into a pattern of identification information | |
CN102144238A (zh) | Ic芯片、信息处理装置、软件模块控制方法、信息处理系统、信息处理方法以及程序 | |
CN100555938C (zh) | 一种智能密钥设备及其与主机信息交互的方法 | |
CN115378755B (zh) | 总线系统 | |
CN101882209A (zh) | 一种集成条码解码芯片的片上系统 | |
CN107644001B (zh) | 外围接口芯片及其数据传送方法 | |
CN201725347U (zh) | 一种集成条码解码芯片的片上系统 | |
US20040064562A1 (en) | Interface or communicating device for network facility | |
CN101908132A (zh) | 条码解码方法及装置 | |
JP2006092416A (ja) | リアルタイムコマンドの作成・処理方法、および、icカードおよび、その組み込み端末 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C56 | Change in the name or address of the patentee |
Owner name: FEITIAN CHENGXIN TECHNOLOGY CO., LTD. Free format text: FORMER NAME: BEIJING FEITIAN CHENGXIN SCIENCE + TECHNOLOGY CO. LTD. |
|
CP03 | Change of name, title or address |
Address after: 100085 Beijing city Haidian District Xueqing Road No. 9 Ebizal building B block 17 layer Patentee after: Feitian Technologies Co., Ltd. Address before: 100191, Haidian District, Xueyuan Road, Beijing No. 40 research, 7A building, 5 floor Patentee before: Beijing Feitian Chengxin Science & Technology Co., Ltd. |