Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad8c0eaa authored by Nicolas Ferre's avatar Nicolas Ferre Committed by Greg Kroah-Hartman
Browse files

tty/serial_core: add ISO7816 infrastructure



Add the ISO7816 ioctl and associated accessors and data structure.
Drivers can then use this common implementation to handle ISO7816
(smart cards).

Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@microchip.com>
[ludovic.desroches@microchip.com: squash and rebase, removal of gpios, checkpatch fixes]
Signed-off-by: default avatarLudovic Desroches <ludovic.desroches@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c550f01c
Loading
Loading
Loading
Loading
+83 −0
Original line number Diff line number Diff line
                        ISO7816 SERIAL COMMUNICATIONS

1. INTRODUCTION

  ISO/IEC7816 is a series of standards specifying integrated circuit cards (ICC)
  also known as smart cards.

2. HARDWARE-RELATED CONSIDERATIONS

  Some CPUs/UARTs (e.g., Microchip AT91) contain a built-in mode capable of
  handling communication with a smart card.

  For these microcontrollers, the Linux driver should be made capable of
  working in both modes, and proper ioctls (see later) should be made
  available at user-level to allow switching from one mode to the other, and
  vice versa.

3. DATA STRUCTURES ALREADY AVAILABLE IN THE KERNEL

  The Linux kernel provides the serial_iso7816 structure (see [1]) to handle
  ISO7816 communications. This data structure is used to set and configure
  ISO7816 parameters in ioctls.

  Any driver for devices capable of working both as RS232 and ISO7816 should
  implement the iso7816_config callback in the uart_port structure. The
  serial_core calls iso7816_config to do the device specific part in response
  to TIOCGISO7816 and TIOCSISO7816 ioctls (see below). The iso7816_config
  callback receives a pointer to struct serial_iso7816.

4. USAGE FROM USER-LEVEL

  From user-level, ISO7816 configuration can be get/set using the previous
  ioctls. For instance, to set ISO7816 you can use the following code:

	#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. REFERENCES

 [1]    include/uapi/linux/serial.h
+2 −0
Original line number Diff line number Diff line
@@ -102,6 +102,8 @@
#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */
#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */
#define TIOCGPTPEER	_IO('T', 0x41) /* Safely open the slave */
#define TIOCGISO7816	_IOR('T', 0x42, struct serial_iso7816)
#define TIOCSISO7816	_IOWR('T', 0x43, struct serial_iso7816)

#define TIOCSERCONFIG	0x5453
#define TIOCSERGWILD	0x5454
+2 −0
Original line number Diff line number Diff line
@@ -93,6 +93,8 @@
#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */
#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */
#define TIOCGPTPEER	_IO('T', 0x41) /* Safely open the slave */
#define TIOCGISO7816	_IOR('T', 0x42, struct serial_iso7816)
#define TIOCSISO7816	_IOWR('T', 0x43, struct serial_iso7816)

/* I hope the range from 0x5480 on is free ... */
#define TIOCSCTTY	0x5480		/* become controlling tty */
+2 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@
#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */
#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */
#define TIOCGPTPEER	_IO('T', 0x41) /* Safely open the slave */
#define TIOCGISO7816	_IOR('T', 0x42, struct serial_iso7816)
#define TIOCSISO7816	_IOWR('T', 0x43, struct serial_iso7816)

#define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
#define FIOCLEX		0x5451
+2 −0
Original line number Diff line number Diff line
@@ -102,6 +102,8 @@
#define TIOCGPTLCK	_IOR('T', 0x39, int) /* Get Pty lock state */
#define TIOCGEXCL	_IOR('T', 0x40, int) /* Get exclusive mode state */
#define TIOCGPTPEER	_IO('T', 0x41) /* Safely open the slave */
#define TIOCGISO7816	_IOR('T', 0x42, struct serial_iso7816)
#define TIOCSISO7816	_IOWR('T', 0x43, struct serial_iso7816)

#define TIOCSERCONFIG	0x5453
#define TIOCSERGWILD	0x5454
Loading