X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fgw16012.c;h=819cb5131813b8d91591aacf871ceef958d66a05;hp=218ac4c61e3b049ce7452d4cf37357bd92db4057;hb=96261e827782235709fcdfb2c1bbb93fedc977be;hpb=4102c784321e68d8d82174148a51d4bcd8f14c82 diff --git a/src/jtag/gw16012.c b/src/jtag/gw16012.c index 218ac4c61e..819cb51318 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,6 +65,10 @@ #endif #include #include +#else /* not PARPORT_USE_PPDEV */ +#ifndef _WIN32 +#include +#endif #endif #if PARPORT_USE_GIVEIO == 1 @@ -82,7 +82,7 @@ #include "log.h" /* configuration */ -unsigned long gw16012_port; +u16 gw16012_port; /* interface variables */ @@ -107,8 +107,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, @@ -135,7 +133,7 @@ void gw16012_data(u8 value) #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); @@ -156,7 +154,7 @@ void gw16012_control(u8 value) #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); @@ -288,13 +286,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 +311,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 +326,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 +358,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) { @@ -407,13 +419,13 @@ int gw16012_execute_queue(void) #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); + DEBUG("sleep %i", cmd->cmd.sleep->us); #endif jtag_sleep(cmd->cmd.sleep->us); break; @@ -424,7 +436,7 @@ int gw16012_execute_queue(void) cmd = cmd->next; } - return ERROR_OK; + return retval; } #if PARPORT_USE_GIVEIO == 1 @@ -458,7 +470,6 @@ int gw16012_init(void) #if PARPORT_USE_PPDEV == 1 char buffer[256]; int i = 0; - u8 control_port; #endif u8 status_port; @@ -469,7 +480,7 @@ int gw16012_init(void) return ERROR_JTAG_INIT_FAILED; } -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) DEBUG("opening /dev/ppi%d...", gw16012_port); snprintf(buffer, 256, "/dev/ppi%d", gw16012_port); @@ -488,7 +499,7 @@ int gw16012_init(void) DEBUG("...open"); -#ifndef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) i=ioctl(device_handle, PPCLAIM); if (i<0) { @@ -519,7 +530,7 @@ int gw16012_init(void) WARNING("No gw16012 port specified, using default '0x378' (LPT1)"); } - DEBUG("requesting privileges for parallel port 0x%x...", gw16012_port); + 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 */ @@ -530,6 +541,13 @@ int gw16012_init(void) return ERROR_JTAG_INIT_FAILED; } 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);