Laurentiu Cocanu - more help text
[fw/openocd] / src / jtag / parport.c
index f9d7b0292b206178501edc1715484764dddf39bb..13f04904fa4ced4b8b25ea7f7d6d595d15ceb4fd 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2008 by Spencer Oliver                                  *
+ *   spen@spen-soft.co.uk                                                  *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
@@ -27,7 +30,7 @@
 #include "bitbang.h"
 
 /* system includes */
-// -ino: 060521-1036
+/* -ino: 060521-1036 */
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
 
 #include <sys/types.h>
@@ -70,7 +73,6 @@
 #if IS_CYGWIN == 1
 #include <windows.h>
 #include <errno.h>
-#undef ERROR
 #endif
 #endif
 
@@ -102,6 +104,7 @@ cable_t cables[] =
        { "wiggler_ntrst_inverted",
                                                        0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x11, 0x80, 0x80, 0x80, 0x00 },
        { "old_amt_wiggler",    0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x11, 0x80, 0x80, 0x80, 0x00 },
+       { "arm-jtag",                   0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x01, 0x80, 0x80, 0x80, 0x00 },
        { "chameleon",                  0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
        { "dlc5",                               0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00 },
        { "triton",                             0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
@@ -121,7 +124,7 @@ cable_t cables[] =
 
 /* configuration */
 char* parport_cable = NULL;
-unsigned long parport_port;
+u16 parport_port;
 static int parport_exit = 0;
 
 /* interface variables
@@ -189,7 +192,7 @@ int parport_read(void)
                return 0;
 }
 
-static inline void parport_write_data(void)
+static __inline__ void parport_write_data(void)
 {
        u8 output;
        output = dataport_value ^ cable->OUTPUT_INVERT;
@@ -231,7 +234,7 @@ void parport_write(int tck, int tms, int tdi)
 /* (1) assert or (0) deassert reset lines */
 void parport_reset(int trst, int srst)
 {
-       DEBUG("trst: %i, srst: %i", trst, srst);
+       LOG_DEBUG("trst: %i, srst: %i", trst, srst);
 
        if (trst == 0)
                dataport_value |= cable->TRST_MASK;
@@ -259,46 +262,44 @@ void parport_led(int on)
 
 int parport_speed(int speed)
 {
-       jtag_speed = speed;
-       
        return ERROR_OK;
 }
 
 int parport_register_commands(struct command_context_s *cmd_ctx)
 {
        register_command(cmd_ctx, NULL, "parport_port", parport_handle_parport_port_command,
-               COMMAND_CONFIG, NULL);
+               COMMAND_CONFIG, "either the address of the I/O port or the number of the \91/dev/parport\92 device");
        register_command(cmd_ctx, NULL, "parport_cable", parport_handle_parport_cable_command,
-               COMMAND_CONFIG, NULL);
+               COMMAND_CONFIG, "the layout of the parallel port cable used to connect to the target");
        register_command(cmd_ctx, NULL, "parport_write_on_exit", parport_handle_write_on_exit_command,
-               COMMAND_CONFIG, NULL);
+               COMMAND_CONFIG, "configure the parallel driver to write a known value to the parallel interface");
 
        return ERROR_OK;
 }
 
 #if PARPORT_USE_GIVEIO == 1
-int parport_get_giveio_access()
+int parport_get_giveio_access(void)
 {
-    HANDLE h;
-    OSVERSIONINFO version;
-
-    version.dwOSVersionInfoSize = sizeof version;
-    if (!GetVersionEx( &version )) {
-        errno = EINVAL;
-        return -1;
-    }
-    if (version.dwPlatformId != VER_PLATFORM_WIN32_NT)
-        return 0;
-
-    h = CreateFile( "\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
-    if (h == INVALID_HANDLE_VALUE) {
-        errno = ENODEV;
-        return -1;
-    }
-
-    CloseHandle( h );
-
-    return 0;
+       HANDLE h;
+       OSVERSIONINFO version;
+       
+       version.dwOSVersionInfoSize = sizeof version;
+       if (!GetVersionEx( &version )) {
+               errno = EINVAL;
+               return -1;
+       }
+       if (version.dwPlatformId != VER_PLATFORM_WIN32_NT)
+               return 0;
+       
+       h = CreateFile( "\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+       if (h == INVALID_HANDLE_VALUE) {
+               errno = ENODEV;
+               return -1;
+       }
+       
+       CloseHandle( h );
+       
+       return 0;
 }
 #endif
 
@@ -315,7 +316,7 @@ int parport_init(void)
        if ((parport_cable == NULL) || (parport_cable[0] == 0))
        {
                parport_cable = "wiggler";
-               WARNING("No parport cable specified, using default 'wiggler'");
+               LOG_WARNING("No parport cable specified, using default 'wiggler'");
        }
        
        while (cur_cable->name)
@@ -330,7 +331,7 @@ int parport_init(void)
 
        if (!cable)
        {
-               ERROR("No matching cable found for %s", parport_cable);
+               LOG_ERROR("No matching cable found for %s", parport_cable);
                return ERROR_JTAG_INIT_FAILED;
        }
        
@@ -339,17 +340,17 @@ int parport_init(void)
 #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;
        }
 
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-       DEBUG("opening /dev/ppi%d...", parport_port);
+       LOG_DEBUG("opening /dev/ppi%d...", parport_port);
 
        snprintf(buffer, 256, "/dev/ppi%d", parport_port);
        device_handle = open(buffer, O_WRONLY);
 #else /* not __FreeBSD__, __FreeBSD_kernel__ */
-       DEBUG("opening /dev/parport%d...", parport_port);
+       LOG_DEBUG("opening /dev/parport%d...", parport_port);
 
        snprintf(buffer, 256, "/dev/parport%d", parport_port);
        device_handle = open(buffer, O_WRONLY);
@@ -357,17 +358,17 @@ int parport_init(void)
 
        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");
 
 #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;
        }
 
@@ -375,7 +376,7 @@ int parport_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;
        }
 
@@ -383,7 +384,7 @@ int parport_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 /* not __FreeBSD__, __FreeBSD_kernel__ */
@@ -392,23 +393,23 @@ int parport_init(void)
        if (parport_port == 0)
        {
                parport_port = 0x378;
-               WARNING("No parport port specified, using default '0x378' (LPT1)");
+               LOG_WARNING("No parport port specified, using default '0x378' (LPT1)");
        }
        
        dataport = parport_port;
        statusport = parport_port + 1;
        
-       DEBUG("requesting privileges for parallel port 0x%lx...", dataport);
+       LOG_DEBUG("requesting privileges for parallel port 0x%lx...", dataport);
 #if PARPORT_USE_GIVEIO == 1
        if (parport_get_giveio_access() != 0)
 #else /* PARPORT_USE_GIVEIO */
        if (ioperm(dataport, 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__)