Remove files accidentally added to repository.
diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/LPCUSB/usbhw_lpc.c.bak b/Demo/CORTEX_LPC1768_GCC_Rowley/LPCUSB/usbhw_lpc.c.bak
deleted file mode 100644
index 29de3de..0000000
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/LPCUSB/usbhw_lpc.c.bak
+++ /dev/null
@@ -1,521 +0,0 @@
-/*

-	LPCUSB, an USB device driver for LPC microcontrollers

-	Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)

-

-	Redistribution and use in source and binary forms, with or without

-	modification, are permitted provided that the following conditions are met:

-

-	1. Redistributions of source code must retain the above copyright

-	   notice, this list of conditions and the following disclaimer.

-	2. Redistributions in binary form must reproduce the above copyright

-	   notice, this list of conditions and the following disclaimer in the

-	   documentation and/or other materials provided with the distribution.

-	3. The name of the author may not be used to endorse or promote products

-	   derived from this software without specific prior written permission.

-

-	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR

-	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES

-	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.

-	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,

-	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT

-	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

-	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

-	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

-	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

-	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-*/

-

-

-/** @file

-	USB hardware layer

- */

-

-

-#include "usbdebug.h"

-#include "usbhw_lpc.h"

-#include "usbapi.h"

-

-/** Installed device interrupt handler */

-static TFnDevIntHandler *_pfnDevIntHandler = NULL;

-/** Installed endpoint interrupt handlers */

-static TFnEPIntHandler	*_apfnEPIntHandlers[16];

-/** Installed frame interrupt handlers */

-static TFnFrameHandler	*_pfnFrameHandler = NULL;

-

-/** convert from endpoint address to endpoint index */

-#define EP2IDX(bEP)	((((bEP)&0xF)<<1)|(((bEP)&0x80)>>7))

-/** convert from endpoint index to endpoint address */

-#define IDX2EP(idx)	((((idx)<<7)&0x80)|(((idx)>>1)&0xF))

-

-

-

-/**

-	Local function to wait for a device interrupt (and clear it)

-

-	@param [in]	dwIntr		Bitmask of interrupts to wait for

- */

-static void Wait4DevInt(unsigned long dwIntr)

-{

-	// wait for specific interrupt

-	while ((USB->USBDevIntSt & dwIntr) != dwIntr);

-	// clear the interrupt bits

-	USB->USBDevIntClr = dwIntr;

-}

-

-

-/**

-	Local function to send a command to the USB protocol engine

-

-	@param [in]	bCmd		Command to send

- */

-static void USBHwCmd(unsigned char bCmd)

-{

-	// clear CDFULL/CCEMTY

-	USB->USBDevIntClr = CDFULL | CCEMTY;

-	// write command code

-	USB->USBCmdCode = 0x00000500 | (bCmd << 16);

-	Wait4DevInt(CCEMTY);

-}

-

-

-/**

-	Local function to send a command + data to the USB protocol engine

-

-	@param [in]	bCmd		Command to send

-	@param [in]	bData		Data to send

- */

-static void USBHwCmdWrite(unsigned char bCmd, unsigned short bData)

-{

-	// write command code

-	USBHwCmd(bCmd);

-

-	// write command data

-	USB->USBCmdCode = 0x00000100 | (bData << 16);

-	Wait4DevInt(CCEMTY);

-}

-

-

-/**

-	Local function to send a command to the USB protocol engine and read data

-

-	@param [in]	bCmd		Command to send

-

-	@return the data

- */

-static unsigned char USBHwCmdRead(unsigned char bCmd)

-{

-	// write command code

-	USBHwCmd(bCmd);

-

-	// get data

-	USB->USBCmdCode = 0x00000200 | (bCmd << 16);

-	Wait4DevInt(CDFULL);

-	return USB->USBCmdData;

-}

-

-

-/**

-	'Realizes' an endpoint, meaning that buffer space is reserved for

-	it. An endpoint needs to be realised before it can be used.

-

-	From experiments, it appears that a USB reset causes USBReEP to

-	re-initialise to 3 (= just the control endpoints).

-	However, a USB bus reset does not disturb the USBMaxPSize settings.

-

-	@param [in]	idx			Endpoint index

-	@param [in] wMaxPSize	Maximum packet size for this endpoint

- */

-static void USBHwEPRealize(int idx, unsigned short wMaxPSize)

-{

-	USB->USBReEP |= (1 << idx);

-	USB->USBEpInd = idx;

-	USB->USBMaxPSize = wMaxPSize;

-	Wait4DevInt(EP_RLZED);

-}

-

-

-/**

-	Enables or disables an endpoint

-

-	@param [in]	idx		Endpoint index

-	@param [in]	fEnable	TRUE to enable, FALSE to disable

- */

-static void USBHwEPEnable(int idx, BOOL fEnable)

-{

-	USBHwCmdWrite(CMD_EP_SET_STATUS | idx, fEnable ? 0 : EP_DA);

-}

-

-

-/**

-	Configures an endpoint and enables it

-

-	@param [in]	bEP				Endpoint number

-	@param [in]	wMaxPacketSize	Maximum packet size for this EP

- */

-void USBHwEPConfig(unsigned char bEP, unsigned short wMaxPacketSize)

-{

-	int idx;

-

-	idx = EP2IDX(bEP);

-

-	// realise EP

-	USBHwEPRealize(idx, wMaxPacketSize);

-

-	// enable EP

-	USBHwEPEnable(idx, TRUE);

-}

-

-

-/**

-	Registers an endpoint event callback

-

-	@param [in]	bEP				Endpoint number

-	@param [in]	pfnHandler		Callback function

- */

-void USBHwRegisterEPIntHandler(unsigned char bEP, TFnEPIntHandler *pfnHandler)

-{

-	int idx;

-

-	idx = EP2IDX(bEP);

-

-	ASSERT(idx<32);

-

-	/* add handler to list of EP handlers */

-	_apfnEPIntHandlers[idx / 2] = pfnHandler;

-

-	/* enable EP interrupt */

-	USB->USBEpIntEn |= (1 << idx);

-	USB->USBDevIntEn |= EP_SLOW;

-

-	DBG("Registered handler for EP 0x%x\n", bEP);

-}

-

-

-/**

-	Registers an device status callback

-

-	@param [in]	pfnHandler	Callback function

- */

-void USBHwRegisterDevIntHandler(TFnDevIntHandler *pfnHandler)

-{

-	_pfnDevIntHandler = pfnHandler;

-

-	// enable device interrupt

-	USB->USBDevIntEn |= DEV_STAT;

-

-	DBG("Registered handler for device status\n");

-}

-

-

-/**

-	Registers the frame callback

-

-	@param [in]	pfnHandler	Callback function

- */

-void USBHwRegisterFrameHandler(TFnFrameHandler *pfnHandler)

-{

-	_pfnFrameHandler = pfnHandler;

-

-	// enable device interrupt

-	USB->USBDevIntEn |= FRAME;

-

-	DBG("Registered handler for frame\n");

-}

-

-

-/**

-	Sets the USB address.

-

-	@param [in]	bAddr		Device address to set

- */

-void USBHwSetAddress(unsigned char bAddr)

-{

-	USBHwCmdWrite(CMD_DEV_SET_ADDRESS, DEV_EN | bAddr);

-}

-

-

-/**

-	Connects or disconnects from the USB bus

-

-	@param [in]	fConnect	If TRUE, connect, otherwise disconnect

- */

-void USBHwConnect(BOOL fConnect)

-{

-	USBHwCmdWrite(CMD_DEV_STATUS, fConnect ? CON : 0);

-}

-

-

-/**

-	Enables interrupt on NAK condition

-

-	For IN endpoints a NAK is generated when the host wants to read data

-	from the device, but none is available in the endpoint buffer.

-	For OUT endpoints a NAK is generated when the host wants to write data

-	to the device, but the endpoint buffer is still full.

-

-	The endpoint interrupt handlers can distinguish regular (ACK) interrupts

-	from NAK interrupt by checking the bits in their bEPStatus argument.

-

-	@param [in]	bIntBits	Bitmap indicating which NAK interrupts to enable

- */

-void USBHwNakIntEnable(unsigned char bIntBits)

-{

-	USBHwCmdWrite(CMD_DEV_SET_MODE, bIntBits);

-}

-

-

-/**

-	Gets the status from a specific endpoint.

-

-	@param [in]	bEP		Endpoint number

-	@return Endpoint status byte (containing EP_STATUS_xxx bits)

- */

-unsigned char	USBHwEPGetStatus(unsigned char bEP)

-{

-	int idx = EP2IDX(bEP);

-

-	return USBHwCmdRead(CMD_EP_SELECT | idx);

-}

-

-

-/**

-	Sets the stalled property of an endpoint

-

-	@param [in]	bEP		Endpoint number

-	@param [in]	fStall	TRUE to stall, FALSE to unstall

- */

-void USBHwEPStall(unsigned char bEP, BOOL fStall)

-{

-	int idx = EP2IDX(bEP);

-

-	USBHwCmdWrite(CMD_EP_SET_STATUS | idx, fStall ? EP_ST : 0);

-}

-

-

-/**

-	Writes data to an endpoint buffer

-

-	@param [in]	bEP		Endpoint number

-	@param [in]	pbBuf	Endpoint data

-	@param [in]	iLen	Number of bytes to write

-

-	@return TRUE if the data was successfully written or <0 in case of error.

-*/

-int USBHwEPWrite(unsigned char bEP, unsigned char *pbBuf, int iLen)

-{

-	int idx;

-

-	idx = EP2IDX(bEP);

-

-	// set write enable for specific endpoint

-	USB->USBCtrl = WR_EN | ((bEP & 0xF) << 2);

-

-	// set packet length

-	USB->USBTxPLen = iLen;

-

-	// write data

-	while (USB->USBCtrl & WR_EN) {

-		USB->USBTxData = (pbBuf[3] << 24) | (pbBuf[2] << 16) | (pbBuf[1] << 8) | pbBuf[0];

-		pbBuf += 4;

-	}

-

-	// select endpoint and validate buffer

-	USBHwCmd(CMD_EP_SELECT | idx);

-	USBHwCmd(CMD_EP_VALIDATE_BUFFER);

-

-	return iLen;

-}

-

-

-/**

-	Reads data from an endpoint buffer

-

-	@param [in]	bEP		Endpoint number

-	@param [in]	pbBuf	Endpoint data

-	@param [in]	iMaxLen	Maximum number of bytes to read

-

-	@return the number of bytes available in the EP (possibly more than iMaxLen),

-	or <0 in case of error.

- */

-int USBHwEPRead(unsigned char bEP, unsigned char *pbBuf, int iMaxLen)

-{

-	unsigned int i, idx;

-	unsigned long	dwData, dwLen;

-

-	idx = EP2IDX(bEP);

-

-	// set read enable bit for specific endpoint

-	USB->USBCtrl = RD_EN | ((bEP & 0xF) << 2);

-

-	// wait for PKT_RDY

-	do {

-		dwLen = USB->USBRxPLen;

-	} while ((dwLen & PKT_RDY) == 0);

-

-	// packet valid?

-	if ((dwLen & DV) == 0) {

-		return -1;

-	}

-

-	// get length

-	dwLen &= PKT_LNGTH_MASK;

-

-	// get data

-	dwData = 0;

-	for (i = 0; i < dwLen; i++) {

-		if ((i % 4) == 0) {

-			dwData = USB->USBRxData;

-		}

-		if ((pbBuf != NULL) && (i < iMaxLen)) {

-			pbBuf[i] = dwData & 0xFF;

-		}

-		dwData >>= 8;

-	}

-

-	// make sure RD_EN is clear

-	USB->USBCtrl = 0;

-

-	// select endpoint and clear buffer

-	USBHwCmd(CMD_EP_SELECT | idx);

-	USBHwCmd(CMD_EP_CLEAR_BUFFER);

-

-	return dwLen;

-}

-

-

-/**

-	Sets the 'configured' state.

-

-	All registered endpoints are 'realised' and enabled, and the

-	'configured' bit is set in the device status register.

-

-	@param [in]	fConfigured	If TRUE, configure device, else unconfigure

- */

-void USBHwConfigDevice(BOOL fConfigured)

-{

-	// set configured bit

-	USBHwCmdWrite(CMD_DEV_CONFIG, fConfigured ? CONF_DEVICE : 0);

-}

-

-

-/**

-	USB interrupt handler

-

-	@todo Get all 11 bits of frame number instead of just 8

-

-	Endpoint interrupts are mapped to the slow interrupt

- */

-void USBHwISR(void)

-{

-	unsigned long	dwStatus;

-	unsigned long dwIntBit;

-	unsigned char	bEPStat, bDevStat, bStat;

-	int i;

-	unsigned short	wFrame;

-

-	// handle device interrupts

-	dwStatus = USB->USBDevIntSt;

-

-	// frame interrupt

-	if (dwStatus & FRAME) {

-		// clear int

-		USB->USBDevIntClr = FRAME;

-		// call handler

-		if (_pfnFrameHandler != NULL) {

-			wFrame = USBHwCmdRead(CMD_DEV_READ_CUR_FRAME_NR);

-			_pfnFrameHandler(wFrame);

-		}

-	}

-

-	// device status interrupt

-	if (dwStatus & DEV_STAT) {

-		/*	Clear DEV_STAT interrupt before reading DEV_STAT register.

-			This prevents corrupted device status reads, see

-			LPC2148 User manual revision 2, 25 july 2006.

-		*/

-		USB->USBDevIntClr = DEV_STAT;

-		bDevStat = USBHwCmdRead(CMD_DEV_STATUS);

-		if (bDevStat & (CON_CH | SUS_CH | RST)) {

-			// convert device status into something HW independent

-			bStat = ((bDevStat & CON) ? DEV_STATUS_CONNECT : 0) |

-					((bDevStat & SUS) ? DEV_STATUS_SUSPEND : 0) |

-					((bDevStat & RST) ? DEV_STATUS_RESET : 0);

-			// call handler

-			if (_pfnDevIntHandler != NULL) {

-				_pfnDevIntHandler(bStat);

-			}

-		}

-	}

-

-	// endpoint interrupt

-	if (dwStatus & EP_SLOW) {

-		// clear EP_SLOW

-		USB->USBDevIntClr = EP_SLOW;

-		// check all endpoints

-		for (i = 0; i < 32; i++) {

-			dwIntBit = (1 << i);

-			if (USB->USBEpIntSt & dwIntBit) {

-				// clear int (and retrieve status)

-				USB->USBEpIntClr = dwIntBit;

-				Wait4DevInt(CDFULL);

-				bEPStat = USB->USBCmdData;

-				// convert EP pipe stat into something HW independent

-				bStat = ((bEPStat & EPSTAT_FE) ? EP_STATUS_DATA : 0) |

-						((bEPStat & EPSTAT_ST) ? EP_STATUS_STALLED : 0) |

-						((bEPStat & EPSTAT_STP) ? EP_STATUS_SETUP : 0) |

-						((bEPStat & EPSTAT_EPN) ? EP_STATUS_NACKED : 0) |

-						((bEPStat & EPSTAT_PO) ? EP_STATUS_ERROR : 0);

-				// call handler

-				if (_apfnEPIntHandlers[i / 2] != NULL) {

-					_apfnEPIntHandlers[i / 2](IDX2EP(i), bStat);

-				}

-			}

-		}

-	}

-}

-

-

-

-/**

-	Initialises the USB hardware

-

-

-	@return TRUE if the hardware was successfully initialised

- */

-BOOL USBHwInit(void)

-{

-	// P2.9 -> USB_CONNECT

-	PINCON->PINSEL4 &= ~0x000C0000;

-	PINCON->PINSEL4 |= 0x00040000;

-

-	// P1.18 -> USB_UP_LED

-	// P1.30 -> VBUS

-	PINCON->PINSEL3 &= ~0x30000030;

-	PINCON->PINSEL3 |= 0x20000010;

-

-	// P0.29 -> USB_D+

-	// P0.30 -> USB_D-

-	PINCON->PINSEL1 &= ~0x3C000000;

-	PINCON->PINSEL1 |= 0x14000000;

-

-	// enable PUSB

-	SC->PCONP |= (1 << 31);

-

-	USB->OTGClkCtrl = 0x12;	                  /* Dev clock, AHB clock enable  */

-	while ((USB->OTGClkSt & 0x12) != 0x12);

-

-	// disable/clear all interrupts for now

-	USB->USBDevIntEn = 0;

-	USB->USBDevIntClr = 0xFFFFFFFF;

-	USB->USBDevIntPri = 0;

-

-	USB->USBEpIntEn = 0;

-	USB->USBEpIntClr = 0xFFFFFFFF;

-	USB->USBEpIntPri = 0;

-

-	// by default, only ACKs generate interrupts

-	USBHwNakIntEnable(0);

-

-	return TRUE;

-}

-

diff --git a/Demo/CORTEX_LPC1768_IAR/LPCUSB/usbhw_lpc.c.bak b/Demo/CORTEX_LPC1768_IAR/LPCUSB/usbhw_lpc.c.bak
deleted file mode 100644
index 29de3de..0000000
--- a/Demo/CORTEX_LPC1768_IAR/LPCUSB/usbhw_lpc.c.bak
+++ /dev/null
@@ -1,521 +0,0 @@
-/*

-	LPCUSB, an USB device driver for LPC microcontrollers

-	Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)

-

-	Redistribution and use in source and binary forms, with or without

-	modification, are permitted provided that the following conditions are met:

-

-	1. Redistributions of source code must retain the above copyright

-	   notice, this list of conditions and the following disclaimer.

-	2. Redistributions in binary form must reproduce the above copyright

-	   notice, this list of conditions and the following disclaimer in the

-	   documentation and/or other materials provided with the distribution.

-	3. The name of the author may not be used to endorse or promote products

-	   derived from this software without specific prior written permission.

-

-	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR

-	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES

-	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.

-	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,

-	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT

-	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

-	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

-	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

-	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

-	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-*/

-

-

-/** @file

-	USB hardware layer

- */

-

-

-#include "usbdebug.h"

-#include "usbhw_lpc.h"

-#include "usbapi.h"

-

-/** Installed device interrupt handler */

-static TFnDevIntHandler *_pfnDevIntHandler = NULL;

-/** Installed endpoint interrupt handlers */

-static TFnEPIntHandler	*_apfnEPIntHandlers[16];

-/** Installed frame interrupt handlers */

-static TFnFrameHandler	*_pfnFrameHandler = NULL;

-

-/** convert from endpoint address to endpoint index */

-#define EP2IDX(bEP)	((((bEP)&0xF)<<1)|(((bEP)&0x80)>>7))

-/** convert from endpoint index to endpoint address */

-#define IDX2EP(idx)	((((idx)<<7)&0x80)|(((idx)>>1)&0xF))

-

-

-

-/**

-	Local function to wait for a device interrupt (and clear it)

-

-	@param [in]	dwIntr		Bitmask of interrupts to wait for

- */

-static void Wait4DevInt(unsigned long dwIntr)

-{

-	// wait for specific interrupt

-	while ((USB->USBDevIntSt & dwIntr) != dwIntr);

-	// clear the interrupt bits

-	USB->USBDevIntClr = dwIntr;

-}

-

-

-/**

-	Local function to send a command to the USB protocol engine

-

-	@param [in]	bCmd		Command to send

- */

-static void USBHwCmd(unsigned char bCmd)

-{

-	// clear CDFULL/CCEMTY

-	USB->USBDevIntClr = CDFULL | CCEMTY;

-	// write command code

-	USB->USBCmdCode = 0x00000500 | (bCmd << 16);

-	Wait4DevInt(CCEMTY);

-}

-

-

-/**

-	Local function to send a command + data to the USB protocol engine

-

-	@param [in]	bCmd		Command to send

-	@param [in]	bData		Data to send

- */

-static void USBHwCmdWrite(unsigned char bCmd, unsigned short bData)

-{

-	// write command code

-	USBHwCmd(bCmd);

-

-	// write command data

-	USB->USBCmdCode = 0x00000100 | (bData << 16);

-	Wait4DevInt(CCEMTY);

-}

-

-

-/**

-	Local function to send a command to the USB protocol engine and read data

-

-	@param [in]	bCmd		Command to send

-

-	@return the data

- */

-static unsigned char USBHwCmdRead(unsigned char bCmd)

-{

-	// write command code

-	USBHwCmd(bCmd);

-

-	// get data

-	USB->USBCmdCode = 0x00000200 | (bCmd << 16);

-	Wait4DevInt(CDFULL);

-	return USB->USBCmdData;

-}

-

-

-/**

-	'Realizes' an endpoint, meaning that buffer space is reserved for

-	it. An endpoint needs to be realised before it can be used.

-

-	From experiments, it appears that a USB reset causes USBReEP to

-	re-initialise to 3 (= just the control endpoints).

-	However, a USB bus reset does not disturb the USBMaxPSize settings.

-

-	@param [in]	idx			Endpoint index

-	@param [in] wMaxPSize	Maximum packet size for this endpoint

- */

-static void USBHwEPRealize(int idx, unsigned short wMaxPSize)

-{

-	USB->USBReEP |= (1 << idx);

-	USB->USBEpInd = idx;

-	USB->USBMaxPSize = wMaxPSize;

-	Wait4DevInt(EP_RLZED);

-}

-

-

-/**

-	Enables or disables an endpoint

-

-	@param [in]	idx		Endpoint index

-	@param [in]	fEnable	TRUE to enable, FALSE to disable

- */

-static void USBHwEPEnable(int idx, BOOL fEnable)

-{

-	USBHwCmdWrite(CMD_EP_SET_STATUS | idx, fEnable ? 0 : EP_DA);

-}

-

-

-/**

-	Configures an endpoint and enables it

-

-	@param [in]	bEP				Endpoint number

-	@param [in]	wMaxPacketSize	Maximum packet size for this EP

- */

-void USBHwEPConfig(unsigned char bEP, unsigned short wMaxPacketSize)

-{

-	int idx;

-

-	idx = EP2IDX(bEP);

-

-	// realise EP

-	USBHwEPRealize(idx, wMaxPacketSize);

-

-	// enable EP

-	USBHwEPEnable(idx, TRUE);

-}

-

-

-/**

-	Registers an endpoint event callback

-

-	@param [in]	bEP				Endpoint number

-	@param [in]	pfnHandler		Callback function

- */

-void USBHwRegisterEPIntHandler(unsigned char bEP, TFnEPIntHandler *pfnHandler)

-{

-	int idx;

-

-	idx = EP2IDX(bEP);

-

-	ASSERT(idx<32);

-

-	/* add handler to list of EP handlers */

-	_apfnEPIntHandlers[idx / 2] = pfnHandler;

-

-	/* enable EP interrupt */

-	USB->USBEpIntEn |= (1 << idx);

-	USB->USBDevIntEn |= EP_SLOW;

-

-	DBG("Registered handler for EP 0x%x\n", bEP);

-}

-

-

-/**

-	Registers an device status callback

-

-	@param [in]	pfnHandler	Callback function

- */

-void USBHwRegisterDevIntHandler(TFnDevIntHandler *pfnHandler)

-{

-	_pfnDevIntHandler = pfnHandler;

-

-	// enable device interrupt

-	USB->USBDevIntEn |= DEV_STAT;

-

-	DBG("Registered handler for device status\n");

-}

-

-

-/**

-	Registers the frame callback

-

-	@param [in]	pfnHandler	Callback function

- */

-void USBHwRegisterFrameHandler(TFnFrameHandler *pfnHandler)

-{

-	_pfnFrameHandler = pfnHandler;

-

-	// enable device interrupt

-	USB->USBDevIntEn |= FRAME;

-

-	DBG("Registered handler for frame\n");

-}

-

-

-/**

-	Sets the USB address.

-

-	@param [in]	bAddr		Device address to set

- */

-void USBHwSetAddress(unsigned char bAddr)

-{

-	USBHwCmdWrite(CMD_DEV_SET_ADDRESS, DEV_EN | bAddr);

-}

-

-

-/**

-	Connects or disconnects from the USB bus

-

-	@param [in]	fConnect	If TRUE, connect, otherwise disconnect

- */

-void USBHwConnect(BOOL fConnect)

-{

-	USBHwCmdWrite(CMD_DEV_STATUS, fConnect ? CON : 0);

-}

-

-

-/**

-	Enables interrupt on NAK condition

-

-	For IN endpoints a NAK is generated when the host wants to read data

-	from the device, but none is available in the endpoint buffer.

-	For OUT endpoints a NAK is generated when the host wants to write data

-	to the device, but the endpoint buffer is still full.

-

-	The endpoint interrupt handlers can distinguish regular (ACK) interrupts

-	from NAK interrupt by checking the bits in their bEPStatus argument.

-

-	@param [in]	bIntBits	Bitmap indicating which NAK interrupts to enable

- */

-void USBHwNakIntEnable(unsigned char bIntBits)

-{

-	USBHwCmdWrite(CMD_DEV_SET_MODE, bIntBits);

-}

-

-

-/**

-	Gets the status from a specific endpoint.

-

-	@param [in]	bEP		Endpoint number

-	@return Endpoint status byte (containing EP_STATUS_xxx bits)

- */

-unsigned char	USBHwEPGetStatus(unsigned char bEP)

-{

-	int idx = EP2IDX(bEP);

-

-	return USBHwCmdRead(CMD_EP_SELECT | idx);

-}

-

-

-/**

-	Sets the stalled property of an endpoint

-

-	@param [in]	bEP		Endpoint number

-	@param [in]	fStall	TRUE to stall, FALSE to unstall

- */

-void USBHwEPStall(unsigned char bEP, BOOL fStall)

-{

-	int idx = EP2IDX(bEP);

-

-	USBHwCmdWrite(CMD_EP_SET_STATUS | idx, fStall ? EP_ST : 0);

-}

-

-

-/**

-	Writes data to an endpoint buffer

-

-	@param [in]	bEP		Endpoint number

-	@param [in]	pbBuf	Endpoint data

-	@param [in]	iLen	Number of bytes to write

-

-	@return TRUE if the data was successfully written or <0 in case of error.

-*/

-int USBHwEPWrite(unsigned char bEP, unsigned char *pbBuf, int iLen)

-{

-	int idx;

-

-	idx = EP2IDX(bEP);

-

-	// set write enable for specific endpoint

-	USB->USBCtrl = WR_EN | ((bEP & 0xF) << 2);

-

-	// set packet length

-	USB->USBTxPLen = iLen;

-

-	// write data

-	while (USB->USBCtrl & WR_EN) {

-		USB->USBTxData = (pbBuf[3] << 24) | (pbBuf[2] << 16) | (pbBuf[1] << 8) | pbBuf[0];

-		pbBuf += 4;

-	}

-

-	// select endpoint and validate buffer

-	USBHwCmd(CMD_EP_SELECT | idx);

-	USBHwCmd(CMD_EP_VALIDATE_BUFFER);

-

-	return iLen;

-}

-

-

-/**

-	Reads data from an endpoint buffer

-

-	@param [in]	bEP		Endpoint number

-	@param [in]	pbBuf	Endpoint data

-	@param [in]	iMaxLen	Maximum number of bytes to read

-

-	@return the number of bytes available in the EP (possibly more than iMaxLen),

-	or <0 in case of error.

- */

-int USBHwEPRead(unsigned char bEP, unsigned char *pbBuf, int iMaxLen)

-{

-	unsigned int i, idx;

-	unsigned long	dwData, dwLen;

-

-	idx = EP2IDX(bEP);

-

-	// set read enable bit for specific endpoint

-	USB->USBCtrl = RD_EN | ((bEP & 0xF) << 2);

-

-	// wait for PKT_RDY

-	do {

-		dwLen = USB->USBRxPLen;

-	} while ((dwLen & PKT_RDY) == 0);

-

-	// packet valid?

-	if ((dwLen & DV) == 0) {

-		return -1;

-	}

-

-	// get length

-	dwLen &= PKT_LNGTH_MASK;

-

-	// get data

-	dwData = 0;

-	for (i = 0; i < dwLen; i++) {

-		if ((i % 4) == 0) {

-			dwData = USB->USBRxData;

-		}

-		if ((pbBuf != NULL) && (i < iMaxLen)) {

-			pbBuf[i] = dwData & 0xFF;

-		}

-		dwData >>= 8;

-	}

-

-	// make sure RD_EN is clear

-	USB->USBCtrl = 0;

-

-	// select endpoint and clear buffer

-	USBHwCmd(CMD_EP_SELECT | idx);

-	USBHwCmd(CMD_EP_CLEAR_BUFFER);

-

-	return dwLen;

-}

-

-

-/**

-	Sets the 'configured' state.

-

-	All registered endpoints are 'realised' and enabled, and the

-	'configured' bit is set in the device status register.

-

-	@param [in]	fConfigured	If TRUE, configure device, else unconfigure

- */

-void USBHwConfigDevice(BOOL fConfigured)

-{

-	// set configured bit

-	USBHwCmdWrite(CMD_DEV_CONFIG, fConfigured ? CONF_DEVICE : 0);

-}

-

-

-/**

-	USB interrupt handler

-

-	@todo Get all 11 bits of frame number instead of just 8

-

-	Endpoint interrupts are mapped to the slow interrupt

- */

-void USBHwISR(void)

-{

-	unsigned long	dwStatus;

-	unsigned long dwIntBit;

-	unsigned char	bEPStat, bDevStat, bStat;

-	int i;

-	unsigned short	wFrame;

-

-	// handle device interrupts

-	dwStatus = USB->USBDevIntSt;

-

-	// frame interrupt

-	if (dwStatus & FRAME) {

-		// clear int

-		USB->USBDevIntClr = FRAME;

-		// call handler

-		if (_pfnFrameHandler != NULL) {

-			wFrame = USBHwCmdRead(CMD_DEV_READ_CUR_FRAME_NR);

-			_pfnFrameHandler(wFrame);

-		}

-	}

-

-	// device status interrupt

-	if (dwStatus & DEV_STAT) {

-		/*	Clear DEV_STAT interrupt before reading DEV_STAT register.

-			This prevents corrupted device status reads, see

-			LPC2148 User manual revision 2, 25 july 2006.

-		*/

-		USB->USBDevIntClr = DEV_STAT;

-		bDevStat = USBHwCmdRead(CMD_DEV_STATUS);

-		if (bDevStat & (CON_CH | SUS_CH | RST)) {

-			// convert device status into something HW independent

-			bStat = ((bDevStat & CON) ? DEV_STATUS_CONNECT : 0) |

-					((bDevStat & SUS) ? DEV_STATUS_SUSPEND : 0) |

-					((bDevStat & RST) ? DEV_STATUS_RESET : 0);

-			// call handler

-			if (_pfnDevIntHandler != NULL) {

-				_pfnDevIntHandler(bStat);

-			}

-		}

-	}

-

-	// endpoint interrupt

-	if (dwStatus & EP_SLOW) {

-		// clear EP_SLOW

-		USB->USBDevIntClr = EP_SLOW;

-		// check all endpoints

-		for (i = 0; i < 32; i++) {

-			dwIntBit = (1 << i);

-			if (USB->USBEpIntSt & dwIntBit) {

-				// clear int (and retrieve status)

-				USB->USBEpIntClr = dwIntBit;

-				Wait4DevInt(CDFULL);

-				bEPStat = USB->USBCmdData;

-				// convert EP pipe stat into something HW independent

-				bStat = ((bEPStat & EPSTAT_FE) ? EP_STATUS_DATA : 0) |

-						((bEPStat & EPSTAT_ST) ? EP_STATUS_STALLED : 0) |

-						((bEPStat & EPSTAT_STP) ? EP_STATUS_SETUP : 0) |

-						((bEPStat & EPSTAT_EPN) ? EP_STATUS_NACKED : 0) |

-						((bEPStat & EPSTAT_PO) ? EP_STATUS_ERROR : 0);

-				// call handler

-				if (_apfnEPIntHandlers[i / 2] != NULL) {

-					_apfnEPIntHandlers[i / 2](IDX2EP(i), bStat);

-				}

-			}

-		}

-	}

-}

-

-

-

-/**

-	Initialises the USB hardware

-

-

-	@return TRUE if the hardware was successfully initialised

- */

-BOOL USBHwInit(void)

-{

-	// P2.9 -> USB_CONNECT

-	PINCON->PINSEL4 &= ~0x000C0000;

-	PINCON->PINSEL4 |= 0x00040000;

-

-	// P1.18 -> USB_UP_LED

-	// P1.30 -> VBUS

-	PINCON->PINSEL3 &= ~0x30000030;

-	PINCON->PINSEL3 |= 0x20000010;

-

-	// P0.29 -> USB_D+

-	// P0.30 -> USB_D-

-	PINCON->PINSEL1 &= ~0x3C000000;

-	PINCON->PINSEL1 |= 0x14000000;

-

-	// enable PUSB

-	SC->PCONP |= (1 << 31);

-

-	USB->OTGClkCtrl = 0x12;	                  /* Dev clock, AHB clock enable  */

-	while ((USB->OTGClkSt & 0x12) != 0x12);

-

-	// disable/clear all interrupts for now

-	USB->USBDevIntEn = 0;

-	USB->USBDevIntClr = 0xFFFFFFFF;

-	USB->USBDevIntPri = 0;

-

-	USB->USBEpIntEn = 0;

-	USB->USBEpIntClr = 0xFFFFFFFF;

-	USB->USBEpIntPri = 0;

-

-	// by default, only ACKs generate interrupts

-	USBHwNakIntEnable(0);

-

-	return TRUE;

-}

-