¿Cómo leer/escribir desde una CPU usando un usbWiggler?

Lectura de la API de Macraigor para usbWiggler

MacraigorApi_ JtagScanlO

BOOLEAN_TYPE MacraigorApi_JTAGScanIO(
                               char *shift_register,
                               unsigned_int length_in_bits,
                               MEMORY_BUFFER_TYPE *data_in_ptr,
                               MEMORY_BUFFER_TYPE *data_out_ptr)

Use JTAG para escanear el flujo de bits contenido en el *data_in_ptrarreglo al shift_registerde la CPU actualmente seleccionada y al mismo tiempo recolectar los bits que llegan de la CPU en el *data_out_ptrarreglo, dejando la CPU en el estado "RunTestidle" al final de la operación Devuelve TRUE si comando completado con éxito

shift_register["IR"/"DR"] - registro de desplazamiento de destino (IR= registro de instrucción JTAG, DR= registro de datos JTAG

length_in_bits[1 - ... ] número de bits para cambiar dentro/fuera de la CPU

data_in_ptrpuntero a la matriz que contiene los bits que se desplazarán a la CPU, en el formato [8,7,6,5,4,3,2,1,0] [15,14,13,12,11,10,9, 8] ... donde al final de la operación de escaneo, el bit O será el bit más cercano a SDO y el bit N será el bit más cercano a SDI

data_out_ptrpuntero a la matriz que contiene el bit escaneado desde la CPU en el mismo formato que data_in_ptr, donde el bit byte Obit O contiene el primer bit escaneado desde la CPU

No estoy seguro de entender claramente esta descripción. Así que jugando con el código C++ y Cortex M3 hice esto:

int scanBits = 0x292;
unsigned char data_in[256];
unsigned char *data_in_ptr = &data_in[0];
unsigned char data_out[256];
unsigned char *data_out_ptr = &data_out[0];
MacraigorApi_JTAGScanIO("DR",
                        scanBits, 
                        (MEMORY_BUFFER_TYPE *)data_in_ptr,
                        (MEMORY_BUFFER_TYPE *)data_out_ptr);

Y data_out_ptrme mostró un resultado como este:

1110010001001111111111111111111111111111111001001101001010101010011001
0010110000000000000000000000000000000000000000001100011111110100110111
1110111111011111101111000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000100110000010001001111101010100
0010000110000000100000010001001110001001000000001000000100010011111101
1100011100000000000011000111111101000110000000000000110001111111010011
1100000000000000000000000000000000001000000001000000100010101001010100
0000000000001100011111110011011100000000010000101010101011100001111111
0000000000100000000101100011000010100000000001100011111110011001100000
000000000000000000000000000000000000000000101000100111110010000

¿ Alguien puede explicarme en palabras más simples qué significa esta descripción de API ? Soy nuevo en este campo, por lo que gran parte de la jerga aquí no es tan clara para mí.

También estoy un poco confundido con esto. ¿Cómo puedo, a partir de este flujo de bits , obtener qué datos había en una dirección X ?

¿De qué CPU estás escribiendo en el JTAG? Eso determinará los estados de IR legales, donde podrá dar más sentido a los escaneos DR.
@SeanHoulihane Corteza M3

Respuestas (1)

El Cortex M3 casi siempre se implementará con un DAP CoreSight que proporciona el puerto de depuración eterno. De manera simplista, utiliza el JTAG para establecer registros de control en el DAP, y el DAP realiza accesos asignados a la memoria en el SoC para implementar sus solicitudes.

Los valores de IR están documentados en CoreSight Component TRM . Este es efectivamente el primer nivel de direccionamiento. Los accesos DP le permiten configurar el registro de selección de AP. Los accesos AP le permiten configurar el registro de dirección de transferencia y realizar lecturas y escrituras.

Tenga en cuenta que para una lectura, debe solicitar la lectura y luego emitir otra transacción para recuperar el resultado: los accesos en el chip son asíncronos con la transacción JTAG. Luego vería la dirección APACC, la lectura APACC, el resultado APACC para una sola transacción de memoria de 32 bits.

En el nivel de API, es posible que desee agregar un nivel de abstracción. Cambiar entre CoreSight APACCy DPACCrequiere cambiar una cadena de 6 bits al registro de instrucciones, pero una vez que se inicializan los registros DP, la mayoría de las transacciones solo necesitan usar el APACCestado del registro de instrucciones con una carga útil de 35 bits.

Su flujo de transacciones APACC utilizará los bits de datos [1:0] como una dirección para los registros AP, el bit 2 como lectura/escritura y [35:3] como carga útil.

Una de las transacciones DPACC (seleccionada por los primeros 2 valores de bit DR como una dirección) es un registro de ID estático, debe asegurarse de que esto haga lo que espera antes de intentar hacer algo más complejo.

Este documento técnico de descripción general tiene una descripción un poco más detallada de las conexiones de depuración (de la página 8).

DP    //Debug port (JTAG or Serial wire, external interface)   
AP    //Access Port (APB in this case, on-chip bus master)   
DPACC //JTAG state, transactions are handled by the DP (r/w with 2 bit address)   
APACC //JTAG state, transactions are handled by the AP (r/w with 2 bit address)
Gracias. Estoy tratando de dar sentido a lo que dices entendiendo primero todas estas abreviaturas que me presentaste. Google no es tan amigable cuando se trata de encontrar el significado de estas abreviaturas tecnológicas. También estoy tratando de conectar esto con el código que estoy tratando de escribir/editar. ¿Alguna idea de cómo se traduciría en código lo que dijiste con la API de Macraigor?
Se agregaron un poco más de detalles, los dos documentos que vinculé deberían proporcionar algunos antecedentes técnicos.