//-----------------------------------------------------------------------------
//      File:           ezregs.h
//      Contents:       EZ-USB register declarations and bit mask definitions.
//
//      Copyright (c) 1997 AnchorChips, Inc. All rights reserved
//-----------------------------------------------------------------------------
#ifndef EZREGS_H		/* Header Sentry */
#define EZREGS_H

/*-----------------------------------------------------------------------------
	Global Variables
-----------------------------------------------------------------------------*/
// The Ez-USB registers are defined here. There used to be 3 files containing
// this information: ezregs.h (external refs), ezregs.c (bound reg names to an 
// explicit address in ezusb.lib), and ezregs.inc (included in assembly files).
// We now use ezregs.h for register address allocation instead of ezregs.c by  
// using "#define ALLOCATE_EXTERN". The file ezregs.c now just includes ezregs.h.
// When using "#define ALLOCATE_EXTERN", you get: 
// xdata volatile BYTE OUT7BUF[64]      _at_    0x7B40;
// Such lines used to be in ezregs.c, but now are created from ezregs.h by using
// the preprocessor. The definitions in ezregs.c were redundant.
// Incidently, these lines will not generate any space in the resulting hex 
// file; they just bind the symbols to the addresses for compilation. 
// Since the file ezregs.c is still used in the library build, you normally
// just need to use #include "ezregs.h" in your files (i.e. fw.c).
// If you want to generate your own (non-frameworks based) C example, then you 
// just need to put "#define ALLOCATE_EXTERN" in your main program file; 
// i.e. fw.c or a stand-alone C source file. Any time you link with ezusb.lib,
// it will not be necessary to "#define ALLOCATE_EXTERN".
// 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.
// If you modify the register definitions below, please regenerate the file 
// "ezregs.inc" which uses the same basic information, but which could not be 
// derived automatically from this one source file using the preprocessor.

#ifdef ALLOCATE_EXTERN
#define NEWEZREG(_name,_where,_size) volatile xdata at _where _size _name
#else				/*  */
#define NEWEZREG(_name,_where,_size) extern volatile xdata _size _name
#endif				/*  */

/* Register Assignments 3/18/99 TPM */
NEWEZREG(OUT7BUF[64],0x7B40,BYTE);
NEWEZREG(IN7BUF[64],0x7B80,BYTE);
NEWEZREG(OUT6BUF[64],0x7BC0,BYTE);
NEWEZREG(IN6BUF[64],0x7C00,BYTE);
NEWEZREG(OUT5BUF[64],0x7C40,BYTE);
NEWEZREG(IN5BUF[64],0x7C80,BYTE);
NEWEZREG(OUT4BUF[64],0x7CC0,BYTE);
NEWEZREG(IN4BUF[64],0x7D00,BYTE);
NEWEZREG(OUT3BUF[64],0x7D40,BYTE);
NEWEZREG(IN3BUF[64],0x7D80,BYTE);
NEWEZREG(OUT2BUF[64],0x7DC0,BYTE);
NEWEZREG(IN2BUF[64],0x7E00,BYTE);
NEWEZREG(OUT1BUF[64],0x7E40,BYTE);
NEWEZREG(IN1BUF[64],0x7E80,BYTE);
NEWEZREG(OUT0BUF[64],0x7EC0,BYTE);
NEWEZREG(IN0BUF[64],0x7F00,BYTE);
NEWEZREG(OUT8DATA,0x7F60,BYTE);
NEWEZREG(OUT9DATA,0x7F61,BYTE);
NEWEZREG(OUT10DATA,0x7F62,BYTE);
NEWEZREG(OUT11DATA,0x7F63,BYTE);
NEWEZREG(OUT12DATA,0x7F64,BYTE);
NEWEZREG(OUT13DATA,0x7F65,BYTE);
NEWEZREG(OUT14DATA,0x7F66,BYTE);
NEWEZREG(OUT15DATA,0x7F67,BYTE);
NEWEZREG(IN8DATA,0x7F68,BYTE);
NEWEZREG(IN9DATA,0x7F69,BYTE);
NEWEZREG(IN10DATA,0x7F6A,BYTE);
NEWEZREG(IN11DATA,0x7F6B,BYTE);
NEWEZREG(IN12DATA,0x7F6C,BYTE);
NEWEZREG(IN13DATA,0x7F6D,BYTE);
NEWEZREG(IN14DATA,0x7F6E,BYTE);
NEWEZREG(IN15DATA,0x7F6F,BYTE);
NEWEZREG(OUT8BCH,0x7F70,BYTE);
NEWEZREG(OUT8BCL,0x7F71,BYTE);
NEWEZREG(OUT9BCH,0x7F72,BYTE);
NEWEZREG(OUT9BCL,0x7F73,BYTE);
NEWEZREG(OUT10BCH,0x7F74,BYTE);
NEWEZREG(OUT10BCL,0x7F75,BYTE);
NEWEZREG(OUT11BCH,0x7F76,BYTE);
NEWEZREG(OUT11BCL,0x7F77,BYTE);
NEWEZREG(OUT12BCH,0x7F78,BYTE);
NEWEZREG(OUT12BCL,0x7F79,BYTE);
NEWEZREG(OUT13BCH,0x7F7A,BYTE);
NEWEZREG(OUT13BCL,0x7F7B,BYTE);
NEWEZREG(OUT14BCH,0x7F7C,BYTE);
NEWEZREG(OUT14BCL,0x7F7D,BYTE);
NEWEZREG(OUT15BCH,0x7F7E,BYTE);
NEWEZREG(OUT15BCL,0x7F7F,BYTE);
NEWEZREG(CPUCS,0x7F92,BYTE);
NEWEZREG(PORTACFG,0x7F93,BYTE);
NEWEZREG(PORTBCFG,0x7F94,BYTE);
NEWEZREG(PORTCCFG,0x7F95,BYTE);
NEWEZREG(OUTA,0x7F96,BYTE);
NEWEZREG(OUTB,0x7F97,BYTE);
NEWEZREG(OUTC,0x7F98,BYTE);
NEWEZREG(PINSA,0x7F99,BYTE);
NEWEZREG(PINSB,0x7F9A,BYTE);
NEWEZREG(PINSC,0x7F9B,BYTE);
NEWEZREG(OEA,0x7F9C,BYTE);
NEWEZREG(OEB,0x7F9D,BYTE);
NEWEZREG(OEC,0x7F9E,BYTE);
NEWEZREG(UART230,0x7F9F,BYTE);
NEWEZREG(ISOERR,0x7FA0,BYTE);
NEWEZREG(ISOCTL,0x7FA1,BYTE);
NEWEZREG(ZBCOUT,0x7FA2,BYTE);
NEWEZREG(ZBCIN,0x7FA3,BYTE);
NEWEZREG(I2CS,0x7FA5,BYTE);
NEWEZREG(I2DAT,0x7FA6,BYTE);
NEWEZREG(IVEC,0x7FA8,BYTE);
NEWEZREG(IN07IRQ,0x7FA9,BYTE);
NEWEZREG(OUT07IRQ,0x7FAA,BYTE);
NEWEZREG(USBIRQ,0x7FAB,BYTE);
NEWEZREG(IN07IEN,0x7FAC,BYTE);
NEWEZREG(OUT07IEN,0x7FAD,BYTE);
NEWEZREG(USBIEN,0x7FAE,BYTE);
NEWEZREG(USBBAV,0x7FAF,BYTE);
NEWEZREG(BPADDR,0x7FB2,WORD);

//NEWEZREG(BPADDRL,0x7FB3,BYTE);
NEWEZREG(EPIO[16],0x7FB4,EPIOC);
NEWEZREG(SUDPTRH,0x7FD4,BYTE);
NEWEZREG(SUDPTRL,0x7FD5,BYTE);
NEWEZREG(USBCS,0x7FD6,BYTE);
NEWEZREG(TOGCTL,0x7FD7,BYTE);
NEWEZREG(USBFRAMEL,0x7FD8,BYTE);
NEWEZREG(USBFRAMEH,0x7FD9,BYTE);
NEWEZREG(FNADDR,0x7FDB,BYTE);
NEWEZREG(USBPAIR,0x7FDD,BYTE);
NEWEZREG(IN07VAL,0x7FDE,BYTE);
NEWEZREG(OUT07VAL,0x7FDF,BYTE);
NEWEZREG(INISOVAL,0x7FE0,BYTE);
NEWEZREG(OUTISOVAL,0x7FE1,BYTE);
NEWEZREG(FASTXFR,0x7FE2,BYTE);
NEWEZREG(AUTOPTRH,0x7FE3,BYTE);
NEWEZREG(AUTOPTRL,0x7FE4,BYTE);
NEWEZREG(AUTODATA,0x7FE5,BYTE);
NEWEZREG(SETUPDAT[8],0x7FE8,BYTE);
NEWEZREG(OUT8ADDR,0x7FF0,BYTE);
NEWEZREG(OUT9ADDR,0x7FF1,BYTE);
NEWEZREG(OUT10ADDR,0x7FF2,BYTE);
NEWEZREG(OUT11ADDR,0x7FF3,BYTE);
NEWEZREG(OUT12ADDR,0x7FF4,BYTE);
NEWEZREG(OUT13ADDR,0x7FF5,BYTE);
NEWEZREG(OUT14ADDR,0x7FF6,BYTE);
NEWEZREG(OUT15ADDR,0x7FF7,BYTE);
NEWEZREG(IN8ADDR,0x7FF8,BYTE);
NEWEZREG(IN9ADDR,0x7FF9,BYTE);
NEWEZREG(IN10ADDR,0x7FFA,BYTE);
NEWEZREG(IN11ADDR,0x7FFB,BYTE);
NEWEZREG(IN12ADDR,0x7FFC,BYTE);
NEWEZREG(IN13ADDR,0x7FFD,BYTE);
NEWEZREG(IN14ADDR,0x7FFE,BYTE);
NEWEZREG(IN15ADDR,0x7FFF,BYTE);


/*-----------------------------------------------------------------------------
	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 0x81 SP;
sfr at 0x82 DPL;
sfr at 0x83 DPH;
sfr at 0x84 DPL1;
sfr at 0x85 DPH1;
sfr at 0x86 DPS;

  /*  DPS  */
sbit at 0x86+0 SEL;
sfr at 0x87 PCON;		/*  PCON  */

  //sbit at 0x87+0 IDLE;
  //sbit at 0x87+1 STOP;
  //sbit at 0x87+2 GF0;
  //sbit at 0x87+3 GF1;
  //sbit at 0x87+7 SMOD0;
sfr at 0x88 TCON;

  /*  TCON  */
sbit at 0x88+0 IT0;  
sbit at 0x88+1 IE0;
sbit at 0x88+2 IT1;
sbit at 0x88+3 IE1;
sbit at 0x88+4 TR0;
sbit at 0x88+5 TF0;
sbit at 0x88+6 TR1;
sbit at 0x88+7 TF1;
sfr at 0x89 TMOD;

  /*  TMOD  */
  //sbit at 0x89+0 M00;
  //sbit at 0x89+1 M10;
  //sbit at 0x89+2 CT0;
  //sbit at 0x89+3 GATE0;
  //sbit at 0x89+4 M01;
  //sbit at 0x89+5 M11;
  //sbit at 0x89+6 CT1;
  //sbit at 0x89+7 GATE1;
sfr at 0x8A TL0;
sfr at 0x8B TL1;
sfr at 0x8C TH0;
sfr at 0x8D TH1;
sfr at 0x8E CKCON;

  /*  CKCON  */
  //sbit at 0x89+0 MD0;
  //sbit at 0x89+1 MD1;
  //sbit at 0x89+2 MD2;
  //sbit at 0x89+3 T0M;
  //sbit at 0x89+4 T1M;
  //sbit at 0x89+5 T2M;
sfr at 0x8F SPC_FNC;		// Was WRS in Reg320
			/*  CKCON  */
  //sbit at 0x8F+0 WRS;
sfr at 0x91 EXIF;		// EXIF Bit Values differ from Reg320
			/*  EXIF  */
  //sbit at 0x91+4 USBINT;
  //sbit at 0x91+5 I2CINT;
  //sbit at 0x91+6 IE4;
  //sbit at 0x91+7 IE5;
sfr at 0x92 MPAGE;
sfr at 0x98 SCON0;

  /*  SCON0  */
sbit at 0x98+0 RI;
sbit at 0x98+1 TI;
sbit at 0x98+2 RB8;
sbit at 0x98+3 TB8;
sbit at 0x98+4 REN;
sbit at 0x98+5 SM2;
sbit at 0x98+6 SM1;
sbit at 0x98+7 SM0;
sfr at 0x99 SBUF0;
sfr at 0xA8 IE;

  /*  IE  */
sbit at 0xA8+0 EX0;
sbit at 0xA8+1 ET0;
sbit at 0xA8+2 EX1;
sbit at 0xA8+3 ET1;
sbit at 0xA8+4 ES0;
sbit at 0xA8+5 ET2;
sbit at 0xA8+6 ES1;
sbit at 0xA8+7 EA;
sfr at 0xB8 IP;

  /*  IP  */
sbit at 0xB8+0 PX0;
sbit at 0xB8+1 PT0;
sbit at 0xB8+2 PX1;
sbit at 0xB8+3 PT1;
sbit at 0xB8+4 PS0;
sbit at 0xB8+5 PT2;
sbit at 0xB8+6 PS1;
sfr at 0xC0 SCON1;

  /*  SCON1  */
sbit at 0xC0+0 RI1;
sbit at 0xC0+1 TI1;
sbit at 0xC0+2 RB81;
sbit at 0xC0+3 TB81;
sbit at 0xC0+4 REN1;
sbit at 0xC0+5 SM21;
sbit at 0xC0+6 SM11;
sbit at 0xC0+7 SM01;
sfr at 0xC1 SBUF1;
sfr at 0xC8 T2CON;

  /*  T2CON  */
sbit at 0xC8+0 CP_RL2;
sbit at 0xC8+1 C_T2;
sbit at 0xC8+2 TR2;
sbit at 0xC8+3 EXEN2;
sbit at 0xC8+4 TCLK;
sbit at 0xC8+5 RCLK;
sbit at 0xC8+6 EXF2;
sbit at 0xC8+7 TF2;
sfr at 0xCA RCAP2L;
sfr at 0xCB RCAP2H;
sfr at 0xCC TL2;
sfr at 0xCD TH2;
sfr at 0xD0 PSW;

  /*  PSW  */
sbit at 0xD0+0 P;
sbit at 0xD0+1 FL;
sbit at 0xD0+2 OV;
sbit at 0xD0+3 RS0;
sbit at 0xD0+4 RS1;
sbit at 0xD0+5 F0;
sbit at 0xD0+6 AC;
sbit at 0xD0+7 CY;
sfr at 0xD8 EICON;		// Was WDCON in DS80C320; Bit Values differ from Reg320
			/*  EICON  */
sbit at 0xD8+3 INT6;
sbit at 0xD8+4 RESI;
sbit at 0xD8+5 ERESI;
sbit at 0xD8+7 SMOD1;
sfr at 0xE0 ACC;
sfr at 0xE8 EIE;		// EIE Bit Values differ from Reg320
			/*  EIE  */
sbit at 0xE8+0 EUSB;
sbit at 0xE8+1 EI2C;
sbit at 0xE8+2 EIEX4;
sbit at 0xE8+3 EIEX5;
sbit at 0xE8+4 EIEX6;
sfr at 0xF0 B;
sfr at 0xF8 EIP;		// EIP Bit Values differ from Reg320
			/*  EIP  */
sbit at 0xF8+0 PUSB;
sbit at 0xF8+1 PI2C;
sbit at 0xF8+2 EIPX4;
sbit at 0xF8+3 EIPX5;
sbit at 0xF8+4 EIPX6;

/*-----------------------------------------------------------------------------
	Bit Masks
-----------------------------------------------------------------------------*/

/* CPU Control & Status Register */
#define bmCHIPREV		(bmBIT7 | bmBIT6 | bmBIT5 | bmBIT4)
#define bmCLK24OE		bmBIT1
#define bm8052RES		bmBIT0
/* Port Configuration Registers */
/* Port A */
#define bmRXD1OUT		bmBIT7
#define bmRXD0OUT		bmBIT6
#define bmFRD			bmBIT5
#define bmFWR			bmBIT4
#define bmCS			bmBIT3
#define bmOE			bmBIT2
#define bmT1OUT			bmBIT1
#define bmT0OUT			bmBIT0
/* Port B */
#define bmT2OUT			bmBIT7
#define bmINT6			bmBIT6
#define bmINT5			bmBIT5
#define bmINT4			bmBIT4
#define bmTXD1			bmBIT3
#define bmRXD1			bmBIT2
#define bmT2EX			bmBIT1
#define bmT2			bmBIT0
/* Port C */
#define bmRD			bmBIT7
#define bmWR			bmBIT6
#define bmT1			bmBIT5
#define bmT0			bmBIT4
#define bmINT1			bmBIT3
#define bmINT0			bmBIT2
#define bmTXD0			bmBIT1
#define bmRXD0			bmBIT0
/* Isochronous Status & End Point Valid Registers */
#define bmEP15			bmBIT7
#define bmEP14			bmBIT6
#define bmEP13			bmBIT5
#define bmEP12			bmBIT4
#define bmEP11			bmBIT3
#define bmEP10			bmBIT2
#define bmEP9			bmBIT1
#define bmEP8			bmBIT0
/* I2C Control & Status Register */
#define bmSTART			bmBIT7
#define bmSTOP			bmBIT6
#define bmLASTRD		bmBIT5
#define bmID			(bmBIT4 | bmBIT3)
#define bmBERR			bmBIT2
#define bmACK			bmBIT1
#define bmDONE			bmBIT0
/* Interrupt Vector Register */
#define bmIV4			bmBIT6
#define bmIV3			bmBIT5
#define bmIV2			bmBIT4
#define bmIV1			bmBIT3
#define bmIV0			bmBIT2
/* End point Interrupt Request, End Point Interrupt Enable */
/* And End Point Valid Registers */
#define bmEP7			bmBIT7
#define bmEP6			bmBIT6
#define bmEP5			bmBIT5
#define bmEP4			bmBIT4
#define bmEP3			bmBIT3
#define bmEP2			bmBIT2
#define bmEP1			bmBIT1
#define bmEP0			bmBIT0
/* Global Interrupt Request & Enable Registers */
#define bmIBN        bmBIT5
#define bmURES			bmBIT4
#define bmSUSP			bmBIT3
#define bmSUTOK			bmBIT2
#define bmSOF			bmBIT1
#define bmSUDAV			bmBIT0
/* Global Control */
#define bmBREAK			bmBIT3
#define bmBPPULSE		bmBIT2
#define bmBPEN			bmBIT1
#define bmAVEN			bmBIT0
/* USB Control & Status Register */
#define bmRWAKEUP		bmBIT7
#define bmDISCON		bmBIT3
#define bmDISCOE		bmBIT2
#define bmRENUM			bmBIT1
#define bmSIGRESUME		bmBIT0
/* End Point 0 Control & Status Register */
#define bmOUT			bmBIT3
#define bmIN			bmBIT2
#define bmHS			bmBIT1
#define bmHSSTALL		bmBIT0
/* End Point Control & Status Registers */
#define bmEPSTALL		bmBIT0
#define bmEPBUSY		bmBIT1
/* Fast Transfer Register */
#define bmFISO			bmBIT7
#define bmFBLK			bmBIT6
#define bmRPOL			bmBIT5
#define bmRMOD1			bmBIT4
#define bmRMOD0			bmBIT3
#define bmWPOL			bmBIT2
#define bmWMOD1			bmBIT1
#define bmWMOD0			bmBIT0
/* Endpoint Pairing Register */
#define bmISOSEND0		bmBIT7
#define bmPR6OUT		bmBIT5
#define bmPR4OUT		bmBIT4
#define bmPR2OUT		bmBIT3
#define bmPR6IN			bmBIT2
#define bmPR4IN			bmBIT1
#define bmPR2IN			bmBIT0
/* End point control offsets */
enum { IN0BUF_ID =
	0, IN1BUF_ID, IN2BUF_ID, IN3BUF_ID, IN4BUF_ID, IN5BUF_ID,
	IN6BUF_ID,
    IN7BUF_ID, OUT0BUF_ID, OUT1BUF_ID, OUT2BUF_ID, OUT3BUF_ID,
    OUT4BUF_ID, OUT5BUF_ID, OUT6BUF_ID, OUT7BUF_ID
};

#define EP0CS	EPIO[0].cntrl
#define IN0BC	EPIO[0].bytes
#define IN1CS	EPIO[1].cntrl
#define IN1BC	EPIO[1].bytes
#define IN2CS	EPIO[2].cntrl
#define IN2BC	EPIO[2].bytes
#define IN3CS	EPIO[3].cntrl
#define IN3BC	EPIO[3].bytes
#define IN4CS	EPIO[4].cntrl
#define IN4BC	EPIO[4].bytes
#define IN5CS	EPIO[5].cntrl
#define IN5BC	EPIO[5].bytes
#define IN6CS	EPIO[6].cntrl
#define IN6BC	EPIO[6].bytes
#define IN7CS	EPIO[7].cntrl
#define IN7BC	EPIO[7].bytes
#define OUT0CS	EPIO[8].cntrl
#define OUT0BC	EPIO[8].bytes
#define OUT1CS	EPIO[9].cntrl
#define OUT1BC	EPIO[9].bytes
#define OUT2CS	EPIO[10].cntrl
#define OUT2BC	EPIO[10].bytes
#define OUT3CS	EPIO[11].cntrl
#define OUT3BC	EPIO[11].bytes
#define OUT4CS	EPIO[12].cntrl
#define OUT4BC	EPIO[12].bytes
#define OUT5CS	EPIO[13].cntrl
#define OUT5BC	EPIO[13].bytes
#define OUT6CS	EPIO[14].cntrl
#define OUT6BC	EPIO[14].bytes
#define OUT7CS	EPIO[15].cntrl
#define OUT7BC	EPIO[15].bytes

/*-----------------------------------------------------------------------------
	Macros
-----------------------------------------------------------------------------*/
/* Convert End point ID (d0000eee) to EPIO offset */
#define EPID(id)		(((~id & 0x80) >> 4) + (id & 0x07))

#endif				/* EZREGS_H */
