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

2

Leer 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 la secuencia de bits contenida en la matriz *data_in_ptr a la    shift_register de la CPU seleccionada actualmente y al mismo tiempo   recolecta los bits que llegan de la CPU en *data_out_ptr array,   dejando la CPU en el estado "RunTestidle" al final de la operación   Devuelve VERDADERO si el comando se completó con éxito

     

shift_register ["IR" / "DR"] - registro de desplazamiento de destino (IR = JTAG   Registro de instrucciones, DR = Registro de datos JTAG

     

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

     

data_in_ptr puntero 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   El final del bit de operación de escaneo O será el bit más cercano a SDO y bit   N será el bit más cercano a SDI

     

data_out_ptr puntero a la matriz que contiene el bit escaneado desde la CPU en el   el mismo formato que data_in_ptr, donde el bit de bit Obit O contiene el primer bit   escaneado desde la CPU

No estoy seguro de entender esta descripción claramente. Entonces, jugar 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 el data_out_ptr me mostró un resultado como este:

1110010001001111111111111111111111111111111001001101001010101010011001
0010110000000000000000000000000000000000000000001100011111110100110111
1110111111011111101111000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000100110000010001001111101010100
0010000110000000100000010001001110001001000000001000000100010011111101
1100011100000000000011000111111101000110000000000000110001111111010011
1100000000000000000000000000000000001000000001000000100010101001010100
0000000000001100011111110011011100000000010000101010101011100001111111
0000000000100000000101100011000010100000000001100011111110011001100000
000000000000000000000000000000000000000000101000100111110010000

¿Puede alguien explicarme en palabras más simples lo que 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 sobre esto, ¿Cómo puedo, a partir de este flujo de bits , obtener qué datos? estaba en una X dirección ?

    
pregunta M. A. Kishawy

1 respuesta

2

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

Los valores de IR se documentan 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 la 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 a la transacción JTAG. Luego verá la dirección APACC, lectura APACC, 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 APACC y DPACC requiere cambiar una cadena de 6 bits al registro de instrucciones, pero una vez que se inician los registros DP, la mayoría de las transacciones solo necesitan usar el estado de registro de instrucciones APACC con una carga útil de 35 bits.

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

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

Este resumen white paper tiene una descripción algo 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)
    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas