然后就特别的困惑,这个50 03的中断是哪里来的?虽然知道是读卡器告诉主机,有卡片动作,但是我明明没有插卡和拔卡的动作呀?想了好久,今天找资料,在网上看到如下:
当一个CCID插入USB host时,它可以有或者没有一个插入的ICC。
CCID模型假设一个ICC被或者可以被插入到设备。这就是"slot change"中断消息的目的。
(这是我今天看到的最为感动的一句话,对呀,CCID规范中,还有两个中断信息,怎么就没想到???)
控制管道消息用来控制一个USB设备。这些消息包括标准请求,例如GET_DESCRIPTOR和SET_CONFIGURATION。命令经由默认管道发送,报告信息也经由默认管道返回给主机。如果产生了一个错误,它会产生一个标准的USB错误状态。
CCID模型在中断管道处理异步事件。ICC在线,ICC移除或者硬件错误比如电流太大,这些经由这个管道送出。
中断管道对于一个支持ICC插入/移除的CCID是强制的。对于一个只插入没有移除的ICC是可选的。
CCID命令经由BULK-OUT端点发出。每个发送给CCID的命令都有一个相应的响应。一些命令也有过程响应。这些响应从BULK-IN端点发送。
所有发送给指定CCID槽位的命令都必须同步发送。一个指定的槽位同时只能接受一条命令。如果一个槽位准备好接受一个新命令那么就认为它是空闲的。
CCID在与主机的底层交互的dwFeatures字段声明TPDU、APDU(短或扩展)或者字符。
对于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命令和应答定义在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会做下面两件事(没有特定是顺序):
详见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有什么智能的特性。这个值为以下值的按位与:
|
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至少支持2个端点,一个是bulk-out,一个是bulk-in。报告ICC插入或移除的CCID也必须支持一个interrupt端点。
端点 | 方向 | 选项 | 定义 |
---|---|---|---|
Bulk OUT | OUT | 必须 | CCID命令管道 |
Bulk IN | IN | 必须 | CCID应答管道 |
Interrupt | IN | 可选 | CCID事件通知管道 |
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端点用来发送响应和发送从设备到主机应答接受命令管道的回复数据。
偏移 | 字段 | 大小 | 值 | 描述 |
---|---|---|---|---|
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 |
中断端点对于一个支持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 |