From c1b7f76efad625bdf6158411c490840f36c62375 Mon Sep 17 00:00:00 2001
From: "Wesley W. Terpstra" <w.terpstra@gsi.de>
Date: Thu, 28 Mar 2013 11:03:58 +0100
Subject: [PATCH] Initial firmware derived from Wolfgang Wieser.

---
 hdl/eb_usb_core/cdc_acm.c | 591 ++++++++++++++++++++++++++++++++++
 hdl/eb_usb_core/fx2.h     | 380 ++++++++++++++++++++++
 hdl/eb_usb_core/fx2regs.h | 649 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 1620 insertions(+)
 create mode 100644 hdl/eb_usb_core/cdc_acm.c
 create mode 100644 hdl/eb_usb_core/fx2.h
 create mode 100644 hdl/eb_usb_core/fx2regs.h

diff --git a/hdl/eb_usb_core/cdc_acm.c b/hdl/eb_usb_core/cdc_acm.c
new file mode 100644
index 0000000..17e28d7
--- /dev/null
+++ b/hdl/eb_usb_core/cdc_acm.c
@@ -0,0 +1,591 @@
+/* -*- mode: C; c-basic-offset: 3; -*-
+ *
+ * convert_serial2 -- FX2 USB serial port converter
+ * 
+ * by  Brent Baccala <cosine@freesoft.org>   July 2009
+ * and Wolfgang Wieser ] wwieser (a) gmx <*> de [   Aug. 2009
+ *
+ * Based on both usb-fx2-local-examples by Wolfgang Wieser (GPLv2) and
+ * the Cypress FX2 examples.
+ *
+ * This is an FX2 program which re-enumerates to mimic a USB-attached
+ * serial port (a Sierra Wireless modem).  
+ * Anything transmitted to it by the host is echoed back after converting 
+ * lowercase to uppercase.  
+ * The re-enumerated FX2 appears on a Debian Linux machine as something
+ * like /dev/ttyUSB0, and can be tested with a serial port program
+ * like 'minicom'.
+ *
+ * Features like setting and querying things like the baudrate
+ * and line/modem status are unimplemented, and will return USB errors
+ * when the host attempts to perform these operations.  However, the
+ * program works, and I decided to leave out the additional clutter in
+ * favor of a simpler program that can be easily modified to suit
+ * individual needs.
+ *
+ * The program ignores USB Suspend interrupts, and probably violates
+ * the USB standard in this regard, as all USB devices are required to
+ * support Suspend.  The remote wakeup feature is parsed and correctly
+ * handled in the protocol, but of course does nothing since the
+ * device never suspends.
+ */
+
+#define ALLOCATE_EXTERN
+#include "fx2regs.h"
+#include "fx2.h"
+
+// If Rwuen_allowed is TRUE, the device allows the remote wakeup
+// feature to be set by the host.  If the host sets the feature, Rwuen
+// becomes TRUE but nothing else is done.  If Rwuen_allowed is FALSE,
+// the device will signal an error on an attempt to set remote wakeup.
+
+BOOL Rwuen_allowed = FALSE;	// Allow remote wakeup to be enabled
+BOOL Rwuen = FALSE;		// Remote wakeup enable
+BOOL Selfpwr = FALSE;		// Device is (not) self-powered
+
+// USB allows a device to support multiple configurations, only one of
+// which can be active at any given time.  Each configuration can have
+// multiple interfaces, all of which can be active simultaneously, and
+// each interface can also have a setting.  This driver only uses a
+// single configuration with a single interface, which has a single
+// setting, but these variables are here as place holders in case you
+// want to make the driver more sophisticated.
+
+#define NUM_INTERFACES 1
+
+BYTE Configuration;                         // Current device configuration
+BYTE InterfaceSetting[NUM_INTERFACES];      // Current interface settings
+
+// this table is used by the epcs macro 
+const char code  EPCS_Offset_Lookup_Table[] =
+{
+   0,    // EP1OUT
+   1,    // EP1IN
+   2,    // EP2OUT
+   2,    // EP2IN
+   3,    // EP4OUT
+   3,    // EP4IN
+   4,    // EP6OUT
+   4,    // EP6IN
+   5,    // EP8OUT
+   5,    // EP8IN
+};
+
+// macro for generating the address of an endpoint's control and status register (EPnCS)
+#define epcs(EP) (EPCS_Offset_Lookup_Table[(EP & 0x7E) | (EP > 128)] + 0xE6A1)
+
+
+// Read TRM 15.14 for an explanation of which commands need this.
+//
+// nop's take 4 clock cyles.  A single nop is sufficient for both the
+// default setup (48 MHz CPU and interface clock) and this program's
+// setup (12 MHz CPU and 48 MHz interface clocks).
+
+#define	NOP		_asm nop _endasm
+#define	SYNCDELAY	NOP;
+
+
+// USB string descriptors are constructed from this array.  Indices
+// into this array can be placed into the other descriptors to specify
+// manufacturer name, serial number, etc.  Index 0 is reserved for a
+// list of language codes that this program currently ignores, but in
+// principle you can switch between different string tables based on
+// the language requested by the host.
+//
+// The wire format is specified in 16-bit Unicode.  I just use ASCII
+// here and add zero bytes when I construct the string descriptor.  If
+// you actually want to specify Unicode here, disable the code that
+// doubles up these bytes with zeros.
+//
+// Also, since I build the string descriptors directly in the EP0
+// output buffer, I'm limited to 31 character strings (64 byte packet;
+// 2 char overhead; 16 bits per char).  If this is a problem, I'd
+// suggest allocating a block of memory for a longer string descriptor
+// (just like the other descriptors below), building the string
+// descriptors there, then transferring them using the same SUDPTR
+// technique used for the other descriptors, which can handle larger
+// descriptors and breaks them up automatically into small packets.
+
+char * USB_strings[] = { "EN", "WieserLabs & freesoft.org", "FX2 case converter" };
+
+// Descriptors are a real pain since Device and Configuration
+// descriptors have to be word-aligned (this is an FX2 requirement),
+// but Interface and Endpoint descriptors can't be word aligned - they
+// have directly follow their corresponding Configuration descriptor.
+// 'sdcc' provides no facility for structure alignment anyway, so I
+// just hardwire the addresses towards the end of the FX2's 16K RAM.
+//
+// This code will break if you try it on an 8K FX2.  Sigh.
+//
+// I use the DSCR_OFFSET macro both to simplify the address
+// calculations and to figure what value goes into the third field of
+// the Configuration descriptor.
+
+#define DSCR_OFFSET(intrfc, endpnt)    (sizeof(CONFIGDSCR) + \
+		intrfc*sizeof(INTRFCDSCR) + endpnt*sizeof(ENDPNTDSCR))
+
+DEVICEDSCR xdata at 0x3d00 myDeviceDscr = {
+   sizeof(DEVICEDSCR),		// Descriptor length
+   DEVICE_DSCR,			// Descriptor type
+   0x200,			// USB spec version 2.00
+   0,				// Device class
+   0,				// Device sub-class
+   0,				// Device sub-sub-class
+   64,				// Max packet size for EP0 (bytes)
+   0x1199,			// Vendor ID
+   0x0017,			// Product ID
+   0x0100,			// Product version (1.00)
+   1,				// Manufacturer string index
+   2,				// Product string index
+   0,				// Serial number string index
+   1				// Number of configurations
+};
+
+// In theory, this descriptor returns information about the "other"
+// speed.  So, if we're operating at high speed, the Device descriptor
+// would contain high speed configuration information and this
+// descriptor would contain full speed information, and vice versa if
+// we're operating at full speed.  I take a simpler approach - the
+// configuration information is the same for both speeds, so we never
+// care which one is which.
+
+DEVICEQUALDSCR xdata at 0x3d20 myDeviceQualDscr = {
+   sizeof(DEVICEQUALDSCR),	// Descriptor length
+   DEVQUAL_DSCR,		// Descriptor type
+   0x200,			// USB spec version 2.00
+   0,				// Device class
+   0,				// Device sub-class
+   0,				// Device sub-sub-class
+   64,				// Max packet size for EP0 (bytes)
+   1				// Number of alternate configurations
+};
+
+// Likewise, we should another full set of these configuration
+// descriptors.  In this case, however, the structures are identical
+// and the few fields that differ (descriptor type and endpoint max
+// packet size) can be tweaked at run-time, so this next set of
+// descriptors does double duty as both Configuration and Other Speed
+// Configuration descriptors.
+
+CONFIGDSCR xdata at 0x3d30 myConfigDscr = {
+   sizeof(CONFIGDSCR),		// Descriptor length
+   CONFIG_DSCR,			// Descriptor Type
+   DSCR_OFFSET(1,2),		// Total len of (config + intrfcs + end points)
+   1,				// Number of interfaces supported
+   1,				// Configuration index for SetConfiguration()
+   0,				// Config descriptor string index
+   bmBUSPWR|bmRWU,		// Attributes
+   0x1E				// Max power consumption; 2*30 = 60 mA
+};
+
+INTRFCDSCR xdata at 0x3d30+DSCR_OFFSET(0,0) myIntrfcDscr = {
+   sizeof(INTRFCDSCR),		// Descriptor length
+   INTRFC_DSCR,			// Descriptor type
+   0,				// Index of this interface (zero based)
+   0,				// Value used to select alternate
+   2,				// Number of endpoints
+   0xFF,			// Class Code
+   0xFF,			// Subclass Code
+   0xFF,			// Protocol Code
+   0				// Index of interface string description
+};
+
+ENDPNTDSCR xdata at 0x3d30+DSCR_OFFSET(1,0) myInEndpntDscr = {
+   sizeof(ENDPNTDSCR),		// Descriptor length
+   ENDPNT_DSCR,			// Descriptor type
+   0x86,			// Address of endpoint
+   EP_BULK,			// Endpoint type
+   512,				// Maximum packet size
+   0				// Interrupt polling interval
+				//   (ignored for bulk endpoints)
+};
+
+ENDPNTDSCR xdata at 0x3d30+DSCR_OFFSET(1,1) myOutEndpntDscr = {
+   sizeof(ENDPNTDSCR),		// Descriptor length
+   ENDPNT_DSCR,			// Descriptor type
+   0x02,			// Address of endpoint
+   EP_BULK,			// Endpoint type
+   512,				// Maximum packet size
+   0				// Interrupt polling interval
+				//   (ignored for bulk endpoints)
+};
+
+//-----------------------------------------------------------------------------
+// Endpoint 0 Device Request handler
+//-----------------------------------------------------------------------------
+
+static int count_array_size(void ** array)
+{
+   int size;
+   for (size=0; *array != 0; array++, size++);
+   return size;
+}
+
+static void SetupCommand(void)
+{
+   int i;
+   int interface;
+
+   // Errors are signaled by stalling endpoint 0.
+
+   switch(SETUPDAT[0] & SETUP_MASK) {
+
+   case SETUP_STANDARD_REQUEST:
+      switch(SETUPDAT[1])
+	 {
+	 case SC_GET_DESCRIPTOR:
+	    switch(SETUPDAT[3])
+	       {
+	       case GD_DEVICE:
+		  SUDPTRH = MSB(&myDeviceDscr);
+		  SUDPTRL = LSB(&myDeviceDscr);
+		  break;
+	       case GD_DEVICE_QUALIFIER:
+		  SUDPTRH = MSB(&myDeviceQualDscr);
+		  SUDPTRL = LSB(&myDeviceQualDscr);
+		  break;
+	       case GD_CONFIGURATION:
+		  myConfigDscr.type = CONFIG_DSCR;
+		  if (USBCS & bmHSM) {
+		     // High speed parameters
+		     myInEndpntDscr.mp = 512;
+		     myOutEndpntDscr.mp = 512;
+		  } else {
+		     // Full speed parameters
+		     myInEndpntDscr.mp = 64;
+		     myOutEndpntDscr.mp = 64;
+		  }
+		  SUDPTRH = MSB(&myConfigDscr);
+		  SUDPTRL = LSB(&myConfigDscr);
+		  break;
+	       case GD_OTHER_SPEED_CONFIGURATION:
+		  myConfigDscr.type = OTHERSPEED_DSCR;
+		  if (USBCS & bmHSM) {
+		     // We're in high speed mode, this is the Other
+		     // descriptor, so these are full speed parameters
+		     myInEndpntDscr.mp = 64;
+		     myOutEndpntDscr.mp = 64;
+		  } else {
+		     // We're in full speed mode, this is the Other
+		     // descriptor, so these are high speed parameters
+		     myInEndpntDscr.mp = 512;
+		     myOutEndpntDscr.mp = 512;
+		  }
+		  SUDPTRH = MSB(&myConfigDscr);
+		  SUDPTRL = LSB(&myConfigDscr);
+		  break;
+	       case GD_STRING:
+		  if (SETUPDAT[2] >= count_array_size((void **) USB_strings)) {
+		     EZUSB_STALL_EP0();
+		  } else {
+		     for (i=0; i<31; i++) {
+			if (USB_strings[SETUPDAT[2]][i] == '\0') break;
+			EP0BUF[2*i+2] = USB_strings[SETUPDAT[2]][i];
+			EP0BUF[2*i+3] = '\0';
+		     }
+		     EP0BUF[0] = 2*i+2;
+		     EP0BUF[1] = STRING_DSCR;
+		     SYNCDELAY; EP0BCH = 0;
+		     SYNCDELAY; EP0BCL = 2*i+2;
+		  }
+		  break;
+	       default:            // Invalid request
+		  EZUSB_STALL_EP0();
+	       }
+	    break;
+	 case SC_GET_INTERFACE:
+	    interface = SETUPDAT[4];
+	    if (interface < NUM_INTERFACES) {
+	       EP0BUF[0] = InterfaceSetting[interface];
+	       EP0BCH = 0;
+	       EP0BCL = 1;
+	    }
+	    break;
+	 case SC_SET_INTERFACE:
+	    interface = SETUPDAT[4];
+	    if (interface < NUM_INTERFACES) {
+	       InterfaceSetting[interface] = SETUPDAT[2];
+	    }
+	    break;
+	 case SC_SET_CONFIGURATION:
+	    Configuration = SETUPDAT[2];
+	    break;
+	 case SC_GET_CONFIGURATION:
+	    EP0BUF[0] = Configuration;
+	    EP0BCH = 0;
+	    EP0BCL = 1;
+	    break;
+	 case SC_GET_STATUS:
+	    switch(SETUPDAT[0])
+	       {
+	       case GS_DEVICE:
+		  EP0BUF[0] = ((BYTE)Rwuen << 1) | (BYTE)Selfpwr;
+		  EP0BUF[1] = 0;
+		  EP0BCH = 0;
+		  EP0BCL = 2;
+		  break;
+	       case GS_INTERFACE:
+		  EP0BUF[0] = 0;
+		  EP0BUF[1] = 0;
+		  EP0BCH = 0;
+		  EP0BCL = 2;
+		  break;
+	       case GS_ENDPOINT:
+		  EP0BUF[0] = *(BYTE xdata *) epcs(SETUPDAT[4]) & bmEPSTALL;
+		  EP0BUF[1] = 0;
+		  EP0BCH = 0;
+		  EP0BCL = 2;
+		  break;
+	       default:            // Invalid Command
+		  EZUSB_STALL_EP0();
+	       }
+	    break;
+	 case SC_CLEAR_FEATURE:
+	    switch(SETUPDAT[0])
+	       {
+	       case FT_DEVICE:
+		  if(SETUPDAT[2] == 1)
+		     Rwuen = FALSE;       // Disable Remote Wakeup
+		  else
+		     EZUSB_STALL_EP0();
+		  break;
+	       case FT_ENDPOINT:
+		  if(SETUPDAT[2] == 0)
+		     {
+			*(BYTE xdata *) epcs(SETUPDAT[4]) &= ~bmEPSTALL;
+			EZUSB_RESET_DATA_TOGGLE( SETUPDAT[4] );
+		     }
+		  else
+		     EZUSB_STALL_EP0();
+		  break;
+	       }
+	    break;
+	 case SC_SET_FEATURE:
+	    switch(SETUPDAT[0])
+	       {
+	       case FT_DEVICE:
+		  if((SETUPDAT[2] == 1) && Rwuen_allowed)
+		     Rwuen = TRUE;      // Enable Remote Wakeup
+		  else if(SETUPDAT[2] == 2)
+		     // Set Feature Test Mode.  The core handles this
+		     // request.  However, it is necessary for the
+		     // firmware to complete the handshake phase of the
+		     // control transfer before the chip will enter test
+		     // mode.  It is also necessary for FX2 to be
+		     // physically disconnected (D+ and D-) from the host
+		     // before it will enter test mode.
+		     break;
+		  else
+		     EZUSB_STALL_EP0();
+		  break;
+	       case FT_ENDPOINT:
+		  *(BYTE xdata *) epcs(SETUPDAT[4]) |= bmEPSTALL;
+		  break;
+	       default:
+		  EZUSB_STALL_EP0();
+	       }
+	    break;
+	 default:                     // *** Invalid Command
+	    EZUSB_STALL_EP0();
+	    break;
+	 }
+      break;
+
+   default:
+      EZUSB_STALL_EP0();
+      break;
+   }
+
+   // Acknowledge handshake phase of device request
+   EP0CS |= bmHSNAK;
+}
+
+static void USB_isr(void) __interrupt 8
+{
+   // Clear global USB IRQ
+   EXIF &= ~0x10;
+
+   // Clear SUDAV IRQ
+   USBIRQ = 0x01;
+
+   SetupCommand();
+}
+
+//-----------------------------------------------------------------------------
+// Main program
+//-----------------------------------------------------------------------------
+
+static void Initialize(void)
+{
+	// Note that increasing the clock speed to 24 or 48 MHz would
+	// affect our timer calculations below.  I use 12 MHz because
+	// this lets me use the smallest numbers for our counter (i.e,
+	// 40000 for the default 40 ms latency); the counter is only
+	// sixteen bits.
+	
+	//IFCONFIG=0xc0;  // Internal IFCLK, 48MHz; A,B as normal ports. 
+	IFCONFIG=0xcb; // slave ports
+	SYNCDELAY;
+	
+	REVCTL=0x03;  // See TRM...
+	SYNCDELAY;
+	
+	EP1OUTCFG=0;
+	EP1INCFG=0;
+	EP4CFG=0;
+	EP8CFG=0;
+	
+	// Set up EP2 and EP6 as quad-buffered, 512 bytes per buffer, bulk. 
+	EP6CFG=0xe0;   // 1110 0000  (IN)
+	EP2CFG=0xa0;   // 1010 0000  (OUT)
+	
+	// To be sure, clear and reset all FIFOs although 
+	// this is probably not strictly required. 
+	FIFORESET = 0x80;  SYNCDELAY;  // NAK all requests from host. 
+	FIFORESET = 0x82;  SYNCDELAY;  // Reset individual EP (2,4,6,8)
+	FIFORESET = 0x84;  SYNCDELAY;
+	FIFORESET = 0x86;  SYNCDELAY;
+	FIFORESET = 0x88;  SYNCDELAY;
+	FIFORESET = 0x80;  SYNCDELAY;  // NAK all requests from host. 
+	FIFORESET = 0x00;  SYNCDELAY;  // Resume normal operation. 
+   
+   	// Flush input and output quad-buffers. 
+	OUTPKTEND = 0x82; SYNCDELAY;
+	OUTPKTEND = 0x82; SYNCDELAY;
+	OUTPKTEND = 0x82; SYNCDELAY;
+
+	INPKTEND = 0x86; SYNCDELAY;
+	INPKTEND = 0x86; SYNCDELAY;
+	INPKTEND = 0x86; SYNCDELAY;
+
+	/* EP6FIFOCFG: */
+	//  bit7: 0
+	//  bit6: INFM6  See TRM 15-29 (p.351): Signal line one clock earlier.
+	//  bit5: OEP6
+	//  bit4: AUTOOUT    1 = enable
+	//  bit3: AUTOIN     1 = enable
+	//  bit2: ZEROLENIN  1 = enable (?)
+	//  bit1: 0
+	//  bit0: WORDWIDE   1 = 16bit (default)
+	//EP2FIFOCFG = 0;   SYNCDELAY;
+	//EP6FIFOCFG = 0;   SYNCDELAY;
+	EP2FIFOCFG = 0xC;   SYNCDELAY;
+	EP6FIFOCFG = 0xC;   SYNCDELAY;
+
+	// Setup Data Pointer - AUTO mode
+	//
+	// In this mode, there are two ways to send data on EP0.  You
+	// can either copy the data into EP0BUF and write the packet
+	// length into EP0BCH/L to start the transfer, or you can
+	// write the (word-aligned) address of a USB descriptor into
+	// SUDPTRH/L; the length is computed automatically.
+	SUDPTRCTL = 1;
+
+	// Enable USB interrupt
+	IE = 0x80;
+	EIE = 0x01;
+
+	// Enable SUDAV (setup data available) interrupt
+	USBIE = 0x01;
+}
+
+
+// We want to buffer any outgoing data for a short time (40 ms) to see
+// if any other data becomes available and it can all be sent
+// together.  At 12 MHz we consume 83.3 ns/cycle and divide this rate
+// by 12 so that our counters increment almost exactly once every us.
+// The counter is sixteen bits, so we can specify latencies up to
+// about 65 ms.
+
+unsigned int bytes_waiting_for_xmit = 0;
+unsigned int latency_us = 40000;
+
+
+static void ProcessXmitData(void)
+{
+   // reset Timer 0
+   TCON &= ~0x30;
+
+   SYNCDELAY;
+
+   // Send the packet.
+   EP6BCH = MSB(bytes_waiting_for_xmit);
+   EP6BCL = LSB(bytes_waiting_for_xmit);
+
+   bytes_waiting_for_xmit = 0;
+}
+
+
+static void putchar(char c)
+{
+   xdata unsigned char *dest=EP6FIFOBUF + bytes_waiting_for_xmit;
+
+   // Wait for EP6 buffer to become non-full so that we don't
+   // overwrite content.
+   while(EP6CS & (1<<3));
+   
+   *dest = c;
+   ++bytes_waiting_for_xmit;
+
+   // Either send 64 byte packets or send 512 byte packets. 
+   // Concerning the data, there is no difference under linux. 
+   if (bytes_waiting_for_xmit >= 512 ) ProcessXmitData();
+
+   // Set Timer 0 if it isn't set and we've got data ready to go
+   if (bytes_waiting_for_xmit && !(TCON & 0x10)) {
+      TH0 = MSB(0xffff - latency_us);
+      TL0 = LSB(0xffff - latency_us);
+      TCON |= 0x10;
+   }
+}
+
+
+static void ProcessRecvData(void)
+{
+	xdata const unsigned char *src=EP2FIFOBUF;
+	int len = (((int)EP2BCH)<<8) | EP2BCL;
+	int i;
+
+	for(i=0; i<len; i++,src++)
+	   {
+	      if(*src>='a' && *src<='z')
+		{  putchar(*src-'a'+'A');  }
+	      else
+		{  putchar(*src);  }
+	   }
+
+	// "Skip" the received OUT packet to "forget" it (see TRM p. 9-26):
+	SYNCDELAY;
+	OUTPKTEND=0x82;
+}
+
+
+void main(void)
+{
+	// Disconnect the USB interface, initialize, renumerate, reconnect
+	USBCS |= 0x08;
+	Initialize();
+	USBCS |= 0x02;
+	USBCS &= ~(0x08);
+
+	// Configure Timer 0 (but leave it unset)
+	// mode 1 (16-bit); ungated; divide system clock by 12
+	CKCO &= ~(0x08);
+	TMOD = 0x01;
+	TCON &= ~0x30;
+
+	for(;;)
+	{
+		// Input data on EP2
+		if(!(EP2CS & (1<<2)))
+		{
+ 		   //ProcessRecvData();
+		}
+
+		// Timer expiration; send buffered data
+		if((TCON & 0x20))
+		{
+		   //ProcessXmitData();
+		}
+	}
+}
diff --git a/hdl/eb_usb_core/fx2.h b/hdl/eb_usb_core/fx2.h
new file mode 100644
index 0000000..ad99ad6
--- /dev/null
+++ b/hdl/eb_usb_core/fx2.h
@@ -0,0 +1,380 @@
+/*
+//-----------------------------------------------------------------------------
+//   File:      FX2.h
+//   Contents:  EZ-USB FX2 constants, macros, datatypes, globals, and library
+//              function prototypes.
+//
+//   Copyright (c) 2000 Cypress Semiconductor, All rights reserved
+// 
+// Modified to be used with the sdcc compiler. 
+// 
+//-----------------------------------------------------------------------------
+*/
+#ifndef FX2_H     //Header sentry
+#define FX2_H
+
+#include "fx2regs.h"
+
+
+#define INTERNAL_DSCR_ADDR 0x0080   // Relocate Descriptors to 0x80
+#define bmSTRETCH 0x07
+#define FW_STRETCH_VALUE 0x0      // Set stretch to 0 in frameworks
+                           // Note: a RevE eratta states that stretch must=0 to set OUTxBC
+
+/*
+//-----------------------------------------------------------------------------
+// Constants
+//-----------------------------------------------------------------------------
+*/
+#define TRUE    1
+#define FALSE   0
+
+#define DEVICE_DSCR      0x01      // Descriptor type: Device
+#define CONFIG_DSCR      0x02      // Descriptor type: Configuration
+#define STRING_DSCR      0x03      // Descriptor type: String
+#define INTRFC_DSCR      0x04      // Descriptor type: Interface
+#define ENDPNT_DSCR      0x05      // Descriptor type: End Point
+#define DEVQUAL_DSCR     0x06      // Descriptor type: Device Qualifier
+#define OTHERSPEED_DSCR  0x07      // Descriptor type: Other Speed Configuration
+
+#define bmBUSPWR  bmBIT7         // Config. attribute: Bus powered
+#define bmSELFPWR bmBIT6         // Config. attribute: Self powered
+#define bmRWU     bmBIT5         // Config. attribute: Remote Wakeup
+
+#define bmEPOUT   bmBIT7
+#define bmEPIN    0x00
+
+#define EP_CONTROL   0x00        // End Point type: Control
+#define EP_ISO       0x01        // End Point type: Isochronous
+#define EP_BULK      0x02        // End Point type: Bulk
+#define EP_INT       0x03        // End Point type: Interrupt
+
+#define SUD_SIZE            8      // Setup data packet size
+
+/*
+//////////////////////////////////////////////////////////////////////////////
+//Added for HID
+*/
+
+#define SETUP_MASK				0x60	//Used to mask off request type
+#define SETUP_STANDARD_REQUEST	0		//Standard Request
+#define SETUP_CLASS_REQUEST		0x20	//Class Request
+#define SETUP_VENDOR_REQUEST	0x40	//Vendor Request
+#define SETUP_RESERVED_REQUEST 	0x60	//Reserved or illegal request
+
+/*
+//////////////////////////////////////////////////////////////////////////////
+*/
+
+
+#define SC_GET_STATUS         0x00   // Setup command: Get Status
+#define SC_CLEAR_FEATURE      0x01   // Setup command: Clear Feature
+#define SC_RESERVED            0x02   // Setup command: Reserved
+#define SC_SET_FEATURE         0x03   // Setup command: Set Feature
+#define SC_SET_ADDRESS         0x05   // Setup command: Set Address
+#define SC_GET_DESCRIPTOR      0x06   // Setup command: Get Descriptor
+#define SC_SET_DESCRIPTOR      0x07   // Setup command: Set Descriptor
+#define SC_GET_CONFIGURATION   0x08   // Setup command: Get Configuration
+#define SC_SET_CONFIGURATION   0x09   // Setup command: Set Configuration
+#define SC_GET_INTERFACE      0x0a   // Setup command: Get Interface
+#define SC_SET_INTERFACE      0x0b   // Setup command: Set Interface
+#define SC_SYNC_FRAME         0x0c   // Setup command: Sync Frame
+#define SC_ANCHOR_LOAD         0xa0   // Setup command: Anchor load
+   
+#define GD_DEVICE          0x01  // Get descriptor: Device
+#define GD_CONFIGURATION   0x02  // Get descriptor: Configuration
+#define GD_STRING          0x03  // Get descriptor: String
+#define GD_INTERFACE       0x04  // Get descriptor: Interface
+#define GD_ENDPOINT        0x05  // Get descriptor: Endpoint
+#define GD_DEVICE_QUALIFIER 0x06  // Get descriptor: Device Qualifier
+#define GD_OTHER_SPEED_CONFIGURATION 0x07  // Get descriptor: Other Configuration
+#define GD_INTERFACE_POWER 0x08  // Get descriptor: Interface Power
+#define GD_HID	            0x21	// Get descriptor: HID
+#define GD_REPORT	         0x22	// Get descriptor: Report
+
+#define GS_DEVICE          0x80  // Get Status: Device
+#define GS_INTERFACE       0x81  // Get Status: Interface
+#define GS_ENDPOINT        0x82  // Get Status: End Point
+
+#define FT_DEVICE          0x00  // Feature: Device
+#define FT_ENDPOINT        0x02  // Feature: End Point
+
+#define I2C_IDLE              0     // I2C Status: Idle mode
+#define I2C_SENDING           1     // I2C Status: I2C is sending data
+#define I2C_RECEIVING         2     // I2C Status: I2C is receiving data
+#define I2C_PRIME             3     // I2C Status: I2C is receiving the first byte of a string
+#define I2C_STOP              5     // I2C Status: I2C waiting for stop completion
+#define I2C_BERROR            6     // I2C Status: I2C error; Bit Error
+#define I2C_NACK              7     // I2C Status: I2C error; No Acknowledge
+#define I2C_OK                8     // I2C positive return code
+#define I2C_WAITSTOP          9     // I2C Status: Wait for STOP complete
+
+/*-----------------------------------------------------------------------------
+   Macros
+-----------------------------------------------------------------------------*/
+
+#define MSB(word)      (BYTE)(((WORD)(word) >> 8) & 0xff)
+#define LSB(word)      (BYTE)((WORD)(word) & 0xff)
+
+#define SWAP_ENDIAN(word)   ((BYTE*)&word)[0] ^= ((BYTE*)&word)[1]; ((BYTE*)&word)[1] ^= ((BYTE*)&word)[0]; ((BYTE*)&word)[0] ^= ((BYTE*)&word)[1]
+
+#define EZUSB_IRQ_ENABLE()   EUSB = 1
+#define EZUSB_IRQ_DISABLE()   EUSB = 0
+#define EZUSB_IRQ_CLEAR()   EXIF &= ~0x10      // IE2_
+
+#define EZUSB_STALL_EP0()            EP0CS |= bmEPSTALL
+#define EZUSB_STALL_EP(ep_id)             // fx2bug
+#define EZUSB_UNSTALL_EP(ep_id)           // fx2bug
+#define   EZUSB_GET_EP_STATUS(ep_id)      // fx2bug
+#define EZUSB_SET_EP_BYTES(ep_id,count)   // fx2bug
+
+
+/*
+// WRITEDELAY() has been replaced by SYNCDELAY; macro in fx2sdly.h
+// ...it is here for backwards compatibility...
+
+// the WRITEDELAY macro compiles to the time equivalent of 3 NOPs.
+// It is used in the frameworks to allow for write recovery time
+// requirements of certain registers.  This is only necessary for
+// EZ-USB FX parts.  See the EZ-USB FX TRM for
+// more information on write recovery time issues.
+*/
+#define WRITEDELAY() {char writedelaydummy = 0;}
+/*
+// if this firmware will never run on an EZ-USB FX part replace
+// with:
+// #define WRITEDELAY()
+*/
+
+/*
+// macro to reset and endpoint data toggle
+*/
+#define EZUSB_RESET_DATA_TOGGLE(ep)     TOGCTL = (((ep & 0x80) >> 3) + (ep & 0x0F)); TOGCTL |= bmRESETTOGGLE
+
+
+#define EZUSB_ENABLE_RSMIRQ()      (EICON |= 0x20)      // Enable Resume Interrupt (EPFI_)
+#define EZUSB_DISABLE_RSMIRQ()      (EICON &= ~0x20)   // Disable Resume Interrupt (EPFI_)
+#define EZUSB_CLEAR_RSMIRQ()      (EICON &= ~0x10)   // Clear Resume Interrupt Flag (PFI_)
+
+#define EZUSB_GETI2CSTATUS()      (I2CPckt.status)
+#define EZUSB_CLEARI2CSTATUS()      if((I2CPckt.status == I2C_BERROR) || (I2CPckt.status == I2C_NACK)) I2CPckt.status = I2C_IDLE;
+
+#define EZUSB_ENABLEBP()         (BREAKPT |= bmBPEN)    // TGE fx2bug
+#define EZUSB_DISABLEBP()         (BREAKPT &= ~bmBPEN)  // TGE fx2bug
+#define EZUSB_CLEARBP()            (BREAKPT |= bmBREAK) // TGE fx2bug
+#define EZUSB_BP(addr)            BPADDRH = (BYTE)(((WORD)addr >> 8) & 0xff);      BPADDRL = (BYTE)addr                              // TGE fx2bug
+
+#define EZUSB_EXTWAKEUP()      (((WAKEUPCS & bmWU2) && (WAKEUPCS & bmWU2EN)) || ((WAKEUPCS & bmWU) &&  (WAKEUPCS & bmWUEN)))
+
+#define EZUSB_HIGHSPEED()      (USBCS & bmHSM)
+
+/*
+//-----------------------------------------------------------------------------
+// Datatypes
+//-----------------------------------------------------------------------------
+*/
+//typedef unsigned char   BYTE;   -> already typedef'ed in fx2regs.h
+//typedef unsigned short  WORD;   -> already typedef'ed in fx2regs.h
+typedef unsigned long   DWORD;
+typedef bit             BOOL;
+
+#define  INT0_VECT   0
+#define  TMR0_VECT   1
+#define  INT1_VECT   2
+#define  TMR1_VECT   3
+#define  COM0_VECT   4
+#define  TMR2_VECT   5
+#define  WKUP_VECT   6
+#define  COM1_VECT   7
+#define  USB_VECT    8
+#define  I2C_VECT    9
+#define  INT4_VECT   10
+#define  INT5_VECT   11
+#define  INT6_VECT   12
+
+
+/*
+// TGE fx2bug 
+*/
+#define   SUDAV_USBVECT       (0 << 2)
+#define   SOF_USBVECT         (1 << 2)
+#define   SUTOK_USBVECT       (2 << 2)
+#define   SUSP_USBVECT        (3 << 2)
+#define   URES_USBVECT        (4 << 2)
+#define   HS_USBVECT          (5 << 2)
+#define   EP0ACK_USBVECT      (6 << 2)
+#define   SPARE0_USBVECT      (7 << 2)
+#define   IN0BUF_USBVECT      (8 << 2)
+#define   OUT0BUF_USBVECT     (9 << 2)
+#define   IN1BUF_USBVECT      (10 << 2)
+#define   OUT1BUF_USBVECT     (11 << 2)
+#define   INOUT2BUF_USBVECT   (12 << 2)
+#define   INOUT4BUF_USBVECT   (13 << 2)
+#define   INOUT6BUF_USBVECT   (14 << 2)
+#define   INOUT8BUF_USBVECT   (15 << 2)
+#define   IBN_USBVECT         (16 << 2)
+#define   SPARE1_USBVECT      (17 << 2)
+#define   EP0PINGNAK_USBVECT  (18 << 2)
+#define   EP1PINGNAK_USBVECT  (19 << 2)
+#define   EP2PINGNAK_USBVECT  (20 << 2)
+#define   EP4PINGNAK_USBVECT  (21 << 2)
+#define   EP6PINGNAK_USBVECT  (22 << 2)
+#define   EP8PINGNAK_USBVECT  (23 << 2)
+#define   ERRLIM_USBVECT      (24 << 2)
+#define   SPARE2_USBVECT      (25 << 2)
+#define   SPARE3_USBVECT      (26 << 2)
+#define   SPARE4_USBVECT      (27 << 2)
+#define   EP2PIDERR_USBVECT   (28 << 2)
+#define   EP4PIDERR_USBVECT   (29 << 2)
+#define   EP6PIDERR_USBVECT   (30 << 2)
+#define   EP8PIDERR_USBVECT   (31 << 2)
+
+typedef struct
+{
+   BYTE   length;
+   BYTE   type;
+}DSCR;
+
+typedef struct            // Device Descriptor
+{
+   BYTE   length;         // Descriptor length ( = sizeof(DEVICEDSCR) )
+   BYTE   type;         // Decriptor type (Device = 1)
+   WORD   spec_ver;      // USB Specification Version (BCD)
+   BYTE   dev_class;      // Device class
+   BYTE   sub_class;      // Device sub-class
+   BYTE   protocol;      // Device sub-sub-class
+   BYTE   max_packet;      // Maximum packet size
+   WORD   vendor_id;      // Vendor ID
+   WORD   product_id;      // Product ID
+   WORD   version_id;      // Product version ID
+   BYTE   mfg_str;      // Manufacturer string index
+   BYTE   prod_str;      // Product string index
+   BYTE   serialnum_str;   // Serial number string index
+   BYTE   configs;      // Number of configurations
+}DEVICEDSCR;
+
+typedef struct            // Device Qualifier Descriptor
+{
+   BYTE   length;         // Descriptor length ( = sizeof(DEVICEQUALDSCR) )
+   BYTE   type;         // Decriptor type (Device Qualifier = 6)
+   WORD   spec_ver;      // Specification Version (BCD) minor
+   BYTE   dev_class;      // Device class
+   BYTE   sub_class;      // Device sub-class
+   BYTE   protocol;      // Device sub-sub-class
+   BYTE   max_packet;      // Maximum packet size
+   BYTE   configs;      // Number of configurations
+   BYTE  reserved0;
+}DEVICEQUALDSCR;
+
+typedef struct
+{
+   BYTE   length;         // Configuration length ( = sizeof(CONFIGDSCR) )
+   BYTE   type;         // Descriptor type (Configuration = 2)
+   WORD   config_len;      // Configuration + End Points length
+   BYTE   interfaces;      // Number of interfaces
+   BYTE   index;         // Configuration number
+   BYTE   config_str;      // Configuration string
+   BYTE   attrib;         // Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu
+   BYTE   power;         // Power requirement (div 2 ma)
+}CONFIGDSCR;
+
+typedef struct
+{
+   BYTE   length;         // Interface descriptor length ( - sizeof(INTRFCDSCR) )
+   BYTE   type;         // Descriptor type (Interface = 4)
+   BYTE   index;         // Zero-based index of this interface
+   BYTE   alt_setting;   // Alternate setting
+   BYTE   ep_cnt;         // Number of end points 
+   BYTE   class;         // Interface class
+   BYTE   sub_class;      // Interface sub class
+   BYTE   protocol;      // Interface sub sub class
+   BYTE   interface_str;   // Interface descriptor string index
+}INTRFCDSCR;
+
+typedef struct
+{
+   BYTE   length;         // End point descriptor length ( = sizeof(ENDPNTDSCR) )
+   BYTE   type;         // Descriptor type (End point = 5)
+   BYTE   addr;         // End point address
+   BYTE   ep_type;      // End point type
+   WORD   mp;           // Maximum packet size
+   BYTE   interval;      // Interrupt polling interval
+}ENDPNTDSCR;
+
+typedef struct
+{
+   BYTE   length;         // String descriptor length
+   BYTE   type;         // Descriptor type
+}STRINGDSCR;
+
+typedef struct
+{
+   BYTE   cntrl;         // End point control register
+   BYTE   bytes;         // End point buffer byte count
+}EPIOC;
+
+typedef struct 
+{
+   BYTE   length;
+   BYTE   *dat;
+   BYTE   count;
+   BYTE   status;
+}I2CPCKT;
+
+/*
+//-----------------------------------------------------------------------------
+// Globals
+//-----------------------------------------------------------------------------
+*/
+extern code BYTE   USB_AutoVector;
+
+extern WORD   pDeviceDscr;
+extern WORD   pDeviceQualDscr;
+extern WORD	  pHighSpeedConfigDscr;
+extern WORD	  pFullSpeedConfigDscr;	
+extern WORD   pConfigDscr;
+extern WORD   pOtherConfigDscr;
+extern WORD   pStringDscr;
+
+extern code DEVICEDSCR        DeviceDscr;
+extern code DEVICEQUALDSCR    DeviceQualDscr;
+extern code CONFIGDSCR        HighSpeedConfigDscr;
+extern code CONFIGDSCR        FullSpeedConfigDscr;
+extern code STRINGDSCR        StringDscr;
+extern code DSCR              UserDscr;
+
+extern I2CPCKT volatile I2CPckt;
+
+/*
+//-----------------------------------------------------------------------------
+// Function Prototypes
+//-----------------------------------------------------------------------------
+// fx2bug #ifdef CHIPREV_B
+// fx2bug extern void EZUSB_IRQ_CLEAR(void);
+// fx2bug #endif
+*/
+
+extern void EZUSB_Renum(void);
+extern void EZUSB_Discon(BOOL renum);
+
+extern void EZUSB_Susp(void);
+extern void EZUSB_Resume(void);
+
+extern void EZUSB_Delay1ms(void);
+extern void EZUSB_Delay(WORD ms);
+
+extern CONFIGDSCR xdata*   EZUSB_GetConfigDscr(BYTE ConfigIdx);
+extern INTRFCDSCR xdata*   EZUSB_GetIntrfcDscr(BYTE ConfigIdx, BYTE IntrfcIdx, BYTE AltSetting);
+extern STRINGDSCR xdata*   EZUSB_GetStringDscr(BYTE StrIdx);
+extern DSCR xdata*      EZUSB_GetDscr(BYTE index, DSCR* dscr, BYTE type);
+
+extern void EZUSB_InitI2C(void);
+extern BYTE EZUSB_WriteI2C_(BYTE addr, BYTE length, BYTE xdata *dat);
+extern BYTE EZUSB_ReadI2C_(BYTE addr, BYTE length, BYTE xdata *dat);
+extern BYTE EZUSB_WriteI2C(BYTE addr, BYTE length, BYTE xdata *dat);
+extern BYTE EZUSB_ReadI2C(BYTE addr, BYTE length, BYTE xdata *dat);
+extern void EZUSB_WaitForEEPROMWrite(BYTE addr);
+
+extern void modify_endpoint_stall(BYTE epid, BYTE stall);
+
+#endif   // FX2_H
diff --git a/hdl/eb_usb_core/fx2regs.h b/hdl/eb_usb_core/fx2regs.h
new file mode 100644
index 0000000..fb03400
--- /dev/null
+++ b/hdl/eb_usb_core/fx2regs.h
@@ -0,0 +1,649 @@
+/*
+//-----------------------------------------------------------------------------
+//   File:      FX2regs.h
+//   Contents:   EZ-USB FX2 register declarations and bit mask definitions.
+//
+// $Archive: /USB/Target/Inc/fx2regs.h $
+// $Date: 2005/07/20 16:23:46 $
+// $Revision: 1.2 $
+//
+//
+//   Copyright (c) 2000 Cypress Semiconductor, All rights reserved
+//-----------------------------------------------------------------------------
+*/
+
+#ifndef FX2REGS_H   /* Header Sentry */
+#define FX2REGS_H
+
+/*
+//-----------------------------------------------------------------------------
+// FX2 Related Register Assignments
+//-----------------------------------------------------------------------------
+
+// The Ez-USB FX2 registers are defined here. We use FX2regs.h for register 
+// address allocation by using "#define ALLOCATE_EXTERN". 
+// When using "#define ALLOCATE_EXTERN", you get (for instance): 
+// xdata volatile BYTE OUT7BUF[64]   _at_   0x7B40;
+// Such lines are created from FX2.h by using the preprocessor. 
+// Incidently, these lines will not generate any space in the resulting hex 
+// file; they just bind the symbols to the addresses for compilation. 
+// You just need to put "#define ALLOCATE_EXTERN" in your main program file; 
+// i.e. fw.c or a stand-alone C source file. 
+// Without "#define ALLOCATE_EXTERN", you just get the external reference: 
+// extern xdata volatile BYTE OUT7BUF[64]   ;//   0x7B40;
+// This uses the concatenation operator "##" to insert a comment "//" 
+// to cut off the end of the line, "_at_   0x7B40;", which is not wanted.
+*/
+
+#define ALLOCATE_EXTERN
+
+#ifdef ALLOCATE_EXTERN
+#define EXTERN
+#define _AT_(a) at a
+#else
+#define EXTERN extern
+#define _AT_ ;/ ## /
+#endif
+
+typedef unsigned char  BYTE;
+typedef unsigned short WORD;
+
+EXTERN xdata _AT_(0xE400) volatile BYTE GPIF_WAVE_DATA    ;
+EXTERN xdata _AT_(0xE480) volatile BYTE RES_WAVEDATA_END  ;
+
+// General Configuration
+
+EXTERN xdata _AT_(0xE600) volatile BYTE CPUCS             ;  // Control & Status
+EXTERN xdata _AT_(0xE601) volatile BYTE IFCONFIG          ;  // Interface Configuration
+EXTERN xdata _AT_(0xE602) volatile BYTE PINFLAGSAB        ;  // FIFO FLAGA and FLAGB Assignments
+EXTERN xdata _AT_(0xE603) volatile BYTE PINFLAGSCD        ;  // FIFO FLAGC and FLAGD Assignments
+EXTERN xdata _AT_(0xE604) volatile BYTE FIFORESET         ;  // Restore FIFOS to default state
+EXTERN xdata _AT_(0xE605) volatile BYTE BREAKPT           ;  // Breakpoint
+EXTERN xdata _AT_(0xE606) volatile BYTE BPADDRH           ;  // Breakpoint Address H
+EXTERN xdata _AT_(0xE607) volatile BYTE BPADDRL           ;  // Breakpoint Address L
+EXTERN xdata _AT_(0xE608) volatile BYTE UART230           ;  // 230 Kbaud clock for T0,T1,T2
+EXTERN xdata _AT_(0xE609) volatile BYTE FIFOPINPOLAR      ;  // FIFO polarities
+EXTERN xdata _AT_(0xE60A) volatile BYTE REVID             ;  // Chip Revision
+EXTERN xdata _AT_(0xE60B) volatile BYTE REVCTL            ;  // Chip Revision Control
+
+// Endpoint Configuration
+
+EXTERN xdata _AT_(0xE610) volatile BYTE EP1OUTCFG         ;  // Endpoint 1-OUT Configuration
+EXTERN xdata _AT_(0xE611) volatile BYTE EP1INCFG          ;  // Endpoint 1-IN Configuration
+EXTERN xdata _AT_(0xE612) volatile BYTE EP2CFG            ;  // Endpoint 2 Configuration
+EXTERN xdata _AT_(0xE613) volatile BYTE EP4CFG            ;  // Endpoint 4 Configuration
+EXTERN xdata _AT_(0xE614) volatile BYTE EP6CFG            ;  // Endpoint 6 Configuration
+EXTERN xdata _AT_(0xE615) volatile BYTE EP8CFG            ;  // Endpoint 8 Configuration
+EXTERN xdata _AT_(0xE618) volatile BYTE EP2FIFOCFG        ;  // Endpoint 2 FIFO configuration
+EXTERN xdata _AT_(0xE619) volatile BYTE EP4FIFOCFG        ;  // Endpoint 4 FIFO configuration
+EXTERN xdata _AT_(0xE61A) volatile BYTE EP6FIFOCFG        ;  // Endpoint 6 FIFO configuration
+EXTERN xdata _AT_(0xE61B) volatile BYTE EP8FIFOCFG        ;  // Endpoint 8 FIFO configuration
+EXTERN xdata _AT_(0xE620) volatile BYTE EP2AUTOINLENH     ;  // Endpoint 2 Packet Length H (IN only)
+EXTERN xdata _AT_(0xE621) volatile BYTE EP2AUTOINLENL     ;  // Endpoint 2 Packet Length L (IN only)
+EXTERN xdata _AT_(0xE622) volatile BYTE EP4AUTOINLENH     ;  // Endpoint 4 Packet Length H (IN only)
+EXTERN xdata _AT_(0xE623) volatile BYTE EP4AUTOINLENL     ;  // Endpoint 4 Packet Length L (IN only)
+EXTERN xdata _AT_(0xE624) volatile BYTE EP6AUTOINLENH     ;  // Endpoint 6 Packet Length H (IN only)
+EXTERN xdata _AT_(0xE625) volatile BYTE EP6AUTOINLENL     ;  // Endpoint 6 Packet Length L (IN only)
+EXTERN xdata _AT_(0xE626) volatile BYTE EP8AUTOINLENH     ;  // Endpoint 8 Packet Length H (IN only)
+EXTERN xdata _AT_(0xE627) volatile BYTE EP8AUTOINLENL     ;  // Endpoint 8 Packet Length L (IN only)
+EXTERN xdata _AT_(0xE630) volatile BYTE EP2FIFOPFH        ;  // EP2 Programmable Flag trigger H
+EXTERN xdata _AT_(0xE631) volatile BYTE EP2FIFOPFL        ;  // EP2 Programmable Flag trigger L
+EXTERN xdata _AT_(0xE632) volatile BYTE EP4FIFOPFH        ;  // EP4 Programmable Flag trigger H
+EXTERN xdata _AT_(0xE633) volatile BYTE EP4FIFOPFL        ;  // EP4 Programmable Flag trigger L
+EXTERN xdata _AT_(0xE634) volatile BYTE EP6FIFOPFH        ;  // EP6 Programmable Flag trigger H
+EXTERN xdata _AT_(0xE635) volatile BYTE EP6FIFOPFL        ;  // EP6 Programmable Flag trigger L
+EXTERN xdata _AT_(0xE636) volatile BYTE EP8FIFOPFH        ;  // EP8 Programmable Flag trigger H
+EXTERN xdata _AT_(0xE637) volatile BYTE EP8FIFOPFL        ;  // EP8 Programmable Flag trigger L
+EXTERN xdata _AT_(0xE640) volatile BYTE EP2ISOINPKTS      ;  // EP2 (if ISO) IN Packets per frame (1-3)
+EXTERN xdata _AT_(0xE641) volatile BYTE EP4ISOINPKTS      ;  // EP4 (if ISO) IN Packets per frame (1-3)
+EXTERN xdata _AT_(0xE642) volatile BYTE EP6ISOINPKTS      ;  // EP6 (if ISO) IN Packets per frame (1-3)
+EXTERN xdata _AT_(0xE643) volatile BYTE EP8ISOINPKTS      ;  // EP8 (if ISO) IN Packets per frame (1-3)
+EXTERN xdata _AT_(0xE648) volatile BYTE INPKTEND          ;  // Force IN Packet End
+EXTERN xdata _AT_(0xE649) volatile BYTE OUTPKTEND         ;  // Force OUT Packet End
+
+// Interrupts
+
+EXTERN xdata _AT_(0xE650) volatile BYTE EP2FIFOIE         ;  // Endpoint 2 Flag Interrupt Enable
+EXTERN xdata _AT_(0xE651) volatile BYTE EP2FIFOIRQ        ;  // Endpoint 2 Flag Interrupt Request
+EXTERN xdata _AT_(0xE652) volatile BYTE EP4FIFOIE         ;  // Endpoint 4 Flag Interrupt Enable
+EXTERN xdata _AT_(0xE653) volatile BYTE EP4FIFOIRQ        ;  // Endpoint 4 Flag Interrupt Request
+EXTERN xdata _AT_(0xE654) volatile BYTE EP6FIFOIE         ;  // Endpoint 6 Flag Interrupt Enable
+EXTERN xdata _AT_(0xE655) volatile BYTE EP6FIFOIRQ        ;  // Endpoint 6 Flag Interrupt Request
+EXTERN xdata _AT_(0xE656) volatile BYTE EP8FIFOIE         ;  // Endpoint 8 Flag Interrupt Enable
+EXTERN xdata _AT_(0xE657) volatile BYTE EP8FIFOIRQ        ;  // Endpoint 8 Flag Interrupt Request
+EXTERN xdata _AT_(0xE658) volatile BYTE IBNIE             ;  // IN-BULK-NAK Interrupt Enable
+EXTERN xdata _AT_(0xE659) volatile BYTE IBNIRQ            ;  // IN-BULK-NAK interrupt Request
+EXTERN xdata _AT_(0xE65A) volatile BYTE NAKIE             ;  // Endpoint Ping NAK interrupt Enable
+EXTERN xdata _AT_(0xE65B) volatile BYTE NAKIRQ            ;  // Endpoint Ping NAK interrupt Request
+EXTERN xdata _AT_(0xE65C) volatile BYTE USBIE             ;  // USB Int Enables
+EXTERN xdata _AT_(0xE65D) volatile BYTE USBIRQ            ;  // USB Interrupt Requests
+EXTERN xdata _AT_(0xE65E) volatile BYTE EPIE              ;  // Endpoint Interrupt Enables
+EXTERN xdata _AT_(0xE65F) volatile BYTE EPIRQ             ;  // Endpoint Interrupt Requests
+EXTERN xdata _AT_(0xE660) volatile BYTE GPIFIE            ;  // GPIF Interrupt Enable
+EXTERN xdata _AT_(0xE661) volatile BYTE GPIFIRQ           ;  // GPIF Interrupt Request
+EXTERN xdata _AT_(0xE662) volatile BYTE USBERRIE          ;  // USB Error Interrupt Enables
+EXTERN xdata _AT_(0xE663) volatile BYTE USBERRIRQ         ;  // USB Error Interrupt Requests
+EXTERN xdata _AT_(0xE664) volatile BYTE ERRCNTLIM         ;  // USB Error counter and limit
+EXTERN xdata _AT_(0xE665) volatile BYTE CLRERRCNT         ;  // Clear Error Counter EC[3..0]
+EXTERN xdata _AT_(0xE666) volatile BYTE INT2IVEC          ;  // Interupt 2 (USB) Autovector
+EXTERN xdata _AT_(0xE667) volatile BYTE INT4IVEC          ;  // Interupt 4 (FIFOS & GPIF) Autovector
+EXTERN xdata _AT_(0xE668) volatile BYTE INTSETUP          ;  // Interrupt 2&4 Setup
+
+// Input/Output
+
+EXTERN xdata _AT_(0xE670) volatile BYTE PORTACFG          ;  // I/O PORTA Alternate Configuration
+EXTERN xdata _AT_(0xE671) volatile BYTE PORTCCFG          ;  // I/O PORTC Alternate Configuration
+EXTERN xdata _AT_(0xE672) volatile BYTE PORTECFG          ;  // I/O PORTE Alternate Configuration
+EXTERN xdata _AT_(0xE678) volatile BYTE I2CS              ;  // Control & Status
+EXTERN xdata _AT_(0xE679) volatile BYTE I2DAT             ;  // Data
+EXTERN xdata _AT_(0xE67A) volatile BYTE I2CTL             ;  // I2C Control
+EXTERN xdata _AT_(0xE67B) volatile BYTE XAUTODAT1         ;  // Autoptr1 MOVX access
+EXTERN xdata _AT_(0xE67C) volatile BYTE XAUTODAT2         ;  // Autoptr2 MOVX access
+
+#define EXTAUTODAT1 XAUTODAT1
+#define EXTAUTODAT2 XAUTODAT2
+
+// USB Control
+
+EXTERN xdata _AT_(0xE680) volatile BYTE USBCS             ;  // USB Control & Status
+EXTERN xdata _AT_(0xE681) volatile BYTE SUSPEND           ;  // Put chip into suspend
+EXTERN xdata _AT_(0xE682) volatile BYTE WAKEUPCS          ;  // Wakeup source and polarity
+EXTERN xdata _AT_(0xE683) volatile BYTE TOGCTL            ;  // Toggle Control
+EXTERN xdata _AT_(0xE684) volatile BYTE USBFRAMEH         ;  // USB Frame count H
+EXTERN xdata _AT_(0xE685) volatile BYTE USBFRAMEL         ;  // USB Frame count L
+EXTERN xdata _AT_(0xE686) volatile BYTE MICROFRAME        ;  // Microframe count, 0-7
+EXTERN xdata _AT_(0xE687) volatile BYTE FNADDR            ;  // USB Function address
+
+// Endpoints
+
+EXTERN xdata _AT_(0xE68A) volatile BYTE EP0BCH            ;  // Endpoint 0 Byte Count H
+EXTERN xdata _AT_(0xE68B) volatile BYTE EP0BCL            ;  // Endpoint 0 Byte Count L
+EXTERN xdata _AT_(0xE68D) volatile BYTE EP1OUTBC          ;  // Endpoint 1 OUT Byte Count
+EXTERN xdata _AT_(0xE68F) volatile BYTE EP1INBC           ;  // Endpoint 1 IN Byte Count
+EXTERN xdata _AT_(0xE690) volatile BYTE EP2BCH            ;  // Endpoint 2 Byte Count H
+EXTERN xdata _AT_(0xE691) volatile BYTE EP2BCL            ;  // Endpoint 2 Byte Count L
+EXTERN xdata _AT_(0xE694) volatile BYTE EP4BCH            ;  // Endpoint 4 Byte Count H
+EXTERN xdata _AT_(0xE695) volatile BYTE EP4BCL            ;  // Endpoint 4 Byte Count L
+EXTERN xdata _AT_(0xE698) volatile BYTE EP6BCH            ;  // Endpoint 6 Byte Count H
+EXTERN xdata _AT_(0xE699) volatile BYTE EP6BCL            ;  // Endpoint 6 Byte Count L
+EXTERN xdata _AT_(0xE69C) volatile BYTE EP8BCH            ;  // Endpoint 8 Byte Count H
+EXTERN xdata _AT_(0xE69D) volatile BYTE EP8BCL            ;  // Endpoint 8 Byte Count L
+EXTERN xdata _AT_(0xE6A0) volatile BYTE EP0CS             ;  // Endpoint  Control and Status
+EXTERN xdata _AT_(0xE6A1) volatile BYTE EP1OUTCS          ;  // Endpoint 1 OUT Control and Status
+EXTERN xdata _AT_(0xE6A2) volatile BYTE EP1INCS           ;  // Endpoint 1 IN Control and Status
+EXTERN xdata _AT_(0xE6A3) volatile BYTE EP2CS             ;  // Endpoint 2 Control and Status
+EXTERN xdata _AT_(0xE6A4) volatile BYTE EP4CS             ;  // Endpoint 4 Control and Status
+EXTERN xdata _AT_(0xE6A5) volatile BYTE EP6CS             ;  // Endpoint 6 Control and Status
+EXTERN xdata _AT_(0xE6A6) volatile BYTE EP8CS             ;  // Endpoint 8 Control and Status
+EXTERN xdata _AT_(0xE6A7) volatile BYTE EP2FIFOFLGS       ;  // Endpoint 2 Flags
+EXTERN xdata _AT_(0xE6A8) volatile BYTE EP4FIFOFLGS       ;  // Endpoint 4 Flags
+EXTERN xdata _AT_(0xE6A9) volatile BYTE EP6FIFOFLGS       ;  // Endpoint 6 Flags
+EXTERN xdata _AT_(0xE6AA) volatile BYTE EP8FIFOFLGS       ;  // Endpoint 8 Flags
+EXTERN xdata _AT_(0xE6AB) volatile BYTE EP2FIFOBCH        ;  // EP2 FIFO total byte count H
+EXTERN xdata _AT_(0xE6AC) volatile BYTE EP2FIFOBCL        ;  // EP2 FIFO total byte count L
+EXTERN xdata _AT_(0xE6AD) volatile BYTE EP4FIFOBCH        ;  // EP4 FIFO total byte count H
+EXTERN xdata _AT_(0xE6AE) volatile BYTE EP4FIFOBCL        ;  // EP4 FIFO total byte count L
+EXTERN xdata _AT_(0xE6AF) volatile BYTE EP6FIFOBCH        ;  // EP6 FIFO total byte count H
+EXTERN xdata _AT_(0xE6B0) volatile BYTE EP6FIFOBCL        ;  // EP6 FIFO total byte count L
+EXTERN xdata _AT_(0xE6B1) volatile BYTE EP8FIFOBCH        ;  // EP8 FIFO total byte count H
+EXTERN xdata _AT_(0xE6B2) volatile BYTE EP8FIFOBCL        ;  // EP8 FIFO total byte count L
+EXTERN xdata _AT_(0xE6B3) volatile BYTE SUDPTRH           ;  // Setup Data Pointer high address byte
+EXTERN xdata _AT_(0xE6B4) volatile BYTE SUDPTRL           ;  // Setup Data Pointer low address byte
+EXTERN xdata _AT_(0xE6B5) volatile BYTE SUDPTRCTL         ;  // Setup Data Pointer Auto Mode
+EXTERN xdata _AT_(0xE6B8) volatile BYTE SETUPDAT[8]       ;  // 8 bytes of SETUP data
+
+// GPIF
+
+EXTERN xdata _AT_(0xE6C0) volatile BYTE GPIFWFSELECT      ;  // Waveform Selector
+EXTERN xdata _AT_(0xE6C1) volatile BYTE GPIFIDLECS        ;  // GPIF Done, GPIF IDLE drive mode
+EXTERN xdata _AT_(0xE6C2) volatile BYTE GPIFIDLECTL       ;  // Inactive Bus, CTL states
+EXTERN xdata _AT_(0xE6C3) volatile BYTE GPIFCTLCFG        ;  // CTL OUT pin drive
+EXTERN xdata _AT_(0xE6C4) volatile BYTE GPIFADRH          ;  // GPIF Address H
+EXTERN xdata _AT_(0xE6C5) volatile BYTE GPIFADRL          ;  // GPIF Address L
+
+EXTERN xdata _AT_(0xE6CE) volatile BYTE GPIFTCB3          ;  // GPIF Transaction Count Byte 3
+EXTERN xdata _AT_(0xE6CF) volatile BYTE GPIFTCB2          ;  // GPIF Transaction Count Byte 2
+EXTERN xdata _AT_(0xE6D0) volatile BYTE GPIFTCB1          ;  // GPIF Transaction Count Byte 1
+EXTERN xdata _AT_(0xE6D1) volatile BYTE GPIFTCB0          ;  // GPIF Transaction Count Byte 0
+
+#define EP2GPIFTCH GPIFTCB1   // these are here for backwards compatibility
+#define EP2GPIFTCL GPIFTCB0   // before REVE silicon (ie. REVB and REVD)
+#define EP4GPIFTCH GPIFTCB1   // these are here for backwards compatibility
+#define EP4GPIFTCL GPIFTCB0   // before REVE silicon (ie. REVB and REVD)
+#define EP6GPIFTCH GPIFTCB1   // these are here for backwards compatibility
+#define EP6GPIFTCL GPIFTCB0   // before REVE silicon (ie. REVB and REVD)
+#define EP8GPIFTCH GPIFTCB1   // these are here for backwards compatibility
+#define EP8GPIFTCL GPIFTCB0   // before REVE silicon (ie. REVB and REVD)
+
+// EXTERN xdata volatile BYTE EP2GPIFTCH     _AT_ 0xE6D0;  // EP2 GPIF Transaction Count High
+// EXTERN xdata volatile BYTE EP2GPIFTCL     _AT_ 0xE6D1;  // EP2 GPIF Transaction Count Low
+EXTERN xdata _AT_(0xE6D2) volatile BYTE EP2GPIFFLGSEL     ;  // EP2 GPIF Flag select
+EXTERN xdata _AT_(0xE6D3) volatile BYTE EP2GPIFPFSTOP     ;  // Stop GPIF EP2 transaction on prog. flag
+EXTERN xdata _AT_(0xE6D4) volatile BYTE EP2GPIFTRIG       ;  // EP2 FIFO Trigger
+// EXTERN xdata volatile BYTE EP4GPIFTCH     _AT_ 0xE6D8;  // EP4 GPIF Transaction Count High
+// EXTERN xdata volatile BYTE EP4GPIFTCL     _AT_ 0xE6D9;  // EP4 GPIF Transactionr Count Low
+EXTERN xdata _AT_(0xE6DA) volatile BYTE EP4GPIFFLGSEL     ;  // EP4 GPIF Flag select
+EXTERN xdata _AT_(0xE6DB) volatile BYTE EP4GPIFPFSTOP     ;  // Stop GPIF EP4 transaction on prog. flag
+EXTERN xdata _AT_(0xE6DC) volatile BYTE EP4GPIFTRIG       ;  // EP4 FIFO Trigger
+// EXTERN xdata volatile BYTE EP6GPIFTCH     _AT_ 0xE6E0;  // EP6 GPIF Transaction Count High
+// EXTERN xdata volatile BYTE EP6GPIFTCL     _AT_ 0xE6E1;  // EP6 GPIF Transaction Count Low
+EXTERN xdata _AT_(0xE6E2) volatile BYTE EP6GPIFFLGSEL     ;  // EP6 GPIF Flag select
+EXTERN xdata _AT_(0xE6E3) volatile BYTE EP6GPIFPFSTOP     ;  // Stop GPIF EP6 transaction on prog. flag
+EXTERN xdata _AT_(0xE6E4) volatile BYTE EP6GPIFTRIG       ;  // EP6 FIFO Trigger
+// EXTERN xdata volatile BYTE EP8GPIFTCH     _AT_ 0xE6E8;  // EP8 GPIF Transaction Count High
+// EXTERN xdata volatile BYTE EP8GPIFTCL     _AT_ 0xE6E9;  // EP8GPIF Transaction Count Low
+EXTERN xdata _AT_(0xE6EA) volatile BYTE EP8GPIFFLGSEL     ;  // EP8 GPIF Flag select
+EXTERN xdata _AT_(0xE6EB) volatile BYTE EP8GPIFPFSTOP     ;  // Stop GPIF EP8 transaction on prog. flag
+EXTERN xdata _AT_(0xE6EC) volatile BYTE EP8GPIFTRIG       ;  // EP8 FIFO Trigger
+EXTERN xdata _AT_(0xE6F0) volatile BYTE XGPIFSGLDATH      ;  // GPIF Data H (16-bit mode only)
+EXTERN xdata _AT_(0xE6F1) volatile BYTE XGPIFSGLDATLX     ;  // Read/Write GPIF Data L & trigger transac
+EXTERN xdata _AT_(0xE6F2) volatile BYTE XGPIFSGLDATLNOX   ;  // Read GPIF Data L, no transac trigger
+EXTERN xdata _AT_(0xE6F3) volatile BYTE GPIFREADYCFG      ;  // Internal RDY,Sync/Async, RDY5CFG
+EXTERN xdata _AT_(0xE6F4) volatile BYTE GPIFREADYSTAT     ;  // RDY pin states
+EXTERN xdata _AT_(0xE6F5) volatile BYTE GPIFABORT         ;  // Abort GPIF cycles
+
+// UDMA
+
+EXTERN xdata _AT_(0xE6C6) volatile BYTE FLOWSTATE         ; //Defines GPIF flow state
+EXTERN xdata _AT_(0xE6C7) volatile BYTE FLOWLOGIC         ; //Defines flow/hold decision criteria
+EXTERN xdata _AT_(0xE6C8) volatile BYTE FLOWEQ0CTL        ; //CTL states during active flow state
+EXTERN xdata _AT_(0xE6C9) volatile BYTE FLOWEQ1CTL        ; //CTL states during hold flow state
+EXTERN xdata _AT_(0xE6CA) volatile BYTE FLOWHOLDOFF       ;
+EXTERN xdata _AT_(0xE6CB) volatile BYTE FLOWSTB           ; //CTL/RDY Signal to use as master data strobe 
+EXTERN xdata _AT_(0xE6CC) volatile BYTE FLOWSTBEDGE       ; //Defines active master strobe edge
+EXTERN xdata _AT_(0xE6CD) volatile BYTE FLOWSTBHPERIOD    ; //Half Period of output master strobe
+EXTERN xdata _AT_(0xE60C) volatile BYTE GPIFHOLDAMOUNT    ; //Data delay shift 
+EXTERN xdata _AT_(0xE67D) volatile BYTE UDMACRCH          ; //CRC Upper byte
+EXTERN xdata _AT_(0xE67E) volatile BYTE UDMACRCL          ; //CRC Lower byte
+EXTERN xdata _AT_(0xE67F) volatile BYTE UDMACRCQUAL       ; //UDMA In only, host terminated use only
+
+
+// Debug/Test
+
+EXTERN xdata _AT_(0xE6F8) volatile BYTE DBUG              ;  // Debug
+EXTERN xdata _AT_(0xE6F9) volatile BYTE TESTCFG           ;  // Test configuration
+EXTERN xdata _AT_(0xE6FA) volatile BYTE USBTEST           ;  // USB Test Modes
+EXTERN xdata _AT_(0xE6FB) volatile BYTE CT1               ;  // Chirp Test--Override
+EXTERN xdata _AT_(0xE6FC) volatile BYTE CT2               ;  // Chirp Test--FSM
+EXTERN xdata _AT_(0xE6FD) volatile BYTE CT3               ;  // Chirp Test--Control Signals
+EXTERN xdata _AT_(0xE6FE) volatile BYTE CT4               ;  // Chirp Test--Inputs
+
+// Endpoint Buffers
+
+EXTERN xdata _AT_(0xE740) volatile BYTE EP0BUF[64]        ;  // EP0 IN-OUT buffer
+EXTERN xdata _AT_(0xE780) volatile BYTE EP1OUTBUF[64]     ;  // EP1-OUT buffer
+EXTERN xdata _AT_(0xE7C0) volatile BYTE EP1INBUF[64]      ;  // EP1-IN buffer
+EXTERN xdata _AT_(0xF000) volatile BYTE EP2FIFOBUF[1024]  ;  // 512/1024-byte EP2 buffer (IN or OUT)
+EXTERN xdata _AT_(0xF400) volatile BYTE EP4FIFOBUF[1024]  ;  // 512 byte EP4 buffer (IN or OUT)
+EXTERN xdata _AT_(0xF800) volatile BYTE EP6FIFOBUF[1024]  ;  // 512/1024-byte EP6 buffer (IN or OUT)
+EXTERN xdata _AT_(0xFC00) volatile BYTE EP8FIFOBUF[1024]  ;  // 512 byte EP8 buffer (IN or OUT)
+
+#undef EXTERN
+#undef _AT_
+
+/*-----------------------------------------------------------------------------
+   Special Function Registers (SFRs)
+   The byte registers and bits defined in the following list are based
+   on the Synopsis definition of the 8051 Special Function Registers for EZ-USB. 
+    If you modify the register definitions below, please regenerate the file 
+    "ezregs.inc" which includes the same basic information for assembly inclusion.
+-----------------------------------------------------------------------------*/
+
+sfr at 0x80 IOA ;
+sfr at 0x81 SP  ;
+sfr at 0x82 DPL ;
+sfr at 0x83 DPH ;
+sfr at 0x84 DPL1;
+sfr at 0x85 DPH1;
+sfr at 0x86 DPS ;
+         /*  DPS  */
+         // sbit SEL   = 0x86+0;
+sfr at 0x87 PCON ;
+	/*  PCON  */
+         //sbit IDLE   = 0x87+0;
+         //sbit STOP   = 0x87+1;
+         //sbit GF0    = 0x87+2;
+         //sbit GF1    = 0x87+3;
+         //sbit SMOD0  = 0x87+7;
+sfr at 0x88 TCON;
+         /*  TCON  */
+/*         sbit IT0    = 0x88+0;
+         sbit IE0    = 0x88+1;
+         sbit IT1    = 0x88+2;
+         sbit IE1    = 0x88+3;
+         sbit TR0    = 0x88+4;
+         sbit TF0    = 0x88+5;
+         sbit TR1    = 0x88+6;
+         sbit TF1    = 0x88+7;*/
+sfr at 0x89 TMOD;
+         /*  TMOD  */
+         //sbit M00    = 0x89+0;
+         //sbit M10    = 0x89+1;
+         //sbit CT0    = 0x89+2;
+         //sbit GATE0  = 0x89+3;
+         //sbit M01    = 0x89+4;
+         //sbit M11    = 0x89+5;
+         //sbit CT1    = 0x89+6;
+         //sbit GATE1  = 0x89+7;
+sfr at 0x8A TL0 ;
+sfr at 0x8B TL1 ;
+sfr at 0x8C TH0 ;
+sfr at 0x8D TH1 ;
+sfr at 0x8E CKCO;
+         /*  CKCON  */
+         //sbit MD0    = 0x89+0;
+         //sbit MD1    = 0x89+1;
+         //sbit MD2    = 0x89+2;
+         //sbit T0M    = 0x89+3;
+         //sbit T1M    = 0x89+4;
+         //sbit T2M    = 0x89+5;
+sfr at 0x8F SPC_; // Was WRS in Reg320
+         /*  CKCON  */
+         //sbit WRS    = 0x8F+0;
+sfr at 0x90 IOB ;
+sfr at 0x91 EXIF; // EXIF Bit Values differ from Reg320
+         /*  EXIF  */
+         //sbit USBINT = 0x91+4;
+         //sbit I2CINT = 0x91+5;
+         //sbit IE4    = 0x91+6;
+         //sbit IE5    = 0x91+7;
+sfr at 0x92 MPA;
+sfr at 0x98 SCO;
+         /*  SCON0  */
+/*         sbit RI    = 0x98+0;
+         sbit TI    = 0x98+1;
+         sbit RB8   = 0x98+2;
+         sbit TB8   = 0x98+3;
+         sbit REN   = 0x98+4;
+         sbit SM2   = 0x98+5;
+         sbit SM1   = 0x98+6;
+         sbit SM0   = 0x98+7;*/
+sfr at 0x99 SBU;
+
+sfr at 0x9A APTR1H ;
+sfr at 0x9B APTR1L ;
+sfr at 0x9C AUTODAT1; 
+sfr at 0x9D AUTOPTRH2;
+sfr at 0x9E AUTOPTRL2; 
+sfr at 0x9F AUTODAT2;
+sfr at 0xA0 IOC    ;
+sfr at 0xA1 INT2CLR;
+sfr at 0xA2 INT4CLR;
+
+sfr at 0xA8 IE ;
+         /*  IE  */
+//          sbit EX0   = 0xA8+0;
+//          sbit ET0   = 0xA8+1;
+//          sbit EX1   = 0xA8+2;
+//          sbit ET1   = 0xA8+3;
+//          sbit ES0   = 0xA8+4;
+//          sbit ET2   = 0xA8+5;
+//          sbit ES1   = 0xA8+6;
+//          sbit EA    = 0xA8+7;
+
+sfr at 0xAA EP2468STAT;
+         /* EP2468STAT */
+         //sbit EP2E   = 0xAA+0;
+         //sbit EP2F   = 0xAA+1;
+         //sbit EP4E   = 0xAA+2;
+         //sbit EP4F   = 0xAA+3;
+         //sbit EP6E   = 0xAA+4;
+         //sbit EP6F   = 0xAA+5;
+         //sbit EP8E   = 0xAA+6;
+         //sbit EP8F   = 0xAA+7;
+
+sfr at 0xAB EP24FIFOFLGS;
+sfr at 0xAC EP68FIFOFLGS;
+sfr at 0xAF AUTOPTRSETUP;
+            /* AUTOPTRSETUP */
+//             sbit EXTACC  = 0xAF+0;
+//             sbit APTR1FZ = 0xAF+1;
+//             sbit APTR2FZ = 0xAF+2;
+
+sfr at 0xB0 IOD ;
+sfr at 0xB1 IOE ;
+sfr at 0xB2 OEA ;
+sfr at 0xB3 OEB ;
+sfr at 0xB4 OEC ;
+sfr at 0xB5 OED ;
+sfr at 0xB6 OEE ;
+
+sfr at 0xB8 IP ;
+         /*  IP  */
+//          sbit PX0   = 0xB8+0;
+//          sbit PT0   = 0xB8+1;
+//          sbit PX1   = 0xB8+2;
+//          sbit PT1   = 0xB8+3;
+//          sbit PS0   = 0xB8+4;
+//          sbit PT2   = 0xB8+5;
+//          sbit PS1   = 0xB8+6;
+
+sfr at 0xBA EP01STAT;
+sfr at 0xBB GPIFTRIG;
+                
+sfr at 0xBD GPIFSGLDATH;
+sfr at 0xBE GPIFSGLDATLX;
+sfr at 0xBF GPIFSGLDATLNOX;
+
+sfr at 0xC0 SCON1;
+         /*  SCON1  */
+/*         sbit RI1   = 0xC0+0;
+         sbit TI1   = 0xC0+1;
+         sbit RB81  = 0xC0+2;
+         sbit TB81  = 0xC0+3;
+         sbit REN1  = 0xC0+4;
+         sbit SM21  = 0xC0+5;
+         sbit SM11  = 0xC0+6;
+         sbit SM01  = 0xC0+7;*/
+sfr at 0xC1 SBUF1;
+sfr at 0xC8 T2CON;
+         /*  T2CON  */
+/*         sbit CP_RL2 = 0xC8+0;
+         sbit C_T2  = 0xC8+1;
+         sbit TR2   = 0xC8+2;
+         sbit EXEN2 = 0xC8+3;
+         sbit TCLK  = 0xC8+4;
+         sbit RCLK  = 0xC8+5;
+         sbit EXF2  = 0xC8+6;
+         sbit TF2   = 0xC8+7;*/
+sfr at 0xCA RCAP2L;
+sfr at 0xCB RCAP2H;
+sfr at 0xCC TL2;
+sfr at 0xCD TH2;
+sfr at 0xD0 PSW;
+         /*  PSW  */
+/*         sbit P     = 0xD0+0;
+         sbit FL    = 0xD0+1;
+         sbit OV    = 0xD0+2;
+         sbit RS0   = 0xD0+3;
+         sbit RS1   = 0xD0+4;
+         sbit F0    = 0xD0+5;
+         sbit AC    = 0xD0+6;
+         sbit CY    = 0xD0+7;*/
+sfr at 0xD8 EICON; // Was WDCON in DS80C320; Bit Values differ from Reg320
+         /*  EICON  */
+/*         sbit INT6  = 0xD8+3;
+         sbit RESI  = 0xD8+4;
+         sbit ERESI = 0xD8+5;
+         sbit SMOD1 = 0xD8+7;*/
+sfr at 0xE0 ACC;
+sfr at 0xE8 EIE; // EIE Bit Values differ from Reg320
+                        /*  EIE  */
+/*         sbit EUSB    = 0xE8+0;
+         sbit EI2C    = 0xE8+1;
+         sbit EIEX4   = 0xE8+2;
+         sbit EIEX5   = 0xE8+3;
+         sbit EIEX6   = 0xE8+4;*/
+sfr at 0xF0 B  ;
+sfr at 0xF8 EIP; // EIP Bit Values differ from Reg320
+                        /*  EIP  */
+//          sbit PUSB    = 0xF8+0;
+//          sbit PI2C    = 0xF8+1;
+//          sbit EIPX4   = 0xF8+2;
+//          sbit EIPX5   = 0xF8+3;
+//          sbit EIPX6   = 0xF8+4;
+
+/*-----------------------------------------------------------------------------
+   Bit Masks
+-----------------------------------------------------------------------------*/
+
+#define bmBIT0	1
+#define bmBIT1	2
+#define bmBIT2	4
+#define bmBIT3	8
+#define bmBIT4	16
+#define bmBIT5	32
+#define bmBIT6	64
+#define bmBIT7	128
+
+
+/* CPU Control & Status Register (CPUCS) */
+#define bmPRTCSTB    bmBIT5
+#define bmCLKSPD     (bmBIT4 | bmBIT3)
+#define bmCLKSPD1    bmBIT4
+#define bmCLKSPD0    bmBIT3
+#define bmCLKINV     bmBIT2
+#define bmCLKOE      bmBIT1
+#define bm8051RES    bmBIT0
+/* Port Alternate Configuration Registers */
+/* Port A (PORTACFG) */
+#define bmFLAGD      bmBIT7
+#define bmINT1       bmBIT1
+#define bmINT0       bmBIT0
+/* Port C (PORTCCFG) */
+#define bmGPIFA7     bmBIT7
+#define bmGPIFA6     bmBIT6
+#define bmGPIFA5     bmBIT5
+#define bmGPIFA4     bmBIT4
+#define bmGPIFA3     bmBIT3
+#define bmGPIFA2     bmBIT2
+#define bmGPIFA1     bmBIT1
+#define bmGPIFA0     bmBIT0
+/* Port E (PORTECFG) */
+#define bmGPIFA8     bmBIT7
+#define bmT2EX       bmBIT6
+#define bmINT6       bmBIT5
+#define bmRXD1OUT    bmBIT4
+#define bmRXD0OUT    bmBIT3
+#define bmT2OUT      bmBIT2
+#define bmT1OUT      bmBIT1
+#define bmT0OUT      bmBIT0
+
+/* I2C Control & Status Register (I2CS) */
+#define bmSTART      bmBIT7
+#define bmSTOP       bmBIT6
+#define bmLASTRD     bmBIT5
+#define bmID         (bmBIT4 | bmBIT3)
+#define bmBERR       bmBIT2
+#define bmACK        bmBIT1
+#define bmDONE       bmBIT0
+/* I2C Control Register (I2CTL) */
+#define bmSTOPIE     bmBIT1
+#define bm400KHZ     bmBIT0
+/* Interrupt 2 (USB) Autovector Register (INT2IVEC) */
+#define bmIV4        bmBIT6
+#define bmIV3        bmBIT5
+#define bmIV2        bmBIT4
+#define bmIV1        bmBIT3
+#define bmIV0        bmBIT2
+/* USB Interrupt Request & Enable Registers (USBIE/USBIRQ) */
+#define bmEP0ACK     bmBIT6
+#define bmHSGRANT    bmBIT5
+#define bmURES       bmBIT4
+#define bmSUSP       bmBIT3
+#define bmSUTOK      bmBIT2
+#define bmSOF        bmBIT1
+#define bmSUDAV      bmBIT0
+/* Breakpoint register (BREAKPT) */
+#define bmBREAK      bmBIT3
+#define bmBPPULSE    bmBIT2
+#define bmBPEN       bmBIT1
+/* Interrupt 2 & 4 Setup (INTSETUP) */
+#define bmAV2EN      bmBIT3
+#define INT4IN       bmBIT1
+#define bmAV4EN      bmBIT0
+/* USB Control & Status Register (USBCS) */
+#define bmHSM        bmBIT7
+#define bmDISCON     bmBIT3
+#define bmNOSYNSOF   bmBIT2
+#define bmRENUM      bmBIT1
+#define bmSIGRESUME  bmBIT0
+/* Wakeup Control and Status Register (WAKEUPCS) */
+#define bmWU2        bmBIT7
+#define bmWU         bmBIT6
+#define bmWU2POL     bmBIT5
+#define bmWUPOL      bmBIT4
+#define bmDPEN       bmBIT2
+#define bmWU2EN      bmBIT1
+#define bmWUEN       bmBIT0
+/* End Point 0 Control & Status Register (EP0CS) */
+#define bmHSNAK      bmBIT7
+/* End Point 0-1 Control & Status Registers (EP0CS/EP1OUTCS/EP1INCS) */
+#define bmEPBUSY     bmBIT1
+#define bmEPSTALL    bmBIT0
+/* End Point 2-8 Control & Status Registers (EP2CS/EP4CS/EP6CS/EP8CS) */
+#define bmNPAK       (bmBIT6 | bmBIT5 | bmBIT4)
+#define bmEPFULL     bmBIT3
+#define bmEPEMPTY    bmBIT2
+/* Endpoint Status (EP2468STAT) SFR bits */
+#define bmEP8FULL    bmBIT7
+#define bmEP8EMPTY   bmBIT6
+#define bmEP6FULL    bmBIT5
+#define bmEP6EMPTY   bmBIT4
+#define bmEP4FULL    bmBIT3
+#define bmEP4EMPTY   bmBIT2
+#define bmEP2FULL    bmBIT1
+#define bmEP2EMPTY   bmBIT0
+/* SETUP Data Pointer Auto Mode (SUDPTRCTL) */
+#define bmSDPAUTO    bmBIT0
+/* Endpoint Data Toggle Control (TOGCTL) */
+#define bmQUERYTOGGLE  bmBIT7
+#define bmSETTOGGLE    bmBIT6
+#define bmRESETTOGGLE  bmBIT5
+#define bmTOGCTLEPMASK bmBIT3 | bmBIT2 | bmBIT1 | bmBIT0
+/* IBN (In Bulk Nak) enable and request bits (IBNIE/IBNIRQ) */
+#define bmEP8IBN     bmBIT5
+#define bmEP6IBN     bmBIT4
+#define bmEP4IBN     bmBIT3
+#define bmEP2IBN     bmBIT2
+#define bmEP1IBN     bmBIT1
+#define bmEP0IBN     bmBIT0
+
+/* PING-NAK enable and request bits (NAKIE/NAKIRQ) */
+#define bmEP8PING     bmBIT7
+#define bmEP6PING     bmBIT6
+#define bmEP4PING     bmBIT5
+#define bmEP2PING     bmBIT4
+#define bmEP1PING     bmBIT3
+#define bmEP0PING     bmBIT2
+#define bmIBN         bmBIT0
+
+/* Interface Configuration bits (IFCONFIG) */
+#define bmIFCLKSRC    bmBIT7
+#define bm3048MHZ     bmBIT6
+#define bmIFCLKOE     bmBIT5
+#define bmIFCLKPOL    bmBIT4
+#define bmASYNC       bmBIT3
+#define bmGSTATE      bmBIT2
+#define bmIFCFG1      bmBIT1
+#define bmIFCFG0      bmBIT0
+#define bmIFCFGMASK   (bmIFCFG0 | bmIFCFG1)
+#define bmIFGPIF      bmIFCFG1
+
+/* EP 2468 FIFO Configuration bits (EP2FIFOCFG,EP4FIFOCFG,EP6FIFOCFG,EP8FIFOCFG) */
+#define bmINFM       bmBIT6
+#define bmOEP        bmBIT5
+#define bmAUTOOUT    bmBIT4
+#define bmAUTOIN     bmBIT3
+#define bmZEROLENIN  bmBIT2
+#define bmWORDWIDE   bmBIT0
+
+/* Chip Revision Control Bits (REVCTL) - used to ebable/disable revision specidic
+   features */ 
+#define bmNOAUTOARM    bmBIT1
+#define bmSKIPCOMMIT   bmBIT0
+
+/* Fifo Reset bits (FIFORESET) */
+#define bmNAKALL       bmBIT7
+
+#endif   /* FX2REGS_H */
-- 
GitLab