Zach Welch <zw@superlucidity.net> fix gw16012 with --enable-parport_ppdev
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 28 Apr 2009 07:34:43 +0000 (07:34 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 28 Apr 2009 07:34:43 +0000 (07:34 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1553 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/gw16012.c

index 8454c32cf66b6bde968156232f5b05cea9cab5f4..dd306f962a7fb956ef5d9544495a5a03447d6cb5 100644 (file)
@@ -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;