summaryrefslogtreecommitdiff
path: root/src/jtag/gw16012.c
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-03-15 13:36:44 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-03-15 13:36:44 +0000
commitcb582796539d35920e918bec2d0118eb3736d40e (patch)
tree0c46f343c31094c65d196c66cc821e0a6d43bf49 /src/jtag/gw16012.c
parente0c2e30660bef422744e885ab32c26c58978a8a1 (diff)
downloadopenocd_libswd-cb582796539d35920e918bec2d0118eb3736d40e.tar.gz
openocd_libswd-cb582796539d35920e918bec2d0118eb3736d40e.tar.bz2
openocd_libswd-cb582796539d35920e918bec2d0118eb3736d40e.tar.xz
openocd_libswd-cb582796539d35920e918bec2d0118eb3736d40e.zip
- reworked file i/o. every fileaccess (target, flash, nand, in future configuration, too) should now go through the fileio subsystem
- added support for reading IHEX files (through fileio) - load/dump_binary renamed to the more generic load/dump_image <file> <address> ['bin'|'ihex'] - added NAND framework (preliminary) - added support for the LPC3180 SLC and MLC NAND controllers (preliminary) - fix initialization for parport - gw16012 fixes/cleanups - added EmbeddedICE version 7 (preliminary, reported on two LPC23xx devices so far) - added 'arm7_9 etm <target#>' configuration command to enable access to the ETM registers git-svn-id: svn://svn.berlios.de/openocd/trunk@132 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/jtag/gw16012.c')
-rw-r--r--src/jtag/gw16012.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/jtag/gw16012.c b/src/jtag/gw16012.c
index 218ac4c6..8211fee3 100644
--- a/src/jtag/gw16012.c
+++ b/src/jtag/gw16012.c
@@ -288,13 +288,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 +313,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 +328,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++;
}
@@ -530,6 +538,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 */
+#ifdef __FreeBSD__
+ outb(gw16012_port + 2, 0x0);
+#else
+ outb(0x0, gw16012_port + 2);
+#endif
#endif /* PARPORT_USE_PPDEV */
gw16012_input(&status_port);