SD

Dependents:   Andar_Linha_Reta_Robo_Claw_v1

Fork of MSCFileSystem by Chris Styles

Files at this revision

API Documentation at this revision

Comitter:
carlos_nascimento08
Date:
Sun Sep 16 15:00:33 2012 +0000
Parent:
4:dcc326e4d358
Commit message:
USB;

Changed in this revision

USBHostLite/usbhost_cpu.h Show annotated file Show diff for this revision Revisions of this file
USBHostLite/usbhost_err.h Show annotated file Show diff for this revision Revisions of this file
USBHostLite/usbhost_inc.h Show annotated file Show diff for this revision Revisions of this file
USBHostLite/usbhost_lpc17xx.cpp Show annotated file Show diff for this revision Revisions of this file
USBHostLite/usbhost_lpc17xx.h Show annotated file Show diff for this revision Revisions of this file
USBHostLite/usbhost_ms.cpp Show annotated file Show diff for this revision Revisions of this file
USBHostLite/usbhost_ms.h Show annotated file Show diff for this revision Revisions of this file
--- a/USBHostLite/usbhost_cpu.h	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_cpu.h	Sun Sep 16 15:00:33 2012 +0000
@@ -1,35 +1,35 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_cpu.h
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
-
-#ifndef  USBHOST_CPU_H
-#define  USBHOST_CPU_H
-
-/*
-**************************************************************************************************************
-*                                           TYPE DEFINITIONS OF DATA TYPES
-**************************************************************************************************************
-*/
-
-typedef  unsigned int    USB_INT32U;
-typedef  signed   int    USB_INT32S;
-typedef  unsigned short  USB_INT16U;
-typedef  signed   short  USB_INT16S;
-typedef  unsigned char   USB_INT08U;
-typedef  signed   char   USB_INT08S;
-
-#endif
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_cpu.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_CPU_H
+#define  USBHOST_CPU_H
+
+/*
+**************************************************************************************************************
+*                                           TYPE DEFINITIONS OF DATA TYPES
+**************************************************************************************************************
+*/
+
+typedef  unsigned int    USB_INT32U;
+typedef  signed   int    USB_INT32S;
+typedef  unsigned short  USB_INT16U;
+typedef  signed   short  USB_INT16S;
+typedef  unsigned char   USB_INT08U;
+typedef  signed   char   USB_INT08S;
+
+#endif
--- a/USBHostLite/usbhost_err.h	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_err.h	Sun Sep 16 15:00:33 2012 +0000
@@ -1,63 +1,63 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_err.h
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
-
-#ifndef  USBHOST_ERR_H
-#define  USBHOST_ERR_H
-
-
-/*
-**************************************************************************************************************
-*                                        GENERAL DEFINITIONS
-**************************************************************************************************************
-*/
-
-#define  OK                        0
-#define  MATCH_FOUND               0
-
-/*
-**************************************************************************************************************
-*                                HOST CONTROLLER SPECIFIC ERROR CODES
-**************************************************************************************************************
-*/
-
-#define  ERR_TD_FAIL              -1
-
-/*
-**************************************************************************************************************
-*                                  MASS STORAGE SPECIFIC ERROR CODES
-**************************************************************************************************************
-*/
-
-#define  ERR_MS_CMD_FAILED       -10
-#define  ERR_BAD_CONFIGURATION   -11
-#define  ERR_NO_MS_INTERFACE     -12
-
-/*
-**************************************************************************************************************
-*                                      FAT SPECIFIC ERROR CODES
-**************************************************************************************************************
-*/
-
-#define  MATCH_NOT_FOUND         -20
-#define  ERR_FAT_NOT_SUPPORTED   -21
-#define  ERR_OPEN_LIMIT_REACHED  -22
-#define  ERR_INVALID_BOOT_SIG    -23
-#define  ERR_INVALID_BOOT_SEC    -24
-#define  ERR_ROOT_DIR_FULL       -25
-
-#endif
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_err.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_ERR_H
+#define  USBHOST_ERR_H
+
+
+/*
+**************************************************************************************************************
+*                                        GENERAL DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  OK                        0
+#define  MATCH_FOUND               0
+
+/*
+**************************************************************************************************************
+*                                HOST CONTROLLER SPECIFIC ERROR CODES
+**************************************************************************************************************
+*/
+
+#define  ERR_TD_FAIL              -1
+
+/*
+**************************************************************************************************************
+*                                  MASS STORAGE SPECIFIC ERROR CODES
+**************************************************************************************************************
+*/
+
+#define  ERR_MS_CMD_FAILED       -10
+#define  ERR_BAD_CONFIGURATION   -11
+#define  ERR_NO_MS_INTERFACE     -12
+
+/*
+**************************************************************************************************************
+*                                      FAT SPECIFIC ERROR CODES
+**************************************************************************************************************
+*/
+
+#define  MATCH_NOT_FOUND         -20
+#define  ERR_FAT_NOT_SUPPORTED   -21
+#define  ERR_OPEN_LIMIT_REACHED  -22
+#define  ERR_INVALID_BOOT_SIG    -23
+#define  ERR_INVALID_BOOT_SEC    -24
+#define  ERR_ROOT_DIR_FULL       -25
+
+#endif
--- a/USBHostLite/usbhost_inc.h	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_inc.h	Sun Sep 16 15:00:33 2012 +0000
@@ -1,39 +1,39 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_inc.h
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
-
-#ifndef  USBHOST_INC_H
-#define  USBHOST_INC_H
-
-/*
-**************************************************************************************************************
-*                                       INCLUDE HEADER FILES
-**************************************************************************************************************
-*/
-
-#include  "usbhost_cpu.h"
-#include  "usbhost_err.h"
-#include  "usbhost_lpc17xx.h"
-#include  "usbhost_ms.h"
-#include  "mbed.h"
-
-
-#ifdef TARGET_LPC2368
-#error "There is no USB host on the LPC2368!"
-#endif
-
-#endif
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_inc.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_INC_H
+#define  USBHOST_INC_H
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_cpu.h"
+#include  "usbhost_err.h"
+#include  "usbhost_lpc17xx.h"
+#include  "usbhost_ms.h"
+#include  "mbed.h"
+
+
+#ifdef TARGET_LPC2368
+#error "There is no USB host on the LPC2368!"
+#endif
+
+#endif
--- a/USBHostLite/usbhost_lpc17xx.cpp	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_lpc17xx.cpp	Sun Sep 16 15:00:33 2012 +0000
@@ -1,827 +1,827 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_lpc17xx.c
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
- 
-/*
-**************************************************************************************************************
-*                                            INCLUDE HEADER FILES
-**************************************************************************************************************
-*/
-
-#include  "usbhost_lpc17xx.h"
-
-/*
-**************************************************************************************************************
-*                                              GLOBAL VARIABLES
-**************************************************************************************************************
-*/
-int gUSBConnected;
-
-volatile  USB_INT32U   HOST_RhscIntr = 0;         /* Root Hub Status Change interrupt                       */
-volatile  USB_INT32U   HOST_WdhIntr  = 0;         /* Semaphore to wait until the TD is submitted            */
-volatile  USB_INT08U   HOST_TDControlStatus = 0;
-volatile  HCED        *EDCtrl;                    /* Control endpoint descriptor structure                  */
-volatile  HCED        *EDBulkIn;                  /* BulkIn endpoint descriptor  structure                  */
-volatile  HCED        *EDBulkOut;                 /* BulkOut endpoint descriptor structure                  */
-volatile  HCTD        *TDHead;                    /* Head transfer descriptor structure                     */
-volatile  HCTD        *TDTail;                    /* Tail transfer descriptor structure                     */
-volatile  HCCA        *Hcca;                      /* Host Controller Communications Area structure          */ 
-          USB_INT16U  *TDBufNonVol;               /* Identical to TDBuffer just to reduce compiler warnings */
-volatile  USB_INT08U  *TDBuffer;                  /* Current Buffer Pointer of transfer descriptor          */
-
-// USB host structures
-// AHB SRAM block 1
-#define HOSTBASEADDR 0x2007C000
-// reserve memory for the linker
-static USB_INT08U HostBuf[0x200] __attribute__((at(HOSTBASEADDR)));
-/*
-**************************************************************************************************************
-*                                         DELAY IN MILLI SECONDS
-*
-* Description: This function provides a delay in milli seconds
-*
-* Arguments  : delay    The delay required
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  Host_DelayMS (USB_INT32U  delay)
-{
-    volatile  USB_INT32U  i;
-
-
-    for (i = 0; i < delay; i++) {
-        Host_DelayUS(1000);
-    }
-}
-
-/*
-**************************************************************************************************************
-*                                         DELAY IN MICRO SECONDS
-*
-* Description: This function provides a delay in micro seconds
-*
-* Arguments  : delay    The delay required
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  Host_DelayUS (USB_INT32U  delay)
-{
-    volatile  USB_INT32U  i;
-
-
-    for (i = 0; i < (4 * delay); i++) {    /* This logic was tested. It gives app. 1 micro sec delay        */
-        ;
-    }
-}
-
-// bits of the USB/OTG clock control register
-#define HOST_CLK_EN     (1<<0)
-#define DEV_CLK_EN      (1<<1)
-#define PORTSEL_CLK_EN  (1<<3)
-#define AHB_CLK_EN      (1<<4)
-
-// bits of the USB/OTG clock status register
-#define HOST_CLK_ON     (1<<0)
-#define DEV_CLK_ON      (1<<1)
-#define PORTSEL_CLK_ON  (1<<3)
-#define AHB_CLK_ON      (1<<4)
-
-// we need host clock, OTG/portsel clock and AHB clock
-#define CLOCK_MASK (HOST_CLK_EN | PORTSEL_CLK_EN | AHB_CLK_EN)
-
-/*
-**************************************************************************************************************
-*                                         INITIALIZE THE HOST CONTROLLER
-*
-* Description: This function initializes lpc17xx host controller
-*
-* Arguments  : None
-*
-* Returns    : 
-*
-**************************************************************************************************************
-*/
-void  Host_Init (void)
-{
-    PRINT_Log("In Host_Init\n");
-    NVIC_DisableIRQ(USB_IRQn);                           /* Disable the USB interrupt source           */
-    
-    // turn on power for USB
-    LPC_SC->PCONP       |= (1UL<<31);
-    // Enable USB host clock, port selection and AHB clock
-    LPC_USB->USBClkCtrl |= CLOCK_MASK;
-    // Wait for clocks to become available
-    while ((LPC_USB->USBClkSt & CLOCK_MASK) != CLOCK_MASK)
-        ;
-    
-    // it seems the bits[0:1] mean the following
-    // 0: U1=device, U2=host
-    // 1: U1=host, U2=host
-    // 2: reserved
-    // 3: U1=host, U2=device
-    // NB: this register is only available if OTG clock (aka "port select") is enabled!!
-    // since we don't care about port 2, set just bit 0 to 1 (U1=host)
-    LPC_USB->OTGStCtrl |= 1;
-    
-    // now that we've configured the ports, we can turn off the portsel clock
-    LPC_USB->USBClkCtrl &= ~PORTSEL_CLK_EN;
-    
-    // power pins are not connected on mbed, so we can skip them
-    /* P1[18] = USB_UP_LED, 01 */
-    /* P1[19] = /USB_PPWR,     10 */
-    /* P1[22] = USB_PWRD, 10 */
-    /* P1[27] = /USB_OVRCR, 10 */
-    /*LPC_PINCON->PINSEL3 &= ~((3<<4) | (3<<6) | (3<<12) | (3<<22));  
-    LPC_PINCON->PINSEL3 |=  ((1<<4)|(2<<6) | (2<<12) | (2<<22));   // 0x00802080
-    */
-
-    // configure USB D+/D- pins
-    /* P0[29] = USB_D+, 01 */
-    /* P0[30] = USB_D-, 01 */
-    LPC_PINCON->PINSEL1 &= ~((3<<26) | (3<<28));  
-    LPC_PINCON->PINSEL1 |=  ((1<<26)|(1<<28));     // 0x14000000
-        
-    PRINT_Log("Initializing Host Stack\n");
-
-    Hcca       = (volatile  HCCA       *)(HostBuf+0x000);
-    TDHead     = (volatile  HCTD       *)(HostBuf+0x100);
-    TDTail     = (volatile  HCTD       *)(HostBuf+0x110);
-    EDCtrl     = (volatile  HCED       *)(HostBuf+0x120); 
-    EDBulkIn   = (volatile  HCED       *)(HostBuf+0x130);
-    EDBulkOut  = (volatile  HCED       *)(HostBuf+0x140);
-    TDBuffer   = (volatile  USB_INT08U *)(HostBuf+0x150);
-    
-    /* Initialize all the TDs, EDs and HCCA to 0  */
-    Host_EDInit(EDCtrl);
-    Host_EDInit(EDBulkIn);
-    Host_EDInit(EDBulkOut);
-    Host_TDInit(TDHead);
-    Host_TDInit(TDTail);
-    Host_HCCAInit(Hcca);
-    
-    Host_DelayMS(50);                                   /* Wait 50 ms before apply reset              */
-    LPC_USB->HcControl       = 0;                       /* HARDWARE RESET                             */
-    LPC_USB->HcControlHeadED = 0;                       /* Initialize Control list head to Zero       */
-    LPC_USB->HcBulkHeadED    = 0;                       /* Initialize Bulk list head to Zero          */
-    
-                                                        /* SOFTWARE RESET                             */
-    LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
-    LPC_USB->HcFmInterval    = DEFAULT_FMINTERVAL;      /* Write Fm Interval and Largest Data Packet Counter */
-
-                                                        /* Put HC in operational state                */
-    LPC_USB->HcControl  = (LPC_USB->HcControl & (~OR_CONTROL_HCFS)) | OR_CONTROL_HC_OPER;
-    LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC;            /* Set Global Power                           */
-    
-    LPC_USB->HcHCCA = (USB_INT32U)Hcca;
-    LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus;                   /* Clear Interrrupt Status                    */
-
-
-    LPC_USB->HcInterruptEnable  = OR_INTR_ENABLE_MIE |
-                         OR_INTR_ENABLE_WDH |
-                         OR_INTR_ENABLE_RHSC;
-
-    NVIC_SetPriority(USB_IRQn, 0);       /* highest priority */
-    /* Enable the USB Interrupt */
-    NVIC_EnableIRQ(USB_IRQn);
-    PRINT_Log("Host Initialized\n");
-}
-
-/*
-**************************************************************************************************************
-*                                         INTERRUPT SERVICE ROUTINE
-*
-* Description: This function services the interrupt caused by host controller
-*
-* Arguments  : None
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void USB_IRQHandler (void) __irq
-{
-    USB_INT32U   int_status;
-    USB_INT32U   ie_status;
-
-    int_status    = LPC_USB->HcInterruptStatus;                          /* Read Interrupt Status                */
-    ie_status     = LPC_USB->HcInterruptEnable;                          /* Read Interrupt enable status         */
- 
-    if (!(int_status & ie_status)) {
-        return;
-    } else {
-
-        int_status = int_status & ie_status;
-        if (int_status & OR_INTR_STATUS_RHSC) {                 /* Root hub status change interrupt     */
-            if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
-                if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
-                    /*
-                     * When DRWE is on, Connect Status Change
-                     * means a remote wakeup event.
-                    */
-                    HOST_RhscIntr = 1;// JUST SOMETHING FOR A BREAKPOINT
-                }
-                else {
-                    /*
-                     * When DRWE is off, Connect Status Change
-                     * is NOT a remote wakeup event
-                    */
-                    if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
-                        if (!gUSBConnected) {
-                            HOST_TDControlStatus = 0;
-                            HOST_WdhIntr = 0;
-                            HOST_RhscIntr = 1;
-                            gUSBConnected = 1;
-                        }
-                        else
-                            PRINT_Log("Spurious status change (connected)?\n");
-                    } else {
-                        if (gUSBConnected) {
-                            LPC_USB->HcInterruptEnable = 0; // why do we get multiple disc. rupts???
-                            HOST_RhscIntr = 0;
-                            gUSBConnected = 0;
-                        }
-                        else
-                            PRINT_Log("Spurious status change (disconnected)?\n");
-                    }
-                }
-                LPC_USB->HcRhPortStatus1 = OR_RH_PORT_CSC;
-            }
-            if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRSC) {
-                LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
-            }
-        }
-        if (int_status & OR_INTR_STATUS_WDH) {                  /* Writeback Done Head interrupt        */
-            HOST_WdhIntr = 1;
-            HOST_TDControlStatus = (TDHead->Control >> 28) & 0xf;
-        }            
-        LPC_USB->HcInterruptStatus = int_status;                         /* Clear interrupt status register      */
-    }
-    return;
-}
-
-/*
-**************************************************************************************************************
-*                                     PROCESS TRANSFER DESCRIPTOR
-*
-* Description: This function processes the transfer descriptor
-*
-* Arguments  : ed            Endpoint descriptor that contains this transfer descriptor
-*              token         SETUP, IN, OUT
-*              buffer        Current Buffer Pointer of the transfer descriptor
-*              buffer_len    Length of the buffer
-*
-* Returns    : OK       if TD submission is successful
-*              ERROR    if TD submission fails
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  Host_ProcessTD (volatile  HCED       *ed,
-                            volatile  USB_INT32U  token,
-                            volatile  USB_INT08U *buffer,
-                                      USB_INT32U  buffer_len)
-{
-    volatile  USB_INT32U   td_toggle;
-
-
-    if (ed == EDCtrl) {
-        if (token == TD_SETUP) {
-            td_toggle = TD_TOGGLE_0;
-        } else {
-            td_toggle = TD_TOGGLE_1;
-        }
-    } else {
-        td_toggle = 0;
-    }
-    TDHead->Control = (TD_ROUNDING    |
-                      token           |
-                      TD_DELAY_INT(0) |                           
-                      td_toggle       |
-                      TD_CC);
-    TDTail->Control = 0;
-    TDHead->CurrBufPtr   = (USB_INT32U) buffer;
-    TDTail->CurrBufPtr   = 0;
-    TDHead->Next         = (USB_INT32U) TDTail;
-    TDTail->Next         = 0;
-    TDHead->BufEnd       = (USB_INT32U)(buffer + (buffer_len - 1));
-    TDTail->BufEnd       = 0;
-
-    ed->HeadTd  = (USB_INT32U)TDHead | ((ed->HeadTd) & 0x00000002);
-    ed->TailTd  = (USB_INT32U)TDTail;
-    ed->Next    = 0;
-
-    if (ed == EDCtrl) {
-        LPC_USB->HcControlHeadED = (USB_INT32U)ed;
-        LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF;
-        LPC_USB->HcControl       = LPC_USB->HcControl       | OR_CONTROL_CLE;
-    } else {
-        LPC_USB->HcBulkHeadED    = (USB_INT32U)ed;
-        LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF;
-        LPC_USB->HcControl       = LPC_USB->HcControl       | OR_CONTROL_BLE;
-    }    
-
-    Host_WDHWait();
-
-//    if (!(TDHead->Control & 0xF0000000)) {
-    if (!HOST_TDControlStatus) {
-        return (OK);
-    } else {      
-        return (ERR_TD_FAIL);
-    }
-}
-
-/*
-**************************************************************************************************************
-*                                       ENUMERATE THE DEVICE
-*
-* Description: This function is used to enumerate the device connected
-*
-* Arguments  : None
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  Host_EnumDev (void)
-{
-    USB_INT32S  rc;
-
-    PRINT_Log("Connect a Mass Storage device\n");
-    while (!HOST_RhscIntr)
-        __WFI();
-    Host_DelayMS(100);                             /* USB 2.0 spec says atleast 50ms delay beore port reset */
-    LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS; // Initiate port reset
-    while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS)
-        __WFI(); // Wait for port reset to complete...
-    LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; // ...and clear port reset signal
-    Host_DelayMS(200);                                                 /* Wait for 100 MS after port reset  */
-
-    EDCtrl->Control = 8 << 16;                                         /* Put max pkt size = 8              */
-                                                                       /* Read first 8 bytes of device desc */
-    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_DEVICE, 0, TDBuffer, 8);
-    if (rc != OK) {
-        PRINT_Err(rc);
-        return (rc);
-    }
-    EDCtrl->Control = TDBuffer[7] << 16;                               /* Get max pkt size of endpoint 0    */
-    rc = HOST_SET_ADDRESS(1);                                          /* Set the device address to 1       */
-    if (rc != OK) {
-        PRINT_Err(rc);
-        return (rc);
-    }
-    Host_DelayMS(2);
-    EDCtrl->Control = (EDCtrl->Control) | 1;                          /* Modify control pipe with address 1 */
-                                                                      /* Get the configuration descriptor   */
-    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, 9);
-    if (rc != OK) {
-        PRINT_Err(rc);
-        return (rc);
-    }
-                                                                       /* Get the first configuration data  */
-    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, ReadLE16U(&TDBuffer[2]));
-    if (rc != OK) {
-        PRINT_Err(rc);
-        return (rc);
-    }
-    rc = MS_ParseConfiguration();                                      /* Parse the configuration           */
-    if (rc != OK) {
-        PRINT_Err(rc);
-        return (rc);
-    }
-    rc = USBH_SET_CONFIGURATION(1);                                    /* Select device configuration 1     */
-    if (rc != OK) {
-        PRINT_Err(rc);
-    }
-    Host_DelayMS(100);                                               /* Some devices may require this delay */
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                        RECEIVE THE CONTROL INFORMATION
-*
-* Description: This function is used to receive the control information
-*
-* Arguments  : bm_request_type
-*              b_request
-*              w_value
-*              w_index
-*              w_length
-*              buffer
-*
-* Returns    : OK       if Success
-*              ERROR    if Failed
-*
-**************************************************************************************************************
-*/
-   
-USB_INT32S  Host_CtrlRecv (         USB_INT08U   bm_request_type,
-                                    USB_INT08U   b_request,
-                                    USB_INT16U   w_value,
-                                    USB_INT16U   w_index,
-                                    USB_INT16U   w_length,
-                          volatile  USB_INT08U  *buffer)
-{
-    USB_INT32S  rc;
-
-
-    Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
-    rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
-    if (rc == OK) {
-        if (w_length) {
-            rc = Host_ProcessTD(EDCtrl, TD_IN, TDBuffer, w_length);
-        }
-        if (rc == OK) {
-            rc = Host_ProcessTD(EDCtrl, TD_OUT, NULL, 0);
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                         SEND THE CONTROL INFORMATION
-*
-* Description: This function is used to send the control information
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  Host_CtrlSend (          USB_INT08U   bm_request_type,
-                                     USB_INT08U   b_request,
-                                     USB_INT16U   w_value,
-                                     USB_INT16U   w_index,
-                                     USB_INT16U   w_length,
-                           volatile  USB_INT08U  *buffer)
-{
-    USB_INT32S  rc;
-
-
-    Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
-
-    rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
-    if (rc == OK) {
-        if (w_length) {
-            rc = Host_ProcessTD(EDCtrl, TD_OUT, TDBuffer, w_length);
-        }
-        if (rc == OK) {
-            rc = Host_ProcessTD(EDCtrl, TD_IN, NULL, 0);
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                          FILL SETUP PACKET
-*
-* Description: This function is used to fill the setup packet
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-void  Host_FillSetup (USB_INT08U   bm_request_type,
-                      USB_INT08U   b_request,
-                      USB_INT16U   w_value,
-                      USB_INT16U   w_index,
-                      USB_INT16U   w_length)
-{
-    int i;
-    for (i=0;i<w_length;i++)
-        TDBuffer[i] = 0;
-    
-    TDBuffer[0] = bm_request_type;
-    TDBuffer[1] = b_request;
-    WriteLE16U(&TDBuffer[2], w_value);
-    WriteLE16U(&TDBuffer[4], w_index);
-    WriteLE16U(&TDBuffer[6], w_length);
-}
-
-
-
-/*
-**************************************************************************************************************
-*                                         INITIALIZE THE TRANSFER DESCRIPTOR
-*
-* Description: This function initializes transfer descriptor
-*
-* Arguments  : Pointer to TD structure
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  Host_TDInit (volatile  HCTD *td)
-{
-
-    td->Control    = 0;
-    td->CurrBufPtr = 0;
-    td->Next       = 0;
-    td->BufEnd     = 0;
-}
-
-/*
-**************************************************************************************************************
-*                                         INITIALIZE THE ENDPOINT DESCRIPTOR
-*
-* Description: This function initializes endpoint descriptor
-*
-* Arguments  : Pointer to ED strcuture
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  Host_EDInit (volatile  HCED *ed)
-{
-
-    ed->Control = 0;
-    ed->TailTd  = 0;
-    ed->HeadTd  = 0;
-    ed->Next    = 0;
-}
-
-/*
-**************************************************************************************************************
-*                                 INITIALIZE HOST CONTROLLER COMMUNICATIONS AREA
-*
-* Description: This function initializes host controller communications area
-*
-* Arguments  : Pointer to HCCA
-*
-* Returns    : 
-*
-**************************************************************************************************************
-*/
-
-void  Host_HCCAInit (volatile  HCCA  *hcca)
-{
-    USB_INT32U  i;
-
-
-    for (i = 0; i < 32; i++) {
-
-        hcca->IntTable[i] = 0;
-        hcca->FrameNumber = 0;
-        hcca->DoneHead    = 0;
-    }
-
-}
-
-/*
-**************************************************************************************************************
-*                                         WAIT FOR WDH INTERRUPT
-*
-* Description: This function is infinite loop which breaks when ever a WDH interrupt rises
-*
-* Arguments  : None
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  Host_WDHWait (void)
-{
-  while (!HOST_WdhIntr) {
-    ;
-  }
-  HOST_WdhIntr = 0;
-}
-
-
-
-
-
-
-
-
-/*
-**************************************************************************************************************
-*                                         READ LE 32U
-*
-* Description: This function is used to read an unsigned integer from a character buffer in the platform
-*              containing little endian processor
-*
-* Arguments  : pmem    Pointer to the character buffer
-*
-* Returns    : val     Unsigned integer
-*
-**************************************************************************************************************
-*/
-
-USB_INT32U  ReadLE32U (volatile  USB_INT08U  *pmem)
-{
-    USB_INT32U val = *(USB_INT32U*)pmem;
-#ifdef __BIG_ENDIAN
-    return __REV(val);
-#else
-    return val;
-#endif    
-}
-
-/*
-**************************************************************************************************************
-*                                        WRITE LE 32U
-*
-* Description: This function is used to write an unsigned integer into a charecter buffer in the platform 
-*              containing little endian processor.
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*              val     Integer value to be placed in the charecter buffer
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  WriteLE32U (volatile  USB_INT08U  *pmem,
-                            USB_INT32U   val)
-{
-#ifdef __BIG_ENDIAN
-    *(USB_INT32U*)pmem = __REV(val);
-#else
-    *(USB_INT32U*)pmem = val;
-#endif
-}
-
-/*
-**************************************************************************************************************
-*                                          READ LE 16U
-*
-* Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
-*              containing little endian processor
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*
-* Returns    : val     Unsigned short integer
-*
-**************************************************************************************************************
-*/
-
-USB_INT16U  ReadLE16U (volatile  USB_INT08U  *pmem)
-{
-    USB_INT16U val = *(USB_INT16U*)pmem;
-#ifdef __BIG_ENDIAN
-    return __REV16(val);
-#else
-    return val;
-#endif    
-}
-
-/*
-**************************************************************************************************************
-*                                         WRITE LE 16U
-*
-* Description: This function is used to write an unsigned short integer into a charecter buffer in the
-*              platform containing little endian processor
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*              val     Value to be placed in the charecter buffer
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  WriteLE16U (volatile  USB_INT08U  *pmem,
-                            USB_INT16U   val)
-{
-#ifdef __BIG_ENDIAN
-    *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
-#else
-    *(USB_INT16U*)pmem = val;
-#endif
-}
-
-/*
-**************************************************************************************************************
-*                                         READ BE 32U
-*
-* Description: This function is used to read an unsigned integer from a charecter buffer in the platform
-*              containing big endian processor
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*
-* Returns    : val     Unsigned integer
-*
-**************************************************************************************************************
-*/
-
-USB_INT32U  ReadBE32U (volatile  USB_INT08U  *pmem)
-{
-    USB_INT32U val = *(USB_INT32U*)pmem;
-#ifdef __BIG_ENDIAN
-    return val;
-#else
-    return __REV(val);
-#endif
-}
-
-/*
-**************************************************************************************************************
-*                                         WRITE BE 32U
-*
-* Description: This function is used to write an unsigned integer into a charecter buffer in the platform
-*              containing big endian processor
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*              val     Value to be placed in the charecter buffer
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  WriteBE32U (volatile  USB_INT08U  *pmem,
-                            USB_INT32U   val)
-{
-#ifdef __BIG_ENDIAN
-    *(USB_INT32U*)pmem = val;
-#else
-    *(USB_INT32U*)pmem = __REV(val);
-#endif
-}
-
-/*
-**************************************************************************************************************
-*                                         READ BE 16U
-*
-* Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
-*              containing big endian processor
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*
-* Returns    : val     Unsigned short integer
-*
-**************************************************************************************************************
-*/
-
-USB_INT16U  ReadBE16U (volatile  USB_INT08U  *pmem)
-{
-    USB_INT16U val = *(USB_INT16U*)pmem;
-#ifdef __BIG_ENDIAN
-    return val;
-#else
-    return __REV16(val);
-#endif    
-}
-
-/*
-**************************************************************************************************************
-*                                         WRITE BE 16U
-*
-* Description: This function is used to write an unsigned short integer into the charecter buffer in the
-*              platform containing big endian processor
-*
-* Arguments  : pmem    Pointer to the charecter buffer
-*              val     Value to be placed in the charecter buffer
-*
-* Returns    : None
-*
-**************************************************************************************************************
-*/
-
-void  WriteBE16U (volatile  USB_INT08U  *pmem,
-                            USB_INT16U   val)
-{
-#ifdef __BIG_ENDIAN
-    *(USB_INT16U*)pmem = val;
-#else
-    *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
-#endif
-}
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_lpc17xx.c
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+ 
+/*
+**************************************************************************************************************
+*                                            INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_lpc17xx.h"
+
+/*
+**************************************************************************************************************
+*                                              GLOBAL VARIABLES
+**************************************************************************************************************
+*/
+int gUSBConnected;
+
+volatile  USB_INT32U   HOST_RhscIntr = 0;         /* Root Hub Status Change interrupt                       */
+volatile  USB_INT32U   HOST_WdhIntr  = 0;         /* Semaphore to wait until the TD is submitted            */
+volatile  USB_INT08U   HOST_TDControlStatus = 0;
+volatile  HCED        *EDCtrl;                    /* Control endpoint descriptor structure                  */
+volatile  HCED        *EDBulkIn;                  /* BulkIn endpoint descriptor  structure                  */
+volatile  HCED        *EDBulkOut;                 /* BulkOut endpoint descriptor structure                  */
+volatile  HCTD        *TDHead;                    /* Head transfer descriptor structure                     */
+volatile  HCTD        *TDTail;                    /* Tail transfer descriptor structure                     */
+volatile  HCCA        *Hcca;                      /* Host Controller Communications Area structure          */ 
+          USB_INT16U  *TDBufNonVol;               /* Identical to TDBuffer just to reduce compiler warnings */
+volatile  USB_INT08U  *TDBuffer;                  /* Current Buffer Pointer of transfer descriptor          */
+
+// USB host structures
+// AHB SRAM block 1
+#define HOSTBASEADDR 0x2007C000
+// reserve memory for the linker
+static USB_INT08U HostBuf[0x200] __attribute__((at(HOSTBASEADDR)));
+/*
+**************************************************************************************************************
+*                                         DELAY IN MILLI SECONDS
+*
+* Description: This function provides a delay in milli seconds
+*
+* Arguments  : delay    The delay required
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_DelayMS (USB_INT32U  delay)
+{
+    volatile  USB_INT32U  i;
+
+
+    for (i = 0; i < delay; i++) {
+        Host_DelayUS(1000);
+    }
+}
+
+/*
+**************************************************************************************************************
+*                                         DELAY IN MICRO SECONDS
+*
+* Description: This function provides a delay in micro seconds
+*
+* Arguments  : delay    The delay required
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_DelayUS (USB_INT32U  delay)
+{
+    volatile  USB_INT32U  i;
+
+
+    for (i = 0; i < (4 * delay); i++) {    /* This logic was tested. It gives app. 1 micro sec delay        */
+        ;
+    }
+}
+
+// bits of the USB/OTG clock control register
+#define HOST_CLK_EN     (1<<0)
+#define DEV_CLK_EN      (1<<1)
+#define PORTSEL_CLK_EN  (1<<3)
+#define AHB_CLK_EN      (1<<4)
+
+// bits of the USB/OTG clock status register
+#define HOST_CLK_ON     (1<<0)
+#define DEV_CLK_ON      (1<<1)
+#define PORTSEL_CLK_ON  (1<<3)
+#define AHB_CLK_ON      (1<<4)
+
+// we need host clock, OTG/portsel clock and AHB clock
+#define CLOCK_MASK (HOST_CLK_EN | PORTSEL_CLK_EN | AHB_CLK_EN)
+
+/*
+**************************************************************************************************************
+*                                         INITIALIZE THE HOST CONTROLLER
+*
+* Description: This function initializes lpc17xx host controller
+*
+* Arguments  : None
+*
+* Returns    : 
+*
+**************************************************************************************************************
+*/
+void  Host_Init (void)
+{
+    PRINT_Log("In Host_Init\n");
+    NVIC_DisableIRQ(USB_IRQn);                           /* Disable the USB interrupt source           */
+    
+    // turn on power for USB
+    LPC_SC->PCONP       |= (1UL<<31);
+    // Enable USB host clock, port selection and AHB clock
+    LPC_USB->USBClkCtrl |= CLOCK_MASK;
+    // Wait for clocks to become available
+    while ((LPC_USB->USBClkSt & CLOCK_MASK) != CLOCK_MASK)
+        ;
+    
+    // it seems the bits[0:1] mean the following
+    // 0: U1=device, U2=host
+    // 1: U1=host, U2=host
+    // 2: reserved
+    // 3: U1=host, U2=device
+    // NB: this register is only available if OTG clock (aka "port select") is enabled!!
+    // since we don't care about port 2, set just bit 0 to 1 (U1=host)
+    LPC_USB->OTGStCtrl |= 1;
+    
+    // now that we've configured the ports, we can turn off the portsel clock
+    LPC_USB->USBClkCtrl &= ~PORTSEL_CLK_EN;
+    
+    // power pins are not connected on mbed, so we can skip them
+    /* P1[18] = USB_UP_LED, 01 */
+    /* P1[19] = /USB_PPWR,     10 */
+    /* P1[22] = USB_PWRD, 10 */
+    /* P1[27] = /USB_OVRCR, 10 */
+    /*LPC_PINCON->PINSEL3 &= ~((3<<4) | (3<<6) | (3<<12) | (3<<22));  
+    LPC_PINCON->PINSEL3 |=  ((1<<4)|(2<<6) | (2<<12) | (2<<22));   // 0x00802080
+    */
+
+    // configure USB D+/D- pins
+    /* P0[29] = USB_D+, 01 */
+    /* P0[30] = USB_D-, 01 */
+    LPC_PINCON->PINSEL1 &= ~((3<<26) | (3<<28));  
+    LPC_PINCON->PINSEL1 |=  ((1<<26)|(1<<28));     // 0x14000000
+        
+    PRINT_Log("Initializing Host Stack\n");
+
+    Hcca       = (volatile  HCCA       *)(HostBuf+0x000);
+    TDHead     = (volatile  HCTD       *)(HostBuf+0x100);
+    TDTail     = (volatile  HCTD       *)(HostBuf+0x110);
+    EDCtrl     = (volatile  HCED       *)(HostBuf+0x120); 
+    EDBulkIn   = (volatile  HCED       *)(HostBuf+0x130);
+    EDBulkOut  = (volatile  HCED       *)(HostBuf+0x140);
+    TDBuffer   = (volatile  USB_INT08U *)(HostBuf+0x150);
+    
+    /* Initialize all the TDs, EDs and HCCA to 0  */
+    Host_EDInit(EDCtrl);
+    Host_EDInit(EDBulkIn);
+    Host_EDInit(EDBulkOut);
+    Host_TDInit(TDHead);
+    Host_TDInit(TDTail);
+    Host_HCCAInit(Hcca);
+    
+    Host_DelayMS(50);                                   /* Wait 50 ms before apply reset              */
+    LPC_USB->HcControl       = 0;                       /* HARDWARE RESET                             */
+    LPC_USB->HcControlHeadED = 0;                       /* Initialize Control list head to Zero       */
+    LPC_USB->HcBulkHeadED    = 0;                       /* Initialize Bulk list head to Zero          */
+    
+                                                        /* SOFTWARE RESET                             */
+    LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
+    LPC_USB->HcFmInterval    = DEFAULT_FMINTERVAL;      /* Write Fm Interval and Largest Data Packet Counter */
+
+                                                        /* Put HC in operational state                */
+    LPC_USB->HcControl  = (LPC_USB->HcControl & (~OR_CONTROL_HCFS)) | OR_CONTROL_HC_OPER;
+    LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC;            /* Set Global Power                           */
+    
+    LPC_USB->HcHCCA = (USB_INT32U)Hcca;
+    LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus;                   /* Clear Interrrupt Status                    */
+
+
+    LPC_USB->HcInterruptEnable  = OR_INTR_ENABLE_MIE |
+                         OR_INTR_ENABLE_WDH |
+                         OR_INTR_ENABLE_RHSC;
+
+    NVIC_SetPriority(USB_IRQn, 0);       /* highest priority */
+    /* Enable the USB Interrupt */
+    NVIC_EnableIRQ(USB_IRQn);
+    PRINT_Log("Host Initialized\n");
+}
+
+/*
+**************************************************************************************************************
+*                                         INTERRUPT SERVICE ROUTINE
+*
+* Description: This function services the interrupt caused by host controller
+*
+* Arguments  : None
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void USB_IRQHandler (void) __irq
+{
+    USB_INT32U   int_status;
+    USB_INT32U   ie_status;
+
+    int_status    = LPC_USB->HcInterruptStatus;                          /* Read Interrupt Status                */
+    ie_status     = LPC_USB->HcInterruptEnable;                          /* Read Interrupt enable status         */
+ 
+    if (!(int_status & ie_status)) {
+        return;
+    } else {
+
+        int_status = int_status & ie_status;
+        if (int_status & OR_INTR_STATUS_RHSC) {                 /* Root hub status change interrupt     */
+            if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
+                if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
+                    /*
+                     * When DRWE is on, Connect Status Change
+                     * means a remote wakeup event.
+                    */
+                    HOST_RhscIntr = 1;// JUST SOMETHING FOR A BREAKPOINT
+                }
+                else {
+                    /*
+                     * When DRWE is off, Connect Status Change
+                     * is NOT a remote wakeup event
+                    */
+                    if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
+                        if (!gUSBConnected) {
+                            HOST_TDControlStatus = 0;
+                            HOST_WdhIntr = 0;
+                            HOST_RhscIntr = 1;
+                            gUSBConnected = 1;
+                        }
+                        else
+                            PRINT_Log("Spurious status change (connected)?\n");
+                    } else {
+                        if (gUSBConnected) {
+                            LPC_USB->HcInterruptEnable = 0; // why do we get multiple disc. rupts???
+                            HOST_RhscIntr = 0;
+                            gUSBConnected = 0;
+                        }
+                        else
+                            PRINT_Log("Spurious status change (disconnected)?\n");
+                    }
+                }
+                LPC_USB->HcRhPortStatus1 = OR_RH_PORT_CSC;
+            }
+            if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRSC) {
+                LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
+            }
+        }
+        if (int_status & OR_INTR_STATUS_WDH) {                  /* Writeback Done Head interrupt        */
+            HOST_WdhIntr = 1;
+            HOST_TDControlStatus = (TDHead->Control >> 28) & 0xf;
+        }            
+        LPC_USB->HcInterruptStatus = int_status;                         /* Clear interrupt status register      */
+    }
+    return;
+}
+
+/*
+**************************************************************************************************************
+*                                     PROCESS TRANSFER DESCRIPTOR
+*
+* Description: This function processes the transfer descriptor
+*
+* Arguments  : ed            Endpoint descriptor that contains this transfer descriptor
+*              token         SETUP, IN, OUT
+*              buffer        Current Buffer Pointer of the transfer descriptor
+*              buffer_len    Length of the buffer
+*
+* Returns    : OK       if TD submission is successful
+*              ERROR    if TD submission fails
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  Host_ProcessTD (volatile  HCED       *ed,
+                            volatile  USB_INT32U  token,
+                            volatile  USB_INT08U *buffer,
+                                      USB_INT32U  buffer_len)
+{
+    volatile  USB_INT32U   td_toggle;
+
+
+    if (ed == EDCtrl) {
+        if (token == TD_SETUP) {
+            td_toggle = TD_TOGGLE_0;
+        } else {
+            td_toggle = TD_TOGGLE_1;
+        }
+    } else {
+        td_toggle = 0;
+    }
+    TDHead->Control = (TD_ROUNDING    |
+                      token           |
+                      TD_DELAY_INT(0) |                           
+                      td_toggle       |
+                      TD_CC);
+    TDTail->Control = 0;
+    TDHead->CurrBufPtr   = (USB_INT32U) buffer;
+    TDTail->CurrBufPtr   = 0;
+    TDHead->Next         = (USB_INT32U) TDTail;
+    TDTail->Next         = 0;
+    TDHead->BufEnd       = (USB_INT32U)(buffer + (buffer_len - 1));
+    TDTail->BufEnd       = 0;
+
+    ed->HeadTd  = (USB_INT32U)TDHead | ((ed->HeadTd) & 0x00000002);
+    ed->TailTd  = (USB_INT32U)TDTail;
+    ed->Next    = 0;
+
+    if (ed == EDCtrl) {
+        LPC_USB->HcControlHeadED = (USB_INT32U)ed;
+        LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF;
+        LPC_USB->HcControl       = LPC_USB->HcControl       | OR_CONTROL_CLE;
+    } else {
+        LPC_USB->HcBulkHeadED    = (USB_INT32U)ed;
+        LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF;
+        LPC_USB->HcControl       = LPC_USB->HcControl       | OR_CONTROL_BLE;
+    }    
+
+    Host_WDHWait();
+
+//    if (!(TDHead->Control & 0xF0000000)) {
+    if (!HOST_TDControlStatus) {
+        return (OK);
+    } else {      
+        return (ERR_TD_FAIL);
+    }
+}
+
+/*
+**************************************************************************************************************
+*                                       ENUMERATE THE DEVICE
+*
+* Description: This function is used to enumerate the device connected
+*
+* Arguments  : None
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  Host_EnumDev (void)
+{
+    USB_INT32S  rc;
+
+    PRINT_Log("Connect a Mass Storage device\n");
+    while (!HOST_RhscIntr)
+        __WFI();
+    Host_DelayMS(100);                             /* USB 2.0 spec says atleast 50ms delay beore port reset */
+    LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS; // Initiate port reset
+    while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS)
+        __WFI(); // Wait for port reset to complete...
+    LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; // ...and clear port reset signal
+    Host_DelayMS(200);                                                 /* Wait for 100 MS after port reset  */
+
+    EDCtrl->Control = 8 << 16;                                         /* Put max pkt size = 8              */
+                                                                       /* Read first 8 bytes of device desc */
+    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_DEVICE, 0, TDBuffer, 8);
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    EDCtrl->Control = TDBuffer[7] << 16;                               /* Get max pkt size of endpoint 0    */
+    rc = HOST_SET_ADDRESS(1);                                          /* Set the device address to 1       */
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    Host_DelayMS(2);
+    EDCtrl->Control = (EDCtrl->Control) | 1;                          /* Modify control pipe with address 1 */
+                                                                      /* Get the configuration descriptor   */
+    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, 9);
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+                                                                       /* Get the first configuration data  */
+    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, ReadLE16U(&TDBuffer[2]));
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    rc = MS_ParseConfiguration();                                      /* Parse the configuration           */
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    rc = USBH_SET_CONFIGURATION(1);                                    /* Select device configuration 1     */
+    if (rc != OK) {
+        PRINT_Err(rc);
+    }
+    Host_DelayMS(100);                                               /* Some devices may require this delay */
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                        RECEIVE THE CONTROL INFORMATION
+*
+* Description: This function is used to receive the control information
+*
+* Arguments  : bm_request_type
+*              b_request
+*              w_value
+*              w_index
+*              w_length
+*              buffer
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+   
+USB_INT32S  Host_CtrlRecv (         USB_INT08U   bm_request_type,
+                                    USB_INT08U   b_request,
+                                    USB_INT16U   w_value,
+                                    USB_INT16U   w_index,
+                                    USB_INT16U   w_length,
+                          volatile  USB_INT08U  *buffer)
+{
+    USB_INT32S  rc;
+
+
+    Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
+    rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
+    if (rc == OK) {
+        if (w_length) {
+            rc = Host_ProcessTD(EDCtrl, TD_IN, TDBuffer, w_length);
+        }
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDCtrl, TD_OUT, NULL, 0);
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         SEND THE CONTROL INFORMATION
+*
+* Description: This function is used to send the control information
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  Host_CtrlSend (          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length,
+                           volatile  USB_INT08U  *buffer)
+{
+    USB_INT32S  rc;
+
+
+    Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
+
+    rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
+    if (rc == OK) {
+        if (w_length) {
+            rc = Host_ProcessTD(EDCtrl, TD_OUT, TDBuffer, w_length);
+        }
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDCtrl, TD_IN, NULL, 0);
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                          FILL SETUP PACKET
+*
+* Description: This function is used to fill the setup packet
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+void  Host_FillSetup (USB_INT08U   bm_request_type,
+                      USB_INT08U   b_request,
+                      USB_INT16U   w_value,
+                      USB_INT16U   w_index,
+                      USB_INT16U   w_length)
+{
+    int i;
+    for (i=0;i<w_length;i++)
+        TDBuffer[i] = 0;
+    
+    TDBuffer[0] = bm_request_type;
+    TDBuffer[1] = b_request;
+    WriteLE16U(&TDBuffer[2], w_value);
+    WriteLE16U(&TDBuffer[4], w_index);
+    WriteLE16U(&TDBuffer[6], w_length);
+}
+
+
+
+/*
+**************************************************************************************************************
+*                                         INITIALIZE THE TRANSFER DESCRIPTOR
+*
+* Description: This function initializes transfer descriptor
+*
+* Arguments  : Pointer to TD structure
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_TDInit (volatile  HCTD *td)
+{
+
+    td->Control    = 0;
+    td->CurrBufPtr = 0;
+    td->Next       = 0;
+    td->BufEnd     = 0;
+}
+
+/*
+**************************************************************************************************************
+*                                         INITIALIZE THE ENDPOINT DESCRIPTOR
+*
+* Description: This function initializes endpoint descriptor
+*
+* Arguments  : Pointer to ED strcuture
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_EDInit (volatile  HCED *ed)
+{
+
+    ed->Control = 0;
+    ed->TailTd  = 0;
+    ed->HeadTd  = 0;
+    ed->Next    = 0;
+}
+
+/*
+**************************************************************************************************************
+*                                 INITIALIZE HOST CONTROLLER COMMUNICATIONS AREA
+*
+* Description: This function initializes host controller communications area
+*
+* Arguments  : Pointer to HCCA
+*
+* Returns    : 
+*
+**************************************************************************************************************
+*/
+
+void  Host_HCCAInit (volatile  HCCA  *hcca)
+{
+    USB_INT32U  i;
+
+
+    for (i = 0; i < 32; i++) {
+
+        hcca->IntTable[i] = 0;
+        hcca->FrameNumber = 0;
+        hcca->DoneHead    = 0;
+    }
+
+}
+
+/*
+**************************************************************************************************************
+*                                         WAIT FOR WDH INTERRUPT
+*
+* Description: This function is infinite loop which breaks when ever a WDH interrupt rises
+*
+* Arguments  : None
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_WDHWait (void)
+{
+  while (!HOST_WdhIntr) {
+    ;
+  }
+  HOST_WdhIntr = 0;
+}
+
+
+
+
+
+
+
+
+/*
+**************************************************************************************************************
+*                                         READ LE 32U
+*
+* Description: This function is used to read an unsigned integer from a character buffer in the platform
+*              containing little endian processor
+*
+* Arguments  : pmem    Pointer to the character buffer
+*
+* Returns    : val     Unsigned integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT32U  ReadLE32U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT32U val = *(USB_INT32U*)pmem;
+#ifdef __BIG_ENDIAN
+    return __REV(val);
+#else
+    return val;
+#endif    
+}
+
+/*
+**************************************************************************************************************
+*                                        WRITE LE 32U
+*
+* Description: This function is used to write an unsigned integer into a charecter buffer in the platform 
+*              containing little endian processor.
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Integer value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteLE32U (volatile  USB_INT08U  *pmem,
+                            USB_INT32U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT32U*)pmem = __REV(val);
+#else
+    *(USB_INT32U*)pmem = val;
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                          READ LE 16U
+*
+* Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
+*              containing little endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*
+* Returns    : val     Unsigned short integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT16U  ReadLE16U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT16U val = *(USB_INT16U*)pmem;
+#ifdef __BIG_ENDIAN
+    return __REV16(val);
+#else
+    return val;
+#endif    
+}
+
+/*
+**************************************************************************************************************
+*                                         WRITE LE 16U
+*
+* Description: This function is used to write an unsigned short integer into a charecter buffer in the
+*              platform containing little endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteLE16U (volatile  USB_INT08U  *pmem,
+                            USB_INT16U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
+#else
+    *(USB_INT16U*)pmem = val;
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                         READ BE 32U
+*
+* Description: This function is used to read an unsigned integer from a charecter buffer in the platform
+*              containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*
+* Returns    : val     Unsigned integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT32U  ReadBE32U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT32U val = *(USB_INT32U*)pmem;
+#ifdef __BIG_ENDIAN
+    return val;
+#else
+    return __REV(val);
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                         WRITE BE 32U
+*
+* Description: This function is used to write an unsigned integer into a charecter buffer in the platform
+*              containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteBE32U (volatile  USB_INT08U  *pmem,
+                            USB_INT32U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT32U*)pmem = val;
+#else
+    *(USB_INT32U*)pmem = __REV(val);
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                         READ BE 16U
+*
+* Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
+*              containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*
+* Returns    : val     Unsigned short integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT16U  ReadBE16U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT16U val = *(USB_INT16U*)pmem;
+#ifdef __BIG_ENDIAN
+    return val;
+#else
+    return __REV16(val);
+#endif    
+}
+
+/*
+**************************************************************************************************************
+*                                         WRITE BE 16U
+*
+* Description: This function is used to write an unsigned short integer into the charecter buffer in the
+*              platform containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteBE16U (volatile  USB_INT08U  *pmem,
+                            USB_INT16U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT16U*)pmem = val;
+#else
+    *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
+#endif
+}
--- a/USBHostLite/usbhost_lpc17xx.h	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_lpc17xx.h	Sun Sep 16 15:00:33 2012 +0000
@@ -1,254 +1,254 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_lpc17xx.h
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
-
-#ifndef USBHOST_LPC17xx_H
-#define USBHOST_LPC17xx_H
-
-/*
-**************************************************************************************************************
-*                                       INCLUDE HEADER FILES
-**************************************************************************************************************
-*/
-
-#include    "usbhost_inc.h"
-
-/*
-**************************************************************************************************************
-*                                        PRINT CONFIGURATION
-**************************************************************************************************************
-*/
-
-#define  PRINT_ENABLE         1
-
-#if PRINT_ENABLE
-#define  PRINT_Log(...)       printf(__VA_ARGS__)
-#define  PRINT_Err(rc)        printf("ERROR: In %s at Line %u - rc = %d\n", __FUNCTION__, __LINE__, rc)
-
-#else 
-#define  PRINT_Log(...)       do {} while(0)
-#define  PRINT_Err(rc)        do {} while(0)
-
-#endif
-
-/*
-**************************************************************************************************************
-*                                        GENERAL DEFINITIONS
-**************************************************************************************************************
-*/
-
-#define  DESC_LENGTH(x)  x[0]
-#define  DESC_TYPE(x)    x[1]
-
-
-#define  HOST_GET_DESCRIPTOR(descType, descIndex, data, length)                      \
-         Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR,    \
-         (descType << 8)|(descIndex), 0, length, data)
-
-#define  HOST_SET_ADDRESS(new_addr)                                                  \
-         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS,       \
-         new_addr, 0, 0, NULL)
-
-#define  USBH_SET_CONFIGURATION(configNum)                                           \
-         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_CONFIGURATION, \
-         configNum, 0, 0, NULL)
-
-#define  USBH_SET_INTERFACE(ifNum, altNum)                                           \
-         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, SET_INTERFACE,  \
-         altNum, ifNum, 0, NULL)
-
-/*
-**************************************************************************************************************
-*                                  OHCI OPERATIONAL REGISTER FIELD DEFINITIONS
-**************************************************************************************************************
-*/
-
-                                            /* ------------------ HcControl Register ---------------------  */
-#define  OR_CONTROL_CLE                 0x00000010
-#define  OR_CONTROL_BLE                 0x00000020
-#define  OR_CONTROL_HCFS                0x000000C0
-#define  OR_CONTROL_HC_OPER             0x00000080
-                                            /* ----------------- HcCommandStatus Register ----------------- */
-#define  OR_CMD_STATUS_HCR              0x00000001
-#define  OR_CMD_STATUS_CLF              0x00000002
-#define  OR_CMD_STATUS_BLF              0x00000004
-                                            /* --------------- HcInterruptStatus Register ----------------- */
-#define  OR_INTR_STATUS_WDH             0x00000002
-#define  OR_INTR_STATUS_RHSC            0x00000040
-                                            /* --------------- HcInterruptEnable Register ----------------- */
-#define  OR_INTR_ENABLE_WDH             0x00000002
-#define  OR_INTR_ENABLE_RHSC            0x00000040
-#define  OR_INTR_ENABLE_MIE             0x80000000
-                                            /* ---------------- HcRhDescriptorA Register ------------------ */
-#define  OR_RH_STATUS_LPSC              0x00010000
-#define  OR_RH_STATUS_DRWE              0x00008000
-                                            /* -------------- HcRhPortStatus[1:NDP] Register -------------- */
-#define  OR_RH_PORT_CCS                 0x00000001
-#define  OR_RH_PORT_PRS                 0x00000010
-#define  OR_RH_PORT_CSC                 0x00010000
-#define  OR_RH_PORT_PRSC                0x00100000
-
-
-/*
-**************************************************************************************************************
-*                                               FRAME INTERVAL
-**************************************************************************************************************
-*/
-
-#define  FI                     0x2EDF           /* 12000 bits per frame (-1)                               */
-#define  DEFAULT_FMINTERVAL     ((((6 * (FI - 210)) / 7) << 16) | FI)
-
-/*
-**************************************************************************************************************
-*                                       TRANSFER DESCRIPTOR CONTROL FIELDS
-**************************************************************************************************************
-*/
-
-#define  TD_ROUNDING        (USB_INT32U) (0x00040000)        /* Buffer Rounding                             */
-#define  TD_SETUP           (USB_INT32U)(0)                  /* Direction of Setup Packet                   */
-#define  TD_IN              (USB_INT32U)(0x00100000)         /* Direction In                                */
-#define  TD_OUT             (USB_INT32U)(0x00080000)         /* Direction Out                               */
-#define  TD_DELAY_INT(x)    (USB_INT32U)((x) << 21)          /* Delay Interrupt                             */
-#define  TD_TOGGLE_0        (USB_INT32U)(0x02000000)         /* Toggle 0                                    */
-#define  TD_TOGGLE_1        (USB_INT32U)(0x03000000)         /* Toggle 1                                    */
-#define  TD_CC              (USB_INT32U)(0xF0000000)         /* Completion Code                             */
-
-/*
-**************************************************************************************************************
-*                                       USB STANDARD REQUEST DEFINITIONS
-**************************************************************************************************************
-*/
-
-#define  USB_DESCRIPTOR_TYPE_DEVICE                     1
-#define  USB_DESCRIPTOR_TYPE_CONFIGURATION              2
-#define  USB_DESCRIPTOR_TYPE_INTERFACE                  4
-#define  USB_DESCRIPTOR_TYPE_ENDPOINT                   5
-                                                    /*  ----------- Control RequestType Fields  ----------- */
-#define  USB_DEVICE_TO_HOST         0x80
-#define  USB_HOST_TO_DEVICE         0x00
-#define  USB_REQUEST_TYPE_CLASS     0x20
-#define  USB_RECIPIENT_DEVICE       0x00
-#define  USB_RECIPIENT_INTERFACE    0x01
-                                                    /* -------------- USB Standard Requests  -------------- */
-#define  SET_ADDRESS                 5
-#define  GET_DESCRIPTOR              6
-#define  SET_CONFIGURATION           9
-#define  SET_INTERFACE              11
-
-/*
-**************************************************************************************************************
-*                                       TYPE DEFINITIONS
-**************************************************************************************************************
-*/
-
-typedef struct hcEd {                       /* ----------- HostController EndPoint Descriptor ------------- */
-    volatile  USB_INT32U  Control;              /* Endpoint descriptor control                              */
-    volatile  USB_INT32U  TailTd;               /* Physical address of tail in Transfer descriptor list     */
-    volatile  USB_INT32U  HeadTd;               /* Physcial address of head in Transfer descriptor list     */
-    volatile  USB_INT32U  Next;                 /* Physical address of next Endpoint descriptor             */
-} HCED;
-
-typedef struct hcTd {                       /* ------------ HostController Transfer Descriptor ------------ */
-    volatile  USB_INT32U  Control;              /* Transfer descriptor control                              */
-    volatile  USB_INT32U  CurrBufPtr;           /* Physical address of current buffer pointer               */
-    volatile  USB_INT32U  Next;                 /* Physical pointer to next Transfer Descriptor             */
-    volatile  USB_INT32U  BufEnd;               /* Physical address of end of buffer                        */
-} HCTD;
-
-typedef struct hcca {                       /* ----------- Host Controller Communication Area ------------  */
-    volatile  USB_INT32U  IntTable[32];         /* Interrupt Table                                          */
-    volatile  USB_INT32U  FrameNumber;          /* Frame Number                                             */
-    volatile  USB_INT32U  DoneHead;             /* Done Head                                                */
-    volatile  USB_INT08U  Reserved[116];        /* Reserved for future use                                  */
-    volatile  USB_INT08U  Unknown[4];           /* Unused                                                   */
-} HCCA;
-
-/*
-**************************************************************************************************************
-*                                     EXTERN DECLARATIONS
-**************************************************************************************************************
-*/
-
-extern  volatile  HCED        *EDBulkIn;        /* BulkIn endpoint descriptor  structure                    */
-extern  volatile  HCED        *EDBulkOut;       /* BulkOut endpoint descriptor structure                    */
-extern  volatile  HCTD        *TDHead;          /* Head transfer descriptor structure                       */
-extern  volatile  HCTD        *TDTail;          /* Tail transfer descriptor structure                       */
-extern  volatile  USB_INT08U  *TDBuffer;        /* Current Buffer Pointer of transfer descriptor            */
-
-/*
-**************************************************************************************************************
-*                                       FUNCTION PROTOTYPES
-**************************************************************************************************************
-*/
-
-void        Host_Init     (void);
-
-extern "C" void USB_IRQHandler(void)  __irq;
-
-USB_INT32S  Host_EnumDev  (void);
-
-USB_INT32S  Host_ProcessTD(volatile  HCED       *ed,
-                           volatile  USB_INT32U  token,
-                           volatile  USB_INT08U *buffer,
-                                     USB_INT32U  buffer_len);
-
-void        Host_DelayUS  (          USB_INT32U    delay);
-void        Host_DelayMS  (          USB_INT32U    delay);
-
-
-void        Host_TDInit   (volatile  HCTD *td);
-void        Host_EDInit   (volatile  HCED *ed);
-void        Host_HCCAInit (volatile  HCCA  *hcca);
-
-USB_INT32S  Host_CtrlRecv (          USB_INT08U   bm_request_type,
-                                     USB_INT08U   b_request,
-                                     USB_INT16U   w_value,
-                                     USB_INT16U   w_index,
-                                     USB_INT16U   w_length,
-                           volatile  USB_INT08U  *buffer);
-
-USB_INT32S  Host_CtrlSend (          USB_INT08U   bm_request_type,
-                                     USB_INT08U   b_request,
-                                     USB_INT16U   w_value,
-                                     USB_INT16U   w_index,
-                                     USB_INT16U   w_length,
-                           volatile  USB_INT08U  *buffer);
-
-void        Host_FillSetup(          USB_INT08U   bm_request_type,
-                                     USB_INT08U   b_request,
-                                     USB_INT16U   w_value,
-                                     USB_INT16U   w_index,
-                                     USB_INT16U   w_length);
-
-
-void        Host_WDHWait  (void);
-
-
-USB_INT32U  ReadLE32U     (volatile  USB_INT08U  *pmem);
-void        WriteLE32U    (volatile  USB_INT08U  *pmem,
-                                     USB_INT32U   val);
-USB_INT16U  ReadLE16U     (volatile  USB_INT08U  *pmem);
-void        WriteLE16U    (volatile  USB_INT08U  *pmem,
-                                     USB_INT16U   val);
-USB_INT32U  ReadBE32U     (volatile  USB_INT08U  *pmem);
-void        WriteBE32U    (volatile  USB_INT08U  *pmem,
-                                     USB_INT32U   val);
-USB_INT16U  ReadBE16U     (volatile  USB_INT08U  *pmem);
-void        WriteBE16U    (volatile  USB_INT08U  *pmem,
-                                     USB_INT16U   val);
-
-#endif
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_lpc17xx.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef USBHOST_LPC17xx_H
+#define USBHOST_LPC17xx_H
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include    "usbhost_inc.h"
+
+/*
+**************************************************************************************************************
+*                                        PRINT CONFIGURATION
+**************************************************************************************************************
+*/
+
+#define  PRINT_ENABLE         1
+
+#if PRINT_ENABLE
+#define  PRINT_Log(...)       printf(__VA_ARGS__)
+#define  PRINT_Err(rc)        printf("ERROR: In %s at Line %u - rc = %d\n", __FUNCTION__, __LINE__, rc)
+
+#else 
+#define  PRINT_Log(...)       do {} while(0)
+#define  PRINT_Err(rc)        do {} while(0)
+
+#endif
+
+/*
+**************************************************************************************************************
+*                                        GENERAL DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  DESC_LENGTH(x)  x[0]
+#define  DESC_TYPE(x)    x[1]
+
+
+#define  HOST_GET_DESCRIPTOR(descType, descIndex, data, length)                      \
+         Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR,    \
+         (descType << 8)|(descIndex), 0, length, data)
+
+#define  HOST_SET_ADDRESS(new_addr)                                                  \
+         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS,       \
+         new_addr, 0, 0, NULL)
+
+#define  USBH_SET_CONFIGURATION(configNum)                                           \
+         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_CONFIGURATION, \
+         configNum, 0, 0, NULL)
+
+#define  USBH_SET_INTERFACE(ifNum, altNum)                                           \
+         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, SET_INTERFACE,  \
+         altNum, ifNum, 0, NULL)
+
+/*
+**************************************************************************************************************
+*                                  OHCI OPERATIONAL REGISTER FIELD DEFINITIONS
+**************************************************************************************************************
+*/
+
+                                            /* ------------------ HcControl Register ---------------------  */
+#define  OR_CONTROL_CLE                 0x00000010
+#define  OR_CONTROL_BLE                 0x00000020
+#define  OR_CONTROL_HCFS                0x000000C0
+#define  OR_CONTROL_HC_OPER             0x00000080
+                                            /* ----------------- HcCommandStatus Register ----------------- */
+#define  OR_CMD_STATUS_HCR              0x00000001
+#define  OR_CMD_STATUS_CLF              0x00000002
+#define  OR_CMD_STATUS_BLF              0x00000004
+                                            /* --------------- HcInterruptStatus Register ----------------- */
+#define  OR_INTR_STATUS_WDH             0x00000002
+#define  OR_INTR_STATUS_RHSC            0x00000040
+                                            /* --------------- HcInterruptEnable Register ----------------- */
+#define  OR_INTR_ENABLE_WDH             0x00000002
+#define  OR_INTR_ENABLE_RHSC            0x00000040
+#define  OR_INTR_ENABLE_MIE             0x80000000
+                                            /* ---------------- HcRhDescriptorA Register ------------------ */
+#define  OR_RH_STATUS_LPSC              0x00010000
+#define  OR_RH_STATUS_DRWE              0x00008000
+                                            /* -------------- HcRhPortStatus[1:NDP] Register -------------- */
+#define  OR_RH_PORT_CCS                 0x00000001
+#define  OR_RH_PORT_PRS                 0x00000010
+#define  OR_RH_PORT_CSC                 0x00010000
+#define  OR_RH_PORT_PRSC                0x00100000
+
+
+/*
+**************************************************************************************************************
+*                                               FRAME INTERVAL
+**************************************************************************************************************
+*/
+
+#define  FI                     0x2EDF           /* 12000 bits per frame (-1)                               */
+#define  DEFAULT_FMINTERVAL     ((((6 * (FI - 210)) / 7) << 16) | FI)
+
+/*
+**************************************************************************************************************
+*                                       TRANSFER DESCRIPTOR CONTROL FIELDS
+**************************************************************************************************************
+*/
+
+#define  TD_ROUNDING        (USB_INT32U) (0x00040000)        /* Buffer Rounding                             */
+#define  TD_SETUP           (USB_INT32U)(0)                  /* Direction of Setup Packet                   */
+#define  TD_IN              (USB_INT32U)(0x00100000)         /* Direction In                                */
+#define  TD_OUT             (USB_INT32U)(0x00080000)         /* Direction Out                               */
+#define  TD_DELAY_INT(x)    (USB_INT32U)((x) << 21)          /* Delay Interrupt                             */
+#define  TD_TOGGLE_0        (USB_INT32U)(0x02000000)         /* Toggle 0                                    */
+#define  TD_TOGGLE_1        (USB_INT32U)(0x03000000)         /* Toggle 1                                    */
+#define  TD_CC              (USB_INT32U)(0xF0000000)         /* Completion Code                             */
+
+/*
+**************************************************************************************************************
+*                                       USB STANDARD REQUEST DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  USB_DESCRIPTOR_TYPE_DEVICE                     1
+#define  USB_DESCRIPTOR_TYPE_CONFIGURATION              2
+#define  USB_DESCRIPTOR_TYPE_INTERFACE                  4
+#define  USB_DESCRIPTOR_TYPE_ENDPOINT                   5
+                                                    /*  ----------- Control RequestType Fields  ----------- */
+#define  USB_DEVICE_TO_HOST         0x80
+#define  USB_HOST_TO_DEVICE         0x00
+#define  USB_REQUEST_TYPE_CLASS     0x20
+#define  USB_RECIPIENT_DEVICE       0x00
+#define  USB_RECIPIENT_INTERFACE    0x01
+                                                    /* -------------- USB Standard Requests  -------------- */
+#define  SET_ADDRESS                 5
+#define  GET_DESCRIPTOR              6
+#define  SET_CONFIGURATION           9
+#define  SET_INTERFACE              11
+
+/*
+**************************************************************************************************************
+*                                       TYPE DEFINITIONS
+**************************************************************************************************************
+*/
+
+typedef struct hcEd {                       /* ----------- HostController EndPoint Descriptor ------------- */
+    volatile  USB_INT32U  Control;              /* Endpoint descriptor control                              */
+    volatile  USB_INT32U  TailTd;               /* Physical address of tail in Transfer descriptor list     */
+    volatile  USB_INT32U  HeadTd;               /* Physcial address of head in Transfer descriptor list     */
+    volatile  USB_INT32U  Next;                 /* Physical address of next Endpoint descriptor             */
+} HCED;
+
+typedef struct hcTd {                       /* ------------ HostController Transfer Descriptor ------------ */
+    volatile  USB_INT32U  Control;              /* Transfer descriptor control                              */
+    volatile  USB_INT32U  CurrBufPtr;           /* Physical address of current buffer pointer               */
+    volatile  USB_INT32U  Next;                 /* Physical pointer to next Transfer Descriptor             */
+    volatile  USB_INT32U  BufEnd;               /* Physical address of end of buffer                        */
+} HCTD;
+
+typedef struct hcca {                       /* ----------- Host Controller Communication Area ------------  */
+    volatile  USB_INT32U  IntTable[32];         /* Interrupt Table                                          */
+    volatile  USB_INT32U  FrameNumber;          /* Frame Number                                             */
+    volatile  USB_INT32U  DoneHead;             /* Done Head                                                */
+    volatile  USB_INT08U  Reserved[116];        /* Reserved for future use                                  */
+    volatile  USB_INT08U  Unknown[4];           /* Unused                                                   */
+} HCCA;
+
+/*
+**************************************************************************************************************
+*                                     EXTERN DECLARATIONS
+**************************************************************************************************************
+*/
+
+extern  volatile  HCED        *EDBulkIn;        /* BulkIn endpoint descriptor  structure                    */
+extern  volatile  HCED        *EDBulkOut;       /* BulkOut endpoint descriptor structure                    */
+extern  volatile  HCTD        *TDHead;          /* Head transfer descriptor structure                       */
+extern  volatile  HCTD        *TDTail;          /* Tail transfer descriptor structure                       */
+extern  volatile  USB_INT08U  *TDBuffer;        /* Current Buffer Pointer of transfer descriptor            */
+
+/*
+**************************************************************************************************************
+*                                       FUNCTION PROTOTYPES
+**************************************************************************************************************
+*/
+
+void        Host_Init     (void);
+
+extern "C" void USB_IRQHandler(void)  __irq;
+
+USB_INT32S  Host_EnumDev  (void);
+
+USB_INT32S  Host_ProcessTD(volatile  HCED       *ed,
+                           volatile  USB_INT32U  token,
+                           volatile  USB_INT08U *buffer,
+                                     USB_INT32U  buffer_len);
+
+void        Host_DelayUS  (          USB_INT32U    delay);
+void        Host_DelayMS  (          USB_INT32U    delay);
+
+
+void        Host_TDInit   (volatile  HCTD *td);
+void        Host_EDInit   (volatile  HCED *ed);
+void        Host_HCCAInit (volatile  HCCA  *hcca);
+
+USB_INT32S  Host_CtrlRecv (          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length,
+                           volatile  USB_INT08U  *buffer);
+
+USB_INT32S  Host_CtrlSend (          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length,
+                           volatile  USB_INT08U  *buffer);
+
+void        Host_FillSetup(          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length);
+
+
+void        Host_WDHWait  (void);
+
+
+USB_INT32U  ReadLE32U     (volatile  USB_INT08U  *pmem);
+void        WriteLE32U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT32U   val);
+USB_INT16U  ReadLE16U     (volatile  USB_INT08U  *pmem);
+void        WriteLE16U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT16U   val);
+USB_INT32U  ReadBE32U     (volatile  USB_INT08U  *pmem);
+void        WriteBE32U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT32U   val);
+USB_INT16U  ReadBE16U     (volatile  USB_INT08U  *pmem);
+void        WriteBE16U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT16U   val);
+
+#endif
--- a/USBHostLite/usbhost_ms.cpp	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_ms.cpp	Sun Sep 16 15:00:33 2012 +0000
@@ -1,455 +1,455 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_ms.c
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
-
-/*
-**************************************************************************************************************
-*                                       INCLUDE HEADER FILES
-**************************************************************************************************************
-*/
-
-#include  "usbhost_ms.h"
-
-/*
-**************************************************************************************************************
-*                                         GLOBAL VARIABLES
-**************************************************************************************************************
-*/
-
-USB_INT32U  MS_BlkSize;
-
-/*
-**************************************************************************************************************
-*                                      INITIALIZE MASS STORAGE INTERFACE
-*
-* Description: This function initializes the mass storage interface
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult)
-{
-    USB_INT08U  retry;
-    USB_INT32S  rc;
-
-    MS_GetMaxLUN();                                                    /* Get maximum logical unit number   */
-    retry  = 80;
-    while(retry) {
-        rc = MS_TestUnitReady();                                       /* Test whether the unit is ready    */
-        if (rc == OK) {
-            break;
-        }
-        MS_GetSenseInfo();                                             /* Get sense information             */
-        retry--;
-    }
-    if (rc != OK) {
-        PRINT_Err(rc);
-        return (rc);
-    }
-    rc = MS_ReadCapacity(numBlks, blkSize);                         /* Read capacity of the disk         */
-    MS_BlkSize = *blkSize;                        // Set global
-    rc = MS_Inquire (inquiryResult);
-    return (rc);
-}
-/*
-**************************************************************************************************************
-*                                         PARSE THE CONFIGURATION
-*
-* Description: This function is used to parse the configuration
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  MS_ParseConfiguration (void)
-{
-    volatile  USB_INT08U  *desc_ptr;
-              USB_INT08U   ms_int_found;
-
-
-    desc_ptr     = TDBuffer;
-    ms_int_found = 0;
-
-    if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION) {    
-        return (ERR_BAD_CONFIGURATION);
-    }
-    desc_ptr += desc_ptr[0];
-
-    while (desc_ptr != TDBuffer + ReadLE16U(&TDBuffer[2])) {
-
-        switch (desc_ptr[1]) {
-
-            case USB_DESCRIPTOR_TYPE_INTERFACE:                       /* If it is an interface descriptor   */
-                 if (desc_ptr[5] == MASS_STORAGE_CLASS &&             /* check if the class is mass storage */
-                     desc_ptr[6] == MASS_STORAGE_SUBCLASS_SCSI &&     /* check if the subclass is SCSI      */
-                     desc_ptr[7] == MASS_STORAGE_PROTOCOL_BO) {       /* check if the protocol is Bulk only */
-                     ms_int_found = 1;
-                     desc_ptr    += desc_ptr[0];                      /* Move to next descriptor start      */
-                 }
-                 break;
-
-            case USB_DESCRIPTOR_TYPE_ENDPOINT:                        /* If it is an endpoint descriptor    */
-                 if ((desc_ptr[3] & 0x03) == 0x02) {                  /* If it is Bulk endpoint             */
-                     if (desc_ptr[2] & 0x80) {                        /* If it is In endpoint               */
-                         EDBulkIn->Control =  1                             |      /* USB address           */
-                                              ((desc_ptr[2] & 0x7F) << 7)   |      /* Endpoint address      */
-                                              (2 << 11)                     |      /* direction             */
-                                              (ReadLE16U(&desc_ptr[4]) << 16);     /* MaxPkt Size           */
-                         desc_ptr += desc_ptr[0];                     /* Move to next descriptor start      */
-                     } else {                                         /* If it is Out endpoint              */
-                         EDBulkOut->Control = 1                             |      /* USB address           */
-                                              ((desc_ptr[2] & 0x7F) << 7)   |      /* Endpoint address      */
-                                              (1 << 11)                     |      /* direction             */
-                                              (ReadLE16U(&desc_ptr[4]) << 16);     /* MaxPkt Size           */
-                         desc_ptr += desc_ptr[0];                     /* Move to next descriptor start      */
-                     }
-                 } else {                                             /* If it is not bulk end point        */
-                     desc_ptr += desc_ptr[0];                         /* Move to next descriptor start      */
-                 }
-                 break;
-
-            default:                                 /* If the descriptor is neither interface nor endpoint */
-                 desc_ptr += desc_ptr[0];                             /* Move to next descriptor start      */
-                 break;
-        }
-    }
-    if (ms_int_found) {
-        PRINT_Log("Mass Storage device connected\n");
-        return (OK);
-    } else {
-        PRINT_Log("Not a Mass Storage device\n");
-        return (ERR_NO_MS_INTERFACE);
-    }
-}
-
-/*
-**************************************************************************************************************
-*                                         GET MAXIMUM LOGICAL UNIT
-*
-* Description: This function returns the maximum logical unit from the device
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  MS_GetMaxLUN (void)
-{
-    USB_INT32S  rc;
-
-
-    rc = Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE,
-                       MS_GET_MAX_LUN_REQ,
-                       0,
-                       0,
-                       1,
-                       TDBuffer);
-    return (rc); 
-}
-
-/*
-**************************************************************************************************************
-*                                          GET SENSE INFORMATION
-*
-* Description: This function is used to get sense information from the device
-*
-* Arguments  : None
-*
-* Returns    : OK       if Success
-*              ERROR    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  MS_GetSenseInfo (void)
-{
-    USB_INT32S  rc;
-
-
-    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_REQUEST_SENSE, 6);
-    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
-    if (rc == OK) {
-        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 18);
-        if (rc == OK) {
-            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
-            if (rc == OK) {
-                if (TDBuffer[12] != 0) {
-                    rc = ERR_MS_CMD_FAILED;
-                }
-            }
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                           TEST UNIT READY
-*
-* Description: This function is used to test whether the unit is ready or not
-*
-* Arguments  : None
-*
-* Returns    : OK       if Success
-*              ERROR    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  MS_TestUnitReady (void)
-{
-    USB_INT32S  rc;
-
-
-    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_NONE, SCSI_CMD_TEST_UNIT_READY, 6);
-    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
-    if (rc == OK) {
-        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
-        if (rc == OK) {        
-            if (TDBuffer[12] != 0) {
-                rc = ERR_MS_CMD_FAILED;
-            }
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                            READ CAPACITY
-*
-* Description: This function is used to read the capacity of the mass storage device
-*
-* Arguments  : None
-*
-* Returns    : OK       if Success
-*              ERROR    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize)
-{
-    USB_INT32S  rc;
-
-
-    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_READ_CAPACITY, 10);
-    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
-    if (rc == OK) {
-        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 8);
-        if (rc == OK) {
-            if (numBlks)
-                *numBlks = ReadBE32U(&TDBuffer[0]);
-            if (blkSize)
-                *blkSize = ReadBE32U(&TDBuffer[4]);
-            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
-            if (rc == OK) {
-                if (TDBuffer[12] != 0) {
-                    rc = ERR_MS_CMD_FAILED;
-                }
-            }
-        }
-    }
-    return (rc);
-}
-
-
-
-USB_INT32S MS_Inquire (USB_INT08U *response)
-{
-    USB_INT32S rc;
-    USB_INT32U i;
-
-    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_INQUIRY, 6);
-    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
-    if (rc == OK) {
-        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, INQUIRY_LENGTH);
-        if (rc == OK) {
-            if (response) {
-                for ( i = 0; i < INQUIRY_LENGTH; i++ )
-                    *response++ = *TDBuffer++;
-#if 0
-                MemCpy (response, TDBuffer, INQUIRY_LENGTH);
-                StrNullTrailingSpace (response->vendorID, SCSI_INQUIRY_VENDORCHARS);
-                StrNullTrailingSpace (response->productID, SCSI_INQUIRY_PRODUCTCHARS);
-                StrNullTrailingSpace (response->productRev, SCSI_INQUIRY_REVCHARS);
-#endif
-            }
-            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
-            if (rc == OK) {
-                if (TDBuffer[12] != 0) {    // bCSWStatus byte
-                    rc = ERR_MS_CMD_FAILED;
-                }
-            }
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                         RECEIVE THE BULK DATA
-*
-* Description: This function is used to receive the bulk data
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-    
-USB_INT32S  MS_BulkRecv (          USB_INT32U   block_number,
-                                   USB_INT16U   num_blocks,
-                         volatile  USB_INT08U  *user_buffer)
-{
-    USB_INT32S  rc;
-    int i;
-    volatile USB_INT08U *c = user_buffer;
-    for (i=0;i<MS_BlkSize*num_blocks;i++)
-        *c++ = 0;
-
-
-    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_IN, SCSI_CMD_READ_10, 10);
-
-    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
-    if (rc == OK) {
-        rc = Host_ProcessTD(EDBulkIn, TD_IN, user_buffer, MS_BlkSize * num_blocks);
-        if (rc == OK) {
-            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
-            if (rc == OK) {
-                if (TDBuffer[12] != 0) {
-                    rc = ERR_MS_CMD_FAILED;
-                }
-            }
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                         SEND BULK DATA
-*
-* Description: This function is used to send the bulk data
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-USB_INT32S  MS_BulkSend (          USB_INT32U   block_number,
-                                   USB_INT16U   num_blocks,
-                         volatile  USB_INT08U  *user_buffer)
-{
-    USB_INT32S  rc;
-
-
-    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_OUT, SCSI_CMD_WRITE_10, 10);
-
-    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
-    if (rc == OK) {
-        rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks);
-        if (rc == OK) {
-            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
-            if (rc == OK) {
-                if (TDBuffer[12] != 0) {
-                    rc = ERR_MS_CMD_FAILED;
-                }
-            }
-        }
-    }
-    return (rc);
-}
-
-/*
-**************************************************************************************************************
-*                                         FILL MASS STORAGE COMMAND
-*
-* Description: This function is used to fill the mass storage command
-*
-* Arguments  : None
-*
-* Returns    : OK                      if Success
-*              ERR_INVALID_BOOTSIG    if Failed
-*
-**************************************************************************************************************
-*/
-
-void  Fill_MSCommand (USB_INT32U   block_number,
-                      USB_INT32U   block_size,
-                      USB_INT16U   num_blocks,
-                      MS_DATA_DIR  direction,
-                      USB_INT08U   scsi_cmd,
-                      USB_INT08U   scsi_cmd_len)
-{
-            USB_INT32U  data_len;
-    static  USB_INT32U  tag_cnt = 0;
-            USB_INT32U  cnt;
-
-
-    for (cnt = 0; cnt < CBW_SIZE; cnt++) {
-         TDBuffer[cnt] = 0;
-    }
-    switch(scsi_cmd) {
-
-        case SCSI_CMD_TEST_UNIT_READY:
-             data_len = 0;
-             break;
-        case SCSI_CMD_READ_CAPACITY:
-             data_len = 8;
-             break;
-        case SCSI_CMD_REQUEST_SENSE:
-             data_len = 18;
-             break;
-        case SCSI_CMD_INQUIRY:
-             data_len = 36;
-             break;
-        default:
-             data_len = block_size * num_blocks;
-             break;
-    }
-    WriteLE32U(TDBuffer, CBW_SIGNATURE);
-    WriteLE32U(&TDBuffer[4], tag_cnt);
-    WriteLE32U(&TDBuffer[8], data_len);
-    TDBuffer[12]     = (direction == MS_DATA_DIR_NONE) ? 0 : direction;
-    TDBuffer[14]     = scsi_cmd_len;                                   /* Length of the CBW                 */
-    TDBuffer[15]     = scsi_cmd;
-    if ((scsi_cmd     == SCSI_CMD_REQUEST_SENSE)
-     || (scsi_cmd     == SCSI_CMD_INQUIRY)) {
-        TDBuffer[19] = (USB_INT08U)data_len;
-    } else {
-        WriteBE32U(&TDBuffer[17], block_number);
-    }
-    WriteBE16U(&TDBuffer[22], num_blocks);
-}
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_ms.c
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_ms.h"
+
+/*
+**************************************************************************************************************
+*                                         GLOBAL VARIABLES
+**************************************************************************************************************
+*/
+
+USB_INT32U  MS_BlkSize;
+
+/*
+**************************************************************************************************************
+*                                      INITIALIZE MASS STORAGE INTERFACE
+*
+* Description: This function initializes the mass storage interface
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult)
+{
+    USB_INT08U  retry;
+    USB_INT32S  rc;
+
+    MS_GetMaxLUN();                                                    /* Get maximum logical unit number   */
+    retry  = 80;
+    while(retry) {
+        rc = MS_TestUnitReady();                                       /* Test whether the unit is ready    */
+        if (rc == OK) {
+            break;
+        }
+        MS_GetSenseInfo();                                             /* Get sense information             */
+        retry--;
+    }
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    rc = MS_ReadCapacity(numBlks, blkSize);                         /* Read capacity of the disk         */
+    MS_BlkSize = *blkSize;                        // Set global
+    rc = MS_Inquire (inquiryResult);
+    return (rc);
+}
+/*
+**************************************************************************************************************
+*                                         PARSE THE CONFIGURATION
+*
+* Description: This function is used to parse the configuration
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_ParseConfiguration (void)
+{
+    volatile  USB_INT08U  *desc_ptr;
+              USB_INT08U   ms_int_found;
+
+
+    desc_ptr     = TDBuffer;
+    ms_int_found = 0;
+
+    if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION) {    
+        return (ERR_BAD_CONFIGURATION);
+    }
+    desc_ptr += desc_ptr[0];
+
+    while (desc_ptr != TDBuffer + ReadLE16U(&TDBuffer[2])) {
+
+        switch (desc_ptr[1]) {
+
+            case USB_DESCRIPTOR_TYPE_INTERFACE:                       /* If it is an interface descriptor   */
+                 if (desc_ptr[5] == MASS_STORAGE_CLASS &&             /* check if the class is mass storage */
+                     desc_ptr[6] == MASS_STORAGE_SUBCLASS_SCSI &&     /* check if the subclass is SCSI      */
+                     desc_ptr[7] == MASS_STORAGE_PROTOCOL_BO) {       /* check if the protocol is Bulk only */
+                     ms_int_found = 1;
+                     desc_ptr    += desc_ptr[0];                      /* Move to next descriptor start      */
+                 }
+                 break;
+
+            case USB_DESCRIPTOR_TYPE_ENDPOINT:                        /* If it is an endpoint descriptor    */
+                 if ((desc_ptr[3] & 0x03) == 0x02) {                  /* If it is Bulk endpoint             */
+                     if (desc_ptr[2] & 0x80) {                        /* If it is In endpoint               */
+                         EDBulkIn->Control =  1                             |      /* USB address           */
+                                              ((desc_ptr[2] & 0x7F) << 7)   |      /* Endpoint address      */
+                                              (2 << 11)                     |      /* direction             */
+                                              (ReadLE16U(&desc_ptr[4]) << 16);     /* MaxPkt Size           */
+                         desc_ptr += desc_ptr[0];                     /* Move to next descriptor start      */
+                     } else {                                         /* If it is Out endpoint              */
+                         EDBulkOut->Control = 1                             |      /* USB address           */
+                                              ((desc_ptr[2] & 0x7F) << 7)   |      /* Endpoint address      */
+                                              (1 << 11)                     |      /* direction             */
+                                              (ReadLE16U(&desc_ptr[4]) << 16);     /* MaxPkt Size           */
+                         desc_ptr += desc_ptr[0];                     /* Move to next descriptor start      */
+                     }
+                 } else {                                             /* If it is not bulk end point        */
+                     desc_ptr += desc_ptr[0];                         /* Move to next descriptor start      */
+                 }
+                 break;
+
+            default:                                 /* If the descriptor is neither interface nor endpoint */
+                 desc_ptr += desc_ptr[0];                             /* Move to next descriptor start      */
+                 break;
+        }
+    }
+    if (ms_int_found) {
+        PRINT_Log("Mass Storage device connected\n");
+        return (OK);
+    } else {
+        PRINT_Log("Not a Mass Storage device\n");
+        return (ERR_NO_MS_INTERFACE);
+    }
+}
+
+/*
+**************************************************************************************************************
+*                                         GET MAXIMUM LOGICAL UNIT
+*
+* Description: This function returns the maximum logical unit from the device
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_GetMaxLUN (void)
+{
+    USB_INT32S  rc;
+
+
+    rc = Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE,
+                       MS_GET_MAX_LUN_REQ,
+                       0,
+                       0,
+                       1,
+                       TDBuffer);
+    return (rc); 
+}
+
+/*
+**************************************************************************************************************
+*                                          GET SENSE INFORMATION
+*
+* Description: This function is used to get sense information from the device
+*
+* Arguments  : None
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_GetSenseInfo (void)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_REQUEST_SENSE, 6);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 18);
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                           TEST UNIT READY
+*
+* Description: This function is used to test whether the unit is ready or not
+*
+* Arguments  : None
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_TestUnitReady (void)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_NONE, SCSI_CMD_TEST_UNIT_READY, 6);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+        if (rc == OK) {        
+            if (TDBuffer[12] != 0) {
+                rc = ERR_MS_CMD_FAILED;
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                            READ CAPACITY
+*
+* Description: This function is used to read the capacity of the mass storage device
+*
+* Arguments  : None
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_READ_CAPACITY, 10);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 8);
+        if (rc == OK) {
+            if (numBlks)
+                *numBlks = ReadBE32U(&TDBuffer[0]);
+            if (blkSize)
+                *blkSize = ReadBE32U(&TDBuffer[4]);
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+
+
+USB_INT32S MS_Inquire (USB_INT08U *response)
+{
+    USB_INT32S rc;
+    USB_INT32U i;
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_INQUIRY, 6);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, INQUIRY_LENGTH);
+        if (rc == OK) {
+            if (response) {
+                for ( i = 0; i < INQUIRY_LENGTH; i++ )
+                    *response++ = *TDBuffer++;
+#if 0
+                MemCpy (response, TDBuffer, INQUIRY_LENGTH);
+                StrNullTrailingSpace (response->vendorID, SCSI_INQUIRY_VENDORCHARS);
+                StrNullTrailingSpace (response->productID, SCSI_INQUIRY_PRODUCTCHARS);
+                StrNullTrailingSpace (response->productRev, SCSI_INQUIRY_REVCHARS);
+#endif
+            }
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {    // bCSWStatus byte
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         RECEIVE THE BULK DATA
+*
+* Description: This function is used to receive the bulk data
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+    
+USB_INT32S  MS_BulkRecv (          USB_INT32U   block_number,
+                                   USB_INT16U   num_blocks,
+                         volatile  USB_INT08U  *user_buffer)
+{
+    USB_INT32S  rc;
+    int i;
+    volatile USB_INT08U *c = user_buffer;
+    for (i=0;i<MS_BlkSize*num_blocks;i++)
+        *c++ = 0;
+
+
+    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_IN, SCSI_CMD_READ_10, 10);
+
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, user_buffer, MS_BlkSize * num_blocks);
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         SEND BULK DATA
+*
+* Description: This function is used to send the bulk data
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_BulkSend (          USB_INT32U   block_number,
+                                   USB_INT16U   num_blocks,
+                         volatile  USB_INT08U  *user_buffer)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_OUT, SCSI_CMD_WRITE_10, 10);
+
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks);
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         FILL MASS STORAGE COMMAND
+*
+* Description: This function is used to fill the mass storage command
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+void  Fill_MSCommand (USB_INT32U   block_number,
+                      USB_INT32U   block_size,
+                      USB_INT16U   num_blocks,
+                      MS_DATA_DIR  direction,
+                      USB_INT08U   scsi_cmd,
+                      USB_INT08U   scsi_cmd_len)
+{
+            USB_INT32U  data_len;
+    static  USB_INT32U  tag_cnt = 0;
+            USB_INT32U  cnt;
+
+
+    for (cnt = 0; cnt < CBW_SIZE; cnt++) {
+         TDBuffer[cnt] = 0;
+    }
+    switch(scsi_cmd) {
+
+        case SCSI_CMD_TEST_UNIT_READY:
+             data_len = 0;
+             break;
+        case SCSI_CMD_READ_CAPACITY:
+             data_len = 8;
+             break;
+        case SCSI_CMD_REQUEST_SENSE:
+             data_len = 18;
+             break;
+        case SCSI_CMD_INQUIRY:
+             data_len = 36;
+             break;
+        default:
+             data_len = block_size * num_blocks;
+             break;
+    }
+    WriteLE32U(TDBuffer, CBW_SIGNATURE);
+    WriteLE32U(&TDBuffer[4], tag_cnt);
+    WriteLE32U(&TDBuffer[8], data_len);
+    TDBuffer[12]     = (direction == MS_DATA_DIR_NONE) ? 0 : direction;
+    TDBuffer[14]     = scsi_cmd_len;                                   /* Length of the CBW                 */
+    TDBuffer[15]     = scsi_cmd;
+    if ((scsi_cmd     == SCSI_CMD_REQUEST_SENSE)
+     || (scsi_cmd     == SCSI_CMD_INQUIRY)) {
+        TDBuffer[19] = (USB_INT08U)data_len;
+    } else {
+        WriteBE32U(&TDBuffer[17], block_number);
+    }
+    WriteBE16U(&TDBuffer[22], num_blocks);
+}
--- a/USBHostLite/usbhost_ms.h	Mon Jul 23 09:59:06 2012 +0000
+++ b/USBHostLite/usbhost_ms.h	Sun Sep 16 15:00:33 2012 +0000
@@ -1,101 +1,101 @@
-/*
-**************************************************************************************************************
-*                                                 NXP USB Host Stack
-*
-*                                     (c) Copyright 2008, NXP SemiConductors
-*                                     (c) Copyright 2008, OnChip  Technologies LLC
-*                                                 All Rights Reserved
-*
-*                                                  www.nxp.com
-*                                               www.onchiptech.com
-*
-* File           : usbhost_ms.h
-* Programmer(s)  : Ravikanth.P
-* Version        :
-*
-**************************************************************************************************************
-*/
-
-#ifndef  USBHOST_MS_H
-#define  USBHOST_MS_H
-
-/*
-**************************************************************************************************************
-*                                       INCLUDE HEADER FILES
-**************************************************************************************************************
-*/
-
-#include  "usbhost_inc.h"
-
-/*
-**************************************************************************************************************
-*                               MASS STORAGE SPECIFIC DEFINITIONS
-**************************************************************************************************************
-*/
-
-#define    MS_GET_MAX_LUN_REQ            0xFE
-#define    MASS_STORAGE_CLASS            0x08
-#define    MASS_STORAGE_SUBCLASS_SCSI    0x06
-#define    MASS_STORAGE_PROTOCOL_BO      0x50
-
-#define    INQUIRY_LENGTH                36
-/*
-**************************************************************************************************************
-*                                  SCSI SPECIFIC DEFINITIONS
-**************************************************************************************************************
-*/
-
-#define  CBW_SIGNATURE               0x43425355
-#define  CSW_SIGNATURE               0x53425355
-#define  CBW_SIZE                      31
-#define  CSW_SIZE                      13
-#define  CSW_CMD_PASSED              0x00
-#define  SCSI_CMD_REQUEST_SENSE      0x03
-#define  SCSI_CMD_TEST_UNIT_READY    0x00
-#define  SCSI_CMD_INQUIRY            0x12
-#define  SCSI_CMD_READ_10            0x28
-#define  SCSI_CMD_READ_CAPACITY      0x25
-#define  SCSI_CMD_WRITE_10           0x2A
-
-/*
-**************************************************************************************************************
-*                                       TYPE DEFINITIONS
-**************************************************************************************************************
-*/
-
-typedef enum  ms_data_dir {
-
-    MS_DATA_DIR_IN     = 0x80,
-    MS_DATA_DIR_OUT    = 0x00,
-    MS_DATA_DIR_NONE   = 0x01
-
-} MS_DATA_DIR;
-
-/*
-**************************************************************************************************************
-*                                     FUNCTION PROTOTYPES
-**************************************************************************************************************
-*/
-
-USB_INT32S  MS_BulkRecv          (          USB_INT32U    block_number,
-                                            USB_INT16U    num_blocks,
-                                  volatile  USB_INT08U   *user_buffer);
-
-USB_INT32S  MS_BulkSend          (          USB_INT32U    block_number,
-                                            USB_INT16U    num_blocks,
-                                  volatile  USB_INT08U   *user_buffer);
-USB_INT32S  MS_ParseConfiguration(void);
-USB_INT32S  MS_TestUnitReady     (void);
-USB_INT32S  MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize);
-USB_INT32S  MS_GetMaxLUN         (void);
-USB_INT32S  MS_GetSenseInfo      (void);
-USB_INT32S  MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult);
-USB_INT32S  MS_Inquire (USB_INT08U *response);
-
-void        Fill_MSCommand       (          USB_INT32U    block_number,
-                                            USB_INT32U    block_size,
-                                            USB_INT16U    num_blocks,
-                                            MS_DATA_DIR   direction,
-                                            USB_INT08U    scsi_cmd,
-                                            USB_INT08U    scsi_cmd_len);
-#endif
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_ms.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_MS_H
+#define  USBHOST_MS_H
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_inc.h"
+
+/*
+**************************************************************************************************************
+*                               MASS STORAGE SPECIFIC DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define    MS_GET_MAX_LUN_REQ            0xFE
+#define    MASS_STORAGE_CLASS            0x08
+#define    MASS_STORAGE_SUBCLASS_SCSI    0x06
+#define    MASS_STORAGE_PROTOCOL_BO      0x50
+
+#define    INQUIRY_LENGTH                36
+/*
+**************************************************************************************************************
+*                                  SCSI SPECIFIC DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  CBW_SIGNATURE               0x43425355
+#define  CSW_SIGNATURE               0x53425355
+#define  CBW_SIZE                      31
+#define  CSW_SIZE                      13
+#define  CSW_CMD_PASSED              0x00
+#define  SCSI_CMD_REQUEST_SENSE      0x03
+#define  SCSI_CMD_TEST_UNIT_READY    0x00
+#define  SCSI_CMD_INQUIRY            0x12
+#define  SCSI_CMD_READ_10            0x28
+#define  SCSI_CMD_READ_CAPACITY      0x25
+#define  SCSI_CMD_WRITE_10           0x2A
+
+/*
+**************************************************************************************************************
+*                                       TYPE DEFINITIONS
+**************************************************************************************************************
+*/
+
+typedef enum  ms_data_dir {
+
+    MS_DATA_DIR_IN     = 0x80,
+    MS_DATA_DIR_OUT    = 0x00,
+    MS_DATA_DIR_NONE   = 0x01
+
+} MS_DATA_DIR;
+
+/*
+**************************************************************************************************************
+*                                     FUNCTION PROTOTYPES
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_BulkRecv          (          USB_INT32U    block_number,
+                                            USB_INT16U    num_blocks,
+                                  volatile  USB_INT08U   *user_buffer);
+
+USB_INT32S  MS_BulkSend          (          USB_INT32U    block_number,
+                                            USB_INT16U    num_blocks,
+                                  volatile  USB_INT08U   *user_buffer);
+USB_INT32S  MS_ParseConfiguration(void);
+USB_INT32S  MS_TestUnitReady     (void);
+USB_INT32S  MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize);
+USB_INT32S  MS_GetMaxLUN         (void);
+USB_INT32S  MS_GetSenseInfo      (void);
+USB_INT32S  MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult);
+USB_INT32S  MS_Inquire (USB_INT08U *response);
+
+void        Fill_MSCommand       (          USB_INT32U    block_number,
+                                            USB_INT32U    block_size,
+                                            USB_INT16U    num_blocks,
+                                            MS_DATA_DIR   direction,
+                                            USB_INT08U    scsi_cmd,
+                                            USB_INT08U    scsi_cmd_len);
+#endif