initial commit
This commit is contained in:
commit
cb58a410f1
378
.cproject
Executable file
378
.cproject
Executable file
@ -0,0 +1,378 @@
|
|||||||
|
<?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="0.1571827594">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594" moduleId="org.eclipse.cdt.core.settings" name="Test stm32 Debug">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<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.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 artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594" name="Test stm32 Debug" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||||
|
<folderInfo id="0.1571827594." name="/" resourcePath="">
|
||||||
|
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1042648408" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||||
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.1042648408.1242504024" name=""/>
|
||||||
|
<builder buildPath="${workspace_loc:/kosmos/software/source}" cleanBuildTarget="APP=test BOARD=stm32f4-discovery DEBUG=y clean" id="org.eclipse.cdt.build.core.settings.default.builder.1575007882" incrementalBuildTarget="APP=test BOARD=stm32f4-discovery DEBUG=y all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.583579175" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.804428440" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1612628392" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1218410972" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.1838895569" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1874409566" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.258587679" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.433020597" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.7772132" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.761231156" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
<cconfiguration id="0.1571827594.174997613">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594.174997613" moduleId="org.eclipse.cdt.core.settings" name="Test msp Debug">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<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.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 artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594.174997613" name="Test msp Debug" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||||
|
<folderInfo id="0.1571827594.174997613." name="/" resourcePath="">
|
||||||
|
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.327393125" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||||
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.327393125.1341728914" name=""/>
|
||||||
|
<builder buildPath="${workspace_loc:/kosmos/software/source}" cleanBuildTarget="APP=test BOARD=msp430-ccrf DEBUG=y clean" id="org.eclipse.cdt.build.core.settings.default.builder.1980477241" incrementalBuildTarget="APP=test BOARD=msp430-ccrf DEBUG=y all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.464187013" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.1267671347" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.124075274" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1771162178" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.232711356" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1728002961" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1364780214" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.1578935810" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1380731118" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.122753866" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
<cconfiguration id="0.1571827594.174997613.1900689539">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594.174997613.1900689539" moduleId="org.eclipse.cdt.core.settings" name="ex_rx msp Debug">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<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.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 artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594.174997613.1900689539" name="ex_rx msp Debug" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||||
|
<folderInfo id="0.1571827594.174997613.1900689539." name="/" resourcePath="">
|
||||||
|
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1286770536" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||||
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.1286770536.1224468357" name=""/>
|
||||||
|
<builder buildPath="${workspace_loc:/kosmos/software/source}" cleanBuildTarget="APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y clean" id="org.eclipse.cdt.build.core.settings.default.builder.1421694571" incrementalBuildTarget="APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1991988272" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.475411451" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.249308527" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.392179448" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.1875431896" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1476643604" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1288125240" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.505450785" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1262658202" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.57566055" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
<cconfiguration id="0.1571827594.174997613.1900689539.492450098">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1571827594.174997613.1900689539.492450098" moduleId="org.eclipse.cdt.core.settings" name="ex_tx msp Debug">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<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.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 artifactName="${ProjName}" buildProperties="" description="" id="0.1571827594.174997613.1900689539.492450098" name="ex_tx msp Debug" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||||
|
<folderInfo id="0.1571827594.174997613.1900689539.492450098." name="/" resourcePath="">
|
||||||
|
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1094764347" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||||
|
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.1094764347.952850815" name=""/>
|
||||||
|
<builder buildPath="${workspace_loc:/kosmos/software/source}" cleanBuildTarget="APP=example_radio_tx BOARD=msp430-ccrf DEBUG=y clean" id="org.eclipse.cdt.build.core.settings.default.builder.2116295870" incrementalBuildTarget="APP=example_radio_tx BOARD=msp430-ccrf DEBUG=y all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.758342814" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.1433637693" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.2098515545" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.895659684" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.710412349" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1891007391" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1691451564" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="org.eclipse.cdt.build.core.settings.holder.428040384" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||||
|
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.1581596466" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
|
||||||
|
<listOptionValue builtIn="false" value="/usr/msp430/include"/>
|
||||||
|
<listOptionValue builtIn="false" value="/usr/lib/gcc/msp430/4.6.3/include/"/>
|
||||||
|
</option>
|
||||||
|
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1127955342" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
</cconfiguration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<project id="kosmos.null.1443255753" name="kosmos"/>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="scannerConfiguration">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
<scannerConfigBuildInfo instanceId="0.1571827594">
|
||||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
|
</scannerConfigBuildInfo>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||||
|
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||||
|
<configuration configurationName="Default">
|
||||||
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
|
</configuration>
|
||||||
|
<configuration configurationName="Test stm32 Debug">
|
||||||
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
|
</configuration>
|
||||||
|
<configuration configurationName="Test Stm Debug">
|
||||||
|
<resource resourceType="PROJECT" workspacePath="/kosmos"/>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
||||||
|
<buildTargets>
|
||||||
|
<target name="msp430-ccrf example_radio_rx all" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="msp430-ccrf example_radio_rx clean" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>clean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="msp430-ccrf example_radio_rx install" path="software/source/test" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_radio_rx BOARD=msp430-ccrf DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>install</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="all" path="software/source/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments/>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="clean" path="software/source/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments/>
|
||||||
|
<buildTarget>clean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="all" path="software/test/firmware/kernel/list" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments/>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="all" path="software/source/test/firmware/kernel/ringbuffer" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments/>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="clean" path="software/source/test/firmware/kernel/ringbuffer" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments/>
|
||||||
|
<buildTarget>clean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>true</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="distclean" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments/>
|
||||||
|
<buildTarget>distclean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="example_semaphore all" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="example_semaphore clean" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>clean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="example_semaphore install" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>install</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="test all" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments> APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="test install" path="source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>install</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="distclean" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildTarget>distclean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="test all" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments> APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="test install" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=test BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>install</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="example_semaphore install" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>install</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="example_semaphore all" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>all</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
<target name="example_semaphore clean" path="software/source" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||||
|
<buildCommand>make</buildCommand>
|
||||||
|
<buildArguments>APP=example_semaphore BOARD=stm32f4-discovery DEBUG=y</buildArguments>
|
||||||
|
<buildTarget>clean</buildTarget>
|
||||||
|
<stopOnError>true</stopOnError>
|
||||||
|
<useDefaultCommand>false</useDefaultCommand>
|
||||||
|
<runAllBuilders>true</runAllBuilders>
|
||||||
|
</target>
|
||||||
|
</buildTargets>
|
||||||
|
</storageModule>
|
||||||
|
</cproject>
|
3
.gitignore
vendored
Executable file
3
.gitignore
vendored
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
release/
|
||||||
|
.settings/
|
||||||
|
|
27
.project
Executable file
27
.project
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>engine_control</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||||
|
<triggers>clean,full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
</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.core.ccnature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
62
config/make/rules.mk
Executable file
62
config/make/rules.mk
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
.PHONY: clean distclean doc
|
||||||
|
|
||||||
|
ROOT_DIR := $(shell pwd | sed "s/\/source//g")
|
||||||
|
|
||||||
|
ifeq ($(BOARD), msp430-ccrf)
|
||||||
|
include $(ROOT_DIR)/config/make/msp430.mk
|
||||||
|
endif
|
||||||
|
ifeq ($(BOARD), stm32f4-discovery)
|
||||||
|
include $(ROOT_DIR)/config/make/stm32f4xx.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS += \
|
||||||
|
-Wno-unused-function \
|
||||||
|
-O$(OPTIM) \
|
||||||
|
$(addprefix -I, $(INCLUDES)) \
|
||||||
|
-Wall
|
||||||
|
|
||||||
|
include $(ROOT_DIR)/config/make/tools.mk
|
||||||
|
|
||||||
|
SRC_DIR = $(ROOT_DIR)/source
|
||||||
|
ifeq ($(DEBUG),y)
|
||||||
|
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/debug
|
||||||
|
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/debug
|
||||||
|
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/debug
|
||||||
|
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/debug
|
||||||
|
else
|
||||||
|
OBJ_DIR = $(ROOT_DIR)/release/object/$(ARCH)/release
|
||||||
|
EXE_DIR = $(ROOT_DIR)/release/execute/$(ARCH)/release
|
||||||
|
MAP_DIR = $(ROOT_DIR)/release/map/$(ARCH)/release
|
||||||
|
SIZE_DIR = $(ROOT_DIR)/release/size/$(ARCH)/release
|
||||||
|
endif
|
||||||
|
DOC_DIR = $(ROOT_DIR)/doc/$(ARCH)
|
||||||
|
TEST_OBJ_DIR = $(ROOT_DIR)/test/object
|
||||||
|
TEST_EXE_DIR = $(ROOT_DIR)/test/execute/
|
||||||
|
|
||||||
|
DOC_SRC :=
|
||||||
|
|
||||||
|
ELF_EXT = .elf
|
||||||
|
BIN_EXT = .bin
|
||||||
|
HEX_EXT = .hex
|
||||||
|
SIZE_EXT = .size
|
||||||
|
TEST_EXT =
|
||||||
|
|
||||||
|
DOXYFILE=$(ROOT_DIR)/config/doxygen/Doxyfile
|
||||||
|
|
||||||
|
define makedep
|
||||||
|
$(CC) -MM \
|
||||||
|
-MF $3 \
|
||||||
|
-MP \
|
||||||
|
-MT $2 \
|
||||||
|
$(CFLAGS) \
|
||||||
|
$1
|
||||||
|
endef
|
||||||
|
|
||||||
|
define maketestdep
|
||||||
|
$(NATIVE_CC) -MM \
|
||||||
|
-MF $3 \
|
||||||
|
-MP \
|
||||||
|
-MT $2 \
|
||||||
|
$(TEST_CFLAGS) \
|
||||||
|
$1
|
||||||
|
endef
|
50
config/make/stm32f4xx.mk
Normal file
50
config/make/stm32f4xx.mk
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
ARCH ?= stm32f4xx
|
||||||
|
ifeq ($(ARCH),stm32f4xx)
|
||||||
|
CFLAGS += -DARCH_STM32F4XX
|
||||||
|
endif
|
||||||
|
ifeq ($(BOARD), stm32f4-discovery)
|
||||||
|
CFLAGS += -DBOARD_STM32F4_DISCOVERY
|
||||||
|
endif
|
||||||
|
CROSS_COMPILE=arm-none-eabi-
|
||||||
|
|
||||||
|
INCLUDES := /opt/arm-2011.03/arm-none-eabi/include
|
||||||
|
|
||||||
|
ifeq ($(DEBUG),y)
|
||||||
|
OPTIM = 0
|
||||||
|
CFLAGS += -g
|
||||||
|
else
|
||||||
|
OPTIM = s
|
||||||
|
LDFLAGS += -s
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS += \
|
||||||
|
-mthumb \
|
||||||
|
-T $(ROOT_DIR)/source/firmware/arch/stm32f4xx/linker/stm32_flash.ld \
|
||||||
|
-D USE_STDPERIPH_DRIVER\
|
||||||
|
-D VECT_TAB_FLASH\
|
||||||
|
-D GCC_ARMCM4\
|
||||||
|
-D THUMB_INTERWORK\
|
||||||
|
-D PACK_STRUCT_END=__attribute\(\(packed\)\)\
|
||||||
|
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\)\
|
||||||
|
-mcpu=cortex-m4 \
|
||||||
|
-mfpu=fpv4-sp-d16 \
|
||||||
|
-mfloat-abi=softfp \
|
||||||
|
-fdata-sections \
|
||||||
|
-ffunction-sections
|
||||||
|
# -D inline= -mthumb\
|
||||||
|
|
||||||
|
LDFLAGS=\
|
||||||
|
-Wl,--gc-sections \
|
||||||
|
-Xlinker -M > $(MAP_DIR)/$(APP).map
|
||||||
|
|
||||||
|
ASFLAGS=-mapcs-32 -g
|
||||||
|
ARFLAGS=rcs
|
||||||
|
|
||||||
|
|
||||||
|
OOCD_IMAGE=$(BINFILE)
|
||||||
|
OOCD_CFG_FILE=$(EXE_DIR)/openocd.cfg
|
||||||
|
|
||||||
|
PRE_PROGRAM = echo "telnet_port 4444\ninit\nreset halt\nflash write_image erase $(OOCD_IMAGE) 0x08000000 bin\nreset run\n shutdown\n" > $(OOCD_CFG_FILE)
|
||||||
|
|
||||||
|
PROGRAM = openocd -f /usr/share/openocd/scripts/board/stm32f4discovery.cfg -f $(OOCD_CFG_FILE)
|
||||||
|
#PROGRAM = st-flash write $(BINFILE) 0x8000000
|
15
config/make/tools.mk
Executable file
15
config/make/tools.mk
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
NATIVE_CC = gcc
|
||||||
|
|
||||||
|
CXX = $(CROSS_COMPILE)g++
|
||||||
|
CC = $(CROSS_COMPILE)gcc
|
||||||
|
AR = $(CROSS_COMPILE)ar
|
||||||
|
LD = $(CROSS_COMPILE)ld
|
||||||
|
SIZE = $(CROSS_COMPILE)size
|
||||||
|
NM = $(CROSS_COMPILE)nm
|
||||||
|
RANLIB = $(CROSS_COMPILE)ranlib
|
||||||
|
OBJCOPY=$(CROSS_COMPILE)objcopy
|
||||||
|
SED = sed
|
||||||
|
RM = rm -f
|
||||||
|
MV = mv
|
||||||
|
CP = cp
|
||||||
|
MKDIR = mkdir -p
|
82
source/Makefile
Executable file
82
source/Makefile
Executable file
@ -0,0 +1,82 @@
|
|||||||
|
##############################################################
|
||||||
|
#
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
include ../config/make/rules.mk
|
||||||
|
|
||||||
|
MAINFILE = $(EXE_DIR)/$(APP)$(ELF_EXT)
|
||||||
|
BINFILE = $(EXE_DIR)/$(APP)$(BIN_EXT)
|
||||||
|
HEXFILE = $(EXE_DIR)/$(APP)$(HEX_EXT)
|
||||||
|
SIZEFILE = $(SIZE_DIR)/$(APP)$(SIZE_EXT)
|
||||||
|
|
||||||
|
INCLUDES += $(SRC_DIR)
|
||||||
|
|
||||||
|
SUB_FOLDER :=
|
||||||
|
SOURCES := $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
ASM_SOURCES := $(wildcard $(SRC_DIR)/*.s)
|
||||||
|
|
||||||
|
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||||
|
ASM_OBJECTS = $(ASMSOURCES:$(SRC_DIR)/%.s=$(OBJ_DIR)/%.o)
|
||||||
|
DEPS = $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.d)
|
||||||
|
|
||||||
|
#include subfolders
|
||||||
|
include application/application.mk
|
||||||
|
include firmware/firmware.mk
|
||||||
|
|
||||||
|
SOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(SRC_DIR)/$(folder)/*.c))
|
||||||
|
ASMSOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(SRC_DIR)/$(folder)/*.s))
|
||||||
|
|
||||||
|
all: $(MAINFILE)
|
||||||
|
|
||||||
|
$(MAINFILE): $(OBJECTS) $(ASM_OBJECTS)
|
||||||
|
@$(MKDIR) $(EXE_DIR)
|
||||||
|
@$(MKDIR) $(MAP_DIR)
|
||||||
|
@$(MKDIR) $(SIZE_DIR)
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(ASM_OBJECTS) -o $(MAINFILE)
|
||||||
|
$(OBJCOPY) $(MAINFILE) -O binary $(BINFILE)
|
||||||
|
$(OBJCOPY) $(MAINFILE) -O ihex $(HEXFILE)
|
||||||
|
$(NM) --size-sort --print-size $(MAINFILE) > $(SIZEFILE)
|
||||||
|
@echo
|
||||||
|
@$(SIZE) --format=berkeley -x $(MAINFILE)
|
||||||
|
@echo
|
||||||
|
|
||||||
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
||||||
|
@rm -rf $(LIB)
|
||||||
|
@$(MKDIR) $(OBJ_DIR)
|
||||||
|
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
||||||
|
$(call makedep,$<,$@,$(subst .o,.d,$@))
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.s
|
||||||
|
@$(MKDIR) $(OBJ_DIR)
|
||||||
|
@$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder)))
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(foreach folder, $(SUB_FOLDER), $(shell rm -f $(OBJ_DIR)/$(folder)/*.o))
|
||||||
|
$(foreach folder, $(SUB_FOLDER), $(shell rm -f $(OBJ_DIR)/$(folder)/*.d))
|
||||||
|
-rm -f $(OBJ_DIR)/*.o \
|
||||||
|
$(OBJ_DIR)/*.d \
|
||||||
|
$(MAINFILE) \
|
||||||
|
$(BINFILE) \
|
||||||
|
$(HEXFILE) \
|
||||||
|
$(SIZEFILE)
|
||||||
|
|
||||||
|
distclean:
|
||||||
|
-rm -rf $(ROOT_DIR)/release
|
||||||
|
|
||||||
|
install: all
|
||||||
|
$(PRE_PROGRAM)
|
||||||
|
$(PROGRAM)
|
||||||
|
|
||||||
|
doc:
|
||||||
|
@$(MKDIR) $(DOC_DIR)
|
||||||
|
(cat $(DOXYFILE) ; echo "INPUT=$(DOC_SRC)" ; echo "OUTPUT_DIRECTORY=$(DOC_DIR)") | doxygen -
|
||||||
|
|
||||||
|
ifneq "$(MAKECMDGOALS)" "clean"
|
||||||
|
-include $(DEPS)
|
||||||
|
else
|
||||||
|
ifneq "$(MAKECMDGOALS)" "distclean"
|
||||||
|
-include $(DEPS)
|
||||||
|
endif
|
||||||
|
endif
|
9
source/application/application.mk
Executable file
9
source/application/application.mk
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
INCLUDES += application
|
||||||
|
DOC_SRC += application
|
||||||
|
|
||||||
|
ifeq ($(APP), example_semaphore)
|
||||||
|
include application/example_semaphore/example_semaphore.mk
|
||||||
|
endif
|
||||||
|
ifeq ($(APP), test)
|
||||||
|
include application/test/test.mk
|
||||||
|
endif
|
3
source/application/example_semaphore/example_semaphore.mk
Executable file
3
source/application/example_semaphore/example_semaphore.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
INCLUDES += application/example_semaphore
|
||||||
|
DOC_SRC += application/example_semaphore
|
||||||
|
SUB_FOLDER += application/example_semaphore
|
51
source/application/example_semaphore/main.c
Normal file
51
source/application/example_semaphore/main.c
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
#include "ctx.h"
|
||||||
|
#include "stack.h"
|
||||||
|
#include "queue.h"
|
||||||
|
#include "thread.h"
|
||||||
|
#include "schedule.h"
|
||||||
|
#include "isr.h"
|
||||||
|
#include "sys_tick.h"
|
||||||
|
#include "semaphore.h"
|
||||||
|
|
||||||
|
#define STACK_SIZE 256
|
||||||
|
static stack_t tc_1_stack[STACK_SIZE];
|
||||||
|
static struct thread_context tc_1;
|
||||||
|
static stack_t tc_2_stack[STACK_SIZE];
|
||||||
|
static struct thread_context tc_2;
|
||||||
|
|
||||||
|
static struct semaphore sem;
|
||||||
|
|
||||||
|
void task2(void *arg)
|
||||||
|
{
|
||||||
|
gpio_open(&led_1);
|
||||||
|
gpio_write(&led_1, 0);
|
||||||
|
while(1) {
|
||||||
|
semaphore_wait(&sem);
|
||||||
|
gpio_toggle(&led_1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void task1(void *arg)
|
||||||
|
{
|
||||||
|
while(1) {
|
||||||
|
sleep_ms(3000);
|
||||||
|
semaphore_post(&sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
board_init();
|
||||||
|
sys_tick_init(&timer_1);
|
||||||
|
|
||||||
|
semaphore_init( &sem, 0);
|
||||||
|
|
||||||
|
thread_create(&tc_1, tc_1_stack, STACK_SIZE, task1, NULL, THREAD_PRIO_LOW);
|
||||||
|
thread_create(&tc_2, tc_2_stack, STACK_SIZE, task2, NULL, THREAD_PRIO_LOW);
|
||||||
|
schedule_start();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
42
source/application/test/main.c
Normal file
42
source/application/test/main.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
#include "ctx.h"
|
||||||
|
#include "stack.h"
|
||||||
|
#include "queue.h"
|
||||||
|
#include "thread.h"
|
||||||
|
#include "schedule.h"
|
||||||
|
#include "isr.h"
|
||||||
|
#include "sys_tick.h"
|
||||||
|
|
||||||
|
#include "ascii_font.h"
|
||||||
|
#include "bitmap.h"
|
||||||
|
|
||||||
|
#define STACK_SIZE 256
|
||||||
|
stack_t tc_1_stack[STACK_SIZE];
|
||||||
|
struct thread_context tc_1;
|
||||||
|
|
||||||
|
void task1(void *arg)
|
||||||
|
{
|
||||||
|
gpio_open(&led_1);
|
||||||
|
gpio_write(&led_1, 0);
|
||||||
|
while(1) {
|
||||||
|
sleep_ms(1000);
|
||||||
|
gpio_toggle(&led_1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
board_init();
|
||||||
|
sys_tick_init(&timer_1);
|
||||||
|
thread_create(&tc_1, tc_1_stack, STACK_SIZE, task1, NULL, THREAD_PRIO_LOW);
|
||||||
|
|
||||||
|
schedule_start();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
3
source/application/test/test.mk
Executable file
3
source/application/test/test.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
INCLUDES += application/test
|
||||||
|
DOC_SRC += application/test
|
||||||
|
SUB_FOLDER += application/test
|
3
source/firmware/arch/arch.mk
Executable file
3
source/firmware/arch/arch.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(ARCH), stm32f4xx)
|
||||||
|
include firmware/arch/stm32f4xx/stm32f4xx.mk
|
||||||
|
endif
|
62
source/firmware/arch/stm32f4xx/__dep/delay.c
Executable file
62
source/firmware/arch/stm32f4xx/__dep/delay.c
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* delay.c
|
||||||
|
*
|
||||||
|
* Created on: Feb 16, 2012
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef BOARD_STM32_H103
|
||||||
|
#include "system_stm32f10x.h"
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_STM32F4_DISCOVERY
|
||||||
|
#include "system_stm32f4xx.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
#define CORRECT 30 // Korrekturfaktor (stm32-h103 - oszi ermittelt (startup code ???)
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
static uint32_t get_div_us(void) {
|
||||||
|
uint32_t us = 1e6;
|
||||||
|
uint32_t ret = SystemCoreClock;
|
||||||
|
ret /= us;
|
||||||
|
if(ret == 0) {
|
||||||
|
ret += 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
static uint32_t get_div_ms(void) {
|
||||||
|
uint32_t ms = 1e3;
|
||||||
|
uint32_t ret = SystemCoreClock;
|
||||||
|
ret /= ms;
|
||||||
|
if(ret == 0) {
|
||||||
|
ret += 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void delay_us(uint32_t delay_us) {
|
||||||
|
uint32_t div = get_div_us();
|
||||||
|
volatile uint64_t count = delay_us * div / CORRECT;
|
||||||
|
|
||||||
|
while(count > 0) {
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void delay_ms(uint32_t delay_ms) {
|
||||||
|
uint32_t div = get_div_ms();
|
||||||
|
volatile uint64_t count = delay_ms * div / CORRECT;
|
||||||
|
|
||||||
|
while(count > 0) {
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
}
|
21
source/firmware/arch/stm32f4xx/__dep/delay.h
Executable file
21
source/firmware/arch/stm32f4xx/__dep/delay.h
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
/*! \file delay.h
|
||||||
|
* \author tkl
|
||||||
|
* \date Feb 16, 2012
|
||||||
|
* \brief Header file of the architecture independent delay tool.
|
||||||
|
*/
|
||||||
|
#ifndef DELAY_H_
|
||||||
|
#define DELAY_H_
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
/*! \brief Loop for microseconds.
|
||||||
|
* \param delay_us microseconds to loop.
|
||||||
|
*/
|
||||||
|
void delay_us(uint32_t delay_us);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
/*! \brief Loop for milliseconds.
|
||||||
|
* \param delay_ms milliseconds to loop.
|
||||||
|
*/
|
||||||
|
void delay_ms(uint32_t delay_ms);
|
||||||
|
|
||||||
|
#endif /* DELAY_H_ */
|
47
source/firmware/arch/stm32f4xx/__dep/print.c
Executable file
47
source/firmware/arch/stm32f4xx/__dep/print.c
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "usbd_cdc_vcp.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Transmit a char, if you want to use printf(),
|
||||||
|
* you need implement this function
|
||||||
|
*
|
||||||
|
* @param pStr Storage string.
|
||||||
|
* @param c Character to write.
|
||||||
|
*/
|
||||||
|
void PrintChar(char c) {
|
||||||
|
/* Send a char like:
|
||||||
|
while(Transfer not completed);
|
||||||
|
Transmit a char;
|
||||||
|
*/
|
||||||
|
USB_VCOM_Send( &c, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Implementation of fputs using the DBGU as the standard output. Required
|
||||||
|
* for printf().
|
||||||
|
*
|
||||||
|
* @param pStr String to write.
|
||||||
|
* @param pStream Output stream.
|
||||||
|
*
|
||||||
|
* @return Number of characters written if successful, or -1 if the output
|
||||||
|
* stream is not stdout or stderr.
|
||||||
|
*/
|
||||||
|
signed int fputs(const char *pStr, FILE *pStream)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
signed int num = 0;
|
||||||
|
while (*pStr != 0) {
|
||||||
|
if (fputc(*pStr, pStream) == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
num++;
|
||||||
|
pStr++;
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
USB_VCOM_Send((char*)pStr, strlen(pStr));
|
||||||
|
return strlen(pStr);
|
||||||
|
}
|
13
source/firmware/arch/stm32f4xx/__dep/print.h
Executable file
13
source/firmware/arch/stm32f4xx/__dep/print.h
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* print.h
|
||||||
|
*
|
||||||
|
* Created on: May 22, 2012
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PRINT_H_
|
||||||
|
#define PRINT_H_
|
||||||
|
|
||||||
|
void PrintChar(char c);
|
||||||
|
|
||||||
|
#endif /* PRINT_H_ */
|
513
source/firmware/arch/stm32f4xx/__dep/printf.c
Executable file
513
source/firmware/arch/stm32f4xx/__dep/printf.c
Executable file
@ -0,0 +1,513 @@
|
|||||||
|
/**************************************************************************//*****
|
||||||
|
* @file printf.c
|
||||||
|
* @brief Implementation of several stdio.h methods, such as printf(),
|
||||||
|
* sprintf() and so on. This reduces the memory footprint of the
|
||||||
|
* binary when using those methods, compared to the libc implementation.
|
||||||
|
********************************************************************************/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "print.h"
|
||||||
|
|
||||||
|
/** Maximum string size allowed (in bytes). */
|
||||||
|
#define MAX_STRING_SIZE 100
|
||||||
|
|
||||||
|
|
||||||
|
/** Required for proper compilation. */
|
||||||
|
struct _reent r = {0, (FILE *) 0, (FILE *) 1, (FILE *) 0};
|
||||||
|
//struct _reent *_impure_ptr = &r;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes a character inside the given string. Returns 1.
|
||||||
|
*
|
||||||
|
* @param pStr Storage string.
|
||||||
|
* @param c Character to write.
|
||||||
|
*/
|
||||||
|
signed int PutChar(char *pStr, char c)
|
||||||
|
{
|
||||||
|
*pStr = c;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes a string inside the given string.
|
||||||
|
*
|
||||||
|
* @param pStr Storage string.
|
||||||
|
* @param pSource Source string.
|
||||||
|
* @return The size of the written
|
||||||
|
*/
|
||||||
|
signed int PutString(char *pStr, const char *pSource)
|
||||||
|
{
|
||||||
|
signed int num = 0;
|
||||||
|
|
||||||
|
while (*pSource != 0) {
|
||||||
|
|
||||||
|
*pStr++ = *pSource++;
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes an unsigned int inside the given string, using the provided fill &
|
||||||
|
* width parameters.
|
||||||
|
*
|
||||||
|
* @param pStr Storage string.
|
||||||
|
* @param fill Fill character.
|
||||||
|
* @param width Minimum integer width.
|
||||||
|
* @param value Integer value.
|
||||||
|
*/
|
||||||
|
signed int PutUnsignedInt(
|
||||||
|
char *pStr,
|
||||||
|
char fill,
|
||||||
|
signed int width,
|
||||||
|
unsigned int value)
|
||||||
|
{
|
||||||
|
signed int num = 0;
|
||||||
|
|
||||||
|
/* Take current digit into account when calculating width */
|
||||||
|
width--;
|
||||||
|
|
||||||
|
/* Recursively write upper digits */
|
||||||
|
if ((value / 10) > 0) {
|
||||||
|
|
||||||
|
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
||||||
|
pStr += num;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write filler characters */
|
||||||
|
else {
|
||||||
|
|
||||||
|
while (width > 0) {
|
||||||
|
|
||||||
|
PutChar(pStr, fill);
|
||||||
|
pStr++;
|
||||||
|
num++;
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write lower digit */
|
||||||
|
num += PutChar(pStr, (value % 10) + '0');
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes a signed int inside the given string, using the provided fill & width
|
||||||
|
* parameters.
|
||||||
|
*
|
||||||
|
* @param pStr Storage string.
|
||||||
|
* @param fill Fill character.
|
||||||
|
* @param width Minimum integer width.
|
||||||
|
* @param value Signed integer value.
|
||||||
|
*/
|
||||||
|
signed int PutSignedInt(
|
||||||
|
char *pStr,
|
||||||
|
char fill,
|
||||||
|
signed int width,
|
||||||
|
signed int value)
|
||||||
|
{
|
||||||
|
signed int num = 0;
|
||||||
|
unsigned int absolute;
|
||||||
|
|
||||||
|
/* Compute absolute value */
|
||||||
|
if (value < 0) {
|
||||||
|
|
||||||
|
absolute = -value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
absolute = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Take current digit into account when calculating width */
|
||||||
|
width--;
|
||||||
|
|
||||||
|
/* Recursively write upper digits */
|
||||||
|
if ((absolute / 10) > 0) {
|
||||||
|
|
||||||
|
if (value < 0) {
|
||||||
|
|
||||||
|
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
||||||
|
}
|
||||||
|
pStr += num;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
/* Reserve space for sign */
|
||||||
|
if (value < 0) {
|
||||||
|
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write filler characters */
|
||||||
|
while (width > 0) {
|
||||||
|
|
||||||
|
PutChar(pStr, fill);
|
||||||
|
pStr++;
|
||||||
|
num++;
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write sign */
|
||||||
|
if (value < 0) {
|
||||||
|
|
||||||
|
num += PutChar(pStr, '-');
|
||||||
|
pStr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write lower digit */
|
||||||
|
num += PutChar(pStr, (absolute % 10) + '0');
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes an hexadecimal value into a string, using the given fill, width &
|
||||||
|
* capital parameters.
|
||||||
|
*
|
||||||
|
* @param pStr Storage string.
|
||||||
|
* @param fill Fill character.
|
||||||
|
* @param width Minimum integer width.
|
||||||
|
* @param maj Indicates if the letters must be printed in lower- or upper-case.
|
||||||
|
* @param value Hexadecimal value.
|
||||||
|
*
|
||||||
|
* @return The number of char written
|
||||||
|
*/
|
||||||
|
signed int PutHexa(
|
||||||
|
char *pStr,
|
||||||
|
char fill,
|
||||||
|
signed int width,
|
||||||
|
unsigned char maj,
|
||||||
|
unsigned int value)
|
||||||
|
{
|
||||||
|
signed int num = 0;
|
||||||
|
|
||||||
|
/* Decrement width */
|
||||||
|
width--;
|
||||||
|
|
||||||
|
/* Recursively output upper digits */
|
||||||
|
if ((value >> 4) > 0) {
|
||||||
|
|
||||||
|
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
||||||
|
pStr += num;
|
||||||
|
}
|
||||||
|
/* Write filler chars */
|
||||||
|
else {
|
||||||
|
|
||||||
|
while (width > 0) {
|
||||||
|
|
||||||
|
PutChar(pStr, fill);
|
||||||
|
pStr++;
|
||||||
|
num++;
|
||||||
|
width--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write current digit */
|
||||||
|
if ((value & 0xF) < 10) {
|
||||||
|
|
||||||
|
PutChar(pStr, (value & 0xF) + '0');
|
||||||
|
}
|
||||||
|
else if (maj) {
|
||||||
|
|
||||||
|
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
||||||
|
}
|
||||||
|
num++;
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Global Functions ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores the result of a formatted string into another string. Format
|
||||||
|
* arguments are given in a va_list instance.
|
||||||
|
*
|
||||||
|
* @param pStr Destination string.
|
||||||
|
* @param length Length of Destination string.
|
||||||
|
* @param pFormat Format string.
|
||||||
|
* @param ap Argument list.
|
||||||
|
*
|
||||||
|
* @return The number of characters written.
|
||||||
|
*/
|
||||||
|
signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
||||||
|
{
|
||||||
|
char fill;
|
||||||
|
unsigned char width;
|
||||||
|
signed int num = 0;
|
||||||
|
signed int size = 0;
|
||||||
|
|
||||||
|
/* Clear the string */
|
||||||
|
if (pStr) {
|
||||||
|
|
||||||
|
*pStr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Phase string */
|
||||||
|
while (*pFormat != 0 && size < length) {
|
||||||
|
|
||||||
|
/* Normal character */
|
||||||
|
if (*pFormat != '%') {
|
||||||
|
|
||||||
|
*pStr++ = *pFormat++;
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
/* Escaped '%' */
|
||||||
|
else if (*(pFormat+1) == '%') {
|
||||||
|
|
||||||
|
*pStr++ = '%';
|
||||||
|
pFormat += 2;
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
/* Token delimiter */
|
||||||
|
else {
|
||||||
|
|
||||||
|
fill = ' ';
|
||||||
|
width = 0;
|
||||||
|
pFormat++;
|
||||||
|
|
||||||
|
/* Parse filler */
|
||||||
|
if (*pFormat == '0') {
|
||||||
|
|
||||||
|
fill = '0';
|
||||||
|
pFormat++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse width */
|
||||||
|
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
||||||
|
|
||||||
|
width = (width*10) + *pFormat-'0';
|
||||||
|
pFormat++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if there is enough space */
|
||||||
|
if (size + width > length) {
|
||||||
|
|
||||||
|
width = length - size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parse type */
|
||||||
|
switch (*pFormat) {
|
||||||
|
case 'd':
|
||||||
|
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
||||||
|
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
||||||
|
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
||||||
|
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
||||||
|
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
||||||
|
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
||||||
|
default:
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
pFormat++;
|
||||||
|
pStr += num;
|
||||||
|
size += num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NULL-terminated (final \0 is not counted) */
|
||||||
|
if (size < length) {
|
||||||
|
|
||||||
|
*pStr = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
*(--pStr) = 0;
|
||||||
|
size--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores the result of a formatted string into another string. Format
|
||||||
|
* arguments are given in a va_list instance.
|
||||||
|
*
|
||||||
|
* @param pStr Destination string.
|
||||||
|
* @param length Length of Destination string.
|
||||||
|
* @param pFormat Format string.
|
||||||
|
* @param ... Other arguments
|
||||||
|
*
|
||||||
|
* @return The number of characters written.
|
||||||
|
*/
|
||||||
|
signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
signed int rc;
|
||||||
|
|
||||||
|
va_start(ap, pFormat);
|
||||||
|
rc = vsnprintf(pString, length, pFormat, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stores the result of a formatted string into another string. Format
|
||||||
|
* arguments are given in a va_list instance.
|
||||||
|
*
|
||||||
|
* @param pString Destination string.
|
||||||
|
* @param length Length of Destination string.
|
||||||
|
* @param pFormat Format string.
|
||||||
|
* @param ap Argument list.
|
||||||
|
*
|
||||||
|
* @return The number of characters written.
|
||||||
|
*/
|
||||||
|
signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
||||||
|
{
|
||||||
|
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Outputs a formatted string on the given stream. Format arguments are given
|
||||||
|
* in a va_list instance.
|
||||||
|
*
|
||||||
|
* @param pStream Output stream.
|
||||||
|
* @param pFormat Format string
|
||||||
|
* @param ap Argument list.
|
||||||
|
*/
|
||||||
|
signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
||||||
|
{
|
||||||
|
char pStr[MAX_STRING_SIZE];
|
||||||
|
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
||||||
|
|
||||||
|
/* Write formatted string in buffer */
|
||||||
|
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
||||||
|
|
||||||
|
fputs(pError, stderr);
|
||||||
|
while (1); /* Increase MAX_STRING_SIZE */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Display string */
|
||||||
|
return fputs(pStr, pStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Outputs a formatted string on the DBGU stream. Format arguments are given
|
||||||
|
* in a va_list instance.
|
||||||
|
*
|
||||||
|
* @param pFormat Format string.
|
||||||
|
* @param ap Argument list.
|
||||||
|
*/
|
||||||
|
signed int vprintf(const char *pFormat, va_list ap)
|
||||||
|
{
|
||||||
|
return vfprintf(stdout, pFormat, ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Outputs a formatted string on the given stream, using a variable
|
||||||
|
* number of arguments.
|
||||||
|
*
|
||||||
|
* @param pStream Output stream.
|
||||||
|
* @param pFormat Format string.
|
||||||
|
*/
|
||||||
|
signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
signed int result;
|
||||||
|
|
||||||
|
/* Forward call to vfprintf */
|
||||||
|
va_start(ap, pFormat);
|
||||||
|
result = vfprintf(pStream, pFormat, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Outputs a formatted string on the DBGU stream, using a variable number of
|
||||||
|
* arguments.
|
||||||
|
*
|
||||||
|
* @param pFormat Format string.
|
||||||
|
*/
|
||||||
|
signed int printf(const char *pFormat, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
signed int result;
|
||||||
|
|
||||||
|
/* Forward call to vprintf */
|
||||||
|
va_start(ap, pFormat);
|
||||||
|
result = vprintf(pFormat, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes a formatted string inside another string.
|
||||||
|
*
|
||||||
|
* @param pStr torage string.
|
||||||
|
* @param pFormat Format string.
|
||||||
|
*/
|
||||||
|
signed int sprintf(char *pStr, const char *pFormat, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
signed int result;
|
||||||
|
|
||||||
|
// Forward call to vsprintf
|
||||||
|
va_start(ap, pFormat);
|
||||||
|
result = vsprintf(pStr, pFormat, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Outputs a string on stdout.
|
||||||
|
*
|
||||||
|
* @param pStr String to output.
|
||||||
|
*/
|
||||||
|
signed int puts(const char *pStr)
|
||||||
|
{
|
||||||
|
return fputs(pStr, stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Implementation of fputc using the DBGU as the standard output. Required
|
||||||
|
* for printf().
|
||||||
|
*
|
||||||
|
* @param c Character to write.
|
||||||
|
* @param pStream Output stream.
|
||||||
|
* @param The character written if successful, or -1 if the output stream is
|
||||||
|
* not stdout or stderr.
|
||||||
|
*/
|
||||||
|
signed int fputc(signed int c, FILE *pStream)
|
||||||
|
{
|
||||||
|
if ((pStream == stdout) || (pStream == stderr)) {
|
||||||
|
|
||||||
|
PrintChar(c);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
}
|
13
source/firmware/arch/stm32f4xx/board/board.h
Executable file
13
source/firmware/arch/stm32f4xx/board/board.h
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
/*! \file board.h
|
||||||
|
* \author tkl
|
||||||
|
* \date Feb 13, 2012
|
||||||
|
* \brief Header file of the board distributor.
|
||||||
|
*/
|
||||||
|
#ifndef BOARD_H_
|
||||||
|
#define BOARD_H_
|
||||||
|
|
||||||
|
#ifdef BOARD_STM32F4_DISCOVERY
|
||||||
|
#include "bsp_stm32f4-discovery.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* BOARD_H_ */
|
6
source/firmware/arch/stm32f4xx/board/board.mk
Executable file
6
source/firmware/arch/stm32f4xx/board/board.mk
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
INCLUDES += firmware/arch/stm32f4xx/board
|
||||||
|
DOC_SRC += firmware/arch/stm32f4xx/board
|
||||||
|
|
||||||
|
ifeq ($(BOARD), stm32f4-discovery)
|
||||||
|
include firmware/arch/stm32f4xx/board/stm32f4-discovery/stm32f4-discovery.mk
|
||||||
|
endif
|
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* bsp_stm32f4-discovery.c
|
||||||
|
*
|
||||||
|
* Created on: May 7, 2012
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bsp_stm32f4-discovery.h"
|
||||||
|
#include "usbd_cdc_vcp.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
volatile int32_t ITM_RxBuffer;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void board_init(void) {
|
||||||
|
SystemInit();
|
||||||
|
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);
|
||||||
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
||||||
|
SysTick_CLKSourceConfig(RCC_SYSCLKSource_PLLCLK);
|
||||||
|
|
||||||
|
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
|
||||||
|
}
|
187
source/firmware/arch/stm32f4xx/board/stm32f4-discovery/bsp_stm32f4-discovery.h
Executable file
187
source/firmware/arch/stm32f4xx/board/stm32f4-discovery/bsp_stm32f4-discovery.h
Executable file
@ -0,0 +1,187 @@
|
|||||||
|
/*! \file bsp_stm32f4-discovery.h
|
||||||
|
* \author tkl
|
||||||
|
* \date Mai 7, 2012
|
||||||
|
* \brief Header file of the board definition for the STM32F4-Discovery board.
|
||||||
|
*/
|
||||||
|
#ifndef BSP_STM32F4_DISCOVERY_H_
|
||||||
|
#define BSP_STM32F4_DISCOVERY_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "ringbuffer.h"
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
#include "stm32f4_gpio.h"
|
||||||
|
#include "stm32_sys_tick.h"
|
||||||
|
|
||||||
|
#include "usb_vport.h"
|
||||||
|
|
||||||
|
// SYSTEM TICK
|
||||||
|
static const enum stm32_sys_tick_time_base stm23_sys_tick_time_base =
|
||||||
|
STM32_SYS_TICK_TIME_BASE_MS;
|
||||||
|
static const struct stm32_sys_tick stm32_sys_tick = {
|
||||||
|
&stm23_sys_tick_time_base,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct loki_timer timer_1 = {
|
||||||
|
(void*)&stm32_sys_tick,
|
||||||
|
&timer_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
// USB
|
||||||
|
static char console_linear_buffer[80];
|
||||||
|
static struct ringbuffer console_buffer = {
|
||||||
|
console_linear_buffer,
|
||||||
|
console_linear_buffer,
|
||||||
|
console_linear_buffer,
|
||||||
|
sizeof(console_linear_buffer),
|
||||||
|
0
|
||||||
|
};
|
||||||
|
static const stm32_usb_vport_t stm32_usb_vport;
|
||||||
|
static const struct uart uart_0 = {
|
||||||
|
&stm32_usb_vport,
|
||||||
|
&usb_vport_fp,
|
||||||
|
&console_buffer
|
||||||
|
};
|
||||||
|
|
||||||
|
// STATUS LED
|
||||||
|
//! \brief Status Led is forwarded to led 4.
|
||||||
|
#define led_1 led_4
|
||||||
|
|
||||||
|
// LED 3
|
||||||
|
static const GPIO_InitTypeDef stm32_f4_discovery_led_3_gpio = {
|
||||||
|
GPIO_Pin_12,
|
||||||
|
GPIO_Mode_OUT,
|
||||||
|
GPIO_Speed_100MHz,
|
||||||
|
GPIO_OType_PP,
|
||||||
|
GPIO_PuPd_NOPULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32_f4_discovery_led_3 = {
|
||||||
|
GPIOD,
|
||||||
|
&stm32_f4_discovery_led_3_gpio,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct gpio led_3 = {
|
||||||
|
(void*)&stm32_f4_discovery_led_3,
|
||||||
|
&gpio_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
// LED 4
|
||||||
|
static const GPIO_InitTypeDef stm32_f4_discovery_led_4_gpio = {
|
||||||
|
GPIO_Pin_13,
|
||||||
|
GPIO_Mode_OUT,
|
||||||
|
GPIO_Speed_100MHz,
|
||||||
|
GPIO_OType_PP,
|
||||||
|
GPIO_PuPd_NOPULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32_f4_discovery_led_4 = {
|
||||||
|
GPIOD,
|
||||||
|
&stm32_f4_discovery_led_4_gpio,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct gpio led_4 = {
|
||||||
|
(void*)&stm32_f4_discovery_led_4,
|
||||||
|
&gpio_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
// LED 5
|
||||||
|
static const GPIO_InitTypeDef stm32_f4_discovery_led_5_gpio = {
|
||||||
|
GPIO_Pin_14,
|
||||||
|
GPIO_Mode_OUT,
|
||||||
|
GPIO_Speed_100MHz,
|
||||||
|
GPIO_OType_PP,
|
||||||
|
GPIO_PuPd_NOPULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32_f4_discovery_led_5 = {
|
||||||
|
GPIOD,
|
||||||
|
&stm32_f4_discovery_led_5_gpio,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct gpio led_5 = {
|
||||||
|
(void*)&stm32_f4_discovery_led_5,
|
||||||
|
&gpio_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
// LED 6
|
||||||
|
static const GPIO_InitTypeDef stm32_f4_discovery_led_6_gpio = {
|
||||||
|
GPIO_Pin_15,
|
||||||
|
GPIO_Mode_OUT,
|
||||||
|
GPIO_Speed_100MHz,
|
||||||
|
GPIO_OType_PP,
|
||||||
|
GPIO_PuPd_NOPULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32_f4_discovery_led_6 = {
|
||||||
|
GPIOD,
|
||||||
|
&stm32_f4_discovery_led_6_gpio,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct gpio led_6 = {
|
||||||
|
(void*)&stm32_f4_discovery_led_6,
|
||||||
|
&gpio_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
// BUTTON
|
||||||
|
static const GPIO_InitTypeDef stm32_f4_discovery_user_button_gpio = {
|
||||||
|
GPIO_Pin_0,
|
||||||
|
GPIO_Mode_IN,
|
||||||
|
GPIO_Speed_100MHz,
|
||||||
|
GPIO_OType_PP,
|
||||||
|
GPIO_PuPd_NOPULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const EXTI_InitTypeDef stm32_f4_discovery_user_button_exti = {
|
||||||
|
EXTI_Line0,
|
||||||
|
EXTI_Mode_Interrupt,
|
||||||
|
EXTI_Trigger_Rising_Falling,
|
||||||
|
ENABLE
|
||||||
|
};
|
||||||
|
|
||||||
|
static const NVIC_InitTypeDef stm32_f4_discovery_user_button_nvic = {
|
||||||
|
EXTI0_IRQn,
|
||||||
|
0x0F,
|
||||||
|
0x0F,
|
||||||
|
ENABLE
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct stm32f4_gpio stm32_f4_discovery_user_button = {
|
||||||
|
GPIOA,
|
||||||
|
&stm32_f4_discovery_user_button_gpio,
|
||||||
|
&stm32_f4_discovery_user_button_exti,
|
||||||
|
&stm32_f4_discovery_user_button_nvic,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct gpio user_button = {
|
||||||
|
(void*)&stm32_f4_discovery_user_button,
|
||||||
|
&gpio_fp
|
||||||
|
};
|
||||||
|
|
||||||
|
//! \brief Setup the hardware of the stm32f4-discovery board.
|
||||||
|
void board_init(void);
|
||||||
|
|
||||||
|
#endif /* BSP_STM32F4_DISCOVERY_H_ */
|
@ -0,0 +1,3 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
||||||
|
DOC_SRC += firmware/arch/stm32f4xx/board/stm32f4-discovery
|
11
source/firmware/arch/stm32f4xx/cpu/cpu.h
Normal file
11
source/firmware/arch/stm32f4xx/cpu/cpu.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
* cpu.h
|
||||||
|
*
|
||||||
|
* Created on: Oct 1, 2015
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CPU_H_
|
||||||
|
#define CPU_H_
|
||||||
|
|
||||||
|
#endif /* CPU_H_ */
|
3
source/firmware/arch/stm32f4xx/cpu/cpu.mk
Executable file
3
source/firmware/arch/stm32f4xx/cpu/cpu.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
INCLUDES += firmware/arch/stm32f4xx/cpu
|
||||||
|
DOC_SRC += firmware/arch/stm32f4xx/cpu
|
||||||
|
|
4
source/firmware/arch/stm32f4xx/driver/driver.mk
Executable file
4
source/firmware/arch/stm32f4xx/driver/driver.mk
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
include firmware/arch/stm32f4xx/driver/gpio/gpio.mk
|
||||||
|
include firmware/arch/stm32f4xx/driver/timer/timer.mk
|
||||||
|
include firmware/arch/stm32f4xx/driver/usb/usb.mk
|
||||||
|
include firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.mk
|
3
source/firmware/arch/stm32f4xx/driver/gpio/gpio.mk
Executable file
3
source/firmware/arch/stm32f4xx/driver/gpio/gpio.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/driver/gpio
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/driver/gpio
|
||||||
|
DOC_SRC += firmware/arch/stm32f4xx/driver/gpio
|
260
source/firmware/arch/stm32f4xx/driver/gpio/stm32f4_gpio.c
Executable file
260
source/firmware/arch/stm32f4xx/driver/gpio/stm32f4_gpio.c
Executable file
@ -0,0 +1,260 @@
|
|||||||
|
//! \file stm32f4_gpio.c
|
||||||
|
//! \author tkl
|
||||||
|
//! \date Mai 8, 2012
|
||||||
|
//! \brief Source file of the stm32f4 architecture dependent gpio driver.
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
|
||||||
|
#include "gpio.h"
|
||||||
|
#include "stm32f4_gpio.h"
|
||||||
|
|
||||||
|
//! \brief Contains data for a callback for an external interrupt.
|
||||||
|
typedef struct {
|
||||||
|
gpio_ext_it_cb_t callback; //!< The call back to be executed.
|
||||||
|
void *param; //!< Parameter for the callback
|
||||||
|
}exti_cb_list_t;
|
||||||
|
|
||||||
|
//! \brief Contains call back data for all 16 exti lines.
|
||||||
|
static struct {
|
||||||
|
exti_cb_list_t callback_list[16]; //!< Call back data list for the exti lines.
|
||||||
|
}gpio_obj;
|
||||||
|
|
||||||
|
static uint8_t gpio_bin2dec(uint16_t bin)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
switch(bin) {
|
||||||
|
case 0x0001: ret = 0; break;
|
||||||
|
case 0x0002: ret = 1; break;
|
||||||
|
case 0x0004: ret = 2; break;
|
||||||
|
case 0x0008: ret = 3; break;
|
||||||
|
case 0x0010: ret = 4; break;
|
||||||
|
case 0x0020: ret = 5; break;
|
||||||
|
case 0x0040: ret = 6; break;
|
||||||
|
case 0x0080: ret = 7; break;
|
||||||
|
case 0x0100: ret = 8; break;
|
||||||
|
case 0x0200: ret = 9; break;
|
||||||
|
case 0x0400: ret = 10; break;
|
||||||
|
case 0x0800: ret = 11; break;
|
||||||
|
case 0x1000: ret = 12; break;
|
||||||
|
case 0x2000: ret = 13; break;
|
||||||
|
case 0x4000: ret = 14; break;
|
||||||
|
case 0x8000: ret = 15; break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gpio_init(const struct stm32f4_gpio *gpio)
|
||||||
|
{
|
||||||
|
uint8_t m_port = 0;
|
||||||
|
uint8_t m_pin = 0;
|
||||||
|
uint32_t clock = 0;
|
||||||
|
if(gpio == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(gpio->port == GPIOA) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOA;
|
||||||
|
m_port = EXTI_PortSourceGPIOA;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOB) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOB;
|
||||||
|
m_port = EXTI_PortSourceGPIOB;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOC) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOC;
|
||||||
|
m_port = EXTI_PortSourceGPIOC;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOD) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOD;
|
||||||
|
m_port = EXTI_PortSourceGPIOD;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOE) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOE;
|
||||||
|
m_port = EXTI_PortSourceGPIOE;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOF) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOF;
|
||||||
|
m_port = EXTI_PortSourceGPIOF;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOG) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOG;
|
||||||
|
m_port = EXTI_PortSourceGPIOG;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOH) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOH;
|
||||||
|
m_port = EXTI_PortSourceGPIOH;
|
||||||
|
}
|
||||||
|
else if(gpio->port == GPIOI) {
|
||||||
|
clock = RCC_AHB1Periph_GPIOI;
|
||||||
|
m_port = EXTI_PortSourceGPIOI;
|
||||||
|
}
|
||||||
|
|
||||||
|
RCC_AHB1PeriphClockCmd(clock, ENABLE);
|
||||||
|
m_pin = gpio_bin2dec(gpio->pin->GPIO_Pin);
|
||||||
|
|
||||||
|
SYSCFG_EXTILineConfig(m_port, m_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32f4_gpio_open(const void *gpio)
|
||||||
|
{
|
||||||
|
struct stm32f4_gpio *this;
|
||||||
|
uint8_t m_pin = 0;
|
||||||
|
|
||||||
|
if(gpio == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
|
gpio_init(this);
|
||||||
|
m_pin = gpio_bin2dec(this->pin->GPIO_Pin);
|
||||||
|
|
||||||
|
GPIO_Init(this->port, (GPIO_InitTypeDef*)this->pin);
|
||||||
|
|
||||||
|
if(this->ext_it_cb != NULL) {
|
||||||
|
gpio_obj.callback_list[m_pin].callback = this->ext_it_cb;
|
||||||
|
gpio_obj.callback_list[m_pin].param = this->param;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((this->exti != NULL) && (this->nvic != NULL)) {
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
||||||
|
EXTI_Init((EXTI_InitTypeDef*)this->exti);
|
||||||
|
NVIC_Init((NVIC_InitTypeDef*)this->nvic);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32f4_gpio_close(const void *gpio)
|
||||||
|
{
|
||||||
|
if(gpio == NULL)
|
||||||
|
return -1;
|
||||||
|
// TODO: deinit exti, nvic & gpio
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char stm32f4_gpio_read(const void *gpio)
|
||||||
|
{
|
||||||
|
struct stm32f4_gpio *this;
|
||||||
|
if(gpio == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
|
return GPIO_ReadOutputDataBit(this->port, this->pin->GPIO_Pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stm32f4_gpio_write(const void *gpio, char byte) {
|
||||||
|
struct stm32f4_gpio *this;
|
||||||
|
if(gpio == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
|
GPIO_WriteBit(this->port, this->pin->GPIO_Pin, (BitAction)byte);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stm32f4_gpio_toggle(const void *gpio)
|
||||||
|
{
|
||||||
|
struct stm32f4_gpio *this;
|
||||||
|
if(gpio == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
|
BitAction act = Bit_SET;
|
||||||
|
if(GPIO_ReadOutputDataBit(this->port, this->pin->GPIO_Pin))
|
||||||
|
act = Bit_RESET;
|
||||||
|
|
||||||
|
GPIO_WriteBit(this->port, this->pin->GPIO_Pin, act);
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32f4_gpio_set_exti_callback(const void *gpio,
|
||||||
|
const void *callback, const void *param)
|
||||||
|
{
|
||||||
|
struct stm32f4_gpio *this;
|
||||||
|
uint8_t pin;
|
||||||
|
if((gpio == NULL) || (callback == NULL))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
this = (struct stm32f4_gpio *)gpio;
|
||||||
|
pin = gpio_bin2dec(this->exti->EXTI_Line);
|
||||||
|
|
||||||
|
gpio_obj.callback_list[pin].callback = (gpio_ext_it_cb_t)callback;
|
||||||
|
gpio_obj.callback_list[pin].param = (void*)param;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI0_IRQn interrupt.
|
||||||
|
void EXTI0_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if(gpio_obj.callback_list[0].callback != NULL) {
|
||||||
|
gpio_ext_it_cb_t cb = gpio_obj.callback_list[0].callback;
|
||||||
|
void *param = gpio_obj.callback_list[0].param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(EXTI_Line0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI1_IRQn interrupt.
|
||||||
|
void EXTI1_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if(gpio_obj.callback_list[1].callback != NULL) {
|
||||||
|
gpio_ext_it_cb_t cb = gpio_obj.callback_list[1].callback;
|
||||||
|
void *param = gpio_obj.callback_list[1].param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(EXTI_Line1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI2_IRQn interrupt.
|
||||||
|
void EXTI2_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if(gpio_obj.callback_list[2].callback != NULL) {
|
||||||
|
gpio_ext_it_cb_t cb = gpio_obj.callback_list[2].callback;
|
||||||
|
void *param = gpio_obj.callback_list[2].param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(EXTI_Line2);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI3_IRQn interrupt.
|
||||||
|
void EXTI3_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if(gpio_obj.callback_list[3].callback != NULL) {
|
||||||
|
gpio_ext_it_cb_t cb = gpio_obj.callback_list[3].callback;
|
||||||
|
void *param = gpio_obj.callback_list[3].param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(EXTI_Line3);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI4_IRQn interrupt.
|
||||||
|
void EXTI4_IRQHandler(void)
|
||||||
|
{
|
||||||
|
if(gpio_obj.callback_list[4].callback != NULL) {
|
||||||
|
gpio_ext_it_cb_t cb = gpio_obj.callback_list[4].callback;
|
||||||
|
void *param = gpio_obj.callback_list[4].param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(EXTI_Line4);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI9_5_IRQn interrupt.
|
||||||
|
void EXTI9_5_IRQHandler(void) {
|
||||||
|
uint32_t exti = 0;
|
||||||
|
uint8_t pin;
|
||||||
|
if(EXTI_GetITStatus(EXTI_Line6))
|
||||||
|
exti = EXTI_Line6;
|
||||||
|
|
||||||
|
pin = gpio_bin2dec(exti);
|
||||||
|
if(gpio_obj.callback_list[pin].callback != NULL) {
|
||||||
|
gpio_ext_it_cb_t cb = gpio_obj.callback_list[pin].callback;
|
||||||
|
void *param = gpio_obj.callback_list[pin].param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(exti);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! \brief The ISR for the EXTI15_10_IRQn interrupt.
|
||||||
|
void EXTI15_10_IRQHandler(void) {
|
||||||
|
// TODO: detect & clear pending bit
|
||||||
|
}
|
62
source/firmware/arch/stm32f4xx/driver/gpio/stm32f4_gpio.h
Executable file
62
source/firmware/arch/stm32f4xx/driver/gpio/stm32f4_gpio.h
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
//! \file stm32f4_gpio.h
|
||||||
|
//! \author tkl
|
||||||
|
//! \date Mai 8, 2012
|
||||||
|
//! \brief Header file of the stm32f4xx architecture dependent gpio driver.
|
||||||
|
#ifndef STM32F4_GPIO_H_
|
||||||
|
#define STM32F4_GPIO_H_
|
||||||
|
|
||||||
|
//! callback for the external interrupt
|
||||||
|
typedef void* (*gpio_ext_it_cb_t)(void*);
|
||||||
|
|
||||||
|
//! \brief stm32f4 gpio device
|
||||||
|
struct stm32f4_gpio {
|
||||||
|
GPIO_TypeDef *port; //!< Gpio port
|
||||||
|
const GPIO_InitTypeDef *pin; //!< Gpio pin
|
||||||
|
const EXTI_InitTypeDef *exti; //!< Gpio exit it (could be NULL)
|
||||||
|
const NVIC_InitTypeDef *nvic; //!< Gpio nvic (could be NULL)
|
||||||
|
gpio_ext_it_cb_t ext_it_cb; //!< Gpio ext it callback (could be NULL)
|
||||||
|
void *param; //!< Parameter for the callback
|
||||||
|
};
|
||||||
|
|
||||||
|
//! \brief Open a gpio.
|
||||||
|
//! \param gpio The gpio to open. Must be of type stm32f4_gpio_t.
|
||||||
|
//! \retval -1 in error case.
|
||||||
|
int stm32f4_gpio_open(const void *gpio);
|
||||||
|
|
||||||
|
//! \brief Close a gpio.
|
||||||
|
//! \param gpio The gpio to close. Must be of type stm32f4_gpio_t.
|
||||||
|
//! \retval -1 in error case.
|
||||||
|
int stm32f4_gpio_close(const void *gpio);
|
||||||
|
|
||||||
|
//! \brief Read a gpio.
|
||||||
|
//! \param gpio The gpio to read. Must be of type stm32f4_gpio_t.
|
||||||
|
//! \return read out value.
|
||||||
|
char stm32f4_gpio_read(const void *gpio);
|
||||||
|
|
||||||
|
//! \brief Write to a gpio.
|
||||||
|
//! \param gpio The gpio to write. Must be of type stm32f4_gpio_t.
|
||||||
|
//! \param byte The data to write.
|
||||||
|
void stm32f4_gpio_write(const void *gpio, char byte);
|
||||||
|
|
||||||
|
//! \brief Toggle a gpio.
|
||||||
|
//! \param gpio The gpio to read. Must be of type stm32f4_gpio_t.
|
||||||
|
void stm32f4_gpio_toggle(const void *gpio);
|
||||||
|
|
||||||
|
//! \brief Set the callback for a gpio pin external interrupt.
|
||||||
|
//! \param gpio The gpio to set call back for. Must be of type stm32f4_gpio_t.
|
||||||
|
//! \param callback The function pointer to call back.
|
||||||
|
//! \param param The parameter for the call back.
|
||||||
|
//! \retval -1 in error case.
|
||||||
|
int stm32f4_gpio_set_exti_callback(const void *gpio, const void *callback,
|
||||||
|
const void *param);
|
||||||
|
|
||||||
|
static const struct gpio_fp gpio_fp = {
|
||||||
|
stm32f4_gpio_open,
|
||||||
|
stm32f4_gpio_close,
|
||||||
|
stm32f4_gpio_read,
|
||||||
|
stm32f4_gpio_write,
|
||||||
|
stm32f4_gpio_toggle,
|
||||||
|
stm32f4_gpio_set_exti_callback
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* STM32F4_GPIO_H_ */
|
77
source/firmware/arch/stm32f4xx/driver/timer/stm32_sys_tick.c
Executable file
77
source/firmware/arch/stm32f4xx/driver/timer/stm32_sys_tick.c
Executable file
@ -0,0 +1,77 @@
|
|||||||
|
//! \file stm32_sys_tick.c
|
||||||
|
//! \author tkl
|
||||||
|
//! \date Feb 15, 2012
|
||||||
|
//! \brief Source file of the stm32f10x architecture dependent sys tick timer implementation.
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
|
||||||
|
#include "stm32_sys_tick.h"
|
||||||
|
#include "stm32f4xx_isr.h"
|
||||||
|
|
||||||
|
struct stm32_sys_tick_obj {
|
||||||
|
stm32_sys_tick_cb_t sys_tick_cb;
|
||||||
|
void *sys_tick_cb_param;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct stm32_sys_tick_obj stm32_sys_tick_obj;
|
||||||
|
|
||||||
|
int stm32_sys_tick_open(const void *sys_tick) {
|
||||||
|
if(sys_tick == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
struct stm32_sys_tick *this = (struct stm32_sys_tick *)sys_tick;
|
||||||
|
uint32_t div = 1000;
|
||||||
|
switch(*this->tick_time_base) {
|
||||||
|
case STM32_SYS_TICK_TIME_BASE_US:
|
||||||
|
div = 1000000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STM32_SYS_TICK_TIME_BASE_MS:
|
||||||
|
div = 1000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(SysTick_Config(SystemCoreClock / div))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32_sys_tick_close(const void *sys_tick)
|
||||||
|
{
|
||||||
|
if(sys_tick == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
SysTick->CTRL = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32_sys_tick_set_cb(const void *sys_tick, const void *callback, const void *param)
|
||||||
|
{
|
||||||
|
if((sys_tick == NULL) || (callback == NULL))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
stm32_sys_tick_obj.sys_tick_cb = (stm32_sys_tick_cb_t)callback;
|
||||||
|
stm32_sys_tick_obj.sys_tick_cb_param = (void*)param;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SysTick_Handler(void)
|
||||||
|
{
|
||||||
|
enter_isr();
|
||||||
|
|
||||||
|
if(stm32_sys_tick_obj.sys_tick_cb != NULL) {
|
||||||
|
stm32_sys_tick_cb_t cb = stm32_sys_tick_obj.sys_tick_cb;
|
||||||
|
void *param = stm32_sys_tick_obj.sys_tick_cb_param;
|
||||||
|
cb(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit_isr();
|
||||||
|
}
|
49
source/firmware/arch/stm32f4xx/driver/timer/stm32_sys_tick.h
Executable file
49
source/firmware/arch/stm32f4xx/driver/timer/stm32_sys_tick.h
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
//! \file stm32_sys_tick.h
|
||||||
|
//! \author tkl
|
||||||
|
//! \date Feb 15, 2012
|
||||||
|
//! \brief Header file of the stm32f10x architecture dependent sys tick timer implementation.
|
||||||
|
#ifndef STM32_SYS_TICK_H_
|
||||||
|
#define STM32_SYS_TICK_H_
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
typedef void* (*stm32_sys_tick_cb_t)(void*); //!< callback for the external interrupt
|
||||||
|
|
||||||
|
//! \brief Type of sys tick base time.
|
||||||
|
enum stm32_sys_tick_time_base {
|
||||||
|
STM32_SYS_TICK_TIME_BASE_NONE = 0, //!< Not init
|
||||||
|
STM32_SYS_TICK_TIME_BASE_US, //!< Tick time = 1 us.
|
||||||
|
STM32_SYS_TICK_TIME_BASE_MS //!< Tick time = 1 ms.
|
||||||
|
};
|
||||||
|
|
||||||
|
//! \brief The sys tick device.
|
||||||
|
struct stm32_sys_tick {
|
||||||
|
const enum stm32_sys_tick_time_base *tick_time_base; //!< time base for the system tick
|
||||||
|
stm32_sys_tick_cb_t sys_tick_cb; //!< callback for the sys tick interrupt
|
||||||
|
void *sys_tick_cb_param; //!< parameter for the callback
|
||||||
|
};
|
||||||
|
|
||||||
|
//! \brief Open a sys tick timer.
|
||||||
|
//! \param sys_tick The sys tick to open. Must be of type const stm32_sys_tick_t*.
|
||||||
|
//! \return -1 in error case.
|
||||||
|
int stm32_sys_tick_open(const void *sys_tick);
|
||||||
|
|
||||||
|
//! \brief Close a sys tick timer.
|
||||||
|
//! \param sys_tick The sys tick to close. Must be of type const stm32_sys_tick_t*.
|
||||||
|
//! \return -1 in error case.
|
||||||
|
int stm32_sys_tick_close(const void *sys_tick);
|
||||||
|
|
||||||
|
//! \brief Set the call back for a sys tick timer.
|
||||||
|
//! \param sys_tick The sys tick to open. Mus be of type const stm32_sys_tick_t*.
|
||||||
|
//! \param callback The function pointer of the call back function.
|
||||||
|
//! \param param The parameter for the call back function.
|
||||||
|
//! \return -1 in error case.
|
||||||
|
int stm32_sys_tick_set_cb(const void *sys_tick, const void *callback, const void *param);
|
||||||
|
|
||||||
|
static const struct timer_fp timer_fp = {
|
||||||
|
stm32_sys_tick_open,
|
||||||
|
stm32_sys_tick_close,
|
||||||
|
stm32_sys_tick_set_cb
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* STM32_SYS_TICK_H_ */
|
3
source/firmware/arch/stm32f4xx/driver/timer/timer.mk
Executable file
3
source/firmware/arch/stm32f4xx/driver/timer/timer.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/driver/timer
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/driver/timer
|
||||||
|
DOC_SRC += firmware/arch/stm32f4xx/driver/timer
|
5
source/firmware/arch/stm32f4xx/driver/usb/usb.mk
Executable file
5
source/firmware/arch/stm32f4xx/driver/usb/usb.mk
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#SUB_FOLDER += firmware/arch/stm32f4xx/driver
|
||||||
|
#INCLUDES += firmware/arch/stm32f4xx/driver
|
||||||
|
#DOC_SRC += firmware/arch/stm32f4xx/driver
|
||||||
|
|
||||||
|
include firmware/arch/stm32f4xx/driver/usb/vcp/vcp.mk
|
191
source/firmware/arch/stm32f4xx/driver/usb/vcp/usb_bsp.c
Executable file
191
source/firmware/arch/stm32f4xx/driver/usb/vcp/usb_bsp.c
Executable file
@ -0,0 +1,191 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_bsp.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file is responsible to offer board support package and is
|
||||||
|
* configurable by user.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_bsp.h"
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP
|
||||||
|
* @brief This file is responsible to offer board support package
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBH_BSP_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBH_BSP_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USB_OTG_BSP_Init
|
||||||
|
* Initilizes BSP configurations
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
|
|
||||||
|
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE);
|
||||||
|
|
||||||
|
/* Configure SOF VBUS ID DM DP Pins */
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |
|
||||||
|
GPIO_Pin_9 |
|
||||||
|
GPIO_Pin_11 |
|
||||||
|
GPIO_Pin_12;
|
||||||
|
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
|
||||||
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ;
|
||||||
|
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ;
|
||||||
|
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ;
|
||||||
|
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ;
|
||||||
|
|
||||||
|
/* this for ID line debug */
|
||||||
|
|
||||||
|
|
||||||
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||||
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||||
|
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ;
|
||||||
|
|
||||||
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
||||||
|
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ;
|
||||||
|
|
||||||
|
/* enable the PWR clock */
|
||||||
|
RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief USB_OTG_BSP_EnableInterrupt
|
||||||
|
* Enabele USB Global interrupt
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
NVIC_InitTypeDef NVIC_InitStructure;
|
||||||
|
|
||||||
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
||||||
|
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
|
||||||
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||||
|
NVIC_Init(&NVIC_InitStructure);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief USB_OTG_BSP_uDelay
|
||||||
|
* This function provides delay time in micro sec
|
||||||
|
* @param usec : Value of delay required in micro sec
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USB_OTG_BSP_uDelay (const uint32_t usec)
|
||||||
|
{
|
||||||
|
uint32_t count = 0;
|
||||||
|
const uint32_t utime = (120 * usec / 7);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( ++count > utime )
|
||||||
|
{
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USB_OTG_BSP_mDelay
|
||||||
|
* This function provides delay time in milli sec
|
||||||
|
* @param msec : Value of delay required in milli sec
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USB_OTG_BSP_mDelay (const uint32_t msec)
|
||||||
|
{
|
||||||
|
USB_OTG_BSP_uDelay(msec * 1000);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
164
source/firmware/arch/stm32f4xx/driver/usb/vcp/usb_conf.h
Executable file
164
source/firmware/arch/stm32f4xx/driver/usb/vcp/usb_conf.h
Executable file
@ -0,0 +1,164 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_conf.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief General low level driver configuration
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USB_CONF__H__
|
||||||
|
#define __USB_CONF__H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF
|
||||||
|
* @brief USB low level driver configuration file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* USB Core and PHY interface configuration.
|
||||||
|
Tip: To avoid modifying these defines each time you need to change the USB
|
||||||
|
configuration, you can declare the needed define in your toolchain
|
||||||
|
compiler preprocessor.
|
||||||
|
*/
|
||||||
|
#ifndef USE_USB_OTG_FS
|
||||||
|
#define USE_USB_OTG_FS
|
||||||
|
#endif /* USE_USB_OTG_FS */
|
||||||
|
|
||||||
|
|
||||||
|
#define USB_OTG_FS_CORE
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* FIFO Size Configuration in Device mode
|
||||||
|
*
|
||||||
|
* (i) Receive data FIFO size = RAM for setup packets +
|
||||||
|
* OUT endpoint control information +
|
||||||
|
* data OUT packets + miscellaneous
|
||||||
|
* Space = ONE 32-bits words
|
||||||
|
* --> RAM for setup packets = 10 spaces
|
||||||
|
* (n is the nbr of CTRL EPs the device core supports)
|
||||||
|
* --> OUT EP CTRL info = 1 space
|
||||||
|
* (one space for status information written to the FIFO along with each
|
||||||
|
* received packet)
|
||||||
|
* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces
|
||||||
|
* (MINIMUM to receive packets)
|
||||||
|
* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces
|
||||||
|
* (if high-bandwidth EP is enabled or multiple isochronous EPs)
|
||||||
|
* --> miscellaneous = 1 space per OUT EP
|
||||||
|
* (one space for transfer complete status information also pushed to the
|
||||||
|
* FIFO with each endpoint's last packet)
|
||||||
|
*
|
||||||
|
* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for
|
||||||
|
* that particular IN EP. More space allocated in the IN EP Tx FIFO results
|
||||||
|
* in a better performance on the USB and can hide latencies on the AHB.
|
||||||
|
*
|
||||||
|
* (iii) TXn min size = 16 words. (n : Transmit FIFO index)
|
||||||
|
* (iv) When a TxFIFO is not used, the Configuration should be as follows:
|
||||||
|
* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
|
||||||
|
* --> Txm can use the space allocated for Txn.
|
||||||
|
* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
|
||||||
|
* --> Txn should be configured with the minimum space of 16 words
|
||||||
|
* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top
|
||||||
|
* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
/****************** USB OTG FS CONFIGURATION **********************************/
|
||||||
|
#ifdef USB_OTG_FS_CORE
|
||||||
|
#define RX_FIFO_FS_SIZE 128
|
||||||
|
#define TX0_FIFO_FS_SIZE 32
|
||||||
|
#define TX1_FIFO_FS_SIZE 128
|
||||||
|
#define TX2_FIFO_FS_SIZE 32
|
||||||
|
#define TX3_FIFO_FS_SIZE 0
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************** USB OTG MODE CONFIGURATION ********************************/
|
||||||
|
|
||||||
|
#define USE_DEVICE_MODE
|
||||||
|
|
||||||
|
|
||||||
|
/****************** C Compilers dependant keywords ****************************/
|
||||||
|
/* In HS mode and when the DMA is used, all variables and data structures dealing
|
||||||
|
with the DMA during the transaction process should be 4-bytes aligned */
|
||||||
|
|
||||||
|
#define __ALIGN_BEGIN
|
||||||
|
#define __ALIGN_END
|
||||||
|
|
||||||
|
|
||||||
|
/* __packed keyword used to decrease the data type alignment to 1-byte */
|
||||||
|
#define __packed __attribute__ ((__packed__))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__USB_CONF__H__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
27
source/firmware/arch/stm32f4xx/driver/usb/vcp/usb_it.c
Executable file
27
source/firmware/arch/stm32f4xx/driver/usb/vcp/usb_it.c
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* usb_it.c
|
||||||
|
*
|
||||||
|
* Created on: May 15, 2012
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
#include "usb_core.h"
|
||||||
|
#include "usbd_core.h"
|
||||||
|
#include "usbd_cdc_core.h"
|
||||||
|
#include "usb_dcd_int.h"
|
||||||
|
|
||||||
|
#include "usb_vport.h"
|
||||||
|
|
||||||
|
void OTG_FS_WKUP_IRQHandler(void) {
|
||||||
|
if(USB_OTG_dev.cfg.low_power) {
|
||||||
|
*(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
|
||||||
|
// TODO!!!
|
||||||
|
// SystemInit();
|
||||||
|
USB_OTG_UngateClock(&USB_OTG_dev);
|
||||||
|
}
|
||||||
|
EXTI_ClearITPendingBit(EXTI_Line18);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OTG_FS_IRQHandler(void) {
|
||||||
|
USBD_OTG_ISR_Handler (&USB_OTG_dev);
|
||||||
|
}
|
||||||
|
|
263
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_cdc_vcp.c
Executable file
263
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_cdc_vcp.c
Executable file
@ -0,0 +1,263 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_cdc_vcp.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Generic media access Layer.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_cdc_vcp.h"
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
LINE_CODING linecoding =
|
||||||
|
{
|
||||||
|
115200, /* baud rate*/
|
||||||
|
0x00, /* stop bits-1*/
|
||||||
|
0x00, /* parity - none*/
|
||||||
|
0x08 /* nb. of bits 8*/
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* These are external variables imported from CDC core to be used for IN
|
||||||
|
transfer management. */
|
||||||
|
extern uint8_t APP_Rx_Buffer []; /* Write CDC received data in this buffer.
|
||||||
|
These data will be sent over USB IN endpoint
|
||||||
|
in the CDC core functions. */
|
||||||
|
extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to
|
||||||
|
start address when writing received data
|
||||||
|
in the buffer APP_Rx_Buffer. */
|
||||||
|
static uint8_t u8PortReady = 0;
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
static uint16_t VCP_Init (void);
|
||||||
|
static uint16_t VCP_DeInit (void);
|
||||||
|
static uint16_t VCP_Ctrl (uint32_t Cmd, uint32_t wValue, uint8_t* Buf, uint32_t Len);
|
||||||
|
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len);
|
||||||
|
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len);
|
||||||
|
|
||||||
|
|
||||||
|
static uint16_t VCP_COMConfig(uint8_t Conf);
|
||||||
|
|
||||||
|
CDC_IF_Prop_TypeDef VCP_fops =
|
||||||
|
{
|
||||||
|
VCP_Init,
|
||||||
|
VCP_DeInit,
|
||||||
|
VCP_Ctrl,
|
||||||
|
VCP_DataTx,
|
||||||
|
VCP_DataRx
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
/**
|
||||||
|
* @brief VCP_Init
|
||||||
|
* Initializes the Media on the STM32
|
||||||
|
* @param None
|
||||||
|
* @retval Result of the opeartion (USBD_OK in all cases)
|
||||||
|
*/
|
||||||
|
static uint16_t VCP_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief VCP_DeInit
|
||||||
|
* DeInitializes the Media on the STM32
|
||||||
|
* @param None
|
||||||
|
* @retval Result of the opeartion (USBD_OK in all cases)
|
||||||
|
*/
|
||||||
|
static uint16_t VCP_DeInit(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief VCP_Ctrl
|
||||||
|
* Manage the CDC class requests
|
||||||
|
* @param Cmd: Command code
|
||||||
|
* @param Buf: Buffer containing command data (request parameters)
|
||||||
|
* @param Len: Number of data to be sent (in bytes)
|
||||||
|
* @retval Result of the opeartion (USBD_OK in all cases)
|
||||||
|
*/
|
||||||
|
static uint16_t VCP_Ctrl (uint32_t Cmd, uint32_t wValue, uint8_t* Buf, uint32_t Len)
|
||||||
|
{
|
||||||
|
uint32_t cacheCmd = 0;
|
||||||
|
switch (Cmd)
|
||||||
|
{
|
||||||
|
case SEND_ENCAPSULATED_COMMAND:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GET_ENCAPSULATED_RESPONSE:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_COMM_FEATURE:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GET_COMM_FEATURE:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CLEAR_COMM_FEATURE:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_LINE_CODING:
|
||||||
|
linecoding.bitrate = (uint32_t)(Buf[0] | (Buf[1] << 8) | (Buf[2] << 16) | (Buf[3] << 24));
|
||||||
|
linecoding.format = Buf[4];
|
||||||
|
linecoding.paritytype = Buf[5];
|
||||||
|
linecoding.datatype = Buf[6];
|
||||||
|
/* Set the new configuration */
|
||||||
|
VCP_COMConfig(OTHER_CONFIG);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GET_LINE_CODING:
|
||||||
|
Buf[0] = (uint8_t)(linecoding.bitrate);
|
||||||
|
Buf[1] = (uint8_t)(linecoding.bitrate >> 8);
|
||||||
|
Buf[2] = (uint8_t)(linecoding.bitrate >> 16);
|
||||||
|
Buf[3] = (uint8_t)(linecoding.bitrate >> 24);
|
||||||
|
Buf[4] = linecoding.format;
|
||||||
|
Buf[5] = linecoding.paritytype;
|
||||||
|
Buf[6] = linecoding.datatype;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET_CONTROL_LINE_STATE:
|
||||||
|
if(wValue & 1)
|
||||||
|
{
|
||||||
|
u8PortReady = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u8PortReady = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SEND_BREAK:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
/* Not needed for this driver */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
cacheCmd = Cmd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief VCP_DataTx
|
||||||
|
* CDC received data to be send over USB IN endpoint are managed in
|
||||||
|
* this function.
|
||||||
|
* @param Buf: Buffer of data to be sent
|
||||||
|
* @param Len: Number of data to be sent (in bytes)
|
||||||
|
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
||||||
|
*/
|
||||||
|
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
|
||||||
|
{
|
||||||
|
uint32_t i = 0;
|
||||||
|
|
||||||
|
for(i=0; i<Len; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (linecoding.datatype == 7)
|
||||||
|
{
|
||||||
|
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i] & 0x7F;
|
||||||
|
}
|
||||||
|
else if (linecoding.datatype == 8)
|
||||||
|
{
|
||||||
|
APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
APP_Rx_ptr_in++;
|
||||||
|
|
||||||
|
/* To avoid buffer overflow */
|
||||||
|
if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
|
||||||
|
{
|
||||||
|
APP_Rx_ptr_in = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void data_in(unsigned char *buffer, unsigned int size);
|
||||||
|
/**
|
||||||
|
* @brief VCP_DataRx
|
||||||
|
* Data received over USB OUT endpoint are sent over CDC interface
|
||||||
|
* through this function.
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
* This function will block any OUT packet reception on USB endpoint
|
||||||
|
* untill exiting this function. If you exit this function before transfer
|
||||||
|
* is complete on CDC interface (ie. using DMA controller) it will result
|
||||||
|
* in receiving more data while previous ones are still not sent.
|
||||||
|
*
|
||||||
|
* @param Buf: Buffer of data to be received
|
||||||
|
* @param Len: Number of data received (in bytes)
|
||||||
|
* @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
|
||||||
|
*/
|
||||||
|
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
|
||||||
|
{
|
||||||
|
data_in(Buf, Len);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief VCP_COMConfig
|
||||||
|
* Configure the COM Port with default values or values received from host.
|
||||||
|
* @param Conf: can be DEFAULT_CONFIG to set the default configuration or OTHER_CONFIG
|
||||||
|
* to set a configuration received from the host.
|
||||||
|
* @retval None.
|
||||||
|
*/
|
||||||
|
static uint16_t VCP_COMConfig(uint8_t Conf)
|
||||||
|
{
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t USB_VCOM_Send(char* buf, uint32_t len)
|
||||||
|
{
|
||||||
|
if(u8PortReady == 1)
|
||||||
|
{
|
||||||
|
return VCP_DataTx((uint8_t*)buf, len);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t USB_VCOM_Receive(char* buf, uint32_t len)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
59
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_cdc_vcp.h
Executable file
59
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_cdc_vcp.h
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_cdc_vcp.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header for usbd_cdc_vcp.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_CDC_VCP_H
|
||||||
|
#define __USBD_CDC_VCP_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
#include "usbd_cdc_core.h"
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Exported typef ------------------------------------------------------------*/
|
||||||
|
/* The following structures groups all needed parameters to be configured for the
|
||||||
|
ComPort. These parameters can modified on the fly by the host through CDC class
|
||||||
|
command class requests. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t bitrate;
|
||||||
|
uint8_t format;
|
||||||
|
uint8_t paritytype;
|
||||||
|
uint8_t datatype;
|
||||||
|
}LINE_CODING;
|
||||||
|
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/* The following define is used to route the USART IRQ handler to be used.
|
||||||
|
The IRQ handler function is implemented in the usbd_cdc_vcp.c file. */
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFAULT_CONFIG 0
|
||||||
|
#define OTHER_CONFIG 1
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
uint16_t USB_VCOM_Send(char* buf, uint32_t len);
|
||||||
|
|
||||||
|
#endif /* __USBD_CDC_VCP_H */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
88
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_conf.h
Executable file
88
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_conf.h
Executable file
@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_conf.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief USB Device configuration file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_CONF__H__
|
||||||
|
#define __USBD_CONF__H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USBD_CFG_MAX_NUM 1
|
||||||
|
#define USBD_ITF_MAX_NUM 1
|
||||||
|
#define USB_MAX_STR_DESC_SIZ 50
|
||||||
|
|
||||||
|
/** @defgroup USB_VCP_Class_Layer_Parameter
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define CDC_IN_EP 0x81 /* EP1 for data IN */
|
||||||
|
#define CDC_OUT_EP 0x01 /* EP1 for data OUT */
|
||||||
|
#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */
|
||||||
|
|
||||||
|
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
|
||||||
|
|
||||||
|
#define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */
|
||||||
|
#define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */
|
||||||
|
|
||||||
|
#define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */
|
||||||
|
#define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer:
|
||||||
|
APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */
|
||||||
|
#define APP_FOPS VCP_fops
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__USBD_CONF__H__
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
303
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_desc.c
Executable file
303
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_desc.c
Executable file
@ -0,0 +1,303 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_desc.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the USBD descriptors and string formating method.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_core.h"
|
||||||
|
#include "usbd_desc.h"
|
||||||
|
#include "usbd_req.h"
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
#include "usb_regs.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC
|
||||||
|
* @brief USBD descriptors module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USBD_VID 0x0483
|
||||||
|
|
||||||
|
#define USBD_PID 0x5740
|
||||||
|
|
||||||
|
/** @defgroup USB_String_Descriptors
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USBD_LANGID_STRING 0x409
|
||||||
|
#define USBD_MANUFACTURER_STRING "NoizeTronics"
|
||||||
|
|
||||||
|
#define USBD_PRODUCT_HS_STRING "cm4_discovery vcp in hs mode"
|
||||||
|
#define USBD_SERIALNUMBER_HS_STRING "00000000050B"
|
||||||
|
|
||||||
|
#define USBD_PRODUCT_FS_STRING "cm4_discovery vcp in fs Mode"
|
||||||
|
#define USBD_SERIALNUMBER_FS_STRING "00000000050C"
|
||||||
|
|
||||||
|
#define USBD_CONFIGURATION_HS_STRING "VCP Config"
|
||||||
|
#define USBD_INTERFACE_HS_STRING "VCP Interface"
|
||||||
|
|
||||||
|
#define USBD_CONFIGURATION_FS_STRING "VCP Config"
|
||||||
|
#define USBD_INTERFACE_FS_STRING "VCP Interface"
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
USBD_DEVICE USR_desc =
|
||||||
|
{
|
||||||
|
USBD_USR_DeviceDescriptor,
|
||||||
|
USBD_USR_LangIDStrDescriptor,
|
||||||
|
USBD_USR_ManufacturerStrDescriptor,
|
||||||
|
USBD_USR_ProductStrDescriptor,
|
||||||
|
USBD_USR_SerialStrDescriptor,
|
||||||
|
USBD_USR_ConfigStrDescriptor,
|
||||||
|
USBD_USR_InterfaceStrDescriptor,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Standard Device Descriptor */
|
||||||
|
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
|
||||||
|
{
|
||||||
|
0x12, /*bLength */
|
||||||
|
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
|
||||||
|
0x00, /*bcdUSB */
|
||||||
|
0x02,
|
||||||
|
0x00, /*bDeviceClass*/
|
||||||
|
0x00, /*bDeviceSubClass*/
|
||||||
|
0x00, /*bDeviceProtocol*/
|
||||||
|
USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/
|
||||||
|
LOBYTE(USBD_VID), /*idVendor*/
|
||||||
|
HIBYTE(USBD_VID), /*idVendor*/
|
||||||
|
LOBYTE(USBD_PID), /*idVendor*/
|
||||||
|
HIBYTE(USBD_PID), /*idVendor*/
|
||||||
|
0x00, /*bcdDevice rel. 2.00*/
|
||||||
|
0x02,
|
||||||
|
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
|
||||||
|
USBD_IDX_PRODUCT_STR, /*Index of product string*/
|
||||||
|
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
|
||||||
|
USBD_CFG_MAX_NUM /*bNumConfigurations*/
|
||||||
|
} ; /* USB_DeviceDescriptor */
|
||||||
|
|
||||||
|
/* USB Standard Device Descriptor */
|
||||||
|
__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END =
|
||||||
|
{
|
||||||
|
USB_LEN_DEV_QUALIFIER_DESC,
|
||||||
|
USB_DESC_TYPE_DEVICE_QUALIFIER,
|
||||||
|
0x00,
|
||||||
|
0x02,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x40,
|
||||||
|
0x01,
|
||||||
|
0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Standard Device Descriptor */
|
||||||
|
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END =
|
||||||
|
{
|
||||||
|
USB_SIZ_STRING_LANGID,
|
||||||
|
USB_DESC_TYPE_STRING,
|
||||||
|
LOBYTE(USBD_LANGID_STRING),
|
||||||
|
HIBYTE(USBD_LANGID_STRING),
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_DeviceDescriptor
|
||||||
|
* return the device descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof(USBD_DeviceDesc);
|
||||||
|
return USBD_DeviceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_LangIDStrDescriptor
|
||||||
|
* return the LangID string descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof(USBD_LangIDDesc);
|
||||||
|
return USBD_LangIDDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_ProductStrDescriptor
|
||||||
|
* return the product string descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if(speed == 0)
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_PRODUCT_HS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_PRODUCT_FS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
return USBD_StrDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_ManufacturerStrDescriptor
|
||||||
|
* return the manufacturer string descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
|
||||||
|
return USBD_StrDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_SerialStrDescriptor
|
||||||
|
* return the serial number string descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
if(speed == USB_OTG_SPEED_HIGH)
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
return USBD_StrDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_ConfigStrDescriptor
|
||||||
|
* return the configuration string descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
if(speed == USB_OTG_SPEED_HIGH)
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
return USBD_StrDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_InterfaceStrDescriptor
|
||||||
|
* return the interface string descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer to data length variable
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length)
|
||||||
|
{
|
||||||
|
if(speed == 0)
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_INTERFACE_HS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_GetString (USBD_INTERFACE_FS_STRING, USBD_StrDesc, length);
|
||||||
|
}
|
||||||
|
return USBD_StrDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
114
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_desc.h
Executable file
114
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_desc.h
Executable file
@ -0,0 +1,114 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_desc.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_desc.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_DESC_H
|
||||||
|
#define __USB_DESC_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_def.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DESC
|
||||||
|
* @brief general defines for the usb device library file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DESC_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USB_DEVICE_DESCRIPTOR_TYPE 0x01
|
||||||
|
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02
|
||||||
|
#define USB_STRING_DESCRIPTOR_TYPE 0x03
|
||||||
|
#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04
|
||||||
|
#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05
|
||||||
|
#define USB_SIZ_DEVICE_DESC 18
|
||||||
|
#define USB_SIZ_STRING_LANGID 4
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC];
|
||||||
|
extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ];
|
||||||
|
extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC];
|
||||||
|
extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC];
|
||||||
|
extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID];
|
||||||
|
extern USBD_DEVICE USR_desc;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_DESC_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length);
|
||||||
|
|
||||||
|
#ifdef USB_SUPPORT_USER_STRING_DESC
|
||||||
|
uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length);
|
||||||
|
#endif /* USB_SUPPORT_USER_STRING_DESC */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_DESC_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
160
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_usr.c
Executable file
160
source/firmware/arch/stm32f4xx/driver/usb/vcp/usbd_usr.c
Executable file
@ -0,0 +1,160 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_usr.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file includes the user application layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_usr.h"
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR
|
||||||
|
* @brief This file includes the user application layer
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
USBD_Usr_cb_TypeDef USR_cb =
|
||||||
|
{
|
||||||
|
USBD_USR_Init,
|
||||||
|
USBD_USR_DeviceReset,
|
||||||
|
USBD_USR_DeviceConfigured,
|
||||||
|
USBD_USR_DeviceSuspended,
|
||||||
|
USBD_USR_DeviceResumed,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_Constants
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_Init
|
||||||
|
* Displays the message on LCD for host lib initialization
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USBD_USR_Init(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_DeviceReset
|
||||||
|
* Displays the message on LCD on device Reset Event
|
||||||
|
* @param speed : device speed
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USBD_USR_DeviceReset(uint8_t speed )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_DeviceConfigured
|
||||||
|
* Displays the message on LCD on device configuration Event
|
||||||
|
* @param None
|
||||||
|
* @retval Staus
|
||||||
|
*/
|
||||||
|
void USBD_USR_DeviceConfigured (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_DeviceSuspended
|
||||||
|
* Displays the message on LCD on device suspend Event
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USBD_USR_DeviceSuspended(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_USR_DeviceResumed
|
||||||
|
* Displays the message on LCD on device resume Event
|
||||||
|
* @param None
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USBD_USR_DeviceResumed(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
3
source/firmware/arch/stm32f4xx/driver/usb/vcp/vcp.mk
Executable file
3
source/firmware/arch/stm32f4xx/driver/usb/vcp/vcp.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/driver/usb/vcp
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/driver/usb/vcp
|
||||||
|
#DOC_SRC += firmware/arch/stm32f4xx/driver/usb/vcp
|
93
source/firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.c
Executable file
93
source/firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.c
Executable file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* drv_usb_vport.c
|
||||||
|
*
|
||||||
|
* Created on: Feb 2, 2012
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "usb_vport.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
struct {
|
||||||
|
const void *callback;
|
||||||
|
const void *parameter;
|
||||||
|
char *buffer;
|
||||||
|
unsigned int size;
|
||||||
|
}usb_vport_obj;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
typedef void* (*stm32_usb_vport_cb_t)(const void*);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_init(const stm32_usb_vport_t *this) {
|
||||||
|
usb_vport_obj.callback = NULL;
|
||||||
|
usb_vport_obj.parameter = NULL;
|
||||||
|
usb_vport_obj.buffer = NULL;
|
||||||
|
usb_vport_obj.size = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_open(const void *this) {
|
||||||
|
// USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_close(const void *this) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_read(const void *this, char *buffer, int size) {
|
||||||
|
int ret = -1;
|
||||||
|
if(size >= usb_vport_obj.size) {
|
||||||
|
// no rest
|
||||||
|
memcpy(buffer, usb_vport_obj.buffer, usb_vport_obj.size);
|
||||||
|
usb_vport_obj.buffer = NULL;
|
||||||
|
ret = usb_vport_obj.size;
|
||||||
|
usb_vport_obj.size = 0;
|
||||||
|
}
|
||||||
|
else if(size < usb_vport_obj.size) {
|
||||||
|
memcpy(buffer, usb_vport_obj.buffer, size);
|
||||||
|
usb_vport_obj.buffer += size;
|
||||||
|
usb_vport_obj.size -= size;
|
||||||
|
ret = size;
|
||||||
|
/*
|
||||||
|
if(NULL != usb_vport_obj.callback) {
|
||||||
|
stm32_usb_vport_cb_t cb = usb_vport_obj.callback;
|
||||||
|
cb(usb_vport_obj.parameter);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_write(const void *this, const char *buffer, int size) {
|
||||||
|
return USB_VCOM_Send((char *)buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_set_cb(const void *this, const void *callback, const void *param) {
|
||||||
|
if(NULL == callback) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
usb_vport_obj.callback = callback;
|
||||||
|
usb_vport_obj.parameter = param;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
extern void data_in(unsigned char *buffer, unsigned int size) {
|
||||||
|
if(NULL != usb_vport_obj.callback) {
|
||||||
|
stm32_usb_vport_cb_t cb = usb_vport_obj.callback;
|
||||||
|
usb_vport_obj.buffer = (char *)buffer;
|
||||||
|
usb_vport_obj.size = size;
|
||||||
|
cb(usb_vport_obj.parameter);
|
||||||
|
}
|
||||||
|
}
|
54
source/firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.h
Executable file
54
source/firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.h
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* drv_usb_vport_interface.h
|
||||||
|
*
|
||||||
|
* Created on: Feb 2, 2012
|
||||||
|
* Author: tkl
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DRV_USB_VPORT_INTERFACE_H_
|
||||||
|
#define DRV_USB_VPORT_INTERFACE_H_
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
#include "usbd_cdc_core.h"
|
||||||
|
#include "usbd_usr.h"
|
||||||
|
#include "usbd_desc.h"
|
||||||
|
#include "usbd_cdc_vcp.h"
|
||||||
|
|
||||||
|
//! \brief Usb Device for stdout, stdin & stderr.
|
||||||
|
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END ;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
typedef struct {
|
||||||
|
}stm32_usb_vport_t;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_init(const stm32_usb_vport_t *this);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//! \brief open the virual com port device
|
||||||
|
int stm32_usb_vport_open(const void *this);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//! \brief close the virual com port device
|
||||||
|
int stm32_usb_vport_close(const void *this);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_read(const void *this, char *buffer, int size);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_write(const void *this, const char *buffer, int size);
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
int stm32_usb_vport_set_cb(const void *this, const void *callback, const void *param);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
static const struct uart_fp usb_vport_fp = {
|
||||||
|
stm32_usb_vport_open,
|
||||||
|
stm32_usb_vport_close,
|
||||||
|
stm32_usb_vport_read,
|
||||||
|
stm32_usb_vport_write,
|
||||||
|
stm32_usb_vport_set_cb
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* DRV_USB_VPORT_INTERFACE_H_ */
|
3
source/firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.mk
Executable file
3
source/firmware/arch/stm32f4xx/driver/usb_vport/usb_vport.mk
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/driver/usb_vport
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/driver/usb_vport
|
||||||
|
DOC_SRC += firmware/arch/stm32f4xx/driver/usb_vport
|
@ -0,0 +1,158 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_audio_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_audio_core.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_AUDIO_CORE_H_
|
||||||
|
#define __USB_AUDIO_CORE_H_
|
||||||
|
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
#include "usbd_req.h"
|
||||||
|
#include "usbd_desc.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio
|
||||||
|
* @brief This file is the Header file for USBD_audio.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */
|
||||||
|
#define AUDIO_OUT_PACKET (uint32_t)(((USBD_AUDIO_FREQ * 2 * 2) /1000))
|
||||||
|
|
||||||
|
/* Number of sub-packets in the audio transfer buffer. You can modify this value but always make sure
|
||||||
|
that it is an even number and higher than 3 */
|
||||||
|
#define OUT_PACKET_NUM 4
|
||||||
|
/* Total size of the audio transfer buffer */
|
||||||
|
#define TOTAL_OUT_BUF_SIZE ((uint32_t)(AUDIO_OUT_PACKET * OUT_PACKET_NUM))
|
||||||
|
|
||||||
|
#define AUDIO_CONFIG_DESC_SIZE 109
|
||||||
|
#define AUDIO_INTERFACE_DESC_SIZE 9
|
||||||
|
#define USB_AUDIO_DESC_SIZ 0x09
|
||||||
|
#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09
|
||||||
|
#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07
|
||||||
|
|
||||||
|
#define AUDIO_DESCRIPTOR_TYPE 0x21
|
||||||
|
#define USB_DEVICE_CLASS_AUDIO 0x01
|
||||||
|
#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
|
||||||
|
#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
|
||||||
|
#define AUDIO_PROTOCOL_UNDEFINED 0x00
|
||||||
|
#define AUDIO_STREAMING_GENERAL 0x01
|
||||||
|
#define AUDIO_STREAMING_FORMAT_TYPE 0x02
|
||||||
|
|
||||||
|
/* Audio Descriptor Types */
|
||||||
|
#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
|
||||||
|
#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
|
||||||
|
|
||||||
|
/* Audio Control Interface Descriptor Subtypes */
|
||||||
|
#define AUDIO_CONTROL_HEADER 0x01
|
||||||
|
#define AUDIO_CONTROL_INPUT_TERMINAL 0x02
|
||||||
|
#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03
|
||||||
|
#define AUDIO_CONTROL_FEATURE_UNIT 0x06
|
||||||
|
|
||||||
|
#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C
|
||||||
|
#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09
|
||||||
|
#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07
|
||||||
|
|
||||||
|
#define AUDIO_CONTROL_MUTE 0x0001
|
||||||
|
|
||||||
|
#define AUDIO_FORMAT_TYPE_I 0x01
|
||||||
|
#define AUDIO_FORMAT_TYPE_III 0x03
|
||||||
|
|
||||||
|
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
|
||||||
|
#define AUDIO_ENDPOINT_GENERAL 0x01
|
||||||
|
|
||||||
|
#define AUDIO_REQ_GET_CUR 0x81
|
||||||
|
#define AUDIO_REQ_SET_CUR 0x01
|
||||||
|
|
||||||
|
#define AUDIO_OUT_STREAMING_CTRL 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
typedef struct _Audio_Fops
|
||||||
|
{
|
||||||
|
uint8_t (*Init) (uint32_t AudioFreq, uint32_t Volume, uint32_t options);
|
||||||
|
uint8_t (*DeInit) (uint32_t options);
|
||||||
|
uint8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd);
|
||||||
|
uint8_t (*VolumeCtl) (uint8_t vol);
|
||||||
|
uint8_t (*MuteCtl) (uint8_t cmd);
|
||||||
|
uint8_t (*PeriodicTC) (uint8_t cmd);
|
||||||
|
uint8_t (*GetState) (void);
|
||||||
|
}AUDIO_FOPS_TypeDef;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define AUDIO_PACKET_SZE(frq) (uint8_t)(((frq * 2 * 2)/1000) & 0xFF), \
|
||||||
|
(uint8_t)((((frq * 2 * 2)/1000) >> 8) & 0xFF)
|
||||||
|
#define SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16))
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern USBD_Class_cb_TypeDef AUDIO_cb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // __USB_AUDIO_CORE_H_
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,117 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_audio_out_if.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_audio_out_if.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_AUDIO_OUT_IF_H_
|
||||||
|
#define __USB_AUDIO_OUT_IF_H_
|
||||||
|
|
||||||
|
#ifdef STM32F2XX
|
||||||
|
#include "stm322xg_usb_audio_codec.h"
|
||||||
|
#elif defined(STM32F10X_CL)
|
||||||
|
#include "stm3210c_usb_audio_codec.h"
|
||||||
|
#endif /* STM32F2XX */
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio
|
||||||
|
* @brief This file is the Header file for USBD_audio.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* Audio Commands enmueration */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
AUDIO_CMD_PLAY = 1,
|
||||||
|
AUDIO_CMD_PAUSE,
|
||||||
|
AUDIO_CMD_STOP,
|
||||||
|
}AUDIO_CMD_TypeDef;
|
||||||
|
|
||||||
|
/* Mute commands */
|
||||||
|
#define AUDIO_MUTE 0x01
|
||||||
|
#define AUDIO_UNMUTE 0x00
|
||||||
|
|
||||||
|
/* Functions return value */
|
||||||
|
#define AUDIO_OK 0x00
|
||||||
|
#define AUDIO_FAIL 0xFF
|
||||||
|
|
||||||
|
/* Audio Machine States */
|
||||||
|
#define AUDIO_STATE_INACTIVE 0x00
|
||||||
|
#define AUDIO_STATE_ACTIVE 0x01
|
||||||
|
#define AUDIO_STATE_PLAYING 0x02
|
||||||
|
#define AUDIO_STATE_PAUSED 0x03
|
||||||
|
#define AUDIO_STATE_STOPPED 0x04
|
||||||
|
#define AUDIO_STATE_ERROR 0x05
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern AUDIO_FOPS_TypeDef AUDIO_OUT_fops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USB_AUDIO_OUT_IF_H_ */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,665 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_audio_core.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the high layer firmware functions to manage the
|
||||||
|
* following functionalities of the USB Audio Class:
|
||||||
|
* - Initialization and Configuration of high and low layer
|
||||||
|
* - Enumeration as Audio Streaming Device
|
||||||
|
* - Audio Streaming data transfer
|
||||||
|
* - AudioControl requests management
|
||||||
|
* - Error management
|
||||||
|
*
|
||||||
|
* @verbatim
|
||||||
|
*
|
||||||
|
* ===================================================================
|
||||||
|
* Audio Class Driver Description
|
||||||
|
* ===================================================================
|
||||||
|
* This driver manages the Audio Class 1.0 following the "USB Device Class Definition for
|
||||||
|
* Audio Devices V1.0 Mar 18, 98".
|
||||||
|
* This driver implements the following aspects of the specification:
|
||||||
|
* - Device descriptor management
|
||||||
|
* - Configuration descriptor management
|
||||||
|
* - Standard AC Interface Descriptor management
|
||||||
|
* - 1 Audio Streaming Interface (with single channel, PCM, Stereo mode)
|
||||||
|
* - 1 Audio Streaming Endpoint
|
||||||
|
* - 1 Audio Terminal Input (1 channel)
|
||||||
|
* - Audio Class-Specific AC Interfaces
|
||||||
|
* - Audio Class-Specific AS Interfaces
|
||||||
|
* - AudioControl Requests: only SET_CUR and GET_CUR requests are supported (for Mute)
|
||||||
|
* - Audio Feature Unit (limited to Mute control)
|
||||||
|
* - Audio Synchronization type: Asynchronous
|
||||||
|
* - Single fixed audio sampling rate (configurable in usbd_conf.h file)
|
||||||
|
*
|
||||||
|
* @note
|
||||||
|
* The Audio Class 1.0 is based on USB Specification 1.0 and thus supports only
|
||||||
|
* Low and Full speed modes and does not allow High Speed transfers.
|
||||||
|
* Please refer to "USB Device Class Definition for Audio Devices V1.0 Mar 18, 98"
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* These aspects may be enriched or modified for a specific user application.
|
||||||
|
*
|
||||||
|
* This driver doesn't implement the following aspects of the specification
|
||||||
|
* (but it is possible to manage these features with some modifications on this driver):
|
||||||
|
* - AudioControl Endpoint management
|
||||||
|
* - AudioControl requsests other than SET_CUR and GET_CUR
|
||||||
|
* - Abstraction layer for AudioControl requests (only Mute functionality is managed)
|
||||||
|
* - Audio Synchronization type: Adaptive
|
||||||
|
* - Audio Compression modules and interfaces
|
||||||
|
* - MIDI interfaces and modules
|
||||||
|
* - Mixer/Selector/Processing/Extension Units (Feature unit is limited to Mute control)
|
||||||
|
* - Any other application-specific modules
|
||||||
|
* - Multiple and Variable audio sampling rates
|
||||||
|
* - Out Streaming Endpoint/Interface (microphone)
|
||||||
|
*
|
||||||
|
* @endverbatim
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "usbd_audio_core.h"
|
||||||
|
#include "usbd_audio_out_if.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio
|
||||||
|
* @brief usbd core module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
AUDIO Device library callbacks
|
||||||
|
*********************************************/
|
||||||
|
static uint8_t usbd_audio_Init (void *pdev, uint8_t cfgidx);
|
||||||
|
static uint8_t usbd_audio_DeInit (void *pdev, uint8_t cfgidx);
|
||||||
|
static uint8_t usbd_audio_Setup (void *pdev, USB_SETUP_REQ *req);
|
||||||
|
static uint8_t usbd_audio_EP0_RxReady(void *pdev);
|
||||||
|
static uint8_t usbd_audio_DataIn (void *pdev, uint8_t epnum);
|
||||||
|
static uint8_t usbd_audio_DataOut (void *pdev, uint8_t epnum);
|
||||||
|
static uint8_t usbd_audio_SOF (void *pdev);
|
||||||
|
static uint8_t usbd_audio_OUT_Incplt (void *pdev);
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
AUDIO Requests management functions
|
||||||
|
*********************************************/
|
||||||
|
static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req);
|
||||||
|
static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req);
|
||||||
|
static uint8_t *USBD_audio_GetCfgDesc (uint8_t speed, uint16_t *length);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* Main Buffer for Audio Data Out transfers and its relative pointers */
|
||||||
|
uint8_t IsocOutBuff [TOTAL_OUT_BUF_SIZE * 2];
|
||||||
|
uint8_t* IsocOutWrPtr = IsocOutBuff;
|
||||||
|
uint8_t* IsocOutRdPtr = IsocOutBuff;
|
||||||
|
|
||||||
|
/* Main Buffer for Audio Control Rrequests transfers and its relative variables */
|
||||||
|
uint8_t AudioCtl[64];
|
||||||
|
uint8_t AudioCtlCmd = 0;
|
||||||
|
uint32_t AudioCtlLen = 0;
|
||||||
|
uint8_t AudioCtlUnit = 0;
|
||||||
|
|
||||||
|
static uint32_t PlayFlag = 0;
|
||||||
|
|
||||||
|
static __IO uint32_t usbd_audio_AltSet = 0;
|
||||||
|
static uint8_t usbd_audio_CfgDesc[AUDIO_CONFIG_DESC_SIZE];
|
||||||
|
|
||||||
|
/* AUDIO interface class callbacks structure */
|
||||||
|
USBD_Class_cb_TypeDef AUDIO_cb =
|
||||||
|
{
|
||||||
|
usbd_audio_Init,
|
||||||
|
usbd_audio_DeInit,
|
||||||
|
usbd_audio_Setup,
|
||||||
|
NULL, /* EP0_TxSent */
|
||||||
|
usbd_audio_EP0_RxReady,
|
||||||
|
usbd_audio_DataIn,
|
||||||
|
usbd_audio_DataOut,
|
||||||
|
usbd_audio_SOF,
|
||||||
|
NULL,
|
||||||
|
usbd_audio_OUT_Incplt,
|
||||||
|
USBD_audio_GetCfgDesc,
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
USBD_audio_GetCfgDesc, /* use same config as per FS */
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* USB AUDIO device Configuration Descriptor */
|
||||||
|
static uint8_t usbd_audio_CfgDesc[AUDIO_CONFIG_DESC_SIZE] =
|
||||||
|
{
|
||||||
|
/* Configuration 1 */
|
||||||
|
0x09, /* bLength */
|
||||||
|
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
LOBYTE(AUDIO_CONFIG_DESC_SIZE), /* wTotalLength 109 bytes*/
|
||||||
|
HIBYTE(AUDIO_CONFIG_DESC_SIZE),
|
||||||
|
0x02, /* bNumInterfaces */
|
||||||
|
0x01, /* bConfigurationValue */
|
||||||
|
0x00, /* iConfiguration */
|
||||||
|
0xC0, /* bmAttributes BUS Powred*/
|
||||||
|
0x32, /* bMaxPower = 100 mA*/
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Standard interface descriptor */
|
||||||
|
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
0x00, /* bInterfaceNumber */
|
||||||
|
0x00, /* bAlternateSetting */
|
||||||
|
0x00, /* bNumEndpoints */
|
||||||
|
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
||||||
|
AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */
|
||||||
|
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
||||||
|
0x00, /* iInterface */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Class-specific AC Interface Descriptor */
|
||||||
|
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */
|
||||||
|
0x00, /* 1.00 */ /* bcdADC */
|
||||||
|
0x01,
|
||||||
|
0x27, /* wTotalLength = 39*/
|
||||||
|
0x00,
|
||||||
|
0x01, /* bInCollection */
|
||||||
|
0x01, /* baInterfaceNr */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Input Terminal Descriptor */
|
||||||
|
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
|
||||||
|
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */
|
||||||
|
0x01, /* bTerminalID */
|
||||||
|
0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */
|
||||||
|
0x01,
|
||||||
|
0x00, /* bAssocTerminal */
|
||||||
|
0x01, /* bNrChannels */
|
||||||
|
0x00, /* wChannelConfig 0x0000 Mono */
|
||||||
|
0x00,
|
||||||
|
0x00, /* iChannelNames */
|
||||||
|
0x00, /* iTerminal */
|
||||||
|
/* 12 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Audio Feature Unit Descriptor */
|
||||||
|
0x09, /* bLength */
|
||||||
|
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */
|
||||||
|
AUDIO_OUT_STREAMING_CTRL, /* bUnitID */
|
||||||
|
0x01, /* bSourceID */
|
||||||
|
0x01, /* bControlSize */
|
||||||
|
AUDIO_CONTROL_MUTE, /* bmaControls(0) */
|
||||||
|
0x00, /* bmaControls(1) */
|
||||||
|
0x00, /* iTerminal */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/*USB Speaker Output Terminal Descriptor */
|
||||||
|
0x09, /* bLength */
|
||||||
|
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */
|
||||||
|
0x03, /* bTerminalID */
|
||||||
|
0x01, /* wTerminalType 0x0301*/
|
||||||
|
0x03,
|
||||||
|
0x00, /* bAssocTerminal */
|
||||||
|
0x02, /* bSourceID */
|
||||||
|
0x00, /* iTerminal */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */
|
||||||
|
/* Interface 1, Alternate Setting 0 */
|
||||||
|
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
0x01, /* bInterfaceNumber */
|
||||||
|
0x00, /* bAlternateSetting */
|
||||||
|
0x00, /* bNumEndpoints */
|
||||||
|
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
||||||
|
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
||||||
|
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
||||||
|
0x00, /* iInterface */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
|
||||||
|
/* Interface 1, Alternate Setting 1 */
|
||||||
|
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
0x01, /* bInterfaceNumber */
|
||||||
|
0x01, /* bAlternateSetting */
|
||||||
|
0x01, /* bNumEndpoints */
|
||||||
|
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
||||||
|
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
||||||
|
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
||||||
|
0x00, /* iInterface */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Audio Streaming Interface Descriptor */
|
||||||
|
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */
|
||||||
|
0x01, /* bTerminalLink */
|
||||||
|
0x01, /* bDelay */
|
||||||
|
0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001*/
|
||||||
|
0x00,
|
||||||
|
/* 07 byte*/
|
||||||
|
|
||||||
|
/* USB Speaker Audio Type III Format Interface Descriptor */
|
||||||
|
0x0B, /* bLength */
|
||||||
|
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */
|
||||||
|
AUDIO_FORMAT_TYPE_III, /* bFormatType */
|
||||||
|
0x02, /* bNrChannels */
|
||||||
|
0x02, /* bSubFrameSize : 2 Bytes per frame (16bits) */
|
||||||
|
16, /* bBitResolution (16-bits per sample) */
|
||||||
|
0x01, /* bSamFreqType only one frequency supported */
|
||||||
|
SAMPLE_FREQ(USBD_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */
|
||||||
|
/* 11 byte*/
|
||||||
|
|
||||||
|
/* Endpoint 1 - Standard Descriptor */
|
||||||
|
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_OUT_EP, /* bEndpointAddress 1 out endpoint*/
|
||||||
|
USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */
|
||||||
|
AUDIO_PACKET_SZE(USBD_AUDIO_FREQ), /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */
|
||||||
|
0x01, /* bInterval */
|
||||||
|
0x00, /* bRefresh */
|
||||||
|
0x00, /* bSynchAddress */
|
||||||
|
/* 09 byte*/
|
||||||
|
|
||||||
|
/* Endpoint - Audio Streaming Descriptor*/
|
||||||
|
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
|
||||||
|
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
AUDIO_ENDPOINT_GENERAL, /* bDescriptor */
|
||||||
|
0x00, /* bmAttributes */
|
||||||
|
0x00, /* bLockDelayUnits */
|
||||||
|
0x00, /* wLockDelay */
|
||||||
|
0x00,
|
||||||
|
/* 07 byte*/
|
||||||
|
} ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_Init
|
||||||
|
* Initilaizes the AUDIO interface.
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: Configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_Init (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
/* Open EP OUT */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
AUDIO_OUT_EP,
|
||||||
|
AUDIO_OUT_PACKET,
|
||||||
|
USB_OTG_EP_ISOC);
|
||||||
|
|
||||||
|
/* Initialize the Audio output Hardware layer */
|
||||||
|
if (AUDIO_OUT_fops.Init(USBD_AUDIO_FREQ, DEFAULT_VOLUME, 0) != USBD_OK)
|
||||||
|
{
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepare Out endpoint to receive audio data */
|
||||||
|
DCD_EP_PrepareRx(pdev,
|
||||||
|
AUDIO_OUT_EP,
|
||||||
|
(uint8_t*)IsocOutBuff,
|
||||||
|
AUDIO_OUT_PACKET);
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_Init
|
||||||
|
* DeInitializes the AUDIO layer.
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: Configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_DeInit (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
DCD_EP_Close (pdev , AUDIO_OUT_EP);
|
||||||
|
|
||||||
|
/* DeInitialize the Audio output Hardware layer */
|
||||||
|
if (AUDIO_OUT_fops.DeInit(0) != USBD_OK)
|
||||||
|
{
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_Setup
|
||||||
|
* Handles the Audio control request parsing.
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param req: usb requests
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_Setup (void *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
uint16_t len;
|
||||||
|
uint8_t *pbuf;
|
||||||
|
|
||||||
|
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
||||||
|
{
|
||||||
|
/* AUDIO Class Requests -------------------------------*/
|
||||||
|
case USB_REQ_TYPE_CLASS :
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case AUDIO_REQ_GET_CUR:
|
||||||
|
AUDIO_Req_GetCurrent(pdev, req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AUDIO_REQ_SET_CUR:
|
||||||
|
AUDIO_Req_SetCurrent(pdev, req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError (pdev, req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Standard Requests -------------------------------*/
|
||||||
|
case USB_REQ_TYPE_STANDARD:
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case USB_REQ_GET_DESCRIPTOR:
|
||||||
|
if( (req->wValue >> 8) == AUDIO_DESCRIPTOR_TYPE)
|
||||||
|
{
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
pbuf = usbd_audio_Desc;
|
||||||
|
#else
|
||||||
|
pbuf = usbd_audio_CfgDesc + 18;
|
||||||
|
#endif
|
||||||
|
len = MIN(USB_AUDIO_DESC_SIZ , req->wLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
pbuf,
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_INTERFACE :
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&usbd_audio_AltSet,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_SET_INTERFACE :
|
||||||
|
if ((uint8_t)(req->wValue) < AUDIO_TOTAL_IF_NUM)
|
||||||
|
{
|
||||||
|
usbd_audio_AltSet = (uint8_t)(req->wValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Call the error management function (command will be nacked */
|
||||||
|
USBD_CtlError (pdev, req);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_EP0_RxReady
|
||||||
|
* Handles audio control requests data.
|
||||||
|
* @param pdev: device device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_EP0_RxReady (void *pdev)
|
||||||
|
{
|
||||||
|
/* Check if an AudioControl request has been issued */
|
||||||
|
if (AudioCtlCmd == AUDIO_REQ_SET_CUR)
|
||||||
|
{/* In this driver, to simplify code, only SET_CUR request is managed */
|
||||||
|
/* Check for which addressed unit the AudioControl request has been issued */
|
||||||
|
if (AudioCtlUnit == AUDIO_OUT_STREAMING_CTRL)
|
||||||
|
{/* In this driver, to simplify code, only one unit is manage */
|
||||||
|
/* Call the audio interface mute function */
|
||||||
|
AUDIO_OUT_fops.MuteCtl(AudioCtl[0]);
|
||||||
|
|
||||||
|
/* Reset the AudioCtlCmd variable to prevent re-entering this function */
|
||||||
|
AudioCtlCmd = 0;
|
||||||
|
AudioCtlLen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_DataIn
|
||||||
|
* Handles the audio IN data stage.
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param epnum: endpoint number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_DataIn (void *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_DataOut
|
||||||
|
* Handles the Audio Out data stage.
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param epnum: endpoint number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_DataOut (void *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
if (epnum == AUDIO_OUT_EP)
|
||||||
|
{
|
||||||
|
/* Increment the Buffer pointer or roll it back when all buffers are full */
|
||||||
|
if (IsocOutWrPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM)))
|
||||||
|
{/* All buffers are full: roll back */
|
||||||
|
IsocOutWrPtr = IsocOutBuff;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{/* Increment the buffer pointer */
|
||||||
|
IsocOutWrPtr += AUDIO_OUT_PACKET;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Toggle the frame index */
|
||||||
|
((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].even_odd_frame =
|
||||||
|
(((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].even_odd_frame)? 0:1;
|
||||||
|
|
||||||
|
/* Prepare Out endpoint to receive next audio packet */
|
||||||
|
DCD_EP_PrepareRx(pdev,
|
||||||
|
AUDIO_OUT_EP,
|
||||||
|
(uint8_t*)(IsocOutWrPtr),
|
||||||
|
AUDIO_OUT_PACKET);
|
||||||
|
|
||||||
|
/* Trigger the start of streaming only when half buffer is full */
|
||||||
|
if ((PlayFlag == 0) && (IsocOutWrPtr >= (IsocOutBuff + ((AUDIO_OUT_PACKET * OUT_PACKET_NUM) / 2))))
|
||||||
|
{
|
||||||
|
/* Enable start of Streaming */
|
||||||
|
PlayFlag = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_SOF
|
||||||
|
* Handles the SOF event (data buffer update and synchronization).
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param epnum: endpoint number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_SOF (void *pdev)
|
||||||
|
{
|
||||||
|
/* Check if there are available data in stream buffer.
|
||||||
|
In this function, a single variable (PlayFlag) is used to avoid software delays.
|
||||||
|
The play operation must be executed as soon as possible after the SOF detection. */
|
||||||
|
if (PlayFlag)
|
||||||
|
{
|
||||||
|
/* Start playing received packet */
|
||||||
|
AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutRdPtr), /* Samples buffer pointer */
|
||||||
|
AUDIO_OUT_PACKET, /* Number of samples in Bytes */
|
||||||
|
AUDIO_CMD_PLAY); /* Command to be processed */
|
||||||
|
|
||||||
|
/* Increment the Buffer pointer or roll it back when all buffers all full */
|
||||||
|
if (IsocOutRdPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM)))
|
||||||
|
{/* Roll back to the start of buffer */
|
||||||
|
IsocOutRdPtr = IsocOutBuff;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{/* Increment to the next sub-buffer */
|
||||||
|
IsocOutRdPtr += AUDIO_OUT_PACKET;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If all available buffers have been consumed, stop playing */
|
||||||
|
if (IsocOutRdPtr == IsocOutWrPtr)
|
||||||
|
{
|
||||||
|
/* Pause the audio stream */
|
||||||
|
AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutBuff), /* Samples buffer pointer */
|
||||||
|
AUDIO_OUT_PACKET, /* Number of samples in Bytes */
|
||||||
|
AUDIO_CMD_PAUSE); /* Command to be processed */
|
||||||
|
|
||||||
|
/* Stop entering play loop */
|
||||||
|
PlayFlag = 0;
|
||||||
|
|
||||||
|
/* Reset buffer pointers */
|
||||||
|
IsocOutRdPtr = IsocOutBuff;
|
||||||
|
IsocOutWrPtr = IsocOutBuff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_OUT_Incplt
|
||||||
|
* Handles the iso out incomplete event.
|
||||||
|
* @param pdev: instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_audio_OUT_Incplt (void *pdev)
|
||||||
|
{
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
AUDIO Class requests management
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief AUDIO_Req_GetCurrent
|
||||||
|
* Handles the GET_CUR Audio control request.
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param req: setup class request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
/* Send the current mute state */
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
AudioCtl,
|
||||||
|
req->wLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AUDIO_Req_SetCurrent
|
||||||
|
* Handles the SET_CUR Audio control request.
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param req: setup class request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
if (req->wLength)
|
||||||
|
{
|
||||||
|
/* Prepare the reception of the buffer over EP0 */
|
||||||
|
USBD_CtlPrepareRx (pdev,
|
||||||
|
AudioCtl,
|
||||||
|
req->wLength);
|
||||||
|
|
||||||
|
/* Set the global variables indicating current request and its length
|
||||||
|
to the function usbd_audio_EP0_RxReady() which will process the request */
|
||||||
|
AudioCtlCmd = AUDIO_REQ_SET_CUR; /* Set the request value */
|
||||||
|
AudioCtlLen = req->wLength; /* Set the request data length */
|
||||||
|
AudioCtlUnit = HIBYTE(req->wIndex); /* Set the request target unit */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_audio_GetCfgDesc
|
||||||
|
* Returns configuration descriptor.
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer data length
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
static uint8_t *USBD_audio_GetCfgDesc (uint8_t speed, uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof (usbd_audio_CfgDesc);
|
||||||
|
return usbd_audio_CfgDesc;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,318 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_audio_out_if.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the Audio Out (palyback) interface API.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_audio_core.h"
|
||||||
|
#include "usbd_audio_out_if.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if
|
||||||
|
* @brief usbd out interface module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
static uint8_t Init (uint32_t AudioFreq, uint32_t Volume, uint32_t options);
|
||||||
|
static uint8_t DeInit (uint32_t options);
|
||||||
|
static uint8_t AudioCmd (uint8_t* pbuf, uint32_t size, uint8_t cmd);
|
||||||
|
static uint8_t VolumeCtl (uint8_t vol);
|
||||||
|
static uint8_t MuteCtl (uint8_t cmd);
|
||||||
|
static uint8_t PeriodicTC (uint8_t cmd);
|
||||||
|
static uint8_t GetState (void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
AUDIO_FOPS_TypeDef AUDIO_OUT_fops =
|
||||||
|
{
|
||||||
|
Init,
|
||||||
|
DeInit,
|
||||||
|
AudioCmd,
|
||||||
|
VolumeCtl,
|
||||||
|
MuteCtl,
|
||||||
|
PeriodicTC,
|
||||||
|
GetState
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t AudioState = AUDIO_STATE_INACTIVE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_audio_out_if_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Init
|
||||||
|
* Initialize and configures all required resources for audio play function.
|
||||||
|
* @param AudioFreq: Statrtup audio frequency.
|
||||||
|
* @param Volume: Startup volume to be set.
|
||||||
|
* @param options: specific options passed to low layer function.
|
||||||
|
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
||||||
|
*/
|
||||||
|
static uint8_t Init (uint32_t AudioFreq,
|
||||||
|
uint32_t Volume,
|
||||||
|
uint32_t options)
|
||||||
|
{
|
||||||
|
static uint32_t Initialized = 0;
|
||||||
|
|
||||||
|
/* Check if the low layer has already been initialized */
|
||||||
|
if (Initialized == 0)
|
||||||
|
{
|
||||||
|
/* Call low layer function */
|
||||||
|
if (EVAL_AUDIO_Init(OUTPUT_DEVICE_AUTO, Volume, AudioFreq) != 0)
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the Initialization flag to prevent reinitializing the interface again */
|
||||||
|
Initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the Audio state machine */
|
||||||
|
AudioState = AUDIO_STATE_ACTIVE;
|
||||||
|
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DeInit
|
||||||
|
* Free all resources used by low layer and stops audio-play function.
|
||||||
|
* @param options: options passed to low layer function.
|
||||||
|
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
||||||
|
*/
|
||||||
|
static uint8_t DeInit (uint32_t options)
|
||||||
|
{
|
||||||
|
/* Update the Audio state machine */
|
||||||
|
AudioState = AUDIO_STATE_INACTIVE;
|
||||||
|
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief AudioCmd
|
||||||
|
* Play, Stop, Pause or Resume current file.
|
||||||
|
* @param pbuf: address from which file shoud be played.
|
||||||
|
* @param size: size of the current buffer/file.
|
||||||
|
* @param cmd: command to be executed, can be AUDIO_CMD_PLAY , AUDIO_CMD_PAUSE,
|
||||||
|
* AUDIO_CMD_RESUME or AUDIO_CMD_STOP.
|
||||||
|
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
||||||
|
*/
|
||||||
|
static uint8_t AudioCmd(uint8_t* pbuf,
|
||||||
|
uint32_t size,
|
||||||
|
uint8_t cmd)
|
||||||
|
{
|
||||||
|
/* Check the current state */
|
||||||
|
if ((AudioState == AUDIO_STATE_INACTIVE) || (AudioState == AUDIO_STATE_ERROR))
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
/* Process the PLAY command ----------------------------*/
|
||||||
|
case AUDIO_CMD_PLAY:
|
||||||
|
/* If current state is Active or Stopped */
|
||||||
|
if ((AudioState == AUDIO_STATE_ACTIVE) || \
|
||||||
|
(AudioState == AUDIO_STATE_STOPPED) || \
|
||||||
|
(AudioState == AUDIO_STATE_PLAYING))
|
||||||
|
{
|
||||||
|
Audio_MAL_Play((uint32_t)pbuf, (size/2));
|
||||||
|
AudioState = AUDIO_STATE_PLAYING;
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
/* If current state is Paused */
|
||||||
|
else if (AudioState == AUDIO_STATE_PAUSED)
|
||||||
|
{
|
||||||
|
if (EVAL_AUDIO_PauseResume(AUDIO_RESUME, (uint32_t)pbuf, (size/2)) != 0)
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_PLAYING;
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* Not allowed command */
|
||||||
|
{
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process the STOP command ----------------------------*/
|
||||||
|
case AUDIO_CMD_STOP:
|
||||||
|
if (AudioState != AUDIO_STATE_PLAYING)
|
||||||
|
{
|
||||||
|
/* Unsupported command */
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
else if (EVAL_AUDIO_Stop(CODEC_PDWN_SW) != 0)
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_STOPPED;
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process the PAUSE command ---------------------------*/
|
||||||
|
case AUDIO_CMD_PAUSE:
|
||||||
|
if (AudioState != AUDIO_STATE_PLAYING)
|
||||||
|
{
|
||||||
|
/* Unsupported command */
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
else if (EVAL_AUDIO_PauseResume(AUDIO_PAUSE, (uint32_t)pbuf, (size/2)) != 0)
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_PAUSED;
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unsupported command ---------------------------------*/
|
||||||
|
default:
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief VolumeCtl
|
||||||
|
* Set the volume level in %
|
||||||
|
* @param vol: volume level to be set in % (from 0% to 100%)
|
||||||
|
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
||||||
|
*/
|
||||||
|
static uint8_t VolumeCtl (uint8_t vol)
|
||||||
|
{
|
||||||
|
/* Call low layer volume setting function */
|
||||||
|
if (EVAL_AUDIO_VolumeCtl(vol) != 0)
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MuteCtl
|
||||||
|
* Mute or Unmute the audio current output
|
||||||
|
* @param cmd: can be 0 to unmute, or 1 to mute.
|
||||||
|
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
||||||
|
*/
|
||||||
|
static uint8_t MuteCtl (uint8_t cmd)
|
||||||
|
{
|
||||||
|
/* Call low layer mute setting function */
|
||||||
|
if (EVAL_AUDIO_Mute(cmd) != 0)
|
||||||
|
{
|
||||||
|
AudioState = AUDIO_STATE_ERROR;
|
||||||
|
return AUDIO_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* @param
|
||||||
|
* @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
|
||||||
|
*/
|
||||||
|
static uint8_t PeriodicTC (uint8_t cmd)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GetState
|
||||||
|
* Return the current state of the audio machine
|
||||||
|
* @param None
|
||||||
|
* @retval Current State.
|
||||||
|
*/
|
||||||
|
static uint8_t GetState (void)
|
||||||
|
{
|
||||||
|
return AudioState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,2 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/cdc/src
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/cdc/inc
|
@ -0,0 +1,137 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_cdc_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_cdc_core.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_CDC_CORE_H_
|
||||||
|
#define __USB_CDC_CORE_H_
|
||||||
|
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc
|
||||||
|
* @brief This file is the Header file for USBD_cdc.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USB_CDC_CONFIG_DESC_SIZ (67)
|
||||||
|
#define USB_CDC_DESC_SIZ (67-9)
|
||||||
|
|
||||||
|
#define CDC_DESCRIPTOR_TYPE 0x21
|
||||||
|
|
||||||
|
#define DEVICE_CLASS_CDC 0x02
|
||||||
|
#define DEVICE_SUBCLASS_CDC 0x00
|
||||||
|
|
||||||
|
|
||||||
|
#define USB_DEVICE_DESCRIPTOR_TYPE 0x01
|
||||||
|
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02
|
||||||
|
#define USB_STRING_DESCRIPTOR_TYPE 0x03
|
||||||
|
#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04
|
||||||
|
#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05
|
||||||
|
|
||||||
|
#define STANDARD_ENDPOINT_DESC_SIZE 0x09
|
||||||
|
|
||||||
|
#define CDC_DATA_IN_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 57)
|
||||||
|
|
||||||
|
#define CDC_DATA_OUT_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 64)
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
/* CDC definitions */
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* CDC Requests */
|
||||||
|
/**************************************************/
|
||||||
|
#define SEND_ENCAPSULATED_COMMAND 0x00
|
||||||
|
#define GET_ENCAPSULATED_RESPONSE 0x01
|
||||||
|
#define SET_COMM_FEATURE 0x02
|
||||||
|
#define GET_COMM_FEATURE 0x03
|
||||||
|
#define CLEAR_COMM_FEATURE 0x04
|
||||||
|
#define SET_LINE_CODING 0x20
|
||||||
|
#define GET_LINE_CODING 0x21
|
||||||
|
#define SET_CONTROL_LINE_STATE 0x22
|
||||||
|
#define SEND_BREAK 0x23
|
||||||
|
#define NO_CMD 0xFF
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
typedef struct _CDC_IF_PROP
|
||||||
|
{
|
||||||
|
uint16_t (*pIf_Init) (void);
|
||||||
|
uint16_t (*pIf_DeInit) (void);
|
||||||
|
uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint32_t wValue, uint8_t* Buf, uint32_t Len);
|
||||||
|
uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len);
|
||||||
|
uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len);
|
||||||
|
}
|
||||||
|
CDC_IF_Prop_TypeDef;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern USBD_Class_cb_TypeDef USBD_CDC_cb;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // __USB_CDC_CORE_H_
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,830 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_cdc_core.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the high layer firmware functions to manage the
|
||||||
|
* following functionalities of the USB CDC Class:
|
||||||
|
* - Initialization and Configuration of high and low layer
|
||||||
|
* - Enumeration as CDC Device (and enumeration for each implemented memory interface)
|
||||||
|
* - OUT/IN data transfer
|
||||||
|
* - Command IN transfer (class requests management)
|
||||||
|
* - Error management
|
||||||
|
*
|
||||||
|
* @verbatim
|
||||||
|
*
|
||||||
|
* ===================================================================
|
||||||
|
* CDC Class Driver Description
|
||||||
|
* ===================================================================
|
||||||
|
* This driver manages the "Universal Serial Bus Class Definitions for Communications Devices
|
||||||
|
* Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus
|
||||||
|
* Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007"
|
||||||
|
* This driver implements the following aspects of the specification:
|
||||||
|
* - Device descriptor management
|
||||||
|
* - Configuration descriptor management
|
||||||
|
* - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN)
|
||||||
|
* - Requests management (as described in section 6.2 in specification)
|
||||||
|
* - Abstract Control Model compliant
|
||||||
|
* - Union Functional collection (using 1 IN endpoint for control)
|
||||||
|
* - Data interface class
|
||||||
|
|
||||||
|
* @note
|
||||||
|
* For the Abstract Control Model, this core allows only transmitting the requests to
|
||||||
|
* lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and
|
||||||
|
* perform relative actions.
|
||||||
|
*
|
||||||
|
* These aspects may be enriched or modified for a specific user application.
|
||||||
|
*
|
||||||
|
* This driver doesn't implement the following aspects of the specification
|
||||||
|
* (but it is possible to manage these features with some modifications on this driver):
|
||||||
|
* - Any class-specific aspect relative to communication classes should be managed by user application.
|
||||||
|
* - All communication classes other than PSTN are not managed
|
||||||
|
*
|
||||||
|
* @endverbatim
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_cdc_core.h"
|
||||||
|
#include "usbd_desc.h"
|
||||||
|
#include "usbd_req.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc
|
||||||
|
* @brief usbd core module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
CDC Device library callbacks
|
||||||
|
*********************************************/
|
||||||
|
static uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx);
|
||||||
|
static uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx);
|
||||||
|
static uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req);
|
||||||
|
static uint8_t usbd_cdc_EP0_RxReady (void *pdev);
|
||||||
|
static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum);
|
||||||
|
static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum);
|
||||||
|
static uint8_t usbd_cdc_SOF (void *pdev);
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
CDC specific management functions
|
||||||
|
*********************************************/
|
||||||
|
static void Handle_USBAsynchXfer (void *pdev);
|
||||||
|
static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length);
|
||||||
|
#ifdef USE_USB_OTG_HS
|
||||||
|
static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length);
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
extern CDC_IF_Prop_TypeDef APP_FOPS;
|
||||||
|
extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC];
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static __IO uint32_t usbd_cdc_AltSet __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ;
|
||||||
|
|
||||||
|
uint32_t APP_Rx_ptr_in = 0;
|
||||||
|
uint32_t APP_Rx_ptr_out = 0;
|
||||||
|
uint32_t APP_Rx_length = 0;
|
||||||
|
|
||||||
|
uint8_t USB_Tx_State = 0;
|
||||||
|
|
||||||
|
static uint32_t cdcCmd = 0xFF;
|
||||||
|
static uint32_t cdcLen = 0;
|
||||||
|
|
||||||
|
/* CDC interface class callbacks structure */
|
||||||
|
USBD_Class_cb_TypeDef USBD_CDC_cb =
|
||||||
|
{
|
||||||
|
usbd_cdc_Init,
|
||||||
|
usbd_cdc_DeInit,
|
||||||
|
usbd_cdc_Setup,
|
||||||
|
NULL, /* EP0_TxSent, */
|
||||||
|
usbd_cdc_EP0_RxReady,
|
||||||
|
usbd_cdc_DataIn,
|
||||||
|
usbd_cdc_DataOut,
|
||||||
|
usbd_cdc_SOF,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
USBD_cdc_GetCfgDesc,
|
||||||
|
#ifdef USE_USB_OTG_HS
|
||||||
|
USBD_cdc_GetOtherCfgDesc, /* use same cobfig as per FS */
|
||||||
|
#endif /* USE_USB_OTG_HS */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
/* USB CDC device Configuration Descriptor */
|
||||||
|
__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
||||||
|
{
|
||||||
|
/*Configuration Descriptor*/
|
||||||
|
0x09, /* bLength: Configuration Descriptor size */
|
||||||
|
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
|
||||||
|
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */
|
||||||
|
0x00,
|
||||||
|
0x02, /* bNumInterfaces: 2 interface */
|
||||||
|
0x01, /* bConfigurationValue: Configuration value */
|
||||||
|
0x00, /* iConfiguration: Index of string descriptor describing the configuration */
|
||||||
|
0xC0, /* bmAttributes: self powered */
|
||||||
|
0x32, /* MaxPower 0 mA */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*Interface Descriptor */
|
||||||
|
0x09, /* bLength: Interface Descriptor size */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
|
||||||
|
/* Interface descriptor type */
|
||||||
|
0x00, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x01, /* bNumEndpoints: One endpoints used */
|
||||||
|
0x02, /* bInterfaceClass: Communication Interface Class */
|
||||||
|
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
||||||
|
0x01, /* bInterfaceProtocol: Common AT commands */
|
||||||
|
0x00, /* iInterface: */
|
||||||
|
|
||||||
|
/*Header Functional Descriptor*/
|
||||||
|
0x05, /* bLength: Endpoint Descriptor size */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x00, /* bDescriptorSubtype: Header Func Desc */
|
||||||
|
0x10, /* bcdCDC: spec release number */
|
||||||
|
0x01,
|
||||||
|
|
||||||
|
/*Call Management Functional Descriptor*/
|
||||||
|
0x05, /* bFunctionLength */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
||||||
|
0x00, /* bmCapabilities: D0+D1 */
|
||||||
|
0x01, /* bDataInterface: 1 */
|
||||||
|
|
||||||
|
/*ACM Functional Descriptor*/
|
||||||
|
0x04, /* bFunctionLength */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
|
||||||
|
0x02, /* bmCapabilities */
|
||||||
|
|
||||||
|
/*Union Functional Descriptor*/
|
||||||
|
0x05, /* bFunctionLength */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x06, /* bDescriptorSubtype: Union func desc */
|
||||||
|
0x00, /* bMasterInterface: Communication class interface */
|
||||||
|
0x01, /* bSlaveInterface0: Data Class Interface */
|
||||||
|
|
||||||
|
/*Endpoint 2 Descriptor*/
|
||||||
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
||||||
|
CDC_CMD_EP, /* bEndpointAddress */
|
||||||
|
0x03, /* bmAttributes: Interrupt */
|
||||||
|
LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */
|
||||||
|
HIBYTE(CDC_CMD_PACKET_SZE),
|
||||||
|
#ifdef USE_USB_OTG_HS
|
||||||
|
0x10, /* bInterval: */
|
||||||
|
#else
|
||||||
|
0xFF, /* bInterval: */
|
||||||
|
#endif /* USE_USB_OTG_HS */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*Data class interface descriptor*/
|
||||||
|
0x09, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
|
||||||
|
0x01, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x02, /* bNumEndpoints: Two endpoints used */
|
||||||
|
0x0A, /* bInterfaceClass: CDC */
|
||||||
|
0x00, /* bInterfaceSubClass: */
|
||||||
|
0x00, /* bInterfaceProtocol: */
|
||||||
|
0x00, /* iInterface: */
|
||||||
|
|
||||||
|
/*Endpoint OUT Descriptor*/
|
||||||
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
||||||
|
CDC_OUT_EP, /* bEndpointAddress */
|
||||||
|
0x02, /* bmAttributes: Bulk */
|
||||||
|
LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
||||||
|
HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
|
||||||
|
0x00, /* bInterval: ignore for Bulk transfer */
|
||||||
|
|
||||||
|
/*Endpoint IN Descriptor*/
|
||||||
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
||||||
|
CDC_IN_EP, /* bEndpointAddress */
|
||||||
|
0x02, /* bmAttributes: Bulk */
|
||||||
|
LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
||||||
|
HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
|
||||||
|
0x00 /* bInterval: ignore for Bulk transfer */
|
||||||
|
} ;
|
||||||
|
|
||||||
|
#ifdef USE_USB_OTG_HS
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
||||||
|
{
|
||||||
|
0x09, /* bLength: Configuation Descriptor size */
|
||||||
|
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
||||||
|
USB_CDC_CONFIG_DESC_SIZ,
|
||||||
|
0x00,
|
||||||
|
0x02, /* bNumInterfaces: 2 interfaces */
|
||||||
|
0x01, /* bConfigurationValue: */
|
||||||
|
0x04, /* iConfiguration: */
|
||||||
|
0xC0, /* bmAttributes: */
|
||||||
|
0x32, /* MaxPower 100 mA */
|
||||||
|
|
||||||
|
/*Interface Descriptor */
|
||||||
|
0x09, /* bLength: Interface Descriptor size */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */
|
||||||
|
/* Interface descriptor type */
|
||||||
|
0x00, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x01, /* bNumEndpoints: One endpoints used */
|
||||||
|
0x02, /* bInterfaceClass: Communication Interface Class */
|
||||||
|
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
||||||
|
0x01, /* bInterfaceProtocol: Common AT commands */
|
||||||
|
0x00, /* iInterface: */
|
||||||
|
|
||||||
|
/*Header Functional Descriptor*/
|
||||||
|
0x05, /* bLength: Endpoint Descriptor size */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x00, /* bDescriptorSubtype: Header Func Desc */
|
||||||
|
0x10, /* bcdCDC: spec release number */
|
||||||
|
0x01,
|
||||||
|
|
||||||
|
/*Call Management Functional Descriptor*/
|
||||||
|
0x05, /* bFunctionLength */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
||||||
|
0x00, /* bmCapabilities: D0+D1 */
|
||||||
|
0x01, /* bDataInterface: 1 */
|
||||||
|
|
||||||
|
/*ACM Functional Descriptor*/
|
||||||
|
0x04, /* bFunctionLength */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
|
||||||
|
0x02, /* bmCapabilities */
|
||||||
|
|
||||||
|
/*Union Functional Descriptor*/
|
||||||
|
0x05, /* bFunctionLength */
|
||||||
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
0x06, /* bDescriptorSubtype: Union func desc */
|
||||||
|
0x00, /* bMasterInterface: Communication class interface */
|
||||||
|
0x01, /* bSlaveInterface0: Data Class Interface */
|
||||||
|
|
||||||
|
/*Endpoint 2 Descriptor*/
|
||||||
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
||||||
|
CDC_CMD_EP, /* bEndpointAddress */
|
||||||
|
0x03, /* bmAttributes: Interrupt */
|
||||||
|
LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */
|
||||||
|
HIBYTE(CDC_CMD_PACKET_SZE),
|
||||||
|
0xFF, /* bInterval: */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*Data class interface descriptor*/
|
||||||
|
0x09, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */
|
||||||
|
0x01, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x02, /* bNumEndpoints: Two endpoints used */
|
||||||
|
0x0A, /* bInterfaceClass: CDC */
|
||||||
|
0x00, /* bInterfaceSubClass: */
|
||||||
|
0x00, /* bInterfaceProtocol: */
|
||||||
|
0x00, /* iInterface: */
|
||||||
|
|
||||||
|
/*Endpoint OUT Descriptor*/
|
||||||
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
||||||
|
CDC_OUT_EP, /* bEndpointAddress */
|
||||||
|
0x02, /* bmAttributes: Bulk */
|
||||||
|
0x40, /* wMaxPacketSize: */
|
||||||
|
0x00,
|
||||||
|
0x00, /* bInterval: ignore for Bulk transfer */
|
||||||
|
|
||||||
|
/*Endpoint IN Descriptor*/
|
||||||
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */
|
||||||
|
CDC_IN_EP, /* bEndpointAddress */
|
||||||
|
0x02, /* bmAttributes: Bulk */
|
||||||
|
0x40, /* wMaxPacketSize: */
|
||||||
|
0x00,
|
||||||
|
0x00 /* bInterval */
|
||||||
|
};
|
||||||
|
#endif /* USE_USB_OTG_HS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_cdc_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_cdc_Init
|
||||||
|
* Initilaize the CDC interface
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: Configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_Init (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
uint8_t *pbuf;
|
||||||
|
|
||||||
|
/* Open EP IN */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
CDC_IN_EP,
|
||||||
|
CDC_DATA_IN_PACKET_SIZE,
|
||||||
|
USB_OTG_EP_BULK);
|
||||||
|
|
||||||
|
/* Open EP OUT */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
CDC_OUT_EP,
|
||||||
|
CDC_DATA_OUT_PACKET_SIZE,
|
||||||
|
USB_OTG_EP_BULK);
|
||||||
|
|
||||||
|
/* Open Command IN EP */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
CDC_CMD_EP,
|
||||||
|
CDC_CMD_PACKET_SZE,
|
||||||
|
USB_OTG_EP_INT);
|
||||||
|
|
||||||
|
pbuf = (uint8_t *)USBD_DeviceDesc;
|
||||||
|
pbuf[4] = DEVICE_CLASS_CDC;
|
||||||
|
pbuf[5] = DEVICE_SUBCLASS_CDC;
|
||||||
|
|
||||||
|
/* Initialize the Interface physical components */
|
||||||
|
APP_FOPS.pIf_Init();
|
||||||
|
|
||||||
|
/* Prepare Out endpoint to receive next packet */
|
||||||
|
DCD_EP_PrepareRx(pdev,
|
||||||
|
CDC_OUT_EP,
|
||||||
|
(uint8_t*)(USB_Rx_Buffer),
|
||||||
|
CDC_DATA_OUT_PACKET_SIZE);
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_cdc_Init
|
||||||
|
* DeInitialize the CDC layer
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: Configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_DeInit (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
/* Open EP IN */
|
||||||
|
DCD_EP_Close(pdev,
|
||||||
|
CDC_IN_EP);
|
||||||
|
|
||||||
|
/* Open EP OUT */
|
||||||
|
DCD_EP_Close(pdev,
|
||||||
|
CDC_OUT_EP);
|
||||||
|
|
||||||
|
/* Open Command IN EP */
|
||||||
|
DCD_EP_Close(pdev,
|
||||||
|
CDC_CMD_EP);
|
||||||
|
|
||||||
|
/* Restore default state of the Interface physical components */
|
||||||
|
APP_FOPS.pIf_DeInit();
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_cdc_Setup
|
||||||
|
* Handle the CDC specific requests
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param req: usb requests
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_Setup (void *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
uint16_t len;
|
||||||
|
uint8_t *pbuf;
|
||||||
|
|
||||||
|
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
||||||
|
{
|
||||||
|
/* CDC Class Requests -------------------------------*/
|
||||||
|
case USB_REQ_TYPE_CLASS :
|
||||||
|
/* Check if the request is a data setup packet */
|
||||||
|
if (req->wLength)
|
||||||
|
{
|
||||||
|
/* Check if the request is Device-to-Host */
|
||||||
|
if (req->bmRequest & 0x80)
|
||||||
|
{
|
||||||
|
/* Get the data to be sent to Host from interface layer */
|
||||||
|
APP_FOPS.pIf_Ctrl(req->bRequest, req->wValue, CmdBuff, req->wLength);
|
||||||
|
|
||||||
|
/* Send the data to the host */
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
CmdBuff,
|
||||||
|
req->wLength);
|
||||||
|
}
|
||||||
|
else /* Host-to-Device requeset */
|
||||||
|
{
|
||||||
|
/* Set the value of the current command to be processed */
|
||||||
|
cdcCmd = req->bRequest;
|
||||||
|
cdcLen = req->wLength;
|
||||||
|
|
||||||
|
/* Prepare the reception of the buffer over EP0
|
||||||
|
Next step: the received data will be managed in usbd_cdc_EP0_TxSent()
|
||||||
|
function. */
|
||||||
|
USBD_CtlPrepareRx (pdev,
|
||||||
|
CmdBuff,
|
||||||
|
req->wLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* No Data request */
|
||||||
|
{
|
||||||
|
/* Transfer the command to the interface layer */
|
||||||
|
APP_FOPS.pIf_Ctrl(req->bRequest, req->wValue, NULL, 0);
|
||||||
|
if(req->bRequest == SET_CONTROL_LINE_STATE)
|
||||||
|
{
|
||||||
|
if(req->wValue & 1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// HOST Virtual COM Port is closed
|
||||||
|
// Disable TxFifoEmpty interrupt on endpoint 0x01 to avoid interrupt lock-up
|
||||||
|
uint32_t fifoemptymsk;
|
||||||
|
|
||||||
|
fifoemptymsk = 0x1 << 1;
|
||||||
|
USB_OTG_MODIFY_REG32(&((USB_OTG_CORE_HANDLE*)pdev)->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError (pdev, req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Standard Requests -------------------------------*/
|
||||||
|
case USB_REQ_TYPE_STANDARD:
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case USB_REQ_GET_DESCRIPTOR:
|
||||||
|
if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE)
|
||||||
|
{
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
pbuf = usbd_cdc_Desc;
|
||||||
|
#else
|
||||||
|
pbuf = usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM);
|
||||||
|
#endif
|
||||||
|
len = MIN(USB_CDC_DESC_SIZ , req->wLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
pbuf,
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_INTERFACE :
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&usbd_cdc_AltSet,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_SET_INTERFACE :
|
||||||
|
if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM)
|
||||||
|
{
|
||||||
|
usbd_cdc_AltSet = (uint8_t)(req->wValue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Call the error management function (command will be nacked */
|
||||||
|
USBD_CtlError (pdev, req);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_cdc_EP0_RxReady
|
||||||
|
* Data received on control endpoint
|
||||||
|
* @param pdev: device device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_EP0_RxReady (void *pdev)
|
||||||
|
{
|
||||||
|
if (cdcCmd != NO_CMD)
|
||||||
|
{
|
||||||
|
/* Process the data */
|
||||||
|
APP_FOPS.pIf_Ctrl(cdcCmd, 0, CmdBuff, cdcLen);
|
||||||
|
|
||||||
|
/* Reset the command variable to default value */
|
||||||
|
cdcCmd = NO_CMD;
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_DataIn
|
||||||
|
* Data sent on non-control IN endpoint
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
uint16_t USB_Tx_ptr;
|
||||||
|
uint16_t USB_Tx_length;
|
||||||
|
|
||||||
|
if (USB_Tx_State == 1)
|
||||||
|
{
|
||||||
|
if (APP_Rx_length == 0)
|
||||||
|
{
|
||||||
|
USB_Tx_State = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){
|
||||||
|
USB_Tx_ptr = APP_Rx_ptr_out;
|
||||||
|
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
|
||||||
|
|
||||||
|
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
|
||||||
|
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USB_Tx_ptr = APP_Rx_ptr_out;
|
||||||
|
USB_Tx_length = APP_Rx_length;
|
||||||
|
|
||||||
|
APP_Rx_ptr_out += APP_Rx_length;
|
||||||
|
APP_Rx_length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepare the available data buffer to be sent on IN endpoint */
|
||||||
|
DCD_EP_Tx (pdev,
|
||||||
|
CDC_IN_EP,
|
||||||
|
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
|
||||||
|
USB_Tx_length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_DataOut
|
||||||
|
* Data received on non-control Out endpoint
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
uint16_t USB_Rx_Cnt;
|
||||||
|
|
||||||
|
/* Get the received data buffer and update the counter */
|
||||||
|
USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
|
||||||
|
|
||||||
|
/* USB data will be immediately processed, this allow next USB traffic being
|
||||||
|
NAKed till the end of the application Xfer */
|
||||||
|
APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);
|
||||||
|
|
||||||
|
/* Prepare Out endpoint to receive next packet */
|
||||||
|
DCD_EP_PrepareRx(pdev,
|
||||||
|
CDC_OUT_EP,
|
||||||
|
(uint8_t*)(USB_Rx_Buffer),
|
||||||
|
CDC_DATA_OUT_PACKET_SIZE);
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief usbd_audio_SOF
|
||||||
|
* Start Of Frame event management
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param epnum: endpoint number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t usbd_cdc_SOF (void *pdev)
|
||||||
|
{
|
||||||
|
static uint32_t FrameCount = 0;
|
||||||
|
|
||||||
|
if (FrameCount++ == CDC_IN_FRAME_INTERVAL)
|
||||||
|
{
|
||||||
|
/* Reset the frame counter */
|
||||||
|
FrameCount = 0;
|
||||||
|
|
||||||
|
/* Check the data to be sent through IN pipe */
|
||||||
|
Handle_USBAsynchXfer(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle_USBAsynchXfer
|
||||||
|
* Send data to USB
|
||||||
|
* @param pdev: instance
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void Handle_USBAsynchXfer (void *pdev)
|
||||||
|
{
|
||||||
|
uint16_t USB_Tx_ptr;
|
||||||
|
uint16_t USB_Tx_length;
|
||||||
|
|
||||||
|
if(USB_Tx_State != 1)
|
||||||
|
{
|
||||||
|
if (APP_Rx_ptr_out == APP_RX_DATA_SIZE)
|
||||||
|
{
|
||||||
|
APP_Rx_ptr_out = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(APP_Rx_ptr_out == APP_Rx_ptr_in)
|
||||||
|
{
|
||||||
|
USB_Tx_State = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */
|
||||||
|
{
|
||||||
|
APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out;
|
||||||
|
|
||||||
|
}
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
APP_Rx_length &= ~0x03;
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
|
||||||
|
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
|
||||||
|
{
|
||||||
|
USB_Tx_ptr = APP_Rx_ptr_out;
|
||||||
|
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
|
||||||
|
|
||||||
|
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
|
||||||
|
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USB_Tx_ptr = APP_Rx_ptr_out;
|
||||||
|
USB_Tx_length = APP_Rx_length;
|
||||||
|
|
||||||
|
APP_Rx_ptr_out += APP_Rx_length;
|
||||||
|
APP_Rx_length = 0;
|
||||||
|
}
|
||||||
|
USB_Tx_State = 1;
|
||||||
|
|
||||||
|
DCD_EP_Tx (pdev,
|
||||||
|
CDC_IN_EP,
|
||||||
|
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
|
||||||
|
USB_Tx_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_cdc_GetCfgDesc
|
||||||
|
* Return configuration descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer data length
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof (usbd_cdc_CfgDesc);
|
||||||
|
return usbd_cdc_CfgDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_cdc_GetCfgDesc
|
||||||
|
* Return configuration descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer data length
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
#ifdef USE_USB_OTG_HS
|
||||||
|
static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof (usbd_cdc_OtherCfgDesc);
|
||||||
|
return usbd_cdc_OtherCfgDesc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,4 @@
|
|||||||
|
#SUB_FOLDER += firmware/arch/stm32f4xx/lib
|
||||||
|
#INCLUDES += firmware/arch/stm32f4xx/lib
|
||||||
|
|
||||||
|
include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/cdc/cdc.mk
|
@ -0,0 +1,187 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_dfu_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_dfu_core.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_DFU_CORE_H_
|
||||||
|
#define __USB_DFU_CORE_H_
|
||||||
|
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup usbd_dfu
|
||||||
|
* @brief This file is the Header file for USBD_dfu.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup usbd_dfu_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USB_DFU_CONFIG_DESC_SIZ (18 + (9 * USBD_ITF_MAX_NUM))
|
||||||
|
#define USB_DFU_DESC_SIZ 9
|
||||||
|
|
||||||
|
#define DFU_DESCRIPTOR_TYPE 0x21
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
/* DFU definitions */
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* DFU Requests DFU states */
|
||||||
|
/**************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#define STATE_appIDLE 0
|
||||||
|
#define STATE_appDETACH 1
|
||||||
|
#define STATE_dfuIDLE 2
|
||||||
|
#define STATE_dfuDNLOAD_SYNC 3
|
||||||
|
#define STATE_dfuDNBUSY 4
|
||||||
|
#define STATE_dfuDNLOAD_IDLE 5
|
||||||
|
#define STATE_dfuMANIFEST_SYNC 6
|
||||||
|
#define STATE_dfuMANIFEST 7
|
||||||
|
#define STATE_dfuMANIFEST_WAIT_RESET 8
|
||||||
|
#define STATE_dfuUPLOAD_IDLE 9
|
||||||
|
#define STATE_dfuERROR 10
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* DFU Requests DFU status */
|
||||||
|
/**************************************************/
|
||||||
|
|
||||||
|
#define STATUS_OK 0x00
|
||||||
|
#define STATUS_ERRTARGET 0x01
|
||||||
|
#define STATUS_ERRFILE 0x02
|
||||||
|
#define STATUS_ERRWRITE 0x03
|
||||||
|
#define STATUS_ERRERASE 0x04
|
||||||
|
#define STATUS_ERRCHECK_ERASED 0x05
|
||||||
|
#define STATUS_ERRPROG 0x06
|
||||||
|
#define STATUS_ERRVERIFY 0x07
|
||||||
|
#define STATUS_ERRADDRESS 0x08
|
||||||
|
#define STATUS_ERRNOTDONE 0x09
|
||||||
|
#define STATUS_ERRFIRMWARE 0x0A
|
||||||
|
#define STATUS_ERRVENDOR 0x0B
|
||||||
|
#define STATUS_ERRUSBR 0x0C
|
||||||
|
#define STATUS_ERRPOR 0x0D
|
||||||
|
#define STATUS_ERRUNKNOWN 0x0E
|
||||||
|
#define STATUS_ERRSTALLEDPKT 0x0F
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* DFU Requests DFU states Manifestation State */
|
||||||
|
/**************************************************/
|
||||||
|
|
||||||
|
#define Manifest_complete 0x00
|
||||||
|
#define Manifest_In_Progress 0x01
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* Special Commands with Download Request */
|
||||||
|
/**************************************************/
|
||||||
|
|
||||||
|
#define CMD_GETCOMMANDS 0x00
|
||||||
|
#define CMD_SETADDRESSPOINTER 0x21
|
||||||
|
#define CMD_ERASE 0x41
|
||||||
|
|
||||||
|
/**************************************************/
|
||||||
|
/* Other defines */
|
||||||
|
/**************************************************/
|
||||||
|
/* Bit Detach capable = bit 3 in bmAttributes field */
|
||||||
|
#define DFU_DETACH_MASK (uint8_t)(1 << 4)
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**************************************************/
|
||||||
|
/* DFU Requests */
|
||||||
|
/**************************************************/
|
||||||
|
|
||||||
|
typedef enum _DFU_REQUESTS {
|
||||||
|
DFU_DETACH = 0,
|
||||||
|
DFU_DNLOAD = 1,
|
||||||
|
DFU_UPLOAD,
|
||||||
|
DFU_GETSTATUS,
|
||||||
|
DFU_CLRSTATUS,
|
||||||
|
DFU_GETSTATE,
|
||||||
|
DFU_ABORT
|
||||||
|
} DFU_REQUESTS;
|
||||||
|
|
||||||
|
typedef void (*pFunction)(void);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/********** Descriptor of DFU interface 0 Alternate setting n ****************/
|
||||||
|
#define USBD_DFU_IF_DESC(n) 0x09, /* bLength: Interface Descriptor size */ \
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
|
||||||
|
0x00, /* bInterfaceNumber: Number of Interface */ \
|
||||||
|
(n), /* bAlternateSetting: Alternate setting */ \
|
||||||
|
0x00, /* bNumEndpoints*/ \
|
||||||
|
0xFE, /* bInterfaceClass: Application Specific Class Code */ \
|
||||||
|
0x01, /* bInterfaceSubClass : Device Firmware Upgrade Code */ \
|
||||||
|
0x02, /* nInterfaceProtocol: DFU mode protocol */ \
|
||||||
|
USBD_IDX_INTERFACE_STR + (n) + 1 /* iInterface: Index of string descriptor */ \
|
||||||
|
/* 18 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern USBD_Class_cb_TypeDef DFU_cb;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // __USB_DFU_CORE_H_
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_dfu_mal.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header for usbd_dfu_mal.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __DFU_MAL_H
|
||||||
|
#define __DFU_MAL_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#ifdef STM32F2XX
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
#elif defined(STM32F10X_CL)
|
||||||
|
#include "stm32f10x.h"
|
||||||
|
#endif /* STM32F2XX */
|
||||||
|
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
#include "usbd_dfu_core.h"
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
typedef struct _DFU_MAL_PROP
|
||||||
|
{
|
||||||
|
const uint8_t* pStrDesc;
|
||||||
|
uint16_t (*pMAL_Init) (void);
|
||||||
|
uint16_t (*pMAL_DeInit) (void);
|
||||||
|
uint16_t (*pMAL_Erase) (uint32_t Add);
|
||||||
|
uint16_t (*pMAL_Write) (uint32_t Add, uint32_t Len);
|
||||||
|
uint8_t *(*pMAL_Read) (uint32_t Add, uint32_t Len);
|
||||||
|
uint16_t (*pMAL_CheckAdd) (uint32_t Add);
|
||||||
|
const uint32_t EraseTiming;
|
||||||
|
const uint32_t WriteTiming;
|
||||||
|
}
|
||||||
|
DFU_MAL_Prop_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
#define MAL_OK 0
|
||||||
|
#define MAL_FAIL 1
|
||||||
|
|
||||||
|
/* utils macro ---------------------------------------------------------------*/
|
||||||
|
#define _1st_BYTE(x) (uint8_t)((x)&0xFF) /* 1st addressing cycle */
|
||||||
|
#define _2nd_BYTE(x) (uint8_t)(((x)&0xFF00)>>8) /* 2nd addressing cycle */
|
||||||
|
#define _3rd_BYTE(x) (uint8_t)(((x)&0xFF0000)>>16) /* 3rd addressing cycle */
|
||||||
|
#define _4th_BYTE(x) (uint8_t)(((x)&0xFF000000)>>24) /* 4th addressing cycle */
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
#define SET_POLLING_TIMING(x) buffer[1] = _1st_BYTE(x);\
|
||||||
|
buffer[2] = _2nd_BYTE(x);\
|
||||||
|
buffer[3] = _3rd_BYTE(x);
|
||||||
|
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
|
||||||
|
uint16_t MAL_Init (void);
|
||||||
|
uint16_t MAL_DeInit (void);
|
||||||
|
uint16_t MAL_Erase (uint32_t SectorAddress);
|
||||||
|
uint16_t MAL_Write (uint32_t SectorAddress, uint32_t DataLength);
|
||||||
|
uint8_t *MAL_Read (uint32_t SectorAddress, uint32_t DataLength);
|
||||||
|
uint16_t MAL_GetStatus(uint32_t SectorAddress ,uint8_t Cmd, uint8_t *buffer);
|
||||||
|
|
||||||
|
extern uint8_t MAL_Buffer[XFERSIZE]; /* RAM Buffer for Downloaded Data */
|
||||||
|
#endif /* __DFU_MAL_H */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_flash_if.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0RC1
|
||||||
|
* @date 18-March-2011
|
||||||
|
* @brief Header for usbd_flash_if.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __FLASH_IF_MAL_H
|
||||||
|
#define __FLASH_IF_MAL_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
#define FLASH_START_ADD 0x08000000
|
||||||
|
|
||||||
|
#ifdef STM32F2XX
|
||||||
|
#define FLASH_END_ADD 0x08100000
|
||||||
|
#define FLASH_IF_STRING "@Internal Flash /0x08000000/03*016Ka,01*016Kg,01*064Kg,07*128Kg"
|
||||||
|
#elif defined(STM32F10X_CL)
|
||||||
|
#define FLASH_END_ADD 0x08040000
|
||||||
|
#define FLASH_IF_STRING "@Internal Flash /0x08000000/06*002Ka,122*002Kg"
|
||||||
|
#endif /* STM32F2XX */
|
||||||
|
|
||||||
|
|
||||||
|
extern DFU_MAL_Prop_TypeDef DFU_Flash_cb;
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
|
||||||
|
#endif /* __FLASH_IF_MAL_H */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_mem_if_template.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header for usbd_mem_if_template.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __MEM_IF_MAL_H
|
||||||
|
#define __MEM_IF_MAL_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#ifdef STM32F2XX
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
#endif /* STM32F2XX */
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
#define MEM_START_ADD 0x00000000 /* Dummy start address */
|
||||||
|
#define MEM_END_ADD (uint32_t)(MEM_START_ADD + (5 * 1024)) /* Dummy Size = 5KB */
|
||||||
|
|
||||||
|
#define MEM_IF_STRING "@Dummy Memory /0x00000000/01*002Kg,03*001Kg"
|
||||||
|
|
||||||
|
extern DFU_MAL_Prop_TypeDef DFU_Mem_cb;
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
|
||||||
|
#endif /* __MEM_IF_MAL_H */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_otp_if.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header for usbd_otp_if.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __OTP_IF_MAL_H
|
||||||
|
#define __OTP_IF_MAL_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/* Exported types ------------------------------------------------------------*/
|
||||||
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
#define OTP_START_ADD 0x1FFF7800
|
||||||
|
#define OTP_END_ADD (uint32_t)(OTP_START_ADD + 528)
|
||||||
|
|
||||||
|
#define OTP_IF_STRING "@OTP Area /0x1FFF7800/01*512 g,01*016 g"
|
||||||
|
|
||||||
|
extern DFU_MAL_Prop_TypeDef DFU_Otp_cb;
|
||||||
|
|
||||||
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
|
||||||
|
#endif /* __OTP_IF_MAL_H */
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,281 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_dfu_mal.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Generic media access Layer.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
#include "usbd_flash_if.h"
|
||||||
|
|
||||||
|
#ifdef DFU_MAL_SUPPORT_OTP
|
||||||
|
#include "usbd_otp_if.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DFU_MAL_SUPPORT_MEM
|
||||||
|
#include "usbd_mem_if_template.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Global Memories callback and string descriptors reference tables.
|
||||||
|
To add a new memory, modify the value of MAX_USED_MEDIA in usbd_dfu_mal.h
|
||||||
|
and add the pointer to the callback structure in this table.
|
||||||
|
Then add the pointer to the memory string descriptor in usbd_dfu_StringDesc table.
|
||||||
|
No other operation is required. */
|
||||||
|
DFU_MAL_Prop_TypeDef* tMALTab[MAX_USED_MEDIA] = {
|
||||||
|
&DFU_Flash_cb
|
||||||
|
#ifdef DFU_MAL_SUPPORT_OTP
|
||||||
|
, &DFU_Otp_cb
|
||||||
|
#endif
|
||||||
|
#ifdef DFU_MAL_SUPPORT_MEM
|
||||||
|
, &DFU_Mem_cb
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
|
||||||
|
__ALIGN_BEGIN const uint8_t* usbd_dfu_StringDesc[MAX_USED_MEDIA] __ALIGN_END = {
|
||||||
|
FLASH_IF_STRING
|
||||||
|
#ifdef DFU_MAL_SUPPORT_OTP
|
||||||
|
, OTP_IF_STRING
|
||||||
|
#endif
|
||||||
|
#ifdef DFU_MAL_SUPPORT_MEM
|
||||||
|
, MEM_IF_STRING
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
/* RAM Buffer for Downloaded Data */
|
||||||
|
__ALIGN_BEGIN uint8_t MAL_Buffer[XFERSIZE] __ALIGN_END ;
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
static uint8_t MAL_CheckAdd (uint32_t Add);
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_Init
|
||||||
|
* Initializes the Media on the STM32
|
||||||
|
* @param None
|
||||||
|
* @retval Result of the opeartion (MAL_OK in all cases)
|
||||||
|
*/
|
||||||
|
uint16_t MAL_Init(void)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = 0;
|
||||||
|
|
||||||
|
/* Init all supported memories */
|
||||||
|
for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++)
|
||||||
|
{
|
||||||
|
/* If the check addres is positive, exit with the memory index */
|
||||||
|
if (tMALTab[memIdx]->pMAL_Init != NULL)
|
||||||
|
{
|
||||||
|
tMALTab[memIdx]->pMAL_Init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_DeInit
|
||||||
|
* DeInitializes the Media on the STM32
|
||||||
|
* @param None
|
||||||
|
* @retval Result of the opeartion (MAL_OK in all cases)
|
||||||
|
*/
|
||||||
|
uint16_t MAL_DeInit(void)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = 0;
|
||||||
|
|
||||||
|
/* Init all supported memories */
|
||||||
|
for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++)
|
||||||
|
{
|
||||||
|
/* Check if the command is supported */
|
||||||
|
if (tMALTab[memIdx]->pMAL_DeInit != NULL)
|
||||||
|
{
|
||||||
|
tMALTab[memIdx]->pMAL_DeInit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_Erase
|
||||||
|
* Erase a sector of memory.
|
||||||
|
* @param Add: Sector address/code
|
||||||
|
* @retval Result of the opeartion: MAL_OK if all operations are OK else MAL_FAIL
|
||||||
|
*/
|
||||||
|
uint16_t MAL_Erase(uint32_t Add)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = MAL_CheckAdd(Add);
|
||||||
|
|
||||||
|
/* Check if the area is protected */
|
||||||
|
if (DFU_MAL_IS_PROTECTED_AREA(Add))
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memIdx < MAX_USED_MEDIA)
|
||||||
|
{
|
||||||
|
/* Check if the command is supported */
|
||||||
|
if (tMALTab[memIdx]->pMAL_Erase != NULL)
|
||||||
|
{
|
||||||
|
return tMALTab[memIdx]->pMAL_Erase(Add);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_Write
|
||||||
|
* Write sectors of memory.
|
||||||
|
* @param Add: Sector address/code
|
||||||
|
* @param Len: Number of data to be written (in bytes)
|
||||||
|
* @retval Result of the opeartion: MAL_OK if all operations are OK else MAL_FAIL
|
||||||
|
*/
|
||||||
|
uint16_t MAL_Write (uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = MAL_CheckAdd(Add);
|
||||||
|
|
||||||
|
/* Check if the area is protected */
|
||||||
|
if (DFU_MAL_IS_PROTECTED_AREA(Add))
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memIdx < MAX_USED_MEDIA)
|
||||||
|
{
|
||||||
|
/* Check if the command is supported */
|
||||||
|
if (tMALTab[memIdx]->pMAL_Write != NULL)
|
||||||
|
{
|
||||||
|
return tMALTab[memIdx]->pMAL_Write(Add, Len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_Read
|
||||||
|
* Read sectors of memory.
|
||||||
|
* @param Add: Sector address/code
|
||||||
|
* @param Len: Number of data to be written (in bytes)
|
||||||
|
* @retval Buffer pointer
|
||||||
|
*/
|
||||||
|
uint8_t *MAL_Read (uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = MAL_CheckAdd(Add);
|
||||||
|
|
||||||
|
if (memIdx < MAX_USED_MEDIA)
|
||||||
|
{
|
||||||
|
/* Check if the command is supported */
|
||||||
|
if (tMALTab[memIdx]->pMAL_Read != NULL)
|
||||||
|
{
|
||||||
|
return tMALTab[memIdx]->pMAL_Read(Add, Len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_Buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_Buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_GetStatus
|
||||||
|
* Get the status of a given memory.
|
||||||
|
* @param Add: Sector address/code (allow to determine which memory will be addressed)
|
||||||
|
* @param Cmd: 0 for erase and 1 for write
|
||||||
|
* @param buffer: pointer to the buffer where the status data will be stored.
|
||||||
|
* @retval Buffer pointer
|
||||||
|
*/
|
||||||
|
uint16_t MAL_GetStatus(uint32_t Add , uint8_t Cmd, uint8_t *buffer)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = MAL_CheckAdd(Add);
|
||||||
|
|
||||||
|
if (memIdx < MAX_USED_MEDIA)
|
||||||
|
{
|
||||||
|
if (Cmd & 0x01)
|
||||||
|
{
|
||||||
|
SET_POLLING_TIMING(tMALTab[memIdx]->EraseTiming);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SET_POLLING_TIMING(tMALTab[memIdx]->WriteTiming);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MAL_CheckAdd
|
||||||
|
* Determine which memory should be managed.
|
||||||
|
* @param Add: Sector address/code (allow to determine which memory will be addressed)
|
||||||
|
* @retval Index of the addressed memory.
|
||||||
|
*/
|
||||||
|
static uint8_t MAL_CheckAdd(uint32_t Add)
|
||||||
|
{
|
||||||
|
uint32_t memIdx = 0;
|
||||||
|
|
||||||
|
/* Check with all supported memories */
|
||||||
|
for(memIdx = 0; memIdx < MAX_USED_MEDIA; memIdx++)
|
||||||
|
{
|
||||||
|
/* If the check addres is positive, exit with the memory index */
|
||||||
|
if (tMALTab[memIdx]->pMAL_CheckAdd(Add) == MAL_OK)
|
||||||
|
{
|
||||||
|
return memIdx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* If no memory found, return MAX_USED_MEDIA */
|
||||||
|
return (MAX_USED_MEDIA);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,221 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_flash_if.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Specific media access Layer for internal flash.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_flash_if.h"
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
uint16_t FLASH_If_Init(void);
|
||||||
|
uint16_t FLASH_If_Erase (uint32_t Add);
|
||||||
|
uint16_t FLASH_If_Write (uint32_t Add, uint32_t Len);
|
||||||
|
uint8_t *FLASH_If_Read (uint32_t Add, uint32_t Len);
|
||||||
|
uint16_t FLASH_If_DeInit(void);
|
||||||
|
uint16_t FLASH_If_CheckAdd(uint32_t Add);
|
||||||
|
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
DFU_MAL_Prop_TypeDef DFU_Flash_cb =
|
||||||
|
{
|
||||||
|
FLASH_IF_STRING,
|
||||||
|
FLASH_If_Init,
|
||||||
|
FLASH_If_DeInit,
|
||||||
|
FLASH_If_Erase,
|
||||||
|
FLASH_If_Write,
|
||||||
|
FLASH_If_Read,
|
||||||
|
FLASH_If_CheckAdd,
|
||||||
|
50, /* Erase Time in ms */
|
||||||
|
50 /* Programming Time in ms */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief FLASH_If_Init
|
||||||
|
* Memory initialization routine.
|
||||||
|
* @param None
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t FLASH_If_Init(void)
|
||||||
|
{
|
||||||
|
/* Unlock the internal flash */
|
||||||
|
FLASH_Unlock();
|
||||||
|
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief FLASH_If_DeInit
|
||||||
|
* Memory deinitialization routine.
|
||||||
|
* @param None
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t FLASH_If_DeInit(void)
|
||||||
|
{
|
||||||
|
/* Lock the internal flash */
|
||||||
|
FLASH_Lock();
|
||||||
|
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : FLASH_If_Erase
|
||||||
|
* Description : Erase sector
|
||||||
|
* Input : None
|
||||||
|
* Output : None
|
||||||
|
* Return : None
|
||||||
|
*******************************************************************************/
|
||||||
|
uint16_t FLASH_If_Erase(uint32_t Add)
|
||||||
|
{
|
||||||
|
#ifdef STM32F2XX
|
||||||
|
/* Check which sector has to be erased */
|
||||||
|
if (Add < 0x08004000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_0, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08008000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x0800C000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_2, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08010000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_3, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08020000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_4, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08040000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_5, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08060000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_6, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08080000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_7, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x080A0000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_8, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x080C0000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_9, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x080E0000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_10, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else if (Add < 0x08100000)
|
||||||
|
{
|
||||||
|
FLASH_EraseSector(FLASH_Sector_11, VoltageRange_3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
#elif defined(STM32F10X_CL)
|
||||||
|
/* Call the standard Flash erase function */
|
||||||
|
FLASH_ErasePage(Add);
|
||||||
|
#endif /* STM32F2XX */
|
||||||
|
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief FLASH_If_Write
|
||||||
|
* Memory write routine.
|
||||||
|
* @param Add: Address to be written to.
|
||||||
|
* @param Len: Number of data to be written (in bytes).
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t FLASH_If_Write(uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
uint32_t idx = 0;
|
||||||
|
|
||||||
|
if (Len & 0x3) /* Not an aligned data */
|
||||||
|
{
|
||||||
|
for (idx = Len; idx < ((Len & 0xFFFC) + 4); idx++)
|
||||||
|
{
|
||||||
|
MAL_Buffer[idx] = 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Data received are Word multiple */
|
||||||
|
for (idx = 0; idx < Len; idx = idx + 4)
|
||||||
|
{
|
||||||
|
FLASH_ProgramWord(Add, *(uint32_t *)(MAL_Buffer + idx));
|
||||||
|
Add += 4;
|
||||||
|
}
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief FLASH_If_Read
|
||||||
|
* Memory read routine.
|
||||||
|
* @param Add: Address to be read from.
|
||||||
|
* @param Len: Number of data to be read (in bytes).
|
||||||
|
* @retval Pointer to the phyisical address where data should be read.
|
||||||
|
*/
|
||||||
|
uint8_t *FLASH_If_Read (uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
uint32_t idx = 0;
|
||||||
|
for (idx = 0; idx < Len; idx += 4)
|
||||||
|
{
|
||||||
|
*(uint32_t*)(MAL_Buffer + idx) = *(uint32_t *)(Add + idx);
|
||||||
|
}
|
||||||
|
return (uint8_t*)(MAL_Buffer);
|
||||||
|
#else
|
||||||
|
return (uint8_t *)(Add);
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief FLASH_If_CheckAdd
|
||||||
|
* Check if the address is an allowed address for this memory.
|
||||||
|
* @param Add: Address to be checked.
|
||||||
|
* @param Len: Number of data to be read (in bytes).
|
||||||
|
* @retval MAL_OK if the address is allowed, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t FLASH_If_CheckAdd(uint32_t Add)
|
||||||
|
{
|
||||||
|
if ((Add >= FLASH_START_ADD) && (Add < FLASH_END_ADD))
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,133 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_mem_if_template.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Specific media access Layer for a template memory. This file is
|
||||||
|
provided as template example showing how to implement a new memory
|
||||||
|
interface based on pre-defined API.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_mem_if_template.h"
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
uint16_t MEM_If_Init(void);
|
||||||
|
uint16_t MEM_If_Erase (uint32_t Add);
|
||||||
|
uint16_t MEM_If_Write (uint32_t Add, uint32_t Len);
|
||||||
|
uint8_t *MEM_If_Read (uint32_t Add, uint32_t Len);
|
||||||
|
uint16_t MEM_If_DeInit(void);
|
||||||
|
uint16_t MEM_If_CheckAdd(uint32_t Add);
|
||||||
|
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
DFU_MAL_Prop_TypeDef DFU_Mem_cb =
|
||||||
|
{
|
||||||
|
MEM_IF_STRING,
|
||||||
|
MEM_If_Init,
|
||||||
|
MEM_If_DeInit,
|
||||||
|
MEM_If_Erase,
|
||||||
|
MEM_If_Write,
|
||||||
|
MEM_If_Read,
|
||||||
|
MEM_If_CheckAdd,
|
||||||
|
10, /* Erase Time in ms */
|
||||||
|
10 /* Programming Time in ms */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MEM_If_Init
|
||||||
|
* Memory initialization routine.
|
||||||
|
* @param None
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t MEM_If_Init(void)
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MEM_If_DeInit
|
||||||
|
* Memory deinitialization routine.
|
||||||
|
* @param None
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t MEM_If_DeInit(void)
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MEM_If_Erase
|
||||||
|
* Erase sector.
|
||||||
|
* @param Add: Address of sector to be erased.
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t MEM_If_Erase(uint32_t Add)
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MEM_If_Write
|
||||||
|
* Memory write routine.
|
||||||
|
* @param Add: Address to be written to.
|
||||||
|
* @param Len: Number of data to be written (in bytes).
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t MEM_If_Write(uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MEM_If_Read
|
||||||
|
* Memory read routine.
|
||||||
|
* @param Add: Address to be read from.
|
||||||
|
* @param Len: Number of data to be read (in bytes).
|
||||||
|
* @retval Pointer to the phyisical address where data should be read.
|
||||||
|
*/
|
||||||
|
uint8_t *MEM_If_Read (uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
/* Return a valid address to avoid HardFault */
|
||||||
|
return (uint8_t*)(MAL_Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MEM_If_CheckAdd
|
||||||
|
* Check if the address is an allowed address for this memory.
|
||||||
|
* @param Add: Address to be checked.
|
||||||
|
* @param Len: Number of data to be read (in bytes).
|
||||||
|
* @retval MAL_OK if the address is allowed, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t MEM_If_CheckAdd(uint32_t Add)
|
||||||
|
{
|
||||||
|
if ((Add >= MEM_START_ADD) && (Add < MEM_END_ADD))
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_otp_if.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Specific media access Layer for OTP (One Time Programming) memory.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_otp_if.h"
|
||||||
|
#include "usbd_dfu_mal.h"
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
uint16_t OTP_If_Write (uint32_t Add, uint32_t Len);
|
||||||
|
uint8_t *OTP_If_Read (uint32_t Add, uint32_t Len);
|
||||||
|
uint16_t OTP_If_DeInit(void);
|
||||||
|
uint16_t OTP_If_CheckAdd(uint32_t Add);
|
||||||
|
|
||||||
|
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
DFU_MAL_Prop_TypeDef DFU_Otp_cb =
|
||||||
|
{
|
||||||
|
OTP_IF_STRING,
|
||||||
|
NULL, /* Init not supported*/
|
||||||
|
NULL, /* DeInit not supported */
|
||||||
|
NULL, /* Erase not supported */
|
||||||
|
OTP_If_Write,
|
||||||
|
OTP_If_Read,
|
||||||
|
OTP_If_CheckAdd,
|
||||||
|
1, /* Erase Time in ms */
|
||||||
|
10 /* Programming Time in ms */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OTP_If_Write
|
||||||
|
* Memory write routine.
|
||||||
|
* @param Add: Address to be written to.
|
||||||
|
* @param Len: Number of data to be written (in bytes).
|
||||||
|
* @retval MAL_OK if operation is successeful, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t OTP_If_Write(uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
uint32_t idx = 0;
|
||||||
|
|
||||||
|
if (Len & 0x3) /* Not an aligned data */
|
||||||
|
{
|
||||||
|
for (idx = Len; idx < ((Len & 0xFFFC) + 4); idx++)
|
||||||
|
{
|
||||||
|
MAL_Buffer[idx] = 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Data received are Word multiple */
|
||||||
|
for (idx = 0; idx < Len; idx = idx + 4)
|
||||||
|
{
|
||||||
|
FLASH_ProgramWord(Add, *(uint32_t *)(MAL_Buffer + idx));
|
||||||
|
Add += 4;
|
||||||
|
}
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OTP_If_Read
|
||||||
|
* Memory read routine.
|
||||||
|
* @param Add: Address to be read from.
|
||||||
|
* @param Len: Number of data to be read (in bytes).
|
||||||
|
* @retval Pointer to the phyisical address where data should be read.
|
||||||
|
*/
|
||||||
|
uint8_t *OTP_If_Read (uint32_t Add, uint32_t Len)
|
||||||
|
{
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
uint32_t idx = 0;
|
||||||
|
for (idx = 0; idx < Len; idx += 4)
|
||||||
|
{
|
||||||
|
*(uint32_t*)(MAL_Buffer + idx) = *(uint32_t *)(Add + idx);
|
||||||
|
}
|
||||||
|
return (uint8_t*)(MAL_Buffer);
|
||||||
|
#else
|
||||||
|
return (uint8_t*)(Add);
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OTP_If_CheckAdd
|
||||||
|
* Check if the address is an allowed address for this memory.
|
||||||
|
* @param Add: Address to be checked.
|
||||||
|
* @param Len: Number of data to be read (in bytes).
|
||||||
|
* @retval MAL_OK if the address is allowed, MAL_FAIL else.
|
||||||
|
*/
|
||||||
|
uint16_t OTP_If_CheckAdd(uint32_t Add)
|
||||||
|
{
|
||||||
|
if ((Add >= OTP_START_ADD) && (Add < OTP_END_ADD))
|
||||||
|
{
|
||||||
|
return MAL_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MAL_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_hid_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_hid_core.c file.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_HID_CORE_H_
|
||||||
|
#define __USB_HID_CORE_H_
|
||||||
|
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID
|
||||||
|
* @brief This file is the Header file for USBD_msc.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USB_HID_CONFIG_DESC_SIZ 34
|
||||||
|
#define USB_HID_DESC_SIZ 9
|
||||||
|
#define HID_MOUSE_REPORT_DESC_SIZE 74
|
||||||
|
|
||||||
|
#define HID_DESCRIPTOR_TYPE 0x21
|
||||||
|
#define HID_REPORT_DESC 0x22
|
||||||
|
|
||||||
|
|
||||||
|
#define HID_REQ_SET_PROTOCOL 0x0B
|
||||||
|
#define HID_REQ_GET_PROTOCOL 0x03
|
||||||
|
|
||||||
|
#define HID_REQ_SET_IDLE 0x0A
|
||||||
|
#define HID_REQ_GET_IDLE 0x02
|
||||||
|
|
||||||
|
#define HID_REQ_SET_REPORT 0x09
|
||||||
|
#define HID_REQ_GET_REPORT 0x01
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern USBD_Class_cb_TypeDef USBD_HID_cb;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
uint8_t USBD_HID_SendReport (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *report,
|
||||||
|
uint16_t len);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif // __USB_HID_CORE_H_
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,460 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_hid_core.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the HID core functions.
|
||||||
|
*
|
||||||
|
* @verbatim
|
||||||
|
*
|
||||||
|
* ===================================================================
|
||||||
|
* HID Class Description
|
||||||
|
* ===================================================================
|
||||||
|
* This module manages the HID class V1.11 following the "Device Class Definition
|
||||||
|
* for Human Interface Devices (HID) Version 1.11 Jun 27, 2001".
|
||||||
|
* This driver implements the following aspects of the specification:
|
||||||
|
* - The Boot Interface Subclass
|
||||||
|
* - The Mouse protocol
|
||||||
|
* - Usage Page : Generic Desktop
|
||||||
|
* - Usage : Joystick)
|
||||||
|
* - Collection : Application
|
||||||
|
*
|
||||||
|
* @note In HS mode and when the DMA is used, all variables and data structures
|
||||||
|
* dealing with the DMA during the transaction process should be 32-bit aligned.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @endverbatim
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_hid_core.h"
|
||||||
|
#include "usbd_desc.h"
|
||||||
|
#include "usbd_req.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID
|
||||||
|
* @brief usbd core module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t USBD_HID_Init (void *pdev,
|
||||||
|
uint8_t cfgidx);
|
||||||
|
|
||||||
|
static uint8_t USBD_HID_DeInit (void *pdev,
|
||||||
|
uint8_t cfgidx);
|
||||||
|
|
||||||
|
static uint8_t USBD_HID_Setup (void *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length);
|
||||||
|
|
||||||
|
static uint8_t USBD_HID_DataIn (void *pdev, uint8_t epnum);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
USBD_Class_cb_TypeDef USBD_HID_cb =
|
||||||
|
{
|
||||||
|
USBD_HID_Init,
|
||||||
|
USBD_HID_DeInit,
|
||||||
|
USBD_HID_Setup,
|
||||||
|
NULL, /*EP0_TxSent*/
|
||||||
|
NULL, /*EP0_RxReady*/
|
||||||
|
USBD_HID_DataIn, /*DataIn*/
|
||||||
|
NULL, /*DataOut*/
|
||||||
|
NULL, /*SOF */
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
USBD_HID_GetCfgDesc,
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
USBD_HID_GetCfgDesc, /* use same config as per FS */
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static uint32_t USBD_HID_AltSet __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static uint32_t USBD_HID_Protocol __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static uint32_t USBD_HID_IdleState __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
/* USB HID device Configuration Descriptor */
|
||||||
|
__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
|
||||||
|
{
|
||||||
|
0x09, /* bLength: Configuration Descriptor size */
|
||||||
|
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
|
||||||
|
USB_HID_CONFIG_DESC_SIZ,
|
||||||
|
/* wTotalLength: Bytes returned */
|
||||||
|
0x00,
|
||||||
|
0x01, /*bNumInterfaces: 1 interface*/
|
||||||
|
0x01, /*bConfigurationValue: Configuration value*/
|
||||||
|
0x00, /*iConfiguration: Index of string descriptor describing
|
||||||
|
the configuration*/
|
||||||
|
0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */
|
||||||
|
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
|
||||||
|
|
||||||
|
/************** Descriptor of Joystick Mouse interface ****************/
|
||||||
|
/* 09 */
|
||||||
|
0x09, /*bLength: Interface Descriptor size*/
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
|
||||||
|
0x00, /*bInterfaceNumber: Number of Interface*/
|
||||||
|
0x00, /*bAlternateSetting: Alternate setting*/
|
||||||
|
0x01, /*bNumEndpoints*/
|
||||||
|
0x03, /*bInterfaceClass: HID*/
|
||||||
|
0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
|
||||||
|
0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
|
||||||
|
0, /*iInterface: Index of string descriptor*/
|
||||||
|
/******************** Descriptor of Joystick Mouse HID ********************/
|
||||||
|
/* 18 */
|
||||||
|
0x09, /*bLength: HID Descriptor size*/
|
||||||
|
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
|
||||||
|
0x11, /*bcdHID: HID Class Spec release number*/
|
||||||
|
0x01,
|
||||||
|
0x00, /*bCountryCode: Hardware target country*/
|
||||||
|
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
|
||||||
|
0x22, /*bDescriptorType*/
|
||||||
|
HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
|
||||||
|
0x00,
|
||||||
|
/******************** Descriptor of Mouse endpoint ********************/
|
||||||
|
/* 27 */
|
||||||
|
0x07, /*bLength: Endpoint Descriptor size*/
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
|
||||||
|
|
||||||
|
HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/
|
||||||
|
0x03, /*bmAttributes: Interrupt endpoint*/
|
||||||
|
HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */
|
||||||
|
0x00,
|
||||||
|
0x0A, /*bInterval: Polling Interval (10 ms)*/
|
||||||
|
/* 34 */
|
||||||
|
} ;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
|
||||||
|
{
|
||||||
|
0x05, 0x01,
|
||||||
|
0x09, 0x02,
|
||||||
|
0xA1, 0x01,
|
||||||
|
0x09, 0x01,
|
||||||
|
|
||||||
|
0xA1, 0x00,
|
||||||
|
0x05, 0x09,
|
||||||
|
0x19, 0x01,
|
||||||
|
0x29, 0x03,
|
||||||
|
|
||||||
|
0x15, 0x00,
|
||||||
|
0x25, 0x01,
|
||||||
|
0x95, 0x03,
|
||||||
|
0x75, 0x01,
|
||||||
|
|
||||||
|
0x81, 0x02,
|
||||||
|
0x95, 0x01,
|
||||||
|
0x75, 0x05,
|
||||||
|
0x81, 0x01,
|
||||||
|
|
||||||
|
0x05, 0x01,
|
||||||
|
0x09, 0x30,
|
||||||
|
0x09, 0x31,
|
||||||
|
0x09, 0x38,
|
||||||
|
|
||||||
|
0x15, 0x81,
|
||||||
|
0x25, 0x7F,
|
||||||
|
0x75, 0x08,
|
||||||
|
0x95, 0x03,
|
||||||
|
|
||||||
|
0x81, 0x06,
|
||||||
|
0xC0, 0x09,
|
||||||
|
0x3c, 0x05,
|
||||||
|
0xff, 0x09,
|
||||||
|
|
||||||
|
0x01, 0x15,
|
||||||
|
0x00, 0x25,
|
||||||
|
0x01, 0x75,
|
||||||
|
0x01, 0x95,
|
||||||
|
|
||||||
|
0x02, 0xb1,
|
||||||
|
0x22, 0x75,
|
||||||
|
0x06, 0x95,
|
||||||
|
0x01, 0xb1,
|
||||||
|
|
||||||
|
0x01, 0xc0
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_HID_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_HID_Init
|
||||||
|
* Initialize the HID interface
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: Configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_HID_Init (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Open EP IN */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
HID_IN_EP,
|
||||||
|
HID_IN_PACKET,
|
||||||
|
USB_OTG_EP_INT);
|
||||||
|
|
||||||
|
/* Open EP OUT */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
HID_OUT_EP,
|
||||||
|
HID_OUT_PACKET,
|
||||||
|
USB_OTG_EP_INT);
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_HID_Init
|
||||||
|
* DeInitialize the HID layer
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: Configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_HID_DeInit (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
/* Close HID EPs */
|
||||||
|
DCD_EP_Close (pdev , HID_IN_EP);
|
||||||
|
DCD_EP_Close (pdev , HID_OUT_EP);
|
||||||
|
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_HID_Setup
|
||||||
|
* Handle the HID specific requests
|
||||||
|
* @param pdev: instance
|
||||||
|
* @param req: usb requests
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_HID_Setup (void *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
uint16_t len = 0;
|
||||||
|
uint8_t *pbuf = NULL;
|
||||||
|
|
||||||
|
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
||||||
|
{
|
||||||
|
case USB_REQ_TYPE_CLASS :
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
case HID_REQ_SET_PROTOCOL:
|
||||||
|
USBD_HID_Protocol = (uint8_t)(req->wValue);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HID_REQ_GET_PROTOCOL:
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&USBD_HID_Protocol,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HID_REQ_SET_IDLE:
|
||||||
|
USBD_HID_IdleState = (uint8_t)(req->wValue >> 8);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HID_REQ_GET_IDLE:
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&USBD_HID_IdleState,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError (pdev, req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_TYPE_STANDARD:
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case USB_REQ_GET_DESCRIPTOR:
|
||||||
|
if( req->wValue >> 8 == HID_REPORT_DESC)
|
||||||
|
{
|
||||||
|
len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength);
|
||||||
|
pbuf = HID_MOUSE_ReportDesc;
|
||||||
|
}
|
||||||
|
else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
|
||||||
|
{
|
||||||
|
|
||||||
|
//#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
// pbuf = USBD_HID_Desc;
|
||||||
|
//#else
|
||||||
|
pbuf = USBD_HID_CfgDesc + 0x12;
|
||||||
|
//#endif
|
||||||
|
len = MIN(USB_HID_DESC_SIZ , req->wLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
pbuf,
|
||||||
|
len);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_INTERFACE :
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&USBD_HID_AltSet,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_SET_INTERFACE :
|
||||||
|
USBD_HID_AltSet = (uint8_t)(req->wValue);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_HID_SendReport
|
||||||
|
* Send HID Report
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param buff: pointer to report
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint8_t USBD_HID_SendReport (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *report,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
if (pdev->dev.device_status == USB_OTG_CONFIGURED )
|
||||||
|
{
|
||||||
|
DCD_EP_Tx (pdev, HID_IN_EP, report, len);
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_HID_GetCfgDesc
|
||||||
|
* return configuration descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer data length
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
static uint8_t *USBD_HID_GetCfgDesc (uint8_t speed, uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof (USBD_HID_CfgDesc);
|
||||||
|
return USBD_HID_CfgDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_HID_DataIn
|
||||||
|
* handle data IN Stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_HID_DataIn (void *pdev,
|
||||||
|
uint8_t epnum)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Ensure that the FIFO is empty before a new transfer, this condition could
|
||||||
|
be caused by a new transfer before the end of the previous transfer */
|
||||||
|
DCD_EP_Flush(pdev, HID_IN_EP);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,147 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_bot.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header for the usbd_msc_bot.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#include "usbd_core.h"
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_MSC_BOT_H
|
||||||
|
#define __USBD_MSC_BOT_H
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT
|
||||||
|
* @brief This file is the Header file for usbd_bot.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define BOT_IDLE 0 /* Idle state */
|
||||||
|
#define BOT_DATA_OUT 1 /* Data Out state */
|
||||||
|
#define BOT_DATA_IN 2 /* Data In state */
|
||||||
|
#define BOT_LAST_DATA_IN 3 /* Last Data In Last */
|
||||||
|
#define BOT_SEND_DATA 4 /* Send Immediate data */
|
||||||
|
|
||||||
|
#define BOT_CBW_SIGNATURE 0x43425355
|
||||||
|
#define BOT_CSW_SIGNATURE 0x53425355
|
||||||
|
#define BOT_CBW_LENGTH 31
|
||||||
|
#define BOT_CSW_LENGTH 13
|
||||||
|
|
||||||
|
/* CSW Status Definitions */
|
||||||
|
#define CSW_CMD_PASSED 0x00
|
||||||
|
#define CSW_CMD_FAILED 0x01
|
||||||
|
#define CSW_PHASE_ERROR 0x02
|
||||||
|
|
||||||
|
/* BOT Status */
|
||||||
|
#define BOT_STATE_NORMAL 0
|
||||||
|
#define BOT_STATE_RECOVERY 1
|
||||||
|
#define BOT_STATE_ERROR 2
|
||||||
|
|
||||||
|
|
||||||
|
#define DIR_IN 0
|
||||||
|
#define DIR_OUT 1
|
||||||
|
#define BOTH_DIR 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _MSC_BOT_CBW
|
||||||
|
{
|
||||||
|
uint32_t dSignature;
|
||||||
|
uint32_t dTag;
|
||||||
|
uint32_t dDataLength;
|
||||||
|
uint8_t bmFlags;
|
||||||
|
uint8_t bLUN;
|
||||||
|
uint8_t bCBLength;
|
||||||
|
uint8_t CB[16];
|
||||||
|
}
|
||||||
|
MSC_BOT_CBW_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _MSC_BOT_CSW
|
||||||
|
{
|
||||||
|
uint32_t dSignature;
|
||||||
|
uint32_t dTag;
|
||||||
|
uint32_t dDataResidue;
|
||||||
|
uint8_t bStatus;
|
||||||
|
}
|
||||||
|
MSC_BOT_CSW_TypeDef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern uint8_t MSC_BOT_Data[];
|
||||||
|
extern uint16_t MSC_BOT_DataLen;
|
||||||
|
extern uint8_t MSC_BOT_State;
|
||||||
|
extern uint8_t MSC_BOT_BurstMode;
|
||||||
|
extern MSC_BOT_CBW_TypeDef MSC_BOT_cbw;
|
||||||
|
extern MSC_BOT_CSW_TypeDef MSC_BOT_csw;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/** @defgroup USBD_CORE_Exported_FunctionsPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
void MSC_BOT_Init (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void MSC_BOT_Reset (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void MSC_BOT_DeInit (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void MSC_BOT_DataIn (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
|
||||||
|
void MSC_BOT_DataOut (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
|
||||||
|
void MSC_BOT_SendCSW (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t CSW_Status);
|
||||||
|
|
||||||
|
void MSC_BOT_CplClrFeature (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_MSC_BOT_H */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header for the usbd_msc_core.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef _USB_MSC_CORE_H_
|
||||||
|
#define _USB_MSC_CORE_H_
|
||||||
|
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
|
||||||
|
/** @addtogroup USBD_MSC_BOT
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_MSC
|
||||||
|
* @brief This file is the Header file for USBD_msc.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_BOT_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define BOT_GET_MAX_LUN 0xFE
|
||||||
|
#define BOT_RESET 0xFF
|
||||||
|
#define USB_MSC_CONFIG_DESC_SIZ 32
|
||||||
|
|
||||||
|
#define MSC_EPIN_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 22)
|
||||||
|
|
||||||
|
#define MSC_EPOUT_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 29)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern USBD_Class_cb_TypeDef USBD_MSC_cb;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
#endif // _USB_MSC_CORE_H_
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_data.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header for the usbd_msc_data.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef _USBD_MSC_DATA_H_
|
||||||
|
#define _USBD_MSC_DATA_H_
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_INFO
|
||||||
|
* @brief general defines for the usb device library file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_INFO_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define MODE_SENSE6_LEN 8
|
||||||
|
#define MODE_SENSE10_LEN 8
|
||||||
|
#define LENGTH_INQUIRY_PAGE00 7
|
||||||
|
#define LENGTH_FORMAT_CAPACITIES 20
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_INFO_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_INFO_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_INFO_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
extern const uint8_t MSC_Page00_Inquiry_Data[];
|
||||||
|
extern const uint8_t MSC_Mode_Sense6_data[];
|
||||||
|
extern const uint8_t MSC_Mode_Sense10_data[] ;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_INFO_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* _USBD_MSC_DATA_H_ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_mem.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header for the STORAGE DISK file file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBD_MEM_H
|
||||||
|
#define __USBD_MEM_H
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_def.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_MEM
|
||||||
|
* @brief header file for the storage disk file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_MEM_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USBD_STD_INQUIRY_LENGTH 36
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_MEM_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _USBD_STORAGE
|
||||||
|
{
|
||||||
|
int8_t (* Init) (uint8_t lun);
|
||||||
|
int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint32_t *block_size);
|
||||||
|
int8_t (* IsReady) (uint8_t lun);
|
||||||
|
int8_t (* IsWriteProtected) (uint8_t lun);
|
||||||
|
int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
||||||
|
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
||||||
|
int8_t (* GetMaxLun)(void);
|
||||||
|
int8_t *pInquiry;
|
||||||
|
|
||||||
|
}USBD_STORAGE_cb_TypeDef;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_MEM_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_MEM_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_MEM_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
extern USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_MEM_H */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,189 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_scsi.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header for the usbd_msc_scsi.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_MSC_SCSI_H
|
||||||
|
#define __USBD_MSC_SCSI_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_def.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_SCSI
|
||||||
|
* @brief header file for the storage disk file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_SCSI_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SENSE_LIST_DEEPTH 4
|
||||||
|
|
||||||
|
/* SCSI Commands */
|
||||||
|
#define SCSI_FORMAT_UNIT 0x04
|
||||||
|
#define SCSI_INQUIRY 0x12
|
||||||
|
#define SCSI_MODE_SELECT6 0x15
|
||||||
|
#define SCSI_MODE_SELECT10 0x55
|
||||||
|
#define SCSI_MODE_SENSE6 0x1A
|
||||||
|
#define SCSI_MODE_SENSE10 0x5A
|
||||||
|
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E
|
||||||
|
#define SCSI_READ6 0x08
|
||||||
|
#define SCSI_READ10 0x28
|
||||||
|
#define SCSI_READ12 0xA8
|
||||||
|
#define SCSI_READ16 0x88
|
||||||
|
|
||||||
|
#define SCSI_READ_CAPACITY10 0x25
|
||||||
|
#define SCSI_READ_CAPACITY16 0x9E
|
||||||
|
|
||||||
|
#define SCSI_REQUEST_SENSE 0x03
|
||||||
|
#define SCSI_START_STOP_UNIT 0x1B
|
||||||
|
#define SCSI_TEST_UNIT_READY 0x00
|
||||||
|
#define SCSI_WRITE6 0x0A
|
||||||
|
#define SCSI_WRITE10 0x2A
|
||||||
|
#define SCSI_WRITE12 0xAA
|
||||||
|
#define SCSI_WRITE16 0x8A
|
||||||
|
|
||||||
|
#define SCSI_VERIFY10 0x2F
|
||||||
|
#define SCSI_VERIFY12 0xAF
|
||||||
|
#define SCSI_VERIFY16 0x8F
|
||||||
|
|
||||||
|
#define SCSI_SEND_DIAGNOSTIC 0x1D
|
||||||
|
#define SCSI_READ_FORMAT_CAPACITIES 0x23
|
||||||
|
|
||||||
|
#define NO_SENSE 0
|
||||||
|
#define RECOVERED_ERROR 1
|
||||||
|
#define NOT_READY 2
|
||||||
|
#define MEDIUM_ERROR 3
|
||||||
|
#define HARDWARE_ERROR 4
|
||||||
|
#define ILLEGAL_REQUEST 5
|
||||||
|
#define UNIT_ATTENTION 6
|
||||||
|
#define DATA_PROTECT 7
|
||||||
|
#define BLANK_CHECK 8
|
||||||
|
#define VENDOR_SPECIFIC 9
|
||||||
|
#define COPY_ABORTED 10
|
||||||
|
#define ABORTED_COMMAND 11
|
||||||
|
#define VOLUME_OVERFLOW 13
|
||||||
|
#define MISCOMPARE 14
|
||||||
|
|
||||||
|
|
||||||
|
#define INVALID_CDB 0x20
|
||||||
|
#define INVALID_FIELED_IN_COMMAND 0x24
|
||||||
|
#define PARAMETER_LIST_LENGTH_ERROR 0x1A
|
||||||
|
#define INVALID_FIELD_IN_PARAMETER_LIST 0x26
|
||||||
|
#define ADDRESS_OUT_OF_RANGE 0x21
|
||||||
|
#define MEDIUM_NOT_PRESENT 0x3A
|
||||||
|
#define MEDIUM_HAVE_CHANGED 0x28
|
||||||
|
#define WRITE_PROTECTED 0x27
|
||||||
|
#define UNRECOVERED_READ_ERROR 0x11
|
||||||
|
#define WRITE_FAULT 0x03
|
||||||
|
|
||||||
|
#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C
|
||||||
|
#define READ_CAPACITY10_DATA_LEN 0x08
|
||||||
|
#define MODE_SENSE10_DATA_LEN 0x08
|
||||||
|
#define MODE_SENSE6_DATA_LEN 0x04
|
||||||
|
#define REQUEST_SENSE_DATA_LEN 0x12
|
||||||
|
#define STANDARD_INQUIRY_DATA_LEN 0x24
|
||||||
|
#define BLKVFY 0x04
|
||||||
|
|
||||||
|
extern uint8_t Page00_Inquiry_Data[];
|
||||||
|
extern uint8_t Standard_Inquiry_Data[];
|
||||||
|
extern uint8_t Standard_Inquiry_Data2[];
|
||||||
|
extern uint8_t Mode_Sense6_data[];
|
||||||
|
extern uint8_t Mode_Sense10_data[];
|
||||||
|
extern uint8_t Scsi_Sense_Data[];
|
||||||
|
extern uint8_t ReadCapacity10_Data[];
|
||||||
|
extern uint8_t ReadFormatCapacity_Data [];
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_SCSI_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _SENSE_ITEM {
|
||||||
|
char Skey;
|
||||||
|
union {
|
||||||
|
struct _ASCs {
|
||||||
|
char ASC;
|
||||||
|
char ASCQ;
|
||||||
|
}b;
|
||||||
|
unsigned int ASC;
|
||||||
|
char *pData;
|
||||||
|
} w;
|
||||||
|
} SCSI_Sense_TypeDef;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_SCSI_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_SCSI_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
extern SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH];
|
||||||
|
extern uint8_t SCSI_Sense_Head;
|
||||||
|
extern uint8_t SCSI_Sense_Tail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/** @defgroup USBD_SCSI_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
int8_t SCSI_ProcessCmd(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t lun,
|
||||||
|
uint8_t *cmd);
|
||||||
|
|
||||||
|
void SCSI_SenseCode(uint8_t lun,
|
||||||
|
uint8_t sKey,
|
||||||
|
uint8_t ASC);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_MSC_SCSI_H */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
@ -0,0 +1,393 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_bot.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides all the BOT protocol core functions.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_msc_bot.h"
|
||||||
|
#include "usbd_msc_scsi.h"
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
#include "usbd_msc_mem.h"
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT
|
||||||
|
* @brief BOT protocol module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
uint16_t MSC_BOT_DataLen;
|
||||||
|
uint8_t MSC_BOT_State;
|
||||||
|
uint8_t MSC_BOT_Status;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET] __ALIGN_END ;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN MSC_BOT_CBW_TypeDef MSC_BOT_cbw __ALIGN_END ;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN MSC_BOT_CSW_TypeDef MSC_BOT_csw __ALIGN_END ;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
static void MSC_BOT_CBW_Decode (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
static void MSC_BOT_SendData (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t* pbuf,
|
||||||
|
uint16_t len);
|
||||||
|
|
||||||
|
static void MSC_BOT_Abort(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_BOT_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_Init
|
||||||
|
* Initialize the BOT Process
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MSC_BOT_Init (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
MSC_BOT_State = BOT_IDLE;
|
||||||
|
MSC_BOT_Status = BOT_STATE_NORMAL;
|
||||||
|
USBD_STORAGE_fops->Init(0);
|
||||||
|
|
||||||
|
DCD_EP_Flush(pdev, MSC_OUT_EP);
|
||||||
|
DCD_EP_Flush(pdev, MSC_IN_EP);
|
||||||
|
/* Prapare EP to Receive First BOT Cmd */
|
||||||
|
DCD_EP_PrepareRx (pdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
(uint8_t *)&MSC_BOT_cbw,
|
||||||
|
BOT_CBW_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_Reset
|
||||||
|
* Reset the BOT Machine
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MSC_BOT_Reset (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
MSC_BOT_State = BOT_IDLE;
|
||||||
|
MSC_BOT_Status = BOT_STATE_RECOVERY;
|
||||||
|
/* Prapare EP to Receive First BOT Cmd */
|
||||||
|
DCD_EP_PrepareRx (pdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
(uint8_t *)&MSC_BOT_cbw,
|
||||||
|
BOT_CBW_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_DeInit
|
||||||
|
* Uninitialize the BOT Machine
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MSC_BOT_DeInit (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
MSC_BOT_State = BOT_IDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_DataIn
|
||||||
|
* Handle BOT IN data stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MSC_BOT_DataIn (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (MSC_BOT_State)
|
||||||
|
{
|
||||||
|
case BOT_DATA_IN:
|
||||||
|
if(SCSI_ProcessCmd(pdev,
|
||||||
|
MSC_BOT_cbw.bLUN,
|
||||||
|
&MSC_BOT_cbw.CB[0]) < 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOT_SEND_DATA:
|
||||||
|
case BOT_LAST_DATA_IN:
|
||||||
|
MSC_BOT_SendCSW (pdev, CSW_CMD_PASSED);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_DataOut
|
||||||
|
* Proccess MSC OUT data
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MSC_BOT_DataOut (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum)
|
||||||
|
{
|
||||||
|
switch (MSC_BOT_State)
|
||||||
|
{
|
||||||
|
case BOT_IDLE:
|
||||||
|
MSC_BOT_CBW_Decode(pdev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOT_DATA_OUT:
|
||||||
|
|
||||||
|
if(SCSI_ProcessCmd(pdev,
|
||||||
|
MSC_BOT_cbw.bLUN,
|
||||||
|
&MSC_BOT_cbw.CB[0]) < 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_CBW_Decode
|
||||||
|
* Decode the CBW command and set the BOT state machine accordingtly
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MSC_BOT_CBW_Decode (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
MSC_BOT_csw.dTag = MSC_BOT_cbw.dTag;
|
||||||
|
MSC_BOT_csw.dDataResidue = MSC_BOT_cbw.dDataLength;
|
||||||
|
|
||||||
|
if ((USBD_GetRxCount (pdev ,MSC_OUT_EP) != BOT_CBW_LENGTH) ||
|
||||||
|
(MSC_BOT_cbw.dSignature != BOT_CBW_SIGNATURE)||
|
||||||
|
(MSC_BOT_cbw.bLUN > 1) ||
|
||||||
|
(MSC_BOT_cbw.bCBLength < 1) ||
|
||||||
|
(MSC_BOT_cbw.bCBLength > 16))
|
||||||
|
{
|
||||||
|
|
||||||
|
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
MSC_BOT_Status = BOT_STATE_ERROR;
|
||||||
|
MSC_BOT_Abort(pdev);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(SCSI_ProcessCmd(pdev,
|
||||||
|
MSC_BOT_cbw.bLUN,
|
||||||
|
&MSC_BOT_cbw.CB[0]) < 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_Abort(pdev);
|
||||||
|
}
|
||||||
|
/*Burst xfer handled internally*/
|
||||||
|
else if ((MSC_BOT_State != BOT_DATA_IN) &&
|
||||||
|
(MSC_BOT_State != BOT_DATA_OUT) &&
|
||||||
|
(MSC_BOT_State != BOT_LAST_DATA_IN))
|
||||||
|
{
|
||||||
|
if (MSC_BOT_DataLen > 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_SendData(pdev,
|
||||||
|
MSC_BOT_Data,
|
||||||
|
MSC_BOT_DataLen);
|
||||||
|
}
|
||||||
|
else if (MSC_BOT_DataLen == 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_SendCSW (pdev,
|
||||||
|
CSW_CMD_PASSED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_SendData
|
||||||
|
* Send the requested data
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param buf: pointer to data buffer
|
||||||
|
* @param len: Data Length
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void MSC_BOT_SendData(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t* buf,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
|
||||||
|
len = MIN (MSC_BOT_cbw.dDataLength, len);
|
||||||
|
MSC_BOT_csw.dDataResidue -= len;
|
||||||
|
MSC_BOT_csw.bStatus = CSW_CMD_PASSED;
|
||||||
|
MSC_BOT_State = BOT_SEND_DATA;
|
||||||
|
|
||||||
|
DCD_EP_Tx (pdev, MSC_IN_EP, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_SendCSW
|
||||||
|
* Send the Command Status Wrapper
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param status : CSW status
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void MSC_BOT_SendCSW (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t CSW_Status)
|
||||||
|
{
|
||||||
|
MSC_BOT_csw.dSignature = BOT_CSW_SIGNATURE;
|
||||||
|
MSC_BOT_csw.bStatus = CSW_Status;
|
||||||
|
MSC_BOT_State = BOT_IDLE;
|
||||||
|
|
||||||
|
DCD_EP_Tx (pdev,
|
||||||
|
MSC_IN_EP,
|
||||||
|
(uint8_t *)&MSC_BOT_csw,
|
||||||
|
BOT_CSW_LENGTH);
|
||||||
|
|
||||||
|
/* Prapare EP to Receive next Cmd */
|
||||||
|
DCD_EP_PrepareRx (pdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
(uint8_t *)&MSC_BOT_cbw,
|
||||||
|
BOT_CBW_LENGTH);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_Abort
|
||||||
|
* Abort the current transfer
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void MSC_BOT_Abort (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((MSC_BOT_cbw.bmFlags == 0) &&
|
||||||
|
(MSC_BOT_cbw.dDataLength != 0) &&
|
||||||
|
(MSC_BOT_Status == BOT_STATE_NORMAL) )
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev, MSC_OUT_EP );
|
||||||
|
}
|
||||||
|
DCD_EP_Stall(pdev, MSC_IN_EP);
|
||||||
|
|
||||||
|
if(MSC_BOT_Status == BOT_STATE_ERROR)
|
||||||
|
{
|
||||||
|
DCD_EP_PrepareRx (pdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
(uint8_t *)&MSC_BOT_cbw,
|
||||||
|
BOT_CBW_LENGTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief MSC_BOT_CplClrFeature
|
||||||
|
* Complete the clear feature request
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MSC_BOT_CplClrFeature (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
if(MSC_BOT_Status == BOT_STATE_ERROR )/* Bad CBW Signature */
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev, MSC_IN_EP);
|
||||||
|
MSC_BOT_Status = BOT_STATE_NORMAL;
|
||||||
|
}
|
||||||
|
else if(((epnum & 0x80) == 0x80) && ( MSC_BOT_Status != BOT_STATE_RECOVERY))
|
||||||
|
{
|
||||||
|
MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,490 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_core.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides all the MSC core functions.
|
||||||
|
*
|
||||||
|
* @verbatim
|
||||||
|
*
|
||||||
|
* ===================================================================
|
||||||
|
* MSC Class Description
|
||||||
|
* ===================================================================
|
||||||
|
* This module manages the MSC class V1.0 following the "Universal
|
||||||
|
* Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0
|
||||||
|
* Sep. 31, 1999".
|
||||||
|
* This driver implements the following aspects of the specification:
|
||||||
|
* - Bulk-Only Transport protocol
|
||||||
|
* - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3))
|
||||||
|
*
|
||||||
|
* @endverbatim
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_msc_mem.h"
|
||||||
|
#include "usbd_msc_core.h"
|
||||||
|
#include "usbd_msc_bot.h"
|
||||||
|
#include "usbd_req.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE
|
||||||
|
* @brief Mass storage core module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
uint8_t USBD_MSC_Init (void *pdev,
|
||||||
|
uint8_t cfgidx);
|
||||||
|
|
||||||
|
uint8_t USBD_MSC_DeInit (void *pdev,
|
||||||
|
uint8_t cfgidx);
|
||||||
|
|
||||||
|
uint8_t USBD_MSC_Setup (void *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
uint8_t USBD_MSC_DataIn (void *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t USBD_MSC_DataOut (void *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
|
||||||
|
uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed,
|
||||||
|
uint16_t *length);
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
uint8_t *USBD_MSC_GetOtherCfgDesc (uint8_t speed,
|
||||||
|
uint16_t *length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
USBD_Class_cb_TypeDef USBD_MSC_cb =
|
||||||
|
{
|
||||||
|
USBD_MSC_Init,
|
||||||
|
USBD_MSC_DeInit,
|
||||||
|
USBD_MSC_Setup,
|
||||||
|
NULL, /*EP0_TxSent*/
|
||||||
|
NULL, /*EP0_RxReady*/
|
||||||
|
USBD_MSC_DataIn,
|
||||||
|
USBD_MSC_DataOut,
|
||||||
|
NULL, /*SOF */
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
USBD_MSC_GetCfgDesc,
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
USBD_MSC_GetOtherCfgDesc,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
/* USB Mass storage device Configuration Descriptor */
|
||||||
|
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
|
||||||
|
__ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
|
||||||
|
{
|
||||||
|
|
||||||
|
0x09, /* bLength: Configuation Descriptor size */
|
||||||
|
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
||||||
|
USB_MSC_CONFIG_DESC_SIZ,
|
||||||
|
|
||||||
|
0x00,
|
||||||
|
0x01, /* bNumInterfaces: 1 interface */
|
||||||
|
0x01, /* bConfigurationValue: */
|
||||||
|
0x04, /* iConfiguration: */
|
||||||
|
0xC0, /* bmAttributes: */
|
||||||
|
0x32, /* MaxPower 100 mA */
|
||||||
|
|
||||||
|
/******************** Mass Storage interface ********************/
|
||||||
|
0x09, /* bLength: Interface Descriptor size */
|
||||||
|
0x04, /* bDescriptorType: */
|
||||||
|
0x00, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x02, /* bNumEndpoints*/
|
||||||
|
0x08, /* bInterfaceClass: MSC Class */
|
||||||
|
0x06, /* bInterfaceSubClass : SCSI transparent*/
|
||||||
|
0x50, /* nInterfaceProtocol */
|
||||||
|
0x05, /* iInterface: */
|
||||||
|
/******************** Mass Storage Endpoints ********************/
|
||||||
|
0x07, /*Endpoint descriptor length = 7*/
|
||||||
|
0x05, /*Endpoint descriptor type */
|
||||||
|
MSC_IN_EP, /*Endpoint address (IN, address 1) */
|
||||||
|
0x02, /*Bulk endpoint type */
|
||||||
|
LOBYTE(MSC_MAX_PACKET),
|
||||||
|
HIBYTE(MSC_MAX_PACKET),
|
||||||
|
0x00, /*Polling interval in milliseconds */
|
||||||
|
|
||||||
|
0x07, /*Endpoint descriptor length = 7 */
|
||||||
|
0x05, /*Endpoint descriptor type */
|
||||||
|
MSC_OUT_EP, /*Endpoint address (OUT, address 1) */
|
||||||
|
0x02, /*Bulk endpoint type */
|
||||||
|
LOBYTE(MSC_MAX_PACKET),
|
||||||
|
HIBYTE(MSC_MAX_PACKET),
|
||||||
|
0x00 /*Polling interval in milliseconds*/
|
||||||
|
};
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t USBD_MSC_OtherCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
|
||||||
|
{
|
||||||
|
|
||||||
|
0x09, /* bLength: Configuation Descriptor size */
|
||||||
|
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
||||||
|
USB_MSC_CONFIG_DESC_SIZ,
|
||||||
|
|
||||||
|
0x00,
|
||||||
|
0x01, /* bNumInterfaces: 1 interface */
|
||||||
|
0x01, /* bConfigurationValue: */
|
||||||
|
0x04, /* iConfiguration: */
|
||||||
|
0xC0, /* bmAttributes: */
|
||||||
|
0x32, /* MaxPower 100 mA */
|
||||||
|
|
||||||
|
/******************** Mass Storage interface ********************/
|
||||||
|
0x09, /* bLength: Interface Descriptor size */
|
||||||
|
0x04, /* bDescriptorType: */
|
||||||
|
0x00, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x02, /* bNumEndpoints*/
|
||||||
|
0x08, /* bInterfaceClass: MSC Class */
|
||||||
|
0x06, /* bInterfaceSubClass : SCSI transparent command set*/
|
||||||
|
0x50, /* nInterfaceProtocol */
|
||||||
|
0x05, /* iInterface: */
|
||||||
|
/******************** Mass Storage Endpoints ********************/
|
||||||
|
0x07, /*Endpoint descriptor length = 7*/
|
||||||
|
0x05, /*Endpoint descriptor type */
|
||||||
|
MSC_IN_EP, /*Endpoint address (IN, address 1) */
|
||||||
|
0x02, /*Bulk endpoint type */
|
||||||
|
0x40,
|
||||||
|
0x00,
|
||||||
|
0x00, /*Polling interval in milliseconds */
|
||||||
|
|
||||||
|
0x07, /*Endpoint descriptor length = 7 */
|
||||||
|
0x05, /*Endpoint descriptor type */
|
||||||
|
MSC_OUT_EP, /*Endpoint address (OUT, address 1) */
|
||||||
|
0x02, /*Bulk endpoint type */
|
||||||
|
0x40,
|
||||||
|
0x00,
|
||||||
|
0x00 /*Polling interval in milliseconds*/
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static uint8_t USBD_MSC_MaxLun __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN static uint8_t USBD_MSC_AltSet __ALIGN_END = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_CORE_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_Init
|
||||||
|
* Initialize the mass storage configuration
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint8_t USBD_MSC_Init (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
USBD_MSC_DeInit(pdev , cfgidx );
|
||||||
|
|
||||||
|
/* Open EP IN */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
MSC_IN_EP,
|
||||||
|
MSC_EPIN_SIZE,
|
||||||
|
USB_OTG_EP_BULK);
|
||||||
|
|
||||||
|
/* Open EP OUT */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
MSC_EPOUT_SIZE,
|
||||||
|
USB_OTG_EP_BULK);
|
||||||
|
|
||||||
|
/* Init the BOT layer */
|
||||||
|
MSC_BOT_Init(pdev);
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_DeInit
|
||||||
|
* DeInitilaize the mass storage configuration
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint8_t USBD_MSC_DeInit (void *pdev,
|
||||||
|
uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
/* Close MSC EPs */
|
||||||
|
DCD_EP_Close (pdev , MSC_IN_EP);
|
||||||
|
DCD_EP_Close (pdev , MSC_OUT_EP);
|
||||||
|
|
||||||
|
/* Un Init the BOT layer */
|
||||||
|
MSC_BOT_DeInit(pdev);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_Setup
|
||||||
|
* Handle the MSC specific requests
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: USB request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Class request */
|
||||||
|
case USB_REQ_TYPE_CLASS :
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case BOT_GET_MAX_LUN :
|
||||||
|
|
||||||
|
if((req->wValue == 0) &&
|
||||||
|
(req->wLength == 1) &&
|
||||||
|
((req->bmRequest & 0x80) == 0x80))
|
||||||
|
{
|
||||||
|
USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun();
|
||||||
|
if(USBD_MSC_MaxLun > 0)
|
||||||
|
{
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
&USBD_MSC_MaxLun,
|
||||||
|
1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOT_RESET :
|
||||||
|
if((req->wValue == 0) &&
|
||||||
|
(req->wLength == 0) &&
|
||||||
|
((req->bmRequest & 0x80) != 0x80))
|
||||||
|
{
|
||||||
|
MSC_BOT_Reset(pdev);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
/* Interface & Endpoint request */
|
||||||
|
case USB_REQ_TYPE_STANDARD:
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case USB_REQ_GET_INTERFACE :
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
&USBD_MSC_AltSet,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_SET_INTERFACE :
|
||||||
|
USBD_MSC_AltSet = (uint8_t)(req->wValue);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_CLEAR_FEATURE:
|
||||||
|
|
||||||
|
/* Flush the FIFO and Clear the stall status */
|
||||||
|
DCD_EP_Flush(pdev, (uint8_t)req->wIndex);
|
||||||
|
|
||||||
|
/* Re-activate the EP */
|
||||||
|
DCD_EP_Close (pdev , (uint8_t)req->wIndex);
|
||||||
|
if((((uint8_t)req->wIndex) & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
((uint8_t)req->wIndex),
|
||||||
|
MSC_EPIN_SIZE,
|
||||||
|
USB_OTG_EP_BULK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
((uint8_t)req->wIndex),
|
||||||
|
MSC_EPOUT_SIZE,
|
||||||
|
USB_OTG_EP_BULK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle BOT error */
|
||||||
|
MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_DataIn
|
||||||
|
* handle data IN Stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint8_t USBD_MSC_DataIn (void *pdev,
|
||||||
|
uint8_t epnum)
|
||||||
|
{
|
||||||
|
MSC_BOT_DataIn(pdev , epnum);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_DataOut
|
||||||
|
* handle data OUT Stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint8_t USBD_MSC_DataOut (void *pdev,
|
||||||
|
uint8_t epnum)
|
||||||
|
{
|
||||||
|
MSC_BOT_DataOut(pdev , epnum);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_GetCfgDesc
|
||||||
|
* return configuration descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer data length
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof (USBD_MSC_CfgDesc);
|
||||||
|
return USBD_MSC_CfgDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_MSC_GetOtherCfgDesc
|
||||||
|
* return other speed configuration descriptor
|
||||||
|
* @param speed : current device speed
|
||||||
|
* @param length : pointer data length
|
||||||
|
* @retval pointer to descriptor buffer
|
||||||
|
*/
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
uint8_t *USBD_MSC_GetOtherCfgDesc (uint8_t speed,
|
||||||
|
uint16_t *length)
|
||||||
|
{
|
||||||
|
*length = sizeof (USBD_MSC_OtherCfgDesc);
|
||||||
|
return USBD_MSC_OtherCfgDesc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_data.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides all the vital inquiry pages and sense data.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_msc_data.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA
|
||||||
|
* @brief Mass storage info/data module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Mass storage Page 0 Inquiry Data */
|
||||||
|
const uint8_t MSC_Page00_Inquiry_Data[] = {//7
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
(LENGTH_INQUIRY_PAGE00 - 4),
|
||||||
|
0x00,
|
||||||
|
0x80,
|
||||||
|
0x83
|
||||||
|
};
|
||||||
|
/* USB Mass storage sense 6 Data */
|
||||||
|
const uint8_t MSC_Mode_Sense6_data[] = {
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00
|
||||||
|
};
|
||||||
|
/* USB Mass storage sense 10 Data */
|
||||||
|
const uint8_t MSC_Mode_Sense10_data[] = {
|
||||||
|
0x00,
|
||||||
|
0x06,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_DATA_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,722 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_msc_scsi.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides all the USBD SCSI layer functions.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_msc_bot.h"
|
||||||
|
#include "usbd_msc_scsi.h"
|
||||||
|
#include "usbd_msc_mem.h"
|
||||||
|
#include "usbd_msc_data.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI
|
||||||
|
* @brief Mass storage SCSI layer module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH];
|
||||||
|
uint8_t SCSI_Sense_Head;
|
||||||
|
uint8_t SCSI_Sense_Tail;
|
||||||
|
|
||||||
|
uint32_t SCSI_blk_size;
|
||||||
|
uint32_t SCSI_blk_nbr;
|
||||||
|
|
||||||
|
uint32_t SCSI_blk_addr;
|
||||||
|
uint32_t SCSI_blk_len;
|
||||||
|
|
||||||
|
USB_OTG_CORE_HANDLE *cdev;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_Write10(uint8_t lun , uint8_t *params);
|
||||||
|
static int8_t SCSI_Read10(uint8_t lun , uint8_t *params);
|
||||||
|
static int8_t SCSI_Verify10(uint8_t lun, uint8_t *params);
|
||||||
|
static int8_t SCSI_CheckAddressRange (uint8_t lun ,
|
||||||
|
uint32_t blk_offset ,
|
||||||
|
uint16_t blk_nbr);
|
||||||
|
static int8_t SCSI_ProcessRead (uint8_t lun);
|
||||||
|
|
||||||
|
static int8_t SCSI_ProcessWrite (uint8_t lun);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup MSC_SCSI_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ProcessCmd
|
||||||
|
* Process SCSI commands
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
int8_t SCSI_ProcessCmd(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t lun,
|
||||||
|
uint8_t *params)
|
||||||
|
{
|
||||||
|
cdev = pdev;
|
||||||
|
|
||||||
|
switch (params[0])
|
||||||
|
{
|
||||||
|
case SCSI_TEST_UNIT_READY:
|
||||||
|
return SCSI_TestUnitReady(lun, params);
|
||||||
|
|
||||||
|
case SCSI_REQUEST_SENSE:
|
||||||
|
return SCSI_RequestSense (lun, params);
|
||||||
|
case SCSI_INQUIRY:
|
||||||
|
return SCSI_Inquiry(lun, params);
|
||||||
|
|
||||||
|
case SCSI_START_STOP_UNIT:
|
||||||
|
return SCSI_StartStopUnit(lun, params);
|
||||||
|
|
||||||
|
case SCSI_ALLOW_MEDIUM_REMOVAL:
|
||||||
|
return SCSI_StartStopUnit(lun, params);
|
||||||
|
|
||||||
|
case SCSI_MODE_SENSE6:
|
||||||
|
return SCSI_ModeSense6 (lun, params);
|
||||||
|
|
||||||
|
case SCSI_MODE_SENSE10:
|
||||||
|
return SCSI_ModeSense10 (lun, params);
|
||||||
|
|
||||||
|
case SCSI_READ_FORMAT_CAPACITIES:
|
||||||
|
return SCSI_ReadFormatCapacity(lun, params);
|
||||||
|
|
||||||
|
case SCSI_READ_CAPACITY10:
|
||||||
|
return SCSI_ReadCapacity10(lun, params);
|
||||||
|
|
||||||
|
case SCSI_READ10:
|
||||||
|
return SCSI_Read10(lun, params);
|
||||||
|
|
||||||
|
case SCSI_WRITE10:
|
||||||
|
return SCSI_Write10(lun, params);
|
||||||
|
|
||||||
|
case SCSI_VERIFY10:
|
||||||
|
return SCSI_Verify10(lun, params);
|
||||||
|
|
||||||
|
default:
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_TestUnitReady
|
||||||
|
* Process SCSI Test Unit Ready Command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* case 9 : Hi > D0 */
|
||||||
|
if (MSC_BOT_cbw.dDataLength != 0)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(USBD_STORAGE_fops->IsReady(lun) !=0 )
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
NOT_READY,
|
||||||
|
MEDIUM_NOT_PRESENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
MSC_BOT_DataLen = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_Inquiry
|
||||||
|
* Process Inquiry command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
uint8_t* pPage;
|
||||||
|
uint16_t len;
|
||||||
|
|
||||||
|
if (params[1] & 0x01)/*Evpd is set*/
|
||||||
|
{
|
||||||
|
pPage = (uint8_t *)MSC_Page00_Inquiry_Data;
|
||||||
|
len = LENGTH_INQUIRY_PAGE00;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
pPage = (uint8_t *)&USBD_STORAGE_fops->pInquiry[lun * USBD_STD_INQUIRY_LENGTH];
|
||||||
|
len = pPage[4] + 5;
|
||||||
|
|
||||||
|
if (params[4] <= len)
|
||||||
|
{
|
||||||
|
len = params[4];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MSC_BOT_DataLen = len;
|
||||||
|
|
||||||
|
while (len)
|
||||||
|
{
|
||||||
|
len--;
|
||||||
|
MSC_BOT_Data[len] = pPage[len];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ReadCapacity10
|
||||||
|
* Process Read Capacity 10 command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(USBD_STORAGE_fops->GetCapacity(lun, &SCSI_blk_nbr, &SCSI_blk_size) != 0)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
NOT_READY,
|
||||||
|
MEDIUM_NOT_PRESENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
MSC_BOT_Data[0] = (uint8_t)(SCSI_blk_nbr - 1 >> 24);
|
||||||
|
MSC_BOT_Data[1] = (uint8_t)(SCSI_blk_nbr - 1 >> 16);
|
||||||
|
MSC_BOT_Data[2] = (uint8_t)(SCSI_blk_nbr - 1 >> 8);
|
||||||
|
MSC_BOT_Data[3] = (uint8_t)(SCSI_blk_nbr - 1);
|
||||||
|
|
||||||
|
MSC_BOT_Data[4] = (uint8_t)(SCSI_blk_size >> 24);
|
||||||
|
MSC_BOT_Data[5] = (uint8_t)(SCSI_blk_size >> 16);
|
||||||
|
MSC_BOT_Data[6] = (uint8_t)(SCSI_blk_size >> 8);
|
||||||
|
MSC_BOT_Data[7] = (uint8_t)(SCSI_blk_size);
|
||||||
|
|
||||||
|
MSC_BOT_DataLen = 8;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ReadFormatCapacity
|
||||||
|
* Process Read Format Capacity command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint32_t blk_size;
|
||||||
|
uint32_t blk_nbr;
|
||||||
|
uint16_t i;
|
||||||
|
|
||||||
|
for(i=0 ; i < 12 ; i++)
|
||||||
|
{
|
||||||
|
MSC_BOT_Data[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(USBD_STORAGE_fops->GetCapacity(lun, &blk_nbr, &blk_size) != 0)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
NOT_READY,
|
||||||
|
MEDIUM_NOT_PRESENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MSC_BOT_Data[3] = 0x08;
|
||||||
|
MSC_BOT_Data[4] = (uint8_t)(blk_nbr - 1 >> 24);
|
||||||
|
MSC_BOT_Data[5] = (uint8_t)(blk_nbr - 1 >> 16);
|
||||||
|
MSC_BOT_Data[6] = (uint8_t)(blk_nbr - 1 >> 8);
|
||||||
|
MSC_BOT_Data[7] = (uint8_t)(blk_nbr - 1);
|
||||||
|
|
||||||
|
MSC_BOT_Data[8] = 0x02;
|
||||||
|
MSC_BOT_Data[9] = (uint8_t)(blk_size >> 16);
|
||||||
|
MSC_BOT_Data[10] = (uint8_t)(blk_size >> 8);
|
||||||
|
MSC_BOT_Data[11] = (uint8_t)(blk_size);
|
||||||
|
|
||||||
|
MSC_BOT_DataLen = 12;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ModeSense6
|
||||||
|
* Process Mode Sense6 command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint16_t len = 8 ;
|
||||||
|
MSC_BOT_DataLen = len;
|
||||||
|
|
||||||
|
while (len)
|
||||||
|
{
|
||||||
|
len--;
|
||||||
|
MSC_BOT_Data[len] = MSC_Mode_Sense6_data[len];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ModeSense10
|
||||||
|
* Process Mode Sense10 command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
uint16_t len = 8;
|
||||||
|
|
||||||
|
MSC_BOT_DataLen = len;
|
||||||
|
|
||||||
|
while (len)
|
||||||
|
{
|
||||||
|
len--;
|
||||||
|
MSC_BOT_Data[len] = MSC_Mode_Sense10_data[len];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_RequestSense
|
||||||
|
* Process Request Sense command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++)
|
||||||
|
{
|
||||||
|
MSC_BOT_Data[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MSC_BOT_Data[0] = 0x70;
|
||||||
|
MSC_BOT_Data[7] = REQUEST_SENSE_DATA_LEN - 6;
|
||||||
|
|
||||||
|
if((SCSI_Sense_Head != SCSI_Sense_Tail)) {
|
||||||
|
|
||||||
|
MSC_BOT_Data[2] = SCSI_Sense[SCSI_Sense_Head].Skey;
|
||||||
|
MSC_BOT_Data[12] = SCSI_Sense[SCSI_Sense_Head].w.b.ASCQ;
|
||||||
|
MSC_BOT_Data[13] = SCSI_Sense[SCSI_Sense_Head].w.b.ASC;
|
||||||
|
SCSI_Sense_Head++;
|
||||||
|
|
||||||
|
if (SCSI_Sense_Head == SENSE_LIST_DEEPTH)
|
||||||
|
{
|
||||||
|
SCSI_Sense_Head = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MSC_BOT_DataLen = REQUEST_SENSE_DATA_LEN;
|
||||||
|
|
||||||
|
if (params[4] <= REQUEST_SENSE_DATA_LEN)
|
||||||
|
{
|
||||||
|
MSC_BOT_DataLen = params[4];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_SenseCode
|
||||||
|
* Load the last error code in the error list
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param sKey: Sense Key
|
||||||
|
* @param ASC: Additional Sense Key
|
||||||
|
* @retval none
|
||||||
|
|
||||||
|
*/
|
||||||
|
void SCSI_SenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC)
|
||||||
|
{
|
||||||
|
SCSI_Sense[SCSI_Sense_Tail].Skey = sKey;
|
||||||
|
SCSI_Sense[SCSI_Sense_Tail].w.ASC = ASC << 8;
|
||||||
|
SCSI_Sense_Tail++;
|
||||||
|
if (SCSI_Sense_Tail == SENSE_LIST_DEEPTH)
|
||||||
|
{
|
||||||
|
SCSI_Sense_Tail = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief SCSI_StartStopUnit
|
||||||
|
* Process Start Stop Unit command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params)
|
||||||
|
{
|
||||||
|
MSC_BOT_DataLen = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_Read10
|
||||||
|
* Process Read10 command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_Read10(uint8_t lun , uint8_t *params)
|
||||||
|
{
|
||||||
|
if(MSC_BOT_State == BOT_IDLE) /* Idle */
|
||||||
|
{
|
||||||
|
|
||||||
|
/* case 10 : Ho <> Di */
|
||||||
|
|
||||||
|
if ((MSC_BOT_cbw.bmFlags & 0x80) != 0x80)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(USBD_STORAGE_fops->IsReady(lun) !=0 )
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
NOT_READY,
|
||||||
|
MEDIUM_NOT_PRESENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCSI_blk_addr = (params[2] << 24) | \
|
||||||
|
(params[3] << 16) | \
|
||||||
|
(params[4] << 8) | \
|
||||||
|
params[5];
|
||||||
|
|
||||||
|
SCSI_blk_len = (params[7] << 8) | \
|
||||||
|
params[8];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if( SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0)
|
||||||
|
{
|
||||||
|
return -1; /* error */
|
||||||
|
}
|
||||||
|
|
||||||
|
MSC_BOT_State = BOT_DATA_IN;
|
||||||
|
SCSI_blk_addr *= SCSI_blk_size;
|
||||||
|
SCSI_blk_len *= SCSI_blk_size;
|
||||||
|
|
||||||
|
/* cases 4,5 : Hi <> Dn */
|
||||||
|
if (MSC_BOT_cbw.dDataLength != SCSI_blk_len)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MSC_BOT_DataLen = MSC_MEDIA_PACKET;
|
||||||
|
|
||||||
|
return SCSI_ProcessRead(lun);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_Write10
|
||||||
|
* Process Write10 command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int8_t SCSI_Write10 (uint8_t lun , uint8_t *params)
|
||||||
|
{
|
||||||
|
if (MSC_BOT_State == BOT_IDLE) /* Idle */
|
||||||
|
{
|
||||||
|
|
||||||
|
/* case 8 : Hi <> Do */
|
||||||
|
|
||||||
|
if ((MSC_BOT_cbw.bmFlags & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check whether Media is ready */
|
||||||
|
if(USBD_STORAGE_fops->IsReady(lun) !=0 )
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
NOT_READY,
|
||||||
|
MEDIUM_NOT_PRESENT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check If media is write-protected */
|
||||||
|
if(USBD_STORAGE_fops->IsWriteProtected(lun) !=0 )
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun,
|
||||||
|
NOT_READY,
|
||||||
|
WRITE_PROTECTED);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCSI_blk_addr = (params[2] << 24) | \
|
||||||
|
(params[3] << 16) | \
|
||||||
|
(params[4] << 8) | \
|
||||||
|
params[5];
|
||||||
|
SCSI_blk_len = (params[7] << 8) | \
|
||||||
|
params[8];
|
||||||
|
|
||||||
|
/* check if LBA address is in the right range */
|
||||||
|
if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0)
|
||||||
|
{
|
||||||
|
return -1; /* error */
|
||||||
|
}
|
||||||
|
|
||||||
|
SCSI_blk_addr *= SCSI_blk_size;
|
||||||
|
SCSI_blk_len *= SCSI_blk_size;
|
||||||
|
|
||||||
|
/* cases 3,11,13 : Hn,Ho <> D0 */
|
||||||
|
if (MSC_BOT_cbw.dDataLength != SCSI_blk_len)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(MSC_BOT_cbw.bLUN,
|
||||||
|
ILLEGAL_REQUEST,
|
||||||
|
INVALID_CDB);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepare EP to receive first data packet */
|
||||||
|
MSC_BOT_State = BOT_DATA_OUT;
|
||||||
|
DCD_EP_PrepareRx (cdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
MSC_BOT_Data,
|
||||||
|
MIN (SCSI_blk_len, MSC_MEDIA_PACKET));
|
||||||
|
}
|
||||||
|
else /* Write Process ongoing */
|
||||||
|
{
|
||||||
|
return SCSI_ProcessWrite(lun);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_Verify10
|
||||||
|
* Process Verify10 command
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param params: Command parameters
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int8_t SCSI_Verify10(uint8_t lun , uint8_t *params){
|
||||||
|
if ((params[1]& 0x02) == 0x02)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode (lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND);
|
||||||
|
return -1; /* Error, Verify Mode Not supported*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0)
|
||||||
|
{
|
||||||
|
return -1; /* error */
|
||||||
|
}
|
||||||
|
MSC_BOT_DataLen = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_CheckAddressRange
|
||||||
|
* Check address range
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @param blk_offset: first block address
|
||||||
|
* @param blk_nbr: number of block to be processed
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_CheckAddressRange (uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((blk_offset + blk_nbr) > SCSI_blk_nbr )
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ProcessRead
|
||||||
|
* Handle Read Process
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static int8_t SCSI_ProcessRead (uint8_t lun)
|
||||||
|
{
|
||||||
|
uint32_t len;
|
||||||
|
|
||||||
|
len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET);
|
||||||
|
|
||||||
|
if( USBD_STORAGE_fops->Read(lun ,
|
||||||
|
MSC_BOT_Data,
|
||||||
|
SCSI_blk_addr / SCSI_blk_size,
|
||||||
|
len / SCSI_blk_size) < 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
SCSI_SenseCode(lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DCD_EP_Tx (cdev,
|
||||||
|
MSC_IN_EP,
|
||||||
|
MSC_BOT_Data,
|
||||||
|
len);
|
||||||
|
|
||||||
|
|
||||||
|
SCSI_blk_addr += len;
|
||||||
|
SCSI_blk_len -= len;
|
||||||
|
|
||||||
|
/* case 6 : Hi = Di */
|
||||||
|
MSC_BOT_csw.dDataResidue -= len;
|
||||||
|
|
||||||
|
if (SCSI_blk_len == 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_State = BOT_LAST_DATA_IN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SCSI_ProcessWrite
|
||||||
|
* Handle Write Process
|
||||||
|
* @param lun: Logical unit number
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int8_t SCSI_ProcessWrite (uint8_t lun)
|
||||||
|
{
|
||||||
|
uint32_t len;
|
||||||
|
|
||||||
|
len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET);
|
||||||
|
|
||||||
|
if(USBD_STORAGE_fops->Write(lun ,
|
||||||
|
MSC_BOT_Data,
|
||||||
|
SCSI_blk_addr / SCSI_blk_size,
|
||||||
|
len / SCSI_blk_size) < 0)
|
||||||
|
{
|
||||||
|
SCSI_SenseCode(lun, HARDWARE_ERROR, WRITE_FAULT);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCSI_blk_addr += len;
|
||||||
|
SCSI_blk_len -= len;
|
||||||
|
|
||||||
|
/* case 12 : Ho = Do */
|
||||||
|
MSC_BOT_csw.dDataResidue -= len;
|
||||||
|
|
||||||
|
if (SCSI_blk_len == 0)
|
||||||
|
{
|
||||||
|
MSC_BOT_SendCSW (cdev, CSW_CMD_PASSED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Prapare EP to Receive next packet */
|
||||||
|
DCD_EP_PrepareRx (cdev,
|
||||||
|
MSC_OUT_EP,
|
||||||
|
MSC_BOT_Data,
|
||||||
|
MIN (SCSI_blk_len, MSC_MEDIA_PACKET));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,179 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_storage_template.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Memory management layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_msc_mem.h"
|
||||||
|
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
/* Extern function prototypes ------------------------------------------------*/
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define STORAGE_LUN_NBR 1
|
||||||
|
|
||||||
|
int8_t STORAGE_Init (uint8_t lun);
|
||||||
|
|
||||||
|
int8_t STORAGE_GetCapacity (uint8_t lun,
|
||||||
|
uint32_t *block_num,
|
||||||
|
uint16_t *block_size);
|
||||||
|
|
||||||
|
int8_t STORAGE_IsReady (uint8_t lun);
|
||||||
|
|
||||||
|
int8_t STORAGE_IsWriteProtected (uint8_t lun);
|
||||||
|
|
||||||
|
int8_t STORAGE_Read (uint8_t lun,
|
||||||
|
uint8_t *buf,
|
||||||
|
uint32_t blk_addr,
|
||||||
|
uint16_t blk_len);
|
||||||
|
|
||||||
|
int8_t STORAGE_Write (uint8_t lun,
|
||||||
|
uint8_t *buf,
|
||||||
|
uint32_t blk_addr,
|
||||||
|
uint16_t blk_len);
|
||||||
|
|
||||||
|
int8_t STORAGE_GetMaxLun (void);
|
||||||
|
|
||||||
|
/* USB Mass storage Standard Inquiry Data */
|
||||||
|
const int8_t STORAGE_Inquirydata[] = {//36
|
||||||
|
|
||||||
|
/* LUN 0 */
|
||||||
|
0x00,
|
||||||
|
0x80,
|
||||||
|
0x02,
|
||||||
|
0x02,
|
||||||
|
(USBD_STD_INQUIRY_LENGTH - 5),
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
0x00,
|
||||||
|
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
|
||||||
|
'P', 'r', 'o', 'd', 'u', 't', ' ', ' ', /* Product : 16 Bytes */
|
||||||
|
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
|
||||||
|
'0', '.', '0' ,'1', /* Version : 4 Bytes */
|
||||||
|
};
|
||||||
|
|
||||||
|
USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops =
|
||||||
|
{
|
||||||
|
STORAGE_Init,
|
||||||
|
STORAGE_GetCapacity,
|
||||||
|
STORAGE_IsReady,
|
||||||
|
STORAGE_IsWriteProtected,
|
||||||
|
STORAGE_Read,
|
||||||
|
STORAGE_Write,
|
||||||
|
STORAGE_GetMaxLun,
|
||||||
|
STORAGE_Inquirydata,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops = &USBD_MICRO_SDIO_fops;
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Read_Memory
|
||||||
|
* Description : Handle the Read operation from the microSD card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_Init (uint8_t lun)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Read_Memory
|
||||||
|
* Description : Handle the Read operation from the STORAGE card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Read_Memory
|
||||||
|
* Description : Handle the Read operation from the STORAGE card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_IsReady (uint8_t lun)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Read_Memory
|
||||||
|
* Description : Handle the Read operation from the STORAGE card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_IsWriteProtected (uint8_t lun)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Read_Memory
|
||||||
|
* Description : Handle the Read operation from the STORAGE card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_Read (uint8_t lun,
|
||||||
|
uint8_t *buf,
|
||||||
|
uint32_t blk_addr,
|
||||||
|
uint16_t blk_len)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Write_Memory
|
||||||
|
* Description : Handle the Write operation to the STORAGE card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_Write (uint8_t lun,
|
||||||
|
uint8_t *buf,
|
||||||
|
uint32_t blk_addr,
|
||||||
|
uint16_t blk_len)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
* Function Name : Write_Memory
|
||||||
|
* Description : Handle the Write operation to the STORAGE card.
|
||||||
|
* Input : None.
|
||||||
|
* Output : None.
|
||||||
|
* Return : None.
|
||||||
|
*******************************************************************************/
|
||||||
|
int8_t STORAGE_GetMaxLun (void)
|
||||||
|
{
|
||||||
|
return (STORAGE_LUN_NBR - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
2
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/core.mk
Executable file
2
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/core.mk
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/src
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc
|
@ -0,0 +1,78 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_conf_template.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief usb device configuration template file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_CONF__H__
|
||||||
|
#define __USBD_CONF__H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USE_USB_OTG_HS
|
||||||
|
|
||||||
|
#define USBD_CFG_MAX_NUM 1
|
||||||
|
#define USB_MAX_STR_DESC_SIZ 64
|
||||||
|
#define USBD_EP0_MAX_PACKET_SIZE 64
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CONF_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__USBD_CONF__H__
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
114
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_core.h
Executable file
114
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_core.h
Executable file
@ -0,0 +1,114 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header file for usbd_core.c
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_CORE_H
|
||||||
|
#define __USBD_CORE_H
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_dcd.h"
|
||||||
|
#include "usbd_def.h"
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE
|
||||||
|
* @brief This file is the Header file for usbd_core.c file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USBD_OK = 0,
|
||||||
|
USBD_BUSY,
|
||||||
|
USBD_FAIL,
|
||||||
|
}USBD_Status;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_OTG_CORE_ID_TypeDef coreID,
|
||||||
|
USBD_DEVICE *pDevice,
|
||||||
|
USBD_Class_cb_TypeDef *class_cb,
|
||||||
|
USBD_Usr_cb_TypeDef *usr_cb);
|
||||||
|
|
||||||
|
USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx);
|
||||||
|
|
||||||
|
USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_CORE_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
||||||
|
|
||||||
|
|
149
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_def.h
Executable file
149
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_def.h
Executable file
@ -0,0 +1,149 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_def.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief general defines for the usb device library
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBD_DEF_H
|
||||||
|
#define __USBD_DEF_H
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DEF
|
||||||
|
* @brief general defines for the usb device library file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DEF_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define USB_LEN_DEV_QUALIFIER_DESC 0x0A
|
||||||
|
#define USB_LEN_DEV_DESC 0x12
|
||||||
|
#define USB_LEN_CFG_DESC 0x09
|
||||||
|
#define USB_LEN_IF_DESC 0x09
|
||||||
|
#define USB_LEN_EP_DESC 0x07
|
||||||
|
#define USB_LEN_OTG_DESC 0x03
|
||||||
|
|
||||||
|
#define USBD_IDX_LANGID_STR 0x00
|
||||||
|
#define USBD_IDX_MFC_STR 0x01
|
||||||
|
#define USBD_IDX_PRODUCT_STR 0x02
|
||||||
|
#define USBD_IDX_SERIAL_STR 0x03
|
||||||
|
#define USBD_IDX_CONFIG_STR 0x04
|
||||||
|
#define USBD_IDX_INTERFACE_STR 0x05
|
||||||
|
|
||||||
|
#define USB_REQ_TYPE_STANDARD 0x00
|
||||||
|
#define USB_REQ_TYPE_CLASS 0x20
|
||||||
|
#define USB_REQ_TYPE_VENDOR 0x40
|
||||||
|
#define USB_REQ_TYPE_MASK 0x60
|
||||||
|
|
||||||
|
#define USB_REQ_RECIPIENT_DEVICE 0x00
|
||||||
|
#define USB_REQ_RECIPIENT_INTERFACE 0x01
|
||||||
|
#define USB_REQ_RECIPIENT_ENDPOINT 0x02
|
||||||
|
#define USB_REQ_RECIPIENT_MASK 0x03
|
||||||
|
|
||||||
|
#define USB_REQ_GET_STATUS 0x00
|
||||||
|
#define USB_REQ_CLEAR_FEATURE 0x01
|
||||||
|
#define USB_REQ_SET_FEATURE 0x03
|
||||||
|
#define USB_REQ_SET_ADDRESS 0x05
|
||||||
|
#define USB_REQ_GET_DESCRIPTOR 0x06
|
||||||
|
#define USB_REQ_SET_DESCRIPTOR 0x07
|
||||||
|
#define USB_REQ_GET_CONFIGURATION 0x08
|
||||||
|
#define USB_REQ_SET_CONFIGURATION 0x09
|
||||||
|
#define USB_REQ_GET_INTERFACE 0x0A
|
||||||
|
#define USB_REQ_SET_INTERFACE 0x0B
|
||||||
|
#define USB_REQ_SYNCH_FRAME 0x0C
|
||||||
|
|
||||||
|
#define USB_DESC_TYPE_DEVICE 1
|
||||||
|
#define USB_DESC_TYPE_CONFIGURATION 2
|
||||||
|
#define USB_DESC_TYPE_STRING 3
|
||||||
|
#define USB_DESC_TYPE_INTERFACE 4
|
||||||
|
#define USB_DESC_TYPE_ENDPOINT 5
|
||||||
|
#define USB_DESC_TYPE_DEVICE_QUALIFIER 6
|
||||||
|
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7
|
||||||
|
|
||||||
|
|
||||||
|
#define USB_CONFIG_REMOTE_WAKEUP 2
|
||||||
|
#define USB_CONFIG_SELF_POWERED 1
|
||||||
|
|
||||||
|
#define USB_FEATURE_EP_HALT 0
|
||||||
|
#define USB_FEATURE_REMOTE_WAKEUP 1
|
||||||
|
#define USB_FEATURE_TEST_MODE 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DEF_Exported_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_DEF_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \
|
||||||
|
(((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8))
|
||||||
|
|
||||||
|
#define LOBYTE(x) ((uint8_t)(x & 0x00FF))
|
||||||
|
#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8))
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_DEF_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_DEF_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_DEF_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
@ -0,0 +1,115 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_ioreq.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_ioreq.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBD_IOREQ_H_
|
||||||
|
#define __USBD_IOREQ_H_
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_def.h"
|
||||||
|
#include "usbd_core.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ
|
||||||
|
* @brief header file for the usbd_ioreq.c file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *buf,
|
||||||
|
uint16_t len);
|
||||||
|
|
||||||
|
USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len);
|
||||||
|
|
||||||
|
USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len);
|
||||||
|
|
||||||
|
USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len);
|
||||||
|
|
||||||
|
USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t epnum);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USBD_IOREQ_H_ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
102
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_req.h
Executable file
102
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_req.h
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_req.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief header file for the usbd_req.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_REQUEST_H_
|
||||||
|
#define __USB_REQUEST_H_
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_def.h"
|
||||||
|
#include "usbd_core.h"
|
||||||
|
#include "usbd_conf.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ
|
||||||
|
* @brief header file for the usbd_ioreq.c file
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req);
|
||||||
|
USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req);
|
||||||
|
USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req);
|
||||||
|
void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USB_REQUEST_H_ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
135
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_usr.h
Executable file
135
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/inc/usbd_usr.h
Executable file
@ -0,0 +1,135 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_usr.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header file for usbd_usr.c
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USBD_USR_H__
|
||||||
|
#define __USBD_USR_H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USBD_USER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR
|
||||||
|
* @brief This file is the Header file for usbd_usr.c
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern USBD_Usr_cb_TypeDef USR_cb;
|
||||||
|
extern USBD_Usr_cb_TypeDef USR_FS_cb;
|
||||||
|
extern USBD_Usr_cb_TypeDef USR_HS_cb;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USBD_USR_Init(void);
|
||||||
|
void USBD_USR_DeviceReset (uint8_t speed);
|
||||||
|
void USBD_USR_DeviceConfigured (void);
|
||||||
|
void USBD_USR_DeviceSuspended(void);
|
||||||
|
void USBD_USR_DeviceResumed(void);
|
||||||
|
|
||||||
|
void USBD_USR_DeviceConnected(void);
|
||||||
|
void USBD_USR_DeviceDisconnected(void);
|
||||||
|
|
||||||
|
void USBD_USR_FS_Init(void);
|
||||||
|
void USBD_USR_FS_DeviceReset (uint8_t speed);
|
||||||
|
void USBD_USR_FS_DeviceConfigured (void);
|
||||||
|
void USBD_USR_FS_DeviceSuspended(void);
|
||||||
|
void USBD_USR_FS_DeviceResumed(void);
|
||||||
|
|
||||||
|
void USBD_USR_FS_DeviceConnected(void);
|
||||||
|
void USBD_USR_FS_DeviceDisconnected(void);
|
||||||
|
|
||||||
|
void USBD_USR_HS_Init(void);
|
||||||
|
void USBD_USR_HS_DeviceReset (uint8_t speed);
|
||||||
|
void USBD_USR_HS_DeviceConfigured (void);
|
||||||
|
void USBD_USR_HS_DeviceSuspended(void);
|
||||||
|
void USBD_USR_HS_DeviceResumed(void);
|
||||||
|
|
||||||
|
void USBD_USR_HS_DeviceConnected(void);
|
||||||
|
void USBD_USR_HS_DeviceDisconnected(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_USR_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /*__USBD_USR_H__*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
476
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/src/usbd_core.c
Executable file
476
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/src/usbd_core.c
Executable file
@ -0,0 +1,476 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_core.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides all the USBD core functions.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_core.h"
|
||||||
|
#include "usbd_req.h"
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
#include "usb_dcd_int.h"
|
||||||
|
#include "usb_bsp.h"
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE
|
||||||
|
* @brief usbd core module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
||||||
|
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
||||||
|
static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
#ifdef VBUS_SENSING_ENABLED
|
||||||
|
static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
#endif
|
||||||
|
static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb =
|
||||||
|
{
|
||||||
|
USBD_DataOutStage,
|
||||||
|
USBD_DataInStage,
|
||||||
|
USBD_SetupStage,
|
||||||
|
USBD_SOF,
|
||||||
|
USBD_Reset,
|
||||||
|
USBD_Suspend,
|
||||||
|
USBD_Resume,
|
||||||
|
USBD_IsoINIncomplete,
|
||||||
|
USBD_IsoOUTIncomplete,
|
||||||
|
#ifdef VBUS_SENSING_ENABLED
|
||||||
|
USBD_DevConnected,
|
||||||
|
USBD_DevDisconnected,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_CORE_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_Init
|
||||||
|
* Initailizes the device stack and load the class driver
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param core_address: USB OTG core ID
|
||||||
|
* @param class_cb: Class callback structure address
|
||||||
|
* @param usr_cb: User callback structure address
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_OTG_CORE_ID_TypeDef coreID,
|
||||||
|
USBD_DEVICE *pDevice,
|
||||||
|
USBD_Class_cb_TypeDef *class_cb,
|
||||||
|
USBD_Usr_cb_TypeDef *usr_cb)
|
||||||
|
{
|
||||||
|
/* Hardware Init */
|
||||||
|
USB_OTG_BSP_Init(pdev);
|
||||||
|
|
||||||
|
USBD_DeInit(pdev);
|
||||||
|
|
||||||
|
/*Register class and user callbacks */
|
||||||
|
pdev->dev.class_cb = class_cb;
|
||||||
|
pdev->dev.usr_cb = usr_cb;
|
||||||
|
pdev->dev.usr_device = pDevice;
|
||||||
|
|
||||||
|
/* set USB OTG core params */
|
||||||
|
DCD_Init(pdev , coreID);
|
||||||
|
|
||||||
|
/* Upon Init call usr callback */
|
||||||
|
pdev->dev.usr_cb->Init();
|
||||||
|
|
||||||
|
/* Enable Interrupts */
|
||||||
|
USB_OTG_BSP_EnableInterrupt(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_DeInit
|
||||||
|
* Re-Initialize th deviuce library
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status: status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
/* Software Init */
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_SetupStage
|
||||||
|
* Handle the setup stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_SETUP_REQ req;
|
||||||
|
|
||||||
|
USBD_ParseSetupRequest(pdev , &req);
|
||||||
|
|
||||||
|
switch (req.bmRequest & 0x1F)
|
||||||
|
{
|
||||||
|
case USB_REQ_RECIPIENT_DEVICE:
|
||||||
|
USBD_StdDevReq (pdev, &req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_RECIPIENT_INTERFACE:
|
||||||
|
USBD_StdItfReq(pdev, &req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_RECIPIENT_ENDPOINT:
|
||||||
|
USBD_StdEPReq(pdev, &req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DCD_EP_Stall(pdev , req.bmRequest & 0x80);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_DataOutStage
|
||||||
|
* Handle data out stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
if(epnum == 0)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[0];
|
||||||
|
if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT)
|
||||||
|
{
|
||||||
|
if(ep->rem_data_len > ep->maxpacket)
|
||||||
|
{
|
||||||
|
ep->rem_data_len -= ep->maxpacket;
|
||||||
|
|
||||||
|
if(pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
/* in slave mode this, is handled by the RxSTSQLvl ISR */
|
||||||
|
ep->xfer_buff += ep->maxpacket;
|
||||||
|
}
|
||||||
|
USBD_CtlContinueRx (pdev,
|
||||||
|
ep->xfer_buff,
|
||||||
|
MIN(ep->rem_data_len ,ep->maxpacket));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((pdev->dev.class_cb->EP0_RxReady != NULL)&&
|
||||||
|
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->EP0_RxReady(pdev);
|
||||||
|
}
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if((pdev->dev.class_cb->DataOut != NULL)&&
|
||||||
|
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->DataOut(pdev, epnum);
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_DataInStage
|
||||||
|
* Handle data in stage
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
if(epnum == 0)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[0];
|
||||||
|
if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN)
|
||||||
|
{
|
||||||
|
if(ep->rem_data_len > ep->maxpacket)
|
||||||
|
{
|
||||||
|
ep->rem_data_len -= ep->maxpacket;
|
||||||
|
if(pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
/* in slave mode this, is handled by the TxFifoEmpty ISR */
|
||||||
|
ep->xfer_buff += ep->maxpacket;
|
||||||
|
}
|
||||||
|
USBD_CtlContinueSendData (pdev,
|
||||||
|
ep->xfer_buff,
|
||||||
|
ep->rem_data_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /* last packet is MPS multiple, so send ZLP packet */
|
||||||
|
if((ep->total_data_len % ep->maxpacket == 0) &&
|
||||||
|
(ep->total_data_len >= ep->maxpacket) &&
|
||||||
|
(ep->total_data_len < ep->ctl_data_len ))
|
||||||
|
{
|
||||||
|
|
||||||
|
USBD_CtlContinueSendData(pdev , NULL, 0);
|
||||||
|
ep->ctl_data_len = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((pdev->dev.class_cb->EP0_TxSent != NULL)&&
|
||||||
|
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->EP0_TxSent(pdev);
|
||||||
|
}
|
||||||
|
USBD_CtlReceiveStatus(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if((pdev->dev.class_cb->DataIn != NULL)&&
|
||||||
|
(pdev->dev.device_status == USB_OTG_CONFIGURED))
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->DataIn(pdev, epnum);
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_Reset
|
||||||
|
* Handle Reset event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
/* Open EP0 OUT */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
0x00,
|
||||||
|
USB_OTG_MAX_EP0_SIZE,
|
||||||
|
EP_TYPE_CTRL);
|
||||||
|
|
||||||
|
/* Open EP0 IN */
|
||||||
|
DCD_EP_Open(pdev,
|
||||||
|
0x80,
|
||||||
|
USB_OTG_MAX_EP0_SIZE,
|
||||||
|
EP_TYPE_CTRL);
|
||||||
|
|
||||||
|
/* Upon Reset call usr call back */
|
||||||
|
pdev->dev.device_status = USB_OTG_DEFAULT;
|
||||||
|
pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed);
|
||||||
|
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_Resume
|
||||||
|
* Handle Resume event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
/* Upon Resume call usr call back */
|
||||||
|
pdev->dev.usr_cb->DeviceResumed();
|
||||||
|
pdev->dev.device_status = USB_OTG_CONFIGURED;
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_Suspend
|
||||||
|
* Handle Suspend event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
pdev->dev.device_status = USB_OTG_SUSPENDED;
|
||||||
|
/* Upon Resume call usr call back */
|
||||||
|
pdev->dev.usr_cb->DeviceSuspended();
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_SOF
|
||||||
|
* Handle SOF event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
if(pdev->dev.class_cb->SOF)
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->SOF(pdev);
|
||||||
|
}
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief USBD_SetCfg
|
||||||
|
* Configure device and start the interface
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: configuration index
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
|
||||||
|
USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->Init(pdev, cfgidx);
|
||||||
|
|
||||||
|
/* Upon set config call usr call back */
|
||||||
|
pdev->dev.usr_cb->DeviceConfigured();
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_ClrCfg
|
||||||
|
* Clear current configuration
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param cfgidx: configuration index
|
||||||
|
* @retval status: USBD_Status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx)
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->DeInit(pdev, cfgidx);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_IsoINIncomplete
|
||||||
|
* Handle iso in incomplete event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->IsoINIncomplete(pdev);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_IsoOUTIncomplete
|
||||||
|
* Handle iso out incomplete event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->IsoOUTIncomplete(pdev);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VBUS_SENSING_ENABLED
|
||||||
|
/**
|
||||||
|
* @brief USBD_DevConnected
|
||||||
|
* Handle device connection event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
pdev->dev.usr_cb->DeviceConnected();
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_DevDisconnected
|
||||||
|
* Handle device disconnection event
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
pdev->dev.usr_cb->DeviceDisconnected();
|
||||||
|
pdev->dev.class_cb->DeInit(pdev, 0);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
@ -0,0 +1,237 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_ioreq.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the IO requests APIs for control endpoints.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ
|
||||||
|
* @brief control I/O requests module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_IOREQ_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlSendData
|
||||||
|
* send data on the ctl pipe
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param buff: pointer to data buffer
|
||||||
|
* @param len: length of data to be sent
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
pdev->dev.in_ep[0].total_data_len = len;
|
||||||
|
pdev->dev.in_ep[0].rem_data_len = len;
|
||||||
|
pdev->dev.device_state = USB_OTG_EP0_DATA_IN;
|
||||||
|
|
||||||
|
DCD_EP_Tx (pdev, 0, pbuf, len);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlContinueSendData
|
||||||
|
* continue sending data on the ctl pipe
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param buff: pointer to data buffer
|
||||||
|
* @param len: length of data to be sent
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
DCD_EP_Tx (pdev, 0, pbuf, len);
|
||||||
|
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlPrepareRx
|
||||||
|
* receive data on the ctl pipe
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* @param buff: pointer to data buffer
|
||||||
|
* @param len: length of data to be received
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
pdev->dev.out_ep[0].total_data_len = len;
|
||||||
|
pdev->dev.out_ep[0].rem_data_len = len;
|
||||||
|
pdev->dev.device_state = USB_OTG_EP0_DATA_OUT;
|
||||||
|
|
||||||
|
DCD_EP_PrepareRx (pdev,
|
||||||
|
0,
|
||||||
|
pbuf,
|
||||||
|
len);
|
||||||
|
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlContinueRx
|
||||||
|
* continue receive data on the ctl pipe
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* @param buff: pointer to data buffer
|
||||||
|
* @param len: length of data to be received
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t len)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
DCD_EP_PrepareRx (pdev,
|
||||||
|
0,
|
||||||
|
pbuf,
|
||||||
|
len);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlSendStatus
|
||||||
|
* send zero lzngth packet on the ctl pipe
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
pdev->dev.device_state = USB_OTG_EP0_STATUS_IN;
|
||||||
|
DCD_EP_Tx (pdev,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
|
USB_OTG_EP0_OutStart(pdev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlReceiveStatus
|
||||||
|
* receive zero lzngth packet on the ctl pipe
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT;
|
||||||
|
DCD_EP_PrepareRx ( pdev,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
|
USB_OTG_EP0_OutStart(pdev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_GetRxCount
|
||||||
|
* returns the received data length
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* epnum: endpoint index
|
||||||
|
* @retval Rx Data blength
|
||||||
|
*/
|
||||||
|
uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
||||||
|
{
|
||||||
|
return pdev->dev.out_ep[epnum].xfer_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
868
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/src/usbd_req.c
Executable file
868
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/src/usbd_req.c
Executable file
@ -0,0 +1,868 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_req.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief This file provides the standard USB requests following chapter 9.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usbd_req.h"
|
||||||
|
#include "usbd_ioreq.h"
|
||||||
|
#include "usbd_desc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ
|
||||||
|
* @brief USB standard requests module
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
|
||||||
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
|
#pragma data_alignment=4
|
||||||
|
#endif
|
||||||
|
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
|
||||||
|
__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req);
|
||||||
|
|
||||||
|
static uint8_t USBD_GetLen(uint8_t *buf);
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USBD_REQ_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_StdDevReq
|
||||||
|
* Handle standard usb device requests
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
case USB_REQ_GET_DESCRIPTOR:
|
||||||
|
|
||||||
|
USBD_GetDescriptor (pdev, req) ;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_SET_ADDRESS:
|
||||||
|
USBD_SetAddress(pdev, req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_SET_CONFIGURATION:
|
||||||
|
USBD_SetConfig (pdev , req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_CONFIGURATION:
|
||||||
|
USBD_GetConfig (pdev , req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_STATUS:
|
||||||
|
USBD_GetStatus (pdev , req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case USB_REQ_SET_FEATURE:
|
||||||
|
USBD_SetFeature (pdev , req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_CLEAR_FEATURE:
|
||||||
|
USBD_ClrFeature (pdev , req);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_StdItfReq
|
||||||
|
* Handle standard usb interface requests
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
|
||||||
|
if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM)
|
||||||
|
{
|
||||||
|
pdev->dev.class_cb->Setup (pdev, req);
|
||||||
|
|
||||||
|
if((req->wLength == 0)&& (ret == USBD_OK))
|
||||||
|
{
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_StdEPReq
|
||||||
|
* Handle standard usb endpoint requests
|
||||||
|
* @param pdev: USB OTG device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t ep_addr;
|
||||||
|
USBD_Status ret = USBD_OK;
|
||||||
|
|
||||||
|
ep_addr = LOBYTE(req->wIndex);
|
||||||
|
|
||||||
|
switch (req->bRequest)
|
||||||
|
{
|
||||||
|
|
||||||
|
case USB_REQ_SET_FEATURE :
|
||||||
|
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , ep_addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
if (req->wValue == USB_FEATURE_EP_HALT)
|
||||||
|
{
|
||||||
|
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , ep_addr);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pdev->dev.class_cb->Setup (pdev, req);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_CLEAR_FEATURE :
|
||||||
|
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , ep_addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
if (req->wValue == USB_FEATURE_EP_HALT)
|
||||||
|
{
|
||||||
|
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||||
|
{
|
||||||
|
DCD_EP_ClrStall(pdev , ep_addr);
|
||||||
|
pdev->dev.class_cb->Setup (pdev, req);
|
||||||
|
}
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_STATUS:
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
if ((ep_addr != 0x00) && (ep_addr != 0x80))
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , ep_addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
|
||||||
|
|
||||||
|
if ((ep_addr & 0x80)== 0x80)
|
||||||
|
{
|
||||||
|
if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall)
|
||||||
|
{
|
||||||
|
USBD_ep_status = 0x0001;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_ep_status = 0x0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((ep_addr & 0x80)== 0x00)
|
||||||
|
{
|
||||||
|
if(pdev->dev.out_ep[ep_addr].is_stall)
|
||||||
|
{
|
||||||
|
USBD_ep_status = 0x0001;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_ep_status = 0x0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&USBD_ep_status,
|
||||||
|
2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief USBD_GetDescriptor
|
||||||
|
* Handle Get Descriptor requests
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
uint16_t len;
|
||||||
|
uint8_t *pbuf;
|
||||||
|
|
||||||
|
switch (req->wValue >> 8)
|
||||||
|
{
|
||||||
|
case USB_DESC_TYPE_DEVICE:
|
||||||
|
pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len);
|
||||||
|
if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT))
|
||||||
|
{
|
||||||
|
len = 8;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_DESC_TYPE_CONFIGURATION:
|
||||||
|
pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len);
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&&
|
||||||
|
(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY))
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
||||||
|
pdev->dev.pConfig_descriptor = pbuf;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_DESC_TYPE_STRING:
|
||||||
|
switch ((uint8_t)(req->wValue))
|
||||||
|
{
|
||||||
|
case USBD_IDX_LANGID_STR:
|
||||||
|
pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USBD_IDX_MFC_STR:
|
||||||
|
pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USBD_IDX_PRODUCT_STR:
|
||||||
|
pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USBD_IDX_SERIAL_STR:
|
||||||
|
pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USBD_IDX_CONFIG_STR:
|
||||||
|
pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USBD_IDX_INTERFACE_STR:
|
||||||
|
pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
#ifdef USB_SUPPORT_USER_STRING_DESC
|
||||||
|
pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len);
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return;
|
||||||
|
#endif /* USBD_CtlError(pdev , req); */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case USB_DESC_TYPE_DEVICE_QUALIFIER:
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
if(pdev->cfg.speed == USB_OTG_SPEED_HIGH )
|
||||||
|
{
|
||||||
|
|
||||||
|
pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len);
|
||||||
|
|
||||||
|
USBD_DeviceQualifierDesc[4]= pbuf[14];
|
||||||
|
USBD_DeviceQualifierDesc[5]= pbuf[15];
|
||||||
|
USBD_DeviceQualifierDesc[6]= pbuf[16];
|
||||||
|
|
||||||
|
pbuf = USBD_DeviceQualifierDesc;
|
||||||
|
len = USB_LEN_DEV_QUALIFIER_DESC;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
|
||||||
|
if(pdev->cfg.speed == USB_OTG_SPEED_HIGH )
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len);
|
||||||
|
pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((len != 0)&& (req->wLength != 0))
|
||||||
|
{
|
||||||
|
|
||||||
|
len = MIN(len , req->wLength);
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
pbuf,
|
||||||
|
len);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_SetAddress
|
||||||
|
* Set device address
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
uint8_t dev_addr;
|
||||||
|
|
||||||
|
if ((req->wIndex == 0) && (req->wLength == 0))
|
||||||
|
{
|
||||||
|
dev_addr = (uint8_t)(req->wValue) & 0x7F;
|
||||||
|
|
||||||
|
if (pdev->dev.device_status == USB_OTG_CONFIGURED)
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pdev->dev.device_address = dev_addr;
|
||||||
|
DCD_EP_SetAddress(pdev, dev_addr);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
|
||||||
|
if (dev_addr != 0)
|
||||||
|
{
|
||||||
|
pdev->dev.device_status = USB_OTG_ADDRESSED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pdev->dev.device_status = USB_OTG_DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_SetConfig
|
||||||
|
* Handle Set device configuration request
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
|
||||||
|
static uint8_t cfgidx;
|
||||||
|
|
||||||
|
cfgidx = (uint8_t)(req->wValue);
|
||||||
|
|
||||||
|
if (cfgidx > USBD_CFG_MAX_NUM )
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
if (cfgidx)
|
||||||
|
{
|
||||||
|
pdev->dev.device_config = cfgidx;
|
||||||
|
pdev->dev.device_status = USB_OTG_CONFIGURED;
|
||||||
|
USBD_SetCfg(pdev , cfgidx);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
if (cfgidx == 0)
|
||||||
|
{
|
||||||
|
pdev->dev.device_status = USB_OTG_ADDRESSED;
|
||||||
|
pdev->dev.device_config = cfgidx;
|
||||||
|
USBD_ClrCfg(pdev , cfgidx);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (cfgidx != pdev->dev.device_config)
|
||||||
|
{
|
||||||
|
/* Clear old configuration */
|
||||||
|
USBD_ClrCfg(pdev , pdev->dev.device_config);
|
||||||
|
|
||||||
|
/* set new configuration */
|
||||||
|
pdev->dev.device_config = cfgidx;
|
||||||
|
USBD_SetCfg(pdev , cfgidx);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_GetConfig
|
||||||
|
* Handle Get device configuration request
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (req->wLength != 1)
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (pdev->dev.device_status )
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&USBD_default_cfg,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
&pdev->dev.device_config,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_GetStatus
|
||||||
|
* Handle Get Status request
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
|
||||||
|
if (pdev->dev.DevRemoteWakeup)
|
||||||
|
{
|
||||||
|
USBD_cfg_status = USB_CONFIG_SELF_POWERED | USB_CONFIG_REMOTE_WAKEUP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_cfg_status = USB_CONFIG_SELF_POWERED;
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_CtlSendData (pdev,
|
||||||
|
(uint8_t *)&USBD_cfg_status,
|
||||||
|
1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_SetFeature
|
||||||
|
* Handle Set device feature request
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
|
||||||
|
USB_OTG_DCTL_TypeDef dctl;
|
||||||
|
uint8_t test_mode = 0;
|
||||||
|
|
||||||
|
if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
|
||||||
|
{
|
||||||
|
pdev->dev.DevRemoteWakeup = 1;
|
||||||
|
pdev->dev.class_cb->Setup (pdev, req);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if ((req->wValue == USB_FEATURE_TEST_MODE) &&
|
||||||
|
((req->wIndex & 0xFF) == 0))
|
||||||
|
{
|
||||||
|
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
|
||||||
|
|
||||||
|
test_mode = req->wIndex >> 8;
|
||||||
|
switch (test_mode)
|
||||||
|
{
|
||||||
|
case 1: // TEST_J
|
||||||
|
dctl.b.tstctl = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // TEST_K
|
||||||
|
dctl.b.tstctl = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // TEST_SE0_NAK
|
||||||
|
dctl.b.tstctl = 3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // TEST_PACKET
|
||||||
|
dctl.b.tstctl = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // TEST_FORCE_ENABLE
|
||||||
|
dctl.b.tstctl = 5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_ClrFeature
|
||||||
|
* Handle clear device feature request
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
switch (pdev->dev.device_status)
|
||||||
|
{
|
||||||
|
case USB_OTG_ADDRESSED:
|
||||||
|
case USB_OTG_CONFIGURED:
|
||||||
|
if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
|
||||||
|
{
|
||||||
|
pdev->dev.DevRemoteWakeup = 0;
|
||||||
|
pdev->dev.class_cb->Setup (pdev, req);
|
||||||
|
USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
USBD_CtlError(pdev , req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_ParseSetupRequest
|
||||||
|
* Copy buffer into setup structure
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet);
|
||||||
|
req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1);
|
||||||
|
req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2);
|
||||||
|
req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4);
|
||||||
|
req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6);
|
||||||
|
|
||||||
|
pdev->dev.in_ep[0].ctl_data_len = req->wLength ;
|
||||||
|
pdev->dev.device_state = USB_OTG_EP0_SETUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_CtlError
|
||||||
|
* Handle USB low level Error
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param req: usb request
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_SETUP_REQ *req)
|
||||||
|
{
|
||||||
|
if((req->bmRequest & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , 0x80);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(req->wLength == 0)
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , 0x80);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DCD_EP_Stall(pdev , 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
USB_OTG_EP0_OutStart(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_GetString
|
||||||
|
* Convert Ascii string into unicode one
|
||||||
|
* @param desc : descriptor buffer
|
||||||
|
* @param unicode : Formatted string buffer (unicode)
|
||||||
|
* @param len : descriptor length
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len)
|
||||||
|
{
|
||||||
|
uint8_t idx = 0;
|
||||||
|
|
||||||
|
if (desc != NULL)
|
||||||
|
{
|
||||||
|
*len = USBD_GetLen(desc) * 2 + 2;
|
||||||
|
unicode[idx++] = *len;
|
||||||
|
unicode[idx++] = USB_DESC_TYPE_STRING;
|
||||||
|
|
||||||
|
while (*desc != NULL)
|
||||||
|
{
|
||||||
|
unicode[idx++] = *desc++;
|
||||||
|
unicode[idx++] = 0x00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_GetLen
|
||||||
|
* return the string length
|
||||||
|
* @param buf : pointer to the ascii string buffer
|
||||||
|
* @retval string length
|
||||||
|
*/
|
||||||
|
static uint8_t USBD_GetLen(uint8_t *buf)
|
||||||
|
{
|
||||||
|
uint8_t len = 0;
|
||||||
|
|
||||||
|
while (*buf != NULL)
|
||||||
|
{
|
||||||
|
len++;
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
5
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/dev_lib.mk
Executable file
5
source/firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/dev_lib.mk
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#SUB_FOLDER += firmware/arch/stm32f4xx/lib
|
||||||
|
#INCLUDES += firmware/arch/stm32f4xx/lib
|
||||||
|
|
||||||
|
include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Class/class.mk
|
||||||
|
include firmware/arch/stm32f4xx/lib/STM32_USB_Device_Library/Core/core.mk
|
96
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_bsp.h
Executable file
96
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_bsp.h
Executable file
@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_bsp.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Specific api's relative to the used hardware platform
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USB_BSP__H__
|
||||||
|
#define __USB_BSP__H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_core.h"
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_BSP_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
void BSP_Init(void);
|
||||||
|
|
||||||
|
void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_BSP_uDelay (const uint32_t usec);
|
||||||
|
void USB_OTG_BSP_mDelay (const uint32_t msec);
|
||||||
|
void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
#ifdef USE_HOST_MODE
|
||||||
|
void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state);
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif //__USB_BSP__H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
408
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_core.h
Executable file
408
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_core.h
Executable file
@ -0,0 +1,408 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_core.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header of the Core Layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USB_CORE_H__
|
||||||
|
#define __USB_CORE_H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_conf.h"
|
||||||
|
#include "usb_regs.h"
|
||||||
|
#include "usb_defines.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE
|
||||||
|
* @brief usb otg driver core layer
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USB_OTG_EP0_IDLE 0
|
||||||
|
#define USB_OTG_EP0_SETUP 1
|
||||||
|
#define USB_OTG_EP0_DATA_IN 2
|
||||||
|
#define USB_OTG_EP0_DATA_OUT 3
|
||||||
|
#define USB_OTG_EP0_STATUS_IN 4
|
||||||
|
#define USB_OTG_EP0_STATUS_OUT 5
|
||||||
|
#define USB_OTG_EP0_STALL 6
|
||||||
|
|
||||||
|
#define USB_OTG_EP_TX_DIS 0x0000
|
||||||
|
#define USB_OTG_EP_TX_STALL 0x0010
|
||||||
|
#define USB_OTG_EP_TX_NAK 0x0020
|
||||||
|
#define USB_OTG_EP_TX_VALID 0x0030
|
||||||
|
|
||||||
|
#define USB_OTG_EP_RX_DIS 0x0000
|
||||||
|
#define USB_OTG_EP_RX_STALL 0x1000
|
||||||
|
#define USB_OTG_EP_RX_NAK 0x2000
|
||||||
|
#define USB_OTG_EP_RX_VALID 0x3000
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
#define MAX_DATA_LENGTH 0xFF
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_OTG_OK = 0,
|
||||||
|
USB_OTG_FAIL
|
||||||
|
}USB_OTG_STS;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
HC_IDLE = 0,
|
||||||
|
HC_XFRC,
|
||||||
|
HC_HALTED,
|
||||||
|
HC_NAK,
|
||||||
|
HC_NYET,
|
||||||
|
HC_STALL,
|
||||||
|
HC_XACTERR,
|
||||||
|
HC_BBLERR,
|
||||||
|
HC_DATATGLERR,
|
||||||
|
}HC_STATUS;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
URB_IDLE = 0,
|
||||||
|
URB_DONE,
|
||||||
|
URB_NOTREADY,
|
||||||
|
URB_ERROR,
|
||||||
|
URB_STALL
|
||||||
|
}URB_STATE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CTRL_START = 0,
|
||||||
|
CTRL_XFRC,
|
||||||
|
CTRL_HALTED,
|
||||||
|
CTRL_NAK,
|
||||||
|
CTRL_STALL,
|
||||||
|
CTRL_XACTERR,
|
||||||
|
CTRL_BBLERR,
|
||||||
|
CTRL_DATATGLERR,
|
||||||
|
CTRL_FAIL
|
||||||
|
}CTRL_STATUS;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct USB_OTG_hc
|
||||||
|
{
|
||||||
|
uint8_t dev_addr ;
|
||||||
|
uint8_t ep_num;
|
||||||
|
uint8_t ep_is_in;
|
||||||
|
uint8_t speed;
|
||||||
|
uint8_t do_ping;
|
||||||
|
uint8_t ep_type;
|
||||||
|
uint16_t max_packet;
|
||||||
|
uint8_t data_pid;
|
||||||
|
uint8_t *xfer_buff;
|
||||||
|
uint32_t xfer_len;
|
||||||
|
uint32_t xfer_count;
|
||||||
|
uint8_t toggle_in;
|
||||||
|
uint8_t toggle_out;
|
||||||
|
uint32_t dma_addr;
|
||||||
|
}
|
||||||
|
USB_OTG_HC , *PUSB_OTG_HC;
|
||||||
|
|
||||||
|
typedef struct USB_OTG_ep
|
||||||
|
{
|
||||||
|
uint8_t num;
|
||||||
|
uint8_t is_in;
|
||||||
|
uint8_t is_stall;
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t data_pid_start;
|
||||||
|
uint8_t even_odd_frame;
|
||||||
|
uint16_t tx_fifo_num;
|
||||||
|
uint32_t maxpacket;
|
||||||
|
/* transaction level variables*/
|
||||||
|
uint8_t *xfer_buff;
|
||||||
|
uint32_t dma_addr;
|
||||||
|
uint32_t xfer_len;
|
||||||
|
uint32_t xfer_count;
|
||||||
|
/* Transfer level variables*/
|
||||||
|
uint32_t rem_data_len;
|
||||||
|
uint32_t total_data_len;
|
||||||
|
uint32_t ctl_data_len;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_OTG_EP , *PUSB_OTG_EP;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct USB_OTG_core_cfg
|
||||||
|
{
|
||||||
|
uint8_t host_channels;
|
||||||
|
uint8_t dev_endpoints;
|
||||||
|
uint8_t speed;
|
||||||
|
uint8_t dma_enable;
|
||||||
|
uint16_t mps;
|
||||||
|
uint16_t TotalFifoSize;
|
||||||
|
uint8_t phy_itface;
|
||||||
|
uint8_t Sof_output;
|
||||||
|
uint8_t low_power;
|
||||||
|
uint8_t coreID;
|
||||||
|
|
||||||
|
}
|
||||||
|
USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct usb_setup_req {
|
||||||
|
|
||||||
|
uint8_t bmRequest;
|
||||||
|
uint8_t bRequest;
|
||||||
|
uint16_t wValue;
|
||||||
|
uint16_t wIndex;
|
||||||
|
uint16_t wLength;
|
||||||
|
} USB_SETUP_REQ;
|
||||||
|
|
||||||
|
typedef struct _Device_TypeDef
|
||||||
|
{
|
||||||
|
uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
} USBD_DEVICE, *pUSBD_DEVICE;
|
||||||
|
|
||||||
|
typedef struct USB_OTG_hPort
|
||||||
|
{
|
||||||
|
void (*Disconnect) (void *phost);
|
||||||
|
void (*Connect) (void *phost);
|
||||||
|
uint8_t ConnStatus;
|
||||||
|
uint8_t DisconnStatus;
|
||||||
|
uint8_t ConnHandled;
|
||||||
|
uint8_t DisconnHandled;
|
||||||
|
} USB_OTG_hPort_TypeDef;
|
||||||
|
|
||||||
|
typedef struct _Device_cb
|
||||||
|
{
|
||||||
|
uint8_t (*Init) (void *pdev , uint8_t cfgidx);
|
||||||
|
uint8_t (*DeInit) (void *pdev , uint8_t cfgidx);
|
||||||
|
/* Control Endpoints*/
|
||||||
|
uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req);
|
||||||
|
uint8_t (*EP0_TxSent) (void *pdev );
|
||||||
|
uint8_t (*EP0_RxReady) (void *pdev );
|
||||||
|
/* Class Specific Endpoints*/
|
||||||
|
uint8_t (*DataIn) (void *pdev , uint8_t epnum);
|
||||||
|
uint8_t (*DataOut) (void *pdev , uint8_t epnum);
|
||||||
|
uint8_t (*SOF) (void *pdev);
|
||||||
|
uint8_t (*IsoINIncomplete) (void *pdev);
|
||||||
|
uint8_t (*IsoOUTIncomplete) (void *pdev);
|
||||||
|
|
||||||
|
uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
#ifdef USB_OTG_HS_CORE
|
||||||
|
uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USB_SUPPORT_USER_STRING_DESC
|
||||||
|
uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} USBD_Class_cb_TypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _USBD_USR_PROP
|
||||||
|
{
|
||||||
|
void (*Init)(void);
|
||||||
|
void (*DeviceReset)(uint8_t speed);
|
||||||
|
void (*DeviceConfigured)(void);
|
||||||
|
void (*DeviceSuspended)(void);
|
||||||
|
void (*DeviceResumed)(void);
|
||||||
|
|
||||||
|
void (*DeviceConnected)(void);
|
||||||
|
void (*DeviceDisconnected)(void);
|
||||||
|
|
||||||
|
}
|
||||||
|
USBD_Usr_cb_TypeDef;
|
||||||
|
|
||||||
|
typedef struct _DCD
|
||||||
|
{
|
||||||
|
uint8_t device_config;
|
||||||
|
uint8_t device_state;
|
||||||
|
uint8_t device_status;
|
||||||
|
uint8_t device_address;
|
||||||
|
uint32_t DevRemoteWakeup;
|
||||||
|
USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS];
|
||||||
|
USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS];
|
||||||
|
uint8_t setup_packet [8*3];
|
||||||
|
USBD_Class_cb_TypeDef *class_cb;
|
||||||
|
USBD_Usr_cb_TypeDef *usr_cb;
|
||||||
|
USBD_DEVICE *usr_device;
|
||||||
|
uint8_t *pConfig_descriptor;
|
||||||
|
}
|
||||||
|
DCD_DEV , *DCD_PDEV;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _HCD
|
||||||
|
{
|
||||||
|
uint8_t Rx_Buffer [MAX_DATA_LENGTH];
|
||||||
|
__IO uint32_t ConnSts;
|
||||||
|
__IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS];
|
||||||
|
__IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS];
|
||||||
|
__IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS];
|
||||||
|
__IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS];
|
||||||
|
USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS];
|
||||||
|
uint16_t channel [USB_OTG_MAX_TX_FIFOS];
|
||||||
|
USB_OTG_hPort_TypeDef *port_cb;
|
||||||
|
}
|
||||||
|
HCD_DEV , *USB_OTG_USBH_PDEV;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _OTG
|
||||||
|
{
|
||||||
|
uint8_t OTG_State;
|
||||||
|
uint8_t OTG_PrevState;
|
||||||
|
uint8_t OTG_Mode;
|
||||||
|
}
|
||||||
|
OTG_DEV , *USB_OTG_USBO_PDEV;
|
||||||
|
|
||||||
|
typedef struct USB_OTG_handle
|
||||||
|
{
|
||||||
|
USB_OTG_CORE_CFGS cfg;
|
||||||
|
USB_OTG_CORE_REGS regs;
|
||||||
|
#ifdef USE_DEVICE_MODE
|
||||||
|
DCD_DEV dev;
|
||||||
|
#endif
|
||||||
|
#ifdef USE_HOST_MODE
|
||||||
|
HCD_DEV host;
|
||||||
|
#endif
|
||||||
|
#ifdef USE_OTG_MODE
|
||||||
|
OTG_DEV otg;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_CORE_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
USB_OTG_CORE_ID_TypeDef coreID);
|
||||||
|
USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t *dest,
|
||||||
|
uint16_t len);
|
||||||
|
USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t *src,
|
||||||
|
uint8_t ch_ep_num,
|
||||||
|
uint16_t len);
|
||||||
|
USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num);
|
||||||
|
USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t mode);
|
||||||
|
|
||||||
|
/*********************** HOST APIs ********************************************/
|
||||||
|
#ifdef USE_HOST_MODE
|
||||||
|
USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
||||||
|
USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
||||||
|
USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
||||||
|
USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num);
|
||||||
|
uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state);
|
||||||
|
void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq);
|
||||||
|
uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ;
|
||||||
|
void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
#endif
|
||||||
|
/********************* DEVICE APIs ********************************************/
|
||||||
|
#ifdef USE_DEVICE_MODE
|
||||||
|
USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
||||||
|
USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
||||||
|
USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
||||||
|
USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
||||||
|
USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
||||||
|
USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
||||||
|
uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
||||||
|
uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed);
|
||||||
|
uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status);
|
||||||
|
uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep);
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* __USB_CORE_H__ */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
158
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_dcd.h
Executable file
158
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_dcd.h
Executable file
@ -0,0 +1,158 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_dcd.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Peripheral Driver Header file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __DCD_H__
|
||||||
|
#define __DCD_H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USB_OTG_EP_CONTROL 0
|
||||||
|
#define USB_OTG_EP_ISOC 1
|
||||||
|
#define USB_OTG_EP_BULK 2
|
||||||
|
#define USB_OTG_EP_INT 3
|
||||||
|
#define USB_OTG_EP_MASK 3
|
||||||
|
|
||||||
|
/* Device Status */
|
||||||
|
#define USB_OTG_DEFAULT 1
|
||||||
|
#define USB_OTG_ADDRESSED 2
|
||||||
|
#define USB_OTG_CONFIGURED 3
|
||||||
|
#define USB_OTG_SUSPENDED 4
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/********************************************************************************
|
||||||
|
Data structure type
|
||||||
|
********************************************************************************/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint8_t bEndpointAddress;
|
||||||
|
uint8_t bmAttributes;
|
||||||
|
uint16_t wMaxPacketSize;
|
||||||
|
uint8_t bInterval;
|
||||||
|
}
|
||||||
|
EP_DESCRIPTOR , *PEP_DESCRIPTOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/********************************************************************************
|
||||||
|
EXPORTED FUNCTION FROM THE USB-OTG LAYER
|
||||||
|
********************************************************************************/
|
||||||
|
void DCD_Init(USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
USB_OTG_CORE_ID_TypeDef coreID);
|
||||||
|
|
||||||
|
void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t address);
|
||||||
|
uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t ep_addr,
|
||||||
|
uint16_t ep_mps,
|
||||||
|
uint8_t ep_type);
|
||||||
|
|
||||||
|
uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t ep_addr);
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t ep_addr,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t buf_len);
|
||||||
|
|
||||||
|
uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t ep_addr,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint32_t buf_len);
|
||||||
|
uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t epnum);
|
||||||
|
uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t epnum);
|
||||||
|
|
||||||
|
void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t epnum ,
|
||||||
|
uint32_t Status);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__DCD_H__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
121
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_dcd_int.h
Executable file
121
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_dcd_int.h
Executable file
@ -0,0 +1,121 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_dcd_int.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Peripheral Device Interface Layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef USB_DCD_INT_H__
|
||||||
|
#define USB_DCD_INT_H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_dcd.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct _USBD_DCD_INT
|
||||||
|
{
|
||||||
|
uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
||||||
|
uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
||||||
|
uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
}USBD_DCD_INT_cb_TypeDef;
|
||||||
|
|
||||||
|
extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CLEAR_IN_EP_INTR(epnum,intr) \
|
||||||
|
diepint.d32=0; \
|
||||||
|
diepint.b.intr = 1; \
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32);
|
||||||
|
|
||||||
|
#define CLEAR_OUT_EP_INTR(epnum,intr) \
|
||||||
|
doepint.d32=0; \
|
||||||
|
doepint.b.intr = 1; \
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif // USB_DCD_INT_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
244
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_defines.h
Executable file
244
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_defines.h
Executable file
@ -0,0 +1,244 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_defines.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Header of the Core Layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USB_DEF_H__
|
||||||
|
#define __USB_DEF_H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_conf.h"
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DEFINES
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DEFINES_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup _CORE_DEFINES_
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USB_OTG_SPEED_PARAM_HIGH 0
|
||||||
|
#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1
|
||||||
|
#define USB_OTG_SPEED_PARAM_FULL 3
|
||||||
|
|
||||||
|
#define USB_OTG_SPEED_HIGH 0
|
||||||
|
#define USB_OTG_SPEED_FULL 1
|
||||||
|
|
||||||
|
#define USB_OTG_ULPI_PHY 1
|
||||||
|
#define USB_OTG_EMBEDDED_PHY 2
|
||||||
|
#define USB_OTG_I2C_PHY 3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup _GLOBAL_DEFINES_
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define GAHBCFG_TXFEMPTYLVL_EMPTY 1
|
||||||
|
#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0
|
||||||
|
#define GAHBCFG_GLBINT_ENABLE 1
|
||||||
|
#define GAHBCFG_INT_DMA_BURST_SINGLE 0
|
||||||
|
#define GAHBCFG_INT_DMA_BURST_INCR 1
|
||||||
|
#define GAHBCFG_INT_DMA_BURST_INCR4 3
|
||||||
|
#define GAHBCFG_INT_DMA_BURST_INCR8 5
|
||||||
|
#define GAHBCFG_INT_DMA_BURST_INCR16 7
|
||||||
|
#define GAHBCFG_DMAENABLE 1
|
||||||
|
#define GAHBCFG_TXFEMPTYLVL_EMPTY 1
|
||||||
|
#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0
|
||||||
|
#define GRXSTS_PKTSTS_IN 2
|
||||||
|
#define GRXSTS_PKTSTS_IN_XFER_COMP 3
|
||||||
|
#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5
|
||||||
|
#define GRXSTS_PKTSTS_CH_HALTED 7
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup _OnTheGo_DEFINES_
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define MODE_HNP_SRP_CAPABLE 0
|
||||||
|
#define MODE_SRP_ONLY_CAPABLE 1
|
||||||
|
#define MODE_NO_HNP_SRP_CAPABLE 2
|
||||||
|
#define MODE_SRP_CAPABLE_DEVICE 3
|
||||||
|
#define MODE_NO_SRP_CAPABLE_DEVICE 4
|
||||||
|
#define MODE_SRP_CAPABLE_HOST 5
|
||||||
|
#define MODE_NO_SRP_CAPABLE_HOST 6
|
||||||
|
#define A_HOST 1
|
||||||
|
#define A_SUSPEND 2
|
||||||
|
#define A_PERIPHERAL 3
|
||||||
|
#define B_PERIPHERAL 4
|
||||||
|
#define B_HOST 5
|
||||||
|
#define DEVICE_MODE 0
|
||||||
|
#define HOST_MODE 1
|
||||||
|
#define OTG_MODE 2
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup __DEVICE_DEFINES_
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0
|
||||||
|
#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1
|
||||||
|
#define DSTS_ENUMSPD_LS_PHY_6MHZ 2
|
||||||
|
#define DSTS_ENUMSPD_FS_PHY_48MHZ 3
|
||||||
|
|
||||||
|
#define DCFG_FRAME_INTERVAL_80 0
|
||||||
|
#define DCFG_FRAME_INTERVAL_85 1
|
||||||
|
#define DCFG_FRAME_INTERVAL_90 2
|
||||||
|
#define DCFG_FRAME_INTERVAL_95 3
|
||||||
|
|
||||||
|
#define DEP0CTL_MPS_64 0
|
||||||
|
#define DEP0CTL_MPS_32 1
|
||||||
|
#define DEP0CTL_MPS_16 2
|
||||||
|
#define DEP0CTL_MPS_8 3
|
||||||
|
|
||||||
|
#define EP_SPEED_LOW 0
|
||||||
|
#define EP_SPEED_FULL 1
|
||||||
|
#define EP_SPEED_HIGH 2
|
||||||
|
|
||||||
|
#define EP_TYPE_CTRL 0
|
||||||
|
#define EP_TYPE_ISOC 1
|
||||||
|
#define EP_TYPE_BULK 2
|
||||||
|
#define EP_TYPE_INTR 3
|
||||||
|
#define EP_TYPE_MSK 3
|
||||||
|
|
||||||
|
#define STS_GOUT_NAK 1
|
||||||
|
#define STS_DATA_UPDT 2
|
||||||
|
#define STS_XFER_COMP 3
|
||||||
|
#define STS_SETUP_COMP 4
|
||||||
|
#define STS_SETUP_UPDT 6
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup __HOST_DEFINES_
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define HC_PID_DATA0 0
|
||||||
|
#define HC_PID_DATA2 1
|
||||||
|
#define HC_PID_DATA1 2
|
||||||
|
#define HC_PID_SETUP 3
|
||||||
|
|
||||||
|
#define HPRT0_PRTSPD_HIGH_SPEED 0
|
||||||
|
#define HPRT0_PRTSPD_FULL_SPEED 1
|
||||||
|
#define HPRT0_PRTSPD_LOW_SPEED 2
|
||||||
|
|
||||||
|
#define HCFG_30_60_MHZ 0
|
||||||
|
#define HCFG_48_MHZ 1
|
||||||
|
#define HCFG_6_MHZ 2
|
||||||
|
|
||||||
|
#define HCCHAR_CTRL 0
|
||||||
|
#define HCCHAR_ISOC 1
|
||||||
|
#define HCCHAR_BULK 2
|
||||||
|
#define HCCHAR_INTR 3
|
||||||
|
|
||||||
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DEFINES_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_OTG_HS_CORE_ID = 0,
|
||||||
|
USB_OTG_FS_CORE_ID = 1
|
||||||
|
}USB_OTG_CORE_ID_TypeDef;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DEFINES_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DEFINES_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DEFINES_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup Internal_Macro's
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg)
|
||||||
|
#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value)
|
||||||
|
#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \
|
||||||
|
USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) )
|
||||||
|
|
||||||
|
/********************************************************************************
|
||||||
|
ENUMERATION TYPE
|
||||||
|
********************************************************************************/
|
||||||
|
enum USB_OTG_SPEED {
|
||||||
|
USB_SPEED_UNKNOWN = 0,
|
||||||
|
USB_SPEED_LOW,
|
||||||
|
USB_SPEED_FULL,
|
||||||
|
USB_SPEED_HIGH
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //__USB_DEFINES__H__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
102
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_hcd.h
Executable file
102
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_hcd.h
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_hcd.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Host layer Header file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USB_HCD_H__
|
||||||
|
#define __USB_HCD_H__
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_regs.h"
|
||||||
|
#include "usb_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
uint32_t HCD_Init (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
USB_OTG_CORE_ID_TypeDef coreID);
|
||||||
|
uint32_t HCD_HC_Init (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t hc_num);
|
||||||
|
uint32_t HCD_SubmitRequest (USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t hc_num) ;
|
||||||
|
uint32_t HCD_GetCurrentSpeed (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t HCD_ResetPort (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t HCD_IsDeviceConnected (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t HCD_GetCurrentFrame (USB_OTG_CORE_HANDLE *pdev) ;
|
||||||
|
URB_STATE HCD_GetURB_State (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num);
|
||||||
|
uint32_t HCD_GetXferCnt (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num);
|
||||||
|
HC_STATUS HCD_GetHCState (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num) ;
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif //__USB_HCD_H__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
126
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_hcd_int.h
Executable file
126
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_hcd_int.h
Executable file
@ -0,0 +1,126 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_hcd_int.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Peripheral Device Interface Layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __HCD_INT_H__
|
||||||
|
#define __HCD_INT_H__
|
||||||
|
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_hcd.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_INT
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_INT_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_INT_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_INT_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CLEAR_HC_INT(HC_REGS, intr) \
|
||||||
|
{\
|
||||||
|
USB_OTG_HCINTn_TypeDef hcint_clear; \
|
||||||
|
hcint_clear.d32 = 0; \
|
||||||
|
hcint_clear.b.intr = 1; \
|
||||||
|
USB_OTG_WRITE_REG32(&((HC_REGS)->HCINT), hcint_clear.d32);\
|
||||||
|
}\
|
||||||
|
|
||||||
|
#define MASK_HOST_INT_CHH(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
||||||
|
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
||||||
|
GINTMSK.b.chhltd = 0; \
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
||||||
|
|
||||||
|
#define UNMASK_HOST_INT_CHH(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
||||||
|
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
||||||
|
GINTMSK.b.chhltd = 1; \
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
||||||
|
|
||||||
|
#define MASK_HOST_INT_ACK(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
||||||
|
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
||||||
|
GINTMSK.b.ack = 0; \
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
||||||
|
|
||||||
|
#define UNMASK_HOST_INT_ACK(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \
|
||||||
|
GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \
|
||||||
|
GINTMSK.b.ack = 1; \
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_INT_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_HCD_INT_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* Callbacks handler */
|
||||||
|
void ConnectCallback_Handler(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void Disconnect_Callback_Handler(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
void Overcurrent_Callback_Handler(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
uint32_t USBH_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__HCD_INT_H__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
93
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_otg.h
Executable file
93
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_otg.h
Executable file
@ -0,0 +1,93 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_otg.h
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief OTG Core Header
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __USB_OTG__
|
||||||
|
#define __USB_OTG__
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_OTG
|
||||||
|
* @brief This file is the
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_OTG_Exported_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void USB_OTG_InitiateSRP(void);
|
||||||
|
void USB_OTG_InitiateHNP(uint8_t state , uint8_t mode);
|
||||||
|
void USB_OTG_Switchback (USB_OTG_CORE_DEVICE *pdev);
|
||||||
|
uint32_t USB_OTG_GetCurrentState (USB_OTG_CORE_DEVICE *pdev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_OTG_Exported_Types
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_OTG_Exported_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_OTG_Exported_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_OTG_Exported_FunctionsPrototype
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__USB_OTG__
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
||||||
|
|
1206
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_regs.h
Executable file
1206
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc/usb_regs.h
Executable file
File diff suppressed because it is too large
Load Diff
2
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/otg_driver.mk
Executable file
2
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/otg_driver.mk
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
SUB_FOLDER += firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src
|
||||||
|
INCLUDES += firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/inc
|
2187
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src/usb_core.c
Executable file
2187
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src/usb_core.c
Executable file
File diff suppressed because it is too large
Load Diff
472
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src/usb_dcd.c
Executable file
472
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src/usb_dcd.c
Executable file
@ -0,0 +1,472 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_dcd.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Peripheral Device Interface Layer
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_dcd.h"
|
||||||
|
#include "usb_bsp.h"
|
||||||
|
|
||||||
|
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD
|
||||||
|
* @brief This file is the interface between EFSL ans Host mass-storage class
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void DCD_Init(USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
USB_OTG_CORE_ID_TypeDef coreID)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
USB_OTG_SelectCore (pdev , coreID);
|
||||||
|
|
||||||
|
pdev->dev.device_status = USB_OTG_DEFAULT;
|
||||||
|
pdev->dev.device_address = 0;
|
||||||
|
|
||||||
|
/* Init ep structure */
|
||||||
|
for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[i];
|
||||||
|
/* Init ep structure */
|
||||||
|
ep->is_in = 1;
|
||||||
|
ep->num = i;
|
||||||
|
ep->tx_fifo_num = i;
|
||||||
|
/* Control until ep is actvated */
|
||||||
|
ep->type = EP_TYPE_CTRL;
|
||||||
|
ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
|
||||||
|
ep->xfer_buff = 0;
|
||||||
|
ep->xfer_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < pdev->cfg.dev_endpoints; i++)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[i];
|
||||||
|
/* Init ep structure */
|
||||||
|
ep->is_in = 0;
|
||||||
|
ep->num = i;
|
||||||
|
ep->tx_fifo_num = i;
|
||||||
|
/* Control until ep is activated */
|
||||||
|
ep->type = EP_TYPE_CTRL;
|
||||||
|
ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
|
||||||
|
ep->xfer_buff = 0;
|
||||||
|
ep->xfer_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_OTG_DisableGlobalInt(pdev);
|
||||||
|
|
||||||
|
/*Init the Core (common init.) */
|
||||||
|
USB_OTG_CoreInit(pdev);
|
||||||
|
|
||||||
|
|
||||||
|
/* Force Device Mode*/
|
||||||
|
USB_OTG_SetCurrentMode(pdev, DEVICE_MODE);
|
||||||
|
|
||||||
|
/* Init Device */
|
||||||
|
USB_OTG_CoreInitDev(pdev);
|
||||||
|
|
||||||
|
|
||||||
|
/* Enable USB Global interrupt */
|
||||||
|
USB_OTG_EnableGlobalInt(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure an EP
|
||||||
|
* @param pdev : Device instance
|
||||||
|
* @param epdesc : Endpoint Descriptor
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev ,
|
||||||
|
uint8_t ep_addr,
|
||||||
|
uint16_t ep_mps,
|
||||||
|
uint8_t ep_type)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
if ((ep_addr & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[ep_addr & 0x7F];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[ep_addr & 0x7F];
|
||||||
|
}
|
||||||
|
ep->num = ep_addr & 0x7F;
|
||||||
|
|
||||||
|
ep->is_in = (0x80 & ep_addr) != 0;
|
||||||
|
ep->maxpacket = ep_mps;
|
||||||
|
ep->type = ep_type;
|
||||||
|
if (ep->is_in)
|
||||||
|
{
|
||||||
|
/* Assign a Tx FIFO */
|
||||||
|
ep->tx_fifo_num = ep->num;
|
||||||
|
}
|
||||||
|
/* Set initial data PID. */
|
||||||
|
if (ep_type == USB_OTG_EP_BULK )
|
||||||
|
{
|
||||||
|
ep->data_pid_start = 0;
|
||||||
|
}
|
||||||
|
USB_OTG_EPActivate(pdev , ep );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief called when an EP is disabled
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param ep_addr: endpoint address
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
if ((ep_addr&0x80) == 0x80)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[ep_addr & 0x7F];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[ep_addr & 0x7F];
|
||||||
|
}
|
||||||
|
ep->num = ep_addr & 0x7F;
|
||||||
|
ep->is_in = (0x80 & ep_addr) != 0;
|
||||||
|
USB_OTG_EPDeactivate(pdev , ep );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_EP_PrepareRx
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param ep_addr: endpoint address
|
||||||
|
* @param pbuf: pointer to Rx buffer
|
||||||
|
* @param buf_len: data length
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t ep_addr,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint16_t buf_len)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
ep = &pdev->dev.out_ep[ep_addr & 0x7F];
|
||||||
|
|
||||||
|
/*setup and start the Xfer */
|
||||||
|
ep->xfer_buff = pbuf;
|
||||||
|
ep->xfer_len = buf_len;
|
||||||
|
ep->xfer_count = 0;
|
||||||
|
ep->is_in = 0;
|
||||||
|
ep->num = ep_addr & 0x7F;
|
||||||
|
|
||||||
|
if (pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
ep->dma_addr = (uint32_t)pbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ep->num == 0 )
|
||||||
|
{
|
||||||
|
USB_OTG_EP0StartXfer(pdev , ep);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USB_OTG_EPStartXfer(pdev, ep );
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Transmit data over USB
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param ep_addr: endpoint address
|
||||||
|
* @param pbuf: pointer to Tx buffer
|
||||||
|
* @param buf_len: data length
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev,
|
||||||
|
uint8_t ep_addr,
|
||||||
|
uint8_t *pbuf,
|
||||||
|
uint32_t buf_len)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
ep = &pdev->dev.in_ep[ep_addr & 0x7F];
|
||||||
|
|
||||||
|
/* Setup and start the Transfer */
|
||||||
|
ep->is_in = 1;
|
||||||
|
ep->num = ep_addr & 0x7F;
|
||||||
|
ep->xfer_buff = pbuf;
|
||||||
|
ep->dma_addr = (uint32_t)pbuf;
|
||||||
|
ep->xfer_count = 0;
|
||||||
|
ep->xfer_len = buf_len;
|
||||||
|
|
||||||
|
if ( ep->num == 0 )
|
||||||
|
{
|
||||||
|
USB_OTG_EP0StartXfer(pdev , ep);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USB_OTG_EPStartXfer(pdev, ep );
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stall an endpoint.
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint address
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
if ((0x80 & epnum) == 0x80)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[epnum];
|
||||||
|
}
|
||||||
|
|
||||||
|
ep->is_stall = 1;
|
||||||
|
ep->num = epnum & 0x7F;
|
||||||
|
ep->is_in = ((epnum & 0x80) == 0x80);
|
||||||
|
|
||||||
|
USB_OTG_EPSetStall(pdev , ep);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clear stall condition on endpoints.
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint address
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
if ((0x80 & epnum) == 0x80)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[epnum];
|
||||||
|
}
|
||||||
|
|
||||||
|
ep->is_stall = 0;
|
||||||
|
ep->num = epnum & 0x7F;
|
||||||
|
ep->is_in = ((epnum & 0x80) == 0x80);
|
||||||
|
|
||||||
|
USB_OTG_EPClearStall(pdev , ep);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This Function flushes the FIFOs.
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param epnum: endpoint address
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((epnum & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
USB_OTG_FlushTxFifo(pdev, epnum & 0x7F);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USB_OTG_FlushRxFifo(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This Function set USB device address
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @param address: new device address
|
||||||
|
* @retval : status
|
||||||
|
*/
|
||||||
|
void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address)
|
||||||
|
{
|
||||||
|
USB_OTG_DCFG_TypeDef dcfg;
|
||||||
|
dcfg.d32 = 0;
|
||||||
|
dcfg.b.devaddr = address;
|
||||||
|
USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Connect device (enable internal pull-up)
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval : None
|
||||||
|
*/
|
||||||
|
void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
#ifndef USE_OTG_MODE
|
||||||
|
USB_OTG_DCTL_TypeDef dctl;
|
||||||
|
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
|
||||||
|
/* Connect device */
|
||||||
|
dctl.b.sftdiscon = 0;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|
||||||
|
USB_OTG_BSP_mDelay(3);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disconnect device (disable internal pull-up)
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval : None
|
||||||
|
*/
|
||||||
|
void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
#ifndef USE_OTG_MODE
|
||||||
|
USB_OTG_DCTL_TypeDef dctl;
|
||||||
|
dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
|
||||||
|
/* Disconnect device for 3ms */
|
||||||
|
dctl.b.sftdiscon = 1;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32);
|
||||||
|
USB_OTG_BSP_mDelay(3);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief returns the EP Status
|
||||||
|
* @param pdev : Selected device
|
||||||
|
* epnum : endpoint address
|
||||||
|
* @retval : EP status
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
uint32_t Status = 0;
|
||||||
|
|
||||||
|
if ((0x80 & epnum) == 0x80)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[epnum];
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = USB_OTG_GetEPStatus(pdev ,ep);
|
||||||
|
|
||||||
|
/* Return the current status */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the EP Status
|
||||||
|
* @param pdev : Selected device
|
||||||
|
* Status : new Status
|
||||||
|
* epnum : EP address
|
||||||
|
* @retval : None
|
||||||
|
*/
|
||||||
|
void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status)
|
||||||
|
{
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
if ((0x80 & epnum) == 0x80)
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.in_ep[epnum & 0x7F];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ep = &pdev->dev.out_ep[epnum];
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_OTG_SetEPStatus(pdev ,ep , Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
912
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src/usb_dcd_int.c
Executable file
912
source/firmware/arch/stm32f4xx/lib/STM32_USB_OTG_Driver/src/usb_dcd_int.c
Executable file
@ -0,0 +1,912 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usb_dcd_int.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @version V2.0.0
|
||||||
|
* @date 22-July-2011
|
||||||
|
* @brief Peripheral Device interrupt subroutines
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||||
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||||
|
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||||
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||||
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "usb_dcd_int.h"
|
||||||
|
/** @addtogroup USB_OTG_DRIVER
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT
|
||||||
|
* @brief This file contains the interrupt subroutines for the Device mode.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Private_Defines
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Private_TypesDefinitions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Private_Variables
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Private_FunctionPrototypes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/* static functions */
|
||||||
|
static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum);
|
||||||
|
|
||||||
|
/* Interrupt Handlers */
|
||||||
|
static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum);
|
||||||
|
|
||||||
|
static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
|
static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
#ifdef VBUS_SENSING_ENABLED
|
||||||
|
static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @defgroup USB_DCD_INT_Private_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t run = 1;
|
||||||
|
|
||||||
|
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
|
||||||
|
/**
|
||||||
|
* @brief USBD_OTG_EP1OUT_ISR_Handler
|
||||||
|
* handles all USB Interrupts
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
USB_OTG_DOEPINTn_TypeDef doepint;
|
||||||
|
USB_OTG_DEPXFRSIZ_TypeDef deptsiz;
|
||||||
|
|
||||||
|
doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT);
|
||||||
|
doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK);
|
||||||
|
|
||||||
|
/* Transfer complete */
|
||||||
|
if ( doepint.b.xfercompl )
|
||||||
|
{
|
||||||
|
/* Clear the bit in DOEPINTn for this interrupt */
|
||||||
|
CLEAR_OUT_EP_INTR(1, xfercompl);
|
||||||
|
if (pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ));
|
||||||
|
/*ToDo : handle more than one single MPS size packet */
|
||||||
|
pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \
|
||||||
|
deptsiz.b.xfersize;
|
||||||
|
}
|
||||||
|
/* Inform upper layer: data ready */
|
||||||
|
/* RX COMPLETE */
|
||||||
|
USBD_DCD_INT_fops->DataOutStage(pdev , 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Endpoint disable */
|
||||||
|
if ( doepint.b.epdisabled )
|
||||||
|
{
|
||||||
|
/* Clear the bit in DOEPINTn for this interrupt */
|
||||||
|
CLEAR_OUT_EP_INTR(1, epdisabled);
|
||||||
|
}
|
||||||
|
/* AHB Error */
|
||||||
|
if ( doepint.b.ahberr )
|
||||||
|
{
|
||||||
|
CLEAR_OUT_EP_INTR(1, ahberr);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USBD_OTG_EP1IN_ISR_Handler
|
||||||
|
* handles all USB Interrupts
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
USB_OTG_DIEPINTn_TypeDef diepint;
|
||||||
|
uint32_t fifoemptymsk, msk, emp;
|
||||||
|
|
||||||
|
msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK);
|
||||||
|
emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK);
|
||||||
|
msk |= ((emp >> 1 ) & 0x1) << 7;
|
||||||
|
diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk;
|
||||||
|
|
||||||
|
if ( diepint.b.xfercompl )
|
||||||
|
{
|
||||||
|
fifoemptymsk = 0x1 << 1;
|
||||||
|
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
||||||
|
CLEAR_IN_EP_INTR(1, xfercompl);
|
||||||
|
/* TX COMPLETE */
|
||||||
|
USBD_DCD_INT_fops->DataInStage(pdev , 1);
|
||||||
|
}
|
||||||
|
if ( diepint.b.ahberr )
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(1, ahberr);
|
||||||
|
}
|
||||||
|
if ( diepint.b.epdisabled )
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(1, epdisabled);
|
||||||
|
}
|
||||||
|
if ( diepint.b.timeout )
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(1, timeout);
|
||||||
|
}
|
||||||
|
if (diepint.b.intktxfemp)
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(1, intktxfemp);
|
||||||
|
}
|
||||||
|
if (diepint.b.intknepmis)
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(1, intknepmis);
|
||||||
|
}
|
||||||
|
if (diepint.b.inepnakeff)
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(1, inepnakeff);
|
||||||
|
}
|
||||||
|
if (diepint.b.emptyintr)
|
||||||
|
{
|
||||||
|
DCD_WriteEmptyTxFifo(pdev , 1);
|
||||||
|
CLEAR_IN_EP_INTR(1, emptyintr);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief STM32_USBF_OTG_ISR_Handler
|
||||||
|
* handles all USB Interrupts
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintr_status;
|
||||||
|
uint32_t retval = 0;
|
||||||
|
|
||||||
|
if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */
|
||||||
|
{
|
||||||
|
gintr_status.d32 = USB_OTG_ReadCoreItr(pdev);
|
||||||
|
if (!gintr_status.d32) /* avoid spurious interrupt */
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.outepintr)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleOutEP_ISR(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.inepint)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleInEP_ISR(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.modemismatch)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
gintsts.b.modemismatch = 1;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.wkupintr)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleResume_ISR(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.usbsuspend)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleUSBSuspend_ISR(pdev);
|
||||||
|
}
|
||||||
|
if (gintr_status.b.sofintr)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleSof_ISR(pdev);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.rxstsqlvl)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.usbreset)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleUsbReset_ISR(pdev);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (gintr_status.b.enumdone)
|
||||||
|
{
|
||||||
|
retval |= DCD_HandleEnumDone_ISR(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.incomplisoin)
|
||||||
|
{
|
||||||
|
retval |= DCD_IsoINIncomplete_ISR(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.incomplisoout)
|
||||||
|
{
|
||||||
|
retval |= DCD_IsoOUTIncomplete_ISR(pdev);
|
||||||
|
}
|
||||||
|
#ifdef VBUS_SENSING_ENABLED
|
||||||
|
if (gintr_status.b.sessreqintr)
|
||||||
|
{
|
||||||
|
retval |= DCD_SessionRequest_ISR(pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gintr_status.b.otgintr)
|
||||||
|
{
|
||||||
|
retval |= DCD_OTG_ISR(pdev);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef VBUS_SENSING_ENABLED
|
||||||
|
/**
|
||||||
|
* @brief DCD_SessionRequest_ISR
|
||||||
|
* Indicates that the USB_OTG controller has detected a connection
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
USBD_DCD_INT_fops->DevConnected (pdev);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
gintsts.b.sessreqintr = 1;
|
||||||
|
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_OTG_ISR
|
||||||
|
* Indicates that the USB_OTG controller has detected an OTG event:
|
||||||
|
* used to detect the end of session i.e. disconnection
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
|
||||||
|
USB_OTG_GOTGINT_TypeDef gotgint;
|
||||||
|
|
||||||
|
gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT);
|
||||||
|
|
||||||
|
if (gotgint.b.sesenddet)
|
||||||
|
{
|
||||||
|
USBD_DCD_INT_fops->DevDisconnected (pdev);
|
||||||
|
}
|
||||||
|
/* Clear OTG interrupt */
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleResume_ISR
|
||||||
|
* Indicates that the USB_OTG controller has detected a resume or
|
||||||
|
* remote Wake-up sequence
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
USB_OTG_DCTL_TypeDef devctl;
|
||||||
|
USB_OTG_PCGCCTL_TypeDef power;
|
||||||
|
|
||||||
|
if(pdev->cfg.low_power)
|
||||||
|
{
|
||||||
|
/* un-gate USB Core clock */
|
||||||
|
power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL);
|
||||||
|
power.b.gatehclk = 0;
|
||||||
|
power.b.stoppclk = 0;
|
||||||
|
USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the Remote Wake-up Signaling */
|
||||||
|
devctl.d32 = 0;
|
||||||
|
devctl.b.rmtwkupsig = 1;
|
||||||
|
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0);
|
||||||
|
|
||||||
|
/* Inform upper layer by the Resume Event */
|
||||||
|
USBD_DCD_INT_fops->Resume (pdev);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
gintsts.b.wkupintr = 1;
|
||||||
|
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief USB_OTG_HandleUSBSuspend_ISR
|
||||||
|
* Indicates that SUSPEND state has been detected on the USB
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
USB_OTG_PCGCCTL_TypeDef power;
|
||||||
|
USB_OTG_DSTS_TypeDef dsts;
|
||||||
|
|
||||||
|
USBD_DCD_INT_fops->Suspend (pdev);
|
||||||
|
|
||||||
|
dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
gintsts.b.usbsuspend = 1;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
|
||||||
|
if((pdev->cfg.low_power) && (dsts.b.suspsts == 1))
|
||||||
|
{
|
||||||
|
/* switch-off the clocks */
|
||||||
|
power.d32 = 0;
|
||||||
|
power.b.stoppclk = 1;
|
||||||
|
USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32);
|
||||||
|
|
||||||
|
power.b.gatehclk = 1;
|
||||||
|
USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32);
|
||||||
|
|
||||||
|
/* Request to enter Sleep mode after exit from current ISR */
|
||||||
|
SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleInEP_ISR
|
||||||
|
* Indicates that an IN EP has a pending Interrupt
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_DIEPINTn_TypeDef diepint;
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t ep_intr;
|
||||||
|
uint32_t epnum = 0;
|
||||||
|
uint32_t fifoemptymsk;
|
||||||
|
diepint.d32 = 0;
|
||||||
|
ep_intr = USB_OTG_ReadDevAllInEPItr(pdev);
|
||||||
|
|
||||||
|
while ( ep_intr )
|
||||||
|
{
|
||||||
|
if (ep_intr&0x1) /* In ITR */
|
||||||
|
{
|
||||||
|
diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */
|
||||||
|
if ( diepint.b.xfercompl )
|
||||||
|
{
|
||||||
|
fifoemptymsk = 0x1 << epnum;
|
||||||
|
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
||||||
|
CLEAR_IN_EP_INTR(epnum, xfercompl);
|
||||||
|
/* TX COMPLETE */
|
||||||
|
USBD_DCD_INT_fops->DataInStage(pdev , epnum);
|
||||||
|
|
||||||
|
if (pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN))
|
||||||
|
{
|
||||||
|
/* prepare to rx more setup packets */
|
||||||
|
USB_OTG_EP0_OutStart(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( diepint.b.ahberr )
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(epnum, ahberr);
|
||||||
|
}
|
||||||
|
if ( diepint.b.timeout )
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(epnum, timeout);
|
||||||
|
}
|
||||||
|
if (diepint.b.intktxfemp)
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(epnum, intktxfemp);
|
||||||
|
}
|
||||||
|
if (diepint.b.intknepmis)
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(epnum, intknepmis);
|
||||||
|
}
|
||||||
|
if (diepint.b.inepnakeff)
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(epnum, inepnakeff);
|
||||||
|
}
|
||||||
|
if ( diepint.b.epdisabled )
|
||||||
|
{
|
||||||
|
CLEAR_IN_EP_INTR(epnum, epdisabled);
|
||||||
|
}
|
||||||
|
if (diepint.b.emptyintr)
|
||||||
|
{
|
||||||
|
|
||||||
|
DCD_WriteEmptyTxFifo(pdev , epnum);
|
||||||
|
|
||||||
|
//CLEAR_IN_EP_INTR(epnum, emptyintr);
|
||||||
|
diepint.d32=0;
|
||||||
|
diepint.b.emptyintr = 1;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
epnum++;
|
||||||
|
ep_intr >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleOutEP_ISR
|
||||||
|
* Indicates that an OUT EP has a pending Interrupt
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
uint32_t ep_intr;
|
||||||
|
USB_OTG_DOEPINTn_TypeDef doepint;
|
||||||
|
USB_OTG_DEPXFRSIZ_TypeDef deptsiz;
|
||||||
|
uint32_t epnum = 0;
|
||||||
|
|
||||||
|
doepint.d32 = 0;
|
||||||
|
|
||||||
|
/* Read in the device interrupt bits */
|
||||||
|
ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev);
|
||||||
|
|
||||||
|
while ( ep_intr )
|
||||||
|
{
|
||||||
|
if (ep_intr&0x1)
|
||||||
|
{
|
||||||
|
|
||||||
|
doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum);
|
||||||
|
|
||||||
|
/* Transfer complete */
|
||||||
|
if ( doepint.b.xfercompl )
|
||||||
|
{
|
||||||
|
/* Clear the bit in DOEPINTn for this interrupt */
|
||||||
|
CLEAR_OUT_EP_INTR(epnum, xfercompl);
|
||||||
|
if (pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ));
|
||||||
|
/*ToDo : handle more than one single MPS size packet */
|
||||||
|
pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \
|
||||||
|
deptsiz.b.xfersize;
|
||||||
|
}
|
||||||
|
/* Inform upper layer: data ready */
|
||||||
|
/* RX COMPLETE */
|
||||||
|
USBD_DCD_INT_fops->DataOutStage(pdev , epnum);
|
||||||
|
|
||||||
|
if (pdev->cfg.dma_enable == 1)
|
||||||
|
{
|
||||||
|
if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT))
|
||||||
|
{
|
||||||
|
/* prepare to rx more setup packets */
|
||||||
|
USB_OTG_EP0_OutStart(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Endpoint disable */
|
||||||
|
if ( doepint.b.epdisabled )
|
||||||
|
{
|
||||||
|
/* Clear the bit in DOEPINTn for this interrupt */
|
||||||
|
CLEAR_OUT_EP_INTR(epnum, epdisabled);
|
||||||
|
}
|
||||||
|
/* AHB Error */
|
||||||
|
if ( doepint.b.ahberr )
|
||||||
|
{
|
||||||
|
CLEAR_OUT_EP_INTR(epnum, ahberr);
|
||||||
|
}
|
||||||
|
/* Setup Phase Done (control EPs) */
|
||||||
|
if ( doepint.b.setup )
|
||||||
|
{
|
||||||
|
|
||||||
|
/* inform the upper layer that a setup packet is available */
|
||||||
|
/* SETUP COMPLETE */
|
||||||
|
USBD_DCD_INT_fops->SetupStage(pdev);
|
||||||
|
CLEAR_OUT_EP_INTR(epnum, setup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
epnum++;
|
||||||
|
ep_intr >>= 1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleSof_ISR
|
||||||
|
* Handles the SOF Interrupts
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef GINTSTS;
|
||||||
|
|
||||||
|
|
||||||
|
USBD_DCD_INT_fops->SOF(pdev);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
GINTSTS.d32 = 0;
|
||||||
|
GINTSTS.b.sofintr = 1;
|
||||||
|
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleRxStatusQueueLevel_ISR
|
||||||
|
* Handles the Rx Status Queue Level Interrupt
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTMSK_TypeDef int_mask;
|
||||||
|
USB_OTG_DRXSTS_TypeDef status;
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
|
||||||
|
/* Disable the Rx Status Queue Level interrupt */
|
||||||
|
int_mask.d32 = 0;
|
||||||
|
int_mask.b.rxstsqlvl = 1;
|
||||||
|
USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0);
|
||||||
|
|
||||||
|
/* Get the Status from the top of the FIFO */
|
||||||
|
status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP );
|
||||||
|
|
||||||
|
ep = &pdev->dev.out_ep[status.b.epnum];
|
||||||
|
|
||||||
|
switch (status.b.pktsts)
|
||||||
|
{
|
||||||
|
case STS_GOUT_NAK:
|
||||||
|
break;
|
||||||
|
case STS_DATA_UPDT:
|
||||||
|
if (status.b.bcnt)
|
||||||
|
{
|
||||||
|
USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt);
|
||||||
|
ep->xfer_buff += status.b.bcnt;
|
||||||
|
ep->xfer_count += status.b.bcnt;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STS_XFER_COMP:
|
||||||
|
break;
|
||||||
|
case STS_SETUP_COMP:
|
||||||
|
break;
|
||||||
|
case STS_SETUP_UPDT:
|
||||||
|
/* Copy the setup packet received in FIFO into the setup buffer in RAM */
|
||||||
|
USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8);
|
||||||
|
ep->xfer_count += status.b.bcnt;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable the Rx Status Queue Level interrupt */
|
||||||
|
USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_WriteEmptyTxFifo
|
||||||
|
* check FIFO for the next packet to be loaded
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum)
|
||||||
|
{
|
||||||
|
USB_OTG_DTXFSTSn_TypeDef txstatus;
|
||||||
|
USB_OTG_EP *ep;
|
||||||
|
uint32_t len = 0;
|
||||||
|
uint32_t len32b;
|
||||||
|
static uint32_t count = 0;
|
||||||
|
txstatus.d32 = 0;
|
||||||
|
|
||||||
|
ep = &pdev->dev.in_ep[epnum];
|
||||||
|
|
||||||
|
len = ep->xfer_len - ep->xfer_count;
|
||||||
|
|
||||||
|
if (len > ep->maxpacket)
|
||||||
|
{
|
||||||
|
len = ep->maxpacket;
|
||||||
|
}
|
||||||
|
|
||||||
|
len32b = (len + 3) / 4;
|
||||||
|
txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while (txstatus.b.txfspcavail > len32b &&
|
||||||
|
ep->xfer_count < ep->xfer_len &&
|
||||||
|
ep->xfer_len != 0)
|
||||||
|
{
|
||||||
|
/* Write the FIFO */
|
||||||
|
len = ep->xfer_len - ep->xfer_count;
|
||||||
|
|
||||||
|
if (len > ep->maxpacket)
|
||||||
|
{
|
||||||
|
len = ep->maxpacket;
|
||||||
|
}
|
||||||
|
len32b = (len + 3) / 4;
|
||||||
|
|
||||||
|
USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len);
|
||||||
|
|
||||||
|
ep->xfer_buff += len;
|
||||||
|
ep->xfer_count += len;
|
||||||
|
|
||||||
|
txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(len == 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint32_t fifoemptymsk;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
if(count == 10)
|
||||||
|
{
|
||||||
|
fifoemptymsk = 0x1 << epnum;
|
||||||
|
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleUsbReset_ISR
|
||||||
|
* This interrupt occurs when a USB Reset is detected
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_DAINT_TypeDef daintmsk;
|
||||||
|
USB_OTG_DOEPMSK_TypeDef doepmsk;
|
||||||
|
USB_OTG_DIEPMSK_TypeDef diepmsk;
|
||||||
|
USB_OTG_DCFG_TypeDef dcfg;
|
||||||
|
USB_OTG_DCTL_TypeDef dctl;
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
dctl.d32 = 0;
|
||||||
|
daintmsk.d32 = 0;
|
||||||
|
doepmsk.d32 = 0;
|
||||||
|
diepmsk.d32 = 0;
|
||||||
|
dcfg.d32 = 0;
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
|
||||||
|
/* Clear the Remote Wake-up Signaling */
|
||||||
|
dctl.b.rmtwkupsig = 1;
|
||||||
|
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 );
|
||||||
|
|
||||||
|
/* Flush the Tx FIFO */
|
||||||
|
USB_OTG_FlushTxFifo(pdev , 0 );
|
||||||
|
|
||||||
|
for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
|
||||||
|
{
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF);
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF);
|
||||||
|
}
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF );
|
||||||
|
|
||||||
|
daintmsk.ep.in = 1;
|
||||||
|
daintmsk.ep.out = 1;
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 );
|
||||||
|
|
||||||
|
doepmsk.b.setup = 1;
|
||||||
|
doepmsk.b.xfercompl = 1;
|
||||||
|
doepmsk.b.ahberr = 1;
|
||||||
|
doepmsk.b.epdisabled = 1;
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 );
|
||||||
|
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 );
|
||||||
|
#endif
|
||||||
|
diepmsk.b.xfercompl = 1;
|
||||||
|
diepmsk.b.timeout = 1;
|
||||||
|
diepmsk.b.epdisabled = 1;
|
||||||
|
diepmsk.b.ahberr = 1;
|
||||||
|
diepmsk.b.intknepmis = 1;
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 );
|
||||||
|
#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 );
|
||||||
|
#endif
|
||||||
|
/* Reset Device Address */
|
||||||
|
dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG);
|
||||||
|
dcfg.b.devaddr = 0;
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32);
|
||||||
|
|
||||||
|
|
||||||
|
/* setup EP0 to receive SETUP packets */
|
||||||
|
USB_OTG_EP0_OutStart(pdev);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
gintsts.b.usbreset = 1;
|
||||||
|
USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
|
||||||
|
/*Reset internal state machine */
|
||||||
|
USBD_DCD_INT_fops->Reset(pdev);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_HandleEnumDone_ISR
|
||||||
|
* Read the device status register and set the device speed
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
USB_OTG_GUSBCFG_TypeDef gusbcfg;
|
||||||
|
|
||||||
|
USB_OTG_EP0Activate(pdev);
|
||||||
|
|
||||||
|
/* Set USB turn-around time based on device speed and PHY interface. */
|
||||||
|
gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);
|
||||||
|
|
||||||
|
/* Full or High speed */
|
||||||
|
if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH)
|
||||||
|
{
|
||||||
|
pdev->cfg.speed = USB_OTG_SPEED_HIGH;
|
||||||
|
pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ;
|
||||||
|
gusbcfg.b.usbtrdtim = 9;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pdev->cfg.speed = USB_OTG_SPEED_FULL;
|
||||||
|
pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ;
|
||||||
|
gusbcfg.b.usbtrdtim = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
gintsts.b.enumdone = 1;
|
||||||
|
USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_IsoINIncomplete_ISR
|
||||||
|
* handle the ISO IN incomplete interrupt
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
|
||||||
|
USBD_DCD_INT_fops->IsoINIncomplete (pdev);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.b.incomplisoin = 1;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief DCD_IsoOUTIncomplete_ISR
|
||||||
|
* handle the ISO OUT incomplete interrupt
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev)
|
||||||
|
{
|
||||||
|
USB_OTG_GINTSTS_TypeDef gintsts;
|
||||||
|
|
||||||
|
gintsts.d32 = 0;
|
||||||
|
|
||||||
|
USBD_DCD_INT_fops->IsoOUTIncomplete (pdev);
|
||||||
|
|
||||||
|
/* Clear interrupt */
|
||||||
|
gintsts.b.incomplisoout = 1;
|
||||||
|
USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief DCD_ReadDevInEP
|
||||||
|
* Reads ep flags
|
||||||
|
* @param pdev: device instance
|
||||||
|
* @retval status
|
||||||
|
*/
|
||||||
|
static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
|
||||||
|
{
|
||||||
|
uint32_t v, msk, emp;
|
||||||
|
msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK);
|
||||||
|
emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK);
|
||||||
|
msk |= ((emp >> epnum) & 0x1) << 7;
|
||||||
|
v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user