Integrated Circuit Card  集成电路卡,也叫CA卡或智能卡,将一个微电子芯片嵌入符合ISO 7816标准的卡基内,做成卡片形式,也是一个嵌入式小系统。由CPU,ROM,RAM及E2PROM及串行通行单元组成。其操作系统称为COS,一般带有自已的安全体系,其安全性是衡量COS的重要指标。其功能包含有传输管理,文件管理,安体体系及命令解释。
一般STB机顶盒与智能卡连接图如下:

I/O 串行输入输出
CLK 时钟信号
RST 复位信号
VCC 供电电压 一般5V
GND 接地

智能卡与CPU之间按照异步方式传送字节,其具有统一的字符传输格式,一个字由连续的10个ETU完成发送,期间传送1个起始位,8个数据位和1个奇偶检验位。其数据帧传输格式:10bit

ATR结构及内容:

TS初始字节定义随后字符的逻辑电平及位序
0x3B 表示高电平为逻辑'1', lsbf
0x3C 表示低电平为逻辑'1', msbf

T0格式字符,标记协议参数,协议类型

协议参数:

其基本的读写流程图如下:


下面重点说一下smartcard驱动编写主要逻辑:

1、设定卡工作频率
打开设备的时候需要设置频率参数,而芯片实际给SCI 的时钟是由外部传入的,时钟频率参数计算的分频因子分频得来,因为计算公式会舍弃计算的分频因子的小数部分,所以通过系统时钟分频之后给卡的时钟会存在增量误差,实际配置考虑与需求最接近的值来
设置和权衡
具体算法:
Fsci_clk = Frefclk/((clkicc+1)*2);
其中Frefclk是系统96M时钟Fsci_clk 是外部需要设置的sci时钟,实际要配入寄存器分频因子
clkicc = Frefclk/(2*Fsci_clk) -1;
clkicc 有时候计算出来是浮点数,但只取整,所以设置的频率与实际频率有偏差。

一般来说,其值设定:
对于T0,T1卡,支持频率1MHz~5MHz;对于T14卡,只支持6MHz。单位为khz

2、ETU 串口波特率 Elementary Time Unit
ETU = F / (clk * D) 其中 F 和 D 为调整因子,在TA1中,初值为372和1
则 ETU = 372 / (clk * 1) 则波特率为9600则clk值为 3.57112MHZ

对于寄存器设置如下:
ETU = ((1 + baud) / F(refclk) ) * value ETU范围:5~255

F(refclk) 参考时钟频率,一般为 96000UL
band 为 SCI_BAUD 配置的值 (波特率晚钟分频值寄存器)
value 为 SCI_VALUE配置的值 (ETU内SCI_BAUD 周期数寄存器)

以上的两个参数可能会导致数据发送成功但却无法收到数据的情况!天柏CA就比较特别需要设为[372,2]

3、中断接收数据
利用GPIO作为irq中断线用于数据处理
request_irq(IRQ_SCI,Smartcard_ISR,IRQF_DISABLED,NULL,NULL); 注册中断

利用中断可检测到 Card IN/OUT和 RX 接收数据

对于ATR数据的接收与正常的机卡通讯数据同样操作的,只不过card的状态不同时的操作而已。

init->card in->wait atr->read atr->ready--> 后面就是RX/TX两种数据状态

4、通讯协议说明(字符传输)

Smart Card的字符传输采用的是异步半双工模式,这种异步的模式很像个人电脑上的RS232通信。传输一个字符时,除了8Bits的数据外,还加了以下几个Bits:

起始位 -- 用于字符帧的同步

校验位 -- 用于校验检测

Guard Time -- 两个字符间的间隔时间

Guard Time一般为两个bit的时钟周期,这一点很像PC上的UART的通信,用两个停止位来间隔相连的字符。

复位应答(ATR):

当RST信号被触发,即将RST管脚被拉低400~4000个时钟周期,Smart Card检测到这个信号后,将会回传“复位应答”ATR信号出来,ATR最多包含33个字节,有以下几个段:

l 初始化字符(TS)

l 格式化字符(TO)

l 接口字符(TAi, TBi, TCi, TDi) (i=0/1)

l 历史字符(T1, T2, T3 … TK)

l 校验字符(TCK)

它们包含哪些意思呢?请看下面的解析:

首先,TS初始化字符展示了电平的逻辑,反向约定(Inverse Convention即负逻辑)和正向约定(Direct Convention即正逻辑)。那么一般来说,回传TS有两个可能的HEX值0x3F和0x3B,0x3F代表反向约定,0x3B代表正向约定。

格式化字符TO段分为两个部分,Bit Map和No of History Bytes,各占4个bits。

接口字符的TAi定义了串口传输中最基本的特性,其中包含两个4-Bits的DI和FI,当中的FI时钟频率的转换因子,DI则是定义了比特率的调节因子。通过这两个因子,我们可以通过以下的公式验算出Work ETU的大小:

Work ETU = 1/D*F/f sec (f为工作的时钟频率)

正常来说,一个ETU(Elementary Time Unit),一个bit的时间周期。因此我们计算得出,传输一个字符帧为12个ETU=1 START + 8 DATA + 1 PARITY + 2 GUARDTIME。

接下来,便会有个问题了,字符通信是需要D和F这个两个调节因子,保证其工作时序,而这两个因子又是Smart Card复位后,由通过字符传输回传的ATR获得的,那么谁来保证ATR传输的时序呢?原因是这样的,Card复位时,会有D和F的两个初始值,分别D=1,F=372。而且,复位时时钟频率f会在1~5MHz范围之内,比较常见的是3.579545MHz。

我们可以计算得出Default ETU = 1/1*372/3579545 sec;

Baud Rate = 1/Default ETU = 9600s/s;

TC提供的Guard Time也是如此,Default值为2个bit的时钟周期。

TD则是要说明的是传输协议的类型,标准里罗列了16种,但是常用也就是两种T0和T1,即异步半双工字节传输和异步半双工块传输。

因此,我们知道多数Smart Card复位时,是工作在3.579545MHz和9600s/s上的,一旦复位后,就根据ATR的值重新进行配置工作时钟频率、波特率和Guard Time。使其能更高效的通信。

T=0 传输协议:

下面两张图来说明T=0传输协议的细节,

从上图,我们不难看出,IFD和Smart Card之间存在主从设备关系。在通信之前,我们知道ATR中协议是多于一个,因此接口设备会发一个PTS信号,以便确认通信协议的类型。

CLA - 指令集 (FF 是预留给 PTS)

INS - 指令码 (例如,读内存)

P1 - 指令跟的参数1 (例如,内存地址)

P2 - 指令参数2

P3 - 数据长度

另外,再说说Smart Card的两个状态字SW1和SW2。它们是用来通知上位设备目前Smart Card的工作状态,如果工作正常,则返回值如下所示:

SW1,SW2 = 0x90, 0x00

如果工作异常了,也能通过这两个状态字获得一些信息,如:

SW1= 6E - Card 不支持该款指令集

= 6D - 无效的指令码

7816标准 智能卡读卡器 smartcard T0 T1 T14协议区别和相同点:

guardTime就是停止位。

区别:

1) T0 异步半双工字符传输协议 停止位是2, T1是1。

2) T1是异步半双工块传输协议。 有起始域,信息域, 中止域 组成一个 块。

3) T14叫做私有协议。

5) T14没有奇偶校验, ATR期间时钟因子也不同。像irdeto是620

Smartcard CA智能卡之调试的更多相关文章

  1. Linux内核调试:kdump、vmcore、crash、kernel-debuginfo【转】

    转自:https://blog.csdn.net/guowenyan001/article/details/19807555 一.简介 linux内核发送崩溃时,kdump会生成一个内核转储文件vmc ...

  2. .net程序调试一:快速定位异常

    作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...

  3. .NET程序调试技巧(一):快速定位异常的一些方法

    作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...

  4. stm32 smartcard调试--不用st8024

    关于stm32 smartcard功能调试,官方提供的例程是配合8024芯片进行控制的.程序可从地址:http://www.pudn.com/downloads420/sourcecode/embed ...

  5. 智能卡安全机制比较系列(二)DS SmartCard

    DS Smart Card是飞利浦公司自己开发的一款CPU卡产品,在早期芯片厂商开发自己的COS并进行推广很普遍,现在像英飞凌(前西门子半导体)以及恩智普(前飞利浦半导体)几乎很少推广自己的COS,大 ...

  6. 您在基于 Windows 7 的或基于 Windows Server 2008 R2 的计算机上读取器中插入智能卡时出现错误消息:"设备驱动程序软件未能成功安装"

    http://support.microsoft.com/kb/976832/zh-cn http://support.microsoft.com/kb/976832/zh-tw 症状 当智能卡插入智 ...

  7. javascript代码 调试方法

    你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现. 通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置. 在程序代码中寻找错误叫做代 ...

  8. iOS开发:创建真机调试证书及描述文件

    iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ...

  9. 【系统篇】从int 3探索Windows应用程序调试原理

    探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...

随机推荐

  1. vsftpd,tftp安装配置

    一. 对比共同点:都包含ftp不同点:1)vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.你可以通过ftp客户端上传下载软件.可设置访问用户名密码,或匿名anonymous登陆.默认 ...

  2. 【转】Android开发工具--android-studio-bundle-141.2288178

    原文网址:http://www.androiddevtools.cn/ AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收 ...

  3. cf509B Painting Pebbles

    B. Painting Pebbles time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. Java ConcurrentHashmap 解析

    总体描述: concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问.而对于每个分段,ConcurrentHashmap采用final和内存可见修饰符Volat ...

  5. Java中4种权限的理解

    1.  包访问权限 (1)包的理解:将一组相关的.有意义的类文件组织在一起(即相应的.java文件放在一个文件夹下)就构成了包或者类库.(每个类文件的开头都包含一个所属包的声明“package pac ...

  6. mybatis + log4j 打印mybatis的sql

    项目中使用log4j管理日志,同时使用了mybatis 在log4j中rootLogger级别是info的情况下正常是不会打印sql出来的,这个时候设置如下: log4j.rootLogger=inf ...

  7. mysql命令行里的加载更多显示

    mysql> pager morePAGER set to 'more'mysql> pager lessPAGER set to 'less'mysql> nopagerPAGER ...

  8. Myeclipse 中添加mysql的jdbc驱动

    打开myeclipse后单击菜单栏中的myeclipse——>preferences 然后在Myeclipse Enterprise workbench下的Java Enterprise Pro ...

  9. Java基础知识强化59:String(字符串)和其他类型的相互转化

    1. String类型 ---> 其他类型 (1)使用基本类型包装类的parseXXX方法 e.g:String(字符串)转化为int(整型) String MyNumber ="12 ...

  10. POJ 2318 TOYS/POJ 2398 Toy Storage

    计算几何终于开坑了... 叉积+二分. #include<iostream> #include<cstdio> #include<cstring> #include ...