在新的国家电网集抄终端相关标准中,规定了通过嵌入式安全控制模块,即通常所说的ESAM芯片,来保证设备数据安全性的方法,而设备主控单元与ESAM芯片采用了广泛应用的ISO7816通讯协议。为了适应这一新的技术需求,我们对嵌入式Linux工控板EM9160的串口驱动进行了升级,使其多个串口都可支持ISO7816协议,为客户进行智能终端整机设计时,提供了灵活的选择。
对EM9160工控主板,可在其异步串口的基础上,通过简单的设置,就可把串口转为符合ISO7816协议的接口,实现与各种智能卡的通讯。EM9160共有6个异步串口,在Linux环境中为“/dev/ttyS1”-“/dev/ttyS6”,其中支持ISO7816的串口如下表所示:
串口 管脚配置 备注 “/dev/ttyS2” “/dev/ttyS4” “/dev/ttyS5” “/dev/ttyS6”
RXD:复位输出控制
低电平有效
GPIO14:作为SCK
输出频率与波特率参数有关
RXD:复位输出控制
低电平有效
GPIO15:作为SCK
输出频率与波特率参数有关
RXD:复位输出控制
低电平有效
GPIO15:作为SCK
输出频率与波特率参数有关
RXD:复位输出控制
低电平有效
GPIO15:作为SCK
输出频率与波特率参数有关
EM9160在硬件上与ESAM芯片的连接很简单,如上表所示,只需要3条信号线,连接示意图如下:
为了简化EM9160对ISO7816协议的参数设置,其FI/DI比值固定为372,事实上这也是应用中最常用的比值,符合国电公司指定的ESAM芯片的要求。若所用串口的波特率为9600bps,则输出的SCK频率为3.5712MHz。
EM9160的“/dev/ttyS4”-“/dev/ttyS6”串口信号均为TTL电平,建议客户首选其中之一作为与ISO7816智能芯片的通讯接口。如果这些串口已分配给设备的其他功能,也可以考虑使用“/dev/ttyS2”口,需要注意的是“/dev/ttyS2”口出厂的缺省电平是RS232电平,若客户考虑配置“/dev/ttyS2”作为ISO7816协议端口,需在订购时通知厂方设置成TTL电平。另外当GPIO15或GPIO14一旦作为了ISO7816的工作时钟输出,就不能再用作其他的用途了。
为了方便设置ISO7816工作模式,在“em9x60_drivers.h”中定义了两个常量:
#define EM9X60_ISO7816_T0 (1 << 27)
#define EM9X60_ISO7816_RXD_RESET (1 << 23)
作为应用程序,在设置ISO7816模式的串口(以”/dev/ttyS4”为例)时,一般的流程如下:
1、按标准方法打开串口 fd = open(“/dev/ttyS4”, O_RDWR | O_NOCTTY);
2、获取数据结构 struct termios new_opt; tcgetattr(fd, &new_opt);
3、设置包括波特率、偶校验、8-bit数据等符合ISO7816规范的串口参数;
4、首先对ESAM芯片进行一次复位操作:
new_opt.c_cflag |= (EM9X60_ISO7816_T0 | EM9X60_ISO7816_RXD_RESET);
tcsetattr(fd, TCSANOW, &new_opt);
udelay(100); //延时100us
new_opt.c_cflag &= ~EM9X60_ISO7816_RXD_RESET;
5、再设置一次正常的ISO7816工作模式:
tcsetattr(fd, TCSANOW, &new_opt);
此时GPIO15已作为SCK输出3.57MHz时钟,若波特率为9600bps的话;
6. 按照ISO7816的协议规范,进行正常数据通讯;
7. 若需要把该串口恢复到正常模式,只需对参数进行设置一次即可:
new_opt.c_cflag &= ~ EM9X60_ISO7816_T0;
tcsetattr(fd, TCSANOW, &new_opt);
8. 按标准方法关闭串口close(fd)。
在实际的嵌入式应用系统中,一个串口一旦配置成与ESAM芯片相连,就不太可能还需要用作它用,因为复用串口会增加系统硬件的成本,更何况EM9160自身就有多达6个异步串口,完全可满足大多数智能终端的需求。