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