Passa al contenuto
Inovasense

JTAG / SWD (Hardware Debug Interfaces)

JTAG e SWD sono le principali interfacce di debug hardware utilizzate dagli ingegneri embedded per il test boundary-scan, il debug interno del silicio e l'accesso diretto al core del processore, ai suoi registri e alla memoria flash.

Definizione
JTAG e SWD sono le principali interfacce di debug hardware utilizzate dagli ingegneri embedded per il test boundary-scan, il debug interno del silicio e l'accesso diretto al core del processore, ai suoi registri e alla memoria flash.

Nello sviluppo del software embedded, il logging standard a livello software (come printf() su UART) è spesso insufficiente per diagnosticare complessi problemi di temporizzazione, hard fault o bug nel context-switching dell’RTOS. Gli ingegneri necessitano di una visibilità profonda e non intrusiva nel cuore stesso del processore. Questa è fornita dalle interfacce di debug hardware, principalmente JTAG e SWD.

JTAG (Joint Test Action Group)

Standardizzato come IEEE 1149.1, JTAG fu originariamente sviluppato negli anni ‘80 non per il debug del software, ma per il test in produzione. Con l’aumento della densità delle PCB e la diffusione dei package BGA (Ball Grid Array) che nascondevano le saldature sotto il chip, il tradizionale test fisico “bed-of-nails” divenne impossibile.

JTAG risolse questo problema tramite il Boundary Scan. Collega uno shift register a ciascun pin dell’IC. Spostando sequenze di 1 e 0 all’interno del chip e rileggendole, un sistema di test può verificare che le saldature fisiche sulla PCB siano integre, senza accesso fisico tramite sonde.

Nel tempo, i produttori di silicio hanno esteso JTAG per consentire la manipolazione dello stato interno della CPU. Un’interfaccia JTAG standard richiede quattro (a volte cinque) pin dedicati:

  1. TDI (Test Data In): ingresso dati seriale alla catena di boundary scan.
  2. TDO (Test Data Out): uscita dati seriale dalla catena.
  3. TCK (Test Clock): il segnale di clock che sincronizza il controller TAP (Test Access Port).
  4. TMS (Test Mode Select): controlla la macchina a stati del controller TAP.
  5. TRST (Test Reset, opzionale): resetta in modo asincrono il controller TAP.

Poiché JTAG è un’architettura a daisy-chain, più IC (ad esempio un MCU, un FPGA e un CPLD) possono essere collegati in serie su un singolo bus JTAG, consentendo a un singolo header di debug di programmare e testare l’intera scheda.

SWD (Serial Wire Debug)

SWD è un’alternativa a JTAG specifica di ARM, progettata appositamente per i moderni microcontrollori Cortex-M con vincoli di pin. Riconoscendo che 4 o 5 pin dedicati rappresentano un costoso onere di footprint sui piccoli IC, ARM ha creato un protocollo che realizza le stesse capacità di debug e accesso alla memoria utilizzando solo due pin:

  1. SWDIO (Serial Wire Data Input/Output): un pin dati bidirezionale.
  2. SWCLK (Serial Wire Clock): il segnale di clock.

Un terzo pin, SWO (Serial Wire Output), è eccezionalmente potente ma spesso sottoutilizzato. SWO opera tramite l’ARM ITM (Instrumentation Trace Macrocell). Fornisce un flusso di dati ad alta velocità e unidirezionale in uscita dal chip senza arrestare il processore né utilizzare cicli UART. Ciò consente profiling in tempo reale, tracciamento delle variabili e debug printf() a overhead zero sul pin SWO, in modo sincrono con l’esecuzione del codice.

Il dilemma di sicurezza delle porte di debug

JTAG e SWD forniscono un accesso “god-mode” al silicio. Un ingegnere collegato a queste porte può arrestare il processore, leggere posizioni di memoria arbitrarie, effettuare il dump del contenuto della flash e manipolare i registri della CPU.

Dal punto di vista della sicurezza, una porta di debug esposta e non protetta è una vulnerabilità catastrofica. Aggira completamente il Secure Boot, rendendo banalmente sfruttabili le cifrature software. Gli attaccanti cercano abitualmente i test pad JTAG/SWD sulle PCB per fare reverse engineering del firmware proprietario o estrarre chiavi crittografiche.

Riferimenti ufficiali