diff --git a/.cproject b/.cproject
index 135bb21e2..47c5cf37c 100644
--- a/.cproject
+++ b/.cproject
@@ -40,6 +40,11 @@
+
+
diff --git a/README.md b/README.md
index 32066e5b4..d1591c7bc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
tinyusb
=======
-a tiny open usb stack
\ No newline at end of file
+an embedded open-source usb stack for ARM MCUs
\ No newline at end of file
diff --git a/demos/device/keyboard/.cproject b/demos/device/keyboard/.cproject
new file mode 100644
index 000000000..9d00e847e
--- /dev/null
+++ b/demos/device/keyboard/.cproject
@@ -0,0 +1,873 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+<TargetConfig>
+<Properties property_0="" property_3="NXP" property_4="LPC1347" property_count="5" version="1"/>
+<infoList vendor="NXP"><info chip="LPC1347" match_id="0x08020543" name="LPC1347" stub="crt_emu_lpc11_13_nxp"><chip><name>LPC1347</name>
+<family>LPC13xx (12bit ADC)</family>
+<vendor>NXP (formerly Philips)</vendor>
+<reset board="None" core="Real" sys="Real"/>
+<clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/>
+<memory can_program="true" id="Flash" is_ro="true" type="Flash"/>
+<memory id="RAM" type="RAM"/>
+<memory id="Periph" is_volatile="true" type="Peripheral"/>
+<memoryInstance derived_from="Flash" id="MFlash64" location="0x0" size="0x10000"/>
+<memoryInstance derived_from="RAM" id="RamLoc8" location="0x10000000" size="0x2000"/>
+<memoryInstance derived_from="RAM" id="RamUsb2" location="0x20004000" size="0x800"/>
+<memoryInstance derived_from="RAM" id="RamPeriph2" location="0x20000000" size="0x800"/>
+<prog_flash blocksz="0x1000" location="0x0" maxprgbuff="0x400" progwithcode="TRUE" size="0x10000"/>
+<peripheralInstance derived_from="V7M_MPU" id="MPU" location="0xe000ed90"/>
+<peripheralInstance derived_from="V7M_NVIC" id="NVIC" location="0xe000e000"/>
+<peripheralInstance derived_from="V7M_DCR" id="DCR" location="0xe000edf0"/>
+<peripheralInstance derived_from="V7M_ITM" id="ITM" location="0xe0000000"/>
+<peripheralInstance derived_from="I2C" id="I2C" location="0x40000000"/>
+<peripheralInstance derived_from="WWDT" id="WWDT" location="0x40004000"/>
+<peripheralInstance derived_from="USART" id="USART" location="0x40008000"/>
+<peripheralInstance derived_from="CT16B0" id="CT16B0" location="0x4000c000"/>
+<peripheralInstance derived_from="CT16B1" id="CT16B1" location="0x40010000"/>
+<peripheralInstance derived_from="CT32B0" id="CT32B0" location="0x40014000"/>
+<peripheralInstance derived_from="CT32B1" id="CT32B1" location="0x40018000"/>
+<peripheralInstance derived_from="ADC" id="ADC" location="0x4001c000"/>
+<peripheralInstance derived_from="PMU" id="PMU" location="0x40038000"/>
+<peripheralInstance derived_from="FLASHCTRL" id="FLASHCTRL" location="0x4003c000"/>
+<peripheralInstance derived_from="SSP0" id="SSP0" location="0x40040000"/>
+<peripheralInstance derived_from="IOCON" id="IOCON" location="0x40044000"/>
+<peripheralInstance derived_from="SYSCON" id="SYSCON" location="0x40048000"/>
+<peripheralInstance derived_from="GPIO-PIN-INT" id="GPIO-PIN-INT" location="0x4004c000"/>
+<peripheralInstance derived_from="SSP1" id="SSP1" location="0x40058000"/>
+<peripheralInstance derived_from="GPIO-GROUP-INT0" id="GPIO-GROUP-INT0" location="0x4005c000"/>
+<peripheralInstance derived_from="GPIO-GROUP-INT1" id="GPIO-GROUP-INT1" location="0x40060000"/>
+<peripheralInstance derived_from="RITIMER" id="RITIMER" location="0x40064000"/>
+<peripheralInstance derived_from="USB" id="USB" location="0x40080000"/>
+<peripheralInstance derived_from="GPIO-PORT" id="GPIO-PORT" location="0x50000000"/>
+</chip>
+<processor><name gcc_name="cortex-m3">Cortex-M3</name>
+<family>Cortex-M</family>
+</processor>
+<link href="nxp_lpc13Uxx_peripheral.xme" show="embed" type="simple"/>
+</info>
+</infoList>
+</TargetConfig>
+
+
diff --git a/demos/device/keyboard/.project b/demos/device/keyboard/.project
new file mode 100644
index 000000000..9b163e2fb
--- /dev/null
+++ b/demos/device/keyboard/.project
@@ -0,0 +1,84 @@
+
+
+ device_keyboard
+
+
+ CMSISv2p10_LPC13Uxx
+ tinyusb
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+ ?name?
+
+
+
+ org.eclipse.cdt.make.core.append_environment
+ true
+
+
+ org.eclipse.cdt.make.core.autoBuildTarget
+ all
+
+
+ org.eclipse.cdt.make.core.buildArguments
+
+
+
+ org.eclipse.cdt.make.core.buildCommand
+ make
+
+
+ org.eclipse.cdt.make.core.buildLocation
+ ${workspace_loc:/device_keyboard/Debug}
+
+
+ org.eclipse.cdt.make.core.cleanBuildTarget
+ clean
+
+
+ org.eclipse.cdt.make.core.contents
+ org.eclipse.cdt.make.core.activeConfigSettings
+
+
+ org.eclipse.cdt.make.core.enableAutoBuild
+ false
+
+
+ org.eclipse.cdt.make.core.enableCleanBuild
+ true
+
+
+ org.eclipse.cdt.make.core.enableFullBuild
+ true
+
+
+ org.eclipse.cdt.make.core.fullBuildTarget
+ all
+
+
+ org.eclipse.cdt.make.core.stopOnError
+ true
+
+
+ org.eclipse.cdt.make.core.useDefaultBuildCmd
+ true
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/tinyusb/common/arch/arch.h b/tinyusb/common/arch/arch.h
index 3c86c41e3..9a48864e7 100644
--- a/tinyusb/common/arch/arch.h
+++ b/tinyusb/common/arch/arch.h
@@ -35,8 +35,8 @@
* This file is part of the tiny usb stack.
*/
-#ifndef ARCH_H_
-#define ARCH_H_
+#ifndef _TUSB_ARCH_H_
+#define _TUSB_ARCH_H_
#define ARCH_LPC134X 1
#define ARCH_LPC43XX 2
@@ -51,4 +51,4 @@
#endif
-#endif /* ARCH_H_ */
+#endif /* _TUSB_ARCH_H_ */
diff --git a/tinyusb/common/arch/arch_lpc134x.h b/tinyusb/common/arch/arch_lpc134x.h
index ca6c9d097..14002161f 100644
--- a/tinyusb/common/arch/arch_lpc134x.h
+++ b/tinyusb/common/arch/arch_lpc134x.h
@@ -35,11 +35,13 @@
* This file is part of the tiny usb stack.
*/
-#ifndef ARCH_LPC134X_H_
-#define ARCH_LPC134X_H_
-
-#define ARM ARM_M3
+#ifndef _TUSB_ARCH_LPC134_X_H_
+#define _TUSB_ARCH_LPC134_X_H_
#include "arm_mx.h"
-#endif /* ARCH_LPC134X_H_ */
+#define ARM ARM_M3
+
+#define DEVICE_ROMDRIVER
+
+#endif /* _TUSB_ARCH_LPC134_X_H_ */
diff --git a/tinyusb/common/arch/arch_lpc43xx.h b/tinyusb/common/arch/arch_lpc43xx.h
index b05ed1fcd..9af504457 100644
--- a/tinyusb/common/arch/arch_lpc43xx.h
+++ b/tinyusb/common/arch/arch_lpc43xx.h
@@ -35,12 +35,12 @@
* This file is part of the tiny usb stack.
*/
-#ifndef ARCH_LPC43XX_H_
-#define ARCH_LPC43XX_H_
+#ifndef _TUSB_ARCH_LPC43XX_H_
+#define _TUSB_ARCH_LPC43XX_H_
#define ARM ARM_M4
//#define ARM ARM_M0
#include "arm_mx.h"
-#endif /* ARCH_LPC43XX_H_ */
+#endif /* _TUSB_ARCH_LPC43XX_H_ */
diff --git a/tinyusb/common/arch/arm_mx.h b/tinyusb/common/arch/arm_mx.h
index 16b6fc458..5546193eb 100644
--- a/tinyusb/common/arch/arm_mx.h
+++ b/tinyusb/common/arch/arm_mx.h
@@ -35,10 +35,10 @@
* This file is part of the tiny usb stack.
*/
-#ifndef ARM_MX_H_
-#define ARM_MX_H_
+#ifndef _TUSB_ARM_MX_H_
+#define _TUSB_ARM_MX_H_
#define ENDIAN_LITTLE
#define ALIGNMENT (4)
-#endif /* ARM_MX_H_ */
+#endif /* _TUSB_ARM_MX_H_ */
diff --git a/tinyusb/common/common.h b/tinyusb/common/common.h
index 466e08a28..40508b6fa 100644
--- a/tinyusb/common/common.h
+++ b/tinyusb/common/common.h
@@ -35,10 +35,11 @@
* This file is part of the tiny usb stack.
*/
-#ifndef COMMON_H_
-#define COMMON_H_
+#ifndef _TUSB_COMMON_H_
+#define _TUSB_COMMON_H_
#include "arch/arch.h"
#include "compiler/compiler.h"
+#include "errors.h"
-#endif /* COMMON_H_ */
+#endif /* _TUSB_COMMON_H_ */
diff --git a/tinyusb/common/compiler/compiler.h b/tinyusb/common/compiler/compiler.h
index f3a90d70c..0114063e4 100644
--- a/tinyusb/common/compiler/compiler.h
+++ b/tinyusb/common/compiler/compiler.h
@@ -35,11 +35,11 @@
* This file is part of the tiny usb stack.
*/
-#ifndef COMPILER_H_
-#define COMPILER_H_
+#ifndef _TUSB_COMPILER_H_
+#define _TUSB_COMPILER_H_
#if defined(__GNUC__)
#include "compiler_gcc.h"
#endif
-#endif /* COMPILER_H_ */
+#endif /* _TUSB_COMPILER_H_ */
diff --git a/tinyusb/common/compiler/compiler_gcc.h b/tinyusb/common/compiler/compiler_gcc.h
index b6a4286c2..e2671764f 100644
--- a/tinyusb/common/compiler/compiler_gcc.h
+++ b/tinyusb/common/compiler/compiler_gcc.h
@@ -35,8 +35,8 @@
* This file is part of the tiny usb stack.
*/
-#ifndef COMPILER_GCC_H_
-#define COMPILER_GCC_H_
+#ifndef _TUSB_COMPILER_GCC_H_
+#define _TUSB_COMPILER_GCC_H_
#define ATTR_ALIGNED(Bytes) __attribute__ ((aligned(Bytes)))
#define ATTR_PACKED __attribute__ ((packed))
@@ -52,4 +52,4 @@
#define ATTR_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result))
#define ATTR_ALWAYS_INLINE __attribute__ ((always_inline))
-#endif /* COMPILER_GCC_H_ */
+#endif /* _TUSB_COMPILER_GCC_H_ */
diff --git a/tinyusb/common/errors.c b/tinyusb/common/errors.c
new file mode 100644
index 000000000..90753786b
--- /dev/null
+++ b/tinyusb/common/errors.c
@@ -0,0 +1,37 @@
+/*
+ * errors.c
+ *
+ * Created on: Nov 27, 2012
+ * Author: hathach (thachha@live.com)
+ */
+
+/*
+ * Software License Agreement (BSD License)
+ * Copyright (c) 2012, hathach (thachha@live.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the tiny usb stack.
+ */
+
diff --git a/tinyusb/common/errors.h b/tinyusb/common/errors.h
new file mode 100644
index 000000000..0106fb988
--- /dev/null
+++ b/tinyusb/common/errors.h
@@ -0,0 +1,42 @@
+/*
+ * errors.h
+ *
+ * Created on: Nov 27, 2012
+ * Author: hathach (thachha@live.com)
+ */
+
+/*
+ * Software License Agreement (BSD License)
+ * Copyright (c) 2012, hathach (thachha@live.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the tiny usb stack.
+ */
+
+#ifndef _TUSB_ERRORS_H_
+#define _TUSB_ERRORS_H_
+
+
+#endif /* _TUSB_ERRORS_H_ */
diff --git a/tinyusb/device/dcd.c b/tinyusb/device/dcd.c
new file mode 100644
index 000000000..cffe7a474
--- /dev/null
+++ b/tinyusb/device/dcd.c
@@ -0,0 +1,69 @@
+/*
+ * dcd.c
+ *
+ * Created on: Nov 27, 2012
+ * Author: hathach (thachha@live.com)
+ */
+
+/*
+ * Software License Agreement (BSD License)
+ * Copyright (c) 2012, hathach (thachha@live.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the tiny usb stack.
+ */
+
+#include "dcd.h"
+#include "romdriver/power_api.h"
+#define USBD_API ((*(ROM **)(0x1FFF1FF8))->pUSBD) // TODO HAL
+#define ASSERT_STATUS(x) x
+
+void dcd_init()
+{
+ /* ROM DRIVER INIT */
+ USBD_API_INIT_PARAM_T usb_param =
+ {
+// .usb_reg_base = LPC_USB_BASE,
+// .max_num_ep = USB_MAX_EP_NUM,
+// .mem_base = (uint32_t) usb_RomDriver_buffer,
+// .mem_size = USB_ROM_SIZE, //USBD_API->hw->GetMemSize()
+//
+// .USB_Configure_Event = USB_Configure_Event,
+// .USB_Reset_Event = USB_Reset_Event
+ };
+
+ USB_CORE_DESCS_T DeviceDes =
+ {
+// .device_desc = (uint8_t*) &USB_DeviceDescriptor,
+// .string_desc = (uint8_t*) &USB_StringDescriptor,
+// .full_speed_desc = (uint8_t*) &USB_FsConfigDescriptor,
+// .high_speed_desc = (uint8_t*) &USB_FsConfigDescriptor,
+// .device_qualifier = NULL
+ };
+
+ USBD_HANDLE_T g_hUsb;
+ /* Start USB hardware initialisation */
+ ASSERT_STATUS(USBD_API->hw->Init(&g_hUsb, &DeviceDes, &usb_param));
+}
diff --git a/tinyusb/device/dcd.h b/tinyusb/device/dcd.h
index 5cfca54ec..52c92ad5f 100644
--- a/tinyusb/device/dcd.h
+++ b/tinyusb/device/dcd.h
@@ -35,8 +35,13 @@
* This file is part of the tiny usb stack.
*/
-#ifndef DCD_H_
-#define DCD_H_
+#ifndef _TUSB_DCD_H_
+#define _TUSB_DCD_H_
+#include "tusb_cfg.h"
-#endif /* DCD_H_ */
+#ifdef DEVICE_ROMDRIVER
+#include "romdriver/mw_usbd_rom_api.h"
+#endif
+
+#endif /* _TUSB_DCD_H_ */
diff --git a/tinyusb/device/romdriver/error.h b/tinyusb/device/romdriver/error.h
new file mode 100644
index 000000000..9fa1eee28
--- /dev/null
+++ b/tinyusb/device/romdriver/error.h
@@ -0,0 +1,140 @@
+/***********************************************************************
+* $Id:: error.h 228 2011-07-15 18:58:20Z usb06052 $
+*
+* Project: LPC chip software
+*
+* Description:
+* This file contains unified error codes to be used across driver,
+* middleware, applications, hal and demo software.
+*
+* Notes:
+*
+***********************************************************************
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __LPC_ERROR_H__
+#define __LPC_ERROR_H__
+
+/** \file
+ * \brief Error code returned by Boot ROM drivers/library functions.
+ * \ingroup Common
+ *
+ * This file contains unified error codes to be used across driver,
+ * middleware, applications, hal and demo software.
+ *
+ */
+
+/** Error code returned by Boot ROM drivers/library functions
+*
+* Error codes are a 32-bit value with :
+* - The 16 MSB contains the peripheral code number
+* - The 16 LSB contains an error code number associated to that peripheral
+*
+*/
+
+typedef enum
+{
+ /**\b 0x00000000*/ LPC_OK=0, /**< enum value returned on Success */
+ /**\b 0xFFFFFFFF*/ ERR_FAILED = -1, /**< enum value returned on general failure */
+
+ /* ISP related errors */
+ ERR_ISP_BASE = 0x00000000,
+ /*0x00000001*/ ERR_ISP_INVALID_COMMAND = ERR_ISP_BASE + 1,
+ /*0x00000002*/ ERR_ISP_SRC_ADDR_ERROR, /* Source address not on word boundary */
+ /*0x00000003*/ ERR_ISP_DST_ADDR_ERROR, /* Destination address not on word or 256 byte boundary */
+ /*0x00000004*/ ERR_ISP_SRC_ADDR_NOT_MAPPED,
+ /*0x00000005*/ ERR_ISP_DST_ADDR_NOT_MAPPED,
+ /*0x00000006*/ ERR_ISP_COUNT_ERROR, /* Byte count is not multiple of 4 or is not a permitted value */
+ /*0x00000007*/ ERR_ISP_INVALID_SECTOR,
+ /*0x00000008*/ ERR_ISP_SECTOR_NOT_BLANK,
+ /*0x00000009*/ ERR_ISP_SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION,
+ /*0x0000000A*/ ERR_ISP_COMPARE_ERROR,
+ /*0x0000000B*/ ERR_ISP_BUSY, /* Flash programming hardware interface is busy */
+ /*0x0000000C*/ ERR_ISP_PARAM_ERROR, /* Insufficient number of parameters */
+ /*0x0000000D*/ ERR_ISP_ADDR_ERROR, /* Address not on word boundary */
+ /*0x0000000E*/ ERR_ISP_ADDR_NOT_MAPPED,
+ /*0x0000000F*/ ERR_ISP_CMD_LOCKED, /* Command is locked */
+ /*0x00000010*/ ERR_ISP_INVALID_CODE, /* Unlock code is invalid */
+ /*0x00000011*/ ERR_ISP_INVALID_BAUD_RATE,
+ /*0x00000012*/ ERR_ISP_INVALID_STOP_BIT,
+ /*0x00000013*/ ERR_ISP_CODE_READ_PROTECTION_ENABLED,
+
+ /* ROM API related errors */
+ ERR_API_BASE = 0x00010000,
+ /**\b 0x00010001*/ ERR_API_INVALID_PARAMS = ERR_API_BASE + 1, /**< Invalid parameters*/
+ /**\b 0x00010002*/ ERR_API_INVALID_PARAM1, /**< PARAM1 is invalid */
+ /**\b 0x00010003*/ ERR_API_INVALID_PARAM2, /**< PARAM2 is invalid */
+ /**\b 0x00010004*/ ERR_API_INVALID_PARAM3, /**< PARAM3 is invalid */
+ /**\b 0x00010005*/ ERR_API_MOD_INIT, /**< API is called before module init */
+
+ /* SPIFI API related errors */
+ ERR_SPIFI_BASE = 0x00020000,
+ /*0x00020001*/ ERR_SPIFI_DEVICE_ERROR =ERR_SPIFI_BASE+1,
+ /*0x00020002*/ ERR_SPIFI_INTERNAL_ERROR,
+ /*0x00020003*/ ERR_SPIFI_TIMEOUT,
+ /*0x00020004*/ ERR_SPIFI_OPERAND_ERROR,
+ /*0x00020005*/ ERR_SPIFI_STATUS_PROBLEM,
+ /*0x00020006*/ ERR_SPIFI_UNKNOWN_EXT,
+ /*0x00020007*/ ERR_SPIFI_UNKNOWN_ID,
+ /*0x00020008*/ ERR_SPIFI_UNKNOWN_TYPE,
+ /*0x00020009*/ ERR_SPIFI_UNKNOWN_MFG,
+
+ /* Security API related errors */
+ ERR_SEC_BASE = 0x00030000,
+ /*0x00030001*/ ERR_SEC_AES_WRONG_CMD=ERR_SEC_BASE+1,
+ /*0x00030002*/ ERR_SEC_AES_NOT_SUPPORTED,
+ /*0x00030003*/ ERR_SEC_AES_KEY_ALREADY_PROGRAMMED,
+
+
+ /* USB device stack related errors */
+ ERR_USBD_BASE = 0x00040000,
+ /**\b 0x00040001*/ ERR_USBD_INVALID_REQ = ERR_USBD_BASE + 1, /**< invalid request */
+ /**\b 0x00040002*/ ERR_USBD_UNHANDLED, /**< Callback did not process the event */
+ /**\b 0x00040003*/ ERR_USBD_STALL, /**< Stall the endpoint on which the call back is called */
+ /**\b 0x00040004*/ ERR_USBD_SEND_ZLP, /**< Send ZLP packet on the endpoint on which the call back is called */
+ /**\b 0x00040005*/ ERR_USBD_SEND_DATA, /**< Send data packet on the endpoint on which the call back is called */
+ /**\b 0x00040006*/ ERR_USBD_BAD_DESC, /**< Bad descriptor*/
+ /**\b 0x00040007*/ ERR_USBD_BAD_CFG_DESC,/**< Bad config descriptor*/
+ /**\b 0x00040009*/ ERR_USBD_BAD_INTF_DESC,/**< Bad interface descriptor*/
+ /**\b 0x0004000a*/ ERR_USBD_BAD_EP_DESC,/**< Bad endpoint descriptor*/
+ /**\b 0x0004000b*/ ERR_USBD_BAD_MEM_BUF, /**< Bad alignment of buffer passed. */
+ /**\b 0x0004000c*/ ERR_USBD_TOO_MANY_CLASS_HDLR, /**< Too many class handlers. */
+
+ /* CGU related errors */
+ ERR_CGU_BASE = 0x00050000,
+ /*0x00050001*/ ERR_CGU_NOT_IMPL=ERR_CGU_BASE+1,
+ /*0x00050002*/ ERR_CGU_INVALID_PARAM,
+ /*0x00050003*/ ERR_CGU_INVALID_SLICE,
+ /*0x00050004*/ ERR_CGU_OUTPUT_GEN,
+ /*0x00050005*/ ERR_CGU_DIV_SRC,
+ /*0x00050006*/ ERR_CGU_DIV_VAL,
+ /*0x00050007*/ ERR_CGU_SRC,
+
+ /* I2C related errors */
+ ERR_I2C_BASE = 0x00060000,
+/*0x00060001*/ ERR_I2C_NAK=ERR_I2C_BASE+1,
+/*0x00060002*/ ERR_I2C_BUFFER_OVERFLOW,
+/*0x00060003*/ ERR_I2C_BYTE_COUNT_ERR,
+/*0x00060004*/ ERR_I2C_LOSS_OF_ARBRITRATION,
+/*0x00060005*/ ERR_I2C_SLAVE_NOT_ADDRESSED,
+/*0x00060006*/ ERR_I2C_LOSS_OF_ARBRITRATION_NAK_BIT,
+/*0x00060007*/ ERR_I2C_GENERAL_FAILURE,
+/*0x00060008*/ ERR_I2C_REGS_SET_TO_DEFAULT
+
+} ErrorCode_t;
+
+
+
+#define offsetof(s,m) (int)&(((s *)0)->m)
+#define COMPILE_TIME_ASSERT(pred) switch(0){case 0:case pred:;}
+
+#endif /* __LPC_ERROR_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd.h b/tinyusb/device/romdriver/mw_usbd.h
new file mode 100644
index 000000000..4435e13f9
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd.h
@@ -0,0 +1,652 @@
+/***********************************************************************
+* $Id:: mw_usbd.h 197 2011-06-12 20:22:41Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+
+#ifndef __USB_H__
+#define __USB_H__
+
+/** \file
+ * \brief Common definitions and declarations for the USB stack.
+ *
+ * Common definitions and declarations for the USB stack.
+ * \addtogroup USBD_Core
+ * @{
+ */
+
+#include
+
+#if defined(__GNUC__)
+/* As per http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax,
+6.29 Attributes Syntax
+"An attribute specifier list may appear as part of a struct, union or
+enum specifier. It may go either immediately after the struct, union
+or enum keyword, or after the closing brace. The former syntax is
+preferred. Where attribute specifiers follow the closing brace, they
+are considered to relate to the structure, union or enumerated type
+defined, not to any enclosing declaration the type specifier appears
+in, and the type defined is not complete until after the attribute
+specifiers."
+So use POST_PACK immediately after struct keyword
+*/
+#define PRE_PACK
+#define POST_PACK __attribute__((__packed__))
+#define ALIGNED(n) __attribute__((aligned (n)))
+#elif defined(__arm)
+#define PRE_PACK __packed
+#define POST_PACK
+#define ALIGNED(n) __align(n)
+#endif
+
+/** Structure to pack lower and upper byte to form 16 bit word. */
+PRE_PACK struct POST_PACK _WB_T
+{
+ uint8_t L; /**< lower byte */
+ uint8_t H; /**< upper byte */
+};
+/** Structure to pack lower and upper byte to form 16 bit word.*/
+typedef struct _WB_T WB_T;
+
+/** Union of \ref _WB_T struct and 16 bit word.*/
+PRE_PACK union POST_PACK __WORD_BYTE
+{
+ uint16_t W; /**< data member to do 16 bit access */
+ WB_T WB; /**< data member to do 8 bit access */
+} ;
+/** Union of \ref _WB_T struct and 16 bit word.*/
+typedef union __WORD_BYTE WORD_BYTE;
+
+/** bmRequestType.Dir defines
+ * @{
+ */
+/** Request from host to device */
+#define REQUEST_HOST_TO_DEVICE 0
+/** Request from device to host */
+#define REQUEST_DEVICE_TO_HOST 1
+/** @} */
+
+/** bmRequestType.Type defines
+ * @{
+ */
+/** Standard Request */
+#define REQUEST_STANDARD 0
+/** Class Request */
+#define REQUEST_CLASS 1
+/** Vendor Request */
+#define REQUEST_VENDOR 2
+/** Reserved Request */
+#define REQUEST_RESERVED 3
+/** @} */
+
+/** bmRequestType.Recipient defines
+ * @{
+ */
+/** Request to device */
+#define REQUEST_TO_DEVICE 0
+/** Request to interface */
+#define REQUEST_TO_INTERFACE 1
+/** Request to endpoint */
+#define REQUEST_TO_ENDPOINT 2
+/** Request to other */
+#define REQUEST_TO_OTHER 3
+/** @} */
+
+/** Structure to define 8 bit USB request.*/
+PRE_PACK struct POST_PACK _BM_T
+{
+ uint8_t Recipient : 5; /**< Recipeint type. */
+ uint8_t Type : 2; /**< Request type. */
+ uint8_t Dir : 1; /**< Directtion type. */
+};
+/** Structure to define 8 bit USB request.*/
+typedef struct _BM_T BM_T;
+
+/** Union of \ref _BM_T struct and 8 bit byte.*/
+PRE_PACK union POST_PACK _REQUEST_TYPE
+{
+ uint8_t B; /**< byte wide access memeber */
+ BM_T BM; /**< bitfield structure access memeber */
+} ;
+/** Union of \ref _BM_T struct and 8 bit byte.*/
+typedef union _REQUEST_TYPE REQUEST_TYPE;
+
+/** USB Standard Request Codes
+ * @{
+ */
+/** GET_STATUS request */
+#define USB_REQUEST_GET_STATUS 0
+/** CLEAR_FEATURE request */
+#define USB_REQUEST_CLEAR_FEATURE 1
+/** SET_FEATURE request */
+#define USB_REQUEST_SET_FEATURE 3
+/** SET_ADDRESS request */
+#define USB_REQUEST_SET_ADDRESS 5
+/** GET_DESCRIPTOR request */
+#define USB_REQUEST_GET_DESCRIPTOR 6
+/** SET_DESCRIPTOR request */
+#define USB_REQUEST_SET_DESCRIPTOR 7
+/** GET_CONFIGURATION request */
+#define USB_REQUEST_GET_CONFIGURATION 8
+/** SET_CONFIGURATION request */
+#define USB_REQUEST_SET_CONFIGURATION 9
+/** GET_INTERFACE request */
+#define USB_REQUEST_GET_INTERFACE 10
+/** SET_INTERFACE request */
+#define USB_REQUEST_SET_INTERFACE 11
+/** SYNC_FRAME request */
+#define USB_REQUEST_SYNC_FRAME 12
+/** @} */
+
+/** USB GET_STATUS Bit Values
+ * @{
+ */
+/** SELF_POWERED status*/
+#define USB_GETSTATUS_SELF_POWERED 0x01
+/** REMOTE_WAKEUP capable status*/
+#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
+/** ENDPOINT_STALL status*/
+#define USB_GETSTATUS_ENDPOINT_STALL 0x01
+/** @} */
+
+/** USB Standard Feature selectors
+ * @{
+ */
+/** ENDPOINT_STALL feature*/
+#define USB_FEATURE_ENDPOINT_STALL 0
+/** REMOTE_WAKEUP feature*/
+#define USB_FEATURE_REMOTE_WAKEUP 1
+/** TEST_MODE feature*/
+#define USB_FEATURE_TEST_MODE 2
+/** @} */
+
+/** USB Default Control Pipe Setup Packet*/
+PRE_PACK struct POST_PACK _USB_SETUP_PACKET
+{
+ REQUEST_TYPE bmRequestType; /**< This bitmapped field identifies the characteristics
+ of the specific request. \sa _BM_T.
+ */
+ uint8_t bRequest; /**< This field specifies the particular request. The
+ Type bits in the bmRequestType field modify the meaning
+ of this field. \sa USBD_REQUEST.
+ */
+ WORD_BYTE wValue; /**< Used to pass a parameter to the device, specific
+ to the request.
+ */
+ WORD_BYTE wIndex; /**< Used to pass a parameter to the device, specific
+ to the request. The wIndex field is often used in
+ requests to specify an endpoint or an interface.
+ */
+ uint16_t wLength; /**< This field specifies the length of the data
+ transferred during the second phase of the control
+ transfer.
+ */
+} ;
+/** USB Default Control Pipe Setup Packet*/
+typedef struct _USB_SETUP_PACKET USB_SETUP_PACKET;
+
+
+/** USB Descriptor Types
+ * @{
+ */
+/** Device descriptor type */
+#define USB_DEVICE_DESCRIPTOR_TYPE 1
+/** Configuration descriptor type */
+#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
+/** String descriptor type */
+#define USB_STRING_DESCRIPTOR_TYPE 3
+/** Interface descriptor type */
+#define USB_INTERFACE_DESCRIPTOR_TYPE 4
+/** Endpoint descriptor type */
+#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
+/** Device qualifier descriptor type */
+#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6
+/** Other speed configuration descriptor type */
+#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
+/** Interface power descriptor type */
+#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8
+/** OTG descriptor type */
+#define USB_OTG_DESCRIPTOR_TYPE 9
+/** Debug descriptor type */
+#define USB_DEBUG_DESCRIPTOR_TYPE 10
+/** Interface association descriptor type */
+#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 11
+/** @} */
+
+/** USB Device Classes
+ * @{
+ */
+/** Reserved device class */
+#define USB_DEVICE_CLASS_RESERVED 0x00
+/** Audio device class */
+#define USB_DEVICE_CLASS_AUDIO 0x01
+/** Communications device class */
+#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
+/** Human interface device class */
+#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
+/** monitor device class */
+#define USB_DEVICE_CLASS_MONITOR 0x04
+/** physical interface device class */
+#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
+/** power device class */
+#define USB_DEVICE_CLASS_POWER 0x06
+/** Printer device class */
+#define USB_DEVICE_CLASS_PRINTER 0x07
+/** Storage device class */
+#define USB_DEVICE_CLASS_STORAGE 0x08
+/** Hub device class */
+#define USB_DEVICE_CLASS_HUB 0x09
+/** miscellaneous device class */
+#define USB_DEVICE_CLASS_MISCELLANEOUS 0xEF
+/** Application device class */
+#define USB_DEVICE_CLASS_APP 0xFE
+/** Vendor specific device class */
+#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
+/** @} */
+
+/** bmAttributes in Configuration Descriptor
+ * @{
+ */
+/** Power field mask */
+#define USB_CONFIG_POWERED_MASK 0x40
+/** Bus powered */
+#define USB_CONFIG_BUS_POWERED 0x80
+/** Self powered */
+#define USB_CONFIG_SELF_POWERED 0xC0
+/** remote wakeup */
+#define USB_CONFIG_REMOTE_WAKEUP 0x20
+/** @} */
+
+/** bMaxPower in Configuration Descriptor */
+#define USB_CONFIG_POWER_MA(mA) ((mA)/2)
+
+/** bEndpointAddress in Endpoint Descriptor
+ * @{
+ */
+/** Endopint address mask */
+#define USB_ENDPOINT_DIRECTION_MASK 0x80
+/** Macro to convert OUT endopint number to endpoint address value. */
+#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
+/** Macro to convert IN endopint number to endpoint address value. */
+#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
+/** @} */
+
+/** bmAttributes in Endpoint Descriptor
+ * @{
+ */
+/** Endopint type mask */
+#define USB_ENDPOINT_TYPE_MASK 0x03
+/** Control Endopint type */
+#define USB_ENDPOINT_TYPE_CONTROL 0x00
+/** isochronous Endopint type */
+#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
+/** bulk Endopint type */
+#define USB_ENDPOINT_TYPE_BULK 0x02
+/** interrupt Endopint type */
+#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
+/** Endopint sync type mask */
+#define USB_ENDPOINT_SYNC_MASK 0x0C
+/** no synchronization Endopint */
+#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00
+/** Asynchronous sync Endopint */
+#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04
+/** Adaptive sync Endopint */
+#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08
+/** Synchronous sync Endopint */
+#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C
+/** Endopint usage type mask */
+#define USB_ENDPOINT_USAGE_MASK 0x30
+/** Endopint data usage type */
+#define USB_ENDPOINT_USAGE_DATA 0x00
+/** Endopint feedback usage type */
+#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
+/** Endopint implicit feedback usage type */
+#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20
+/** Endopint reserved usage type */
+#define USB_ENDPOINT_USAGE_RESERVED 0x30
+/** @} */
+
+/** Control endopint EP0's maximum packet size in high-speed mode.*/
+#define USB_ENDPOINT_0_HS_MAXP 64
+/** Control endopint EP0's maximum packet size in low-speed mode.*/
+#define USB_ENDPOINT_0_LS_MAXP 8
+/** Bulk endopint's maximum packet size in high-speed mode.*/
+#define USB_ENDPOINT_BULK_HS_MAXP 512
+
+/** USB Standard Device Descriptor */
+PRE_PACK struct POST_PACK _USB_DEVICE_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of this descriptor in bytes. */
+ uint8_t bDescriptorType; /**< DEVICE Descriptor Type. */
+ uint16_t bcdUSB; /**< BUSB Specification Release Number in
+ Binary-Coded Decimal (i.e., 2.10 is 210H).
+ This field identifies the release of the USB
+ Specification with which the device and its
+ descriptors are compliant.
+ */
+ uint8_t bDeviceClass; /**< Class code (assigned by the USB-IF).
+ If this field is reset to zero, each interface
+ within a configuration specifies its own
+ class information and the various
+ interfaces operate independently.\n
+ If this field is set to a value between 1 and
+ FEH, the device supports different class
+ specifications on different interfaces and
+ the interfaces may not operate
+ independently. This value identifies the
+ class definition used for the aggregate
+ interfaces. \n
+ If this field is set to FFH, the device class
+ is vendor-specific.
+ */
+ uint8_t bDeviceSubClass; /**< Subclass code (assigned by the USB-IF).
+ These codes are qualified by the value of
+ the bDeviceClass field. \n
+ If the bDeviceClass field is reset to zero,
+ this field must also be reset to zero. \n
+ If the bDeviceClass field is not set to FFH,
+ all values are reserved for assignment by
+ the USB-IF.
+ */
+ uint8_t bDeviceProtocol; /**< Protocol code (assigned by the USB-IF).
+ These codes are qualified by the value of
+ the bDeviceClass and the
+ bDeviceSubClass fields. If a device
+ supports class-specific protocols on a
+ device basis as opposed to an interface
+ basis, this code identifies the protocols
+ that the device uses as defined by the
+ specification of the device class. \n
+ If this field is reset to zero, the device
+ does not use class-specific protocols on a
+ device basis. However, it may use classspecific
+ protocols on an interface basis. \n
+ If this field is set to FFH, the device uses a
+ vendor-specific protocol on a device basis.
+ */
+ uint8_t bMaxPacketSize0; /**< Maximum packet size for endpoint zero
+ (only 8, 16, 32, or 64 are valid). For HS devices
+ is fixed to 64.
+ */
+
+ uint16_t idVendor; /**< Vendor ID (assigned by the USB-IF). */
+ uint16_t idProduct; /**< Product ID (assigned by the manufacturer). */
+ uint16_t bcdDevice; /**< Device release number in binary-coded decimal. */
+ uint8_t iManufacturer; /**< Index of string descriptor describing manufacturer. */
+ uint8_t iProduct; /**< Index of string descriptor describing product. */
+ uint8_t iSerialNumber; /**< Index of string descriptor describing the device’s
+ serial number.
+ */
+ uint8_t bNumConfigurations; /**< Number of possible configurations. */
+} ;
+/** USB Standard Device Descriptor */
+typedef struct _USB_DEVICE_DESCRIPTOR USB_DEVICE_DESCRIPTOR;
+
+/** USB 2.0 Device Qualifier Descriptor */
+PRE_PACK struct POST_PACK _USB_DEVICE_QUALIFIER_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of descriptor */
+ uint8_t bDescriptorType; /**< Device Qualifier Type */
+ uint16_t bcdUSB; /**< USB specification version number (e.g., 0200H for V2.00) */
+ uint8_t bDeviceClass; /**< Class Code */
+ uint8_t bDeviceSubClass; /**< SubClass Code */
+ uint8_t bDeviceProtocol; /**< Protocol Code */
+ uint8_t bMaxPacketSize0; /**< Maximum packet size for other speed */
+ uint8_t bNumConfigurations; /**< Number of Other-speed Configurations */
+ uint8_t bReserved; /**< Reserved for future use, must be zero */
+} ;
+/** USB 2.0 Device Qualifier Descriptor */
+typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR USB_DEVICE_QUALIFIER_DESCRIPTOR;
+
+/** USB Standard Configuration Descriptor */
+PRE_PACK struct POST_PACK _USB_CONFIGURATION_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of this descriptor in bytes */
+ uint8_t bDescriptorType; /**< CONFIGURATION Descriptor Type*/
+ uint16_t wTotalLength; /**< Total length of data returned for this
+ configuration. Includes the combined length
+ of all descriptors (configuration, interface,
+ endpoint, and class- or vendor-specific)
+ returned for this configuration.*/
+ uint8_t bNumInterfaces; /**< Number of interfaces supported by this configuration*/
+ uint8_t bConfigurationValue; /**< Value to use as an argument to the
+ SetConfiguration() request to select this
+ configuration. */
+ uint8_t iConfiguration; /**< Index of string descriptor describing this
+ configuration*/
+ uint8_t bmAttributes; /**< Configuration characteristics \n
+ D7: Reserved (set to one)\n
+ D6: Self-powered \n
+ D5: Remote Wakeup \n
+ D4...0: Reserved (reset to zero) \n
+ D7 is reserved and must be set to one for
+ historical reasons. \n
+ A device configuration that uses power from
+ the bus and a local source reports a non-zero
+ value in bMaxPower to indicate the amount of
+ bus power required and sets D6. The actual
+ power source at runtime may be determined
+ using the GetStatus(DEVICE) request (see
+ USB 2.0 spec Section 9.4.5). \n
+ If a device configuration supports remote
+ wakeup, D5 is set to one.*/
+ uint8_t bMaxPower; /**< Maximum power consumption of the USB
+ device from the bus in this specific
+ configuration when the device is fully
+ operational. Expressed in 2 mA units
+ (i.e., 50 = 100 mA). \n
+ Note: A device configuration reports whether
+ the configuration is bus-powered or selfpowered.
+ Device status reports whether the
+ device is currently self-powered. If a device is
+ disconnected from its external power source, it
+ updates device status to indicate that it is no
+ longer self-powered. \n
+ A device may not increase its power draw
+ from the bus, when it loses its external power
+ source, beyond the amount reported by its
+ configuration. \n
+ If a device can continue to operate when
+ disconnected from its external power source, it
+ continues to do so. If the device cannot
+ continue to operate, it fails operations it can
+ no longer support. The USB System Software
+ may determine the cause of the failure by
+ checking the status and noting the loss of the
+ device’s power source.*/
+} ;
+/** USB Standard Configuration Descriptor */
+typedef struct _USB_CONFIGURATION_DESCRIPTOR USB_CONFIGURATION_DESCRIPTOR;
+
+/** USB Standard Interface Descriptor */
+PRE_PACK struct POST_PACK _USB_INTERFACE_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of this descriptor in bytes*/
+ uint8_t bDescriptorType; /**< INTERFACE Descriptor Type*/
+ uint8_t bInterfaceNumber; /**< Number of this interface. Zero-based
+ value identifying the index in the array of
+ concurrent interfaces supported by this
+ configuration.*/
+ uint8_t bAlternateSetting; /**< Value used to select this alternate setting
+ for the interface identified in the prior field*/
+ uint8_t bNumEndpoints; /**< Number of endpoints used by this
+ interface (excluding endpoint zero). If this
+ value is zero, this interface only uses the
+ Default Control Pipe.*/
+ uint8_t bInterfaceClass; /**< Class code (assigned by the USB-IF). \n
+ A value of zero is reserved for future
+ standardization. \n
+ If this field is set to FFH, the interface
+ class is vendor-specific. \n
+ All other values are reserved for
+ assignment by the USB-IF.*/
+ uint8_t bInterfaceSubClass; /**< Subclass code (assigned by the USB-IF). \n
+ These codes are qualified by the value of
+ the bInterfaceClass field. \n
+ If the bInterfaceClass field is reset to zero,
+ this field must also be reset to zero. \n
+ If the bInterfaceClass field is not set to
+ FFH, all values are reserved for
+ assignment by the USB-IF.*/
+ uint8_t bInterfaceProtocol; /**< Protocol code (assigned by the USB). \n
+ These codes are qualified by the value of
+ the bInterfaceClass and the
+ bInterfaceSubClass fields. If an interface
+ supports class-specific requests, this code
+ identifies the protocols that the device
+ uses as defined by the specification of the
+ device class. \n
+ If this field is reset to zero, the device
+ does not use a class-specific protocol on
+ this interface. \n
+ If this field is set to FFH, the device uses
+ a vendor-specific protocol for this
+ interface.*/
+ uint8_t iInterface; /**< Index of string descriptor describing this interface*/
+} ;
+/** USB Standard Interface Descriptor */
+typedef struct _USB_INTERFACE_DESCRIPTOR USB_INTERFACE_DESCRIPTOR;
+
+/** USB Standard Endpoint Descriptor */
+PRE_PACK struct POST_PACK _USB_ENDPOINT_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of this descriptor in bytes*/
+ uint8_t bDescriptorType; /**< ENDPOINT Descriptor Type*/
+ uint8_t bEndpointAddress; /**< The address of the endpoint on the USB device
+ described by this descriptor. The address is
+ encoded as follows: \n
+ Bit 3...0: The endpoint number \n
+ Bit 6...4: Reserved, reset to zero \n
+ Bit 7: Direction, ignored for control endpoints
+ 0 = OUT endpoint
+ 1 = IN endpoint. \n \sa USBD_ENDPOINT_ADR_Type*/
+ uint8_t bmAttributes; /**< This field describes the endpoint’s attributes when it is
+ configured using the bConfigurationValue. \n
+ Bits 1..0: Transfer Type
+ \li 00 = Control
+ \li 01 = Isochronous
+ \li 10 = Bulk
+ \li 11 = Interrupt \n
+ If not an isochronous endpoint, bits 5..2 are reserved
+ and must be set to zero. If isochronous, they are
+ defined as follows: \n
+ Bits 3..2: Synchronization Type
+ \li 00 = No Synchronization
+ \li 01 = Asynchronous
+ \li 10 = Adaptive
+ \li 11 = Synchronous \n
+ Bits 5..4: Usage Type
+ \li 00 = Data endpoint
+ \li 01 = Feedback endpoint
+ \li 10 = Implicit feedback Data endpoint
+ \li 11 = Reserved \n
+ Refer to Chapter 5 of USB 2.0 specification for more information. \n
+ All other bits are reserved and must be reset to zero.
+ Reserved bits must be ignored by the host.
+ \n \sa USBD_EP_ATTR_Type*/
+ uint16_t wMaxPacketSize; /**< Maximum packet size this endpoint is capable of
+ sending or receiving when this configuration is
+ selected. \n
+ For isochronous endpoints, this value is used to
+ reserve the bus time in the schedule, required for the
+ per-(micro)frame data payloads. The pipe may, on an
+ ongoing basis, actually use less bandwidth than that
+ reserved. The device reports, if necessary, the actual
+ bandwidth used via its normal, non-USB defined
+ mechanisms. \n
+ For all endpoints, bits 10..0 specify the maximum
+ packet size (in bytes). \n
+ For high-speed isochronous and interrupt endpoints: \n
+ Bits 12..11 specify the number of additional transaction
+ opportunities per microframe: \n
+ \li 00 = None (1 transaction per microframe)
+ \li 01 = 1 additional (2 per microframe)
+ \li 10 = 2 additional (3 per microframe)
+ \li 11 = Reserved \n
+ Bits 15..13 are reserved and must be set to zero.*/
+ uint8_t bInterval; /**< Interval for polling endpoint for data transfers.
+ Expressed in frames or microframes depending on the
+ device operating speed (i.e., either 1 millisecond or
+ 125 µs units).
+ \li For full-/high-speed isochronous endpoints, this value
+ must be in the range from 1 to 16. The bInterval value
+ is used as the exponent for a \f$ 2^(bInterval-1) \f$ value; e.g., a
+ bInterval of 4 means a period of 8 (\f$ 2^(4-1) \f$).
+ \li For full-/low-speed interrupt endpoints, the value of
+ this field may be from 1 to 255.
+ \li For high-speed interrupt endpoints, the bInterval value
+ is used as the exponent for a \f$ 2^(bInterval-1) \f$ value; e.g., a
+ bInterval of 4 means a period of 8 (\f$ 2^(4-1) \f$) . This value
+ must be from 1 to 16.
+ \li For high-speed bulk/control OUT endpoints, the
+ bInterval must specify the maximum NAK rate of the
+ endpoint. A value of 0 indicates the endpoint never
+ NAKs. Other values indicate at most 1 NAK each
+ bInterval number of microframes. This value must be
+ in the range from 0 to 255. \n
+ Refer to Chapter 5 of USB 2.0 specification for more information.
+ */
+} ;
+/** USB Standard Endpoint Descriptor */
+typedef struct _USB_ENDPOINT_DESCRIPTOR USB_ENDPOINT_DESCRIPTOR;
+
+/** USB String Descriptor */
+PRE_PACK struct POST_PACK _USB_STRING_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of this descriptor in bytes*/
+ uint8_t bDescriptorType; /**< STRING Descriptor Type*/
+ uint16_t bString/*[]*/; /**< UNICODE encoded string */
+} ;
+/** USB String Descriptor */
+typedef struct _USB_STRING_DESCRIPTOR USB_STRING_DESCRIPTOR;
+
+/** USB Common Descriptor */
+PRE_PACK struct POST_PACK _USB_COMMON_DESCRIPTOR
+{
+ uint8_t bLength; /**< Size of this descriptor in bytes*/
+ uint8_t bDescriptorType; /**< Descriptor Type*/
+} ;
+/** USB Common Descriptor */
+typedef struct _USB_COMMON_DESCRIPTOR USB_COMMON_DESCRIPTOR;
+
+/** USB Other Speed Configuration */
+PRE_PACK struct POST_PACK _USB_OTHER_SPEED_CONFIGURATION
+{
+ uint8_t bLength; /**< Size of descriptor*/
+ uint8_t bDescriptorType; /**< Other_speed_Configuration Type*/
+ uint16_t wTotalLength; /**< Total length of data returned*/
+ uint8_t bNumInterfaces; /**< Number of interfaces supported by this speed configuration*/
+ uint8_t bConfigurationValue; /**< Value to use to select configuration*/
+ uint8_t IConfiguration; /**< Index of string descriptor*/
+ uint8_t bmAttributes; /**< Same as Configuration descriptor*/
+ uint8_t bMaxPower; /**< Same as Configuration descriptor*/
+} ;
+/** USB Other Speed Configuration */
+typedef struct _USB_OTHER_SPEED_CONFIGURATION USB_OTHER_SPEED_CONFIGURATION;
+
+/** \ingroup USBD_Core
+ * USB device stack/module handle.
+ */
+typedef void* USBD_HANDLE_T;
+
+/** @}*/
+
+#endif /* __USB_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_adcuser.h b/tinyusb/device/romdriver/mw_usbd_adcuser.h
new file mode 100644
index 000000000..c6e93af84
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_adcuser.h
@@ -0,0 +1,31 @@
+/***********************************************************************
+* $Id:: mw_usbd_adcuser.h 165 2011-04-14 17:41:11Z usb10131 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Audio Device Class Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+
+#ifndef __ADCUSER_H__
+#define __ADCUSER_H__
+
+
+/* Audio Device Class Requests Callback Functions */
+
+#endif /* __ADCUSER_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_audio.h b/tinyusb/device/romdriver/mw_usbd_audio.h
new file mode 100644
index 000000000..9d42948ed
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_audio.h
@@ -0,0 +1,377 @@
+/***********************************************************************
+* $Id:: mw_usbd_audio.h 165 2011-04-14 17:41:11Z usb10131 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Audio Device Class Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __AUDIO_H__
+#define __AUDIO_H__
+
+
+/* Audio Interface Subclass Codes */
+#define AUDIO_SUBCLASS_UNDEFINED 0x00
+#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
+#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
+#define AUDIO_SUBCLASS_MIDISTREAMING 0x03
+
+/* Audio Interface Protocol Codes */
+#define AUDIO_PROTOCOL_UNDEFINED 0x00
+
+
+/* Audio Descriptor Types */
+#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20
+#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21
+#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22
+#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23
+#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
+#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
+
+
+/* Audio Control Interface Descriptor Subtypes */
+#define AUDIO_CONTROL_UNDEFINED 0x00
+#define AUDIO_CONTROL_HEADER 0x01
+#define AUDIO_CONTROL_INPUT_TERMINAL 0x02
+#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03
+#define AUDIO_CONTROL_MIXER_UNIT 0x04
+#define AUDIO_CONTROL_SELECTOR_UNIT 0x05
+#define AUDIO_CONTROL_FEATURE_UNIT 0x06
+#define AUDIO_CONTROL_PROCESSING_UNIT 0x07
+#define AUDIO_CONTROL_EXTENSION_UNIT 0x08
+
+/* Audio Streaming Interface Descriptor Subtypes */
+#define AUDIO_STREAMING_UNDEFINED 0x00
+#define AUDIO_STREAMING_GENERAL 0x01
+#define AUDIO_STREAMING_FORMAT_TYPE 0x02
+#define AUDIO_STREAMING_FORMAT_SPECIFIC 0x03
+
+/* Audio Endpoint Descriptor Subtypes */
+#define AUDIO_ENDPOINT_UNDEFINED 0x00
+#define AUDIO_ENDPOINT_GENERAL 0x01
+
+
+/* Audio Descriptor Sizes */
+#define AUDIO_CONTROL_INTERFACE_DESC_SZ(n) 0x08+n
+#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07
+#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C
+#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09
+#define AUDIO_MIXER_UNIT_DESC_SZ(p,n) 0x0A+p+n
+#define AUDIO_SELECTOR_UNIT_DESC_SZ(p) 0x06+p
+#define AUDIO_FEATURE_UNIT_DESC_SZ(ch,n) 0x07+(ch+1)*n
+#define AUDIO_PROCESSING_UNIT_DESC_SZ(p,n,x) 0x0D+p+n+x
+#define AUDIO_EXTENSION_UNIT_DESC_SZ(p,n) 0x0D+p+n
+#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09
+#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07
+
+
+/* Audio Processing Unit Process Types */
+#define AUDIO_UNDEFINED_PROCESS 0x00
+#define AUDIO_UP_DOWN_MIX_PROCESS 0x01
+#define AUDIO_DOLBY_PROLOGIC_PROCESS 0x02
+#define AUDIO_3D_STEREO_PROCESS 0x03
+#define AUDIO_REVERBERATION_PROCESS 0x04
+#define AUDIO_CHORUS_PROCESS 0x05
+#define AUDIO_DYN_RANGE_COMP_PROCESS 0x06
+
+
+/* Audio Request Codes */
+#define AUDIO_REQUEST_UNDEFINED 0x00
+#define AUDIO_REQUEST_SET_CUR 0x01
+#define AUDIO_REQUEST_GET_CUR 0x81
+#define AUDIO_REQUEST_SET_MIN 0x02
+#define AUDIO_REQUEST_GET_MIN 0x82
+#define AUDIO_REQUEST_SET_MAX 0x03
+#define AUDIO_REQUEST_GET_MAX 0x83
+#define AUDIO_REQUEST_SET_RES 0x04
+#define AUDIO_REQUEST_GET_RES 0x84
+#define AUDIO_REQUEST_SET_MEM 0x05
+#define AUDIO_REQUEST_GET_MEM 0x85
+#define AUDIO_REQUEST_GET_STAT 0xFF
+
+
+/* Audio Control Selector Codes */
+#define AUDIO_CONTROL_UNDEFINED 0x00 /* Common Selector */
+
+/* Terminal Control Selectors */
+#define AUDIO_COPY_PROTECT_CONTROL 0x01
+
+/* Feature Unit Control Selectors */
+#define AUDIO_MUTE_CONTROL 0x01
+#define AUDIO_VOLUME_CONTROL 0x02
+#define AUDIO_BASS_CONTROL 0x03
+#define AUDIO_MID_CONTROL 0x04
+#define AUDIO_TREBLE_CONTROL 0x05
+#define AUDIO_GRAPHIC_EQUALIZER_CONTROL 0x06
+#define AUDIO_AUTOMATIC_GAIN_CONTROL 0x07
+#define AUDIO_DELAY_CONTROL 0x08
+#define AUDIO_BASS_BOOST_CONTROL 0x09
+#define AUDIO_LOUDNESS_CONTROL 0x0A
+
+/* Processing Unit Control Selectors: */
+#define AUDIO_ENABLE_CONTROL 0x01 /* Common Selector */
+#define AUDIO_MODE_SELECT_CONTROL 0x02 /* Common Selector */
+
+/* - Up/Down-mix Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+/* AUDIO_MODE_SELECT_CONTROL 0x02 Common Selector */
+
+/* - Dolby Prologic Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+/* AUDIO_MODE_SELECT_CONTROL 0x02 Common Selector */
+
+/* - 3D Stereo Extender Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+#define AUDIO_SPACIOUSNESS_CONTROL 0x02
+
+/* - Reverberation Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+#define AUDIO_REVERB_LEVEL_CONTROL 0x02
+#define AUDIO_REVERB_TIME_CONTROL 0x03
+#define AUDIO_REVERB_FEEDBACK_CONTROL 0x04
+
+/* - Chorus Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+#define AUDIO_CHORUS_LEVEL_CONTROL 0x02
+#define AUDIO_SHORUS_RATE_CONTROL 0x03
+#define AUDIO_CHORUS_DEPTH_CONTROL 0x04
+
+/* - Dynamic Range Compressor Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+#define AUDIO_COMPRESSION_RATE_CONTROL 0x02
+#define AUDIO_MAX_AMPL_CONTROL 0x03
+#define AUDIO_THRESHOLD_CONTROL 0x04
+#define AUDIO_ATTACK_TIME_CONTROL 0x05
+#define AUDIO_RELEASE_TIME_CONTROL 0x06
+
+/* Extension Unit Control Selectors */
+/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
+
+/* Endpoint Control Selectors */
+#define AUDIO_SAMPLING_FREQ_CONTROL 0x01
+#define AUDIO_PITCH_CONTROL 0x02
+
+
+/* Audio Format Specific Control Selectors */
+
+/* MPEG Control Selectors */
+#define AUDIO_MPEG_CONTROL_UNDEFINED 0x00
+#define AUDIO_MPEG_DUAL_CHANNEL_CONTROL 0x01
+#define AUDIO_MPEG_SECOND_STEREO_CONTROL 0x02
+#define AUDIO_MPEG_MULTILINGUAL_CONTROL 0x03
+#define AUDIO_MPEG_DYN_RANGE_CONTROL 0x04
+#define AUDIO_MPEG_SCALING_CONTROL 0x05
+#define AUDIO_MPEG_HILO_SCALING_CONTROL 0x06
+
+/* AC-3 Control Selectors */
+#define AUDIO_AC3_CONTROL_UNDEFINED 0x00
+#define AUDIO_AC3_MODE_CONTROL 0x01
+#define AUDIO_AC3_DYN_RANGE_CONTROL 0x02
+#define AUDIO_AC3_SCALING_CONTROL 0x03
+#define AUDIO_AC3_HILO_SCALING_CONTROL 0x04
+
+
+/* Audio Format Types */
+#define AUDIO_FORMAT_TYPE_UNDEFINED 0x00
+#define AUDIO_FORMAT_TYPE_I 0x01
+#define AUDIO_FORMAT_TYPE_II 0x02
+#define AUDIO_FORMAT_TYPE_III 0x03
+
+
+/* Audio Format Type Descriptor Sizes */
+#define AUDIO_FORMAT_TYPE_I_DESC_SZ(n) 0x08+(n*3)
+#define AUDIO_FORMAT_TYPE_II_DESC_SZ(n) 0x09+(n*3)
+#define AUDIO_FORMAT_TYPE_III_DESC_SZ(n) 0x08+(n*3)
+#define AUDIO_FORMAT_MPEG_DESC_SIZE 0x09
+#define AUDIO_FORMAT_AC3_DESC_SIZE 0x0A
+
+
+/* Audio Data Format Codes */
+
+/* Audio Data Format Type I Codes */
+#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000
+#define AUDIO_FORMAT_PCM 0x0001
+#define AUDIO_FORMAT_PCM8 0x0002
+#define AUDIO_FORMAT_IEEE_FLOAT 0x0003
+#define AUDIO_FORMAT_ALAW 0x0004
+#define AUDIO_FORMAT_MULAW 0x0005
+
+/* Audio Data Format Type II Codes */
+#define AUDIO_FORMAT_TYPE_II_UNDEFINED 0x1000
+#define AUDIO_FORMAT_MPEG 0x1001
+#define AUDIO_FORMAT_AC3 0x1002
+
+/* Audio Data Format Type III Codes */
+#define AUDIO_FORMAT_TYPE_III_UNDEFINED 0x2000
+#define AUDIO_FORMAT_IEC1937_AC3 0x2001
+#define AUDIO_FORMAT_IEC1937_MPEG1_L1 0x2002
+#define AUDIO_FORMAT_IEC1937_MPEG1_L2_3 0x2003
+#define AUDIO_FORMAT_IEC1937_MPEG2_NOEXT 0x2003
+#define AUDIO_FORMAT_IEC1937_MPEG2_EXT 0x2004
+#define AUDIO_FORMAT_IEC1937_MPEG2_L1_LS 0x2005
+#define AUDIO_FORMAT_IEC1937_MPEG2_L2_3 0x2006
+
+
+/* Predefined Audio Channel Configuration Bits */
+#define AUDIO_CHANNEL_M 0x0000 /* Mono */
+#define AUDIO_CHANNEL_L 0x0001 /* Left Front */
+#define AUDIO_CHANNEL_R 0x0002 /* Right Front */
+#define AUDIO_CHANNEL_C 0x0004 /* Center Front */
+#define AUDIO_CHANNEL_LFE 0x0008 /* Low Freq. Enhance. */
+#define AUDIO_CHANNEL_LS 0x0010 /* Left Surround */
+#define AUDIO_CHANNEL_RS 0x0020 /* Right Surround */
+#define AUDIO_CHANNEL_LC 0x0040 /* Left of Center */
+#define AUDIO_CHANNEL_RC 0x0080 /* Right of Center */
+#define AUDIO_CHANNEL_S 0x0100 /* Surround */
+#define AUDIO_CHANNEL_SL 0x0200 /* Side Left */
+#define AUDIO_CHANNEL_SR 0x0400 /* Side Right */
+#define AUDIO_CHANNEL_T 0x0800 /* Top */
+
+
+/* Feature Unit Control Bits */
+#define AUDIO_CONTROL_MUTE 0x0001
+#define AUDIO_CONTROL_VOLUME 0x0002
+#define AUDIO_CONTROL_BASS 0x0004
+#define AUDIO_CONTROL_MID 0x0008
+#define AUDIO_CONTROL_TREBLE 0x0010
+#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020
+#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040
+#define AUDIO_CONTROL_DEALY 0x0080
+#define AUDIO_CONTROL_BASS_BOOST 0x0100
+#define AUDIO_CONTROL_LOUDNESS 0x0200
+
+/* Processing Unit Control Bits: */
+#define AUDIO_CONTROL_ENABLE 0x0001 /* Common Bit */
+#define AUDIO_CONTROL_MODE_SELECT 0x0002 /* Common Bit */
+
+/* - Up/Down-mix Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+/* AUDIO_CONTROL_MODE_SELECT 0x0002 Common Bit */
+
+/* - Dolby Prologic Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+/* AUDIO_CONTROL_MODE_SELECT 0x0002 Common Bit */
+
+/* - 3D Stereo Extender Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+#define AUDIO_CONTROL_SPACIOUSNESS 0x0002
+
+/* - Reverberation Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+#define AUDIO_CONTROL_REVERB_TYPE 0x0002
+#define AUDIO_CONTROL_REVERB_LEVEL 0x0004
+#define AUDIO_CONTROL_REVERB_TIME 0x0008
+#define AUDIO_CONTROL_REVERB_FEEDBACK 0x0010
+
+/* - Chorus Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+#define AUDIO_CONTROL_CHORUS_LEVEL 0x0002
+#define AUDIO_CONTROL_SHORUS_RATE 0x0004
+#define AUDIO_CONTROL_CHORUS_DEPTH 0x0008
+
+/* - Dynamic Range Compressor Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+#define AUDIO_CONTROL_COMPRESSION_RATE 0x0002
+#define AUDIO_CONTROL_MAX_AMPL 0x0004
+#define AUDIO_CONTROL_THRESHOLD 0x0008
+#define AUDIO_CONTROL_ATTACK_TIME 0x0010
+#define AUDIO_CONTROL_RELEASE_TIME 0x0020
+
+/* Extension Unit Control Bits */
+/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
+
+/* Endpoint Control Bits */
+#define AUDIO_CONTROL_SAMPLING_FREQ 0x01
+#define AUDIO_CONTROL_PITCH 0x02
+#define AUDIO_MAX_PACKETS_ONLY 0x80
+
+
+/* Audio Terminal Types */
+
+/* USB Terminal Types */
+#define AUDIO_TERMINAL_USB_UNDEFINED 0x0100
+#define AUDIO_TERMINAL_USB_STREAMING 0x0101
+#define AUDIO_TERMINAL_USB_VENDOR_SPECIFIC 0x01FF
+
+/* Input Terminal Types */
+#define AUDIO_TERMINAL_INPUT_UNDEFINED 0x0200
+#define AUDIO_TERMINAL_MICROPHONE 0x0201
+#define AUDIO_TERMINAL_DESKTOP_MICROPHONE 0x0202
+#define AUDIO_TERMINAL_PERSONAL_MICROPHONE 0x0203
+#define AUDIO_TERMINAL_OMNI_DIR_MICROPHONE 0x0204
+#define AUDIO_TERMINAL_MICROPHONE_ARRAY 0x0205
+#define AUDIO_TERMINAL_PROCESSING_MIC_ARRAY 0x0206
+
+/* Output Terminal Types */
+#define AUDIO_TERMINAL_OUTPUT_UNDEFINED 0x0300
+#define AUDIO_TERMINAL_SPEAKER 0x0301
+#define AUDIO_TERMINAL_HEADPHONES 0x0302
+#define AUDIO_TERMINAL_HEAD_MOUNTED_AUDIO 0x0303
+#define AUDIO_TERMINAL_DESKTOP_SPEAKER 0x0304
+#define AUDIO_TERMINAL_ROOM_SPEAKER 0x0305
+#define AUDIO_TERMINAL_COMMUNICATION_SPEAKER 0x0306
+#define AUDIO_TERMINAL_LOW_FREQ_SPEAKER 0x0307
+
+/* Bi-directional Terminal Types */
+#define AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED 0x0400
+#define AUDIO_TERMINAL_HANDSET 0x0401
+#define AUDIO_TERMINAL_HEAD_MOUNTED_HANDSET 0x0402
+#define AUDIO_TERMINAL_SPEAKERPHONE 0x0403
+#define AUDIO_TERMINAL_SPEAKERPHONE_ECHOSUPRESS 0x0404
+#define AUDIO_TERMINAL_SPEAKERPHONE_ECHOCANCEL 0x0405
+
+/* Telephony Terminal Types */
+#define AUDIO_TERMINAL_TELEPHONY_UNDEFINED 0x0500
+#define AUDIO_TERMINAL_PHONE_LINE 0x0501
+#define AUDIO_TERMINAL_TELEPHONE 0x0502
+#define AUDIO_TERMINAL_DOWN_LINE_PHONE 0x0503
+
+/* External Terminal Types */
+#define AUDIO_TERMINAL_EXTERNAL_UNDEFINED 0x0600
+#define AUDIO_TERMINAL_ANALOG_CONNECTOR 0x0601
+#define AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE 0x0602
+#define AUDIO_TERMINAL_LINE_CONNECTOR 0x0603
+#define AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR 0x0604
+#define AUDIO_TERMINAL_SPDIF_INTERFACE 0x0605
+#define AUDIO_TERMINAL_1394_DA_STREAM 0x0606
+#define AUDIO_TERMINAL_1394_DA_STREAM_TRACK 0x0607
+
+/* Embedded Function Terminal Types */
+#define AUDIO_TERMINAL_EMBEDDED_UNDEFINED 0x0700
+#define AUDIO_TERMINAL_CALIBRATION_NOISE 0x0701
+#define AUDIO_TERMINAL_EQUALIZATION_NOISE 0x0702
+#define AUDIO_TERMINAL_CD_PLAYER 0x0703
+#define AUDIO_TERMINAL_DAT 0x0704
+#define AUDIO_TERMINAL_DCC 0x0705
+#define AUDIO_TERMINAL_MINI_DISK 0x0706
+#define AUDIO_TERMINAL_ANALOG_TAPE 0x0707
+#define AUDIO_TERMINAL_PHONOGRAPH 0x0708
+#define AUDIO_TERMINAL_VCR_AUDIO 0x0709
+#define AUDIO_TERMINAL_VIDEO_DISC_AUDIO 0x070A
+#define AUDIO_TERMINAL_DVD_AUDIO 0x070B
+#define AUDIO_TERMINAL_TV_TUNER_AUDIO 0x070C
+#define AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO 0x070D
+#define AUDIO_TERMINAL_CABLE_TUNER_AUDIO 0x070E
+#define AUDIO_TERMINAL_DSS_AUDIO 0x070F
+#define AUDIO_TERMINAL_RADIO_RECEIVER 0x0710
+#define AUDIO_TERMINAL_RADIO_TRANSMITTER 0x0711
+#define AUDIO_TERMINAL_MULTI_TRACK_RECORDER 0x0712
+#define AUDIO_TERMINAL_SYNTHESIZER 0x0713
+
+
+#endif /* __AUDIO_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_cdc.h b/tinyusb/device/romdriver/mw_usbd_cdc.h
new file mode 100644
index 000000000..8b9bc91b3
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_cdc.h
@@ -0,0 +1,249 @@
+/***********************************************************************
+* $Id:: mw_usbd_cdc.h 197 2011-06-12 20:22:41Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Communication Device Class User module Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __CDC_H
+#define __CDC_H
+
+#include "mw_usbd.h"
+
+/*----------------------------------------------------------------------------
+ * Definitions based on usbcdc11.pdf (www.usb.org)
+ *---------------------------------------------------------------------------*/
+/* Communication device class specification version 1.10 */
+#define CDC_V1_10 0x0110
+
+/* Communication interface class code */
+/* (usbcdc11.pdf, 4.2, Table 15) */
+#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02
+
+/* Communication interface class subclass codes */
+/* (usbcdc11.pdf, 4.3, Table 16) */
+#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01
+#define CDC_ABSTRACT_CONTROL_MODEL 0x02
+#define CDC_TELEPHONE_CONTROL_MODEL 0x03
+#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04
+#define CDC_CAPI_CONTROL_MODEL 0x05
+#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06
+#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07
+
+/* Communication interface class control protocol codes */
+/* (usbcdc11.pdf, 4.4, Table 17) */
+#define CDC_PROTOCOL_COMMON_AT_COMMANDS 0x01
+
+/* Data interface class code */
+/* (usbcdc11.pdf, 4.5, Table 18) */
+#define CDC_DATA_INTERFACE_CLASS 0x0A
+
+/* Data interface class protocol codes */
+/* (usbcdc11.pdf, 4.7, Table 19) */
+#define CDC_PROTOCOL_ISDN_BRI 0x30
+#define CDC_PROTOCOL_HDLC 0x31
+#define CDC_PROTOCOL_TRANSPARENT 0x32
+#define CDC_PROTOCOL_Q921_MANAGEMENT 0x50
+#define CDC_PROTOCOL_Q921_DATA_LINK 0x51
+#define CDC_PROTOCOL_Q921_MULTIPLEXOR 0x52
+#define CDC_PROTOCOL_V42 0x90
+#define CDC_PROTOCOL_EURO_ISDN 0x91
+#define CDC_PROTOCOL_V24_RATE_ADAPTATION 0x92
+#define CDC_PROTOCOL_CAPI 0x93
+#define CDC_PROTOCOL_HOST_BASED_DRIVER 0xFD
+#define CDC_PROTOCOL_DESCRIBED_IN_PUFD 0xFE
+
+/* Type values for bDescriptorType field of functional descriptors */
+/* (usbcdc11.pdf, 5.2.3, Table 24) */
+#define CDC_CS_INTERFACE 0x24
+#define CDC_CS_ENDPOINT 0x25
+
+/* Type values for bDescriptorSubtype field of functional descriptors */
+/* (usbcdc11.pdf, 5.2.3, Table 25) */
+#define CDC_HEADER 0x00
+#define CDC_CALL_MANAGEMENT 0x01
+#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02
+#define CDC_DIRECT_LINE_MANAGEMENT 0x03
+#define CDC_TELEPHONE_RINGER 0x04
+#define CDC_REPORTING_CAPABILITIES 0x05
+#define CDC_UNION 0x06
+#define CDC_COUNTRY_SELECTION 0x07
+#define CDC_TELEPHONE_OPERATIONAL_MODES 0x08
+#define CDC_USB_TERMINAL 0x09
+#define CDC_NETWORK_CHANNEL 0x0A
+#define CDC_PROTOCOL_UNIT 0x0B
+#define CDC_EXTENSION_UNIT 0x0C
+#define CDC_MULTI_CHANNEL_MANAGEMENT 0x0D
+#define CDC_CAPI_CONTROL_MANAGEMENT 0x0E
+#define CDC_ETHERNET_NETWORKING 0x0F
+#define CDC_ATM_NETWORKING 0x10
+
+/* CDC class-specific request codes */
+/* (usbcdc11.pdf, 6.2, Table 46) */
+/* see Table 45 for info about the specific requests. */
+#define CDC_SEND_ENCAPSULATED_COMMAND 0x00
+#define CDC_GET_ENCAPSULATED_RESPONSE 0x01
+#define CDC_SET_COMM_FEATURE 0x02
+#define CDC_GET_COMM_FEATURE 0x03
+#define CDC_CLEAR_COMM_FEATURE 0x04
+#define CDC_SET_AUX_LINE_STATE 0x10
+#define CDC_SET_HOOK_STATE 0x11
+#define CDC_PULSE_SETUP 0x12
+#define CDC_SEND_PULSE 0x13
+#define CDC_SET_PULSE_TIME 0x14
+#define CDC_RING_AUX_JACK 0x15
+#define CDC_SET_LINE_CODING 0x20
+#define CDC_GET_LINE_CODING 0x21
+#define CDC_SET_CONTROL_LINE_STATE 0x22
+#define CDC_SEND_BREAK 0x23
+#define CDC_SET_RINGER_PARMS 0x30
+#define CDC_GET_RINGER_PARMS 0x31
+#define CDC_SET_OPERATION_PARMS 0x32
+#define CDC_GET_OPERATION_PARMS 0x33
+#define CDC_SET_LINE_PARMS 0x34
+#define CDC_GET_LINE_PARMS 0x35
+#define CDC_DIAL_DIGITS 0x36
+#define CDC_SET_UNIT_PARAMETER 0x37
+#define CDC_GET_UNIT_PARAMETER 0x38
+#define CDC_CLEAR_UNIT_PARAMETER 0x39
+#define CDC_GET_PROFILE 0x3A
+#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40
+#define CDC_SET_ETHERNET_PMP_FILTER 0x41
+#define CDC_GET_ETHERNET_PMP_FILTER 0x42
+#define CDC_SET_ETHERNET_PACKET_FILTER 0x43
+#define CDC_GET_ETHERNET_STATISTIC 0x44
+#define CDC_SET_ATM_DATA_FORMAT 0x50
+#define CDC_GET_ATM_DEVICE_STATISTICS 0x51
+#define CDC_SET_ATM_DEFAULT_VC 0x52
+#define CDC_GET_ATM_VC_STATISTICS 0x53
+
+/* Communication feature selector codes */
+/* (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) */
+#define CDC_ABSTRACT_STATE 0x01
+#define CDC_COUNTRY_SETTING 0x02
+
+/* Feature Status returned for ABSTRACT_STATE Selector */
+/* (usbcdc11.pdf, 6.2.3, Table 48) */
+#define CDC_IDLE_SETTING (1 << 0)
+#define CDC_DATA_MULTPLEXED_STATE (1 << 1)
+
+
+/* Control signal bitmap values for the SetControlLineState request */
+/* (usbcdc11.pdf, 6.2.14, Table 51) */
+#define CDC_DTE_PRESENT (1 << 0)
+#define CDC_ACTIVATE_CARRIER (1 << 1)
+
+/* CDC class-specific notification codes */
+/* (usbcdc11.pdf, 6.3, Table 68) */
+/* see Table 67 for Info about class-specific notifications */
+#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00
+#define CDC_RESPONSE_AVAILABLE 0x01
+#define CDC_AUX_JACK_HOOK_STATE 0x08
+#define CDC_RING_DETECT 0x09
+#define CDC_NOTIFICATION_SERIAL_STATE 0x20
+#define CDC_CALL_STATE_CHANGE 0x28
+#define CDC_LINE_STATE_CHANGE 0x29
+#define CDC_CONNECTION_SPEED_CHANGE 0x2A
+
+/* UART state bitmap values (Serial state notification). */
+/* (usbcdc11.pdf, 6.3.5, Table 69) */
+#define CDC_SERIAL_STATE_OVERRUN (1 << 6) /* receive data overrun error has occurred */
+#define CDC_SERIAL_STATE_PARITY (1 << 5) /* parity error has occurred */
+#define CDC_SERIAL_STATE_FRAMING (1 << 4) /* framing error has occurred */
+#define CDC_SERIAL_STATE_RING (1 << 3) /* state of ring signal detection */
+#define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */
+#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */
+#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */
+
+
+/*----------------------------------------------------------------------------
+ * Structures based on usbcdc11.pdf (www.usb.org)
+ *---------------------------------------------------------------------------*/
+
+/* Header functional descriptor */
+/* (usbcdc11.pdf, 5.2.3.1) */
+/* This header must precede any list of class-specific descriptors. */
+PRE_PACK struct POST_PACK _CDC_HEADER_DESCRIPTOR{
+ uint8_t bFunctionLength; /* size of this descriptor in bytes */
+ uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
+ uint8_t bDescriptorSubtype; /* Header functional descriptor subtype */
+ uint16_t bcdCDC; /* USB CDC specification release version */
+};
+typedef struct _CDC_HEADER_DESCRIPTOR CDC_HEADER_DESCRIPTOR;
+
+/* Call management functional descriptor */
+/* (usbcdc11.pdf, 5.2.3.2) */
+/* Describes the processing of calls for the communication class interface. */
+PRE_PACK struct POST_PACK _CDC_CALL_MANAGEMENT_DESCRIPTOR {
+ uint8_t bFunctionLength; /* size of this descriptor in bytes */
+ uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
+ uint8_t bDescriptorSubtype; /* call management functional descriptor subtype */
+ uint8_t bmCapabilities; /* capabilities that this configuration supports */
+ uint8_t bDataInterface; /* interface number of the data class interface used for call management (optional) */
+};
+typedef struct _CDC_CALL_MANAGEMENT_DESCRIPTOR CDC_CALL_MANAGEMENT_DESCRIPTOR;
+
+/* Abstract control management functional descriptor */
+/* (usbcdc11.pdf, 5.2.3.3) */
+/* Describes the command supported by the communication interface class with the Abstract Control Model subclass code. */
+PRE_PACK struct POST_PACK _CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR {
+ uint8_t bFunctionLength; /* size of this descriptor in bytes */
+ uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
+ uint8_t bDescriptorSubtype; /* abstract control management functional descriptor subtype */
+ uint8_t bmCapabilities; /* capabilities supported by this configuration */
+};
+typedef struct _CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR;
+
+/* Union functional descriptors */
+/* (usbcdc11.pdf, 5.2.3.8) */
+/* Describes the relationship between a group of interfaces that can be considered to form a functional unit. */
+PRE_PACK struct POST_PACK _CDC_UNION_DESCRIPTOR {
+ uint8_t bFunctionLength; /* size of this descriptor in bytes */
+ uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
+ uint8_t bDescriptorSubtype; /* union functional descriptor subtype */
+ uint8_t bMasterInterface; /* interface number designated as master */
+};
+typedef struct _CDC_UNION_DESCRIPTOR CDC_UNION_DESCRIPTOR;
+
+/* Union functional descriptors with one slave interface */
+/* (usbcdc11.pdf, 5.2.3.8) */
+PRE_PACK struct POST_PACK _CDC_UNION_1SLAVE_DESCRIPTOR {
+ CDC_UNION_DESCRIPTOR sUnion; /* Union functional descriptor */
+ uint8_t bSlaveInterfaces[1]; /* Slave interface 0 */
+};
+typedef struct _CDC_UNION_1SLAVE_DESCRIPTOR CDC_UNION_1SLAVE_DESCRIPTOR;
+
+/* Line coding structure */
+/* Format of the data returned when a GetLineCoding request is received */
+/* (usbcdc11.pdf, 6.2.13) */
+PRE_PACK struct POST_PACK _CDC_LINE_CODING {
+ uint32_t dwDTERate; /* Data terminal rate in bits per second */
+ uint8_t bCharFormat; /* Number of stop bits */
+ uint8_t bParityType; /* Parity bit type */
+ uint8_t bDataBits; /* Number of data bits */
+};
+typedef struct _CDC_LINE_CODING CDC_LINE_CODING;
+
+/* Notification header */
+/* Data sent on the notification endpoint must follow this header. */
+/* see USB_SETUP_PACKET in file usb.h */
+typedef USB_SETUP_PACKET CDC_NOTIFICATION_HEADER;
+
+#endif /* __CDC_H */
+
diff --git a/tinyusb/device/romdriver/mw_usbd_cdcuser.h b/tinyusb/device/romdriver/mw_usbd_cdcuser.h
new file mode 100644
index 000000000..549025331
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_cdcuser.h
@@ -0,0 +1,342 @@
+/***********************************************************************
+* $Id:: mw_usbd_cdcuser.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Communication Device Class User module Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __CDCUSER_H__
+#define __CDCUSER_H__
+
+#include "error.h"
+#include "mw_usbd.h"
+#include "mw_usbd_cdc.h"
+
+/** \file
+ * \brief Communication Device Class (CDC) API structures and function prototypes.
+ *
+ * Definition of functions exported by ROM based CDC function driver.
+ *
+ */
+
+/** \ingroup Group_USBD
+ * @defgroup USBD_CDC Communication Device Class (CDC) Function Driver
+ * \section Sec_CDCModDescription Module Description
+ * CDC Class Function Driver module. This module contains an internal implementation of the USB CDC Class.
+ * User applications can use this class driver instead of implementing the CDC class manually
+ * via the low-level USBD_HW and USBD_Core APIs.
+ *
+ * This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ * Devices using the USB CDC Class.
+ */
+
+/*----------------------------------------------------------------------------
+ We need a buffer for incomming data on USB port because USB receives
+ much faster than UART transmits
+ *---------------------------------------------------------------------------*/
+/* Buffer masks */
+#define CDC_BUF_SIZE (128) /* Output buffer in bytes (power 2) */
+ /* large enough for file transfer */
+#define CDC_BUF_MASK (CDC_BUF_SIZE-1ul)
+
+/** \brief Communication Device Class function driver initilization parameter data structure.
+ * \ingroup USBD_CDC
+ *
+ * \details This data structure is used to pass initialization parameters to the
+ * Communication Device Class function driver's init function.
+ *
+ */
+typedef struct USBD_CDC_INIT_PARAM
+{
+ /* memory allocation params */
+ uint32_t mem_base; /**< Base memory location from where the stack can allocate
+ data and buffers. \note The memory address set in this field
+ should be accessible by USB DMA controller. Also this value
+ should be aligned on 4 byte boundary.
+ */
+ uint32_t mem_size; /**< The size of memory buffer which stack can use.
+ \note The \em mem_size should be greater than the size
+ returned by USBD_CDC_API::GetMemSize() routine.*/
+ /** Pointer to the control interface descriptor within the descriptor
+ * array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
+ * structure. The stack assumes both HS and FS use same BULK endpoints.
+ */
+ uint8_t* cif_intf_desc;
+ /** Pointer to the data interface descriptor within the descriptor
+ * array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
+ * structure. The stack assumes both HS and FS use same BULK endpoints.
+ */
+ uint8_t* dif_intf_desc;
+
+ /* user defined functions */
+
+ /* required functions */
+ /**
+ * Communication Interface Class specific get request callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends CIC management element get requests. The setup packet data (\em pSetup)
+ * is passed to the callback so that application can extract the CIC request type
+ * and other associated data. By default the stack will ssign \em pBuffer pointer
+ * to \em EP0Buff allocated at init. The application code can directly write data
+ * into this buffer as long as data is less than 64 byte. If more data has to be sent
+ * then application code should update \em pBuffer pointer and length accordingly.
+ *
+ *
+ * \param[in] hCdc Handle to CDC function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in, out] pBuffer Pointer to a pointer of data buffer containing request data.
+ * Pointer-to-pointer is used to implement zero-copy buffers.
+ * See \ref USBD_ZeroCopy for more details on zero-copy concept.
+ * \param[in, out] length Amount of data to be sent back to host.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*CIC_GetRequest)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
+
+ /**
+ * Communication Interface Class specific set request callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a CIC management element requests. The setup packet data (\em pSetup)
+ * is passed to the callback so that application can extract the CIC request type
+ * and other associated data. If a set request has data associated, then this callback
+ * is called twice.
+ * (1) First when setup request is recived, at this time application code could update
+ * \em pBuffer pointer to point to the intended destination. The length param is set to 0
+ * so that application code knows this is first time. By default the stack will
+ * assign \em pBuffer pointer to \em EP0Buff allocated at init. Note, if data length is
+ * greater than 64 bytes and application code doesn't update \em pBuffer pointer the
+ * stack will send STALL condition to host.
+ * (2) Second when the data is recived from the host. This time the length param is set
+ * with number of data bytes recived.
+ *
+ * \param[in] hCdc Handle to CDC function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in, out] pBuffer Pointer to a pointer of data buffer containing request data.
+ * Pointer-to-pointer is used to implement zero-copy buffers.
+ * See \ref USBD_ZeroCopy for more details on zero-copy concept.
+ * \param[in] length Amount of data copied to destination buffer.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*CIC_SetRequest)( USBD_HANDLE_T hCdc, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
+
+ /**
+ * Communication Device Class specific BULK IN endpoint handler.
+ *
+ * The application software should provide the BULK IN endpoint handler.
+ * Applications should transfer data depending on the communication protocol type set in descriptors.
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*CDC_BulkIN_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+ /**
+ * Communication Device Class specific BULK OUT endpoint handler.
+ *
+ * The application software should provide the BULK OUT endpoint handler.
+ * Applications should transfer data depending on the communication protocol type set in descriptors.
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*CDC_BulkOUT_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+ ErrorCode_t (*SendEncpsCmd) (USBD_HANDLE_T hCDC, uint8_t* buffer, uint16_t len);
+ ErrorCode_t (*GetEncpsResp) (USBD_HANDLE_T hCDC, uint8_t** buffer, uint16_t* len);
+ ErrorCode_t (*SetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t* buffer, uint16_t len);
+ ErrorCode_t (*GetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t** pBuffer, uint16_t* len);
+ ErrorCode_t (*ClrCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature);
+ ErrorCode_t (*SetCtrlLineState) (USBD_HANDLE_T hCDC, uint16_t state);
+ ErrorCode_t (*SendBreak) (USBD_HANDLE_T hCDC, uint16_t mstime);
+ ErrorCode_t (*SetLineCode) (USBD_HANDLE_T hCDC, CDC_LINE_CODING* line_coding);
+
+ /**
+ * Optional Communication Device Class specific INTERRUPT IN endpoint handler.
+ *
+ * The application software should provide the INT IN endpoint handler.
+ * Applications should transfer data depending on the communication protocol type set in descriptors.
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*CDC_InterruptEP_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+ /**
+ * Optional user overridable function to replace the default CDC class handler.
+ *
+ * The application software could override the default EP0 class handler with their
+ * own by providing the handler function address as this data member of the parameter
+ * structure. Application which like the default handler should set this data member
+ * to zero before calling the USBD_CDC_API::Init().
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*CDC_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+} USBD_CDC_INIT_PARAM_T;
+
+/** \brief CDC class API functions structure.
+ * \ingroup USBD_CDC
+ *
+ * This module exposes functions which interact directly with USB device controller hardware.
+ *
+ */
+typedef struct USBD_CDC_API
+{
+ /** \fn uint32_t GetMemSize(USBD_CDC_INIT_PARAM_T* param)
+ * Function to determine the memory required by the CDC function driver module.
+ *
+ * This function is called by application layer before calling pUsbApi->CDC->Init(), to allocate memory used
+ * by CDC function driver module. The application should allocate the memory which is accessible by USB
+ * controller/DMA controller.
+ * \note Some memory areas are not accessible by all bus masters.
+ *
+ * \param[in] param Structure containing CDC function driver module initialization parameters.
+ * \return Returns the required memory size in bytes.
+ */
+ uint32_t (*GetMemSize)(USBD_CDC_INIT_PARAM_T* param);
+
+ /** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_CDC_INIT_PARAM_T* param)
+ * Function to initialize CDC function driver module.
+ *
+ * This fuction is called by application layer to initialize CDC function driver module.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in, out] param Structure containing CDC function driver module initialization parameters.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_BAD_MEM_BUF Memory buffer passed is not 4-byte
+ * aligned or smaller than required.
+ * \retval ERR_API_INVALID_PARAM2 Either CDC_Write() or CDC_Read() or
+ * CDC_Verify() callbacks are not defined.
+ * \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
+ * \retval ERR_USBD_BAD_EP_DESC Wrong endpoint descriptor is passed.
+ */
+ ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_CDC_INIT_PARAM_T* param, USBD_HANDLE_T* phCDC);
+
+ /** \fn ErrorCode_t SendNotification(USBD_HANDLE_T hCdc, uint8_t bNotification, uint16_t data)
+ * Function to initialize CDC function driver module.
+ *
+ * This fuction is called by application layer to initialize CDC function driver module.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in, out] param Structure containing CDC function driver module initialization parameters.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_BAD_MEM_BUF Memory buffer passed is not 4-byte
+ * aligned or smaller than required.
+ * \retval ERR_API_INVALID_PARAM2 Either CDC_Write() or CDC_Read() or
+ * CDC_Verify() callbacks are not defined.
+ * \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
+ * \retval ERR_USBD_BAD_EP_DESC Wrong endpoint descriptor is passed.
+ */
+ ErrorCode_t (*SendNotification)(USBD_HANDLE_T hCdc, uint8_t bNotification, uint16_t data);
+
+} USBD_CDC_API_T;
+
+/*-----------------------------------------------------------------------------
+ * Private functions & structures prototypes
+ *-----------------------------------------------------------------------------*/
+/** @cond ADVANCED_API */
+
+typedef struct _CDC_CTRL_T
+{
+ USB_CORE_CTRL_T* pUsbCtrl;
+ /* notification buffer */
+ uint8_t notice_buf[12];
+ CDC_LINE_CODING line_coding;
+ uint8_t pad0;
+
+ uint8_t cif_num; /* control interface number */
+ uint8_t dif_num; /* data interface number */
+ uint8_t epin_num; /* BULK IN endpoint number */
+ uint8_t epout_num; /* BULK OUT endpoint number */
+ uint8_t epint_num; /* Interrupt IN endpoint number */
+ uint8_t pad[3];
+ /* user defined functions */
+ ErrorCode_t (*SendEncpsCmd) (USBD_HANDLE_T hCDC, uint8_t* buffer, uint16_t len);
+ ErrorCode_t (*GetEncpsResp) (USBD_HANDLE_T hCDC, uint8_t** buffer, uint16_t* len);
+ ErrorCode_t (*SetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t* buffer, uint16_t len);
+ ErrorCode_t (*GetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t** pBuffer, uint16_t* len);
+ ErrorCode_t (*ClrCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature);
+ ErrorCode_t (*SetCtrlLineState) (USBD_HANDLE_T hCDC, uint16_t state);
+ ErrorCode_t (*SendBreak) (USBD_HANDLE_T hCDC, uint16_t state);
+ ErrorCode_t (*SetLineCode) (USBD_HANDLE_T hCDC, CDC_LINE_CODING* line_coding);
+
+ /* virtual functions */
+ ErrorCode_t (*CIC_GetRequest)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
+ ErrorCode_t (*CIC_SetRequest)( USBD_HANDLE_T hCdc, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
+
+}USB_CDC_CTRL_T;
+
+/** @cond DIRECT_API */
+extern uint32_t mwCDC_GetMemSize(USBD_CDC_INIT_PARAM_T* param);
+extern ErrorCode_t mwCDC_init(USBD_HANDLE_T hUsb, USBD_CDC_INIT_PARAM_T* param, USBD_HANDLE_T* phCDC);
+extern ErrorCode_t mwCDC_SendNotification (USBD_HANDLE_T hCdc, uint8_t bNotification, uint16_t data);
+/** @endcond */
+
+/** @endcond */
+
+
+
+
+
+#endif /* __CDCUSER_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_core.h b/tinyusb/device/romdriver/mw_usbd_core.h
new file mode 100644
index 000000000..068eecf23
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_core.h
@@ -0,0 +1,575 @@
+/***********************************************************************
+* $Id:: mw_usbd_core.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB core controller structure defnitions and function prototypes.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __MW_USBD_CORE_H__
+#define __MW_USBD_CORE_H__
+
+#include "error.h"
+#include "mw_usbd.h"
+#include "tusb_cfg.h"
+
+/** \file
+ * \brief ROM API for USB device stack.
+ *
+ * Definition of functions exported by core layer of ROM based USB device stack.
+ *
+ */
+
+/** \ingroup Group_USBD
+ * @defgroup USBD_Core USB Core Layer
+ * \section Sec_CoreModDescription Module Description
+ * The USB Core Layer implements the device abstraction defined in the Universal Serial Bus Specification,
+ * for applications to interact with the USB device interface on the device. The software in this layer responds to
+ * standard requests and returns standard descriptors. In current stack the Init() routine part of
+ * \ref USBD_HW_API_T structure initializes both hardware layer and core layer.
+ */
+
+
+/* function pointer types */
+
+/** \ingroup USBD_Core
+ * \typedef USB_CB_T
+ * \brief USB device stack's event callback function type.
+ *
+ * The USB device stack exposes several event triggers through callback to application layer. The
+ * application layer can register methods to be called when such USB event happens.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx Other error conditions.
+ *
+ */
+typedef ErrorCode_t (*USB_CB_T) (USBD_HANDLE_T hUsb);
+
+/** \ingroup USBD_Core
+ * \typedef USB_PARAM_CB_T
+ * \brief USB device stack's event callback function type.
+ *
+ * The USB device stack exposes several event triggers through callback to application layer. The
+ * application layer can register methods to be called when such USB event happens.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] param1 Extra information related to the event.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+typedef ErrorCode_t (*USB_PARAM_CB_T) (USBD_HANDLE_T hUsb, uint32_t param1);
+
+/** \ingroup USBD_Core
+ * \typedef USB_EP_HANDLER_T
+ * \brief USBD setup request and endpoint event handler type.
+ *
+ * The application layer should define the custom class's EP0 handler with function signature.
+ * The stack calls all the registered class handlers on any EP0 event before going through default
+ * handling of the event. This gives the class handlers to implement class specific request handlers
+ * and also to override the default stack handling for a particular event targeted to the interface.
+ * If an event is not handled by the callback the function should return ERR_USBD_UNHANDLED. For all
+ * other return codes the stack assumes that callback has taken care of the event and hence will not
+ * process the event any further and issues a STALL condition on EP0 indicating error to the host.
+ * \n
+ * For endpoint interrupt handler the return value is ignored by the stack.
+ * \n
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+typedef ErrorCode_t (*USB_EP_HANDLER_T)(USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+
+/** \ingroup USBD_Core
+ * \brief USB descriptors data structure.
+ * \ingroup USBD_Core
+ *
+ * \details This structure is used as part of USB device stack initialisation
+ * parameter structure \ref USBD_API_INIT_PARAM_T. This structure contains
+ * pointers to various descriptor arrays needed by the stack. These descriptors
+ * are reported to USB host as part of enumerations process.
+ *
+ * \note All descriptor pointers assigned in this structure should be on 4 byte
+ * aligned address boundary.
+ */
+typedef struct _USB_CORE_DESCS_T
+{
+ uint8_t *device_desc; /**< Pointer to USB device descriptor */
+ uint8_t *string_desc; /**< Pointer to array of USB string descriptors */
+ uint8_t *full_speed_desc; /**< Pointer to USB device configuration descriptor
+ * when device is operating in full speed mode.
+ */
+ uint8_t *high_speed_desc; /**< Pointer to USB device configuration descriptor
+ * when device is operating in high speed mode. For
+ * full-speed only implementation this pointer should
+ * be same as full_speed_desc.
+ */
+ uint8_t *device_qualifier; /**< Pointer to USB device qualifier descriptor. For
+ * full-speed only implementation this pointer should
+ * be set to null (0).
+ */
+} USB_CORE_DESCS_T;
+
+/** \brief USB device stack initilization parameter data structure.
+ * \ingroup USBD_Core
+ *
+ * \details This data structure is used to pass initialization parameters to the
+ * USB device stack's init function.
+ *
+ */
+typedef struct USBD_API_INIT_PARAM
+{
+ uint32_t usb_reg_base; /**< USB device controller's base register address. */
+ uint32_t mem_base; /**< Base memory location from where the stack can allocate
+ data and buffers. \note The memory address set in this field
+ should be accessible by USB DMA controller. Also this value
+ should be aligned on 2048 byte boundary.
+ */
+ uint32_t mem_size; /**< The size of memory buffer which stack can use.
+ \note The \em mem_size should be greater than the size
+ returned by USBD_HW_API::GetMemSize() routine.*/
+ uint8_t max_num_ep; /**< max number of endpoints supported by the USB device
+ controller instance (specified by \em usb_reg_base field)
+ to which this instance of stack is attached.
+ */
+ uint8_t pad0[3];
+ /* USB Device Events Callback Functions */
+ /** Event for USB interface reset. This event fires when the USB host requests that the device
+ * reset its interface. This event fires after the control endpoint has been automatically
+ * configured by the library.
+ * \n
+ * \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
+ * callback will prevent the device from enumerating correctly or operate properly.
+ *
+ */
+ USB_CB_T USB_Reset_Event;
+
+ /** Event for USB suspend. This event fires when the USB host suspends the device by halting its
+ * transmission of Start Of Frame pulses to the device. This is generally hooked in order to move
+ * the device over to a low power state until the host wakes up the device.
+ * \n
+ * \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
+ * callback will cause other system issues.
+ */
+ USB_CB_T USB_Suspend_Event;
+
+ /** Event for USB wake up or resume. This event fires when a the USB device interface is suspended
+ * and the host wakes up the device by supplying Start Of Frame pulses. This is generally
+ * hooked to pull the user application out of a low power state and back into normal operating
+ * mode.
+ * \n
+ * \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
+ * callback will cause other system issues.
+ *
+ */
+ USB_CB_T USB_Resume_Event;
+
+ /** Reserved parameter should be set to zero. */
+ USB_CB_T reserved_sbz;
+
+ /** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
+ * frame, once per millisecond in full-speed mode or once per 125 microseconds in high-speed mode,
+ * and is synchronized to the USB bus.
+ *
+ * This event is time-critical; it is run once per millisecond (full-speed mode) and thus long handlers
+ * will significantly degrade device performance. This event should only be enabled when needed to
+ * reduce device wake-ups.
+ *
+ * \note This event is not normally active - it must be manually enabled and disabled via the USB interrupt
+ * register.
+ * \n\n
+ */
+ USB_CB_T USB_SOF_Event;
+
+ /** Event for remote wakeup configururation, when enabled. This event fires when the USB host
+ * request the device to configure itself for remote wake-up capability. The USB host sends
+ * this request to device which report remote wakeup capable in their device descriptors,
+ * before going to low-power state. The application layer should implement this callback if
+ * they have any special on board circuit to trigerr remote wake up event. Also application
+ * can use this callback to differntiate the following SUSPEND event is caused by cable plug-out
+ * or host SUSPEND request. The device can wakeup host only after reciving this callback and
+ * remote wakeup feature is enabled by host. To signal remote wakeup the device has to generate
+ * resume signaling on bus by calling usapi.hw->WakeUp() routine.
+ *
+ * \n\n
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] param1 When 0 - Clear the wakeup configuration, 1 - Enable the wake-up configuration.
+ * \return The call back should return \ref ErrorCode_t type to indicate success or error condition.
+ */
+ USB_PARAM_CB_T USB_WakeUpCfg;
+
+ /** Reserved parameter should be set to zero. */
+ USB_PARAM_CB_T USB_Power_Event;
+
+ /** Event for error condition. This event fires when USB device controller detect
+ * an error condition in the system.
+ *
+ * \n\n
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] param1 USB device interrupt status register.
+ * \return The call back should return \ref ErrorCode_t type to indicate success or error condition.
+ */
+ USB_PARAM_CB_T USB_Error_Event;
+
+ /* USB Core Events Callback Functions */
+ /** Event for USB configuration number changed. This event fires when a the USB host changes the
+ * selected configuration number. On receiving configuration change request from host, the stack
+ * enables/configures the endpoints needed by the new configuration before calling this callback
+ * function.
+ * \n
+ * \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
+ * callback will prevent the device from enumerating correctly or operate properly.
+ *
+ */
+ USB_CB_T USB_Configure_Event;
+
+ /** Event for USB interface setting changed. This event fires when a the USB host changes the
+ * interface setting to one of alternate interface settings. On receiving interface change
+ * request from host, the stack enables/configures the endpoints needed by the new alternate
+ * interface setting before calling this callback function.
+ * \n
+ * \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
+ * callback will prevent the device from enumerating correctly or operate properly.
+ *
+ */
+ USB_CB_T USB_Interface_Event;
+
+ /** Event for USB feature changed. This event fires when a the USB host send set/clear feature
+ * request. The stack handles this request for USB_FEATURE_REMOTE_WAKEUP, USB_FEATURE_TEST_MODE
+ * and USB_FEATURE_ENDPOINT_STALL features only. On receiving feature request from host, the
+ * stack handle the request appropriately and then calls this callback function.
+ * \n
+ * \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
+ * callback will prevent the device from enumerating correctly or operate properly.
+ *
+ */
+ USB_CB_T USB_Feature_Event;
+
+ /* cache and mmu translation functions */
+ /** Reserved parameter for future use. should be set to zero. */
+ uint32_t (* virt_to_phys)(void* vaddr);
+ /** Reserved parameter for future use. should be set to zero. */
+ void (* cache_flush)(uint32_t* start_adr, uint32_t* end_adr);
+
+} USBD_API_INIT_PARAM_T;
+
+
+/** \brief USBD stack Core API functions structure.
+ * \ingroup USBD_Core
+ *
+ * \details This module exposes functions which interact directly with USB device stack's core layer.
+ * The application layer uses this component when it has to implement custom class function driver or
+ * standard class function driver which is not part of the current USB device stack.
+ * The functions exposed by this interface are to register class specific EP0 handlers and corresponding
+ * utility functions to manipulate EP0 state machine of the stack. This interface also exposes
+ * function to register custom endpoint interrupt handler.
+ *
+ */
+typedef struct USBD_CORE_API
+{
+ /** \fn ErrorCode_t RegisterClassHandler(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data)
+ * Function to register class specific EP0 event handler with USB device stack.
+ *
+ * The application layer uses this function when it has to register the custom class's EP0 handler.
+ * The stack calls all the registered class handlers on any EP0 event before going through default
+ * handling of the event. This gives the class handlers to implement class specific request handlers
+ * and also to override the default stack handling for a particular event targeted to the interface.
+ * Check USB_EP_HANDLER_T for more details on how the callback function should be implemented. Also
+ * application layer could use this function to register EP0 handler which responds to vendor specific
+ * requests.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] pfn Class specific EP0 handler function.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_TOO_MANY_CLASS_HDLR(0x0004000c) The number of class handlers registered is
+ greater than the number of handlers allowed by the stack.
+ *
+ */
+ ErrorCode_t (*RegisterClassHandler)(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data);
+
+ /** \fn ErrorCode_t RegisterEpHandler(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data)
+ * Function to register interrupt/event handler for the requested endpoint with USB device stack.
+ *
+ * The application layer uses this function to register the custom class's EP0 handler.
+ * The stack calls all the registered class handlers on any EP0 event before going through default
+ * handling of the event. This gives the class handlers to implement class specific request handlers
+ * and also to override the default stack handling for a particular event targeted to the interface.
+ * Check USB_EP_HANDLER_T for more details on how the callback function should be implemented.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] ep_index Class specific EP0 handler function.
+ * \param[in] pfn Class specific EP0 handler function.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_TOO_MANY_CLASS_HDLR(0x0004000c) Too many endpoint handlers.
+ *
+ */
+ ErrorCode_t (*RegisterEpHandler)(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data);
+
+ /** \fn void SetupStage(USBD_HANDLE_T hUsb)
+ * Function to set EP0 state machine in setup state.
+ *
+ * This function is called by USB stack and the application layer to
+ * set the EP0 state machine in setup state. This function will read
+ * the setup packet received from USB host into stack's buffer.
+ * \n
+ * \note This interface is provided to users to invoke this function in other
+ * scenarios which are not handle by current stack. In most user applications
+ * this function is not called directly.Also this function can be used by
+ * users who are selectively modifying the USB device stack's standard handlers
+ * through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*SetupStage )(USBD_HANDLE_T hUsb);
+
+ /** \fn void DataInStage(USBD_HANDLE_T hUsb)
+ * Function to set EP0 state machine in data_in state.
+ *
+ * This function is called by USB stack and the application layer to
+ * set the EP0 state machine in data_in state. This function will write
+ * the data present in EP0Data buffer to EP0 FIFO for tranmission to host.
+ * \n
+ * \note This interface is provided to users to invoke this function in other
+ * scenarios which are not handle by current stack. In most user applications
+ * this function is not called directly.Also this function can be used by
+ * users who are selectively modifying the USB device stack's standard handlers
+ * through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*DataInStage)(USBD_HANDLE_T hUsb);
+
+ /** \fn void DataOutStage(USBD_HANDLE_T hUsb)
+ * Function to set EP0 state machine in data_out state.
+ *
+ * This function is called by USB stack and the application layer to
+ * set the EP0 state machine in data_out state. This function will read
+ * the control data (EP0 out packets) received from USB host into EP0Data buffer.
+ * \n
+ * \note This interface is provided to users to invoke this function in other
+ * scenarios which are not handle by current stack. In most user applications
+ * this function is not called directly.Also this function can be used by
+ * users who are selectively modifying the USB device stack's standard handlers
+ * through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*DataOutStage)(USBD_HANDLE_T hUsb);
+
+ /** \fn void StatusInStage(USBD_HANDLE_T hUsb)
+ * Function to set EP0 state machine in status_in state.
+ *
+ * This function is called by USB stack and the application layer to
+ * set the EP0 state machine in status_in state. This function will send
+ * zero length IN packet on EP0 to host, indicating positive status.
+ * \n
+ * \note This interface is provided to users to invoke this function in other
+ * scenarios which are not handle by current stack. In most user applications
+ * this function is not called directly.Also this function can be used by
+ * users who are selectively modifying the USB device stack's standard handlers
+ * through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*StatusInStage)(USBD_HANDLE_T hUsb);
+ /** \fn void StatusOutStage(USBD_HANDLE_T hUsb)
+ * Function to set EP0 state machine in status_out state.
+ *
+ * This function is called by USB stack and the application layer to
+ * set the EP0 state machine in status_out state. This function will read
+ * the zero length OUT packet received from USB host on EP0.
+ * \n
+ * \note This interface is provided to users to invoke this function in other
+ * scenarios which are not handle by current stack. In most user applications
+ * this function is not called directly.Also this function can be used by
+ * users who are selectively modifying the USB device stack's standard handlers
+ * through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*StatusOutStage)(USBD_HANDLE_T hUsb);
+
+ /** \fn void StallEp0(USBD_HANDLE_T hUsb)
+ * Function to set EP0 state machine in stall state.
+ *
+ * This function is called by USB stack and the application layer to
+ * generate STALL signalling on EP0 endpoint. This function will also
+ * reset the EP0Data buffer.
+ * \n
+ * \note This interface is provided to users to invoke this function in other
+ * scenarios which are not handle by current stack. In most user applications
+ * this function is not called directly.Also this function can be used by
+ * users who are selectively modifying the USB device stack's standard handlers
+ * through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*StallEp0)(USBD_HANDLE_T hUsb);
+
+} USBD_CORE_API_T;
+
+/*-----------------------------------------------------------------------------
+ * Private functions & structures prototypes
+ *-----------------------------------------------------------------------------*/
+
+ /** @cond ADVANCED_API */
+
+/* forward declaration */
+struct _USB_CORE_CTRL_T;
+typedef struct _USB_CORE_CTRL_T USB_CORE_CTRL_T;
+
+/* USB device Speed status defines */
+#define USB_FULL_SPEED 0
+#define USB_HIGH_SPEED 1
+
+/* USB Endpoint Data Structure */
+typedef struct _USB_EP_DATA
+{
+ uint8_t *pData;
+ uint16_t Count;
+ uint16_t pad0;
+} USB_EP_DATA;
+
+
+/* USB core controller data structure */
+struct _USB_CORE_CTRL_T
+{
+ /* overridable function pointers ~ c++ style virtual functions*/
+ USB_CB_T USB_EvtSetupHandler;
+ USB_CB_T USB_EvtOutHandler;
+ USB_PARAM_CB_T USB_ReqVendor;
+ USB_CB_T USB_ReqGetStatus;
+ USB_CB_T USB_ReqGetDescriptor;
+ USB_CB_T USB_ReqGetConfiguration;
+ USB_CB_T USB_ReqSetConfiguration;
+ USB_CB_T USB_ReqGetInterface;
+ USB_CB_T USB_ReqSetInterface;
+ USB_PARAM_CB_T USB_ReqSetClrFeature;
+
+ /* USB Device Events Callback Functions */
+ USB_CB_T USB_Reset_Event;
+ USB_CB_T USB_Suspend_Event;
+ USB_CB_T USB_Resume_Event;
+ USB_CB_T USB_SOF_Event;
+ USB_PARAM_CB_T USB_Power_Event;
+ USB_PARAM_CB_T USB_Error_Event;
+ USB_PARAM_CB_T USB_WakeUpCfg;
+
+ /* USB Core Events Callback Functions */
+ USB_CB_T USB_Configure_Event;
+ USB_CB_T USB_Interface_Event;
+ USB_CB_T USB_Feature_Event;
+
+ /* cache and mmu translation functions */
+ uint32_t (* virt_to_phys)(void* vaddr);
+ void (* cache_flush)(uint32_t* start_adr, uint32_t* end_adr);
+
+ /* event handlers for endpoints. */
+ USB_EP_HANDLER_T ep_event_hdlr[2 * USB_MAX_EP_NUM];
+ void* ep_hdlr_data[2 * USB_MAX_EP_NUM];
+
+ /* USB class handlers */
+ USB_EP_HANDLER_T ep0_hdlr_cb[USB_MAX_IF_NUM];
+ void* ep0_cb_data[USB_MAX_IF_NUM];
+ uint8_t num_ep0_hdlrs;
+ /* USB Core data Variables */
+ uint8_t max_num_ep; /* max number of endpoints supported by the HW */
+ uint8_t device_speed;
+ uint8_t num_interfaces;
+ uint8_t device_addr;
+ uint8_t config_value;
+ uint16_t device_status;
+ uint8_t *device_desc;
+ uint8_t *string_desc;
+ uint8_t *full_speed_desc;
+ uint8_t *high_speed_desc;
+ uint8_t *device_qualifier;
+ uint32_t ep_mask;
+ uint32_t ep_halt;
+ uint32_t ep_stall;
+ uint8_t alt_setting[USB_MAX_IF_NUM];
+ /* HW driver data pointer */
+ void* hw_data;
+
+ /* USB Endpoint 0 Data Info */
+ USB_EP_DATA EP0Data;
+
+ /* USB Endpoint 0 Buffer */
+ //ALIGNED(4)
+ uint8_t EP0Buf[64];
+
+ /* USB Setup Packet */
+ //ALIGNED(4)
+ USB_SETUP_PACKET SetupPacket;
+
+};
+
+/* USB Core Functions */
+extern void mwUSB_InitCore(USB_CORE_CTRL_T* pCtrl, USB_CORE_DESCS_T* pdescr, USBD_API_INIT_PARAM_T* param);
+extern void mwUSB_ResetCore(USBD_HANDLE_T hUsb);
+
+/* inline functions */
+static __inline void USB_SetSpeedMode(USB_CORE_CTRL_T* pCtrl, uint8_t mode)
+{
+ pCtrl->device_speed = mode;
+}
+
+/** @cond DIRECT_API */
+/* midleware API */
+extern ErrorCode_t mwUSB_RegisterClassHandler(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data);
+extern ErrorCode_t mwUSB_RegisterEpHandler(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data);
+extern void mwUSB_SetupStage (USBD_HANDLE_T hUsb);
+extern void mwUSB_DataInStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_DataOutStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_StatusInStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_StatusOutStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_StallEp0(USBD_HANDLE_T hUsb);
+extern ErrorCode_t mwUSB_RegisterClassHandler(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data);
+extern ErrorCode_t mwUSB_RegisterEpHandler(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data);
+extern void mwUSB_SetupStage (USBD_HANDLE_T hUsb);
+extern void mwUSB_DataInStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_DataOutStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_StatusInStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_StatusOutStage(USBD_HANDLE_T hUsb);
+extern void mwUSB_StallEp0(USBD_HANDLE_T hUsb);
+/** @endcond */
+
+/** @endcond */
+
+#endif /* __MW_USBD_CORE_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_desc.h b/tinyusb/device/romdriver/mw_usbd_desc.h
new file mode 100644
index 000000000..47038292d
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_desc.h
@@ -0,0 +1,48 @@
+/***********************************************************************
+* $Id:: mw_usbd_desc.h 197 2011-06-12 20:22:41Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Descriptors Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+
+#ifndef __USBDESC_H__
+#define __USBDESC_H__
+
+#include "mw_usbd.h"
+
+#define WBVAL(x) ((x) & 0xFF),(((x) >> 8) & 0xFF)
+#define B3VAL(x) ((x) & 0xFF),(((x) >> 8) & 0xFF),(((x) >> 16) & 0xFF)
+
+#define USB_DEVICE_DESC_SIZE (sizeof(USB_DEVICE_DESCRIPTOR))
+#define USB_CONFIGUARTION_DESC_SIZE (sizeof(USB_CONFIGURATION_DESCRIPTOR))
+#define USB_INTERFACE_DESC_SIZE (sizeof(USB_INTERFACE_DESCRIPTOR))
+#define USB_ENDPOINT_DESC_SIZE (sizeof(USB_ENDPOINT_DESCRIPTOR))
+#define USB_DEVICE_QUALI_SIZE (sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR))
+#define USB_OTHER_SPEED_CONF_SIZE (sizeof(USB_OTHER_SPEED_CONFIGURATION))
+
+#define HID_DESC_SIZE (sizeof(HID_DESCRIPTOR))
+#define HID_REPORT_DESC_SIZE (sizeof(HID_ReportDescriptor))
+
+extern const uint8_t HID_ReportDescriptor[];
+extern const uint16_t HID_ReportDescSize;
+extern const uint16_t HID_DescOffset;
+
+
+#endif /* __USBDESC_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_dfu.h b/tinyusb/device/romdriver/mw_usbd_dfu.h
new file mode 100644
index 000000000..f3af39f31
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_dfu.h
@@ -0,0 +1,120 @@
+/***********************************************************************
+* $Id:: mw_usbd_dfu.h 216 2011-07-13 21:52:14Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* Device Firmware Upgrade (DFU) module.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __MW_USBD_DFU_H__
+#define __MW_USBD_DFU_H__
+
+#include "mw_usbd.h"
+
+/** \file
+ * \brief Device Firmware Upgrade (DFU) calss descriptors.
+ *
+ * Definition of DFU class descriptors and their bit defines.
+ *
+ */
+
+/**
+ * If USB device is only DFU capable, DFU Interface number is always 0.
+ * if USB device is (DFU + Other Class (Audio/Mass Storage/HID), DFU
+ * Interface number should also be 0 in this implementation.
+ */
+#define USB_DFU_IF_NUM 0x0
+
+#define USB_DFU_DESCRIPTOR_TYPE 0x21
+#define USB_DFU_DESCRIPTOR_SIZE 9
+#define USB_DFU_SUBCLASS 0x01
+
+/* DFU class-specific requests (Section 3, DFU Rev 1.1) */
+#define USB_REQ_DFU_DETACH 0x00
+#define USB_REQ_DFU_DNLOAD 0x01
+#define USB_REQ_DFU_UPLOAD 0x02
+#define USB_REQ_DFU_GETSTATUS 0x03
+#define USB_REQ_DFU_CLRSTATUS 0x04
+#define USB_REQ_DFU_GETSTATE 0x05
+#define USB_REQ_DFU_ABORT 0x06
+
+#define DFU_STATUS_OK 0x00
+#define DFU_STATUS_errTARGET 0x01
+#define DFU_STATUS_errFILE 0x02
+#define DFU_STATUS_errWRITE 0x03
+#define DFU_STATUS_errERASE 0x04
+#define DFU_STATUS_errCHECK_ERASED 0x05
+#define DFU_STATUS_errPROG 0x06
+#define DFU_STATUS_errVERIFY 0x07
+#define DFU_STATUS_errADDRESS 0x08
+#define DFU_STATUS_errNOTDONE 0x09
+#define DFU_STATUS_errFIRMWARE 0x0a
+#define DFU_STATUS_errVENDOR 0x0b
+#define DFU_STATUS_errUSBR 0x0c
+#define DFU_STATUS_errPOR 0x0d
+#define DFU_STATUS_errUNKNOWN 0x0e
+#define DFU_STATUS_errSTALLEDPKT 0x0f
+
+enum dfu_state {
+ DFU_STATE_appIDLE = 0,
+ DFU_STATE_appDETACH = 1,
+ DFU_STATE_dfuIDLE = 2,
+ DFU_STATE_dfuDNLOAD_SYNC = 3,
+ DFU_STATE_dfuDNBUSY = 4,
+ DFU_STATE_dfuDNLOAD_IDLE = 5,
+ DFU_STATE_dfuMANIFEST_SYNC = 6,
+ DFU_STATE_dfuMANIFEST = 7,
+ DFU_STATE_dfuMANIFEST_WAIT_RST= 8,
+ DFU_STATE_dfuUPLOAD_IDLE = 9,
+ DFU_STATE_dfuERROR = 10
+};
+
+#define DFU_EP0_NONE 0
+#define DFU_EP0_UNHANDLED 1
+#define DFU_EP0_STALL 2
+#define DFU_EP0_ZLP 3
+#define DFU_EP0_DATA 4
+
+#define USB_DFU_CAN_DOWNLOAD (1 << 0)
+#define USB_DFU_CAN_UPLOAD (1 << 1)
+#define USB_DFU_MANIFEST_TOL (1 << 2)
+#define USB_DFU_WILL_DETACH (1 << 3)
+
+PRE_PACK struct POST_PACK _USB_DFU_FUNC_DESCRIPTOR {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bmAttributes;
+ uint16_t wDetachTimeOut;
+ uint16_t wTransferSize;
+ uint16_t bcdDFUVersion;
+};
+typedef struct _USB_DFU_FUNC_DESCRIPTOR USB_DFU_FUNC_DESCRIPTOR;
+
+PRE_PACK struct POST_PACK _DFU_STATUS {
+ uint8_t bStatus;
+ uint8_t bwPollTimeout[3];
+ uint8_t bState;
+ uint8_t iString;
+};
+typedef struct _DFU_STATUS DFU_STATUS_T;
+
+#define DFU_FUNC_DESC_SIZE sizeof(USB_DFU_FUNC_DESCRIPTOR)
+#define DFU_GET_STATUS_SIZE 0x6
+
+
+#endif /* __MW_USBD_DFU_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_dfuuser.h b/tinyusb/device/romdriver/mw_usbd_dfuuser.h
new file mode 100644
index 000000000..40070c065
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_dfuuser.h
@@ -0,0 +1,264 @@
+/***********************************************************************
+* $Id:: mw_usbd_dfuuser.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* Device Firmware Upgrade Class Custom User Module Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+
+#ifndef __DFUUSER_H__
+#define __DFUUSER_H__
+
+#include "mw_usbd.h"
+#include "mw_usbd_dfu.h"
+#include "mw_usbd_core.h"
+
+/** \file
+ * \brief Device Firmware Upgrade (DFU) API structures and function prototypes.
+ *
+ * Definition of functions exported by ROM based DFU function driver.
+ *
+ */
+
+
+/** \ingroup Group_USBD
+ * @defgroup USBD_DFU Device Firmware Upgrade (DFU) Class Function Driver
+ * \section Sec_MSCModDescription Module Description
+ * DFU Class Function Driver module. This module contains an internal implementation of the USB DFU Class.
+ * User applications can use this class driver instead of implementing the DFU class manually
+ * via the low-level USBD_HW and USBD_Core APIs.
+ *
+ * This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ * Devices using the USB DFU Class.
+ */
+
+/** \brief USB descriptors data structure.
+ * \ingroup USBD_DFU
+ *
+ * \details This module exposes functions which interact directly with USB device stack's core layer.
+ * The application layer uses this component when it has to implement custom class function driver or
+ * standard class function driver which is not part of the current USB device stack.
+ * The functions exposed by this interface are to register class specific EP0 handlers and corresponding
+ * utility functions to manipulate EP0 state machine of the stack. This interface also exposes
+ * function to register custom endpoint interrupt handler.
+ *
+ */
+typedef struct USBD_DFU_INIT_PARAM
+{
+ /* memory allocation params */
+ uint32_t mem_base; /**< Base memory location from where the stack can allocate
+ data and buffers. \note The memory address set in this field
+ should be accessible by USB DMA controller. Also this value
+ should be aligned on 4 byte boundary.
+ */
+ uint32_t mem_size; /**< The size of memory buffer which stack can use.
+ \note The \em mem_size should be greater than the size
+ returned by USBD_DFU_API::GetMemSize() routine.*/
+ /* DFU paramas */
+ uint16_t wTransferSize; /**< DFU transfer block size in number of bytes.
+ This value should match the value set in DFU descriptor
+ provided as part of the descriptor array
+ (\em high_speed_desc) passed to Init() through
+ \ref USB_CORE_DESCS_T structure. */
+
+ uint16_t pad;
+ /** Pointer to the DFU interface descriptor within the descriptor
+ * array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
+ * structure.
+ */
+ uint8_t* intf_desc;
+ /* user defined functions */
+ /**
+ * DFU Write callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a write command. For application using zero-copy buffer scheme
+ * this function is called for the first time with \em length parameter set to 0.
+ * The application code should update the buffer pointer.
+ *
+ * \param[in] block_num Destination start address.
+ * \param[in, out] src Pointer to a pointer to the source of data. Pointer-to-pointer
+ * is used to implement zero-copy buffers. See \ref USBD_ZeroCopy
+ * for more details on zero-copy concept.
+ * \param[out] bwPollTimeout Pointer to a 3 byte buffer which the callback implementer
+ * should fill with the amount of minimum time, in milliseconds,
+ * that the host should wait before sending a subsequent
+ * DFU_GETSTATUS request.
+ * \param[in] length Number of bytes to be written.
+ * \return Returns DFU_STATUS_ values defined in mw_usbd_dfu.h.
+ *
+ */
+ uint8_t (*DFU_Write)( uint32_t block_num, uint8_t** src, uint32_t length, uint8_t* bwPollTimeout);
+
+ /**
+ * DFU Read callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a read command.
+ *
+ * \param[in] block_num Destination start address.
+ * \param[in, out] dst Pointer to a pointer to the source of data. Pointer-to-pointer
+ * is used to implement zero-copy buffers. See \ref USBD_ZeroCopy
+ * for more details on zero-copy concept.
+ * \param[in] length Amount of data copied to destination buffer.
+ * \return Returns DFU_STATUS_ values defined in mw_usbd_dfu.h.
+ *
+ */
+ uint32_t (*DFU_Read)( uint32_t block_num, uint8_t** dst, uint32_t length);
+
+ /**
+ * DFU done callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * after download is finished.
+ *
+ * \return Nothing.
+ *
+ */
+ void (*DFU_Done)(void);
+
+ /**
+ * DFU detach callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * after USB_REQ_DFU_DETACH is recieved. Applications which set USB_DFU_WILL_DETACH
+ * bit in DFU descriptor should define this function. As part of this function
+ * application can call Connect() routine to disconnect and then connect back with
+ * host. For application which rely on WinUSB based host application should use this
+ * feature since USB reset can be invoked only by kernel drivers on Windows host.
+ * By implementing this feature host doen't have to issue reset instead the device
+ * has to do it automatically by disconnect and connect procedure.
+ *
+ * \param[in] hUsb Handle DFU control structure.
+ * \return Nothing.
+ *
+ */
+ void (*DFU_Detach)(USBD_HANDLE_T hUsb);
+
+ /**
+ * Optional user overridable function to replace the default DFU class handler.
+ *
+ * The application software could override the default EP0 class handler with their
+ * own by providing the handler function address as this data member of the parameter
+ * structure. Application which like the default handler should set this data member
+ * to zero before calling the USBD_DFU_API::Init().
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*DFU_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+} USBD_DFU_INIT_PARAM_T;
+
+
+/** \brief DFU class API functions structure.
+ * \ingroup USBD_DFU
+ *
+ * This module exposes functions which interact directly with USB device controller hardware.
+ *
+ */
+typedef struct USBD_DFU_API
+{
+ /** \fn uint32_t GetMemSize(USBD_DFU_INIT_PARAM_T* param)
+ * Function to determine the memory required by the DFU function driver module.
+ *
+ * This function is called by application layer before calling pUsbApi->dfu->Init(), to allocate memory used
+ * by DFU function driver module. The application should allocate the memory which is accessible by USB
+ * controller/DMA controller.
+ * \note Some memory areas are not accessible by all bus masters.
+ *
+ * \param[in] param Structure containing DFU function driver module initialization parameters.
+ * \return Returns the required memory size in bytes.
+ */
+ uint32_t (*GetMemSize)(USBD_DFU_INIT_PARAM_T* param);
+
+ /** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_DFU_INIT_PARAM_T* param)
+ * Function to initialize DFU function driver module.
+ *
+ * This function is called by application layer to initialize DFU function driver module.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in, out] param Structure containing DFU function driver module initialization parameters.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_BAD_MEM_BUF Memory buffer passed is not 4-byte aligned or smaller than required.
+ * \retval ERR_API_INVALID_PARAM2 Either DFU_Write() or DFU_Done() or DFU_Read() callbacks are not defined.
+ * \retval ERR_USBD_BAD_DESC
+ * - USB_DFU_DESCRIPTOR_TYPE is not defined immediately after
+ * interface descriptor.
+ * - wTransferSize in descriptor doesn't match the value passed
+ * in param->wTransferSize.
+ * - DFU_Detach() is not defined while USB_DFU_WILL_DETACH is set
+ * in DFU descriptor.
+ * \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
+ */
+ ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_DFU_INIT_PARAM_T* param, uint32_t init_state);
+
+} USBD_DFU_API_T;
+
+/*-----------------------------------------------------------------------------
+ * Private functions & structures prototypes
+ *-----------------------------------------------------------------------------*/
+/** @cond ADVANCED_API */
+
+typedef struct _USBD_DFU_CTRL_T
+{
+ /*ALIGNED(4)*/ DFU_STATUS_T dfu_req_get_status;
+ uint16_t pad;
+ uint8_t dfu_state;
+ uint8_t dfu_status;
+ uint8_t download_done;
+ uint8_t if_num; /* interface number */
+
+ uint8_t* xfr_buf;
+ USB_DFU_FUNC_DESCRIPTOR* dfu_desc;
+
+ USB_CORE_CTRL_T* pUsbCtrl;
+ /* user defined functions */
+ /* return DFU_STATUS_ values defined in mw_usbd_dfu.h */
+ uint8_t (*DFU_Write)( uint32_t block_num, uint8_t** src, uint32_t length, uint8_t* bwPollTimeout);
+ /* return
+ * DFU_STATUS_ : values defined in mw_usbd_dfu.h in case of errors
+ * 0 : If end of memory reached
+ * length : Amount of data copied to destination buffer
+ */
+ uint32_t (*DFU_Read)( uint32_t block_num, uint8_t** dst, uint32_t length);
+ /* callback called after download is finished */
+ void (*DFU_Done)(void);
+ /* callback called after USB_REQ_DFU_DETACH is recived */
+ void (*DFU_Detach)(USBD_HANDLE_T hUsb);
+
+} USBD_DFU_CTRL_T;
+
+/** @cond DIRECT_API */
+uint32_t mwDFU_GetMemSize(USBD_DFU_INIT_PARAM_T* param);
+extern ErrorCode_t mwDFU_init(USBD_HANDLE_T hUsb, USBD_DFU_INIT_PARAM_T* param, uint32_t init_state);
+/** @endcond */
+
+/** @endcond */
+
+#endif /* __DFUUSER_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_hid.h b/tinyusb/device/romdriver/mw_usbd_hid.h
new file mode 100644
index 000000000..712f1d9ae
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_hid.h
@@ -0,0 +1,429 @@
+/***********************************************************************
+* $Id:: mw_usbd_hid.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* HID Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __HID_H__
+#define __HID_H__
+
+#include "mw_usbd.h"
+
+/** \file
+ * \brief Common definitions and declarations for the library USB HID Class driver.
+ *
+ * Common definitions and declarations for the library USB HID Class driver.
+ * \addtogroup USBD_HID
+ * @{
+ */
+
+
+/** HID Subclass Codes
+ * @{
+ */
+/** Descriptor Subclass value indicating that the device or interface does not implement a HID boot protocol. */
+#define HID_SUBCLASS_NONE 0x00
+/** Descriptor Subclass value indicating that the device or interface implements a HID boot protocol. */
+#define HID_SUBCLASS_BOOT 0x01
+/** @} */
+
+/** HID Protocol Codes
+ * @{
+ */
+/** Descriptor Protocol value indicating that the device or interface does not belong to a HID boot protocol. */
+#define HID_PROTOCOL_NONE 0x00
+/** Descriptor Protocol value indicating that the device or interface belongs to the Keyboard HID boot protocol. */
+#define HID_PROTOCOL_KEYBOARD 0x01
+/** Descriptor Protocol value indicating that the device or interface belongs to the Mouse HID boot protocol. */
+#define HID_PROTOCOL_MOUSE 0x02
+/** @} */
+
+
+
+/** Descriptor Types
+ * @{
+ */
+/** Descriptor header type value, to indicate a HID class HID descriptor. */
+#define HID_HID_DESCRIPTOR_TYPE 0x21
+/** Descriptor header type value, to indicate a HID class HID report descriptor. */
+#define HID_REPORT_DESCRIPTOR_TYPE 0x22
+/** Descriptor header type value, to indicate a HID class HID Physical descriptor. */
+#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23
+/** @} */
+
+
+/** \brief HID class-specific HID Descriptor.
+ *
+ * Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
+ * specification for details on the structure elements.
+ *
+ */
+PRE_PACK struct POST_PACK _HID_DESCRIPTOR {
+ uint8_t bLength; /**< Size of the descriptor, in bytes. */
+ uint8_t bDescriptorType; /**< Type of HID descriptor. */
+ uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to. */
+ uint8_t bCountryCode; /**< Country code of the localized device, or zero if universal. */
+ uint8_t bNumDescriptors; /**< Total number of HID report descriptors for the interface. */
+
+ PRE_PACK struct POST_PACK _HID_DESCRIPTOR_LIST {
+ uint8_t bDescriptorType; /**< Type of HID report. */
+ uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */
+ } DescriptorList[1]; /**< Array of one or more descriptors */
+} ;
+/** HID class-specific HID Descriptor. */
+typedef struct _HID_DESCRIPTOR HID_DESCRIPTOR;
+
+
+/** HID Request Codes
+ * @{
+ */
+#define HID_REQUEST_GET_REPORT 0x01
+#define HID_REQUEST_GET_IDLE 0x02
+#define HID_REQUEST_GET_PROTOCOL 0x03
+#define HID_REQUEST_SET_REPORT 0x09
+#define HID_REQUEST_SET_IDLE 0x0A
+#define HID_REQUEST_SET_PROTOCOL 0x0B
+/** @} */
+
+/** HID Report Types
+ * @{
+ */
+#define HID_REPORT_INPUT 0x01
+#define HID_REPORT_OUTPUT 0x02
+#define HID_REPORT_FEATURE 0x03
+/** @} */
+
+
+/** Usage Pages
+ * @{
+ */
+#define HID_USAGE_PAGE_UNDEFINED 0x00
+#define HID_USAGE_PAGE_GENERIC 0x01
+#define HID_USAGE_PAGE_SIMULATION 0x02
+#define HID_USAGE_PAGE_VR 0x03
+#define HID_USAGE_PAGE_SPORT 0x04
+#define HID_USAGE_PAGE_GAME 0x05
+#define HID_USAGE_PAGE_DEV_CONTROLS 0x06
+#define HID_USAGE_PAGE_KEYBOARD 0x07
+#define HID_USAGE_PAGE_LED 0x08
+#define HID_USAGE_PAGE_BUTTON 0x09
+#define HID_USAGE_PAGE_ORDINAL 0x0A
+#define HID_USAGE_PAGE_TELEPHONY 0x0B
+#define HID_USAGE_PAGE_CONSUMER 0x0C
+#define HID_USAGE_PAGE_DIGITIZER 0x0D
+#define HID_USAGE_PAGE_UNICODE 0x10
+#define HID_USAGE_PAGE_ALPHANUMERIC 0x14
+/** @} */
+
+
+/** Generic Desktop Page (0x01)
+ * @{
+ */
+#define HID_USAGE_GENERIC_POINTER 0x01
+#define HID_USAGE_GENERIC_MOUSE 0x02
+#define HID_USAGE_GENERIC_JOYSTICK 0x04
+#define HID_USAGE_GENERIC_GAMEPAD 0x05
+#define HID_USAGE_GENERIC_KEYBOARD 0x06
+#define HID_USAGE_GENERIC_KEYPAD 0x07
+#define HID_USAGE_GENERIC_X 0x30
+#define HID_USAGE_GENERIC_Y 0x31
+#define HID_USAGE_GENERIC_Z 0x32
+#define HID_USAGE_GENERIC_RX 0x33
+#define HID_USAGE_GENERIC_RY 0x34
+#define HID_USAGE_GENERIC_RZ 0x35
+#define HID_USAGE_GENERIC_SLIDER 0x36
+#define HID_USAGE_GENERIC_DIAL 0x37
+#define HID_USAGE_GENERIC_WHEEL 0x38
+#define HID_USAGE_GENERIC_HATSWITCH 0x39
+#define HID_USAGE_GENERIC_COUNTED_BUFFER 0x3A
+#define HID_USAGE_GENERIC_BYTE_COUNT 0x3B
+#define HID_USAGE_GENERIC_MOTION_WAKEUP 0x3C
+#define HID_USAGE_GENERIC_VX 0x40
+#define HID_USAGE_GENERIC_VY 0x41
+#define HID_USAGE_GENERIC_VZ 0x42
+#define HID_USAGE_GENERIC_VBRX 0x43
+#define HID_USAGE_GENERIC_VBRY 0x44
+#define HID_USAGE_GENERIC_VBRZ 0x45
+#define HID_USAGE_GENERIC_VNO 0x46
+#define HID_USAGE_GENERIC_SYSTEM_CTL 0x80
+#define HID_USAGE_GENERIC_SYSCTL_POWER 0x81
+#define HID_USAGE_GENERIC_SYSCTL_SLEEP 0x82
+#define HID_USAGE_GENERIC_SYSCTL_WAKE 0x83
+#define HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU 0x84
+#define HID_USAGE_GENERIC_SYSCTL_MAIN_MENU 0x85
+#define HID_USAGE_GENERIC_SYSCTL_APP_MENU 0x86
+#define HID_USAGE_GENERIC_SYSCTL_HELP_MENU 0x87
+#define HID_USAGE_GENERIC_SYSCTL_MENU_EXIT 0x88
+#define HID_USAGE_GENERIC_SYSCTL_MENU_SELECT 0x89
+#define HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT 0x8A
+#define HID_USAGE_GENERIC_SYSCTL_MENU_LEFT 0x8B
+#define HID_USAGE_GENERIC_SYSCTL_MENU_UP 0x8C
+#define HID_USAGE_GENERIC_SYSCTL_MENU_DOWN 0x8D
+/** @} */
+
+/** Simulation Controls Page (0x02)
+ * @{
+ */
+#define HID_USAGE_SIMULATION_RUDDER 0xBA
+#define HID_USAGE_SIMULATION_THROTTLE 0xBB
+/** @} */
+
+/* Virtual Reality Controls Page (0x03) */
+/* ... */
+
+/* Sport Controls Page (0x04) */
+/* ... */
+
+/* Game Controls Page (0x05) */
+/* ... */
+
+/* Generic Device Controls Page (0x06) */
+/* ... */
+
+/** Keyboard/Keypad Page (0x07)
+ * @{
+ */
+/** Error "keys" */
+#define HID_USAGE_KEYBOARD_NOEVENT 0x00
+#define HID_USAGE_KEYBOARD_ROLLOVER 0x01
+#define HID_USAGE_KEYBOARD_POSTFAIL 0x02
+#define HID_USAGE_KEYBOARD_UNDEFINED 0x03
+
+/** Letters */
+#define HID_USAGE_KEYBOARD_aA 0x04
+#define HID_USAGE_KEYBOARD_zZ 0x1D
+
+/** Numbers */
+#define HID_USAGE_KEYBOARD_ONE 0x1E
+#define HID_USAGE_KEYBOARD_ZERO 0x27
+
+#define HID_USAGE_KEYBOARD_RETURN 0x28
+#define HID_USAGE_KEYBOARD_ESCAPE 0x29
+#define HID_USAGE_KEYBOARD_DELETE 0x2A
+
+/** Funtion keys */
+#define HID_USAGE_KEYBOARD_F1 0x3A
+#define HID_USAGE_KEYBOARD_F12 0x45
+
+#define HID_USAGE_KEYBOARD_PRINT_SCREEN 0x46
+
+/** Modifier Keys */
+#define HID_USAGE_KEYBOARD_LCTRL 0xE0
+#define HID_USAGE_KEYBOARD_LSHFT 0xE1
+#define HID_USAGE_KEYBOARD_LALT 0xE2
+#define HID_USAGE_KEYBOARD_LGUI 0xE3
+#define HID_USAGE_KEYBOARD_RCTRL 0xE4
+#define HID_USAGE_KEYBOARD_RSHFT 0xE5
+#define HID_USAGE_KEYBOARD_RALT 0xE6
+#define HID_USAGE_KEYBOARD_RGUI 0xE7
+#define HID_USAGE_KEYBOARD_SCROLL_LOCK 0x47
+#define HID_USAGE_KEYBOARD_NUM_LOCK 0x53
+#define HID_USAGE_KEYBOARD_CAPS_LOCK 0x39
+/** @} */
+
+/* ... */
+
+/** LED Page (0x08)
+ * @{
+ */
+#define HID_USAGE_LED_NUM_LOCK 0x01
+#define HID_USAGE_LED_CAPS_LOCK 0x02
+#define HID_USAGE_LED_SCROLL_LOCK 0x03
+#define HID_USAGE_LED_COMPOSE 0x04
+#define HID_USAGE_LED_KANA 0x05
+#define HID_USAGE_LED_POWER 0x06
+#define HID_USAGE_LED_SHIFT 0x07
+#define HID_USAGE_LED_DO_NOT_DISTURB 0x08
+#define HID_USAGE_LED_MUTE 0x09
+#define HID_USAGE_LED_TONE_ENABLE 0x0A
+#define HID_USAGE_LED_HIGH_CUT_FILTER 0x0B
+#define HID_USAGE_LED_LOW_CUT_FILTER 0x0C
+#define HID_USAGE_LED_EQUALIZER_ENABLE 0x0D
+#define HID_USAGE_LED_SOUND_FIELD_ON 0x0E
+#define HID_USAGE_LED_SURROUND_FIELD_ON 0x0F
+#define HID_USAGE_LED_REPEAT 0x10
+#define HID_USAGE_LED_STEREO 0x11
+#define HID_USAGE_LED_SAMPLING_RATE_DETECT 0x12
+#define HID_USAGE_LED_SPINNING 0x13
+#define HID_USAGE_LED_CAV 0x14
+#define HID_USAGE_LED_CLV 0x15
+#define HID_USAGE_LED_RECORDING_FORMAT_DET 0x16
+#define HID_USAGE_LED_OFF_HOOK 0x17
+#define HID_USAGE_LED_RING 0x18
+#define HID_USAGE_LED_MESSAGE_WAITING 0x19
+#define HID_USAGE_LED_DATA_MODE 0x1A
+#define HID_USAGE_LED_BATTERY_OPERATION 0x1B
+#define HID_USAGE_LED_BATTERY_OK 0x1C
+#define HID_USAGE_LED_BATTERY_LOW 0x1D
+#define HID_USAGE_LED_SPEAKER 0x1E
+#define HID_USAGE_LED_HEAD_SET 0x1F
+#define HID_USAGE_LED_HOLD 0x20
+#define HID_USAGE_LED_MICROPHONE 0x21
+#define HID_USAGE_LED_COVERAGE 0x22
+#define HID_USAGE_LED_NIGHT_MODE 0x23
+#define HID_USAGE_LED_SEND_CALLS 0x24
+#define HID_USAGE_LED_CALL_PICKUP 0x25
+#define HID_USAGE_LED_CONFERENCE 0x26
+#define HID_USAGE_LED_STAND_BY 0x27
+#define HID_USAGE_LED_CAMERA_ON 0x28
+#define HID_USAGE_LED_CAMERA_OFF 0x29
+#define HID_USAGE_LED_ON_LINE 0x2A
+#define HID_USAGE_LED_OFF_LINE 0x2B
+#define HID_USAGE_LED_BUSY 0x2C
+#define HID_USAGE_LED_READY 0x2D
+#define HID_USAGE_LED_PAPER_OUT 0x2E
+#define HID_USAGE_LED_PAPER_JAM 0x2F
+#define HID_USAGE_LED_REMOTE 0x30
+#define HID_USAGE_LED_FORWARD 0x31
+#define HID_USAGE_LED_REVERSE 0x32
+#define HID_USAGE_LED_STOP 0x33
+#define HID_USAGE_LED_REWIND 0x34
+#define HID_USAGE_LED_FAST_FORWARD 0x35
+#define HID_USAGE_LED_PLAY 0x36
+#define HID_USAGE_LED_PAUSE 0x37
+#define HID_USAGE_LED_RECORD 0x38
+#define HID_USAGE_LED_ERROR 0x39
+#define HID_USAGE_LED_SELECTED_INDICATOR 0x3A
+#define HID_USAGE_LED_IN_USE_INDICATOR 0x3B
+#define HID_USAGE_LED_MULTI_MODE_INDICATOR 0x3C
+#define HID_USAGE_LED_INDICATOR_ON 0x3D
+#define HID_USAGE_LED_INDICATOR_FLASH 0x3E
+#define HID_USAGE_LED_INDICATOR_SLOW_BLINK 0x3F
+#define HID_USAGE_LED_INDICATOR_FAST_BLINK 0x40
+#define HID_USAGE_LED_INDICATOR_OFF 0x41
+#define HID_USAGE_LED_FLASH_ON_TIME 0x42
+#define HID_USAGE_LED_SLOW_BLINK_ON_TIME 0x43
+#define HID_USAGE_LED_SLOW_BLINK_OFF_TIME 0x44
+#define HID_USAGE_LED_FAST_BLINK_ON_TIME 0x45
+#define HID_USAGE_LED_FAST_BLINK_OFF_TIME 0x46
+#define HID_USAGE_LED_INDICATOR_COLOR 0x47
+#define HID_USAGE_LED_RED 0x48
+#define HID_USAGE_LED_GREEN 0x49
+#define HID_USAGE_LED_AMBER 0x4A
+#define HID_USAGE_LED_GENERIC_INDICATOR 0x4B
+/** @} */
+
+/* Button Page (0x09)
+ */
+/* There is no need to label these usages. */
+
+/* Ordinal Page (0x0A)
+ */
+/* There is no need to label these usages. */
+
+/** Telephony Device Page (0x0B)
+ * @{
+ */
+#define HID_USAGE_TELEPHONY_PHONE 0x01
+#define HID_USAGE_TELEPHONY_ANSWERING_MACHINE 0x02
+#define HID_USAGE_TELEPHONY_MESSAGE_CONTROLS 0x03
+#define HID_USAGE_TELEPHONY_HANDSET 0x04
+#define HID_USAGE_TELEPHONY_HEADSET 0x05
+#define HID_USAGE_TELEPHONY_KEYPAD 0x06
+#define HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON 0x07
+/** @} */
+/* ... */
+
+/** Consumer Page (0x0C)
+ * @{
+ */
+#define HID_USAGE_CONSUMER_CONTROL 0x01
+#define HID_USAGE_CONSUMER_FAST_FORWARD 0xB3
+#define HID_USAGE_CONSUMER_REWIND 0xB4
+#define HID_USAGE_CONSUMER_PLAY_PAUSE 0xCD
+#define HID_USAGE_CONSUMER_VOLUME_INCREMENT 0xE9
+#define HID_USAGE_CONSUMER_VOLUME_DECREMENT 0xEA
+/** @} */
+/* ... */
+
+/* and others ... */
+
+
+/** HID Report Item Macros
+ * @{
+ */
+/** Main Items */
+#define HID_Input(x) 0x81,x
+#define HID_Output(x) 0x91,x
+#define HID_Feature(x) 0xB1,x
+#define HID_Collection(x) 0xA1,x
+#define HID_EndCollection 0xC0
+
+/** Data (Input, Output, Feature) */
+#define HID_Data 0<<0
+#define HID_Constant 1<<0
+#define HID_Array 0<<1
+#define HID_Variable 1<<1
+#define HID_Absolute 0<<2
+#define HID_Relative 1<<2
+#define HID_NoWrap 0<<3
+#define HID_Wrap 1<<3
+#define HID_Linear 0<<4
+#define HID_NonLinear 1<<4
+#define HID_PreferredState 0<<5
+#define HID_NoPreferred 1<<5
+#define HID_NoNullPosition 0<<6
+#define HID_NullState 1<<6
+#define HID_NonVolatile 0<<7
+#define HID_Volatile 1<<7
+
+/** Collection Data */
+#define HID_Physical 0x00
+#define HID_Application 0x01
+#define HID_Logical 0x02
+#define HID_Report 0x03
+#define HID_NamedArray 0x04
+#define HID_UsageSwitch 0x05
+#define HID_UsageModifier 0x06
+
+/** Global Items */
+#define HID_UsagePage(x) 0x05,x
+#define HID_UsagePageVendor(x) 0x06,x,0xFF
+#define HID_LogicalMin(x) 0x15,x
+#define HID_LogicalMinS(x) 0x16,(x&0xFF),((x>>8)&0xFF)
+#define HID_LogicalMinL(x) 0x17,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
+#define HID_LogicalMax(x) 0x25,x
+#define HID_LogicalMaxS(x) 0x26,(x&0xFF),((x>>8)&0xFF)
+#define HID_LogicalMaxL(x) 0x27,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
+#define HID_PhysicalMin(x) 0x35,x
+#define HID_PhysicalMinS(x) 0x36,(x&0xFF),((x>>8)&0xFF)
+#define HID_PhysicalMinL(x) 0x37,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
+#define HID_PhysicalMax(x) 0x45,x
+#define HID_PhysicalMaxS(x) 0x46,(x&0xFF),((x>>8)&0xFF)
+#define HID_PhysicalMaxL(x) 0x47,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
+#define HID_UnitExponent(x) 0x55,x
+#define HID_Unit(x) 0x65,x
+#define HID_UnitS(x) 0x66,(x&0xFF),((x>>8)&0xFF)
+#define HID_UnitL(x) 0x67,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
+#define HID_ReportSize(x) 0x75,x
+#define HID_ReportID(x) 0x85,x
+#define HID_ReportCount(x) 0x95,x
+#define HID_Push 0xA0
+#define HID_Pop 0xB0
+
+/** Local Items */
+#define HID_Usage(x) 0x09,x
+#define HID_UsageMin(x) 0x19,x
+#define HID_UsageMax(x) 0x29,x
+/** @} */
+
+/** @} */
+
+#endif /* __HID_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_hiduser.h b/tinyusb/device/romdriver/mw_usbd_hiduser.h
new file mode 100644
index 000000000..79fa55d0b
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_hiduser.h
@@ -0,0 +1,421 @@
+/***********************************************************************
+* $Id:: mw_usbd_hiduser.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* HID Custom User Module Definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+
+#ifndef __HIDUSER_H__
+#define __HIDUSER_H__
+
+#include "mw_usbd.h"
+#include "mw_usbd_hid.h"
+#include "mw_usbd_core.h"
+
+/** \file
+ * \brief Human Interface Device (HID) API structures and function prototypes.
+ *
+ * Definition of functions exported by ROM based HID function driver.
+ *
+ */
+
+/** \ingroup Group_USBD
+ * @defgroup USBD_HID HID Class Function Driver
+ * \section Sec_HIDModDescription Module Description
+ * HID Class Function Driver module. This module contains an internal implementation of the USB HID Class.
+ * User applications can use this class driver instead of implementing the HID class manually
+ * via the low-level HW and core APIs.
+ *
+ * This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ * Devices using the USB HID Class.
+ */
+
+/** \brief HID report descriptor data structure.
+ * \ingroup USBD_HID
+ *
+ * \details This structure is used as part of HID function driver initialization
+ * parameter structure \ref USBD_HID_INIT_PARAM. This structure contains
+ * details of a report type supported by the application. An application
+ * can support multiple report types as a single HID device. The application
+ * should define this report type data struture per report it supports and
+ * the array of reoprt types to USBD_HID_API::init() through \ref USBD_HID_INIT_PARAM
+ * structure.
+ *
+ * \note All descriptor pointers assigned in this structure should be on 4 byte
+ * aligned address boundary.
+ *
+ */
+typedef struct _HID_REPORT_T {
+ uint16_t len; /**< Size of the report descriptor in bytes. */
+ uint8_t idle_time; /**< This value is used by stack to respond to Set_Idle &
+ GET_Idle requests for the specified report ID. The value
+ of this field specified the rate at which duplicate reports
+ are generated for the specified Report ID. For example, a
+ device with two input reports could specify an idle rate of
+ 20 milliseconds for report ID 1 and 500 milliseconds for
+ report ID 2.
+ */
+ uint8_t __pad; /**< Padding space. */
+ uint8_t* desc; /**< Report descriptor. */
+} USB_HID_REPORT_T;
+
+/** \brief USB descriptors data structure.
+ * \ingroup USBD_HID
+ *
+ * \details This module exposes functions which interact directly with USB device stack's core layer.
+ * The application layer uses this component when it has to implement custom class function driver or
+ * standard class function driver which is not part of the current USB device stack.
+ * The functions exposed by this interface are to register class specific EP0 handlers and corresponding
+ * utility functions to manipulate EP0 state machine of the stack. This interface also exposes
+ * function to register custom endpoint interrupt handler.
+ *
+ */
+typedef struct USBD_HID_INIT_PARAM
+{
+ /* memory allocation params */
+ uint32_t mem_base; /**< Base memory location from where the stack can allocate
+ data and buffers. \note The memory address set in this field
+ should be accessible by USB DMA controller. Also this value
+ should be aligned on 4 byte boundary.
+ */
+ uint32_t mem_size; /**< The size of memory buffer which stack can use.
+ \note The \em mem_size should be greater than the size
+ returned by USBD_HID_API::GetMemSize() routine.*/
+ /* HID paramas */
+ uint8_t max_reports; /**< Number of HID reports supported by this instance
+ of HID class driver.
+ */
+ uint8_t pad[3];
+ uint8_t* intf_desc; /**< Pointer to the HID interface descriptor within the
+ descriptor array (\em high_speed_desc) passed to Init()
+ through \ref USB_CORE_DESCS_T structure.
+ */
+ USB_HID_REPORT_T* report_data; /**< Pointer to an array of HID report descriptor
+ data structure (\ref USB_HID_REPORT_T). The number
+ of elements in the array should be same a \em max_reports
+ value. The stack uses this array to respond to
+ requests recieved for various HID report descriptor
+ information. \note This array should be of global scope.
+ */
+
+ /* user defined functions */
+ /* required functions */
+ /**
+ * HID get report callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a HID_REQUEST_GET_REPORT request. The setup packet data (\em pSetup)
+ * is passed to the callback so that application can extract the report ID, report
+ * type and other information need to generate the report. \note HID reports are sent
+ * via interrupt IN endpoint also. This function is called only when report request
+ * is received on control endpoint. Application should implement \em HID_EpIn_Hdlr to
+ * send reports to host via interrupt IN endpoint.
+ *
+ *
+ * \param[in] hHid Handle to HID function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in, out] pBuffer Pointer to a pointer of data buffer containing report data.
+ * Pointer-to-pointer is used to implement zero-copy buffers.
+ * See \ref USBD_ZeroCopy for more details on zero-copy concept.
+ * \param[in] length Amount of data copied to destination buffer.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_GetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
+
+ /**
+ * HID set report callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a HID_REQUEST_SET_REPORT request. The setup packet data (\em pSetup)
+ * is passed to the callback so that application can extract the report ID, report
+ * type and other information need to modify the report. An application might choose
+ * to ignore input Set_Report requests as meaningless. Alternatively these reports
+ * could be used to reset the origin of a control (that is, current position should
+ * report zero).
+ *
+ * \param[in] hHid Handle to HID function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in, out] pBuffer Pointer to a pointer of data buffer containing report data.
+ * Pointer-to-pointer is used to implement zero-copy buffers.
+ * See \ref USBD_ZeroCopy for more details on zero-copy concept.
+ * \param[in] length Amount of data copied to destination buffer.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_SetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
+
+ /* optional functions */
+
+ /**
+ * Optional callback function to handle HID_GetPhysDesc request.
+ *
+ * The application software could provide this callback HID_GetPhysDesc handler to
+ * handle get physical descriptor requests sent by the host. When host requests
+ * Physical Descriptor set 0, application should return a special descriptor
+ * identifying the number of descriptor sets and their sizes. A Get_Descriptor
+ * request with the Physical Index equal to 1 should return the first Physical
+ * Descriptor set. A device could possibly have alternate uses for its items.
+ * These can be enumerated by issuing subsequent Get_Descriptor requests while
+ * incrementing the Descriptor Index. A device should return the last descriptor
+ * set to requests with an index greater than the last number defined in the HID
+ * descriptor.
+ * \note Applications which don't have physical descriptor should set this data member
+ * to zero before calling the USBD_HID_API::Init().
+ * \n
+ *
+ * \param[in] hHid Handle to HID function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in] pBuf Pointer to a pointer of data buffer containing physical descriptor
+ * data. If the physical descriptor is in USB accessable memory area
+ * application could just update the pointer or else it should copy
+ * the descriptor to the address pointed by this pointer.
+ * \param[in] length Amount of data copied to destination buffer or descriptor length.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_GetPhysDesc)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
+
+ /**
+ * Optional callback function to handle HID_REQUEST_SET_IDLE request.
+ *
+ * The application software could provide this callback to handle HID_REQUEST_SET_IDLE
+ * requests sent by the host. This callback is provided to applications to adjust
+ * timers associated with various reports, which are sent to host over interrupt
+ * endpoint. The setup packet data (\em pSetup) is passed to the callback so that
+ * application can extract the report ID, report type and other information need
+ * to modify the report's idle time.
+ * \note Applications which don't send reports on Interrupt endpoint or don't
+ * have idle time between reports should set this data member to zero before
+ * calling the USBD_HID_API::Init().
+ * \n
+ *
+ * \param[in] hHid Handle to HID function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in] idleTime Idle time to be set for the specified report.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_SetIdle)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t idleTime);
+
+ /**
+ * Optional callback function to handle HID_REQUEST_SET_PROTOCOL request.
+ *
+ * The application software could provide this callback to handle HID_REQUEST_SET_PROTOCOL
+ * requests sent by the host. This callback is provided to applications to adjust
+ * modes of their code between boot mode and report mode.
+ * \note Applications which don't support protocol modes should set this data member
+ * to zero before calling the USBD_HID_API::Init().
+ * \n
+ *
+ * \param[in] hHid Handle to HID function driver.
+ * \param[in] pSetup Pointer to setup packet recived from host.
+ * \param[in] protocol Protocol mode.
+ * 0 = Boot Protocol
+ * 1 = Report Protocol
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_SetProtocol)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t protocol);
+
+ /**
+ * Optional Interrupt IN endpoint event handler.
+ *
+ * The application software could provide Interrupt IN endpoint event handler.
+ * Application which send reports to host on interrupt endpoint should provide
+ * an endpoint event handler through this data member. This data memeber is
+ * ignored if the interface descriptor \em intf_desc doesn't have any IN interrupt
+ * endpoint descriptor associated.
+ * \n
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Handle to HID function driver.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should return \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_EpIn_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+ /**
+ * Optional Interrupt OUT endpoint event handler.
+ *
+ * The application software could provide Interrupt OUT endpoint event handler.
+ * Application which recieves reports from host on interrupt endpoint should provide
+ * an endpoint event handler through this data member. This data memeber is
+ * ignored if the interface descriptor \em intf_desc doesn't have any OUT interrupt
+ * endpoint descriptor associated.
+ * \n
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Handle to HID function driver.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should return \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_EpOut_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+ /* user overridable function */
+ /**
+ * Optional user overridable function to replace the default HID_GetReportDesc handler.
+ *
+ * The application software could override the default HID_GetReportDesc handler with their
+ * own by providing the handler function address as this data member of the parameter
+ * structure. Application which like the default handler should set this data member
+ * to zero before calling the USBD_HID_API::Init() and also provide report data array
+ * \em report_data field.
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_GetReportDesc)(USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
+ /**
+ * Optional user overridable function to replace the default HID class handler.
+ *
+ * The application software could override the default EP0 class handler with their
+ * own by providing the handler function address as this data member of the parameter
+ * structure. Application which like the default handler should set this data member
+ * to zero before calling the USBD_HID_API::Init().
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*HID_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+} USBD_HID_INIT_PARAM_T;
+
+/** \brief HID class API functions structure.
+ * \ingroup USBD_HID
+ *
+ * This structure contains pointers to all the function exposed by HID function driver module.
+ *
+ */
+typedef struct USBD_HID_API
+{
+ /** \fn uint32_t GetMemSize(USBD_HID_INIT_PARAM_T* param)
+ * Function to determine the memory required by the HID function driver module.
+ *
+ * This function is called by application layer before calling pUsbApi->hid->Init(), to allocate memory used
+ * by HID function driver module. The application should allocate the memory which is accessible by USB
+ * controller/DMA controller.
+ * \note Some memory areas are not accessible by all bus masters.
+ *
+ * \param[in] param Structure containing HID function driver module initialization parameters.
+ * \return Returns the required memory size in bytes.
+ */
+ uint32_t (*GetMemSize)(USBD_HID_INIT_PARAM_T* param);
+
+ /** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_HID_INIT_PARAM_T* param)
+ * Function to initialize HID function driver module.
+ *
+ * This function is called by application layer to initialize HID function driver
+ * module. On successful initialization the function returns a handle to HID
+ * function driver module in passed param structure.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in, out] param Structure containing HID function driver module
+ * initialization parameters.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_BAD_MEM_BUF Memory buffer passed is not 4-byte
+ * aligned or smaller than required.
+ * \retval ERR_API_INVALID_PARAM2 Either HID_GetReport() or HID_SetReport()
+ * callback are not defined.
+ * \retval ERR_USBD_BAD_DESC HID_HID_DESCRIPTOR_TYPE is not defined
+ * immediately after interface descriptor.
+ * \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
+ * \retval ERR_USBD_BAD_EP_DESC Wrong endpoint descriptor is passed.
+ */
+ ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_HID_INIT_PARAM_T* param);
+
+} USBD_HID_API_T;
+
+/*-----------------------------------------------------------------------------
+ * Private functions & structures prototypes
+ *-----------------------------------------------------------------------------*/
+/** @cond ADVANCED_API */
+
+typedef struct _HID_CTRL_T {
+ /* pointer to controller */
+ USB_CORE_CTRL_T* pUsbCtrl;
+ /* descriptor pointers */
+ uint8_t* hid_desc;
+ USB_HID_REPORT_T* report_data;
+
+ uint8_t protocol;
+ uint8_t if_num; /* interface number */
+ uint8_t epin_adr; /* IN interrupt endpoint */
+ uint8_t epout_adr; /* OUT interrupt endpoint */
+
+ /* user defined functions */
+ ErrorCode_t (*HID_GetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
+ ErrorCode_t (*HID_SetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
+ ErrorCode_t (*HID_GetPhysDesc)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
+ ErrorCode_t (*HID_SetIdle)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t idleTime);
+ ErrorCode_t (*HID_SetProtocol)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t protocol);
+
+ /* virtual overridable functions */
+ ErrorCode_t (*HID_GetReportDesc)(USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
+
+}USB_HID_CTRL_T;
+
+/** @cond DIRECT_API */
+extern uint32_t mwHID_GetMemSize(USBD_HID_INIT_PARAM_T* param);
+extern ErrorCode_t mwHID_init(USBD_HANDLE_T hUsb, USBD_HID_INIT_PARAM_T* param);
+/** @endcond */
+
+/** @endcond */
+
+#endif /* __HIDUSER_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_hw.h b/tinyusb/device/romdriver/mw_usbd_hw.h
new file mode 100644
index 000000000..0fe2681c6
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_hw.h
@@ -0,0 +1,456 @@
+/***********************************************************************
+* $Id:: mw_usbd_hw.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* USB Hardware Function prototypes.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __USBHW_H__
+#define __USBHW_H__
+
+#include "error.h"
+#include "mw_usbd.h"
+#include "mw_usbd_core.h"
+
+/** \file
+ * \brief USB Hardware Function prototypes.
+ *
+ * Definition of functions exported by ROM based Device Controller Driver (DCD).
+ *
+ */
+
+/** \ingroup Group_USBD
+ * @defgroup USBD_HW USB Device Controller Driver
+ * \section Sec_HWModDescription Module Description
+ * The Device Controller Driver Layer implements the routines to deal directly with the hardware.
+ */
+
+/** \ingroup USBD_HW
+* USB Endpoint/class handler Callback Events.
+*
+*/
+enum USBD_EVENT_T {
+ USB_EVT_SETUP =1, /**< 1 Setup Packet received */
+ USB_EVT_OUT, /**< 2 OUT Packet received */
+ USB_EVT_IN, /**< 3 IN Packet sent */
+ USB_EVT_OUT_NAK, /**< 4 OUT Packet - Not Acknowledged */
+ USB_EVT_IN_NAK, /**< 5 IN Packet - Not Acknowledged */
+ USB_EVT_OUT_STALL, /**< 6 OUT Packet - Stalled */
+ USB_EVT_IN_STALL, /**< 7 IN Packet - Stalled */
+ USB_EVT_OUT_DMA_EOT, /**< 8 DMA OUT EP - End of Transfer */
+ USB_EVT_IN_DMA_EOT, /**< 9 DMA IN EP - End of Transfer */
+ USB_EVT_OUT_DMA_NDR, /**< 10 DMA OUT EP - New Descriptor Request */
+ USB_EVT_IN_DMA_NDR, /**< 11 DMA IN EP - New Descriptor Request */
+ USB_EVT_OUT_DMA_ERR, /**< 12 DMA OUT EP - Error */
+ USB_EVT_IN_DMA_ERR, /**< 13 DMA IN EP - Error */
+ USB_EVT_RESET, /**< 14 Reset event recieved */
+ USB_EVT_SOF, /**< 15 Start of Frame event */
+ USB_EVT_DEV_STATE, /**< 16 Device status events */
+ USB_EVT_DEV_ERROR /**< 17 Device error events */
+};
+
+/**
+ * \brief Hardware API functions structure.
+ * \ingroup USBD_HW
+ *
+ * This module exposes functions which interact directly with USB device controller hardware.
+ *
+ */
+typedef struct USBD_HW_API
+{
+ /** \fn uint32_t GetMemSize(USBD_API_INIT_PARAM_T* param)
+ * Function to determine the memory required by the USB device stack's DCD and core layers.
+ *
+ * This fuction is called by application layer before calling pUsbApi->hw->Init(), to allocate memory used
+ * by DCD and core layers. The application should allocate the memory which is accessible by USB
+ * controller/DMA controller.
+ * \note Some memory areas are not accessible by all bus masters.
+ *
+ * \param[in] param Structure containing USB device stack initialization parameters.
+ * \return Returns the required memory size in bytes.
+ */
+ uint32_t (*GetMemSize)(USBD_API_INIT_PARAM_T* param);
+
+ /** \fn ErrorCode_t Init(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param)
+ * Function to initialize USB device stack's DCD and core layers.
+ *
+ * This function is called by application layer to initialize USB hardware and core layers.
+ * On successful initialization the function returns a handle to USB device stack which should
+ * be passed to the rest of the functions.
+ *
+ * \param[in,out] phUsb Pointer to the USB device stack handle of type USBD_HANDLE_T.
+ * \param[in] param Structure containing USB device stack initialization parameters.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK(0) On success
+ * \retval ERR_USBD_BAD_MEM_BUF(0x0004000b) When insufficient memory buffer is passed or memory
+ * is not aligned on 2048 boundary.
+ */
+ ErrorCode_t (*Init)(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param);
+
+ /** \fn void Connect(USBD_HANDLE_T hUsb, uint32_t con)
+ * Function to make USB device visible/invisible on the USB bus.
+ *
+ * This function is called after the USB initialization. This function uses the soft connect
+ * feature to make the device visible on the USB bus. This function is called only after the
+ * application is ready to handle the USB data. The enumeration process is started by the
+ * host after the device detection. The driver handles the enumeration process according to
+ * the USB descriptors passed in the USB initialization function.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] con States whether to connect (1) or to disconnect (0).
+ * \return Nothing.
+ */
+ void (*Connect)(USBD_HANDLE_T hUsb, uint32_t con);
+
+ /** \fn void ISR(USBD_HANDLE_T hUsb)
+ * Function to USB device controller interrupt events.
+ *
+ * When the user application is active the interrupt handlers are mapped in the user flash
+ * space. The user application must provide an interrupt handler for the USB interrupt and
+ * call this function in the interrupt handler routine. The driver interrupt handler takes
+ * appropriate action according to the data received on the USB bus.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*ISR)(USBD_HANDLE_T hUsb);
+
+ /** \fn void Reset(USBD_HANDLE_T hUsb)
+ * Function to Reset USB device stack and hardware controller.
+ *
+ * Reset USB device stack and hardware controller. Disables all endpoints except EP0.
+ * Clears all pending interrupts and resets endpoint transfer queues.
+ * This function is called internally by pUsbApi->hw->init() and from reset event.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*Reset)(USBD_HANDLE_T hUsb);
+
+ /** \fn void ForceFullSpeed(USBD_HANDLE_T hUsb, uint32_t cfg)
+ * Function to force high speed USB device to operate in full speed mode.
+ *
+ * This function is useful for testing the behaviour of current device when connected
+ * to a full speed only hosts.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] cfg When 1 - set force full-speed or
+ * 0 - clear force full-speed.
+ * \return Nothing.
+ */
+ void (*ForceFullSpeed )(USBD_HANDLE_T hUsb, uint32_t cfg);
+
+ /** \fn void WakeUpCfg(USBD_HANDLE_T hUsb, uint32_t cfg)
+ * Function to configure USB device controller to wakeup host on remote events.
+ *
+ * This function is called by application layer to configure the USB device controller
+ * to wakeup on remote events. It is recommended to call this function from users's
+ * USB_WakeUpCfg() callback routine registered with stack.
+ * \note User's USB_WakeUpCfg() is registered with stack by setting the USB_WakeUpCfg member
+ * of USBD_API_INIT_PARAM_T structure before calling pUsbApi->hw->Init() routine.
+ * Certain USB device controllers needed to keep some clocks always on to generate
+ * resume signaling through pUsbApi->hw->WakeUp(). This hook is provided to support
+ * such controllers. In most controllers cases this is an empty routine.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] cfg When 1 - Configure controller to wake on remote events or
+ * 0 - Configure controller not to wake on remote events.
+ * \return Nothing.
+ */
+ void (*WakeUpCfg)(USBD_HANDLE_T hUsb, uint32_t cfg);
+
+ /** \fn void SetAddress(USBD_HANDLE_T hUsb, uint32_t adr)
+ * Function to set USB address assigned by host in device controller hardware.
+ *
+ * This function is called automatically when USB_REQUEST_SET_ADDRESS request is received
+ * by the stack from USB host.
+ * This interface is provided to users to invoke this function in other scenarios which are not
+ * handle by current stack. In most user applications this function is not called directly.
+ * Also this function can be used by users who are selectively modifying the USB device stack's
+ * standard handlers through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] adr USB bus Address to which the device controller should respond. Usually
+ * assigned by the USB host.
+ * \return Nothing.
+ */
+ void (*SetAddress)(USBD_HANDLE_T hUsb, uint32_t adr);
+
+ /** \fn void Configure(USBD_HANDLE_T hUsb, uint32_t cfg)
+ * Function to configure device controller hardware with selected configuration.
+ *
+ * This function is called automatically when USB_REQUEST_SET_CONFIGURATION request is received
+ * by the stack from USB host.
+ * This interface is provided to users to invoke this function in other scenarios which are not
+ * handle by current stack. In most user applications this function is not called directly.
+ * Also this function can be used by users who are selectively modifying the USB device stack's
+ * standard handlers through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] cfg Configuration index.
+ * \return Nothing.
+ */
+ void (*Configure)(USBD_HANDLE_T hUsb, uint32_t cfg);
+
+ /** \fn void ConfigEP(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD)
+ * Function to configure USB Endpoint according to descriptor.
+ *
+ * This function is called automatically when USB_REQUEST_SET_CONFIGURATION request is received
+ * by the stack from USB host. All the endpoints associated with the selected configuration
+ * are configured.
+ * This interface is provided to users to invoke this function in other scenarios which are not
+ * handle by current stack. In most user applications this function is not called directly.
+ * Also this function can be used by users who are selectively modifying the USB device stack's
+ * standard handlers through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] pEPD Endpoint descriptor structure defined in USB 2.0 specification.
+ * \return Nothing.
+ */
+ void (*ConfigEP)(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD);
+
+ /** \fn void DirCtrlEP(USBD_HANDLE_T hUsb, uint32_t dir)
+ * Function to set firection for USB control endpoint EP0.
+ *
+ * This function is called automatically by the stack on need bassis.
+ * This interface is provided to users to invoke this function in other scenarios which are not
+ * handle by current stack. In most user applications this function is not called directly.
+ * Also this function can be used by users who are selectively modifying the USB device stack's
+ * standard handlers through callback interface exposed by the stack.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] cfg When 1 - Set EP0 in IN transfer mode
+ * 0 - Set EP0 in OUT transfer mode
+ * \return Nothing.
+ */
+ void (*DirCtrlEP)(USBD_HANDLE_T hUsb, uint32_t dir);
+
+ /** \fn void EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
+ * Function to enable selected USB endpoint.
+ *
+ * This function enables interrupts on selected endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \return Nothing.
+ */
+ void (*EnableEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
+
+ /** \fn void DisableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
+ * Function to disable selected USB endpoint.
+ *
+ * This function disables interrupts on selected endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \return Nothing.
+ */
+ void (*DisableEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
+
+ /** \fn void ResetEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
+ * Function to reset selected USB endpoint.
+ *
+ * This function flushes the endpoint buffers and resets data toggle logic.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \return Nothing.
+ */
+ void (*ResetEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
+
+ /** \fn void SetStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
+ * Function to STALL selected USB endpoint.
+ *
+ * Generates STALL signalling for requested endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \return Nothing.
+ */
+ void (*SetStallEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
+
+ /** \fn void ClrStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
+ * Function to clear STALL state for the requested endpoint.
+ *
+ * This function clears STALL state for the requested endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \return Nothing.
+ */
+ void (*ClrStallEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
+
+ /** \fn ErrorCode_t SetTestMode(USBD_HANDLE_T hUsb, uint8_t mode)
+ * Function to set high speed USB device controller in requested test mode.
+ *
+ * USB-IF requires the high speed device to be put in various test modes
+ * for electrical testing. This USB device stack calls this function whenever
+ * it receives USB_REQUEST_CLEAR_FEATURE request for USB_FEATURE_TEST_MODE.
+ * Users can put the device in test mode by directly calling this function.
+ * Returns ERR_USBD_INVALID_REQ when device controller is full-speed only.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] mode Test mode defined in USB 2.0 electrical testing specification.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK(0) - On success
+ * \retval ERR_USBD_INVALID_REQ(0x00040001) - Invalid test mode or
+ * Device controller is full-speed only.
+ */
+ ErrorCode_t (*SetTestMode)(USBD_HANDLE_T hUsb, uint8_t mode);
+
+ /** \fn uint32_t ReadEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData)
+ * Function to read data received on the requested endpoint.
+ *
+ * This function is called by USB stack and the application layer to read the data
+ * received on the requested endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \param[in,out] pData Pointer to the data buffer where data is to be copied.
+ * \return Returns the number of bytes copied to the buffer.
+ */
+ uint32_t (*ReadEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData);
+
+ /** \fn uint32_t ReadReqEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len)
+ * Function to queue read request on the specified endpoint.
+ *
+ * This function is called by USB stack and the application layer to queue a read request
+ * on the specified endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \param[in,out] pData Pointer to the data buffer where data is to be copied. This buffer
+ * address should be accessible by USB DMA master.
+ * \param[in] len Length of the buffer passed.
+ * \return Returns the length of the requested buffer.
+ */
+ uint32_t (*ReadReqEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len);
+
+ /** \fn uint32_t ReadSetupPkt(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t *pData)
+ * Function to read setup packet data received on the requested endpoint.
+ *
+ * This function is called by USB stack and the application layer to read setup packet data
+ * received on the requested endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP0_IN is represented by 0x80 number.
+ * \param[in,out] pData Pointer to the data buffer where data is to be copied.
+ * \return Returns the number of bytes copied to the buffer.
+ */
+ uint32_t (*ReadSetupPkt)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t *pData);
+
+ /** \fn uint32_t WriteEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt)
+ * Function to write data to be sent on the requested endpoint.
+ *
+ * This function is called by USB stack and the application layer to send data
+ * on the requested endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number as per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number.
+ * \param[in] pData Pointer to the data buffer from where data is to be copied.
+ * \param[in] cnt Number of bytes to write.
+ * \return Returns the number of bytes written.
+ */
+ uint32_t (*WriteEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt);
+
+ /** \fn void WakeUp(USBD_HANDLE_T hUsb)
+ * Function to generate resume signaling on bus for remote host wakeup.
+ *
+ * This function is called by application layer to remotely wakeup host controller
+ * when system is in suspend state. Application should indicate this remote wakeup
+ * capability by setting USB_CONFIG_REMOTE_WAKEUP in bmAttributes of Configuration
+ * Descriptor. Also this routine will generate resume signalling only if host
+ * enables USB_FEATURE_REMOTE_WAKEUP by sending SET_FEATURE request before suspending
+ * the bus.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \return Nothing.
+ */
+ void (*WakeUp)(USBD_HANDLE_T hUsb);
+
+ /** \fn void EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
+ * Function to enable/disable selected USB event.
+ *
+ * This function enables interrupts on selected endpoint.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] EPNum Endpoint number corresponding to the eventas per USB specification.
+ * ie. An EP1_IN is represented by 0x81 number. For device events
+ * set this param to 0x0.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \param[in] enable 1 - enable event, 0 - disable event.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK(0) - On success
+ * \retval ERR_USBD_INVALID_REQ(0x00040001) - Invalid event type.
+ */
+ ErrorCode_t (*EnableEvent)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t event_type,
+ uint32_t enable);
+
+} USBD_HW_API_T;
+
+/*-----------------------------------------------------------------------------
+ * Private functions & structures prototypes used by stack internally
+ *-----------------------------------------------------------------------------*/
+/** @cond DIRECT_API */
+
+/* Driver functions */
+uint32_t hwUSB_GetMemSize(USBD_API_INIT_PARAM_T* param);
+ErrorCode_t hwUSB_Init(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param);
+void hwUSB_Connect(USBD_HANDLE_T hUsb, uint32_t con);
+void hwUSB_ISR(USBD_HANDLE_T hUsb);
+
+/* USB Hardware Functions */
+extern void hwUSB_Reset(USBD_HANDLE_T hUsb);
+extern void hwUSB_ForceFullSpeed (USBD_HANDLE_T hUsb, uint32_t con);
+extern void hwUSB_WakeUpCfg(USBD_HANDLE_T hUsb, uint32_t cfg);
+extern void hwUSB_SetAddress(USBD_HANDLE_T hUsb, uint32_t adr);
+extern void hwUSB_Configure(USBD_HANDLE_T hUsb, uint32_t cfg);
+extern void hwUSB_ConfigEP(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD);
+extern void hwUSB_DirCtrlEP(USBD_HANDLE_T hUsb, uint32_t dir);
+extern void hwUSB_EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
+extern void hwUSB_DisableEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
+extern void hwUSB_ResetEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
+extern void hwUSB_SetStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
+extern void hwUSB_ClrStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
+extern ErrorCode_t hwUSB_SetTestMode(USBD_HANDLE_T hUsb, uint8_t mode); /* for FS only devices return ERR_USBD_INVALID_REQ */
+extern uint32_t hwUSB_ReadEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData);
+extern uint32_t hwUSB_ReadReqEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len);
+extern uint32_t hwUSB_ReadSetupPkt(USBD_HANDLE_T hUsb, uint32_t, uint32_t *);
+extern uint32_t hwUSB_WriteEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt);
+
+/* generate resume signalling on the bus */
+extern void hwUSB_WakeUp(USBD_HANDLE_T hUsb);
+extern ErrorCode_t hwUSB_EnableEvent(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t event_type, uint32_t enable);
+/* TODO implement following routines
+- function to program TD and queue them to ep Qh
+*/
+
+/** @endcond */
+
+
+#endif /* __USBHW_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_msc.h b/tinyusb/device/romdriver/mw_usbd_msc.h
new file mode 100644
index 000000000..4931ebf1a
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_msc.h
@@ -0,0 +1,119 @@
+/***********************************************************************
+* $Id:: mw_usbd_msc.h 197 2011-06-12 20:22:41Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* Mass Storage Class definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+
+#ifndef __MSC_H__
+#define __MSC_H__
+
+#include "mw_usbd.h"
+
+/** \file
+ * \brief Mass Storage calss (MSC) descriptors.
+ *
+ * Definition of MSC class descriptors and their bit defines.
+ *
+ */
+
+/* MSC Subclass Codes */
+#define MSC_SUBCLASS_RBC 0x01
+#define MSC_SUBCLASS_SFF8020I_MMC2 0x02
+#define MSC_SUBCLASS_QIC157 0x03
+#define MSC_SUBCLASS_UFI 0x04
+#define MSC_SUBCLASS_SFF8070I 0x05
+#define MSC_SUBCLASS_SCSI 0x06
+
+/* MSC Protocol Codes */
+#define MSC_PROTOCOL_CBI_INT 0x00
+#define MSC_PROTOCOL_CBI_NOINT 0x01
+#define MSC_PROTOCOL_BULK_ONLY 0x50
+
+
+/* MSC Request Codes */
+#define MSC_REQUEST_RESET 0xFF
+#define MSC_REQUEST_GET_MAX_LUN 0xFE
+
+
+/* MSC Bulk-only Stage */
+#define MSC_BS_CBW 0 /* Command Block Wrapper */
+#define MSC_BS_DATA_OUT 1 /* Data Out Phase */
+#define MSC_BS_DATA_IN 2 /* Data In Phase */
+#define MSC_BS_DATA_IN_LAST 3 /* Data In Last Phase */
+#define MSC_BS_DATA_IN_LAST_STALL 4 /* Data In Last Phase with Stall */
+#define MSC_BS_CSW 5 /* Command Status Wrapper */
+#define MSC_BS_ERROR 6 /* Error */
+
+
+/* Bulk-only Command Block Wrapper */
+PRE_PACK struct POST_PACK _MSC_CBW
+{
+ uint32_t dSignature;
+ uint32_t dTag;
+ uint32_t dDataLength;
+ uint8_t bmFlags;
+ uint8_t bLUN;
+ uint8_t bCBLength;
+ uint8_t CB[16];
+} ;
+typedef struct _MSC_CBW MSC_CBW;
+
+/* Bulk-only Command Status Wrapper */
+PRE_PACK struct POST_PACK _MSC_CSW
+{
+ uint32_t dSignature;
+ uint32_t dTag;
+ uint32_t dDataResidue;
+ uint8_t bStatus;
+} ;
+typedef struct _MSC_CSW MSC_CSW;
+
+#define MSC_CBW_Signature 0x43425355
+#define MSC_CSW_Signature 0x53425355
+
+
+/* CSW Status Definitions */
+#define CSW_CMD_PASSED 0x00
+#define CSW_CMD_FAILED 0x01
+#define CSW_PHASE_ERROR 0x02
+
+
+/* SCSI Commands */
+#define SCSI_TEST_UNIT_READY 0x00
+#define SCSI_REQUEST_SENSE 0x03
+#define SCSI_FORMAT_UNIT 0x04
+#define SCSI_INQUIRY 0x12
+#define SCSI_MODE_SELECT6 0x15
+#define SCSI_MODE_SENSE6 0x1A
+#define SCSI_START_STOP_UNIT 0x1B
+#define SCSI_MEDIA_REMOVAL 0x1E
+#define SCSI_READ_FORMAT_CAPACITIES 0x23
+#define SCSI_READ_CAPACITY 0x25
+#define SCSI_READ10 0x28
+#define SCSI_WRITE10 0x2A
+#define SCSI_VERIFY10 0x2F
+#define SCSI_READ12 0xA8
+#define SCSI_WRITE12 0xAA
+#define SCSI_MODE_SELECT10 0x55
+#define SCSI_MODE_SENSE10 0x5A
+
+
+#endif /* __MSC_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_mscuser.h b/tinyusb/device/romdriver/mw_usbd_mscuser.h
new file mode 100644
index 000000000..cce102525
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_mscuser.h
@@ -0,0 +1,267 @@
+/***********************************************************************
+* $Id:: mw_usbd_mscuser.h 202 2011-06-12 21:50:01Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* Mass Storage Class Custom User Module definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __MSCUSER_H__
+#define __MSCUSER_H__
+
+#include "error.h"
+#include "mw_usbd.h"
+#include "mw_usbd_msc.h"
+#include "mw_usbd_core.h"
+#include "tusb_cfg.h"
+
+/** \file
+ * \brief Mass Storage Class (MSC) API structures and function prototypes.
+ *
+ * Definition of functions exported by ROM based MSC function driver.
+ *
+ */
+
+/** \ingroup Group_USBD
+ * @defgroup USBD_MSC Mass Storage Class (MSC) Function Driver
+ * \section Sec_MSCModDescription Module Description
+ * MSC Class Function Driver module. This module contains an internal implementation of the USB MSC Class.
+ * User applications can use this class driver instead of implementing the MSC class manually
+ * via the low-level USBD_HW and USBD_Core APIs.
+ *
+ * This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ * Devices using the USB MSC Class.
+ */
+
+/** \brief Mass Storage class function driver initilization parameter data structure.
+ * \ingroup USBD_MSC
+ *
+ * \details This data structure is used to pass initialization parameters to the
+ * Mass Storage class function driver's init function.
+ *
+ */
+typedef struct USBD_MSC_INIT_PARAM
+{
+ /* memory allocation params */
+ uint32_t mem_base; /**< Base memory location from where the stack can allocate
+ data and buffers. \note The memory address set in this field
+ should be accessible by USB DMA controller. Also this value
+ should be aligned on 4 byte boundary.
+ */
+ uint32_t mem_size; /**< The size of memory buffer which stack can use.
+ \note The \em mem_size should be greater than the size
+ returned by USBD_MSC_API::GetMemSize() routine.*/
+ /* mass storage paramas */
+ uint8_t* InquiryStr; /**< Pointer to the 28 character string. This string is
+ sent in response to the SCSI Inquiry command. \note The data
+ pointed by the pointer should be of global scope.
+ */
+ uint32_t BlockCount; /**< Number of blocks present in the mass storage device */
+ uint32_t BlockSize; /**< Block size in number of bytes */
+ uint32_t MemorySize; /**< Memory size in number of bytes */
+ /** Pointer to the interface descriptor within the descriptor
+ * array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
+ * structure. The stack assumes both HS and FS use same BULK endpoints.
+ */
+ uint8_t* intf_desc;
+ /* user defined functions */
+
+ /**
+ * MSC Write callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a write command.
+ *
+ * \param[in] offset Destination start address.
+ * \param[in, out] src Pointer to a pointer to the source of data. Pointer-to-pointer
+ * is used to implement zero-copy buffers. See \ref USBD_ZeroCopy
+ * for more details on zero-copy concept.
+ * \param[in] length Number of bytes to be written.
+ * \return Nothing.
+ *
+ */
+ void (*MSC_Write)( uint32_t offset, uint8_t** src, uint32_t length);
+ /**
+ * MSC Read callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a read command.
+ *
+ * \param[in] offset Source start address.
+ * \param[in, out] dst Pointer to a pointer to the source of data. The MSC function drivers
+ * implemented in stack are written with zero-copy model. Meaning the stack doesn't make an
+ * extra copy of buffer before writing/reading data from USB hardware FIFO. Hence the
+ * parameter is pointer to a pointer containing address buffer (uint8_t** dst).
+ * So that the user application can update the buffer pointer instead of copying data to
+ * address pointed by the parameter. /note The updated buffer address should be accessable
+ * by USB DMA master. If user doesn't want to use zero-copy model, then the user should copy
+ * data to the address pointed by the passed buffer pointer parameter and shouldn't change
+ * the address value. See \ref USBD_ZeroCopy for more details on zero-copy concept.
+ * \param[in] length Number of bytes to be read.
+ * \return Nothing.
+ *
+ */
+ void (*MSC_Read)( uint32_t offset, uint8_t** dst, uint32_t length);
+ /**
+ * MSC Verify callback function.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends a verify command. The callback function should compare the buffer
+ * with the destination memory at the requested offset and
+ *
+ * \param[in] offset Destination start address.
+ * \param[in] buf Buffer containing the data sent by the host.
+ * \param[in] length Number of bytes to verify.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK If data in the buffer matches the data at destination
+ * \retval ERR_FAILED Atleast one byte is different.
+ *
+ */
+ ErrorCode_t (*MSC_Verify)( uint32_t offset, uint8_t buf[], uint32_t length);
+ /**
+ * Optional callback function to optimize MSC_Write buffer transfer.
+ *
+ * This function is provided by the application software. This function gets called
+ * when host sends SCSI_WRITE10/SCSI_WRITE12 command. The callback function should
+ * update the \em buff_adr pointer so that the stack transfers the data directly
+ * to the target buffer. /note The updated buffer address should be accessable
+ * by USB DMA master. If user doesn't want to use zero-copy model, then the user
+ * should not update the buffer pointer. See \ref USBD_ZeroCopy for more details
+ * on zero-copy concept.
+ *
+ * \param[in] offset Destination start address.
+ * \param[in,out] buf Buffer containing the data sent by the host.
+ * \param[in] length Number of bytes to write.
+ * \return Nothing.
+ *
+ */
+ void (*MSC_GetWriteBuf)( uint32_t offset, uint8_t** buff_adr, uint32_t length);
+
+ /**
+ * Optional user overridable function to replace the default MSC class handler.
+ *
+ * The application software could override the default EP0 class handler with their
+ * own by providing the handler function address as this data member of the parameter
+ * structure. Application which like the default handler should set this data member
+ * to zero before calling the USBD_MSC_API::Init().
+ * \n
+ * \note
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
+ * \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
+ * \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success.
+ * \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
+ * \retval ERR_USBD_xxx For other error conditions.
+ *
+ */
+ ErrorCode_t (*MSC_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
+
+} USBD_MSC_INIT_PARAM_T;
+
+/** \brief MSC class API functions structure.
+ * \ingroup USBD_MSC
+ *
+ * This module exposes functions which interact directly with USB device controller hardware.
+ *
+ */
+typedef struct USBD_MSC_API
+{
+ /** \fn uint32_t GetMemSize(USBD_MSC_INIT_PARAM_T* param)
+ * Function to determine the memory required by the MSC function driver module.
+ *
+ * This function is called by application layer before calling pUsbApi->msc->Init(), to allocate memory used
+ * by MSC function driver module. The application should allocate the memory which is accessible by USB
+ * controller/DMA controller.
+ * \note Some memory areas are not accessible by all bus masters.
+ *
+ * \param[in] param Structure containing MSC function driver module initialization parameters.
+ * \return Returns the required memory size in bytes.
+ */
+ uint32_t (*GetMemSize)(USBD_MSC_INIT_PARAM_T* param);
+
+ /** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param)
+ * Function to initialize MSC function driver module.
+ *
+ * This fuction is called by application layer to initialize MSC function driver module.
+ *
+ * \param[in] hUsb Handle to the USB device stack.
+ * \param[in, out] param Structure containing MSC function driver module initialization parameters.
+ * \return Returns \ref ErrorCode_t type to indicate success or error condition.
+ * \retval LPC_OK On success
+ * \retval ERR_USBD_BAD_MEM_BUF Memory buffer passed is not 4-byte
+ * aligned or smaller than required.
+ * \retval ERR_API_INVALID_PARAM2 Either MSC_Write() or MSC_Read() or
+ * MSC_Verify() callbacks are not defined.
+ * \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
+ * \retval ERR_USBD_BAD_EP_DESC Wrong endpoint descriptor is passed.
+ */
+ ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param);
+
+} USBD_MSC_API_T;
+
+/*-----------------------------------------------------------------------------
+ * Private functions & structures prototypes
+ *-----------------------------------------------------------------------------*/
+/** @cond ADVANCED_API */
+
+typedef struct _MSC_CTRL_T
+{
+ /* If it's a USB HS, the max packet is 512, if it's USB FS,
+ the max packet is 64. Use 512 for both HS and FS. */
+ /*ALIGNED(4)*/ uint8_t BulkBuf[USB_HS_MAX_BULK_PACKET]; /* Bulk In/Out Buffer */
+ /*ALIGNED(4)*/MSC_CBW CBW; /* Command Block Wrapper */
+ /*ALIGNED(4)*/MSC_CSW CSW; /* Command Status Wrapper */
+
+ USB_CORE_CTRL_T* pUsbCtrl;
+
+ uint32_t Offset; /* R/W Offset */
+ uint32_t Length; /* R/W Length */
+ uint32_t BulkLen; /* Bulk In/Out Length */
+ uint8_t* rx_buf;
+
+ uint8_t BulkStage; /* Bulk Stage */
+ uint8_t if_num; /* interface number */
+ uint8_t epin_num; /* BULK IN endpoint number */
+ uint8_t epout_num; /* BULK OUT endpoint number */
+ uint32_t MemOK; /* Memory OK */
+
+ uint8_t* InquiryStr;
+ uint32_t BlockCount;
+ uint32_t BlockSize;
+ uint32_t MemorySize;
+ /* user defined functions */
+ void (*MSC_Write)( uint32_t offset, uint8_t** src, uint32_t length);
+ void (*MSC_Read)( uint32_t offset, uint8_t** dst, uint32_t length);
+ ErrorCode_t (*MSC_Verify)( uint32_t offset, uint8_t src[], uint32_t length);
+ /* optional call back for MSC_Write optimization */
+ void (*MSC_GetWriteBuf)( uint32_t offset, uint8_t** buff_adr, uint32_t length);
+
+
+}USB_MSC_CTRL_T;
+
+/** @cond DIRECT_API */
+extern uint32_t mwMSC_GetMemSize(USBD_MSC_INIT_PARAM_T* param);
+extern ErrorCode_t mwMSC_init(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param);
+/** @endcond */
+
+/** @endcond */
+
+
+#endif /* __MSCUSER_H__ */
diff --git a/tinyusb/device/romdriver/mw_usbd_rom_api.h b/tinyusb/device/romdriver/mw_usbd_rom_api.h
new file mode 100644
index 000000000..aa18838fe
--- /dev/null
+++ b/tinyusb/device/romdriver/mw_usbd_rom_api.h
@@ -0,0 +1,93 @@
+/***********************************************************************
+* $Id:: mw_usbd_rom_api.h 197 2011-06-12 20:22:41Z usb06052 $
+*
+* Project: USB device ROM Stack
+*
+* Description:
+* ROM API Module definitions.
+*
+***********************************************************************
+* Copyright(C) 2011, NXP Semiconductor
+* All rights reserved.
+*
+* Software that is described herein is for illustrative purposes only
+* which provides customers with programming information regarding the
+* products. This software is supplied "AS IS" without any warranties.
+* NXP Semiconductors assumes no responsibility or liability for the
+* use of the software, conveys no license or title under any patent,
+* copyright, or mask work right to the product. NXP Semiconductors
+* reserves the right to make changes in the software without
+* notification. NXP Semiconductors also make no representation or
+* warranty that such application will be suitable for the specified
+* use without further testing or modification.
+**********************************************************************/
+#ifndef __MW_USBD_ROM_API_H
+#define __MW_USBD_ROM_API_H
+/** \file
+ * \brief ROM API for USB device stack.
+ *
+ * Definition of functions exported by ROM based USB device stack.
+ *
+ */
+
+#include "error.h"
+#include "mw_usbd.h"
+#include "mw_usbd_hw.h"
+#include "mw_usbd_desc.h"
+#include "mw_usbd_core.h"
+#include "mw_usbd_mscuser.h"
+#include "mw_usbd_dfuuser.h"
+#include "mw_usbd_hiduser.h"
+#include "mw_usbd_cdcuser.h"
+//#include "power_api.h"
+
+/** \brief Main USBD API functions structure.
+ * \ingroup Group_USBD
+ *
+ * This structure contains pointer to various USB Device stack's sub-module
+ * function tables. This structure is used as main entry point to access
+ * various methods (grouped in sub-modules) exposed by ROM based USB device
+ * stack.
+ *
+ */
+typedef struct USBD_API
+{
+ const USBD_HW_API_T* hw; /**< Pointer to function table which exposes functions
+ which interact directly with USB device stack's core
+ layer.*/
+ const USBD_CORE_API_T* core; /**< Pointer to function table which exposes functions
+ which interact directly with USB device controller
+ hardware.*/
+ const USBD_MSC_API_T* msc; /**< Pointer to function table which exposes functions
+ provided by MSC function driver module.
+ */
+ const USBD_DFU_API_T* dfu; /**< Pointer to function table which exposes functions
+ provided by DFU function driver module.
+ */
+ const USBD_HID_API_T* hid; /**< Pointer to function table which exposes functions
+ provided by HID function driver module.
+ */
+ const USBD_CDC_API_T* cdc; /**< Pointer to function table which exposes functions
+ provided by CDC-ACM function driver module.
+ */
+ const uint32_t* reserved6; /**< Reserved for future function driver module.
+ */
+ const uint32_t version; /**< Version identifier of USB ROM stack. The version is
+ defined as 0x0CHDMhCC where each nibble represnts version
+ number of the corresponding component.
+ CC - 7:0 - 8bit core version number
+ h - 11:8 - 4bit hardware interface version number
+ M - 15:12 - 4bit MSC class module version number
+ D - 19:16 - 4bit DFU class module version number
+ H - 23:20 - 4bit HID class module version number
+ C - 27:24 - 4bit CDC class module version number
+ H - 31:28 - 4bit reserved
+ */
+
+} USBD_API_T;
+
+extern const USBD_API_T usb_api;
+
+
+#endif /*__MW_USBD_ROM_API_H*/
+
diff --git a/tinyusb/device/romdriver/power_api.h b/tinyusb/device/romdriver/power_api.h
new file mode 100644
index 000000000..f95021774
--- /dev/null
+++ b/tinyusb/device/romdriver/power_api.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * $Id:: power_api.h 6249 2011-01-25 19:23:47Z usb01267 $
+ * Project: NXP LPC13Uxx software example
+ *
+ * Description:
+ * Power API Header File for NXP LPC13Uxx Device Series
+ *
+ ****************************************************************************
+ * Software that is described herein is for illustrative purposes only
+ * which provides customers with programming information regarding the
+ * products. This software is supplied "AS IS" without any warranties.
+ * NXP Semiconductors assumes no responsibility or liability for the
+ * use of the software, conveys no license or title under any patent,
+ * copyright, or mask work right to the product. NXP Semiconductors
+ * reserves the right to make changes in the software without
+ * notification. NXP Semiconductors also make no representation or
+ * warranty that such application will be suitable for the specified
+ * use without further testing or modification.
+****************************************************************************/
+#ifndef __LPC13UXX_POWER_API_H__
+#define __LPC13UXX_POWER_API_H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#define PWRROMD_PRESENT
+
+#define USBROMD_PRESENT
+
+#ifdef USBROMD_PRESENT
+#include "mw_usbd_rom_api.h"
+#endif
+
+typedef struct _PWRD {
+ void (*set_pll)(unsigned int cmd[], unsigned int resp[]);
+ void (*set_power)(unsigned int cmd[], unsigned int resp[]);
+} PWRD;
+
+typedef struct _ROM {
+#ifdef USBROMD_PRESENT
+ const USBD_API_T * pUSBD;
+#else
+ const unsigned p_usbd;
+#endif /* USBROMD_PRESENT */
+ const unsigned p_clib;
+ const unsigned p_cand;
+#ifdef PWRROMD_PRESENT
+ const PWRD * pPWRD;
+#else
+ const unsigned p_pwrd;
+#endif /* PWRROMD_PRESENT */
+ const unsigned p_dev1;
+ const unsigned p_dev2;
+ const unsigned p_dev3;
+ const unsigned p_dev4;
+} ROM;
+
+//PLL setup related definitions
+#define CPU_FREQ_EQU 0 //main PLL freq must be equal to the specified
+#define CPU_FREQ_LTE 1 //main PLL freq must be less than or equal the specified
+#define CPU_FREQ_GTE 2 //main PLL freq must be greater than or equal the specified
+#define CPU_FREQ_APPROX 3 //main PLL freq must be as close as possible the specified
+
+#define PLL_CMD_SUCCESS 0 //PLL setup successfully found
+#define PLL_INVALID_FREQ 1 //specified freq out of range (either input or output)
+#define PLL_INVALID_MODE 2 //invalid mode (see above for valid) specified
+#define PLL_FREQ_NOT_FOUND 3 //specified freq not found under specified conditions
+#define PLL_NOT_LOCKED 4 //PLL not locked => no changes to the PLL setup
+
+//power setup elated definitions
+#define PARAM_DEFAULT 0 //default power settings (voltage regulator, flash interface)
+#define PARAM_CPU_PERFORMANCE 1 //setup for maximum CPU performance (higher current, more computation)
+#define PARAM_EFFICIENCY 2 //balanced setting (power vs CPU performance)
+#define PARAM_LOW_CURRENT 3 //lowest active current, lowest CPU performance
+
+#define PARAM_CMD_SUCCESS 0 //power setting successfully found
+#define PARAM_INVALID_FREQ 1 //specified freq out of range (=0 or > 50 MHz)
+#define PARAM_INVALID_MODE 2 //specified mode not valid (see above for valid)
+
+#define MAX_CLOCK_KHZ_PARAM 50000
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LPC13UXX_POWER_API_H__ */
+
diff --git a/tinyusb/tusb.c b/tinyusb/tusb.c
new file mode 100644
index 000000000..e74f6d16d
--- /dev/null
+++ b/tinyusb/tusb.c
@@ -0,0 +1,59 @@
+/*
+ * tusb.c
+ *
+ * Created on: Nov 27, 2012
+ * Author: hathach (thachha@live.com)
+ */
+
+/*
+ * Software License Agreement (BSD License)
+ * Copyright (c) 2012, hathach (thachha@live.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the tiny usb stack.
+ */
+
+#include "tusb.h"
+#include "LPC13Uxx.h" // TODO HAL
+
+ErrorCode_t tusb_init(void)
+{
+ /* HARDWARE INIT */
+
+ /* Enable AHB clock to the USB block and USB RAM. */
+ LPC_SYSCON->SYSAHBCLKCTRL |= ((0x1<<14) | (0x1<<27));
+
+ /* Pull-down is needed, or internally, VBUS will be floating. This is to
+ address the wrong status in VBUSDebouncing bit in CmdStatus register. */
+ LPC_IOCON->PIO0_3 &= ~0x1F;
+ LPC_IOCON->PIO0_3 |= (0x01<<0); /* Secondary function VBUS */
+ LPC_IOCON->PIO0_6 &= ~0x07;
+ LPC_IOCON->PIO0_6 |= (0x01<<0); /* Secondary function SoftConn */
+
+#ifdef CFG_TUSB_DEVICE
+ dcd_init();
+#endif
+ return LPC_OK;
+}
diff --git a/tinyusb/tusb.h b/tinyusb/tusb.h
new file mode 100644
index 000000000..7e5f2beb5
--- /dev/null
+++ b/tinyusb/tusb.h
@@ -0,0 +1,48 @@
+/*
+ * tusb.h
+ *
+ * Created on: Nov 27, 2012
+ * Author: hathach (thachha@live.com)
+ */
+
+/*
+ * Software License Agreement (BSD License)
+ * Copyright (c) 2012, hathach (thachha@live.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the tiny usb stack.
+ */
+
+#ifndef TUSB_H_
+#define TUSB_H_
+
+#include "common/common.h"
+#include "tusb_cfg.h"
+
+#ifdef CFG_TUSB_DEVICE
+#include "device/dcd.h"
+#endif
+
+#endif /* TUSB_H_ */
diff --git a/tinyusb/tusb_cfg.h b/tinyusb/tusb_cfg.h
index 95b32966b..b2b631977 100644
--- a/tinyusb/tusb_cfg.h
+++ b/tinyusb/tusb_cfg.h
@@ -35,12 +35,35 @@
* This file is part of the tiny usb stack.
*/
-#ifndef TUSB_CFG_H_
-#define TUSB_CFG_H_
+#ifndef _TUSB_CFG_H_
+#define _TUSB_CFG_H_
#include "common/common.h"
-#define TUSB_HOST
-#define TUSB_DEVICE
+#define CFG_TUSB_HOST
+#define CFG_TUSB_DEVICE
-#endif /* TUSB_CFG_H_ */
+
+#define USB_MAX_IF_NUM 8
+#define USB_MAX_EP_NUM 5
+
+#define USB_FS_MAX_BULK_PACKET 64
+#define USB_HS_MAX_BULK_PACKET USB_FS_MAX_BULK_PACKET /* Full speed device only */
+
+// Control Endpoint
+#define USB_MAX_PACKET0 64
+
+/* HID In/Out Endpoint Address */
+#define HID_KEYBOARD_EP_IN USB_ENDPOINT_IN(1)
+//#define HID_KEYBOARD_EP_OUT USB_ENDPOINT_OUT(1)
+#define HID_MOUSE_EP_IN USB_ENDPOINT_IN(4)
+
+/* CDC Endpoint Address */
+#define CDC_NOTIFICATION_EP USB_ENDPOINT_IN(2)
+#define CDC_DATA_EP_OUT USB_ENDPOINT_OUT(3)
+#define CDC_DATA_EP_IN USB_ENDPOINT_IN(3)
+
+#define CDC_NOTIFICATION_EP_MAXPACKETSIZE 8
+#define CDC_DATA_EP_MAXPACKET_SIZE 16
+
+#endif /* _TUSB_CFG_H_ */