view doc/Serial-SIM-readers @ 59:10bfdee30a68

simtool/chvext.c: missing #include <stdlib.h>
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 23 Mar 2021 05:25:12 +0000
parents b0cf75d0bb2d
children
line wrap: on
line source

A serial SIM reader is a very simple hardware gadget consisting of just the
following:

* An always-on power supply (voltage determined by hw design) connected to SIM
  VCC contact;

* An always-on fixed-frequency clock fed to SIM CLK contact;

* SIM I/O line connected to both TxD and RxD of a general-purpose UART, with
  UART TxD driving SIM I/O by way of an open collector or open drain buffer;

* SIM RST line controlled by one of the modem control lines, either DTR or RTS.

In order to successfully communicate with the SIM, the UART baud rate needs to
be set to clock_freq/372, where clock_freq is the clock frequency fed to SIM CLK
contact, determined by the crystal oscillator used in the design of the serial
SIM reader gadget.  This baud rate must be used initially for receiving ATR and
performing PTS, and it can also be used for the entire card session if the user
is content with the default slow speed - however, if the SIM card supports speed
enhancement (almost all cards do), this speed enhancement feature can be
supported with serial SIM readers if the UART baud rate can be switched under
software control from clock_freq/372 to clock_freq/64.

I (Mother Mychaela) am a very late comer to this game, thus I am not able to
speak with authority regarding the history of how serial SIM readers came about.
However, my understanding of this history is that early serial SIM readers were
RS-232 serial rather than USB-serial, thus they were constrained to use only
standard RS-232 baud rates like 9600 bps.  And even when "serial" SIM readers
are really USB-serial, with a USB UART chip built directly into the custom
gadget, most people are still used to standard RS-232 baud rates (and the most
important OSes still make it unreasonably difficult to use non-standard baud
rates on USB-serial and other ports that are capable of such), thus the classic
baud rate of 9600 bps has stuck.

When a serial SIM reader gadget is designed to operate at 9600 baud, the crystal
oscillator frequency should ideally be 3.571200 MHz: 9600 * 372 = 3571200.
However, most real-life serial SIM readers out there have been built in a "race
to the bottom" fashion in terms of cost, and they typically feature crystals of
some frequency that is close to the ideal one, but not exactly - apparently
crystals of other nearby frequencies are cheaper than getting one for the ideal
frequency of 3.571200 MHz.  (As a practical example, the USB-serial SIM reader
I bought on ebay in 2021-03 features a 3.579545 MHz crystal.)  These serial SIM
readers with slightly-off crystals exploit the baud rate error tolerance that is
inherent in all UART interfaces.

The use of 3.571200 MHz (or close to this frequency) clocks in USB-serial SIM
reader designs is a case of conservative thinking, as opposed to maximizing
speed.  The highest clock frequency allowed by SIM card specs is 5 MHz for
class A (5.0 V) or 4 MHz for classes B and C (3.0 V and 1.8 V), thus if someone
sought maximum SIM communication speed, they could use a higher frequency clock
(for example, the same 4.8 MHz clock that is used in the USB CCID reader on
which I measured it with an oscilloscope, HID Omnikey 3121), use a high-quality
USB-serial chip with good support for non-standard baud rates, and design the
software around the resulting non-standard baud rates, including baud rate
switching for SIM speed enhancement.  If anyone has ever made such a USB-serial
SIM reader, our tools are ready to support it - but I don't know if anyone has
ever built such a gadget.

In case of serial SIM readers with 3.571200 MHz (or nearby) clocks, it is my
(Mychaela's) guess that their designers probably never considered the
possibility of using SIM speed enhancement, and that most programmers who write
software tools for such readers don't consider it either, resigning themselves
to just the default slow speed mode of F=372 D=1.  However, if the SIM card
supports F=512 D=8 speed enhancement (almost all cards do) and this mode is
activated via PTS procedure, the baud rate becomes 55800 bps.  This baud rate
is non-standard - however, the USB-serial chip in the SIM reader gadget I got
from ebay supports it just fine.  (The USB-serial chip in this particular reader
is a PL2303, so I initially thought that it wouldn't support non-standard baud
rates - however, a closer investigation revealed that the popular notion of
these chips not supporting non-standard baud rates is actually a myth: PL2303
chips support non-standard baud rates just fine, instead this support was
lacking in earlier versions of the Linux kernel pl2303 driver.)

Our FC SIM tools back end for serial SIM readers supports 55800 baud speed
enhancement mode whenever the UART and its Linux kernel driver support it, and
we also support even higher speed enhancement modes: if the UART can handle
111600 baud, we can use F=512 D=16 mode, and if the UART can handle 223200 baud,
we can use F=512 D=32 mode which most newer SIM cards support.  And yes, the
PL2303 USB-serial chip in the SIM reader I got from ebay supports this fastest
223200 baud mode just fine.

Using fc-simtool with serial SIM readers
========================================

The most basic usage is as follows:

fc-simtool -d /dev/ttyXXX

If the serial SIM reader uses a 3.571200 MHz (or nearby frequency) crystal and
you are not going for speed enhancement (i.e., if you are sticking with 9600
baud for the entire card session), then no further options are needed.

If the clock frequency stays at 3.571200 MHz (or nearby) but you do wish to use
speed enhancement, add one of the following options:

-e1 if your UART can handle 55800 bps;
-e2 if your UART can handle 55800 and 111600 bps;
-e4 if your UART can handle 55800, 111600 and 223200 bps.

The actual selected mode will be based both on the UART capabilities declared
with the -e option and on the SIM card capabilities indicated in the ATR TA1
byte.

If your serial SIM reader uses a different clock frequency such that you need to
use baud rates other than 9600 and 55800 bps for standard and speed-enhanced
modes, respectively, then you need to use the more general -b option instead of
-e, taking one of the following forms:

-b base_baud
-b base_baud,spenh_baud
-b base_baud,spenh_baud,spenh_max

base_baud is the initial baud rate to use for receiving ATR; if no further
comma-separated parameters are specified, then this initial baud rate persists
for the entire card session without any speed enhancement modes.  spenh_baud is
the baud rate to use for F=512 D=8 speed enhancement mode.  spenh_max must be
1, 2, 4 or 8 (the default is 1); it is the maximum further multiplier that can
be applied to spenh_baud, if any.