USB CCID理解

本文详细介绍了USB CCID协议的基本概念、功能特性和工作原理。内容涵盖通信管道、中断管道、块进块出管道的使用场景及作用,以及设备配置描述符的各个字段解释。此外还探讨了CCID在USB总线挂起恢复后的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出处:http://www.xuebuyuan.com/831434.html


USB CCID理解

2013年08月10日  ⁄ 综合 ⁄ 共 4495字 ⁄ 字号  小 中 大  ⁄ 评论关闭
文章目录

名词解释

  • 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规范中,还有两个中断信息,怎么就没想到???)CCID00

CCID功能特性

通信管道
控制管道

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

CCID01

中断管道

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

CCID02

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

块进,块出管道

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

CCID03
所有发送给指定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”。

界面
偏移字段大小描述
0bLength109h这个描述的字节大小
1bDescriptorType104hINTERFACE描述类型
2bInterfaceNumber1Number这个界面的数量
3bAlternateSetting1Number 
4bNumEndpoints102h 
03h
这个界面使用的端点数量(除了端点0) 
对于CCID 
02h 使用bulk-IN和bulk-OUT 
03h 使用bulk-IN、bulk-OUT和interrupt-IN
5bInterfaceClass10Bh智能卡设备类
6bInterfaceSubClass100h子类码
7bInterfaceProtocol100h协议码 
对于CCID 
00h
8iInterface1Index这个界面的索引

智能卡设备类

描述

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

偏移字段大小描述
0bLength136h这个描述的字节大小
1bDescriptorType121h功能描述类型
2bcdCCID20110hCCID 
以二进制编码的十进制指定版本号码 
例:2.10是0210h
4bMaxSlotIndex1 设备上最高可用槽位的序号。所有槽位起始于00h 
例:0Fh为设备上有从00h到0Fh共16个槽位
5bVoltageSupport1 表示CCID可以支持的槽位电压。 
这是一个按位或运算 
01h – 5.0V 
02h – 3.0V 
04h – 1.8V
6dwProtocols4RRRR 
PPPP
RRRR – 高字 – 预留 = 0000h 
PPPP – 低字 – 支持的协议类型 
0001h = T0 
0002h = T1
10dwDefaultClock4 默认ICC时钟频率,单位KHz。 
例:3.58MHz为3580(00000DFCh)
14dwMaximumClock4 ICC支持的最大时钟频率,单位KHz。
18bNumClockSupported1 CCID支持的时钟频率个数。如果值为00h,时钟频率和dwDefaultClock定义的一样和dwMaximumClock定义的最大频率。
19dwDataRate4 默认ICC I/O波特率。 
例:9600编码为9600(00002580h)。
23dwMaxDataRate4 ICC I/O支持的最大波特率。 
例:115.2Kbps编码为115200(0001C200h)。
27bNumDataRatesSupported1 CCID支持的波特率个数。
28dwMaxIFSD4 CCID T1的最大IFSD。
32dwSynchProtocols4RRRR 
PPPP 

00000000h
RRRR- 高字 – 默认为0000h 
PPPP – 低字 – 支持的协议类型 
0001h – 支持两线协议 
0002h – 支持三线协议 
0004h – 支持I2C协议 
注: CCID不支持这些协议所以PPPP = 0000h。
36dwMechanical400000000h 
00000008h
这个值是下面值的按位与: 
00000000h – 没有直到那个的特性 
00000001h – 卡接受机制 
00000002h – 卡移除机制 
00000004h – 卡捕获机制 
00000008h – 卡加锁/解锁机制
40dwFeatures4xxxxxxxxh这个值指明CCID有什么智能的特性。这个值为以下值的按位与:

  • 00000000h – 没有指定的特性
  • 00000002h – 根据ATR数据自动配置参数
  • 00000004h – 插入时自动使能ICC
  • 00000008h – 自动选择ICC电压
  • 00000010h – 自动根据主机提供的或自测试的有效参数改变ICC始终频率
  • 00000020h – 自动根据主机提供的或自测试的有效参数改变波特率
  • 00000040h –
  • 00000080h –
  • 00000100h –
  • 00000200h –
  • 00000400h –
  • 00000800h –
  • 00001000h –
  • 00002000h –
  • 00004000h –
  • 00008000h –
44dwMaxCCIDMessageLength4  
48bClassGetResponse1  
49bClassEnvelope1  
50wLcdLayout2XXYYh 
52bPINSupport100h-03h指明CCID支持PIN什么特性。这个值是下面值的按位与: 
01h 支持验证PIN 
02h 支持修改PIN
53bMaxCCIDBusySlots101h-FFh最多可以同时忙的槽位的个数
CCID端点

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

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

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

偏移字段大小描述
0bLength107h这个描述的字节大小
1bDestriptorType105h端点描述类型
2bEndpointAddress101-0Fh这个USB设备的端点地址。 
这个地址为1到15 
Bit 0..3 端点号 
Bit 4..6 预留,必须为0 
Bit 7      0 = Out
3bmAttributes102h这是一个Bulk端点
4wMaxPacketSize20xyzh最大传输数据大小可以为8,16,32,64或者512字节
6bInterval1Number对全速: 
忽略 
对高速: 
这个值为0到255
Bulk-IN端点

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

偏移字段大小描述
0bLength107h这个描述的字节大小
1bDestriptorType105h端点描述类型
2bEndpointAddress181-8Fh这个USB设备的端点地址。 
这个地址为1到15 
Bit 0..3 端点号 
Bit 4..6 预留,必须为0 
Bit 7      1 = In
3bmAttributes102h这是一个Bulk端点
4wMaxPacketSize20xyzh最大传输数据大小可以为8,16,32,64或者512字节
6bInterval1Number对全速: 
忽略 
对高速: 
这个值为0到255
Interrupt-IN端点

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值