USB CCID理解

名词解释

  • CCID: Integrated Circuit(s) Cards Interface Device
  • ICC: Integrated Circuit(s) Cards

这两天在调CCID的代码,厂家给的Demo,卡片的功能还没有完全调通,但是Demo可以上电成功,并且在USB设备上电枚举之后,自动发送了一个中断,如下所示。

然后就特别的困惑,这个50 03的中断是哪里来的?虽然知道是读卡器告诉主机,有卡片动作,但是我明明没有插卡和拔卡的动作呀?想了好久,今天找资料,在网上看到如下:

概述

当一个CCID插入USB host时,它可以有或者没有一个插入的ICC。

CCID模型假设一个ICC被或者可以被插入到设备。这就是"slot change"中断消息的目的。

(这是我今天看到的最为感动的一句话,对呀,CCID规范中,还有两个中断信息,怎么就没想到???)

CCID功能特性

通信管道

控制管道

控制管道消息用来控制一个USB设备。这些消息包括标准请求,例如GET_DESCRIPTOR和SET_CONFIGURATION。命令经由默认管道发送,报告信息也经由默认管道返回给主机。如果产生了一个错误,它会产生一个标准的USB错误状态。

中断管道

CCID模型在中断管道处理异步事件。ICC在线,ICC移除或者硬件错误比如电流太大,这些经由这个管道送出。

中断管道对于一个支持ICC插入/移除的CCID是强制的。对于一个只插入没有移除的ICC是可选的。

块进,块出管道

CCID命令经由BULK-OUT端点发出。每个发送给CCID的命令都有一个相应的响应。一些命令也有过程响应。这些响应从BULK-IN端点发送。

所有发送给指定CCID槽位的命令都必须同步发送。一个指定的槽位同时只能接受一条命令。如果一个槽位准备好接受一个新命令那么就认为它是空闲的。

协议和参数选择

CCID在与主机的底层交互的dwFeatures字段声明TPDU、APDU(短或扩展)或者字符。

TPDU层交互

对于PPS交互的TPDU格式如下:

TPDU命令:FF PPS0 PPS1 PPS2 PPS3 PCK, with PPS1, PPS2, PPS3 optional [ISO/IEC7816-3 §7]

TPDU应答:FF PPS0_R PPS1_R PPS2_R PPS3_R PCK_R, with PPS1_R, PPS2_R, PPS3_R optional [ISO/IEC7816-3 §7.4)

APDU层交互

APDU命令和应答定义在ISO 7816-4。

定义了两种APDU层,短APDU和扩展APDU,这些定义在ISO/IEC 7816-4 § 5.3.2。

字符层交互

当TPDU、短APDU或者扩展APDU都没选择时,字符层交互被选中。

对于主机和CCID之间的字符层交互,CCID支持与ICC的异步字符交互。

挂起行为

当从一个挂起的USB恢复时,主机/驱动假设所有的ICC都是不活动的(掉电)。

当USB总线挂起时,CCIDs不要求掉电插入的ICCs,但是可以这样做。然而,当USB总线恢复后,CCIDs必须响应给主机好像所有的已经插入的ICCs都掉电并被新插入。

在恢复后,CCID会做下面两件事(没有特定是顺序):

  • 发送RDR_to_PC_NotifySlotChange消息告知驱动那个槽位有新插入的卡
  • CCID会重新恢复ICCs为有效如果这个CCID有“自动启动当插入”特性或者收到来自启动的PC_to_RDR_IccPowerOn消息。注意:当重新恢复时,所有的槽位参数立即恢复为默认。

标准USB表述

设备

详见Universal Serial Bus Specification中第九章“USB Device Framework”。

配置

详见Universal Serial Bus Specification中第九章“USB Device Framework”。

界面

偏移 字段 大小 描述
0 bLength 1 09h 这个描述的字节大小
1 bDescriptorType 1 04h INTERFACE描述类型
2 bInterfaceNumber 1 Number 这个界面的数量
3 bAlternateSetting 1 Number  
4 bNumEndpoints 1 02h
03h
这个界面使用的端点数量(除了端点0)
对于CCID
02h 使用bulk-IN和bulk-OUT
03h 使用bulk-IN、bulk-OUT和interrupt-IN
5 bInterfaceClass 1 0Bh 智能卡设备类
6 bInterfaceSubClass 1 00h 子类码
7 bInterfaceProtocol 1 00h 协议码
对于CCID
00h
8 iInterface 1 Index 这个界面的索引

智能卡设备类

描述

智能卡设备类描述表定义了一些设备属性或者功能

偏移 字段 大小 描述
0 bLength 1 36h 这个描述的字节大小
1 bDescriptorType 1 21h 功能描述类型
2 bcdCCID 2 0110h CCID
以二进制编码的十进制指定版本号码
例:2.10是0210h
4 bMaxSlotIndex 1   设备上最高可用槽位的序号。所有槽位起始于00h
例:0Fh为设备上有从00h到0Fh共16个槽位
5 bVoltageSupport 1   表示CCID可以支持的槽位电压。
这是一个按位或运算
01h – 5.0V
02h – 3.0V
04h – 1.8V
6 dwProtocols 4 RRRR
PPPP
RRRR – 高字 – 预留 = 0000h
PPPP – 低字 – 支持的协议类型
0001h = T0
0002h = T1
10 dwDefaultClock 4   默认ICC时钟频率,单位KHz。
例:3.58MHz为3580(00000DFCh)
14 dwMaximumClock 4   ICC支持的最大时钟频率,单位KHz。
18 bNumClockSupported 1   CCID支持的时钟频率个数。如果值为00h,时钟频率和dwDefaultClock定义的一样和dwMaximumClock定义的最大频率。
19 dwDataRate 4   默认ICC I/O波特率。
例:9600编码为9600(00002580h)。
23 dwMaxDataRate 4   ICC I/O支持的最大波特率。
例:115.2Kbps编码为115200(0001C200h)。
27 bNumDataRatesSupported 1   CCID支持的波特率个数。
28 dwMaxIFSD 4   CCID T1的最大IFSD。
32 dwSynchProtocols 4 RRRR
PPPP
=
00000000h
RRRR- 高字 – 默认为0000h
PPPP – 低字 – 支持的协议类型
0001h – 支持两线协议
0002h – 支持三线协议
0004h – 支持I2C协议
注: CCID不支持这些协议所以PPPP = 0000h。
36 dwMechanical 4 00000000h
00000008h
这个值是下面值的按位与:
00000000h – 没有直到那个的特性
00000001h – 卡接受机制
00000002h – 卡移除机制
00000004h – 卡捕获机制
00000008h – 卡加锁/解锁机制
40 dwFeatures 4 xxxxxxxxh 这个值指明CCID有什么智能的特性。这个值为以下值的按位与:
  • 00000000h – 没有指定的特性
  • 00000002h – 根据ATR数据自动配置参数
  • 00000004h – 插入时自动使能ICC
  • 00000008h – 自动选择ICC电压
  • 00000010h – 自动根据主机提供的或自测试的有效参数改变ICC始终频率
  • 00000020h – 自动根据主机提供的或自测试的有效参数改变波特率
  • 00000040h –
  • 00000080h –
  • 00000100h –
  • 00000200h –
  • 00000400h –
  • 00000800h –
  • 00001000h –
  • 00002000h –
  • 00004000h –
  • 00008000h –
44 dwMaxCCIDMessageLength 4    
48 bClassGetResponse 1    
49 bClassEnvelope 1    
50 wLcdLayout 2 XXYYh  
52 bPINSupport 1 00h-03h 指明CCID支持PIN什么特性。这个值是下面值的按位与:
01h 支持验证PIN
02h 支持修改PIN
53 bMaxCCIDBusySlots 1 01h-FFh 最多可以同时忙的槽位的个数

CCID端点

除了一个默认(控制)端点CCID至少支持2个端点,一个是bulk-out,一个是bulk-in。报告ICC插入或移除的CCID也必须支持一个interrupt端点。

端点 方向 选项 定义
Bulk OUT OUT 必须 CCID命令管道
Bulk IN IN 必须 CCID应答管道
Interrupt IN 可选 CCID事件通知管道

Bulk-OUT端点

Bulk Out端点用来发送命令和传送从主机到设备的数据

偏移 字段 大小 描述
0 bLength 1 07h 这个描述的字节大小
1 bDestriptorType 1 05h 端点描述类型
2 bEndpointAddress 1 01-0Fh 这个USB设备的端点地址。
这个地址为1到15
Bit 0..3 端点号
Bit 4..6 预留,必须为0
Bit 7      0 = Out
3 bmAttributes 1 02h 这是一个Bulk端点
4 wMaxPacketSize 2 0xyzh 最大传输数据大小可以为8,16,32,64或者512字节
6 bInterval 1 Number 对全速:
忽略
对高速:
这个值为0到255

Bulk-IN端点

Bulk In端点用来发送响应和发送从设备到主机应答接受命令管道的回复数据。

偏移 字段 大小 描述
0 bLength 1 07h 这个描述的字节大小
1 bDestriptorType 1 05h 端点描述类型
2 bEndpointAddress 1 81-8Fh 这个USB设备的端点地址。
这个地址为1到15
Bit 0..3 端点号
Bit 4..6 预留,必须为0
Bit 7      1 = In
3 bmAttributes 1 02h 这是一个Bulk端点
4 wMaxPacketSize 2 0xyzh 最大传输数据大小可以为8,16,32,64或者512字节
6 bInterval 1 Number 对全速:
忽略
对高速:
这个值为0到255

Interrupt-IN端点

中断端点对于一个支持ICC插入/移除的CCID是必须的。对于一个经常插入ICC而不移除的CCID是可选的。如果有一个Interrupt-In端点,那么需要RDR_to_PC_NotifySlotChange消息并且

偏移 字段 大小 描述
0 bLength 1 07h 这个描述的字节大小
1 bDestriptorType 1 05h 端点描述类型
2 bEndpointAddress 1 81-8Fh 这个USB设备的端点地址。
这个地址为1到15
Bit 0..3 端点号
Bit 4..6 预留,必须为0
Bit 7      1 = In
3 bmAttributes 1 03h 这是一个Interrupt端点
4 wMaxPacketSize 2 0xyzh 最大传输数据大小可以为8,16,32,64或者512字节
6 bInterval 1 xyh 对全速: 
查询端点的捡个,以毫秒表示。必须为1到255。建议255。
对高速:
这个值为0到16

你可能感兴趣的:(usb,智能卡,Icc)