Просмотр исходного кода

added files
added some template code

hathach 13 лет назад
Родитель
Сommit
06c16ae03f
35 измененных файлов с 5950 добавлено и 31 удалено
  1. 5 0
      .cproject
  2. 1 1
      README.md
  3. 873 0
      demos/device/keyboard/.cproject
  4. 84 0
      demos/device/keyboard/.project
  5. 3 3
      tinyusb/common/arch/arch.h
  6. 6 4
      tinyusb/common/arch/arch_lpc134x.h
  7. 3 3
      tinyusb/common/arch/arch_lpc43xx.h
  8. 3 3
      tinyusb/common/arch/arm_mx.h
  9. 4 3
      tinyusb/common/common.h
  10. 3 3
      tinyusb/common/compiler/compiler.h
  11. 3 3
      tinyusb/common/compiler/compiler_gcc.h
  12. 37 0
      tinyusb/common/errors.c
  13. 42 0
      tinyusb/common/errors.h
  14. 69 0
      tinyusb/device/dcd.c
  15. 8 3
      tinyusb/device/dcd.h
  16. 140 0
      tinyusb/device/romdriver/error.h
  17. 652 0
      tinyusb/device/romdriver/mw_usbd.h
  18. 31 0
      tinyusb/device/romdriver/mw_usbd_adcuser.h
  19. 377 0
      tinyusb/device/romdriver/mw_usbd_audio.h
  20. 249 0
      tinyusb/device/romdriver/mw_usbd_cdc.h
  21. 342 0
      tinyusb/device/romdriver/mw_usbd_cdcuser.h
  22. 575 0
      tinyusb/device/romdriver/mw_usbd_core.h
  23. 48 0
      tinyusb/device/romdriver/mw_usbd_desc.h
  24. 120 0
      tinyusb/device/romdriver/mw_usbd_dfu.h
  25. 264 0
      tinyusb/device/romdriver/mw_usbd_dfuuser.h
  26. 429 0
      tinyusb/device/romdriver/mw_usbd_hid.h
  27. 421 0
      tinyusb/device/romdriver/mw_usbd_hiduser.h
  28. 456 0
      tinyusb/device/romdriver/mw_usbd_hw.h
  29. 119 0
      tinyusb/device/romdriver/mw_usbd_msc.h
  30. 267 0
      tinyusb/device/romdriver/mw_usbd_mscuser.h
  31. 93 0
      tinyusb/device/romdriver/mw_usbd_rom_api.h
  32. 88 0
      tinyusb/device/romdriver/power_api.h
  33. 59 0
      tinyusb/tusb.c
  34. 48 0
      tinyusb/tusb.h
  35. 28 5
      tinyusb/tusb_cfg.h

+ 5 - 0
.cproject

@@ -40,6 +40,11 @@
 								</option>
 								<option id="gnu.c.compiler.option.misc.other.1344283117" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
 								<option id="com.crt.advproject.c.misc.dialect.995251213" name="C Dialect" superClass="com.crt.advproject.c.misc.dialect" value="com.crt.advproject.misc.dialect.gnu99" valueType="enumerated"/>
+								<option id="gnu.c.compiler.option.include.paths.1054321122" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/CMSISv2p10_LPC13Uxx/inc}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/tinyusb}&quot;"/>
+								</option>
+								<option id="gnu.c.compiler.option.include.files.141853359" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" valueType="includeFiles"/>
 								<inputType id="com.crt.advproject.compiler.input.677402070" superClass="com.crt.advproject.compiler.input"/>
 							</tool>
 							<tool id="com.crt.advproject.gas.lib.debug.111062522" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.debug">

+ 1 - 1
README.md

@@ -1,4 +1,4 @@
 tinyusb
 =======
 
-a tiny open usb stack
+an embedded open-source usb stack for ARM MCUs

+ 873 - 0
demos/device/keyboard/.cproject

@@ -0,0 +1,873 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="com.crt.advproject.config.exe.debug.856400198">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.856400198" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.856400198" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;; # arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; ; checksum -p ${TargetChip} -d &quot;${BuildArtifactFileBaseName}.bin&quot;;  ">
+					<folderInfo id="com.crt.advproject.config.exe.debug.856400198." name="/" resourcePath="">
+						<toolChain id="com.crt.advproject.toolchain.exe.debug.469819926" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug">
+							<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.548956113" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>
+							<builder buildPath="${workspace_loc:/device_keyboard/Debug}" id="com.crt.advproject.builder.exe.debug.1029932398" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/>
+							<tool id="com.crt.advproject.cpp.exe.debug.1119457813" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug"/>
+							<tool id="com.crt.advproject.gcc.exe.debug.2040685134" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug">
+								<option id="com.crt.advproject.gcc.arch.658802474" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/>
+								<option id="com.crt.advproject.gcc.thumb.697143257" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/>
+								<option id="gnu.c.compiler.option.preprocessor.def.symbols.371325215" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
+									<listOptionValue builtIn="false" value="__REDLIB__"/>
+									<listOptionValue builtIn="false" value="DEBUG"/>
+									<listOptionValue builtIn="false" value="__CODE_RED"/>
+								</option>
+								<option id="gnu.c.compiler.option.misc.other.204394496" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
+								<option id="gnu.c.compiler.option.include.paths.1207481236" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/CMSISv2p10_LPC13Uxx/inc}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/tinyusb/tinyusb}&quot;"/>
+								</option>
+								<option id="gnu.c.compiler.option.include.files.318820756" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" valueType="includeFiles"/>
+								<inputType id="com.crt.advproject.compiler.input.932601394" superClass="com.crt.advproject.compiler.input"/>
+							</tool>
+							<tool id="com.crt.advproject.gas.exe.debug.1050918013" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug">
+								<option id="com.crt.advproject.gas.arch.1370417737" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/>
+								<option id="com.crt.advproject.gas.thumb.631765837" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
+								<option id="gnu.both.asm.option.flags.crt.1931019746" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DDEBUG -D__CODE_RED" valueType="string"/>
+								<inputType id="com.crt.advproject.assembler.input.1898367800" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
+							</tool>
+							<tool id="com.crt.advproject.link.cpp.exe.debug.290831412" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug"/>
+							<tool id="com.crt.advproject.link.exe.debug.1506176667" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug">
+								<option id="com.crt.advproject.link.arch.1411471839" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/>
+								<option id="com.crt.advproject.link.thumb.897273840" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>
+								<option id="com.crt.advproject.link.script.935550147" name="Linker script" superClass="com.crt.advproject.link.script" value="&quot;device_keyboard_Debug.ld&quot;" valueType="string"/>
+								<option id="com.crt.advproject.link.manage.1693118885" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>
+								<option id="gnu.c.link.option.nostdlibs.2134659918" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>
+								<option id="gnu.c.link.option.other.347869425" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Map=&quot;${BuildArtifactFileBaseName}.map&quot;"/>
+									<listOptionValue builtIn="false" value="--gc-sections"/>
+								</option>
+								<option id="gnu.c.link.option.paths.1465143173" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths">
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/CMSISv2p10_LPC13Uxx/Debug}&quot;"/>
+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/tinyusb/Debug}&quot;"/>
+								</option>
+								<option id="gnu.c.link.option.libs.447978281" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
+									<listOptionValue builtIn="false" value="CMSISv2p10_LPC13Uxx"/>
+									<listOptionValue builtIn="false" value="tinyusb"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1234316494" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+			<storageModule moduleId="scannerConfiguration">
+				<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+				<profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="false" filePath=""/>
+						<parser enabled="false"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="com.crt.advproject.specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="com.crt.advproject.GCCManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="false" filePath=""/>
+						<parser enabled="false"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="com.crt.advproject.specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="com.crt.advproject.GASManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="false" filePath=""/>
+						<parser enabled="false"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="com.crt.advproject.specsFile">
+						<runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="makefileGenerator">
+						<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.856400198;com.crt.advproject.config.exe.debug.856400198.;com.crt.advproject.gas.exe.debug.1050918013;com.crt.advproject.assembler.input.1898367800">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GASManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.856400198;com.crt.advproject.config.exe.debug.856400198.;com.crt.advproject.gcc.exe.debug.2040685134;com.crt.advproject.compiler.input.932601394">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GASManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+			</storageModule>
+		</cconfiguration>
+		<cconfiguration id="com.crt.advproject.config.exe.release.2127212492">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.release.2127212492" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.release.2127212492" name="Release" parent="com.crt.advproject.config.exe.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;; # arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; ; checksum -p ${TargetChip} -d &quot;${BuildArtifactFileBaseName}.bin&quot;;  ">
+					<folderInfo id="com.crt.advproject.config.exe.release.2127212492." name="/" resourcePath="">
+						<toolChain id="com.crt.advproject.toolchain.exe.release.272781778" name="Code Red MCU Tools" superClass="com.crt.advproject.toolchain.exe.release">
+							<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.release.765476662" name="ARM-based MCU (Release)" superClass="com.crt.advproject.platform.exe.release"/>
+							<builder buildPath="${workspace_loc:/device_keyboard/Release}" id="com.crt.advproject.builder.exe.release.1079210842" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.release"/>
+							<tool id="com.crt.advproject.cpp.exe.release.1922869988" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.release"/>
+							<tool id="com.crt.advproject.gcc.exe.release.121334604" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.release">
+								<option id="com.crt.advproject.gcc.arch.2096880793" name="Architecture" superClass="com.crt.advproject.gcc.arch" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/>
+								<option id="com.crt.advproject.gcc.thumb.83314458" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" value="true" valueType="boolean"/>
+								<option id="gnu.c.compiler.option.preprocessor.def.symbols.561167434" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
+									<listOptionValue builtIn="false" value="__REDLIB__"/>
+									<listOptionValue builtIn="false" value="NDEBUG"/>
+									<listOptionValue builtIn="false" value="__CODE_RED"/>
+								</option>
+								<option id="gnu.c.compiler.option.misc.other.9967708" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
+								<inputType id="com.crt.advproject.compiler.input.114648017" superClass="com.crt.advproject.compiler.input"/>
+							</tool>
+							<tool id="com.crt.advproject.gas.exe.release.2134084776" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.release">
+								<option id="com.crt.advproject.gas.arch.1408809141" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/>
+								<option id="com.crt.advproject.gas.thumb.1325613237" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
+								<option id="gnu.both.asm.option.flags.crt.8528156" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DNDEBUG -D__CODE_RED" valueType="string"/>
+								<inputType id="com.crt.advproject.assembler.input.2131712301" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
+							</tool>
+							<tool id="com.crt.advproject.link.cpp.exe.release.1461368660" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.release"/>
+							<tool id="com.crt.advproject.link.exe.release.1813757803" name="MCU Linker" superClass="com.crt.advproject.link.exe.release">
+								<option id="com.crt.advproject.link.arch.1944642250" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm3" valueType="enumerated"/>
+								<option id="com.crt.advproject.link.thumb.1932667490" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>
+								<option id="com.crt.advproject.link.script.760917204" name="Linker script" superClass="com.crt.advproject.link.script" value="&quot;device_keyboard_Release.ld&quot;" valueType="string"/>
+								<option id="com.crt.advproject.link.manage.15477715" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>
+								<option id="gnu.c.link.option.nostdlibs.924645935" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>
+								<option id="gnu.c.link.option.other.1157365439" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">
+									<listOptionValue builtIn="false" value="-Map=&quot;${BuildArtifactFileBaseName}.map&quot;"/>
+									<listOptionValue builtIn="false" value="--gc-sections"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.515562302" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+			<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+			<storageModule moduleId="scannerConfiguration">
+				<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+				<profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="false" filePath=""/>
+						<parser enabled="false"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="com.crt.advproject.specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="com.crt.advproject.GCCManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="false" filePath=""/>
+						<parser enabled="false"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="com.crt.advproject.specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="com.crt.advproject.GASManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="false" filePath=""/>
+						<parser enabled="false"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="com.crt.advproject.specsFile">
+						<runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="makefileGenerator">
+						<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.856400198;com.crt.advproject.config.exe.debug.856400198.;com.crt.advproject.gas.exe.debug.1050918013;com.crt.advproject.assembler.input.1898367800">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GASManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.856400198;com.crt.advproject.config.exe.debug.856400198.;com.crt.advproject.gcc.exe.debug.2040685134;com.crt.advproject.compiler.input.932601394">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.crt.advproject.GCCManagedMakePerProjectProfile"/>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-c++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file} " command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="com.crt.advproject.GASManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="false" filePath=""/>
+							<parser enabled="false"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="com.crt.advproject.specsFile">
+							<runAction arguments="-x assembler-with-cpp -E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-none-eabi-gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+			</storageModule>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="device_keyboard.com.crt.advproject.projecttype.exe.752873811" name="Executable" projectType="com.crt.advproject.projecttype.exe"/>
+	</storageModule>
+	<storageModule moduleId="com.crt.config">
+		<projectStorage>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#13;
+&lt;TargetConfig&gt;&#13;
+&lt;Properties property_0="" property_3="NXP" property_4="LPC1347" property_count="5" version="1"/&gt;&#13;
+&lt;infoList vendor="NXP"&gt;&lt;info chip="LPC1347" match_id="0x08020543" name="LPC1347" stub="crt_emu_lpc11_13_nxp"&gt;&lt;chip&gt;&lt;name&gt;LPC1347&lt;/name&gt;&#13;
+&lt;family&gt;LPC13xx (12bit ADC)&lt;/family&gt;&#13;
+&lt;vendor&gt;NXP (formerly Philips)&lt;/vendor&gt;&#13;
+&lt;reset board="None" core="Real" sys="Real"/&gt;&#13;
+&lt;clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/&gt;&#13;
+&lt;memory can_program="true" id="Flash" is_ro="true" type="Flash"/&gt;&#13;
+&lt;memory id="RAM" type="RAM"/&gt;&#13;
+&lt;memory id="Periph" is_volatile="true" type="Peripheral"/&gt;&#13;
+&lt;memoryInstance derived_from="Flash" id="MFlash64" location="0x0" size="0x10000"/&gt;&#13;
+&lt;memoryInstance derived_from="RAM" id="RamLoc8" location="0x10000000" size="0x2000"/&gt;&#13;
+&lt;memoryInstance derived_from="RAM" id="RamUsb2" location="0x20004000" size="0x800"/&gt;&#13;
+&lt;memoryInstance derived_from="RAM" id="RamPeriph2" location="0x20000000" size="0x800"/&gt;&#13;
+&lt;prog_flash blocksz="0x1000" location="0x0" maxprgbuff="0x400" progwithcode="TRUE" size="0x10000"/&gt;&#13;
+&lt;peripheralInstance derived_from="V7M_MPU" id="MPU" location="0xe000ed90"/&gt;&#13;
+&lt;peripheralInstance derived_from="V7M_NVIC" id="NVIC" location="0xe000e000"/&gt;&#13;
+&lt;peripheralInstance derived_from="V7M_DCR" id="DCR" location="0xe000edf0"/&gt;&#13;
+&lt;peripheralInstance derived_from="V7M_ITM" id="ITM" location="0xe0000000"/&gt;&#13;
+&lt;peripheralInstance derived_from="I2C" id="I2C" location="0x40000000"/&gt;&#13;
+&lt;peripheralInstance derived_from="WWDT" id="WWDT" location="0x40004000"/&gt;&#13;
+&lt;peripheralInstance derived_from="USART" id="USART" location="0x40008000"/&gt;&#13;
+&lt;peripheralInstance derived_from="CT16B0" id="CT16B0" location="0x4000c000"/&gt;&#13;
+&lt;peripheralInstance derived_from="CT16B1" id="CT16B1" location="0x40010000"/&gt;&#13;
+&lt;peripheralInstance derived_from="CT32B0" id="CT32B0" location="0x40014000"/&gt;&#13;
+&lt;peripheralInstance derived_from="CT32B1" id="CT32B1" location="0x40018000"/&gt;&#13;
+&lt;peripheralInstance derived_from="ADC" id="ADC" location="0x4001c000"/&gt;&#13;
+&lt;peripheralInstance derived_from="PMU" id="PMU" location="0x40038000"/&gt;&#13;
+&lt;peripheralInstance derived_from="FLASHCTRL" id="FLASHCTRL" location="0x4003c000"/&gt;&#13;
+&lt;peripheralInstance derived_from="SSP0" id="SSP0" location="0x40040000"/&gt;&#13;
+&lt;peripheralInstance derived_from="IOCON" id="IOCON" location="0x40044000"/&gt;&#13;
+&lt;peripheralInstance derived_from="SYSCON" id="SYSCON" location="0x40048000"/&gt;&#13;
+&lt;peripheralInstance derived_from="GPIO-PIN-INT" id="GPIO-PIN-INT" location="0x4004c000"/&gt;&#13;
+&lt;peripheralInstance derived_from="SSP1" id="SSP1" location="0x40058000"/&gt;&#13;
+&lt;peripheralInstance derived_from="GPIO-GROUP-INT0" id="GPIO-GROUP-INT0" location="0x4005c000"/&gt;&#13;
+&lt;peripheralInstance derived_from="GPIO-GROUP-INT1" id="GPIO-GROUP-INT1" location="0x40060000"/&gt;&#13;
+&lt;peripheralInstance derived_from="RITIMER" id="RITIMER" location="0x40064000"/&gt;&#13;
+&lt;peripheralInstance derived_from="USB" id="USB" location="0x40080000"/&gt;&#13;
+&lt;peripheralInstance derived_from="GPIO-PORT" id="GPIO-PORT" location="0x50000000"/&gt;&#13;
+&lt;/chip&gt;&#13;
+&lt;processor&gt;&lt;name gcc_name="cortex-m3"&gt;Cortex-M3&lt;/name&gt;&#13;
+&lt;family&gt;Cortex-M&lt;/family&gt;&#13;
+&lt;/processor&gt;&#13;
+&lt;link href="nxp_lpc13Uxx_peripheral.xme" show="embed" type="simple"/&gt;&#13;
+&lt;/info&gt;&#13;
+&lt;/infoList&gt;&#13;
+&lt;/TargetConfig&gt;</projectStorage>
+	</storageModule>
+</cproject>

+ 84 - 0
demos/device/keyboard/.project

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>device_keyboard</name>
+	<comment></comment>
+	<projects>
+		<project>CMSISv2p10_LPC13Uxx</project>
+		<project>tinyusb</project>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>?name?</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.append_environment</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildArguments</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value>${workspace_loc:/device_keyboard/Debug}</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.contents</key>
+					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>

+ 3 - 3
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_ */

+ 6 - 4
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_
+#ifndef _TUSB_ARCH_LPC134_X_H_
+#define _TUSB_ARCH_LPC134_X_H_
+
+#include "arm_mx.h"
 
 #define ARM ARM_M3
 
-#include "arm_mx.h"
+#define DEVICE_ROMDRIVER
 
-#endif /* ARCH_LPC134X_H_ */
+#endif /* _TUSB_ARCH_LPC134_X_H_ */

+ 3 - 3
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_ */

+ 3 - 3
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_ */

+ 4 - 3
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_ */

+ 3 - 3
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_ */

+ 3 - 3
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_ */

+ 37 - 0
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.
+ */
+

+ 42 - 0
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_ */

+ 69 - 0
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));
+}

+ 8 - 3
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_ */

+ 140 - 0
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__ */

+ 652 - 0
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 <stdint.h>
+
+#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__ */

+ 31 - 0
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__ */

+ 377 - 0
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__ */

+ 249 - 0
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 */
+

+ 342 - 0
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__ */ 

+ 575 - 0
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 <em> Universal Serial Bus Specification, </em>
+ *  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__ */

+ 48 - 0
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__ */

+ 120 - 0
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__ */

+ 264 - 0
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__ */

+ 429 - 0
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__ */

+ 421 - 0
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__ */

+ 456 - 0
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__ */

+ 119 - 0
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__ */

+ 267 - 0
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 (<em>uint8_t** dst</em>). 
+  *          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__ */

+ 93 - 0
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*/
+

+ 88 - 0
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__ */
+

+ 59 - 0
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;
+}

+ 48 - 0
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_ */

+ 28 - 5
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_ */