X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fgw16012.c;h=8caaba63f7a6fd3b6b7b0a86375766ee60c2a526;hp=218ac4c61e3b049ce7452d4cf37357bd92db4057;hb=d47e1b8f362379d8a2307f49e2b42115a3f40524;hpb=4102c784321e68d8d82174148a51d4bcd8f14c82 diff --git a/src/jtag/gw16012.c b/src/jtag/gw16012.c index 218ac4c61e..8caaba63f7 100644 --- a/src/jtag/gw16012.c +++ b/src/jtag/gw16012.c @@ -30,10 +30,8 @@ #endif /* system includes */ - -/* system includes */ -// -ino: 060521-1036 -#ifdef __FreeBSD__ +/* -ino: 060521-1036 */ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include #include @@ -43,13 +41,11 @@ #else -#ifndef _WIN32 -#include -#else +#ifdef _WIN32 #include "errno.h" #endif /* _WIN32 */ -#endif /* __FreeBSD__ */ +#endif /* __FreeBSD__, __FreeBSD_kernel__ */ #include #include @@ -58,7 +54,7 @@ #include #if PARPORT_USE_PPDEV == 1 -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include #include #define PPRSTATUS PPIGSTATUS @@ -69,20 +65,23 @@ #endif #include #include +#else /* not PARPORT_USE_PPDEV */ +#ifndef _WIN32 +#include +#endif #endif #if PARPORT_USE_GIVEIO == 1 #if IS_CYGWIN == 1 #include #include -#undef ERROR #endif #endif #include "log.h" /* configuration */ -unsigned long gw16012_port; +u16 gw16012_port; /* interface variables */ @@ -107,8 +106,6 @@ jtag_interface_t gw16012_interface = .execute_queue = gw16012_execute_queue, - .support_pathmove = 0, - .speed = gw16012_speed, .register_commands = gw16012_register_commands, .init = gw16012_init, @@ -129,13 +126,13 @@ void gw16012_data(u8 value) gw16012_msb ^= 0x80; /* toggle MSB */ #ifdef _DEBUG_GW16012_IO_ - DEBUG("%2.2x", value); + LOG_DEBUG("%2.2x", value); #endif #if PARPORT_USE_PPDEV == 1 ioctl(device_handle, PPWDATA, &value); #else - #ifdef __FreeBSD__ + #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) outb(gw16012_port, value); #else outb(value, gw16012_port); @@ -150,13 +147,13 @@ void gw16012_control(u8 value) gw16012_control_value = value; #ifdef _DEBUG_GW16012_IO_ - DEBUG("%2.2x", gw16012_control_value); + LOG_DEBUG("%2.2x", gw16012_control_value); #endif #if PARPORT_USE_PPDEV == 1 ioctl(device_handle, PPWCONTROL, &gw16012_control_value); #else - #ifdef __FreeBSD__ + #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) outb(gw16012_port + 2, gw16012_control_value); #else outb(gw16012_control_value, gw16012_port + 2); @@ -174,14 +171,14 @@ void gw16012_input(u8 *value) #endif #ifdef _DEBUG_GW16012_IO_ - DEBUG("%2.2x", *value); + LOG_DEBUG("%2.2x", *value); #endif } /* (1) assert or (0) deassert reset lines */ void gw16012_reset(int trst, int srst) { - DEBUG("trst: %i, srst: %i", trst, srst); + LOG_DEBUG("trst: %i, srst: %i", trst, srst); if (trst == 0) gw16012_control(0x0d); @@ -206,7 +203,7 @@ void gw16012_end_state(state) end_state = state; else { - ERROR("BUG: %i is not a valid end state", state); + LOG_ERROR("BUG: %i is not a valid end state", state); exit(-1); } } @@ -246,7 +243,7 @@ void gw16012_path_move(pathmove_command_t *cmd) } else { - ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]); + LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]); exit(-1); } @@ -288,13 +285,17 @@ void gw16012_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size) enum tap_state saved_end_state = end_state; u8 scan_out, scan_in; - if (ir_scan) - gw16012_end_state(TAP_SI); - else - gw16012_end_state(TAP_SD); + /* only if we're not already in the correct Shift state */ + if (!((!ir_scan && (cur_state == TAP_SD)) || (ir_scan && (cur_state == TAP_SI)))) + { + if (ir_scan) + gw16012_end_state(TAP_SI); + else + gw16012_end_state(TAP_SD); - gw16012_state_move(); - gw16012_end_state(saved_end_state); + gw16012_state_move(); + gw16012_end_state(saved_end_state); + } while (type == SCAN_OUT && ((bits_left - 1) > 7)) { @@ -309,6 +310,9 @@ void gw16012_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size) while (bits_left-- > 0) { u8 tms = 0; + + scan_out = buf_get_u32(buffer, bit_count, 1); + if (bits_left == 0) /* last bit */ { if ((ir_scan && (end_state == TAP_SI)) @@ -321,14 +325,15 @@ void gw16012_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size) tms = 2; } } - - scan_out = buf_get_u32(buffer, bit_count, 1); + gw16012_data(scan_out | tms); + if (type != SCAN_OUT) { gw16012_input(&scan_in); buf_set_u32(buffer, bit_count, 1, ((scan_in & 0x08) >> 3)); - } + } + bit_count++; } @@ -352,6 +357,12 @@ int gw16012_execute_queue(void) int scan_size; enum scan_type type; u8 *buffer; + int retval; + + /* return ERROR_OK, unless a jtag_read_buffer returns a failed check + * that wasn't handled by a caller-provided error handler + */ + retval = ERROR_OK; while (cmd) { @@ -359,14 +370,14 @@ int gw16012_execute_queue(void) { case JTAG_END_STATE: #ifdef _DEBUG_JTAG_IO_ - DEBUG("end_state: %i", cmd->cmd.end_state->end_state); + LOG_DEBUG("end_state: %i", cmd->cmd.end_state->end_state); #endif if (cmd->cmd.end_state->end_state != -1) gw16012_end_state(cmd->cmd.end_state->end_state); break; case JTAG_RESET: #ifdef _DEBUG_JTAG_IO_ - DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); + LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); #endif if (cmd->cmd.reset->trst == 1) { @@ -376,7 +387,7 @@ int gw16012_execute_queue(void) break; case JTAG_RUNTEST: #ifdef _DEBUG_JTAG_IO_ - DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state); + LOG_DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state); #endif if (cmd->cmd.runtest->end_state != -1) gw16012_end_state(cmd->cmd.runtest->end_state); @@ -384,7 +395,7 @@ int gw16012_execute_queue(void) break; case JTAG_STATEMOVE: #ifdef _DEBUG_JTAG_IO_ - DEBUG("statemove end in %i", cmd->cmd.statemove->end_state); + LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state); #endif if (cmd->cmd.statemove->end_state != -1) gw16012_end_state(cmd->cmd.statemove->end_state); @@ -392,7 +403,7 @@ int gw16012_execute_queue(void) break; case JTAG_PATHMOVE: #ifdef _DEBUG_JTAG_IO_ - DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); + LOG_DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); #endif gw16012_path_move(cmd->cmd.pathmove); break; @@ -402,29 +413,29 @@ int gw16012_execute_queue(void) scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer); type = jtag_scan_type(cmd->cmd.scan); #ifdef _DEBUG_JTAG_IO_ - DEBUG("%s scan (%i) %i bit end in %i", (cmd->cmd.scan->ir_scan) ? "ir" : "dr", + LOG_DEBUG("%s scan (%i) %i bit end in %i", (cmd->cmd.scan->ir_scan) ? "ir" : "dr", type, scan_size, cmd->cmd.scan->end_state); #endif gw16012_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size); if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK) - return ERROR_JTAG_QUEUE_FAILED; + retval = ERROR_JTAG_QUEUE_FAILED; if (buffer) free(buffer); break; case JTAG_SLEEP: #ifdef _DEBUG_JTAG_IO_ - DEBUG("sleep", cmd->cmd.sleep->us); + LOG_DEBUG("sleep %i", cmd->cmd.sleep->us); #endif jtag_sleep(cmd->cmd.sleep->us); break; default: - ERROR("BUG: unknown JTAG command type encountered"); + LOG_ERROR("BUG: unknown JTAG command type encountered"); exit(-1); } cmd = cmd->next; } - return ERROR_OK; + return retval; } #if PARPORT_USE_GIVEIO == 1 @@ -458,41 +469,40 @@ int gw16012_init(void) #if PARPORT_USE_PPDEV == 1 char buffer[256]; int i = 0; - u8 control_port; #endif u8 status_port; #if PARPORT_USE_PPDEV == 1 if (device_handle>0) { - ERROR("device is already opened"); + LOG_ERROR("device is already opened"); return ERROR_JTAG_INIT_FAILED; } -#ifdef __FreeBSD__ - DEBUG("opening /dev/ppi%d...", gw16012_port); +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + LOG_DEBUG("opening /dev/ppi%d...", gw16012_port); snprintf(buffer, 256, "/dev/ppi%d", gw16012_port); device_handle = open(buffer, O_WRONLY); #else - DEBUG("opening /dev/parport%d...", gw16012_port); + LOG_DEBUG("opening /dev/parport%d...", gw16012_port); snprintf(buffer, 256, "/dev/parport%d", gw16012_port); device_handle = open(buffer, O_WRONLY); #endif if (device_handle<0) { - ERROR("cannot open device. check it exists and that user read and write rights are set"); + LOG_ERROR("cannot open device. check it exists and that user read and write rights are set"); return ERROR_JTAG_INIT_FAILED; } - DEBUG("...open"); + LOG_DEBUG("...open"); -#ifndef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) i=ioctl(device_handle, PPCLAIM); if (i<0) { - ERROR("cannot claim device"); + LOG_ERROR("cannot claim device"); return ERROR_JTAG_INIT_FAILED; } @@ -500,7 +510,7 @@ int gw16012_init(void) i= ioctl(device_handle, PPSETMODE, & i); if (i<0) { - ERROR(" cannot set compatible mode to device"); + LOG_ERROR(" cannot set compatible mode to device"); return ERROR_JTAG_INIT_FAILED; } @@ -508,7 +518,7 @@ int gw16012_init(void) i = ioctl(device_handle, PPNEGOT, & i); if (i<0) { - ERROR("cannot set compatible 1284 mode to device"); + LOG_ERROR("cannot set compatible 1284 mode to device"); return ERROR_JTAG_INIT_FAILED; } #endif @@ -516,20 +526,27 @@ int gw16012_init(void) if (gw16012_port == 0) { gw16012_port = 0x378; - WARNING("No gw16012 port specified, using default '0x378' (LPT1)"); + LOG_WARNING("No gw16012 port specified, using default '0x378' (LPT1)"); } - DEBUG("requesting privileges for parallel port 0x%x...", gw16012_port); + LOG_DEBUG("requesting privileges for parallel port 0x%lx...", gw16012_port); #if PARPORT_USE_GIVEIO == 1 if (gw16012_get_giveio_access() != 0) #else /* PARPORT_USE_GIVEIO */ if (ioperm(gw16012_port, 3, 1) != 0) #endif /* PARPORT_USE_GIVEIO */ { - ERROR("missing privileges for direct i/o"); + LOG_ERROR("missing privileges for direct i/o"); return ERROR_JTAG_INIT_FAILED; } - DEBUG("...privileges granted"); + LOG_DEBUG("...privileges granted"); + + /* make sure parallel port is in right mode (clear tristate and interrupt */ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + outb(gw16012_port + 2, 0x0); +#else + outb(0x0, gw16012_port + 2); +#endif #endif /* PARPORT_USE_PPDEV */ gw16012_input(&status_port);