在新的國(guó)家電網(wǎng)集抄終端相關(guān)標(biāo)準(zhǔn)中,規(guī)定了通過(guò)嵌入式安全控制模塊,即通常所說(shuō)的ESAM芯片,來(lái)保證設(shè)備數(shù)據(jù)安全性的方法,而設(shè)備主控單元與ESAM芯片采用了廣泛應(yīng)用的ISO7816通訊協(xié)議。為了適應(yīng)這一新的技術(shù)需求,我們對(duì)嵌入式Linux主板EM9160的串口驅(qū)動(dòng)進(jìn)行了升級(jí),使其多個(gè)串口都可支持ISO7816協(xié)議,為客戶進(jìn)行智能終端整機(jī)設(shè)計(jì)時(shí),提供了靈活的選擇。
對(duì)EM9160工控主板,可在其異步串口的基礎(chǔ)上,通過(guò)簡(jiǎn)單的設(shè)置,就可把串口轉(zhuǎn)為符合ISO7816協(xié)議的接口,實(shí)現(xiàn)與各種智能卡的通訊。EM9160共有6個(gè)異步串口,在Linux環(huán)境中為“/dev/ttyS1”-“/dev/ttyS6”,其中支持ISO7816的串口如下表所示:
串口 |
管腳配置 |
備注 |
|
“/dev/ttyS2” |
TXD:半雙工數(shù)據(jù)線 | ||
RXD:復(fù)位輸出控制 | 低電平有效 | ||
GPIO14:作為SCK | 輸出頻率與波特率參數(shù)有關(guān) | ||
“/dev/ttyS4” |
TXD:半雙工數(shù)據(jù)線 | ||
RXD:復(fù)位輸出控制 | 低電平有效 | ||
GPIO15:作為SCK | 輸出頻率與波特率參數(shù)有關(guān) | ||
“/dev/ttyS5” |
TXD:半雙工數(shù)據(jù)線 | ||
RXD:復(fù)位輸出控制 | 低電平有效 | ||
GPIO15:作為SCK | 輸出頻率與波特率參數(shù)有關(guān) | ||
“/dev/ttyS6” |
TXD:半雙工數(shù)據(jù)線 | ||
RXD:復(fù)位輸出控制 | 低電平有效 | ||
GPIO15:作為SCK | 輸出頻率與波特率參數(shù)有關(guān) |
EM9160在硬件上與ESAM芯片的連接很簡(jiǎn)單,如上表所示,只需要3條信號(hào)線,連接示意圖如下:
為了簡(jiǎn)化EM9160對(duì)ISO7816協(xié)議的參數(shù)設(shè)置,其FI/DI比值固定為372,事實(shí)上這也是應(yīng)用中最常用的比值,符合國(guó)電公司指定的ESAM芯片的要求。若所用串口的波特率為9600bps,則輸出的SCK頻率為3.5712MHz。
EM9160的“/dev/ttyS4”-“/dev/ttyS6”串口信號(hào)均為T(mén)TL電平,建議客戶首選其中之一作為與ISO7816智能芯片的通訊接口。如果這些串口已分配給設(shè)備的其他功能,也可以考慮使用“/dev/ttyS2”口,需要注意的是“/dev/ttyS2”口出廠的缺省電平是RS232電平,若客戶考慮配置“/dev/ttyS2”作為ISO7816協(xié)議端口,需在訂購(gòu)時(shí)通知廠方設(shè)置成TTL電平。另外當(dāng)GPIO15或GPIO14一旦作為了ISO7816的工作時(shí)鐘輸出,就不能再用作其他的用途了。
為了方便設(shè)置ISO7816工作模式,在“em9x60_drivers.h”中定義了兩個(gè)常量:
#define EM9X60_ISO7816_T0 (1 << 27)
#define EM9X60_ISO7816_RXD_RESET (1 << 23)
作為應(yīng)用程序,在設(shè)置ISO7816模式的串口(以”/dev/ttyS4”為例)時(shí),一般的流程如下:
1、按標(biāo)準(zhǔn)方法打開(kāi)串口 fd = open(“/dev/ttyS4”, O_RDWR | O_NOCTTY);
2、獲取數(shù)據(jù)結(jié)構(gòu) struct termios new_opt; tcgetattr(fd, &new_opt);
3、設(shè)置包括波特率、偶校驗(yàn)、8-bit數(shù)據(jù)等符合ISO7816規(guī)范的串口參數(shù);
4、首先對(duì)ESAM芯片進(jìn)行一次復(fù)位操作:
new_opt.c_cflag |= (EM9X60_ISO7816_T0 | EM9X60_ISO7816_RXD_RESET);
tcsetattr(fd, TCSANOW, &new_opt);
udelay(100); //延時(shí)100us
new_opt.c_cflag &= ~EM9X60_ISO7816_RXD_RESET;
5、再設(shè)置一次正常的ISO7816工作模式:
tcsetattr(fd, TCSANOW, &new_opt);
此時(shí)GPIO15已作為SCK輸出3.57MHz時(shí)鐘,若波特率為9600bps的話;
6. 按照ISO7816的協(xié)議規(guī)范,進(jìn)行正常數(shù)據(jù)通訊;
7. 若需要把該串口恢復(fù)到正常模式,只需對(duì)參數(shù)進(jìn)行設(shè)置一次即可:
new_opt.c_cflag &= ~ EM9X60_ISO7816_T0;
tcsetattr(fd, TCSANOW, &new_opt);
8. 按標(biāo)準(zhǔn)方法關(guān)閉串口close(fd)。
在實(shí)際的嵌入式應(yīng)用系統(tǒng)中,一個(gè)串口一旦配置成與ESAM芯片相連,就不太可能還需要用作它用,因?yàn)閺?fù)用串口會(huì)增加系統(tǒng)硬件的成本,更何況EM9160自身就有多達(dá)6個(gè)異步串口,完全可滿足大多數(shù)智能終端的需求。
-
Linux
+關(guān)注
關(guān)注
87文章
11314瀏覽量
209774 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35415
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論