¿Qué es el puerto JTAG?

Anuncio
RaspberryPi

En entradas anteriores abordamos de forma superficial como debuggear un proyecto usando el puerto JTAG y mencionamos que es una interfaz para transmitir señales de un microcontrolador. En esta entrada queremos ahondar más en este puerto y cómo se implementa en distintos sistemas embebidos.

¿Por qué usar JTAG?

JTAG es una interfaz de hardware común que provee a una computadora un modo fácil de comunicarse con los chips en una tarjeta. Se originó inicialmente como un consorcio, el Joint Test Access Group, a mediados de los 80s para identificar la creciente dificultad de probar las tarjetas de circuito impreso (PCB). JTAG ha tenido un uso extendido desde que se incluyó en el chip Intel 80486 en 1990 y se estableció como el estándar IEEE 1491 el mismo año. Hoy en día la interfaz JTAG se emplea para depurar código, programar y probar virtualmente cualquier sistema embebido.

Boundary Scanning

Con la creación de los primeros chips fue necesario crear formas de hacer pruebas en la tarjeta para verificar que la información se transmitiera de forma correcta. Al principio esto se lograba con puntos de prueba en los que se colocaba una sonda y se media la señal. Pero con el creciente aumento en la densidad de componentes y el aumento de la complejidad de los chips fue necesario replantearse estos métodos. La solución fue colocar electrónica de prueba en el mismo chip a la que se pudiera acceder con unos cuantos pines de señal, lo que permitió eventualmente todas las funciones del puerto JTAG.

En verde se puede observar los dispositivos lógicos que ayudan a analizar las señales del chip. Se puede ver que solo se necesitan algunos pines para establecer la comunicación. Vïa: Senrio

Los cinco pines JTAG

JTAG por si mismo NO es el nombre de un dispositivo, ni un software; tampoco es un protocolo, ni un tipo de conector específico. Lo que si es JTAG es un conjunto de señales que nos permiten leer los datos que se transmiten en un chip. Las cinco señales que se especifican en la norma IEEE 1149.1 y son:

Anuncio
RaspberryPi
  • TCKTest Clock
    • La señal de reloj o el «metrónomo» que indica la velocidad del el controlador TAP. La señal de este pin simplemente tiene una frecuencia fija y sirve para sincronizar las señales. El estándar no especifica una velocidad o frecuencia de reloj, por lo que puede configurarse por el usuario a través del depurador o programador.
  • TMSTest Mode Select
    • Selector de Modo de prueba; las señales en este pin definen que acciones toma el puerto JTAG. A través de este pin, se le indica a la interfaz JTAG que hacer.
  • TDITest Data-In
    • El pin que ingresa los datos hacia el chip. El estándar JTAG no define el protocolo de comunicación que debe usarse en este pin. Esto se deja cargo de quien manufactura el dispositivo. Hasta donde concierne al protocolo este pin solo ingresa unos y ceros dentro del chip, por lo que queda a cargo del desarrollador decidir que información ingresar.
  • TDOTest Data-Out
    • El pin de datos que salen del chip. Al igual que el pin de entrada, no hay definido un protocolo de comunicación, por lo que se debe interpretar los datos que salen para que tengan utilidad.
  • TRST:  Test Rese(Opcional)
    • Este pin resetea la interfaz JTAG a un estado conocido. Su uso es opcional y puede omitirse en algunos casos para establecer la comunicación.
A pesar de los variados conectores, la interfaz JTAG conserva las 4 o 5 señales básicas para comunicarse con el chip. Vía: Senrio

La máquina de estados JTAG

El estándar IEEE 1149.1 no sólo especifica las señales que deben usarse para la interfaz JTAG, también define el comportamiento de una máquina de estados que manipula la información dentro del chip. A grandes rasgos, indica como debe desplazarse la información en los registros para ingresarla o sacarla mediante los pines TDI y TDO.

Demostración báscia de cómo funciona la máquina de estados. Este controlador puede implementarse incluso con un Arduino, debido a la simpleza de la máquina de estados. Vïa: Senrio

El puerto JTAG en el Arduino MKR1000

Un ejemplo fácil de reconocer es la interfaz JTAG del Arduino MKR1000. Este puerto se encuentra en medio de la tarjeta, con un header de 5×2. Para emplear esta interfaz, se puede acceder mediante una herramienta especial, como el programador/debugger Atmel ICE.

La interfaz JTAG se observa en el medio de la tarjeta y sobresale por el header macho al que se conecta el programador. Vía: Arduino
El pin 1 de la interfaz corresponde al pin de la esquina superior derecha de la imagen de arriba. Vïa Arduino Forums

Conclusiones

La interfaz JTAG es un puerto especializado para desarrolladores intermedios a avanzados que requieren depurar un código complejo. Surge de la necesidad de estandarizar la información obtenida al analizar dispositivos de complejidad cada vez mayor. Permite interactuar directamente con el microcontrolador de forma pausada y observar los registros de la memoria directamente, al mandar información al depurador que después se interpreta en una computadora. La importancia de conocer este puerto es que, a medida que avanza la tecnología de semiconductores, cada vez más tarjetas de desarrollo implementarán este tipo de interfaces, por lo que familiarizarse en como funciona puede resultar de gran utilidad.

Referencias:

Introducción a JTAG con el Arduino MKR1000 – Parte 1

SWD Debugging the Arduino MKR-WiFi-1010 with Atmel ICE

JTAG Explained (finally!): Why «IoT», Software Security Engineers, and Manufacturers Should Care

Interfaz JTAG de un Arduino siendo identificada por la herramienta JTAGulator, un dispositivo que identifica los pines JTAG de cualquier tarjeta. Vía: Praetorian