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_ptr
arreglo alshift_register
de la CPU actualmente seleccionada y al mismo tiempo recolectar los bits que llegan de la CPU en el*data_out_ptr
arreglo, 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_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 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_ptr
puntero 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_ptr
me 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 ?
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 APACC
y DPACC
requiere 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 APACC
estado 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)
Sean Houlihane
ma kishawy