• 智能卡 7816协议【转】


    本文转载自:

    smartcard T0 T1 T14协议区别

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

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

    3) T14叫做私有协议。T14没有奇偶校验, ATR期间时钟因子也不同。像irdeto是620。


    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 传输协议:

    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 - 无效的指令码








    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两种数据状态

  • 相关阅读:
    懂一点Python系列——快速入门
    DatagridView 控件列顺序与设置的不一样
    WinForm Column cannot be added because its CellType property is null.
    Rabbitmq消息服务器通讯异常: name must not be blank
    Redis 数据库
    redis 安装与使用
    windows 服务的安装与卸载之bat脚本命令
    以超级管理员方式运行bat文件
    CMD 下切换目录
    C#导出Excel后关闭进程EXCEL.EXE
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7240295.html
Copyright © 2020-2023  润新知