summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-04-28 07:34:43 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-04-28 07:34:43 +0000
commitde6d69cc60acae64b35f73be6753ff85545d8221 (patch)
tree08a628bc256da8e2586210ec3801dca3cd577fd4 /src
parente8240209fe08cc65c0eccbcd988aacfe6f7a344a (diff)
downloadopenocd+libswd-de6d69cc60acae64b35f73be6753ff85545d8221.tar.gz
openocd+libswd-de6d69cc60acae64b35f73be6753ff85545d8221.tar.bz2
openocd+libswd-de6d69cc60acae64b35f73be6753ff85545d8221.tar.xz
openocd+libswd-de6d69cc60acae64b35f73be6753ff85545d8221.zip
Zach Welch <zw@superlucidity.net> fix gw16012 with --enable-parport_ppdev
git-svn-id: svn://svn.berlios.de/openocd/trunk@1553 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r--src/jtag/gw16012.c106
1 files changed, 67 insertions, 39 deletions
diff --git a/src/jtag/gw16012.c b/src/jtag/gw16012.c
index 8454c32c..dd306f96 100644
--- a/src/jtag/gw16012.c
+++ b/src/jtag/gw16012.c
@@ -461,65 +461,83 @@ static int gw16012_get_giveio_access(void)
}
#endif
-static int gw16012_init(void)
-{
#if PARPORT_USE_PPDEV == 1
- char buffer[256];
- int i = 0;
-#endif
- u8 status_port;
-
-#if PARPORT_USE_PPDEV == 1
- if (device_handle>0)
- {
- LOG_ERROR("device is already opened");
- return ERROR_JTAG_INIT_FAILED;
- }
#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
- LOG_DEBUG("opening /dev/parport%d...", gw16012_port);
+#define GW16012_PPDEV_NAME "ppi"
- snprintf(buffer, 256, "/dev/parport%d", gw16012_port);
- device_handle = open(buffer, O_WRONLY);
-#endif
- if (device_handle<0)
+static int gw16012_init_ioctls(void)
+{
+ int temp = 0;
+ temp = ioctl(device_handle, PPCLAIM);
+ if (temp < 0)
{
- LOG_ERROR("cannot open device. check it exists and that user read and write rights are set");
+ LOG_ERROR("cannot claim device");
return ERROR_JTAG_INIT_FAILED;
}
- LOG_DEBUG("...open");
+ temp = PARPORT_MODE_COMPAT;
+ temp = ioctl(device_handle, PPSETMODE, &temp);
+ if (temp < 0)
+ {
+ LOG_ERROR(" cannot set compatible mode to device");
+ return ERROR_JTAG_INIT_FAILED;
+ }
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
- i=ioctl(device_handle, PPCLAIM);
- if (i<0)
+ temp = IEEE1284_MODE_COMPAT;
+ temp = ioctl(device_handle, PPNEGOT, &temp);
+ if (temp < 0)
{
- LOG_ERROR("cannot claim device");
+ LOG_ERROR("cannot set compatible 1284 mode to device");
return ERROR_JTAG_INIT_FAILED;
}
+ return ERROR_OK;
+}
+#else
- i = PARPORT_MODE_COMPAT;
- i= ioctl(device_handle, PPSETMODE, & i);
- if (i<0)
+#define GW16012_PPDEV_NAME "parport"
+
+static int gw16012_init_ioctls(void)
+{
+ return ERROR_OK;
+}
+
+#endif // defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+
+static int gw16012_init_device(void)
+{
+ const char *device_name = GW16012_PPDEV_NAME;
+ char buffer[256];
+
+ if (device_handle > 0)
{
- LOG_ERROR(" cannot set compatible mode to device");
+ LOG_ERROR("device is already opened");
return ERROR_JTAG_INIT_FAILED;
}
- i = IEEE1284_MODE_COMPAT;
- i = ioctl(device_handle, PPNEGOT, & i);
- if (i<0)
+ snprintf(buffer, 256, "/dev/%s%d", device_name, gw16012_port);
+ LOG_DEBUG("opening %s...", buffer);
+
+ device_handle = open(buffer, O_WRONLY);
+ if (device_handle<0)
{
- LOG_ERROR("cannot set compatible 1284 mode to device");
+ LOG_ERROR("cannot open device. check it exists and that user read and write rights are set");
return ERROR_JTAG_INIT_FAILED;
}
-#endif
-#else
+
+ LOG_DEBUG("...open");
+
+ if (gw16012_init_ioctls() != ERROR_OK)
+ return ERROR_JTAG_INIT_FAILED;
+
+ return ERROR_OK;
+}
+
+#else // PARPORT_USE_PPDEV
+
+static int gw16012_init_device(void)
+{
if (gw16012_port == 0)
{
gw16012_port = 0x378;
@@ -544,7 +562,17 @@ static int gw16012_init(void)
#else
outb(0x0, gw16012_port + 2);
#endif
-#endif /* PARPORT_USE_PPDEV */
+ return ERROR_OK;
+}
+
+#endif // PARPORT_USE_PPDEV
+
+static int gw16012_init(void)
+{
+ u8 status_port;
+
+ if (gw16012_init_device() != ERROR_OK)
+ return ERROR_JTAG_INIT_FAILED;
gw16012_input(&status_port);
gw16012_msb = (status_port & 0x80) ^ 0x80;