其操作系统称为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:
<wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px">起始位<wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px">-- 用于字符帧的同步</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px"><wbr style=