
Il microcontrollore ST7SCR di ST Microelectronics è dotato di un'interfaccia per smartcard e in questo articolo faremo una descrizione dettagliata del suo funzionamento e dei registri coinvolti per poterla utilizzare al meglio. I dispositivi ST7SCR e ST7FSCR sono membri della famiglia di microcontrollori ST7 progettati per applicazioni USB. Tutti i dispositivi sono basati su un common standard di settore Core 8-bit, con un set di istruzioni ampliate.
Architettura
L’interfaccia smartcard (CRD) del micro ST7SRC è elettricamente compatibile e certificata con gli standards ISO7816, EMV, GSM, WHQL e supporta smartcard tipo memory cards e microprocessor cards. In figura 1 lo schema a blocchi dell’interfaccia.
Sono previsti due buffer (trasmissione e ricezione) e 3 contatori (ETU, GUARDTIME, GENERAL PURPOSE), la frequenza di funzionamento è di 4MHz e vengono effettuati controlli di parità sui byte trasmessi/ricevuti che, in caso di errore, richiedono il rinvio dei dati. Tutte le procedure che interessano la smartcard sono interamente gestite dall’intefaccia CRD che provvede a fornire la giusta alimentazione e a disattivarsi/attivarsi quando la card viene rimossa/inserita (ISO7816-3 card deactivation sequence). Il CRD essenzialmente deve fornire in uscita al pin CRDVCC la tensione di lavoro e gestire le I/O della card che viene alimentata dallo stesso pin. La tensione della card è variabile e può essere impostata dall’utente tramite il bit VCARD del registro CRDCR: le possibili tensioni sono 5V, 3V, 1,8V e 0V.
Quando la card viene rimossa il CRDVCC viene direttamente posto a massa.
L’attivazione della card, (power-on) viene gestita via software, mentre la disattivazione (power-off) è gestita direttamente dall’hardware del dispositivo. Le I/O delle smartcard possono essere pilotate dal micro in 2 modi:
- modalità UART (impostando il bit UART del registro CRDCR a 1);
- modalità manuale (resettando il bit UART del registro CRDCR).
I registri CRDTXB (per la trasmissione) e CRDRXB (per la ricezione) agiscono come buffer e sono connessi all’UART shift register. Per default l’UART è in modalità ricezione e commuta automaticamente in trasmissione qualora un byte venga scritto sul buffer.
Elementary Time Unit Counter
L’Elementary Time Unit Counter (ETU) è un contatore a 11-bit che lavora alla stessa frequenza di clock della scheda (4MHz). Si possono ottenere frequenze di lavoro diverse usando opportunamente il bit COMP del registro CRDETU1 che permette di diminuire la velocità di conteggio. Il valore è limitato alla metà del ciclo di clock, e può variare tra n e n-1 cicli di clock (dove n è il valore scritto nel registro CRDETU). La durata del carattere (10bits) è 10*(n-1/2) cicli di clock come specificato dallo standard ISO7816-3.
Guardtime Counter
Il Guardtime Counter è un contatore a 9-bit che gestisce il frame del carattere e controlla la durata di due trasmissioni consecutive di un carattere tranne la durata della prima trasmissione. Il contatore, tra l’ultimo byte ricevuto dalla smartcard e quello successivo inviato dal dispositivo deve essere gestito dal software.
Waiting Time Counter
Questo contatore a 24-bit è usato per generare il segnale di timeout. L’Elementary Time Unit Counter funge da prescaler al Waiting Time Counter che si incrementa alla sua stessa velocità. Il contatore trova utilizzo sia nella modalità UART sia in quella manuale e agisce in modi differenti a seconda della modalità scelta. I registri CRDWT2, CEDWT1 e CRDWT0 possono essere solo caricati e non sono direttamente accessibili.
Modalità UART
Per entrare in modalità UART è sufficiente porre il micro nelle seguenti condizioni:
- Il bit start viene riconosciuto mentre il bit UART è 1 e WTEN è 1;
- Si effettua l’accesso per scrivere nel registro CRDWT2 quando il bit UART è alto e WTEN basso: in questo caso il Waiting Time Counter può essere sfruttato come contatore d’uso generico.
In questa modalità se il bit WTEN del registro CRDCR è alto il contatore si carica automaticamente appena viene riconosciuto il bit di start. Il software può intervenire cambiando tempestivamente il valore di time out semplicemente scrivendo nei registri CRDWT. Ad esempio in modalità T=1 il software deve caricare il block waiting time (BWT) timeout nel registro CRDWT prima dello start bit dell’ultimo carattere trasmesso. Dopo la trasmissione di quest’ultimo carattere, segnalata tramite l’interrupt TXC, il software scrive il valore del CWT (Character Waiting Time) nel registro CRDWT (figura 2).
Modalità Manuale
Con un accesso in scrittura al registro CRDWT2 quando il bit UART è basso e il bit WTEN è 0, viene abilitata la modalità manuale. In modalità manuale se il bit WTEN del registro CRDCR è 0 il timer funziona come contatore general purpose: in ogni caso entra in funzione quando si scrive nel registro CRDWT2 ponendo a 1 il bit WTEN.
Generatore di interrupt
L’interfaccia smartcard ha 2 vettori di interrupt:
- interrupt di inserimento e rimozione scheda
- CRD interrupt
Il CRD interrupt viene resettato ogni volta che viene letto il contenuto del registro CRDIPR. L’interrupt di inserzione/rimozione smartcard è un interrupt esterno che si resetta automaticamente via hardware alla fine di ogni routine di servizio (istruzioni IRET). Se un interrupt viene generato quando il registro CRDIPR è in lettura, il bit corrispondente verrà settato non appena viene terminata la lettura del registro.
Meccanismo di rilevazione della smartcard
In figura 3 è riportato lo schema a blocchi della sezione di riconoscimento della presenza della smartcard.
Il bit CRDDET del registro CRDCR indica, quando la card è inserita, se il contatto per lo scambio dati è aperto o chiuso (card switch) mentre quando il bit CRDIRF del registro CRDSR è alto significa che la carta è presente nel lettore. Rimuovendo la smartcard, automaticamente si innesca la sequenza di disattivazione (prevista dallo standard ISO7816-3). Il bit CRDIRF commuta quando cambia il valore del pin CRDDET e non è previsto alcun debouncing hardware. Questo cambiamento definito card switch genera un interrupt che può essere utilizzato, ad esempio, per “risvegliare” il dispositivo da una fase di standby o per gestire il debouncing software.
Questa situazione si può riassumere in tre casi:
- Il micro sta funzionando ed attende l’inserimento della carta.
In questo caso l’inserimento della carta genera un interrupt e il bit CRDIRF è alto ed il debouncing è gestito dal software. Terminata la procedura di debouncing se il bit CRDIRF è alto il software manda a 1 il bit CRDVCC del registro CRDCR per applicare la tensione scelta al pin CRDVCC che alimenta la smartcard.
- Il micro è in standby quando viene inserita la carta: L’ST7 viene “risvegliato” da un interrupt, successivamente gestisce la card nella stessa maniera del caso precedente.
- La carta viene rimossa:
Il bit CRDIRF viene posto a 0 senza alcun debouncing hardware, viene generato un interrupt di inserzione/rimozione scheda (ovvero bit CRDIRM alto nel registro MISCR2), il pin di alimentazione CRDVCC viene immediatamente azzerato iniziando la sequenza di disattivazione.
La sequenza di disattivazione viene attivata in 2 modi differenti:
- Automaticamente nel caso in cui il bit indicatore della presenza della scheda è basso (non c’è presenza di smartcard).
- Tramite il firmware, scrivendo sul bit CRDVCC se viene rilevata una corrente troppo alta (bit IOVFF alto nel registro CRDSR) o se il valore della tensione non rientra nel range supportato.
In questi casi il bit CRDVCC viene posto a livello basso avviando la sequenza di disattivazione che interessa i pin CRDCLK, CRDIO, CRDC4, CRDC8 secondo la temporizzazione di figura 4.
I REGISTRI COINVOLTI
La figura 5 mostra tutti i registri coinvolti nella gestione dell’interfaccia smartcard. Di seguito verranno analizzati dettagliatamente uno ad uno.
Registro di controllo CRDCR
È un registro di lettura/scrittura il cui valore di reset è 0000 0000 (0x00). BIT7 (CRDRST): Questo bit, settato direttamente dal software, resetta l’interfaccia UART del dispositivo. BIT6 (CRDDET): Il software usa questo bit per settare adeguatamente lo switch card per il riconoscimento della scheda (bit=1; scheda presente). BIT 5,4 (VCARD): Questi 2 bit, opportunamente combinati, determinano l’alimentazione della smartcard in accordo alla tabella di figura 6.
BIT3 (UART): Determina la modalità (bit=1, UART mode, bit=0, Manual). BIT2 (WTEN): Abilita il Waiting Time Counter. Se a 0 il conteggio viene interrotto, a 1 il contatore si attiva. In modalità UART il contatore viene ricaricato ad ogni start bit. BIT1 (CREP): Ripetizione automatica del carattere in caso di errore di parità. Se a 0 non viene indicato alcun errore di parità quindi non si ha ritrasmissione. Se a 1 la parità viene gestita automaticamente: in trasmissione vengono ritrasmessi fino a 4 caratteri che vengono riprocessati in ricezione. Il PARF, ovvero il bit che segnala un errore di parità, è gestito dall’hardware: se un carattere trasmesso viene rifiutato il bit va a livello alto e genera un interrupt. Se CREP è alto il PARF segnala l’errore alla quinta occorrenza viceversa con CREP a livello basso il PARF va a 1 al primo errore di parità rilevato. BIT0 (CONV): Selezione convenzione ISO. Se a 0 il bit di parità viene inserito dopo il bit B7 altrimenti viene aggiunto dopo il bit B0.
Registro di stato CRDSR
È un registro di sola lettura (tranne alcuni bit) e vale 1000 0000 (0x80) al reset. Bit7 (TxBEF): Indicatore (flag) del buffer di trasmissione (sola lettura). Se 0 il buffer non è pieno. Bit6 (CRDIRF): Flag di inserimento/rimozione smartcard (sola lettura). Se 0 nessuna carta presente. Bit5 (IOVF): Flag di possibili sovraccarichi di corrente (sola lettura). Se 0 nessun sovraccarico rilevato. Bit4 (VCARDOK): Flag sullo stato della tensione (sola lettura). Se 0 la tensione è nel range specificato. Bit3 (WTF): Flag del Waiting Time Counter (sola lettura). Se 0 il WTC non ha raggiunto il valore massimo. Bit2 (TXCF): Flag di trasmissione caratteri (lettura/scrittura). Il bit viene settato dall’hardware e resettato dal software. Se 0 nessun carattere trasmesso. Bit1 (RXCF): Flag di ricezione carattere (sola lettura). Questo bit è settato/resettato dall’hardware quando il buffer CRDRXB viene letto. Se 0 nessun carattere ricevuto. Bit0 (PARF): Flag errore di parità (lettura/scrittura). Il bit è attivato dall’hardware e resettato dal software. Se 0 nessun errore di parità. Ad ogni carattere ricevuto il bit RXCF è sempre settato, nel caso in cui si riceva un bit con errore di parità anche il PARF va a livello alto.
Registro di controllo contatti CRDCCR
È un registro di lettura/scrittura il cui valore al reset è 00xx xx00. Bit7 (CLKSEL): Bit di selezione clock della card. Se 0 il segnale sul pin CRDCLK è una copia del bit CRDCLK altrimenti il segnale sul pin CRDCLK è alla frequenza di 4Mhz. Per attivare il clock, il bit CRDCLK deve essere cambiato prima del bit CLKSEL. Bit6: bit riservato. Bit5 (CRDC8): controllo in lettura e scrittura del pin CRDC8. Bit4 (CRDC4): controllo del pin CRDC4. Bit3 (CRDIO): controllo del pin CRDIO. Questo bit è attivo solamente nel caso in cui il bit UART nel registro CRDCR sia 0. Se il bit UART=0 scrivendo 0 in CRDIO viene forzato a livello basso il pin CRDIO altrimenti scrivendo 1 il pin diviene open-drain. Bit2 (CRDCLK): controllo del pin CRDCLK. Entra in funzione solo nel casi in cui CLKSEL nel registro CRDCCR è basso. Leggendo questo bit si legge il valore presente nel registro non quello del pin CRDCLK. Per assicurarsi che il clock si fermi al valore dato, scrivere il valore desiderato nel bit CRDCLK prima di cambiare il bit CLKSEL da 1 a 0. Bit1 (CRDRST): controllo del pin CRDRST. Bit0 (CRDVCC): controllo del pin CRDVCC. Questo bit è gestito normalmente dal software nel caso sia presente una smartcard; in caso contrario l’hardware lo pone a 0 (bit CRDIRF=0). Se 0 nessuna tensione applicata al pin CRDVCC, se 1 la tensione selezionata è applicata al pin CRDVCC.
Registri ETU (Elementary Time Unit, CRDETUx)
CRDETU1
Registro di lettura/scrittura il cui valore al reset è 0000 0001 (0x01) Bit7 (COMP): compensazione ETU . Se 0 la compensazione disabilitata. Per accettare valori non interi, un ciclo di clock viene sottratto dall’ETU nei bit dispari. Bit [6…3]: riservati Bits2:0 (ETU [10:8]): valore ETU nei cicli di clock della smartcard. Scrivendo nel registro CRDETU1 si ricarica il contatore ETU.
CRDETU0
Registro di lettura/scrittura. Al reset vale 0111 0100 (0x74)
Bits[7:0] (ETU[7:0]): valore ETU nei cicli di clock della smartcard. Il valore dell’ETU[10:0] deve stare nel range da 12 a 2047. Per scrivere 2048, resettare tutti i bits.
Registri Guardtime (CRDGTx)
Il Guardtime è il minimo valore che intercorre tra due stop-bits consecutivi in trasmissione. Il valore è espresso in ETU da 11 a 511.
CRDGT1
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00).
CRDGT0
Registro di lettura/scrittura. Al reset vale 0000 1100 (0x00).
Il software scrive il valore del Guardtime counter in questi registri. Il valore viene caricato alla fine del periodo del Guard. Il Guardtime tra l’ultimo byte ricevuto dalla smartcard e quello successivo trasmesso dal lettore deve essere gestito dal software.
Registri Character Waiting Time (CRDWTx)
CRDWT2
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00).
CRDWT1
Registro di lettura/scrittura. Al reset vale 0010 0101 (0x25).
CRDWT0
Registro di lettura/scrittura. Al reset vale: 1000 0000 (0x80).
WT: Character Waiting Time espresso in ETU (0/16777215). I registri CRDWT0, CRDWT1 e CRDWT2 mantengono al loro interno il valore del WTC. Un’operazione di lettura non rientra nel valore del conteggio. Se il bit WTEN del registro CRDCR è 0, il contatore viene ricaricato appena inizia un accesso in scrittura nel registro CRDWT2. Questo come contatore d’uso generale. Se invece il bit WTEN è 1 e la modalità UART è attivata, il contatore funziona come autoreload timer: il timer viene ricaricato ogni volta che uno start bit viene inviato o riconosciuto. Nel caso in cui il timer va in overflow tra 2 start-bit trasmessi consecutivamente, viene generato un interrupt.
Registro di abilitazione interrupt (CRDIER)
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00) I bit di questo registro abilitano o disabilitano la funzione di interrupt a loro associata e sono gestiti completamente via software.
Bit7 (TXBEM): interrupt per buffer di trasmissione vuoto
Bit6: Riservato
Bit5 (IOVFM): interrupt per corrente di overload.
Bit4: (VCRDM): interrupt per errata tensione di alimentazione smartcard.
Bit3: (WTM): interrupt del Waiting Timer.
Bit2: (TXCM): interrupt dei caratteri trasmessi.
Bit1: (RXCM): interrupt per la ricezione dei caratteri.
Bit0: (PARM): interrupt per errore di parità.
Per tutti: Bit=0 interrupt disabilitato:
Bit=1 interrupt abilitato
Registro di pending (attesa) interrupt (CRDIPR)
Registro di sola lettura. Al reset vale 0000 0000 (0x00)
Questo registro indica la sorgente di interrupt. Viene resettato dopo ogni operazione di lettura. I bit di questo registro abilitano o disabilitano la funzione pending di interrupt a loro associata e sono settati dall’hardware.
Bit7 (TXBEP): interrupt pending per buffer di trasmissione vuoto.
Bit6: Riservato.
Bit5 (IOVFP): interrupt pending per corrente di overload.
Bit4 (VCRDP): interrupt pending per errata tensione di alimentazione smartcard. Bit3 (WTP): interrupt pending del Waiting Timer.
Bit2 (TXCP): interrupt pending dei caratteri trasmessi.
Bit1 (RXCP): interrupt pending per la ricezione dei caratteri.
Bit0 (PARP): interrupt pending per errore di parità.
Buffer di trasmissione (CRDTXB)
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00). Questo registro è usato per inviare un byte alla smartcard.
Buffer di ricezione (CRDRXB)
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00). Questo registro è usato per ricevere un byte dalla smartcard.

La smartcard di solito viene classificata in base all’elettronica integrata o all’interfaccia. E’ stata la base per lo sviluppo di varie tecnologie “card” come la SIM, e garantisce una sicura protezione dei dati.