英创嵌入式Linux工控主板如何实现ISO7816协议

iso7816是一套协议标准,这套协议不仅规定了智能ic卡的机械电气特性,而且还规定了智能ic卡的应用方法。智能ic卡的主要用途可归为身份识别、支付安全、加密/解密和信息存储四个方面。智能ic卡已经广泛应用到金融、电信、电子商务等领域,我们平常使用的ic电话卡,充值电卡、燃气卡和手机中的sim卡都属于智能卡的范畴。
iso7816协议标准中,将协议模型定义为4层:物理层、数据链路层、传输层、应用层。
• 物理层:定义了位交换,主要定义波特率和字符帧的传输方式
• 数据链路层:定义了字符交换,传输的检错与纠错等
• 传输层:定义了针对协议的面向应用的提出报文传输
• 应用层:定义报文交换的内容
当iso7816在基于英创的工控主板上应用时,可将iso7816智能卡简单的理解成一个串口设备。串口的物理连接和系统驱动程序实现了iso7816协议标准中的物理层和数据链路层(如图1中黄线以下部份)。应用程序负责数据的解析与应用,实现iso7816协议标准的传输层与应用层(如图1中黄线以上部份)。
图1中黄线与红线之间是英创的工控主板,提供了硬件接口、操作系统支持和串口驱动支持,既实现iso7816协议的数据链路层和物理层。用户将iso7816智能卡正确的连接到工控主板的串口上,编写应用程序,通过调用系统api函数就能实现对iso7816智能卡的访问。
图 1:英创工控主板连接iso7816智能卡
本文将以英创工控主板em9280连接基于iso7816协议的esam模块为例,讨论用户需要做的两项工作:
1、将智能卡连接到工控主板的串口
2、应用程序如何访问已连接到系统中的智能卡
1、智能卡(esam)的硬件连接
如图2中的u2所示,esam模块需要一个工作时钟和一个复位信号,通过一位io与主机连接实现数据通讯。esam的复位信号使用em9280的一位gpio控制,工作时钟使用em9280的一路pwm。esam模块使用单个i/o与主机通讯,自动切换收发方向,em9280提供的是标准3线串口,所以没有办法与esam直接连接。图2中利用74hct157,将串口的rxd,txd模拟成iso7816单io通讯模式,利用串口的rts#信号实现数据收发方向的自动切换。当em9280发送数据时,rts#输出低电平,选通74hct157的a组,数据通过txd6→2a→2y输出到i/o脚。而1a通过r2上拉到高电平,所以1y也是高电平,rxd6不会收到任何数据。数据发送完成后,rts#被串口驱动程序自动将置为高电平,74hct157的b组选通,esam模块发送的数据由i/o→1b→1y到达rxd6,串口接收由esam模块发来的数据。此时2b由r2上拉到高电平,所以2y亦是高电平,不会影响i/o上的数据传输。
图 2:em9280连接esam模块
2、应用程序设置方法
对应用程序来讲,与esam通讯类似于rs485的半双工通讯,只是在开始串口通讯之前,针对esam模块,还需要一些额外的设置。
2.1 产生esam工作时钟
esam模块缺省工作时钟是其通讯波特率的372倍,我们使用em9280的pwm1来产生esam的工作时钟。
// generate clock for iso7816.
m_hpwm = createfile(_t('pwm1:'), // name of device
generic_read|generic_write, // desired access
file_share_read|file_share_write, // sharing mode
null, // security attributes (ignored)
open_existing, // creation disposition
file_flag_random_access, // flags/attributes
null); // template file (ignored)
if( m_hpwm == invalid_handle_value )
{
goto initclearup;
}
pwm_info pwminfo;
pwminfo.dwfreq = dwfi_di_ratio * dwbaud; // = 372 * 9600 = 3.5712mhz
pwminfo.dwduty = 50; // 50%
pwminfo.dwresolution = 1;
dwnumberofbyteswritten = 0;
writefile( m_hpwm, &pwminfo, sizeof(pwm_info), &dwnumberofbyteswritten, null);
2.2 打开串口并使能rts_toggle功能
使用标准的文件操作函数createfile打开串口设备,同时通过setcommstate函数设置串口通讯相关参数。此时esam模块的通讯波特率设置为9600bps,8位数据位,1位停止位,偶校验。
dcb dcb;
getcommstate( m_hser, &dcb );
dcb.baudrate = baud; // 波特率 = 9600
dcb.bytesize = databits; // 数据位 = 8
dcb.parity = evenparity; // 偶校验
dcb.stopbits = onestopbit; // 停止位 = 1
setcommstate(m_hser, &dcb);
在图2中,将3线串口模拟成单线的iso7816模式,使用串口的rts作为数据传输方向控制信号。em9280可以为打开的串口任意指定一位gpio作为其rts信号线,实现方法如下:
dcb dcb;
bool bret;
bret = deviceiocontrol(m_hser, // 已经打开的串口设置句柄
ioctl_set_uart_rts_pin, // i/o control code
&dwrtspin, // 选择作为rts的gpio,如图2中选择gpio7
sizeof(dword),
null,
0,
null,
null);
if( bret )
{
getcommstate( m_hser, &dcb ); // get dcb
dcb.frtscontrol = rts_control_toggle; // enable rts toggle
setcommstate(m_hser, &dcb); // update dcb
}
2.3 数据收发
应用程序可以创建一个线程,然后等待串口事件接收串口数据。
应用程序调用writefile函数发送数据,但需要特别注意iso7816传输协议中关于“保护时间”要求,协议中规定两个连续的字符帧之间必需要有一个最小时间间隔,即保护时间,当波特率为9600bps时,保护时间最小大约为200us。
如果直接调用writefile将要发送的数据一次性发送
writefile( m_hser, buf, len, &dwlen, null);
在em9280上测得的字符间时间间隔大约为30us,显示不能满足协议保护时间的要求。为了达到保护时间的要求,可以采用下面的方式,将需要发送的数据一个字节一个字节的发送。
for( int i; i
writefile( m_hser, buf+i, 1, &dwlen, null);
上面的for循环每调用一次writefile函数,只发送1个字节,在em9280上测得的字符间时间间隔最小大约为500us,满足协议保护时间的要求,实际测试也能正常与esam模块通讯。
如果主机串口硬件没有支持iso7816模式,如英创公司工控主板em9170、em9283等,就可以按本文的方法,增加很少的几个器件就能连接iso7816设备。
英创公司atmel系列工控主板,cpu的串口本身就支持iso7816模式,可直接连接is07816智能卡。我们实现了相应的驱动程序,相关的使用方法可参考下面的文章:
iso7816通讯协议在工控主板em9160中的实现方案
工控主板em9161对iso7816协议的支持
英创嵌入式linux工控主板如何实现iso7816协议
我们还提供了esam模块完整的测试程序,需要的用户可与我们联系获取相关代码。

华米米动手表青春版怎么样?华米米动手表青春版体验:续航竟达45天
Race Your Dream! 贸泽电子鼎力赞助上海交通大学赛车队
适用于便携式可穿戴设备的高性价比、超小封装ESD静电保护方案应用
笔记本如何外置显卡
请教下THT通孔IGBT器件焊接起始面和焊接终止面相反焊接是否有影响
英创嵌入式Linux工控主板如何实现ISO7816协议
电力电子器件应用的共性--驱动、保护、串并联的重要意义
可自动判别三极管管脚系统电路
微信支付发布了搭载扫码器、双面屏版“微信青蛙Pro”
体验蓝牙4.0灯控LED趣味:智能手机“掌”控一屋子照明
《中国算力服务研究报告(2023年)》发布在即
SMT贴片加工中的焊接不良表现有哪些?
意料之外的,工业物联网竟然可以如此简单
Intersil带I2C总线的六相数字控制器提供积极瞬态响应
电机是如何制造的?电机的结构详解
三大运营商积极表态坚决贯彻提速降费
PCB电路板散热技巧分享
如何设计一种小型DMS低通滤波器
阻抗变换器电路
驰为CoreBox Pro迷你电脑发布:2L体积、10nm酷睿加持