These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!

Revision:
0:bf7b9fba3924
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDEV/USBMassStorage/usbcore.c	Sun Mar 20 05:38:56 2011 +0000
@@ -0,0 +1,820 @@
+/*----------------------------------------------------------------------------
+ *      U S B  -  K e r n e l
+ *----------------------------------------------------------------------------
+ *      Name:    USBCORE.C
+ *      Purpose: USB Core Module
+ *      Version: V1.10
+ *----------------------------------------------------------------------------
+ *      This software is supplied "AS IS" without any warranties, express,
+ *      implied or statutory, including but not limited to the implied
+ *      warranties of fitness for purpose, satisfactory quality and
+ *      noninfringement. Keil extends you a royalty-free right to reproduce
+ *      and distribute executable files created using this software for use
+ *      on NXP Semiconductors LPC family microcontroller devices only. Nothing
+ *      else gives you the right to use this software.
+ *
+ *      Copyright (c) 2005-2009 Keil Software.
+ *---------------------------------------------------------------------------*/
+
+#include "lpc_types.h"
+
+#include "usb.h"
+#include "usbcfg.h"
+#include "usbhw.h"
+#include "usbcore.h"
+#include "usbdesc.h"
+#include "usbuser.h"
+
+#if (USB_CLASS)
+
+#if (USB_AUDIO)
+#include "audio.h"
+#include "adcuser.h"
+#endif
+
+#if (USB_HID)
+#include "hid.h"
+#include "hiduser.h"
+#endif
+
+#if (USB_MSC)
+#include "msc.h"
+#include "mscuser.h"
+extern MSC_CSW CSW;
+#endif
+
+#if (USB_CDC)
+#include "cdc.h"
+#include "cdcuser.h"
+#endif
+
+#endif
+
+#if (USB_VENDOR)
+#include "vendor.h"
+#endif
+
+#ifndef __IAR_SYSTEMS_ICC__
+#pragma diag_suppress 111,1441
+#endif
+
+uint16_t  USB_DeviceStatus;
+uint8_t  USB_DeviceAddress;
+uint8_t  USB_Configuration;
+uint32_t USB_EndPointMask;
+uint32_t USB_EndPointHalt;
+uint8_t  USB_NumInterfaces;
+uint8_t  USB_AltSetting[USB_IF_NUM];
+
+uint8_t  EP0Buf[USB_MAX_PACKET0];
+
+
+USB_EP_DATA EP0Data;
+
+USB_SETUP_PACKET SetupPacket;
+
+
+/*
+ *  Reset USB Core
+ *    Parameters:      None
+ *    Return Value:    None
+ */
+
+void USB_ResetCore (void) {
+
+  USB_DeviceStatus  = USB_POWER;
+  USB_DeviceAddress = 0;
+  USB_Configuration = 0;
+  USB_EndPointMask  = 0x00010001;
+  USB_EndPointHalt  = 0x00000000;
+}
+
+
+/*
+ *  USB Request - Setup Stage
+ *    Parameters:      None (global SetupPacket)
+ *    Return Value:    None
+ */
+
+void USB_SetupStage (void) {
+  USB_ReadEP(0x00, (uint8_t *)&SetupPacket);
+}
+
+
+/*
+ *  USB Request - Data In Stage
+ *    Parameters:      None (global EP0Data)
+ *    Return Value:    None
+ */
+
+void USB_DataInStage (void) {
+  uint32_t cnt;
+
+  if (EP0Data.Count > USB_MAX_PACKET0) {
+    cnt = USB_MAX_PACKET0;
+  } else {
+    cnt = EP0Data.Count;
+  }
+  cnt = USB_WriteEP(0x80, EP0Data.pData, cnt);
+  EP0Data.pData += cnt;
+  EP0Data.Count -= cnt;
+}
+
+
+/*
+ *  USB Request - Data Out Stage
+ *    Parameters:      None (global EP0Data)
+ *    Return Value:    None
+ */
+
+void USB_DataOutStage (void) {
+  uint32_t cnt;
+
+  cnt = USB_ReadEP(0x00, EP0Data.pData);
+  EP0Data.pData += cnt;
+  EP0Data.Count -= cnt;
+}
+
+
+/*
+ *  USB Request - Status In Stage
+ *    Parameters:      None
+ *    Return Value:    None
+ */
+
+void USB_StatusInStage (void) {
+  USB_WriteEP(0x80, NULL, 0);
+}
+
+
+/*
+ *  USB Request - Status Out Stage
+ *    Parameters:      None
+ *    Return Value:    None
+ */
+
+void USB_StatusOutStage (void) {
+  USB_ReadEP(0x00, EP0Buf);
+}
+
+
+/*
+ *  Get Status USB Request
+ *    Parameters:      None (global SetupPacket)
+ *    Return Value:    TRUE - Success, FALSE - Error
+ */
+
+#ifdef __IAR_SYSTEMS_ICC__
+inline uint32_t USB_GetStatus (void) {
+#else
+__inline uint32_t USB_GetStatus (void) {
+#endif
+  uint32_t n, m;
+
+  switch (SetupPacket.bmRequestType.BM.Recipient) {
+    case REQUEST_TO_DEVICE:
+      EP0Data.pData = (uint8_t *)&USB_DeviceStatus;
+      USB_DataInStage();
+      break;
+    case REQUEST_TO_INTERFACE:
+      if ((USB_Configuration != 0) && (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
+        *((__packed uint16_t *)EP0Buf) = 0;
+        EP0Data.pData = EP0Buf;
+        USB_DataInStage();
+      } else {
+        return (FALSE);
+      }
+      break;
+    case REQUEST_TO_ENDPOINT:
+      n = SetupPacket.wIndex.WB.L & 0x8F;
+      m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
+      if (((USB_Configuration != 0) || ((n & 0x0F) == 0)) && (USB_EndPointMask & m)) {
+        *((__packed uint16_t *)EP0Buf) = (USB_EndPointHalt & m) ? 1 : 0;
+        EP0Data.pData = EP0Buf;
+        USB_DataInStage();
+      } else {
+        return (FALSE);
+      }
+      break;
+    default:
+      return (FALSE);
+  }
+  return (TRUE);
+}
+
+
+/*
+ *  Set/Clear Feature USB Request
+ *    Parameters:      sc:    0 - Clear, 1 - Set
+ *                            None (global SetupPacket)
+ *    Return Value:    TRUE - Success, FALSE - Error
+ */
+
+#ifdef __IAR_SYSTEMS_ICC__
+inline uint32_t USB_SetClrFeature (uint32_t sc) {
+#else
+__inline uint32_t USB_SetClrFeature (uint32_t sc) {
+#endif
+  uint32_t n, m;
+
+  switch (SetupPacket.bmRequestType.BM.Recipient) {
+    case REQUEST_TO_DEVICE:
+      if (SetupPacket.wValue.W == USB_FEATURE_REMOTE_WAKEUP) {
+        if (sc) {
+          USB_WakeUpCfg(TRUE);
+          USB_DeviceStatus |=  USB_GETSTATUS_REMOTE_WAKEUP;
+        } else {
+          USB_WakeUpCfg(FALSE);
+          USB_DeviceStatus &= ~USB_GETSTATUS_REMOTE_WAKEUP;
+        }
+      } else {
+        return (FALSE);
+      }
+      break;
+    case REQUEST_TO_INTERFACE:
+      return (FALSE);
+    case REQUEST_TO_ENDPOINT:
+      n = SetupPacket.wIndex.WB.L & 0x8F;
+      m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
+      if ((USB_Configuration != 0) && ((n & 0x0F) != 0) && (USB_EndPointMask & m)) {
+        if (SetupPacket.wValue.W == USB_FEATURE_ENDPOINT_STALL) {
+          if (sc) {
+            USB_SetStallEP(n);
+            USB_EndPointHalt |=  m;
+          } else {
+            USB_ClrStallEP(n);
+            USB_EndPointHalt &= ~m;
+          }
+        } else {
+          return (FALSE);
+        }
+      } else {
+        return (FALSE);
+      }
+      break;
+    default:
+      return (FALSE);
+  }
+  return (TRUE);
+}
+
+
+/*
+ *  Get Descriptor USB Request
+ *    Parameters:      None (global SetupPacket)
+ *    Return Value:    TRUE - Success, FALSE - Error
+ */
+
+#ifdef __IAR_SYSTEMS_ICC__
+inline uint32_t USB_GetDescriptor (void) {
+#else
+__inline uint32_t USB_GetDescriptor (void) {
+#endif
+  uint8_t  *pD;
+  uint32_t len, n;
+
+  switch (SetupPacket.bmRequestType.BM.Recipient) {
+    case REQUEST_TO_DEVICE:
+      switch (SetupPacket.wValue.WB.H) {
+        case USB_DEVICE_DESCRIPTOR_TYPE:
+          EP0Data.pData = (uint8_t *)USB_DeviceDescriptor;
+          len = USB_DEVICE_DESC_SIZE;
+          break;
+        case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+          pD = (uint8_t *)USB_ConfigDescriptor;
+          for (n = 0; n != SetupPacket.wValue.WB.L; n++) {
+            if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength != 0) {
+              pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
+            }
+          }
+          if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bLength == 0) {
+            return (FALSE);
+          }
+          EP0Data.pData = pD;
+          len = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
+          break;
+        case USB_STRING_DESCRIPTOR_TYPE:
+          EP0Data.pData = (uint8_t *)USB_StringDescriptor + SetupPacket.wValue.WB.L;
+          len = ((USB_STRING_DESCRIPTOR *)EP0Data.pData)->bLength;
+          break;
+        default:
+          return (FALSE);
+      }
+      break;
+    case REQUEST_TO_INTERFACE:
+      switch (SetupPacket.wValue.WB.H) {
+#if USB_HID
+        case HID_HID_DESCRIPTOR_TYPE:
+          if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) {
+            return (FALSE);    /* Only Single HID Interface is supported */
+          }
+          EP0Data.pData = (uint8_t *)USB_ConfigDescriptor + HID_DESC_OFFSET;
+          len = HID_DESC_SIZE;
+          break;
+        case HID_REPORT_DESCRIPTOR_TYPE:
+          if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) {
+            return (FALSE);    /* Only Single HID Interface is supported */
+          }
+          EP0Data.pData = (uint8_t *)HID_ReportDescriptor;
+          len = HID_ReportDescSize;
+          break;
+        case HID_PHYSICAL_DESCRIPTOR_TYPE:
+          return (FALSE);      /* HID Physical Descriptor is not supported */
+#endif
+        default:
+          return (FALSE);
+      }
+    default:
+      return (FALSE);
+  }
+
+  if (EP0Data.Count > len) {
+    EP0Data.Count = len;
+  }
+  USB_DataInStage();
+
+  return (TRUE);
+}
+
+
+/*
+ *  Set Configuration USB Request
+ *    Parameters:      None (global SetupPacket)
+ *    Return Value:    TRUE - Success, FALSE - Error
+ */
+
+#ifdef __IAR_SYSTEMS_ICC__
+inline uint32_t USB_SetConfiguration (void) {
+#else
+__inline uint32_t USB_SetConfiguration (void) {
+#endif
+  USB_COMMON_DESCRIPTOR *pD;
+	uint32_t  alt, n, m;
+	uint32_t tmp;
+
+  if (SetupPacket.wValue.WB.L) {
+    pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
+    while (pD->bLength) {
+      switch (pD->bDescriptorType) {
+        case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+          if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) {
+            USB_Configuration = SetupPacket.wValue.WB.L;
+            USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces;
+            for (n = 0; n < USB_IF_NUM; n++) {
+              USB_AltSetting[n] = 0;
+            }
+            for (n = 1; n < 16; n++) {
+              if (USB_EndPointMask & (1 << n)) {
+                USB_DisableEP(n);
+              }
+              if (USB_EndPointMask & ((1 << 16) << n)) {
+                USB_DisableEP(n | 0x80);
+              }
+            }
+            USB_EndPointMask = 0x00010001;
+            USB_EndPointHalt = 0x00000000;
+            USB_Configure(TRUE);
+            if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_SELF_POWERED) {
+              USB_DeviceStatus |=  USB_GETSTATUS_SELF_POWERED;
+            } else {
+              USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED;
+            }
+          } else {
+            //(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
+            tmp = (uint32_t) pD;
+            tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
+            pD = (USB_COMMON_DESCRIPTOR *)tmp;
+            continue;
+          }
+          break;
+        case USB_INTERFACE_DESCRIPTOR_TYPE:
+          alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
+          break;
+        case USB_ENDPOINT_DESCRIPTOR_TYPE:
+          if (alt == 0) {
+            n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
+            m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
+            USB_EndPointMask |= m;
+            USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
+            USB_EnableEP(n);
+            USB_ResetEP(n);
+          }
+          break;
+      }
+      //(uint8_t *)pD += pD->bLength;
+      tmp = (uint32_t) pD;
+      tmp += pD->bLength;
+      pD = (USB_COMMON_DESCRIPTOR *)tmp;
+    }
+  }
+  else {
+    USB_Configuration = 0;
+    for (n = 1; n < 16; n++) {
+      if (USB_EndPointMask & (1 << n)) {
+        USB_DisableEP(n);
+      }
+      if (USB_EndPointMask & ((1 << 16) << n)) {
+        USB_DisableEP(n | 0x80);
+      }
+    }
+    USB_EndPointMask  = 0x00010001;
+    USB_EndPointHalt  = 0x00000000;
+    USB_Configure(FALSE);
+  }
+
+  if (USB_Configuration == SetupPacket.wValue.WB.L) {
+    return (TRUE);
+  } else {
+    return (FALSE);
+  }
+}
+
+
+/*
+ *  Set Interface USB Request
+ *    Parameters:      None (global SetupPacket)
+ *    Return Value:    TRUE - Success, FALSE - Error
+ */
+
+#ifdef __IAR_SYSTEMS_ICC__
+inline uint32_t USB_SetInterface (void) {
+#else
+__inline uint32_t USB_SetInterface (void) {
+#endif
+  USB_COMMON_DESCRIPTOR *pD;
+  uint32_t                  ifn, alt, old, msk, n, m;
+  uint32_t                   set;
+  uint32_t tmp;
+
+  if (USB_Configuration == 0) return (FALSE);
+
+  set = FALSE;
+  pD  = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
+  while (pD->bLength) {
+    switch (pD->bDescriptorType) {
+      case USB_CONFIGURATION_DESCRIPTOR_TYPE:
+        if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) {
+          //(uint8_t *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
+        	tmp = (uint32_t)pD;
+        	tmp += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
+        	pD = (USB_COMMON_DESCRIPTOR *)tmp;
+          continue;
+        }
+        break;
+      case USB_INTERFACE_DESCRIPTOR_TYPE:
+        ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber;
+        alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
+        msk = 0;
+        if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) {
+          set = TRUE;
+          old = USB_AltSetting[ifn];
+          USB_AltSetting[ifn] = (uint8_t)alt;
+        }
+        break;
+      case USB_ENDPOINT_DESCRIPTOR_TYPE:
+        if (ifn == SetupPacket.wIndex.WB.L) {
+          n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
+          m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
+          if (alt == SetupPacket.wValue.WB.L) {
+            USB_EndPointMask |=  m;
+            USB_EndPointHalt &= ~m;
+            USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
+            USB_EnableEP(n);
+            USB_ResetEP(n);
+            msk |= m;
+          }
+          else if ((alt == old) && ((msk & m) == 0)) {
+            USB_EndPointMask &= ~m;
+            USB_EndPointHalt &= ~m;
+            USB_DisableEP(n);
+          }
+        }
+        break;
+    }
+    //(uint8_t *)pD += pD->bLength;
+    tmp = (uint32_t)pD;
+    tmp += pD->bLength;
+    pD = (USB_COMMON_DESCRIPTOR *) tmp;
+  }
+  return (set);
+}
+
+
+/*
+ *  USB Endpoint 0 Event Callback
+ *    Parameter:       event
+ */
+
+void USB_EndPoint0 (uint32_t event) {
+
+  switch (event) {
+
+    case USB_EVT_SETUP:
+      USB_SetupStage();
+      USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
+      EP0Data.Count = SetupPacket.wLength;
+      switch (SetupPacket.bmRequestType.BM.Type) {
+
+        case REQUEST_STANDARD:
+          switch (SetupPacket.bRequest) {
+
+            case USB_REQUEST_GET_STATUS:
+              if (!USB_GetStatus()) {
+                goto stall_i;
+              }
+              break;
+
+            case USB_REQUEST_CLEAR_FEATURE:
+              if (!USB_SetClrFeature(0)) {
+                goto stall_i;
+              }
+              USB_StatusInStage();
+#if USB_FEATURE_EVENT
+              USB_Feature_Event();
+#endif
+              break;
+
+            case USB_REQUEST_SET_FEATURE:
+              if (!USB_SetClrFeature(1)) {
+                goto stall_i;
+              }
+              USB_StatusInStage();
+#if USB_FEATURE_EVENT
+              USB_Feature_Event();
+#endif
+              break;
+
+            case USB_REQUEST_SET_ADDRESS:
+              switch (SetupPacket.bmRequestType.BM.Recipient) {
+                case REQUEST_TO_DEVICE:
+                  USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L;
+                  USB_StatusInStage();
+                  break;
+                default:
+                  goto stall_i;
+              }
+              break;
+
+            case USB_REQUEST_GET_DESCRIPTOR:
+              if (!USB_GetDescriptor()) {
+                goto stall_i;
+              }
+              break;
+
+            case USB_REQUEST_SET_DESCRIPTOR:
+/*stall_o:*/  USB_SetStallEP(0x00);
+              EP0Data.Count = 0;
+              break;
+
+            case USB_REQUEST_GET_CONFIGURATION:
+              switch (SetupPacket.bmRequestType.BM.Recipient) {
+                case REQUEST_TO_DEVICE:
+                  EP0Data.pData = &USB_Configuration;
+                  USB_DataInStage();
+                  break;
+                default:
+                  goto stall_i;
+              }
+              break;
+
+            case USB_REQUEST_SET_CONFIGURATION:
+              switch (SetupPacket.bmRequestType.BM.Recipient) {
+                case REQUEST_TO_DEVICE:
+                  if (!USB_SetConfiguration()) {
+                    goto stall_i;
+                  }
+                  USB_StatusInStage();
+#if USB_CONFIGURE_EVENT
+                  USB_Configure_Event();
+#endif
+                  break;
+                default:
+                  goto stall_i;
+              }
+              break;
+
+            case USB_REQUEST_GET_INTERFACE:
+              switch (SetupPacket.bmRequestType.BM.Recipient) {
+                case REQUEST_TO_INTERFACE:
+                  if ((USB_Configuration != 0) &&
+                      (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
+                    EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L;
+                    USB_DataInStage();
+                  } else {
+                    goto stall_i;
+                  }
+                  break;
+                default:
+                  goto stall_i;
+              }
+              break;
+
+            case USB_REQUEST_SET_INTERFACE:
+              switch (SetupPacket.bmRequestType.BM.Recipient) {
+                case REQUEST_TO_INTERFACE:
+                  if (!USB_SetInterface()) {
+                    goto stall_i;
+                  }
+                  USB_StatusInStage();
+#if USB_INTERFACE_EVENT
+                  USB_Interface_Event();
+#endif
+                  break;
+                default:
+                  goto stall_i;
+              }
+              break;
+
+            default:
+              goto stall_i;
+
+          }
+          break;
+
+        case REQUEST_CLASS:
+#if USB_CLASS
+          switch (SetupPacket.bmRequestType.BM.Recipient) {
+            case REQUEST_TO_INTERFACE:
+#if USB_HID
+              if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) {
+                switch (SetupPacket.bRequest) {
+                  case HID_REQUEST_GET_REPORT:
+                    if (HID_GetReport()) {
+                      EP0Data.pData = EP0Buf;
+                      USB_DataInStage();
+                      goto class_ok;
+                    }
+                    break;
+                  case HID_REQUEST_SET_REPORT:
+                    EP0Data.pData = EP0Buf;
+                    goto class_ok;
+                  case HID_REQUEST_GET_IDLE:
+                    if (HID_GetIdle()) {
+                      EP0Data.pData = EP0Buf;
+                      USB_DataInStage();
+                      goto class_ok;
+                    }
+                    break;
+                  case HID_REQUEST_SET_IDLE:
+                    if (HID_SetIdle()) {
+                      USB_StatusInStage();
+                      goto class_ok;
+                    }
+                    break;
+                  case HID_REQUEST_GET_PROTOCOL:
+                    if (HID_GetProtocol()) {
+                      EP0Data.pData = EP0Buf;
+                      USB_DataInStage();
+                      goto class_ok;
+                    }
+                    break;
+                  case HID_REQUEST_SET_PROTOCOL:
+                    if (HID_SetProtocol()) {
+                      USB_StatusInStage();
+                      goto class_ok;
+                    }
+                    break;
+                }
+              }
+#endif  /* USB_HID */
+#if USB_MSC
+              if (SetupPacket.wIndex.WB.L == USB_MSC_IF_NUM) {
+                switch (SetupPacket.bRequest) {
+                  case MSC_REQUEST_RESET:
+                    if (MSC_Reset()) {
+                      USB_StatusInStage();
+                      goto class_ok;
+                    }
+                    break;
+                  case MSC_REQUEST_GET_MAX_LUN:
+                    if (MSC_GetMaxLUN()) {
+                      EP0Data.pData = EP0Buf;
+                      USB_DataInStage();
+                      goto class_ok;
+                    }
+                    break;
+                }
+              }
+#endif  /* USB_MSC */
+#if USB_AUDIO
+              if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM)  ||
+                  (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) ||
+                  (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) {
+                if (SetupPacket.bmRequestType.BM.Dir) {
+                  if (ADC_IF_GetRequest()) {
+                    EP0Data.pData = EP0Buf;
+                    USB_DataInStage();
+                    goto class_ok;
+                  }
+                } else {
+                  EP0Data.pData = EP0Buf;
+                  goto class_ok;
+                }
+              }
+#endif  /* USB_AUDIO */
+              goto stall_i;
+#if USB_AUDIO
+            case REQUEST_TO_ENDPOINT:
+              if (SetupPacket.bmRequestType.BM.Dir) {
+                if (ADC_EP_GetRequest()) {
+                  EP0Data.pData = EP0Buf;
+                  USB_DataInStage();
+                  goto class_ok;
+                }
+              } else {
+                EP0Data.pData = EP0Buf;
+                goto class_ok;
+              }
+              goto stall_i;
+#endif  /* USB_AUDIO */
+            default:
+              goto stall_i;
+          }
+class_ok: break;
+#else
+          goto stall_i;
+#endif  /* USB_CLASS */
+
+        case REQUEST_VENDOR:
+          goto stall_i;
+
+        default:
+stall_i:  USB_SetStallEP(0x80);
+          EP0Data.Count = 0;
+          break;
+
+      }
+      break;
+
+    case USB_EVT_OUT:
+      if (SetupPacket.bmRequestType.BM.Dir == 0) {
+        if (EP0Data.Count) {
+          USB_DataOutStage();
+          if (EP0Data.Count == 0) {
+            switch (SetupPacket.bmRequestType.BM.Type) {
+              case REQUEST_STANDARD:
+                goto stall_i;
+#if (USB_CLASS)
+              case REQUEST_CLASS:
+                switch (SetupPacket.bmRequestType.BM.Recipient) {
+                  case REQUEST_TO_INTERFACE:
+#if USB_HID
+                    if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) {
+                      if (!HID_SetReport()) {
+                        goto stall_i;
+                      }
+                      break;
+                    }
+#endif
+#if USB_AUDIO
+                    if ((SetupPacket.wIndex.WB.L == USB_ADC_CIF_NUM)  ||
+                        (SetupPacket.wIndex.WB.L == USB_ADC_SIF1_NUM) ||
+                        (SetupPacket.wIndex.WB.L == USB_ADC_SIF2_NUM)) {
+                      if (!ADC_IF_SetRequest()) {
+                        goto stall_i;
+                      }
+                      break;
+                    }
+#endif
+                    goto stall_i;
+                  case REQUEST_TO_ENDPOINT:
+#if USB_AUDIO
+                    if (ADC_EP_SetRequest()) break;
+#endif
+                    goto stall_i;
+                  default:
+                    goto stall_i;
+                }
+#endif
+              default:
+                goto stall_i;
+            }
+//           USB_StatusInStage();
+          }
+        }
+      } else {
+        USB_StatusOutStage();
+      }
+      break;
+
+    case USB_EVT_IN:
+      if (SetupPacket.bmRequestType.BM.Dir == 1) {
+        USB_DataInStage();
+      } else {
+        if (USB_DeviceAddress & 0x80) {
+          USB_DeviceAddress &= 0x7F;
+          USB_SetAddress(USB_DeviceAddress);
+        }
+      }
+      break;
+
+    case USB_EVT_IN_STALL:
+      USB_ClrStallEP(0x80);
+      break;
+
+    case USB_EVT_OUT_STALL:
+      USB_ClrStallEP(0x00);
+      break;
+
+  }
+}