/******************************************************************************
 *   LPC23xx.h:  Header file for NXP LPC23xx/24xx Family Microprocessors
 *   The header file is the super set of all hardware definition of the
 *   peripherals for the LPC23xx/24xx family microprocessor.
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2005.10.01  ver 1.00    Prelimnary version, first Release
 *
 ******************************************************************************/

/* Modified by Martin Thomas */
/* Modified by David Ackley - generic UART offsets */

#ifdef HOST_MODE
#define LONG_REG(addr)  hostRegisters.registerAt(addr)
#define SHORT_REG(addr) hostRegisters.registerAtU16(addr)
#define BYTE_REG(addr)  hostRegisters.registerAtU8(addr)
#else
#define LONG_REG(addr)  (*(volatile unsigned long *)(addr))
#define SHORT_REG(addr) (*(volatile unsigned short *)(addr))
#define BYTE_REG(addr)  (*(volatile unsigned char *)(addr))
#endif


#ifndef __LPC23xx_H
#define __LPC23xx_H

/* Vectored Interrupt Controller (VIC) */
#define VIC_BASE_ADDR	0xFFFFF000
#define VICIRQStatus   LONG_REG(VIC_BASE_ADDR + 0x000)
#define VICFIQStatus   LONG_REG(VIC_BASE_ADDR + 0x004)
#define VICRawIntr     LONG_REG(VIC_BASE_ADDR + 0x008)
#define VICIntSelect   LONG_REG(VIC_BASE_ADDR + 0x00C)
#define VICIntEnable   LONG_REG(VIC_BASE_ADDR + 0x010)
#define VICIntEnClr    LONG_REG(VIC_BASE_ADDR + 0x014)
#define VICSoftInt     LONG_REG(VIC_BASE_ADDR + 0x018)
#define VICSoftIntClr  LONG_REG(VIC_BASE_ADDR + 0x01C)
#define VICProtection  LONG_REG(VIC_BASE_ADDR + 0x020)
#define VICSWPrioMask  LONG_REG(VIC_BASE_ADDR + 0x024)

#define VICVectAddr0   LONG_REG(VIC_BASE_ADDR + 0x100)
#define VICVectAddr1   LONG_REG(VIC_BASE_ADDR + 0x104)
#define VICVectAddr2   LONG_REG(VIC_BASE_ADDR + 0x108)
#define VICVectAddr3   LONG_REG(VIC_BASE_ADDR + 0x10C)
#define VICVectAddr4   LONG_REG(VIC_BASE_ADDR + 0x110)
#define VICVectAddr5   LONG_REG(VIC_BASE_ADDR + 0x114)
#define VICVectAddr6   LONG_REG(VIC_BASE_ADDR + 0x118)
#define VICVectAddr7   LONG_REG(VIC_BASE_ADDR + 0x11C)
#define VICVectAddr8   LONG_REG(VIC_BASE_ADDR + 0x120)
#define VICVectAddr9   LONG_REG(VIC_BASE_ADDR + 0x124)
#define VICVectAddr10  LONG_REG(VIC_BASE_ADDR + 0x128)
#define VICVectAddr11  LONG_REG(VIC_BASE_ADDR + 0x12C)
#define VICVectAddr12  LONG_REG(VIC_BASE_ADDR + 0x130)
#define VICVectAddr13  LONG_REG(VIC_BASE_ADDR + 0x134)
#define VICVectAddr14  LONG_REG(VIC_BASE_ADDR + 0x138)
#define VICVectAddr15  LONG_REG(VIC_BASE_ADDR + 0x13C)
#define VICVectAddr16  LONG_REG(VIC_BASE_ADDR + 0x140)
#define VICVectAddr17  LONG_REG(VIC_BASE_ADDR + 0x144)
#define VICVectAddr18  LONG_REG(VIC_BASE_ADDR + 0x148)
#define VICVectAddr19  LONG_REG(VIC_BASE_ADDR + 0x14C)
#define VICVectAddr20  LONG_REG(VIC_BASE_ADDR + 0x150)
#define VICVectAddr21  LONG_REG(VIC_BASE_ADDR + 0x154)
#define VICVectAddr22  LONG_REG(VIC_BASE_ADDR + 0x158)
#define VICVectAddr23  LONG_REG(VIC_BASE_ADDR + 0x15C)
#define VICVectAddr24  LONG_REG(VIC_BASE_ADDR + 0x160)
#define VICVectAddr25  LONG_REG(VIC_BASE_ADDR + 0x164)
#define VICVectAddr26  LONG_REG(VIC_BASE_ADDR + 0x168)
#define VICVectAddr27  LONG_REG(VIC_BASE_ADDR + 0x16C)
#define VICVectAddr28  LONG_REG(VIC_BASE_ADDR + 0x170)
#define VICVectAddr29  LONG_REG(VIC_BASE_ADDR + 0x174)
#define VICVectAddr30  LONG_REG(VIC_BASE_ADDR + 0x178)
#define VICVectAddr31  LONG_REG(VIC_BASE_ADDR + 0x17C)

/* The name convention below is from previous LPC2000 family MCUs, in LPC23xx/24xx,
these registers are known as "VICVectPriority(x)". */
#define VICVectCntl0   LONG_REG(VIC_BASE_ADDR + 0x200)
#define VICVectCntl1   LONG_REG(VIC_BASE_ADDR + 0x204)
#define VICVectCntl2   LONG_REG(VIC_BASE_ADDR + 0x208)
#define VICVectCntl3   LONG_REG(VIC_BASE_ADDR + 0x20C)
#define VICVectCntl4   LONG_REG(VIC_BASE_ADDR + 0x210)
#define VICVectCntl5   LONG_REG(VIC_BASE_ADDR + 0x214)
#define VICVectCntl6   LONG_REG(VIC_BASE_ADDR + 0x218)
#define VICVectCntl7   LONG_REG(VIC_BASE_ADDR + 0x21C)
#define VICVectCntl8   LONG_REG(VIC_BASE_ADDR + 0x220)
#define VICVectCntl9   LONG_REG(VIC_BASE_ADDR + 0x224)
#define VICVectCntl10  LONG_REG(VIC_BASE_ADDR + 0x228)
#define VICVectCntl11  LONG_REG(VIC_BASE_ADDR + 0x22C)
#define VICVectCntl12  LONG_REG(VIC_BASE_ADDR + 0x230)
#define VICVectCntl13  LONG_REG(VIC_BASE_ADDR + 0x234)
#define VICVectCntl14  LONG_REG(VIC_BASE_ADDR + 0x238)
#define VICVectCntl15  LONG_REG(VIC_BASE_ADDR + 0x23C)
#define VICVectCntl16  LONG_REG(VIC_BASE_ADDR + 0x240)
#define VICVectCntl17  LONG_REG(VIC_BASE_ADDR + 0x244)
#define VICVectCntl18  LONG_REG(VIC_BASE_ADDR + 0x248)
#define VICVectCntl19  LONG_REG(VIC_BASE_ADDR + 0x24C)
#define VICVectCntl20  LONG_REG(VIC_BASE_ADDR + 0x250)
#define VICVectCntl21  LONG_REG(VIC_BASE_ADDR + 0x254)
#define VICVectCntl22  LONG_REG(VIC_BASE_ADDR + 0x258)
#define VICVectCntl23  LONG_REG(VIC_BASE_ADDR + 0x25C)
#define VICVectCntl24  LONG_REG(VIC_BASE_ADDR + 0x260)
#define VICVectCntl25  LONG_REG(VIC_BASE_ADDR + 0x264)
#define VICVectCntl26  LONG_REG(VIC_BASE_ADDR + 0x268)
#define VICVectCntl27  LONG_REG(VIC_BASE_ADDR + 0x26C)
#define VICVectCntl28  LONG_REG(VIC_BASE_ADDR + 0x270)
#define VICVectCntl29  LONG_REG(VIC_BASE_ADDR + 0x274)
#define VICVectCntl30  LONG_REG(VIC_BASE_ADDR + 0x278)
#define VICVectCntl31  LONG_REG(VIC_BASE_ADDR + 0x27C)

/* mthomas - added "real" names */
#define VICVectPriority0   LONG_REG(VIC_BASE_ADDR + 0x200)
#define VICVectPriority1   LONG_REG(VIC_BASE_ADDR + 0x204)
#define VICVectPriority2   LONG_REG(VIC_BASE_ADDR + 0x208)
#define VICVectPriority3   LONG_REG(VIC_BASE_ADDR + 0x20C)
#define VICVectPriority4   LONG_REG(VIC_BASE_ADDR + 0x210)
#define VICVectPriority5   LONG_REG(VIC_BASE_ADDR + 0x214)
#define VICVectPriority6   LONG_REG(VIC_BASE_ADDR + 0x218)
#define VICVectPriority7   LONG_REG(VIC_BASE_ADDR + 0x21C)
#define VICVectPriority8   LONG_REG(VIC_BASE_ADDR + 0x220)
#define VICVectPriority9   LONG_REG(VIC_BASE_ADDR + 0x224)
#define VICVectPriority10  LONG_REG(VIC_BASE_ADDR + 0x228)
#define VICVectPriority11  LONG_REG(VIC_BASE_ADDR + 0x22C)
#define VICVectPriority12  LONG_REG(VIC_BASE_ADDR + 0x230)
#define VICVectPriority13  LONG_REG(VIC_BASE_ADDR + 0x234)
#define VICVectPriority14  LONG_REG(VIC_BASE_ADDR + 0x238)
#define VICVectPriority15  LONG_REG(VIC_BASE_ADDR + 0x23C)
#define VICVectPriority16  LONG_REG(VIC_BASE_ADDR + 0x240)
#define VICVectPriority17  LONG_REG(VIC_BASE_ADDR + 0x244)
#define VICVectPriority18  LONG_REG(VIC_BASE_ADDR + 0x248)
#define VICVectPriority19  LONG_REG(VIC_BASE_ADDR + 0x24C)
#define VICVectPriority20  LONG_REG(VIC_BASE_ADDR + 0x250)
#define VICVectPriority21  LONG_REG(VIC_BASE_ADDR + 0x254)
#define VICVectPriority22  LONG_REG(VIC_BASE_ADDR + 0x258)
#define VICVectPriority23  LONG_REG(VIC_BASE_ADDR + 0x25C)
#define VICVectPriority24  LONG_REG(VIC_BASE_ADDR + 0x260)
#define VICVectPriority25  LONG_REG(VIC_BASE_ADDR + 0x264)
#define VICVectPriority26  LONG_REG(VIC_BASE_ADDR + 0x268)
#define VICVectPriority27  LONG_REG(VIC_BASE_ADDR + 0x26C)
#define VICVectPriority28  LONG_REG(VIC_BASE_ADDR + 0x270)
#define VICVectPriority29  LONG_REG(VIC_BASE_ADDR + 0x274)
#define VICVectPriority30  LONG_REG(VIC_BASE_ADDR + 0x278)
#define VICVectPriority31  LONG_REG(VIC_BASE_ADDR + 0x27C)


#define VICVectAddr    LONG_REG(VIC_BASE_ADDR + 0xF00)


/* Pin Connect Block */
#define PINSEL_BASE_ADDR	0xE002C000
#define PINSEL0        LONG_REG(PINSEL_BASE_ADDR + 0x00)
#define PINSEL1        LONG_REG(PINSEL_BASE_ADDR + 0x04)
#define PINSEL2        LONG_REG(PINSEL_BASE_ADDR + 0x08)
#define PINSEL3        LONG_REG(PINSEL_BASE_ADDR + 0x0C)
#define PINSEL4        LONG_REG(PINSEL_BASE_ADDR + 0x10)
#define PINSEL5        LONG_REG(PINSEL_BASE_ADDR + 0x14)
#define PINSEL6        LONG_REG(PINSEL_BASE_ADDR + 0x18)
#define PINSEL7        LONG_REG(PINSEL_BASE_ADDR + 0x1C)
#define PINSEL8        LONG_REG(PINSEL_BASE_ADDR + 0x20)
#define PINSEL9        LONG_REG(PINSEL_BASE_ADDR + 0x24)
#define PINSEL10       LONG_REG(PINSEL_BASE_ADDR + 0x28)

#define PINMODE_BASE_ADDR	(PINSEL_BASE_ADDR+0x40)
#define PINMODE0        LONG_REG(PINSEL_BASE_ADDR + 0x40)
#define PINMODE1        LONG_REG(PINSEL_BASE_ADDR + 0x44)
#define PINMODE2        LONG_REG(PINSEL_BASE_ADDR + 0x48)
#define PINMODE3        LONG_REG(PINSEL_BASE_ADDR + 0x4C)
#define PINMODE4        LONG_REG(PINSEL_BASE_ADDR + 0x50)
#define PINMODE5        LONG_REG(PINSEL_BASE_ADDR + 0x54)
#define PINMODE6        LONG_REG(PINSEL_BASE_ADDR + 0x58)
#define PINMODE7        LONG_REG(PINSEL_BASE_ADDR + 0x5C)
#define PINMODE8        LONG_REG(PINSEL_BASE_ADDR + 0x60)
#define PINMODE9        LONG_REG(PINSEL_BASE_ADDR + 0x64)

/* General Purpose Input/Output (GPIO) */
#define GPIO_BASE_ADDR		0xE0028000
#define IOPIN0         LONG_REG(GPIO_BASE_ADDR + 0x00)
#define IOSET0         LONG_REG(GPIO_BASE_ADDR + 0x04)
#define IODIR0         LONG_REG(GPIO_BASE_ADDR + 0x08)
#define IOCLR0         LONG_REG(GPIO_BASE_ADDR + 0x0C)
#define IOPIN1         LONG_REG(GPIO_BASE_ADDR + 0x10)
#define IOSET1         LONG_REG(GPIO_BASE_ADDR + 0x14)
#define IODIR1         LONG_REG(GPIO_BASE_ADDR + 0x18)
#define IOCLR1         LONG_REG(GPIO_BASE_ADDR + 0x1C)

/* mthomas - alias */
#define IO0PIN         LONG_REG(GPIO_BASE_ADDR + 0x00)
#define IO0SET         LONG_REG(GPIO_BASE_ADDR + 0x04)
#define IO0DIR         LONG_REG(GPIO_BASE_ADDR + 0x08)
#define IO0CLR         LONG_REG(GPIO_BASE_ADDR + 0x0C)
#define IO1PIN         LONG_REG(GPIO_BASE_ADDR + 0x10)
#define IO1SET         LONG_REG(GPIO_BASE_ADDR + 0x14)
#define IO1DIR         LONG_REG(GPIO_BASE_ADDR + 0x18)
#define IO1CLR         LONG_REG(GPIO_BASE_ADDR + 0x1C)


/* GPIO Interrupt Registers */
#define IO0_INT_EN_R    LONG_REG(GPIO_BASE_ADDR + 0x90)
#define IO0_INT_EN_F    LONG_REG(GPIO_BASE_ADDR + 0x94)
#define IO0_INT_STAT_R  LONG_REG(GPIO_BASE_ADDR + 0x84)
#define IO0_INT_STAT_F  LONG_REG(GPIO_BASE_ADDR + 0x88)
#define IO0_INT_CLR     LONG_REG(GPIO_BASE_ADDR + 0x8C)

#define IO2_INT_EN_R    LONG_REG(GPIO_BASE_ADDR + 0xB0)
#define IO2_INT_EN_F    LONG_REG(GPIO_BASE_ADDR + 0xB4)
#define IO2_INT_STAT_R  LONG_REG(GPIO_BASE_ADDR + 0xA4)
#define IO2_INT_STAT_F  LONG_REG(GPIO_BASE_ADDR + 0xA8)
#define IO2_INT_CLR     LONG_REG(GPIO_BASE_ADDR + 0xAC)

#define IO_INT_STAT     LONG_REG(GPIO_BASE_ADDR + 0x80)

#define PARTCFG_BASE_ADDR		0x3FFF8000
#define PARTCFG        LONG_REG(PARTCFG_BASE_ADDR + 0x00)

/* Fast I/O setup */
#define FIO_BASE_ADDR		0x3FFFC000
#define FIO0DIR        LONG_REG(FIO_BASE_ADDR + 0x00)
#define FIO0MASK       LONG_REG(FIO_BASE_ADDR + 0x10)
#define FIO0PIN        LONG_REG(FIO_BASE_ADDR + 0x14)
#define FIO0SET        LONG_REG(FIO_BASE_ADDR + 0x18)
#define FIO0CLR        LONG_REG(FIO_BASE_ADDR + 0x1C)

#define FIO1DIR        LONG_REG(FIO_BASE_ADDR + 0x20)
#define FIO1MASK       LONG_REG(FIO_BASE_ADDR + 0x30)
#define FIO1PIN        LONG_REG(FIO_BASE_ADDR + 0x34)
#define FIO1SET        LONG_REG(FIO_BASE_ADDR + 0x38)
#define FIO1CLR        LONG_REG(FIO_BASE_ADDR + 0x3C)

#define FIO2DIR        LONG_REG(FIO_BASE_ADDR + 0x40)
#define FIO2MASK       LONG_REG(FIO_BASE_ADDR + 0x50)
#define FIO2PIN        LONG_REG(FIO_BASE_ADDR + 0x54)
#define FIO2SET        LONG_REG(FIO_BASE_ADDR + 0x58)
#define FIO2CLR        LONG_REG(FIO_BASE_ADDR + 0x5C)

#define FIO3DIR        LONG_REG(FIO_BASE_ADDR + 0x60)
#define FIO3MASK       LONG_REG(FIO_BASE_ADDR + 0x70)
#define FIO3PIN        LONG_REG(FIO_BASE_ADDR + 0x74)
#define FIO3SET        LONG_REG(FIO_BASE_ADDR + 0x78)
#define FIO3CLR        LONG_REG(FIO_BASE_ADDR + 0x7C)

#define FIO4DIR        LONG_REG(FIO_BASE_ADDR + 0x80)
#define FIO4MASK       LONG_REG(FIO_BASE_ADDR + 0x90)
#define FIO4PIN        LONG_REG(FIO_BASE_ADDR + 0x94)
#define FIO4SET        LONG_REG(FIO_BASE_ADDR + 0x98)
#define FIO4CLR        LONG_REG(FIO_BASE_ADDR + 0x9C)

/* FIOs can be accessed through WORD, HALF-WORD or BYTE. */
#define FIO0DIR0       BYTE_REG(FIO_BASE_ADDR + 0x00)
#define FIO1DIR0       BYTE_REG(FIO_BASE_ADDR + 0x20)
#define FIO2DIR0       BYTE_REG(FIO_BASE_ADDR + 0x40)
#define FIO3DIR0       BYTE_REG(FIO_BASE_ADDR + 0x60)
#define FIO4DIR0       BYTE_REG(FIO_BASE_ADDR + 0x80)

#define FIO0DIR1       BYTE_REG(FIO_BASE_ADDR + 0x01)
#define FIO1DIR1       BYTE_REG(FIO_BASE_ADDR + 0x21)
#define FIO2DIR1       BYTE_REG(FIO_BASE_ADDR + 0x41)
#define FIO3DIR1       BYTE_REG(FIO_BASE_ADDR + 0x61)
#define FIO4DIR1       BYTE_REG(FIO_BASE_ADDR + 0x81)

#define FIO0DIR2       BYTE_REG(FIO_BASE_ADDR + 0x02)
#define FIO1DIR2       BYTE_REG(FIO_BASE_ADDR + 0x22)
#define FIO2DIR2       BYTE_REG(FIO_BASE_ADDR + 0x42)
#define FIO3DIR2       BYTE_REG(FIO_BASE_ADDR + 0x62)
#define FIO4DIR2       BYTE_REG(FIO_BASE_ADDR + 0x82)

#define FIO0DIR3       BYTE_REG(FIO_BASE_ADDR + 0x03)
#define FIO1DIR3       BYTE_REG(FIO_BASE_ADDR + 0x23)
#define FIO2DIR3       BYTE_REG(FIO_BASE_ADDR + 0x43)
#define FIO3DIR3       BYTE_REG(FIO_BASE_ADDR + 0x63)
#define FIO4DIR3       BYTE_REG(FIO_BASE_ADDR + 0x83)

#define FIO0DIRL       SHORT_REG(FIO_BASE_ADDR + 0x00)
#define FIO1DIRL       SHORT_REG(FIO_BASE_ADDR + 0x20)
#define FIO2DIRL       SHORT_REG(FIO_BASE_ADDR + 0x40)
#define FIO3DIRL       SHORT_REG(FIO_BASE_ADDR + 0x60)
#define FIO4DIRL       SHORT_REG(FIO_BASE_ADDR + 0x80)

#define FIO0DIRU       SHORT_REG(FIO_BASE_ADDR + 0x02)
#define FIO1DIRU       SHORT_REG(FIO_BASE_ADDR + 0x22)
#define FIO2DIRU       SHORT_REG(FIO_BASE_ADDR + 0x42)
#define FIO3DIRU       SHORT_REG(FIO_BASE_ADDR + 0x62)
#define FIO4DIRU       SHORT_REG(FIO_BASE_ADDR + 0x82)

#define FIO0MASK0      BYTE_REG(FIO_BASE_ADDR + 0x10)
#define FIO1MASK0      BYTE_REG(FIO_BASE_ADDR + 0x30)
#define FIO2MASK0      BYTE_REG(FIO_BASE_ADDR + 0x50)
#define FIO3MASK0      BYTE_REG(FIO_BASE_ADDR + 0x70)
#define FIO4MASK0      BYTE_REG(FIO_BASE_ADDR + 0x90)

#define FIO0MASK1      BYTE_REG(FIO_BASE_ADDR + 0x11)
#define FIO1MASK1      BYTE_REG(FIO_BASE_ADDR + 0x21)
#define FIO2MASK1      BYTE_REG(FIO_BASE_ADDR + 0x51)
#define FIO3MASK1      BYTE_REG(FIO_BASE_ADDR + 0x71)
#define FIO4MASK1      BYTE_REG(FIO_BASE_ADDR + 0x91)

#define FIO0MASK2      BYTE_REG(FIO_BASE_ADDR + 0x12)
#define FIO1MASK2      BYTE_REG(FIO_BASE_ADDR + 0x32)
#define FIO2MASK2      BYTE_REG(FIO_BASE_ADDR + 0x52)
#define FIO3MASK2      BYTE_REG(FIO_BASE_ADDR + 0x72)
#define FIO4MASK2      BYTE_REG(FIO_BASE_ADDR + 0x92)

#define FIO0MASK3      BYTE_REG(FIO_BASE_ADDR + 0x13)
#define FIO1MASK3      BYTE_REG(FIO_BASE_ADDR + 0x33)
#define FIO2MASK3      BYTE_REG(FIO_BASE_ADDR + 0x53)
#define FIO3MASK3      BYTE_REG(FIO_BASE_ADDR + 0x73)
#define FIO4MASK3      BYTE_REG(FIO_BASE_ADDR + 0x93)

#define FIO0MASKL      SHORT_REG(FIO_BASE_ADDR + 0x10)
#define FIO1MASKL      SHORT_REG(FIO_BASE_ADDR + 0x30)
#define FIO2MASKL      SHORT_REG(FIO_BASE_ADDR + 0x50)
#define FIO3MASKL      SHORT_REG(FIO_BASE_ADDR + 0x70)
#define FIO4MASKL      SHORT_REG(FIO_BASE_ADDR + 0x90)

#define FIO0MASKU      SHORT_REG(FIO_BASE_ADDR + 0x12)
#define FIO1MASKU      SHORT_REG(FIO_BASE_ADDR + 0x32)
#define FIO2MASKU      SHORT_REG(FIO_BASE_ADDR + 0x52)
#define FIO3MASKU      SHORT_REG(FIO_BASE_ADDR + 0x72)
#define FIO4MASKU      SHORT_REG(FIO_BASE_ADDR + 0x92)

#define FIO0PIN0       BYTE_REG(FIO_BASE_ADDR + 0x14)
#define FIO1PIN0       BYTE_REG(FIO_BASE_ADDR + 0x34)
#define FIO2PIN0       BYTE_REG(FIO_BASE_ADDR + 0x54)
#define FIO3PIN0       BYTE_REG(FIO_BASE_ADDR + 0x74)
#define FIO4PIN0       BYTE_REG(FIO_BASE_ADDR + 0x94)

#define FIO0PIN1       BYTE_REG(FIO_BASE_ADDR + 0x15)
#define FIO1PIN1       BYTE_REG(FIO_BASE_ADDR + 0x25)
#define FIO2PIN1       BYTE_REG(FIO_BASE_ADDR + 0x55)
#define FIO3PIN1       BYTE_REG(FIO_BASE_ADDR + 0x75)
#define FIO4PIN1       BYTE_REG(FIO_BASE_ADDR + 0x95)

#define FIO0PIN2       BYTE_REG(FIO_BASE_ADDR + 0x16)
#define FIO1PIN2       BYTE_REG(FIO_BASE_ADDR + 0x36)
#define FIO2PIN2       BYTE_REG(FIO_BASE_ADDR + 0x56)
#define FIO3PIN2       BYTE_REG(FIO_BASE_ADDR + 0x76)
#define FIO4PIN2       BYTE_REG(FIO_BASE_ADDR + 0x96)

#define FIO0PIN3       BYTE_REG(FIO_BASE_ADDR + 0x17)
#define FIO1PIN3       BYTE_REG(FIO_BASE_ADDR + 0x37)
#define FIO2PIN3       BYTE_REG(FIO_BASE_ADDR + 0x57)
#define FIO3PIN3       BYTE_REG(FIO_BASE_ADDR + 0x77)
#define FIO4PIN3       BYTE_REG(FIO_BASE_ADDR + 0x97)

#define FIO0PINL       SHORT_REG(FIO_BASE_ADDR + 0x14)
#define FIO1PINL       SHORT_REG(FIO_BASE_ADDR + 0x34)
#define FIO2PINL       SHORT_REG(FIO_BASE_ADDR + 0x54)
#define FIO3PINL       SHORT_REG(FIO_BASE_ADDR + 0x74)
#define FIO4PINL       SHORT_REG(FIO_BASE_ADDR + 0x94)

#define FIO0PINU       SHORT_REG(FIO_BASE_ADDR + 0x16)
#define FIO1PINU       SHORT_REG(FIO_BASE_ADDR + 0x36)
#define FIO2PINU       SHORT_REG(FIO_BASE_ADDR + 0x56)
#define FIO3PINU       SHORT_REG(FIO_BASE_ADDR + 0x76)
#define FIO4PINU       SHORT_REG(FIO_BASE_ADDR + 0x96)

#define FIO0SET0       BYTE_REG(FIO_BASE_ADDR + 0x18)
#define FIO1SET0       BYTE_REG(FIO_BASE_ADDR + 0x38)
#define FIO2SET0       BYTE_REG(FIO_BASE_ADDR + 0x58)
#define FIO3SET0       BYTE_REG(FIO_BASE_ADDR + 0x78)
#define FIO4SET0       BYTE_REG(FIO_BASE_ADDR + 0x98)

#define FIO0SET1       BYTE_REG(FIO_BASE_ADDR + 0x19)
#define FIO1SET1       BYTE_REG(FIO_BASE_ADDR + 0x29)
#define FIO2SET1       BYTE_REG(FIO_BASE_ADDR + 0x59)
#define FIO3SET1       BYTE_REG(FIO_BASE_ADDR + 0x79)
#define FIO4SET1       BYTE_REG(FIO_BASE_ADDR + 0x99)

#define FIO0SET2       BYTE_REG(FIO_BASE_ADDR + 0x1A)
#define FIO1SET2       BYTE_REG(FIO_BASE_ADDR + 0x3A)
#define FIO2SET2       BYTE_REG(FIO_BASE_ADDR + 0x5A)
#define FIO3SET2       BYTE_REG(FIO_BASE_ADDR + 0x7A)
#define FIO4SET2       BYTE_REG(FIO_BASE_ADDR + 0x9A)

#define FIO0SET3       BYTE_REG(FIO_BASE_ADDR + 0x1B)
#define FIO1SET3       BYTE_REG(FIO_BASE_ADDR + 0x3B)
#define FIO2SET3       BYTE_REG(FIO_BASE_ADDR + 0x5B)
#define FIO3SET3       BYTE_REG(FIO_BASE_ADDR + 0x7B)
#define FIO4SET3       BYTE_REG(FIO_BASE_ADDR + 0x9B)

#define FIO0SETL       SHORT_REG(FIO_BASE_ADDR + 0x18)
#define FIO1SETL       SHORT_REG(FIO_BASE_ADDR + 0x38)
#define FIO2SETL       SHORT_REG(FIO_BASE_ADDR + 0x58)
#define FIO3SETL       SHORT_REG(FIO_BASE_ADDR + 0x78)
#define FIO4SETL       SHORT_REG(FIO_BASE_ADDR + 0x98)

#define FIO0SETU       SHORT_REG(FIO_BASE_ADDR + 0x1A)
#define FIO1SETU       SHORT_REG(FIO_BASE_ADDR + 0x3A)
#define FIO2SETU       SHORT_REG(FIO_BASE_ADDR + 0x5A)
#define FIO3SETU       SHORT_REG(FIO_BASE_ADDR + 0x7A)
#define FIO4SETU       SHORT_REG(FIO_BASE_ADDR + 0x9A)

#define FIO0CLR0       BYTE_REG(FIO_BASE_ADDR + 0x1C)
#define FIO1CLR0       BYTE_REG(FIO_BASE_ADDR + 0x3C)
#define FIO2CLR0       BYTE_REG(FIO_BASE_ADDR + 0x5C)
#define FIO3CLR0       BYTE_REG(FIO_BASE_ADDR + 0x7C)
#define FIO4CLR0       BYTE_REG(FIO_BASE_ADDR + 0x9C)

#define FIO0CLR1       BYTE_REG(FIO_BASE_ADDR + 0x1D)
#define FIO1CLR1       BYTE_REG(FIO_BASE_ADDR + 0x2D)
#define FIO2CLR1       BYTE_REG(FIO_BASE_ADDR + 0x5D)
#define FIO3CLR1       BYTE_REG(FIO_BASE_ADDR + 0x7D)
#define FIO4CLR1       BYTE_REG(FIO_BASE_ADDR + 0x9D)

#define FIO0CLR2       BYTE_REG(FIO_BASE_ADDR + 0x1E)
#define FIO1CLR2       BYTE_REG(FIO_BASE_ADDR + 0x3E)
#define FIO2CLR2       BYTE_REG(FIO_BASE_ADDR + 0x5E)
#define FIO3CLR2       BYTE_REG(FIO_BASE_ADDR + 0x7E)
#define FIO4CLR2       BYTE_REG(FIO_BASE_ADDR + 0x9E)

#define FIO0CLR3       BYTE_REG(FIO_BASE_ADDR + 0x1F)
#define FIO1CLR3       BYTE_REG(FIO_BASE_ADDR + 0x3F)
#define FIO2CLR3       BYTE_REG(FIO_BASE_ADDR + 0x5F)
#define FIO3CLR3       BYTE_REG(FIO_BASE_ADDR + 0x7F)
#define FIO4CLR3       BYTE_REG(FIO_BASE_ADDR + 0x9F)

#define FIO0CLRL       SHORT_REG(FIO_BASE_ADDR + 0x1C)
#define FIO1CLRL       SHORT_REG(FIO_BASE_ADDR + 0x3C)
#define FIO2CLRL       SHORT_REG(FIO_BASE_ADDR + 0x5C)
#define FIO3CLRL       SHORT_REG(FIO_BASE_ADDR + 0x7C)
#define FIO4CLRL       SHORT_REG(FIO_BASE_ADDR + 0x9C)

#define FIO0CLRU       SHORT_REG(FIO_BASE_ADDR + 0x1E)
#define FIO1CLRU       SHORT_REG(FIO_BASE_ADDR + 0x3E)
#define FIO2CLRU       SHORT_REG(FIO_BASE_ADDR + 0x5E)
#define FIO3CLRU       SHORT_REG(FIO_BASE_ADDR + 0x7E)
#define FIO4CLRU       SHORT_REG(FIO_BASE_ADDR + 0x9E)

/* bit 0 in SCS register, port 0/1 are regular ports when bit 0 
is 0,  fast ports when bit 0 is 1. */
#define GPIOM         0x00000001

/* System Control Block(SCB) modules include Memory Accelerator Module,
Phase Locked Loop, VPB divider, Power Control, External Interrupt,
Reset, and Code Security/Debugging */
#define SCB_BASE_ADDR	0xE01FC000

/* Memory Accelerator Module (MAM) */
#define MAMCR          LONG_REG(SCB_BASE_ADDR + 0x000)
#define MAMTIM         LONG_REG(SCB_BASE_ADDR + 0x004)
#define MEMMAP         LONG_REG(SCB_BASE_ADDR + 0x040)

/* MEMMAP defines */
#define MEMMAP_BBLK   0  /* Interrupt Vectors in Boot Block */
#define MEMMAP_FLASH  1  /* Interrupt Vectors in Flash */
#define MEMMAP_SRAM   2  /* Interrupt Vectors in SRAM */

/* Phase Locked Loop (PLL) */
#define PLLCON         LONG_REG(SCB_BASE_ADDR + 0x080)
#define PLLCFG         LONG_REG(SCB_BASE_ADDR + 0x084)
#define PLLSTAT        LONG_REG(SCB_BASE_ADDR + 0x088)
#define PLLFEED        LONG_REG(SCB_BASE_ADDR + 0x08C)

/* Power Control */
#define PCON           LONG_REG(SCB_BASE_ADDR + 0x0C0)
#define PCONP          LONG_REG(SCB_BASE_ADDR + 0x0C4)

/* Ackley: Added PCONP bit definitions */
                       /* bit 0 unused */
#define PCTIM0         (1UL<<1)  /* Timer/counter 0 power/clock control bit */
#define PCTIM1         (1UL<<2)  /* Timer/counter 1 power/clock control bit */
#define PCUART0        (1UL<<3)  /* UART0 power/clock control bit */
#define PCUART1        (1UL<<4)  /* UART1 power/clock control bit */
                       /* bit 5 unused */
#define PCPWM1         (1UL<<6)  /* PWM1 power/clock control bit */
#define PCI2C0         (1UL<<7)  /* I2C0 power/clock control bit */
#define PCSPI          (1UL<<8)  /* SPI power/clock control bit */
#define PCRTC          (1UL<<9)  /* RTC power/clock control bit */
#define PCSSP1         (1UL<<10) /* SSP1 power/clock control bit */
#define PCEMC          (1UL<<11) /* External Memory controller */
#define PCAD           (1UL<<12) /* A/D converter power/clock control bit (needs special handling) */
#define PCAN1          (1UL<<13) /* CAN Controller 1 power/clock control bit */
#define PCAN2          (1UL<<14) /* CAN Controller 2 power/clock control bit */
                       /* bit 15 unused */
                       /* bit 16 unused */
                       /* bit 17 unused */
                       /* bit 18 unused */
#define PCI2C1         (1UL<<19) /* I2C1 power/clock control bit */
                       /* bit 20 unused */
#define PCSSP0         (1UL<<21) /* SSP0 power/clock control bit */
#define PCTIM2         (1UL<<22) /* Timer 2 power/clock control bit */
#define PCTIM3         (1UL<<23) /* Timer 3 power/clock control bit */
#define PCUART2        (1UL<<24) /* UART2 power/clock control bit */
#define PCUART3        (1UL<<25) /* UART3 power/clock control bit */
#define PCI2C2         (1UL<<26) /* I2C2 power/clock control bit */
#define PCI2S          (1UL<<27) /* I2S power/clock control bit */
#define PCSDC          (1UL<<28) /* SD card power/clock control bit */
#define PCGPDMA        (1UL<<29) /* GP DMA power/clock control bit */
#define PCENET         (1UL<<30) /* Ethernet power/clock control bit */
#define PCUSB          (1UL<<31) /* USB power/clock control bit */

/* Clock Divider */
/* #define APBDIV         LONG_REG(SCB_BASE_ADDR + 0x100) */
#define CCLKCFG        LONG_REG(SCB_BASE_ADDR + 0x104)
#define USBCLKCFG      LONG_REG(SCB_BASE_ADDR + 0x108)
#define CLKSRCSEL      LONG_REG(SCB_BASE_ADDR + 0x10C)
#define PCLKSEL0       LONG_REG(SCB_BASE_ADDR + 0x1A8)
#define PCLKSEL1       LONG_REG(SCB_BASE_ADDR + 0x1AC)

/* External Interrupts */
#define EXTINT         LONG_REG(SCB_BASE_ADDR + 0x140)
#define INTWAKE        LONG_REG(SCB_BASE_ADDR + 0x144)
#define EXTMODE        LONG_REG(SCB_BASE_ADDR + 0x148)
#define EXTPOLAR       LONG_REG(SCB_BASE_ADDR + 0x14C)

/* Reset, reset source identification */
#define RSIR           LONG_REG(SCB_BASE_ADDR + 0x180)

/* RSID, code security protection */
#define CSPR           LONG_REG(SCB_BASE_ADDR + 0x184)

/* AHB configuration */
#define AHBCFG1        LONG_REG(SCB_BASE_ADDR + 0x188)
#define AHBCFG2        LONG_REG(SCB_BASE_ADDR + 0x18C)

/* System Controls and Status */
#define SCS            LONG_REG(SCB_BASE_ADDR + 0x1A0)

/* MPMC(EMC) registers, note: all the external memory controller(EMC) registers
are for LPC24xx only. */
#define STATIC_MEM0_BASE		0x80000000
#define STATIC_MEM1_BASE		0x81000000
#define STATIC_MEM2_BASE		0x82000000
#define STATIC_MEM3_BASE		0x83000000

#define DYNAMIC_MEM0_BASE		0xA0000000
#define DYNAMIC_MEM1_BASE		0xB0000000
#define DYNAMIC_MEM2_BASE		0xC0000000
#define DYNAMIC_MEM3_BASE		0xD0000000

/* External Memory Controller (EMC) */
#define EMC_BASE_ADDR		0xFFE08000
#define EMC_CTRL       LONG_REG(EMC_BASE_ADDR + 0x000)
#define EMC_STAT       LONG_REG(EMC_BASE_ADDR + 0x004)
#define EMC_CONFIG     LONG_REG(EMC_BASE_ADDR + 0x008)

/* Dynamic RAM access registers */
#define EMC_DYN_CTRL     LONG_REG(EMC_BASE_ADDR + 0x020)
#define EMC_DYN_RFSH     LONG_REG(EMC_BASE_ADDR + 0x024)
#define EMC_DYN_RD_CFG   LONG_REG(EMC_BASE_ADDR + 0x028)
#define EMC_DYN_RP       LONG_REG(EMC_BASE_ADDR + 0x030)
#define EMC_DYN_RAS      LONG_REG(EMC_BASE_ADDR + 0x034)
#define EMC_DYN_SREX     LONG_REG(EMC_BASE_ADDR + 0x038)
#define EMC_DYN_APR      LONG_REG(EMC_BASE_ADDR + 0x03C)
#define EMC_DYN_DAL      LONG_REG(EMC_BASE_ADDR + 0x040)
#define EMC_DYN_WR       LONG_REG(EMC_BASE_ADDR + 0x044)
#define EMC_DYN_RC       LONG_REG(EMC_BASE_ADDR + 0x048)
#define EMC_DYN_RFC      LONG_REG(EMC_BASE_ADDR + 0x04C)
#define EMC_DYN_XSR      LONG_REG(EMC_BASE_ADDR + 0x050)
#define EMC_DYN_RRD      LONG_REG(EMC_BASE_ADDR + 0x054)
#define EMC_DYN_MRD      LONG_REG(EMC_BASE_ADDR + 0x058)

#define EMC_DYN_CFG0     LONG_REG(EMC_BASE_ADDR + 0x100)
#define EMC_DYN_RASCAS0  LONG_REG(EMC_BASE_ADDR + 0x104)
#define EMC_DYN_CFG1     LONG_REG(EMC_BASE_ADDR + 0x140)
#define EMC_DYN_RASCAS1  LONG_REG(EMC_BASE_ADDR + 0x144)
#define EMC_DYN_CFG2     LONG_REG(EMC_BASE_ADDR + 0x160)
#define EMC_DYN_RASCAS2  LONG_REG(EMC_BASE_ADDR + 0x164)
#define EMC_DYN_CFG3     LONG_REG(EMC_BASE_ADDR + 0x180)
#define EMC_DYN_RASCAS3  LONG_REG(EMC_BASE_ADDR + 0x184)

/* static RAM access registers */
#define EMC_STA_CFG0      LONG_REG(EMC_BASE_ADDR + 0x200)
#define EMC_STA_WAITWEN0  LONG_REG(EMC_BASE_ADDR + 0x204)
#define EMC_STA_WAITOEN0  LONG_REG(EMC_BASE_ADDR + 0x208)
#define EMC_STA_WAITRD0   LONG_REG(EMC_BASE_ADDR + 0x20C)
#define EMC_STA_WAITPAGE0 LONG_REG(EMC_BASE_ADDR + 0x210)
#define EMC_STA_WAITWR0   LONG_REG(EMC_BASE_ADDR + 0x214)
#define EMC_STA_WAITTURN0 LONG_REG(EMC_BASE_ADDR + 0x218)

#define EMC_STA_CFG1      LONG_REG(EMC_BASE_ADDR + 0x220)
#define EMC_STA_WAITWEN1  LONG_REG(EMC_BASE_ADDR + 0x224)
#define EMC_STA_WAITOEN1  LONG_REG(EMC_BASE_ADDR + 0x228)
#define EMC_STA_WAITRD1   LONG_REG(EMC_BASE_ADDR + 0x22C)
#define EMC_STA_WAITPAGE1 LONG_REG(EMC_BASE_ADDR + 0x230)
#define EMC_STA_WAITWR1   LONG_REG(EMC_BASE_ADDR + 0x234)
#define EMC_STA_WAITTURN1 LONG_REG(EMC_BASE_ADDR + 0x238)

#define EMC_STA_CFG2      LONG_REG(EMC_BASE_ADDR + 0x240)
#define EMC_STA_WAITWEN2  LONG_REG(EMC_BASE_ADDR + 0x244)
#define EMC_STA_WAITOEN2  LONG_REG(EMC_BASE_ADDR + 0x248)
#define EMC_STA_WAITRD2   LONG_REG(EMC_BASE_ADDR + 0x24C)
#define EMC_STA_WAITPAGE2 LONG_REG(EMC_BASE_ADDR + 0x250)
#define EMC_STA_WAITWR2   LONG_REG(EMC_BASE_ADDR + 0x254)
#define EMC_STA_WAITTURN2 LONG_REG(EMC_BASE_ADDR + 0x258)

#define EMC_STA_CFG3      LONG_REG(EMC_BASE_ADDR + 0x260)
#define EMC_STA_WAITWEN3  LONG_REG(EMC_BASE_ADDR + 0x264)
#define EMC_STA_WAITOEN3  LONG_REG(EMC_BASE_ADDR + 0x268)
#define EMC_STA_WAITRD3   LONG_REG(EMC_BASE_ADDR + 0x26C)
#define EMC_STA_WAITPAGE3 LONG_REG(EMC_BASE_ADDR + 0x270)
#define EMC_STA_WAITWR3   LONG_REG(EMC_BASE_ADDR + 0x274)
#define EMC_STA_WAITTURN3 LONG_REG(EMC_BASE_ADDR + 0x278)

#define EMC_STA_EXT_WAIT  LONG_REG(EMC_BASE_ADDR + 0x880)


/* Timer 0 */
#define TMR0_BASE_ADDR		0xE0004000
#define T0IR           LONG_REG(TMR0_BASE_ADDR + 0x00)
#define T0TCR          LONG_REG(TMR0_BASE_ADDR + 0x04)
#define T0TC           LONG_REG(TMR0_BASE_ADDR + 0x08)
#define T0PR           LONG_REG(TMR0_BASE_ADDR + 0x0C)
#define T0PC           LONG_REG(TMR0_BASE_ADDR + 0x10)
#define T0MCR          LONG_REG(TMR0_BASE_ADDR + 0x14)
#define T0MR0          LONG_REG(TMR0_BASE_ADDR + 0x18)
#define T0MR1          LONG_REG(TMR0_BASE_ADDR + 0x1C)
#define T0MR2          LONG_REG(TMR0_BASE_ADDR + 0x20)
#define T0MR3          LONG_REG(TMR0_BASE_ADDR + 0x24)
#define T0CCR          LONG_REG(TMR0_BASE_ADDR + 0x28)
#define T0CR0          LONG_REG(TMR0_BASE_ADDR + 0x2C)
#define T0CR1          LONG_REG(TMR0_BASE_ADDR + 0x30)
#define T0CR2          LONG_REG(TMR0_BASE_ADDR + 0x34)
#define T0CR3          LONG_REG(TMR0_BASE_ADDR + 0x38)
#define T0EMR          LONG_REG(TMR0_BASE_ADDR + 0x3C)
#define T0CTCR         LONG_REG(TMR0_BASE_ADDR + 0x70)

/* Timer 1 */
#define TMR1_BASE_ADDR		0xE0008000
#define T1IR           LONG_REG(TMR1_BASE_ADDR + 0x00)
#define T1TCR          LONG_REG(TMR1_BASE_ADDR + 0x04)
#define T1TC           LONG_REG(TMR1_BASE_ADDR + 0x08)
#define T1PR           LONG_REG(TMR1_BASE_ADDR + 0x0C)
#define T1PC           LONG_REG(TMR1_BASE_ADDR + 0x10)
#define T1MCR          LONG_REG(TMR1_BASE_ADDR + 0x14)
#define T1MR0          LONG_REG(TMR1_BASE_ADDR + 0x18)
#define T1MR1          LONG_REG(TMR1_BASE_ADDR + 0x1C)
#define T1MR2          LONG_REG(TMR1_BASE_ADDR + 0x20)
#define T1MR3          LONG_REG(TMR1_BASE_ADDR + 0x24)
#define T1CCR          LONG_REG(TMR1_BASE_ADDR + 0x28)
#define T1CR0          LONG_REG(TMR1_BASE_ADDR + 0x2C)
#define T1CR1          LONG_REG(TMR1_BASE_ADDR + 0x30)
#define T1CR2          LONG_REG(TMR1_BASE_ADDR + 0x34)
#define T1CR3          LONG_REG(TMR1_BASE_ADDR + 0x38)
#define T1EMR          LONG_REG(TMR1_BASE_ADDR + 0x3C)
#define T1CTCR         LONG_REG(TMR1_BASE_ADDR + 0x70)

/* Timer 2 */
#define TMR2_BASE_ADDR		0xE0070000
#define T2IR           LONG_REG(TMR2_BASE_ADDR + 0x00)
#define T2TCR          LONG_REG(TMR2_BASE_ADDR + 0x04)
#define T2TC           LONG_REG(TMR2_BASE_ADDR + 0x08)
#define T2PR           LONG_REG(TMR2_BASE_ADDR + 0x0C)
#define T2PC           LONG_REG(TMR2_BASE_ADDR + 0x10)
#define T2MCR          LONG_REG(TMR2_BASE_ADDR + 0x14)
#define T2MR0          LONG_REG(TMR2_BASE_ADDR + 0x18)
#define T2MR1          LONG_REG(TMR2_BASE_ADDR + 0x1C)
#define T2MR2          LONG_REG(TMR2_BASE_ADDR + 0x20)
#define T2MR3          LONG_REG(TMR2_BASE_ADDR + 0x24)
#define T2CCR          LONG_REG(TMR2_BASE_ADDR + 0x28)
#define T2CR0          LONG_REG(TMR2_BASE_ADDR + 0x2C)
#define T2CR1          LONG_REG(TMR2_BASE_ADDR + 0x30)
#define T2CR2          LONG_REG(TMR2_BASE_ADDR + 0x34)
#define T2CR3          LONG_REG(TMR2_BASE_ADDR + 0x38)
#define T2EMR          LONG_REG(TMR2_BASE_ADDR + 0x3C)
#define T2CTCR         LONG_REG(TMR2_BASE_ADDR + 0x70)

/* Timer 3 */
#define TMR3_BASE_ADDR		0xE0074000
#define T3IR           LONG_REG(TMR3_BASE_ADDR + 0x00)
#define T3TCR          LONG_REG(TMR3_BASE_ADDR + 0x04)
#define T3TC           LONG_REG(TMR3_BASE_ADDR + 0x08)
#define T3PR           LONG_REG(TMR3_BASE_ADDR + 0x0C)
#define T3PC           LONG_REG(TMR3_BASE_ADDR + 0x10)
#define T3MCR          LONG_REG(TMR3_BASE_ADDR + 0x14)
#define T3MR0          LONG_REG(TMR3_BASE_ADDR + 0x18)
#define T3MR1          LONG_REG(TMR3_BASE_ADDR + 0x1C)
#define T3MR2          LONG_REG(TMR3_BASE_ADDR + 0x20)
#define T3MR3          LONG_REG(TMR3_BASE_ADDR + 0x24)
#define T3CCR          LONG_REG(TMR3_BASE_ADDR + 0x28)
#define T3CR0          LONG_REG(TMR3_BASE_ADDR + 0x2C)
#define T3CR1          LONG_REG(TMR3_BASE_ADDR + 0x30)
#define T3CR2          LONG_REG(TMR3_BASE_ADDR + 0x34)
#define T3CR3          LONG_REG(TMR3_BASE_ADDR + 0x38)
#define T3EMR          LONG_REG(TMR3_BASE_ADDR + 0x3C)
#define T3CTCR         LONG_REG(TMR3_BASE_ADDR + 0x70)

/* Ackley: Added Generic Timer offsets */
#define TxIR    0x00
#define TxTCR   0x04
#define TxTC    0x08
#define TxPR    0x0C
#define TxPC    0x10
#define TxMCR   0x14
#define TxMR0   0x18
#define TxMR1   0x1C
#define TxMR2   0x20
#define TxMR3   0x24
#define TxCCR   0x28
#define TxCR0   0x2C
#define TxCR1   0x30
#define TxCR2   0x34
#define TxCR3   0x38
#define TxEMR   0x3C
#define TxCTCR  0x70

/* Pulse Width Modulator (PWM) */
#define PWM0_BASE_ADDR		0xE0014000
#define PWM0IR          LONG_REG(PWM0_BASE_ADDR + 0x00)
#define PWM0TCR         LONG_REG(PWM0_BASE_ADDR + 0x04)
#define PWM0TC          LONG_REG(PWM0_BASE_ADDR + 0x08)
#define PWM0PR          LONG_REG(PWM0_BASE_ADDR + 0x0C)
#define PWM0PC          LONG_REG(PWM0_BASE_ADDR + 0x10)
#define PWM0MCR         LONG_REG(PWM0_BASE_ADDR + 0x14)
#define PWM0MR0         LONG_REG(PWM0_BASE_ADDR + 0x18)
#define PWM0MR1         LONG_REG(PWM0_BASE_ADDR + 0x1C)
#define PWM0MR2         LONG_REG(PWM0_BASE_ADDR + 0x20)
#define PWM0MR3         LONG_REG(PWM0_BASE_ADDR + 0x24)
#define PWM0CCR         LONG_REG(PWM0_BASE_ADDR + 0x28)
#define PWM0CR0         LONG_REG(PWM0_BASE_ADDR + 0x2C)
#define PWM0CR1         LONG_REG(PWM0_BASE_ADDR + 0x30)
#define PWM0CR2         LONG_REG(PWM0_BASE_ADDR + 0x34)
#define PWM0CR3         LONG_REG(PWM0_BASE_ADDR + 0x38)
#define PWM0EMR         LONG_REG(PWM0_BASE_ADDR + 0x3C)
#define PWM0MR4         LONG_REG(PWM0_BASE_ADDR + 0x40)
#define PWM0MR5         LONG_REG(PWM0_BASE_ADDR + 0x44)
#define PWM0MR6         LONG_REG(PWM0_BASE_ADDR + 0x48)
#define PWM0PCR         LONG_REG(PWM0_BASE_ADDR + 0x4C)
#define PWM0LER         LONG_REG(PWM0_BASE_ADDR + 0x50)
#define PWM0CTCR        LONG_REG(PWM0_BASE_ADDR + 0x70)

#define PWM1_BASE_ADDR		0xE0018000
#define PWM1IR          LONG_REG(PWM1_BASE_ADDR + 0x00)
#define PWM1TCR         LONG_REG(PWM1_BASE_ADDR + 0x04)
#define PWM1TC          LONG_REG(PWM1_BASE_ADDR + 0x08)
#define PWM1PR          LONG_REG(PWM1_BASE_ADDR + 0x0C)
#define PWM1PC          LONG_REG(PWM1_BASE_ADDR + 0x10)
#define PWM1MCR         LONG_REG(PWM1_BASE_ADDR + 0x14)
#define PWM1MR0         LONG_REG(PWM1_BASE_ADDR + 0x18)
#define PWM1MR1         LONG_REG(PWM1_BASE_ADDR + 0x1C)
#define PWM1MR2         LONG_REG(PWM1_BASE_ADDR + 0x20)
#define PWM1MR3         LONG_REG(PWM1_BASE_ADDR + 0x24)
#define PWM1CCR         LONG_REG(PWM1_BASE_ADDR + 0x28)
#define PWM1CR0         LONG_REG(PWM1_BASE_ADDR + 0x2C)
#define PWM1CR1         LONG_REG(PWM1_BASE_ADDR + 0x30)
#define PWM1CR2         LONG_REG(PWM1_BASE_ADDR + 0x34)
#define PWM1CR3         LONG_REG(PWM1_BASE_ADDR + 0x38)
#define PWM1EMR         LONG_REG(PWM1_BASE_ADDR + 0x3C)
#define PWM1MR4         LONG_REG(PWM1_BASE_ADDR + 0x40)
#define PWM1MR5         LONG_REG(PWM1_BASE_ADDR + 0x44)
#define PWM1MR6         LONG_REG(PWM1_BASE_ADDR + 0x48)
#define PWM1PCR         LONG_REG(PWM1_BASE_ADDR + 0x4C)
#define PWM1LER         LONG_REG(PWM1_BASE_ADDR + 0x50)
#define PWM1CTCR        LONG_REG(PWM1_BASE_ADDR + 0x70)

/* Ackley: Added Generic UART offsets */
#define UxRBR          0x00
#define UxTHR          0x00
#define UxDLL          0x00
#define UxDLM          0x04
#define UxIER          0x04
#define UxIIR          0x08
#define UxFCR          0x08
#define UxLCR          0x0C
#define UxLSR          0x14
#define UxSCR          0x1C
#define UxACR          0x20
#define UxICR          0x24
#define UxFDR          0x28
#define UxTER          0x30

/* Universal Asynchronous Receiver Transmitter 0 (UART0) */
#define UART0_BASE_ADDR		0xE000C000
#define U0RBR          LONG_REG(UART0_BASE_ADDR + 0x00)
#define U0THR          LONG_REG(UART0_BASE_ADDR + 0x00)
#define U0DLL          LONG_REG(UART0_BASE_ADDR + 0x00)
#define U0DLM          LONG_REG(UART0_BASE_ADDR + 0x04)
#define U0IER          LONG_REG(UART0_BASE_ADDR + 0x04)
#define U0IIR          LONG_REG(UART0_BASE_ADDR + 0x08)
#define U0FCR          LONG_REG(UART0_BASE_ADDR + 0x08)
#define U0LCR          LONG_REG(UART0_BASE_ADDR + 0x0C)
#define U0LSR          LONG_REG(UART0_BASE_ADDR + 0x14)
#define U0SCR          LONG_REG(UART0_BASE_ADDR + 0x1C)
#define U0ACR          LONG_REG(UART0_BASE_ADDR + 0x20)
#define U0ICR          LONG_REG(UART0_BASE_ADDR + 0x24)
#define U0FDR          LONG_REG(UART0_BASE_ADDR + 0x28)
#define U0TER          LONG_REG(UART0_BASE_ADDR + 0x30)

/* Universal Asynchronous Receiver Transmitter 1 (UART1) */
#define UART1_BASE_ADDR		0xE0010000
#define U1RBR          LONG_REG(UART1_BASE_ADDR + 0x00)
#define U1THR          LONG_REG(UART1_BASE_ADDR + 0x00)
#define U1DLL          LONG_REG(UART1_BASE_ADDR + 0x00)
#define U1DLM          LONG_REG(UART1_BASE_ADDR + 0x04)
#define U1IER          LONG_REG(UART1_BASE_ADDR + 0x04)
#define U1IIR          LONG_REG(UART1_BASE_ADDR + 0x08)
#define U1FCR          LONG_REG(UART1_BASE_ADDR + 0x08)
#define U1LCR          LONG_REG(UART1_BASE_ADDR + 0x0C)
#define U1MCR          LONG_REG(UART1_BASE_ADDR + 0x10)
#define U1LSR          LONG_REG(UART1_BASE_ADDR + 0x14)
#define U1MSR          LONG_REG(UART1_BASE_ADDR + 0x18)
#define U1SCR          LONG_REG(UART1_BASE_ADDR + 0x1C)
#define U1ACR          LONG_REG(UART1_BASE_ADDR + 0x20)
/*#define U1ICR          LONG_REG(UART1_BASE_ADDR + 0x24) ACKLEY -- Only this one was missing from the file, why? */
#define U1FDR          LONG_REG(UART1_BASE_ADDR + 0x28)
#define U1TER          LONG_REG(UART1_BASE_ADDR + 0x30)

/* Universal Asynchronous Receiver Transmitter 2 (UART2) */
#define UART2_BASE_ADDR		0xE0078000
#define U2RBR          LONG_REG(UART2_BASE_ADDR + 0x00)
#define U2THR          LONG_REG(UART2_BASE_ADDR + 0x00)
#define U2DLL          LONG_REG(UART2_BASE_ADDR + 0x00)
#define U2DLM          LONG_REG(UART2_BASE_ADDR + 0x04)
#define U2IER          LONG_REG(UART2_BASE_ADDR + 0x04)
#define U2IIR          LONG_REG(UART2_BASE_ADDR + 0x08)
#define U2FCR          LONG_REG(UART2_BASE_ADDR + 0x08)
#define U2LCR          LONG_REG(UART2_BASE_ADDR + 0x0C)
#define U2LSR          LONG_REG(UART2_BASE_ADDR + 0x14)
#define U2SCR          LONG_REG(UART2_BASE_ADDR + 0x1C)
#define U2ACR          LONG_REG(UART2_BASE_ADDR + 0x20)
#define U2ICR          LONG_REG(UART2_BASE_ADDR + 0x24)
#define U2FDR          LONG_REG(UART2_BASE_ADDR + 0x28)
#define U2TER          LONG_REG(UART2_BASE_ADDR + 0x30)

/* Universal Asynchronous Receiver Transmitter 3 (UART3) */
#define UART3_BASE_ADDR		0xE007C000
#define U3RBR          LONG_REG(UART3_BASE_ADDR + 0x00)
#define U3THR          LONG_REG(UART3_BASE_ADDR + 0x00)
#define U3DLL          LONG_REG(UART3_BASE_ADDR + 0x00)
#define U3DLM          LONG_REG(UART3_BASE_ADDR + 0x04)
#define U3IER          LONG_REG(UART3_BASE_ADDR + 0x04)
#define U3IIR          LONG_REG(UART3_BASE_ADDR + 0x08)
#define U3FCR          LONG_REG(UART3_BASE_ADDR + 0x08)
#define U3LCR          LONG_REG(UART3_BASE_ADDR + 0x0C)
#define U3LSR          LONG_REG(UART3_BASE_ADDR + 0x14)
#define U3SCR          LONG_REG(UART3_BASE_ADDR + 0x1C)
#define U3ACR          LONG_REG(UART3_BASE_ADDR + 0x20)
#define U3ICR          LONG_REG(UART3_BASE_ADDR + 0x24)
#define U3FDR          LONG_REG(UART3_BASE_ADDR + 0x28)
#define U3TER          LONG_REG(UART3_BASE_ADDR + 0x30)

/* I2C Interface 0 */
#define I2C0_BASE_ADDR		0xE001C000
#define I20CONSET      LONG_REG(I2C0_BASE_ADDR + 0x00)
#define I20STAT        LONG_REG(I2C0_BASE_ADDR + 0x04)
#define I20DAT         LONG_REG(I2C0_BASE_ADDR + 0x08)
#define I20ADR         LONG_REG(I2C0_BASE_ADDR + 0x0C)
#define I20SCLH        LONG_REG(I2C0_BASE_ADDR + 0x10)
#define I20SCLL        LONG_REG(I2C0_BASE_ADDR + 0x14)
#define I20CONCLR      LONG_REG(I2C0_BASE_ADDR + 0x18)

/* I2C Interface 1 */
#define I2C1_BASE_ADDR		0xE005C000
#define I21CONSET      LONG_REG(I2C1_BASE_ADDR + 0x00)
#define I21STAT        LONG_REG(I2C1_BASE_ADDR + 0x04)
#define I21DAT         LONG_REG(I2C1_BASE_ADDR + 0x08)
#define I21ADR         LONG_REG(I2C1_BASE_ADDR + 0x0C)
#define I21SCLH        LONG_REG(I2C1_BASE_ADDR + 0x10)
#define I21SCLL        LONG_REG(I2C1_BASE_ADDR + 0x14)
#define I21CONCLR      LONG_REG(I2C1_BASE_ADDR + 0x18)

/* I2C Interface 2 */
#define I2C2_BASE_ADDR		0xE0080000
#define I22CONSET      LONG_REG(I2C2_BASE_ADDR + 0x00)
#define I22STAT        LONG_REG(I2C2_BASE_ADDR + 0x04)
#define I22DAT         LONG_REG(I2C2_BASE_ADDR + 0x08)
#define I22ADR         LONG_REG(I2C2_BASE_ADDR + 0x0C)
#define I22SCLH        LONG_REG(I2C2_BASE_ADDR + 0x10)
#define I22SCLL        LONG_REG(I2C2_BASE_ADDR + 0x14)
#define I22CONCLR      LONG_REG(I2C2_BASE_ADDR + 0x18)

/* SPI0 (Serial Peripheral Interface 0) */
#define SPI0_BASE_ADDR		0xE0020000
#define S0SPCR         LONG_REG(SPI0_BASE_ADDR + 0x00)
#define S0SPSR         LONG_REG(SPI0_BASE_ADDR + 0x04)
#define S0SPDR         LONG_REG(SPI0_BASE_ADDR + 0x08)
#define S0SPCCR        LONG_REG(SPI0_BASE_ADDR + 0x0C)
#define S0SPINT        LONG_REG(SPI0_BASE_ADDR + 0x1C)

/* SSP0 Controller */
#define SSP0_BASE_ADDR		0xE0068000
#define SSP0CR0        LONG_REG(SSP0_BASE_ADDR + 0x00)
#define SSP0CR1        LONG_REG(SSP0_BASE_ADDR + 0x04)
#define SSP0DR         LONG_REG(SSP0_BASE_ADDR + 0x08)
#define SSP0SR         LONG_REG(SSP0_BASE_ADDR + 0x0C)
#define SSP0CPSR       LONG_REG(SSP0_BASE_ADDR + 0x10)
#define SSP0IMSC       LONG_REG(SSP0_BASE_ADDR + 0x14)
#define SSP0RIS        LONG_REG(SSP0_BASE_ADDR + 0x18)
#define SSP0MIS        LONG_REG(SSP0_BASE_ADDR + 0x1C)
#define SSP0ICR        LONG_REG(SSP0_BASE_ADDR + 0x20)
#define SSP0DMACR      LONG_REG(SSP0_BASE_ADDR + 0x24)

/* SSP1 Controller */
#define SSP1_BASE_ADDR		0xE0030000
#define SSP1CR0        LONG_REG(SSP1_BASE_ADDR + 0x00)
#define SSP1CR1        LONG_REG(SSP1_BASE_ADDR + 0x04)
#define SSP1DR         LONG_REG(SSP1_BASE_ADDR + 0x08)
#define SSP1SR         LONG_REG(SSP1_BASE_ADDR + 0x0C)
#define SSP1CPSR       LONG_REG(SSP1_BASE_ADDR + 0x10)
#define SSP1IMSC       LONG_REG(SSP1_BASE_ADDR + 0x14)
#define SSP1RIS        LONG_REG(SSP1_BASE_ADDR + 0x18)
#define SSP1MIS        LONG_REG(SSP1_BASE_ADDR + 0x1C)
#define SSP1ICR        LONG_REG(SSP1_BASE_ADDR + 0x20)
#define SSP1DMACR      LONG_REG(SSP1_BASE_ADDR + 0x24)


/* Real Time Clock */
#define RTC_BASE_ADDR		0xE0024000
#define RTC_ILR         LONG_REG(RTC_BASE_ADDR + 0x00)
#define RTC_CTC         LONG_REG(RTC_BASE_ADDR + 0x04)
#define RTC_CCR         LONG_REG(RTC_BASE_ADDR + 0x08)
#define RTC_CIIR        LONG_REG(RTC_BASE_ADDR + 0x0C)
#define RTC_AMR         LONG_REG(RTC_BASE_ADDR + 0x10)
#define RTC_CTIME0      LONG_REG(RTC_BASE_ADDR + 0x14)
#define RTC_CTIME1      LONG_REG(RTC_BASE_ADDR + 0x18)
#define RTC_CTIME2      LONG_REG(RTC_BASE_ADDR + 0x1C)
#define RTC_SEC         LONG_REG(RTC_BASE_ADDR + 0x20)
#define RTC_MIN         LONG_REG(RTC_BASE_ADDR + 0x24)
#define RTC_HOUR        LONG_REG(RTC_BASE_ADDR + 0x28)
#define RTC_DOM         LONG_REG(RTC_BASE_ADDR + 0x2C)
#define RTC_DOW         LONG_REG(RTC_BASE_ADDR + 0x30)
#define RTC_DOY         LONG_REG(RTC_BASE_ADDR + 0x34)
#define RTC_MONTH       LONG_REG(RTC_BASE_ADDR + 0x38)
#define RTC_YEAR        LONG_REG(RTC_BASE_ADDR + 0x3C)
#define RTC_CISS        LONG_REG(RTC_BASE_ADDR + 0x40)
#define RTC_ALSEC       LONG_REG(RTC_BASE_ADDR + 0x60)
#define RTC_ALMIN       LONG_REG(RTC_BASE_ADDR + 0x64)
#define RTC_ALHOUR      LONG_REG(RTC_BASE_ADDR + 0x68)
#define RTC_ALDOM       LONG_REG(RTC_BASE_ADDR + 0x6C)
#define RTC_ALDOW       LONG_REG(RTC_BASE_ADDR + 0x70)
#define RTC_ALDOY       LONG_REG(RTC_BASE_ADDR + 0x74)
#define RTC_ALMON       LONG_REG(RTC_BASE_ADDR + 0x78)
#define RTC_ALYEAR      LONG_REG(RTC_BASE_ADDR + 0x7C)
#define RTC_PREINT      LONG_REG(RTC_BASE_ADDR + 0x80)
#define RTC_PREFRAC     LONG_REG(RTC_BASE_ADDR + 0x84)


/* A/D Converter 0 (AD0) */
#define AD0_BASE_ADDR		0xE0034000
#define AD0CR          LONG_REG(AD0_BASE_ADDR + 0x00)
#define AD0GDR         LONG_REG(AD0_BASE_ADDR + 0x04)
#define AD0INTEN       LONG_REG(AD0_BASE_ADDR + 0x0C)
#define AD0DR0         LONG_REG(AD0_BASE_ADDR + 0x10)
#define AD0DR1         LONG_REG(AD0_BASE_ADDR + 0x14)
#define AD0DR2         LONG_REG(AD0_BASE_ADDR + 0x18)
#define AD0DR3         LONG_REG(AD0_BASE_ADDR + 0x1C)
#define AD0DR4         LONG_REG(AD0_BASE_ADDR + 0x20)
#define AD0DR5         LONG_REG(AD0_BASE_ADDR + 0x24)
#define AD0DR6         LONG_REG(AD0_BASE_ADDR + 0x28)
#define AD0DR7         LONG_REG(AD0_BASE_ADDR + 0x2C)
#define AD0STAT        LONG_REG(AD0_BASE_ADDR + 0x30)


/* D/A Converter */
#define DAC_BASE_ADDR		0xE006C000
#define DACR           LONG_REG(DAC_BASE_ADDR + 0x00)


/* Watchdog */
#define WDG_BASE_ADDR		0xE0000000
#define WDMOD          LONG_REG(WDG_BASE_ADDR + 0x00)
#define WDTC           LONG_REG(WDG_BASE_ADDR + 0x04)
#define WDFEED         LONG_REG(WDG_BASE_ADDR + 0x08)
#define WDTV           LONG_REG(WDG_BASE_ADDR + 0x0C)
#define WDCLKSEL       LONG_REG(WDG_BASE_ADDR + 0x10)

/* CAN CONTROLLERS AND ACCEPTANCE FILTER */
#define CAN_ACCEPT_BASE_ADDR		0xE003C000
#define CAN_AFMR		LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x00)
#define CAN_SFF_SA 		LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x04)
#define CAN_SFF_GRP_SA 	LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x08)
#define CAN_EFF_SA 		LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x0C)
#define CAN_EFF_GRP_SA 	LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x10)
#define CAN_EOT 		LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x14)
#define CAN_LUT_ERR_ADR LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x18)
#define CAN_LUT_ERR 	LONG_REG(CAN_ACCEPT_BASE_ADDR + 0x1C)

#define CAN_CENTRAL_BASE_ADDR		0xE0040000
#define CAN_TX_SR 	LONG_REG(CAN_CENTRAL_BASE_ADDR + 0x00)
#define CAN_RX_SR 	LONG_REG(CAN_CENTRAL_BASE_ADDR + 0x04)
#define CAN_MSR 	LONG_REG(CAN_CENTRAL_BASE_ADDR + 0x08)

#define CAN1_BASE_ADDR		0xE0044000
#define CAN1MOD 	LONG_REG(CAN1_BASE_ADDR + 0x00)
#define CAN1CMR 	LONG_REG(CAN1_BASE_ADDR + 0x04)
#define CAN1GSR 	LONG_REG(CAN1_BASE_ADDR + 0x08)
#define CAN1ICR 	LONG_REG(CAN1_BASE_ADDR + 0x0C)
#define CAN1IER 	LONG_REG(CAN1_BASE_ADDR + 0x10)
#define CAN1BTR 	LONG_REG(CAN1_BASE_ADDR + 0x14)
#define CAN1EWL 	LONG_REG(CAN1_BASE_ADDR + 0x18)
#define CAN1SR 		LONG_REG(CAN1_BASE_ADDR + 0x1C)
#define CAN1RFS 	LONG_REG(CAN1_BASE_ADDR + 0x20)
#define CAN1RID 	LONG_REG(CAN1_BASE_ADDR + 0x24)
#define CAN1RDA 	LONG_REG(CAN1_BASE_ADDR + 0x28)
#define CAN1RDB 	LONG_REG(CAN1_BASE_ADDR + 0x2C)

#define CAN1TFI1 	LONG_REG(CAN1_BASE_ADDR + 0x30)
#define CAN1TID1 	LONG_REG(CAN1_BASE_ADDR + 0x34)
#define CAN1TDA1 	LONG_REG(CAN1_BASE_ADDR + 0x38)
#define CAN1TDB1 	LONG_REG(CAN1_BASE_ADDR + 0x3C)
#define CAN1TFI2 	LONG_REG(CAN1_BASE_ADDR + 0x40)
#define CAN1TID2 	LONG_REG(CAN1_BASE_ADDR + 0x44)
#define CAN1TDA2 	LONG_REG(CAN1_BASE_ADDR + 0x48)
#define CAN1TDB2 	LONG_REG(CAN1_BASE_ADDR + 0x4C)
#define CAN1TFI3 	LONG_REG(CAN1_BASE_ADDR + 0x50)
#define CAN1TID3 	LONG_REG(CAN1_BASE_ADDR + 0x54)
#define CAN1TDA3 	LONG_REG(CAN1_BASE_ADDR + 0x58)
#define CAN1TDB3 	LONG_REG(CAN1_BASE_ADDR + 0x5C)

#define CAN2_BASE_ADDR		0xE0048000
#define CAN2MOD 	LONG_REG(CAN2_BASE_ADDR + 0x00)
#define CAN2CMR 	LONG_REG(CAN2_BASE_ADDR + 0x04)
#define CAN2GSR 	LONG_REG(CAN2_BASE_ADDR + 0x08)
#define CAN2ICR 	LONG_REG(CAN2_BASE_ADDR + 0x0C)
#define CAN2IER 	LONG_REG(CAN2_BASE_ADDR + 0x10)
#define CAN2BTR 	LONG_REG(CAN2_BASE_ADDR + 0x14)
#define CAN2EWL 	LONG_REG(CAN2_BASE_ADDR + 0x18)
#define CAN2SR 		LONG_REG(CAN2_BASE_ADDR + 0x1C)
#define CAN2RFS 	LONG_REG(CAN2_BASE_ADDR + 0x20)
#define CAN2RID 	LONG_REG(CAN2_BASE_ADDR + 0x24)
#define CAN2RDA 	LONG_REG(CAN2_BASE_ADDR + 0x28)
#define CAN2RDB 	LONG_REG(CAN2_BASE_ADDR + 0x2C)

#define CAN2TFI1 	LONG_REG(CAN2_BASE_ADDR + 0x30)
#define CAN2TID1 	LONG_REG(CAN2_BASE_ADDR + 0x34)
#define CAN2TDA1 	LONG_REG(CAN2_BASE_ADDR + 0x38)
#define CAN2TDB1 	LONG_REG(CAN2_BASE_ADDR + 0x3C)
#define CAN2TFI2 	LONG_REG(CAN2_BASE_ADDR + 0x40)
#define CAN2TID2 	LONG_REG(CAN2_BASE_ADDR + 0x44)
#define CAN2TDA2 	LONG_REG(CAN2_BASE_ADDR + 0x48)
#define CAN2TDB2 	LONG_REG(CAN2_BASE_ADDR + 0x4C)
#define CAN2TFI3 	LONG_REG(CAN2_BASE_ADDR + 0x50)
#define CAN2TID3 	LONG_REG(CAN2_BASE_ADDR + 0x54)
#define CAN2TDA3 	LONG_REG(CAN2_BASE_ADDR + 0x58)
#define CAN2TDB3 	LONG_REG(CAN2_BASE_ADDR + 0x5C)


/* MultiMedia Card Interface(MCI) Controller */
#define MCI_BASE_ADDR		0xE008C000
#define MCI_POWER      LONG_REG(MCI_BASE_ADDR + 0x00)
#define MCI_CLOCK      LONG_REG(MCI_BASE_ADDR + 0x04)
#define MCI_ARGUMENT   LONG_REG(MCI_BASE_ADDR + 0x08)
#define MCI_COMMAND    LONG_REG(MCI_BASE_ADDR + 0x0C)
#define MCI_RESP_CMD   LONG_REG(MCI_BASE_ADDR + 0x10)
#define MCI_RESP0      LONG_REG(MCI_BASE_ADDR + 0x14)
#define MCI_RESP1      LONG_REG(MCI_BASE_ADDR + 0x18)
#define MCI_RESP2      LONG_REG(MCI_BASE_ADDR + 0x1C)
#define MCI_RESP3      LONG_REG(MCI_BASE_ADDR + 0x20)
#define MCI_DATA_TMR   LONG_REG(MCI_BASE_ADDR + 0x24)
#define MCI_DATA_LEN   LONG_REG(MCI_BASE_ADDR + 0x28)
#define MCI_DATA_CTRL  LONG_REG(MCI_BASE_ADDR + 0x2C)
#define MCI_DATA_CNT   LONG_REG(MCI_BASE_ADDR + 0x30)
#define MCI_STATUS     LONG_REG(MCI_BASE_ADDR + 0x34)
#define MCI_CLEAR      LONG_REG(MCI_BASE_ADDR + 0x38)
#define MCI_MASK0      LONG_REG(MCI_BASE_ADDR + 0x3C)
#define MCI_MASK1      LONG_REG(MCI_BASE_ADDR + 0x40)
#define MCI_FIFO_CNT   LONG_REG(MCI_BASE_ADDR + 0x48)
#define MCI_FIFO       LONG_REG(MCI_BASE_ADDR + 0x80)


/* I2S Interface Controller (I2S) */
#define I2S_BASE_ADDR		0xE0088000
#define I2S_DAO        LONG_REG(I2S_BASE_ADDR + 0x00)
#define I2S_DAI        LONG_REG(I2S_BASE_ADDR + 0x04)
#define I2S_TX_FIFO    LONG_REG(I2S_BASE_ADDR + 0x08)
#define I2S_RX_FIFO    LONG_REG(I2S_BASE_ADDR + 0x0C)
#define I2S_STATE      LONG_REG(I2S_BASE_ADDR + 0x10)
#define I2S_DMA1       LONG_REG(I2S_BASE_ADDR + 0x14)
#define I2S_DMA2       LONG_REG(I2S_BASE_ADDR + 0x18)
#define I2S_IRQ        LONG_REG(I2S_BASE_ADDR + 0x1C)
#define I2S_TXRATE     LONG_REG(I2S_BASE_ADDR + 0x20)
#define I2S_RXRATE     LONG_REG(I2S_BASE_ADDR + 0x24)


/* General-purpose DMA Controller */
#define DMA_BASE_ADDR		0xFFE04000
#define GPDMA_INT_STAT         LONG_REG(DMA_BASE_ADDR + 0x000)
#define GPDMA_INT_TCSTAT       LONG_REG(DMA_BASE_ADDR + 0x004)
#define GPDMA_INT_TCCLR        LONG_REG(DMA_BASE_ADDR + 0x008)
#define GPDMA_INT_ERR_STAT     LONG_REG(DMA_BASE_ADDR + 0x00C)
#define GPDMA_INT_ERR_CLR      LONG_REG(DMA_BASE_ADDR + 0x010)
#define GPDMA_RAW_INT_TCSTAT   LONG_REG(DMA_BASE_ADDR + 0x014)
#define GPDMA_RAW_INT_ERR_STAT LONG_REG(DMA_BASE_ADDR + 0x018)
#define GPDMA_ENABLED_CHNS     LONG_REG(DMA_BASE_ADDR + 0x01C)
#define GPDMA_SOFT_BREQ        LONG_REG(DMA_BASE_ADDR + 0x020)
#define GPDMA_SOFT_SREQ        LONG_REG(DMA_BASE_ADDR + 0x024)
#define GPDMA_SOFT_LBREQ       LONG_REG(DMA_BASE_ADDR + 0x028)
#define GPDMA_SOFT_LSREQ       LONG_REG(DMA_BASE_ADDR + 0x02C)
#define GPDMA_CONFIG           LONG_REG(DMA_BASE_ADDR + 0x030)
#define GPDMA_SYNC             LONG_REG(DMA_BASE_ADDR + 0x034)

/* DMA channel 0 registers */
#define GPDMA_CH0_SRC      LONG_REG(DMA_BASE_ADDR + 0x100)
#define GPDMA_CH0_DEST     LONG_REG(DMA_BASE_ADDR + 0x104)
#define GPDMA_CH0_LLI      LONG_REG(DMA_BASE_ADDR + 0x108)
#define GPDMA_CH0_CTRL     LONG_REG(DMA_BASE_ADDR + 0x10C)
#define GPDMA_CH0_CFG      LONG_REG(DMA_BASE_ADDR + 0x110)

/* DMA channel 1 registers */
#define GPDMA_CH1_SRC      LONG_REG(DMA_BASE_ADDR + 0x120)
#define GPDMA_CH1_DEST     LONG_REG(DMA_BASE_ADDR + 0x124)
#define GPDMA_CH1_LLI      LONG_REG(DMA_BASE_ADDR + 0x128)
#define GPDMA_CH1_CTRL     LONG_REG(DMA_BASE_ADDR + 0x12C)
#define GPDMA_CH1_CFG      LONG_REG(DMA_BASE_ADDR + 0x130)


/* USB Controller */
#define USB_INT_BASE_ADDR	0xE01FC1C0
#define USB_BASE_ADDR		0xFFE0C200		/* USB Base Address */

#define USB_INT_STAT    LONG_REG(USB_INT_BASE_ADDR + 0x00)

/* USB Device Interrupt Registers */
#define DEV_INT_STAT    LONG_REG(USB_BASE_ADDR + 0x00)
#define DEV_INT_EN      LONG_REG(USB_BASE_ADDR + 0x04)
#define DEV_INT_CLR     LONG_REG(USB_BASE_ADDR + 0x08)
#define DEV_INT_SET     LONG_REG(USB_BASE_ADDR + 0x0C)
#define DEV_INT_PRIO    LONG_REG(USB_BASE_ADDR + 0x2C)

/* USB Device Endpoint Interrupt Registers */
#define EP_INT_STAT     LONG_REG(USB_BASE_ADDR + 0x30)
#define EP_INT_EN       LONG_REG(USB_BASE_ADDR + 0x34)
#define EP_INT_CLR      LONG_REG(USB_BASE_ADDR + 0x38)
#define EP_INT_SET      LONG_REG(USB_BASE_ADDR + 0x3C)
#define EP_INT_PRIO     LONG_REG(USB_BASE_ADDR + 0x40)

/* USB Device Endpoint Realization Registers */
#define REALIZE_EP      LONG_REG(USB_BASE_ADDR + 0x44)
#define EP_INDEX        LONG_REG(USB_BASE_ADDR + 0x48)
#define MAXPACKET_SIZE  LONG_REG(USB_BASE_ADDR + 0x4C)

/* USB Device Command Reagisters */
#define CMD_CODE        LONG_REG(USB_BASE_ADDR + 0x10)
#define CMD_DATA        LONG_REG(USB_BASE_ADDR + 0x14)

/* USB Device Data Transfer Registers */
#define RX_DATA         LONG_REG(USB_BASE_ADDR + 0x18)
#define TX_DATA         LONG_REG(USB_BASE_ADDR + 0x1C)
#define RX_PLENGTH      LONG_REG(USB_BASE_ADDR + 0x20)
#define TX_PLENGTH      LONG_REG(USB_BASE_ADDR + 0x24)
#define USB_CTRL        LONG_REG(USB_BASE_ADDR + 0x28)

/* USB Device DMA Registers */
#define DMA_REQ_STAT        LONG_REG(USB_BASE_ADDR + 0x50)
#define DMA_REQ_CLR         LONG_REG(USB_BASE_ADDR + 0x54)
#define DMA_REQ_SET         LONG_REG(USB_BASE_ADDR + 0x58)
#define UDCA_HEAD           LONG_REG(USB_BASE_ADDR + 0x80)
#define EP_DMA_STAT         LONG_REG(USB_BASE_ADDR + 0x84)
#define EP_DMA_EN           LONG_REG(USB_BASE_ADDR + 0x88)
#define EP_DMA_DIS          LONG_REG(USB_BASE_ADDR + 0x8C)
#define DMA_INT_STAT        LONG_REG(USB_BASE_ADDR + 0x90)
#define DMA_INT_EN          LONG_REG(USB_BASE_ADDR + 0x94)
#define EOT_INT_STAT        LONG_REG(USB_BASE_ADDR + 0xA0)
#define EOT_INT_CLR         LONG_REG(USB_BASE_ADDR + 0xA4)
#define EOT_INT_SET         LONG_REG(USB_BASE_ADDR + 0xA8)
#define NDD_REQ_INT_STAT    LONG_REG(USB_BASE_ADDR + 0xAC)
#define NDD_REQ_INT_CLR     LONG_REG(USB_BASE_ADDR + 0xB0)
#define NDD_REQ_INT_SET     LONG_REG(USB_BASE_ADDR + 0xB4)
#define SYS_ERR_INT_STAT    LONG_REG(USB_BASE_ADDR + 0xB8)
#define SYS_ERR_INT_CLR     LONG_REG(USB_BASE_ADDR + 0xBC)
#define SYS_ERR_INT_SET     LONG_REG(USB_BASE_ADDR + 0xC0)

/* USB Host and OTG registers are for LPC24xx only */
/* USB Host Controller */
#define USBHC_BASE_ADDR		0xFFE0C000
#define HC_REVISION         LONG_REG(USBHC_BASE_ADDR + 0x00)
#define HC_CONTROL          LONG_REG(USBHC_BASE_ADDR + 0x04)
#define HC_CMD_STAT         LONG_REG(USBHC_BASE_ADDR + 0x08)
#define HC_INT_STAT         LONG_REG(USBHC_BASE_ADDR + 0x0C)
#define HC_INT_EN           LONG_REG(USBHC_BASE_ADDR + 0x10)
#define HC_INT_DIS          LONG_REG(USBHC_BASE_ADDR + 0x14)
#define HC_HCCA             LONG_REG(USBHC_BASE_ADDR + 0x18)
#define HC_PERIOD_CUR_ED    LONG_REG(USBHC_BASE_ADDR + 0x1C)
#define HC_CTRL_HEAD_ED     LONG_REG(USBHC_BASE_ADDR + 0x20)
#define HC_CTRL_CUR_ED      LONG_REG(USBHC_BASE_ADDR + 0x24)
#define HC_BULK_HEAD_ED     LONG_REG(USBHC_BASE_ADDR + 0x28)
#define HC_BULK_CUR_ED      LONG_REG(USBHC_BASE_ADDR + 0x2C)
#define HC_DONE_HEAD        LONG_REG(USBHC_BASE_ADDR + 0x30)
#define HC_FM_INTERVAL      LONG_REG(USBHC_BASE_ADDR + 0x34)
#define HC_FM_REMAINING     LONG_REG(USBHC_BASE_ADDR + 0x38)
#define HC_FM_NUMBER        LONG_REG(USBHC_BASE_ADDR + 0x3C)
#define HC_PERIOD_START     LONG_REG(USBHC_BASE_ADDR + 0x40)
#define HC_LS_THRHLD        LONG_REG(USBHC_BASE_ADDR + 0x44)
#define HC_RH_DESCA         LONG_REG(USBHC_BASE_ADDR + 0x48)
#define HC_RH_DESCB         LONG_REG(USBHC_BASE_ADDR + 0x4C)
#define HC_RH_STAT          LONG_REG(USBHC_BASE_ADDR + 0x50)
#define HC_RH_PORT_STAT1    LONG_REG(USBHC_BASE_ADDR + 0x54)
#define HC_RH_PORT_STAT2    LONG_REG(USBHC_BASE_ADDR + 0x58)

/* USB OTG Controller */
#define USBOTG_BASE_ADDR	0xFFE0C100
#define OTG_INT_STAT        LONG_REG(USBOTG_BASE_ADDR + 0x00)
#define OTG_INT_EN          LONG_REG(USBOTG_BASE_ADDR + 0x04)
#define OTG_INT_SET         LONG_REG(USBOTG_BASE_ADDR + 0x08)
#define OTG_INT_CLR         LONG_REG(USBOTG_BASE_ADDR + 0x0C)
/* On LPC23xx, the name is USBPortSel, on LPC24xx, the name is OTG_STAT_CTRL */
#define OTG_STAT_CTRL       LONG_REG(USBOTG_BASE_ADDR + 0x10)
#define OTG_TIMER           LONG_REG(USBOTG_BASE_ADDR + 0x14)

#define USBOTG_I2C_BASE_ADDR	0xFFE0C300
#define OTG_I2C_RX          LONG_REG(USBOTG_I2C_BASE_ADDR + 0x00)
#define OTG_I2C_TX          LONG_REG(USBOTG_I2C_BASE_ADDR + 0x00)
#define OTG_I2C_STS         LONG_REG(USBOTG_I2C_BASE_ADDR + 0x04)
#define OTG_I2C_CTL         LONG_REG(USBOTG_I2C_BASE_ADDR + 0x08)
#define OTG_I2C_CLKHI       LONG_REG(USBOTG_I2C_BASE_ADDR + 0x0C)
#define OTG_I2C_CLKLO       LONG_REG(USBOTG_I2C_BASE_ADDR + 0x10)

/* On LPC23xx, the names are USBClkCtrl and USBClkSt; on LPC24xx, the names are
OTG_CLK_CTRL and OTG_CLK_STAT respectively. */
#define USBOTG_CLK_BASE_ADDR	0xFFE0CFF0
#define OTG_CLK_CTRL        LONG_REG(USBOTG_CLK_BASE_ADDR + 0x04)
#define OTG_CLK_STAT        LONG_REG(USBOTG_CLK_BASE_ADDR + 0x08)

/* Note: below three register name convention is for LPC23xx USB device only, match
with the spec. update in USB Device Section. */
#define USBPortSel          LONG_REG(USBOTG_BASE_ADDR + 0x10)
#define USBClkCtrl          LONG_REG(USBOTG_CLK_BASE_ADDR + 0x04)
#define USBClkSt            LONG_REG(USBOTG_CLK_BASE_ADDR + 0x08)

/* Ethernet MAC (32 bit data bus) -- all registers are RW unless indicated in parentheses */
#define MAC_BASE_ADDR		0xFFE00000 /* AHB Peripheral # 0 */
#define MAC_MAC1            LONG_REG(MAC_BASE_ADDR + 0x000) /* MAC config reg 1 */
#define MAC_MAC2            LONG_REG(MAC_BASE_ADDR + 0x004) /* MAC config reg 2 */
#define MAC_IPGT            LONG_REG(MAC_BASE_ADDR + 0x008) /* b2b InterPacketGap reg */
#define MAC_IPGR            LONG_REG(MAC_BASE_ADDR + 0x00C) /* non b2b InterPacketGap reg */
#define MAC_CLRT            LONG_REG(MAC_BASE_ADDR + 0x010) /* CoLlision window/ReTry reg */
#define MAC_MAXF            LONG_REG(MAC_BASE_ADDR + 0x014) /* MAXimum Frame reg */
#define MAC_SUPP            LONG_REG(MAC_BASE_ADDR + 0x018) /* PHY SUPPort reg */
#define MAC_TEST            LONG_REG(MAC_BASE_ADDR + 0x01C) /* TEST reg */
#define MAC_MCFG            LONG_REG(MAC_BASE_ADDR + 0x020) /* MII Mgmt ConFiG reg */
#define MAC_MCMD            LONG_REG(MAC_BASE_ADDR + 0x024) /* MII Mgmt CoMmanD reg */
#define MAC_MADR            LONG_REG(MAC_BASE_ADDR + 0x028) /* MII Mgmt ADdRess reg */
#define MAC_MWTD            LONG_REG(MAC_BASE_ADDR + 0x02C) /* MII Mgmt WriTe Data reg (WO) */
#define MAC_MRDD            LONG_REG(MAC_BASE_ADDR + 0x030) /* MII Mgmt ReaD Data reg (RO) */
#define MAC_MIND            LONG_REG(MAC_BASE_ADDR + 0x034) /* MII Mgmt INDicators reg (RO) */

#define MAC_SA0             LONG_REG(MAC_BASE_ADDR + 0x040) /* Station Address 0 reg */
#define MAC_SA1             LONG_REG(MAC_BASE_ADDR + 0x044) /* Station Address 1 reg */
#define MAC_SA2             LONG_REG(MAC_BASE_ADDR + 0x048) /* Station Address 2 reg */

#define MAC_COMMAND         LONG_REG(MAC_BASE_ADDR + 0x100) /* Command reg */
#define MAC_STATUS          LONG_REG(MAC_BASE_ADDR + 0x104) /* Status reg (RO) */
#define MAC_RXDESCRIPTOR    LONG_REG(MAC_BASE_ADDR + 0x108) /* Rx descriptor base address reg */
#define MAC_RXSTATUS        LONG_REG(MAC_BASE_ADDR + 0x10C) /* Rx status base address reg */
#define MAC_RXDESCRIPTORNUM LONG_REG(MAC_BASE_ADDR + 0x110) /* Rx number of descriptors reg */
#define MAC_RXPRODUCEINDEX  LONG_REG(MAC_BASE_ADDR + 0x114) /* Rx produce index reg (RO) */
#define MAC_RXCONSUMEINDEX  LONG_REG(MAC_BASE_ADDR + 0x118) /* Rx consume index reg */
#define MAC_TXDESCRIPTOR    LONG_REG(MAC_BASE_ADDR + 0x11C) /* Tx descriptor base address reg */
#define MAC_TXSTATUS        LONG_REG(MAC_BASE_ADDR + 0x120) /* Tx status base address reg */
#define MAC_TXDESCRIPTORNUM LONG_REG(MAC_BASE_ADDR + 0x124) /* Tx number of descriptors reg */
#define MAC_TXPRODUCEINDEX  LONG_REG(MAC_BASE_ADDR + 0x128) /* Tx produce index reg */
#define MAC_TXCONSUMEINDEX  LONG_REG(MAC_BASE_ADDR + 0x12C) /* Tx consume index reg (RO) */

#define MAC_TSV0            LONG_REG(MAC_BASE_ADDR + 0x158) /* Tx status vector 0 reg (RO) */
#define MAC_TSV1            LONG_REG(MAC_BASE_ADDR + 0x15C) /* Tx status vector 1 reg (RO) */
#define MAC_RSV             LONG_REG(MAC_BASE_ADDR + 0x160) /* Rx status vector reg (RO) */

#define MAC_FLOWCONTROLCNT  LONG_REG(MAC_BASE_ADDR + 0x170) /* Flow control counter reg */
#define MAC_FLOWCONTROLSTS  LONG_REG(MAC_BASE_ADDR + 0x174) /* Flow control status reg */

#define MAC_RXFILTERCTRL    LONG_REG(MAC_BASE_ADDR + 0x200) /* Rx filter ctrl reg */
#define MAC_RXFILTERWOLSTS  LONG_REG(MAC_BASE_ADDR + 0x204) /* Rx filter WoL status reg (RO) */
#define MAC_RXFILTERWOLCLR  LONG_REG(MAC_BASE_ADDR + 0x208) /* Rx filter WoL clear reg (WO) */

#define MAC_HASHFILTERL     LONG_REG(MAC_BASE_ADDR + 0x210) /* Hash filter LSBs reg */
#define MAC_HASHFILTERH     LONG_REG(MAC_BASE_ADDR + 0x214) /* Hash filter MSBs reg */

#define MAC_INTSTATUS       LONG_REG(MAC_BASE_ADDR + 0xFE0) /* Interrupt status reg (RO) */
#define MAC_INTENABLE       LONG_REG(MAC_BASE_ADDR + 0xFE4) /* Interrupt enable reg  */
#define MAC_INTCLEAR        LONG_REG(MAC_BASE_ADDR + 0xFE8) /* Interrupt clear reg (WO) */
#define MAC_INTSET          LONG_REG(MAC_BASE_ADDR + 0xFEC) /* Interrupt set reg (WO) */

#define MAC_POWERDOWN       LONG_REG(MAC_BASE_ADDR + 0xFF4) /* Power-down reg */
#define MAC_MODULEID        LONG_REG(MAC_BASE_ADDR + 0xFFC) /* Module ID reg (RO) */


/* Some bit-mask definitions - mthomas */

/* Timers */
#define TxIR_MR0_Interrupt (1UL<<0)
#define TxIR_MR1_Interrupt (1UL<<1)
#define TxIR_MR2_Interrupt (1UL<<2)
#define TxIR_MR3_Interrupt (1UL<<3)
#define TxIR_CR0_Interrupt (1UL<<4)
#define TxIR_CR1_Interrupt (1UL<<5)
#define TxIR_CR2_Interrupt (1UL<<6)
#define TxIR_CR3_Interrupt (1UL<<7)

#define TxTCR_Counter_Enable (1UL<<0)
#define TxTCR_Counter_Reset  (1UL<<1)

#define TxMCR_MR0I  (1UL<<0)
#define TxMCR_MR0R  (1UL<<1)
#define TxMCR_MR0S  (1UL<<2)
#define TxMCR_MR1I  (1UL<<3)
#define TxMCR_MR1R  (1UL<<4)
#define TxMCR_MR1S  (1UL<<5)
#define TxMCR_MR2I  (1UL<<6)
#define TxMCR_MR2R  (1UL<<7)
#define TxMCR_MR2S  (1UL<<8)
#define TxMCR_MR3I  (1UL<<9)
#define TxMCR_MR3R  (1UL<<10)
#define TxMCR_MR3S  (1UL<<11)

/* VIC */
#define VIC_CHAN_NUM_WDT      0
#define VIC_CHAN_NUM_UNUSED   1
#define VIC_CHAN_NUM_ARM_Core_DgbCommRX 2
#define VIC_CHAN_NUM_ARM_Core_DbgCommTX 3
#define VIC_CHAN_NUM_Timer0   4
#define VIC_CHAN_NUM_Timer1   5
#define VIC_CHAN_NUM_UART0    6
#define VIC_CHAN_NUM_UART1    7
#define VIC_CHAN_NUM_PWM1     8
#define VIC_CHAN_NUM_I2C0     9
#define VIC_CHAN_NUM_SPI     10
#define VIC_CHAN_NUM_SSP0    10
#define VIC_CHAN_NUM_SSP1    11
#define VIC_CHAN_NUM_PLL     12
#define VIC_CHAN_NUM_RTC     13
#define VIC_CHAN_NUM_EINT0   14
#define VIC_CHAN_NUM_EINT1   15
#define VIC_CHAN_NUM_EINT2   16
#define VIC_CHAN_NUM_EINT3   17
#define VIC_CHAN_NUM_ADC0    18
#define VIC_CHAN_NUM_I2C1    19
#define VIC_CHAN_NUM_BOD     20
#define VIC_CHAN_NUM_Ethernet 21
#define VIC_CHAN_NUM_USB     22
#define VIC_CHAN_NUM_CAN     23
#define VIC_CHAN_NUM_SD_MMC  24
#define VIC_CHAN_NUM_GP_DMA  25
#define VIC_CHAN_NUM_Timer2  26
#define VIC_CHAN_NUM_Timer3  27
#define VIC_CHAN_NUM_UART2   28
#define VIC_CHAN_NUM_UART3   29
#define VIC_CHAN_NUM_I2C2    30
#define VIC_CHAN_NUM_I2S     31

#define VIC_CHAN_TO_MASK(vctm_chan_num__) (1UL<<vctm_chan_num__)

#endif  /* __LPC23xx_H */

