Smartcard CA智能卡之调试
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智能卡之调试的更多相关文章
- Linux内核调试:kdump、vmcore、crash、kernel-debuginfo【转】
转自:https://blog.csdn.net/guowenyan001/article/details/19807555 一.简介 linux内核发送崩溃时,kdump会生成一个内核转储文件vmc ...
- .net程序调试一:快速定位异常
作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...
- .NET程序调试技巧(一):快速定位异常的一些方法
作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...
- stm32 smartcard调试--不用st8024
关于stm32 smartcard功能调试,官方提供的例程是配合8024芯片进行控制的.程序可从地址:http://www.pudn.com/downloads420/sourcecode/embed ...
- 智能卡安全机制比较系列(二)DS SmartCard
DS Smart Card是飞利浦公司自己开发的一款CPU卡产品,在早期芯片厂商开发自己的COS并进行推广很普遍,现在像英飞凌(前西门子半导体)以及恩智普(前飞利浦半导体)几乎很少推广自己的COS,大 ...
- 您在基于 Windows 7 的或基于 Windows Server 2008 R2 的计算机上读取器中插入智能卡时出现错误消息:"设备驱动程序软件未能成功安装"
http://support.microsoft.com/kb/976832/zh-cn http://support.microsoft.com/kb/976832/zh-tw 症状 当智能卡插入智 ...
- javascript代码 调试方法
你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现. 通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置. 在程序代码中寻找错误叫做代 ...
- iOS开发:创建真机调试证书及描述文件
iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ...
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
随机推荐
- vsftpd,tftp安装配置
一. 对比共同点:都包含ftp不同点:1)vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.你可以通过ftp客户端上传下载软件.可设置访问用户名密码,或匿名anonymous登陆.默认 ...
- 【转】Android开发工具--android-studio-bundle-141.2288178
原文网址:http://www.androiddevtools.cn/ AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收 ...
- cf509B Painting Pebbles
B. Painting Pebbles time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Java ConcurrentHashmap 解析
总体描述: concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问.而对于每个分段,ConcurrentHashmap采用final和内存可见修饰符Volat ...
- Java中4种权限的理解
1. 包访问权限 (1)包的理解:将一组相关的.有意义的类文件组织在一起(即相应的.java文件放在一个文件夹下)就构成了包或者类库.(每个类文件的开头都包含一个所属包的声明“package pac ...
- mybatis + log4j 打印mybatis的sql
项目中使用log4j管理日志,同时使用了mybatis 在log4j中rootLogger级别是info的情况下正常是不会打印sql出来的,这个时候设置如下: log4j.rootLogger=inf ...
- mysql命令行里的加载更多显示
mysql> pager morePAGER set to 'more'mysql> pager lessPAGER set to 'less'mysql> nopagerPAGER ...
- Myeclipse 中添加mysql的jdbc驱动
打开myeclipse后单击菜单栏中的myeclipse——>preferences 然后在Myeclipse Enterprise workbench下的Java Enterprise Pro ...
- Java基础知识强化59:String(字符串)和其他类型的相互转化
1. String类型 ---> 其他类型 (1)使用基本类型包装类的parseXXX方法 e.g:String(字符串)转化为int(整型) String MyNumber ="12 ...
- POJ 2318 TOYS/POJ 2398 Toy Storage
计算几何终于开坑了... 叉积+二分. #include<iostream> #include<cstdio> #include<cstring> #include ...