ISO7816 串行通信

1. 简介

ISO/IEC7816 是一系列标准,规定了集成电路卡 (ICC),也称为智能卡。

3. 内核中已有的数据结构

Linux 内核提供 serial_iso7816 结构(请参阅 [1])来处理 ISO7816 通信。此数据结构用于在 ioctl 中设置和配置 ISO7816 参数。

任何能够作为 RS232 和 ISO7816 工作的设备驱动程序都应该在 uart_port 结构中实现 iso7816_config 回调。serial_core 调用 iso7816_config 来执行设备特定部分,以响应 TIOCGISO7816 和 TIOCSISO7816 ioctl(请参阅下文)。iso7816_config 回调接收指向 struct serial_iso7816 的指针。

4. 用户级的使用

从用户级,可以使用之前的 ioctl 获取/设置 ISO7816 配置。例如,要设置 ISO7816,可以使用以下代码

#include <linux/serial.h>

/* Include definition for ISO7816 ioctls: TIOCSISO7816 and TIOCGISO7816 */
#include <sys/ioctl.h>

/* Open your specific device (e.g., /dev/mydevice): */
int fd = open ("/dev/mydevice", O_RDWR);
if (fd < 0) {
        /* Error handling. See errno. */
}

struct serial_iso7816 iso7816conf;

/* Reserved fields as to be zeroed */
memset(&iso7816conf, 0, sizeof(iso7816conf));

/* Enable ISO7816 mode: */
iso7816conf.flags |= SER_ISO7816_ENABLED;

/* Select the protocol: */
/* T=0 */
iso7816conf.flags |= SER_ISO7816_T(0);
/* or T=1 */
iso7816conf.flags |= SER_ISO7816_T(1);

/* Set the guard time: */
iso7816conf.tg = 2;

/* Set the clock frequency*/
iso7816conf.clk = 3571200;

/* Set transmission factors: */
iso7816conf.sc_fi = 372;
iso7816conf.sc_di = 1;

if (ioctl(fd_usart, TIOCSISO7816, &iso7816conf) < 0) {
        /* Error handling. See errno. */
}

/* Use read() and write() syscalls here... */

/* Close the device when finished: */
if (close (fd) < 0) {
        /* Error handling. See errno. */
}

5. 参考

[1] include/uapi/linux/serial.h