linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dirk Jagdmann <doj@cubic.org>
To: linux-hotplug@vger.kernel.org
Subject: patch for fxload
Date: Sun, 05 Sep 2004 14:18:31 +0000	[thread overview]
Message-ID: <413B2037.2000606@cubic.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 613 bytes --]

Hello coders,

I had to debug something connected to fxload and wasn't able (for 
reasons I don't know yet) to see the error messages from stderr. So I 
patched fxload to output messages to syslog instead and made this 
switchable via command line. You are free to include this code with the 
official versions if you like.

For another reason unknown to me my editor refused to make my changes 
idented like the rest of the code. Shame on me. Please tell me if you 
can fix it or if I should try harder (and with a different editor).

-- 
---> doj / cubic
----> http://cubic.org/~doj
-----> http://llg.cubic.org

[-- Attachment #2: fxload-syslog.diff --]
[-- Type: text/plain, Size: 16689 bytes --]

diff -u -U 5 -r --new-file -x *~ -X /tmp/diffexclude fxload-2002_04_11/ezusb.c fxload-2002_04_11.doj/ezusb.c
--- fxload-2002_04_11/ezusb.c	Fri Apr 12 06:08:01 2002
+++ fxload-2002_04_11.doj/ezusb.c	Sun Sep  5 13:46:27 2004
@@ -32,10 +32,12 @@
 # include  <linux/usb.h>
 # include  <linux/usbdevice_fs.h>
 
 # include "ezusb.h"
 
+void logerror(char *format, ...);
+
 /*
  * This file contains functions for downloading firmware into Cypress
  * EZ-USB microcontrollers. These chips use control endpoint 0 and vendor
  * specific commands to support writing into the on-chip SRAM. They also
  * support writing into the CPUCS register, which is how we reset the
@@ -121,11 +123,11 @@
     size_t				length
 ) {
     struct usbdevfs_ctrltransfer	ctrl;
 
     if (length > USHRT_MAX) {
-	fputs ("length too big", stderr);
+	logerror("length too big\n");
 	return -EINVAL;
     }
 
     /* 8 bytes SETUP */
     ctrl.bRequestType = requestType;
@@ -168,21 +170,20 @@
     size_t				len
 ) {
     int					status;
 
     if (verbose)
-	fprintf (stderr, "%s, addr 0x%04x len %4d (0x%04x)\n",
-		label, addr, len, len);
+	logerror("%s, addr 0x%04x len %4d (0x%04x)\n", label, addr, len, len);
     status = ctrl_msg (device,
 	USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, opcode,
 	addr, 0,
 	data, len);
     if (status != len) {
 	if (status < 0)
-	    perror (label);
+	    logerror("%s : %s\n", strerror(errno), label);
 	else
-	    fprintf (stderr, "%s ==> %d\n", label, status);
+	    logerror("%s ==> %d\n", label, status);
     }
     return status;
 }
 
 /*
@@ -197,21 +198,20 @@
     size_t				len
 ) {
     int					status;
 
     if (verbose)
-	fprintf (stderr, "%s, addr 0x%04x len %4d (0x%04x)\n",
-		label, addr, len, len);
+	logerror("%s, addr 0x%04x len %4d (0x%04x)\n", label, addr, len, len);
     status = ctrl_msg (device,
 	USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, opcode,
 	addr, 0,
 	(unsigned char *) data, len);
     if (status != len) {
 	if (status < 0)
-	    perror (label);
+	    logerror("%s : %s", strerror(errno), label);
 	else
-	    fprintf (stderr, "%s ==> %d\n", label, status);
+	    logerror("%s ==> %d\n", label, status);
     }
     return status;
 }
 
 /*
@@ -225,22 +225,21 @@
 ) {
     int			status;
     unsigned char	data = doRun ? 0 : 1;
 
     if (verbose)
-	fprintf (stderr, "%s\n", data ? "stop CPU" : "reset CPU");
+	logerror("%s\n", data ? "stop CPU" : "reset CPU");
     status = ctrl_msg (device,
 	USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 	RW_INTERNAL,
 	addr, 0,
 	&data, 1);
     if (status != 1) {
-	char *mesg = "can't modify CPUCS";
 	if (status < 0)
-	    perror (mesg);
+	    logerror("%s : %s", strerror(errno), device);
 	else
-	    fprintf (stderr, "%s\n", mesg);
+	    logerror("can't modify CPUCS\n");
 	return 0;
     } else
 	return 1;
 }
 
@@ -303,28 +302,28 @@
 	size_t		len;
 	unsigned	idx, off;
 
 	cp = fgets(buf, sizeof buf, image);
 	if (cp == 0) {
-	    fprintf (stderr, "EOF without EOF record!\n");
+	    logerror("EOF without EOF record!\n");
 	    break;
 	}
 
 	/* EXTENSION: "# comment-till-end-of-line", for copyrights etc */
 	if (buf[0] == '#')
 	    continue;
 
 	if (buf[0] != ':') {
-	    fprintf (stderr, "not an ihex record: %s", buf);
+	    logerror("not an ihex record: %s", buf);
 	    return -2;
 	}
 
 	if (verbose >= 3) {
 	    cp = strchr (buf, '\n');
 	    if (cp)
 		*cp = 0;
-	    fprintf (stderr, "** LINE: %s\n", buf);
+	    logerror("** LINE: %s\n", buf);
 	}
 
 	/* Read the length field (up to 16 bytes) */
 	tmp = buf[3];
 	buf[3] = 0;
@@ -350,21 +349,21 @@
 	buf[9] = tmp;
 
 	/* If this is an EOF record, then make it so. */
 	if (type == 1) {
 	    if (verbose >= 2)
-		fprintf (stderr, "EOF on hexfile\n");
+		logerror("EOF on hexfile\n");
 	    break;
 	}
 
 	if (type != 0) {
-	    fprintf (stderr, "unsupported record type: %u\n", type);
+	    logerror("unsupported record type: %u\n", type);
 	    return -3;
 	}
 
 	if ((len * 2) + 11 >= strlen(buf)) {
-	    fprintf (stderr, "record too short?\n");
+	    logerror("record too short?\n");
 	    return -4;
 	}
 
 	// FIXME check for _physically_ contiguous not just virtually
 	// e.g. on FX2 0x1f00-0x2100 includes both on-chip and external
@@ -442,35 +441,35 @@
     unsigned		retry = 0;
 
     switch (ctx->mode) {
     case internal_only:		/* CPU should be stopped */
 	if (external) {
-	    fprintf (stderr, "can't write %d bytes external memory at 0x%04x\n",
+	    logerror("can't write %d bytes external memory at 0x%04x\n",
 		len, addr);
 	    return -EINVAL;
 	}
 	break;
     case skip_internal:		/* CPU must be running */
 	if (!external) {
 	    if (verbose >= 2) {
-		fprintf (stderr, "SKIP on-chip RAM, %d bytes at 0x%04x\n",
+		logerror("SKIP on-chip RAM, %d bytes at 0x%04x\n",
 		    len, addr);
 	    }
 	    return 0;
 	}
 	break;
     case skip_external:		/* CPU should be stopped */
 	if (external) {
 	    if (verbose >= 2) {
-		fprintf (stderr, "SKIP external RAM, %d bytes at 0x%04x\n",
+		logerror("SKIP external RAM, %d bytes at 0x%04x\n",
 		    len, addr);
 	    }
 	    return 0;
 	}
 	break;
     default:
-	fprintf (stderr, "bug\n");
+	logerror("bug\n");
 	return -EDOM;
     }
 
     ctx->total += len;
     ctx->count++;
@@ -512,14 +511,14 @@
     struct ram_poke_context	ctx;
     int				status;
 
     image = fopen (path, "r");
     if (image == 0) {
-	fprintf (stderr, "%s: unable to open for input.\n", path);
+	logerror("%s: unable to open for input.\n", path);
 	return -2;
     } else if (verbose)
-	fprintf (stderr, "open RAM hexfile image %s\n", path);
+	logerror("open RAM hexfile image %s\n", path);
 
     /* EZ-USB original/FX and FX2 devices differ, apart from the 8051 core */
     if (fx2) {
 	cpucs_addr = 0xe600;
 	is_external = fx2_is_external;
@@ -540,19 +539,19 @@
     } else {
 	ctx.mode = skip_internal;
 
 	/* let CPU run; overwrite the 2nd stage loader later */
 	if (verbose)
-	    fprintf (stderr, "2nd stage:  write external memory\n");
+	    logerror("2nd stage:  write external memory\n");
     }
     
     /* scan the image, first (maybe only) time */
     ctx.device = fd;
     ctx.total = ctx.count = 0;
     status = parse_ihex (image, &ctx, is_external, ram_poke);
     if (status < 0) {
-	fprintf (stderr, "unable to download %s\n", path);
+	logerror("unable to download %s\n", path);
 	return status;
     }
 
     /* second part of 2nd stage: rescan */
     if (stage) {
@@ -563,20 +562,20 @@
 	    return -1;
 
 	/* at least write the interrupt vectors (at 0x0000) for reset! */
 	rewind (image);
 	if (verbose)
-	    fprintf (stderr, "2nd stage:  write on-chip memory\n");
+	    logerror("2nd stage:  write on-chip memory\n");
 	status = parse_ihex (image, &ctx, is_external, ram_poke);
 	if (status < 0) {
-	    fprintf (stderr, "unable to completely download %s\n", path);
+	    logerror("unable to completely download %s\n", path);
 	    return status;
 	}
     }
 
     if (verbose)
-	fprintf (stderr, "... WROTE: %d bytes, %d segments, avg %d\n",
+	logerror("... WROTE: %d bytes, %d segments, avg %d\n",
 	    ctx.total, ctx.count, ctx.total / ctx.count);
 	
     /* now reset the CPU so it runs what we just downloaded */
     if (!ezusb_cpucs (fd, cpucs_addr, 1))
 	return -1;
@@ -605,18 +604,18 @@
     struct eeprom_poke_context	*ctx = context;
     int			rc;
     unsigned char	header [4];
 
     if (external) {
-	fprintf (stderr,
+      logerror(
 	    "EEPROM can't init %d bytes external memory at 0x%04x\n",
 	    len, addr);
 	return -EINVAL;
     }
 
     if (len > 1023) {
-	fprintf (stderr, "not fragmenting %d bytes\n", len);
+	logerror("not fragmenting %d bytes\n", len);
 	return -EDOM;
     }
 
     /* NOTE:  No retries here.  They don't seem to be needed;
      * could be added if that changes.
@@ -668,26 +667,26 @@
 	return -1;
     }
 
     image = fopen (path, "r");
     if (image == 0) {
-	fprintf (stderr, "%s: unable to open for input.\n", path);
+	logerror("%s: unable to open for input.\n", path);
 	return -2;
     } else if (verbose)
-	fprintf (stderr, "open EEPROM hexfile image %s\n", path);
+	logerror("open EEPROM hexfile image %s\n", path);
 
     if (verbose)
-	fprintf (stderr, "2nd stage:  write boot EEPROM\n");
+	logerror("2nd stage:  write boot EEPROM\n");
 
     /* EZ-USB family devices differ, apart from the 8051 core */
     if (strcmp ("fx2", type) == 0) {
 	first_byte = 0xC2;
 	cpucs_addr = 0xe600;
 	is_external = fx2_is_external;
 	ctx.ee_addr = 8;
 	config &= 0x4f;
-	fprintf (stderr,
+	logerror(
 	    "FX2:  config = 0x%02x, %sconnected, I2C = %d KHz\n",
 	    config,
 	    (config & 0x40) ? "dis" : "",
 		// NOTE:  old chiprevs let CPU clock speed be set
 		// or cycle inverted here.  You shouldn't use those.
@@ -699,11 +698,11 @@
 	first_byte = 0xB6;
 	cpucs_addr = 0x7f92;
 	is_external = fx_is_external;
 	ctx.ee_addr = 9;
 	config &= 0x07;
-	fprintf (stderr,
+	logerror(
 	    "FX:  config = 0x%02x, %d MHz%s, I2C = %d KHz\n",
 	    config,
 	    ((config & 0x04) ? 48 : 24),
 	    (config & 0x02) ? " inverted" : "",
 	    (config & 0x01) ? 400 : 100
@@ -713,14 +712,14 @@
 	first_byte = 0xB2;
 	cpucs_addr = 0x7f92;
 	is_external = fx_is_external;
 	ctx.ee_addr = 7;
 	config = 0;
-	fprintf (stderr, "AN21xx:  no EEPROM config byte\n");
+	logerror("AN21xx:  no EEPROM config byte\n");
 
     } else {
-	fprintf (stderr, "?? Unrecognized microcontroller type %s ??\n", type);
+	logerror("?? Unrecognized microcontroller type %s ??\n", type);
 	return -1;
     }
 
     /* make sure the EEPROM won't be used for booting,
      * in case of problems writing it
@@ -734,20 +733,20 @@
     /* scan the image, write to EEPROM */
     ctx.device = dev;
     ctx.last = 0;
     status = parse_ihex (image, &ctx, is_external, eeprom_poke);
     if (status < 0) {
-	fprintf (stderr, "unable to write EEPROM %s\n", path);
+	logerror("unable to write EEPROM %s\n", path);
 	return status;
     }
 
     /* append a reset command */
     value = 0;
     ctx.last = 1;
     status = eeprom_poke (&ctx, cpucs_addr, 0, &value, sizeof value);
     if (status < 0) {
-	fprintf (stderr, "unable to append reset to EEPROM %s\n", path);
+	logerror("unable to append reset to EEPROM %s\n", path);
 	return status;
     }
 
     /* write the config byte for FX, FX2 */
     if (strcmp ("an21", type) != 0) {
diff -u -U 5 -r --new-file -x *~ -X /tmp/diffexclude fxload-2002_04_11/fxload.8 fxload-2002_04_11.doj/fxload.8
--- fxload-2002_04_11/fxload.8	Fri Apr 12 06:08:01 2002
+++ fxload-2002_04_11.doj/fxload.8	Sun Sep  5 14:49:37 2004
@@ -26,10 +26,11 @@
 .SH "NAME"
 fxload \- Firmware download to EZ-USB devices
 .SH "SYNOPSIS"
 .B fxload
 .BI "[ \-v ]"
+.BI "[ \-l ]"
 .BI "[ \-D " devpath " ]"
 .BI "[ \-I " hexfile " ]"
 .BI "[ \-t " type " ]"
 .BI "[ \-c " config " ]"
 .BI "[ \-s " loader " ]"
@@ -170,10 +171,13 @@
 .B "\-v"
 Prints some diagnostics, such as download addresses and sizes,
 to standard error.  Repeat the flag
 .RB ( -vv ", " -vvv )
 to get more diagnostics.
+.TP
+.B "\-l"
+print error and verbose messages to syslog.
 .TP
 .BI "\-D " devpath
 Specifies the "usbfs" path name for the device in question,
 such as
 .IR /proc/bus/usb/004/080 .
diff -u -U 5 -r --new-file -x *~ -X /tmp/diffexclude fxload-2002_04_11/main.c fxload-2002_04_11.doj/main.c
--- fxload-2002_04_11/main.c	Fri Apr 12 06:08:01 2002
+++ fxload-2002_04_11.doj/main.c	Sun Sep  5 14:49:37 2004
@@ -62,10 +62,25 @@
 
 #ifndef	FXLOAD_VERSION
 #	define FXLOAD_VERSION (__DATE__ " (development)")
 #endif
 
+#include <errno.h>
+#include <syslog.h>
+#include <stdarg.h>
+static int dosyslog=0;
+void logerror(char *format, ...)
+{
+  va_list ap;
+  va_start(ap, format);
+  if(dosyslog)
+    vsyslog(LOG_ERR, format, ap);
+  else
+    vfprintf(stderr, format, ap);
+  va_end(ap);
+}
+
 int main(int argc, char*argv[])
 {
       const char	*link_path = 0;
       const char	*ihex_path = 0;
       const char	*device_path = getenv("DEVICE");
@@ -73,11 +88,11 @@
       const char	*stage1 = 0;
       mode_t		mode = 0;
       int		opt;
       int		config = -1;
 
-      while ((opt = getopt (argc, argv, "2vV?D:I:L:c:m:s:t:")) != EOF)
+      while ((opt = getopt (argc, argv, "2vV?D:I:L:c:lm:s:t:")) != EOF)
       switch (opt) {
 
 	  case '2':		// original version of "-t fx2"
 	    type = "fx2";
 	    break;
@@ -99,17 +114,20 @@
 	    return 0;
 
 	  case 'c':
 	    config = strtoul (optarg, 0, 0);
 	    if (config < 0 || config > 255) {
-		fputs ("illegal config byte: ", stderr);
-		fputs (optarg, stderr);
-		fputs ("\n", stderr);
+	      logerror("illegal config byte: %s\n", optarg);
 		goto usage;
 	    }
 	    break;
 
+      case 'l':
+	openlog(argv[0], LOG_CONS|LOG_NOWAIT|LOG_PERROR, LOG_USER);
+	dosyslog=1;
+	break;
+
 	  case 'm':
 	    mode = strtoul(optarg,0,0);
 	    mode &= 0777;
 	    break;
 
@@ -120,13 +138,11 @@
 	  case 't':
 	    if (strcmp (optarg, "an21")		// original AnchorChips parts
 		    && strcmp (optarg, "fx")	// updated Cypress versions
 		    && strcmp (optarg, "fx2")	// Cypress USB 2.0 versions
 		    ) {
-		fputs ("illegal microcontroller type: ", stderr);
-		fputs (optarg, stderr);
-		fputs ("\n", stderr);
+	      logerror("illegal microcontroller type: %s\n", optarg);
 		goto usage;
 	    }
 	    type = optarg;
 	    break;
 
@@ -140,32 +156,29 @@
 
       }
 
       if (config >= 0) {
 	    if (type == 0) {
-		fputs ("must specify microcontroller type to write EEPROM!\n",
-		    stderr);
+	      logerror("must specify microcontroller type to write EEPROM!\n");
 		goto usage;
 	    }
 	    if (!stage1 || !ihex_path) {
-		fputs ("need 2nd stage loader and firmware to write EEPROM!\n",
-		    stderr);
+	      logerror("need 2nd stage loader and firmware to write EEPROM!\n");
 		goto usage;
 	    }
 	    if (link_path || mode) {
-		fputs ("links and modes not set up when writing EEPROM\n",
-		    stderr);
+	      logerror("links and modes not set up when writing EEPROM\n");
 		goto usage;
 	    }
       }
 
       if (!device_path) {
-	    fputs ("no device specified!\n", stderr);
+	logerror("no device specified!\n");
 usage:
 	    fputs ("usage: ", stderr);
 	    fputs (argv [0], stderr);
-	    fputs (" [-vV] [-t type] [-D devpath]\n", stderr);
+	    fputs (" [-vV] [-l] [-t type] [-D devpath]\n", stderr);
 	    fputs ("\t\t[-I firmware_hexfile] ", stderr);
 	    fputs ("[-s loader] [-c config_byte]\n", stderr);
 	    fputs ("\t\t[-L link] [-m mode]\n", stderr);
 	    fputs ("... [-D devpath] overrides DEVICE= in env\n", stderr);
 	    fputs ("... device types:  one of an21, fx, fx2\n", stderr);
@@ -177,27 +190,27 @@
 	    int fd = open(device_path, O_RDWR);
 	    int status;
 	    int	fx2;
 
 	    if (fd == -1) {
-		  perror(device_path);
+	      logerror("%s : %s\n", strerror(errno), device_path);
 		  return -1;
 	    }
 
 	    if (type == 0) {
 	    	type = "fx";	/* an21-compatible for most purposes */
 		fx2 = 0;
 	    } else
  		fx2 = (strcmp (type, "fx2") == 0);
 	    
 	    if (verbose)
-		fprintf (stderr, "microcontroller type: %s\n", type);
+		logerror("microcontroller type: %s\n", type);
 
 	    if (stage1) {
 		/* first stage:  put loader into internal memory */
 		if (verbose)
-		    fprintf (stderr, "1st stage:  load 2nd stage loader\n");
+		    logerror("1st stage:  load 2nd stage loader\n");
 		status = ezusb_load_ram (fd, stage1, fx2, 0);
 		if (status != 0)
 		    return status;
 		
 		/* second stage ... write either EEPROM, or RAM.  */
@@ -208,11 +221,11 @@
 		if (status != 0)
 		    return status;
 	    } else {
 		/* single stage, put into internal memory */
 		if (verbose)
-		    fprintf (stderr, "single stage:  load on-chip memory\n");
+		    logerror("single stage:  load on-chip memory\n");
 		status = ezusb_load_ram (fd, ihex_path, fx2, 0);
 		if (status != 0)
 		    return status;
 	    }
 	    
@@ -223,25 +236,25 @@
 
       if (link_path) {
 	    int rc = unlink(link_path);
 	    rc = symlink(device_path, link_path);
 	    if (rc == -1) {
-		  perror(link_path);
+		  logerror("%s : %s\n", strerror(errno), link_path);
 		  return -1;
 	    }
       }
 
       if (mode != 0) {
 	    int rc = chmod(device_path, mode);
 	    if (rc == -1) {
-		  perror(link_path);
+		  logerror("%s : %s\n", strerror(errno), link_path);
 		  return -1;
 	    }
       }
 
       if (!ihex_path && !link_path && !mode) {
-	    fputs ("missing request! (firmware, link, or mode)\n", stderr);
+	    logerror("missing request! (firmware, link, or mode)\n");
 	    return -1;
       }
 
       return 0;
 }
@@ -274,6 +287,5 @@
  *  Added the fxload program.
  *  Rework root makefile and hotplug.spec to install in prefix
  *  location without need of spec file for install.
  *
  */
-

             reply	other threads:[~2004-09-05 14:18 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-05 14:18 Dirk Jagdmann [this message]
  -- strict thread matches above, loose matches on Subject: below --
2005-01-11  3:58 patch for fxload David Brownell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=413B2037.2000606@cubic.org \
    --to=doj@cubic.org \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).