]> sigrok.org Git - sigrok-firmware-fx2lafw.git/commitdiff
Added basic debugf for sending debug messages over USB
authorJoel Holdsworth <redacted>
Sat, 18 Feb 2012 08:50:24 +0000 (08:50 +0000)
committerUwe Hermann <redacted>
Wed, 22 Feb 2012 21:58:36 +0000 (22:58 +0100)
Makefile
debug.c [new file with mode: 0644]
debug.h [new file with mode: 0644]
dscr.a51
fx2lafw.c

index 0256737c278bf0e8e49aea044f0b88edc47f1e3f..dee427041a8fc2a73c66b9c74f1063f3a4e673df 100644 (file)
--- a/Makefile
+++ b/Makefile
 ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ##
 
-SOURCES = fx2lafw.c
+SOURCES = fx2lafw.c debug.c
 A51_SOURCES = dscr.a51
 BASENAME = fx2lafw
 
 FX2LIBDIR ?= fx2lib
 
+DEBUG ?= 0
+ifeq ($(DEBUG), 1)
+       SDCCFLAGS += -DDEBUG
+else
+       SDCCFLAGS += -DNDEBUG
+endif
+
 include $(FX2LIBDIR)/lib/fx2.mk
 
diff --git a/debug.c b/debug.c
new file mode 100644 (file)
index 0000000..8dab8c7
--- /dev/null
+++ b/debug.c
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the fx2lafw project.
+ *
+ * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.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
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#ifdef DEBUG
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include <delay.h>
+#include <fx2regs.h>
+#include <fx2macros.h>
+
+#include "debug.h"
+
+#define MESSAGE_LENGTH_MAX 64
+
+void debugf(const char *format, ...) {
+       va_list arg;
+       int count;
+
+       // Format the string
+       va_start (arg, format);
+       count = vsprintf(EP6FIFOBUF, format, arg);
+       va_end (arg);
+
+       // Zero out the rest of the buffer
+       while(count < MESSAGE_LENGTH_MAX)
+               EP6FIFOBUF[count++] = '\0';
+
+       // Send the buffer
+       count = 32;
+       EP6BCH = MSB(count);
+       SYNCDELAY4;
+       EP6BCL = LSB(count);
+}
+
+#endif
diff --git a/debug.h b/debug.h
new file mode 100644 (file)
index 0000000..790327b
--- /dev/null
+++ b/debug.h
@@ -0,0 +1,29 @@
+/*
+ * This file is part of the fx2lafw project.
+ *
+ * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.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
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
+#ifdef DEBUG
+
+/**
+ * A printf the prints messages through the UART
+ * EP6.
+ */
+void debugf(const char *format, ...);
+
+#endif
index 735e55d30ff46649c7cd9e1bd87a32361f917454..c96e003d773c8fa28bb79dd00915d5f797a3721c 100644 (file)
--- a/dscr.a51
+++ b/dscr.a51
@@ -97,7 +97,7 @@ highspd_dscr_end:
        .db     DSCR_INTERFACE_TYPE
        .db     0                       ; Interface index
        .db     0                       ; Alternate setting index
-       .db     1                       ; Number of endpoints
+       .db     2                       ; Number of endpoints
        .db     0xff                    ; Class (vendor specific)
        .db     0xff                    ; Subclass (vendor specific)
        .db     0xff                    ; Protocol (vendor specific)
@@ -112,6 +112,15 @@ highspd_dscr_end:
        .db     0x02                    ; Max. packet size, MSB (512 bytes)
        .db     0x00                    ; Polling interval
 
+       ; Endpoint 6 (IN)
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                    ;  EP number (6), direction (IN)
+       .db     ENDPOINT_TYPE_BULK      ; Endpoint type (bulk)
+       .db     0x00                    ; Max. packet size, LSB (64 bytes)
+       .db     0x02                    ; Max. packet size, MSB (64 bytes)
+       .db     0x00                    ; Polling interval
+
 highspd_dscr_realend:
 
        .even
@@ -137,7 +146,7 @@ fullspd_dscr_end:
        .db     DSCR_INTERFACE_TYPE
        .db     0                       ; Interface index
        .db     0                       ; Alternate setting index
-       .db     1                       ; Number of endpoints
+       .db     2                       ; Number of endpoints
        .db     0xff                    ; Class (vendor specific)
        .db     0xff                    ; Subclass (vendor specific)
        .db     0xff                    ; Protocol (vendor specific)
@@ -152,6 +161,15 @@ fullspd_dscr_end:
        .db     0x00                    ; Max. packet size, MSB (64 bytes)
        .db     0x00                    ; Polling interval
 
+       ; Endpoint 6 (IN)
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db 0x86                        ; EP number (6), direction (IN)
+       .db     ENDPOINT_TYPE_BULK      ; Endpoint type (bulk)
+       .db     0x40                    ; Max. packet size, LSB (64 bytes)
+       .db     0x00                    ; Max. packet size, MSB (64 bytes)
+       .db     0x00                    ; Polling interval
+
 fullspd_dscr_realend:
 
        .even
index 6c99f04692b86dd87db8de16864cc85814c9a3ce..f69955161eb18b88aeda21a5775e7c4658e34a78 100644 (file)
--- a/fx2lafw.c
+++ b/fx2lafw.c
@@ -259,21 +259,36 @@ static void setup_endpoints(void)
                 (0 << 1) | (0 << 0);     /* EP buffering: quad buffering */
        SYNCDELAY();
 
-       /* Disable all other EPs (EP1, EP4, EP6, and EP8). */
+       /* Setup EP6 (IN) in the debug build. */
+#ifdef DEBUG
+       EP6CFG = (1 << 7) |               /* EP is valid/activated */
+                (1 << 6) |               /* EP direction: IN */
+                (1 << 5) | (0 << 4) |    /* EP Type: bulk */
+                (0 << 3) |               /* EP buffer size: 512 */
+                (0 << 2) |               /* Reserved */
+                (1 << 1) | (0 << 0);     /* EP buffering: double buffering */
+#else
+       EP6CFG &= ~bmVALID;
+#endif
+       SYNCDELAY();
+
+       /* Disable all other EPs (EP4 and EP8). */
        EP1INCFG &= ~bmVALID;
        SYNCDELAY();
        EP1OUTCFG &= ~bmVALID;
        SYNCDELAY();
        EP4CFG &= ~bmVALID;
        SYNCDELAY();
-       EP6CFG &= ~bmVALID;
-       SYNCDELAY();
        EP8CFG &= ~bmVALID;
        SYNCDELAY();
 
        /* EP2: Reset the FIFOs. */
        /* Note: RESETFIFO() gets the EP number WITHOUT bit 7 set/cleared. */
        RESETFIFO(0x02)
+#ifdef DEBUG
+       /* Reset the FIFOs of EP6 when in debug mode. */
+       RESETFIFO(0x06)
+#endif
 
        /* EP2: Enable AUTOIN mode. Set FIFO width to 8bits. */
        EP2FIFOCFG = bmAUTOIN | ~bmWORDWIDE;
@@ -340,12 +355,15 @@ BOOL handle_set_interface(BYTE ifc, BYTE alt_ifc)
        /* (2) Reset data toggles of the EPs in the interface. */
        /* Note: RESETTOGGLE() gets the EP number WITH bit 7 set/cleared. */
        RESETTOGGLE(0x82);
+       RESETTOGGLE(0x76);
 
        /* (3) Restore EPs to their default conditions. */
        /* Note: RESETFIFO() gets the EP number WITHOUT bit 7 set/cleared. */
        RESETFIFO(0x02);
        /* TODO */
 
+       RESETFIFO(0x06);
+
        /* (4) Clear the HSNAK bit. Not needed, fx2lib does this. */
 
        return TRUE;