CCID协议学习资料.docx
《CCID协议学习资料.docx》由会员分享,可在线阅读,更多相关《CCID协议学习资料.docx(13页珍藏版)》请在冰豆网上搜索。
CCID协议学习资料
CCID协议学习资料(总7页)
名词解释
CCID:
IntegratedCircuit(s)CardsInterfaceDevice
ICC:
IntegratedCircuit(s)Cards
这两天在调CCID的代码,厂家给的Demo,卡片的功能还没有完全调通,但是Demo可以上电成功,并且在USB设备上电枚举之后,自动发送了一个中断,如下所示。
然后就特别的困惑,这个5003的中断是哪里来的虽然知道是读卡器告诉主机,有卡片动作,但是我明明没有插卡和拔卡的动作呀想了好久,今天找资料,在网上看到如下:
概述
当一个CCID插入USBhost时,它可以有或者没有一个插入的ICC。
CCID模型假设一个ICC被或者可以被插入到设备。
这就是"slotchange"中断消息的目的。
(这是我今天看到的最为感动的一句话,对呀,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命令:
FFPPS0PPS1PPS2PPS3PCK,withPPS1,PPS2,PPS3optional[ISO/IEC7816-3§7]
TPDU应答:
FFPPS0_RPPS1_RPPS2_RPPS3_RPCK_R,withPPS1_R,PPS2_R,PPS3_Roptional[ISO/IEC7816-3§
APDU层交互
APDU命令和应答定义在ISO7816-4。
定义了两种APDU层,短APDU和扩展APDU,这些定义在ISO/IEC7816-4§。
字符层交互
当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表述
设备
详见UniversalSerialBusSpecification中第九章“USBDeviceFramework”。
配置
详见UniversalSerialBusSpecification中第九章“USBDeviceFramework”。
界面
偏移
字段
大小
值
描述
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 以二进制编码的十进制指定版本号码 例:
是0210h
4
bMaxSlotIndex
1
设备上最高可用槽位的序号。
所有槽位起始于00h 例:
0Fh为设备上有从00h到0Fh共16个槽位
5
bVoltageSupport
1
表示CCID可以支持的槽位电压。
这是一个按位或运算 01h– 02h– 04h–
6
dwProtocols
4
RRRR PPPP
RRRR–高字–预留=0000h PPPP–低字–支持的协议类型 0001h=T0 0002h=T1
10
dwDefaultClock
4
默认ICC时钟频率,单位KHz。
例:
为3580(00000DFCh)
14
dwMaximumClock
4
ICC支持的最大时钟频率,单位KHz。
18
bNumClockSupported
1
CCID支持的时钟频率个数。
如果值为00h,时钟频率和dwDefaultClock定义的一样和dwMaximumClock定义的最大频率。
19
dwDataRate
4
默认ICCI/O波特率。
例:
9600编码为9600(00002580h)。
23
dwMaxDataRate
4
ICCI/O支持的最大波特率。
例:
编码为115200(0001C200h)。
27
bNumDataRatesSupported
1
CCID支持的波特率个数。
28
dwMaxIFSD
4
CCIDT1的最大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端点。
端点
方向
选项
定义
BulkOUT
OUT
必须
CCID命令管道
BulkIN
IN
必须
CCID应答管道
Interrupt
IN
可选
CCID事件通知管道
Bulk-OUT端点
BulkOut端点用来发送命令和传送从主机到设备的数据
偏移
字段
大小
值
描述
0
bLength
1
07h
这个描述的字节大小
1
bDestriptorType
1
05h
端点描述类型
2
bEndpointAddress
1
01-0Fh
这个USB设备的端点地址。
这个地址为1到15 Bit0..3端点号 Bit4..6预留,必须为0 Bit7 0=Out
3
bmAttributes
1
02h
这是一个Bulk端点
4
wMaxPacketSize
2
0xyzh
最大传输数据大小可以为8,16,32,64或者512字节
6
bInterval
1
Number
对全速:
忽略 对高速:
这个值为0到255
Bulk-IN端点
BulkIn端点用来发送响应和发送从设备到主机应答接受命令管道的回复数据。
偏移
字段
大小
值
描述
0
bLength
1
07h
这个描述的字节大小
1
bDestriptorType
1
05h
端点描述类型
2
bEndpointAddress
1
81-8Fh
这个USB设备的端点地址。
这个地址为1到15 Bit0..3端点号 Bit4..6预留,必须为0 Bit7 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 Bit0..3端点号 Bit4..6预留,必须为0 Bit7 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