Browse Source

add the possibility to monitor the JTAG state machine

master
michael 18 years ago
parent
commit
0a060ead2d
  1. 8
      Makefile
  2. 4
      jtagkey.c
  3. 206
      jtagmon.c
  4. 1
      jtagmon.h

8
Makefile

@ -12,11 +12,11 @@ SOBJECTS=libusb-driver.so libusb-driver-DEBUG.so
all: $(SOBJECTS)
libusb-driver.so: usb-driver.c parport.c jtagkey.c config.c usb-driver.h parport.h jtagkey.h config.h Makefile
gcc $(CFLAGS) usb-driver.c parport.c config.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
libusb-driver.so: usb-driver.c parport.c jtagkey.c config.c jtagmon.c usb-driver.h parport.h jtagkey.h config.h jtagmon.h Makefile
gcc $(CFLAGS) usb-driver.c parport.c config.c jtagmon.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
libusb-driver-DEBUG.so: usb-driver.c parport.c jtagkey.c config.c usb-driver.h parport.h jtagkey.h config.h Makefile
gcc -DDEBUG $(CFLAGS) usb-driver.c parport.c config.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
libusb-driver-DEBUG.so: usb-driver.c parport.c jtagkey.c config.c jtagmon.c usb-driver.h parport.h jtagkey.h config.h jtagmon.h Makefile
gcc -DDEBUG $(CFLAGS) usb-driver.c parport.c config.c jtagmon.c $(JTAGKEYSRC) -o $@ -ldl -lusb -lpthread $(FTDI) -shared
clean:
rm -f $(SOBJECTS)

4
jtagkey.c

@ -5,6 +5,7 @@
#include "usb-driver.h"
#include "config.h"
#include "jtagkey.h"
#include "jtagmon.h"
#define USBBUFSIZE 1048576
#define JTAG_SPEED 100000
@ -206,6 +207,9 @@ int jtagkey_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase,
#ifdef DEBUG
if (tr[i].cmdTrans == 13)
DPRINTF("write byte: %d\n", val);
if (tr[i].cmdTrans == 13)
tapmon(val & PP_TCK, val & PP_TMS);
#endif
/* Pad writebuf for read-commands in stream */

206
jtagmon.c

@ -0,0 +1,206 @@
#include <string.h>
#include <stdio.h>
#include "jtagmon.h"
enum tap_states {
TEST_LOGIC_RESET,
RUN_TEST_IDLE,
SELECT_DR,
CAPTURE_DR,
SHIFT_DR,
EXIT1_DR,
PAUSE_DR,
EXIT2_DR,
UPDATE_DR,
SELECT_IR,
CAPTURE_IR,
SHIFT_IR,
EXIT1_IR,
PAUSE_IR,
EXIT2_IR,
UPDATE_IR
};
void tapmon(unsigned char tck, unsigned char tms) {
static unsigned char last_tck = 1;
static int state = TEST_LOGIC_RESET;
static char state_text[32] = "Test Logic Reset";
char last_state_text[32];
int last_state = state;
strcpy(last_state_text, state_text);
if (!last_tck && tck) {
switch(state) {
case TEST_LOGIC_RESET:
if (tms) {
state = TEST_LOGIC_RESET;
} else {
state = RUN_TEST_IDLE;
}
break;
case RUN_TEST_IDLE:
if (tms) {
state = SELECT_DR;
} else {
state = RUN_TEST_IDLE;
}
break;
case SELECT_DR:
if (tms) {
state = SELECT_IR;
} else {
state = CAPTURE_DR;
}
break;
case CAPTURE_DR:
if (tms) {
state = EXIT1_DR;
} else {
state = SHIFT_DR;
}
break;
case SHIFT_DR:
if (tms) {
state = EXIT1_DR;
} else {
state = SHIFT_DR;
}
break;
case EXIT1_DR:
if (tms) {
state = UPDATE_DR;
} else {
state = PAUSE_DR;
}
break;
case PAUSE_DR:
if (tms) {
state = EXIT2_DR;
} else {
state = PAUSE_DR;
}
break;
case EXIT2_DR:
if (tms) {
state = UPDATE_DR;
} else {
state = SHIFT_DR;
}
break;
case UPDATE_DR:
if (tms) {
state = SELECT_DR;
} else {
state = RUN_TEST_IDLE;
}
break;
case SELECT_IR:
if (tms) {
state = TEST_LOGIC_RESET;
} else {
state = CAPTURE_IR;
}
break;
case CAPTURE_IR:
if (tms) {
state = EXIT1_IR;
} else {
state = SHIFT_IR;
}
break;
case SHIFT_IR:
if (tms) {
state = EXIT1_IR;
} else {
state = SHIFT_IR;
}
break;
case EXIT1_IR:
if (tms) {
state = UPDATE_IR;
} else {
state = PAUSE_IR;
}
break;
case PAUSE_IR:
if (tms) {
state = EXIT2_IR;
} else {
state = PAUSE_IR;
}
break;
case EXIT2_IR:
if (tms) {
state = UPDATE_IR;
} else {
state = SHIFT_IR;
}
break;
case UPDATE_IR:
if (tms) {
state = SELECT_DR;
} else {
state = RUN_TEST_IDLE;
}
break;
}
switch(state) {
case TEST_LOGIC_RESET:
strcpy(state_text, "Test Logic Reset");
break;
case RUN_TEST_IDLE:
strcpy(state_text, "Run-Test / Idle");
break;
case SELECT_DR:
strcpy(state_text, "Select-DR");
break;
case CAPTURE_DR:
strcpy(state_text, "Capture-DR");
break;
case SHIFT_DR:
strcpy(state_text, "Shift-DR");
break;
case EXIT1_DR:
strcpy(state_text, "Exit1-DR");
break;
case PAUSE_DR:
strcpy(state_text, "Pause-DR");
break;
case EXIT2_DR:
strcpy(state_text, "Exit2-DR");
break;
case UPDATE_DR:
strcpy(state_text, "Update-DR");
break;
case SELECT_IR:
strcpy(state_text, "Select-IR");
break;
case CAPTURE_IR:
strcpy(state_text, "Capture-IR");
break;
case SHIFT_IR:
strcpy(state_text, "Shift-IR");
break;
case EXIT1_IR:
strcpy(state_text, "Exit1-IR");
break;
case PAUSE_IR:
strcpy(state_text, "Pause-IR");
break;
case EXIT2_IR:
strcpy(state_text, "Exit2-IR");
break;
case UPDATE_IR:
strcpy(state_text, "Update-IR");
break;
}
if (last_state != state) {
fprintf(stderr,"TAP state transition from %s to %s\n", last_state_text, state_text);
}
}
last_tck = tck;
}

1
jtagmon.h

@ -0,0 +1 @@
void tapmon(unsigned char tck, unsigned char tms);
Loading…
Cancel
Save