initial commit
This commit is contained in:
		
							
								
								
									
										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
		Reference in New Issue
	
	Block a user