mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 02:32:42 -05:00 
			
		
		
		
	Add back Zynq demo - this time using SDK V14.2.
This commit is contained in:
		
							parent
							
								
									96ceb9f537
								
							
						
					
					
						commit
						bd9d37924d
					
				
					 381 changed files with 269762 additions and 0 deletions
				
			
		
							
								
								
									
										112
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.cproject
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,112 @@
 | 
			
		|||
<?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="xilinx.gnu.arm.exe.debug.1043799205">
 | 
			
		||||
			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="xilinx.gnu.arm.exe.debug.1043799205" moduleId="org.eclipse.cdt.core.settings" name="Debug">
 | 
			
		||||
				<externalSettings/>
 | 
			
		||||
				<extensions>
 | 
			
		||||
					<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"/>
 | 
			
		||||
					<extension id="com.xilinx.sdk.managedbuilder.XELF.arm" point="org.eclipse.cdt.core.BinaryParser"/>
 | 
			
		||||
				</extensions>
 | 
			
		||||
			</storageModule>
 | 
			
		||||
			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 | 
			
		||||
				<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="xilinx.gnu.arm.exe.debug.1043799205" name="Debug" parent="xilinx.gnu.arm.exe.debug">
 | 
			
		||||
					<folderInfo id="xilinx.gnu.arm.exe.debug.1043799205." name="/" resourcePath="">
 | 
			
		||||
						<toolChain id="xilinx.gnu.arm.exe.debug.toolchain.1150647201" name="Xilinx ARM GNU Toolchain" superClass="xilinx.gnu.arm.exe.debug.toolchain">
 | 
			
		||||
							<targetPlatform binaryParser="com.xilinx.sdk.managedbuilder.XELF.arm" id="xilinx.arm.target.gnu.base.debug.1003863326" isAbstract="false" name="Debug Platform" superClass="xilinx.arm.target.gnu.base.debug"/>
 | 
			
		||||
							<builder buildPath="${workspace_loc:/RTOSDemo}/Debug" enableAutoBuild="true" id="xilinx.gnu.arm.toolchain.builder.debug.1676277979" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="GNU make" superClass="xilinx.gnu.arm.toolchain.builder.debug"/>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.c.toolchain.assembler.debug.1940746554" name="ARM gcc assembler" superClass="xilinx.gnu.arm.c.toolchain.assembler.debug">
 | 
			
		||||
								<inputType id="xilinx.gnu.assembler.input.1210492545" superClass="xilinx.gnu.assembler.input"/>
 | 
			
		||||
							</tool>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.c.toolchain.compiler.debug.1720434900" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.debug">
 | 
			
		||||
								<option defaultValue="gnu.c.optimization.level.none" id="xilinx.gnu.compiler.option.optimization.level.1197002886" name="Optimization Level" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/>
 | 
			
		||||
								<option id="xilinx.gnu.compiler.option.debugging.level.1441612435" name="Debug Level" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
 | 
			
		||||
								<option id="xilinx.gnu.compiler.inferred.swplatform.includes.2110847612" name="Software Platform Include Path" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath">
 | 
			
		||||
									<listOptionValue builtIn="false" value="../../RTOSDemo_bsp/ps7_cortexa9_0/include"/>
 | 
			
		||||
								</option>
 | 
			
		||||
								<option id="xilinx.gnu.compiler.dircategory.includes.1717969654" name="Include Paths" superClass="xilinx.gnu.compiler.dircategory.includes" valueType="includePath">
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/lwIP_Demo/lwIP_port/include}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/lwIP_Demo/lwIP_port/netif}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/FreeRTOS_Source/include}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/FreeRTOS_Source/portable/GCC/ARM_CA9}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/lwIP_Demo/lwip-1.4.0/src/include/ipv4}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/lwIP_Demo/lwip-1.4.0/src/include}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/Full_Demo}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/Full_Demo/FreeRTOS-Plus-CLI}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/Full_Demo/Standard-Demo-Tasks/include}""/>
 | 
			
		||||
									<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src}""/>
 | 
			
		||||
								</option>
 | 
			
		||||
								<option id="xilinx.gnu.compiler.misc.other.697975463" name="Other flags" superClass="xilinx.gnu.compiler.misc.other" value="-c -fmessage-length=0 -Wextra" valueType="string"/>
 | 
			
		||||
								<inputType id="xilinx.gnu.arm.c.compiler.input.783477932" name="C source files" superClass="xilinx.gnu.arm.c.compiler.input"/>
 | 
			
		||||
							</tool>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.cxx.toolchain.compiler.debug.1175556061" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.debug">
 | 
			
		||||
								<option defaultValue="gnu.c.optimization.level.none" id="xilinx.gnu.compiler.option.optimization.level.2080237634" name="Optimization Level" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/>
 | 
			
		||||
								<option id="xilinx.gnu.compiler.option.debugging.level.1244998877" name="Debug Level" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
 | 
			
		||||
								<option id="xilinx.gnu.compiler.inferred.swplatform.includes.1649523330" name="Software Platform Include Path" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath">
 | 
			
		||||
									<listOptionValue builtIn="false" value="../../RTOSDemo_bsp/ps7_cortexa9_0/include"/>
 | 
			
		||||
								</option>
 | 
			
		||||
							</tool>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.toolchain.archiver.1033000544" name="ARM archiver" superClass="xilinx.gnu.arm.toolchain.archiver"/>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.c.toolchain.linker.debug.570341934" name="ARM gcc linker" superClass="xilinx.gnu.arm.c.toolchain.linker.debug">
 | 
			
		||||
								<option id="xilinx.gnu.linker.inferred.swplatform.lpath.973520259" name="Software Platform Library Path" superClass="xilinx.gnu.linker.inferred.swplatform.lpath" valueType="libPaths">
 | 
			
		||||
									<listOptionValue builtIn="false" value="../../RTOSDemo_bsp/ps7_cortexa9_0/lib"/>
 | 
			
		||||
								</option>
 | 
			
		||||
								<option id="xilinx.gnu.linker.inferred.swplatform.flags.1523508984" name="Software Platform Inferred Flags" superClass="xilinx.gnu.linker.inferred.swplatform.flags" valueType="libs">
 | 
			
		||||
									<listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/>
 | 
			
		||||
								</option>
 | 
			
		||||
								<option id="xilinx.gnu.c.linker.option.lscript.1669492416" name="Linker Script" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/>
 | 
			
		||||
								<inputType id="xilinx.gnu.linker.input.1960859838" superClass="xilinx.gnu.linker.input">
 | 
			
		||||
									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
 | 
			
		||||
									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
 | 
			
		||||
								</inputType>
 | 
			
		||||
								<inputType id="xilinx.gnu.linker.input.lscript.1596379933" name="Linker Script" superClass="xilinx.gnu.linker.input.lscript"/>
 | 
			
		||||
							</tool>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.cxx.toolchain.linker.debug.376467067" name="ARM g++ linker" superClass="xilinx.gnu.arm.cxx.toolchain.linker.debug">
 | 
			
		||||
								<option id="xilinx.gnu.linker.inferred.swplatform.lpath.1419622411" name="Software Platform Library Path" superClass="xilinx.gnu.linker.inferred.swplatform.lpath" valueType="libPaths">
 | 
			
		||||
									<listOptionValue builtIn="false" value="../../RTOSDemo_bsp/ps7_cortexa9_0/lib"/>
 | 
			
		||||
								</option>
 | 
			
		||||
								<option id="xilinx.gnu.linker.inferred.swplatform.flags.191308032" name="Software Platform Inferred Flags" superClass="xilinx.gnu.linker.inferred.swplatform.flags" valueType="libs">
 | 
			
		||||
									<listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/>
 | 
			
		||||
								</option>
 | 
			
		||||
								<option id="xilinx.gnu.c.linker.option.lscript.468922670" name="Linker Script" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/>
 | 
			
		||||
							</tool>
 | 
			
		||||
							<tool id="xilinx.gnu.arm.size.debug.167865540" name="ARM Print Size" superClass="xilinx.gnu.arm.size.debug"/>
 | 
			
		||||
						</toolChain>
 | 
			
		||||
					</folderInfo>
 | 
			
		||||
					<fileInfo id="xilinx.gnu.arm.exe.debug.1043799205.2119759067" name="fsdata.c" rcbsApplicability="disable" resourcePath="src/lwIP_Demo/lwIP_Apps/apps/httpserver_raw_from_lwIP_download/fsdata.c" toolsToInvoke="xilinx.gnu.arm.c.toolchain.compiler.debug.1720434900.1218965551">
 | 
			
		||||
						<tool id="xilinx.gnu.arm.c.toolchain.compiler.debug.1720434900.1218965551" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.debug.1720434900"/>
 | 
			
		||||
					</fileInfo>
 | 
			
		||||
					<sourceEntries>
 | 
			
		||||
						<entry excluding="src/lwIP_Demo/lwIP_Apps/apps/httpserver_raw_from_lwIP_download/fsdata.c|src/lwIP_Demo/lwIP_Apps/apps/httpserver_raw_from_lwIP_download/makefsdata" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
 | 
			
		||||
					</sourceEntries>
 | 
			
		||||
				</configuration>
 | 
			
		||||
			</storageModule>
 | 
			
		||||
			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
 | 
			
		||||
		</cconfiguration>
 | 
			
		||||
	</storageModule>
 | 
			
		||||
	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 | 
			
		||||
	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 | 
			
		||||
		<project id="RTOSDemo.xilinx.gnu.arm.exe.829046219" name="Xilinx ARM Executable" projectType="xilinx.gnu.arm.exe"/>
 | 
			
		||||
	</storageModule>
 | 
			
		||||
	<storageModule moduleId="scannerConfiguration">
 | 
			
		||||
		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
 | 
			
		||||
		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.release.1642505604;xilinx.gnu.arm.exe.release.1642505604.;xilinx.gnu.arm.c.toolchain.compiler.release.1029084648;xilinx.gnu.arm.c.compiler.input.1569032521">
 | 
			
		||||
			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 | 
			
		||||
		</scannerConfigBuildInfo>
 | 
			
		||||
		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.release.1642505604;xilinx.gnu.arm.exe.release.1642505604.">
 | 
			
		||||
			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 | 
			
		||||
		</scannerConfigBuildInfo>
 | 
			
		||||
		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.debug.1043799205;xilinx.gnu.arm.exe.debug.1043799205.">
 | 
			
		||||
			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 | 
			
		||||
		</scannerConfigBuildInfo>
 | 
			
		||||
		<scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.debug.1043799205;xilinx.gnu.arm.exe.debug.1043799205.;xilinx.gnu.arm.c.toolchain.compiler.debug.1720434900;xilinx.gnu.arm.c.compiler.input.783477932">
 | 
			
		||||
			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/>
 | 
			
		||||
		</scannerConfigBuildInfo>
 | 
			
		||||
	</storageModule>
 | 
			
		||||
	<storageModule moduleId="refreshScope"/>
 | 
			
		||||
	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
 | 
			
		||||
</cproject>
 | 
			
		||||
							
								
								
									
										215
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.project
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/.project
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,215 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<projectDescription>
 | 
			
		||||
	<name>RTOSDemo</name>
 | 
			
		||||
	<comment>Created by SDK v2014.2. RTOSDemo_bsp - ps7_cortexa9_0</comment>
 | 
			
		||||
	<projects>
 | 
			
		||||
		<project>RTOSDemo_bsp</project>
 | 
			
		||||
	</projects>
 | 
			
		||||
	<buildSpec>
 | 
			
		||||
		<buildCommand>
 | 
			
		||||
			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
 | 
			
		||||
			<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.managedbuilder.core.managedBuildNature</nature>
 | 
			
		||||
		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
 | 
			
		||||
	</natures>
 | 
			
		||||
	<linkedResources>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/FreeRTOS_Source</name>
 | 
			
		||||
			<type>2</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS/Source</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/Full_Demo/FreeRTOS-Plus-CLI</name>
 | 
			
		||||
			<type>2</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS-Plus/Source/FreeRTOS-Plus-CLI</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/Full_Demo/IntQueue.c</name>
 | 
			
		||||
			<type>1</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/IntQueue.c</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/Full_Demo/Sample-CLI-commands.c</name>
 | 
			
		||||
			<type>1</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/Sample-CLI-commands.c</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>2</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/Full_Demo/UARTCommandConsole.c</name>
 | 
			
		||||
			<type>1</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS-Plus/Demo/Common/FreeRTOS_Plus_CLI_Demos/UARTCommandConsole.c</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
		<link>
 | 
			
		||||
			<name>src/lwIP_Demo/lwip-1.4.0</name>
 | 
			
		||||
			<type>2</type>
 | 
			
		||||
			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/ethernet/lwip-1.4.0</locationURI>
 | 
			
		||||
		</link>
 | 
			
		||||
	</linkedResources>
 | 
			
		||||
	<filteredResources>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340171891</id>
 | 
			
		||||
			<name>src/FreeRTOS_Source/portable</name>
 | 
			
		||||
			<type>9</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-GCC</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340171901</id>
 | 
			
		||||
			<name>src/FreeRTOS_Source/portable</name>
 | 
			
		||||
			<type>9</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-MemMang</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618192</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>9</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-Minimal</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618202</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>9</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-include</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618202</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>22</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-alt*.*</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618212</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>22</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-cr*.*</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618212</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>22</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-sp*.*</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618212</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>22</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-intq*.*</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618222</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>22</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-*strings*.*</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340618222</id>
 | 
			
		||||
			<name>src/Full_Demo/Standard-Demo-Tasks</name>
 | 
			
		||||
			<type>22</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-copy*.*</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405341622717</id>
 | 
			
		||||
			<name>src/lwIP_Demo/lwip-1.4.0</name>
 | 
			
		||||
			<type>10</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-ports</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340232557</id>
 | 
			
		||||
			<name>src/FreeRTOS_Source/portable/GCC</name>
 | 
			
		||||
			<type>9</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-ARM_CA9</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405340216963</id>
 | 
			
		||||
			<name>src/FreeRTOS_Source/portable/MemMang</name>
 | 
			
		||||
			<type>5</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-heap_4.c</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405341154152</id>
 | 
			
		||||
			<name>src/lwIP_Demo/lwip-1.4.0/src/core</name>
 | 
			
		||||
			<type>10</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-ipv6</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405341154162</id>
 | 
			
		||||
			<name>src/lwIP_Demo/lwip-1.4.0/src/core</name>
 | 
			
		||||
			<type>10</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-snmp</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
		<filter>
 | 
			
		||||
			<id>1405341173635</id>
 | 
			
		||||
			<name>src/lwIP_Demo/lwip-1.4.0/src/netif</name>
 | 
			
		||||
			<type>10</type>
 | 
			
		||||
			<matcher>
 | 
			
		||||
				<id>org.eclipse.ui.ide.multiFilter</id>
 | 
			
		||||
				<arguments>1.0-name-matches-false-false-ppp</arguments>
 | 
			
		||||
			</matcher>
 | 
			
		||||
		</filter>
 | 
			
		||||
	</filteredResources>
 | 
			
		||||
	<variableList>
 | 
			
		||||
		<variable>
 | 
			
		||||
			<name>FREERTOS_ROOT</name>
 | 
			
		||||
			<value>$%7BPARENT-4-PROJECT_LOC%7D</value>
 | 
			
		||||
		</variable>
 | 
			
		||||
	</variableList>
 | 
			
		||||
</projectDescription>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,226 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * NOTE 1:  This project provides three demo applications.  A simple blinky
 | 
			
		||||
 * style project, a more comprehensive test and demo application, and an
 | 
			
		||||
 * lwIP example.  The mainSELECTED_APPLICATION setting in main.c is used to
 | 
			
		||||
 * select between the three.  See the notes on using mainSELECTED_APPLICATION
 | 
			
		||||
 * in main.c.  This file implements the simply blinky style version.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE 2:  This file only contains the source code that is specific to the
 | 
			
		||||
 * basic demo.  Generic functions, such FreeRTOS hook functions, and functions
 | 
			
		||||
 * required to configure the hardware are defined in main.c.
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * main_blinky() creates one queue, and two tasks.  It then starts the
 | 
			
		||||
 * scheduler.
 | 
			
		||||
 *
 | 
			
		||||
 * The Queue Send Task:
 | 
			
		||||
 * The queue send task is implemented by the prvQueueSendTask() function in
 | 
			
		||||
 * this file.  prvQueueSendTask() sits in a loop that causes it to repeatedly
 | 
			
		||||
 * block for 200 milliseconds, before sending the value 100 to the queue that
 | 
			
		||||
 * was created within main_blinky().  Once the value is sent, the task loops
 | 
			
		||||
 * back around to block for another 200 milliseconds...and so on.
 | 
			
		||||
 *
 | 
			
		||||
 * The Queue Receive Task:
 | 
			
		||||
 * The queue receive task is implemented by the prvQueueReceiveTask() function
 | 
			
		||||
 * in this file.  prvQueueReceiveTask() sits in a loop where it repeatedly
 | 
			
		||||
 * blocks on attempts to read data from the queue that was created within
 | 
			
		||||
 * main_blinky().  When data is received, the task checks the value of the
 | 
			
		||||
 * data, and if the value equals the expected 100, toggles an LED.  The 'block
 | 
			
		||||
 * time' parameter passed to the queue receive function specifies that the
 | 
			
		||||
 * task should be held in the Blocked state indefinitely to wait for data to
 | 
			
		||||
 * be available on the queue.  The queue receive task will only leave the
 | 
			
		||||
 * Blocked state when the queue send task writes to the queue.  As the queue
 | 
			
		||||
 * send task writes to the queue every 200 milliseconds, the queue receive
 | 
			
		||||
 * task leaves the Blocked state every 200 milliseconds, and therefore toggles
 | 
			
		||||
 * the LED every 200 milliseconds.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Kernel includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
 | 
			
		||||
/* Standard demo includes. */
 | 
			
		||||
#include "partest.h"
 | 
			
		||||
 | 
			
		||||
/* Priorities at which the tasks are created. */
 | 
			
		||||
#define mainQUEUE_RECEIVE_TASK_PRIORITY		( tskIDLE_PRIORITY + 2 )
 | 
			
		||||
#define	mainQUEUE_SEND_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 )
 | 
			
		||||
 | 
			
		||||
/* The rate at which data is sent to the queue.  The 200ms value is converted
 | 
			
		||||
to ticks using the portTICK_PERIOD_MS constant. */
 | 
			
		||||
#define mainQUEUE_SEND_FREQUENCY_MS			( 200 / portTICK_PERIOD_MS )
 | 
			
		||||
 | 
			
		||||
/* The number of items the queue can hold.  This is 1 as the receive task
 | 
			
		||||
will remove items as they are added, meaning the send task should always find
 | 
			
		||||
the queue empty. */
 | 
			
		||||
#define mainQUEUE_LENGTH					( 1 )
 | 
			
		||||
 | 
			
		||||
/* The LED toggled by the Rx task. */
 | 
			
		||||
#define mainTASK_LED						( 0 )
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The tasks as described in the comments at the top of this file.
 | 
			
		||||
 */
 | 
			
		||||
static void prvQueueReceiveTask( void *pvParameters );
 | 
			
		||||
static void prvQueueSendTask( void *pvParameters );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The queue used by both tasks. */
 | 
			
		||||
static QueueHandle_t xQueue = NULL;
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void main_blinky( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Create the queue. */
 | 
			
		||||
	xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );
 | 
			
		||||
 | 
			
		||||
	if( xQueue != NULL )
 | 
			
		||||
	{
 | 
			
		||||
		/* Start the two tasks as described in the comments at the top of this
 | 
			
		||||
		file. */
 | 
			
		||||
		xTaskCreate( prvQueueReceiveTask,				/* The function that implements the task. */
 | 
			
		||||
					"Rx", 								/* The text name assigned to the task - for debug only as it is not used by the kernel. */
 | 
			
		||||
					configMINIMAL_STACK_SIZE, 			/* The size of the stack to allocate to the task. */
 | 
			
		||||
					NULL, 								/* The parameter passed to the task - not used in this case. */
 | 
			
		||||
					mainQUEUE_RECEIVE_TASK_PRIORITY, 	/* The priority assigned to the task. */
 | 
			
		||||
					NULL );								/* The task handle is not required, so NULL is passed. */
 | 
			
		||||
 | 
			
		||||
		xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );
 | 
			
		||||
 | 
			
		||||
		/* Start the tasks and timer running. */
 | 
			
		||||
		vTaskStartScheduler();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If all is well, the scheduler will now be running, and the following
 | 
			
		||||
	line will never be reached.  If the following line does execute, then
 | 
			
		||||
	there was either insufficient FreeRTOS heap memory available for the idle
 | 
			
		||||
	and/or timer tasks to be created, or vTaskStartScheduler() was called from
 | 
			
		||||
	User mode.  See the memory management section on the FreeRTOS web site for
 | 
			
		||||
	more details on the FreeRTOS heap http://www.freertos.org/a00111.html.  The
 | 
			
		||||
	mode from which main() is called is set in the C start up code and must be
 | 
			
		||||
	a privileged mode (not user mode). */
 | 
			
		||||
	for( ;; );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvQueueSendTask( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
TickType_t xNextWakeTime;
 | 
			
		||||
const unsigned long ulValueToSend = 100UL;
 | 
			
		||||
 | 
			
		||||
	/* Remove compiler warning about unused parameter. */
 | 
			
		||||
	( void ) pvParameters;
 | 
			
		||||
 | 
			
		||||
	/* Initialise xNextWakeTime - this only needs to be done once. */
 | 
			
		||||
	xNextWakeTime = xTaskGetTickCount();
 | 
			
		||||
 | 
			
		||||
	for( ;; )
 | 
			
		||||
	{
 | 
			
		||||
		/* Place this task in the blocked state until it is time to run again. */
 | 
			
		||||
		vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
 | 
			
		||||
 | 
			
		||||
		/* Send to the queue - causing the queue receive task to unblock and
 | 
			
		||||
		toggle the LED.  0 is used as the block time so the sending operation
 | 
			
		||||
		will not block - it shouldn't need to block as the queue should always
 | 
			
		||||
		be empty at this point in the code. */
 | 
			
		||||
		xQueueSend( xQueue, &ulValueToSend, 0U );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvQueueReceiveTask( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
unsigned long ulReceivedValue;
 | 
			
		||||
const unsigned long ulExpectedValue = 100UL;
 | 
			
		||||
 | 
			
		||||
	/* Remove compiler warning about unused parameter. */
 | 
			
		||||
	( void ) pvParameters;
 | 
			
		||||
 | 
			
		||||
	for( ;; )
 | 
			
		||||
	{
 | 
			
		||||
		/* Wait until something arrives in the queue - this task will block
 | 
			
		||||
		indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
 | 
			
		||||
		FreeRTOSConfig.h. */
 | 
			
		||||
		xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
 | 
			
		||||
 | 
			
		||||
		/*  To get here something must have been received from the queue, but
 | 
			
		||||
		is it the expected value?  If it is, toggle the LED. */
 | 
			
		||||
		if( ulReceivedValue == ulExpectedValue )
 | 
			
		||||
		{
 | 
			
		||||
			vParTestToggleLED( mainTASK_LED );
 | 
			
		||||
			ulReceivedValue = 0U;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										243
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,243 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef FREERTOS_CONFIG_H
 | 
			
		||||
#define FREERTOS_CONFIG_H
 | 
			
		||||
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Application specific definitions.
 | 
			
		||||
 *
 | 
			
		||||
 * These definitions should be adjusted for your particular hardware and
 | 
			
		||||
 * application requirements.
 | 
			
		||||
 *
 | 
			
		||||
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 | 
			
		||||
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 | 
			
		||||
 *
 | 
			
		||||
 * See http://www.freertos.org/a00110.html.
 | 
			
		||||
 *----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The FreeRTOS Cortex-A port implements a full interrupt nesting model.
 | 
			
		||||
 *
 | 
			
		||||
 * Interrupts that are assigned a priority at or below
 | 
			
		||||
 * configMAX_API_CALL_INTERRUPT_PRIORITY (which counter-intuitively in the ARM
 | 
			
		||||
 * generic interrupt controller [GIC] means a priority that has a numerical
 | 
			
		||||
 * value above configMAX_API_CALL_INTERRUPT_PRIORITY) can call FreeRTOS safe API
 | 
			
		||||
 * functions and will nest.
 | 
			
		||||
 *
 | 
			
		||||
 * Interrupts that are assigned a priority above
 | 
			
		||||
 * configMAX_API_CALL_INTERRUPT_PRIORITY (which in the GIC means a numerical
 | 
			
		||||
 * value below configMAX_API_CALL_INTERRUPT_PRIORITY) cannot call any FreeRTOS
 | 
			
		||||
 * API functions, will nest, and will not be masked by FreeRTOS critical
 | 
			
		||||
 * sections (although it is necessary for interrupts to be globally disabled
 | 
			
		||||
 * extremely briefly as the interrupt mask is updated in the GIC).
 | 
			
		||||
 *
 | 
			
		||||
 * FreeRTOS functions that can be called from an interrupt are those that end in
 | 
			
		||||
 * "FromISR".  FreeRTOS maintains a separate interrupt safe API to enable
 | 
			
		||||
 * interrupt entry to be shorter, faster, simpler and smaller.
 | 
			
		||||
 *
 | 
			
		||||
 * The Zynq implements 256 unique interrupt priorities.  For the purpose of
 | 
			
		||||
 * setting configMAX_API_CALL_INTERRUPT_PRIORITY 255 represents the lowest
 | 
			
		||||
 * priority.
 | 
			
		||||
 */
 | 
			
		||||
#define configMAX_API_CALL_INTERRUPT_PRIORITY	18
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define configCPU_CLOCK_HZ						100000000UL
 | 
			
		||||
#define configUSE_PORT_OPTIMISED_TASK_SELECTION	1
 | 
			
		||||
#define configUSE_TICKLESS_IDLE					0
 | 
			
		||||
#define configTICK_RATE_HZ						( ( TickType_t ) 1000 )
 | 
			
		||||
#define configPERIPHERAL_CLOCK_HZ  				( 33333000UL )
 | 
			
		||||
#define configUSE_PREEMPTION					1
 | 
			
		||||
#define configUSE_IDLE_HOOK						1
 | 
			
		||||
#define configUSE_TICK_HOOK						1
 | 
			
		||||
#define configMAX_PRIORITIES					( 7 )
 | 
			
		||||
#define configMINIMAL_STACK_SIZE				( ( unsigned short ) 200 )
 | 
			
		||||
#define configTOTAL_HEAP_SIZE					( 80 * 1024 )
 | 
			
		||||
#define configMAX_TASK_NAME_LEN					( 10 )
 | 
			
		||||
#define configUSE_TRACE_FACILITY				1
 | 
			
		||||
#define configUSE_16_BIT_TICKS					0
 | 
			
		||||
#define configIDLE_SHOULD_YIELD					1
 | 
			
		||||
#define configUSE_MUTEXES						1
 | 
			
		||||
#define configQUEUE_REGISTRY_SIZE				8
 | 
			
		||||
#define configCHECK_FOR_STACK_OVERFLOW			2
 | 
			
		||||
#define configUSE_RECURSIVE_MUTEXES				1
 | 
			
		||||
#define configUSE_MALLOC_FAILED_HOOK			1
 | 
			
		||||
#define configUSE_APPLICATION_TASK_TAG			0
 | 
			
		||||
#define configUSE_COUNTING_SEMAPHORES			1
 | 
			
		||||
#define configUSE_QUEUE_SETS					1
 | 
			
		||||
 | 
			
		||||
/* Co-routine definitions. */
 | 
			
		||||
#define configUSE_CO_ROUTINES 					0
 | 
			
		||||
#define configMAX_CO_ROUTINE_PRIORITIES 		( 2 )
 | 
			
		||||
 | 
			
		||||
/* Software timer definitions. */
 | 
			
		||||
#define configUSE_TIMERS						1
 | 
			
		||||
#define configTIMER_TASK_PRIORITY				( configMAX_PRIORITIES - 1 )
 | 
			
		||||
#define configTIMER_QUEUE_LENGTH				5
 | 
			
		||||
#define configTIMER_TASK_STACK_DEPTH			( configMINIMAL_STACK_SIZE * 2 )
 | 
			
		||||
 | 
			
		||||
/* Set the following definitions to 1 to include the API function, or zero
 | 
			
		||||
to exclude the API function. */
 | 
			
		||||
#define INCLUDE_vTaskPrioritySet				1
 | 
			
		||||
#define INCLUDE_uxTaskPriorityGet				1
 | 
			
		||||
#define INCLUDE_vTaskDelete						1
 | 
			
		||||
#define INCLUDE_vTaskCleanUpResources			1
 | 
			
		||||
#define INCLUDE_vTaskSuspend					1
 | 
			
		||||
#define INCLUDE_vTaskDelayUntil					1
 | 
			
		||||
#define INCLUDE_vTaskDelay						1
 | 
			
		||||
#define INCLUDE_xTimerPendFunctionCall			1
 | 
			
		||||
#define INCLUDE_eTaskGetState					1
 | 
			
		||||
 | 
			
		||||
/* This demo makes use of one or more example stats formatting functions.  These
 | 
			
		||||
format the raw data provided by the uxTaskGetSystemState() function in to human
 | 
			
		||||
readable ASCII form.  See the notes in the implementation of vTaskList() within
 | 
			
		||||
FreeRTOS/Source/tasks.c for limitations. */
 | 
			
		||||
#define configUSE_STATS_FORMATTING_FUNCTIONS	1
 | 
			
		||||
 | 
			
		||||
/* The private watchdog is used to generate run time stats. */
 | 
			
		||||
#include "xscuwdt.h"
 | 
			
		||||
extern XScuWdt xWatchDogInstance;
 | 
			
		||||
extern void vInitialiseTimerForRunTimeStats( void );
 | 
			
		||||
#define configGENERATE_RUN_TIME_STATS 1
 | 
			
		||||
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vInitialiseTimerForRunTimeStats()
 | 
			
		||||
#define portGET_RUN_TIME_COUNTER_VALUE() ( ( 0xffffffffUL - XScuWdt_ReadReg( xWatchDogInstance.Config.BaseAddr, XSCUWDT_COUNTER_OFFSET ) ) >> 1 )
 | 
			
		||||
 | 
			
		||||
/* The size of the global output buffer that is available for use when there
 | 
			
		||||
are multiple command interpreters running at once (for example, one on a UART
 | 
			
		||||
and one on TCP/IP).  This is done to prevent an output buffer being defined by
 | 
			
		||||
each implementation - which would waste RAM.  In this case, there is only one
 | 
			
		||||
command interpreter running. */
 | 
			
		||||
#define configCOMMAND_INT_MAX_OUTPUT_SIZE 2096
 | 
			
		||||
 | 
			
		||||
/* Normal assert() semantics without relying on the provision of an assert.h
 | 
			
		||||
header file. */
 | 
			
		||||
void vAssertCalled( const char * pcFile, unsigned long ulLine );
 | 
			
		||||
#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****** Hardware specific settings. *******************************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The application must provide a function that configures a peripheral to
 | 
			
		||||
 * create the FreeRTOS tick interrupt, then define configSETUP_TICK_INTERRUPT()
 | 
			
		||||
 * in FreeRTOSConfig.h to call the function.  This file contains a function
 | 
			
		||||
 * that is suitable for use on the Zynq MPU.  FreeRTOS_Tick_Handler() must
 | 
			
		||||
 * be installed as the peripheral's interrupt handler.
 | 
			
		||||
 */
 | 
			
		||||
void vConfigureTickInterrupt( void );
 | 
			
		||||
#define configSETUP_TICK_INTERRUPT() vConfigureTickInterrupt()
 | 
			
		||||
 | 
			
		||||
void vClearTickInterrupt( void );
 | 
			
		||||
#define configCLEAR_TICK_INTERRUPT() vClearTickInterrupt()
 | 
			
		||||
 | 
			
		||||
/* The following constant describe the hardware, and are correct for the
 | 
			
		||||
Zynq MPU. */
 | 
			
		||||
#define configINTERRUPT_CONTROLLER_BASE_ADDRESS 		( XPAR_PS7_SCUGIC_0_DIST_BASEADDR )
 | 
			
		||||
#define configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ( -0xf00 )
 | 
			
		||||
#define configUNIQUE_INTERRUPT_PRIORITIES				32
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****** Network configuration settings - only used when the lwIP example is
 | 
			
		||||
built.  See the page that documents this demo on the http://www.FreeRTOS.org
 | 
			
		||||
website for more information. ***********************************************/
 | 
			
		||||
 | 
			
		||||
/* The priority for the task that unblocked by the MAC interrupt to process
 | 
			
		||||
received packets. */
 | 
			
		||||
#define configMAC_INPUT_TASK_PRIORITY		( configMAX_PRIORITIES - 1 )
 | 
			
		||||
 | 
			
		||||
/* The priority of the task that runs the lwIP stack. */
 | 
			
		||||
#define configLWIP_TASK_PRIORITY			( configMAX_PRIORITIES - 2 )
 | 
			
		||||
 | 
			
		||||
/* The priority of the task that uses lwIP sockets to provide a simple command
 | 
			
		||||
line interface. */
 | 
			
		||||
#define configCLI_TASK_PRIORITY				( tskIDLE_PRIORITY )
 | 
			
		||||
 | 
			
		||||
/* MAC address configuration. */
 | 
			
		||||
#define configMAC_ADDR0	0x00
 | 
			
		||||
#define configMAC_ADDR1	0x13
 | 
			
		||||
#define configMAC_ADDR2	0x14
 | 
			
		||||
#define configMAC_ADDR3	0x15
 | 
			
		||||
#define configMAC_ADDR4	0x15
 | 
			
		||||
#define configMAC_ADDR5	0x16
 | 
			
		||||
 | 
			
		||||
/* IP address configuration. */
 | 
			
		||||
#define configIP_ADDR0		172
 | 
			
		||||
#define configIP_ADDR1		25
 | 
			
		||||
#define configIP_ADDR2		218
 | 
			
		||||
#define configIP_ADDR3		200
 | 
			
		||||
 | 
			
		||||
/* Netmask configuration. */
 | 
			
		||||
#define configNET_MASK0		255
 | 
			
		||||
#define configNET_MASK1		255
 | 
			
		||||
#define configNET_MASK2		255
 | 
			
		||||
#define configNET_MASK3		0
 | 
			
		||||
 | 
			
		||||
#endif /* FREERTOS_CONFIG_H */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,144 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* @file asm_vectors.s
 | 
			
		||||
*
 | 
			
		||||
* This file contains the initial vector table for the Cortex A9 processor
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who     Date     Changes
 | 
			
		||||
* ----- ------- -------- ---------------------------------------------------
 | 
			
		||||
* 1.00a ecm/sdm 10/20/09 Initial version
 | 
			
		||||
* 3.05a sdm	02/02/12 Save lr when profiling is enabled
 | 
			
		||||
* 3.10a srt     04/18/13 Implemented ARM Erratas. Please refer to file
 | 
			
		||||
*			 'xil_errata.h' for errata description
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
*
 | 
			
		||||
* None.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_errata.h"
 | 
			
		||||
 | 
			
		||||
.org 0
 | 
			
		||||
.text
 | 
			
		||||
.arm
 | 
			
		||||
 | 
			
		||||
.global _boot
 | 
			
		||||
.global _freertos_vector_table
 | 
			
		||||
 | 
			
		||||
.global FIQInterrupt
 | 
			
		||||
.global DataAbortInterrupt
 | 
			
		||||
.global PrefetchAbortInterrupt
 | 
			
		||||
.global vPortInstallFreeRTOSVectorTable
 | 
			
		||||
 | 
			
		||||
.extern FreeRTOS_IRQ_Handler
 | 
			
		||||
.extern FreeRTOS_SWI_Handler
 | 
			
		||||
 | 
			
		||||
.section .freertos_vectors
 | 
			
		||||
_freertos_vector_table:
 | 
			
		||||
	B	  _boot
 | 
			
		||||
	B	  FreeRTOS_Undefined
 | 
			
		||||
	ldr   pc, _swi
 | 
			
		||||
	B	  FreeRTOS_PrefetchAbortHandler
 | 
			
		||||
	B	  FreeRTOS_DataAbortHandler
 | 
			
		||||
	NOP	  /* Placeholder for address exception vector*/
 | 
			
		||||
	LDR   PC, _irq
 | 
			
		||||
	B	  FreeRTOS_FIQHandler
 | 
			
		||||
 | 
			
		||||
_irq:   .word FreeRTOS_IRQ_Handler
 | 
			
		||||
_swi:   .word FreeRTOS_SWI_Handler
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.align 4
 | 
			
		||||
FreeRTOS_FIQHandler:			/* FIQ vector handler */
 | 
			
		||||
	stmdb	sp!,{r0-r3,r12,lr}	/* state save from compiled code */
 | 
			
		||||
FIQLoop:
 | 
			
		||||
	blx	FIQInterrupt			/* FIQ vector */
 | 
			
		||||
	ldmia	sp!,{r0-r3,r12,lr}	/* state restore from compiled code */
 | 
			
		||||
	subs	pc, lr, #4			/* adjust return */
 | 
			
		||||
 | 
			
		||||
.align 4
 | 
			
		||||
FreeRTOS_Undefined:				/* Undefined handler */
 | 
			
		||||
	b		.
 | 
			
		||||
 | 
			
		||||
.align 4
 | 
			
		||||
FreeRTOS_DataAbortHandler:		/* Data Abort handler */
 | 
			
		||||
#ifdef CONFIG_ARM_ERRATA_775420
 | 
			
		||||
	dsb
 | 
			
		||||
#endif
 | 
			
		||||
	stmdb	sp!,{r0-r3,r12,lr}	/* state save from compiled code */
 | 
			
		||||
	blx	DataAbortInterrupt		/*DataAbortInterrupt :call C function here */
 | 
			
		||||
	ldmia	sp!,{r0-r3,r12,lr}	/* state restore from compiled code */
 | 
			
		||||
	subs	pc, lr, #4			/* adjust return */
 | 
			
		||||
 | 
			
		||||
.align 4
 | 
			
		||||
FreeRTOS_PrefetchAbortHandler:	/* Prefetch Abort handler */
 | 
			
		||||
#ifdef CONFIG_ARM_ERRATA_775420
 | 
			
		||||
	dsb
 | 
			
		||||
#endif
 | 
			
		||||
	stmdb	sp!,{r0-r3,r12,lr}	/* state save from compiled code */
 | 
			
		||||
	blx	PrefetchAbortInterrupt	/* PrefetchAbortInterrupt: call C function here */
 | 
			
		||||
	ldmia	sp!,{r0-r3,r12,lr}	/* state restore from compiled code */
 | 
			
		||||
	subs	pc, lr, #4			/* adjust return */
 | 
			
		||||
 | 
			
		||||
.align 4
 | 
			
		||||
.type vPortInstallFreeRTOSVectorTable, %function
 | 
			
		||||
vPortInstallFreeRTOSVectorTable:
 | 
			
		||||
 | 
			
		||||
	/* Set VBAR to the vector table that contains the FreeRTOS handlers. */
 | 
			
		||||
	ldr	r0, =_freertos_vector_table
 | 
			
		||||
	mcr	p15, 0, r0, c12, c0, 0
 | 
			
		||||
	dsb
 | 
			
		||||
	isb
 | 
			
		||||
	bx lr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,165 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* FreeRTOS includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "Task.h"
 | 
			
		||||
 | 
			
		||||
/* Xilinx includes. */
 | 
			
		||||
#include "xscutimer.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
 | 
			
		||||
#define XSCUTIMER_CLOCK_HZ ( XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 2UL )
 | 
			
		||||
 | 
			
		||||
static XScuTimer xTimer;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The application must provide a function that configures a peripheral to
 | 
			
		||||
 * create the FreeRTOS tick interrupt, then define configSETUP_TICK_INTERRUPT()
 | 
			
		||||
 * in FreeRTOSConfig.h to call the function.  This file contains a function
 | 
			
		||||
 * that is suitable for use on the Zynq SoC.
 | 
			
		||||
 */
 | 
			
		||||
void vConfigureTickInterrupt( void )
 | 
			
		||||
{
 | 
			
		||||
static XScuGic xInterruptController; 	/* Interrupt controller instance */
 | 
			
		||||
BaseType_t xStatus;
 | 
			
		||||
extern void FreeRTOS_Tick_Handler( void );
 | 
			
		||||
XScuTimer_Config *pxTimerConfig;
 | 
			
		||||
XScuGic_Config *pxGICConfig;
 | 
			
		||||
const uint8_t ucRisingEdge = 3;
 | 
			
		||||
 | 
			
		||||
	/* This function is called with the IRQ interrupt disabled, and the IRQ
 | 
			
		||||
	interrupt should be left disabled.  It is enabled automatically when the
 | 
			
		||||
	scheduler is started. */
 | 
			
		||||
 | 
			
		||||
	/* Ensure XScuGic_CfgInitialize() has been called.  In this demo it has
 | 
			
		||||
	already been called from prvSetupHardware() in main(). */
 | 
			
		||||
	pxGICConfig = XScuGic_LookupConfig( XPAR_SCUGIC_SINGLE_DEVICE_ID );
 | 
			
		||||
	xStatus = XScuGic_CfgInitialize( &xInterruptController, pxGICConfig, pxGICConfig->CpuBaseAddress );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* The priority must be the lowest possible. */
 | 
			
		||||
	XScuGic_SetPriorityTriggerType( &xInterruptController, XPAR_SCUTIMER_INTR, portLOWEST_USABLE_INTERRUPT_PRIORITY << portPRIORITY_SHIFT, ucRisingEdge );
 | 
			
		||||
 | 
			
		||||
	/* Install the FreeRTOS tick handler. */
 | 
			
		||||
	xStatus = XScuGic_Connect( &xInterruptController, XPAR_SCUTIMER_INTR, (Xil_ExceptionHandler) FreeRTOS_Tick_Handler, ( void * ) &xTimer );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* Initialise the timer. */
 | 
			
		||||
	pxTimerConfig = XScuTimer_LookupConfig( XPAR_SCUTIMER_DEVICE_ID );
 | 
			
		||||
	xStatus = XScuTimer_CfgInitialize( &xTimer, pxTimerConfig, pxTimerConfig->BaseAddr );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* Enable Auto reload mode. */
 | 
			
		||||
	XScuTimer_EnableAutoReload( &xTimer );
 | 
			
		||||
 | 
			
		||||
	/* Load the timer counter register. */
 | 
			
		||||
	XScuTimer_LoadTimer( &xTimer, XSCUTIMER_CLOCK_HZ / configTICK_RATE_HZ );
 | 
			
		||||
 | 
			
		||||
	/* Start the timer counter and then wait for it to timeout a number of
 | 
			
		||||
	times. */
 | 
			
		||||
	XScuTimer_Start( &xTimer );
 | 
			
		||||
 | 
			
		||||
	/* Enable the interrupt for the xTimer in the interrupt controller. */
 | 
			
		||||
	XScuGic_Enable( &xInterruptController, XPAR_SCUTIMER_INTR );
 | 
			
		||||
 | 
			
		||||
	/* Enable the interrupt in the xTimer itself. */
 | 
			
		||||
	vClearTickInterrupt();
 | 
			
		||||
	XScuTimer_EnableInterrupt( &xTimer );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vClearTickInterrupt( void )
 | 
			
		||||
{
 | 
			
		||||
	XScuTimer_ClearInterruptStatus( &xTimer );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vApplicationIRQHandler( uint32_t ulICCIAR )
 | 
			
		||||
{
 | 
			
		||||
extern const XScuGic_Config XScuGic_ConfigTable[];
 | 
			
		||||
static const XScuGic_VectorTableEntry *pxVectorTable = XScuGic_ConfigTable[ XPAR_SCUGIC_SINGLE_DEVICE_ID ].HandlerTable;
 | 
			
		||||
uint32_t ulInterruptID;
 | 
			
		||||
const XScuGic_VectorTableEntry *pxVectorEntry;
 | 
			
		||||
 | 
			
		||||
	/* Re-enable interrupts. */
 | 
			
		||||
    __asm ( "cpsie i" );
 | 
			
		||||
 | 
			
		||||
	/* The ID of the interrupt is obtained by bitwise anding the ICCIAR value
 | 
			
		||||
	with 0x3FF. */
 | 
			
		||||
	ulInterruptID = ulICCIAR & 0x3FFUL;
 | 
			
		||||
	if( ulInterruptID < XSCUGIC_MAX_NUM_INTR_INPUTS )
 | 
			
		||||
	{
 | 
			
		||||
		/* Call the function installed in the array of installed handler functions. */
 | 
			
		||||
		pxVectorEntry = &( pxVectorTable[ ulInterruptID ] );
 | 
			
		||||
		pxVectorEntry->Handler( pxVectorEntry->CallBackRef );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,261 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This file initialises three timers as follows:
 | 
			
		||||
 *
 | 
			
		||||
 * Timer 0 and Timer 1 provide the interrupts that are used with the IntQ
 | 
			
		||||
 * standard demo tasks, which test interrupt nesting and using queues from
 | 
			
		||||
 * interrupts.  Both these interrupts operate below the maximum syscall
 | 
			
		||||
 * interrupt priority.
 | 
			
		||||
 *
 | 
			
		||||
 * Timer 2 is a much higher frequency timer that tests the nesting of interrupts
 | 
			
		||||
 * that execute above the maximum syscall interrupt priority.
 | 
			
		||||
 *
 | 
			
		||||
 * All the timers can nest with the tick interrupt - creating a maximum
 | 
			
		||||
 * interrupt nesting depth of 4.
 | 
			
		||||
 *
 | 
			
		||||
 * For convenience, the high frequency timer is also used to provide the time
 | 
			
		||||
 * base for the run time stats.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Scheduler includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
 | 
			
		||||
/* Demo includes. */
 | 
			
		||||
#include "IntQueueTimer.h"
 | 
			
		||||
#include "IntQueue.h"
 | 
			
		||||
 | 
			
		||||
/* Xilinx includes. */
 | 
			
		||||
#include "xttcps.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
 | 
			
		||||
/* The frequencies at which the first two timers expire are slightly offset to
 | 
			
		||||
ensure they don't remain synchronised.  The frequency of the interrupt that
 | 
			
		||||
operates above the max syscall interrupt priority is 10 times faster so really
 | 
			
		||||
hammers the interrupt entry and exit code. */
 | 
			
		||||
#define tmrTIMERS_USED	3
 | 
			
		||||
#define tmrTIMER_0_FREQUENCY	( 2000UL )
 | 
			
		||||
#define tmrTIMER_1_FREQUENCY	( 2001UL )
 | 
			
		||||
#define tmrTIMER_2_FREQUENCY	( 20000UL )
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The single interrupt service routines that is used to service all three
 | 
			
		||||
 * timers.
 | 
			
		||||
 */
 | 
			
		||||
static void prvTimerHandler( void *CallBackRef );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Hardware constants. */
 | 
			
		||||
static const BaseType_t xDeviceIDs[ tmrTIMERS_USED ] = { XPAR_XTTCPS_0_DEVICE_ID, XPAR_XTTCPS_1_DEVICE_ID, XPAR_XTTCPS_2_DEVICE_ID };
 | 
			
		||||
static const BaseType_t xInterruptIDs[ tmrTIMERS_USED ] = { XPAR_XTTCPS_0_INTR, XPAR_XTTCPS_1_INTR, XPAR_XTTCPS_2_INTR };
 | 
			
		||||
 | 
			
		||||
/* Timer configuration settings. */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	uint32_t OutputHz;	/* Output frequency. */
 | 
			
		||||
	uint16_t Interval;	/* Interval value. */
 | 
			
		||||
	uint8_t Prescaler;	/* Prescaler value. */
 | 
			
		||||
	uint16_t Options;	/* Option settings. */
 | 
			
		||||
} TmrCntrSetup;
 | 
			
		||||
 | 
			
		||||
static TmrCntrSetup xTimerSettings[ tmrTIMERS_USED ] =
 | 
			
		||||
{
 | 
			
		||||
	{ tmrTIMER_0_FREQUENCY, 0, 0, XTTCPS_OPTION_INTERVAL_MODE | XTTCPS_OPTION_WAVE_DISABLE },
 | 
			
		||||
	{ tmrTIMER_1_FREQUENCY, 0, 0, XTTCPS_OPTION_INTERVAL_MODE | XTTCPS_OPTION_WAVE_DISABLE },
 | 
			
		||||
	{ tmrTIMER_2_FREQUENCY, 0, 0, XTTCPS_OPTION_INTERVAL_MODE | XTTCPS_OPTION_WAVE_DISABLE }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Lower priority number means higher logical priority, so
 | 
			
		||||
configMAX_API_CALL_INTERRUPT_PRIORITY - 1 is above the maximum system call
 | 
			
		||||
interrupt priority. */
 | 
			
		||||
static const UBaseType_t uxInterruptPriorities[ tmrTIMERS_USED ] =
 | 
			
		||||
{
 | 
			
		||||
	configMAX_API_CALL_INTERRUPT_PRIORITY + 1,
 | 
			
		||||
	configMAX_API_CALL_INTERRUPT_PRIORITY,
 | 
			
		||||
	configMAX_API_CALL_INTERRUPT_PRIORITY - 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static XTtcPs xTimerInstances[ tmrTIMERS_USED ];
 | 
			
		||||
 | 
			
		||||
/* Used to provide a means of ensuring the intended interrupt nesting depth is
 | 
			
		||||
actually being reached. */
 | 
			
		||||
extern uint32_t ulPortInterruptNesting;
 | 
			
		||||
static uint32_t ulMaxRecordedNesting = 0;
 | 
			
		||||
 | 
			
		||||
/* Used to ensure the high frequency timer is running at the expected
 | 
			
		||||
frequency. */
 | 
			
		||||
static volatile uint32_t ulHighFrequencyTimerCounts = 0;
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vInitialiseTimerForIntQueueTest( void )
 | 
			
		||||
{
 | 
			
		||||
BaseType_t xStatus;
 | 
			
		||||
TmrCntrSetup *pxTimerSettings;
 | 
			
		||||
extern XScuGic xInterruptController;
 | 
			
		||||
BaseType_t xTimer;
 | 
			
		||||
XTtcPs *pxTimerInstance;
 | 
			
		||||
XTtcPs_Config *pxTimerConfiguration;
 | 
			
		||||
const uint8_t ucRisingEdge = 3;
 | 
			
		||||
 | 
			
		||||
	for( xTimer = 0; xTimer < tmrTIMERS_USED; xTimer++ )
 | 
			
		||||
	{
 | 
			
		||||
		/* Look up the timer's configuration. */
 | 
			
		||||
		pxTimerInstance = &( xTimerInstances[ xTimer ] );
 | 
			
		||||
		pxTimerConfiguration = XTtcPs_LookupConfig( xDeviceIDs[ xTimer ] );
 | 
			
		||||
		configASSERT( pxTimerConfiguration );
 | 
			
		||||
 | 
			
		||||
		pxTimerSettings = &( xTimerSettings[ xTimer ] );
 | 
			
		||||
 | 
			
		||||
		/* Initialise the device. */
 | 
			
		||||
		xStatus = XTtcPs_CfgInitialize( pxTimerInstance, pxTimerConfiguration, pxTimerConfiguration->BaseAddress );
 | 
			
		||||
		if( xStatus != XST_SUCCESS )
 | 
			
		||||
		{
 | 
			
		||||
			/* Not sure how to do this before XTtcPs_CfgInitialize is called
 | 
			
		||||
			as pxTimerInstance is set within XTtcPs_CfgInitialize(). */
 | 
			
		||||
			XTtcPs_Stop( pxTimerInstance );
 | 
			
		||||
			xStatus = XTtcPs_CfgInitialize( pxTimerInstance, pxTimerConfiguration, pxTimerConfiguration->BaseAddress );
 | 
			
		||||
			configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Set the options. */
 | 
			
		||||
		XTtcPs_SetOptions( pxTimerInstance, pxTimerSettings->Options );
 | 
			
		||||
 | 
			
		||||
		/* The timer frequency is preset in the pxTimerSettings structure.
 | 
			
		||||
		Derive the values for the other structure members. */
 | 
			
		||||
		XTtcPs_CalcIntervalFromFreq( pxTimerInstance, pxTimerSettings->OutputHz, &( pxTimerSettings->Interval ), &( pxTimerSettings->Prescaler ) );
 | 
			
		||||
 | 
			
		||||
		/* Set the interval and prescale. */
 | 
			
		||||
		XTtcPs_SetInterval( pxTimerInstance, pxTimerSettings->Interval );
 | 
			
		||||
		XTtcPs_SetPrescaler( pxTimerInstance, pxTimerSettings->Prescaler );
 | 
			
		||||
 | 
			
		||||
		/* The priority must be the lowest possible. */
 | 
			
		||||
		XScuGic_SetPriorityTriggerType( &xInterruptController, xInterruptIDs[ xTimer ], uxInterruptPriorities[ xTimer ] << portPRIORITY_SHIFT, ucRisingEdge );
 | 
			
		||||
 | 
			
		||||
		/* Connect to the interrupt controller. */
 | 
			
		||||
		xStatus = XScuGic_Connect( &xInterruptController, xInterruptIDs[ xTimer ], ( Xil_InterruptHandler ) prvTimerHandler, ( void * ) pxTimerInstance );
 | 
			
		||||
		configASSERT( xStatus == XST_SUCCESS);
 | 
			
		||||
 | 
			
		||||
		/* Enable the interrupt in the GIC. */
 | 
			
		||||
		XScuGic_Enable( &xInterruptController, xInterruptIDs[ xTimer ] );
 | 
			
		||||
 | 
			
		||||
		/* Enable the interrupts in the timer. */
 | 
			
		||||
		XTtcPs_EnableInterrupts( pxTimerInstance, XTTCPS_IXR_INTERVAL_MASK );
 | 
			
		||||
 | 
			
		||||
		/* Start the timer. */
 | 
			
		||||
		XTtcPs_Start( pxTimerInstance );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvTimerHandler( void *pvCallBackRef )
 | 
			
		||||
{
 | 
			
		||||
uint32_t ulInterruptStatus;
 | 
			
		||||
XTtcPs *pxTimer = ( XTtcPs * ) pvCallBackRef;
 | 
			
		||||
BaseType_t xYieldRequired;
 | 
			
		||||
 | 
			
		||||
	/* Read the interrupt status, then write it back to clear the interrupt. */
 | 
			
		||||
	ulInterruptStatus = XTtcPs_GetInterruptStatus( pxTimer );
 | 
			
		||||
	XTtcPs_ClearInterruptStatus( pxTimer, ulInterruptStatus );
 | 
			
		||||
 | 
			
		||||
	/* Only one interrupt event type is expected. */
 | 
			
		||||
	configASSERT( ( XTTCPS_IXR_INTERVAL_MASK & ulInterruptStatus ) != 0 );
 | 
			
		||||
 | 
			
		||||
	/* Check the device ID to know which IntQueue demo to call. */
 | 
			
		||||
	if( pxTimer->Config.DeviceId == xDeviceIDs[ 0 ] )
 | 
			
		||||
	{
 | 
			
		||||
		xYieldRequired = xFirstTimerHandler();
 | 
			
		||||
	}
 | 
			
		||||
	else if( pxTimer->Config.DeviceId == xDeviceIDs[ 1 ] )
 | 
			
		||||
	{
 | 
			
		||||
		xYieldRequired = xSecondTimerHandler();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* Used to check the timer is running at the expected frequency. */
 | 
			
		||||
		ulHighFrequencyTimerCounts++;
 | 
			
		||||
 | 
			
		||||
		/* Latch the highest interrupt nesting count detected. */
 | 
			
		||||
		if( ulPortInterruptNesting > ulMaxRecordedNesting )
 | 
			
		||||
		{
 | 
			
		||||
			ulMaxRecordedNesting = ulPortInterruptNesting;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		xYieldRequired = pdFALSE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* If xYieldRequired is not pdFALSE then calling either xFirstTimerHandler()
 | 
			
		||||
	or xSecondTimerHandler() resulted in a task leaving the blocked state and
 | 
			
		||||
	the task that left the blocked state had a priority higher than the currently
 | 
			
		||||
	running task (the task this interrupt interrupted) - so a context switch
 | 
			
		||||
	should be performed so the interrupt returns directly to the higher priority
 | 
			
		||||
	task.  xYieldRequired is tested inside the following macro. */
 | 
			
		||||
	portYIELD_FROM_ISR( xYieldRequired );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,74 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. 
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef INT_QUEUE_TIMER_H
 | 
			
		||||
#define INT_QUEUE_TIMER_H
 | 
			
		||||
 | 
			
		||||
void vInitialiseTimerForIntQueueTest( void );
 | 
			
		||||
portBASE_TYPE xTimer0Handler( void );
 | 
			
		||||
portBASE_TYPE xTimer1Handler( void );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,504 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * NOTE 1:  This project provides three demo applications.  A simple blinky
 | 
			
		||||
 * style project, a more comprehensive test and demo application, and an
 | 
			
		||||
 * lwIP example.  The mainSELECTED_APPLICATION setting in main.c is used to
 | 
			
		||||
 * select between the three.  See the notes on using mainSELECTED_APPLICATION
 | 
			
		||||
 * in main.c.  This file implements the simply blinky style version.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE 2:  This file only contains the source code that is specific to the
 | 
			
		||||
 * full demo.  Generic functions, such FreeRTOS hook functions, and functions
 | 
			
		||||
 * required to configure the hardware, are defined in main.c.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE 3:  The full demo includes a test that checks the floating point context
 | 
			
		||||
 * is maintained correctly across task switches.  The standard GCC libraries can
 | 
			
		||||
 * use floating point registers and made this test fail (unless the tasks that
 | 
			
		||||
 * use the library are given a floating point context as described on the
 | 
			
		||||
 * documentation page for this demo).  printf-stdarg.c is included in this
 | 
			
		||||
 * project to prevent the standard GCC libraries being linked into the project.
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * main_full() creates all the demo application tasks and software timers, then
 | 
			
		||||
 * starts the scheduler.  The web documentation provides more details of the
 | 
			
		||||
 * standard demo application tasks, which provide no particular functionality,
 | 
			
		||||
 * but do provide a good example of how to use the FreeRTOS API.
 | 
			
		||||
 *
 | 
			
		||||
 * In addition to the standard demo tasks, the following tasks and tests are
 | 
			
		||||
 * defined and/or created within this file:
 | 
			
		||||
 *
 | 
			
		||||
 * FreeRTOS+CLI command console.  The command console is access through the
 | 
			
		||||
 * UART to USB connector on the ZC702 Zynq development board (marked J2).  For
 | 
			
		||||
 * reasons of robustness testing the UART driver is deliberately written to be
 | 
			
		||||
 * inefficient and should not be used as a template for a production driver.
 | 
			
		||||
 * Type "help" to see a list of registered commands.  The FreeRTOS+CLI license
 | 
			
		||||
 * is different to the FreeRTOS license, see http://www.FreeRTOS.org/cli for
 | 
			
		||||
 * license and usage details.  The default baud rate is 115200.
 | 
			
		||||
 *
 | 
			
		||||
 * "Reg test" tasks - These fill both the core and floating point registers with
 | 
			
		||||
 * known values, then check that each register maintains its expected value for
 | 
			
		||||
 * the lifetime of the task.  Each task uses a different set of values.  The reg
 | 
			
		||||
 * test tasks execute with a very low priority, so get preempted very
 | 
			
		||||
 * frequently.  A register containing an unexpected value is indicative of an
 | 
			
		||||
 * error in the context switching mechanism.
 | 
			
		||||
 *
 | 
			
		||||
 * "Check" task - The check task period is initially set to three seconds.  The
 | 
			
		||||
 * task checks that all the standard demo tasks, and the register check tasks,
 | 
			
		||||
 * are not only still executing, but are executing without reporting any errors.
 | 
			
		||||
 * If the check task discovers that a task has either stalled, or reported an
 | 
			
		||||
 * error, then it changes its own execution period from the initial three
 | 
			
		||||
 * seconds, to just 200ms.  The check task also toggles an LED each time it is
 | 
			
		||||
 * called.  This provides a visual indication of the system status:  If the LED
 | 
			
		||||
 * toggles every three seconds, then no issues have been discovered.  If the LED
 | 
			
		||||
 * toggles every 200ms, then an issue has been discovered with at least one
 | 
			
		||||
 * task.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Standard includes. */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
/* Kernel includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "timers.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
 | 
			
		||||
/* Standard demo application includes. */
 | 
			
		||||
#include "flop.h"
 | 
			
		||||
#include "semtest.h"
 | 
			
		||||
#include "dynamic.h"
 | 
			
		||||
#include "BlockQ.h"
 | 
			
		||||
#include "blocktim.h"
 | 
			
		||||
#include "countsem.h"
 | 
			
		||||
#include "GenQTest.h"
 | 
			
		||||
#include "recmutex.h"
 | 
			
		||||
#include "death.h"
 | 
			
		||||
#include "partest.h"
 | 
			
		||||
#include "comtest2.h"
 | 
			
		||||
#include "serial.h"
 | 
			
		||||
#include "TimerDemo.h"
 | 
			
		||||
#include "QueueOverwrite.h"
 | 
			
		||||
#include "IntQueue.h"
 | 
			
		||||
#include "EventGroupsDemo.h"
 | 
			
		||||
 | 
			
		||||
/* Priorities for the demo application tasks. */
 | 
			
		||||
#define mainSEM_TEST_PRIORITY				( tskIDLE_PRIORITY + 1UL )
 | 
			
		||||
#define mainBLOCK_Q_PRIORITY				( tskIDLE_PRIORITY + 2UL )
 | 
			
		||||
#define mainCREATOR_TASK_PRIORITY			( tskIDLE_PRIORITY + 3UL )
 | 
			
		||||
#define mainFLOP_TASK_PRIORITY				( tskIDLE_PRIORITY )
 | 
			
		||||
#define mainUART_COMMAND_CONSOLE_STACK_SIZE	( configMINIMAL_STACK_SIZE * 3UL )
 | 
			
		||||
#define mainCOM_TEST_TASK_PRIORITY			( tskIDLE_PRIORITY + 2 )
 | 
			
		||||
#define mainCHECK_TASK_PRIORITY				( configMAX_PRIORITIES - 1 )
 | 
			
		||||
#define mainQUEUE_OVERWRITE_PRIORITY		( tskIDLE_PRIORITY )
 | 
			
		||||
 | 
			
		||||
/* The priority used by the UART command console task. */
 | 
			
		||||
#define mainUART_COMMAND_CONSOLE_TASK_PRIORITY	( configMAX_PRIORITIES - 2 )
 | 
			
		||||
 | 
			
		||||
/* The LED used by the check timer. */
 | 
			
		||||
#define mainCHECK_LED						( 0 )
 | 
			
		||||
 | 
			
		||||
/* A block time of zero simply means "don't block". */
 | 
			
		||||
#define mainDONT_BLOCK						( 0UL )
 | 
			
		||||
 | 
			
		||||
/* The period after which the check timer will expire, in ms, provided no errors
 | 
			
		||||
have been reported by any of the standard demo tasks.  ms are converted to the
 | 
			
		||||
equivalent in ticks using the portTICK_PERIOD_MS constant. */
 | 
			
		||||
#define mainNO_ERROR_CHECK_TASK_PERIOD		( 3000UL / portTICK_PERIOD_MS )
 | 
			
		||||
 | 
			
		||||
/* The period at which the check timer will expire, in ms, if an error has been
 | 
			
		||||
reported in one of the standard demo tasks.  ms are converted to the equivalent
 | 
			
		||||
in ticks using the portTICK_PERIOD_MS constant. */
 | 
			
		||||
#define mainERROR_CHECK_TASK_PERIOD 		( 200UL / portTICK_PERIOD_MS )
 | 
			
		||||
 | 
			
		||||
/* Parameters that are passed into the register check tasks solely for the
 | 
			
		||||
purpose of ensuring parameters are passed into tasks correctly. */
 | 
			
		||||
#define mainREG_TEST_TASK_1_PARAMETER		( ( void * ) 0x12345678 )
 | 
			
		||||
#define mainREG_TEST_TASK_2_PARAMETER		( ( void * ) 0x87654321 )
 | 
			
		||||
 | 
			
		||||
/* The base period used by the timer test tasks. */
 | 
			
		||||
#define mainTIMER_TEST_PERIOD				( 50 )
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The check task, as described at the top of this file.
 | 
			
		||||
 */
 | 
			
		||||
static void prvCheckTask( void *pvParameters );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Register check tasks, and the tasks used to write over and check the contents
 | 
			
		||||
 * of the FPU registers, as described at the top of this file.  The nature of
 | 
			
		||||
 * these files necessitates that they are written in an assembly file, but the
 | 
			
		||||
 * entry points are kept in the C file for the convenience of checking the task
 | 
			
		||||
 * parameter.
 | 
			
		||||
 */
 | 
			
		||||
static void prvRegTestTaskEntry1( void *pvParameters );
 | 
			
		||||
extern void vRegTest1Implementation( void );
 | 
			
		||||
static void prvRegTestTaskEntry2( void *pvParameters );
 | 
			
		||||
extern void vRegTest2Implementation( void );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Register commands that can be used with FreeRTOS+CLI.  The commands are
 | 
			
		||||
 * defined in CLI-Commands.c and File-Related-CLI-Command.c respectively.
 | 
			
		||||
 */
 | 
			
		||||
extern void vRegisterSampleCLICommands( void );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The task that manages the FreeRTOS+CLI input and output.
 | 
			
		||||
 */
 | 
			
		||||
extern void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * A high priority task that does nothing other than execute at a pseudo random
 | 
			
		||||
 * time to ensure the other test tasks don't just execute in a repeating
 | 
			
		||||
 * pattern.
 | 
			
		||||
 */
 | 
			
		||||
static void prvPseudoRandomiser( void *pvParameters );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The following two variables are used to communicate the status of the
 | 
			
		||||
register check tasks to the check task.  If the variables keep incrementing,
 | 
			
		||||
then the register check tasks has not discovered any errors.  If a variable
 | 
			
		||||
stops incrementing, then an error has been found. */
 | 
			
		||||
volatile unsigned long ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;
 | 
			
		||||
 | 
			
		||||
/* String for display in the web server.  It is set to an error message if the
 | 
			
		||||
check task detects an error.  */
 | 
			
		||||
char *pcStatusMessage = "All tasks running without error";
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void main_full( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Start all the other standard demo/test tasks.  They have not particular
 | 
			
		||||
	functionality, but do demonstrate how to use the FreeRTOS API and test the
 | 
			
		||||
	kernel port. */
 | 
			
		||||
	vStartInterruptQueueTasks();
 | 
			
		||||
	vStartDynamicPriorityTasks();
 | 
			
		||||
	vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
 | 
			
		||||
	vCreateBlockTimeTasks();
 | 
			
		||||
	vStartCountingSemaphoreTasks();
 | 
			
		||||
	vStartGenericQueueTasks( tskIDLE_PRIORITY );
 | 
			
		||||
	vStartRecursiveMutexTasks();
 | 
			
		||||
	vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
 | 
			
		||||
	vStartMathTasks( mainFLOP_TASK_PRIORITY );
 | 
			
		||||
	vStartTimerDemoTask( mainTIMER_TEST_PERIOD );
 | 
			
		||||
	vStartQueueOverwriteTask( mainQUEUE_OVERWRITE_PRIORITY );
 | 
			
		||||
	vStartEventGroupTasks();
 | 
			
		||||
 | 
			
		||||
	/* Start the tasks that implements the command console on the UART, as
 | 
			
		||||
	described above. */
 | 
			
		||||
	vUARTCommandConsoleStart( mainUART_COMMAND_CONSOLE_STACK_SIZE, mainUART_COMMAND_CONSOLE_TASK_PRIORITY );
 | 
			
		||||
 | 
			
		||||
	/* Register the standard CLI commands. */
 | 
			
		||||
	vRegisterSampleCLICommands();
 | 
			
		||||
 | 
			
		||||
	/* Create the register check tasks, as described at the top of this	file */
 | 
			
		||||
	xTaskCreate( prvRegTestTaskEntry1, "Reg1", configMINIMAL_STACK_SIZE, mainREG_TEST_TASK_1_PARAMETER, tskIDLE_PRIORITY, NULL );
 | 
			
		||||
	xTaskCreate( prvRegTestTaskEntry2, "Reg2", configMINIMAL_STACK_SIZE, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );
 | 
			
		||||
 | 
			
		||||
	/* Create the task that just adds a little random behaviour. */
 | 
			
		||||
	xTaskCreate( prvPseudoRandomiser, "Rnd", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL );
 | 
			
		||||
 | 
			
		||||
	/* Create the task that performs the 'check' functionality,	as described at
 | 
			
		||||
	the top of this file. */
 | 
			
		||||
	xTaskCreate( prvCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
 | 
			
		||||
 | 
			
		||||
	/* The set of tasks created by the following function call have to be
 | 
			
		||||
	created last as they keep account of the number of tasks they expect to see
 | 
			
		||||
	running. */
 | 
			
		||||
	vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );
 | 
			
		||||
 | 
			
		||||
	/* Start the scheduler. */
 | 
			
		||||
	vTaskStartScheduler();
 | 
			
		||||
 | 
			
		||||
	/* If all is well, the scheduler will now be running, and the following
 | 
			
		||||
	line will never be reached.  If the following line does execute, then
 | 
			
		||||
	there was either insufficient FreeRTOS heap memory available for the idle
 | 
			
		||||
	and/or timer tasks to be created, or vTaskStartScheduler() was called from
 | 
			
		||||
	User mode.  See the memory management section on the FreeRTOS web site for
 | 
			
		||||
	more details on the FreeRTOS heap http://www.freertos.org/a00111.html.  The
 | 
			
		||||
	mode from which main() is called is set in the C start up code and must be
 | 
			
		||||
	a privileged mode (not user mode). */
 | 
			
		||||
	for( ;; );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvCheckTask( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;
 | 
			
		||||
TickType_t xLastExecutionTime;
 | 
			
		||||
static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;
 | 
			
		||||
unsigned long ulErrorFound = pdFALSE;
 | 
			
		||||
 | 
			
		||||
	/* Just to stop compiler warnings. */
 | 
			
		||||
	( void ) pvParameters;
 | 
			
		||||
 | 
			
		||||
	/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
 | 
			
		||||
	works correctly. */
 | 
			
		||||
	xLastExecutionTime = xTaskGetTickCount();
 | 
			
		||||
 | 
			
		||||
	/* Cycle for ever, delaying then checking all the other tasks are still
 | 
			
		||||
	operating without error.  The onboard LED is toggled on each iteration.
 | 
			
		||||
	If an error is detected then the delay period is decreased from
 | 
			
		||||
	mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD.  This has the
 | 
			
		||||
	effect of increasing the rate at which the onboard LED toggles, and in so
 | 
			
		||||
	doing gives visual feedback of the system status. */
 | 
			
		||||
	for( ;; )
 | 
			
		||||
	{
 | 
			
		||||
		/* Delay until it is time to execute again. */
 | 
			
		||||
		vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );
 | 
			
		||||
 | 
			
		||||
		/* Check all the demo tasks (other than the flash tasks) to ensure
 | 
			
		||||
		that they are all still running, and that none have detected an error. */
 | 
			
		||||
		if( xAreIntQueueTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreMathsTaskStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreBlockingQueuesStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ( xAreGenericQueueTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xIsCreateTaskStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreSemaphoreTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreTimerDemoTasksStillRunning( ( TickType_t ) mainNO_ERROR_CHECK_TASK_PERIOD ) != pdPASS )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xIsQueueOverwriteTaskStillRunning() != pdPASS )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( xAreEventGroupTasksStillRunning() != pdPASS )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Check that the register test 1 task is still running. */
 | 
			
		||||
		if( ulLastRegTest1Value == ulRegTest1LoopCounter )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
		ulLastRegTest1Value = ulRegTest1LoopCounter;
 | 
			
		||||
 | 
			
		||||
		/* Check that the register test 2 task is still running. */
 | 
			
		||||
		if( ulLastRegTest2Value == ulRegTest2LoopCounter )
 | 
			
		||||
		{
 | 
			
		||||
			ulErrorFound = pdTRUE;
 | 
			
		||||
		}
 | 
			
		||||
		ulLastRegTest2Value = ulRegTest2LoopCounter;
 | 
			
		||||
 | 
			
		||||
		/* Toggle the check LED to give an indication of the system status.  If
 | 
			
		||||
		the LED toggles every mainNO_ERROR_CHECK_TASK_PERIOD milliseconds then
 | 
			
		||||
		everything is ok.  A faster toggle indicates an error. */
 | 
			
		||||
		vParTestToggleLED( mainCHECK_LED );
 | 
			
		||||
 | 
			
		||||
		if( ulErrorFound != pdFALSE )
 | 
			
		||||
		{
 | 
			
		||||
			/* An error has been detected in one of the tasks - flash the LED
 | 
			
		||||
			at a higher frequency to give visible feedback that something has
 | 
			
		||||
			gone wrong (it might just be that the loop back connector required
 | 
			
		||||
			by the comtest tasks has not been fitted). */
 | 
			
		||||
			xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;
 | 
			
		||||
			pcStatusMessage = "Error found in at least one task.";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
char *pcMainGetTaskStatusMessage( void )
 | 
			
		||||
{
 | 
			
		||||
	return pcStatusMessage;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvRegTestTaskEntry1( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
	/* Although the regtest task is written in assembler, its entry point is
 | 
			
		||||
	written in C for convenience of checking the task parameter is being passed
 | 
			
		||||
	in correctly. */
 | 
			
		||||
	if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )
 | 
			
		||||
	{
 | 
			
		||||
		/* The reg test task also tests the floating point registers.  Tasks
 | 
			
		||||
		that use the floating point unit must call vPortTaskUsesFPU() before
 | 
			
		||||
		any floating point instructions are executed. */
 | 
			
		||||
		vPortTaskUsesFPU();
 | 
			
		||||
 | 
			
		||||
		/* Start the part of the test that is written in assembler. */
 | 
			
		||||
		vRegTest1Implementation();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* The following line will only execute if the task parameter is found to
 | 
			
		||||
	be incorrect.  The check timer will detect that the regtest loop counter is
 | 
			
		||||
	not being incremented and flag an error. */
 | 
			
		||||
	vTaskDelete( NULL );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvRegTestTaskEntry2( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
	/* Although the regtest task is written in assembler, its entry point is
 | 
			
		||||
	written in C for convenience of checking the task parameter is being passed
 | 
			
		||||
	in correctly. */
 | 
			
		||||
	if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )
 | 
			
		||||
	{
 | 
			
		||||
		/* The reg test task also tests the floating point registers.  Tasks
 | 
			
		||||
		that use the floating point unit must call vPortTaskUsesFPU() before
 | 
			
		||||
		any floating point instructions are executed. */
 | 
			
		||||
		vPortTaskUsesFPU();
 | 
			
		||||
 | 
			
		||||
		/* Start the part of the test that is written in assembler. */
 | 
			
		||||
		vRegTest2Implementation();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* The following line will only execute if the task parameter is found to
 | 
			
		||||
	be incorrect.  The check timer will detect that the regtest loop counter is
 | 
			
		||||
	not being incremented and flag an error. */
 | 
			
		||||
	vTaskDelete( NULL );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvPseudoRandomiser( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL, ulMinDelay = ( 35 / portTICK_PERIOD_MS );
 | 
			
		||||
volatile uint32_t ulNextRand = ( uint32_t ) &pvParameters, ulValue;
 | 
			
		||||
 | 
			
		||||
	/* This task does nothing other than ensure there is a little bit of
 | 
			
		||||
	disruption in the scheduling pattern of the other tasks.  Normally this is
 | 
			
		||||
	done by generating interrupts at pseudo random times. */
 | 
			
		||||
	for( ;; )
 | 
			
		||||
	{
 | 
			
		||||
		ulNextRand = ( ulMultiplier * ulNextRand ) + ulIncrement;
 | 
			
		||||
		ulValue = ( ulNextRand >> 16UL ) & 0xffUL;
 | 
			
		||||
 | 
			
		||||
		if( ulValue < ulMinDelay )
 | 
			
		||||
		{
 | 
			
		||||
			ulValue = ulMinDelay;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		vTaskDelay( ulValue );
 | 
			
		||||
 | 
			
		||||
		while( ulValue > 0 )
 | 
			
		||||
		{
 | 
			
		||||
			__asm volatile( "NOP" );
 | 
			
		||||
			__asm volatile( "NOP" );
 | 
			
		||||
			__asm volatile( "NOP" );
 | 
			
		||||
			__asm volatile( "NOP" );
 | 
			
		||||
 | 
			
		||||
			ulValue--;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,658 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
 | 
			
		||||
    FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT
 | 
			
		||||
    http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS tutorial books are available in pdf and paperback.        *
 | 
			
		||||
     *    Complete, revised, and edited pdf reference manuals are also       *
 | 
			
		||||
     *    available.                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Purchasing FreeRTOS documentation will not only help you, by       *
 | 
			
		||||
     *    ensuring you get running as quickly as possible and with an        *
 | 
			
		||||
     *    in-depth knowledge of how to use FreeRTOS, it will also help       *
 | 
			
		||||
     *    the FreeRTOS project to continue with its mission of providing     *
 | 
			
		||||
     *    professional grade, cross platform, de facto standard solutions    *
 | 
			
		||||
     *    for microcontrollers - completely free of charge!                  *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you for using FreeRTOS, and thank you for your support!      *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>>>>>NOTE<<<<<< The modification to the GPL is included to allow you to
 | 
			
		||||
    distribute a combined work that includes FreeRTOS without being obliged to
 | 
			
		||||
    provide the source code for proprietary components outside of the FreeRTOS
 | 
			
		||||
    kernel.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 | 
			
		||||
    details. You should have received a copy of the GNU General Public License
 | 
			
		||||
    and the FreeRTOS license exception along with FreeRTOS; if not itcan be
 | 
			
		||||
    viewed here: http://www.freertos.org/a00114.html and also obtained by
 | 
			
		||||
    writing to Real Time Engineers Ltd., contact details for whom are available
 | 
			
		||||
    on the FreeRTOS WEB site.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, and our new
 | 
			
		||||
    fully thread aware and reentrant UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems, who sell the code with commercial support,
 | 
			
		||||
    indemnification and middleware, under the OpenRTOS brand.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	.global vRegTest1Implementation
 | 
			
		||||
	.global vRegTest2Implementation
 | 
			
		||||
	.extern ulRegTest1LoopCounter
 | 
			
		||||
	.extern ulRegTest2LoopCounter
 | 
			
		||||
 | 
			
		||||
	.text
 | 
			
		||||
	.arm
 | 
			
		||||
 | 
			
		||||
	/* This function is explained in the comments at the top of main-full.c. */
 | 
			
		||||
.type vRegTest1Implementation, %function
 | 
			
		||||
vRegTest1Implementation:
 | 
			
		||||
 | 
			
		||||
	/* Fill each general purpose register with a known value. */
 | 
			
		||||
	mov		r0,  #0xFF
 | 
			
		||||
	mov		r1,  #0x11
 | 
			
		||||
	mov		r2,  #0x22
 | 
			
		||||
	mov		r3,  #0x33
 | 
			
		||||
	mov     r4,  #0x44
 | 
			
		||||
	mov     r5,  #0x55
 | 
			
		||||
	mov     r6,  #0x66
 | 
			
		||||
	mov     r7,  #0x77
 | 
			
		||||
	mov     r8,  #0x88
 | 
			
		||||
	mov     r9,  #0x99
 | 
			
		||||
	mov     r10, #0xAA
 | 
			
		||||
	mov     r11, #0xBB
 | 
			
		||||
	mov     r12, #0xCC
 | 
			
		||||
	mov		r14, #0xEE
 | 
			
		||||
 | 
			
		||||
	/* Fill each FPU register with a known value. */
 | 
			
		||||
	vmov 	d0, r0, r1
 | 
			
		||||
	vmov 	d1, r2, r3
 | 
			
		||||
	vmov 	d2, r4, r5
 | 
			
		||||
	vmov 	d3, r6, r7
 | 
			
		||||
	vmov 	d4, r8, r9
 | 
			
		||||
	vmov 	d5, r10, r11
 | 
			
		||||
	vmov 	d6, r0, r1
 | 
			
		||||
	vmov 	d7, r2, r3
 | 
			
		||||
	vmov 	d8, r4, r5
 | 
			
		||||
	vmov 	d9, r6, r7
 | 
			
		||||
	vmov 	d10, r8, r9
 | 
			
		||||
	vmov 	d11, r10, r11
 | 
			
		||||
	vmov 	d12, r0, r1
 | 
			
		||||
	vmov 	d13, r2, r3
 | 
			
		||||
	vmov 	d14, r4, r5
 | 
			
		||||
	vmov 	d15, r6, r7
 | 
			
		||||
 | 
			
		||||
	vmov 	d16, r0, r1
 | 
			
		||||
	vmov 	d17, r2, r3
 | 
			
		||||
	vmov 	d18, r4, r5
 | 
			
		||||
	vmov 	d19, r6, r7
 | 
			
		||||
	vmov 	d20, r8, r9
 | 
			
		||||
	vmov 	d21, r10, r11
 | 
			
		||||
	vmov 	d22, r0, r1
 | 
			
		||||
	vmov 	d23, r2, r3
 | 
			
		||||
	vmov 	d24, r4, r5
 | 
			
		||||
	vmov 	d25, r6, r7
 | 
			
		||||
	vmov 	d26, r8, r9
 | 
			
		||||
	vmov 	d27, r10, r11
 | 
			
		||||
	vmov 	d28, r0, r1
 | 
			
		||||
	vmov 	d29, r2, r3
 | 
			
		||||
	vmov 	d30, r4, r5
 | 
			
		||||
	vmov 	d31, r6, r7
 | 
			
		||||
 | 
			
		||||
	/* Loop, checking each itteration that each register still contains the
 | 
			
		||||
	expected value. */
 | 
			
		||||
reg1_loop:
 | 
			
		||||
	/* Yield to increase test coverage */
 | 
			
		||||
	svc 0
 | 
			
		||||
 | 
			
		||||
	/* Check all the VFP registers still contain the values set above.
 | 
			
		||||
	First save registers that are clobbered by the test. */
 | 
			
		||||
	push { r0-r1 }
 | 
			
		||||
 | 
			
		||||
	vmov 	r0, r1, d0
 | 
			
		||||
	cmp 	r0, #0xFF
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d1
 | 
			
		||||
	cmp 	r0, #0x22
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d2
 | 
			
		||||
	cmp 	r0, #0x44
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d3
 | 
			
		||||
	cmp 	r0, #0x66
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d4
 | 
			
		||||
	cmp 	r0, #0x88
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d5
 | 
			
		||||
	cmp 	r0, #0xAA
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d6
 | 
			
		||||
	cmp 	r0, #0xFF
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d7
 | 
			
		||||
	cmp 	r0, #0x22
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d8
 | 
			
		||||
	cmp 	r0, #0x44
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d9
 | 
			
		||||
	cmp 	r0, #0x66
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d10
 | 
			
		||||
	cmp 	r0, #0x88
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d11
 | 
			
		||||
	cmp 	r0, #0xAA
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d12
 | 
			
		||||
	cmp 	r0, #0xFF
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d13
 | 
			
		||||
	cmp 	r0, #0x22
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d14
 | 
			
		||||
	cmp 	r0, #0x44
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d15
 | 
			
		||||
	cmp 	r0, #0x66
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
 | 
			
		||||
	vmov 	r0, r1, d16
 | 
			
		||||
	cmp 	r0, #0xFF
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d17
 | 
			
		||||
	cmp 	r0, #0x22
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d18
 | 
			
		||||
	cmp 	r0, #0x44
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d19
 | 
			
		||||
	cmp 	r0, #0x66
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d20
 | 
			
		||||
	cmp 	r0, #0x88
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d21
 | 
			
		||||
	cmp 	r0, #0xAA
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d22
 | 
			
		||||
	cmp 	r0, #0xFF
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d23
 | 
			
		||||
	cmp 	r0, #0x22
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d24
 | 
			
		||||
	cmp 	r0, #0x44
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d25
 | 
			
		||||
	cmp 	r0, #0x66
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d26
 | 
			
		||||
	cmp 	r0, #0x88
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d27
 | 
			
		||||
	cmp 	r0, #0xAA
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d28
 | 
			
		||||
	cmp 	r0, #0xFF
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d29
 | 
			
		||||
	cmp 	r0, #0x22
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d30
 | 
			
		||||
	cmp 	r0, #0x44
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d31
 | 
			
		||||
	cmp 	r0, #0x66
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77
 | 
			
		||||
	bne 	reg1_error_loopf
 | 
			
		||||
 | 
			
		||||
	/* Restore the registers that were clobbered by the test. */
 | 
			
		||||
	pop 	{r0-r1}
 | 
			
		||||
 | 
			
		||||
	/* VFP register test passed.  Jump to the core register test. */
 | 
			
		||||
	b 		reg1_loopf_pass
 | 
			
		||||
 | 
			
		||||
reg1_error_loopf:
 | 
			
		||||
	/* If this line is hit then a VFP register value was found to be
 | 
			
		||||
	incorrect. */
 | 
			
		||||
	b reg1_error_loopf
 | 
			
		||||
 | 
			
		||||
reg1_loopf_pass:
 | 
			
		||||
 | 
			
		||||
	/* Test each general purpose register to check that it still contains the
 | 
			
		||||
	expected known value, jumping to reg1_error_loop if any register contains
 | 
			
		||||
	an unexpected value. */
 | 
			
		||||
	cmp		r0, #0xFF
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r1, #0x11
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r2, #0x22
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r3, #0x33
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r4, #0x44
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r5, #0x55
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r6, #0x66
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r7, #0x77
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r8, #0x88
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r9, #0x99
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r10, #0xAA
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r11, #0xBB
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r12, #0xCC
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
	cmp		r14, #0xEE
 | 
			
		||||
	bne		reg1_error_loop
 | 
			
		||||
 | 
			
		||||
	/* Everything passed, increment the loop counter. */
 | 
			
		||||
	push { r0-r1 }
 | 
			
		||||
	ldr	r0, =ulRegTest1LoopCounter
 | 
			
		||||
	ldr r1, [r0]
 | 
			
		||||
	adds r1, r1, #1
 | 
			
		||||
	str r1, [r0]
 | 
			
		||||
	pop { r0-r1 }
 | 
			
		||||
 | 
			
		||||
	/* Start again. */
 | 
			
		||||
	b reg1_loop
 | 
			
		||||
 | 
			
		||||
reg1_error_loop:
 | 
			
		||||
	/* If this line is hit then there was an error in a core register value.
 | 
			
		||||
	The loop ensures the loop counter stops incrementing. */
 | 
			
		||||
	b reg1_error_loop
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
.type vRegTest2Implementation, %function
 | 
			
		||||
vRegTest2Implementation:
 | 
			
		||||
 | 
			
		||||
	/* Put a known value in each register. */
 | 
			
		||||
	mov		r0,  #0xFF000000
 | 
			
		||||
	mov		r1,  #0x11000000
 | 
			
		||||
	mov		r2,  #0x22000000
 | 
			
		||||
	mov		r3,  #0x33000000
 | 
			
		||||
	mov     r4,  #0x44000000
 | 
			
		||||
	mov     r5,  #0x55000000
 | 
			
		||||
	mov     r6,  #0x66000000
 | 
			
		||||
	mov     r7,  #0x77000000
 | 
			
		||||
	mov     r8,  #0x88000000
 | 
			
		||||
	mov     r9,  #0x99000000
 | 
			
		||||
	mov     r10, #0xAA000000
 | 
			
		||||
	mov     r11, #0xBB000000
 | 
			
		||||
	mov     r12, #0xCC000000
 | 
			
		||||
	mov     r14, #0xEE000000
 | 
			
		||||
 | 
			
		||||
	/* Likewise the floating point registers */
 | 
			
		||||
	vmov 	d0, r0, r1
 | 
			
		||||
	vmov 	d1, r2, r3
 | 
			
		||||
	vmov 	d2, r4, r5
 | 
			
		||||
	vmov 	d3, r6, r7
 | 
			
		||||
	vmov 	d4, r8, r9
 | 
			
		||||
	vmov 	d5, r10, r11
 | 
			
		||||
	vmov 	d6, r0, r1
 | 
			
		||||
	vmov 	d7, r2, r3
 | 
			
		||||
	vmov 	d8, r4, r5
 | 
			
		||||
	vmov 	d9, r6, r7
 | 
			
		||||
	vmov 	d10, r8, r9
 | 
			
		||||
	vmov 	d11, r10, r11
 | 
			
		||||
	vmov 	d12, r0, r1
 | 
			
		||||
	vmov 	d13, r2, r3
 | 
			
		||||
	vmov 	d14, r4, r5
 | 
			
		||||
	vmov 	d15, r6, r7
 | 
			
		||||
 | 
			
		||||
	vmov 	d16, r0, r1
 | 
			
		||||
	vmov 	d17, r2, r3
 | 
			
		||||
	vmov 	d18, r4, r5
 | 
			
		||||
	vmov 	d19, r6, r7
 | 
			
		||||
	vmov 	d20, r8, r9
 | 
			
		||||
	vmov 	d21, r10, r11
 | 
			
		||||
	vmov 	d22, r0, r1
 | 
			
		||||
	vmov 	d23, r2, r3
 | 
			
		||||
	vmov 	d24, r4, r5
 | 
			
		||||
	vmov 	d25, r6, r7
 | 
			
		||||
	vmov 	d26, r8, r9
 | 
			
		||||
	vmov 	d27, r10, r11
 | 
			
		||||
	vmov 	d28, r0, r1
 | 
			
		||||
	vmov 	d29, r2, r3
 | 
			
		||||
	vmov 	d30, r4, r5
 | 
			
		||||
	vmov 	d31, r6, r7
 | 
			
		||||
 | 
			
		||||
	/* Loop, checking each itteration that each register still contains the
 | 
			
		||||
	expected value. */
 | 
			
		||||
reg2_loop:
 | 
			
		||||
	/* Check all the VFP registers still contain the values set above.
 | 
			
		||||
	First save registers that are clobbered by the test. */
 | 
			
		||||
	push 	{ r0-r1 }
 | 
			
		||||
 | 
			
		||||
	vmov 	r0, r1, d0
 | 
			
		||||
	cmp 	r0, #0xFF000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d1
 | 
			
		||||
	cmp 	r0, #0x22000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d2
 | 
			
		||||
	cmp 	r0, #0x44000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d3
 | 
			
		||||
	cmp 	r0, #0x66000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d4
 | 
			
		||||
	cmp 	r0, #0x88000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d5
 | 
			
		||||
	cmp 	r0, #0xAA000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d6
 | 
			
		||||
	cmp 	r0, #0xFF000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d7
 | 
			
		||||
	cmp 	r0, #0x22000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d8
 | 
			
		||||
	cmp 	r0, #0x44000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d9
 | 
			
		||||
	cmp 	r0, #0x66000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d10
 | 
			
		||||
	cmp 	r0, #0x88000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d11
 | 
			
		||||
	cmp 	r0, #0xAA000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d12
 | 
			
		||||
	cmp 	r0, #0xFF000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov	r0, r1, d13
 | 
			
		||||
	cmp 	r0, #0x22000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d14
 | 
			
		||||
	cmp 	r0, #0x44000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d15
 | 
			
		||||
	cmp 	r0, #0x66000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
 | 
			
		||||
	vmov 	r0, r1, d16
 | 
			
		||||
	cmp 	r0, #0xFF000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d17
 | 
			
		||||
	cmp 	r0, #0x22000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d18
 | 
			
		||||
	cmp 	r0, #0x44000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d19
 | 
			
		||||
	cmp 	r0, #0x66000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d20
 | 
			
		||||
	cmp 	r0, #0x88000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d21
 | 
			
		||||
	cmp 	r0, #0xAA000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d22
 | 
			
		||||
	cmp 	r0, #0xFF000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d23
 | 
			
		||||
	cmp 	r0, #0x22000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d24
 | 
			
		||||
	cmp 	r0, #0x44000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d25
 | 
			
		||||
	cmp 	r0, #0x66000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d26
 | 
			
		||||
	cmp 	r0, #0x88000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x99000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d27
 | 
			
		||||
	cmp 	r0, #0xAA000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0xBB000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d28
 | 
			
		||||
	cmp 	r0, #0xFF000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x11000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov	r0, r1, d29
 | 
			
		||||
	cmp 	r0, #0x22000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x33000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d30
 | 
			
		||||
	cmp 	r0, #0x44000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x55000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	vmov 	r0, r1, d31
 | 
			
		||||
	cmp 	r0, #0x66000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
	cmp 	r1, #0x77000000
 | 
			
		||||
	bne 	reg2_error_loopf
 | 
			
		||||
 | 
			
		||||
	/* Restore the registers that were clobbered by the test. */
 | 
			
		||||
	pop 	{r0-r1}
 | 
			
		||||
 | 
			
		||||
	/* VFP register test passed.  Jump to the core register test. */
 | 
			
		||||
	b 		reg2_loopf_pass
 | 
			
		||||
 | 
			
		||||
reg2_error_loopf:
 | 
			
		||||
	/* If this line is hit then a VFP register value was found to be
 | 
			
		||||
	incorrect. */
 | 
			
		||||
	b 		reg2_error_loopf
 | 
			
		||||
 | 
			
		||||
reg2_loopf_pass:
 | 
			
		||||
 | 
			
		||||
	cmp		r0, #0xFF000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r1, #0x11000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r2, #0x22000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r3, #0x33000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r4, #0x44000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r5, #0x55000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r6, #0x66000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r7, #0x77000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r8, #0x88000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r9, #0x99000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r10, #0xAA000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r11, #0xBB000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp		r12, #0xCC000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
	cmp     r14, #0xEE000000
 | 
			
		||||
	bne		reg2_error_loop
 | 
			
		||||
 | 
			
		||||
	/* Everything passed, increment the loop counter. */
 | 
			
		||||
	push 	{ r0-r1 }
 | 
			
		||||
	ldr		r0, =ulRegTest2LoopCounter
 | 
			
		||||
	ldr 	r1, [r0]
 | 
			
		||||
	adds 	r1, r1, #1
 | 
			
		||||
	str 	r1, [r0]
 | 
			
		||||
	pop 	{ r0-r1 }
 | 
			
		||||
 | 
			
		||||
	/* Start again. */
 | 
			
		||||
	b 		reg2_loop
 | 
			
		||||
 | 
			
		||||
reg2_error_loop:
 | 
			
		||||
	/* If this line is hit then there was an error in a core register value.
 | 
			
		||||
	The loop ensures the loop counter stops incrementing. */
 | 
			
		||||
	b 		reg2_error_loop
 | 
			
		||||
	nop
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	.end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,321 @@
 | 
			
		|||
/*
 | 
			
		||||
 FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
 All rights reserved
 | 
			
		||||
 | 
			
		||||
 VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
 ***************************************************************************
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
 *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
 *    platform software that has become a de facto standard.             *
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
 *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
 *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 *    Thank you!                                                         *
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
 FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
 the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
 Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
 FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
 link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
 1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
 ***************************************************************************
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
 *    not run, what could be wrong?"                                     *
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
 *                                                                       *
 | 
			
		||||
 ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
 license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
 including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
 compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
 http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
 Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
 licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
 http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
 engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
 mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
 1 tab == 4 spaces!
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER.
 | 
			
		||||
 | 
			
		||||
	Note1:  This driver is used specifically to provide an interface to the
 | 
			
		||||
	FreeRTOS+CLI command interpreter.  It is *not* intended to be a generic
 | 
			
		||||
	serial port driver.  Nor is it intended to be used as an example of an
 | 
			
		||||
	efficient implementation.  In particular, a queue is used to buffer
 | 
			
		||||
	received characters, which is fine in this case as key presses arrive
 | 
			
		||||
	slowly, but a DMA and/or RAM buffer should be used in place of the queue in
 | 
			
		||||
	applications that expect higher throughput.
 | 
			
		||||
 | 
			
		||||
	Note2:  This driver does not attempt to handle UART errors.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Scheduler includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "queue.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
 | 
			
		||||
/* Demo application includes. */
 | 
			
		||||
#include "serial.h"
 | 
			
		||||
 | 
			
		||||
/* Xilinx includes. */
 | 
			
		||||
#include "xuartps.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
#include "xil_exception.h"
 | 
			
		||||
 | 
			
		||||
/* The UART interrupts of interest when receiving. */
 | 
			
		||||
#define serRECEIVE_INTERRUPT_MASK	( XUARTPS_IXR_RXOVR | XUARTPS_IXR_RXFULL | XUARTPS_IXR_TOUT )
 | 
			
		||||
 | 
			
		||||
/* The UART interrupts of interest when transmitting. */
 | 
			
		||||
#define serTRANSMIT_IINTERRUPT_MASK ( XUARTPS_IXR_TXEMPTY )
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The UART being used. */
 | 
			
		||||
static XUartPs xUARTInstance;
 | 
			
		||||
 | 
			
		||||
/* The interrupt controller, which is configred by the hardware setup routines
 | 
			
		||||
defined in main(). */
 | 
			
		||||
extern XScuGic xInterruptController;
 | 
			
		||||
 | 
			
		||||
/* The queue into which received key presses are placed.  NOTE THE COMMENTS AT
 | 
			
		||||
THE TOP OF THIS FILE REGARDING THE USE OF QUEUES FOR THIS PURPOSE. */
 | 
			
		||||
static QueueHandle_t xRxQueue = NULL;
 | 
			
		||||
 | 
			
		||||
/* The semaphore used to indicate the end of a transmission. */
 | 
			
		||||
static SemaphoreHandle_t xTxCompleteSemaphore = NULL;
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The UART interrupt handler is defined in this file to provide more control,
 | 
			
		||||
 * but still uses parts of the Xilinx provided driver.
 | 
			
		||||
 */
 | 
			
		||||
void prvUART_Handler( void *pvNotUsed );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * See the serial2.h header file.
 | 
			
		||||
 */
 | 
			
		||||
xComPortHandle xSerialPortInitMinimal( uint32_t ulWantedBaud, UBaseType_t uxQueueLength )
 | 
			
		||||
{
 | 
			
		||||
BaseType_t xStatus;
 | 
			
		||||
XUartPs_Config *pxConfig;
 | 
			
		||||
 | 
			
		||||
	/* Create the queue used to hold received characters.  NOTE THE COMMENTS AT
 | 
			
		||||
	THE TOP OF THIS FILE REGARDING THE QUEUE OF QUEUES FOR THIS PURPSOE. */
 | 
			
		||||
	xRxQueue = xQueueCreate( uxQueueLength, sizeof( char ) );
 | 
			
		||||
	configASSERT( xRxQueue );
 | 
			
		||||
 | 
			
		||||
	/* Create the semaphore used to signal the end of a transmission, then take
 | 
			
		||||
	the semaphore so it is in the correct state the first time
 | 
			
		||||
	xSerialSendString() is called.  A block time of zero is used when taking
 | 
			
		||||
	the semaphore as it is guaranteed to be available (it was just created). */
 | 
			
		||||
	xTxCompleteSemaphore = xSemaphoreCreateBinary();
 | 
			
		||||
	configASSERT( xTxCompleteSemaphore );
 | 
			
		||||
	xSemaphoreTake( xTxCompleteSemaphore, 0 );
 | 
			
		||||
 | 
			
		||||
	/* Look up the UART configuration then initialise the dirver. */
 | 
			
		||||
	pxConfig = XUartPs_LookupConfig( XPAR_XUARTPS_0_DEVICE_ID );
 | 
			
		||||
 | 
			
		||||
	/* Initialise the driver. */
 | 
			
		||||
	xStatus = XUartPs_CfgInitialize( &xUARTInstance, pxConfig, XPAR_PS7_UART_1_BASEADDR );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* Misc. parameter configuration. */
 | 
			
		||||
	XUartPs_SetBaudRate( &xUARTInstance, ulWantedBaud );
 | 
			
		||||
	XUartPs_SetOperMode( &xUARTInstance, XUARTPS_OPER_MODE_NORMAL );
 | 
			
		||||
 | 
			
		||||
	/* Install the interrupt service routine that is defined within this
 | 
			
		||||
	file. */
 | 
			
		||||
	xStatus = XScuGic_Connect( &xInterruptController, XPAR_XUARTPS_1_INTR,  (Xil_ExceptionHandler) prvUART_Handler, (void *) &xUARTInstance );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* Ensure interrupts start clear. */
 | 
			
		||||
	XUartPs_WriteReg( XPAR_PS7_UART_1_BASEADDR, XUARTPS_ISR_OFFSET, XUARTPS_IXR_MASK );
 | 
			
		||||
 | 
			
		||||
	/* Enable the UART interrupt within the GIC. */
 | 
			
		||||
	XScuGic_Enable( &xInterruptController, XPAR_XUARTPS_1_INTR );
 | 
			
		||||
 | 
			
		||||
	/* Enable the interrupts of interest in the UART. */
 | 
			
		||||
	XUartPs_SetInterruptMask( &xUARTInstance, XUARTPS_IXR_RXFULL | XUARTPS_IXR_RXOVR | XUARTPS_IXR_TOUT | XUARTPS_IXR_TXEMPTY );
 | 
			
		||||
 | 
			
		||||
	/* Set the receive timeout. */
 | 
			
		||||
	XUartPs_SetRecvTimeout( &xUARTInstance, 8 );
 | 
			
		||||
 | 
			
		||||
	return ( xComPortHandle ) 0;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
BaseType_t xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, TickType_t xBlockTime )
 | 
			
		||||
{
 | 
			
		||||
BaseType_t xReturn;
 | 
			
		||||
 | 
			
		||||
	/* Only a single port is supported. */
 | 
			
		||||
	( void ) pxPort;
 | 
			
		||||
 | 
			
		||||
	/* Obtain a received character from the queue - entering the Blocked state
 | 
			
		||||
	(so not consuming any processing time) to wait for a character if one is not
 | 
			
		||||
	already available. */
 | 
			
		||||
	xReturn = xQueueReceive( xRxQueue, pcRxedChar, xBlockTime );
 | 
			
		||||
	return xReturn;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength )
 | 
			
		||||
{
 | 
			
		||||
const TickType_t xMaxWait = 200UL / portTICK_PERIOD_MS;
 | 
			
		||||
 | 
			
		||||
	/* Only a single port is supported. */
 | 
			
		||||
	( void ) pxPort;
 | 
			
		||||
 | 
			
		||||
	/* Start the transmission.  The interrupt service routine will complete the
 | 
			
		||||
	transmission if necessary. */
 | 
			
		||||
	XUartPs_Send( &xUARTInstance, ( void * ) pcString, usStringLength );
 | 
			
		||||
 | 
			
		||||
	/* Wait until the string has been transmitted before exiting this function,
 | 
			
		||||
	otherwise there is a risk the calling function will overwrite the string
 | 
			
		||||
	pointed to by the pcString parameter while it is still being transmitted.
 | 
			
		||||
	The calling task will wait in the Blocked state (so not consuming any
 | 
			
		||||
	processing time) until the semaphore is available. */
 | 
			
		||||
	xSemaphoreTake( xTxCompleteSemaphore, xMaxWait );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, TickType_t xBlockTime )
 | 
			
		||||
{
 | 
			
		||||
	/* Only a single port is supported. */
 | 
			
		||||
	( void ) pxPort;
 | 
			
		||||
 | 
			
		||||
	/* Send the character. */
 | 
			
		||||
	XUartPs_Send( &xUARTInstance, ( void * ) &cOutChar, sizeof( cOutChar ) );
 | 
			
		||||
 | 
			
		||||
	/* Wait for the transmission to be complete so the semaphore is left in the
 | 
			
		||||
	correct state for the next time vSerialPutString() is called. */
 | 
			
		||||
	xSemaphoreTake( xTxCompleteSemaphore, xBlockTime );
 | 
			
		||||
 | 
			
		||||
	return pdPASS;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vSerialClose(xComPortHandle xPort)
 | 
			
		||||
{
 | 
			
		||||
	/* Not supported as not required by the demo application. */
 | 
			
		||||
	( void ) xPort;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void prvUART_Handler( void *pvNotUsed )
 | 
			
		||||
{
 | 
			
		||||
extern unsigned int XUartPs_SendBuffer( XUartPs *InstancePtr );
 | 
			
		||||
uint32_t ulActiveInterrupts, ulChannelStatusRegister;
 | 
			
		||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 | 
			
		||||
char cChar;
 | 
			
		||||
 | 
			
		||||
	configASSERT( pvNotUsed == &xUARTInstance );
 | 
			
		||||
 | 
			
		||||
	/* Remove compile warnings if configASSERT() is not defined. */
 | 
			
		||||
	( void ) pvNotUsed;
 | 
			
		||||
 | 
			
		||||
	/* Read the interrupt ID register to see which interrupt is active. */
 | 
			
		||||
	ulActiveInterrupts = XUartPs_ReadReg(XPAR_PS7_UART_1_BASEADDR,  XUARTPS_IMR_OFFSET);
 | 
			
		||||
	ulActiveInterrupts &= XUartPs_ReadReg(XPAR_PS7_UART_1_BASEADDR,  XUARTPS_ISR_OFFSET);
 | 
			
		||||
 | 
			
		||||
	/* Are any receive events of interest active? */
 | 
			
		||||
	if( ( ulActiveInterrupts & serRECEIVE_INTERRUPT_MASK ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		/* Read the Channel Status Register to determine if there is any data in
 | 
			
		||||
		the RX FIFO. */
 | 
			
		||||
		ulChannelStatusRegister = XUartPs_ReadReg( XPAR_PS7_UART_1_BASEADDR, XUARTPS_SR_OFFSET );
 | 
			
		||||
 | 
			
		||||
		/* Move data from the Rx FIFO to the Rx queue.  NOTE THE COMMENTS AT THE
 | 
			
		||||
		TOP OF THIS FILE ABOUT USING QUEUES FOR THIS PURPSOE. */
 | 
			
		||||
		while( ( ulChannelStatusRegister & XUARTPS_SR_RXEMPTY ) == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			cChar =	XUartPs_ReadReg( XPAR_PS7_UART_1_BASEADDR, XUARTPS_FIFO_OFFSET );
 | 
			
		||||
 | 
			
		||||
			/* If writing to the queue unblocks a task, and the unblocked task
 | 
			
		||||
			has a priority above the currently running task (the task that this
 | 
			
		||||
			interrupt interrupted), then xHigherPriorityTaskWoken will be set
 | 
			
		||||
			to pdTRUE inside the xQueueSendFromISR() function.
 | 
			
		||||
			xHigherPriorityTaskWoken is then passed to portYIELD_FROM_ISR() at
 | 
			
		||||
			the end of this interrupt handler to request a context switch so the
 | 
			
		||||
			interrupt returns directly to the (higher priority) unblocked
 | 
			
		||||
			task. */
 | 
			
		||||
			xQueueSendFromISR( xRxQueue, &cChar, &xHigherPriorityTaskWoken );
 | 
			
		||||
			ulChannelStatusRegister = XUartPs_ReadReg( XPAR_PS7_UART_1_BASEADDR, XUARTPS_SR_OFFSET );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Are any transmit events of interest active? */
 | 
			
		||||
	if( ( ulActiveInterrupts & serTRANSMIT_IINTERRUPT_MASK ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		if( xUARTInstance.SendBuffer.RemainingBytes == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			/* Give back the semaphore to indicate that the tranmission is
 | 
			
		||||
			complete.  If giving the semaphore unblocks a task, and the
 | 
			
		||||
			unblocked task has a priority above the currently running task (the
 | 
			
		||||
			task that this interrupt interrupted), then xHigherPriorityTaskWoken
 | 
			
		||||
			will be set	to pdTRUE inside the xSemaphoreGiveFromISR() function.
 | 
			
		||||
			xHigherPriorityTaskWoken is then passed to portYIELD_FROM_ISR() at
 | 
			
		||||
			the end of this interrupt handler to request a context switch so the
 | 
			
		||||
			interrupt returns directly to the (higher priority) unblocked
 | 
			
		||||
			task. */
 | 
			
		||||
			xSemaphoreGiveFromISR( xTxCompleteSemaphore, &xHigherPriorityTaskWoken );
 | 
			
		||||
 | 
			
		||||
			/* No more data to transmit. */
 | 
			
		||||
			XUartPs_WriteReg( XPAR_PS7_UART_1_BASEADDR, XUARTPS_IDR_OFFSET, XUARTPS_IXR_TXEMPTY );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* More data to send. */
 | 
			
		||||
			XUartPs_SendBuffer( &xUARTInstance );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* portYIELD_FROM_ISR() will request a context switch if executing this
 | 
			
		||||
	interrupt handler caused a task to leave the blocked state, and the task
 | 
			
		||||
	that left the blocked state has a higher priority than the currently running
 | 
			
		||||
	task (the task this interrupt interrupted).  See the comment above the calls
 | 
			
		||||
	to xSemaphoreGiveFromISR() and xQueueSendFromISR() within this function. */
 | 
			
		||||
	portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
 | 
			
		||||
 | 
			
		||||
	/* Clear the interrupt status. */
 | 
			
		||||
	XUartPs_WriteReg( XPAR_PS7_UART_1_BASEADDR, XUARTPS_ISR_OFFSET, ulActiveInterrupts );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										129
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/ParTest.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,129 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------
 | 
			
		||||
 * Simple IO routines to control the LEDs.
 | 
			
		||||
 * This file is called ParTest.c for historic reasons.  Originally it stood for
 | 
			
		||||
 * PARallel port TEST.
 | 
			
		||||
 *-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* Scheduler includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
 | 
			
		||||
/* Demo includes. */
 | 
			
		||||
#include "partest.h"
 | 
			
		||||
 | 
			
		||||
/* Xilinx includes. */
 | 
			
		||||
#include "xgpiops.h"
 | 
			
		||||
 | 
			
		||||
#define partstNUM_LEDS			( 1 )
 | 
			
		||||
#define partstDIRECTION_OUTPUT	( 1 )
 | 
			
		||||
#define partstOUTPUT_ENABLED	( 1 )
 | 
			
		||||
#define partstLED_OUTPUT		( 10 )
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static XGpioPs xGpio;
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vParTestInitialise( void )
 | 
			
		||||
{
 | 
			
		||||
XGpioPs_Config *pxConfigPtr;
 | 
			
		||||
BaseType_t xStatus;
 | 
			
		||||
 | 
			
		||||
	/* Initialise the GPIO driver. */
 | 
			
		||||
	pxConfigPtr = XGpioPs_LookupConfig( XPAR_XGPIOPS_0_DEVICE_ID );
 | 
			
		||||
	xStatus = XGpioPs_CfgInitialize( &xGpio, pxConfigPtr, pxConfigPtr->BaseAddr );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* Enable outputs and set low. */
 | 
			
		||||
	XGpioPs_SetDirectionPin( &xGpio, partstLED_OUTPUT, partstDIRECTION_OUTPUT );
 | 
			
		||||
	XGpioPs_SetOutputEnablePin( &xGpio, partstLED_OUTPUT, partstOUTPUT_ENABLED );
 | 
			
		||||
	XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, 0x0 );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vParTestSetLED( UBaseType_t uxLED, BaseType_t xValue )
 | 
			
		||||
{
 | 
			
		||||
	( void ) uxLED;
 | 
			
		||||
	XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, xValue );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
 | 
			
		||||
{
 | 
			
		||||
BaseType_t xLEDState;
 | 
			
		||||
 | 
			
		||||
	( void ) uxLED;
 | 
			
		||||
 | 
			
		||||
	xLEDState = XGpioPs_ReadPin( &xGpio, partstLED_OUTPUT );
 | 
			
		||||
	XGpioPs_WritePin( &xGpio, partstLED_OUTPUT, !xLEDState );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										285
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lscript.ld
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lscript.ld
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,285 @@
 | 
			
		|||
/*******************************************************************/
 | 
			
		||||
/*                                                                 */
 | 
			
		||||
/* This file is automatically generated by linker script generator.*/
 | 
			
		||||
/*                                                                 */
 | 
			
		||||
/* Version:                                 */
 | 
			
		||||
/*                                                                 */
 | 
			
		||||
/* Copyright (c) 2010 Xilinx, Inc.  All rights reserved.           */
 | 
			
		||||
/*                                                                 */
 | 
			
		||||
/* Description : Cortex-A9 Linker Script                          */
 | 
			
		||||
/*                                                                 */
 | 
			
		||||
/*******************************************************************/
 | 
			
		||||
 | 
			
		||||
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x2000;
 | 
			
		||||
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x2000;
 | 
			
		||||
 | 
			
		||||
_ABORT_STACK_SIZE = DEFINED(_ABORT_STACK_SIZE) ? _ABORT_STACK_SIZE : 1024;
 | 
			
		||||
_SUPERVISOR_STACK_SIZE = DEFINED(_SUPERVISOR_STACK_SIZE) ? _SUPERVISOR_STACK_SIZE : 2048;
 | 
			
		||||
_FIQ_STACK_SIZE = DEFINED(_FIQ_STACK_SIZE) ? _FIQ_STACK_SIZE : 1024;
 | 
			
		||||
_UNDEF_STACK_SIZE = DEFINED(_UNDEF_STACK_SIZE) ? _UNDEF_STACK_SIZE : 1024;
 | 
			
		||||
 | 
			
		||||
/* Define Memories in the system */
 | 
			
		||||
 | 
			
		||||
MEMORY
 | 
			
		||||
{
 | 
			
		||||
   ps7_ddr_0_S_AXI_BASEADDR : ORIGIN = 0x00100000, LENGTH = 0x1FF00000
 | 
			
		||||
   ps7_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x00030000
 | 
			
		||||
   ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Specify the default entry point to the program */
 | 
			
		||||
 | 
			
		||||
ENTRY(_freertos_vector_table)
 | 
			
		||||
 | 
			
		||||
/* Define the sections, and where they are mapped in memory */
 | 
			
		||||
 | 
			
		||||
SECTIONS
 | 
			
		||||
{
 | 
			
		||||
.text : {
 | 
			
		||||
   *(.freertos_vectors)
 | 
			
		||||
   *(.vectors)
 | 
			
		||||
   *(.boot)
 | 
			
		||||
   *(.text)
 | 
			
		||||
   *(.text.*)
 | 
			
		||||
   *(.gnu.linkonce.t.*)
 | 
			
		||||
   *(.plt)
 | 
			
		||||
   *(.gnu_warning)
 | 
			
		||||
   *(.gcc_execpt_table)
 | 
			
		||||
   *(.glue_7)
 | 
			
		||||
   *(.glue_7t)
 | 
			
		||||
   *(.vfp11_veneer)
 | 
			
		||||
   *(.ARM.extab)
 | 
			
		||||
   *(.gnu.linkonce.armextab.*)
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.init : {
 | 
			
		||||
   KEEP (*(.init))
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.fini : {
 | 
			
		||||
   KEEP (*(.fini))
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.rodata : {
 | 
			
		||||
   __rodata_start = .;
 | 
			
		||||
   *(.rodata)
 | 
			
		||||
   *(.rodata.*)
 | 
			
		||||
   *(.gnu.linkonce.r.*)
 | 
			
		||||
   __rodata_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.rodata1 : {
 | 
			
		||||
   __rodata1_start = .;
 | 
			
		||||
   *(.rodata1)
 | 
			
		||||
   *(.rodata1.*)
 | 
			
		||||
   __rodata1_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.sdata2 : {
 | 
			
		||||
   __sdata2_start = .;
 | 
			
		||||
   *(.sdata2)
 | 
			
		||||
   *(.sdata2.*)
 | 
			
		||||
   *(.gnu.linkonce.s2.*)
 | 
			
		||||
   __sdata2_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.sbss2 : {
 | 
			
		||||
   __sbss2_start = .;
 | 
			
		||||
   *(.sbss2)
 | 
			
		||||
   *(.sbss2.*)
 | 
			
		||||
   *(.gnu.linkonce.sb2.*)
 | 
			
		||||
   __sbss2_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.data : {
 | 
			
		||||
   __data_start = .;
 | 
			
		||||
   *(.data)
 | 
			
		||||
   *(.data.*)
 | 
			
		||||
   *(.gnu.linkonce.d.*)
 | 
			
		||||
   *(.jcr)
 | 
			
		||||
   *(.got)
 | 
			
		||||
   *(.got.plt)
 | 
			
		||||
   __data_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.data1 : {
 | 
			
		||||
   __data1_start = .;
 | 
			
		||||
   *(.data1)
 | 
			
		||||
   *(.data1.*)
 | 
			
		||||
   __data1_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.got : {
 | 
			
		||||
   *(.got)
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.ctors : {
 | 
			
		||||
   __CTOR_LIST__ = .;
 | 
			
		||||
   ___CTORS_LIST___ = .;
 | 
			
		||||
   KEEP (*crtbegin.o(.ctors))
 | 
			
		||||
   KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors))
 | 
			
		||||
   KEEP (*(SORT(.ctors.*)))
 | 
			
		||||
   KEEP (*(.ctors))
 | 
			
		||||
   __CTOR_END__ = .;
 | 
			
		||||
   ___CTORS_END___ = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.dtors : {
 | 
			
		||||
   __DTOR_LIST__ = .;
 | 
			
		||||
   ___DTORS_LIST___ = .;
 | 
			
		||||
   KEEP (*crtbegin.o(.dtors))
 | 
			
		||||
   KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors))
 | 
			
		||||
   KEEP (*(SORT(.dtors.*)))
 | 
			
		||||
   KEEP (*(.dtors))
 | 
			
		||||
   __DTOR_END__ = .;
 | 
			
		||||
   ___DTORS_END___ = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.fixup : {
 | 
			
		||||
   __fixup_start = .;
 | 
			
		||||
   *(.fixup)
 | 
			
		||||
   __fixup_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.eh_frame : {
 | 
			
		||||
   *(.eh_frame)
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.eh_framehdr : {
 | 
			
		||||
   __eh_framehdr_start = .;
 | 
			
		||||
   *(.eh_framehdr)
 | 
			
		||||
   __eh_framehdr_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.gcc_except_table : {
 | 
			
		||||
   *(.gcc_except_table)
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.mmu_tbl (ALIGN(16384)) : {
 | 
			
		||||
   __mmu_tbl_start = .;
 | 
			
		||||
   *(.mmu_tbl)
 | 
			
		||||
   __mmu_tbl_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.ARM.exidx : {
 | 
			
		||||
   __exidx_start = .;
 | 
			
		||||
   *(.ARM.exidx*)
 | 
			
		||||
   *(.gnu.linkonce.armexidix.*.*)
 | 
			
		||||
   __exidx_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.preinit_array : {
 | 
			
		||||
   __preinit_array_start = .;
 | 
			
		||||
   KEEP (*(SORT(.preinit_array.*)))
 | 
			
		||||
   KEEP (*(.preinit_array))
 | 
			
		||||
   __preinit_array_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.init_array : {
 | 
			
		||||
   __init_array_start = .;
 | 
			
		||||
   KEEP (*(SORT(.init_array.*)))
 | 
			
		||||
   KEEP (*(.init_array))
 | 
			
		||||
   __init_array_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.fini_array : {
 | 
			
		||||
   __fini_array_start = .;
 | 
			
		||||
   KEEP (*(SORT(.fini_array.*)))
 | 
			
		||||
   KEEP (*(.fini_array))
 | 
			
		||||
   __fini_array_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.ARM.attributes : {
 | 
			
		||||
   __ARM.attributes_start = .;
 | 
			
		||||
   *(.ARM.attributes)
 | 
			
		||||
   __ARM.attributes_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.sdata : {
 | 
			
		||||
   __sdata_start = .;
 | 
			
		||||
   *(.sdata)
 | 
			
		||||
   *(.sdata.*)
 | 
			
		||||
   *(.gnu.linkonce.s.*)
 | 
			
		||||
   __sdata_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.sbss (NOLOAD) : {
 | 
			
		||||
   __sbss_start = .;
 | 
			
		||||
   *(.sbss)
 | 
			
		||||
   *(.sbss.*)
 | 
			
		||||
   *(.gnu.linkonce.sb.*)
 | 
			
		||||
   __sbss_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.tdata : {
 | 
			
		||||
   __tdata_start = .;
 | 
			
		||||
   *(.tdata)
 | 
			
		||||
   *(.tdata.*)
 | 
			
		||||
   *(.gnu.linkonce.td.*)
 | 
			
		||||
   __tdata_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.tbss : {
 | 
			
		||||
   __tbss_start = .;
 | 
			
		||||
   *(.tbss)
 | 
			
		||||
   *(.tbss.*)
 | 
			
		||||
   *(.gnu.linkonce.tb.*)
 | 
			
		||||
   __tbss_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.bss (NOLOAD) : {
 | 
			
		||||
   __bss_start = .;
 | 
			
		||||
   *(.bss)
 | 
			
		||||
   *(.bss.*)
 | 
			
		||||
   *(.gnu.linkonce.b.*)
 | 
			
		||||
   *(COMMON)
 | 
			
		||||
   __bss_end = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );
 | 
			
		||||
 | 
			
		||||
_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
 | 
			
		||||
 | 
			
		||||
/* Generate Stack and Heap definitions */
 | 
			
		||||
 | 
			
		||||
.heap (NOLOAD) : {
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   _heap = .;
 | 
			
		||||
   HeapBase = .;
 | 
			
		||||
   _heap_start = .;
 | 
			
		||||
   . += _HEAP_SIZE;
 | 
			
		||||
   _heap_end = .;
 | 
			
		||||
   HeapLimit = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
.stack (NOLOAD) : {
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   _stack_end = .;
 | 
			
		||||
   . += _STACK_SIZE;
 | 
			
		||||
   _stack = .;
 | 
			
		||||
   __stack = _stack;
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   _irq_stack_end = .;
 | 
			
		||||
   . += _STACK_SIZE;
 | 
			
		||||
   __irq_stack = .;
 | 
			
		||||
   _supervisor_stack_end = .;
 | 
			
		||||
   . += _SUPERVISOR_STACK_SIZE;
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   __supervisor_stack = .;
 | 
			
		||||
   _abort_stack_end = .;
 | 
			
		||||
   . += _ABORT_STACK_SIZE;
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   __abort_stack = .;
 | 
			
		||||
   _fiq_stack_end = .;
 | 
			
		||||
   . += _FIQ_STACK_SIZE;
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   __fiq_stack = .;
 | 
			
		||||
   _undef_stack_end = .;
 | 
			
		||||
   . += _UNDEF_STACK_SIZE;
 | 
			
		||||
   . = ALIGN(16);
 | 
			
		||||
   __undef_stack = .;
 | 
			
		||||
} > ps7_ddr_0_S_AXI_BASEADDR
 | 
			
		||||
 | 
			
		||||
_end = .;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,203 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd.
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS tutorial books are available in pdf and paperback.        *
 | 
			
		||||
     *    Complete, revised, and edited pdf reference manuals are also       *
 | 
			
		||||
     *    available.                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Purchasing FreeRTOS documentation will not only help you, by       *
 | 
			
		||||
     *    ensuring you get running as quickly as possible and with an        *
 | 
			
		||||
     *    in-depth knowledge of how to use FreeRTOS, it will also help       *
 | 
			
		||||
     *    the FreeRTOS project to continue with its mission of providing     *
 | 
			
		||||
     *    professional grade, cross platform, de facto standard solutions    *
 | 
			
		||||
     *    for microcontrollers - completely free of charge!                  *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you for using FreeRTOS, and thank you for your support!      *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
 | 
			
		||||
    >>>NOTE<<< The modification to the GPL is included to allow you to
 | 
			
		||||
    distribute a combined work that includes FreeRTOS without being obliged to
 | 
			
		||||
    provide the source code for proprietary components outside of the FreeRTOS
 | 
			
		||||
    kernel.  FreeRTOS is distributed in the hope that it will be useful, but
 | 
			
		||||
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
			
		||||
    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
    more details. You should have received a copy of the GNU General Public
 | 
			
		||||
    License and the FreeRTOS license exception along with FreeRTOS; if not it
 | 
			
		||||
    can be viewed here: http://www.freertos.org/a00114.html and also obtained
 | 
			
		||||
    by writing to Richard Barry, contact details for whom are available on the
 | 
			
		||||
    FreeRTOS WEB site.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, latest information, license and
 | 
			
		||||
    contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - A version that is certified for use in safety
 | 
			
		||||
    critical systems.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Commercial support, development, porting,
 | 
			
		||||
    licensing and training services.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Standard includes. */
 | 
			
		||||
#include "stdlib.h"
 | 
			
		||||
#include "string.h"
 | 
			
		||||
 | 
			
		||||
/* lwIP core includes */
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
#include "lwip/sockets.h"
 | 
			
		||||
 | 
			
		||||
/* FreeRTOS includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
 | 
			
		||||
/* Utils includes. */
 | 
			
		||||
#include "FreeRTOS_CLI.h"
 | 
			
		||||
 | 
			
		||||
/* Dimensions the buffer into which input characters are placed. */
 | 
			
		||||
#define cmdMAX_INPUT_SIZE	100
 | 
			
		||||
 | 
			
		||||
/* Dimensions the buffer into which string outputs can be placed. */
 | 
			
		||||
#define cmdMAX_OUTPUT_SIZE	1024
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 | 
			
		||||
{
 | 
			
		||||
long lSocket, lClientFd, lBytes, lAddrLen = sizeof( struct sockaddr_in ), lInputIndex;
 | 
			
		||||
struct sockaddr_in sLocalAddr;
 | 
			
		||||
struct sockaddr_in client_addr;
 | 
			
		||||
const char *pcWelcomeMessage = "FreeRTOS command server - connection accepted.\r\nType Help to view a list of registered commands.\r\n\r\n>";
 | 
			
		||||
char cInChar;
 | 
			
		||||
static char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ];
 | 
			
		||||
portBASE_TYPE xReturned;
 | 
			
		||||
extern void vRegisterSampleCLICommands( void );
 | 
			
		||||
 | 
			
		||||
	( void ) pvParameters;
 | 
			
		||||
 | 
			
		||||
	/* Register the standard CLI commands. */
 | 
			
		||||
	vRegisterSampleCLICommands();
 | 
			
		||||
 | 
			
		||||
	lSocket = lwip_socket(AF_INET, SOCK_STREAM, 0);
 | 
			
		||||
 | 
			
		||||
	if( lSocket >= 0 )
 | 
			
		||||
	{
 | 
			
		||||
		memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
 | 
			
		||||
		sLocalAddr.sin_family = AF_INET;
 | 
			
		||||
		sLocalAddr.sin_len = sizeof(sLocalAddr);
 | 
			
		||||
		sLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 | 
			
		||||
		sLocalAddr.sin_port = ntohs( ( ( unsigned short ) 23 ) );
 | 
			
		||||
 | 
			
		||||
		if( lwip_bind( lSocket, ( struct sockaddr *) &sLocalAddr, sizeof( sLocalAddr ) ) < 0 ) 
 | 
			
		||||
		{
 | 
			
		||||
			lwip_close( lSocket );
 | 
			
		||||
			vTaskDelete( NULL );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( lwip_listen( lSocket, 20 ) != 0 )
 | 
			
		||||
		{
 | 
			
		||||
			lwip_close( lSocket );
 | 
			
		||||
			vTaskDelete( NULL );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for( ;; )
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
			lClientFd = lwip_accept(lSocket, ( struct sockaddr * ) &client_addr, ( u32_t * ) &lAddrLen );
 | 
			
		||||
 | 
			
		||||
			if( lClientFd > 0L )
 | 
			
		||||
			{
 | 
			
		||||
				lwip_send( lClientFd, pcWelcomeMessage, strlen( ( const char * ) pcWelcomeMessage ), 0 );
 | 
			
		||||
 | 
			
		||||
				lInputIndex = 0;
 | 
			
		||||
				memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
 | 
			
		||||
 | 
			
		||||
				do
 | 
			
		||||
				{					
 | 
			
		||||
					lBytes = lwip_recv( lClientFd, &cInChar, sizeof( cInChar ), 0 );
 | 
			
		||||
 | 
			
		||||
					if( lBytes > 0L ) 
 | 
			
		||||
					{
 | 
			
		||||
						if( cInChar == '\n' )
 | 
			
		||||
						{
 | 
			
		||||
							/* The input string has been terminated.  Was the 
 | 
			
		||||
							input a quit command? */
 | 
			
		||||
							if( strcmp( "quit", ( const char * ) cInputString ) == 0 )
 | 
			
		||||
							{
 | 
			
		||||
								/* Set lBytes to 0 to close the connection. */
 | 
			
		||||
								lBytes = 0L;
 | 
			
		||||
							}
 | 
			
		||||
							else
 | 
			
		||||
							{
 | 
			
		||||
								/* The input string was not a quit command.  
 | 
			
		||||
								Pass the string to the command interpreter. */
 | 
			
		||||
								do
 | 
			
		||||
								{
 | 
			
		||||
									/* Get the next output string from the command interpreter. */
 | 
			
		||||
									xReturned = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
 | 
			
		||||
									lwip_send( lClientFd, cOutputString, strlen( ( const char * ) cOutputString ), 0 );
 | 
			
		||||
 | 
			
		||||
								} while( xReturned != pdFALSE );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
								/* All the strings generated by the input 
 | 
			
		||||
								command have been sent.  Clear the input
 | 
			
		||||
								string ready to receive the next command. */
 | 
			
		||||
								lInputIndex = 0;
 | 
			
		||||
								memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
 | 
			
		||||
								lwip_send( lClientFd, "\r\n>", strlen( "\r\n>" ), 0 );
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							if( cInChar == '\r' )
 | 
			
		||||
							{
 | 
			
		||||
								/* Ignore the character. */
 | 
			
		||||
							}
 | 
			
		||||
							else if( cInChar == '\b' )
 | 
			
		||||
							{
 | 
			
		||||
								/* Backspace was pressed.  Erase the last 
 | 
			
		||||
								character in the string - if any. */
 | 
			
		||||
								if( lInputIndex > 0 )
 | 
			
		||||
								{
 | 
			
		||||
									lInputIndex--;
 | 
			
		||||
									cInputString[ lInputIndex ] = '\0';
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
							else
 | 
			
		||||
							{
 | 
			
		||||
								/* A character was entered.  Add it to the string
 | 
			
		||||
								entered so far.  When a \n is entered the complete
 | 
			
		||||
								string will be passed to the command interpreter. */
 | 
			
		||||
								if( lInputIndex < cmdMAX_INPUT_SIZE )
 | 
			
		||||
								{
 | 
			
		||||
									cInputString[ lInputIndex ] = cInChar;
 | 
			
		||||
									lInputIndex++;
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				} while( lBytes > 0L );
 | 
			
		||||
 | 
			
		||||
				 lwip_close( lClientFd );
 | 
			
		||||
			}
 | 
			
		||||
		} 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Will only get here if a listening socket could not be created. */
 | 
			
		||||
	vTaskDelete( NULL );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,177 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification, 
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
#include "lwip/def.h"
 | 
			
		||||
#include "fs.h"
 | 
			
		||||
#include "fsdata.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 to include "fsdata_custom.c" instead of "fsdata.c" for the
 | 
			
		||||
 * file system (to prevent changing the file included in CVS) */
 | 
			
		||||
#ifndef HTTPD_USE_CUSTUM_FSDATA
 | 
			
		||||
#define HTTPD_USE_CUSTUM_FSDATA 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HTTPD_USE_CUSTUM_FSDATA
 | 
			
		||||
#include "fsdata_custom.c"
 | 
			
		||||
#else /* HTTPD_USE_CUSTUM_FSDATA */
 | 
			
		||||
#include "fsdata.c"
 | 
			
		||||
#endif /* HTTPD_USE_CUSTUM_FSDATA */
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
/* Define the number of open files that we can support. */
 | 
			
		||||
#ifndef LWIP_MAX_OPEN_FILES
 | 
			
		||||
#define LWIP_MAX_OPEN_FILES     10
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Define the file system memory allocation structure. */
 | 
			
		||||
struct fs_table {
 | 
			
		||||
  struct fs_file file;
 | 
			
		||||
  u8_t inuse;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Allocate file system memory */
 | 
			
		||||
struct fs_table fs_memory[LWIP_MAX_OPEN_FILES];
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_CUSTOM_FILES
 | 
			
		||||
int fs_open_custom(struct fs_file *file, const char *name);
 | 
			
		||||
void fs_close_custom(struct fs_file *file);
 | 
			
		||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
static struct fs_file *
 | 
			
		||||
fs_malloc(void)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  for(i = 0; i < LWIP_MAX_OPEN_FILES; i++) {
 | 
			
		||||
    if(fs_memory[i].inuse == 0) {
 | 
			
		||||
      fs_memory[i].inuse = 1;
 | 
			
		||||
      return(&fs_memory[i].file);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return(NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
static void
 | 
			
		||||
fs_free(struct fs_file *file)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  for(i = 0; i < LWIP_MAX_OPEN_FILES; i++) {
 | 
			
		||||
    if(&fs_memory[i].file == file) {
 | 
			
		||||
      fs_memory[i].inuse = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
struct fs_file *
 | 
			
		||||
fs_open(const char *name)
 | 
			
		||||
{
 | 
			
		||||
  struct fs_file *file;
 | 
			
		||||
  const struct fsdata_file *f;
 | 
			
		||||
 | 
			
		||||
  file = fs_malloc();
 | 
			
		||||
  if(file == NULL) {
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_CUSTOM_FILES
 | 
			
		||||
  if(fs_open_custom(file, name)) {
 | 
			
		||||
    file->is_custom_file = 1;
 | 
			
		||||
    return file;
 | 
			
		||||
  }
 | 
			
		||||
  file->is_custom_file = 0;
 | 
			
		||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */
 | 
			
		||||
 | 
			
		||||
  for(f = FS_ROOT; f != NULL; f = f->next) {
 | 
			
		||||
    if (!strcmp(name, (char *)f->name)) {
 | 
			
		||||
      file->data = (const char *)f->data;
 | 
			
		||||
      file->len = f->len;
 | 
			
		||||
      file->index = f->len;
 | 
			
		||||
      file->pextension = NULL;
 | 
			
		||||
      file->http_header_included = f->http_header_included;
 | 
			
		||||
#if HTTPD_PRECALCULATED_CHECKSUM
 | 
			
		||||
      file->chksum_count = f->chksum_count;
 | 
			
		||||
      file->chksum = f->chksum;
 | 
			
		||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */
 | 
			
		||||
#if LWIP_HTTPD_FILE_STATE
 | 
			
		||||
      file->state = fs_state_init(file, name);
 | 
			
		||||
#endif /* #if LWIP_HTTPD_FILE_STATE */
 | 
			
		||||
      return file;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  fs_free(file);
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
void
 | 
			
		||||
fs_close(struct fs_file *file)
 | 
			
		||||
{
 | 
			
		||||
#if LWIP_HTTPD_CUSTOM_FILES
 | 
			
		||||
  if (file->is_custom_file) {
 | 
			
		||||
    fs_close_custom(file);
 | 
			
		||||
  }
 | 
			
		||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */
 | 
			
		||||
#if LWIP_HTTPD_FILE_STATE
 | 
			
		||||
  fs_state_free(file, file->state);
 | 
			
		||||
#endif /* #if LWIP_HTTPD_FILE_STATE */
 | 
			
		||||
  fs_free(file);
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
int
 | 
			
		||||
fs_read(struct fs_file *file, char *buffer, int count)
 | 
			
		||||
{
 | 
			
		||||
  int read;
 | 
			
		||||
 | 
			
		||||
  if(file->index == file->len) {
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  read = file->len - file->index;
 | 
			
		||||
  if(read > count) {
 | 
			
		||||
    read = count;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  MEMCPY(buffer, (file->data + file->index), read);
 | 
			
		||||
  file->index += read;
 | 
			
		||||
 | 
			
		||||
  return(read);
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------------------------------*/
 | 
			
		||||
int fs_bytes_left(struct fs_file *file)
 | 
			
		||||
{
 | 
			
		||||
  return file->len - file->index;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,100 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification, 
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __FS_H__
 | 
			
		||||
#define __FS_H__
 | 
			
		||||
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 and provide the functions:
 | 
			
		||||
 * - "int fs_open_custom(struct fs_file *file, const char *name)"
 | 
			
		||||
 *    Called first for every opened file to allow opening files
 | 
			
		||||
 *    that are not included in fsdata(_custom).c
 | 
			
		||||
 * - "void fs_close_custom(struct fs_file *file)"
 | 
			
		||||
 *    Called to free resources allocated by fs_open_custom().
 | 
			
		||||
 */
 | 
			
		||||
#ifndef LWIP_HTTPD_CUSTOM_FILES
 | 
			
		||||
#define LWIP_HTTPD_CUSTOM_FILES       0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 to include an application state argument per file
 | 
			
		||||
 * that is opened. This allows to keep a state per connection/file.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef LWIP_HTTPD_FILE_STATE
 | 
			
		||||
#define LWIP_HTTPD_FILE_STATE         0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for
 | 
			
		||||
 * predefined (MSS-sized) chunks of the files to prevent having to calculate
 | 
			
		||||
 * the checksums at runtime. */
 | 
			
		||||
#ifndef HTTPD_PRECALCULATED_CHECKSUM
 | 
			
		||||
#define HTTPD_PRECALCULATED_CHECKSUM  0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HTTPD_PRECALCULATED_CHECKSUM
 | 
			
		||||
struct fsdata_chksum {
 | 
			
		||||
  u32_t offset;
 | 
			
		||||
  u16_t chksum;
 | 
			
		||||
  u16_t len;
 | 
			
		||||
};
 | 
			
		||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */
 | 
			
		||||
 | 
			
		||||
struct fs_file {
 | 
			
		||||
  const char *data;
 | 
			
		||||
  int len;
 | 
			
		||||
  int index;
 | 
			
		||||
  void *pextension;
 | 
			
		||||
#if HTTPD_PRECALCULATED_CHECKSUM
 | 
			
		||||
  const struct fsdata_chksum *chksum;
 | 
			
		||||
  u16_t chksum_count;
 | 
			
		||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */
 | 
			
		||||
  u8_t http_header_included;
 | 
			
		||||
#if LWIP_HTTPD_CUSTOM_FILES
 | 
			
		||||
  u8_t is_custom_file;
 | 
			
		||||
#endif /* LWIP_HTTPD_CUSTOM_FILES */
 | 
			
		||||
#if LWIP_HTTPD_FILE_STATE
 | 
			
		||||
  void *state;
 | 
			
		||||
#endif /* LWIP_HTTPD_FILE_STATE */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct fs_file *fs_open(const char *name);
 | 
			
		||||
void fs_close(struct fs_file *file);
 | 
			
		||||
int fs_read(struct fs_file *file, char *buffer, int count);
 | 
			
		||||
int fs_bytes_left(struct fs_file *file);
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_FILE_STATE
 | 
			
		||||
/** This user-defined function is called when a file is opened. */
 | 
			
		||||
void *fs_state_init(struct fs_file *file, const char *name);
 | 
			
		||||
/** This user-defined function is called when a file is closed. */
 | 
			
		||||
void fs_state_free(struct fs_file *file, void *state);
 | 
			
		||||
#endif /* #if LWIP_HTTPD_FILE_STATE */
 | 
			
		||||
 | 
			
		||||
#endif /* __FS_H__ */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification, 
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __FSDATA_H__
 | 
			
		||||
#define __FSDATA_H__
 | 
			
		||||
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
#include "fs.h"
 | 
			
		||||
 | 
			
		||||
struct fsdata_file {
 | 
			
		||||
  const struct fsdata_file *next;
 | 
			
		||||
  const unsigned char *name;
 | 
			
		||||
  const unsigned char *data;
 | 
			
		||||
  int len;
 | 
			
		||||
  u8_t http_header_included;
 | 
			
		||||
#if HTTPD_PRECALCULATED_CHECKSUM
 | 
			
		||||
  u16_t chksum_count;
 | 
			
		||||
  const struct fsdata_chksum *chksum;
 | 
			
		||||
#endif /* HTTPD_PRECALCULATED_CHECKSUM */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* __FSDATA_H__ */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,236 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 * This version of the file has been modified by Texas Instruments to offer
 | 
			
		||||
 * simple server-side-include (SSI) and Common Gateway Interface (CGI)
 | 
			
		||||
 * capability.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __HTTPD_H__
 | 
			
		||||
#define __HTTPD_H__
 | 
			
		||||
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
#include "lwip/err.h"
 | 
			
		||||
#include "lwip/pbuf.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 to support CGI */
 | 
			
		||||
#ifndef LWIP_HTTPD_CGI
 | 
			
		||||
#define LWIP_HTTPD_CGI            0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 to support SSI (Server-Side-Includes) */
 | 
			
		||||
#ifndef LWIP_HTTPD_SSI
 | 
			
		||||
#define LWIP_HTTPD_SSI            1     
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 to support HTTP POST */
 | 
			
		||||
#ifndef LWIP_HTTPD_SUPPORT_POST
 | 
			
		||||
#define LWIP_HTTPD_SUPPORT_POST   0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_CGI
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Function pointer for a CGI script handler.
 | 
			
		||||
 *
 | 
			
		||||
 * This function is called each time the HTTPD server is asked for a file
 | 
			
		||||
 * whose name was previously registered as a CGI function using a call to
 | 
			
		||||
 * http_set_cgi_handler. The iIndex parameter provides the index of the
 | 
			
		||||
 * CGI within the ppcURLs array passed to http_set_cgi_handler. Parameters
 | 
			
		||||
 * pcParam and pcValue provide access to the parameters provided along with
 | 
			
		||||
 * the URI. iNumParams provides a count of the entries in the pcParam and
 | 
			
		||||
 * pcValue arrays. Each entry in the pcParam array contains the name of a
 | 
			
		||||
 * parameter with the corresponding entry in the pcValue array containing the
 | 
			
		||||
 * value for that parameter. Note that pcParam may contain multiple elements
 | 
			
		||||
 * with the same name if, for example, a multi-selection list control is used
 | 
			
		||||
 * in the form generating the data.
 | 
			
		||||
 *
 | 
			
		||||
 * The function should return a pointer to a character string which is the
 | 
			
		||||
 * path and filename of the response that is to be sent to the connected
 | 
			
		||||
 * browser, for example "/thanks.htm" or "/response/error.ssi".
 | 
			
		||||
 *
 | 
			
		||||
 * The maximum number of parameters that will be passed to this function via
 | 
			
		||||
 * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming
 | 
			
		||||
 * HTTP request above this number will be discarded.
 | 
			
		||||
 *
 | 
			
		||||
 * Requests intended for use by this CGI mechanism must be sent using the GET
 | 
			
		||||
 * method (which encodes all parameters within the URI rather than in a block
 | 
			
		||||
 * later in the request). Attempts to use the POST method will result in the
 | 
			
		||||
 * request being ignored.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[],
 | 
			
		||||
                             char *pcValue[]);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Structure defining the base filename (URL) of a CGI and the associated
 | 
			
		||||
 * function which is to be called when that URL is requested.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
    const char *pcCGIName;
 | 
			
		||||
    tCGIHandler pfnCGIHandler;
 | 
			
		||||
} tCGI;
 | 
			
		||||
 | 
			
		||||
void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* The maximum number of parameters that the CGI handler can be sent. */
 | 
			
		||||
#ifndef LWIP_HTTPD_MAX_CGI_PARAMETERS
 | 
			
		||||
#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* LWIP_HTTPD_CGI */
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_SSI
 | 
			
		||||
 | 
			
		||||
/** LWIP_HTTPD_SSI_MULTIPART==1: SSI handler function is called with 2 more
 | 
			
		||||
 * arguments indicating a counter for insert string that are too long to be
 | 
			
		||||
 * inserted at once: the SSI handler function must then set 'next_tag_part'
 | 
			
		||||
 * which will be passed back to it in the next call. */
 | 
			
		||||
#ifndef LWIP_HTTPD_SSI_MULTIPART
 | 
			
		||||
#define LWIP_HTTPD_SSI_MULTIPART    0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Function pointer for the SSI tag handler callback.
 | 
			
		||||
 *
 | 
			
		||||
 * This function will be called each time the HTTPD server detects a tag of the
 | 
			
		||||
 * form <!--#name--> in a .shtml, .ssi or .shtm file where "name" appears as
 | 
			
		||||
 * one of the tags supplied to http_set_ssi_handler in the ppcTags array.  The
 | 
			
		||||
 * returned insert string, which will be appended after the the string
 | 
			
		||||
 * "<!--#name-->" in file sent back to the client,should be written to pointer
 | 
			
		||||
 * pcInsert.  iInsertLen contains the size of the buffer pointed to by
 | 
			
		||||
 * pcInsert.  The iIndex parameter provides the zero-based index of the tag as
 | 
			
		||||
 * found in the ppcTags array and identifies the tag that is to be processed.
 | 
			
		||||
 *
 | 
			
		||||
 * The handler returns the number of characters written to pcInsert excluding
 | 
			
		||||
 * any terminating NULL or a negative number to indicate a failure (tag not
 | 
			
		||||
 * recognized, for example).
 | 
			
		||||
 *
 | 
			
		||||
 * Note that the behavior of this SSI mechanism is somewhat different from the
 | 
			
		||||
 * "normal" SSI processing as found in, for example, the Apache web server.  In
 | 
			
		||||
 * this case, the inserted text is appended following the SSI tag rather than
 | 
			
		||||
 * replacing the tag entirely.  This allows for an implementation that does not
 | 
			
		||||
 * require significant additional buffering of output data yet which will still
 | 
			
		||||
 * offer usable SSI functionality.  One downside to this approach is when
 | 
			
		||||
 * attempting to use SSI within JavaScript.  The SSI tag is structured to
 | 
			
		||||
 * resemble an HTML comment but this syntax does not constitute a comment
 | 
			
		||||
 * within JavaScript and, hence, leaving the tag in place will result in
 | 
			
		||||
 * problems in these cases.  To work around this, any SSI tag which needs to
 | 
			
		||||
 * output JavaScript code must do so in an encapsulated way, sending the whole
 | 
			
		||||
 * HTML <script>...</script> section as a single include.
 | 
			
		||||
 */
 | 
			
		||||
typedef u16_t (*tSSIHandler)(int iIndex, char *pcInsert, int iInsertLen
 | 
			
		||||
#if LWIP_HTTPD_SSI_MULTIPART
 | 
			
		||||
                             , u16_t current_tag_part, u16_t *next_tag_part
 | 
			
		||||
#endif /* LWIP_HTTPD_SSI_MULTIPART */
 | 
			
		||||
#if LWIP_HTTPD_FILE_STATE
 | 
			
		||||
                             , void *connection_state
 | 
			
		||||
#endif /* LWIP_HTTPD_FILE_STATE */
 | 
			
		||||
                             );
 | 
			
		||||
 | 
			
		||||
void http_set_ssi_handler(tSSIHandler pfnSSIHandler,
 | 
			
		||||
                          const char **ppcTags, int iNumTags);
 | 
			
		||||
 | 
			
		||||
/* The maximum length of the string comprising the tag name */
 | 
			
		||||
#ifndef LWIP_HTTPD_MAX_TAG_NAME_LEN
 | 
			
		||||
#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* The maximum length of string that can be returned to replace any given tag */
 | 
			
		||||
#ifndef LWIP_HTTPD_MAX_TAG_INSERT_LEN
 | 
			
		||||
#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* LWIP_HTTPD_SSI */
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_SUPPORT_POST
 | 
			
		||||
 | 
			
		||||
/* These functions must be implemented by the application */
 | 
			
		||||
 | 
			
		||||
/** Called when a POST request has been received. The application can decide
 | 
			
		||||
 * whether to accept it or not.
 | 
			
		||||
 *
 | 
			
		||||
 * @param connection Unique connection identifier, valid until httpd_post_end
 | 
			
		||||
 *        is called.
 | 
			
		||||
 * @param uri The HTTP header URI receiving the POST request.
 | 
			
		||||
 * @param http_request The raw HTTP request (the first packet, normally).
 | 
			
		||||
 * @param http_request_len Size of 'http_request'.
 | 
			
		||||
 * @param content_len Content-Length from HTTP header.
 | 
			
		||||
 * @param response_uri Filename of response file, to be filled when denying the
 | 
			
		||||
 *        request
 | 
			
		||||
 * @param response_uri_len Size of the 'response_uri' buffer.
 | 
			
		||||
 * @param post_auto_wnd Set this to 0 to let the callback code handle window
 | 
			
		||||
 *        updates by calling 'httpd_post_data_recved' (to throttle rx speed)
 | 
			
		||||
 *        default is 1 (httpd handles window updates automatically)
 | 
			
		||||
 * @return ERR_OK: Accept the POST request, data may be passed in
 | 
			
		||||
 *         another err_t: Deny the POST request, send back 'bad request'.
 | 
			
		||||
 */
 | 
			
		||||
err_t httpd_post_begin(void *connection, const char *uri, const char *http_request,
 | 
			
		||||
                       u16_t http_request_len, int content_len, char *response_uri,
 | 
			
		||||
                       u16_t response_uri_len, u8_t *post_auto_wnd);
 | 
			
		||||
 | 
			
		||||
/** Called for each pbuf of data that has been received for a POST.
 | 
			
		||||
 * ATTENTION: The application is responsible for freeing the pbufs passed in!
 | 
			
		||||
 *
 | 
			
		||||
 * @param connection Unique connection identifier.
 | 
			
		||||
 * @param p Received data.
 | 
			
		||||
 * @return ERR_OK: Data accepted.
 | 
			
		||||
 *         another err_t: Data denied, http_post_get_response_uri will be called.
 | 
			
		||||
 */
 | 
			
		||||
err_t httpd_post_receive_data(void *connection, struct pbuf *p);
 | 
			
		||||
 | 
			
		||||
/** Called when all data is received or when the connection is closed.
 | 
			
		||||
 * The application must return the filename/URI of a file to send in response
 | 
			
		||||
 * to this POST request. If the response_uri buffer is untouched, a 404
 | 
			
		||||
 * response is returned.
 | 
			
		||||
 *
 | 
			
		||||
 * @param connection Unique connection identifier.
 | 
			
		||||
 * @param response_uri Filename of response file, to be filled when denying the request
 | 
			
		||||
 * @param response_uri_len Size of the 'response_uri' buffer.
 | 
			
		||||
 */
 | 
			
		||||
void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len);
 | 
			
		||||
 | 
			
		||||
#ifndef LWIP_HTTPD_POST_MANUAL_WND
 | 
			
		||||
#define LWIP_HTTPD_POST_MANUAL_WND  0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_POST_MANUAL_WND
 | 
			
		||||
void httpd_post_data_recved(void *connection, u16_t recved_len);
 | 
			
		||||
#endif /* LWIP_HTTPD_POST_MANUAL_WND */
 | 
			
		||||
 | 
			
		||||
#endif /* LWIP_HTTPD_SUPPORT_POST */
 | 
			
		||||
 | 
			
		||||
void httpd_init(void);
 | 
			
		||||
 | 
			
		||||
#endif /* __HTTPD_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,115 @@
 | 
			
		|||
#ifndef __HTTPD_STRUCTS_H__
 | 
			
		||||
#define __HTTPD_STRUCTS_H__
 | 
			
		||||
 | 
			
		||||
#include "httpd.h"
 | 
			
		||||
 | 
			
		||||
/** This string is passed in the HTTP header as "Server: " */
 | 
			
		||||
#ifndef HTTPD_SERVER_AGENT
 | 
			
		||||
#define HTTPD_SERVER_AGENT "lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** Set this to 1 if you want to include code that creates HTTP headers
 | 
			
		||||
 * at runtime. Default is off: HTTP headers are then created statically
 | 
			
		||||
 * by the makefsdata tool. Static headers mean smaller code size, but
 | 
			
		||||
 * the (readonly) fsdata will grow a bit as every file includes the HTTP
 | 
			
		||||
 * header. */
 | 
			
		||||
#ifndef LWIP_HTTPD_DYNAMIC_HEADERS
 | 
			
		||||
#define LWIP_HTTPD_DYNAMIC_HEADERS 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if LWIP_HTTPD_DYNAMIC_HEADERS
 | 
			
		||||
/** This struct is used for a list of HTTP header strings for various
 | 
			
		||||
 * filename extensions. */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  const char *extension;
 | 
			
		||||
  int headerIndex;
 | 
			
		||||
} tHTTPHeader;
 | 
			
		||||
 | 
			
		||||
/** A list of strings used in HTTP headers */
 | 
			
		||||
static const char * const g_psHTTPHeaderStrings[] =
 | 
			
		||||
{
 | 
			
		||||
 "Content-type: text/html\r\n\r\n",
 | 
			
		||||
 "Content-type: text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache\r\n\r\n",
 | 
			
		||||
 "Content-type: image/gif\r\n\r\n",
 | 
			
		||||
 "Content-type: image/png\r\n\r\n",
 | 
			
		||||
 "Content-type: image/jpeg\r\n\r\n",
 | 
			
		||||
 "Content-type: image/bmp\r\n\r\n",
 | 
			
		||||
 "Content-type: image/x-icon\r\n\r\n",
 | 
			
		||||
 "Content-type: application/octet-stream\r\n\r\n",
 | 
			
		||||
 "Content-type: application/x-javascript\r\n\r\n",
 | 
			
		||||
 "Content-type: application/x-javascript\r\n\r\n",
 | 
			
		||||
 "Content-type: text/css\r\n\r\n",
 | 
			
		||||
 "Content-type: application/x-shockwave-flash\r\n\r\n",
 | 
			
		||||
 "Content-type: text/xml\r\n\r\n",
 | 
			
		||||
 "Content-type: text/plain\r\n\r\n",
 | 
			
		||||
 "HTTP/1.0 200 OK\r\n",
 | 
			
		||||
 "HTTP/1.0 404 File not found\r\n",
 | 
			
		||||
 "HTTP/1.0 400 Bad Request\r\n",
 | 
			
		||||
 "HTTP/1.0 501 Not Implemented\r\n",
 | 
			
		||||
 "HTTP/1.1 200 OK\r\n",
 | 
			
		||||
 "HTTP/1.1 404 File not found\r\n",
 | 
			
		||||
 "HTTP/1.1 400 Bad Request\r\n",
 | 
			
		||||
 "HTTP/1.1 501 Not Implemented\r\n",
 | 
			
		||||
 "Content-Length: ",
 | 
			
		||||
 "Connection: Close\r\n",
 | 
			
		||||
 "Server: "HTTPD_SERVER_AGENT"\r\n",
 | 
			
		||||
 "\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Indexes into the g_psHTTPHeaderStrings array */
 | 
			
		||||
#define HTTP_HDR_HTML           0  /* text/html */
 | 
			
		||||
#define HTTP_HDR_SSI            1  /* text/html Expires... */
 | 
			
		||||
#define HTTP_HDR_GIF            2  /* image/gif */
 | 
			
		||||
#define HTTP_HDR_PNG            3  /* image/png */
 | 
			
		||||
#define HTTP_HDR_JPG            4  /* image/jpeg */
 | 
			
		||||
#define HTTP_HDR_BMP            5  /* image/bmp */
 | 
			
		||||
#define HTTP_HDR_ICO            6  /* image/x-icon */
 | 
			
		||||
#define HTTP_HDR_APP            7  /* application/octet-stream */
 | 
			
		||||
#define HTTP_HDR_JS             8  /* application/x-javascript */
 | 
			
		||||
#define HTTP_HDR_RA             9  /* application/x-javascript */
 | 
			
		||||
#define HTTP_HDR_CSS            10 /* text/css */
 | 
			
		||||
#define HTTP_HDR_SWF            11 /* application/x-shockwave-flash */
 | 
			
		||||
#define HTTP_HDR_XML            12 /* text/xml */
 | 
			
		||||
#define HTTP_HDR_DEFAULT_TYPE   13 /* text/plain */
 | 
			
		||||
#define HTTP_HDR_OK             14 /* 200 OK */
 | 
			
		||||
#define HTTP_HDR_NOT_FOUND      15 /* 404 File not found */
 | 
			
		||||
#define HTTP_HDR_BAD_REQUEST    16 /* 400 Bad request */
 | 
			
		||||
#define HTTP_HDR_NOT_IMPL       17 /* 501 Not Implemented */
 | 
			
		||||
#define HTTP_HDR_OK_11          18 /* 200 OK */
 | 
			
		||||
#define HTTP_HDR_NOT_FOUND_11   19 /* 404 File not found */
 | 
			
		||||
#define HTTP_HDR_BAD_REQUEST_11 20 /* 400 Bad request */
 | 
			
		||||
#define HTTP_HDR_NOT_IMPL_11    21 /* 501 Not Implemented */
 | 
			
		||||
#define HTTP_HDR_CONTENT_LENGTH 22 /* Content-Length: (HTTP 1.1)*/
 | 
			
		||||
#define HTTP_HDR_CONN_CLOSE     23 /* Connection: Close (HTTP 1.1) */
 | 
			
		||||
#define HTTP_HDR_SERVER         24 /* Server: HTTPD_SERVER_AGENT */
 | 
			
		||||
#define DEFAULT_404_HTML        25 /* default 404 body */
 | 
			
		||||
 | 
			
		||||
/** A list of extension-to-HTTP header strings */
 | 
			
		||||
const static tHTTPHeader g_psHTTPHeaders[] =
 | 
			
		||||
{
 | 
			
		||||
 { "html", HTTP_HDR_HTML},
 | 
			
		||||
 { "htm",  HTTP_HDR_HTML},
 | 
			
		||||
 { "shtml",HTTP_HDR_SSI},
 | 
			
		||||
 { "shtm", HTTP_HDR_SSI},
 | 
			
		||||
 { "ssi",  HTTP_HDR_SSI},
 | 
			
		||||
 { "gif",  HTTP_HDR_GIF},
 | 
			
		||||
 { "png",  HTTP_HDR_PNG},
 | 
			
		||||
 { "jpg",  HTTP_HDR_JPG},
 | 
			
		||||
 { "bmp",  HTTP_HDR_BMP},
 | 
			
		||||
 { "ico",  HTTP_HDR_ICO},
 | 
			
		||||
 { "class",HTTP_HDR_APP},
 | 
			
		||||
 { "cls",  HTTP_HDR_APP},
 | 
			
		||||
 { "js",   HTTP_HDR_JS},
 | 
			
		||||
 { "ram",  HTTP_HDR_RA},
 | 
			
		||||
 { "css",  HTTP_HDR_CSS},
 | 
			
		||||
 { "swf",  HTTP_HDR_SWF},
 | 
			
		||||
 { "xml",  HTTP_HDR_XML}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define NUM_HTTP_HEADERS (sizeof(g_psHTTPHeaders) / sizeof(tHTTPHeader))
 | 
			
		||||
 | 
			
		||||
#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
 | 
			
		||||
 | 
			
		||||
#endif /* __HTTPD_STRUCTS_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
 | 
			
		||||
Microsoft Visual Studio Solution File, Format Version 11.00
 | 
			
		||||
# Visual C++ Express 2010
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MakeFSData_proj", "MakeFSData_proj.vcxproj", "{31A9131E-BD1E-4F2D-8E1F-BC8E679E0368}"
 | 
			
		||||
EndProject
 | 
			
		||||
Global
 | 
			
		||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
			
		||||
		Debug|Win32 = Debug|Win32
 | 
			
		||||
		Release|Win32 = Release|Win32
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 | 
			
		||||
		{31A9131E-BD1E-4F2D-8E1F-BC8E679E0368}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
			
		||||
		{31A9131E-BD1E-4F2D-8E1F-BC8E679E0368}.Debug|Win32.Build.0 = Debug|Win32
 | 
			
		||||
		{31A9131E-BD1E-4F2D-8E1F-BC8E679E0368}.Release|Win32.ActiveCfg = Release|Win32
 | 
			
		||||
		{31A9131E-BD1E-4F2D-8E1F-BC8E679E0368}.Release|Win32.Build.0 = Release|Win32
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(SolutionProperties) = preSolution
 | 
			
		||||
		HideSolutionNode = FALSE
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
EndGlobal
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,91 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup Label="ProjectConfigurations">
 | 
			
		||||
    <ProjectConfiguration Include="Debug|Win32">
 | 
			
		||||
      <Configuration>Debug</Configuration>
 | 
			
		||||
      <Platform>Win32</Platform>
 | 
			
		||||
    </ProjectConfiguration>
 | 
			
		||||
    <ProjectConfiguration Include="Release|Win32">
 | 
			
		||||
      <Configuration>Release</Configuration>
 | 
			
		||||
      <Platform>Win32</Platform>
 | 
			
		||||
    </ProjectConfiguration>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <PropertyGroup Label="Globals">
 | 
			
		||||
    <ProjectGuid>{31A9131E-BD1E-4F2D-8E1F-BC8E679E0368}</ProjectGuid>
 | 
			
		||||
    <Keyword>Win32Proj</Keyword>
 | 
			
		||||
    <RootNamespace>MakeFSData_proj</RootNamespace>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
			
		||||
    <ConfigurationType>Application</ConfigurationType>
 | 
			
		||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
			
		||||
    <CharacterSet>Unicode</CharacterSet>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
			
		||||
    <ConfigurationType>Application</ConfigurationType>
 | 
			
		||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
			
		||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
			
		||||
    <CharacterSet>Unicode</CharacterSet>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
			
		||||
  <ImportGroup Label="ExtensionSettings">
 | 
			
		||||
  </ImportGroup>
 | 
			
		||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
			
		||||
  </ImportGroup>
 | 
			
		||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
			
		||||
  </ImportGroup>
 | 
			
		||||
  <PropertyGroup Label="UserMacros" />
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <LinkIncremental>true</LinkIncremental>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <LinkIncremental>false</LinkIncremental>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
			
		||||
    <ClCompile>
 | 
			
		||||
      <PrecompiledHeader>
 | 
			
		||||
      </PrecompiledHeader>
 | 
			
		||||
      <WarningLevel>Level3</WarningLevel>
 | 
			
		||||
      <Optimization>Disabled</Optimization>
 | 
			
		||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
			
		||||
      <AdditionalIncludeDirectories>$(LWIP_DIR)\src\include;$(LWIP_DIR)\..\contrib-1.4.0\ports\win32\include;$(LWIP_DIR)\src\include\ipv4</AdditionalIncludeDirectories>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <Link>
 | 
			
		||||
      <SubSystem>Console</SubSystem>
 | 
			
		||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
			
		||||
    </Link>
 | 
			
		||||
  </ItemDefinitionGroup>
 | 
			
		||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
			
		||||
    <ClCompile>
 | 
			
		||||
      <WarningLevel>Level3</WarningLevel>
 | 
			
		||||
      <PrecompiledHeader>
 | 
			
		||||
      </PrecompiledHeader>
 | 
			
		||||
      <Optimization>MaxSpeed</Optimization>
 | 
			
		||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
			
		||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
			
		||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <Link>
 | 
			
		||||
      <SubSystem>Console</SubSystem>
 | 
			
		||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
			
		||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
			
		||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
			
		||||
    </Link>
 | 
			
		||||
  </ItemDefinitionGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <None Include="ReadMe.txt" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="stdafx.h" />
 | 
			
		||||
    <ClInclude Include="targetver.h" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="makefsdata.c" />
 | 
			
		||||
    <ClCompile Include="stdafx.cpp" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
			
		||||
  <ImportGroup Label="ExtensionTargets">
 | 
			
		||||
  </ImportGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Filter Include="Source Files">
 | 
			
		||||
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Header Files">
 | 
			
		||||
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
    <Filter Include="Resource Files">
 | 
			
		||||
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
 | 
			
		||||
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
 | 
			
		||||
    </Filter>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <None Include="ReadMe.txt" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="stdafx.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="targetver.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="stdafx.cpp">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="makefsdata.c">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
			
		||||
</Project>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
<html>
 | 
			
		||||
<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
 | 
			
		||||
<body bgcolor="white" text="black">
 | 
			
		||||
 | 
			
		||||
    <table width="100%">
 | 
			
		||||
      <tr valign="top"><td width="80">	  
 | 
			
		||||
	  <a href="http://www.sics.se/"><img src="/img/sics.gif"
 | 
			
		||||
	  border="0" alt="SICS logo" title="SICS logo"></a>
 | 
			
		||||
	</td><td width="500">	  
 | 
			
		||||
	  <h1>lwIP - A Lightweight TCP/IP Stack</h1>
 | 
			
		||||
	  <h2>404 - Page not found</h2>
 | 
			
		||||
	  <p>
 | 
			
		||||
	    Sorry, the page you are requesting was not found on this
 | 
			
		||||
	    server. 
 | 
			
		||||
	  </p>
 | 
			
		||||
	</td><td>
 | 
			
		||||
	   
 | 
			
		||||
	</td></tr>
 | 
			
		||||
      </table>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 | 
			
		||||
<html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>FreeRTOS.org lwIP WEB server demo</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <BODY onLoad="window.setTimeout("location.href='index.shtml'",2000)">
 | 
			
		||||
<font face="arial">
 | 
			
		||||
<a href="index.shtml">Task Stats</a> <b>|</b> <a href="runtime.shtml">Run Time Stats</a> <b>|</b> <a href="http://www.freertos.org/">FreeRTOS Homepage</a> <b>|</b> <a href="logo.jpg">37K jpg</a>
 | 
			
		||||
<br><p>
 | 
			
		||||
<hr>
 | 
			
		||||
<br><p>
 | 
			
		||||
<h2>Task statistics</h2>
 | 
			
		||||
Page will refresh every 2 seconds.<p>
 | 
			
		||||
<font face="courier"><pre>Task          State  Priority  Stack	#<br>************************************************<br>
 | 
			
		||||
<!--#rtos_stats-->
 | 
			
		||||
</pre></font>
 | 
			
		||||
</font>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 28 KiB  | 
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 | 
			
		||||
<html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>FreeRTOS.org lwIP WEB server demo</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <BODY onLoad="window.setTimeout("location.href='runtime.shtml'",2000)">
 | 
			
		||||
<font face="arial">
 | 
			
		||||
<a href="index.shtml">Task Stats</a> <b>|</b> <a href="runtime.shtml">Run Time Stats</a> <b>|</b> <a href="http://www.freertos.org/">FreeRTOS Homepage</a> <b>|</b> <a href="logo.jpg">37K jpg</a>
 | 
			
		||||
<br><p>
 | 
			
		||||
<hr>
 | 
			
		||||
<br><p>
 | 
			
		||||
<h2>Run-time statistics</h2>
 | 
			
		||||
Page will refresh every 2 seconds.<p>
 | 
			
		||||
<font face="courier"><pre>Task            Abs Time      % Time<br>****************************************<br>
 | 
			
		||||
<!--#run_stats-->
 | 
			
		||||
</pre></font>
 | 
			
		||||
</font>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
#!/usr/bin/perl
 | 
			
		||||
 | 
			
		||||
open(OUTPUT, "> fsdata.c");
 | 
			
		||||
 | 
			
		||||
chdir("fs");
 | 
			
		||||
open(FILES, "find . -type f |");
 | 
			
		||||
 | 
			
		||||
while($file = <FILES>) {
 | 
			
		||||
 | 
			
		||||
    # Do not include files in CVS directories nor backup files.
 | 
			
		||||
    if($file =~ /(CVS|~)/) {
 | 
			
		||||
    	next;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    chop($file);
 | 
			
		||||
    
 | 
			
		||||
    open(HEADER, "> /tmp/header") || die $!;
 | 
			
		||||
    if($file =~ /404/) {
 | 
			
		||||
	print(HEADER "HTTP/1.0 404 File not found\r\n");
 | 
			
		||||
    } else {
 | 
			
		||||
	print(HEADER "HTTP/1.0 200 OK\r\n");
 | 
			
		||||
    }
 | 
			
		||||
    print(HEADER "Server: lwIP/pre-0.6 (http://www.sics.se/~adam/lwip/)\r\n");
 | 
			
		||||
    if($file =~ /\.html$/) {
 | 
			
		||||
	print(HEADER "Content-type: text/html\r\n");
 | 
			
		||||
    } elsif($file =~ /\.gif$/) {
 | 
			
		||||
	print(HEADER "Content-type: image/gif\r\n");
 | 
			
		||||
    } elsif($file =~ /\.png$/) {
 | 
			
		||||
	print(HEADER "Content-type: image/png\r\n");
 | 
			
		||||
    } elsif($file =~ /\.jpg$/) {
 | 
			
		||||
	print(HEADER "Content-type: image/jpeg\r\n");
 | 
			
		||||
    } elsif($file =~ /\.class$/) {
 | 
			
		||||
	print(HEADER "Content-type: application/octet-stream\r\n");
 | 
			
		||||
    } elsif($file =~ /\.ram$/) {
 | 
			
		||||
	print(HEADER "Content-type: audio/x-pn-realaudio\r\n");    
 | 
			
		||||
    } else {
 | 
			
		||||
	print(HEADER "Content-type: text/plain\r\n");
 | 
			
		||||
    }
 | 
			
		||||
    print(HEADER "\r\n");
 | 
			
		||||
    close(HEADER);
 | 
			
		||||
 | 
			
		||||
    unless($file =~ /\.plain$/ || $file =~ /cgi/) {
 | 
			
		||||
	system("cat /tmp/header $file > /tmp/file");
 | 
			
		||||
    } else {
 | 
			
		||||
	system("cp $file /tmp/file");
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    open(FILE, "/tmp/file");
 | 
			
		||||
    unlink("/tmp/file");
 | 
			
		||||
    unlink("/tmp/header");
 | 
			
		||||
 | 
			
		||||
    $file =~ s/\.//;
 | 
			
		||||
    $fvar = $file;
 | 
			
		||||
    $fvar =~ s-/-_-g;
 | 
			
		||||
    $fvar =~ s-\.-_-g;
 | 
			
		||||
    print(OUTPUT "static const unsigned char data".$fvar."[] = {\n");
 | 
			
		||||
    print(OUTPUT "\t/* $file */\n\t");
 | 
			
		||||
    for($j = 0; $j < length($file); $j++) {
 | 
			
		||||
	printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1)));
 | 
			
		||||
    }
 | 
			
		||||
    printf(OUTPUT "0,\n");
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    $i = 0;
 | 
			
		||||
    while(read(FILE, $data, 1)) {
 | 
			
		||||
        if($i == 0) {
 | 
			
		||||
            print(OUTPUT "\t");
 | 
			
		||||
        }
 | 
			
		||||
        printf(OUTPUT "%#02x, ", unpack("C", $data));
 | 
			
		||||
        $i++;
 | 
			
		||||
        if($i == 10) {
 | 
			
		||||
            print(OUTPUT "\n");
 | 
			
		||||
            $i = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    print(OUTPUT "};\n\n");
 | 
			
		||||
    close(FILE);
 | 
			
		||||
    push(@fvars, $fvar);
 | 
			
		||||
    push(@files, $file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for($i = 0; $i < @fvars; $i++) {
 | 
			
		||||
    $file = $files[$i];
 | 
			
		||||
    $fvar = $fvars[$i];
 | 
			
		||||
 | 
			
		||||
    if($i == 0) {
 | 
			
		||||
        $prevfile = "NULL";
 | 
			
		||||
    } else {
 | 
			
		||||
        $prevfile = "file" . $fvars[$i - 1];
 | 
			
		||||
    }
 | 
			
		||||
    print(OUTPUT "const struct fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, ");
 | 
			
		||||
    print(OUTPUT "data$fvar + ". (length($file) + 1) .", ");
 | 
			
		||||
    print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print(OUTPUT "#define FS_ROOT file$fvars[$i - 1]\n\n");
 | 
			
		||||
print(OUTPUT "#define FS_NUMFILES $i\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,610 @@
 | 
			
		|||
/**
 | 
			
		||||
 * makefsdata: Converts a directory structure for use with the lwIP httpd.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Jim Pettinato
 | 
			
		||||
 *         Simon Goldschmidt
 | 
			
		||||
 *
 | 
			
		||||
 * @todo:
 | 
			
		||||
 * - take TCP_MSS, LWIP_TCP_TIMESTAMPS and
 | 
			
		||||
 *   PAYLOAD_ALIGN_TYPE/PAYLOAD_ALIGNMENT as arguments
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
#define WIN32_LEAN_AND_MEAN
 | 
			
		||||
#include "windows.h"
 | 
			
		||||
#else
 | 
			
		||||
#include <dir.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <dos.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/* Compatibility defines Win32 vs. DOS */
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
 | 
			
		||||
#define FIND_T                        WIN32_FIND_DATAA
 | 
			
		||||
#define FIND_T_FILENAME(fInfo)        (fInfo.cFileName)
 | 
			
		||||
#define FIND_T_IS_DIR(fInfo)          ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
 | 
			
		||||
#define FIND_T_IS_FILE(fInfo)         ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
 | 
			
		||||
#define FIND_RET_T                    HANDLE
 | 
			
		||||
#define FINDFIRST_FILE(path, result)  FindFirstFileA(path, result)
 | 
			
		||||
#define FINDFIRST_DIR(path, result)   FindFirstFileA(path, result)
 | 
			
		||||
#define FINDNEXT(ff_res, result)      FindNextFileA(ff_res, result)
 | 
			
		||||
#define FINDFIRST_SUCCEEDED(ret)      (ret != INVALID_HANDLE_VALUE)
 | 
			
		||||
#define FINDNEXT_SUCCEEDED(ret)       (ret == TRUE)
 | 
			
		||||
 | 
			
		||||
#define GETCWD(path, len)             GetCurrentDirectoryA(len, path)
 | 
			
		||||
#define CHDIR(path)                   SetCurrentDirectoryA(path)
 | 
			
		||||
 | 
			
		||||
#define NEWLINE     "\r\n"
 | 
			
		||||
#define NEWLINE_LEN 2
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define FIND_T                        struct fflbk
 | 
			
		||||
#define FIND_T_FILENAME(fInfo)        (fInfo.ff_name)
 | 
			
		||||
#define FIND_T_IS_DIR(fInfo)          ((fInfo.ff_attrib & FA_DIREC) == FA_DIREC)
 | 
			
		||||
#define FIND_T_IS_FILE(fInfo)         (1)
 | 
			
		||||
#define FIND_RET_T                    int
 | 
			
		||||
#define FINDFIRST_FILE(path, result)  findfirst(path, result, FA_ARCH)
 | 
			
		||||
#define FINDFIRST_DIR(path, result)   findfirst(path, result, FA_DIREC)
 | 
			
		||||
#define FINDNEXT(ff_res, result)      FindNextFileA(ff_res, result)
 | 
			
		||||
#define FINDFIRST_SUCCEEDED(ret)      (ret == 0)
 | 
			
		||||
#define FINDNEXT_SUCCEEDED(ret)       (ret == 0)
 | 
			
		||||
 | 
			
		||||
#define GETCWD(path, len)             getcwd(path, len)
 | 
			
		||||
#define CHDIR(path)                   chdir(path)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* define this to get the header variables we use to build HTTP headers */
 | 
			
		||||
#define LWIP_HTTPD_DYNAMIC_HEADERS 1
 | 
			
		||||
#include "../httpd_structs.h"
 | 
			
		||||
 | 
			
		||||
#include "../../../lwip-1.4.0/src/core/ipv4/inet_chksum.c"
 | 
			
		||||
#include "../../../lwip-1.4.0/src/core/def.c"
 | 
			
		||||
 | 
			
		||||
/** (Your server name here) */
 | 
			
		||||
const char *serverID = "Server: "HTTPD_SERVER_AGENT"\r\n";
 | 
			
		||||
 | 
			
		||||
/* change this to suit your MEM_ALIGNMENT */
 | 
			
		||||
#define PAYLOAD_ALIGNMENT 4
 | 
			
		||||
/* set this to 0 to prevent aligning payload */
 | 
			
		||||
#define ALIGN_PAYLOAD 1
 | 
			
		||||
/* define this to a type that has the required alignment */
 | 
			
		||||
#define PAYLOAD_ALIGN_TYPE "unsigned int"
 | 
			
		||||
static int payload_alingment_dummy_counter = 0;
 | 
			
		||||
 | 
			
		||||
#define HEX_BYTES_PER_LINE 16
 | 
			
		||||
 | 
			
		||||
#define MAX_PATH_LEN 256
 | 
			
		||||
 | 
			
		||||
#define COPY_BUFSIZE 10240
 | 
			
		||||
 | 
			
		||||
int process_sub(FILE *data_file, FILE *struct_file);
 | 
			
		||||
int process_file(FILE *data_file, FILE *struct_file, const char *filename);
 | 
			
		||||
int file_write_http_header(FILE *data_file, const char *filename, int file_size,
 | 
			
		||||
                           u16_t *http_hdr_len, u16_t *http_hdr_chksum);
 | 
			
		||||
int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i);
 | 
			
		||||
int s_put_ascii(char *buf, const char *ascii_string, int len, int *i);
 | 
			
		||||
void concat_files(const char *file1, const char *file2, const char *targetfile);
 | 
			
		||||
 | 
			
		||||
static unsigned char file_buffer_raw[COPY_BUFSIZE];
 | 
			
		||||
/* 5 bytes per char + 3 bytes per line */
 | 
			
		||||
static char file_buffer_c[COPY_BUFSIZE * 5 + ((COPY_BUFSIZE / HEX_BYTES_PER_LINE) * 3)];
 | 
			
		||||
 | 
			
		||||
char curSubdir[MAX_PATH_LEN];
 | 
			
		||||
char lastFileVar[MAX_PATH_LEN];
 | 
			
		||||
char hdr_buf[4096];
 | 
			
		||||
 | 
			
		||||
unsigned char processSubs = 1;
 | 
			
		||||
unsigned char includeHttpHeader = 1;
 | 
			
		||||
unsigned char useHttp11 = 0;
 | 
			
		||||
unsigned char precalcChksum = 0;
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  FIND_T fInfo;
 | 
			
		||||
  FIND_RET_T fret;
 | 
			
		||||
  char path[MAX_PATH_LEN];
 | 
			
		||||
  char appPath[MAX_PATH_LEN];
 | 
			
		||||
  FILE *data_file;
 | 
			
		||||
  FILE *struct_file;
 | 
			
		||||
  int filesProcessed;
 | 
			
		||||
  int i;
 | 
			
		||||
  char targetfile[MAX_PATH_LEN];
 | 
			
		||||
  strcpy(targetfile, "fsdata.c");
 | 
			
		||||
 | 
			
		||||
  memset(path, 0, sizeof(path));
 | 
			
		||||
  memset(appPath, 0, sizeof(appPath));
 | 
			
		||||
 | 
			
		||||
  printf(NEWLINE " makefsdata - HTML to C source converter" NEWLINE);
 | 
			
		||||
  printf("     by Jim Pettinato               - circa 2003 " NEWLINE);
 | 
			
		||||
  printf("     extended by Simon Goldschmidt  - 2009 " NEWLINE NEWLINE);
 | 
			
		||||
 | 
			
		||||
  strcpy(path, "fs");
 | 
			
		||||
  for(i = 1; i < argc; i++) {
 | 
			
		||||
    if (argv[i][0] == '-') {
 | 
			
		||||
      if (strstr(argv[i], "-s")) {
 | 
			
		||||
        processSubs = 0;
 | 
			
		||||
      } else if (strstr(argv[i], "-e")) {
 | 
			
		||||
        includeHttpHeader = 0;
 | 
			
		||||
      } else if (strstr(argv[i], "-11")) {
 | 
			
		||||
        useHttp11 = 1;
 | 
			
		||||
      } else if (strstr(argv[i], "-c")) {
 | 
			
		||||
        precalcChksum = 1;
 | 
			
		||||
      } else if((argv[i][1] == 'f') && (argv[i][2] == ':')) {
 | 
			
		||||
        strcpy(targetfile, &argv[i][3]);
 | 
			
		||||
        printf("Writing to file \"%s\"\n", targetfile);
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      strcpy(path, argv[i]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* if command line param or subdir named 'fs' not found spout usage verbiage */
 | 
			
		||||
  fret = FINDFIRST_DIR(path, &fInfo);
 | 
			
		||||
  if (!FINDFIRST_SUCCEEDED(fret)) {
 | 
			
		||||
    /* if no subdir named 'fs' (or the one which was given) exists, spout usage verbiage */
 | 
			
		||||
    printf(" Failed to open directory \"%s\"." NEWLINE NEWLINE, path);
 | 
			
		||||
    printf(" Usage: htmlgen [targetdir] [-s] [-i] [-f:<filename>]" NEWLINE NEWLINE);
 | 
			
		||||
    printf("   targetdir: relative or absolute path to files to convert" NEWLINE);
 | 
			
		||||
    printf("   switch -s: toggle processing of subdirectories (default is on)" NEWLINE);
 | 
			
		||||
    printf("   switch -e: exclude HTTP header from file (header is created at runtime, default is off)" NEWLINE);
 | 
			
		||||
    printf("   switch -11: include HTTP 1.1 header (1.0 is default)" NEWLINE);
 | 
			
		||||
    printf("   switch -c: precalculate checksums for all pages (default is off)" NEWLINE);
 | 
			
		||||
    printf("   switch -f: target filename (default is \"fsdata.c\")" NEWLINE);
 | 
			
		||||
    printf("   if targetdir not specified, htmlgen will attempt to" NEWLINE);
 | 
			
		||||
    printf("   process files in subdirectory 'fs'" NEWLINE);
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  printf("HTTP %sheader will %s statically included." NEWLINE,
 | 
			
		||||
    (includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""),
 | 
			
		||||
    (includeHttpHeader ? "be" : "not be"));
 | 
			
		||||
 | 
			
		||||
  sprintf(curSubdir, "");  /* start off in web page's root directory - relative paths */
 | 
			
		||||
  printf("  Processing all files in directory %s", path);
 | 
			
		||||
  if (processSubs) {
 | 
			
		||||
    printf(" and subdirectories..." NEWLINE NEWLINE);
 | 
			
		||||
  } else {
 | 
			
		||||
    printf("..." NEWLINE NEWLINE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  GETCWD(appPath, MAX_PATH_LEN);
 | 
			
		||||
  data_file = fopen("fsdata.tmp", "wb");
 | 
			
		||||
  if (data_file == NULL) {
 | 
			
		||||
    printf("Failed to create file \"fsdata.tmp\"\n");
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
  struct_file = fopen("fshdr.tmp", "wb");
 | 
			
		||||
  if (struct_file == NULL) {
 | 
			
		||||
    printf("Failed to create file \"fshdr.tmp\"\n");
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  CHDIR(path);
 | 
			
		||||
 | 
			
		||||
  fprintf(data_file, "#include \"fs.h\"" NEWLINE);
 | 
			
		||||
  fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE);
 | 
			
		||||
  fprintf(data_file, "#include \"fsdata.h\"" NEWLINE NEWLINE NEWLINE);
 | 
			
		||||
 | 
			
		||||
  fprintf(data_file, "#define file_NULL (struct fsdata_file *) NULL" NEWLINE NEWLINE NEWLINE);
 | 
			
		||||
 | 
			
		||||
  sprintf(lastFileVar, "NULL");
 | 
			
		||||
 | 
			
		||||
  filesProcessed = process_sub(data_file, struct_file);
 | 
			
		||||
 | 
			
		||||
  /* data_file now contains all of the raw data.. now append linked list of
 | 
			
		||||
   * file header structs to allow embedded app to search for a file name */
 | 
			
		||||
  fprintf(data_file, NEWLINE NEWLINE);
 | 
			
		||||
  fprintf(struct_file, "#define FS_ROOT file_%s" NEWLINE, lastFileVar);
 | 
			
		||||
  fprintf(struct_file, "#define FS_NUMFILES %d" NEWLINE NEWLINE, filesProcessed);
 | 
			
		||||
 | 
			
		||||
  fclose(data_file);
 | 
			
		||||
  fclose(struct_file);
 | 
			
		||||
 | 
			
		||||
  CHDIR(appPath);
 | 
			
		||||
  /* append struct_file to data_file */
 | 
			
		||||
  printf(NEWLINE "Creating target file..." NEWLINE NEWLINE);
 | 
			
		||||
  concat_files("fsdata.tmp", "fshdr.tmp", targetfile);
 | 
			
		||||
 | 
			
		||||
  /* if succeeded, delete the temporary files */
 | 
			
		||||
  remove("fsdata.tmp");
 | 
			
		||||
  remove("fshdr.tmp"); 
 | 
			
		||||
 | 
			
		||||
  printf(NEWLINE "Processed %d files - done." NEWLINE NEWLINE, filesProcessed);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void copy_file(const char *filename_in, FILE *fout)
 | 
			
		||||
{
 | 
			
		||||
  FILE *fin;
 | 
			
		||||
  size_t len;
 | 
			
		||||
  fin = fopen(filename_in, "rb");
 | 
			
		||||
  if (fin == NULL) {
 | 
			
		||||
    printf("Failed to open file \"%s\"\n", filename_in);
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  while((len = fread(file_buffer_raw, 1, COPY_BUFSIZE, fin)) > 0)
 | 
			
		||||
  {
 | 
			
		||||
    fwrite(file_buffer_raw, 1, len, fout);
 | 
			
		||||
  }
 | 
			
		||||
  fclose(fin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void concat_files(const char *file1, const char *file2, const char *targetfile)
 | 
			
		||||
{
 | 
			
		||||
  FILE *fout;
 | 
			
		||||
  fout = fopen(targetfile, "wb");
 | 
			
		||||
  if (fout == NULL) {
 | 
			
		||||
    printf("Failed to open file \"%s\"\n", targetfile);
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
  copy_file(file1, fout);
 | 
			
		||||
  copy_file(file2, fout);
 | 
			
		||||
  fclose(fout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int process_sub(FILE *data_file, FILE *struct_file)
 | 
			
		||||
{
 | 
			
		||||
  FIND_T fInfo;
 | 
			
		||||
  FIND_RET_T fret;
 | 
			
		||||
  int filesProcessed = 0;
 | 
			
		||||
  char oldSubdir[MAX_PATH_LEN];
 | 
			
		||||
 | 
			
		||||
  if (processSubs) {
 | 
			
		||||
    /* process subs recursively */
 | 
			
		||||
    strcpy(oldSubdir, curSubdir);
 | 
			
		||||
    fret = FINDFIRST_DIR("*", &fInfo);
 | 
			
		||||
    if (FINDFIRST_SUCCEEDED(fret)) {
 | 
			
		||||
      do {
 | 
			
		||||
        const char *curName = FIND_T_FILENAME(fInfo);
 | 
			
		||||
        if (curName == NULL) continue;
 | 
			
		||||
        if (curName[0] == '.') continue;
 | 
			
		||||
        if (strcmp(curName, "CVS") == 0) continue;
 | 
			
		||||
        if (!FIND_T_IS_DIR(fInfo)) continue;
 | 
			
		||||
        CHDIR(curName);
 | 
			
		||||
        strcat(curSubdir, "/");
 | 
			
		||||
        strcat(curSubdir, curName);
 | 
			
		||||
        printf(NEWLINE "processing subdirectory %s/..." NEWLINE, curSubdir);
 | 
			
		||||
        filesProcessed += process_sub(data_file, struct_file);
 | 
			
		||||
        CHDIR("..");
 | 
			
		||||
        strcpy(curSubdir, oldSubdir);
 | 
			
		||||
      } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo)));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fret = FINDFIRST_FILE("*.*", &fInfo);
 | 
			
		||||
  if (FINDFIRST_SUCCEEDED(fret)) {
 | 
			
		||||
    /* at least one file in directory */
 | 
			
		||||
    do {
 | 
			
		||||
      if (FIND_T_IS_FILE(fInfo)) {
 | 
			
		||||
        const char *curName = FIND_T_FILENAME(fInfo);
 | 
			
		||||
        printf("processing %s/%s..." NEWLINE, curSubdir, curName);
 | 
			
		||||
        if (process_file(data_file, struct_file, curName) < 0) {
 | 
			
		||||
          printf(NEWLINE "Error... aborting" NEWLINE);
 | 
			
		||||
          return -1;
 | 
			
		||||
        }
 | 
			
		||||
        filesProcessed++;
 | 
			
		||||
      }
 | 
			
		||||
    } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo)));
 | 
			
		||||
  }
 | 
			
		||||
  return filesProcessed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int get_file_size(const char* filename)
 | 
			
		||||
{
 | 
			
		||||
  FILE *inFile;
 | 
			
		||||
  int file_size = -1;
 | 
			
		||||
  inFile = fopen(filename, "rb");
 | 
			
		||||
  if (inFile == NULL) {
 | 
			
		||||
    printf("Failed to open file \"%s\"\n", filename);
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
  fseek(inFile, 0, SEEK_END);
 | 
			
		||||
  file_size = ftell(inFile);
 | 
			
		||||
  fclose(inFile);
 | 
			
		||||
  return file_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void process_file_data(const char *filename, FILE *data_file)
 | 
			
		||||
{
 | 
			
		||||
  FILE *source_file;
 | 
			
		||||
  size_t len, written, i, src_off=0;
 | 
			
		||||
 | 
			
		||||
  source_file = fopen(filename, "rb");
 | 
			
		||||
 | 
			
		||||
  do {
 | 
			
		||||
    size_t off = 0;
 | 
			
		||||
    len = fread(file_buffer_raw, 1, COPY_BUFSIZE, source_file);
 | 
			
		||||
    if (len > 0) {
 | 
			
		||||
      for (i = 0; i < len; i++) {
 | 
			
		||||
        sprintf(&file_buffer_c[off], "0x%02.2x,", file_buffer_raw[i]);
 | 
			
		||||
        off += 5;
 | 
			
		||||
        if ((++src_off % HEX_BYTES_PER_LINE) == 0) {
 | 
			
		||||
          memcpy(&file_buffer_c[off], NEWLINE, NEWLINE_LEN);
 | 
			
		||||
          off += NEWLINE_LEN;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      written = fwrite(file_buffer_c, 1, off, data_file);
 | 
			
		||||
    }
 | 
			
		||||
  } while(len > 0);
 | 
			
		||||
  fclose(source_file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int write_checksums(FILE *struct_file, const char *filename, const char *varname,
 | 
			
		||||
                    u16_t hdr_len, u16_t hdr_chksum)
 | 
			
		||||
{
 | 
			
		||||
  int chunk_size = TCP_MSS;
 | 
			
		||||
  int offset;
 | 
			
		||||
  size_t len;
 | 
			
		||||
  int i = 0;
 | 
			
		||||
  FILE *f;
 | 
			
		||||
#if LWIP_TCP_TIMESTAMPS
 | 
			
		||||
  /* when timestamps are used, usable space is 12 bytes less per segment */
 | 
			
		||||
  chunk_size -= 12;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE);
 | 
			
		||||
  fprintf(struct_file, "const struct fsdata_chksum chksums_%s[] = {" NEWLINE, varname);
 | 
			
		||||
 | 
			
		||||
  memset(file_buffer_raw, 0xab, sizeof(file_buffer_raw));
 | 
			
		||||
  f = fopen(filename, "rb");
 | 
			
		||||
  if (f == INVALID_HANDLE_VALUE) {
 | 
			
		||||
    printf("Failed to open file \"%s\"\n", filename);
 | 
			
		||||
    exit(-1);
 | 
			
		||||
  }
 | 
			
		||||
  if (hdr_len > 0) {
 | 
			
		||||
    /* add checksum for HTTP header */
 | 
			
		||||
    fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, 0, hdr_chksum, hdr_len);
 | 
			
		||||
    i++;
 | 
			
		||||
  }
 | 
			
		||||
  for (offset = hdr_len; ; offset += len) {
 | 
			
		||||
    unsigned short chksum;
 | 
			
		||||
    len = fread(file_buffer_raw, 1, chunk_size, f);
 | 
			
		||||
    if (len == 0) {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    chksum = ~inet_chksum(file_buffer_raw, (u16_t)len);
 | 
			
		||||
    /* add checksum for data */
 | 
			
		||||
    fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, offset, chksum, len);
 | 
			
		||||
    i++;
 | 
			
		||||
  }
 | 
			
		||||
  fclose(f);
 | 
			
		||||
  fprintf(struct_file, "};" NEWLINE);
 | 
			
		||||
  fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE);
 | 
			
		||||
  return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int process_file(FILE *data_file, FILE *struct_file, const char *filename)
 | 
			
		||||
{
 | 
			
		||||
  char *pch;
 | 
			
		||||
  char varname[MAX_PATH_LEN];
 | 
			
		||||
  int i = 0;
 | 
			
		||||
  char qualifiedName[MAX_PATH_LEN];
 | 
			
		||||
  int file_size;
 | 
			
		||||
  u16_t http_hdr_chksum = 0;
 | 
			
		||||
  u16_t http_hdr_len = 0;
 | 
			
		||||
  int chksum_count = 0;
 | 
			
		||||
 | 
			
		||||
  /* create qualified name (TODO: prepend slash or not?) */
 | 
			
		||||
  sprintf(qualifiedName,"%s/%s", curSubdir, filename);
 | 
			
		||||
  /* create C variable name */
 | 
			
		||||
  strcpy(varname, qualifiedName);
 | 
			
		||||
  /* convert slashes & dots to underscores */
 | 
			
		||||
  while ((pch = strpbrk(varname, "./\\")) != NULL) {
 | 
			
		||||
    *pch = '_';
 | 
			
		||||
  }
 | 
			
		||||
#if ALIGN_PAYLOAD
 | 
			
		||||
  /* to force even alignment of array */
 | 
			
		||||
  fprintf(data_file, "static const " PAYLOAD_ALIGN_TYPE " dummy_align_%s = %d;" NEWLINE, varname, payload_alingment_dummy_counter++);
 | 
			
		||||
#endif /* ALIGN_PAYLOAD */
 | 
			
		||||
  fprintf(data_file, "static const unsigned char data_%s[] = {" NEWLINE, varname);
 | 
			
		||||
  /* encode source file name (used by file system, not returned to browser) */
 | 
			
		||||
  fprintf(data_file, "/* %s (%d chars) */" NEWLINE, qualifiedName, strlen(qualifiedName)+1);
 | 
			
		||||
  file_put_ascii(data_file, qualifiedName, strlen(qualifiedName)+1, &i);
 | 
			
		||||
#if ALIGN_PAYLOAD
 | 
			
		||||
  /* pad to even number of bytes to assure payload is on aligned boundary */
 | 
			
		||||
  while(i % PAYLOAD_ALIGNMENT != 0) {
 | 
			
		||||
    fprintf(data_file, "0x%02.2x,", 0);
 | 
			
		||||
    i++;
 | 
			
		||||
  }
 | 
			
		||||
#endif /* ALIGN_PAYLOAD */
 | 
			
		||||
  fprintf(data_file, NEWLINE);
 | 
			
		||||
 | 
			
		||||
  file_size = get_file_size(filename);
 | 
			
		||||
  if (includeHttpHeader) {
 | 
			
		||||
    file_write_http_header(data_file, filename, file_size, &http_hdr_len, &http_hdr_chksum);
 | 
			
		||||
  }
 | 
			
		||||
  if (precalcChksum) {
 | 
			
		||||
    chksum_count = write_checksums(struct_file, filename, varname, http_hdr_len, http_hdr_chksum);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* build declaration of struct fsdata_file in temp file */
 | 
			
		||||
  fprintf(struct_file, "const struct fsdata_file file_%s[] = { {" NEWLINE, varname);
 | 
			
		||||
  fprintf(struct_file, "file_%s," NEWLINE, lastFileVar);
 | 
			
		||||
  fprintf(struct_file, "data_%s," NEWLINE, varname);
 | 
			
		||||
  fprintf(struct_file, "data_%s + %d," NEWLINE, varname, i);
 | 
			
		||||
  fprintf(struct_file, "sizeof(data_%s) - %d," NEWLINE, varname, i);
 | 
			
		||||
  fprintf(struct_file, "%d," NEWLINE, includeHttpHeader);
 | 
			
		||||
  if (precalcChksum) {
 | 
			
		||||
    fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE);
 | 
			
		||||
    fprintf(struct_file, "%d, chksums_%s," NEWLINE, chksum_count, varname);
 | 
			
		||||
    fprintf(struct_file, "#endif /* HTTPD_PRECALCULATED_CHECKSUM */" NEWLINE);
 | 
			
		||||
  }
 | 
			
		||||
  fprintf(struct_file, "}};" NEWLINE NEWLINE);
 | 
			
		||||
  strcpy(lastFileVar, varname);
 | 
			
		||||
 | 
			
		||||
  /* write actual file contents */
 | 
			
		||||
  i = 0;
 | 
			
		||||
  fprintf(data_file, NEWLINE "/* raw file data (%d bytes) */" NEWLINE, file_size);
 | 
			
		||||
  process_file_data(filename, data_file);
 | 
			
		||||
  fprintf(data_file, "};" NEWLINE NEWLINE);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int file_write_http_header(FILE *data_file, const char *filename, int file_size,
 | 
			
		||||
                           u16_t *http_hdr_len, u16_t *http_hdr_chksum)
 | 
			
		||||
{
 | 
			
		||||
  int i = 0;
 | 
			
		||||
  int response_type = HTTP_HDR_OK;
 | 
			
		||||
  int file_type = HTTP_HDR_DEFAULT_TYPE;
 | 
			
		||||
  const char *cur_string;
 | 
			
		||||
  size_t cur_len;
 | 
			
		||||
  int written = 0;
 | 
			
		||||
  size_t hdr_len = 0;
 | 
			
		||||
  u16_t acc;
 | 
			
		||||
  const char *file_ext;
 | 
			
		||||
  int j;
 | 
			
		||||
 | 
			
		||||
  memset(hdr_buf, 0, sizeof(hdr_buf));
 | 
			
		||||
  
 | 
			
		||||
  if (useHttp11) {
 | 
			
		||||
    response_type = HTTP_HDR_OK_11;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fprintf(data_file, NEWLINE "/* HTTP header */");
 | 
			
		||||
  if (strstr(filename, "404") == filename) {
 | 
			
		||||
    response_type = HTTP_HDR_NOT_FOUND;
 | 
			
		||||
    if (useHttp11) {
 | 
			
		||||
      response_type = HTTP_HDR_NOT_FOUND_11;
 | 
			
		||||
    }
 | 
			
		||||
  } else if (strstr(filename, "400") == filename) {
 | 
			
		||||
    response_type = HTTP_HDR_BAD_REQUEST;
 | 
			
		||||
    if (useHttp11) {
 | 
			
		||||
      response_type = HTTP_HDR_BAD_REQUEST_11;
 | 
			
		||||
    }
 | 
			
		||||
  } else if (strstr(filename, "501") == filename) {
 | 
			
		||||
    response_type = HTTP_HDR_NOT_IMPL;
 | 
			
		||||
    if (useHttp11) {
 | 
			
		||||
      response_type = HTTP_HDR_NOT_IMPL_11;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  cur_string = g_psHTTPHeaderStrings[response_type];
 | 
			
		||||
  cur_len = strlen(cur_string);
 | 
			
		||||
  fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
 | 
			
		||||
  written += file_put_ascii(data_file, cur_string, cur_len, &i);
 | 
			
		||||
  i = 0;
 | 
			
		||||
  if (precalcChksum) {
 | 
			
		||||
    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
 | 
			
		||||
    hdr_len += cur_len;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cur_string = serverID;
 | 
			
		||||
  cur_len = strlen(cur_string);
 | 
			
		||||
  fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
 | 
			
		||||
  written += file_put_ascii(data_file, cur_string, cur_len, &i);
 | 
			
		||||
  i = 0;
 | 
			
		||||
  if (precalcChksum) {
 | 
			
		||||
    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
 | 
			
		||||
    hdr_len += cur_len;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  file_ext = filename;
 | 
			
		||||
  while(strstr(file_ext, ".") != NULL) {
 | 
			
		||||
    file_ext = strstr(file_ext, ".");
 | 
			
		||||
    file_ext++;
 | 
			
		||||
  }
 | 
			
		||||
  if((file_ext == NULL) || (*file_ext == 0)) {
 | 
			
		||||
    printf("failed to get extension for file \"%s\", using default.\n", filename);
 | 
			
		||||
  } else {
 | 
			
		||||
    for(j = 0; j < NUM_HTTP_HEADERS; j++) {
 | 
			
		||||
      if(!strcmp(file_ext, g_psHTTPHeaders[j].extension)) {
 | 
			
		||||
        file_type = g_psHTTPHeaders[j].headerIndex;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (j >= NUM_HTTP_HEADERS) {
 | 
			
		||||
      printf("failed to get file type for extension \"%s\", using default.\n", file_ext);
 | 
			
		||||
      file_type = HTTP_HDR_DEFAULT_TYPE;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (useHttp11) {
 | 
			
		||||
    char intbuf[MAX_PATH_LEN];
 | 
			
		||||
    memset(intbuf, 0, sizeof(intbuf));
 | 
			
		||||
 | 
			
		||||
    cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];
 | 
			
		||||
    cur_len = strlen(cur_string);
 | 
			
		||||
    fprintf(data_file, NEWLINE "/* \"%s%d\r\n\" (%d+ bytes) */" NEWLINE, cur_string, file_size, cur_len+2);
 | 
			
		||||
    written += file_put_ascii(data_file, cur_string, cur_len, &i);
 | 
			
		||||
    if (precalcChksum) {
 | 
			
		||||
      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
 | 
			
		||||
      hdr_len += cur_len;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _itoa(file_size, intbuf, 10);
 | 
			
		||||
    strcat(intbuf, "\r\n");
 | 
			
		||||
    cur_len = strlen(intbuf);
 | 
			
		||||
    written += file_put_ascii(data_file, intbuf, cur_len, &i);
 | 
			
		||||
    i = 0;
 | 
			
		||||
    if (precalcChksum) {
 | 
			
		||||
      memcpy(&hdr_buf[hdr_len], intbuf, cur_len);
 | 
			
		||||
      hdr_len += cur_len;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];
 | 
			
		||||
    cur_len = strlen(cur_string);
 | 
			
		||||
    fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
 | 
			
		||||
    written += file_put_ascii(data_file, cur_string, cur_len, &i);
 | 
			
		||||
    i = 0;
 | 
			
		||||
    if (precalcChksum) {
 | 
			
		||||
      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
 | 
			
		||||
      hdr_len += cur_len;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cur_string = g_psHTTPHeaderStrings[file_type];
 | 
			
		||||
  cur_len = strlen(cur_string);
 | 
			
		||||
  fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len);
 | 
			
		||||
  written += file_put_ascii(data_file, cur_string, cur_len, &i);
 | 
			
		||||
  i = 0;
 | 
			
		||||
  if (precalcChksum) {
 | 
			
		||||
    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);
 | 
			
		||||
    hdr_len += cur_len;
 | 
			
		||||
 | 
			
		||||
    LWIP_ASSERT("hdr_len <= 0xffff", hdr_len <= 0xffff);
 | 
			
		||||
    LWIP_ASSERT("strlen(hdr_buf) == hdr_len", strlen(hdr_buf) == hdr_len);
 | 
			
		||||
    acc = ~inet_chksum(hdr_buf, (u16_t)hdr_len);
 | 
			
		||||
    *http_hdr_len = (u16_t)hdr_len;
 | 
			
		||||
    *http_hdr_chksum = acc;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return written;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int file_put_ascii(FILE *file, const char* ascii_string, int len, int *i)
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
  for(x = 0; x < len; x++) {
 | 
			
		||||
    unsigned char cur = ascii_string[x];
 | 
			
		||||
    fprintf(file, "0x%02.2x,", cur);
 | 
			
		||||
    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {
 | 
			
		||||
      fprintf(file, NEWLINE);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int s_put_ascii(char *buf, const char *ascii_string, int len, int *i)
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
  int idx = 0;
 | 
			
		||||
  for(x = 0; x < len; x++) {
 | 
			
		||||
    unsigned char cur = ascii_string[x];
 | 
			
		||||
    sprintf(&buf[idx], "0x%02.2x,", cur);
 | 
			
		||||
    idx += 5;
 | 
			
		||||
    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {
 | 
			
		||||
      sprintf(&buf[idx], NEWLINE);
 | 
			
		||||
      idx += NEWLINE_LEN;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return len;
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
// stdafx.cpp : source file that includes just the standard includes
 | 
			
		||||
// MakeFSData_proj.pch will be the pre-compiled header
 | 
			
		||||
// stdafx.obj will contain the pre-compiled type information
 | 
			
		||||
 | 
			
		||||
#include "stdafx.h"
 | 
			
		||||
 | 
			
		||||
// TODO: reference any additional headers you need in STDAFX.H
 | 
			
		||||
// and not in this file
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
// stdafx.h : include file for standard system include files,
 | 
			
		||||
// or project specific include files that are used frequently, but
 | 
			
		||||
// are changed infrequently
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "targetver.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <tchar.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// TODO: reference additional headers your program requires here
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
// Including SDKDDKVer.h defines the highest available Windows platform.
 | 
			
		||||
 | 
			
		||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
 | 
			
		||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
 | 
			
		||||
 | 
			
		||||
#include <SDKDDKVer.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,262 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd.
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS tutorial books are available in pdf and paperback.        *
 | 
			
		||||
     *    Complete, revised, and edited pdf reference manuals are also       *
 | 
			
		||||
     *    available.                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Purchasing FreeRTOS documentation will not only help you, by       *
 | 
			
		||||
     *    ensuring you get running as quickly as possible and with an        *
 | 
			
		||||
     *    in-depth knowledge of how to use FreeRTOS, it will also help       *
 | 
			
		||||
     *    the FreeRTOS project to continue with its mission of providing     *
 | 
			
		||||
     *    professional grade, cross platform, de facto standard solutions    *
 | 
			
		||||
     *    for microcontrollers - completely free of charge!                  *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you for using FreeRTOS, and thank you for your support!      *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
 | 
			
		||||
    >>>NOTE<<< The modification to the GPL is included to allow you to
 | 
			
		||||
    distribute a combined work that includes FreeRTOS without being obliged to
 | 
			
		||||
    provide the source code for proprietary components outside of the FreeRTOS
 | 
			
		||||
    kernel.  FreeRTOS is distributed in the hope that it will be useful, but
 | 
			
		||||
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
			
		||||
    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
    more details. You should have received a copy of the GNU General Public
 | 
			
		||||
    License and the FreeRTOS license exception along with FreeRTOS; if not it
 | 
			
		||||
    can be viewed here: http://www.freertos.org/a00114.html and also obtained
 | 
			
		||||
    by writing to Richard Barry, contact details for whom are available on the
 | 
			
		||||
    FreeRTOS WEB site.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, latest information, license and
 | 
			
		||||
    contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - A version that is certified for use in safety
 | 
			
		||||
    critical systems.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Commercial support, development, porting,
 | 
			
		||||
    licensing and training services.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Standard includes. */
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/* FreeRTOS includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
 | 
			
		||||
/* lwIP core includes */
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
#include "lwip/tcpip.h"
 | 
			
		||||
#include "lwip/inet.h"
 | 
			
		||||
 | 
			
		||||
/* applications includes */
 | 
			
		||||
#include "apps/httpserver_raw_from_lwIP_download/httpd.h"
 | 
			
		||||
 | 
			
		||||
/* include the port-dependent configuration */
 | 
			
		||||
#include "lwipcfg_msvc.h"
 | 
			
		||||
 | 
			
		||||
/* Dimensions the cTxBuffer array - which is itself used to hold replies from 
 | 
			
		||||
command line commands.  cTxBuffer is a shared buffer, so protected by the 
 | 
			
		||||
xTxBufferMutex mutex. */
 | 
			
		||||
#define lwipappsTX_BUFFER_SIZE	1024
 | 
			
		||||
 | 
			
		||||
/* The maximum time to block waiting to obtain the xTxBufferMutex to become
 | 
			
		||||
available. */
 | 
			
		||||
#define lwipappsMAX_TIME_TO_WAIT_FOR_TX_BUFFER_MS	( 100 / portTICK_RATE_MS )
 | 
			
		||||
 | 
			
		||||
/* Definitions of the various SSI callback functions within the pccSSITags 
 | 
			
		||||
array.  If pccSSITags is updated, then these definitions must also be updated. */
 | 
			
		||||
#define ssiTASK_STATS_INDEX			0
 | 
			
		||||
#define ssiRUN_TIME_STATS_INDEX		1
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The function that implements the lwIP based sockets command interpreter
 | 
			
		||||
 * server.
 | 
			
		||||
 */
 | 
			
		||||
extern void vBasicSocketsCommandInterpreterTask( void *pvParameters );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The SSI handler callback function passed to lwIP.
 | 
			
		||||
 */
 | 
			
		||||
static unsigned short uslwIPAppsSSIHandler( int iIndex, char *pcBuffer, int iBufferLength );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The SSI strings that are embedded in the served html files.  If this array
 | 
			
		||||
is changed, then the index position defined by the #defines such as 
 | 
			
		||||
ssiTASK_STATS_INDEX above must also be updated. */
 | 
			
		||||
static const char *pccSSITags[] = 
 | 
			
		||||
{
 | 
			
		||||
	"rtos_stats",
 | 
			
		||||
	"run_stats"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Semaphore used to guard the Tx buffer. */
 | 
			
		||||
static xSemaphoreHandle xTxBufferMutex = NULL;
 | 
			
		||||
 | 
			
		||||
/* The Tx buffer itself.  This is used to hold the text generated by the 
 | 
			
		||||
execution of command line commands, and (hopefully) the execution of 
 | 
			
		||||
server side include callbacks.  It is a shared buffer so protected by the
 | 
			
		||||
xTxBufferMutex mutex.  pcLwipAppsBlockingGetTxBuffer() and 
 | 
			
		||||
vLwipAppsReleaseTxBuffer() are provided to obtain and release the 
 | 
			
		||||
xTxBufferMutex respectively.  pcLwipAppsBlockingGetTxBuffer() must be used with
 | 
			
		||||
caution as it has the potential to block. */
 | 
			
		||||
static signed char cTxBuffer[ lwipappsTX_BUFFER_SIZE ];
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vStatusCallback( struct netif *pxNetIf )
 | 
			
		||||
{
 | 
			
		||||
char pcMessage[20];
 | 
			
		||||
 | 
			
		||||
	if( netif_is_up( pxNetIf ) != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		strcpy( pcMessage, "IP=" );
 | 
			
		||||
		strcat( pcMessage, inet_ntoa( *( struct in_addr* ) &( pxNetIf->ip_addr ) ) );
 | 
			
		||||
		xil_printf( pcMessage );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xil_printf( "Network is down" );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Called from the TCP/IP thread. */
 | 
			
		||||
void lwIPAppsInit( void *pvArgument )
 | 
			
		||||
{
 | 
			
		||||
ip_addr_t xIPAddr, xNetMask, xGateway;
 | 
			
		||||
extern err_t xemacpsif_init( struct netif *netif );
 | 
			
		||||
extern void xemacif_input_thread( void *netif );
 | 
			
		||||
static struct netif xNetIf;
 | 
			
		||||
 | 
			
		||||
	( void ) pvArgument;
 | 
			
		||||
 | 
			
		||||
	/* Set up the network interface. */
 | 
			
		||||
	ip_addr_set_zero( &xGateway );
 | 
			
		||||
	ip_addr_set_zero( &xIPAddr );
 | 
			
		||||
	ip_addr_set_zero( &xNetMask );
 | 
			
		||||
 | 
			
		||||
	LWIP_PORT_INIT_GW(&xGateway);
 | 
			
		||||
	LWIP_PORT_INIT_IPADDR( &xIPAddr );
 | 
			
		||||
	LWIP_PORT_INIT_NETMASK(&xNetMask);
 | 
			
		||||
 | 
			
		||||
	/* Set mac address */
 | 
			
		||||
	xNetIf.hwaddr_len = 6;
 | 
			
		||||
	xNetIf.hwaddr[ 0 ] = configMAC_ADDR0;
 | 
			
		||||
	xNetIf.hwaddr[ 1 ] = configMAC_ADDR1;
 | 
			
		||||
	xNetIf.hwaddr[ 2 ] = configMAC_ADDR2;
 | 
			
		||||
	xNetIf.hwaddr[ 3 ] = configMAC_ADDR3;
 | 
			
		||||
	xNetIf.hwaddr[ 4 ] = configMAC_ADDR4;
 | 
			
		||||
	xNetIf.hwaddr[ 5 ] = configMAC_ADDR5;
 | 
			
		||||
 | 
			
		||||
	netif_set_default( netif_add( &xNetIf, &xIPAddr, &xNetMask, &xGateway, ( void * ) XPAR_XEMACPS_0_BASEADDR, xemacpsif_init, tcpip_input ) );
 | 
			
		||||
	netif_set_status_callback( &xNetIf, vStatusCallback );
 | 
			
		||||
	#if LWIP_DHCP
 | 
			
		||||
	{
 | 
			
		||||
		dhcp_start( &xNetIf );
 | 
			
		||||
	}
 | 
			
		||||
	#else
 | 
			
		||||
	{
 | 
			
		||||
		netif_set_up( &xNetIf );
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Install the server side include handler. */
 | 
			
		||||
	http_set_ssi_handler( uslwIPAppsSSIHandler, pccSSITags, sizeof( pccSSITags ) / sizeof( char * ) );
 | 
			
		||||
 | 
			
		||||
	/* Create the mutex used to ensure mutual exclusive access to the Tx 
 | 
			
		||||
	buffer. */
 | 
			
		||||
	xTxBufferMutex = xSemaphoreCreateMutex();
 | 
			
		||||
	configASSERT( xTxBufferMutex );
 | 
			
		||||
 | 
			
		||||
	/* Create the httpd server from the standard lwIP code.  This demonstrates
 | 
			
		||||
	use of the lwIP raw API. */
 | 
			
		||||
	httpd_init();
 | 
			
		||||
 | 
			
		||||
	sys_thread_new( "lwIP_In", xemacif_input_thread, &xNetIf, configMINIMAL_STACK_SIZE, configMAC_INPUT_TASK_PRIORITY );
 | 
			
		||||
 | 
			
		||||
	/* Create the FreeRTOS defined basic command server.  This demonstrates use
 | 
			
		||||
	of the lwIP sockets API. */
 | 
			
		||||
	xTaskCreate( vBasicSocketsCommandInterpreterTask, "CmdInt", configMINIMAL_STACK_SIZE * 5, NULL, configCLI_TASK_PRIORITY, NULL );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static unsigned short uslwIPAppsSSIHandler( int iIndex, char *pcBuffer, int iBufferLength )
 | 
			
		||||
{
 | 
			
		||||
static unsigned int uiUpdateCount = 0;
 | 
			
		||||
static char cUpdateString[ 200 ];
 | 
			
		||||
extern char *pcMainGetTaskStatusMessage( void );
 | 
			
		||||
 | 
			
		||||
	/* Unused parameter. */
 | 
			
		||||
	( void ) iBufferLength;
 | 
			
		||||
 | 
			
		||||
	/* The SSI handler function that generates text depending on the index of
 | 
			
		||||
	the SSI tag encountered. */
 | 
			
		||||
	
 | 
			
		||||
	switch( iIndex )
 | 
			
		||||
	{
 | 
			
		||||
		case ssiTASK_STATS_INDEX :
 | 
			
		||||
			vTaskList( pcBuffer );
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case ssiRUN_TIME_STATS_INDEX :
 | 
			
		||||
			vTaskGetRunTimeStats( pcBuffer );
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Include a count of the number of times an SSI function has been executed
 | 
			
		||||
	in the returned string. */
 | 
			
		||||
	uiUpdateCount++;
 | 
			
		||||
	sprintf( cUpdateString, "\r\n\r\n%u\r\nStatus - %s", uiUpdateCount, pcMainGetTaskStatusMessage() );
 | 
			
		||||
	strcat( pcBuffer, cUpdateString );
 | 
			
		||||
 | 
			
		||||
	return strlen( pcBuffer );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
signed char *pcLwipAppsBlockingGetTxBuffer( void )
 | 
			
		||||
{
 | 
			
		||||
signed char *pcReturn;
 | 
			
		||||
 | 
			
		||||
	/* Attempt to obtain the semaphore that guards the Tx buffer. */
 | 
			
		||||
	if( xSemaphoreTakeRecursive( xTxBufferMutex, lwipappsMAX_TIME_TO_WAIT_FOR_TX_BUFFER_MS ) == pdFAIL )
 | 
			
		||||
	{
 | 
			
		||||
		/* The semaphore could not be obtained before timing out. */
 | 
			
		||||
		pcReturn = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* The semaphore was obtained successfully.  Return a pointer to the
 | 
			
		||||
		Tx buffer. */
 | 
			
		||||
		pcReturn = cTxBuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pcReturn;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vLwipAppsReleaseTxBuffer( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Finished with the Tx buffer.  Return the mutex. */
 | 
			
		||||
	xSemaphoreGiveRecursive( xTxBufferMutex );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V7.0.1 - Copyright (C) 2011 Real Time Engineers Ltd.
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS tutorial books are available in pdf and paperback.        *
 | 
			
		||||
     *    Complete, revised, and edited pdf reference manuals are also       *
 | 
			
		||||
     *    available.                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Purchasing FreeRTOS documentation will not only help you, by       *
 | 
			
		||||
     *    ensuring you get running as quickly as possible and with an        *
 | 
			
		||||
     *    in-depth knowledge of how to use FreeRTOS, it will also help       *
 | 
			
		||||
     *    the FreeRTOS project to continue with its mission of providing     *
 | 
			
		||||
     *    professional grade, cross platform, de facto standard solutions    *
 | 
			
		||||
     *    for microcontrollers - completely free of charge!                  *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you for using FreeRTOS, and thank you for your support!      *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
 | 
			
		||||
    >>>NOTE<<< The modification to the GPL is included to allow you to
 | 
			
		||||
    distribute a combined work that includes FreeRTOS without being obliged to
 | 
			
		||||
    provide the source code for proprietary components outside of the FreeRTOS
 | 
			
		||||
    kernel.  FreeRTOS is distributed in the hope that it will be useful, but
 | 
			
		||||
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 | 
			
		||||
    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
    more details. You should have received a copy of the GNU General Public
 | 
			
		||||
    License and the FreeRTOS license exception along with FreeRTOS; if not it
 | 
			
		||||
    can be viewed here: http://www.freertos.org/a00114.html and also obtained
 | 
			
		||||
    by writing to Richard Barry, contact details for whom are available on the
 | 
			
		||||
    FreeRTOS WEB site.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, latest information, license and
 | 
			
		||||
    contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - A version that is certified for use in safety
 | 
			
		||||
    critical systems.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Commercial support, development, porting,
 | 
			
		||||
    licensing and training services.
 | 
			
		||||
*/
 | 
			
		||||
#ifndef LWIP_APPS_H
 | 
			
		||||
#define LWIP_APPS_H
 | 
			
		||||
 | 
			
		||||
/* Functions used to obtain and release exclusive access to the Tx buffer.  The
 | 
			
		||||
Get function will block if the Tx buffer is not available - use with care! */
 | 
			
		||||
signed char *pcLwipAppsBlockingGetTxBuffer( void );
 | 
			
		||||
void vLwipAppsReleaseTxBuffer( void );
 | 
			
		||||
 | 
			
		||||
#endif /* LWIP_APPS_H */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
/**
 | 
			
		||||
 * Additional settings for the win32 port.
 | 
			
		||||
 * Copy this to lwipcfg_msvc.h and make the config changes you need.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* configuration for this port */
 | 
			
		||||
#define PPP_USERNAME  "Admin"
 | 
			
		||||
#define PPP_PASSWORD  "pass"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** Define this to the GUID of the windows network adapter to use
 | 
			
		||||
 * or NOT define this if you want PACKET_LIB_ADAPTER_NR to be used */ 
 | 
			
		||||
/*#define PACKET_LIB_ADAPTER_GUID       "00000000-0000-0000-0000-000000000000"*/
 | 
			
		||||
/*#define PACKET_LIB_GET_ADAPTER_NETADDRESS(addr) IP4_ADDR((addr), 192,168,1,0)*/
 | 
			
		||||
/*#define PACKET_LIB_QUIET*/
 | 
			
		||||
 | 
			
		||||
#define LWIP_PORT_INIT_IPADDR(addr)   IP4_ADDR((addr), configIP_ADDR0,configIP_ADDR1,configIP_ADDR2,configIP_ADDR3)
 | 
			
		||||
#define LWIP_PORT_INIT_GW(addr)       IP4_ADDR((addr), 192,168,0,3)
 | 
			
		||||
#define LWIP_PORT_INIT_NETMASK(addr)  IP4_ADDR((addr), 255,255,255,0)
 | 
			
		||||
 | 
			
		||||
/* remember to change this MAC address to suit your needs!
 | 
			
		||||
   the last octet will be increased by netif->num for each netif */
 | 
			
		||||
#define LWIP_MAC_ADDR_BASE            {0x00,0x01,0x02,0x03,0x04,0x05}
 | 
			
		||||
 | 
			
		||||
/* configuration for applications */
 | 
			
		||||
 | 
			
		||||
#define LWIP_CHARGEN_APP              0
 | 
			
		||||
#define LWIP_DNS_APP                  0
 | 
			
		||||
#define LWIP_HTTPD_APP                1
 | 
			
		||||
/* Set this to 1 to use the netconn http server,
 | 
			
		||||
 * otherwise the raw api server will be used. */
 | 
			
		||||
/*#define LWIP_HTTPD_APP_NETCONN     */
 | 
			
		||||
#define LWIP_NETBIOS_APP              0
 | 
			
		||||
#define LWIP_NETIO_APP                0
 | 
			
		||||
#define LWIP_PING_APP                 0
 | 
			
		||||
#define LWIP_RTP_APP                  0
 | 
			
		||||
#define LWIP_SHELL_APP                0
 | 
			
		||||
#define LWIP_SNTP_APP                 0
 | 
			
		||||
#define LWIP_SOCKET_EXAMPLES_APP      0
 | 
			
		||||
#define LWIP_TCPECHO_APP              0
 | 
			
		||||
/* Set this to 1 to use the netconn tcpecho server,
 | 
			
		||||
 * otherwise the raw api server will be used. */
 | 
			
		||||
/*#define LWIP_TCPECHO_APP_NETCONN   */
 | 
			
		||||
#define LWIP_UDPECHO_APP              0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
#pragma pack(push,1)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,109 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification, 
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __ARCH_CC_H__
 | 
			
		||||
#define __ARCH_CC_H__
 | 
			
		||||
 | 
			
		||||
#if 1
 | 
			
		||||
/* Include some files for defining library routines */
 | 
			
		||||
#include <stdio.h> /* printf, fflush, FILE */
 | 
			
		||||
#include <stdlib.h> /* abort */
 | 
			
		||||
#else
 | 
			
		||||
/* Declare fuction prototypes for assert/diag/error - leads to some warnings,
 | 
			
		||||
 * but good to test if no includes are missing. */
 | 
			
		||||
int printf(const char *format, ...);
 | 
			
		||||
void abort(void);
 | 
			
		||||
struct _iobuf;
 | 
			
		||||
typedef struct _iobuf FILE;
 | 
			
		||||
int fflush(FILE *stream);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @todo fix some warnings: don't use #pragma if compiling with cygwin gcc */
 | 
			
		||||
#ifndef __GNUC__
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#pragma warning (disable: 4244) /* disable conversion warning (implicit integer promotion!) */
 | 
			
		||||
#pragma warning (disable: 4127) /* conditional expression is constant */
 | 
			
		||||
#pragma warning (disable: 4996) /* 'strncpy' was declared deprecated */
 | 
			
		||||
#pragma warning (disable: 4103) /* structure packing changed by including file */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define LWIP_PROVIDE_ERRNO
 | 
			
		||||
 | 
			
		||||
/* Define platform endianness (might already be defined) */
 | 
			
		||||
#ifndef BYTE_ORDER
 | 
			
		||||
#define BYTE_ORDER LITTLE_ENDIAN
 | 
			
		||||
#endif /* BYTE_ORDER */
 | 
			
		||||
 | 
			
		||||
/* Define generic types used in lwIP */
 | 
			
		||||
typedef unsigned   char    u8_t;
 | 
			
		||||
typedef signed     char    s8_t;
 | 
			
		||||
typedef unsigned   short   u16_t;
 | 
			
		||||
typedef signed     short   s16_t;
 | 
			
		||||
typedef unsigned   long    u32_t;
 | 
			
		||||
typedef signed     long    s32_t;
 | 
			
		||||
 | 
			
		||||
typedef size_t mem_ptr_t;
 | 
			
		||||
typedef u32_t sys_prot_t;
 | 
			
		||||
 | 
			
		||||
/* Define (sn)printf formatters for these lwIP types */
 | 
			
		||||
#define X8_F  "02x"
 | 
			
		||||
#define U16_F "hu"
 | 
			
		||||
#define S16_F "hd"
 | 
			
		||||
#define X16_F "hx"
 | 
			
		||||
#define U32_F "lu"
 | 
			
		||||
#define S32_F "ld"
 | 
			
		||||
#define X32_F "lx"
 | 
			
		||||
#define SZT_F U32_F
 | 
			
		||||
 | 
			
		||||
/* Compiler hints for packing structures */
 | 
			
		||||
#define PACK_STRUCT_STRUCT
 | 
			
		||||
#define PACK_STRUCT_USE_INCLUDES
 | 
			
		||||
 | 
			
		||||
/* Plaform specific diagnostic output */
 | 
			
		||||
#define LWIP_PLATFORM_DIAG(x)   do { printf x; } while(0)
 | 
			
		||||
 | 
			
		||||
#define LWIP_PLATFORM_ASSERT(x) do { printf("Assertion \"%s\" failed at line %d in %s\n", \
 | 
			
		||||
                                     x, __LINE__, __FILE__); fflush(NULL); abort(); } while(0)
 | 
			
		||||
 | 
			
		||||
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
 | 
			
		||||
  printf("Assertion \"%s\" failed at line %d in %s\n", message, __LINE__, __FILE__); \
 | 
			
		||||
  fflush(NULL);handler;} } while(0)
 | 
			
		||||
 | 
			
		||||
/* C runtime functions redefined */
 | 
			
		||||
#define snprintf _snprintf
 | 
			
		||||
 | 
			
		||||
u32_t dns_lookup_external_hosts_file(const char *name);
 | 
			
		||||
 | 
			
		||||
#define LWIP_RAND() ((u32_t)rand())
 | 
			
		||||
 | 
			
		||||
#endif /* __ARCH_CC_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
#pragma pack(pop)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,40 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001, Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without 
 | 
			
		||||
 * modification, are permitted provided that the following conditions 
 | 
			
		||||
 * are met: 
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright 
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer. 
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright 
 | 
			
		||||
 *    notice, this list of conditions and the following disclaimer in the 
 | 
			
		||||
 *    documentation and/or other materials provided with the distribution. 
 | 
			
		||||
 * 3. Neither the name of the Institute nor the names of its contributors 
 | 
			
		||||
 *    may be used to endorse or promote products derived from this software 
 | 
			
		||||
 *    without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
 | 
			
		||||
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | 
			
		||||
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 | 
			
		||||
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
 | 
			
		||||
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 | 
			
		||||
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
 | 
			
		||||
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 | 
			
		||||
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 | 
			
		||||
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
 | 
			
		||||
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
 | 
			
		||||
 * SUCH DAMAGE. 
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __PERF_H__
 | 
			
		||||
#define __PERF_H__
 | 
			
		||||
 | 
			
		||||
#define PERF_START    /* null definition */
 | 
			
		||||
#define PERF_STOP(x)  /* null definition */
 | 
			
		||||
 | 
			
		||||
#endif /* __PERF_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification, 
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __ARCH_SYS_ARCH_H__
 | 
			
		||||
#define __ARCH_SYS_ARCH_H__
 | 
			
		||||
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "queue.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
 | 
			
		||||
#define SYS_MBOX_NULL					( ( QueueHandle_t ) NULL )
 | 
			
		||||
#define SYS_SEM_NULL					( ( SemaphoreHandle_t ) NULL )
 | 
			
		||||
#define SYS_DEFAULT_THREAD_STACK_DEPTH	configMINIMAL_STACK_SIZE
 | 
			
		||||
 | 
			
		||||
typedef SemaphoreHandle_t sys_sem_t;
 | 
			
		||||
typedef SemaphoreHandle_t sys_mutex_t;
 | 
			
		||||
typedef QueueHandle_t sys_mbox_t;
 | 
			
		||||
typedef TaskHandle_t sys_thread_t;
 | 
			
		||||
 | 
			
		||||
typedef unsigned long sys_prot_t;
 | 
			
		||||
 | 
			
		||||
#define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
 | 
			
		||||
#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL )
 | 
			
		||||
#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
 | 
			
		||||
#define sys_sem_set_invalid( x ) ( ( *x ) = NULL )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* __ARCH_SYS_ARCH_H__ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __XADAPTER_H_
 | 
			
		||||
#define __XADAPTER_H_
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "lwipopts.h"
 | 
			
		||||
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
#ifdef OS_IS_XILKERNEL
 | 
			
		||||
#include "xmk.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "lwip/sys.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "lwip/netif.h"
 | 
			
		||||
#include "lwip/ip.h"
 | 
			
		||||
 | 
			
		||||
#include "netif/xtopology.h"
 | 
			
		||||
 | 
			
		||||
struct xemac_s {
 | 
			
		||||
	enum xemac_types type;
 | 
			
		||||
	int  topology_index;
 | 
			
		||||
	void *state;
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
        sys_sem_t sem_rx_data_available;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void 		lwip_raw_init();
 | 
			
		||||
int 		xemacif_input(struct netif *netif);
 | 
			
		||||
void 		xemacif_input_thread(struct netif *netif);
 | 
			
		||||
struct netif *	xemac_add(struct netif *netif,
 | 
			
		||||
	struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw,
 | 
			
		||||
	unsigned char *mac_ethernet_address,
 | 
			
		||||
  	unsigned mac_baseaddr);
 | 
			
		||||
#ifdef __arm__
 | 
			
		||||
void xemacpsif_resetrx_on_no_rxdata(struct netif *netif);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* global lwip debug variable used for debugging */
 | 
			
		||||
extern int lwip_runtime_debug;
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,94 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __NETIF_XAXIEMACIF_H__
 | 
			
		||||
#define __NETIF_XAXIEMACIF_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
#include "lwip/netif.h"
 | 
			
		||||
#include "netif/etharp.h"
 | 
			
		||||
#include "netif/xadapter.h"
 | 
			
		||||
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
 | 
			
		||||
#include "xaxiethernet.h"
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO
 | 
			
		||||
#include "xllfifo.h"
 | 
			
		||||
#else
 | 
			
		||||
#include "xaxidma.h"
 | 
			
		||||
#include "xaxidma_hw.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "netif/xpqueue.h"
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
 | 
			
		||||
void 	xaxiemacif_setmac(u32_t index, u8_t *addr);
 | 
			
		||||
u8_t*	xaxiemacif_getmac(u32_t index);
 | 
			
		||||
err_t 	xaxiemacif_init(struct netif *netif);
 | 
			
		||||
int 	xaxiemacif_input(struct netif *netif);
 | 
			
		||||
 | 
			
		||||
unsigned get_IEEE_phy_speed(XAxiEthernet *xaxiemacp);
 | 
			
		||||
unsigned configure_IEEE_phy_speed(XAxiEthernet *xaxiemacp, unsigned speed);
 | 
			
		||||
unsigned Phy_Setup (XAxiEthernet *xaxiemacp);
 | 
			
		||||
 | 
			
		||||
/* xaxiemacif_hw.c */
 | 
			
		||||
void 	xaxiemac_error_handler(XAxiEthernet * Temac);
 | 
			
		||||
 | 
			
		||||
/* structure within each netif, encapsulating all information required for
 | 
			
		||||
 * using a particular temac instance
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO
 | 
			
		||||
	XLlFifo      axififo;
 | 
			
		||||
#else
 | 
			
		||||
	XAxiDma      axidma;
 | 
			
		||||
#endif
 | 
			
		||||
	XAxiEthernet axi_ethernet;
 | 
			
		||||
 | 
			
		||||
	/* queue to store overflow packets */
 | 
			
		||||
	pq_queue_t *recv_q;
 | 
			
		||||
	pq_queue_t *send_q;
 | 
			
		||||
 | 
			
		||||
	/* pointers to memory holding buffer descriptors (used only with SDMA) */
 | 
			
		||||
	void *rx_bdspace;
 | 
			
		||||
	void *tx_bdspace;
 | 
			
		||||
} xaxiemacif_s;
 | 
			
		||||
 | 
			
		||||
extern xaxiemacif_s xaxiemacif;
 | 
			
		||||
 | 
			
		||||
int	is_tx_space_available(xaxiemacif_s *emac);
 | 
			
		||||
 | 
			
		||||
/* xaxiemacif_dma.c */
 | 
			
		||||
#ifndef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO
 | 
			
		||||
XStatus init_axi_dma(struct xemac_s *xemac);
 | 
			
		||||
int  process_sent_bds(XAxiDma_BdRing *txring);
 | 
			
		||||
 | 
			
		||||
void axidma_send_handler(void *arg);
 | 
			
		||||
XStatus axidma_sgsend(xaxiemacif_s *xaxiemacif, struct pbuf *p);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __NETIF_XAXIEMACIF_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __NETIF_XEMACLITEIF_H__
 | 
			
		||||
#define __NETIF_XEMACLITEIF_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "lwip/netif.h"
 | 
			
		||||
#include "netif/etharp.h"
 | 
			
		||||
#include "netif/xpqueue.h"
 | 
			
		||||
#include "xemaclite.h"
 | 
			
		||||
#include "xemaclite_i.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
 | 
			
		||||
/* structure within each netif, encapsulating all information required for 
 | 
			
		||||
 * using a particular emaclite instance
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
        XEmacLite *instance;
 | 
			
		||||
 | 
			
		||||
	/* queue to store overflow packets */
 | 
			
		||||
	pq_queue_t *recv_q;
 | 
			
		||||
	pq_queue_t *send_q;
 | 
			
		||||
} xemacliteif_s;
 | 
			
		||||
 | 
			
		||||
void 	xemacliteif_setmac(u32_t index, u8_t *addr);
 | 
			
		||||
u8_t*	xemacliteif_getmac(u32_t index);
 | 
			
		||||
err_t 	xemacliteif_init(struct netif *netif);
 | 
			
		||||
int 	xemacliteif_input(struct netif *netif);
 | 
			
		||||
   
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __NETIF_XEMACLITEIF_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,109 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __NETIF_XEMACPSIF_H__
 | 
			
		||||
#define __NETIF_XEMACPSIF_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
#include "lwip/netif.h"
 | 
			
		||||
#include "netif/etharp.h"
 | 
			
		||||
#include "netif/xadapter.h"
 | 
			
		||||
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "sleep.h"
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xparameters_ps.h"	/* defines XPAR values */
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
#include "xil_exception.h"
 | 
			
		||||
#include "xpseudo_asm.h"
 | 
			
		||||
#include "xil_cache.h"
 | 
			
		||||
#include "xil_printf.h"
 | 
			
		||||
#include "xuartps.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
#include "xemacps.h"		/* defines XEmacPs API */
 | 
			
		||||
 | 
			
		||||
#include "netif/xpqueue.h"
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
 | 
			
		||||
void 	xemacpsif_setmac(u32_t index, u8_t *addr);
 | 
			
		||||
u8_t*	xemacpsif_getmac(u32_t index);
 | 
			
		||||
err_t 	xemacpsif_init(struct netif *netif);
 | 
			
		||||
int 	xemacpsif_input(struct netif *netif);
 | 
			
		||||
#ifdef NOTNOW_BHILL
 | 
			
		||||
unsigned get_IEEE_phy_speed(XLlTemac *xlltemacp);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* xaxiemacif_hw.c */
 | 
			
		||||
void 	xemacps_error_handler(XEmacPs * Temac);
 | 
			
		||||
 | 
			
		||||
/* structure within each netif, encapsulating all information required for
 | 
			
		||||
 * using a particular temac instance
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XEmacPs emacps;
 | 
			
		||||
 | 
			
		||||
	/* queue to store overflow packets */
 | 
			
		||||
	pq_queue_t *recv_q;
 | 
			
		||||
	pq_queue_t *send_q;
 | 
			
		||||
 | 
			
		||||
	/* pointers to memory holding buffer descriptors (used only with SDMA) */
 | 
			
		||||
	void *rx_bdspace;
 | 
			
		||||
	void *tx_bdspace;
 | 
			
		||||
 | 
			
		||||
	unsigned int last_rx_frms_cntr;
 | 
			
		||||
 | 
			
		||||
} xemacpsif_s;
 | 
			
		||||
 | 
			
		||||
extern xemacpsif_s xemacpsif;
 | 
			
		||||
 | 
			
		||||
int	is_tx_space_available(xemacpsif_s *emac);
 | 
			
		||||
 | 
			
		||||
/* xaxiemacif_dma.c */
 | 
			
		||||
 | 
			
		||||
XStatus init_axi_dma(struct xemac_s *xemac);
 | 
			
		||||
void  process_sent_bds(XEmacPs_BdRing *txring);
 | 
			
		||||
unsigned Phy_Setup (XEmacPs *xemacpsp);
 | 
			
		||||
void emacps_send_handler(void *arg);
 | 
			
		||||
XStatus emacps_sgsend(xemacpsif_s *xemacpsif, struct pbuf *p);
 | 
			
		||||
void emacps_recv_handler(void *arg);
 | 
			
		||||
void emacps_error_handler(void *arg,u8 Direction, u32 ErrorWord);
 | 
			
		||||
void setup_rx_bds(XEmacPs_BdRing *rxring);
 | 
			
		||||
void HandleTxErrors(struct xemac_s *xemac);
 | 
			
		||||
void HandleEmacPsError(struct xemac_s *xemac);
 | 
			
		||||
XEmacPs_Config *xemacps_lookup_config(unsigned mac_base);
 | 
			
		||||
void init_emacps(xemacpsif_s *xemacps, struct netif *netif);
 | 
			
		||||
void setup_isr (struct xemac_s *xemac);
 | 
			
		||||
XStatus init_dma(struct xemac_s *xemac);
 | 
			
		||||
void start_emacps (xemacpsif_s *xemacps);
 | 
			
		||||
void FreeTxRxPBufs(void);
 | 
			
		||||
void FreeOnlyTxPBufs(void);
 | 
			
		||||
void init_emacps_on_error (xemacpsif_s *xemacps, struct netif *netif);
 | 
			
		||||
void clean_dma_txdescs(struct xemac_s *xemac);
 | 
			
		||||
void resetrx_on_no_rxdata(xemacpsif_s *xemacpsif);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __NETIF_XAXIEMACIF_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,80 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __NETIF_XLLTEMACIF_H__
 | 
			
		||||
#define __NETIF_XLLTEMACIF_H__
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "lwip/netif.h"
 | 
			
		||||
#include "netif/etharp.h"
 | 
			
		||||
#include "netif/xadapter.h"
 | 
			
		||||
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xlltemac.h"
 | 
			
		||||
#include "xlldma.h"
 | 
			
		||||
#include "xllfifo.h"
 | 
			
		||||
#include "xlldma_bdring.h"
 | 
			
		||||
 | 
			
		||||
#include "netif/xpqueue.h"
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
 | 
			
		||||
void 	xlltemacif_setmac(u32_t index, u8_t *addr);
 | 
			
		||||
u8_t*	xlltemacif_getmac(u32_t index);
 | 
			
		||||
err_t 	xlltemacif_init(struct netif *netif);
 | 
			
		||||
int 	xlltemacif_input(struct netif *netif);
 | 
			
		||||
unsigned get_IEEE_phy_speed(XLlTemac *xlltemacp);
 | 
			
		||||
unsigned Phy_Setup (XLlTemac *xlltemacp);
 | 
			
		||||
unsigned configure_IEEE_phy_speed(XLlTemac *xlltemacp, unsigned speed);
 | 
			
		||||
 | 
			
		||||
/* xlltemacif_hw.c */
 | 
			
		||||
void 	xlltemac_error_handler(XLlTemac * Temac);
 | 
			
		||||
 | 
			
		||||
/* structure within each netif, encapsulating all information required for
 | 
			
		||||
 * using a particular temac instance
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XLlDma lldma;
 | 
			
		||||
	XLlFifo llfifo;
 | 
			
		||||
	XLlTemac lltemac;
 | 
			
		||||
 | 
			
		||||
	/* queue to store overflow packets */
 | 
			
		||||
	pq_queue_t *recv_q;
 | 
			
		||||
	pq_queue_t *send_q;
 | 
			
		||||
 | 
			
		||||
	/* pointers to memory holding buffer descriptors (used only with SDMA) */
 | 
			
		||||
	void *rx_bdspace;
 | 
			
		||||
	void *tx_bdspace;
 | 
			
		||||
} xlltemacif_s;
 | 
			
		||||
 | 
			
		||||
extern xlltemacif_s xlltemacif;
 | 
			
		||||
 | 
			
		||||
/* xlltemacif_sdma.c */
 | 
			
		||||
XStatus init_sdma(struct xemac_s *xemac);
 | 
			
		||||
int  process_sent_bds(XLlDma_BdRing *txring);
 | 
			
		||||
void lldma_send_handler(void *arg);
 | 
			
		||||
XStatus lldma_sgsend(xlltemacif_s *xlltemacif, struct pbuf *p);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __NETIF_XLLTEMACIF_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LWIP_PBUF_QUEUE_H_
 | 
			
		||||
#define __LWIP_PBUF_QUEUE_H_
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" { 
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PQ_QUEUE_SIZE 4096
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	void *data[PQ_QUEUE_SIZE];
 | 
			
		||||
	int head, tail, len;
 | 
			
		||||
} pq_queue_t;
 | 
			
		||||
 | 
			
		||||
pq_queue_t*	pq_create_queue();
 | 
			
		||||
int 		pq_enqueue(pq_queue_t *q, void *p);
 | 
			
		||||
void*		pq_dequeue(pq_queue_t *q);
 | 
			
		||||
int		pq_qlength(pq_queue_t *q);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __XTOPOLOGY_H_
 | 
			
		||||
#define __XTOPOLOGY_H_
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
enum xemac_types { xemac_type_unknown = -1, xemac_type_xps_emaclite, xemac_type_xps_ll_temac, xemac_type_axi_ethernet, xemac_type_emacps };
 | 
			
		||||
 | 
			
		||||
struct xtopology_t {
 | 
			
		||||
	unsigned emac_baseaddr;
 | 
			
		||||
	enum xemac_types emac_type;
 | 
			
		||||
	unsigned intc_baseaddr;
 | 
			
		||||
	unsigned intc_emac_intr;	/* valid only for xemac_type_xps_emaclite */
 | 
			
		||||
	unsigned scugic_baseaddr; /* valid only for Zynq */
 | 
			
		||||
	unsigned scugic_emac_intr; /* valid only for GEM */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern int xtopology_n_emacs;
 | 
			
		||||
extern struct xtopology_t xtopology[];
 | 
			
		||||
 | 
			
		||||
int xtopology_find_index(unsigned base);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
#ifndef __XLWIPCONFIG_H_
 | 
			
		||||
#define __XLWIPCONFIG_H_
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* This is a generated file - do not edit */
 | 
			
		||||
 | 
			
		||||
#define XLWIP_CONFIG_INCLUDE_GEM 1
 | 
			
		||||
#define XLWIP_CONFIG_EMAC_NUMBER 0
 | 
			
		||||
#define XLWIP_CONFIG_N_TX_DESC 64
 | 
			
		||||
#define XLWIP_CONFIG_N_RX_DESC 64
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,274 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "lwipopts.h"
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
#ifdef OS_IS_XILKERNEL
 | 
			
		||||
#include "xmk.h"
 | 
			
		||||
#include "sys/process.h"
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "lwip/mem.h"
 | 
			
		||||
#include "lwip/stats.h"
 | 
			
		||||
#include "lwip/sys.h"
 | 
			
		||||
#include "lwip/ip.h"
 | 
			
		||||
#include "lwip/tcp.h"
 | 
			
		||||
#include "lwip/udp.h"
 | 
			
		||||
#include "lwip/tcp_impl.h"
 | 
			
		||||
 | 
			
		||||
#include "netif/etharp.h"
 | 
			
		||||
#include "netif/xadapter.h"
 | 
			
		||||
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_EMACLITE
 | 
			
		||||
#include "netif/xemacliteif.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_TEMAC
 | 
			
		||||
#include "netif/xlltemacif.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
 | 
			
		||||
#include "netif/xaxiemacif.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_GEM
 | 
			
		||||
#include "netif/xemacpsif.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
#include "lwip/tcpip.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* global lwip debug variable used for debugging */
 | 
			
		||||
int lwip_runtime_debug = 0;
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
lwip_raw_init()
 | 
			
		||||
{
 | 
			
		||||
	ip_init();	/* Doesn't do much, it should be called to handle future changes. */
 | 
			
		||||
#if LWIP_UDP
 | 
			
		||||
	udp_init();	/* Clears the UDP PCB list. */
 | 
			
		||||
#endif
 | 
			
		||||
#if LWIP_TCP
 | 
			
		||||
	tcp_init();	/* Clears the TCP PCB list and clears some internal TCP timers. */
 | 
			
		||||
			/* Note: you must call tcp_fasttmr() and tcp_slowtmr() at the */
 | 
			
		||||
			/* predefined regular intervals after this initialization. */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static enum xemac_types
 | 
			
		||||
find_mac_type(unsigned base)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < xtopology_n_emacs; i++) {
 | 
			
		||||
		if (xtopology[i].emac_baseaddr == base)
 | 
			
		||||
			return xtopology[i].emac_type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xemac_type_unknown;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xtopology_find_index(unsigned base)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < xtopology_n_emacs; i++) {
 | 
			
		||||
		if (xtopology[i].emac_baseaddr == base)
 | 
			
		||||
			return i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * xemac_add: this is a wrapper around lwIP's netif_add function.
 | 
			
		||||
 * The objective is to provide portability between the different Xilinx MAC's
 | 
			
		||||
 * This function can be used to add both xps_ethernetlite and xps_ll_temac
 | 
			
		||||
 * based interfaces
 | 
			
		||||
 */
 | 
			
		||||
struct netif *
 | 
			
		||||
xemac_add(struct netif *netif,
 | 
			
		||||
	struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw,
 | 
			
		||||
	unsigned char *mac_ethernet_address,
 | 
			
		||||
  	unsigned mac_baseaddr)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	/* set mac address */
 | 
			
		||||
	netif->hwaddr_len = 6;
 | 
			
		||||
	for (i = 0; i < 6; i++)
 | 
			
		||||
		netif->hwaddr[i] = mac_ethernet_address[i];
 | 
			
		||||
 | 
			
		||||
	/* initialize based on MAC type */
 | 
			
		||||
		switch (find_mac_type(mac_baseaddr)) {
 | 
			
		||||
			case xemac_type_xps_emaclite:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_EMACLITE
 | 
			
		||||
				return netif_add(netif, ipaddr, netmask, gw,
 | 
			
		||||
					(void*)mac_baseaddr,
 | 
			
		||||
					xemacliteif_init,
 | 
			
		||||
#if NO_SYS
 | 
			
		||||
					ethernet_input
 | 
			
		||||
#else
 | 
			
		||||
					tcpip_input
 | 
			
		||||
#endif
 | 
			
		||||
					);
 | 
			
		||||
#else
 | 
			
		||||
				return NULL;
 | 
			
		||||
#endif
 | 
			
		||||
			case xemac_type_xps_ll_temac:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_TEMAC
 | 
			
		||||
				return netif_add(netif, ipaddr, netmask, gw,
 | 
			
		||||
					(void*)mac_baseaddr,
 | 
			
		||||
					xlltemacif_init,
 | 
			
		||||
#if NO_SYS
 | 
			
		||||
					ethernet_input
 | 
			
		||||
#else
 | 
			
		||||
					tcpip_input
 | 
			
		||||
#endif
 | 
			
		||||
					);
 | 
			
		||||
#else
 | 
			
		||||
				return NULL;
 | 
			
		||||
#endif
 | 
			
		||||
			case xemac_type_axi_ethernet:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
 | 
			
		||||
				return netif_add(netif, ipaddr, netmask, gw,
 | 
			
		||||
					(void*)mac_baseaddr,
 | 
			
		||||
					xaxiemacif_init,
 | 
			
		||||
#if NO_SYS
 | 
			
		||||
					ethernet_input
 | 
			
		||||
#else
 | 
			
		||||
					tcpip_input
 | 
			
		||||
#endif
 | 
			
		||||
					);
 | 
			
		||||
#else
 | 
			
		||||
				return NULL;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __arm__
 | 
			
		||||
			case xemac_type_emacps:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_GEM
 | 
			
		||||
				return netif_add(netif, ipaddr, netmask, gw,
 | 
			
		||||
						(void*)mac_baseaddr,
 | 
			
		||||
						xemacpsif_init,
 | 
			
		||||
#if NO_SYS
 | 
			
		||||
						ethernet_input
 | 
			
		||||
#else
 | 
			
		||||
						tcpip_input
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
						);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
			default:
 | 
			
		||||
				printf("unable to determine type of EMAC with baseaddress 0x%08x\r\n",
 | 
			
		||||
						mac_baseaddr);
 | 
			
		||||
				return NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
/*
 | 
			
		||||
 * The input thread calls lwIP to process any received packets.
 | 
			
		||||
 * This thread waits until a packet is received (sem_rx_data_available),
 | 
			
		||||
 * and then calls xemacif_input which processes 1 packet at a time.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
xemacif_input_thread(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	struct xemac_s *emac = (struct xemac_s *)netif->state;
 | 
			
		||||
	while (1) {
 | 
			
		||||
		/* sleep until there are packets to process
 | 
			
		||||
		 * This semaphore is set by the packet receive interrupt
 | 
			
		||||
		 * routine.
 | 
			
		||||
		 */
 | 
			
		||||
		sys_arch_sem_wait( &emac->sem_rx_data_available, 250 / portTICK_PERIOD_MS );
 | 
			
		||||
 | 
			
		||||
		/* move all received packets to lwIP */
 | 
			
		||||
		xemacif_input(netif);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xemacif_input(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	struct xemac_s *emac = (struct xemac_s *)netif->state;
 | 
			
		||||
	SYS_ARCH_DECL_PROTECT(lev);
 | 
			
		||||
 | 
			
		||||
	int n_packets = 0;
 | 
			
		||||
 | 
			
		||||
	switch (emac->type) {
 | 
			
		||||
		case xemac_type_xps_emaclite:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_EMACLITE
 | 
			
		||||
			SYS_ARCH_PROTECT(lev);
 | 
			
		||||
			n_packets = xemacliteif_input(netif);
 | 
			
		||||
			SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
			break;
 | 
			
		||||
#else
 | 
			
		||||
			print("incorrect configuration: xps_ethernetlite drivers not present?");
 | 
			
		||||
			while(1);
 | 
			
		||||
			return 0;
 | 
			
		||||
#endif
 | 
			
		||||
		case xemac_type_xps_ll_temac:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_TEMAC
 | 
			
		||||
			SYS_ARCH_PROTECT(lev);
 | 
			
		||||
			n_packets = xlltemacif_input(netif);
 | 
			
		||||
			SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
			break;
 | 
			
		||||
#else
 | 
			
		||||
			print("incorrect configuration: xps_ll_temac drivers not present?");
 | 
			
		||||
			while(1);
 | 
			
		||||
			return 0;
 | 
			
		||||
#endif
 | 
			
		||||
		case xemac_type_axi_ethernet:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
 | 
			
		||||
			SYS_ARCH_PROTECT(lev);
 | 
			
		||||
			n_packets = xaxiemacif_input(netif);
 | 
			
		||||
			SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
			break;
 | 
			
		||||
#else
 | 
			
		||||
			print("incorrect configuration: axi_ethernet drivers not present?");
 | 
			
		||||
			while(1);
 | 
			
		||||
			return 0;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __arm__
 | 
			
		||||
		case xemac_type_emacps:
 | 
			
		||||
#ifdef XLWIP_CONFIG_INCLUDE_GEM
 | 
			
		||||
			SYS_ARCH_PROTECT(lev);
 | 
			
		||||
			n_packets = xemacpsif_input(netif);
 | 
			
		||||
			SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
			break;
 | 
			
		||||
#else
 | 
			
		||||
			xil_printf("incorrect configuration: ps7_ethernet drivers not present?\r\n");
 | 
			
		||||
			while(1);
 | 
			
		||||
			return 0;
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
		default:
 | 
			
		||||
			print("incorrect configuration: unknown temac type");
 | 
			
		||||
			while(1);
 | 
			
		||||
			return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return n_packets;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,458 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include <xparameters.h>
 | 
			
		||||
#include "lwipopts.h"
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
#include "lwip/def.h"
 | 
			
		||||
#include "lwip/mem.h"
 | 
			
		||||
#include "lwip/pbuf.h"
 | 
			
		||||
#include "lwip/sys.h"
 | 
			
		||||
#include "lwip/stats.h"
 | 
			
		||||
#include "lwip/igmp.h"
 | 
			
		||||
 | 
			
		||||
#include "netif/etharp.h"
 | 
			
		||||
#include "netif/xemacpsif.h"
 | 
			
		||||
#include "netif/xadapter.h"
 | 
			
		||||
#include "netif/xpqueue.h"
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xuartps.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
#include "xemacps.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Define those to better describe your network interface. */
 | 
			
		||||
#define IFNAME0 't'
 | 
			
		||||
#define IFNAME1 'e'
 | 
			
		||||
 | 
			
		||||
#if LWIP_IGMP
 | 
			
		||||
static err_t xemacpsif_mac_filter_update (struct netif *netif,
 | 
			
		||||
							struct ip_addr *group, u8_t action);
 | 
			
		||||
 | 
			
		||||
static u8_t xemacps_mcast_entry_mask = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
XEmacPs_Config *mac_config;
 | 
			
		||||
struct netif *NetIf;
 | 
			
		||||
void FreeTxPBufs(void);
 | 
			
		||||
/*
 | 
			
		||||
 * this function is always called with interrupts off
 | 
			
		||||
 * this function also assumes that there are available BD's
 | 
			
		||||
 */
 | 
			
		||||
static err_t _unbuffered_low_level_output(xemacpsif_s *xemacpsif,
 | 
			
		||||
													struct pbuf *p)
 | 
			
		||||
{
 | 
			
		||||
    	XStatus status = 0;
 | 
			
		||||
 | 
			
		||||
#if ETH_PAD_SIZE
 | 
			
		||||
	pbuf_header(p, -ETH_PAD_SIZE);	/* drop the padding word */
 | 
			
		||||
#endif
 | 
			
		||||
	status = emacps_sgsend(xemacpsif, p);
 | 
			
		||||
	if (status != XST_SUCCESS) {
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
	lwip_stats.link.drop++;
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if ETH_PAD_SIZE
 | 
			
		||||
	pbuf_header(p, ETH_PAD_SIZE);	/* reclaim the padding word */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
	lwip_stats.link.xmit++;
 | 
			
		||||
#endif /* LINK_STATS */
 | 
			
		||||
 | 
			
		||||
	return ERR_OK;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * low_level_output():
 | 
			
		||||
 *
 | 
			
		||||
 * Should do the actual transmission of the packet. The packet is
 | 
			
		||||
 * contained in the pbuf that is passed to the function. This pbuf
 | 
			
		||||
 * might be chained.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static err_t low_level_output(struct netif *netif, struct pbuf *p)
 | 
			
		||||
{
 | 
			
		||||
	SYS_ARCH_DECL_PROTECT(lev);
 | 
			
		||||
        err_t err;
 | 
			
		||||
 | 
			
		||||
	struct xemac_s *xemac = (struct xemac_s *)(netif->state);
 | 
			
		||||
	xemacpsif_s *xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
 | 
			
		||||
	SYS_ARCH_PROTECT(lev);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* check if space is available to send */
 | 
			
		||||
        if (is_tx_space_available(xemacpsif)) {
 | 
			
		||||
		_unbuffered_low_level_output(xemacpsif, p);
 | 
			
		||||
		err = ERR_OK;
 | 
			
		||||
	} else {
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
		lwip_stats.link.drop++;
 | 
			
		||||
#endif
 | 
			
		||||
		print("pack dropped, no space\r\n");
 | 
			
		||||
		err = ERR_MEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * low_level_input():
 | 
			
		||||
 *
 | 
			
		||||
 * Should allocate a pbuf and transfer the bytes of the incoming
 | 
			
		||||
 * packet from the interface into the pbuf.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
static struct pbuf * low_level_input(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	struct xemac_s *xemac = (struct xemac_s *)(netif->state);
 | 
			
		||||
	xemacpsif_s *xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
 | 
			
		||||
	/* see if there is data to process */
 | 
			
		||||
	if (pq_qlength(xemacpsif->recv_q) == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	/* return one packet from receive q */
 | 
			
		||||
	p = (struct pbuf *)pq_dequeue(xemacpsif->recv_q);
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * xemacpsif_output():
 | 
			
		||||
 *
 | 
			
		||||
 * This function is called by the TCP/IP stack when an IP packet
 | 
			
		||||
 * should be sent. It calls the function called low_level_output() to
 | 
			
		||||
 * do the actual transmission of the packet.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static err_t xemacpsif_output(struct netif *netif, struct pbuf *p,
 | 
			
		||||
		struct ip_addr *ipaddr)
 | 
			
		||||
{
 | 
			
		||||
	/* resolve hardware address, then send (or queue) packet */
 | 
			
		||||
	return etharp_output(netif, p, ipaddr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * xemacpsif_input():
 | 
			
		||||
 *
 | 
			
		||||
 * This function should be called when a packet is ready to be read
 | 
			
		||||
 * from the interface. It uses the function low_level_input() that
 | 
			
		||||
 * should handle the actual reception of bytes from the network
 | 
			
		||||
 * interface.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the number of packets read (max 1 packet on success,
 | 
			
		||||
 * 0 if there are no packets)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int xemacpsif_input(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	struct eth_hdr *ethhdr;
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
	SYS_ARCH_DECL_PROTECT(lev);
 | 
			
		||||
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
	while (1)
 | 
			
		||||
#endif
 | 
			
		||||
	{
 | 
			
		||||
	/* move received packet into a new pbuf */
 | 
			
		||||
	SYS_ARCH_PROTECT(lev);
 | 
			
		||||
	p = low_level_input(netif);
 | 
			
		||||
	SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
 | 
			
		||||
	/* no packet could be read, silently ignore this */
 | 
			
		||||
	if (p == NULL) {
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* points to packet payload, which starts with an Ethernet header */
 | 
			
		||||
	ethhdr = p->payload;
 | 
			
		||||
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
	lwip_stats.link.recv++;
 | 
			
		||||
#endif /* LINK_STATS */
 | 
			
		||||
 | 
			
		||||
	switch (htons(ethhdr->type)) {
 | 
			
		||||
		/* IP or ARP packet? */
 | 
			
		||||
		case ETHTYPE_IP:
 | 
			
		||||
		case ETHTYPE_ARP:
 | 
			
		||||
#if PPPOE_SUPPORT
 | 
			
		||||
			/* PPPoE packet? */
 | 
			
		||||
		case ETHTYPE_PPPOEDISC:
 | 
			
		||||
		case ETHTYPE_PPPOE:
 | 
			
		||||
#endif /* PPPOE_SUPPORT */
 | 
			
		||||
			/* full packet send to tcpip_thread to process */
 | 
			
		||||
			if (netif->input(p, netif) != ERR_OK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("xemacpsif_input: IP input error\r\n"));
 | 
			
		||||
				pbuf_free(p);
 | 
			
		||||
				p = NULL;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			pbuf_free(p);
 | 
			
		||||
			p = NULL;
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static err_t low_level_init(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	unsigned mac_address = (unsigned)(netif->state);
 | 
			
		||||
	struct xemac_s *xemac;
 | 
			
		||||
	xemacpsif_s *xemacpsif;
 | 
			
		||||
	u32 dmacrreg;
 | 
			
		||||
 | 
			
		||||
	int Status = XST_SUCCESS;
 | 
			
		||||
 | 
			
		||||
	NetIf = netif;
 | 
			
		||||
 | 
			
		||||
	xemacpsif = mem_malloc(sizeof *xemacpsif);
 | 
			
		||||
	if (xemacpsif == NULL) {
 | 
			
		||||
		LWIP_DEBUGF(NETIF_DEBUG, ("xemacpsif_init: out of memory\r\n"));
 | 
			
		||||
		return ERR_MEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	xemac = mem_malloc(sizeof *xemac);
 | 
			
		||||
	if (xemac == NULL) {
 | 
			
		||||
		LWIP_DEBUGF(NETIF_DEBUG, ("xemacpsif_init: out of memory\r\n"));
 | 
			
		||||
		return ERR_MEM;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	xemac->state = (void *)xemacpsif;
 | 
			
		||||
	xemac->topology_index = xtopology_find_index(mac_address);
 | 
			
		||||
	xemac->type = xemac_type_emacps;
 | 
			
		||||
 | 
			
		||||
	xemacpsif->send_q = NULL;
 | 
			
		||||
	xemacpsif->recv_q = pq_create_queue();
 | 
			
		||||
	if (!xemacpsif->recv_q)
 | 
			
		||||
		return ERR_MEM;
 | 
			
		||||
 | 
			
		||||
	/* maximum transfer unit */
 | 
			
		||||
	netif->mtu = XEMACPS_MTU - XEMACPS_HDR_SIZE;
 | 
			
		||||
 | 
			
		||||
#if LWIP_IGMP
 | 
			
		||||
	netif->igmp_mac_filter = xemacpsif_mac_filter_update;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP |
 | 
			
		||||
											NETIF_FLAG_LINK_UP;
 | 
			
		||||
 | 
			
		||||
#if LWIP_IGMP
 | 
			
		||||
	netif->flags |= NETIF_FLAG_IGMP;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
	sys_sem_new(&xemac->sem_rx_data_available, 0);
 | 
			
		||||
#endif
 | 
			
		||||
	/* obtain config of this emac */
 | 
			
		||||
	mac_config = (XEmacPs_Config *)xemacps_lookup_config((unsigned)netif->state);
 | 
			
		||||
 | 
			
		||||
	Status = XEmacPs_CfgInitialize(&xemacpsif->emacps, mac_config,
 | 
			
		||||
						mac_config->BaseAddress);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		xil_printf("In %s:EmacPs Configuration Failed....\r\n", __func__);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* initialize the mac */
 | 
			
		||||
	init_emacps(xemacpsif, netif);
 | 
			
		||||
 | 
			
		||||
	dmacrreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
														XEMACPS_DMACR_OFFSET);
 | 
			
		||||
	dmacrreg = dmacrreg | (0x00000010);
 | 
			
		||||
	XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
											XEMACPS_DMACR_OFFSET, dmacrreg);
 | 
			
		||||
 | 
			
		||||
	setup_isr(xemac);
 | 
			
		||||
	init_dma(xemac);
 | 
			
		||||
	start_emacps(xemacpsif);
 | 
			
		||||
 | 
			
		||||
	/* replace the state in netif (currently the emac baseaddress)
 | 
			
		||||
	 * with the mac instance pointer.
 | 
			
		||||
	 */
 | 
			
		||||
	netif->state = (void *)xemac;
 | 
			
		||||
 | 
			
		||||
	return ERR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HandleEmacPsError(struct xemac_s *xemac)
 | 
			
		||||
{
 | 
			
		||||
	xemacpsif_s   *xemacpsif;
 | 
			
		||||
	int Status = XST_SUCCESS;
 | 
			
		||||
	u32 dmacrreg;
 | 
			
		||||
 | 
			
		||||
	SYS_ARCH_DECL_PROTECT(lev);
 | 
			
		||||
	SYS_ARCH_PROTECT(lev);
 | 
			
		||||
 | 
			
		||||
	FreeTxRxPBufs();
 | 
			
		||||
	xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	Status = XEmacPs_CfgInitialize(&xemacpsif->emacps, mac_config,
 | 
			
		||||
						mac_config->BaseAddress);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		xil_printf("In %s:EmacPs Configuration Failed....\r\n", __func__);
 | 
			
		||||
	}
 | 
			
		||||
	/* initialize the mac */
 | 
			
		||||
	init_emacps_on_error(xemacpsif, NetIf);
 | 
			
		||||
	dmacrreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
														XEMACPS_DMACR_OFFSET);
 | 
			
		||||
	dmacrreg = dmacrreg | (0x01000000);
 | 
			
		||||
	XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
											XEMACPS_DMACR_OFFSET, dmacrreg);
 | 
			
		||||
	setup_isr(xemac);
 | 
			
		||||
	init_dma(xemac);
 | 
			
		||||
	start_emacps(xemacpsif);
 | 
			
		||||
 | 
			
		||||
	SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HandleTxErrors(struct xemac_s *xemac)
 | 
			
		||||
{
 | 
			
		||||
	xemacpsif_s   *xemacpsif;
 | 
			
		||||
	u32 netctrlreg;
 | 
			
		||||
 | 
			
		||||
	SYS_ARCH_DECL_PROTECT(lev);
 | 
			
		||||
	SYS_ARCH_PROTECT(lev);
 | 
			
		||||
	xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
												XEMACPS_NWCTRL_OFFSET);
 | 
			
		||||
    netctrlreg = netctrlreg & (~XEMACPS_NWCTRL_TXEN_MASK);
 | 
			
		||||
	XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
									XEMACPS_NWCTRL_OFFSET, netctrlreg);
 | 
			
		||||
	FreeOnlyTxPBufs();
 | 
			
		||||
 | 
			
		||||
	clean_dma_txdescs(xemac);
 | 
			
		||||
	netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
													XEMACPS_NWCTRL_OFFSET);
 | 
			
		||||
	netctrlreg = netctrlreg | (XEMACPS_NWCTRL_TXEN_MASK);
 | 
			
		||||
	XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
										XEMACPS_NWCTRL_OFFSET, netctrlreg);
 | 
			
		||||
	SYS_ARCH_UNPROTECT(lev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if LWIP_IGMP
 | 
			
		||||
static err_t xemacpsif_mac_filter_update (struct netif *netif, struct ip_addr *group,
 | 
			
		||||
								u8_t action)
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * xemacpsif_init():
 | 
			
		||||
 *
 | 
			
		||||
 * Should be called at the beginning of the program to set up the
 | 
			
		||||
 * network interface. It calls the function low_level_init() to do the
 | 
			
		||||
 * actual setup of the hardware.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
err_t xemacpsif_init(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
#if LWIP_SNMP
 | 
			
		||||
	/* ifType ethernetCsmacd(6) @see RFC1213 */
 | 
			
		||||
	netif->link_type = 6;
 | 
			
		||||
	/* your link speed here */
 | 
			
		||||
	netif->link_speed = ;
 | 
			
		||||
	netif->ts = 0;
 | 
			
		||||
	netif->ifinoctets = 0;
 | 
			
		||||
	netif->ifinucastpkts = 0;
 | 
			
		||||
	netif->ifinnucastpkts = 0;
 | 
			
		||||
	netif->ifindiscards = 0;
 | 
			
		||||
	netif->ifoutoctets = 0;
 | 
			
		||||
	netif->ifoutucastpkts = 0;
 | 
			
		||||
	netif->ifoutnucastpkts = 0;
 | 
			
		||||
	netif->ifoutdiscards = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	netif->name[0] = IFNAME0;
 | 
			
		||||
	netif->name[1] = IFNAME1;
 | 
			
		||||
	netif->output = xemacpsif_output;
 | 
			
		||||
	netif->linkoutput = low_level_output;
 | 
			
		||||
 | 
			
		||||
	low_level_init(netif);
 | 
			
		||||
	return ERR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * xemacpsif_resetrx_on_no_rxdata():
 | 
			
		||||
 *
 | 
			
		||||
 * Should be called by the user at regular intervals, typically
 | 
			
		||||
 * from a timer (100 msecond). This is to provide a SW workaround
 | 
			
		||||
 * for the HW bug (SI #692601). Please refer to the function header
 | 
			
		||||
 * for the function resetrx_on_no_rxdata in xemacpsif_dma.c to
 | 
			
		||||
 * know more about the SI.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void xemacpsif_resetrx_on_no_rxdata(struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	struct xemac_s *xemac = (struct xemac_s *)(netif->state);
 | 
			
		||||
	xemacpsif_s *xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
 | 
			
		||||
	resetrx_on_no_rxdata(xemacpsif);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,622 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "lwipopts.h"
 | 
			
		||||
#include "lwip/stats.h"
 | 
			
		||||
#include "lwip/sys.h"
 | 
			
		||||
#include "lwip/inet_chksum.h"
 | 
			
		||||
 | 
			
		||||
#include "netif/xadapter.h"
 | 
			
		||||
#include "netif/xemacpsif.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
 | 
			
		||||
#include "xlwipconfig.h"
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xparameters_ps.h"
 | 
			
		||||
#include "xil_exception.h"
 | 
			
		||||
#include "xil_mmu.h"
 | 
			
		||||
#ifdef CONFIG_XTRACE
 | 
			
		||||
#include "xtrace.h"
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
#include "timers.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c
 | 
			
		||||
 *** to run it on a PEEP board
 | 
			
		||||
 ***/
 | 
			
		||||
 | 
			
		||||
#define INTC_BASE_ADDR		XPAR_SCUGIC_CPU_BASEADDR
 | 
			
		||||
#define INTC_DIST_BASE_ADDR	XPAR_SCUGIC_DIST_BASEADDR
 | 
			
		||||
 | 
			
		||||
/* Byte alignment of BDs */
 | 
			
		||||
#define BD_ALIGNMENT (XEMACPS_DMABD_MINIMUM_ALIGNMENT*2)
 | 
			
		||||
 | 
			
		||||
static int tx_pbufs_storage[XLWIP_CONFIG_N_TX_DESC];
 | 
			
		||||
static int rx_pbufs_storage[XLWIP_CONFIG_N_RX_DESC];
 | 
			
		||||
 | 
			
		||||
static int EmacIntrNum;
 | 
			
		||||
extern u8 _end;
 | 
			
		||||
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
extern BaseType_t xInsideISR;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_BD_TO_INDEX(ringptr, bdptr)				\
 | 
			
		||||
	(((u32)bdptr - (u32)(ringptr)->BaseBdAddr) / (ringptr)->Separation)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int is_tx_space_available(xemacpsif_s *emac)
 | 
			
		||||
{
 | 
			
		||||
	XEmacPs_BdRing *txring;
 | 
			
		||||
	int freecnt = 0;
 | 
			
		||||
 | 
			
		||||
	txring = &(XEmacPs_GetTxRing(&emac->emacps));
 | 
			
		||||
 | 
			
		||||
	/* tx space is available as long as there are valid BD's */
 | 
			
		||||
	freecnt = XEmacPs_BdRingGetFreeCnt(txring);
 | 
			
		||||
	return freecnt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void process_sent_bds(XEmacPs_BdRing *txring)
 | 
			
		||||
{
 | 
			
		||||
	XEmacPs_Bd *txbdset;
 | 
			
		||||
	XEmacPs_Bd *CurBdPntr;
 | 
			
		||||
	int n_bds;
 | 
			
		||||
	XStatus Status;
 | 
			
		||||
	int n_pbufs_freed = 0;
 | 
			
		||||
	unsigned int BdIndex;
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
	unsigned int *Temp;
 | 
			
		||||
 | 
			
		||||
	while (1) {
 | 
			
		||||
		/* obtain processed BD's */
 | 
			
		||||
		n_bds = XEmacPs_BdRingFromHwTx(txring,
 | 
			
		||||
								XLWIP_CONFIG_N_TX_DESC, &txbdset);
 | 
			
		||||
		if (n_bds == 0)  {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		/* free the processed BD's */
 | 
			
		||||
		n_pbufs_freed = n_bds;
 | 
			
		||||
		CurBdPntr = txbdset;
 | 
			
		||||
		while (n_pbufs_freed > 0) {
 | 
			
		||||
			BdIndex = XEMACPS_BD_TO_INDEX(txring, CurBdPntr);
 | 
			
		||||
			Temp = (unsigned int *)CurBdPntr;
 | 
			
		||||
			*Temp = 0;
 | 
			
		||||
			Temp++;
 | 
			
		||||
			*Temp = 0x80000000;
 | 
			
		||||
			if (BdIndex == (XLWIP_CONFIG_N_TX_DESC - 1)) {
 | 
			
		||||
				*Temp = 0xC0000000;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = (struct pbuf *)tx_pbufs_storage[BdIndex];
 | 
			
		||||
			if(p != NULL) {
 | 
			
		||||
				pbuf_free(p);
 | 
			
		||||
			}
 | 
			
		||||
			tx_pbufs_storage[BdIndex] = 0;
 | 
			
		||||
			CurBdPntr = XEmacPs_BdRingNext(txring, CurBdPntr);
 | 
			
		||||
			n_pbufs_freed--;
 | 
			
		||||
			dsb();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Status = XEmacPs_BdRingFree(txring, n_bds, txbdset);
 | 
			
		||||
		if (Status != XST_SUCCESS) {
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("Failure while freeing in Tx Done ISR\r\n"));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void vPendableSendCompleteFunction( void *pvParameter, uint32_t ulParameter )
 | 
			
		||||
{
 | 
			
		||||
	( void ) ulParameter;
 | 
			
		||||
	process_sent_bds(pvParameter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void emacps_send_handler(void *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct xemac_s *xemac;
 | 
			
		||||
	xemacpsif_s   *xemacpsif;
 | 
			
		||||
	XEmacPs_BdRing *TxRingPtr;
 | 
			
		||||
	unsigned int regval;
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
	xInsideISR++;
 | 
			
		||||
#endif
 | 
			
		||||
	xemac = (struct xemac_s *)(arg);
 | 
			
		||||
	xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	TxRingPtr = &(XEmacPs_GetTxRing(&xemacpsif->emacps));
 | 
			
		||||
	regval = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_TXSR_OFFSET);
 | 
			
		||||
	XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,XEMACPS_TXSR_OFFSET, regval);
 | 
			
		||||
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
	xInsideISR--;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	/* If Transmit done interrupt is asserted, process completed BD's - Replaced
 | 
			
		||||
	a call to process_sent_bds(TxRingPtr); with a pendable function to prevent
 | 
			
		||||
	the memory allocation files being accessed from the ISR with not redress if
 | 
			
		||||
	obtaining the mutex fails. */
 | 
			
		||||
	{
 | 
			
		||||
		BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 | 
			
		||||
		xTimerPendFunctionCallFromISR( vPendableSendCompleteFunction, TxRingPtr, 0, &xHigherPriorityTaskWoken );
 | 
			
		||||
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
XStatus emacps_sgsend(xemacpsif_s *xemacpsif, struct pbuf *p)
 | 
			
		||||
{
 | 
			
		||||
	struct pbuf *q;
 | 
			
		||||
	int n_pbufs;
 | 
			
		||||
	XEmacPs_Bd *txbdset, *txbd, *last_txbd = NULL;
 | 
			
		||||
	XEmacPs_Bd *temp_txbd;
 | 
			
		||||
	XStatus Status;
 | 
			
		||||
	XEmacPs_BdRing *txring;
 | 
			
		||||
	unsigned int BdIndex;
 | 
			
		||||
	unsigned int lev;
 | 
			
		||||
 | 
			
		||||
	lev = mfcpsr();
 | 
			
		||||
	mtcpsr(lev | 0x000000C0);
 | 
			
		||||
 | 
			
		||||
#ifdef PEEP
 | 
			
		||||
    while((XEmacPs_ReadReg((xemacpsif->emacps).Config.BaseAddress,
 | 
			
		||||
    									XEMACPS_TXSR_OFFSET)) & 0x08);
 | 
			
		||||
#endif
 | 
			
		||||
	txring = &(XEmacPs_GetTxRing(&xemacpsif->emacps));
 | 
			
		||||
 | 
			
		||||
	/* first count the number of pbufs */
 | 
			
		||||
	for (q = p, n_pbufs = 0; q != NULL; q = q->next)
 | 
			
		||||
		n_pbufs++;
 | 
			
		||||
 | 
			
		||||
	/* obtain as many BD's */
 | 
			
		||||
	Status = XEmacPs_BdRingAlloc(txring, n_pbufs, &txbdset);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		mtcpsr(lev);
 | 
			
		||||
		LWIP_DEBUGF(NETIF_DEBUG, ("sgsend: Error allocating TxBD\r\n"));
 | 
			
		||||
		return ERR_IF;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(q = p, txbd = txbdset; q != NULL; q = q->next) {
 | 
			
		||||
		BdIndex = XEMACPS_BD_TO_INDEX(txring, txbd);
 | 
			
		||||
		if (tx_pbufs_storage[BdIndex] != 0) {
 | 
			
		||||
			mtcpsr(lev);
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("PBUFS not available\r\n"));
 | 
			
		||||
			return ERR_IF;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Send the data from the pbuf to the interface, one pbuf at a
 | 
			
		||||
		   time. The size of the data in each pbuf is kept in the ->len
 | 
			
		||||
		   variable. */
 | 
			
		||||
		Xil_DCacheFlushRange((unsigned int)q->payload, (unsigned)q->len);
 | 
			
		||||
 | 
			
		||||
		XEmacPs_BdSetAddressTx(txbd, (u32)q->payload);
 | 
			
		||||
		if (q->len > (XEMACPS_MAX_FRAME_SIZE - 18))
 | 
			
		||||
			XEmacPs_BdSetLength(txbd, (XEMACPS_MAX_FRAME_SIZE - 18) & 0x3FFF);
 | 
			
		||||
		else
 | 
			
		||||
			XEmacPs_BdSetLength(txbd, q->len & 0x3FFF);
 | 
			
		||||
 | 
			
		||||
		tx_pbufs_storage[BdIndex] = (int)q;
 | 
			
		||||
 | 
			
		||||
		pbuf_ref(q);
 | 
			
		||||
		last_txbd = txbd;
 | 
			
		||||
		XEmacPs_BdClearLast(txbd);
 | 
			
		||||
		dsb();
 | 
			
		||||
 		txbd = XEmacPs_BdRingNext(txring, txbd);
 | 
			
		||||
	}
 | 
			
		||||
	XEmacPs_BdSetLast(last_txbd);
 | 
			
		||||
	dsb();
 | 
			
		||||
	/* For fragmented packets, remember the 1st BD allocated for the 1st
 | 
			
		||||
	   packet fragment. The used bit for this BD should be cleared at the end
 | 
			
		||||
	   after clearing out used bits for other fragments. For packets without
 | 
			
		||||
	   just remember the allocated BD. */
 | 
			
		||||
	temp_txbd = txbdset;
 | 
			
		||||
	txbd = txbdset;
 | 
			
		||||
	txbd = XEmacPs_BdRingNext(txring, txbd);
 | 
			
		||||
	q = p->next;
 | 
			
		||||
	for(; q != NULL; q = q->next) {
 | 
			
		||||
		XEmacPs_BdClearTxUsed(txbd);
 | 
			
		||||
		txbd = XEmacPs_BdRingNext(txring, txbd);
 | 
			
		||||
	}
 | 
			
		||||
	XEmacPs_BdClearTxUsed(temp_txbd);
 | 
			
		||||
	dsb();
 | 
			
		||||
 | 
			
		||||
	Status = XEmacPs_BdRingToHw(txring, n_pbufs, txbdset);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		mtcpsr(lev);
 | 
			
		||||
		LWIP_DEBUGF(NETIF_DEBUG, ("sgsend: Error submitting TxBD\r\n"));
 | 
			
		||||
		return ERR_IF;
 | 
			
		||||
	}
 | 
			
		||||
	dsb();
 | 
			
		||||
	/* Start transmit */
 | 
			
		||||
	XEmacPs_WriteReg((xemacpsif->emacps).Config.BaseAddress,
 | 
			
		||||
	XEMACPS_NWCTRL_OFFSET,
 | 
			
		||||
	(XEmacPs_ReadReg((xemacpsif->emacps).Config.BaseAddress,
 | 
			
		||||
	XEMACPS_NWCTRL_OFFSET) | XEMACPS_NWCTRL_STARTTX_MASK));
 | 
			
		||||
	dsb();
 | 
			
		||||
	mtcpsr(lev);
 | 
			
		||||
	return Status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void setup_rx_bds(XEmacPs_BdRing *rxring)
 | 
			
		||||
{
 | 
			
		||||
	XEmacPs_Bd *rxbd;
 | 
			
		||||
	XStatus Status;
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
	unsigned int FreeBds;
 | 
			
		||||
	unsigned int BdIndex;
 | 
			
		||||
	unsigned int *Temp;
 | 
			
		||||
 | 
			
		||||
	FreeBds = XEmacPs_BdRingGetFreeCnt (rxring);
 | 
			
		||||
	while (FreeBds > 0) {
 | 
			
		||||
		FreeBds--;
 | 
			
		||||
		Status = XEmacPs_BdRingAlloc(rxring, 1, &rxbd);
 | 
			
		||||
		if (Status != XST_SUCCESS) {
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("setup_rx_bds: Error allocating RxBD\r\n"));
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		BdIndex = XEMACPS_BD_TO_INDEX(rxring, rxbd);
 | 
			
		||||
		Temp = (unsigned int *)rxbd;
 | 
			
		||||
		*Temp = 0;
 | 
			
		||||
		if (BdIndex == (XLWIP_CONFIG_N_RX_DESC - 1)) {
 | 
			
		||||
			*Temp = 0x00000002;
 | 
			
		||||
		}
 | 
			
		||||
		Temp++;
 | 
			
		||||
		*Temp = 0;
 | 
			
		||||
 | 
			
		||||
		p = pbuf_alloc(PBUF_RAW, XEMACPS_MAX_FRAME_SIZE, PBUF_POOL);
 | 
			
		||||
		if (!p) {
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
			lwip_stats.link.memerr++;
 | 
			
		||||
			lwip_stats.link.drop++;
 | 
			
		||||
#endif
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("unable to alloc pbuf in recv_handler\r\n"));
 | 
			
		||||
			XEmacPs_BdRingUnAlloc(rxring, 1, rxbd);
 | 
			
		||||
			dsb();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		XEmacPs_BdSetAddressRx(rxbd, (u32)p->payload);
 | 
			
		||||
		dsb();
 | 
			
		||||
 | 
			
		||||
		rx_pbufs_storage[BdIndex] = (int)p;
 | 
			
		||||
		Status = XEmacPs_BdRingToHw(rxring, 1, rxbd);
 | 
			
		||||
		if (Status != XST_SUCCESS) {
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("Error committing RxBD to hardware: "));
 | 
			
		||||
			if (Status == XST_DMA_SG_LIST_ERROR)
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("XST_DMA_SG_LIST_ERROR: this function was called out of sequence with XEmacPs_BdRingAlloc()\r\n"));
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("set of BDs was rejected because the first BD did not have its start-of-packet bit set, or the last BD did not have its end-of-packet bit set, or any one of the BD set has 0 as length value\r\n"));
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void emacps_recv_handler(void *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
	XEmacPs_Bd *rxbdset, *CurBdPtr;
 | 
			
		||||
	struct xemac_s *xemac;
 | 
			
		||||
	xemacpsif_s *xemacpsif;
 | 
			
		||||
	XEmacPs_BdRing *rxring;
 | 
			
		||||
	volatile int bd_processed;
 | 
			
		||||
	int rx_bytes, k;
 | 
			
		||||
	unsigned int BdIndex;
 | 
			
		||||
	unsigned int regval;
 | 
			
		||||
 | 
			
		||||
	xemac = (struct xemac_s *)(arg);
 | 
			
		||||
	xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	rxring = &XEmacPs_GetRxRing(&xemacpsif->emacps);
 | 
			
		||||
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
	xInsideISR++;
 | 
			
		||||
#endif
 | 
			
		||||
	/*
 | 
			
		||||
	 * If Reception done interrupt is asserted, call RX call back function
 | 
			
		||||
	 * to handle the processed BDs and then raise the according flag.
 | 
			
		||||
	 */
 | 
			
		||||
	regval = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_RXSR_OFFSET);
 | 
			
		||||
	XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_RXSR_OFFSET, regval);
 | 
			
		||||
 | 
			
		||||
	resetrx_on_no_rxdata(xemacpsif);
 | 
			
		||||
 | 
			
		||||
	while(1) {
 | 
			
		||||
 | 
			
		||||
		bd_processed = XEmacPs_BdRingFromHwRx(rxring, XLWIP_CONFIG_N_RX_DESC, &rxbdset);
 | 
			
		||||
 | 
			
		||||
		if (bd_processed <= 0) {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (k = 0, CurBdPtr=rxbdset; k < bd_processed; k++) {
 | 
			
		||||
 | 
			
		||||
			BdIndex = XEMACPS_BD_TO_INDEX(rxring, CurBdPtr);
 | 
			
		||||
			p = (struct pbuf *)rx_pbufs_storage[BdIndex];
 | 
			
		||||
 | 
			
		||||
			/*
 | 
			
		||||
		 	 * Adjust the buffer size to the actual number of bytes received.
 | 
			
		||||
		 	 */
 | 
			
		||||
			rx_bytes = XEmacPs_BdGetLength(CurBdPtr);
 | 
			
		||||
			pbuf_realloc(p, rx_bytes);
 | 
			
		||||
			Xil_DCacheInvalidateRange((unsigned int)p->payload, (unsigned)XEMACPS_MAX_FRAME_SIZE);
 | 
			
		||||
			/* store it in the receive queue,
 | 
			
		||||
		 	 * where it'll be processed by a different handler
 | 
			
		||||
		 	 */
 | 
			
		||||
			if (pq_enqueue(xemacpsif->recv_q, (void*)p) < 0) {
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
				lwip_stats.link.memerr++;
 | 
			
		||||
				lwip_stats.link.drop++;
 | 
			
		||||
#endif
 | 
			
		||||
				pbuf_free(p);
 | 
			
		||||
			} else {
 | 
			
		||||
#if !NO_SYS
 | 
			
		||||
				sys_sem_signal(&xemac->sem_rx_data_available);
 | 
			
		||||
#endif
 | 
			
		||||
			}
 | 
			
		||||
			CurBdPtr = XEmacPs_BdRingNext( rxring, CurBdPtr);
 | 
			
		||||
		}
 | 
			
		||||
		/* free up the BD's */
 | 
			
		||||
		XEmacPs_BdRingFree(rxring, bd_processed, rxbdset);
 | 
			
		||||
		setup_rx_bds(rxring);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef OS_IS_FREERTOS
 | 
			
		||||
	xInsideISR--;
 | 
			
		||||
#endif
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void clean_dma_txdescs(struct xemac_s *xemac)
 | 
			
		||||
{
 | 
			
		||||
	XEmacPs_Bd BdTemplate;
 | 
			
		||||
	XEmacPs_BdRing *TxRingPtr;
 | 
			
		||||
	xemacpsif_s *xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
 | 
			
		||||
	TxRingPtr = &XEmacPs_GetTxRing(&xemacpsif->emacps);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_BdClear(&BdTemplate);
 | 
			
		||||
	XEmacPs_BdSetStatus(&BdTemplate, XEMACPS_TXBUF_USED_MASK);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
 	 * Create the TxBD ring
 | 
			
		||||
 	 */
 | 
			
		||||
	XEmacPs_BdRingCreate(TxRingPtr, (u32) xemacpsif->tx_bdspace,
 | 
			
		||||
			(u32) xemacpsif->tx_bdspace, BD_ALIGNMENT,
 | 
			
		||||
				 XLWIP_CONFIG_N_TX_DESC);
 | 
			
		||||
	XEmacPs_BdRingClone(TxRingPtr, &BdTemplate, XEMACPS_SEND);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
XStatus init_dma(struct xemac_s *xemac)
 | 
			
		||||
{
 | 
			
		||||
	XEmacPs_Bd BdTemplate;
 | 
			
		||||
	XEmacPs_BdRing *RxRingPtr, *TxRingPtr;
 | 
			
		||||
	XEmacPs_Bd *rxbd;
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
	XStatus Status;
 | 
			
		||||
	int i;
 | 
			
		||||
	unsigned int BdIndex;
 | 
			
		||||
	char *endAdd = (char *) &_end;
 | 
			
		||||
	/*
 | 
			
		||||
	 * Align the BD starte address to 1 MB boundary.
 | 
			
		||||
	 */
 | 
			
		||||
	char *endAdd_aligned = (char *)(((int)endAdd + 0x100000) & (~0xFFFFF));
 | 
			
		||||
	xemacpsif_s *xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	struct xtopology_t *xtopologyp = &xtopology[xemac->topology_index];
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The BDs need to be allocated in uncached memory. Hence the 1 MB
 | 
			
		||||
	 * address range that starts at address 0xFF00000 is made uncached
 | 
			
		||||
	 * by setting appropriate attributes in the translation table.
 | 
			
		||||
	 */
 | 
			
		||||
	Xil_SetTlbAttributes((int)endAdd_aligned, 0xc02); // addr, attr
 | 
			
		||||
 | 
			
		||||
	RxRingPtr = &XEmacPs_GetRxRing(&xemacpsif->emacps);
 | 
			
		||||
	TxRingPtr = &XEmacPs_GetTxRing(&xemacpsif->emacps);
 | 
			
		||||
	LWIP_DEBUGF(NETIF_DEBUG, ("RxRingPtr: 0x%08x\r\n", RxRingPtr));
 | 
			
		||||
	LWIP_DEBUGF(NETIF_DEBUG, ("TxRingPtr: 0x%08x\r\n", TxRingPtr));
 | 
			
		||||
 | 
			
		||||
	xemacpsif->rx_bdspace = (void *)endAdd_aligned;
 | 
			
		||||
	/*
 | 
			
		||||
	 * We allocate 65536 bytes for Rx BDs which can accomodate a
 | 
			
		||||
	 * maximum of 8192 BDs which is much more than any application
 | 
			
		||||
	 * will ever need.
 | 
			
		||||
	 */
 | 
			
		||||
	xemacpsif->tx_bdspace = (void *)(endAdd_aligned + 0x10000);
 | 
			
		||||
 | 
			
		||||
	LWIP_DEBUGF(NETIF_DEBUG, ("rx_bdspace: 0x%08x\r\n", xemacpsif->rx_bdspace));
 | 
			
		||||
	LWIP_DEBUGF(NETIF_DEBUG, ("tx_bdspace: 0x%08x\r\n", xemacpsif->tx_bdspace));
 | 
			
		||||
 | 
			
		||||
	if (!xemacpsif->rx_bdspace || !xemacpsif->tx_bdspace) {
 | 
			
		||||
		xil_printf("%s@%d: Error: Unable to allocate memory for TX/RX buffer descriptors",
 | 
			
		||||
				__FILE__, __LINE__);
 | 
			
		||||
		return XST_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Setup RxBD space.
 | 
			
		||||
	 *
 | 
			
		||||
	 * Setup a BD template for the Rx channel. This template will be copied to
 | 
			
		||||
	 * every RxBD. We will not have to explicitly set these again.
 | 
			
		||||
	 */
 | 
			
		||||
	XEmacPs_BdClear(&BdTemplate);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Create the RxBD ring
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	Status = XEmacPs_BdRingCreate(RxRingPtr, (u32) xemacpsif->rx_bdspace,
 | 
			
		||||
				(u32) xemacpsif->rx_bdspace, BD_ALIGNMENT,
 | 
			
		||||
				     XLWIP_CONFIG_N_RX_DESC);
 | 
			
		||||
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		LWIP_DEBUGF(NETIF_DEBUG, ("Error setting up RxBD space\r\n"));
 | 
			
		||||
		return XST_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Status = XEmacPs_BdRingClone(RxRingPtr, &BdTemplate, XEMACPS_RECV);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		LWIP_DEBUGF(NETIF_DEBUG, ("Error initializing RxBD space\r\n"));
 | 
			
		||||
		return XST_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	XEmacPs_BdClear(&BdTemplate);
 | 
			
		||||
	XEmacPs_BdSetStatus(&BdTemplate, XEMACPS_TXBUF_USED_MASK);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Create the TxBD ring
 | 
			
		||||
	 */
 | 
			
		||||
	Status = XEmacPs_BdRingCreate(TxRingPtr, (u32) xemacpsif->tx_bdspace,
 | 
			
		||||
				(u32) xemacpsif->tx_bdspace, BD_ALIGNMENT,
 | 
			
		||||
				     XLWIP_CONFIG_N_TX_DESC);
 | 
			
		||||
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		return XST_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* We reuse the bd template, as the same one will work for both rx and tx. */
 | 
			
		||||
	Status = XEmacPs_BdRingClone(TxRingPtr, &BdTemplate, XEMACPS_SEND);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		return ERR_IF;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Allocate RX descriptors, 1 RxBD at a time.
 | 
			
		||||
	 */
 | 
			
		||||
	for (i = 0; i < XLWIP_CONFIG_N_RX_DESC; i++) {
 | 
			
		||||
		Status = XEmacPs_BdRingAlloc(RxRingPtr, 1, &rxbd);
 | 
			
		||||
		if (Status != XST_SUCCESS) {
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("init_dma: Error allocating RxBD\r\n"));
 | 
			
		||||
			return ERR_IF;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		p = pbuf_alloc(PBUF_RAW, XEMACPS_MAX_FRAME_SIZE, PBUF_POOL);
 | 
			
		||||
		if (!p) {
 | 
			
		||||
#if LINK_STATS
 | 
			
		||||
			lwip_stats.link.memerr++;
 | 
			
		||||
			lwip_stats.link.drop++;
 | 
			
		||||
#endif
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("unable to alloc pbuf in recv_handler\r\n"));
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		XEmacPs_BdSetAddressRx(rxbd, (u32)p->payload);
 | 
			
		||||
 | 
			
		||||
		BdIndex = XEMACPS_BD_TO_INDEX(RxRingPtr, rxbd);
 | 
			
		||||
		rx_pbufs_storage[BdIndex] = (int)p;
 | 
			
		||||
 | 
			
		||||
		/* Enqueue to HW */
 | 
			
		||||
		Status = XEmacPs_BdRingToHw(RxRingPtr, 1, rxbd);
 | 
			
		||||
		if (Status != XST_SUCCESS) {
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("Error: committing RxBD to HW\r\n"));
 | 
			
		||||
			return XST_FAILURE;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Connect the device driver handler that will be called when an
 | 
			
		||||
	 * interrupt for the device occurs, the handler defined above performs
 | 
			
		||||
	 * the specific interrupt processing for the device.
 | 
			
		||||
	 */
 | 
			
		||||
	XScuGic_RegisterHandler(INTC_BASE_ADDR, xtopologyp->scugic_emac_intr,
 | 
			
		||||
				(Xil_ExceptionHandler)XEmacPs_IntrHandler,
 | 
			
		||||
						(void *)&xemacpsif->emacps);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Enable the interrupt for emacps.
 | 
			
		||||
	 */
 | 
			
		||||
	XScuGic_EnableIntr(INTC_DIST_BASE_ADDR, (u32) xtopologyp->scugic_emac_intr);
 | 
			
		||||
	EmacIntrNum = (u32) xtopologyp->scugic_emac_intr;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * resetrx_on_no_rxdata():
 | 
			
		||||
 *
 | 
			
		||||
 * It is called at regular intervals through the API xemacpsif_resetrx_on_no_rxdata
 | 
			
		||||
 * called by the user.
 | 
			
		||||
 * The EmacPs has a HW bug (SI# 692601) on the Rx path for heavy Rx traffic.
 | 
			
		||||
 * Under heavy Rx traffic because of the HW bug there are times when the Rx path
 | 
			
		||||
 * becomes unresponsive. The workaround for it is to check for the Rx path for
 | 
			
		||||
 * traffic (by reading the stats registers regularly). If the stats register
 | 
			
		||||
 * does not increment for sometime (proving no Rx traffic), the function resets
 | 
			
		||||
 * the Rx data path.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void resetrx_on_no_rxdata(xemacpsif_s *xemacpsif)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long regctrl;
 | 
			
		||||
	unsigned long tempcntr;
 | 
			
		||||
 | 
			
		||||
	tempcntr = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_RXCNT_OFFSET);
 | 
			
		||||
	if ((!tempcntr) && (!(xemacpsif->last_rx_frms_cntr))) {
 | 
			
		||||
		regctrl = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
				XEMACPS_NWCTRL_OFFSET);
 | 
			
		||||
		regctrl &= (~XEMACPS_NWCTRL_RXEN_MASK);
 | 
			
		||||
		XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
 | 
			
		||||
				XEMACPS_NWCTRL_OFFSET, regctrl);
 | 
			
		||||
		regctrl = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_NWCTRL_OFFSET);
 | 
			
		||||
		regctrl |= (XEMACPS_NWCTRL_RXEN_MASK);
 | 
			
		||||
		XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress, XEMACPS_NWCTRL_OFFSET, regctrl);
 | 
			
		||||
	}
 | 
			
		||||
	xemacpsif->last_rx_frms_cntr = tempcntr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FreeTxRxPBufs(void)
 | 
			
		||||
{
 | 
			
		||||
	int Index;
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
 | 
			
		||||
	for (Index = 0; Index < XLWIP_CONFIG_N_TX_DESC; Index++) {
 | 
			
		||||
		if (tx_pbufs_storage[Index] != 0) {
 | 
			
		||||
			p = (struct pbuf *)tx_pbufs_storage[Index];
 | 
			
		||||
			pbuf_free(p);
 | 
			
		||||
			tx_pbufs_storage[Index] = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (Index = 0; Index < XLWIP_CONFIG_N_RX_DESC; Index++) {
 | 
			
		||||
		p = (struct pbuf *)rx_pbufs_storage[Index];
 | 
			
		||||
		pbuf_free(p);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FreeOnlyTxPBufs(void)
 | 
			
		||||
{
 | 
			
		||||
	int Index;
 | 
			
		||||
	struct pbuf *p;
 | 
			
		||||
 | 
			
		||||
	for (Index = 0; Index < XLWIP_CONFIG_N_TX_DESC; Index++) {
 | 
			
		||||
		if (tx_pbufs_storage[Index] != 0) {
 | 
			
		||||
			p = (struct pbuf *)tx_pbufs_storage[Index];
 | 
			
		||||
			pbuf_free(p);
 | 
			
		||||
			tx_pbufs_storage[Index] = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EmacDisableIntr(void)
 | 
			
		||||
{
 | 
			
		||||
	XScuGic_DisableIntr(INTC_DIST_BASE_ADDR, EmacIntrNum);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EmacEnableIntr(void)
 | 
			
		||||
{
 | 
			
		||||
	XScuGic_EnableIntr(INTC_DIST_BASE_ADDR, EmacIntrNum);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,208 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "netif/xemacpsif.h"
 | 
			
		||||
#include "lwipopts.h"
 | 
			
		||||
 | 
			
		||||
/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c
 | 
			
		||||
 *** to run it on a PEEP board
 | 
			
		||||
 ***/
 | 
			
		||||
 | 
			
		||||
unsigned int link_speed = 100;
 | 
			
		||||
 | 
			
		||||
XEmacPs_Config *xemacps_lookup_config(unsigned mac_base)
 | 
			
		||||
{
 | 
			
		||||
	extern XEmacPs_Config XEmacPs_ConfigTable[];
 | 
			
		||||
	XEmacPs_Config *CfgPtr = NULL;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < XPAR_XEMACPS_NUM_INSTANCES; i++) {
 | 
			
		||||
		if (XEmacPs_ConfigTable[i].BaseAddress == mac_base) {
 | 
			
		||||
			CfgPtr = &XEmacPs_ConfigTable[i];
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (CfgPtr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void init_emacps(xemacpsif_s *xemacps, struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	unsigned mac_address = (unsigned)(netif->state);
 | 
			
		||||
	XEmacPs *xemacpsp;
 | 
			
		||||
	XEmacPs_Config *mac_config;
 | 
			
		||||
	int Status = XST_SUCCESS;
 | 
			
		||||
 | 
			
		||||
	/* obtain config of this emac */
 | 
			
		||||
	mac_config = (XEmacPs_Config *)xemacps_lookup_config(mac_address);
 | 
			
		||||
 | 
			
		||||
	/* Does not appear to be used. */
 | 
			
		||||
	( void ) mac_config;
 | 
			
		||||
 | 
			
		||||
	xemacpsp = &xemacps->emacps;
 | 
			
		||||
 | 
			
		||||
	/* set mac address */
 | 
			
		||||
	Status = XEmacPs_SetMacAddress(xemacpsp, (void*)(netif->hwaddr), 1);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		xil_printf("In %s:Emac Mac Address set failed...\r\n",__func__);
 | 
			
		||||
	}
 | 
			
		||||
	XEmacPs_SetMdioDivisor(xemacpsp, MDC_DIV_224);
 | 
			
		||||
	link_speed = Phy_Setup(xemacpsp);
 | 
			
		||||
	XEmacPs_SetOperatingSpeed(xemacpsp, link_speed);
 | 
			
		||||
	/* Setting the operating speed of the MAC needs a delay. */
 | 
			
		||||
	{
 | 
			
		||||
		volatile int wait;
 | 
			
		||||
		for (wait=0; wait < 20000; wait++);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void init_emacps_on_error (xemacpsif_s *xemacps, struct netif *netif)
 | 
			
		||||
{
 | 
			
		||||
	unsigned mac_address = (unsigned)(netif->state);
 | 
			
		||||
	XEmacPs *xemacpsp;
 | 
			
		||||
	XEmacPs_Config *mac_config;
 | 
			
		||||
	int Status = XST_SUCCESS;
 | 
			
		||||
 | 
			
		||||
	/* obtain config of this emac */
 | 
			
		||||
	mac_config = (XEmacPs_Config *)xemacps_lookup_config(mac_address);
 | 
			
		||||
 | 
			
		||||
	/* Does not appear to be used? */
 | 
			
		||||
	( void ) mac_config;
 | 
			
		||||
 | 
			
		||||
	xemacpsp = &xemacps->emacps;
 | 
			
		||||
 | 
			
		||||
	/* set mac address */
 | 
			
		||||
	Status = XEmacPs_SetMacAddress(xemacpsp, (void*)(netif->hwaddr), 1);
 | 
			
		||||
	if (Status != XST_SUCCESS) {
 | 
			
		||||
		xil_printf("In %s:Emac Mac Address set failed...\r\n",__func__);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	XEmacPs_SetOperatingSpeed(xemacpsp, link_speed);
 | 
			
		||||
 | 
			
		||||
	/* Setting the operating speed of the MAC needs a delay. */
 | 
			
		||||
	{
 | 
			
		||||
		volatile int wait;
 | 
			
		||||
		for (wait=0; wait < 20000; wait++);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void setup_isr (struct xemac_s *xemac)
 | 
			
		||||
{
 | 
			
		||||
	xemacpsif_s   *xemacpsif;
 | 
			
		||||
 | 
			
		||||
	xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Setup callbacks
 | 
			
		||||
	 */
 | 
			
		||||
	XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMASEND,
 | 
			
		||||
				     (void *) emacps_send_handler,
 | 
			
		||||
				     (void *) xemac);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMARECV,
 | 
			
		||||
				    (void *) emacps_recv_handler,
 | 
			
		||||
				    (void *) xemac);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_ERROR,
 | 
			
		||||
				    (void *) emacps_error_handler,
 | 
			
		||||
				    (void *) xemac);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void start_emacps (xemacpsif_s *xemacps)
 | 
			
		||||
{
 | 
			
		||||
	/* start the temac */
 | 
			
		||||
    	XEmacPs_Start(&xemacps->emacps);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void restart_emacps_transmitter (xemacpsif_s *xemacps) {
 | 
			
		||||
	u32 Reg;
 | 
			
		||||
	Reg = XEmacPs_ReadReg(xemacps->emacps.Config.BaseAddress,
 | 
			
		||||
					XEMACPS_NWCTRL_OFFSET);
 | 
			
		||||
	Reg = Reg & (~XEMACPS_NWCTRL_TXEN_MASK);
 | 
			
		||||
	XEmacPs_WriteReg(xemacps->emacps.Config.BaseAddress,
 | 
			
		||||
										XEMACPS_NWCTRL_OFFSET, Reg);
 | 
			
		||||
 | 
			
		||||
	Reg = XEmacPs_ReadReg(xemacps->emacps.Config.BaseAddress,
 | 
			
		||||
						XEMACPS_NWCTRL_OFFSET);
 | 
			
		||||
	Reg = Reg | (XEMACPS_NWCTRL_TXEN_MASK);
 | 
			
		||||
	XEmacPs_WriteReg(xemacps->emacps.Config.BaseAddress,
 | 
			
		||||
										XEMACPS_NWCTRL_OFFSET, Reg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void emacps_error_handler(void *arg,u8 Direction, u32 ErrorWord)
 | 
			
		||||
{
 | 
			
		||||
	struct xemac_s *xemac;
 | 
			
		||||
	xemacpsif_s   *xemacpsif;
 | 
			
		||||
	struct xtopology_t *xtopologyp;
 | 
			
		||||
	XEmacPs *xemacps;
 | 
			
		||||
	XEmacPs_BdRing *rxring;
 | 
			
		||||
	XEmacPs_BdRing *txring;
 | 
			
		||||
 | 
			
		||||
	xemac = (struct xemac_s *)(arg);
 | 
			
		||||
	xemacpsif = (xemacpsif_s *)(xemac->state);
 | 
			
		||||
	rxring = &XEmacPs_GetRxRing(&xemacpsif->emacps);
 | 
			
		||||
	txring = &XEmacPs_GetRxRing(&xemacpsif->emacps);
 | 
			
		||||
	xtopologyp = &xtopology[xemac->topology_index];
 | 
			
		||||
	xemacps = &xemacpsif->emacps;
 | 
			
		||||
 | 
			
		||||
	/* Do not appear to be used. */
 | 
			
		||||
	( void ) xemacps;
 | 
			
		||||
	( void ) xtopologyp;
 | 
			
		||||
 | 
			
		||||
	if (ErrorWord != 0) {
 | 
			
		||||
		switch (Direction) {
 | 
			
		||||
			case XEMACPS_RECV:
 | 
			
		||||
			if (ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Receive DMA error\r\n"));
 | 
			
		||||
				HandleEmacPsError(xemac);
 | 
			
		||||
			}
 | 
			
		||||
			if (ErrorWord & XEMACPS_RXSR_RXOVR_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Receive over run\r\n"));
 | 
			
		||||
				emacps_recv_handler(arg);
 | 
			
		||||
				setup_rx_bds(rxring);
 | 
			
		||||
			}
 | 
			
		||||
			if (ErrorWord & XEMACPS_RXSR_BUFFNA_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Receive buffer not available\r\n"));
 | 
			
		||||
				emacps_recv_handler(arg);
 | 
			
		||||
				setup_rx_bds(rxring);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
			case XEMACPS_SEND:
 | 
			
		||||
			if (ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Transmit DMA error\r\n"));
 | 
			
		||||
				HandleEmacPsError(xemac);
 | 
			
		||||
			}
 | 
			
		||||
			if (ErrorWord & XEMACPS_TXSR_URUN_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Transmit under run\r\n"));
 | 
			
		||||
				HandleTxErrors(xemac);
 | 
			
		||||
			}
 | 
			
		||||
			if (ErrorWord & XEMACPS_TXSR_BUFEXH_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Transmit buffer exhausted\r\n"));
 | 
			
		||||
				HandleTxErrors(xemac);
 | 
			
		||||
			}
 | 
			
		||||
			if (ErrorWord & XEMACPS_TXSR_RXOVR_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Transmit retry excessed limits\r\n"));
 | 
			
		||||
				HandleTxErrors(xemac);
 | 
			
		||||
			}
 | 
			
		||||
			if (ErrorWord & XEMACPS_TXSR_FRAMERX_MASK) {
 | 
			
		||||
				LWIP_DEBUGF(NETIF_DEBUG, ("Transmit collision\r\n"));
 | 
			
		||||
				process_sent_bds(txring);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __XEMACPSIF_HW_H_
 | 
			
		||||
#define __XEMACPSIF_HW_H_
 | 
			
		||||
 | 
			
		||||
#include "netif/xemacpsif.h"
 | 
			
		||||
#include "lwip/netif.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
XEmacPs_Config * lookup_config(unsigned mac_base);
 | 
			
		||||
 | 
			
		||||
void init_emacps(xemacpsif_s *xemacpsif, struct netif *netif);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,558 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-2008, Advanced Micro Devices, Inc.
 | 
			
		||||
 *               All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions
 | 
			
		||||
 * are met:
 | 
			
		||||
 *
 | 
			
		||||
 *    * Redistributions of source code must retain the above copyright
 | 
			
		||||
 *      notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 *    * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *      notice, this list of conditions and the following disclaimer in
 | 
			
		||||
 *      the documentation and/or other materials provided with the
 | 
			
		||||
 *      distribution.
 | 
			
		||||
 *    * Neither the name of Advanced Micro Devices, Inc. nor the names
 | 
			
		||||
 *      of its contributors may be used to endorse or promote products
 | 
			
		||||
 *      derived from this software without specific prior written
 | 
			
		||||
 *      permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Some portions copyright (c) 2010-2013 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "netif/xemacpsif.h"
 | 
			
		||||
#include "lwipopts.h"
 | 
			
		||||
#include "xparameters_ps.h"
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
 | 
			
		||||
/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c
 | 
			
		||||
 *** to run it on a PEEP board
 | 
			
		||||
 ***/
 | 
			
		||||
 | 
			
		||||
/* Advertisement control register. */
 | 
			
		||||
#define ADVERTISE_10HALF		0x0020  /* Try for 10mbps half-duplex  */
 | 
			
		||||
#define ADVERTISE_10FULL		0x0040  /* Try for 10mbps full-duplex  */
 | 
			
		||||
#define ADVERTISE_100HALF		0x0080  /* Try for 100mbps half-duplex */
 | 
			
		||||
#define ADVERTISE_100FULL		0x0100  /* Try for 100mbps full-duplex */
 | 
			
		||||
 | 
			
		||||
#define ADVERTISE_100_AND_10	(ADVERTISE_10FULL | ADVERTISE_100FULL | \
 | 
			
		||||
								ADVERTISE_10HALF | ADVERTISE_100HALF)
 | 
			
		||||
#define ADVERTISE_100			(ADVERTISE_100FULL | ADVERTISE_100HALF)
 | 
			
		||||
#define ADVERTISE_10			(ADVERTISE_10FULL | ADVERTISE_10HALF)
 | 
			
		||||
 | 
			
		||||
#define ADVERTISE_1000			0x0300
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define IEEE_CONTROL_REG_OFFSET				0
 | 
			
		||||
#define IEEE_STATUS_REG_OFFSET				1
 | 
			
		||||
#define IEEE_AUTONEGO_ADVERTISE_REG			4
 | 
			
		||||
#define IEEE_PARTNER_ABILITIES_1_REG_OFFSET	5
 | 
			
		||||
#define IEEE_1000_ADVERTISE_REG_OFFSET		9
 | 
			
		||||
#define IEEE_PARTNER_ABILITIES_3_REG_OFFSET	10
 | 
			
		||||
#define IEEE_COPPER_SPECIFIC_CONTROL_REG	16
 | 
			
		||||
#define IEEE_SPECIFIC_STATUS_REG			17
 | 
			
		||||
#define IEEE_COPPER_SPECIFIC_STATUS_REG_2	19
 | 
			
		||||
#define IEEE_CONTROL_REG_MAC				21
 | 
			
		||||
#define IEEE_PAGE_ADDRESS_REGISTER			22
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define IEEE_CTRL_1GBPS_LINKSPEED_MASK		0x2040
 | 
			
		||||
#define IEEE_CTRL_LINKSPEED_MASK			0x0040
 | 
			
		||||
#define IEEE_CTRL_LINKSPEED_1000M			0x0040
 | 
			
		||||
#define IEEE_CTRL_LINKSPEED_100M			0x2000
 | 
			
		||||
#define IEEE_CTRL_LINKSPEED_10M				0x0000
 | 
			
		||||
#define IEEE_CTRL_RESET_MASK				0x8000
 | 
			
		||||
#define IEEE_CTRL_AUTONEGOTIATE_ENABLE		0x1000
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
#define IEEE_CTRL_RESET                         0x9140
 | 
			
		||||
#define IEEE_CTRL_ISOLATE_DISABLE               0xFBFF
 | 
			
		||||
#endif
 | 
			
		||||
#define IEEE_STAT_AUTONEGOTIATE_CAPABLE		0x0008
 | 
			
		||||
#define IEEE_STAT_AUTONEGOTIATE_COMPLETE	0x0020
 | 
			
		||||
#define IEEE_STAT_AUTONEGOTIATE_RESTART		0x0200
 | 
			
		||||
#define IEEE_STAT_1GBPS_EXTENSIONS			0x0100
 | 
			
		||||
#define IEEE_AN1_ABILITY_MASK				0x1FE0
 | 
			
		||||
#define IEEE_AN3_ABILITY_MASK_1GBPS			0x0C00
 | 
			
		||||
#define IEEE_AN1_ABILITY_MASK_100MBPS		0x0380
 | 
			
		||||
#define IEEE_AN1_ABILITY_MASK_10MBPS		0x0060
 | 
			
		||||
#define IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK	0x0030
 | 
			
		||||
 | 
			
		||||
#define IEEE_ASYMMETRIC_PAUSE_MASK			0x0800
 | 
			
		||||
#define IEEE_PAUSE_MASK						0x0400
 | 
			
		||||
#define IEEE_AUTONEG_ERROR_MASK				0x8000
 | 
			
		||||
 | 
			
		||||
#define PHY_DETECT_REG  1
 | 
			
		||||
#define PHY_DETECT_MASK 0x1808
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_GMII2RGMII_SPEED1000_FD		0x140
 | 
			
		||||
#define XEMACPS_GMII2RGMII_SPEED100_FD		0x2100
 | 
			
		||||
#define XEMACPS_GMII2RGMII_SPEED10_FD		0x100
 | 
			
		||||
#define XEMACPS_GMII2RGMII_REG_NUM			0x10
 | 
			
		||||
 | 
			
		||||
/* Frequency setting */
 | 
			
		||||
#define SLCR_LOCK_ADDR			(XPS_SYS_CTRL_BASEADDR + 0x4)
 | 
			
		||||
#define SLCR_UNLOCK_ADDR		(XPS_SYS_CTRL_BASEADDR + 0x8)
 | 
			
		||||
#define SLCR_GEM0_CLK_CTRL_ADDR	(XPS_SYS_CTRL_BASEADDR + 0x140)
 | 
			
		||||
#define SLCR_GEM1_CLK_CTRL_ADDR	(XPS_SYS_CTRL_BASEADDR + 0x144)
 | 
			
		||||
#ifdef PEEP
 | 
			
		||||
#define SLCR_GEM_10M_CLK_CTRL_VALUE		0x00103031
 | 
			
		||||
#define SLCR_GEM_100M_CLK_CTRL_VALUE	0x00103001
 | 
			
		||||
#define SLCR_GEM_1G_CLK_CTRL_VALUE		0x00103011
 | 
			
		||||
#endif
 | 
			
		||||
#define SLCR_LOCK_KEY_VALUE 			0x767B
 | 
			
		||||
#define SLCR_UNLOCK_KEY_VALUE			0xDF0D
 | 
			
		||||
#define SLCR_ADDR_GEM_RST_CTRL			(XPS_SYS_CTRL_BASEADDR + 0x214)
 | 
			
		||||
#define EMACPS_SLCR_DIV_MASK			0xFC0FC0FF
 | 
			
		||||
 | 
			
		||||
#define EMAC0_BASE_ADDRESS				0xE000B000
 | 
			
		||||
#define EMAC1_BASE_ADDRESS				0xE000C000
 | 
			
		||||
 | 
			
		||||
static int detect_phy(XEmacPs *xemacpsp)
 | 
			
		||||
{
 | 
			
		||||
	u16 phy_reg;
 | 
			
		||||
	u32 phy_addr;
 | 
			
		||||
 | 
			
		||||
	for (phy_addr = 31; phy_addr > 0; phy_addr--) {
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, PHY_DETECT_REG,
 | 
			
		||||
							&phy_reg);
 | 
			
		||||
 | 
			
		||||
		if ((phy_reg != 0xFFFF) &&
 | 
			
		||||
			((phy_reg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {
 | 
			
		||||
			/* Found a valid PHY address */
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("XEmacPs detect_phy: PHY detected at address %d.\r\n",
 | 
			
		||||
																	phy_addr));
 | 
			
		||||
			LWIP_DEBUGF(NETIF_DEBUG, ("XEmacPs detect_phy: PHY detected.\r\n"));
 | 
			
		||||
			return phy_addr;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	LWIP_DEBUGF(NETIF_DEBUG, ("XEmacPs detect_phy: No PHY detected.  Assuming a PHY at address 0\r\n"));
 | 
			
		||||
 | 
			
		||||
        /* default to zero */
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef PEEP
 | 
			
		||||
unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	u16 control;
 | 
			
		||||
	u16 status;
 | 
			
		||||
	u16 partner_capabilities;
 | 
			
		||||
	u16 partner_capabilities_1000;
 | 
			
		||||
	u16 phylinkspeed;
 | 
			
		||||
	u32 phy_addr = detect_phy(xemacpsp);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
 | 
			
		||||
															ADVERTISE_1000);
 | 
			
		||||
	/* Advertise PHY speed of 100 and 10 Mbps */
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG,
 | 
			
		||||
													ADVERTISE_100_AND_10);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET,
 | 
			
		||||
																&control);
 | 
			
		||||
	control |= (IEEE_CTRL_AUTONEGOTIATE_ENABLE |
 | 
			
		||||
					IEEE_STAT_AUTONEGOTIATE_RESTART);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
 | 
			
		||||
 | 
			
		||||
	/* Read PHY control and status registers is successful. */
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
 | 
			
		||||
 | 
			
		||||
	if ((control & IEEE_CTRL_AUTONEGOTIATE_ENABLE) && (status &
 | 
			
		||||
					IEEE_STAT_AUTONEGOTIATE_CAPABLE)) {
 | 
			
		||||
 | 
			
		||||
		while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {
 | 
			
		||||
			XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET,
 | 
			
		||||
																&status);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_PARTNER_ABILITIES_1_REG_OFFSET,
 | 
			
		||||
															&partner_capabilities);
 | 
			
		||||
 | 
			
		||||
		if (status & IEEE_STAT_1GBPS_EXTENSIONS) {
 | 
			
		||||
			XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_PARTNER_ABILITIES_3_REG_OFFSET,
 | 
			
		||||
														&partner_capabilities_1000);
 | 
			
		||||
			if (partner_capabilities_1000 & IEEE_AN3_ABILITY_MASK_1GBPS)
 | 
			
		||||
				return 1000;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (partner_capabilities & IEEE_AN1_ABILITY_MASK_100MBPS)
 | 
			
		||||
			return 100;
 | 
			
		||||
		if (partner_capabilities & IEEE_AN1_ABILITY_MASK_10MBPS)
 | 
			
		||||
			return 10;
 | 
			
		||||
 | 
			
		||||
		xil_printf("%s: unknown PHY link speed, setting TEMAC speed to be 10 Mbps\r\n",
 | 
			
		||||
				__FUNCTION__);
 | 
			
		||||
		return 10;
 | 
			
		||||
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
		/* Update TEMAC speed accordingly */
 | 
			
		||||
		if (status & IEEE_STAT_1GBPS_EXTENSIONS) {
 | 
			
		||||
			/* Get commanded link speed */
 | 
			
		||||
			phylinkspeed = control & IEEE_CTRL_1GBPS_LINKSPEED_MASK;
 | 
			
		||||
 | 
			
		||||
			switch (phylinkspeed) {
 | 
			
		||||
				case (IEEE_CTRL_LINKSPEED_1000M):
 | 
			
		||||
					return 1000;
 | 
			
		||||
				case (IEEE_CTRL_LINKSPEED_100M):
 | 
			
		||||
					return 100;
 | 
			
		||||
				case (IEEE_CTRL_LINKSPEED_10M):
 | 
			
		||||
					return 10;
 | 
			
		||||
				default:
 | 
			
		||||
					xil_printf("%s: unknown PHY link speed (%d), setting TEMAC speed to be 10 Mbps\r\n",
 | 
			
		||||
							__FUNCTION__, phylinkspeed);
 | 
			
		||||
					return 10;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
 | 
			
		||||
			return (control & IEEE_CTRL_LINKSPEED_MASK) ? 100 : 10;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else /* Zynq */
 | 
			
		||||
unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
 | 
			
		||||
{
 | 
			
		||||
	u16 temp;
 | 
			
		||||
	u16 control;
 | 
			
		||||
	u16 status;
 | 
			
		||||
	u16 partner_capabilities;
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
	u32 phy_addr = XPAR_PCSPMA_SGMII_PHYADDR;
 | 
			
		||||
#else
 | 
			
		||||
	u32 phy_addr = detect_phy(xemacpsp);
 | 
			
		||||
#endif
 | 
			
		||||
	xil_printf("Start PHY autonegotiation \r\n");
 | 
			
		||||
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
#else
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp,phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, &control);
 | 
			
		||||
	control |= IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK;
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, control);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
 | 
			
		||||
	control |= IEEE_ASYMMETRIC_PAUSE_MASK;
 | 
			
		||||
	control |= IEEE_PAUSE_MASK;
 | 
			
		||||
	control |= ADVERTISE_100;
 | 
			
		||||
	control |= ADVERTISE_10;
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
 | 
			
		||||
																	&control);
 | 
			
		||||
	control |= ADVERTISE_1000;
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
 | 
			
		||||
																	control);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,
 | 
			
		||||
																&control);
 | 
			
		||||
	control |= (7 << 12);	/* max number of gigabit attempts */
 | 
			
		||||
	control |= (1 << 11);	/* enable downshift */
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,
 | 
			
		||||
																control);
 | 
			
		||||
#endif
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 | 
			
		||||
	control |= IEEE_CTRL_AUTONEGOTIATE_ENABLE;
 | 
			
		||||
	control |= IEEE_STAT_AUTONEGOTIATE_RESTART;
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
    control &= IEEE_CTRL_ISOLATE_DISABLE;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
#else
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 | 
			
		||||
	control |= IEEE_CTRL_RESET_MASK;
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
 | 
			
		||||
 | 
			
		||||
	while (1) {
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 | 
			
		||||
		if (control & IEEE_CTRL_RESET_MASK)
 | 
			
		||||
			continue;
 | 
			
		||||
		else
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
	xil_printf("Waiting for PHY to complete autonegotiation.\r\n");
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
 | 
			
		||||
	while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {
 | 
			
		||||
		sleep(1);
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
#else
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_STATUS_REG_2,
 | 
			
		||||
																	&temp);
 | 
			
		||||
		if (temp & IEEE_AUTONEG_ERROR_MASK) {
 | 
			
		||||
			xil_printf("Auto negotiation error \r\n");
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET,
 | 
			
		||||
																&status);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	xil_printf("autonegotiation complete \r\n");
 | 
			
		||||
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
#else
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_SPECIFIC_STATUS_REG, &partner_capabilities);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1
 | 
			
		||||
	xil_printf("Waiting for Link to be up; Polling for SGMII core Reg \r\n");
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, 5, &temp);
 | 
			
		||||
	while(!(temp & 0x8000)) {
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, 5, &temp);
 | 
			
		||||
	}
 | 
			
		||||
	if((temp & 0x0C00) == 0x0800) {
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);
 | 
			
		||||
		return 1000;
 | 
			
		||||
	}
 | 
			
		||||
	else if((temp & 0x0C00) == 0x0400) {
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);
 | 
			
		||||
		return 100;
 | 
			
		||||
	}
 | 
			
		||||
	else if((temp & 0x0C00) == 0x0000) {
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);
 | 
			
		||||
		return 10;
 | 
			
		||||
	} else {
 | 
			
		||||
		xil_printf("get_IEEE_phy_speed(): Invalid speed bit value, Deafulting to Speed = 10 Mbps\r\n");
 | 
			
		||||
		XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);
 | 
			
		||||
		XEmacPs_PhyWrite(xemacpsp, phy_addr, 0, 0x0100);
 | 
			
		||||
		return 10;
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	if ( ((partner_capabilities >> 14) & 3) == 2)/* 1000Mbps */
 | 
			
		||||
		return 1000;
 | 
			
		||||
	else if ( ((partner_capabilities >> 14) & 3) == 1)/* 100Mbps */
 | 
			
		||||
		return 100;
 | 
			
		||||
	else					/* 10Mbps */
 | 
			
		||||
		return 10;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
unsigned configure_IEEE_phy_speed(XEmacPs *xemacpsp, unsigned speed)
 | 
			
		||||
{
 | 
			
		||||
	u16 control;
 | 
			
		||||
	u32 phy_addr = detect_phy(xemacpsp);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp,phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, &control);
 | 
			
		||||
	control |= IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK;
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, control);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
 | 
			
		||||
	control |= IEEE_ASYMMETRIC_PAUSE_MASK;
 | 
			
		||||
	control |= IEEE_PAUSE_MASK;
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 | 
			
		||||
	control &= ~IEEE_CTRL_LINKSPEED_1000M;
 | 
			
		||||
	control &= ~IEEE_CTRL_LINKSPEED_100M;
 | 
			
		||||
	control &= ~IEEE_CTRL_LINKSPEED_10M;
 | 
			
		||||
 | 
			
		||||
	if (speed == 1000) {
 | 
			
		||||
		control |= IEEE_CTRL_LINKSPEED_1000M;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	else if (speed == 100) {
 | 
			
		||||
		control |= IEEE_CTRL_LINKSPEED_100M;
 | 
			
		||||
		/* Dont advertise PHY speed of 1000 Mbps */
 | 
			
		||||
		XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET, 0);
 | 
			
		||||
		/* Dont advertise PHY speed of 10 Mbps */
 | 
			
		||||
		XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG,
 | 
			
		||||
																ADVERTISE_100);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	else if (speed == 10) {
 | 
			
		||||
		control |= IEEE_CTRL_LINKSPEED_10M;
 | 
			
		||||
		/* Dont advertise PHY speed of 1000 Mbps */
 | 
			
		||||
		XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
 | 
			
		||||
																			0);
 | 
			
		||||
		/* Dont advertise PHY speed of 100 Mbps */
 | 
			
		||||
		XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG,
 | 
			
		||||
																ADVERTISE_10);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET,
 | 
			
		||||
											control | IEEE_CTRL_RESET_MASK);
 | 
			
		||||
	{
 | 
			
		||||
		volatile int wait;
 | 
			
		||||
		for (wait=0; wait < 100000; wait++);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void SetUpSLCRDivisors(int mac_baseaddr, int speed)
 | 
			
		||||
{
 | 
			
		||||
	volatile u32 slcrBaseAddress;
 | 
			
		||||
#ifndef PEEP
 | 
			
		||||
	u32 SlcrDiv0;
 | 
			
		||||
	u32 SlcrDiv1;
 | 
			
		||||
	u32 SlcrTxClkCntrl;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	*(volatile unsigned int *)(SLCR_UNLOCK_ADDR) = SLCR_UNLOCK_KEY_VALUE;
 | 
			
		||||
 | 
			
		||||
	if ((unsigned long)mac_baseaddr == EMAC0_BASE_ADDRESS) {
 | 
			
		||||
		slcrBaseAddress = SLCR_GEM0_CLK_CTRL_ADDR;
 | 
			
		||||
	} else {
 | 
			
		||||
		slcrBaseAddress = SLCR_GEM1_CLK_CTRL_ADDR;
 | 
			
		||||
	}
 | 
			
		||||
#ifdef PEEP
 | 
			
		||||
	if (speed == 1000) {
 | 
			
		||||
		*(volatile unsigned int *)(slcrBaseAddress) =
 | 
			
		||||
											SLCR_GEM_1G_CLK_CTRL_VALUE;
 | 
			
		||||
	} else if (speed == 100) {
 | 
			
		||||
		*(volatile unsigned int *)(slcrBaseAddress) =
 | 
			
		||||
											SLCR_GEM_100M_CLK_CTRL_VALUE;
 | 
			
		||||
	} else {
 | 
			
		||||
		*(volatile unsigned int *)(slcrBaseAddress) =
 | 
			
		||||
											SLCR_GEM_10M_CLK_CTRL_VALUE;
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	if (speed == 1000) {
 | 
			
		||||
		if ((unsigned long)mac_baseaddr == EMAC0_BASE_ADDRESS) {
 | 
			
		||||
#ifdef XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV0
 | 
			
		||||
			SlcrDiv0 = XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV0;
 | 
			
		||||
			SlcrDiv1 = XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV1;
 | 
			
		||||
#endif
 | 
			
		||||
		} else {
 | 
			
		||||
#ifdef XPAR_PS7_ETHERNET_1_ENET_SLCR_1000MBPS_DIV0
 | 
			
		||||
			SlcrDiv0 = XPAR_PS7_ETHERNET_1_ENET_SLCR_1000MBPS_DIV0;
 | 
			
		||||
			SlcrDiv1 = XPAR_PS7_ETHERNET_1_ENET_SLCR_1000MBPS_DIV1;
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
	} else if (speed == 100) {
 | 
			
		||||
		if ((unsigned long)mac_baseaddr == EMAC0_BASE_ADDRESS) {
 | 
			
		||||
#ifdef XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV0
 | 
			
		||||
			SlcrDiv0 = XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV0;
 | 
			
		||||
			SlcrDiv1 = XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV1;
 | 
			
		||||
#endif
 | 
			
		||||
		} else {
 | 
			
		||||
#ifdef XPAR_PS7_ETHERNET_1_ENET_SLCR_100MBPS_DIV0
 | 
			
		||||
			SlcrDiv0 = XPAR_PS7_ETHERNET_1_ENET_SLCR_100MBPS_DIV0;
 | 
			
		||||
			SlcrDiv1 = XPAR_PS7_ETHERNET_1_ENET_SLCR_100MBPS_DIV1;
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if ((unsigned long)mac_baseaddr == EMAC0_BASE_ADDRESS) {
 | 
			
		||||
#ifdef XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV0
 | 
			
		||||
			SlcrDiv0 = XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV0;
 | 
			
		||||
			SlcrDiv1 = XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV1;
 | 
			
		||||
#endif
 | 
			
		||||
		} else {
 | 
			
		||||
#ifdef XPAR_PS7_ETHERNET_1_ENET_SLCR_10MBPS_DIV0
 | 
			
		||||
			SlcrDiv0 = XPAR_PS7_ETHERNET_1_ENET_SLCR_10MBPS_DIV0;
 | 
			
		||||
			SlcrDiv1 = XPAR_PS7_ETHERNET_1_ENET_SLCR_10MBPS_DIV1;
 | 
			
		||||
#endif
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	SlcrTxClkCntrl = *(volatile unsigned int *)(slcrBaseAddress);
 | 
			
		||||
	SlcrTxClkCntrl &= EMACPS_SLCR_DIV_MASK;
 | 
			
		||||
	SlcrTxClkCntrl |= (SlcrDiv1 << 20);
 | 
			
		||||
	SlcrTxClkCntrl |= (SlcrDiv0 << 8);
 | 
			
		||||
	*(volatile unsigned int *)(slcrBaseAddress) = SlcrTxClkCntrl;
 | 
			
		||||
#endif
 | 
			
		||||
	*(volatile unsigned int *)(SLCR_LOCK_ADDR) = SLCR_LOCK_KEY_VALUE;
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unsigned Phy_Setup (XEmacPs *xemacpsp)
 | 
			
		||||
{
 | 
			
		||||
	unsigned link_speed;
 | 
			
		||||
	unsigned long conv_present = 0;
 | 
			
		||||
	unsigned long convspeeddupsetting = 0;
 | 
			
		||||
	unsigned long convphyaddr = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef XPAR_GMII2RGMIICON_0N_ETH0_ADDR
 | 
			
		||||
	convphyaddr = XPAR_GMII2RGMIICON_0N_ETH0_ADDR;
 | 
			
		||||
	conv_present = 1;
 | 
			
		||||
#else
 | 
			
		||||
#ifdef XPAR_GMII2RGMIICON_0N_ETH1_ADDR
 | 
			
		||||
	convphyaddr = XPAR_GMII2RGMIICON_0N_ETH1_ADDR;
 | 
			
		||||
	conv_present = 1;
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef  CONFIG_LINKSPEED_AUTODETECT
 | 
			
		||||
	link_speed = get_IEEE_phy_speed(xemacpsp);
 | 
			
		||||
	if (link_speed == 1000) {
 | 
			
		||||
		SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,1000);
 | 
			
		||||
		convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;
 | 
			
		||||
	} else if (link_speed == 100) {
 | 
			
		||||
		SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);
 | 
			
		||||
		convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;
 | 
			
		||||
	} else {
 | 
			
		||||
		SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);
 | 
			
		||||
		convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;
 | 
			
		||||
	}
 | 
			
		||||
#elif	defined(CONFIG_LINKSPEED1000)
 | 
			
		||||
	SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,1000);
 | 
			
		||||
	link_speed = 1000;
 | 
			
		||||
	configure_IEEE_phy_speed(xemacpsp, link_speed);
 | 
			
		||||
	convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;
 | 
			
		||||
	sleep(1);
 | 
			
		||||
#elif	defined(CONFIG_LINKSPEED100)
 | 
			
		||||
	SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);
 | 
			
		||||
	link_speed = 100;
 | 
			
		||||
	configure_IEEE_phy_speed(xemacpsp, link_speed);
 | 
			
		||||
	convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;
 | 
			
		||||
	sleep(1);
 | 
			
		||||
#elif	defined(CONFIG_LINKSPEED10)
 | 
			
		||||
	SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);
 | 
			
		||||
	link_speed = 10;
 | 
			
		||||
	configure_IEEE_phy_speed(xemacpsp, link_speed);
 | 
			
		||||
	convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;
 | 
			
		||||
	sleep(1);
 | 
			
		||||
#endif
 | 
			
		||||
	if (conv_present) {
 | 
			
		||||
		XEmacPs_PhyWrite(xemacpsp, convphyaddr,
 | 
			
		||||
		XEMACPS_GMII2RGMII_REG_NUM, convspeeddupsetting);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	xil_printf("link speed: %d\r\n", link_speed);
 | 
			
		||||
	return link_speed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,80 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2007-13 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "netif/xpqueue.h"
 | 
			
		||||
 | 
			
		||||
#define NUM_QUEUES	2
 | 
			
		||||
 | 
			
		||||
pq_queue_t pq_queue[NUM_QUEUES];
 | 
			
		||||
 | 
			
		||||
pq_queue_t *
 | 
			
		||||
pq_create_queue()
 | 
			
		||||
{
 | 
			
		||||
	static int i;
 | 
			
		||||
	pq_queue_t *q = NULL;
 | 
			
		||||
 | 
			
		||||
	if (i >= NUM_QUEUES) {
 | 
			
		||||
		//xil_printf("ERR: Max Queues allocated\n\r");
 | 
			
		||||
		return q;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	q = &pq_queue[i++];
 | 
			
		||||
 | 
			
		||||
	if (!q)
 | 
			
		||||
		return q;
 | 
			
		||||
 | 
			
		||||
	q->head = q->tail = q->len = 0;
 | 
			
		||||
 | 
			
		||||
	return q;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int 
 | 
			
		||||
pq_enqueue(pq_queue_t *q, void *p)
 | 
			
		||||
{
 | 
			
		||||
	if (q->len == PQ_QUEUE_SIZE)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	q->data[q->head] = p;
 | 
			
		||||
	q->head = (q->head + 1)%PQ_QUEUE_SIZE;
 | 
			
		||||
	q->len++;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void*
 | 
			
		||||
pq_dequeue(pq_queue_t *q)
 | 
			
		||||
{
 | 
			
		||||
	int ptail;
 | 
			
		||||
 | 
			
		||||
	if (q->len == 0)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	ptail = q->tail;
 | 
			
		||||
	q->tail = (q->tail + 1)%PQ_QUEUE_SIZE;
 | 
			
		||||
	q->len--;
 | 
			
		||||
 | 
			
		||||
	return q->data[ptail];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int 
 | 
			
		||||
pq_qlength(pq_queue_t *q)
 | 
			
		||||
{
 | 
			
		||||
	return q->len;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
#include "netif/xtopology.h"
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
 | 
			
		||||
struct xtopology_t xtopology[] = {
 | 
			
		||||
	{
 | 
			
		||||
		0xE000B000,
 | 
			
		||||
		xemac_type_emacps,
 | 
			
		||||
		0x0,
 | 
			
		||||
		0x0,
 | 
			
		||||
		0xF8F00100,
 | 
			
		||||
		0x36,
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int xtopology_n_emacs = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,603 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//*****************************************************************************
 | 
			
		||||
//
 | 
			
		||||
// Include OS functionality.
 | 
			
		||||
//
 | 
			
		||||
//*****************************************************************************
 | 
			
		||||
 | 
			
		||||
/* ------------------------ System architecture includes ----------------------------- */
 | 
			
		||||
#include "arch/sys_arch.h"
 | 
			
		||||
 | 
			
		||||
/* ------------------------ lwIP includes --------------------------------- */
 | 
			
		||||
#include "lwip/opt.h"
 | 
			
		||||
 | 
			
		||||
#include "lwip/debug.h"
 | 
			
		||||
#include "lwip/def.h"
 | 
			
		||||
#include "lwip/sys.h"
 | 
			
		||||
#include "lwip/mem.h"
 | 
			
		||||
#include "lwip/stats.h"
 | 
			
		||||
 | 
			
		||||
/* Very crude mechanism used to determine if the critical section handling
 | 
			
		||||
functions are being called from an interrupt context or not.  This relies on
 | 
			
		||||
the interrupt handler setting this variable manually. */
 | 
			
		||||
BaseType_t xInsideISR = pdFALSE;
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_mbox_new
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Creates a new mailbox
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      int size                -- Size of elements in the mailbox
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      sys_mbox_t              -- Handle to new mailbox
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize )
 | 
			
		||||
{
 | 
			
		||||
err_t xReturn = ERR_MEM;
 | 
			
		||||
 | 
			
		||||
	*pxMailBox = xQueueCreate( iSize, sizeof( void * ) );
 | 
			
		||||
 | 
			
		||||
	if( *pxMailBox != NULL )
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = ERR_OK;
 | 
			
		||||
		SYS_STATS_INC_USED( mbox );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_mbox_free
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Deallocates a mailbox. If there are messages still present in the
 | 
			
		||||
 *      mailbox when the mailbox is deallocated, it is an indication of a
 | 
			
		||||
 *      programming error in lwIP and the developer should be notified.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_mbox_t mbox         -- Handle of mailbox
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      sys_mbox_t              -- Handle to new mailbox
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
void sys_mbox_free( sys_mbox_t *pxMailBox )
 | 
			
		||||
{
 | 
			
		||||
unsigned long ulMessagesWaiting;
 | 
			
		||||
 | 
			
		||||
	ulMessagesWaiting = uxQueueMessagesWaiting( *pxMailBox );
 | 
			
		||||
	configASSERT( ( ulMessagesWaiting == 0 ) );
 | 
			
		||||
 | 
			
		||||
	#if SYS_STATS
 | 
			
		||||
	{
 | 
			
		||||
		if( ulMessagesWaiting != 0UL )
 | 
			
		||||
		{
 | 
			
		||||
			SYS_STATS_INC( mbox.err );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		SYS_STATS_DEC( mbox.used );
 | 
			
		||||
	}
 | 
			
		||||
	#endif /* SYS_STATS */
 | 
			
		||||
 | 
			
		||||
	vQueueDelete( *pxMailBox );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_mbox_post
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Post the "msg" to the mailbox.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_mbox_t mbox         -- Handle of mailbox
 | 
			
		||||
 *      void *data              -- Pointer to data to post
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
void sys_mbox_post( sys_mbox_t *pxMailBox, void *pxMessageToPost )
 | 
			
		||||
{
 | 
			
		||||
	while( xQueueSendToBack( *pxMailBox, &pxMessageToPost, portMAX_DELAY ) != pdTRUE );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_mbox_trypost
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Try to post the "msg" to the mailbox.  Returns immediately with
 | 
			
		||||
 *      error if cannot.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_mbox_t mbox         -- Handle of mailbox
 | 
			
		||||
 *      void *msg               -- Pointer to data to post
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      err_t                   -- ERR_OK if message posted, else ERR_MEM
 | 
			
		||||
 *                                  if not.
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost )
 | 
			
		||||
{
 | 
			
		||||
err_t xReturn;
 | 
			
		||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 | 
			
		||||
 | 
			
		||||
	if( xInsideISR != pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken );
 | 
			
		||||
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( TickType_t ) 0 );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( xReturn == pdPASS )
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = ERR_OK;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* The queue was already full. */
 | 
			
		||||
		xReturn = ERR_MEM;
 | 
			
		||||
		SYS_STATS_INC( mbox.err );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_arch_mbox_fetch
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Blocks the thread until a message arrives in the mailbox, but does
 | 
			
		||||
 *      not block the thread longer than "timeout" milliseconds (similar to
 | 
			
		||||
 *      the sys_arch_sem_wait() function). The "msg" argument is a result
 | 
			
		||||
 *      parameter that is set by the function (i.e., by doing "*msg =
 | 
			
		||||
 *      ptr"). The "msg" parameter maybe NULL to indicate that the message
 | 
			
		||||
 *      should be dropped.
 | 
			
		||||
 *
 | 
			
		||||
 *      The return values are the same as for the sys_arch_sem_wait() function:
 | 
			
		||||
 *      Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
 | 
			
		||||
 *      timeout.
 | 
			
		||||
 *
 | 
			
		||||
 *      Note that a function with a similar name, sys_mbox_fetch(), is
 | 
			
		||||
 *      implemented by lwIP.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_mbox_t mbox         -- Handle of mailbox
 | 
			
		||||
 *      void **msg              -- Pointer to pointer to msg received
 | 
			
		||||
 *      u32_t timeout           -- Number of milliseconds until timeout
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      u32_t                   -- SYS_ARCH_TIMEOUT if timeout, else number
 | 
			
		||||
 *                                  of milliseconds until received.
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
u32_t sys_arch_mbox_fetch( sys_mbox_t *pxMailBox, void **ppvBuffer, u32_t ulTimeOut )
 | 
			
		||||
{
 | 
			
		||||
void *pvDummy;
 | 
			
		||||
TickType_t xStartTime, xEndTime, xElapsed;
 | 
			
		||||
unsigned long ulReturn;
 | 
			
		||||
 | 
			
		||||
	xStartTime = xTaskGetTickCount();
 | 
			
		||||
 | 
			
		||||
	if( NULL == ppvBuffer )
 | 
			
		||||
	{
 | 
			
		||||
		ppvBuffer = &pvDummy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( ulTimeOut != 0UL )
 | 
			
		||||
	{
 | 
			
		||||
		configASSERT( xInsideISR == ( portBASE_TYPE ) 0 );
 | 
			
		||||
 | 
			
		||||
		if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_PERIOD_MS ) )
 | 
			
		||||
		{
 | 
			
		||||
			xEndTime = xTaskGetTickCount();
 | 
			
		||||
			xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
 | 
			
		||||
 | 
			
		||||
			ulReturn = xElapsed;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* Timed out. */
 | 
			
		||||
			*ppvBuffer = NULL;
 | 
			
		||||
			ulReturn = SYS_ARCH_TIMEOUT;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		while( pdTRUE != xQueueReceive( *pxMailBox, &( *ppvBuffer ), portMAX_DELAY ) );
 | 
			
		||||
		xEndTime = xTaskGetTickCount();
 | 
			
		||||
		xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
 | 
			
		||||
 | 
			
		||||
		if( xElapsed == 0UL )
 | 
			
		||||
		{
 | 
			
		||||
			xElapsed = 1UL;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ulReturn = xElapsed;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ulReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_arch_mbox_tryfetch
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Similar to sys_arch_mbox_fetch, but if message is not ready
 | 
			
		||||
 *      immediately, we'll return with SYS_MBOX_EMPTY.  On success, 0 is
 | 
			
		||||
 *      returned.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_mbox_t mbox         -- Handle of mailbox
 | 
			
		||||
 *      void **msg              -- Pointer to pointer to msg received
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      u32_t                   -- SYS_MBOX_EMPTY if no messages.  Otherwise,
 | 
			
		||||
 *                                  return ERR_OK.
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
u32_t sys_arch_mbox_tryfetch( sys_mbox_t *pxMailBox, void **ppvBuffer )
 | 
			
		||||
{
 | 
			
		||||
void *pvDummy;
 | 
			
		||||
unsigned long ulReturn;
 | 
			
		||||
long lResult;
 | 
			
		||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 | 
			
		||||
 | 
			
		||||
	if( ppvBuffer== NULL )
 | 
			
		||||
	{
 | 
			
		||||
		ppvBuffer = &pvDummy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( xInsideISR != pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		lResult = xQueueReceiveFromISR( *pxMailBox, &( *ppvBuffer ), &xHigherPriorityTaskWoken );
 | 
			
		||||
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		lResult = xQueueReceive( *pxMailBox, &( *ppvBuffer ), 0UL );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( lResult == pdPASS )
 | 
			
		||||
	{
 | 
			
		||||
		ulReturn = ERR_OK;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		ulReturn = SYS_MBOX_EMPTY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ulReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_sem_new
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Creates and returns a new semaphore. The "ucCount" argument specifies
 | 
			
		||||
 *      the initial state of the semaphore.
 | 
			
		||||
 *      NOTE: Currently this routine only creates counts of 1 or 0
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_mbox_t mbox         -- Handle of mailbox
 | 
			
		||||
 *      u8_t ucCount              -- Initial ucCount of semaphore (1 or 0)
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      sys_sem_t               -- Created semaphore or 0 if could not create.
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
err_t sys_sem_new( sys_sem_t *pxSemaphore, u8_t ucCount )
 | 
			
		||||
{
 | 
			
		||||
err_t xReturn = ERR_MEM;
 | 
			
		||||
 | 
			
		||||
	//vSemaphoreCreateBinary( ( *pxSemaphore ) );
 | 
			
		||||
	*pxSemaphore = xSemaphoreCreateCounting( 0xffff, ( unsigned long ) ucCount );
 | 
			
		||||
 | 
			
		||||
	if( *pxSemaphore != NULL )
 | 
			
		||||
	{
 | 
			
		||||
		if( ucCount == 0U )
 | 
			
		||||
		{
 | 
			
		||||
//			xSemaphoreTake( *pxSemaphore, 1UL );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		xReturn = ERR_OK;
 | 
			
		||||
		SYS_STATS_INC_USED( sem );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		SYS_STATS_INC( sem.err );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_arch_sem_wait
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Blocks the thread while waiting for the semaphore to be
 | 
			
		||||
 *      signaled. If the "timeout" argument is non-zero, the thread should
 | 
			
		||||
 *      only be blocked for the specified time (measured in
 | 
			
		||||
 *      milliseconds).
 | 
			
		||||
 *
 | 
			
		||||
 *      If the timeout argument is non-zero, the return value is the number of
 | 
			
		||||
 *      milliseconds spent waiting for the semaphore to be signaled. If the
 | 
			
		||||
 *      semaphore wasn't signaled within the specified time, the return value is
 | 
			
		||||
 *      SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
 | 
			
		||||
 *      (i.e., it was already signaled), the function may return zero.
 | 
			
		||||
 *
 | 
			
		||||
 *      Notice that lwIP implements a function with a similar name,
 | 
			
		||||
 *      sys_sem_wait(), that uses the sys_arch_sem_wait() function.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_sem_t sem           -- Semaphore to wait on
 | 
			
		||||
 *      u32_t timeout           -- Number of milliseconds until timeout
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      u32_t                   -- Time elapsed or SYS_ARCH_TIMEOUT.
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
u32_t sys_arch_sem_wait( sys_sem_t *pxSemaphore, u32_t ulTimeout )
 | 
			
		||||
{
 | 
			
		||||
TickType_t xStartTime, xEndTime, xElapsed;
 | 
			
		||||
unsigned long ulReturn;
 | 
			
		||||
 | 
			
		||||
	xStartTime = xTaskGetTickCount();
 | 
			
		||||
 | 
			
		||||
	if( ulTimeout != 0UL )
 | 
			
		||||
	{
 | 
			
		||||
		if( xSemaphoreTake( *pxSemaphore, ulTimeout / portTICK_PERIOD_MS ) == pdTRUE )
 | 
			
		||||
		{
 | 
			
		||||
			xEndTime = xTaskGetTickCount();
 | 
			
		||||
			xElapsed = (xEndTime - xStartTime) * portTICK_PERIOD_MS;
 | 
			
		||||
			ulReturn = xElapsed;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			ulReturn = SYS_ARCH_TIMEOUT;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		while( xSemaphoreTake( *pxSemaphore, portMAX_DELAY ) != pdTRUE );
 | 
			
		||||
		xEndTime = xTaskGetTickCount();
 | 
			
		||||
		xElapsed = ( xEndTime - xStartTime ) * portTICK_PERIOD_MS;
 | 
			
		||||
 | 
			
		||||
		if( xElapsed == 0UL )
 | 
			
		||||
		{
 | 
			
		||||
			xElapsed = 1UL;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ulReturn = xElapsed;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ulReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Create a new mutex
 | 
			
		||||
 * @param mutex pointer to the mutex to create
 | 
			
		||||
 * @return a new mutex */
 | 
			
		||||
err_t sys_mutex_new( sys_mutex_t *pxMutex )
 | 
			
		||||
{
 | 
			
		||||
err_t xReturn = ERR_MEM;
 | 
			
		||||
 | 
			
		||||
	*pxMutex = xSemaphoreCreateMutex();
 | 
			
		||||
 | 
			
		||||
	if( *pxMutex != NULL )
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = ERR_OK;
 | 
			
		||||
		SYS_STATS_INC_USED( mutex );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		SYS_STATS_INC( mutex.err );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Lock a mutex
 | 
			
		||||
 * @param mutex the mutex to lock */
 | 
			
		||||
void sys_mutex_lock( sys_mutex_t *pxMutex )
 | 
			
		||||
{
 | 
			
		||||
BaseType_t xGotSemaphore;
 | 
			
		||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 | 
			
		||||
 | 
			
		||||
	if( xInsideISR == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		while( xSemaphoreTake( *pxMutex, portMAX_DELAY ) != pdPASS );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xGotSemaphore = xSemaphoreTakeFromISR( *pxMutex, &xHigherPriorityTaskWoken );
 | 
			
		||||
		configASSERT( xGotSemaphore );
 | 
			
		||||
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
 | 
			
		||||
 | 
			
		||||
		/* Prevent compiler warnings if configASSERT() is not defined. */
 | 
			
		||||
		( void ) xGotSemaphore;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Unlock a mutex
 | 
			
		||||
 * @param mutex the mutex to unlock */
 | 
			
		||||
void sys_mutex_unlock(sys_mutex_t *pxMutex )
 | 
			
		||||
{
 | 
			
		||||
	xSemaphoreGive( *pxMutex );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** Delete a semaphore
 | 
			
		||||
 * @param mutex the mutex to delete */
 | 
			
		||||
void sys_mutex_free( sys_mutex_t *pxMutex )
 | 
			
		||||
{
 | 
			
		||||
	SYS_STATS_DEC( mutex.used );
 | 
			
		||||
	vQueueDelete( *pxMutex );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_sem_signal
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Signals (releases) a semaphore
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_sem_t sem           -- Semaphore to signal
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
void sys_sem_signal( sys_sem_t *pxSemaphore )
 | 
			
		||||
{
 | 
			
		||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 | 
			
		||||
 | 
			
		||||
	if( xInsideISR != pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		xSemaphoreGiveFromISR( *pxSemaphore, &xHigherPriorityTaskWoken );
 | 
			
		||||
		portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xSemaphoreGive( *pxSemaphore );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_sem_free
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Deallocates a semaphore
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_sem_t sem           -- Semaphore to free
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
void sys_sem_free( sys_sem_t *pxSemaphore )
 | 
			
		||||
{
 | 
			
		||||
	SYS_STATS_DEC(sem.used);
 | 
			
		||||
	vQueueDelete( *pxSemaphore );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_init
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Initialize sys arch
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
void sys_init(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u32_t sys_now(void)
 | 
			
		||||
{
 | 
			
		||||
	return xTaskGetTickCount();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_thread_new
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      Starts a new thread with priority "prio" that will begin its
 | 
			
		||||
 *      execution in the function "thread()". The "arg" argument will be
 | 
			
		||||
 *      passed as an argument to the thread() function. The id of the new
 | 
			
		||||
 *      thread is returned. Both the id and the priority are system
 | 
			
		||||
 *      dependent.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      char *name              -- Name of thread
 | 
			
		||||
 *      void (* thread)(void *arg) -- Pointer to function to run.
 | 
			
		||||
 *      void *arg               -- Argument passed into function
 | 
			
		||||
 *      int stacksize           -- Required stack amount in bytes
 | 
			
		||||
 *      int prio                -- Thread priority
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      sys_thread_t            -- Pointer to per-thread timeouts.
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
 | 
			
		||||
{
 | 
			
		||||
TaskHandle_t xCreatedTask;
 | 
			
		||||
portBASE_TYPE xResult;
 | 
			
		||||
sys_thread_t xReturn;
 | 
			
		||||
 | 
			
		||||
	xResult = xTaskCreate( pxThread, pcName, iStackSize, pvArg, iPriority, &xCreatedTask );
 | 
			
		||||
 | 
			
		||||
	if( xResult == pdPASS )
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = xCreatedTask;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xReturn = NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xReturn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_arch_protect
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      This optional function does a "fast" critical region protection and
 | 
			
		||||
 *      returns the previous protection level. This function is only called
 | 
			
		||||
 *      during very short critical regions. An embedded system which supports
 | 
			
		||||
 *      ISR-based drivers might want to implement this function by disabling
 | 
			
		||||
 *      interrupts. Task-based systems might want to implement this by using
 | 
			
		||||
 *      a mutex or disabling tasking. This function should support recursive
 | 
			
		||||
 *      calls from the same task or interrupt. In other words,
 | 
			
		||||
 *      sys_arch_protect() could be called while already protected. In
 | 
			
		||||
 *      that case the return value indicates that it is already protected.
 | 
			
		||||
 *
 | 
			
		||||
 *      sys_arch_protect() is only required if your port is supporting an
 | 
			
		||||
 *      operating system.
 | 
			
		||||
 * Outputs:
 | 
			
		||||
 *      sys_prot_t              -- Previous protection level (not used here)
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
sys_prot_t sys_arch_protect( void )
 | 
			
		||||
{
 | 
			
		||||
	if( xInsideISR == pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		taskENTER_CRITICAL();
 | 
			
		||||
	}
 | 
			
		||||
	return ( sys_prot_t ) 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------------------*
 | 
			
		||||
 * Routine:  sys_arch_unprotect
 | 
			
		||||
 *---------------------------------------------------------------------------*
 | 
			
		||||
 * Description:
 | 
			
		||||
 *      This optional function does a "fast" set of critical region
 | 
			
		||||
 *      protection to the value specified by pval. See the documentation for
 | 
			
		||||
 *      sys_arch_protect() for more information. This function is only
 | 
			
		||||
 *      required if your port is supporting an operating system.
 | 
			
		||||
 * Inputs:
 | 
			
		||||
 *      sys_prot_t              -- Previous protection level (not used here)
 | 
			
		||||
 *---------------------------------------------------------------------------*/
 | 
			
		||||
void sys_arch_unprotect( sys_prot_t xValue )
 | 
			
		||||
{
 | 
			
		||||
	(void) xValue;
 | 
			
		||||
	if( xInsideISR == pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		taskEXIT_CRITICAL();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Prints an assertion messages and aborts execution.
 | 
			
		||||
 */
 | 
			
		||||
void sys_assert( const char *pcMessage )
 | 
			
		||||
{
 | 
			
		||||
	(void) pcMessage;
 | 
			
		||||
 | 
			
		||||
	for (;;)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*-------------------------------------------------------------------------*
 | 
			
		||||
 * End of File:  sys_arch.c
 | 
			
		||||
 *-------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,184 @@
 | 
			
		|||
/*
 | 
			
		||||
	FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
	All rights reserved
 | 
			
		||||
 | 
			
		||||
	VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	 *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
	 *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
	 *    platform software that has become a de facto standard.             *
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	 *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
	 *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
	 *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	 *    Thank you!                                                         *
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
 | 
			
		||||
	This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
	FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
	the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
	Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
	>>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
	>>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
	>>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
	>>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
	FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
	WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
	FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
	link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
	1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	 *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
	 *    not run, what could be wrong?"                                     *
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	 *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
	 *                                                                       *
 | 
			
		||||
	***************************************************************************
 | 
			
		||||
 | 
			
		||||
	http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
	license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
	http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
	including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
	compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
	http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
	Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
	licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
	http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
	engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
	mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
	1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * NOTE 1:  This project provides three demo applications.  A simple blinky
 | 
			
		||||
 * style project, a more comprehensive test and demo application, and an
 | 
			
		||||
 * lwIP example.  The mainSELECTED_APPLICATION setting in main.c is used to
 | 
			
		||||
 * select between the three.  See the notes on using mainSELECTED_APPLICATION
 | 
			
		||||
 * in main.c.  This file implements the simply blinky style version.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE 2:  This file only contains the source code that is specific to the
 | 
			
		||||
 * basic demo.  Generic functions, such FreeRTOS hook functions, and functions
 | 
			
		||||
 * required to configure the hardware are defined in main.c.
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * The lwIP example can be configured to use either a static or dynamic IP
 | 
			
		||||
 * address:
 | 
			
		||||
 *    + To use a dynamically allocated IP address set LWIP_DHCP to 1 in
 | 
			
		||||
 *      lwipopts.h and connect the target to a network that includes a DHCP
 | 
			
		||||
 *      server.  The obtained IP address is printed to the UART console.
 | 
			
		||||
 *    + To use a static IP address set LWIP_DHCP to 0 in lwipopts.h and set
 | 
			
		||||
 *      the static IP address using the configIP_ADDR0 to configIP_ADDR3
 | 
			
		||||
 *      constants at the bottom of FreeRTOSConfig.h.  Constants used to define
 | 
			
		||||
 *      a netmask are also located at the bottom of FreeRTOSConfig.h.
 | 
			
		||||
 *
 | 
			
		||||
 * When connected correctly the demo uses the lwIP sockets API to create
 | 
			
		||||
 * a FreeRTOS+CLI command console, and the lwIP raw API to create a create a
 | 
			
		||||
 * basic HTTP web server with server side includes that generate dynamic run
 | 
			
		||||
 * time web pages.  See http://www.freertos.org/RTOS-Xilinx-Zynq.html for more
 | 
			
		||||
 * information.
 | 
			
		||||
 *
 | 
			
		||||
 * To connect to FreeRTOS+CLI, open a command prompt and enter "telnet <ipaddr>"
 | 
			
		||||
 * where <ipaddr> is the IP address of the target.  Once connected type "help"
 | 
			
		||||
 * to see a list of registered commands.  Note this example does not implement
 | 
			
		||||
 * a real telnet server, it just uses the telnet port number to allow easy
 | 
			
		||||
 * connection using telnet tools.
 | 
			
		||||
 *
 | 
			
		||||
 * To connect to the http server simply type the IP address of the target into
 | 
			
		||||
 * the address bar of a web browser.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Kernel includes. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "timers.h"
 | 
			
		||||
 | 
			
		||||
/* Standard demo includes. */
 | 
			
		||||
#include "partest.h"
 | 
			
		||||
 | 
			
		||||
/* lwIP includes. */
 | 
			
		||||
#include "lwip/tcpip.h"
 | 
			
		||||
 | 
			
		||||
/* The rate at which data is sent to the queue.  The 200ms value is converted
 | 
			
		||||
to ticks using the portTICK_PERIOD_MS constant. */
 | 
			
		||||
#define mainTIMER_PERIOD_MS			( 200 / portTICK_PERIOD_MS )
 | 
			
		||||
 | 
			
		||||
/* The LED toggled by the Rx task. */
 | 
			
		||||
#define mainTIMER_LED				( 0 )
 | 
			
		||||
 | 
			
		||||
/* A block time of zero just means "don't block". */
 | 
			
		||||
#define mainDONT_BLOCK				( 0 )
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The callback for the timer that just toggles an LED to show the system is
 | 
			
		||||
 * running.
 | 
			
		||||
 */
 | 
			
		||||
static void prvLEDToggleTimer( TimerHandle_t pxTimer );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Defined in lwIPApps.c.
 | 
			
		||||
 */
 | 
			
		||||
extern void lwIPAppsInit( void *pvArguments );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void main_lwIP( void )
 | 
			
		||||
{
 | 
			
		||||
TimerHandle_t xTimer;
 | 
			
		||||
 | 
			
		||||
	/* Init lwIP and start lwIP tasks. */
 | 
			
		||||
	tcpip_init( lwIPAppsInit, NULL );
 | 
			
		||||
 | 
			
		||||
	/* A timer is used to toggle an LED just to show the application is
 | 
			
		||||
	executing. */
 | 
			
		||||
	xTimer = xTimerCreate( 	"LED", 					/* Text name to make debugging easier. */
 | 
			
		||||
							mainTIMER_PERIOD_MS, 	/* The timer's period. */
 | 
			
		||||
							pdTRUE,					/* This is an auto reload timer. */
 | 
			
		||||
							NULL,					/* ID is not used. */
 | 
			
		||||
							prvLEDToggleTimer );	/* The callback function. */
 | 
			
		||||
 | 
			
		||||
	/* Start the timer. */
 | 
			
		||||
	configASSERT( xTimer );
 | 
			
		||||
	xTimerStart( xTimer, mainDONT_BLOCK );
 | 
			
		||||
 | 
			
		||||
	/* Start the tasks and timer running. */
 | 
			
		||||
	vTaskStartScheduler();
 | 
			
		||||
 | 
			
		||||
	/* If all is well, the scheduler will now be running, and the following
 | 
			
		||||
	line will never be reached.  If the following line does execute, then
 | 
			
		||||
	there was either insufficient FreeRTOS heap memory available for the idle
 | 
			
		||||
	and/or timer tasks to be created, or vTaskStartScheduler() was called from
 | 
			
		||||
	User mode.  See the memory management section on the FreeRTOS web site for
 | 
			
		||||
	more details on the FreeRTOS heap http://www.freertos.org/a00111.html.  The
 | 
			
		||||
	mode from which main() is called is set in the C start up code and must be
 | 
			
		||||
	a privileged mode (not user mode). */
 | 
			
		||||
	for( ;; );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvLEDToggleTimer( TimerHandle_t pxTimer )
 | 
			
		||||
{
 | 
			
		||||
	/* Prevent compiler warnings. */
 | 
			
		||||
	( void ) pxTimer;
 | 
			
		||||
 | 
			
		||||
	/* Just toggle an LED to show the application is running. */
 | 
			
		||||
	vParTestToggleLED( mainTIMER_LED );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
							
								
								
									
										312
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwipopts.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										312
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/lwipopts.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,312 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
 | 
			
		||||
 * All rights reserved. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without modification, 
 | 
			
		||||
 * are permitted provided that the following conditions are met:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer.
 | 
			
		||||
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
 *    this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
 *    and/or other materials provided with the distribution.
 | 
			
		||||
 * 3. The name of the author may not be used to endorse or promote products
 | 
			
		||||
 *    derived from this software without specific prior written permission. 
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
 | 
			
		||||
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 | 
			
		||||
 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 | 
			
		||||
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
 | 
			
		||||
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 | 
			
		||||
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | 
			
		||||
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
 | 
			
		||||
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 | 
			
		||||
 * OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the lwIP TCP/IP stack.
 | 
			
		||||
 * 
 | 
			
		||||
 * Author: Adam Dunkels <adam@sics.se>
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __LWIPOPTS_H__
 | 
			
		||||
#define __LWIPOPTS_H__
 | 
			
		||||
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
/* Functions used to obtain and release exclusive access to the Tx buffer.  The
 | 
			
		||||
Get function will block if the Tx buffer is not available - use with care! */
 | 
			
		||||
signed char *pcLwipBlockingGetTxBuffer( void );
 | 
			
		||||
void vLwipAppsReleaseTxBuffer( void );
 | 
			
		||||
 | 
			
		||||
#define CONFIG_LINKSPEED_AUTODETECT 1
 | 
			
		||||
#define OS_IS_FREERTOS
 | 
			
		||||
 | 
			
		||||
/* SSI options. */
 | 
			
		||||
#define TCPIP_THREAD_NAME              "tcpip"
 | 
			
		||||
#define LWIP_HTTPD_MAX_TAG_NAME_LEN 20
 | 
			
		||||
#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 1024
 | 
			
		||||
#define TCPIP_THREAD_PRIO configLWIP_TASK_PRIORITY
 | 
			
		||||
#define TCPIP_THREAD_STACKSIZE configMINIMAL_STACK_SIZE * 3
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_TCP_RECVMBOX_SIZE 5
 | 
			
		||||
#define DEFAULT_ACCEPTMBOX_SIZE 5
 | 
			
		||||
#define TCPIP_MBOX_SIZE			 		10
 | 
			
		||||
 | 
			
		||||
#define NO_SYS							0
 | 
			
		||||
#define LWIP_SOCKET						(NO_SYS==0)
 | 
			
		||||
#define LWIP_NETCONN              		1
 | 
			
		||||
 | 
			
		||||
#define LWIP_SNMP						0
 | 
			
		||||
#define LWIP_IGMP						0
 | 
			
		||||
#define LWIP_ICMP						1
 | 
			
		||||
 | 
			
		||||
/* DNS is not going to be used as this is a simple local example. */
 | 
			
		||||
#define LWIP_DNS						0
 | 
			
		||||
 | 
			
		||||
#define LWIP_HAVE_LOOPIF				0
 | 
			
		||||
#define TCP_LISTEN_BACKLOG				0
 | 
			
		||||
#define LWIP_SO_RCVTIMEO		   		1
 | 
			
		||||
#define LWIP_SO_RCVBUF			 		1
 | 
			
		||||
 | 
			
		||||
//#define LWIP_DEBUG
 | 
			
		||||
#ifdef LWIP_DEBUG
 | 
			
		||||
 | 
			
		||||
#define LWIP_DBG_MIN_LEVEL        LWIP_DBG_LEVEL_ALL // LWIP_DBG_LEVEL_SERIOUS
 | 
			
		||||
#define PPP_DEBUG                  LWIP_DBG_OFF
 | 
			
		||||
#define MEM_DEBUG                  LWIP_DBG_OFF
 | 
			
		||||
#define MEMP_DEBUG                 LWIP_DBG_OFF
 | 
			
		||||
#define PBUF_DEBUG                 LWIP_DBG_OFF
 | 
			
		||||
#define API_LIB_DEBUG              LWIP_DBG_OFF
 | 
			
		||||
#define API_MSG_DEBUG              LWIP_DBG_OFF
 | 
			
		||||
#define TCPIP_DEBUG                LWIP_DBG_OFF
 | 
			
		||||
#define NETIF_DEBUG                LWIP_DBG_OFF
 | 
			
		||||
#define SOCKETS_DEBUG              LWIP_DBG_OFF
 | 
			
		||||
#define DNS_DEBUG                  LWIP_DBG_OFF
 | 
			
		||||
#define AUTOIP_DEBUG               LWIP_DBG_OFF
 | 
			
		||||
#define DHCP_DEBUG                 LWIP_DBG_ON
 | 
			
		||||
#define IP_DEBUG                   LWIP_DBG_OFF
 | 
			
		||||
#define IP_REASS_DEBUG             LWIP_DBG_OFF
 | 
			
		||||
#define ICMP_DEBUG                 LWIP_DBG_OFF
 | 
			
		||||
#define IGMP_DEBUG                 LWIP_DBG_OFF
 | 
			
		||||
#define UDP_DEBUG                  LWIP_DBG_OFF
 | 
			
		||||
#define TCP_DEBUG                  LWIP_DBG_OFF
 | 
			
		||||
#define TCP_INPUT_DEBUG            LWIP_DBG_OFF
 | 
			
		||||
#define TCP_OUTPUT_DEBUG           LWIP_DBG_OFF
 | 
			
		||||
#define TCP_RTO_DEBUG              LWIP_DBG_OFF
 | 
			
		||||
#define TCP_CWND_DEBUG             LWIP_DBG_OFF
 | 
			
		||||
#define TCP_WND_DEBUG              LWIP_DBG_OFF
 | 
			
		||||
#define TCP_FR_DEBUG               LWIP_DBG_OFF
 | 
			
		||||
#define TCP_QLEN_DEBUG             LWIP_DBG_OFF
 | 
			
		||||
#define TCP_RST_DEBUG              LWIP_DBG_OFF
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define LWIP_DBG_TYPES_ON         (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- Memory options ---------- */
 | 
			
		||||
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
 | 
			
		||||
   lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
 | 
			
		||||
   byte alignment -> define MEM_ALIGNMENT to 2. */
 | 
			
		||||
/* MSVC port: intel processors don't need 4-byte alignment,
 | 
			
		||||
   but are faster that way! */
 | 
			
		||||
#define MEM_ALIGNMENT			64
 | 
			
		||||
 | 
			
		||||
/* MEM_SIZE: the size of the heap memory. If the application will send
 | 
			
		||||
a lot of data that needs to be copied, this should be set high. */
 | 
			
		||||
#define MEM_SIZE				0x20000
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
 | 
			
		||||
   sends a lot of data out of ROM (or other static memory), this
 | 
			
		||||
   should be set high. */
 | 
			
		||||
#define MEMP_NUM_PBUF			16
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_RAW_PCB: the number of UDP protocol control blocks. One
 | 
			
		||||
   per active RAW "connection". */
 | 
			
		||||
#define LWIP_RAW				0
 | 
			
		||||
#define MEMP_NUM_RAW_PCB		0
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
 | 
			
		||||
   per active UDP "connection". */
 | 
			
		||||
#define MEMP_NUM_UDP_PCB		4
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
 | 
			
		||||
   connections. */
 | 
			
		||||
#define MEMP_NUM_TCP_PCB		32
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
 | 
			
		||||
   connections. */
 | 
			
		||||
#define MEMP_NUM_TCP_PCB_LISTEN 8
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
 | 
			
		||||
   segments. */
 | 
			
		||||
#define MEMP_NUM_TCP_SEG		256
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
 | 
			
		||||
   timeouts. */
 | 
			
		||||
#define MEMP_NUM_SYS_TIMEOUT	8
 | 
			
		||||
 | 
			
		||||
/* The following four are used only with the sequential API and can be
 | 
			
		||||
   set to 0 if the application only will use the raw API. */
 | 
			
		||||
/* MEMP_NUM_NETBUF: the number of struct netbufs. */
 | 
			
		||||
#define MEMP_NUM_NETBUF         0
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_NETCONN: the number of struct netconns. */
 | 
			
		||||
#define MEMP_NUM_NETCONN        10
 | 
			
		||||
 | 
			
		||||
/* MEMP_NUM_TCPIP_MSG_*: the number of struct tcpip_msg, which is used
 | 
			
		||||
   for sequential API communication and incoming packets. Used in
 | 
			
		||||
   src/api/tcpip.c. */
 | 
			
		||||
#define MEMP_NUM_TCPIP_MSG_API   4
 | 
			
		||||
#define MEMP_NUM_TCPIP_MSG_INPKT 4
 | 
			
		||||
 | 
			
		||||
#define MEMP_NUM_ARP_QUEUE		5
 | 
			
		||||
 | 
			
		||||
/* ---------- Pbuf options ---------- */
 | 
			
		||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
 | 
			
		||||
#define PBUF_POOL_SIZE			256
 | 
			
		||||
 | 
			
		||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
 | 
			
		||||
#define PBUF_POOL_BUFSIZE		1700
 | 
			
		||||
 | 
			
		||||
/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
 | 
			
		||||
   link level header. */
 | 
			
		||||
#define PBUF_LINK_HLEN			16
 | 
			
		||||
 | 
			
		||||
/** SYS_LIGHTWEIGHT_PROT
 | 
			
		||||
 * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection
 | 
			
		||||
 * for certain critical regions during buffer allocation, deallocation and memory
 | 
			
		||||
 * allocation and deallocation.
 | 
			
		||||
 */
 | 
			
		||||
#define SYS_LIGHTWEIGHT_PROT	(NO_SYS==0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- TCP options ---------- */
 | 
			
		||||
#define LWIP_TCP				1
 | 
			
		||||
#define TCP_TTL					255
 | 
			
		||||
 | 
			
		||||
/* Controls if TCP should queue segments that arrive out of
 | 
			
		||||
   order. Define to 0 if your device is low on memory. */
 | 
			
		||||
#define TCP_QUEUE_OOSEQ			1
 | 
			
		||||
 | 
			
		||||
/* TCP Maximum segment size. */
 | 
			
		||||
#define TCP_MSS					1460
 | 
			
		||||
 | 
			
		||||
/* TCP sender buffer space (bytes). */
 | 
			
		||||
#define TCP_SND_BUF				8129
 | 
			
		||||
 | 
			
		||||
/* TCP sender buffer space (pbufs). This must be at least = 2 *
 | 
			
		||||
   TCP_SND_BUF/TCP_MSS for things to work. */
 | 
			
		||||
#define TCP_SND_QUEUELEN		(16 * TCP_SND_BUF/TCP_MSS)
 | 
			
		||||
 | 
			
		||||
/* TCP writable space (bytes). This must be less than or equal
 | 
			
		||||
   to TCP_SND_BUF. It is the amount of space which must be
 | 
			
		||||
   available in the tcp snd_buf for select to return writable */
 | 
			
		||||
#define TCP_SNDLOWAT			(TCP_SND_BUF/2)
 | 
			
		||||
 | 
			
		||||
/* TCP receive window. */
 | 
			
		||||
#define TCP_WND					( 2048 )
 | 
			
		||||
 | 
			
		||||
/* Maximum number of retransmissions of data segments. */
 | 
			
		||||
#define TCP_MAXRTX				12
 | 
			
		||||
 | 
			
		||||
/* Maximum number of retransmissions of SYN segments. */
 | 
			
		||||
#define TCP_SYNMAXRTX			4
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- ARP options ---------- */
 | 
			
		||||
#define LWIP_ARP				1
 | 
			
		||||
#define ARP_TABLE_SIZE			10
 | 
			
		||||
#define ARP_QUEUEING			1
 | 
			
		||||
 | 
			
		||||
#define ICMP_TTL 255
 | 
			
		||||
 | 
			
		||||
#define IP_OPTIONS 0
 | 
			
		||||
 | 
			
		||||
/* ---------- IP options ---------- */
 | 
			
		||||
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
 | 
			
		||||
   IP packets across network interfaces. If you are going to run lwIP
 | 
			
		||||
   on a device with only one network interface, define this to 0. */
 | 
			
		||||
#define IP_FORWARD				0
 | 
			
		||||
 | 
			
		||||
/* IP reassembly and segmentation.These are orthogonal even
 | 
			
		||||
 * if they both deal with IP fragments */
 | 
			
		||||
#define IP_REASSEMBLY			0
 | 
			
		||||
#define IP_REASS_MAX_PBUFS		10
 | 
			
		||||
#define MEMP_NUM_REASSDATA		10
 | 
			
		||||
#define IP_FRAG					0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- ICMP options ---------- */
 | 
			
		||||
#define ICMP_TTL				255
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- DHCP options ---------- */
 | 
			
		||||
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
 | 
			
		||||
   interfaces. */
 | 
			
		||||
#define LWIP_DHCP				0
 | 
			
		||||
 | 
			
		||||
/* 1 if you want to do an ARP check on the offered address
 | 
			
		||||
   (recommended). */
 | 
			
		||||
#define DHCP_DOES_ARP_CHECK		(LWIP_DHCP)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- AUTOIP options ------- */
 | 
			
		||||
#define LWIP_AUTOIP				0
 | 
			
		||||
#define LWIP_DHCP_AUTOIP_COOP	(LWIP_DHCP && LWIP_AUTOIP)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- UDP options ---------- */
 | 
			
		||||
#define LWIP_UDP				1
 | 
			
		||||
#define LWIP_UDPLITE			1
 | 
			
		||||
#define UDP_TTL					255
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- Statistics options ---------- */
 | 
			
		||||
 | 
			
		||||
#define LWIP_STATS				1
 | 
			
		||||
#define LWIP_STATS_DISPLAY		0
 | 
			
		||||
 | 
			
		||||
#if LWIP_STATS
 | 
			
		||||
	#define LINK_STATS				1
 | 
			
		||||
	#define IP_STATS				1
 | 
			
		||||
	#define ICMP_STATS				0
 | 
			
		||||
	#define IGMP_STATS				0
 | 
			
		||||
	#define IPFRAG_STATS			0
 | 
			
		||||
	#define UDP_STATS				1
 | 
			
		||||
	#define TCP_STATS				1
 | 
			
		||||
	#define MEM_STATS				1
 | 
			
		||||
	#define MEMP_STATS				1
 | 
			
		||||
	#define PBUF_STATS				1
 | 
			
		||||
	#define SYS_STATS				1
 | 
			
		||||
#endif /* LWIP_STATS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ---------- PPP options ---------- */
 | 
			
		||||
 | 
			
		||||
#define PPP_SUPPORT			 0	  /* Set > 0 for PPP */
 | 
			
		||||
 | 
			
		||||
#if PPP_SUPPORT
 | 
			
		||||
 | 
			
		||||
	#define NUM_PPP					1	  /* Max PPP sessions. */
 | 
			
		||||
 | 
			
		||||
	/* Select modules to enable.  Ideally these would be set in the makefile but
 | 
			
		||||
	 * we're limited by the command line length so you need to modify the settings
 | 
			
		||||
	 * in this file.
 | 
			
		||||
	 */
 | 
			
		||||
	#define PPPOE_SUPPORT			1
 | 
			
		||||
	#define PPPOS_SUPPORT			1
 | 
			
		||||
	#define PAP_SUPPORT				1	  /* Set > 0 for PAP. */
 | 
			
		||||
	#define CHAP_SUPPORT			1	  /* Set > 0 for CHAP. */
 | 
			
		||||
	#define MSCHAP_SUPPORT			0	  /* Set > 0 for MSCHAP (NOT FUNCTIONAL!) */
 | 
			
		||||
	#define CBCP_SUPPORT			0	  /* Set > 0 for CBCP (NOT FUNCTIONAL!) */
 | 
			
		||||
	#define CCP_SUPPORT				0	  /* Set > 0 for CCP (NOT FUNCTIONAL!) */
 | 
			
		||||
	#define VJ_SUPPORT				1	  /* Set > 0 for VJ header compression. */
 | 
			
		||||
	#define MD5_SUPPORT				1	  /* Set > 0 for MD5 (see also CHAP) */
 | 
			
		||||
 | 
			
		||||
#endif /* PPP_SUPPORT */
 | 
			
		||||
 | 
			
		||||
#define LWIP_NETIF_STATUS_CALLBACK 1
 | 
			
		||||
 | 
			
		||||
#endif /* __LWIPOPTS_H__ */
 | 
			
		||||
							
								
								
									
										388
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,388 @@
 | 
			
		|||
/*
 | 
			
		||||
    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.
 | 
			
		||||
    All rights reserved
 | 
			
		||||
 | 
			
		||||
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
			
		||||
     *    robust, strictly quality controlled, supported, and cross          *
 | 
			
		||||
     *    platform software that has become a de facto standard.             *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Help yourself get started quickly and support the FreeRTOS         *
 | 
			
		||||
     *    project by purchasing a FreeRTOS tutorial book, reference          *
 | 
			
		||||
     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Thank you!                                                         *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    This file is part of the FreeRTOS distribution.
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
			
		||||
    the terms of the GNU General Public License (version 2) as published by the
 | 
			
		||||
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
			
		||||
 | 
			
		||||
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
			
		||||
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
			
		||||
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
			
		||||
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
			
		||||
 | 
			
		||||
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
			
		||||
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
			
		||||
    FOR A PARTICULAR PURPOSE.  Full license text is available from the following
 | 
			
		||||
    link: http://www.freertos.org/a00114.html
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    Having a problem?  Start by reading the FAQ "My application does   *
 | 
			
		||||
     *    not run, what could be wrong?"                                     *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
     *    http://www.FreeRTOS.org/FAQHelp.html                               *
 | 
			
		||||
     *                                                                       *
 | 
			
		||||
    ***************************************************************************
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org - Documentation, books, training, latest versions,
 | 
			
		||||
    license and Real Time Engineers Ltd. contact details.
 | 
			
		||||
 | 
			
		||||
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
			
		||||
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
			
		||||
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
			
		||||
 | 
			
		||||
    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
 | 
			
		||||
    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
			
		||||
    licenses offer ticketed support, indemnification and middleware.
 | 
			
		||||
 | 
			
		||||
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
			
		||||
    engineered and independently SIL3 certified version for use in safety and
 | 
			
		||||
    mission critical applications that require provable dependability.
 | 
			
		||||
 | 
			
		||||
    1 tab == 4 spaces!
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * This project provides three demo applications.  A simple blinky style
 | 
			
		||||
 * project, a more comprehensive test and demo application, and an lwIP example.
 | 
			
		||||
 * The mainSELECTED_APPLICATION setting (defined in this file) is used to
 | 
			
		||||
 * select between the three.  The simply blinky demo is implemented and
 | 
			
		||||
 * described in main_blinky.c.  The more comprehensive test and demo application
 | 
			
		||||
 * is implemented and described in main_full.c.  The lwIP example is implemented
 | 
			
		||||
 * and described in main_lwIP.c.
 | 
			
		||||
 *
 | 
			
		||||
 * This file implements the code that is not demo specific, including the
 | 
			
		||||
 * hardware setup and FreeRTOS hook functions.
 | 
			
		||||
 *
 | 
			
		||||
 * !!! IMPORTANT NOTE !!!
 | 
			
		||||
 * The GCC libraries that ship with the Xilinx SDK make use of the floating
 | 
			
		||||
 * point registers.  To avoid this causing corruption it is necessary to avoid
 | 
			
		||||
 * their use.  For this reason main.c contains very basic C implementations of
 | 
			
		||||
 * the standard C library functions memset(), memcpy() and memcmp(), which are
 | 
			
		||||
 * are used by FreeRTOS itself.  Defining these functions in the project 
 | 
			
		||||
 * prevents the linker pulling them in from the library.  Any other standard C
 | 
			
		||||
 * library functions that are used by the application must likewise be defined
 | 
			
		||||
 * in C.
 | 
			
		||||
 *
 | 
			
		||||
 * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON
 | 
			
		||||
 * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO
 | 
			
		||||
 * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Standard includes. */
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
/* Scheduler include files. */
 | 
			
		||||
#include "FreeRTOS.h"
 | 
			
		||||
#include "task.h"
 | 
			
		||||
#include "semphr.h"
 | 
			
		||||
 | 
			
		||||
/* Standard demo includes. */
 | 
			
		||||
#include "partest.h"
 | 
			
		||||
#include "TimerDemo.h"
 | 
			
		||||
#include "QueueOverwrite.h"
 | 
			
		||||
#include "EventGroupsDemo.h"
 | 
			
		||||
 | 
			
		||||
/* Xilinx includes. */
 | 
			
		||||
#include "platform.h"
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xscutimer.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
#include "xil_exception.h"
 | 
			
		||||
 | 
			
		||||
/* mainSELECTED_APPLICATION is used to select between three demo applications,
 | 
			
		||||
 * as described at the top of this file.
 | 
			
		||||
 *
 | 
			
		||||
 * When mainSELECTED_APPLICATION is set to 0 the simple blinky example will
 | 
			
		||||
 * be run.
 | 
			
		||||
 *
 | 
			
		||||
 * When mainSELECTED_APPLICATION is set to 1 the comprehensive test and demo
 | 
			
		||||
 * application will be run.
 | 
			
		||||
 *
 | 
			
		||||
 * When mainSELECTED_APPLICATION is set to 2 the lwIP example will be run.
 | 
			
		||||
 */
 | 
			
		||||
#define mainSELECTED_APPLICATION	1
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Configure the hardware as necessary to run this demo.
 | 
			
		||||
 */
 | 
			
		||||
static void prvSetupHardware( void );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * See the comments at the top of this file and above the
 | 
			
		||||
 * mainSELECTED_APPLICATION definition.
 | 
			
		||||
 */
 | 
			
		||||
#if ( mainSELECTED_APPLICATION == 0 )
 | 
			
		||||
	extern void main_blinky( void );
 | 
			
		||||
#elif ( mainSELECTED_APPLICATION == 1 )
 | 
			
		||||
	extern void main_full( void );
 | 
			
		||||
#elif ( mainSELECTED_APPLICATION == 2 )
 | 
			
		||||
	extern void main_lwIP( void );
 | 
			
		||||
#else
 | 
			
		||||
	#error Invalid mainSELECTED_APPLICATION setting.  See the comments at the top of this file and above the mainSELECTED_APPLICATION definition.
 | 
			
		||||
#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The Xilinx projects use a BSP that do not allow the start up code to be
 | 
			
		||||
 * altered easily.  Therefore the vector table used by FreeRTOS is defined in
 | 
			
		||||
 * FreeRTOS_asm_vectors.S, which is part of this project.  Switch to use the
 | 
			
		||||
 * FreeRTOS vector table.
 | 
			
		||||
 */
 | 
			
		||||
extern void vPortInstallFreeRTOSVectorTable( void );
 | 
			
		||||
 | 
			
		||||
/* Prototypes for the standard FreeRTOS callback/hook functions implemented
 | 
			
		||||
within this file. */
 | 
			
		||||
void vApplicationMallocFailedHook( void );
 | 
			
		||||
void vApplicationIdleHook( void );
 | 
			
		||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
 | 
			
		||||
void vApplicationTickHook( void );
 | 
			
		||||
 | 
			
		||||
/* The private watchdog is used as the timer that generates run time
 | 
			
		||||
stats.  This frequency means it will overflow quite quickly. */
 | 
			
		||||
XScuWdt xWatchDogInstance;
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* The interrupt controller is initialised in this file, and made available to
 | 
			
		||||
other modules. */
 | 
			
		||||
XScuGic xInterruptController;
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
int main( void )
 | 
			
		||||
{
 | 
			
		||||
extern void main_lwIP( void );
 | 
			
		||||
 | 
			
		||||
	/* Configure the hardware ready to run the demo. */
 | 
			
		||||
	prvSetupHardware();
 | 
			
		||||
 | 
			
		||||
	/* The mainSELECTED_APPLICATION setting is described at the top
 | 
			
		||||
	of this file. */
 | 
			
		||||
	#if( mainSELECTED_APPLICATION == 0 )
 | 
			
		||||
	{
 | 
			
		||||
		main_blinky();
 | 
			
		||||
	}
 | 
			
		||||
	#elif( mainSELECTED_APPLICATION == 1 )
 | 
			
		||||
	{
 | 
			
		||||
		main_full();
 | 
			
		||||
	}
 | 
			
		||||
	#else
 | 
			
		||||
	{
 | 
			
		||||
		main_lwIP();
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Don't expect to reach here. */
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
static void prvSetupHardware( void )
 | 
			
		||||
{
 | 
			
		||||
BaseType_t xStatus;
 | 
			
		||||
XScuGic_Config *pxGICConfig;
 | 
			
		||||
 | 
			
		||||
	/* Ensure no interrupts execute while the scheduler is in an inconsistent
 | 
			
		||||
	state.  Interrupts are automatically enabled when the scheduler is
 | 
			
		||||
	started. */
 | 
			
		||||
	portDISABLE_INTERRUPTS();
 | 
			
		||||
 | 
			
		||||
	/* Obtain the configuration of the GIC. */
 | 
			
		||||
	pxGICConfig = XScuGic_LookupConfig( XPAR_SCUGIC_SINGLE_DEVICE_ID );
 | 
			
		||||
 | 
			
		||||
	/* Sanity check the FreeRTOSConfig.h settings are correct for the
 | 
			
		||||
	hardware. */
 | 
			
		||||
	configASSERT( pxGICConfig );
 | 
			
		||||
	configASSERT( pxGICConfig->CpuBaseAddress == ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) );
 | 
			
		||||
	configASSERT( pxGICConfig->DistBaseAddress == configINTERRUPT_CONTROLLER_BASE_ADDRESS );
 | 
			
		||||
 | 
			
		||||
	/* Install a default handler for each GIC interrupt. */
 | 
			
		||||
	xStatus = XScuGic_CfgInitialize( &xInterruptController, pxGICConfig, pxGICConfig->CpuBaseAddress );
 | 
			
		||||
	configASSERT( xStatus == XST_SUCCESS );
 | 
			
		||||
	( void ) xStatus; /* Remove compiler warning if configASSERT() is not defined. */
 | 
			
		||||
 | 
			
		||||
	/* Initialise the LED port. */
 | 
			
		||||
	vParTestInitialise();
 | 
			
		||||
 | 
			
		||||
	/* The Xilinx projects use a BSP that do not allow the start up code to be
 | 
			
		||||
	altered easily.  Therefore the vector table used by FreeRTOS is defined in
 | 
			
		||||
	FreeRTOS_asm_vectors.S, which is part of this project.  Switch to use the
 | 
			
		||||
	FreeRTOS vector table. */
 | 
			
		||||
	vPortInstallFreeRTOSVectorTable();
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vApplicationMallocFailedHook( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Called if a call to pvPortMalloc() fails because there is insufficient
 | 
			
		||||
	free memory available in the FreeRTOS heap.  pvPortMalloc() is called
 | 
			
		||||
	internally by FreeRTOS API functions that create tasks, queues, software
 | 
			
		||||
	timers, and semaphores.  The size of the FreeRTOS heap is set by the
 | 
			
		||||
	configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */
 | 
			
		||||
	taskDISABLE_INTERRUPTS();
 | 
			
		||||
	for( ;; );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
 | 
			
		||||
{
 | 
			
		||||
	( void ) pcTaskName;
 | 
			
		||||
	( void ) pxTask;
 | 
			
		||||
 | 
			
		||||
	/* Run time stack overflow checking is performed if
 | 
			
		||||
	configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook
 | 
			
		||||
	function is called if a stack overflow is detected. */
 | 
			
		||||
	taskDISABLE_INTERRUPTS();
 | 
			
		||||
	for( ;; );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vApplicationIdleHook( void )
 | 
			
		||||
{
 | 
			
		||||
volatile size_t xFreeHeapSpace;
 | 
			
		||||
 | 
			
		||||
	/* This is just a trivial example of an idle hook.  It is called on each
 | 
			
		||||
	cycle of the idle task.  It must *NOT* attempt to block.  In this case the
 | 
			
		||||
	idle task just queries the amount of FreeRTOS heap that remains.  See the
 | 
			
		||||
	memory management section on the http://www.FreeRTOS.org web site for memory
 | 
			
		||||
	management options.  If there is a lot of heap memory free then the
 | 
			
		||||
	configTOTAL_HEAP_SIZE value in FreeRTOSConfig.h can be reduced to free up
 | 
			
		||||
	RAM. */
 | 
			
		||||
	xFreeHeapSpace = xPortGetFreeHeapSize();
 | 
			
		||||
 | 
			
		||||
	/* Remove compiler warning about xFreeHeapSpace being set but never used. */
 | 
			
		||||
	( void ) xFreeHeapSpace;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vAssertCalled( const char * pcFile, unsigned long ulLine )
 | 
			
		||||
{
 | 
			
		||||
volatile unsigned long ul = 0;
 | 
			
		||||
 | 
			
		||||
	( void ) pcFile;
 | 
			
		||||
	( void ) ulLine;
 | 
			
		||||
 | 
			
		||||
	taskENTER_CRITICAL();
 | 
			
		||||
	{
 | 
			
		||||
		/* Set ul to a non-zero value using the debugger to step out of this
 | 
			
		||||
		function. */
 | 
			
		||||
		while( ul == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			portNOP();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	taskEXIT_CRITICAL();
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vApplicationTickHook( void )
 | 
			
		||||
{
 | 
			
		||||
	#if( mainSELECTED_APPLICATION == 1 )
 | 
			
		||||
	{
 | 
			
		||||
		/* The full demo includes a software timer demo/test that requires
 | 
			
		||||
		prodding periodically from the tick interrupt. */
 | 
			
		||||
		vTimerPeriodicISRTests();
 | 
			
		||||
 | 
			
		||||
		/* Call the periodic queue overwrite from ISR demo. */
 | 
			
		||||
		vQueueOverwritePeriodicISRDemo();
 | 
			
		||||
 | 
			
		||||
		/* Call the periodic event group from ISR demo. */
 | 
			
		||||
		vPeriodicEventGroupsProcessing();
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void *memcpy( void *pvDest, const void *pvSource, size_t ulBytes )
 | 
			
		||||
{
 | 
			
		||||
unsigned char *pcDest = ( unsigned char * ) pvDest, *pcSource = ( unsigned char * ) pvSource;
 | 
			
		||||
size_t x;
 | 
			
		||||
 | 
			
		||||
	for( x = 0; x < ulBytes; x++ )
 | 
			
		||||
	{
 | 
			
		||||
		*pcDest = *pcSource;
 | 
			
		||||
		pcDest++;
 | 
			
		||||
		pcSource++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pvDest;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void *memset( void *pvDest, int iValue, size_t ulBytes )
 | 
			
		||||
{
 | 
			
		||||
unsigned char *pcDest = ( unsigned char * ) pvDest;
 | 
			
		||||
size_t x;
 | 
			
		||||
 | 
			
		||||
	for( x = 0; x < ulBytes; x++ )
 | 
			
		||||
	{
 | 
			
		||||
		*pcDest = ( unsigned char ) iValue;
 | 
			
		||||
		pcDest++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pvDest;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
int memcmp( const void *pvMem1, const void *pvMem2, size_t ulBytes )
 | 
			
		||||
{
 | 
			
		||||
const unsigned char *pucMem1 = pvMem1, *pucMem2 = pvMem2;
 | 
			
		||||
size_t x;
 | 
			
		||||
 | 
			
		||||
    for( x = 0; x < ulBytes; x++ )
 | 
			
		||||
    {
 | 
			
		||||
        if( pucMem1[ x ] != pucMem2[ x ] )
 | 
			
		||||
        {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ulBytes - x;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
void vInitialiseTimerForRunTimeStats( void )
 | 
			
		||||
{
 | 
			
		||||
XScuWdt_Config *pxWatchDogInstance;
 | 
			
		||||
uint32_t ulValue;
 | 
			
		||||
const uint32_t ulMaxDivisor = 0xff, ulDivisorShift = 0x08;
 | 
			
		||||
 | 
			
		||||
	 pxWatchDogInstance = XScuWdt_LookupConfig( XPAR_SCUWDT_0_DEVICE_ID );
 | 
			
		||||
	 XScuWdt_CfgInitialize( &xWatchDogInstance, pxWatchDogInstance, pxWatchDogInstance->BaseAddr );
 | 
			
		||||
 | 
			
		||||
	 ulValue = XScuWdt_GetControlReg( &xWatchDogInstance );
 | 
			
		||||
	 ulValue |= ulMaxDivisor << ulDivisorShift;
 | 
			
		||||
	 XScuWdt_SetControlReg( &xWatchDogInstance, ulValue );
 | 
			
		||||
 | 
			
		||||
	 XScuWdt_LoadWdt( &xWatchDogInstance, UINT_MAX );
 | 
			
		||||
	 XScuWdt_SetTimerMode( &xWatchDogInstance );
 | 
			
		||||
	 XScuWdt_Start( &xWatchDogInstance );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										112
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/platform.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/platform.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,112 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-2012 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xil_cache.h"
 | 
			
		||||
 | 
			
		||||
#include "platform_config.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Uncomment the following line if ps7 init source files are added in the
 | 
			
		||||
 * source directory for compiling example outside of SDK.
 | 
			
		||||
 */
 | 
			
		||||
/*#include "ps7_init.h"*/
 | 
			
		||||
 | 
			
		||||
#ifdef STDOUT_IS_16550
 | 
			
		||||
 #include "xuartns550_l.h"
 | 
			
		||||
 | 
			
		||||
 #define UART_BAUD 9600
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
enable_caches()
 | 
			
		||||
{
 | 
			
		||||
#ifdef __PPC__
 | 
			
		||||
    Xil_ICacheEnableRegion(CACHEABLE_REGION_MASK);
 | 
			
		||||
    Xil_DCacheEnableRegion(CACHEABLE_REGION_MASK);
 | 
			
		||||
#elif __MICROBLAZE__
 | 
			
		||||
#ifdef XPAR_MICROBLAZE_USE_ICACHE
 | 
			
		||||
    Xil_ICacheEnable();
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef XPAR_MICROBLAZE_USE_DCACHE
 | 
			
		||||
    Xil_DCacheEnable();
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
disable_caches()
 | 
			
		||||
{
 | 
			
		||||
    Xil_DCacheDisable();
 | 
			
		||||
    Xil_ICacheDisable();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
init_uart()
 | 
			
		||||
{
 | 
			
		||||
#ifdef STDOUT_IS_16550
 | 
			
		||||
    XUartNs550_SetBaud(STDOUT_BASEADDR, XPAR_XUARTNS550_CLOCK_HZ, UART_BAUD);
 | 
			
		||||
    XUartNs550_SetLineControlReg(STDOUT_BASEADDR, XUN_LCR_8_DATA_BITS);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef STDOUT_IS_PS7_UART
 | 
			
		||||
    /* Bootrom/BSP configures PS7 UART to 115200 bps */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
init_platform()
 | 
			
		||||
{
 | 
			
		||||
    /*
 | 
			
		||||
     * If you want to run this example outside of SDK,
 | 
			
		||||
     * uncomment the following line and also #include "ps7_init.h" at the top.
 | 
			
		||||
     * Make sure that the ps7_init.c and ps7_init.h files are included
 | 
			
		||||
     * along with this example source files for compilation.
 | 
			
		||||
     */
 | 
			
		||||
    /* ps7_init();*/
 | 
			
		||||
    enable_caches();
 | 
			
		||||
    init_uart();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cleanup_platform()
 | 
			
		||||
{
 | 
			
		||||
    disable_caches();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/platform.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/platform.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2008 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx, Inc.
 | 
			
		||||
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __PLATFORM_H_
 | 
			
		||||
#define __PLATFORM_H_
 | 
			
		||||
 | 
			
		||||
#include "platform_config.h"
 | 
			
		||||
 | 
			
		||||
void init_platform();
 | 
			
		||||
void cleanup_platform();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
#ifndef __PLATFORM_CONFIG_H_
 | 
			
		||||
#define __PLATFORM_CONFIG_H_
 | 
			
		||||
 | 
			
		||||
#define STDOUT_IS_PS7_UART
 | 
			
		||||
#define UART_DEVICE_ID 0
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										285
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/printf-stdarg.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/printf-stdarg.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,285 @@
 | 
			
		|||
/*
 | 
			
		||||
	Copyright 2001, 2002 Georges Menie (www.menie.org)
 | 
			
		||||
	stdarg version contributed by Christian Ettinger
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU Lesser General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU Lesser General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
    along with this program; if not, write to the Free Software
 | 
			
		||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	putchar is the only external dependency for this file,
 | 
			
		||||
	if you have a working putchar, leave it commented out.
 | 
			
		||||
	If not, uncomment the define below and
 | 
			
		||||
	replace outbyte(c) by your own function call.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define putchar(c) c
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
static void printchar(char **str, int c)
 | 
			
		||||
{
 | 
			
		||||
	//extern int putchar(int c);
 | 
			
		||||
	
 | 
			
		||||
	if (str) {
 | 
			
		||||
		**str = (char)c;
 | 
			
		||||
		++(*str);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{ 
 | 
			
		||||
		(void)putchar(c);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define PAD_RIGHT 1
 | 
			
		||||
#define PAD_ZERO 2
 | 
			
		||||
 | 
			
		||||
static int prints(char **out, const char *string, int width, int pad)
 | 
			
		||||
{
 | 
			
		||||
	register int pc = 0, padchar = ' ';
 | 
			
		||||
 | 
			
		||||
	if (width > 0) {
 | 
			
		||||
		register int len = 0;
 | 
			
		||||
		register const char *ptr;
 | 
			
		||||
		for (ptr = string; *ptr; ++ptr) ++len;
 | 
			
		||||
		if (len >= width) width = 0;
 | 
			
		||||
		else width -= len;
 | 
			
		||||
		if (pad & PAD_ZERO) padchar = '0';
 | 
			
		||||
	}
 | 
			
		||||
	if (!(pad & PAD_RIGHT)) {
 | 
			
		||||
		for ( ; width > 0; --width) {
 | 
			
		||||
			printchar (out, padchar);
 | 
			
		||||
			++pc;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for ( ; *string ; ++string) {
 | 
			
		||||
		printchar (out, *string);
 | 
			
		||||
		++pc;
 | 
			
		||||
	}
 | 
			
		||||
	for ( ; width > 0; --width) {
 | 
			
		||||
		printchar (out, padchar);
 | 
			
		||||
		++pc;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* the following should be enough for 32 bit int */
 | 
			
		||||
#define PRINT_BUF_LEN 12
 | 
			
		||||
 | 
			
		||||
static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
 | 
			
		||||
{
 | 
			
		||||
	char print_buf[PRINT_BUF_LEN];
 | 
			
		||||
	register char *s;
 | 
			
		||||
	register int t, neg = 0, pc = 0;
 | 
			
		||||
	register unsigned int u = (unsigned int)i;
 | 
			
		||||
 | 
			
		||||
	if (i == 0) {
 | 
			
		||||
		print_buf[0] = '0';
 | 
			
		||||
		print_buf[1] = '\0';
 | 
			
		||||
		return prints (out, print_buf, width, pad);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (sg && b == 10 && i < 0) {
 | 
			
		||||
		neg = 1;
 | 
			
		||||
		u = (unsigned int)-i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s = print_buf + PRINT_BUF_LEN-1;
 | 
			
		||||
	*s = '\0';
 | 
			
		||||
 | 
			
		||||
	while (u) {
 | 
			
		||||
		t = (unsigned int)u % b;
 | 
			
		||||
		if( t >= 10 )
 | 
			
		||||
			t += letbase - '0' - 10;
 | 
			
		||||
		*--s = (char)(t + '0');
 | 
			
		||||
		u /= b;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (neg) {
 | 
			
		||||
		if( width && (pad & PAD_ZERO) ) {
 | 
			
		||||
			printchar (out, '-');
 | 
			
		||||
			++pc;
 | 
			
		||||
			--width;
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			*--s = '-';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pc + prints (out, s, width, pad);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int print( char **out, const char *format, va_list args )
 | 
			
		||||
{
 | 
			
		||||
	register int width, pad;
 | 
			
		||||
	register int pc = 0;
 | 
			
		||||
	char scr[2];
 | 
			
		||||
 | 
			
		||||
	for (; *format != 0; ++format) {
 | 
			
		||||
		if (*format == '%') {
 | 
			
		||||
			++format;
 | 
			
		||||
			width = pad = 0;
 | 
			
		||||
			if (*format == '\0') break;
 | 
			
		||||
			if (*format == '%') goto out;
 | 
			
		||||
			if (*format == '-') {
 | 
			
		||||
				++format;
 | 
			
		||||
				pad = PAD_RIGHT;
 | 
			
		||||
			}
 | 
			
		||||
			while (*format == '0') {
 | 
			
		||||
				++format;
 | 
			
		||||
				pad |= PAD_ZERO;
 | 
			
		||||
			}
 | 
			
		||||
			for ( ; *format >= '0' && *format <= '9'; ++format) {
 | 
			
		||||
				width *= 10;
 | 
			
		||||
				width += *format - '0';
 | 
			
		||||
			}
 | 
			
		||||
			if( *format == 's' ) {
 | 
			
		||||
				register char *s = (char *)va_arg( args, int );
 | 
			
		||||
				pc += prints (out, s?s:"(null)", width, pad);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if( *format == 'd' ) {
 | 
			
		||||
				pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if( *format == 'x' ) {
 | 
			
		||||
				pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if( *format == 'X' ) {
 | 
			
		||||
				pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if( *format == 'u' ) {
 | 
			
		||||
				pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			if( *format == 'c' ) {
 | 
			
		||||
				/* char are converted to int then pushed on the stack */
 | 
			
		||||
				scr[0] = (char)va_arg( args, int );
 | 
			
		||||
				scr[1] = '\0';
 | 
			
		||||
				pc += prints (out, scr, width, pad);
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
		out:
 | 
			
		||||
			printchar (out, *format);
 | 
			
		||||
			++pc;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (out) **out = '\0';
 | 
			
		||||
	va_end( args );
 | 
			
		||||
	return pc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int printf(const char *format, ...)
 | 
			
		||||
{
 | 
			
		||||
        va_list args;
 | 
			
		||||
        
 | 
			
		||||
        va_start( args, format );
 | 
			
		||||
        return print( 0, format, args );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int sprintf(char *out, const char *format, ...)
 | 
			
		||||
{
 | 
			
		||||
        va_list args;
 | 
			
		||||
        
 | 
			
		||||
        va_start( args, format );
 | 
			
		||||
        return print( &out, format, args );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int snprintf( char *buf, unsigned int count, const char *format, ... )
 | 
			
		||||
{
 | 
			
		||||
        va_list args;
 | 
			
		||||
        
 | 
			
		||||
        ( void ) count;
 | 
			
		||||
        
 | 
			
		||||
        va_start( args, format );
 | 
			
		||||
        return print( &buf, format, args );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_PRINTF
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
	char *ptr = "Hello world!";
 | 
			
		||||
	char *np = 0;
 | 
			
		||||
	int i = 5;
 | 
			
		||||
	unsigned int bs = sizeof(int)*8;
 | 
			
		||||
	int mi;
 | 
			
		||||
	char buf[80];
 | 
			
		||||
 | 
			
		||||
	mi = (1 << (bs-1)) + 1;
 | 
			
		||||
	printf("%s\n", ptr);
 | 
			
		||||
	printf("printf test\n");
 | 
			
		||||
	printf("%s is null pointer\n", np);
 | 
			
		||||
	printf("%d = 5\n", i);
 | 
			
		||||
	printf("%d = - max int\n", mi);
 | 
			
		||||
	printf("char %c = 'a'\n", 'a');
 | 
			
		||||
	printf("hex %x = ff\n", 0xff);
 | 
			
		||||
	printf("hex %02x = 00\n", 0);
 | 
			
		||||
	printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3);
 | 
			
		||||
	printf("%d %s(s)%", 0, "message");
 | 
			
		||||
	printf("\n");
 | 
			
		||||
	printf("%d %s(s) with %%\n", 0, "message");
 | 
			
		||||
	sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);
 | 
			
		||||
	sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * if you compile this file with
 | 
			
		||||
 *   gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c
 | 
			
		||||
 * you will get a normal warning:
 | 
			
		||||
 *   printf.c:214: warning: spurious trailing `%' in format
 | 
			
		||||
 * this line is testing an invalid % at the end of the format string.
 | 
			
		||||
 *
 | 
			
		||||
 * this should display (on 32bit int machine) :
 | 
			
		||||
 *
 | 
			
		||||
 * Hello world!
 | 
			
		||||
 * printf test
 | 
			
		||||
 * (null) is null pointer
 | 
			
		||||
 * 5 = 5
 | 
			
		||||
 * -2147483647 = - max int
 | 
			
		||||
 * char a = 'a'
 | 
			
		||||
 * hex ff = ff
 | 
			
		||||
 * hex 00 = 00
 | 
			
		||||
 * signed -3 = unsigned 4294967293 = hex fffffffd
 | 
			
		||||
 * 0 message(s)
 | 
			
		||||
 * 0 message(s) with %
 | 
			
		||||
 * justif: "left      "
 | 
			
		||||
 * justif: "     right"
 | 
			
		||||
 *  3: 0003 zero padded
 | 
			
		||||
 *  3: 3    left justif.
 | 
			
		||||
 *  3:    3 right justif.
 | 
			
		||||
 * -3: -003 zero padded
 | 
			
		||||
 * -3: -3   left justif.
 | 
			
		||||
 * -3:   -3 right justif.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/.cproject
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/.cproject
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
<?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="org.eclipse.cdt.core.default.config.1402949165">
 | 
			
		||||
			<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1402949165" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
 | 
			
		||||
				<externalSettings/>
 | 
			
		||||
				<extensions/>
 | 
			
		||||
			</storageModule>
 | 
			
		||||
			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
 | 
			
		||||
		</cconfiguration>
 | 
			
		||||
	</storageModule>
 | 
			
		||||
	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 | 
			
		||||
</cproject>
 | 
			
		||||
							
								
								
									
										76
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/.project
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/.project
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<projectDescription>
 | 
			
		||||
	<name>RTOSDemo_bsp</name>
 | 
			
		||||
	<comment>Created by SDK v2014.2</comment>
 | 
			
		||||
	<projects>
 | 
			
		||||
		<project>ZC702_hw_platform</project>
 | 
			
		||||
	</projects>
 | 
			
		||||
	<buildSpec>
 | 
			
		||||
		<buildCommand>
 | 
			
		||||
			<name>org.eclipse.cdt.make.core.makeBuilder</name>
 | 
			
		||||
			<arguments>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.core.errorOutputParser</key>
 | 
			
		||||
					<value>org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.VCErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.MakeErrorParser;</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.append_environment</key>
 | 
			
		||||
					<value>true</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.build.arguments</key>
 | 
			
		||||
					<value></value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.build.command</key>
 | 
			
		||||
					<value>make</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.build.target.auto</key>
 | 
			
		||||
					<value>all</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.build.target.clean</key>
 | 
			
		||||
					<value>clean</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.build.target.inc</key>
 | 
			
		||||
					<value>all</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
 | 
			
		||||
					<value>true</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
 | 
			
		||||
					<value>true</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
 | 
			
		||||
					<value>true</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
 | 
			
		||||
					<value>true</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.environment</key>
 | 
			
		||||
					<value></value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.stopOnError</key>
 | 
			
		||||
					<value>false</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
				<dictionary>
 | 
			
		||||
					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
 | 
			
		||||
					<value>true</value>
 | 
			
		||||
				</dictionary>
 | 
			
		||||
			</arguments>
 | 
			
		||||
		</buildCommand>
 | 
			
		||||
	</buildSpec>
 | 
			
		||||
	<natures>
 | 
			
		||||
		<nature>com.xilinx.sdk.sw.SwProjectNature</nature>
 | 
			
		||||
		<nature>org.eclipse.cdt.core.cnature</nature>
 | 
			
		||||
		<nature>org.eclipse.cdt.make.core.makeNature</nature>
 | 
			
		||||
	</natures>
 | 
			
		||||
</projectDescription>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
THIRPARTY=false
 | 
			
		||||
PROCESSOR=ps7_cortexa9_0
 | 
			
		||||
MSS_FILE=system.mss
 | 
			
		||||
							
								
								
									
										31
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo_bsp/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
# Makefile generated by Xilinx.
 | 
			
		||||
 | 
			
		||||
PROCESSOR = ps7_cortexa9_0
 | 
			
		||||
LIBRARIES = ${PROCESSOR}/lib/libxil.a
 | 
			
		||||
BSP_MAKEFILES := $(wildcard $(PROCESSOR)/libsrc/*/src/Makefile)
 | 
			
		||||
SUBDIRS := $(patsubst %/Makefile, %, $(BSP_MAKEFILES))
 | 
			
		||||
 | 
			
		||||
ifneq (,$(findstring win,$(RDI_PLATFORM)))
 | 
			
		||||
 SHELL = CMD
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
all: libs
 | 
			
		||||
	@echo 'Finished building libraries'
 | 
			
		||||
 | 
			
		||||
include: $(addsuffix /make.include,$(SUBDIRS))
 | 
			
		||||
 | 
			
		||||
libs: $(addsuffix /make.libs,$(SUBDIRS))
 | 
			
		||||
 | 
			
		||||
$(PROCESSOR)/lib/libxil.a: $(PROCESSOR)/lib/libxil_init.a
 | 
			
		||||
	cp -f $< $@
 | 
			
		||||
 | 
			
		||||
%/make.include: $(if $(wildcard $(PROCESSOR)/lib/libxil_init.a),$(PROCESSOR)/lib/libxil.a,)
 | 
			
		||||
	@echo "Running Make include in $(subst /make.include,,$@)"
 | 
			
		||||
	$(MAKE) -C $(subst /make.include,,$@) -s include  "SHELL=$(SHELL)" "COMPILER=arm-xilinx-eabi-gcc" "ARCHIVER=arm-xilinx-eabi-ar" "COMPILER_FLAGS=  -O2 -c" "EXTRA_COMPILER_FLAGS=-g"
 | 
			
		||||
 | 
			
		||||
%/make.libs: include
 | 
			
		||||
	@echo "Running Make libs in $(subst /make.libs,,$@)"
 | 
			
		||||
	$(MAKE) -C $(subst /make.libs,,$@) -s libs  "SHELL=$(SHELL)" "COMPILER=arm-xilinx-eabi-gcc" "ARCHIVER=arm-xilinx-eabi-ar" "COMPILER_FLAGS=  -O2 -c" "EXTRA_COMPILER_FLAGS=-g"
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -f ${PROCESSOR}/lib/libxil.a
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,292 @@
 | 
			
		|||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2004-11 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
// Xilinx, Inc.
 | 
			
		||||
//
 | 
			
		||||
// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
// COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
// ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
// AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
//
 | 
			
		||||
// $Id: _profile_timer_hw.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $
 | 
			
		||||
//
 | 
			
		||||
// _program_timer_hw.h:
 | 
			
		||||
//	Timer related functions
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#ifndef _PROFILE_TIMER_HW_H
 | 
			
		||||
#define _PROFILE_TIMER_HW_H
 | 
			
		||||
 | 
			
		||||
#include "profile.h"
 | 
			
		||||
 | 
			
		||||
#ifdef PROC_PPC
 | 
			
		||||
#if defined __GNUC__
 | 
			
		||||
#  define SYNCHRONIZE_IO __asm__ volatile ("eieio")
 | 
			
		||||
#elif defined __DCC__
 | 
			
		||||
#  define SYNCHRONIZE_IO __asm volatile(" eieio")
 | 
			
		||||
#else
 | 
			
		||||
#  define SYNCHRONIZE_IO
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef PROC_PPC
 | 
			
		||||
#define ProfIo_In32(InputPtr) (*(volatile u32 *)(InputPtr)); SYNCHRONIZE_IO;
 | 
			
		||||
#define ProfIo_Out32(OutputPtr, Value) { (*(volatile u32 *)(OutputPtr) = Value); SYNCHRONIZE_IO; }
 | 
			
		||||
#else
 | 
			
		||||
#define ProfIo_In32(InputPtr) (*(volatile u32 *)(InputPtr));
 | 
			
		||||
#define ProfIo_Out32(OutputPtr, Value) { (*(volatile u32 *)(OutputPtr) = Value); }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define ProfTmrCtr_mWriteReg(BaseAddress, TmrCtrNumber, RegOffset, ValueToWrite)\
 | 
			
		||||
	ProfIo_Out32(((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] +	\
 | 
			
		||||
			   (RegOffset)), (ValueToWrite))
 | 
			
		||||
 | 
			
		||||
#define ProfTimerCtr_mReadReg(BaseAddress, TmrCtrNumber, RegOffset)	\
 | 
			
		||||
	ProfIo_In32((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + (RegOffset))
 | 
			
		||||
 | 
			
		||||
#define ProfTmrCtr_mSetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\
 | 
			
		||||
	ProfTmrCtr_mWriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET,     \
 | 
			
		||||
					   (RegisterValue))
 | 
			
		||||
 | 
			
		||||
#define ProfTmrCtr_mGetControlStatusReg(BaseAddress, TmrCtrNumber)		\
 | 
			
		||||
	ProfTimerCtr_mReadReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef PROC_PPC
 | 
			
		||||
#include "xexception_l.h"
 | 
			
		||||
#include "xtime_l.h"
 | 
			
		||||
#include "xpseudo_asm.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TIMER_CONNECT_INTC
 | 
			
		||||
#include "xintc_l.h"
 | 
			
		||||
#include "xintc.h"
 | 
			
		||||
#endif	// TIMER_CONNECT_INTC
 | 
			
		||||
 | 
			
		||||
#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9)
 | 
			
		||||
#include "xtmrctr_l.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef PROC_CORTEXA9
 | 
			
		||||
#include "xscutimer_hw.h"
 | 
			
		||||
#include "xscugic.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern unsigned int timer_clk_ticks ;
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// PowerPC Target - Timer related functions
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#ifdef PROC_PPC
 | 
			
		||||
 | 
			
		||||
#ifdef PPC_PIT_INTERRUPT
 | 
			
		||||
unsigned long timer_lo_clk_ticks ;	// Clk ticks when Timer is disabled in CG
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef PROC_PPC440
 | 
			
		||||
#define XREG_TCR_PIT_INTERRUPT_ENABLE XREG_TCR_DEC_INTERRUPT_ENABLE
 | 
			
		||||
#define XREG_TSR_PIT_INTERRUPT_STATUS XREG_TSR_DEC_INTERRUPT_STATUS
 | 
			
		||||
#define XREG_SPR_PIT XREG_SPR_DEC
 | 
			
		||||
#define XEXC_ID_PIT_INT XEXC_ID_DEC_INT
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Disable the Timer - During Profiling
 | 
			
		||||
//
 | 
			
		||||
// For PIT Timer -
 | 
			
		||||
//	1. XTime_PITDisableInterrupt() ;
 | 
			
		||||
//	2. Store the remaining timer clk tick
 | 
			
		||||
//	3. Stop the PIT Timer
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#ifdef PPC_PIT_INTERRUPT
 | 
			
		||||
#define disable_timer() 		\
 | 
			
		||||
	{				\
 | 
			
		||||
		unsigned long val;	\
 | 
			
		||||
		val=mfspr(XREG_SPR_TCR);	\
 | 
			
		||||
		mtspr(XREG_SPR_TCR, val & ~XREG_TCR_PIT_INTERRUPT_ENABLE);	\
 | 
			
		||||
		timer_lo_clk_ticks = mfspr(XREG_SPR_PIT);			\
 | 
			
		||||
		mtspr(XREG_SPR_PIT, 0);	\
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
#define disable_timer() 	\
 | 
			
		||||
   { \
 | 
			
		||||
      u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \
 | 
			
		||||
      u32 tmp_v = ProfIo_In32(addr); \
 | 
			
		||||
      tmp_v = tmp_v & ~XTC_CSR_ENABLE_TMR_MASK; \
 | 
			
		||||
      ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \
 | 
			
		||||
   }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Enable the Timer
 | 
			
		||||
//
 | 
			
		||||
// For PIT Timer -
 | 
			
		||||
//	1. Load the remaining timer clk ticks
 | 
			
		||||
//	2. XTime_PITEnableInterrupt() ;
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#ifdef PPC_PIT_INTERRUPT
 | 
			
		||||
#define enable_timer()				\
 | 
			
		||||
	{					\
 | 
			
		||||
		unsigned long val;		\
 | 
			
		||||
		val=mfspr(XREG_SPR_TCR);	\
 | 
			
		||||
		mtspr(XREG_SPR_PIT, timer_lo_clk_ticks);	\
 | 
			
		||||
		mtspr(XREG_SPR_TCR, val | XREG_TCR_PIT_INTERRUPT_ENABLE); \
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
#define enable_timer()						\
 | 
			
		||||
	{							\
 | 
			
		||||
      u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \
 | 
			
		||||
      u32 tmp_v = ProfIo_In32(addr); \
 | 
			
		||||
      tmp_v = tmp_v |  XTC_CSR_ENABLE_TMR_MASK; \
 | 
			
		||||
      ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Send Ack to Timer Interrupt
 | 
			
		||||
//
 | 
			
		||||
// For PIT Timer -
 | 
			
		||||
// 	1. Load the timer clk ticks
 | 
			
		||||
//	2. Enable AutoReload and Interrupt
 | 
			
		||||
//	3. Clear PIT Timer Status bits
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#ifdef PPC_PIT_INTERRUPT
 | 
			
		||||
#define timer_ack()							\
 | 
			
		||||
	{								\
 | 
			
		||||
		unsigned long val;					\
 | 
			
		||||
		mtspr(XREG_SPR_PIT, timer_clk_ticks);			\
 | 
			
		||||
		mtspr(XREG_SPR_TSR, XREG_TSR_PIT_INTERRUPT_STATUS);	\
 | 
			
		||||
		val=mfspr(XREG_SPR_TCR);				\
 | 
			
		||||
		mtspr(XREG_SPR_TCR, val| XREG_TCR_PIT_INTERRUPT_ENABLE| XREG_TCR_AUTORELOAD_ENABLE); \
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
#define timer_ack()				\
 | 
			
		||||
	{						\
 | 
			
		||||
		unsigned int csr;			\
 | 
			
		||||
		csr = ProfTmrCtr_mGetControlStatusReg(PROFILE_TIMER_BASEADDR, 0);	\
 | 
			
		||||
		ProfTmrCtr_mSetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, csr);	\
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#endif	// PROC_PPC
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// MicroBlaze Target - Timer related functions
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#ifdef PROC_MICROBLAZE
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Disable the Timer during Call-Graph Data collection
 | 
			
		||||
//
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#define disable_timer()					\
 | 
			
		||||
	{						\
 | 
			
		||||
      u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \
 | 
			
		||||
      u32 tmp_v = ProfIo_In32(addr); \
 | 
			
		||||
      tmp_v = tmp_v & ~XTC_CSR_ENABLE_TMR_MASK; \
 | 
			
		||||
      ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Enable the Timer after Call-Graph Data collection
 | 
			
		||||
//
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#define enable_timer()					\
 | 
			
		||||
	{						\
 | 
			
		||||
      u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \
 | 
			
		||||
      u32 tmp_v = ProfIo_In32(addr); \
 | 
			
		||||
      tmp_v = tmp_v |  XTC_CSR_ENABLE_TMR_MASK; \
 | 
			
		||||
      ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Send Ack to Timer Interrupt
 | 
			
		||||
//
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#define timer_ack()				\
 | 
			
		||||
	{						\
 | 
			
		||||
		unsigned int csr;			\
 | 
			
		||||
		csr = ProfTmrCtr_mGetControlStatusReg(PROFILE_TIMER_BASEADDR, 0);	\
 | 
			
		||||
		ProfTmrCtr_mSetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, csr);	\
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#endif	// PROC_MICROBLAZE
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Cortex A9 Target - Timer related functions
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#ifdef PROC_CORTEXA9
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Disable the Timer during Call-Graph Data collection
 | 
			
		||||
//
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#define disable_timer()							\
 | 
			
		||||
{								\
 | 
			
		||||
	u32 Reg;							\
 | 
			
		||||
	Reg = Xil_In32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET); \
 | 
			
		||||
	Reg &= ~XSCUTIMER_CONTROL_ENABLE_MASK;\
 | 
			
		||||
	Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET, Reg);\
 | 
			
		||||
}								\
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Enable the Timer after Call-Graph Data collection
 | 
			
		||||
//
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#define enable_timer()							\
 | 
			
		||||
{								\
 | 
			
		||||
	u32 Reg;							\
 | 
			
		||||
	Reg = Xil_In32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET); \
 | 
			
		||||
	Reg |= XSCUTIMER_CONTROL_ENABLE_MASK; \
 | 
			
		||||
	Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET, Reg);\
 | 
			
		||||
}								\
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
// Send Ack to Timer Interrupt
 | 
			
		||||
//
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#define timer_ack()						\
 | 
			
		||||
{							\
 | 
			
		||||
	Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_ISR_OFFSET, \
 | 
			
		||||
		XSCUTIMER_ISR_EVENT_FLAG_MASK);\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
#endif	// PROC_CORTEXA9
 | 
			
		||||
//--------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
 | 
			
		||||
/*******************************************************************
 | 
			
		||||
*
 | 
			
		||||
* CAUTION: This file is automatically generated by HSM.
 | 
			
		||||
* Version: 
 | 
			
		||||
* DO NOT EDIT.
 | 
			
		||||
*
 | 
			
		||||
*  v (64-bit)
 | 
			
		||||
SW Build (by ) on 
 | 
			
		||||
Copyright 1986-2014 Xilinx, Inc. All Rights Reserved.
 | 
			
		||||
* 
 | 
			
		||||
* Description: Configurations for Standalone BSP
 | 
			
		||||
*
 | 
			
		||||
*******************************************************************/
 | 
			
		||||
 | 
			
		||||
#define MICROBLAZE_PVR_NONE
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2002-11 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
// Xilinx, Inc.
 | 
			
		||||
//
 | 
			
		||||
// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
// COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
// ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
// AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
//
 | 
			
		||||
// $Id: mblaze_nt_types.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#ifndef _MBLAZE_NT_TYPES_H
 | 
			
		||||
#define _MBLAZE_NT_TYPES_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef char            byte;
 | 
			
		||||
typedef short           half;
 | 
			
		||||
typedef int             word;
 | 
			
		||||
typedef unsigned char   ubyte;
 | 
			
		||||
typedef unsigned short  uhalf;
 | 
			
		||||
typedef unsigned int    uword;
 | 
			
		||||
typedef ubyte           boolean;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2002-11 Xilinx, Inc.  All rights reserved.
 | 
			
		||||
// Xilinx, Inc.
 | 
			
		||||
//
 | 
			
		||||
// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 | 
			
		||||
// COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 | 
			
		||||
// ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 | 
			
		||||
// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 | 
			
		||||
// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 | 
			
		||||
// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 | 
			
		||||
// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 | 
			
		||||
// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 | 
			
		||||
// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 | 
			
		||||
// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
// AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
			
		||||
//
 | 
			
		||||
// $Id: profile.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#ifndef	_PROFILE_H
 | 
			
		||||
#define	_PROFILE_H	1
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "profile_config.h"
 | 
			
		||||
 | 
			
		||||
#ifdef PROC_MICROBLAZE
 | 
			
		||||
#include "mblaze_nt_types.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void _system_init( void ) ;
 | 
			
		||||
void _system_clean( void ) ;
 | 
			
		||||
void mcount(unsigned long frompc, unsigned long selfpc);
 | 
			
		||||
void profile_intr_handler( void ) ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Profiling on hardware - Hash table maintained on hardware and data sent
 | 
			
		||||
 * to xmd for gmon.out generation.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * histogram counters are unsigned shorts (according to the kernel).
 | 
			
		||||
 */
 | 
			
		||||
#define	HISTCOUNTER	unsigned short
 | 
			
		||||
 | 
			
		||||
struct tostruct {
 | 
			
		||||
	unsigned long  selfpc;
 | 
			
		||||
	long	       count;
 | 
			
		||||
	short 	       link;
 | 
			
		||||
	unsigned short pad;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct fromstruct {
 | 
			
		||||
	unsigned long frompc ;
 | 
			
		||||
	short link ;
 | 
			
		||||
	unsigned short pad ;
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * general rounding functions.
 | 
			
		||||
 */
 | 
			
		||||
#define ROUNDDOWN(x,y)	(((x)/(y))*(y))
 | 
			
		||||
#define ROUNDUP(x,y)	((((x)+(y)-1)/(y))*(y))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The profiling data structures are housed in this structure.
 | 
			
		||||
 */
 | 
			
		||||
struct gmonparam {
 | 
			
		||||
	long int		state;
 | 
			
		||||
 | 
			
		||||
	// Histogram Information
 | 
			
		||||
	unsigned short		*kcount;	/* No. of bins in histogram */
 | 
			
		||||
	unsigned long		kcountsize;	/* Histogram samples */
 | 
			
		||||
 | 
			
		||||
	// Call-graph Information
 | 
			
		||||
	struct fromstruct	*froms;
 | 
			
		||||
	unsigned long		fromssize;
 | 
			
		||||
	struct tostruct		*tos;
 | 
			
		||||
	unsigned long		tossize;
 | 
			
		||||
 | 
			
		||||
	// Initialization I/Ps
 | 
			
		||||
	unsigned long    	lowpc;
 | 
			
		||||
	unsigned long		highpc;
 | 
			
		||||
	unsigned long		textsize;
 | 
			
		||||
	//unsigned long 		cg_froms;
 | 
			
		||||
	//unsigned long 		cg_tos;
 | 
			
		||||
};
 | 
			
		||||
extern struct gmonparam *_gmonparam;
 | 
			
		||||
extern int n_gmon_sections;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Possible states of profiling.
 | 
			
		||||
 */
 | 
			
		||||
#define	GMON_PROF_ON	0
 | 
			
		||||
#define	GMON_PROF_BUSY	1
 | 
			
		||||
#define	GMON_PROF_ERROR	2
 | 
			
		||||
#define	GMON_PROF_OFF	3
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Sysctl definitions for extracting profiling information from the kernel.
 | 
			
		||||
 */
 | 
			
		||||
#define	GPROF_STATE	0	/* int: profiling enabling variable */
 | 
			
		||||
#define	GPROF_COUNT	1	/* struct: profile tick count buffer */
 | 
			
		||||
#define	GPROF_FROMS	2	/* struct: from location hash bucket */
 | 
			
		||||
#define	GPROF_TOS	3	/* struct: destination/count structure */
 | 
			
		||||
#define	GPROF_GMONPARAM	4	/* struct: profiling parameters (see above) */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif 		/* _PROFILE_H */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2009-13  Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef SLEEP_H
 | 
			
		||||
#define SLEEP_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void nanosleep(unsigned int nanoseconds);
 | 
			
		||||
int usleep(unsigned int useconds);
 | 
			
		||||
int sleep(unsigned int seconds);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,124 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-13  Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* @file smc.h
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- ---------------------------------------------------
 | 
			
		||||
* 1.00a sdm  11/03/09 Initial release.
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
* @note		None.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef SMC_H /* prevent circular inclusions */
 | 
			
		||||
#define SMC_H /* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/* Memory controller configuration register offset */
 | 
			
		||||
#define XSMCPSS_MC_STATUS		0x000	/* Controller status reg, RO */
 | 
			
		||||
#define XSMCPSS_MC_INTERFACE_CONFIG	0x004	/* Interface config reg, RO */
 | 
			
		||||
#define XSMCPSS_MC_SET_CONFIG		0x008	/* Set configuration reg, WO */
 | 
			
		||||
#define XSMCPSS_MC_CLR_CONFIG		0x00C	/* Clear config reg, WO */
 | 
			
		||||
#define XSMCPSS_MC_DIRECT_CMD		0x010	/* Direct command reg, WO */
 | 
			
		||||
#define XSMCPSS_MC_SET_CYCLES		0x014	/* Set cycles register, WO */
 | 
			
		||||
#define XSMCPSS_MC_SET_OPMODE		0x018	/* Set opmode register, WO */
 | 
			
		||||
#define XSMCPSS_MC_REFRESH_PERIOD_0	0x020	/* Refresh period_0 reg, RW */
 | 
			
		||||
#define XSMCPSS_MC_REFRESH_PERIOD_1	0x024	/* Refresh period_1 reg, RW */
 | 
			
		||||
 | 
			
		||||
/* Chip select configuration register offset */
 | 
			
		||||
#define XSMCPSS_CS_IF0_CHIP_0_OFFSET	0x100	/* Interface 0 chip 0 config */
 | 
			
		||||
#define XSMCPSS_CS_IF0_CHIP_1_OFFSET	0x120	/* Interface 0 chip 1 config */
 | 
			
		||||
#define XSMCPSS_CS_IF0_CHIP_2_OFFSET	0x140	/* Interface 0 chip 2 config */
 | 
			
		||||
#define XSMCPSS_CS_IF0_CHIP_3_OFFSET	0x160	/* Interface 0 chip 3 config */
 | 
			
		||||
#define XSMCPSS_CS_IF1_CHIP_0_OFFSET	0x180	/* Interface 1 chip 0 config */
 | 
			
		||||
#define XSMCPSS_CS_IF1_CHIP_1_OFFSET	0x1A0	/* Interface 1 chip 1 config */
 | 
			
		||||
#define XSMCPSS_CS_IF1_CHIP_2_OFFSET	0x1C0	/* Interface 1 chip 2 config */
 | 
			
		||||
#define XSMCPSS_CS_IF1_CHIP_3_OFFSET	0x1E0	/* Interface 1 chip 3 config */
 | 
			
		||||
 | 
			
		||||
/* User configuration register offset */
 | 
			
		||||
#define XSMCPSS_UC_STATUS_OFFSET	0x200	/* User status reg, RO */
 | 
			
		||||
#define XSMCPSS_UC_CONFIG_OFFSET	0x204	/* User config reg, WO */
 | 
			
		||||
 | 
			
		||||
/* Integration test register offset */
 | 
			
		||||
#define XSMCPSS_IT_OFFSET		0xE00
 | 
			
		||||
 | 
			
		||||
/* ID configuration register offset */
 | 
			
		||||
#define XSMCPSS_ID_PERIP_0_OFFSET	0xFE0
 | 
			
		||||
#define XSMCPSS_ID_PERIP_1_OFFSET	0xFE4
 | 
			
		||||
#define XSMCPSS_ID_PERIP_2_OFFSET	0xFE8
 | 
			
		||||
#define XSMCPSS_ID_PERIP_3_OFFSET	0xFEC
 | 
			
		||||
#define XSMCPSS_ID_PCELL_0_OFFSET	0xFF0
 | 
			
		||||
#define XSMCPSS_ID_PCELL_1_OFFSET	0xFF4
 | 
			
		||||
#define XSMCPSS_ID_PCELL_2_OFFSET	0xFF8
 | 
			
		||||
#define XSMCPSS_ID_PCELL_3_OFFSET	0xFFC
 | 
			
		||||
 | 
			
		||||
/************************** Variable Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
void XSmc_SramInit (void);
 | 
			
		||||
void XSmc_NorInit(void);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif /* __cplusplus */
 | 
			
		||||
 | 
			
		||||
#endif /* SMC_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,90 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2009-13  Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* @file vectors.h
 | 
			
		||||
*
 | 
			
		||||
* This file contains the C level vector prototypes for the ARM Cortex A9 core.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- ---------------------------------------------------
 | 
			
		||||
* 1.00a ecm  10/20/10 Initial version, moved over from bsp area
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
*
 | 
			
		||||
* None.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef _VECTORS_H_
 | 
			
		||||
#define _VECTORS_H_
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
void FIQInterrupt(void);
 | 
			
		||||
void IRQInterrupt(void);
 | 
			
		||||
void SWInterrupt(void);
 | 
			
		||||
void DataAbortInterrupt(void);
 | 
			
		||||
void PrefetchAbortInterrupt(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,568 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xadcps.h
 | 
			
		||||
*
 | 
			
		||||
* The XAdcPs driver supports the Xilinx XADC/ADC device.
 | 
			
		||||
*
 | 
			
		||||
* The XADC/ADC device has the following features:
 | 
			
		||||
*	- 10-bit, 200-KSPS (kilo samples per second)
 | 
			
		||||
*		Analog-to-Digital Converter (ADC)
 | 
			
		||||
*	- Monitoring of on-chip supply voltages and temperature
 | 
			
		||||
*	- 1 dedicated differential analog-input pair and
 | 
			
		||||
*	  16 auxiliary differential analog-input pairs
 | 
			
		||||
*	- Automatic alarms based on user defined limits for the on-chip
 | 
			
		||||
*	  supply voltages and temperature
 | 
			
		||||
*	- Automatic Channel Sequencer, programmable averaging, programmable
 | 
			
		||||
*	  acquisition time for the external inputs, unipolar or differential
 | 
			
		||||
*	  input selection for the external inputs
 | 
			
		||||
*	- Inbuilt Calibration
 | 
			
		||||
*	- Optional interrupt request generation
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* The user should refer to the hardware device specification for detailed
 | 
			
		||||
* information about the device.
 | 
			
		||||
*
 | 
			
		||||
* This header file contains the prototypes of driver functions that can
 | 
			
		||||
* be used to access the XADC/ADC device.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b> XADC Channel Sequencer Modes </b>
 | 
			
		||||
*
 | 
			
		||||
* The  XADC Channel Sequencer supports the following operating modes:
 | 
			
		||||
*
 | 
			
		||||
*   - <b> Default </b>: This is the default mode after power up.
 | 
			
		||||
*		In this mode of operation the XADC operates in
 | 
			
		||||
*		a sequence mode, monitoring the on chip sensors:
 | 
			
		||||
*		Temperature, VCCINT, and VCCAUX.
 | 
			
		||||
*   - <b> One pass through sequence </b>: In this mode the XADC
 | 
			
		||||
*		converts the channels enabled in the Sequencer Channel Enable
 | 
			
		||||
*		registers for a single pass and then stops.
 | 
			
		||||
*   - <b> Continuous cycling of sequence </b>: In this mode the XADC
 | 
			
		||||
*		converts the channels enabled in the Sequencer Channel Enable
 | 
			
		||||
*		registers continuously.
 | 
			
		||||
*   - <b> Single channel mode</b>: In this mode the XADC Channel
 | 
			
		||||
*		Sequencer is disabled and the XADC operates in a
 | 
			
		||||
*		Single Channel Mode.
 | 
			
		||||
*		The XADC can operate either in a Continuous or Event
 | 
			
		||||
*		driven sampling mode in the single channel mode.
 | 
			
		||||
*   - <b> Simultaneous Sampling Mode</b>: In this mode the XADC Channel
 | 
			
		||||
*		Sequencer will automatically sequence through eight fixed pairs
 | 
			
		||||
*		of auxiliary analog input channels for simulataneous conversion.
 | 
			
		||||
*   - <b> Independent ADC mode</b>: In this mode the first ADC (A) is used to
 | 
			
		||||
*		is used to implement a fixed monitoring mode similar to the
 | 
			
		||||
*		default mode but the alarm fucntions ar eenabled.
 | 
			
		||||
*		The second ADC (B) is available to be used with external analog
 | 
			
		||||
*		input channels only.
 | 
			
		||||
*
 | 
			
		||||
* Read the XADC spec for more information about the sequencer modes.
 | 
			
		||||
*
 | 
			
		||||
* <b> Initialization and Configuration </b>
 | 
			
		||||
*
 | 
			
		||||
* The device driver enables higher layer software (e.g., an application) to
 | 
			
		||||
* communicate to the XADC/ADC device.
 | 
			
		||||
*
 | 
			
		||||
* XAdcPs_CfgInitialize() API is used to initialize the XADC/ADC
 | 
			
		||||
* device. The user needs to first call the XAdcPs_LookupConfig() API which
 | 
			
		||||
* returns the Configuration structure pointer which is passed as a parameter to
 | 
			
		||||
* the XAdcPs_CfgInitialize() API.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b>Interrupts</b>
 | 
			
		||||
*
 | 
			
		||||
* The XADC/ADC device supports interrupt driven mode and the default
 | 
			
		||||
* operation mode is polling mode.
 | 
			
		||||
*
 | 
			
		||||
* The interrupt mode is available only if hardware is configured to support
 | 
			
		||||
* interrupts.
 | 
			
		||||
*
 | 
			
		||||
* This driver does not provide a Interrupt Service Routine (ISR) for the device.
 | 
			
		||||
* It is the responsibility of the application to provide one if needed. Refer to
 | 
			
		||||
* the interrupt example provided with this driver for details on using the
 | 
			
		||||
* device in interrupt mode.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b> Virtual Memory </b>
 | 
			
		||||
*
 | 
			
		||||
* This driver supports Virtual Memory. The RTOS is responsible for calculating
 | 
			
		||||
* the correct device base address in Virtual Memory space.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b> Threads </b>
 | 
			
		||||
*
 | 
			
		||||
* This driver is not thread safe. Any needs for threads or thread mutual
 | 
			
		||||
* exclusion must be satisfied by the layer above this driver.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b> Asserts </b>
 | 
			
		||||
*
 | 
			
		||||
* Asserts are used within all Xilinx drivers to enforce constraints on argument
 | 
			
		||||
* values. Asserts can be turned off on a system-wide basis by defining, at
 | 
			
		||||
* compile time, the NDEBUG identifier. By default, asserts are turned on and it
 | 
			
		||||
* is recommended that users leave asserts on during development.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b> Building the driver </b>
 | 
			
		||||
*
 | 
			
		||||
* The XAdcPs driver is composed of several source files. This allows the user
 | 
			
		||||
* to build and link only those parts of the driver that are necessary.
 | 
			
		||||
*
 | 
			
		||||
* <b> Limitations of the driver </b>
 | 
			
		||||
*
 | 
			
		||||
* XADC/ADC device can be accessed through the JTAG port and the PLB
 | 
			
		||||
* interface. The driver implementation does not support the simultaneous access
 | 
			
		||||
* of the device by both these interfaces. The user has to care of this situation
 | 
			
		||||
* in the user application code.
 | 
			
		||||
*
 | 
			
		||||
* <br><br>
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
*
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who    Date     Changes
 | 
			
		||||
* ----- -----  -------- -----------------------------------------------------
 | 
			
		||||
* 1.00a ssb    12/22/11 First release based on the XPS/AXI xadc driver
 | 
			
		||||
* 1.01a bss    02/18/13	Modified XAdcPs_SetSeqChEnables,XAdcPs_SetSeqAvgEnables
 | 
			
		||||
*			XAdcPs_SetSeqInputMode and XAdcPs_SetSeqAcqTime APIs
 | 
			
		||||
*			in xadcps.c to fix CR #693371
 | 
			
		||||
* 1.03a bss    11/01/13 Modified xadcps_hw.h to use correct Register offsets
 | 
			
		||||
*			CR#749687
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#ifndef XADCPS_H /* Prevent circular inclusions */
 | 
			
		||||
#define XADCPS_H /* by using protection macros  */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files ********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xadcps_hw.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions ****************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Indexes for the different channels.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CH_TEMP		0x0  /**< On Chip Temperature */
 | 
			
		||||
#define XADCPS_CH_VCCINT	0x1  /**< VCCINT */
 | 
			
		||||
#define XADCPS_CH_VCCAUX	0x2  /**< VCCAUX */
 | 
			
		||||
#define XADCPS_CH_VPVN		0x3  /**< VP/VN Dedicated analog inputs */
 | 
			
		||||
#define XADCPS_CH_VREFP		0x4  /**< VREFP */
 | 
			
		||||
#define XADCPS_CH_VREFN		0x5  /**< VREFN */
 | 
			
		||||
#define XADCPS_CH_VBRAM		0x6  /**< On-chip VBRAM Data Reg, 7 series */
 | 
			
		||||
#define XADCPS_CH_SUPPLY_CALIB	0x07 /**< Supply Calib Data Reg */
 | 
			
		||||
#define XADCPS_CH_ADC_CALIB	0x08 /**< ADC Offset Channel Reg */
 | 
			
		||||
#define XADCPS_CH_GAINERR_CALIB 0x09 /**< Gain Error Channel Reg  */
 | 
			
		||||
#define XADCPS_CH_VCCPINT	0x0D /**< On-chip PS VCCPINT Channel , Zynq */
 | 
			
		||||
#define XADCPS_CH_VCCPAUX	0x0E /**< On-chip PS VCCPAUX Channel , Zynq */
 | 
			
		||||
#define XADCPS_CH_VCCPDRO	0x0F /**< On-chip PS VCCPDRO Channel , Zynq */
 | 
			
		||||
#define XADCPS_CH_AUX_MIN	 16 /**< Channel number for 1st Aux Channel */
 | 
			
		||||
#define XADCPS_CH_AUX_MAX	 31 /**< Channel number for Last Aux channel */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Indexes for reading the Calibration Coefficient Data.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CALIB_SUPPLY_COEFF     0 /**< Supply Offset Calib Coefficient */
 | 
			
		||||
#define XADCPS_CALIB_ADC_COEFF        1 /**< ADC Offset Calib Coefficient */
 | 
			
		||||
#define XADCPS_CALIB_GAIN_ERROR_COEFF 2 /**< Gain Error Calib Coefficient*/
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Indexes for reading the Minimum/Maximum Measurement Data.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_MAX_TEMP		0 /**< Maximum Temperature Data */
 | 
			
		||||
#define XADCPS_MAX_VCCINT	1 /**< Maximum VCCINT Data */
 | 
			
		||||
#define XADCPS_MAX_VCCAUX	2 /**< Maximum VCCAUX Data */
 | 
			
		||||
#define XADCPS_MAX_VBRAM	3 /**< Maximum VBRAM Data */
 | 
			
		||||
#define XADCPS_MIN_TEMP		4 /**< Minimum Temperature Data */
 | 
			
		||||
#define XADCPS_MIN_VCCINT	5 /**< Minimum VCCINT Data */
 | 
			
		||||
#define XADCPS_MIN_VCCAUX	6 /**< Minimum VCCAUX Data */
 | 
			
		||||
#define XADCPS_MIN_VBRAM	7 /**< Minimum VBRAM Data */
 | 
			
		||||
#define XADCPS_MAX_VCCPINT	8 /**< Maximum VCCPINT Register , Zynq */
 | 
			
		||||
#define XADCPS_MAX_VCCPAUX	9 /**< Maximum VCCPAUX Register , Zynq */
 | 
			
		||||
#define XADCPS_MAX_VCCPDRO	0xA /**< Maximum VCCPDRO Register , Zynq */
 | 
			
		||||
#define XADCPS_MIN_VCCPINT	0xC /**< Minimum VCCPINT Register , Zynq */
 | 
			
		||||
#define XADCPS_MIN_VCCPAUX	0xD /**< Minimum VCCPAUX Register , Zynq */
 | 
			
		||||
#define XADCPS_MIN_VCCPDRO	0xE /**< Minimum VCCPDRO Register , Zynq */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Alarm Threshold(Limit) Register (ATR) indexes.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_ATR_TEMP_UPPER	 0 /**< High user Temperature */
 | 
			
		||||
#define XADCPS_ATR_VCCINT_UPPER  1 /**< VCCINT high voltage limit register */
 | 
			
		||||
#define XADCPS_ATR_VCCAUX_UPPER  2 /**< VCCAUX high voltage limit register */
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER	 3 /**< VCCAUX high voltage limit register */
 | 
			
		||||
#define XADCPS_ATR_TEMP_LOWER	 4 /**< Upper Over Temperature limit Reg */
 | 
			
		||||
#define XADCPS_ATR_VCCINT_LOWER	 5 /**< VCCINT high voltage limit register */
 | 
			
		||||
#define XADCPS_ATR_VCCAUX_LOWER	 6 /**< VCCAUX low voltage limit register  */
 | 
			
		||||
#define XADCPS_ATR_OT_LOWER	 7 /**< Lower Over Temperature limit */
 | 
			
		||||
#define XADCPS_ATR_VBRAM_UPPER_  8 /**< VRBAM Upper Alarm Reg, 7 Series */
 | 
			
		||||
#define XADCPS_ATR_VCCPINT_UPPER 9 /**< VCCPINT Upper Alarm Reg, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPAUX_UPPER 0xA /**< VCCPAUX Upper Alarm Reg, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPDRO_UPPER 0xB /**< VCCPDRO Upper Alarm Reg, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VBRAM_LOWER	 0xC /**< VRBAM Lower Alarm Reg, 7 Series */
 | 
			
		||||
#define XADCPS_ATR_VCCPINT_LOWER 0xD /**< VCCPINT Lower Alarm Reg , Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPAUX_LOWER 0xE /**< VCCPAUX Lower Alarm Reg , Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPDRO_LOWER 0xF /**< VCCPDRO Lower Alarm Reg , Zynq */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Averaging to be done for the channels.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_AVG_0_SAMPLES	0  /**< No Averaging */
 | 
			
		||||
#define XADCPS_AVG_16_SAMPLES	1  /**< Average 16 samples */
 | 
			
		||||
#define XADCPS_AVG_64_SAMPLES	2  /**< Average 64 samples */
 | 
			
		||||
#define XADCPS_AVG_256_SAMPLES	3  /**< Average 256 samples */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Channel Sequencer Modes of operation
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_SEQ_MODE_SAFE		0  /**< Default Safe Mode */
 | 
			
		||||
#define XADCPS_SEQ_MODE_ONEPASS		1  /**< Onepass through Sequencer */
 | 
			
		||||
#define XADCPS_SEQ_MODE_CONTINPASS	2  /**< Continuous Cycling Sequencer */
 | 
			
		||||
#define XADCPS_SEQ_MODE_SINGCHAN	3  /**< Single channel -No Sequencing */
 | 
			
		||||
#define XADCPS_SEQ_MODE_SIMUL_SAMPLING	4  /**< Simultaneous sampling */
 | 
			
		||||
#define XADCPS_SEQ_MODE_INDEPENDENT	8  /**< Independent mode */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Power Down Modes
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_PD_MODE_NONE		0  /**< No Power Down  */
 | 
			
		||||
#define XADCPS_PD_MODE_ADCB		1  /**< Power Down ADC B */
 | 
			
		||||
#define XADCPS_PD_MODE_XADC		2  /**< Power Down ADC A and ADC B */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions ******************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for the XADC/ADC
 | 
			
		||||
 * device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16  DeviceId;		/**< Unique ID of device */
 | 
			
		||||
	u32  BaseAddress;	/**< Device base address */
 | 
			
		||||
} XAdcPs_Config;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The driver's instance data. The user is required to allocate a variable
 | 
			
		||||
 * of this type for every XADC/ADC device in the system. A pointer to
 | 
			
		||||
 * a variable of this type is then passed to the driver API functions.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XAdcPs_Config Config;	/**< XAdcPs_Config of current device */
 | 
			
		||||
	u32  IsReady;		/**< Device is initialized and ready  */
 | 
			
		||||
 | 
			
		||||
} XAdcPs;
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions ********************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the XADC device is in Event Sampling mode.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XAdcPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if the device is in Event Sampling Mode.
 | 
			
		||||
*		- FALSE if the device is in Continuous Sampling Mode.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XAdcPs_IsEventSamplingMode(XAdcPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_IsEventSamplingModeSet(InstancePtr)			\
 | 
			
		||||
	(((XAdcPs_ReadInternalReg(InstancePtr,	 			\
 | 
			
		||||
			XADCPS_CFR0_OFFSET) & XADCPS_CFR0_EC_MASK) ?	\
 | 
			
		||||
			TRUE : FALSE))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the XADC device is in External Mux mode.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XAdcPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if the device is in External Mux Mode.
 | 
			
		||||
*		- FALSE if the device is NOT in External Mux Mode.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XAdcPs_IsExternalMuxMode(XAdcPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_IsExternalMuxModeSet(InstancePtr)			\
 | 
			
		||||
	(((XAdcPs_ReadInternalReg(InstancePtr,	 			\
 | 
			
		||||
			XADCPS_CFR0_OFFSET) & XADCPS_CFR0_MUX_MASK) ?	\
 | 
			
		||||
			TRUE : FALSE))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro converts XADC Raw Data to Temperature(centigrades).
 | 
			
		||||
*
 | 
			
		||||
* @param	AdcData is the Raw ADC Data from XADC.
 | 
			
		||||
*
 | 
			
		||||
* @return 	The Temperature in centigrades.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		float XAdcPs_RawToTemperature(u32 AdcData);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_RawToTemperature(AdcData)				\
 | 
			
		||||
	((((float)(AdcData)/65536.0f)/0.00198421639f ) - 273.15f)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro converts XADC/ADC Raw Data to Voltage(volts).
 | 
			
		||||
*
 | 
			
		||||
* @param	AdcData is the XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @return 	The Voltage in volts.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		float XAdcPs_RawToVoltage(u32 AdcData);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_RawToVoltage(AdcData) 					\
 | 
			
		||||
	((((float)(AdcData))* (3.0f))/65536.0f)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro converts Temperature in centigrades to XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @param	Temperature is the Temperature in centigrades to be
 | 
			
		||||
*		converted to XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @return 	The XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XAdcPs_TemperatureToRaw(float Temperature);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_TemperatureToRaw(Temperature)				\
 | 
			
		||||
	((int)(((Temperature) + 273.15f)*65536.0f*0.00198421639f))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro converts Voltage in Volts to XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @param	Voltage is the Voltage in volts to be converted to
 | 
			
		||||
*		XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @return 	The XADC/ADC Raw Data.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XAdcPs_VoltageToRaw(float Voltage);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_VoltageToRaw(Voltage)			 		\
 | 
			
		||||
	((int)((Voltage)*65536.0f/3.0f))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro is used for writing to the XADC Registers using the
 | 
			
		||||
* command FIFO.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XAdcPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		void XAdcPs_WriteFifo(XAdcPs *InstancePtr, u32 Data);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_WriteFifo(InstancePtr, Data)				\
 | 
			
		||||
	XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress,		\
 | 
			
		||||
			  XADCPS_CMDFIFO_OFFSET, Data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro is used for reading from the XADC Registers using the
 | 
			
		||||
* data FIFO.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XAdcPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return	Data read from the FIFO
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		u32 XAdcPs_ReadFifo(XAdcPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XAdcPs_ReadFifo(InstancePtr)				\
 | 
			
		||||
	XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress,	\
 | 
			
		||||
			  XADCPS_RDFIFO_OFFSET);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes *****************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Functions in xadcps_sinit.c
 | 
			
		||||
 */
 | 
			
		||||
XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Functions in xadcps.c
 | 
			
		||||
 */
 | 
			
		||||
int XAdcPs_CfgInitialize(XAdcPs *InstancePtr,
 | 
			
		||||
				XAdcPs_Config *ConfigPtr,
 | 
			
		||||
				u32 EffectiveAddr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
u32 XAdcPs_GetStatus(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
u32 XAdcPs_GetAlarmOutputStatus(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_StartAdcConversion(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_Reset(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
u16 XAdcPs_GetAdcData(XAdcPs *InstancePtr, u8 Channel);
 | 
			
		||||
 | 
			
		||||
u16 XAdcPs_GetCalibCoefficient(XAdcPs *InstancePtr, u8 CoeffType);
 | 
			
		||||
 | 
			
		||||
u16 XAdcPs_GetMinMaxMeasurement(XAdcPs *InstancePtr, u8 MeasurementType);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_SetAvg(XAdcPs *InstancePtr, u8 Average);
 | 
			
		||||
u8 XAdcPs_GetAvg(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XAdcPs_SetSingleChParams(XAdcPs *InstancePtr,
 | 
			
		||||
				u8 Channel,
 | 
			
		||||
				int IncreaseAcqCycles,
 | 
			
		||||
				int IsEventMode,
 | 
			
		||||
				int IsDifferentialMode);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void XAdcPs_SetAlarmEnables(XAdcPs *InstancePtr, u16 AlmEnableMask);
 | 
			
		||||
u16 XAdcPs_GetAlarmEnables(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_SetCalibEnables(XAdcPs *InstancePtr, u16 Calibration);
 | 
			
		||||
u16 XAdcPs_GetCalibEnables(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_SetSequencerMode(XAdcPs *InstancePtr, u8 SequencerMode);
 | 
			
		||||
u8 XAdcPs_GetSequencerMode(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_SetAdcClkDivisor(XAdcPs *InstancePtr, u8 Divisor);
 | 
			
		||||
u8 XAdcPs_GetAdcClkDivisor(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XAdcPs_SetSeqChEnables(XAdcPs *InstancePtr, u32 ChEnableMask);
 | 
			
		||||
u32 XAdcPs_GetSeqChEnables(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XAdcPs_SetSeqAvgEnables(XAdcPs *InstancePtr, u32 AvgEnableChMask);
 | 
			
		||||
u32 XAdcPs_GetSeqAvgEnables(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XAdcPs_SetSeqInputMode(XAdcPs *InstancePtr, u32 InputModeChMask);
 | 
			
		||||
u32 XAdcPs_GetSeqInputMode(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XAdcPs_SetSeqAcqTime(XAdcPs *InstancePtr, u32 AcqCyclesChMask);
 | 
			
		||||
u32 XAdcPs_GetSeqAcqTime(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_SetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg, u16 Value);
 | 
			
		||||
u16 XAdcPs_GetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg);
 | 
			
		||||
 | 
			
		||||
void XAdcPs_EnableUserOverTemp(XAdcPs *InstancePtr);
 | 
			
		||||
void XAdcPs_DisableUserOverTemp(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Functions in xadcps_selftest.c
 | 
			
		||||
 */
 | 
			
		||||
int XAdcPs_SelfTest(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Functions in xadcps_intr.c
 | 
			
		||||
 */
 | 
			
		||||
void XAdcPs_IntrEnable(XAdcPs *InstancePtr, u32 Mask);
 | 
			
		||||
void XAdcPs_IntrDisable(XAdcPs *InstancePtr, u32 Mask);
 | 
			
		||||
u32 XAdcPs_IntrGetEnabled(XAdcPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
u32 XAdcPs_IntrGetStatus(XAdcPs *InstancePtr);
 | 
			
		||||
void XAdcPs_IntrClear(XAdcPs *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  /* End of protection macro. */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,508 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xadcps_hw.h
 | 
			
		||||
*
 | 
			
		||||
* This header file contains identifiers and basic driver functions (or
 | 
			
		||||
* macros) that can be used to access the XADC device through the Device
 | 
			
		||||
* Config Interface of the Zynq.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* Refer to the device specification for more information about this driver.
 | 
			
		||||
*
 | 
			
		||||
* @note	 None.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
*
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who    Date     Changes
 | 
			
		||||
* ----- -----  -------- -----------------------------------------------------
 | 
			
		||||
* 1.00a bss    12/22/11 First release based on the XPS/AXI xadc driver
 | 
			
		||||
* 1.03a bss    11/01/13 Modified macros to use correct Register offsets
 | 
			
		||||
*			CR#749687
 | 
			
		||||
*
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#ifndef XADCPS_HW_H /* Prevent circular inclusions */
 | 
			
		||||
#define XADCPS_HW_H /* by using protection macros  */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files ********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions ****************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@name Register offsets of XADC in the Device Config
 | 
			
		||||
 *
 | 
			
		||||
 * The following constants provide access to each of the registers of the
 | 
			
		||||
 * XADC device.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_CFG_OFFSET	 0x00 /**< Configuration Register */
 | 
			
		||||
#define XADCPS_INT_STS_OFFSET	 0x04 /**< Interrupt Status Register */
 | 
			
		||||
#define XADCPS_INT_MASK_OFFSET	 0x08 /**< Interrupt Mask Register */
 | 
			
		||||
#define XADCPS_MSTS_OFFSET	 0x0C /**< Misc status register */
 | 
			
		||||
#define XADCPS_CMDFIFO_OFFSET	 0x10 /**< Command FIFO Register */
 | 
			
		||||
#define XADCPS_RDFIFO_OFFSET	 0x14 /**< Read FIFO Register */
 | 
			
		||||
#define XADCPS_MCTL_OFFSET	 0x18 /**< Misc control register */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name XADC Config Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CFG_ENABLE_MASK	 0x80000000 /**< Enable access from PS mask */
 | 
			
		||||
#define XADCPS_CFG_CFIFOTH_MASK  0x00F00000 /**< Command FIFO Threshold mask */
 | 
			
		||||
#define XADCPS_CFG_DFIFOTH_MASK  0x000F0000 /**< Data FIFO Threshold mask */
 | 
			
		||||
#define XADCPS_CFG_WEDGE_MASK	 0x00002000 /**< Write Edge Mask */
 | 
			
		||||
#define XADCPS_CFG_REDGE_MASK	 0x00001000 /**< Read Edge Mask */
 | 
			
		||||
#define XADCPS_CFG_TCKRATE_MASK  0x00000300 /**< Clock freq control */
 | 
			
		||||
#define XADCPS_CFG_IGAP_MASK	 0x0000001F /**< Idle Gap between
 | 
			
		||||
						* successive commands */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name XADC Interrupt Status/Mask Register Bit definitions
 | 
			
		||||
  *
 | 
			
		||||
  * The definitions are same for the Interrupt Status Register and
 | 
			
		||||
  * Interrupt Mask Register. They are defined only once.
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_INTX_ALL_MASK   	   0x000003FF /**< Alarm Signals Mask  */
 | 
			
		||||
#define XADCPS_INTX_CFIFO_LTH_MASK 0x00000200 /**< CMD FIFO less than threshold */
 | 
			
		||||
#define XADCPS_INTX_DFIFO_GTH_MASK 0x00000100 /**< Data FIFO greater than threshold */
 | 
			
		||||
#define XADCPS_INTX_OT_MASK	   0x00000080 /**< Over temperature Alarm Status */
 | 
			
		||||
#define XADCPS_INTX_ALM_ALL_MASK   0x0000007F /**< Alarm Signals Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM6_MASK	   0x00000040 /**< Alarm 6 Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM5_MASK	   0x00000020 /**< Alarm 5 Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM4_MASK	   0x00000010 /**< Alarm 4 Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM3_MASK	   0x00000008 /**< Alarm 3 Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM2_MASK	   0x00000004 /**< Alarm 2 Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM1_MASK	   0x00000002 /**< Alarm 1 Mask  */
 | 
			
		||||
#define XADCPS_INTX_ALM0_MASK	   0x00000001 /**< Alarm 0 Mask  */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name XADC Miscellaneous Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_MSTS_CFIFO_LVL_MASK  0x000F0000 /**< Command FIFO Level mask */
 | 
			
		||||
#define XADCPS_MSTS_DFIFO_LVL_MASK  0x0000F000 /**< Data FIFO Level Mask  */
 | 
			
		||||
#define XADCPS_MSTS_CFIFOF_MASK     0x00000800 /**< Command FIFO Full Mask  */
 | 
			
		||||
#define XADCPS_MSTS_CFIFOE_MASK     0x00000400 /**< Command FIFO Empty Mask  */
 | 
			
		||||
#define XADCPS_MSTS_DFIFOF_MASK     0x00000200 /**< Data FIFO Full Mask  */
 | 
			
		||||
#define XADCPS_MSTS_DFIFOE_MASK     0x00000100 /**< Data FIFO Empty Mask  */
 | 
			
		||||
#define XADCPS_MSTS_OT_MASK	    0x00000080 /**< Over Temperature Mask */
 | 
			
		||||
#define XADCPS_MSTS_ALM_MASK	    0x0000007F /**< Alarms Mask  */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name XADC Miscellaneous Control Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_MCTL_RESET_MASK      0x00000010 /**< Reset XADC */
 | 
			
		||||
#define XADCPS_MCTL_FLUSH_MASK      0x00000001 /**< Flush the FIFOs */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**@name Internal Register offsets of the XADC
 | 
			
		||||
 *
 | 
			
		||||
 * The following constants provide access to each of the internal registers of
 | 
			
		||||
 * the XADC device.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XADC Internal Channel Registers
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_TEMP_OFFSET		  0x00 /**< On-chip Temperature Reg */
 | 
			
		||||
#define XADCPS_VCCINT_OFFSET		  0x01 /**< On-chip VCCINT Data Reg */
 | 
			
		||||
#define XADCPS_VCCAUX_OFFSET		  0x02 /**< On-chip VCCAUX Data Reg */
 | 
			
		||||
#define XADCPS_VPVN_OFFSET		  0x03 /**< ADC out of VP/VN	   */
 | 
			
		||||
#define XADCPS_VREFP_OFFSET		  0x04 /**< On-chip VREFP Data Reg */
 | 
			
		||||
#define XADCPS_VREFN_OFFSET		  0x05 /**< On-chip VREFN Data Reg */
 | 
			
		||||
#define XADCPS_VBRAM_OFFSET		  0x06 /**< On-chip VBRAM , 7 Series */
 | 
			
		||||
#define XADCPS_ADC_A_SUPPLY_CALIB_OFFSET  0x08 /**< ADC A Supply Offset Reg */
 | 
			
		||||
#define XADCPS_ADC_A_OFFSET_CALIB_OFFSET  0x09 /**< ADC A Offset Data Reg */
 | 
			
		||||
#define XADCPS_ADC_A_GAINERR_CALIB_OFFSET 0x0A /**< ADC A Gain Error Reg  */
 | 
			
		||||
#define XADCPS_VCCPINT_OFFSET		  0x0D /**< On-chip VCCPINT Reg, Zynq */
 | 
			
		||||
#define XADCPS_VCCPAUX_OFFSET		  0x0E /**< On-chip VCCPAUX Reg, Zynq */
 | 
			
		||||
#define XADCPS_VCCPDRO_OFFSET		  0x0F /**< On-chip VCCPDRO Reg, Zynq */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XADC External Channel Registers
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_AUX00_OFFSET	0x10 /**< ADC out of VAUXP0/VAUXN0 */
 | 
			
		||||
#define XADCPS_AUX01_OFFSET	0x11 /**< ADC out of VAUXP1/VAUXN1 */
 | 
			
		||||
#define XADCPS_AUX02_OFFSET	0x12 /**< ADC out of VAUXP2/VAUXN2 */
 | 
			
		||||
#define XADCPS_AUX03_OFFSET	0x13 /**< ADC out of VAUXP3/VAUXN3 */
 | 
			
		||||
#define XADCPS_AUX04_OFFSET	0x14 /**< ADC out of VAUXP4/VAUXN4 */
 | 
			
		||||
#define XADCPS_AUX05_OFFSET	0x15 /**< ADC out of VAUXP5/VAUXN5 */
 | 
			
		||||
#define XADCPS_AUX06_OFFSET	0x16 /**< ADC out of VAUXP6/VAUXN6 */
 | 
			
		||||
#define XADCPS_AUX07_OFFSET	0x17 /**< ADC out of VAUXP7/VAUXN7 */
 | 
			
		||||
#define XADCPS_AUX08_OFFSET	0x18 /**< ADC out of VAUXP8/VAUXN8 */
 | 
			
		||||
#define XADCPS_AUX09_OFFSET	0x19 /**< ADC out of VAUXP9/VAUXN9 */
 | 
			
		||||
#define XADCPS_AUX10_OFFSET	0x1A /**< ADC out of VAUXP10/VAUXN10 */
 | 
			
		||||
#define XADCPS_AUX11_OFFSET	0x1B /**< ADC out of VAUXP11/VAUXN11 */
 | 
			
		||||
#define XADCPS_AUX12_OFFSET	0x1C /**< ADC out of VAUXP12/VAUXN12 */
 | 
			
		||||
#define XADCPS_AUX13_OFFSET	0x1D /**< ADC out of VAUXP13/VAUXN13 */
 | 
			
		||||
#define XADCPS_AUX14_OFFSET	0x1E /**< ADC out of VAUXP14/VAUXN14 */
 | 
			
		||||
#define XADCPS_AUX15_OFFSET	0x1F /**< ADC out of VAUXP15/VAUXN15 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XADC Registers for Maximum/Minimum data captured for the
 | 
			
		||||
 * on chip Temperature/VCCINT/VCCAUX data.
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_MAX_TEMP_OFFSET		0x20 /**< Max Temperature Reg */
 | 
			
		||||
#define XADCPS_MAX_VCCINT_OFFSET	0x21 /**< Max VCCINT Register */
 | 
			
		||||
#define XADCPS_MAX_VCCAUX_OFFSET	0x22 /**< Max VCCAUX Register */
 | 
			
		||||
#define XADCPS_MAX_VCCBRAM_OFFSET	0x23 /**< Max BRAM Register, 7 series */
 | 
			
		||||
#define XADCPS_MIN_TEMP_OFFSET		0x24 /**< Min Temperature Reg */
 | 
			
		||||
#define XADCPS_MIN_VCCINT_OFFSET	0x25 /**< Min VCCINT Register */
 | 
			
		||||
#define XADCPS_MIN_VCCAUX_OFFSET	0x26 /**< Min VCCAUX Register */
 | 
			
		||||
#define XADCPS_MIN_VCCBRAM_OFFSET	0x27 /**< Min BRAM Register, 7 series */
 | 
			
		||||
#define XADCPS_MAX_VCCPINT_OFFSET	0x28 /**< Max VCCPINT Register, Zynq */
 | 
			
		||||
#define XADCPS_MAX_VCCPAUX_OFFSET	0x29 /**< Max VCCPAUX Register, Zynq */
 | 
			
		||||
#define XADCPS_MAX_VCCPDRO_OFFSET	0x2A /**< Max VCCPDRO Register, Zynq */
 | 
			
		||||
#define XADCPS_MIN_VCCPINT_OFFSET	0x2C /**< Min VCCPINT Register, Zynq */
 | 
			
		||||
#define XADCPS_MIN_VCCPAUX_OFFSET	0x2D /**< Min VCCPAUX Register, Zynq */
 | 
			
		||||
#define XADCPS_MIN_VCCPDRO_OFFSET	0x2E /**< Min VCCPDRO Register,Zynq */
 | 
			
		||||
 /* Undefined 0x2F to 0x3E */
 | 
			
		||||
#define XADCPS_FLAG_OFFSET		0x3F /**< Flag Register */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XADC Configuration Registers
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CFR0_OFFSET	0x40	/**< Configuration Register 0 */
 | 
			
		||||
#define XADCPS_CFR1_OFFSET	0x41	/**< Configuration Register 1 */
 | 
			
		||||
#define XADCPS_CFR2_OFFSET	0x42	/**< Configuration Register 2 */
 | 
			
		||||
 | 
			
		||||
/* Test Registers 0x43 to 0x47 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XADC Sequence Registers
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_SEQ00_OFFSET	0x48 /**< Seq Reg 00 Adc Channel Selection */
 | 
			
		||||
#define XADCPS_SEQ01_OFFSET	0x49 /**< Seq Reg 01 Adc Channel Selection */
 | 
			
		||||
#define XADCPS_SEQ02_OFFSET	0x4A /**< Seq Reg 02 Adc Average Enable */
 | 
			
		||||
#define XADCPS_SEQ03_OFFSET	0x4B /**< Seq Reg 03 Adc Average Enable */
 | 
			
		||||
#define XADCPS_SEQ04_OFFSET	0x4C /**< Seq Reg 04 Adc Input Mode Select */
 | 
			
		||||
#define XADCPS_SEQ05_OFFSET	0x4D /**< Seq Reg 05 Adc Input Mode Select */
 | 
			
		||||
#define XADCPS_SEQ06_OFFSET	0x4E /**< Seq Reg 06 Adc Acquisition Select */
 | 
			
		||||
#define XADCPS_SEQ07_OFFSET	0x4F /**< Seq Reg 07 Adc Acquisition Select */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XADC Alarm Threshold/Limit Registers (ATR)
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_ATR_TEMP_UPPER_OFFSET	0x50 /**< Temp Upper Alarm Register */
 | 
			
		||||
#define XADCPS_ATR_VCCINT_UPPER_OFFSET	0x51 /**< VCCINT Upper Alarm Reg */
 | 
			
		||||
#define XADCPS_ATR_VCCAUX_UPPER_OFFSET	0x52 /**< VCCAUX Upper Alarm Reg */
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER_OFFSET	0x53 /**< Over Temp Upper Alarm Reg */
 | 
			
		||||
#define XADCPS_ATR_TEMP_LOWER_OFFSET	0x54 /**< Temp Lower Alarm Register */
 | 
			
		||||
#define XADCPS_ATR_VCCINT_LOWER_OFFSET	0x55 /**< VCCINT Lower Alarm Reg */
 | 
			
		||||
#define XADCPS_ATR_VCCAUX_LOWER_OFFSET	0x56 /**< VCCAUX Lower Alarm Reg */
 | 
			
		||||
#define XADCPS_ATR_OT_LOWER_OFFSET	0x57 /**< Over Temp Lower Alarm Reg */
 | 
			
		||||
#define XADCPS_ATR_VBRAM_UPPER_OFFSET	0x58 /**< VBRAM Upper Alarm, 7 series */
 | 
			
		||||
#define XADCPS_ATR_VCCPINT_UPPER_OFFSET	0x59 /**< VCCPINT Upper Alarm, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPAUX_UPPER_OFFSET	0x5A /**< VCCPAUX Upper Alarm, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPDRO_UPPER_OFFSET	0x5B /**< VCCPDRO Upper Alarm, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VBRAM_LOWER_OFFSET	0x5C /**< VRBAM Lower Alarm, 7 Series */
 | 
			
		||||
#define XADCPS_ATR_VCCPINT_LOWER_OFFSET	0x5D /**< VCCPINT Lower Alarm, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPAUX_LOWER_OFFSET	0x5E /**< VCCPAUX Lower Alarm, Zynq */
 | 
			
		||||
#define XADCPS_ATR_VCCPDRO_LOWER_OFFSET	0x5F /**< VCCPDRO Lower Alarm, Zynq */
 | 
			
		||||
 | 
			
		||||
/* Undefined 0x60 to 0x7F */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Configuration Register 0 (CFR0) mask(s)
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CFR0_CAL_AVG_MASK	0x8000 /**< Averaging enable Mask */
 | 
			
		||||
#define XADCPS_CFR0_AVG_VALID_MASK	0x3000 /**< Averaging bit Mask */
 | 
			
		||||
#define XADCPS_CFR0_AVG1_MASK		0x0000 /**< No Averaging */
 | 
			
		||||
#define XADCPS_CFR0_AVG16_MASK		0x1000 /**< Average 16 samples */
 | 
			
		||||
#define XADCPS_CFR0_AVG64_MASK	 	0x2000 /**< Average 64 samples */
 | 
			
		||||
#define XADCPS_CFR0_AVG256_MASK 	0x3000 /**< Average 256 samples */
 | 
			
		||||
#define XADCPS_CFR0_AVG_SHIFT	 	12     /**< Averaging bits shift */
 | 
			
		||||
#define XADCPS_CFR0_MUX_MASK	 	0x0800 /**< External Mask Enable */
 | 
			
		||||
#define XADCPS_CFR0_DU_MASK	 	0x0400 /**< Bipolar/Unipolar mode */
 | 
			
		||||
#define XADCPS_CFR0_EC_MASK	 	0x0200 /**< Event driven/
 | 
			
		||||
						 *  Continuous mode selection
 | 
			
		||||
						 */
 | 
			
		||||
#define XADCPS_CFR0_ACQ_MASK	 	0x0100 /**< Add acquisition by 6 ADCCLK */
 | 
			
		||||
#define XADCPS_CFR0_CHANNEL_MASK	0x001F /**< Channel number bit Mask */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Configuration Register 1 (CFR1) mask(s)
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_VALID_MASK	  0xF000 /**< Sequence bit Mask */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_SAFEMODE_MASK	  0x0000 /**< Default Safe Mode */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_ONEPASS_MASK	  0x1000 /**< Onepass through Seq */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_CONTINPASS_MASK	     0x2000 /**< Continuous Cycling Seq */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_SINGCHAN_MASK	     0x3000 /**< Single channel - No Seq */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_SIMUL_SAMPLING_MASK  0x4000 /**< Simulataneous Sampling Mask */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_INDEPENDENT_MASK  0x8000 /**< Independent Mode */
 | 
			
		||||
#define XADCPS_CFR1_SEQ_SHIFT		  12     /**< Sequence bit shift */
 | 
			
		||||
#define XADCPS_CFR1_ALM_VCCPDRO_MASK	  0x0800 /**< Alm 6 - VCCPDRO, Zynq  */
 | 
			
		||||
#define XADCPS_CFR1_ALM_VCCPAUX_MASK	  0x0400 /**< Alm 5 - VCCPAUX, Zynq */
 | 
			
		||||
#define XADCPS_CFR1_ALM_VCCPINT_MASK	  0x0200 /**< Alm 4 - VCCPINT, Zynq */
 | 
			
		||||
#define XADCPS_CFR1_ALM_VBRAM_MASK	  0x0100 /**< Alm 3 - VBRAM, 7 series */
 | 
			
		||||
#define XADCPS_CFR1_CAL_VALID_MASK	  0x00F0 /**< Valid Calibration Mask */
 | 
			
		||||
#define XADCPS_CFR1_CAL_PS_GAIN_OFFSET_MASK  0x0080 /**< Calibration 3 -Power
 | 
			
		||||
							Supply Gain/Offset
 | 
			
		||||
							Enable */
 | 
			
		||||
#define XADCPS_CFR1_CAL_PS_OFFSET_MASK	  0x0040 /**< Calibration 2 -Power
 | 
			
		||||
							Supply Offset Enable */
 | 
			
		||||
#define XADCPS_CFR1_CAL_ADC_GAIN_OFFSET_MASK 0x0020 /**< Calibration 1 -ADC Gain
 | 
			
		||||
							Offset Enable */
 | 
			
		||||
#define XADCPS_CFR1_CAL_ADC_OFFSET_MASK	 0x0010 /**< Calibration 0 -ADC Offset
 | 
			
		||||
							Enable */
 | 
			
		||||
#define XADCPS_CFR1_CAL_DISABLE_MASK	0x0000 /**< No Calibration */
 | 
			
		||||
#define XADCPS_CFR1_ALM_ALL_MASK	0x0F0F /**< Mask for all alarms */
 | 
			
		||||
#define XADCPS_CFR1_ALM_VCCAUX_MASK	0x0008 /**< Alarm 2 - VCCAUX Enable */
 | 
			
		||||
#define XADCPS_CFR1_ALM_VCCINT_MASK	0x0004 /**< Alarm 1 - VCCINT Enable */
 | 
			
		||||
#define XADCPS_CFR1_ALM_TEMP_MASK	0x0002 /**< Alarm 0 - Temperature */
 | 
			
		||||
#define XADCPS_CFR1_OT_MASK		0x0001 /**< Over Temperature Enable */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Configuration Register 2 (CFR2) mask(s)
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_CFR2_CD_VALID_MASK	0xFF00  /**<Clock Divisor bit Mask   */
 | 
			
		||||
#define XADCPS_CFR2_CD_SHIFT		8	/**<Num of shift on division */
 | 
			
		||||
#define XADCPS_CFR2_CD_MIN		8	/**<Minimum value of divisor */
 | 
			
		||||
#define XADCPS_CFR2_CD_MAX		255	/**<Maximum value of divisor */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_CFR2_CD_MIN		8	/**<Minimum value of divisor */
 | 
			
		||||
#define XADCPS_CFR2_PD_MASK		0x0030	/**<Power Down Mask */
 | 
			
		||||
#define XADCPS_CFR2_PD_XADC_MASK	0x0030	/**<Power Down XADC Mask */
 | 
			
		||||
#define XADCPS_CFR2_PD_ADC1_MASK	0x0020	/**<Power Down ADC1 Mask */
 | 
			
		||||
#define XADCPS_CFR2_PD_SHIFT		4	/**<Power Down Shift */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name Sequence Register (SEQ) Bit Definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_SEQ_CH_CALIB	0x00000001 /**< ADC Calibration Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VCCPINT	0x00000020 /**< VCCPINT, Zynq Only */
 | 
			
		||||
#define XADCPS_SEQ_CH_VCCPAUX	0x00000040 /**< VCCPAUX, Zynq Only */
 | 
			
		||||
#define XADCPS_SEQ_CH_VCCPDRO	0x00000080 /**< VCCPDRO, Zynq Only */
 | 
			
		||||
#define XADCPS_SEQ_CH_TEMP	0x00000100 /**< On Chip Temperature Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VCCINT	0x00000200 /**< VCCINT Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VCCAUX	0x00000400 /**< VCCAUX Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VPVN	0x00000800 /**< VP/VN analog inputs Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VREFP	0x00001000 /**< VREFP Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VREFN	0x00002000 /**< VREFN Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_VBRAM	0x00004000 /**< VBRAM Channel, 7 series */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX00	0x00010000 /**< 1st Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX01	0x00020000 /**< 2nd Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX02	0x00040000 /**< 3rd Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX03	0x00080000 /**< 4th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX04	0x00100000 /**< 5th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX05	0x00200000 /**< 6th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX06	0x00400000 /**< 7th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX07	0x00800000 /**< 8th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX08	0x01000000 /**< 9th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX09	0x02000000 /**< 10th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX10	0x04000000 /**< 11th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX11	0x08000000 /**< 12th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX12	0x10000000 /**< 13th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX13	0x20000000 /**< 14th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX14	0x40000000 /**< 15th Aux Channel */
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX15	0x80000000 /**< 16th Aux Channel */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_SEQ00_CH_VALID_MASK  0x7FE1 /**< Mask for the valid channels */
 | 
			
		||||
#define XADCPS_SEQ01_CH_VALID_MASK  0xFFFF /**< Mask for the valid channels */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_SEQ02_CH_VALID_MASK  0x7FE0 /**< Mask for the valid channels */
 | 
			
		||||
#define XADCPS_SEQ03_CH_VALID_MASK  0xFFFF /**< Mask for the valid channels */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_SEQ04_CH_VALID_MASK  0x0800 /**< Mask for the valid channels */
 | 
			
		||||
#define XADCPS_SEQ05_CH_VALID_MASK  0xFFFF /**< Mask for the valid channels */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_SEQ06_CH_VALID_MASK  0x0800 /**< Mask for the valid channels */
 | 
			
		||||
#define XADCPS_SEQ07_CH_VALID_MASK  0xFFFF /**< Mask for the valid channels */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define XADCPS_SEQ_CH_AUX_SHIFT	16 /**< Shift for the Aux Channel */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name OT Upper Alarm Threshold Register Bit Definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER_ENB_MASK	0x000F /**< Mask for OT enable */
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER_VAL_MASK	0xFFF0 /**< Mask for OT value */
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER_VAL_SHIFT	4      /**< Shift for OT value */
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER_ENB_VAL	0x0003 /**< Value for OT enable */
 | 
			
		||||
#define XADCPS_ATR_OT_UPPER_VAL_MAX	0x0FFF /**< Max OT value */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name JTAG DRP Bit Definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XADCPS_JTAG_DATA_MASK		0x0000FFFF /**< Mask for the Data */
 | 
			
		||||
#define XADCPS_JTAG_ADDR_MASK		0x03FF0000 /**< Mask for the Addr */
 | 
			
		||||
#define XADCPS_JTAG_ADDR_SHIFT		16	   /**< Shift for the Addr */
 | 
			
		||||
#define XADCPS_JTAG_CMD_MASK		0x3C000000 /**< Mask for the Cmd */
 | 
			
		||||
#define XADCPS_JTAG_CMD_WRITE_MASK	0x08000000 /**< Mask for CMD Write */
 | 
			
		||||
#define XADCPS_JTAG_CMD_READ_MASK	0x04000000 /**< Mask for CMD Read */
 | 
			
		||||
#define XADCPS_JTAG_CMD_SHIFT		26	   /**< Shift for the Cmd */
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name Unlock Register Definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
 #define XADCPS_UNLK_OFFSET	 0x034 /**< Unlock Register */
 | 
			
		||||
 #define XADCPS_UNLK_VALUE	 0x757BDF0D /**< Unlock Value */
 | 
			
		||||
 | 
			
		||||
 /* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Read a register of the XADC device. This macro provides register
 | 
			
		||||
* access to all registers using the register offsets defined above.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddress contains the base address of the device.
 | 
			
		||||
* @param	RegOffset is the offset of the register to read.
 | 
			
		||||
*
 | 
			
		||||
* @return	The contents of the register.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style Signature:
 | 
			
		||||
*		u32 XAdcPs_ReadReg(u32 BaseAddress, u32 RegOffset);
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#define XAdcPs_ReadReg(BaseAddress, RegOffset) \
 | 
			
		||||
			(Xil_In32((BaseAddress) + (RegOffset)))
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Write a register of the XADC device. This macro provides
 | 
			
		||||
* register access to all registers using the register offsets defined above.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddress contains the base address of the device.
 | 
			
		||||
* @param	RegOffset is the offset of the register to write.
 | 
			
		||||
* @param	Data is the value to write to the register.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note 	C-style Signature:
 | 
			
		||||
*		void XAdcPs_WriteReg(u32 BaseAddress,
 | 
			
		||||
*					u32 RegOffset,u32 Data)
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#define XAdcPs_WriteReg(BaseAddress, RegOffset, Data) \
 | 
			
		||||
		(Xil_Out32((BaseAddress) + (RegOffset), (Data)))
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Formats the data to be written to the the XADC registers.
 | 
			
		||||
*
 | 
			
		||||
* @param	RegOffset is the offset of the Register
 | 
			
		||||
* @param	Data is the data to be written to the Register if it is
 | 
			
		||||
*		a write.
 | 
			
		||||
* @param	ReadWrite specifies whether it is a Read or a Write.
 | 
			
		||||
*		Use 0 for Read, 1 for Write.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note 	C-style Signature:
 | 
			
		||||
*		void XAdcPs_FormatWriteData(u32 RegOffset,
 | 
			
		||||
*					     u16 Data, int ReadWrite)
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#define XAdcPs_FormatWriteData(RegOffset, Data, ReadWrite) 	    \
 | 
			
		||||
    ((ReadWrite ? XADCPS_JTAG_CMD_WRITE_MASK : XADCPS_JTAG_CMD_READ_MASK ) | \
 | 
			
		||||
     ((RegOffset << XADCPS_JTAG_ADDR_SHIFT) & XADCPS_JTAG_ADDR_MASK) | 	     \
 | 
			
		||||
     (Data & XADCPS_JTAG_DATA_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  /* End of protection macro. */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,128 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xbasic_types.h
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* @note  Dummy File for backwards compatibility
 | 
			
		||||
*
 | 
			
		||||
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who    Date   Changes
 | 
			
		||||
* ----- ---- -------- -------------------------------------------------------
 | 
			
		||||
* 1.00a adk   1/31/14  Added in bsp common folder for backward compatibility
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XBASIC_TYPES_H	/* prevent circular inclusions */
 | 
			
		||||
#define XBASIC_TYPES_H	/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
/** @name Legacy types
 | 
			
		||||
 * Deprecated legacy types.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
typedef unsigned char	Xuint8;		/**< unsigned 8-bit */
 | 
			
		||||
typedef char		Xint8;		/**< signed 8-bit */
 | 
			
		||||
typedef unsigned short	Xuint16;	/**< unsigned 16-bit */
 | 
			
		||||
typedef short		Xint16;		/**< signed 16-bit */
 | 
			
		||||
typedef unsigned long	Xuint32;	/**< unsigned 32-bit */
 | 
			
		||||
typedef long		Xint32;		/**< signed 32-bit */
 | 
			
		||||
typedef float		Xfloat32;	/**< 32-bit floating point */
 | 
			
		||||
typedef double		Xfloat64;	/**< 64-bit double precision FP */
 | 
			
		||||
typedef unsigned long	Xboolean;	/**< boolean (XTRUE or XFALSE) */
 | 
			
		||||
 | 
			
		||||
#if !defined __XUINT64__
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	Xuint32 Upper;
 | 
			
		||||
	Xuint32 Lower;
 | 
			
		||||
} Xuint64;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @name New types
 | 
			
		||||
 * New simple types.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __KERNEL__
 | 
			
		||||
#ifndef XIL_TYPES_H
 | 
			
		||||
typedef Xuint32         u32;
 | 
			
		||||
typedef Xuint16         u16;
 | 
			
		||||
typedef Xuint8          u8;
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef TRUE
 | 
			
		||||
#  define TRUE		1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef FALSE
 | 
			
		||||
#  define FALSE		0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef NULL
 | 
			
		||||
#define NULL		0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Xilinx NULL, TRUE and FALSE legacy support. Deprecated.
 | 
			
		||||
 * Please use NULL, TRUE and FALSE
 | 
			
		||||
 */
 | 
			
		||||
#define XNULL		NULL
 | 
			
		||||
#define XTRUE		TRUE
 | 
			
		||||
#define XFALSE		FALSE
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This file is deprecated and users
 | 
			
		||||
 * should use xil_types.h and xil_assert.h\n\r
 | 
			
		||||
 */
 | 
			
		||||
#warning  The xbasics_type.h file is deprecated and users should use xil_types.h and xil_assert.
 | 
			
		||||
#warning  Please refer the Standalone BSP UG647 for further details
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif	/* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,570 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-2012 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xcanps.h
 | 
			
		||||
*
 | 
			
		||||
* The Xilinx CAN driver component.  This component supports the Xilinx
 | 
			
		||||
* CAN Controller.
 | 
			
		||||
*
 | 
			
		||||
* The CAN Controller supports the following features:
 | 
			
		||||
*	- Confirms to the ISO 11898-1, CAN 2.0A and CAN 2.0B standards.
 | 
			
		||||
*	- Supports both Standard (11 bit Identifier) and Extended (29 bit
 | 
			
		||||
*	  Identifier) frames.
 | 
			
		||||
*	- Supports Bit Rates up to 1 Mbps.
 | 
			
		||||
*	- Transmit message object FIFO with a user configurable depth of
 | 
			
		||||
*	  up to 64 message objects.
 | 
			
		||||
*	- Transmit prioritization through one TX High Priority Buffer.
 | 
			
		||||
*	- Receive message object FIFO with a user configurable depth of
 | 
			
		||||
*	  up to 64 message objects.
 | 
			
		||||
*	- Watermark interrupts for Rx FIFO with configurable Watermark.
 | 
			
		||||
*	- Acceptance filtering with 4 acceptance filters.
 | 
			
		||||
*	- Sleep mode with automatic wake up.
 | 
			
		||||
*	- Loop Back mode for diagnostic applications.
 | 
			
		||||
*	- Snoop mode for diagnostic applications.
 | 
			
		||||
*	- Maskable Error and Status Interrupts.
 | 
			
		||||
*	- Readable Error Counters.
 | 
			
		||||
*	- External PHY chip required.
 | 
			
		||||
*	- Receive Timestamp.
 | 
			
		||||
*
 | 
			
		||||
* The device driver supports all the features listed above, if applicable.
 | 
			
		||||
*
 | 
			
		||||
* <b>Driver Description</b>
 | 
			
		||||
*
 | 
			
		||||
* The device driver enables higher layer software (e.g., an application) to
 | 
			
		||||
* communicate to the CAN. The driver handles transmission and reception of
 | 
			
		||||
* CAN frames, as well as configuration of the controller. The driver is simply a
 | 
			
		||||
* pass-through mechanism between a protocol stack and the CAN. A single device
 | 
			
		||||
* driver can support multiple CANs.
 | 
			
		||||
*
 | 
			
		||||
* Since the driver is a simple pass-through mechanism between a protocol stack
 | 
			
		||||
* and the CAN, no assembly or disassembly of CAN frames is done at the
 | 
			
		||||
* driver-level. This assumes that the protocol stack passes a correctly
 | 
			
		||||
* formatted CAN frame to the driver for transmission, and that the driver
 | 
			
		||||
* does not validate the contents of an incoming frame
 | 
			
		||||
*
 | 
			
		||||
* <b>Operation Modes</b>
 | 
			
		||||
*
 | 
			
		||||
* The CAN controller supports the following modes of operation:
 | 
			
		||||
*   - <b>Configuration Mode</b>: In this mode the CAN timing parameters and
 | 
			
		||||
*	 Baud Rate Pre-scalar parameters can be changed. In this mode the CAN
 | 
			
		||||
*	 controller loses synchronization with the CAN bus and drives a
 | 
			
		||||
*	 constant recessive bit on the bus line. The Error Counter Register are
 | 
			
		||||
*	 reset. The CAN controller does not receive or transmit any messages
 | 
			
		||||
*	 even if there are pending transmit requests from the TX FIFO or the TX
 | 
			
		||||
*	 High Priority Buffer. The Storage FIFOs and the CAN configuration
 | 
			
		||||
*	 registers are still accessible.
 | 
			
		||||
*   - <b>Normal Mode</b>:In Normal Mode the CAN controller participates in bus
 | 
			
		||||
*	 communication, by transmitting and receiving messages.
 | 
			
		||||
*   - <b>Sleep Mode</b>: In Sleep Mode the CAN Controller does not transmit any
 | 
			
		||||
*	 messages. However, if any other node transmits a message, then the CAN
 | 
			
		||||
*	 Controller receives the transmitted message and exits from Sleep Mode.
 | 
			
		||||
*	 If there are new transmission requests from either the TX FIFO or the
 | 
			
		||||
*	 TX High Priority Buffer when the CAN Controller is in Sleep Mode, these
 | 
			
		||||
*	 requests are not serviced, and the CAN Controller continues to remain
 | 
			
		||||
*	 in Sleep Mode. Interrupts are generated when the CAN controller enters
 | 
			
		||||
*	Sleep mode or Wakes up from Sleep mode.
 | 
			
		||||
*   - <b>Loop Back Mode</b>: In Loop Back mode, the CAN controller transmits a
 | 
			
		||||
*	 recessive bit stream on to the CAN Bus. Any message that is transmitted
 | 
			
		||||
*	 is looped back to the ‘Rx’ line and acknowledged. The CAN controller
 | 
			
		||||
*	 thus receives any message that it transmits. It does not participate in
 | 
			
		||||
*	 normal bus communication and does not receive any messages that are
 | 
			
		||||
*	 transmitted by other CAN nodes. This mode is used for diagnostic
 | 
			
		||||
*	 purposes.
 | 
			
		||||
*   - <b>Snoop Mode</b>: In Snoop mode, the CAN controller transmits a
 | 
			
		||||
*	 recessive bit stream on to the CAN Bus and does not participate
 | 
			
		||||
*	 in normal bus communication but receives messages that are transmitted
 | 
			
		||||
*	 by other CAN nodes. This mode is used for diagnostic purposes.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <b>Buffer Alignment</b>
 | 
			
		||||
*
 | 
			
		||||
* It is important to note that frame buffers passed to the driver must be
 | 
			
		||||
* 32-bit aligned.
 | 
			
		||||
*
 | 
			
		||||
* <b>Receive Address Filtering</b>
 | 
			
		||||
*
 | 
			
		||||
* The device can be set to accept frames whose Identifiers match any of the
 | 
			
		||||
* 4 filters set in the Acceptance Filter Mask/ID registers.
 | 
			
		||||
*
 | 
			
		||||
* The incoming Identifier is masked with the bits in the Acceptance Filter Mask
 | 
			
		||||
* Register. This value is compared with the result of masking the bits in the
 | 
			
		||||
* Acceptance Filter ID Register with the Acceptance Filter Mask Register. If
 | 
			
		||||
* both these values are equal, the message will be stored in the RX FIFO.
 | 
			
		||||
*
 | 
			
		||||
* Acceptance Filtering is performed by each of the defined acceptance filters.
 | 
			
		||||
* If the incoming identifier passes through any acceptance filter then the
 | 
			
		||||
* frame is stored in the RX FIFO.
 | 
			
		||||
*
 | 
			
		||||
* If the Accpetance Filters are not set up then all the received messages are
 | 
			
		||||
* stroed in the RX FIFO.
 | 
			
		||||
*
 | 
			
		||||
* <b>PHY Communication</b>
 | 
			
		||||
*
 | 
			
		||||
* This driver does not provide any mechanism for directly programming PHY.
 | 
			
		||||
*
 | 
			
		||||
* <b>Interrupts</b>
 | 
			
		||||
*
 | 
			
		||||
* The driver has no dependencies on the interrupt controller. The driver
 | 
			
		||||
* provides an interrupt handler. User of this driver needs to provide
 | 
			
		||||
* callback functions. An interrupt handler example is available with
 | 
			
		||||
* the driver.
 | 
			
		||||
*
 | 
			
		||||
* <b>Threads</b>
 | 
			
		||||
*
 | 
			
		||||
* This driver is not thread safe.  Any needs for threads or thread mutual
 | 
			
		||||
* exclusion must be satisfied by the layer above this driver.
 | 
			
		||||
*
 | 
			
		||||
* <b>Device Reset</b>
 | 
			
		||||
*
 | 
			
		||||
* Bus Off interrupt that can occur in the device requires a device reset.
 | 
			
		||||
* The user is responsible for resetting the device and re-configuring it
 | 
			
		||||
* based on its needs (the driver does not save the current configuration).
 | 
			
		||||
* When integrating into an RTOS, these reset and re-configure obligations are
 | 
			
		||||
* taken care of by the OS adapter software if it exists for that RTOS.
 | 
			
		||||
*
 | 
			
		||||
* <b>Device Configuration</b>
 | 
			
		||||
*
 | 
			
		||||
* The device can be configured in various ways during the FPGA implementation
 | 
			
		||||
* process. Configuration parameters are stored in the xcanps_g.c files.
 | 
			
		||||
* A table is defined where each entry contains configuration information
 | 
			
		||||
* for a CAN device.  This information includes such things as the base address
 | 
			
		||||
* of the memory-mapped device.
 | 
			
		||||
*
 | 
			
		||||
* <b>Asserts</b>
 | 
			
		||||
*
 | 
			
		||||
* Asserts are used within all Xilinx drivers to enforce constraints on argument
 | 
			
		||||
* values. Asserts can be turned off on a system-wide basis by defining, at
 | 
			
		||||
* compile time, the NDEBUG identifier. By default, asserts are turned on and it
 | 
			
		||||
* is recommended that users leave asserts on during development.
 | 
			
		||||
*
 | 
			
		||||
* <b>Building the driver</b>
 | 
			
		||||
*
 | 
			
		||||
* The XCanPs driver is composed of several source files. This allows the user
 | 
			
		||||
* to build and link only those parts of the driver that are necessary.
 | 
			
		||||
* <br><br>
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who    Date	Changes
 | 
			
		||||
* ----- -----  -------- -----------------------------------------------
 | 
			
		||||
* 1.00a xd/sv  01/12/10 First release
 | 
			
		||||
* 1.01a bss    12/27/11 Added the APIs XCanPs_SetTxIntrWatermark and
 | 
			
		||||
* 			XCanPs_GetTxIntrWatermark.
 | 
			
		||||
*			Updated the Register/bit definitions
 | 
			
		||||
*                       Changed XCANPS_RXFWIR_RXFLL_MASK to XCANPS_WIR_FW_MASK
 | 
			
		||||
*                       Changed XCANPS_RXWIR_OFFSET to XCANPS_WIR_OFFSET
 | 
			
		||||
*			Added XCANPS_IXR_TXFEMP_MASK for Tx Fifo Empty
 | 
			
		||||
*			Changed XCANPS_IXR_RXFLL_MASK to
 | 
			
		||||
*			XCANPS_IXR_RXFWMFLL_MASK
 | 
			
		||||
* 			Changed
 | 
			
		||||
*			XCANPS_TXBUF_ID_OFFSET to XCANPS_TXHPB_ID_OFFSET
 | 
			
		||||
* 			XCANPS_TXBUF_DLC_OFFSET to XCANPS_TXHPB_DLC_OFFSET
 | 
			
		||||
*			XCANPS_TXBUF_DW1_OFFSET to XCANPS_TXHPB_DW1_OFFSET
 | 
			
		||||
*			XCANPS_TXBUF_DW2_OFFSET to XCANPS_TXHPB_DW2_OFFSET
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#ifndef XCANPS_H			/* prevent circular inclusions */
 | 
			
		||||
#define XCANPS_H			/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xcanps_hw.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name CAN operation modes
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_MODE_CONFIG	0x00000001 /**< Configuration mode */
 | 
			
		||||
#define XCANPS_MODE_NORMAL	0x00000002 /**< Normal mode */
 | 
			
		||||
#define XCANPS_MODE_LOOPBACK	0x00000004 /**< Loop Back mode */
 | 
			
		||||
#define XCANPS_MODE_SLEEP	0x00000008 /**< Sleep mode */
 | 
			
		||||
#define XCANPS_MODE_SNOOP	0x00000010 /**< Snoop mode */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Callback identifiers used as parameters to XCanPs_SetHandler()
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_HANDLER_SEND 1 /**< Handler type for frame sending interrupt */
 | 
			
		||||
#define XCANPS_HANDLER_RECV 2 /**< Handler type for frame reception interrupt*/
 | 
			
		||||
#define XCANPS_HANDLER_ERROR  3 /**< Handler type for error interrupt */
 | 
			
		||||
#define XCANPS_HANDLER_EVENT  4 /**< Handler type for all other interrupts */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for a device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16 DeviceId;		/**< Unique ID of device */
 | 
			
		||||
	u32 BaseAddr;		/**< Register base address */
 | 
			
		||||
} XCanPs_Config;
 | 
			
		||||
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Callback type for frame sending and reception interrupts.
 | 
			
		||||
 *
 | 
			
		||||
 * @param 	CallBackRef is a callback reference passed in by the upper layer
 | 
			
		||||
 *		when setting the callback functions, and passed back to the
 | 
			
		||||
 *		upper layer when the callback is invoked.
 | 
			
		||||
*******************************************************************************/
 | 
			
		||||
typedef void (*XCanPs_SendRecvHandler) (void *CallBackRef);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Callback type for error interrupt.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	CallBackRef is a callback reference passed in by the upper layer
 | 
			
		||||
 *		when setting the callback functions, and passed back to the
 | 
			
		||||
 *		upper layer when the callback is invoked.
 | 
			
		||||
 * @param	ErrorMask is a bit mask indicating the cause of the error. Its
 | 
			
		||||
 *		value equals 'OR'ing one or more XCANPS_ESR_* values defined in
 | 
			
		||||
 *		xcanps_hw.h
 | 
			
		||||
*******************************************************************************/
 | 
			
		||||
typedef void (*XCanPs_ErrorHandler) (void *CallBackRef, u32 ErrorMask);
 | 
			
		||||
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Callback type for all kinds of interrupts except sending frame interrupt,
 | 
			
		||||
 * receiving frame interrupt, and error interrupt.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	CallBackRef is a callback reference passed in by the upper layer
 | 
			
		||||
 *		when setting the callback functions, and passed back to the
 | 
			
		||||
 *		upper layer when the callback is invoked.
 | 
			
		||||
 * @param	Mask is a bit mask indicating the pending interrupts. Its value
 | 
			
		||||
 *		equals 'OR'ing one or more XCANPS_IXR_* defined in xcanps_hw.h
 | 
			
		||||
*******************************************************************************/
 | 
			
		||||
typedef void (*XCanPs_EventHandler) (void *CallBackRef, u32 Mask);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XCanPs driver instance data. The user is required to allocate a
 | 
			
		||||
 * variable of this type for every CAN device in the system. A pointer
 | 
			
		||||
 * to a variable of this type is then passed to the driver API functions.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XCanPs_Config CanConfig; 	/**< Device configuration */
 | 
			
		||||
	u32 IsReady;			/**< Device is initialized and ready */
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Callback and callback reference for TXOK interrupt.
 | 
			
		||||
	 */
 | 
			
		||||
	XCanPs_SendRecvHandler SendHandler;
 | 
			
		||||
	void *SendRef;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Callback and callback reference for RXOK/RXNEMP/RXFLL interrupts.
 | 
			
		||||
	 */
 | 
			
		||||
	XCanPs_SendRecvHandler RecvHandler;
 | 
			
		||||
	void *RecvRef;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Callback and callback reference for ERROR interrupt.
 | 
			
		||||
	 */
 | 
			
		||||
	XCanPs_ErrorHandler ErrorHandler;
 | 
			
		||||
	void *ErrorRef;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Callback  and callback reference for RXOFLW/RXUFLW/TXBFLL/TXFLL/
 | 
			
		||||
	 * Wakeup/Sleep/Bus off/ARBLST interrupts.
 | 
			
		||||
	 */
 | 
			
		||||
	XCanPs_EventHandler EventHandler;
 | 
			
		||||
	void *EventRef;
 | 
			
		||||
 | 
			
		||||
} XCanPs;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the transmission is complete.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XCanPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if the transmission is done.
 | 
			
		||||
*		- FALSE if the transmission is not done.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XCanPs_IsTxDone(XCanPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*******************************************************************************/
 | 
			
		||||
#define XCanPs_IsTxDone(InstancePtr) \
 | 
			
		||||
	((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr),		\
 | 
			
		||||
		XCANPS_ISR_OFFSET) & XCANPS_IXR_TXOK_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the transmission FIFO is full.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XCanPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if TX FIFO is full.
 | 
			
		||||
*		- FALSE if the TX FIFO is NOT full.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XCanPs_IsTxFifoFull(XCanPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_IsTxFifoFull(InstancePtr) \
 | 
			
		||||
	((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), 	\
 | 
			
		||||
		XCANPS_SR_OFFSET) & XCANPS_SR_TXFLL_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the Transmission High Priority Buffer is full.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XCanPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if the TX High Priority Buffer is full.
 | 
			
		||||
*		- FALSE if the TX High Priority Buffer is NOT full.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XCanPs_IsHighPriorityBufFull(XCanPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_IsHighPriorityBufFull(InstancePtr) \
 | 
			
		||||
	((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), 	\
 | 
			
		||||
		XCANPS_SR_OFFSET) & XCANPS_SR_TXBFLL_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the receive FIFO is empty.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XCanPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if RX FIFO is empty.
 | 
			
		||||
*		- FALSE if the RX FIFO is NOT empty.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XCanPs_IsRxEmpty(XCanPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_IsRxEmpty(InstancePtr) \
 | 
			
		||||
	((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), 	\
 | 
			
		||||
		XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK) ? FALSE : TRUE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro checks if the CAN device is ready for the driver to change
 | 
			
		||||
* Acceptance Filter Identifier Registers (AFIR) and Acceptance Filter Mask
 | 
			
		||||
* Registers (AFMR).
 | 
			
		||||
*
 | 
			
		||||
* AFIR and AFMR for a filter are changeable only after the filter is disabled
 | 
			
		||||
* and this routine returns FALSE. The filter can be disabled using the
 | 
			
		||||
* XCanPs_AcceptFilterDisable function.
 | 
			
		||||
*
 | 
			
		||||
* Use the XCanPs_Accept_* functions for configuring the acceptance filters.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XCanPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*		- TRUE if the device is busy and NOT ready to accept writes to
 | 
			
		||||
*		AFIR and AFMR.
 | 
			
		||||
*		- FALSE if the device is ready to accept writes to AFIR and
 | 
			
		||||
*		AFMR.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		int XCanPs_IsAcceptFilterBusy(XCanPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_IsAcceptFilterBusy(InstancePtr) 		\
 | 
			
		||||
	((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), 	\
 | 
			
		||||
		XCANPS_SR_OFFSET) & XCANPS_SR_ACFBSY_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro calculates CAN message identifier value given identifier field
 | 
			
		||||
* values.
 | 
			
		||||
*
 | 
			
		||||
* @param	StandardId contains Standard Message ID value.
 | 
			
		||||
* @param	SubRemoteTransReq contains Substitute Remote Transmission
 | 
			
		||||
*		Request value.
 | 
			
		||||
* @param	IdExtension contains Identifier Extension value.
 | 
			
		||||
* @param	ExtendedId contains Extended Message ID value.
 | 
			
		||||
* @param	RemoteTransReq contains Remote Transmission Request value.
 | 
			
		||||
*
 | 
			
		||||
* @return	Message Identifier value.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		u32 XCanPs_CreateIdValue(u32 StandardId,
 | 
			
		||||
*					u32 SubRemoteTransReq,
 | 
			
		||||
*					u32 IdExtension, u32 ExtendedId,
 | 
			
		||||
*					u32 RemoteTransReq);
 | 
			
		||||
*
 | 
			
		||||
*		Read the CAN specification for meaning of each parameter.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_CreateIdValue(StandardId, SubRemoteTransReq, IdExtension, \
 | 
			
		||||
		ExtendedId, RemoteTransReq) 				\
 | 
			
		||||
 ((((StandardId) << XCANPS_IDR_ID1_SHIFT) & XCANPS_IDR_ID1_MASK) |	\
 | 
			
		||||
 (((SubRemoteTransReq) << XCANPS_IDR_SRR_SHIFT) & XCANPS_IDR_SRR_MASK)|\
 | 
			
		||||
 (((IdExtension) << XCANPS_IDR_IDE_SHIFT) & XCANPS_IDR_IDE_MASK) |	\
 | 
			
		||||
 (((ExtendedId) << XCANPS_IDR_ID2_SHIFT) & XCANPS_IDR_ID2_MASK) |	\
 | 
			
		||||
 ((RemoteTransReq) & XCANPS_IDR_RTR_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro calculates value for Data Length Code register given Data
 | 
			
		||||
* Length Code value.
 | 
			
		||||
*
 | 
			
		||||
* @param	DataLengCode indicates Data Length Code value.
 | 
			
		||||
*
 | 
			
		||||
* @return	Value that can be assigned to Data Length Code register.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		u32 XCanPs_CreateDlcValue(u32 DataLengCode);
 | 
			
		||||
*
 | 
			
		||||
*		Read the CAN specification for meaning of Data Length Code.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_CreateDlcValue(DataLengCode) \
 | 
			
		||||
	(((DataLengCode) << XCANPS_DLCR_DLC_SHIFT) & XCANPS_DLCR_DLC_MASK)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro clears the timestamp in the Timestamp Control Register.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the XCanPs instance.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		void XCanPs_ClearTimestamp(XCanPs *InstancePtr);
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_ClearTimestamp(InstancePtr) 			\
 | 
			
		||||
	XCanPs_WriteReg((InstancePtr)->CanConfig.BaseAddr, 		\
 | 
			
		||||
				XCANPS_TCR_OFFSET, XCANPS_TCR_CTS_MASK)
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions in xcanps.c
 | 
			
		||||
 */
 | 
			
		||||
int XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
 | 
			
		||||
				u32 EffectiveAddr);
 | 
			
		||||
 | 
			
		||||
void XCanPs_Reset(XCanPs *InstancePtr);
 | 
			
		||||
u8 XCanPs_GetMode(XCanPs *InstancePtr);
 | 
			
		||||
void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode);
 | 
			
		||||
u32 XCanPs_GetStatus(XCanPs *InstancePtr);
 | 
			
		||||
void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount,
 | 
			
		||||
				 u8 *TxErrorCount);
 | 
			
		||||
u32 XCanPs_GetBusErrorStatus(XCanPs *InstancePtr);
 | 
			
		||||
void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask);
 | 
			
		||||
int XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr);
 | 
			
		||||
int XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr);
 | 
			
		||||
int XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr);
 | 
			
		||||
void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes);
 | 
			
		||||
void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes);
 | 
			
		||||
u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr);
 | 
			
		||||
int XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex,
 | 
			
		||||
			 u32 MaskValue, u32 IdValue);
 | 
			
		||||
void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex,
 | 
			
		||||
			  u32 *MaskValue, u32 *IdValue);
 | 
			
		||||
 | 
			
		||||
int XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler);
 | 
			
		||||
u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr);
 | 
			
		||||
int XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth,
 | 
			
		||||
			  u8 TimeSegment2, u8 TimeSegment1);
 | 
			
		||||
void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth,
 | 
			
		||||
			   u8 *TimeSegment2, u8 *TimeSegment1);
 | 
			
		||||
 | 
			
		||||
int XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold);
 | 
			
		||||
u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Diagnostic functions in xcanps_selftest.c
 | 
			
		||||
 */
 | 
			
		||||
int XCanPs_SelfTest(XCanPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions in xcanps_intr.c
 | 
			
		||||
 */
 | 
			
		||||
void XCanPs_IntrEnable(XCanPs *InstancePtr, u32 Mask);
 | 
			
		||||
void XCanPs_IntrDisable(XCanPs *InstancePtr, u32 Mask);
 | 
			
		||||
u32 XCanPs_IntrGetEnabled(XCanPs *InstancePtr);
 | 
			
		||||
u32 XCanPs_IntrGetStatus(XCanPs *InstancePtr);
 | 
			
		||||
void XCanPs_IntrClear(XCanPs *InstancePtr, u32 Mask);
 | 
			
		||||
void XCanPs_IntrHandler(void *InstancePtr);
 | 
			
		||||
int XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType,
 | 
			
		||||
			void *CallBackFunc, void *CallBackRef);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions in xcanps_sinit.c
 | 
			
		||||
 */
 | 
			
		||||
XCanPs_Config *XCanPs_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,375 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xcanps_hw.h
 | 
			
		||||
*
 | 
			
		||||
* This header file contains the identifiers and basic driver functions (or
 | 
			
		||||
* macros) that can be used to access the device. Other driver functions
 | 
			
		||||
* are defined in xcanps.h.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who    Date	Changes
 | 
			
		||||
* ----- -----  -------- -----------------------------------------------
 | 
			
		||||
* 1.00a xd/sv  01/12/10 First release
 | 
			
		||||
* 1.01a sbs    12/27/11 Updated the Register/bit definitions
 | 
			
		||||
*                       Changed XCANPS_RXFWIR_RXFLL_MASK to XCANPS_WIR_FW_MASK
 | 
			
		||||
*                       Changed XCANPS_RXWIR_OFFSET to XCANPS_WIR_OFFSET
 | 
			
		||||
*			Added XCANPS_IXR_TXFEMP_MASK for Tx Fifo Empty
 | 
			
		||||
*			Changed XCANPS_IXR_RXFLL_MASK to
 | 
			
		||||
*			XCANPS_IXR_RXFWMFLL_MASK
 | 
			
		||||
* 			Changed
 | 
			
		||||
*			XCANPS_TXBUF_ID_OFFSET to XCANPS_TXHPB_ID_OFFSET
 | 
			
		||||
* 			XCANPS_TXBUF_DLC_OFFSET to XCANPS_TXHPB_DLC_OFFSET
 | 
			
		||||
*			XCANPS_TXBUF_DW1_OFFSET  to XCANPS_TXHPB_DW1_OFFSET
 | 
			
		||||
*			XCANPS_TXBUF_DW2_OFFSET  to XCANPS_TXHPB_DW2_OFFSET
 | 
			
		||||
* 1.02a adk   08/08/13  Updated for inclding the function prototype
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XCANPS_HW_H		/* prevent circular inclusions */
 | 
			
		||||
#define XCANPS_HW_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name Register offsets for the CAN. Each register is 32 bits.
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_SRR_OFFSET	  	0x00 /**< Software Reset Register */
 | 
			
		||||
#define XCANPS_MSR_OFFSET	  	0x04 /**< Mode Select Register */
 | 
			
		||||
#define XCANPS_BRPR_OFFSET	  	0x08 /**< Baud Rate Prescaler */
 | 
			
		||||
#define XCANPS_BTR_OFFSET	  	0x0C /**< Bit Timing Register */
 | 
			
		||||
#define XCANPS_ECR_OFFSET	  	0x10 /**< Error Counter Register */
 | 
			
		||||
#define XCANPS_ESR_OFFSET	  	0x14 /**< Error Status Register */
 | 
			
		||||
#define XCANPS_SR_OFFSET	  	0x18 /**< Status Register */
 | 
			
		||||
 | 
			
		||||
#define XCANPS_ISR_OFFSET	  	0x1C /**< Interrupt Status Register */
 | 
			
		||||
#define XCANPS_IER_OFFSET	  	0x20 /**< Interrupt Enable Register */
 | 
			
		||||
#define XCANPS_ICR_OFFSET	  	0x24 /**< Interrupt Clear Register */
 | 
			
		||||
#define XCANPS_TCR_OFFSET	  	0x28 /**< Timestamp Control Register */
 | 
			
		||||
#define XCANPS_WIR_OFFSET	  	0x2C /**< Watermark Interrupt Reg */
 | 
			
		||||
 | 
			
		||||
#define XCANPS_TXFIFO_ID_OFFSET  	0x30 /**< TX FIFO ID */
 | 
			
		||||
#define XCANPS_TXFIFO_DLC_OFFSET 	0x34 /**< TX FIFO DLC */
 | 
			
		||||
#define XCANPS_TXFIFO_DW1_OFFSET	0x38 /**< TX FIFO Data Word 1 */
 | 
			
		||||
#define XCANPS_TXFIFO_DW2_OFFSET 	0x3C /**< TX FIFO Data Word 2 */
 | 
			
		||||
 | 
			
		||||
#define XCANPS_TXHPB_ID_OFFSET   	0x40 /**< TX High Priority Buffer ID */
 | 
			
		||||
#define XCANPS_TXHPB_DLC_OFFSET  	0x44 /**< TX High Priority Buffer DLC */
 | 
			
		||||
#define XCANPS_TXHPB_DW1_OFFSET  	0x48 /**< TX High Priority Buf Data 1 */
 | 
			
		||||
#define XCANPS_TXHPB_DW2_OFFSET  	0x4C /**< TX High Priority Buf Data Word 2 */
 | 
			
		||||
 | 
			
		||||
#define XCANPS_RXFIFO_ID_OFFSET  	0x50 /**< RX FIFO ID */
 | 
			
		||||
#define XCANPS_RXFIFO_DLC_OFFSET 	0x54 /**< RX FIFO DLC */
 | 
			
		||||
#define XCANPS_RXFIFO_DW1_OFFSET 	0x58 /**< RX FIFO Data Word 1 */
 | 
			
		||||
#define XCANPS_RXFIFO_DW2_OFFSET 	0x5C /**< RX FIFO Data Word 2 */
 | 
			
		||||
 | 
			
		||||
#define XCANPS_AFR_OFFSET	  	0x60 /**< Acceptance Filter Register */
 | 
			
		||||
#define XCANPS_AFMR1_OFFSET	  	0x64 /**< Acceptance Filter Mask 1 */
 | 
			
		||||
#define XCANPS_AFIR1_OFFSET	  	0x68 /**< Acceptance Filter ID  1 */
 | 
			
		||||
#define XCANPS_AFMR2_OFFSET	  	0x6C /**< Acceptance Filter Mask  2 */
 | 
			
		||||
#define XCANPS_AFIR2_OFFSET	  	0x70 /**< Acceptance Filter ID 2 */
 | 
			
		||||
#define XCANPS_AFMR3_OFFSET	  	0x74 /**< Acceptance Filter Mask 3 */
 | 
			
		||||
#define XCANPS_AFIR3_OFFSET	  	0x78 /**< Acceptance Filter ID 3 */
 | 
			
		||||
#define XCANPS_AFMR4_OFFSET	  	0x7C /**< Acceptance Filter Mask  4 */
 | 
			
		||||
#define XCANPS_AFIR4_OFFSET	  	0x80 /**< Acceptance Filter ID 4 */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Software Reset Register (SRR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_SRR_CEN_MASK	0x00000002  /**< Can Enable */
 | 
			
		||||
#define XCANPS_SRR_SRST_MASK	0x00000001  /**< Reset */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Mode Select Register (MSR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_MSR_SNOOP_MASK	0x00000004 /**< Snoop Mode Select */
 | 
			
		||||
#define XCANPS_MSR_LBACK_MASK	0x00000002 /**< Loop Back Mode Select */
 | 
			
		||||
#define XCANPS_MSR_SLEEP_MASK	0x00000001 /**< Sleep Mode Select */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Baud Rate Prescaler register (BRPR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_BRPR_BRP_MASK	0x000000FF /**< Baud Rate Prescaler */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Bit Timing Register (BTR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_BTR_SJW_MASK	0x00000180 /**< Synchronization Jump Width */
 | 
			
		||||
#define XCANPS_BTR_SJW_SHIFT	7
 | 
			
		||||
#define XCANPS_BTR_TS2_MASK	0x00000070 /**< Time Segment 2 */
 | 
			
		||||
#define XCANPS_BTR_TS2_SHIFT	4
 | 
			
		||||
#define XCANPS_BTR_TS1_MASK	0x0000000F /**< Time Segment 1 */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Error Counter Register (ECR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_ECR_REC_MASK	0x0000FF00 /**< Receive Error Counter */
 | 
			
		||||
#define XCANPS_ECR_REC_SHIFT	8
 | 
			
		||||
#define XCANPS_ECR_TEC_MASK	0x000000FF /**< Transmit Error Counter */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Error Status Register (ESR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_ESR_ACKER_MASK	0x00000010 /**< ACK Error */
 | 
			
		||||
#define XCANPS_ESR_BERR_MASK	0x00000008 /**< Bit Error */
 | 
			
		||||
#define XCANPS_ESR_STER_MASK	0x00000004 /**< Stuff Error */
 | 
			
		||||
#define XCANPS_ESR_FMER_MASK	0x00000002 /**< Form Error */
 | 
			
		||||
#define XCANPS_ESR_CRCER_MASK	0x00000001 /**< CRC Error */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Status Register (SR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_SR_SNOOP_MASK	0x00001000 /**< Snoop Mask */
 | 
			
		||||
#define XCANPS_SR_ACFBSY_MASK	0x00000800 /**< Acceptance Filter busy */
 | 
			
		||||
#define XCANPS_SR_TXFLL_MASK	0x00000400 /**< TX FIFO is full */
 | 
			
		||||
#define XCANPS_SR_TXBFLL_MASK	0x00000200 /**< TX High Priority Buffer full */
 | 
			
		||||
#define XCANPS_SR_ESTAT_MASK	0x00000180 /**< Error Status */
 | 
			
		||||
#define XCANPS_SR_ESTAT_SHIFT	7
 | 
			
		||||
#define XCANPS_SR_ERRWRN_MASK	0x00000040 /**< Error Warning */
 | 
			
		||||
#define XCANPS_SR_BBSY_MASK	0x00000020 /**< Bus Busy */
 | 
			
		||||
#define XCANPS_SR_BIDLE_MASK	0x00000010 /**< Bus Idle */
 | 
			
		||||
#define XCANPS_SR_NORMAL_MASK	0x00000008 /**< Normal Mode */
 | 
			
		||||
#define XCANPS_SR_SLEEP_MASK	0x00000004 /**< Sleep Mode */
 | 
			
		||||
#define XCANPS_SR_LBACK_MASK	0x00000002 /**< Loop Back Mode */
 | 
			
		||||
#define XCANPS_SR_CONFIG_MASK	0x00000001 /**< Configuration Mode */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Interrupt Status/Enable/Clear Register Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_IXR_TXFEMP_MASK   0x00004000 /**< Tx Fifo Empty Interrupt */
 | 
			
		||||
#define XCANPS_IXR_TXFWMEMP_MASK 0x00002000 /**< Tx Fifo Watermark Empty */
 | 
			
		||||
#define XCANPS_IXR_RXFWMFLL_MASK 0x00001000 /**< Rx FIFO Watermark Full */
 | 
			
		||||
#define XCANPS_IXR_WKUP_MASK	0x00000800 /**< Wake up Interrupt */
 | 
			
		||||
#define XCANPS_IXR_SLP_MASK	0x00000400 /**< Sleep Interrupt */
 | 
			
		||||
#define XCANPS_IXR_BSOFF_MASK	0x00000200 /**< Bus Off Interrupt */
 | 
			
		||||
#define XCANPS_IXR_ERROR_MASK	0x00000100 /**< Error Interrupt */
 | 
			
		||||
#define XCANPS_IXR_RXNEMP_MASK	0x00000080 /**< RX FIFO Not Empty Interrupt */
 | 
			
		||||
#define XCANPS_IXR_RXOFLW_MASK	0x00000040 /**< RX FIFO Overflow Interrupt */
 | 
			
		||||
#define XCANPS_IXR_RXUFLW_MASK	0x00000020 /**< RX FIFO Underflow Interrupt */
 | 
			
		||||
#define XCANPS_IXR_RXOK_MASK	0x00000010 /**< New Message Received Intr */
 | 
			
		||||
#define XCANPS_IXR_TXBFLL_MASK	0x00000008 /**< TX High Priority Buf Full */
 | 
			
		||||
#define XCANPS_IXR_TXFLL_MASK	0x00000004 /**< TX FIFO Full Interrupt */
 | 
			
		||||
#define XCANPS_IXR_TXOK_MASK	0x00000002 /**< TX Successful Interrupt */
 | 
			
		||||
#define XCANPS_IXR_ARBLST_MASK	0x00000001 /**< Arbitration Lost Interrupt */
 | 
			
		||||
#define XCANPS_IXR_ALL		(XCANPS_IXR_RXFWMFLL_MASK | \
 | 
			
		||||
				XCANPS_IXR_WKUP_MASK   | \
 | 
			
		||||
				XCANPS_IXR_SLP_MASK	| \
 | 
			
		||||
				XCANPS_IXR_BSOFF_MASK  | \
 | 
			
		||||
				XCANPS_IXR_ERROR_MASK  | \
 | 
			
		||||
				XCANPS_IXR_RXNEMP_MASK | \
 | 
			
		||||
 				XCANPS_IXR_RXOFLW_MASK | \
 | 
			
		||||
				XCANPS_IXR_RXUFLW_MASK | \
 | 
			
		||||
	 			XCANPS_IXR_RXOK_MASK   | \
 | 
			
		||||
				XCANPS_IXR_TXBFLL_MASK | \
 | 
			
		||||
				XCANPS_IXR_TXFLL_MASK  | \
 | 
			
		||||
				XCANPS_IXR_TXOK_MASK   | \
 | 
			
		||||
				XCANPS_IXR_ARBLST_MASK)
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN Timestamp Control Register (TCR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_TCR_CTS_MASK	0x00000001 /**< Clear Timestamp counter mask */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN Watermark Register (WIR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_WIR_FW_MASK   	0x0000003F /**< Rx Full Threshold mask */
 | 
			
		||||
#define XCANPS_WIR_EW_MASK 	0x00003F00 /**< Tx Empty Threshold mask */
 | 
			
		||||
#define XCANPS_WIR_EW_SHIFT 	0x00000008 /**< Tx Empty Threshold shift */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN Frame Identifier (TX High Priority Buffer/TX/RX/Acceptance Filter
 | 
			
		||||
				Mask/Acceptance Filter ID)
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_IDR_ID1_MASK	0xFFE00000 /**< Standard Messg Identifier */
 | 
			
		||||
#define XCANPS_IDR_ID1_SHIFT	21
 | 
			
		||||
#define XCANPS_IDR_SRR_MASK	0x00100000 /**< Substitute Remote TX Req */
 | 
			
		||||
#define XCANPS_IDR_SRR_SHIFT	20
 | 
			
		||||
#define XCANPS_IDR_IDE_MASK	0x00080000 /**< Identifier Extension */
 | 
			
		||||
#define XCANPS_IDR_IDE_SHIFT	19
 | 
			
		||||
#define XCANPS_IDR_ID2_MASK	0x0007FFFE /**< Extended Message Ident */
 | 
			
		||||
#define XCANPS_IDR_ID2_SHIFT	1
 | 
			
		||||
#define XCANPS_IDR_RTR_MASK	0x00000001 /**< Remote TX Request */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN Frame Data Length Code (TX High Priority Buffer/TX/RX)
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_DLCR_DLC_MASK	 0xF0000000	/**< Data Length Code */
 | 
			
		||||
#define XCANPS_DLCR_DLC_SHIFT	 28
 | 
			
		||||
#define XCANPS_DLCR_TIMESTAMP_MASK 0x0000FFFF	/**< Timestamp Mask (Rx only) */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN Frame Data Word 1 (TX High Priority Buffer/TX/RX)
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_DW1R_DB0_MASK	0xFF000000 /**< Data Byte 0 */
 | 
			
		||||
#define XCANPS_DW1R_DB0_SHIFT	24
 | 
			
		||||
#define XCANPS_DW1R_DB1_MASK	0x00FF0000 /**< Data Byte 1 */
 | 
			
		||||
#define XCANPS_DW1R_DB1_SHIFT	16
 | 
			
		||||
#define XCANPS_DW1R_DB2_MASK	0x0000FF00 /**< Data Byte 2 */
 | 
			
		||||
#define XCANPS_DW1R_DB2_SHIFT	8
 | 
			
		||||
#define XCANPS_DW1R_DB3_MASK	0x000000FF /**< Data Byte 3 */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN Frame Data Word 2 (TX High Priority Buffer/TX/RX)
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_DW2R_DB4_MASK	0xFF000000 /**< Data Byte 4 */
 | 
			
		||||
#define XCANPS_DW2R_DB4_SHIFT	24
 | 
			
		||||
#define XCANPS_DW2R_DB5_MASK	0x00FF0000 /**< Data Byte 5 */
 | 
			
		||||
#define XCANPS_DW2R_DB5_SHIFT	16
 | 
			
		||||
#define XCANPS_DW2R_DB6_MASK	0x0000FF00 /**< Data Byte 6 */
 | 
			
		||||
#define XCANPS_DW2R_DB6_SHIFT	8
 | 
			
		||||
#define XCANPS_DW2R_DB7_MASK	0x000000FF /**< Data Byte 7 */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Acceptance Filter Register (AFR) Bit Definitions and Masks
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_AFR_UAF4_MASK	0x00000008 /**< Use Acceptance Filter No.4 */
 | 
			
		||||
#define XCANPS_AFR_UAF3_MASK	0x00000004 /**< Use Acceptance Filter No.3 */
 | 
			
		||||
#define XCANPS_AFR_UAF2_MASK	0x00000002 /**< Use Acceptance Filter No.2 */
 | 
			
		||||
#define XCANPS_AFR_UAF1_MASK	0x00000001 /**< Use Acceptance Filter No.1 */
 | 
			
		||||
#define XCANPS_AFR_UAF_ALL_MASK	(XCANPS_AFR_UAF4_MASK | \
 | 
			
		||||
					XCANPS_AFR_UAF3_MASK | \
 | 
			
		||||
					XCANPS_AFR_UAF2_MASK | \
 | 
			
		||||
					XCANPS_AFR_UAF1_MASK)
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name CAN frame length constants
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XCANPS_MAX_FRAME_SIZE 16 /**< Maximum CAN frame length in bytes */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/* For backwards compatibilty */
 | 
			
		||||
#define XCANPS_TXBUF_ID_OFFSET   XCANPS_TXHPB_ID_OFFSET
 | 
			
		||||
#define XCANPS_TXBUF_DLC_OFFSET  XCANPS_TXHPB_DLC_OFFSET
 | 
			
		||||
#define XCANPS_TXBUF_DW1_OFFSET  XCANPS_TXHPB_DW1_OFFSET
 | 
			
		||||
#define XCANPS_TXBUF_DW2_OFFSET  XCANPS_TXHPB_DW2_OFFSET
 | 
			
		||||
 | 
			
		||||
#define XCANPS_RXFWIR_RXFLL_MASK XCANPS_WIR_FW_MASK
 | 
			
		||||
#define XCANPS_RXWIR_OFFSET 	 XCANPS_WIR_OFFSET
 | 
			
		||||
#define XCANPS_IXR_RXFLL_MASK 	 XCANPS_IXR_RXFWMFLL_MASK
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro reads the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddr is the base address of the device.
 | 
			
		||||
* @param	RegOffset is the register offset to be read.
 | 
			
		||||
*
 | 
			
		||||
* @return	The 32-bit value of the register
 | 
			
		||||
*
 | 
			
		||||
* @note		None.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_ReadReg(BaseAddr, RegOffset) \
 | 
			
		||||
		Xil_In32((BaseAddr) + (RegOffset))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro writes the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddr is the base address of the device.
 | 
			
		||||
* @param	RegOffset is the register offset to be written.
 | 
			
		||||
* @param	Data is the 32-bit value to write to the register.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		None.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XCanPs_WriteReg(BaseAddr, RegOffset, Data) \
 | 
			
		||||
		Xil_Out32((BaseAddr) + (RegOffset), (Data))
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Perform reset operation to the CanPs interface
 | 
			
		||||
 */
 | 
			
		||||
void XCanPs_ResetHw(u32 BaseAddr);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
/* $Id: xcpu_cortexa9.h,v 1.1.2.1 2011/02/11 09:30:37 kkatna Exp $ */
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2011 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xcpu_cortexa9.h
 | 
			
		||||
*
 | 
			
		||||
* dummy file
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
#ifndef XDEBUG
 | 
			
		||||
#define XDEBUG
 | 
			
		||||
  
 | 
			
		||||
#undef DEBUG
 | 
			
		||||
 | 
			
		||||
#if defined(DEBUG) && !defined(NDEBUG)
 | 
			
		||||
 | 
			
		||||
#ifndef XDEBUG_WARNING
 | 
			
		||||
#define XDEBUG_WARNING
 | 
			
		||||
#warning DEBUG is enabled
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int printf(const char *format, ...);
 | 
			
		||||
 | 
			
		||||
#define XDBG_DEBUG_ERROR             0x00000001    /* error  condition messages */
 | 
			
		||||
#define XDBG_DEBUG_GENERAL           0x00000002    /* general debug  messages */
 | 
			
		||||
#define XDBG_DEBUG_ALL               0xFFFFFFFF    /* all debugging data */
 | 
			
		||||
 | 
			
		||||
#define XDBG_DEBUG_FIFO_REG          0x00000100    /* display register reads/writes */
 | 
			
		||||
#define XDBG_DEBUG_FIFO_RX           0x00000101    /* receive debug messages */
 | 
			
		||||
#define XDBG_DEBUG_FIFO_TX           0x00000102    /* transmit debug messages */
 | 
			
		||||
#define XDBG_DEBUG_FIFO_ALL          0x0000010F    /* all fifo debug messages */
 | 
			
		||||
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_REG         0x00000400    /* display register reads/writes */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_RX          0x00000401    /* receive debug messages */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_TX          0x00000402    /* transmit debug messages */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_ALL         0x0000040F    /* all temac  debug messages */
 | 
			
		||||
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_ADPT_RX     0x00000800    /* receive debug messages */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_ADPT_TX     0x00000801    /* transmit debug messages */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_ADPT_IOCTL  0x00000802    /* ioctl debug messages */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_ADPT_MISC   0x00000803    /* debug msg for other routines */
 | 
			
		||||
#define XDBG_DEBUG_TEMAC_ADPT_ALL    0x0000080F    /* all temac adapter debug messages */
 | 
			
		||||
 | 
			
		||||
#define xdbg_current_types (XDBG_DEBUG_ERROR)
 | 
			
		||||
 | 
			
		||||
#define xdbg_stmnt(x)  x
 | 
			
		||||
 | 
			
		||||
/* In VxWorks, if _WRS_GNU_VAR_MACROS is defined, special syntax is needed for
 | 
			
		||||
 * macros that accept variable number of arguments
 | 
			
		||||
 */
 | 
			
		||||
#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS)
 | 
			
		||||
#define xdbg_printf(type, args...) (((type) & xdbg_current_types) ? printf (## args) : 0)
 | 
			
		||||
#else /* ANSI Syntax */
 | 
			
		||||
#define xdbg_printf(type, ...) (((type) & xdbg_current_types) ? printf (__VA_ARGS__) : 0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#else /* defined(DEBUG) && !defined(NDEBUG) */
 | 
			
		||||
 | 
			
		||||
#define xdbg_stmnt(x)
 | 
			
		||||
 | 
			
		||||
/* See VxWorks comments above */
 | 
			
		||||
#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS)
 | 
			
		||||
#define xdbg_printf(type, args...)
 | 
			
		||||
#else /* ANSI Syntax */
 | 
			
		||||
#define xdbg_printf(...)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* defined(DEBUG) && !defined(NDEBUG) */
 | 
			
		||||
 | 
			
		||||
#endif /* XDEBUG */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,389 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-14 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xdevcfg.h
 | 
			
		||||
*
 | 
			
		||||
* The is the main header file for the Device Configuration Interface of the Zynq
 | 
			
		||||
* device. The device configuration interface has three main functionality.
 | 
			
		||||
*  1. AXI-PCAP
 | 
			
		||||
*  2. Security Policy
 | 
			
		||||
*  3. XADC
 | 
			
		||||
* This current version of the driver supports only the AXI-PCAP and Security
 | 
			
		||||
* Policy blocks. There is a separate driver for XADC.
 | 
			
		||||
*
 | 
			
		||||
* AXI-PCAP is used for download/upload an encrypted or decrypted bitstream.
 | 
			
		||||
* DMA embedded in the AXI PCAP provides the master interface to
 | 
			
		||||
* the Device configuration block for any DMA transfers. The data transfer can
 | 
			
		||||
* take place between the Tx/RxFIFOs of AXI-PCAP and memory (on chip
 | 
			
		||||
* RAM/DDR/peripheral memory).
 | 
			
		||||
*
 | 
			
		||||
* The current driver only supports the downloading the FPGA bitstream and
 | 
			
		||||
* readback of the decrypted image (sort of loopback).
 | 
			
		||||
* The driver does not know what information needs to be written to the FPGA to
 | 
			
		||||
* readback FPGA configuration register or memory data. The application above the
 | 
			
		||||
* driver should take care of creating the data that needs to be downloaded to
 | 
			
		||||
* the FPGA so that the bitstream can be readback.
 | 
			
		||||
* This driver also does not support the reading of the internal registers of the
 | 
			
		||||
* PCAP. The driver has no knowledge of the PCAP internals.
 | 
			
		||||
*
 | 
			
		||||
* <b> Initialization and Configuration </b>
 | 
			
		||||
*
 | 
			
		||||
* The device driver enables higher layer software (e.g., an application) to
 | 
			
		||||
* communicate with the Device Configuration device.
 | 
			
		||||
*
 | 
			
		||||
* XDcfg_CfgInitialize() API is used to initialize the Device Configuration
 | 
			
		||||
* Interface. The user needs to first call the XDcfg_LookupConfig() API which
 | 
			
		||||
* returns the Configuration structure pointer which is passed as a parameter to
 | 
			
		||||
* the XDcfg_CfgInitialize() API.
 | 
			
		||||
*
 | 
			
		||||
* <b>Interrupts</b>
 | 
			
		||||
* The Driver implements an interrupt handler to support the interrupts provided
 | 
			
		||||
* by this interface.
 | 
			
		||||
*
 | 
			
		||||
* <b> Threads </b>
 | 
			
		||||
*
 | 
			
		||||
* This driver is not thread safe. Any needs for threads or thread mutual
 | 
			
		||||
* exclusion must be satisfied by the layer above this driver.
 | 
			
		||||
*
 | 
			
		||||
* <b> Asserts </b>
 | 
			
		||||
*
 | 
			
		||||
* Asserts are used within all Xilinx drivers to enforce constraints on argument
 | 
			
		||||
* values. Asserts can be turned off on a system-wide basis by defining, at
 | 
			
		||||
* compile time, the NDEBUG identifier. By default, asserts are turned on and it
 | 
			
		||||
* is recommended that users leave asserts on during development.
 | 
			
		||||
*
 | 
			
		||||
* <b> Building the driver </b>
 | 
			
		||||
*
 | 
			
		||||
* The XDcfg driver is composed of several source files. This allows the user
 | 
			
		||||
* to build and link only those parts of the driver that are necessary.
 | 
			
		||||
*
 | 
			
		||||
* <br><br>
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who Date     Changes
 | 
			
		||||
* ----- --- -------- ---------------------------------------------
 | 
			
		||||
* 1.00a hvm 02/07/11 First release
 | 
			
		||||
* 2.00a nm  05/31/12 Updated the driver for CR 660835 so that input length for
 | 
			
		||||
*		     source/destination to the XDcfg_InitiateDma, XDcfg_Transfer
 | 
			
		||||
*		     APIs is words (32 bit) and not bytes.
 | 
			
		||||
* 		     Updated the notes for XDcfg_InitiateDma/XDcfg_Transfer APIs
 | 
			
		||||
*		     to add information that 2 LSBs of the Source/Destination
 | 
			
		||||
*		     address when equal to 2’b01 indicate the last DMA command
 | 
			
		||||
*		     of an overall transfer.
 | 
			
		||||
*		     Destination Address passed to this API for secure transfers
 | 
			
		||||
*		     instead of using 0xFFFFFFFF for CR 662197. This issue was
 | 
			
		||||
*		     resulting in the failure of secure transfers of
 | 
			
		||||
*		     non-bitstream images.
 | 
			
		||||
* 2.01a nm  07/07/12 Updated the XDcfg_IntrClear function to directly
 | 
			
		||||
*		     set the mask instead of oring it with the
 | 
			
		||||
*		     value read from the interrupt status register
 | 
			
		||||
* 		     Added defines for the PS Version bits,
 | 
			
		||||
*	             removed the FIFO Flush bits from the
 | 
			
		||||
*		     Miscellaneous Control Reg.
 | 
			
		||||
*		     Added XDcfg_GetPsVersion, XDcfg_SelectIcapInterface
 | 
			
		||||
*		     and XDcfg_SelectPcapInterface APIs for CR 643295
 | 
			
		||||
*		     The user has to call the XDcfg_SelectIcapInterface API
 | 
			
		||||
*		     for the PL reconfiguration using AXI HwIcap.
 | 
			
		||||
*		     Updated the XDcfg_Transfer API to clear the
 | 
			
		||||
*		     QUARTER_PCAP_RATE_EN bit in the control register for
 | 
			
		||||
*		     non secure writes for CR 675543.
 | 
			
		||||
* 2.02a nm  01/31/13 Fixed CR# 679335.
 | 
			
		||||
* 		     Added Setting and Clearing the internal PCAP loopback.
 | 
			
		||||
*		     Removed code for enabling/disabling AES engine as BootROM
 | 
			
		||||
*		     locks down this setting.
 | 
			
		||||
*		     Fixed CR# 681976.
 | 
			
		||||
*		     Skip Checking the PCFG_INIT in case of non-secure DMA
 | 
			
		||||
*		     loopback.
 | 
			
		||||
*		     Fixed CR# 699558.
 | 
			
		||||
*		     XDcfg_Transfer fails to transfer data in loopback mode.
 | 
			
		||||
*		     Fixed CR# 701348.
 | 
			
		||||
*                    Peripheral test fails with  Running
 | 
			
		||||
* 		     DcfgSelfTestExample() in SECURE bootmode.
 | 
			
		||||
* 2.03a nm  04/19/13 Fixed CR# 703728.
 | 
			
		||||
*		     Updated the register definitions as per the latest TRM
 | 
			
		||||
*		     version UG585 (v1.4) November 16, 2012.
 | 
			
		||||
* 3.0   adk 10/12/13 Updated as per the New Tcl API's
 | 
			
		||||
* 3.0   kpc 21/02/14 Added function prototype for XDcfg_ClearControlRegister
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#ifndef XDCFG_H		/* prevent circular inclusions */
 | 
			
		||||
#define XDCFG_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xdevcfg_hw.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/* Types of PCAP transfers */
 | 
			
		||||
 | 
			
		||||
#define XDCFG_NON_SECURE_PCAP_WRITE		1
 | 
			
		||||
#define XDCFG_SECURE_PCAP_WRITE			2
 | 
			
		||||
#define XDCFG_PCAP_READBACK			3
 | 
			
		||||
#define XDCFG_CONCURRENT_SECURE_READ_WRITE	4
 | 
			
		||||
#define XDCFG_CONCURRENT_NONSEC_READ_WRITE	5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
/**
 | 
			
		||||
* The handler data type allows the user to define a callback function to
 | 
			
		||||
* respond to interrupt events in the system. This function is executed
 | 
			
		||||
* in interrupt context, so amount of processing should be minimized.
 | 
			
		||||
*
 | 
			
		||||
* @param	CallBackRef is the callback reference passed in by the upper
 | 
			
		||||
*		layer when setting the callback functions, and passed back to
 | 
			
		||||
*		the upper layer when the callback is invoked. Its type is
 | 
			
		||||
*		unimportant to the driver component, so it is a void pointer.
 | 
			
		||||
* @param	Status is the Interrupt status of the XDcfg device.
 | 
			
		||||
*/
 | 
			
		||||
typedef void (*XDcfg_IntrHandler) (void *CallBackRef, u32 Status);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for the device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16 DeviceId;		/**< Unique ID of device */
 | 
			
		||||
	u32 BaseAddr;		/**< Base address of the device */
 | 
			
		||||
} XDcfg_Config;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XDcfg driver instance data.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XDcfg_Config Config;	/**< Hardware Configuration */
 | 
			
		||||
	u32 IsReady;		/**< Device is initialized and ready */
 | 
			
		||||
	u32 IsStarted;		/**< Device Configuration Interface
 | 
			
		||||
				  * is running
 | 
			
		||||
				  */
 | 
			
		||||
	XDcfg_IntrHandler StatusHandler;  /* Event handler function */
 | 
			
		||||
	void *CallBackRef;	/* Callback reference for event handler */
 | 
			
		||||
} XDcfg;
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Unlock the Device Config Interface block.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the instance of XDcfg driver.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		void XDcfg_Unlock(XDcfg* InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_Unlock(InstancePtr)					\
 | 
			
		||||
	XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, 			\
 | 
			
		||||
	XDCFG_UNLOCK_OFFSET, XDCFG_UNLOCK_DATA)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Get the version number of the PS from the Miscellaneous Control Register.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the instance of XDcfg driver.
 | 
			
		||||
*
 | 
			
		||||
* @return	Version of the PS.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		void XDcfg_GetPsVersion(XDcfg* InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_GetPsVersion(InstancePtr)					\
 | 
			
		||||
	((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, 		\
 | 
			
		||||
			XDCFG_MCTRL_OFFSET)) & 				\
 | 
			
		||||
			XDCFG_MCTRL_PCAP_PS_VERSION_MASK) >> 		\
 | 
			
		||||
			XDCFG_MCTRL_PCAP_PS_VERSION_SHIFT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Read the multiboot config register value.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the instance of XDcfg driver.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		u32 XDcfg_ReadMultiBootConfig(XDcfg* InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_ReadMultiBootConfig(InstancePtr)			\
 | 
			
		||||
	XDcfg_ReadReg((InstancePtr)->Config.BaseAddr + 		\
 | 
			
		||||
			XDCFG_MULTIBOOT_ADDR_OFFSET)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Selects ICAP interface for reconfiguration after the initial configuration
 | 
			
		||||
* of the PL.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the instance of XDcfg driver.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		void XDcfg_SelectIcapInterface(XDcfg* InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_SelectIcapInterface(InstancePtr)				  \
 | 
			
		||||
	XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET,   \
 | 
			
		||||
	((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET)) \
 | 
			
		||||
	& ( ~XDCFG_CTRL_PCAP_PR_MASK)))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Selects PCAP interface for reconfiguration after the initial configuration
 | 
			
		||||
* of the PL.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is a pointer to the instance of XDcfg driver.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		void XDcfg_SelectPcapInterface(XDcfg* InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_SelectPcapInterface(InstancePtr)				   \
 | 
			
		||||
	XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET,    \
 | 
			
		||||
	((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET))  \
 | 
			
		||||
	| XDCFG_CTRL_PCAP_PR_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Lookup configuration in xdevcfg_sinit.c.
 | 
			
		||||
 */
 | 
			
		||||
XDcfg_Config *XDcfg_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Selftest function in xdevcfg_selftest.c
 | 
			
		||||
 */
 | 
			
		||||
int XDcfg_SelfTest(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interface functions in xdevcfg.c
 | 
			
		||||
 */
 | 
			
		||||
int XDcfg_CfgInitialize(XDcfg *InstancePtr,
 | 
			
		||||
			 XDcfg_Config *ConfigPtr, u32 EffectiveAddress);
 | 
			
		||||
 | 
			
		||||
void XDcfg_EnablePCAP(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_DisablePCAP(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetControlRegister(XDcfg *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
void XDcfg_ClearControlRegister(XDcfg *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_GetControlRegister(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetLockRegister(XDcfg *InstancePtr, u32 Data);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_GetLockRegister(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetConfigRegister(XDcfg *InstancePtr, u32 Data);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_GetConfigRegister(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetStatusRegister(XDcfg *InstancePtr, u32 Data);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_GetStatusRegister(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetRomShadowRegister(XDcfg *InstancePtr, u32 Data);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_GetSoftwareIdRegister(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetMiscControlRegister(XDcfg *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_GetMiscControlRegister(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_IsDmaBusy(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_InitiateDma(XDcfg *InstancePtr, u32 SourcePtr, u32 DestPtr,
 | 
			
		||||
				u32 SrcWordLength, u32 DestWordLength);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_Transfer(XDcfg *InstancePtr,
 | 
			
		||||
				void *SourcePtr, u32 SrcWordLength,
 | 
			
		||||
				void *DestPtr, u32 DestWordLength,
 | 
			
		||||
				u32 TransferType);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interrupt related function prototypes implemented in xdevcfg_intr.c
 | 
			
		||||
 */
 | 
			
		||||
void XDcfg_IntrEnable(XDcfg *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
void XDcfg_IntrDisable(XDcfg *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_IntrGetEnabled(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
u32 XDcfg_IntrGetStatus(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_IntrClear(XDcfg *InstancePtr, u32 Mask);
 | 
			
		||||
 | 
			
		||||
void XDcfg_InterruptHandler(XDcfg *InstancePtr);
 | 
			
		||||
 | 
			
		||||
void XDcfg_SetHandler(XDcfg *InstancePtr, void *CallBackFunc,
 | 
			
		||||
				void *CallBackRef);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif	/* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,401 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-14 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xdevcfg_hw.h
 | 
			
		||||
*
 | 
			
		||||
* This file contains the hardware interface to the Device Config Interface.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who Date     Changes
 | 
			
		||||
* ----- --- -------- ---------------------------------------------
 | 
			
		||||
* 1.00a hvm 02/07/11 First release
 | 
			
		||||
* 2.01a nm  08/01/12 Added defines for the PS Version bits,
 | 
			
		||||
*	             removed the FIFO Flush bits from the
 | 
			
		||||
*		     Miscellaneous Control Reg
 | 
			
		||||
* 2.03a nm  04/19/13 Fixed CR# 703728.
 | 
			
		||||
*		     Updated the register definitions as per the latest TRM
 | 
			
		||||
*		     version UG585 (v1.4) November 16, 2012.
 | 
			
		||||
* 2.04a	kpc	10/07/13 Added function prototype.	
 | 
			
		||||
* 3.00a	kpc	25/02/14 Corrected the XDCFG_BASE_ADDRESS macro value.
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#ifndef XDCFG_HW_H		/* prevent circular inclusions */
 | 
			
		||||
#define XDCFG_HW_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name Register Map
 | 
			
		||||
 * Offsets of registers from the start of the device
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XDCFG_CTRL_OFFSET		0x00 /**< Control Register */
 | 
			
		||||
#define XDCFG_LOCK_OFFSET		0x04 /**< Lock Register */
 | 
			
		||||
#define XDCFG_CFG_OFFSET		0x08 /**< Configuration Register */
 | 
			
		||||
#define XDCFG_INT_STS_OFFSET		0x0C /**< Interrupt Status Register */
 | 
			
		||||
#define XDCFG_INT_MASK_OFFSET		0x10 /**< Interrupt Mask Register */
 | 
			
		||||
#define XDCFG_STATUS_OFFSET		0x14 /**< Status Register */
 | 
			
		||||
#define XDCFG_DMA_SRC_ADDR_OFFSET	0x18 /**< DMA Source Address Register */
 | 
			
		||||
#define XDCFG_DMA_DEST_ADDR_OFFSET	0x1C /**< DMA Destination Address Reg */
 | 
			
		||||
#define XDCFG_DMA_SRC_LEN_OFFSET	0x20 /**< DMA Source Transfer Length */
 | 
			
		||||
#define XDCFG_DMA_DEST_LEN_OFFSET	0x24 /**< DMA Destination Transfer */
 | 
			
		||||
#define XDCFG_ROM_SHADOW_OFFSET		0x28 /**< DMA ROM Shadow Register */
 | 
			
		||||
#define XDCFG_MULTIBOOT_ADDR_OFFSET	0x2C /**< Multi BootAddress Pointer */
 | 
			
		||||
#define XDCFG_SW_ID_OFFSET		0x30 /**< Software ID Register */
 | 
			
		||||
#define XDCFG_UNLOCK_OFFSET		0x34 /**< Unlock Register */
 | 
			
		||||
#define XDCFG_MCTRL_OFFSET		0x80 /**< Miscellaneous Control Reg */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Control Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XDCFG_CTRL_FORCE_RST_MASK	0x80000000 /**< Force  into
 | 
			
		||||
						     * Secure Reset
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_PCFG_PROG_B_MASK	0x40000000 /**< Program signal to
 | 
			
		||||
						     *  Reset FPGA
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_PCFG_POR_CNT_4K_MASK	0x20000000 /**< Control PL POR timer */
 | 
			
		||||
#define XDCFG_CTRL_PCAP_PR_MASK	  	0x08000000 /**< Enable PCAP for PR */
 | 
			
		||||
#define XDCFG_CTRL_PCAP_MODE_MASK	0x04000000 /**< Enable PCAP */
 | 
			
		||||
#define XDCFG_CTRL_PCAP_RATE_EN_MASK	0x02000000 /**< Enable PCAP send data
 | 
			
		||||
						     *  to FPGA every 4 PCAP
 | 
			
		||||
						     *  cycles
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_MULTIBOOT_EN_MASK	0x01000000 /**< Multiboot Enable */
 | 
			
		||||
#define XDCFG_CTRL_JTAG_CHAIN_DIS_MASK	0x00800000 /**< JTAG Chain Disable */
 | 
			
		||||
#define XDCFG_CTRL_USER_MODE_MASK	0x00008000 /**< User Mode Mask */
 | 
			
		||||
#define XDCFG_CTRL_PCFG_AES_FUSE_MASK	0x00001000 /**< AES key source */
 | 
			
		||||
#define XDCFG_CTRL_PCFG_AES_EN_MASK	0x00000E00 /**< AES Enable Mask */
 | 
			
		||||
#define XDCFG_CTRL_SEU_EN_MASK		0x00000100 /**< SEU Enable Mask */
 | 
			
		||||
#define XDCFG_CTRL_SEC_EN_MASK		0x00000080 /**< Secure/Non Secure
 | 
			
		||||
						     *  Status mask
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_SPNIDEN_MASK		0x00000040 /**< Secure Non Invasive
 | 
			
		||||
						     *  Debug Enable
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_SPIDEN_MASK		0x00000020 /**< Secure Invasive
 | 
			
		||||
						     *  Debug Enable
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_NIDEN_MASK		0x00000010 /**< Non-Invasive Debug
 | 
			
		||||
						     *  Enable
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_DBGEN_MASK		0x00000008 /**< Invasive Debug
 | 
			
		||||
						     *  Enable
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CTRL_DAP_EN_MASK		0x00000007 /**< DAP Enable Mask */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Lock register bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XDCFG_LOCK_AES_EFUSE_MASK	0x00000010 /**< Lock AES Efuse bit */
 | 
			
		||||
#define XDCFG_LOCK_AES_EN_MASK		0x00000008 /**< Lock AES_EN update */
 | 
			
		||||
#define XDCFG_LOCK_SEU_MASK		0x00000004 /**< Lock SEU_En update */
 | 
			
		||||
#define XDCFG_LOCK_SEC_MASK		0x00000002 /**< Lock SEC_EN and
 | 
			
		||||
						     *  USER_MODE
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_LOCK_DBG_MASK		0x00000001 /**< This bit locks
 | 
			
		||||
						     *  security config
 | 
			
		||||
						     *  including: DAP_En,
 | 
			
		||||
						     *  DBGEN,,
 | 
			
		||||
						     *  NIDEN, SPNIEN
 | 
			
		||||
						     */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Config Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XDCFG_CFG_RFIFO_TH_MASK	  	0x00000C00 /**< Read FIFO
 | 
			
		||||
						     *  Threshold Mask
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CFG_WFIFO_TH_MASK	  	0x00000300 /**< Write FIFO Threshold
 | 
			
		||||
						     *  Mask
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CFG_RCLK_EDGE_MASK	0x00000080 /**< Read data active
 | 
			
		||||
						     *  clock edge
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CFG_WCLK_EDGE_MASK	0x00000040 /**< Write data active
 | 
			
		||||
						     *  clock edge
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CFG_DISABLE_SRC_INC_MASK	0x00000020 /**< Disable Source address
 | 
			
		||||
						     *  increment mask
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_CFG_DISABLE_DST_INC_MASK	0x00000010 /**< Disable Destination
 | 
			
		||||
						     *  address increment
 | 
			
		||||
						     *  mask
 | 
			
		||||
						     */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Interrupt Status/Mask Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XDCFG_IXR_PSS_GTS_USR_B_MASK	0x80000000 /**< Tri-state IO during
 | 
			
		||||
						     *  HIZ
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_PSS_FST_CFG_B_MASK	0x40000000 /**< First configuration
 | 
			
		||||
						     *  done
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_PSS_GPWRDWN_B_MASK	0x20000000 /**< Global power down */
 | 
			
		||||
#define XDCFG_IXR_PSS_GTS_CFG_B_MASK	0x10000000 /**< Tri-state IO during
 | 
			
		||||
						     *  configuration
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_PSS_CFG_RESET_B_MASK	0x08000000 /**< PL configuration
 | 
			
		||||
						     *  reset
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_AXI_WTO_MASK		0x00800000 /**< AXI Write Address
 | 
			
		||||
						     *  or Data or response
 | 
			
		||||
						     *  timeout
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_AXI_WERR_MASK		0x00400000 /**< AXI Write response
 | 
			
		||||
						     *  error
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_AXI_RTO_MASK		0x00200000 /**< AXI Read Address or
 | 
			
		||||
						     *  response timeout
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_AXI_RERR_MASK		0x00100000 /**< AXI Read response
 | 
			
		||||
						     *  error
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_RX_FIFO_OV_MASK	0x00040000 /**< Rx FIFO Overflow */
 | 
			
		||||
#define XDCFG_IXR_WR_FIFO_LVL_MASK	0x00020000 /**< Tx FIFO less than
 | 
			
		||||
						     *  threshold */
 | 
			
		||||
#define XDCFG_IXR_RD_FIFO_LVL_MASK	0x00010000 /**< Rx FIFO greater than
 | 
			
		||||
						     *  threshold */
 | 
			
		||||
#define XDCFG_IXR_DMA_CMD_ERR_MASK	0x00008000 /**< Illegal DMA command */
 | 
			
		||||
#define XDCFG_IXR_DMA_Q_OV_MASK		0x00004000 /**< DMA command queue
 | 
			
		||||
						     *  overflow
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_DMA_DONE_MASK		0x00002000 /**< DMA Command Done */
 | 
			
		||||
#define XDCFG_IXR_D_P_DONE_MASK		0x00001000 /**< DMA and PCAP
 | 
			
		||||
						     *  transfers Done
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_P2D_LEN_ERR_MASK	0x00000800 /**< PCAP to DMA transfer
 | 
			
		||||
						     *  length error
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_PCFG_HMAC_ERR_MASK	0x00000040 /**< HMAC error mask */
 | 
			
		||||
#define XDCFG_IXR_PCFG_SEU_ERR_MASK	0x00000020 /**< SEU Error mask */
 | 
			
		||||
#define XDCFG_IXR_PCFG_POR_B_MASK	0x00000010 /**< FPGA POR mask */
 | 
			
		||||
#define XDCFG_IXR_PCFG_CFG_RST_MASK	0x00000008 /**< FPGA Reset mask */
 | 
			
		||||
#define XDCFG_IXR_PCFG_DONE_MASK	0x00000004 /**< Done Signal  Mask */
 | 
			
		||||
#define XDCFG_IXR_PCFG_INIT_PE_MASK	0x00000002 /**< Detect Positive edge
 | 
			
		||||
						     *  of Init Signal
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_PCFG_INIT_NE_MASK  	0x00000001 /**< Detect Negative edge
 | 
			
		||||
						     *  of Init Signal
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_IXR_ERROR_FLAGS_MASK		(XDCFG_IXR_AXI_WTO_MASK | \
 | 
			
		||||
						XDCFG_IXR_AXI_WERR_MASK | \
 | 
			
		||||
						XDCFG_IXR_AXI_RTO_MASK |  \
 | 
			
		||||
						XDCFG_IXR_AXI_RERR_MASK | \
 | 
			
		||||
						XDCFG_IXR_RX_FIFO_OV_MASK | \
 | 
			
		||||
						XDCFG_IXR_DMA_CMD_ERR_MASK |\
 | 
			
		||||
						XDCFG_IXR_DMA_Q_OV_MASK |   \
 | 
			
		||||
						XDCFG_IXR_P2D_LEN_ERR_MASK |\
 | 
			
		||||
						XDCFG_IXR_PCFG_HMAC_ERR_MASK)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define XDCFG_IXR_ALL_MASK			0x00F7F8EF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Status Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XDCFG_STATUS_DMA_CMD_Q_F_MASK	0x80000000 /**< DMA command
 | 
			
		||||
						     *  Queue full
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_STATUS_DMA_CMD_Q_E_MASK	0x40000000 /**< DMA command
 | 
			
		||||
						     *  Queue empty
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_STATUS_DMA_DONE_CNT_MASK	0x30000000 /**< Number of
 | 
			
		||||
						     *  completed DMA
 | 
			
		||||
						     *  transfers
 | 
			
		||||
						     */
 | 
			
		||||
#define XDCFG_STATUS_RX_FIFO_LVL_MASK	0x01F000000 /**< Rx FIFO level */
 | 
			
		||||
#define XDCFG_STATUS_TX_FIFO_LVL_MASK	0x0007F000  /**< Tx FIFO level */
 | 
			
		||||
 | 
			
		||||
#define XDCFG_STATUS_PSS_GTS_USR_B	0x00000800  /**< Tri-state IO
 | 
			
		||||
						      *  during HIZ
 | 
			
		||||
						      */
 | 
			
		||||
#define XDCFG_STATUS_PSS_FST_CFG_B	0x00000400  /**< First PL config
 | 
			
		||||
						      *  done
 | 
			
		||||
						      */
 | 
			
		||||
#define XDCFG_STATUS_PSS_GPWRDWN_B	0x00000200  /**< Global power down */
 | 
			
		||||
#define XDCFG_STATUS_PSS_GTS_CFG_B	0x00000100  /**< Tri-state IO during
 | 
			
		||||
						      *  config
 | 
			
		||||
						      */
 | 
			
		||||
#define XDCFG_STATUS_SECURE_RST_MASK	0x00000080  /**< Secure Reset
 | 
			
		||||
						      *  POR Status
 | 
			
		||||
						      */
 | 
			
		||||
#define XDCFG_STATUS_ILLEGAL_APB_ACCESS_MASK 	0x00000040 /**< Illegal APB
 | 
			
		||||
							     *  access
 | 
			
		||||
						  	     */
 | 
			
		||||
#define XDCFG_STATUS_PSS_CFG_RESET_B		0x00000020 /**< PL config
 | 
			
		||||
							     *  reset status
 | 
			
		||||
							     */
 | 
			
		||||
#define XDCFG_STATUS_PCFG_INIT_MASK		0x00000010 /**< FPGA Init
 | 
			
		||||
							     *  Status
 | 
			
		||||
							     */
 | 
			
		||||
#define XDCFG_STATUS_EFUSE_BBRAM_KEY_DISABLE_MASK	0x00000008
 | 
			
		||||
							   /**< BBRAM key
 | 
			
		||||
							     *  disable
 | 
			
		||||
							     */
 | 
			
		||||
#define XDCFG_STATUS_EFUSE_SEC_EN_MASK		0x00000004 /**< Efuse Security
 | 
			
		||||
						     	     *  Enable Status
 | 
			
		||||
						     	     */
 | 
			
		||||
#define XDCFG_STATUS_EFUSE_JTAG_DIS_MASK	0x00000002 /**< EFuse JTAG
 | 
			
		||||
							     *  Disable
 | 
			
		||||
							     *  status
 | 
			
		||||
							     */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name DMA Source/Destination Transfer Length Register Bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XDCFG_DMA_LEN_MASK		0x7FFFFFF /**< Length Mask */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Miscellaneous Control  Register Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XDCFG_MCTRL_PCAP_PS_VERSION_MASK  0xF0000000 /**< PS Version Mask */
 | 
			
		||||
#define XDCFG_MCTRL_PCAP_PS_VERSION_SHIFT 28	     /**< PS Version Shift */
 | 
			
		||||
#define XDCFG_MCTRL_PCAP_LPBK_MASK	  0x00000010 /**< PCAP loopback mask */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name FIFO Threshold Bit definitions
 | 
			
		||||
  * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XDCFG_CFG_FIFO_QUARTER		0x0	 /**< Quarter empty */
 | 
			
		||||
#define XDCFG_CFG_FIFO_HALF		0x1	 /**< Half empty */
 | 
			
		||||
#define XDCFG_CFG_FIFO_3QUARTER		0x2	 /**< 3/4 empty */
 | 
			
		||||
#define XDCFG_CFG_FIFO_EMPTY		0x4	 /**< Empty */
 | 
			
		||||
/* @}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Miscellaneous constant values */
 | 
			
		||||
#define XDCFG_DMA_INVALID_ADDRESS	0xFFFFFFFF  /**< Invalid DMA address */
 | 
			
		||||
#define XDCFG_UNLOCK_DATA		0x757BDF0D  /**< First APB access data*/
 | 
			
		||||
#define XDCFG_BASE_ADDRESS		0xF8007000  /**< Device Config base
 | 
			
		||||
						      * address
 | 
			
		||||
						      */
 | 
			
		||||
#define XDCFG_CONFIG_RESET_VALUE	0x508	/**< Config reg reset value */							  
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Read the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddr is the base address of the device
 | 
			
		||||
* @param	RegOffset is the register offset to be read
 | 
			
		||||
*
 | 
			
		||||
* @return	The 32-bit value of the register
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		u32 XDcfg_ReadReg(u32 BaseAddr, u32 RegOffset)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_ReadReg(BaseAddr, RegOffset)		\
 | 
			
		||||
	Xil_In32((BaseAddr) + (RegOffset))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Write to the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddr is the base address of the device
 | 
			
		||||
* @param	RegOffset is the register offset to be written
 | 
			
		||||
* @param	Data is the 32-bit value to write to the register
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-style signature:
 | 
			
		||||
*		void XDcfg_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XDcfg_WriteReg(BaseAddr, RegOffset, Data)	\
 | 
			
		||||
	Xil_Out32((BaseAddr) + (RegOffset), (Data))
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Perform reset operation to the devcfg interface
 | 
			
		||||
 */
 | 
			
		||||
void XDcfg_ResetHw(u32 BaseAddr);
 | 
			
		||||
/************************** Variable Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif	/* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,325 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xdmaps.h
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  	Date     Changes
 | 
			
		||||
* ----- ------ -------- ----------------------------------------------
 | 
			
		||||
* 1.00	hbm    08/19/10 First Release
 | 
			
		||||
* 1.01a nm     12/20/12 Added definition XDMAPS_CHANNELS_PER_DEV which specifies
 | 
			
		||||
*		        the maximum number of channels.
 | 
			
		||||
*		        Replaced the usage of XPAR_XDMAPS_CHANNELS_PER_DEV
 | 
			
		||||
*                       with XDMAPS_CHANNELS_PER_DEV defined in xdmaps_hw.h.
 | 
			
		||||
*			Added the tcl file to automatically generate the
 | 
			
		||||
*			xparameters.h
 | 
			
		||||
* 1.02a sg     05/16/12 Made changes for doxygen and moved some function
 | 
			
		||||
*			header from the xdmaps.h file to xdmaps.c file
 | 
			
		||||
*			Other cleanup for coding guidelines and CR 657109
 | 
			
		||||
*			and CR 657898
 | 
			
		||||
*			The xdmaps_example_no_intr.c example is removed
 | 
			
		||||
*			as it is using interrupts  and is similar to
 | 
			
		||||
*			the interrupt example - CR 652477
 | 
			
		||||
* 1.03a sg     07/16/2012 changed inline to __inline for CR665681
 | 
			
		||||
* 1.04a nm     10/22/2012 Fixed CR# 681671.
 | 
			
		||||
* 1.05a nm     04/15/2013 Fixed CR# 704396. Removed warnings when compiled
 | 
			
		||||
*			  with -Wall and -Wextra option in bsp.
 | 
			
		||||
*	       05/01/2013 Fixed CR# 700189. Changed XDmaPs_BuildDmaProg()
 | 
			
		||||
*			  function description.
 | 
			
		||||
*			  Fixed CR# 704396. Removed unused variables
 | 
			
		||||
*			  UseM2MByte & MemBurstLen from XDmaPs_BuildDmaProg()
 | 
			
		||||
*			  function.
 | 
			
		||||
* 1.07a asa    11/02/13. Made changes to fix compilation issues for iarcc.
 | 
			
		||||
*			   Removed the PDBG prints. By default they were always
 | 
			
		||||
*			   defined out and never used. The PDBG is non-standard for
 | 
			
		||||
*			   Xilinx drivers and no other driver does something similar.
 | 
			
		||||
*			   Since there is no easy way to fix compilation issues with
 | 
			
		||||
*			   the IARCC compiler around PDBG, it is better to remove it.
 | 
			
		||||
*			   Users can always use xil_printfs if they want to debug.
 | 
			
		||||
* 2.0   adk    10/12/13  Updated as per the New Tcl API's
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XDMAPS_H		/* prevent circular inclusions */
 | 
			
		||||
#define XDMAPS_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files ********************************/
 | 
			
		||||
 | 
			
		||||
#include "xparameters.h"
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
 | 
			
		||||
#include "xdmaps_hw.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions ****************************/
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions ******************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for the device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16 DeviceId;	 /**< Unique ID  of device */
 | 
			
		||||
	u32 BaseAddress; /**< Base address of device (IPIF) */
 | 
			
		||||
} XDmaPs_Config;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** DMA channle control structure. It's for AXI bus transaction.
 | 
			
		||||
 * This struct will be translated into a 32-bit channel control register value.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	unsigned int EndianSwapSize;	/**< Endian swap size. */
 | 
			
		||||
	unsigned int DstCacheCtrl;	/**< Destination cache control */
 | 
			
		||||
	unsigned int DstProtCtrl;	/**< Destination protection control */
 | 
			
		||||
	unsigned int DstBurstLen;	/**< Destination burst length */
 | 
			
		||||
	unsigned int DstBurstSize;	/**< Destination burst size */
 | 
			
		||||
	unsigned int DstInc;		/**< Destination incrementing or fixed
 | 
			
		||||
					 *   address */
 | 
			
		||||
	unsigned int SrcCacheCtrl;	/**< Source cache control */
 | 
			
		||||
	unsigned int SrcProtCtrl;	/**< Source protection control */
 | 
			
		||||
	unsigned int SrcBurstLen;	/**< Source burst length */
 | 
			
		||||
	unsigned int SrcBurstSize;	/**< Source burst size */
 | 
			
		||||
	unsigned int SrcInc;		/**< Source incrementing or fixed
 | 
			
		||||
					 *   address */
 | 
			
		||||
} XDmaPs_ChanCtrl;
 | 
			
		||||
 | 
			
		||||
/** DMA block descriptor stucture.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u32 SrcAddr;		/**< Source starting address */
 | 
			
		||||
	u32 DstAddr;		/**< Destination starting address */
 | 
			
		||||
	unsigned int Length;	/**< Number of bytes for the block */
 | 
			
		||||
} XDmaPs_BD;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A DMA command consisits of a channel control struct, a block descriptor,
 | 
			
		||||
 * a user defined program, a pointer pointing to generated DMA program, and
 | 
			
		||||
 * execution result.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XDmaPs_ChanCtrl ChanCtrl; 	/**< Channel Control Struct */
 | 
			
		||||
	XDmaPs_BD BD;			/**< Together with SgLength field,
 | 
			
		||||
					  *  it's a scatter-gather list.
 | 
			
		||||
					  */
 | 
			
		||||
	void *UserDmaProg;		/**< If user wants the driver to
 | 
			
		||||
					  *  execute their own DMA program,
 | 
			
		||||
					  *  this field points to the DMA
 | 
			
		||||
					  *  program.
 | 
			
		||||
					  */
 | 
			
		||||
	int UserDmaProgLength;		/**< The length of user defined
 | 
			
		||||
					  *  DMA program.
 | 
			
		||||
					  */
 | 
			
		||||
 | 
			
		||||
	void *GeneratedDmaProg;		/**< The DMA program genreated
 | 
			
		||||
					 * by the driver. This field will be
 | 
			
		||||
					 * set if a user invokes the DMA
 | 
			
		||||
					 * program generation function. Or
 | 
			
		||||
					 * the DMA command is finished and
 | 
			
		||||
					 * a user informs the driver not to
 | 
			
		||||
					 * release the program buffer.
 | 
			
		||||
					 * This field has two purposes, one
 | 
			
		||||
					 * is to ask the driver to generate
 | 
			
		||||
					 * a DMA program while the DMAC is
 | 
			
		||||
					 * performaning DMA transactions. The
 | 
			
		||||
					 * other purpose is to debug the
 | 
			
		||||
					 * driver.
 | 
			
		||||
					 */
 | 
			
		||||
	int GeneratedDmaProgLength;	 /**< The length of the DMA program
 | 
			
		||||
					  * generated by the driver
 | 
			
		||||
					  */
 | 
			
		||||
	int DmaStatus;			/**< 0 on success, otherwise error code
 | 
			
		||||
					 */
 | 
			
		||||
	u32 ChanFaultType;	/**< Channel fault type in case of fault
 | 
			
		||||
				 */
 | 
			
		||||
	u32 ChanFaultPCAddr;	/**< Channel fault PC address
 | 
			
		||||
				 */
 | 
			
		||||
} XDmaPs_Cmd;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * It's the done handler a user can set for a channel
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*XDmaPsDoneHandler) (unsigned int Channel,
 | 
			
		||||
				    XDmaPs_Cmd *DmaCmd,
 | 
			
		||||
				    void *CallbackRef);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * It's the fault handler a user can set for a channel
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*XDmaPsFaultHandler) (unsigned int Channel,
 | 
			
		||||
				     XDmaPs_Cmd *DmaCmd,
 | 
			
		||||
				     void *CallbackRef);
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_MAX_CHAN_BUFS	2
 | 
			
		||||
#define XDMAPS_CHAN_BUF_LEN	128
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XDmaPs_ProgBuf is the struct for a DMA program buffer.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	char Buf[XDMAPS_CHAN_BUF_LEN];  /**< The actual buffer the holds the
 | 
			
		||||
					  *  content */
 | 
			
		||||
	unsigned Len;			/**< The actual length of the DMA
 | 
			
		||||
					  *  program in bytes. */
 | 
			
		||||
	int Allocated;			/**< A tag indicating whether the
 | 
			
		||||
					  *  buffer is allocated or not */
 | 
			
		||||
} XDmaPs_ProgBuf;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XDmaPs_ChannelData is a struct to book keep individual channel of
 | 
			
		||||
 * the DMAC.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	unsigned DevId;		 	/**< Device id indicating which DMAC */
 | 
			
		||||
	unsigned ChanId; 		/**< Channel number of the DMAC */
 | 
			
		||||
	XDmaPs_ProgBuf ProgBufPool[XDMAPS_MAX_CHAN_BUFS]; /**< A pool of
 | 
			
		||||
							      program buffers*/
 | 
			
		||||
	XDmaPsDoneHandler DoneHandler; 	/**< Done interrupt handler */
 | 
			
		||||
	void *DoneRef;			/**< Done interrupt callback data */
 | 
			
		||||
	XDmaPs_Cmd *DmaCmdToHw; 	/**< DMA command being executed */
 | 
			
		||||
	XDmaPs_Cmd *DmaCmdFromHw; 	/**< DMA  command that is finished.
 | 
			
		||||
				     	  *  This field is for debugging purpose
 | 
			
		||||
				     	  */
 | 
			
		||||
	int HoldDmaProg;		/**< A tag indicating whether to hold the
 | 
			
		||||
					  *  DMA program after the DMA is done.
 | 
			
		||||
					  */
 | 
			
		||||
 | 
			
		||||
} XDmaPs_ChannelData;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XDmaPs driver instance data structure. A pointer to an instance data
 | 
			
		||||
 * structure is passed around by functions to refer to a specific driver
 | 
			
		||||
 * instance.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XDmaPs_Config Config;	/**< Configuration data structure */
 | 
			
		||||
	int IsReady;		/**< Device is Ready */
 | 
			
		||||
	int CacheLength;	/**< icache length */
 | 
			
		||||
	XDmaPsFaultHandler FaultHandler; /**< fault interrupt handler */
 | 
			
		||||
	void *FaultRef;	/**< fault call back data */
 | 
			
		||||
	XDmaPs_ChannelData Chans[XDMAPS_CHANNELS_PER_DEV];
 | 
			
		||||
	/**<
 | 
			
		||||
	 * channel data
 | 
			
		||||
	 */
 | 
			
		||||
} XDmaPs;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions implemented in xdmaps.c
 | 
			
		||||
 */
 | 
			
		||||
int XDmaPs_CfgInitialize(XDmaPs *InstPtr,
 | 
			
		||||
			  XDmaPs_Config *Config,
 | 
			
		||||
			  u32 EffectiveAddr);
 | 
			
		||||
 | 
			
		||||
int XDmaPs_Start(XDmaPs *InstPtr, unsigned int Channel,
 | 
			
		||||
		  XDmaPs_Cmd *Cmd,
 | 
			
		||||
		  int HoldDmaProg);
 | 
			
		||||
 | 
			
		||||
int XDmaPs_IsActive(XDmaPs *InstPtr, unsigned int Channel);
 | 
			
		||||
int XDmaPs_GenDmaProg(XDmaPs *InstPtr, unsigned int Channel,
 | 
			
		||||
		       XDmaPs_Cmd *Cmd);
 | 
			
		||||
int XDmaPs_FreeDmaProg(XDmaPs *InstPtr, unsigned int Channel,
 | 
			
		||||
			XDmaPs_Cmd *Cmd);
 | 
			
		||||
void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int XDmaPs_ResetManager(XDmaPs *InstPtr);
 | 
			
		||||
int XDmaPs_ResetChannel(XDmaPs *InstPtr, unsigned int Channel);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int XDmaPs_SetDoneHandler(XDmaPs *InstPtr,
 | 
			
		||||
			   unsigned Channel,
 | 
			
		||||
			   XDmaPsDoneHandler DoneHandler,
 | 
			
		||||
			   void *CallbackRef);
 | 
			
		||||
 | 
			
		||||
int XDmaPs_SetFaultHandler(XDmaPs *InstPtr,
 | 
			
		||||
			    XDmaPsFaultHandler FaultHandler,
 | 
			
		||||
			    void *CallbackRef);
 | 
			
		||||
 | 
			
		||||
void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Driver done interrupt service routines for the channels.
 | 
			
		||||
 * We need this done ISR mainly because the driver needs to release the
 | 
			
		||||
 * DMA program buffer. This is the one that connects the GIC
 | 
			
		||||
 */
 | 
			
		||||
void XDmaPs_DoneISR_0(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_1(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_2(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_3(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_4(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_5(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_6(XDmaPs *InstPtr);
 | 
			
		||||
void XDmaPs_DoneISR_7(XDmaPs *InstPtr);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Driver fault interrupt service routine
 | 
			
		||||
 */
 | 
			
		||||
void XDmaPs_FaultISR(XDmaPs *InstPtr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Static loopup function implemented in xdmaps_sinit.c
 | 
			
		||||
 */
 | 
			
		||||
XDmaPs_Config *XDmaPs_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * self-test functions in xdmaps_selftest.c
 | 
			
		||||
 */
 | 
			
		||||
int XDmaPs_SelfTest(XDmaPs *InstPtr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,299 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xdmaps_hw.h
 | 
			
		||||
*
 | 
			
		||||
* This header file contains the hardware interface of an XDmaPs device.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who   Date     Changes
 | 
			
		||||
* ----- ----  -------- ----------------------------------------------
 | 
			
		||||
* 1.00a	hbm   08/18/10 First Release
 | 
			
		||||
* 1.01a nm    12/20/12 Added definition XDMAPS_CHANNELS_PER_DEV which specifies
 | 
			
		||||
*		       the maximum number of channels.
 | 
			
		||||
*		       Replaced the usage of XPAR_XDMAPS_CHANNELS_PER_DEV
 | 
			
		||||
*                      with XDMAPS_CHANNELS_PER_DEV defined in xdmaps_hw.h
 | 
			
		||||
* 1.02a sg    05/16/12 Made changes for doxygen
 | 
			
		||||
* 1.06a kpc   07/10/13 Added function prototype
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XDMAPS_HW_H		/* prevent circular inclusions */
 | 
			
		||||
#define XDMAPS_HW_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name Register Map
 | 
			
		||||
 *
 | 
			
		||||
 * Register offsets for the DMAC.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_DS_OFFSET		0x000 /* DMA Status Register */
 | 
			
		||||
#define XDMAPS_DPC_OFFSET	0x004 /* DMA Program Counter Rregister */
 | 
			
		||||
#define XDMAPS_INTEN_OFFSET	0X020 /* DMA Interrupt Enable Register */
 | 
			
		||||
#define XDMAPS_ES_OFFSET		0x024 /* DMA Event Status Register */
 | 
			
		||||
#define XDMAPS_INTSTATUS_OFFSET	0x028 /* DMA Interrupt Status Register
 | 
			
		||||
					       */
 | 
			
		||||
#define XDMAPS_INTCLR_OFFSET	0x02c /* DMA Interrupt Clear Register */
 | 
			
		||||
#define XDMAPS_FSM_OFFSET 	0x030 /* DMA Fault Status DMA Manager
 | 
			
		||||
				       * Register
 | 
			
		||||
				       */
 | 
			
		||||
#define XDMAPS_FSC_OFFSET	0x034 /* DMA Fault Status DMA Chanel Register
 | 
			
		||||
				       */
 | 
			
		||||
#define XDMAPS_FTM_OFFSET	0x038 /* DMA Fault Type DMA Manager Register */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_FTC0_OFFSET	0x040 /* DMA Fault Type for DMA Channel 0 */
 | 
			
		||||
/*
 | 
			
		||||
 * The offset for the rest of the FTC registers is calculated as
 | 
			
		||||
 * FTC0 + dev_chan_num * 4
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_FTCn_OFFSET(ch)	(XDMAPS_FTC0_OFFSET + (ch) * 4)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CS0_OFFSET	0x100 /* Channel Status for DMA Channel 0 */
 | 
			
		||||
/*
 | 
			
		||||
 * The offset for the rest of the CS registers is calculated as
 | 
			
		||||
 * CS0 + * dev_chan_num * 0x08
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_CSn_OFFSET(ch)	(XDMAPS_CS0_OFFSET + (ch) * 8)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CPC0_OFFSET	0x104 /* Channel Program Counter for DMA
 | 
			
		||||
				       * Channel 0
 | 
			
		||||
				       */
 | 
			
		||||
/*
 | 
			
		||||
 * The offset for the rest of the CPC registers is calculated as
 | 
			
		||||
 * CPC0 + dev_chan_num * 0x08
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_CPCn_OFFSET(ch)	(XDMAPS_CPC0_OFFSET + (ch) * 8)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_SA_0_OFFSET	0x400 /* Source Address Register for DMA
 | 
			
		||||
				       * Channel 0
 | 
			
		||||
				       */
 | 
			
		||||
/* The offset for the rest of the SA registers is calculated as
 | 
			
		||||
 * SA_0 + dev_chan_num * 0x20
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_SA_n_OFFSET(ch)	(XDMAPS_SA_0_OFFSET + (ch) * 0x20)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_DA_0_OFFSET	0x404 /* Destination Address Register for
 | 
			
		||||
				       * DMA Channel 0
 | 
			
		||||
				       */
 | 
			
		||||
/* The offset for the rest of the DA registers is calculated as
 | 
			
		||||
 * DA_0 + dev_chan_num * 0x20
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_DA_n_OFFSET(ch)	(XDMAPS_DA_0_OFFSET + (ch) * 0x20)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CC_0_OFFSET	0x408 /* Channel Control Register for
 | 
			
		||||
				       * DMA Channel 0
 | 
			
		||||
				       */
 | 
			
		||||
/*
 | 
			
		||||
 * The offset for the rest of the CC registers is calculated as
 | 
			
		||||
 * CC_0 + dev_chan_num * 0x20
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_CC_n_OFFSET(ch)	(XDMAPS_CC_0_OFFSET + (ch) * 0x20)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_LC0_0_OFFSET	0x40C /* Loop Counter 0 for DMA Channel 0 */
 | 
			
		||||
/*
 | 
			
		||||
 * The offset for the rest of the LC0 registers is calculated as
 | 
			
		||||
 * LC_0 + dev_chan_num * 0x20
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_LC0_n_OFFSET(ch)	(XDMAPS_LC0_0_OFFSET + (ch) * 0x20)
 | 
			
		||||
#define XDMAPS_LC1_0_OFFSET	0x410 /* Loop Counter 1 for DMA Channel 0 */
 | 
			
		||||
/*
 | 
			
		||||
 * The offset for the rest of the LC1 registers is calculated as
 | 
			
		||||
 * LC_0 + dev_chan_num * 0x20
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_LC1_n_OFFSET(ch)	(XDMAPS_LC1_0_OFFSET + (ch) * 0x20)
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_DBGSTATUS_OFFSET	0xD00 /* Debug Status Register */
 | 
			
		||||
#define XDMAPS_DBGCMD_OFFSET	0xD04 /* Debug Command Register */
 | 
			
		||||
#define XDMAPS_DBGINST0_OFFSET	0xD08 /* Debug Instruction 0 Register */
 | 
			
		||||
#define XDMAPS_DBGINST1_OFFSET	0xD0C /* Debug Instruction 1 Register */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CR0_OFFSET	0xE00 /* Configuration Register 0 */
 | 
			
		||||
#define XDMAPS_CR1_OFFSET	0xE04 /* Configuration Register 1 */
 | 
			
		||||
#define XDMAPS_CR2_OFFSET	0xE08 /* Configuration Register 2 */
 | 
			
		||||
#define XDMAPS_CR3_OFFSET	0xE0C /* Configuration Register 3 */
 | 
			
		||||
#define XDMAPS_CR4_OFFSET	0xE10 /* Configuration Register 4 */
 | 
			
		||||
#define XDMAPS_CRDN_OFFSET	0xE14 /* Configuration Register Dn */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_PERIPH_ID_0_OFFSET	0xFE0 /* Peripheral Identification
 | 
			
		||||
					       * Register 0
 | 
			
		||||
					       */
 | 
			
		||||
#define XDMAPS_PERIPH_ID_1_OFFSET	0xFE4 /* Peripheral Identification
 | 
			
		||||
					       * Register 1
 | 
			
		||||
					       */
 | 
			
		||||
#define XDMAPS_PERIPH_ID_2_OFFSET	0xFE8 /* Peripheral Identification
 | 
			
		||||
					       * Register 2
 | 
			
		||||
					       */
 | 
			
		||||
#define XDMAPS_PERIPH_ID_3_OFFSET	0xFEC /* Peripheral Identification
 | 
			
		||||
					       * Register 3
 | 
			
		||||
					       */
 | 
			
		||||
#define XDMAPS_PCELL_ID_0_OFFSET	0xFF0 /* PrimeCell Identification
 | 
			
		||||
				       * Register 0
 | 
			
		||||
				       */
 | 
			
		||||
#define XDMAPS_PCELL_ID_1_OFFSET	0xFF4 /* PrimeCell Identification
 | 
			
		||||
				       * Register 1
 | 
			
		||||
				       */
 | 
			
		||||
#define XDMAPS_PCELL_ID_2_OFFSET	0xFF8 /* PrimeCell Identification
 | 
			
		||||
				       * Register 2
 | 
			
		||||
				       */
 | 
			
		||||
#define XDMAPS_PCELL_ID_3_OFFSET	0xFFC /* PrimeCell Identification
 | 
			
		||||
				       * Register 3
 | 
			
		||||
				       */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Some useful register masks
 | 
			
		||||
 */
 | 
			
		||||
#define XDMAPS_DS_DMA_STATUS		0x0F /* DMA status mask */
 | 
			
		||||
#define XDMAPS_DS_DMA_STATUS_STOPPED	0x00 /* debug status busy mask */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_DBGSTATUS_BUSY		0x01 /* debug status busy mask */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CS_ACTIVE_MASK		0x07 /* channel status active mask,
 | 
			
		||||
					      * llast 3 bits of CS register
 | 
			
		||||
					      */
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CR1_I_CACHE_LEN_MASK	0x07 /* i_cache_len mask */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XDMAPS_DBGINST0 - constructs the word for the Debug Instruction-0 Register.
 | 
			
		||||
 * @b1: Instruction byte 1
 | 
			
		||||
 * @b0: Instruction byte 0
 | 
			
		||||
 * @ch: Channel number
 | 
			
		||||
 * @dbg_th: Debug thread encoding: 0 = DMA manager thread, 1 = DMA channel
 | 
			
		||||
 */
 | 
			
		||||
#define XDmaPs_DBGINST0(b1, b0, ch, dbg_th) \
 | 
			
		||||
	(((b1) << 24) | ((b0) << 16) | (((ch) & 0x7) << 8) | ((dbg_th & 0x1)))
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Control Register
 | 
			
		||||
 *
 | 
			
		||||
 * The Control register (CR) controls the major functions of the device.
 | 
			
		||||
 *
 | 
			
		||||
 * Control Register Bit Definition
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* @}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define XDMAPS_CHANNELS_PER_DEV		8
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Mode Register
 | 
			
		||||
 *
 | 
			
		||||
 * The mode register (MR) defines the mode of transfer as well as the data
 | 
			
		||||
 * format. If this register is modified during transmission or reception,
 | 
			
		||||
 * data validity cannot be guaranteed.
 | 
			
		||||
 *
 | 
			
		||||
 * Mode Register Bit Definition
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Interrupt Registers
 | 
			
		||||
 *
 | 
			
		||||
 * Interrupt control logic uses the interrupt enable register (IER) and the
 | 
			
		||||
 * interrupt disable register (IDR) to set the value of the bits in the
 | 
			
		||||
 * interrupt mask register (IMR). The IMR determines whether to pass an
 | 
			
		||||
 * interrupt to the interrupt status register (ISR).
 | 
			
		||||
 * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an
 | 
			
		||||
 * interrupt. IMR and ISR are read only, and IER and IDR are write only.
 | 
			
		||||
 * Reading either IER or IDR returns 0x00.
 | 
			
		||||
 *
 | 
			
		||||
 * All four registers have the same bit definitions.
 | 
			
		||||
 *
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
#define XDMAPS_INTCLR_ALL_MASK		0xFF
 | 
			
		||||
 | 
			
		||||
#define XDmaPs_ReadReg(BaseAddress, RegOffset) \
 | 
			
		||||
    Xil_In32((BaseAddress) + (RegOffset))
 | 
			
		||||
 | 
			
		||||
/***************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Write a DMAC register.
 | 
			
		||||
*
 | 
			
		||||
* @param    BaseAddress contains the base address of the device.
 | 
			
		||||
* @param    RegOffset contains the offset from the base address of the device.
 | 
			
		||||
* @param    RegisterValue is the value to be written to the register.
 | 
			
		||||
*
 | 
			
		||||
* @return   None.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-Style signature:
 | 
			
		||||
*    void XDmaPs_WriteReg(u32 BaseAddress, int RegOffset,
 | 
			
		||||
*                          u32 RegisterValue)
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#define XDmaPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \
 | 
			
		||||
    Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue))
 | 
			
		||||
/************************** Variable Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes *****************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Perform reset operation to the dmaps interface
 | 
			
		||||
 */
 | 
			
		||||
void XDmaPs_ResetHw(u32 BaseAddr);
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,721 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-11 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @file xemacps.h
 | 
			
		||||
 *
 | 
			
		||||
 * The Xilinx Embedded Processor Block Ethernet driver.
 | 
			
		||||
 *
 | 
			
		||||
 * For a full description of XEMACPS features, please see the hardware spec.
 | 
			
		||||
 * This driver supports the following features:
 | 
			
		||||
 *   - Memory mapped access to host interface registers
 | 
			
		||||
 *   - Statistics counter registers for RMON/MIB
 | 
			
		||||
 *   - API for interrupt driven frame transfers for hardware configured DMA
 | 
			
		||||
 *   - Virtual memory support
 | 
			
		||||
 *   - Unicast, broadcast, and multicast receive address filtering
 | 
			
		||||
 *   - Full and half duplex operation
 | 
			
		||||
 *   - Automatic PAD & FCS insertion and stripping
 | 
			
		||||
 *   - Flow control
 | 
			
		||||
 *   - Support up to four 48bit addresses
 | 
			
		||||
 *   - Address checking for four specific 48bit addresses
 | 
			
		||||
 *   - VLAN frame support
 | 
			
		||||
 *   - Pause frame support
 | 
			
		||||
 *   - Large frame support up to 1536 bytes
 | 
			
		||||
 *   - Checksum offload
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Driver Description</b>
 | 
			
		||||
 *
 | 
			
		||||
 * The device driver enables higher layer software (e.g., an application) to
 | 
			
		||||
 * communicate to the XEmacPs. The driver handles transmission and reception
 | 
			
		||||
 * of Ethernet frames, as well as configuration and control. No pre or post
 | 
			
		||||
 * processing of frame data is performed. The driver does not validate the
 | 
			
		||||
 * contents of an incoming frame in addition to what has already occurred in
 | 
			
		||||
 * hardware.
 | 
			
		||||
 * A single device driver can support multiple devices even when those devices
 | 
			
		||||
 * have significantly different configurations.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Initialization & Configuration</b>
 | 
			
		||||
 *
 | 
			
		||||
 * The XEmacPs_Config structure is used by the driver to configure itself.
 | 
			
		||||
 * This configuration structure is typically created by the tool-chain based
 | 
			
		||||
 * on hardware build properties.
 | 
			
		||||
 *
 | 
			
		||||
 * The driver instance can be initialized in
 | 
			
		||||
 *
 | 
			
		||||
 *   - XEmacPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddress):  Uses a
 | 
			
		||||
 *     configuration structure provided by the caller. If running in a system
 | 
			
		||||
 *     with address translation, the provided virtual memory base address
 | 
			
		||||
 *     replaces the physical address present in the configuration structure.
 | 
			
		||||
 *
 | 
			
		||||
 * The device supports DMA only as current development plan. No FIFO mode is
 | 
			
		||||
 * supported. The driver expects to start the DMA channels and expects that
 | 
			
		||||
 * the user has set up the buffer descriptor lists.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Interrupts and Asynchronous Callbacks</b>
 | 
			
		||||
 *
 | 
			
		||||
 * The driver has no dependencies on the interrupt controller. When an
 | 
			
		||||
 * interrupt occurs, the handler will perform a small amount of
 | 
			
		||||
 * housekeeping work, determine the source of the interrupt, and call the
 | 
			
		||||
 * appropriate callback function. All callbacks are registered by the user
 | 
			
		||||
 * level application.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Virtual Memory</b>
 | 
			
		||||
 *
 | 
			
		||||
 * All virtual to physical memory mappings must occur prior to accessing the
 | 
			
		||||
 * driver API.
 | 
			
		||||
 *
 | 
			
		||||
 * For DMA transactions, user buffers supplied to the driver must be in terms
 | 
			
		||||
 * of their physical address.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>DMA</b>
 | 
			
		||||
 *
 | 
			
		||||
 * The DMA engine uses buffer descriptors (BDs) to describe Ethernet frames.
 | 
			
		||||
 * These BDs are typically chained together into a list the hardware follows
 | 
			
		||||
 * when transferring data in and out of the packet buffers. Each BD describes
 | 
			
		||||
 * a memory region containing either a full or partial Ethernet packet.
 | 
			
		||||
 *
 | 
			
		||||
 * Interrupt coalescing is not suppoted from this built-in DMA engine.
 | 
			
		||||
 *
 | 
			
		||||
 * This API requires the user to understand how the DMA operates. The
 | 
			
		||||
 * following paragraphs provide some explanation, but the user is encouraged
 | 
			
		||||
 * to read documentation in xemacps_bdring.h as well as study example code
 | 
			
		||||
 * that accompanies this driver.
 | 
			
		||||
 *
 | 
			
		||||
 * The API is designed to get BDs to and from the DMA engine in the most
 | 
			
		||||
 * efficient means possible. The first step is to establish a  memory region
 | 
			
		||||
 * to contain all BDs for a specific channel. This is done with
 | 
			
		||||
 * XEmacPs_BdRingCreate(). This function sets up a BD ring that hardware will
 | 
			
		||||
 * follow as BDs are processed. The ring will consist of a user defined number
 | 
			
		||||
 * of BDs which will all be partially initialized. For example on the transmit
 | 
			
		||||
 * channel, the driver will initialize all BDs' so that they are configured
 | 
			
		||||
 * for transmit. The more fields that can be permanently setup at
 | 
			
		||||
 * initialization, then the fewer accesses will be needed to each BD while
 | 
			
		||||
 * the DMA engine is in operation resulting in better throughput and CPU
 | 
			
		||||
 * utilization. The best case initialization would require the user to set
 | 
			
		||||
 * only a frame buffer address and length prior to submitting the BD to the
 | 
			
		||||
 * engine.
 | 
			
		||||
 *
 | 
			
		||||
 * BDs move through the engine with the help of functions
 | 
			
		||||
 * XEmacPs_BdRingAlloc(), XEmacPs_BdRingToHw(), XEmacPs_BdRingFromHw(),
 | 
			
		||||
 * and XEmacPs_BdRingFree().
 | 
			
		||||
 * All these functions handle BDs that are in place. That is, there are no
 | 
			
		||||
 * copies of BDs kept anywhere and any BD the user interacts with is an actual
 | 
			
		||||
 * BD from the same ring hardware accesses.
 | 
			
		||||
 *
 | 
			
		||||
 * BDs in the ring go through a series of states as follows:
 | 
			
		||||
 *   1. Idle. The driver controls BDs in this state.
 | 
			
		||||
 *   2. The user has data to transfer. XEmacPs_BdRingAlloc() is called to
 | 
			
		||||
 *      reserve BD(s). Once allocated, the user may setup the BD(s) with
 | 
			
		||||
 *      frame buffer address, length, and other attributes. The user controls
 | 
			
		||||
 *      BDs in this state.
 | 
			
		||||
 *   3. The user submits BDs to the DMA engine with XEmacPs_BdRingToHw. BDs
 | 
			
		||||
 *      in this state are either waiting to be processed by hardware, are in
 | 
			
		||||
 *      process, or have been processed. The DMA engine controls BDs in this
 | 
			
		||||
 *      state.
 | 
			
		||||
 *   4. Processed BDs are retrieved with XEmacEpv_BdRingFromHw() by the
 | 
			
		||||
 *      user. Once retrieved, the user can examine each BD for the outcome of
 | 
			
		||||
 *      the DMA transfer. The user controls BDs in this state. After examining
 | 
			
		||||
 *      the BDs the user calls XEmacPs_BdRingFree() which places the BDs back
 | 
			
		||||
 *      into state 1.
 | 
			
		||||
 *
 | 
			
		||||
 * Each of the four BD accessor functions operate on a set of BDs. A set is
 | 
			
		||||
 * defined as a segment of the BD ring consisting of one or more BDs. The user
 | 
			
		||||
 * views the set as a pointer to the first BD along with the number of BDs for
 | 
			
		||||
 * that set. The set can be navigated by using macros XEmacPs_BdNext(). The
 | 
			
		||||
 * user must exercise extreme caution when changing BDs in a set as there is
 | 
			
		||||
 * nothing to prevent doing a mBdNext past the end of the set and modifying a
 | 
			
		||||
 * BD out of bounds.
 | 
			
		||||
 *
 | 
			
		||||
 * XEmacPs_BdRingAlloc() + XEmacPs_BdRingToHw(), as well as
 | 
			
		||||
 * XEmacPs_BdRingFromHw() + XEmacPs_BdRingFree() are designed to be used in
 | 
			
		||||
 * tandem. The same BD set retrieved with BdRingAlloc should be the same one
 | 
			
		||||
 * provided to hardware with BdRingToHw. Same goes with BdRingFromHw and
 | 
			
		||||
 * BdRIngFree.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Alignment & Data Cache Restrictions</b>
 | 
			
		||||
 *
 | 
			
		||||
 * Due to the design of the hardware, all RX buffers, BDs need to be 4-byte
 | 
			
		||||
 * aligned. Please reference xemacps_bd.h for cache related macros.
 | 
			
		||||
 *
 | 
			
		||||
 * DMA Tx:
 | 
			
		||||
 *
 | 
			
		||||
 *   - If frame buffers exist in cached memory, then they must be flushed
 | 
			
		||||
 *     prior to committing them to hardware.
 | 
			
		||||
 *
 | 
			
		||||
 * DMA Rx:
 | 
			
		||||
 *
 | 
			
		||||
 *   - If frame buffers exist in cached memory, then the cache must be
 | 
			
		||||
 *     invalidated for the memory region containing the frame prior to data
 | 
			
		||||
 *     access
 | 
			
		||||
 *
 | 
			
		||||
 * Both cache invalidate/flush are taken care of in driver code.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Buffer Copying</b>
 | 
			
		||||
 *
 | 
			
		||||
 * The driver is designed for a zero-copy buffer scheme. That is, the driver
 | 
			
		||||
 * will not copy buffers. This avoids potential throughput bottlenecks within
 | 
			
		||||
 * the driver. If byte copying is required, then the transfer will take longer
 | 
			
		||||
 * to complete.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Checksum Offloading</b>
 | 
			
		||||
 *
 | 
			
		||||
 * The Embedded Processor Block Ethernet can be configured to perform IP, TCP
 | 
			
		||||
 * and UDP checksum offloading in both receive and transmit directions.
 | 
			
		||||
 *
 | 
			
		||||
 * IP packets contain a 16-bit checksum field, which is the 16-bit 1s
 | 
			
		||||
 * complement of the 1s complement sum of all 16-bit words in the header.
 | 
			
		||||
 * TCP and UDP packets contain a 16-bit checksum field, which is the 16-bit
 | 
			
		||||
 * 1s complement of the 1s complement sum of all 16-bit words in the header,
 | 
			
		||||
 * the data and a conceptual pseudo header.
 | 
			
		||||
 *
 | 
			
		||||
 * To calculate these checksums in software requires each byte of the packet
 | 
			
		||||
 * to be read. For TCP and UDP this can use a large amount of processing power.
 | 
			
		||||
 * Offloading the checksum calculation to hardware can result in significant
 | 
			
		||||
 * performance improvements.
 | 
			
		||||
 *
 | 
			
		||||
 * The transmit checksum offload is only available to use DMA in packet buffer
 | 
			
		||||
 * mode. This is because the complete frame to be transmitted must be read
 | 
			
		||||
 * into the packet buffer memory before the checksum can be calculated and
 | 
			
		||||
 * written to the header at the beginning of the frame.
 | 
			
		||||
 *
 | 
			
		||||
 * For IP, TCP or UDP receive checksum offload to be useful, the operating
 | 
			
		||||
 * system containing the protocol stack must be aware that this offload is
 | 
			
		||||
 * available so that it can make use of the fact that the hardware has verified
 | 
			
		||||
 * the checksum.
 | 
			
		||||
 *
 | 
			
		||||
 * When receive checksum offloading is enabled in the hardware, the IP header
 | 
			
		||||
 * checksum is checked, where the packet meets the following criteria:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. If present, the VLAN header must be four octets long and the CFI bit
 | 
			
		||||
 *    must not be set.
 | 
			
		||||
 * 2. Encapsulation must be RFC 894 Ethernet Type Encoding or RFC 1042 SNAP
 | 
			
		||||
 *    encoding.
 | 
			
		||||
 * 3. IP v4 packet.
 | 
			
		||||
 * 4. IP header is of a valid length.
 | 
			
		||||
 * 5. Good IP header checksum.
 | 
			
		||||
 * 6. No IP fragmentation.
 | 
			
		||||
 * 7. TCP or UDP packet.
 | 
			
		||||
 *
 | 
			
		||||
 * When an IP, TCP or UDP frame is received, the receive buffer descriptor
 | 
			
		||||
 * gives an indication if the hardware was able to verify the checksums.
 | 
			
		||||
 * There is also an indication if the frame had SNAP encapsulation. These
 | 
			
		||||
 * indication bits will replace the type ID match indication bits when the
 | 
			
		||||
 * receive checksum offload is enabled.
 | 
			
		||||
 *
 | 
			
		||||
 * If any of the checksums are verified incorrect by the hardware, the packet
 | 
			
		||||
 * is discarded and the appropriate statistics counter incremented.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>PHY Interfaces</b>
 | 
			
		||||
 *
 | 
			
		||||
 * RGMII 1.3 is the only interface supported.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Asserts</b>
 | 
			
		||||
 *
 | 
			
		||||
 * Asserts are used within all Xilinx drivers to enforce constraints on
 | 
			
		||||
 * parameters. Asserts can be turned off on a system-wide basis by defining,
 | 
			
		||||
 * at compile time, the NDEBUG identifier. By default, asserts are turned on
 | 
			
		||||
 * and it is recommended that users leave asserts on during development. For
 | 
			
		||||
 * deployment use -DNDEBUG compiler switch to remove assert code.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 *
 | 
			
		||||
 * Xilinx drivers are typically composed of two parts, one is the driver
 | 
			
		||||
 * and the other is the adapter.  The driver is independent of OS and processor
 | 
			
		||||
 * and is intended to be highly portable.  The adapter is OS-specific and
 | 
			
		||||
 * facilitates communication between the driver and an OS.
 | 
			
		||||
 * This driver is intended to be RTOS and processor independent. Any needs for
 | 
			
		||||
 * dynamic memory management, threads or thread mutual exclusion, or cache
 | 
			
		||||
 * control must be satisfied bythe layer above this driver.
 | 
			
		||||
 *
 | 
			
		||||
 * <pre>
 | 
			
		||||
 * MODIFICATION HISTORY:
 | 
			
		||||
 *
 | 
			
		||||
 * Ver   Who  Date     Changes
 | 
			
		||||
 * ----- ---- -------- -------------------------------------------------------
 | 
			
		||||
 * 1.00a wsy  01/10/10 First release
 | 
			
		||||
 * 1.00a asa  11/21/11 The function XEmacPs_BdRingFromHwTx in file
 | 
			
		||||
 *		       xemacps_bdring.c is modified. Earlier it was checking for
 | 
			
		||||
 *		       "BdLimit"(passed argument) number of BDs for finding out
 | 
			
		||||
 *		       which BDs are successfully processed. Now one more check
 | 
			
		||||
 *		       is added. It looks for BDs till the current BD pointer
 | 
			
		||||
 *		       reaches HwTail. By doing this processing time is saved.
 | 
			
		||||
 * 1.00a asa  01/24/12 The function XEmacPs_BdRingFromHwTx in file
 | 
			
		||||
 *		       xemacps_bdring.c is modified. Now start of packet is
 | 
			
		||||
 *		       searched for returning the number of BDs processed.
 | 
			
		||||
 * 1.02a asa  11/05/12 Added a new API for deleting an entry from the HASH
 | 
			
		||||
 *		       registers. Added a new API to set the bust length.
 | 
			
		||||
 *		       Added some new hash-defines.
 | 
			
		||||
 * 1.03a asa  01/23/12 Fix for CR #692702 which updates error handling for
 | 
			
		||||
 *		       Rx errors. Under heavy Rx traffic, there will be a large
 | 
			
		||||
 *		       number of errors related to receive buffer not available.
 | 
			
		||||
 *		       Because of a HW bug (SI #692601), under such heavy errors,
 | 
			
		||||
 *		       the Rx data path can become unresponsive. To reduce the
 | 
			
		||||
 *		       probabilities for hitting this HW bug, the SW writes to
 | 
			
		||||
 *		       bit 18 to flush a packet from Rx DPRAM immediately. The
 | 
			
		||||
 *		       changes for it are done in the function
 | 
			
		||||
 *		       XEmacPs_IntrHandler.
 | 
			
		||||
 * 1.05a asa  09/23/13 Cache operations on BDs are not required and hence
 | 
			
		||||
 *		       removed. It is expected that all BDs are allocated in
 | 
			
		||||
 *		       from uncached area.
 | 
			
		||||
 * 1.06a asa  11/02/13 Changed the value for XEMACPS_RXBUF_LEN_MASK from 0x3fff
 | 
			
		||||
 *				to 0x1fff. This fixes the CR#744902.
 | 
			
		||||
 *			  Made changes in example file xemacps_example.h to fix compilation
 | 
			
		||||
 *			  issues with iarcc compiler.
 | 
			
		||||
 * 2.0   adk  10/12/13 Updated as per the New Tcl API's
 | 
			
		||||
 * </pre>
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XEMACPS_H		/* prevent circular inclusions */
 | 
			
		||||
#define XEMACPS_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files ********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xemacps_hw.h"
 | 
			
		||||
#include "xemacps_bd.h"
 | 
			
		||||
#include "xemacps_bdring.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions ****************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Device information
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_DEVICE_NAME     "xemacps"
 | 
			
		||||
#define XEMACPS_DEVICE_DESC     "Xilinx PS 10/100/1000 MAC"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name Configuration options
 | 
			
		||||
 *
 | 
			
		||||
 * Device configuration options. See the XEmacPs_SetOptions(),
 | 
			
		||||
 * XEmacPs_ClearOptions() and XEmacPs_GetOptions() for information on how to
 | 
			
		||||
 * use options.
 | 
			
		||||
 *
 | 
			
		||||
 * The default state of the options are noted and are what the device and
 | 
			
		||||
 * driver will be set to after calling XEmacPs_Reset() or
 | 
			
		||||
 * XEmacPs_Initialize().
 | 
			
		||||
 *
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_PROMISC_OPTION               0x00000001
 | 
			
		||||
/**< Accept all incoming packets.
 | 
			
		||||
 *   This option defaults to disabled (cleared) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_FRAME1536_OPTION             0x00000002
 | 
			
		||||
/**< Frame larger than 1516 support for Tx & Rx.
 | 
			
		||||
 *   This option defaults to disabled (cleared) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_VLAN_OPTION                  0x00000004
 | 
			
		||||
/**< VLAN Rx & Tx frame support.
 | 
			
		||||
 *   This option defaults to disabled (cleared) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_FLOW_CONTROL_OPTION          0x00000010
 | 
			
		||||
/**< Enable recognition of flow control frames on Rx
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_FCS_STRIP_OPTION             0x00000020
 | 
			
		||||
/**< Strip FCS and PAD from incoming frames. Note: PAD from VLAN frames is not
 | 
			
		||||
 *   stripped.
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_FCS_INSERT_OPTION            0x00000040
 | 
			
		||||
/**< Generate FCS field and add PAD automatically for outgoing frames.
 | 
			
		||||
 *   This option defaults to disabled (cleared) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_LENTYPE_ERR_OPTION           0x00000080
 | 
			
		||||
/**< Enable Length/Type error checking for incoming frames. When this option is
 | 
			
		||||
 *   set, the MAC will filter frames that have a mismatched type/length field
 | 
			
		||||
 *   and if XEMACPS_REPORT_RXERR_OPTION is set, the user is notified when these
 | 
			
		||||
 *   types of frames are encountered. When this option is cleared, the MAC will
 | 
			
		||||
 *   allow these types of frames to be received.
 | 
			
		||||
 *
 | 
			
		||||
 *   This option defaults to disabled (cleared) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_TRANSMITTER_ENABLE_OPTION    0x00000100
 | 
			
		||||
/**< Enable the transmitter.
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_RECEIVER_ENABLE_OPTION       0x00000200
 | 
			
		||||
/**< Enable the receiver
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_BROADCAST_OPTION             0x00000400
 | 
			
		||||
/**< Allow reception of the broadcast address
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_MULTICAST_OPTION             0x00000800
 | 
			
		||||
/**< Allows reception of multicast addresses programmed into hash
 | 
			
		||||
 *   This option defaults to disabled (clear) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_RX_CHKSUM_ENABLE_OPTION      0x00001000
 | 
			
		||||
/**< Enable the RX checksum offload
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_TX_CHKSUM_ENABLE_OPTION      0x00002000
 | 
			
		||||
/**< Enable the TX checksum offload
 | 
			
		||||
 *   This option defaults to enabled (set) */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_DEFAULT_OPTIONS                     \
 | 
			
		||||
    (XEMACPS_FLOW_CONTROL_OPTION |                  \
 | 
			
		||||
     XEMACPS_FCS_INSERT_OPTION |                    \
 | 
			
		||||
     XEMACPS_FCS_STRIP_OPTION |                     \
 | 
			
		||||
     XEMACPS_BROADCAST_OPTION |                     \
 | 
			
		||||
     XEMACPS_LENTYPE_ERR_OPTION |                   \
 | 
			
		||||
     XEMACPS_TRANSMITTER_ENABLE_OPTION |            \
 | 
			
		||||
     XEMACPS_RECEIVER_ENABLE_OPTION |               \
 | 
			
		||||
     XEMACPS_RX_CHKSUM_ENABLE_OPTION |              \
 | 
			
		||||
     XEMACPS_TX_CHKSUM_ENABLE_OPTION)
 | 
			
		||||
 | 
			
		||||
/**< Default options set when device is initialized or reset */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name Callback identifiers
 | 
			
		||||
 *
 | 
			
		||||
 * These constants are used as parameters to XEmacPs_SetHandler()
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_HANDLER_DMASEND 1
 | 
			
		||||
#define XEMACPS_HANDLER_DMARECV 2
 | 
			
		||||
#define XEMACPS_HANDLER_ERROR   3
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/* Constants to determine the configuration of the hardware device. They are
 | 
			
		||||
 * used to allow the driver to verify it can operate with the hardware.
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_MDIO_DIV_DFT    MDC_DIV_32 /**< Default MDIO clock divisor */
 | 
			
		||||
 | 
			
		||||
/* The next few constants help upper layers determine the size of memory
 | 
			
		||||
 * pools used for Ethernet buffers and descriptor lists.
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_MAC_ADDR_SIZE   6	/* size of Ethernet header */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_MTU             1500	/* max MTU size of Ethernet frame */
 | 
			
		||||
#define XEMACPS_HDR_SIZE        14	/* size of Ethernet header */
 | 
			
		||||
#define XEMACPS_HDR_VLAN_SIZE   18	/* size of Ethernet header with VLAN */
 | 
			
		||||
#define XEMACPS_TRL_SIZE        4	/* size of Ethernet trailer (FCS) */
 | 
			
		||||
#define XEMACPS_MAX_FRAME_SIZE       (XEMACPS_MTU + XEMACPS_HDR_SIZE + \
 | 
			
		||||
        XEMACPS_TRL_SIZE)
 | 
			
		||||
#define XEMACPS_MAX_VLAN_FRAME_SIZE  (XEMACPS_MTU + XEMACPS_HDR_SIZE + \
 | 
			
		||||
        XEMACPS_HDR_VLAN_SIZE + XEMACPS_TRL_SIZE)
 | 
			
		||||
 | 
			
		||||
/* DMACR Bust length hash defines */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_SINGLE_BURST	1
 | 
			
		||||
#define XEMACPS_4BYTE_BURST		4
 | 
			
		||||
#define XEMACPS_8BYTE_BURST		8
 | 
			
		||||
#define XEMACPS_16BYTE_BURST	16
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions ******************************/
 | 
			
		||||
/** @name Typedefs for callback functions
 | 
			
		||||
 *
 | 
			
		||||
 * These callbacks are invoked in interrupt context.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * Callback invoked when frame(s) have been sent or received in interrupt
 | 
			
		||||
 * driven DMA mode. To set the send callback, invoke XEmacPs_SetHandler().
 | 
			
		||||
 *
 | 
			
		||||
 * @param CallBackRef is user data assigned when the callback was set.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * See xemacps_hw.h for bitmasks definitions and the device hardware spec for
 | 
			
		||||
 * further information on their meaning.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*XEmacPs_Handler) (void *CallBackRef);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Callback when an asynchronous error occurs. To set this callback, invoke
 | 
			
		||||
 * XEmacPs_SetHandler() with XEMACPS_HANDLER_ERROR in the HandlerType
 | 
			
		||||
 * paramter.
 | 
			
		||||
 *
 | 
			
		||||
 * @param CallBackRef is user data assigned when the callback was set.
 | 
			
		||||
 * @param Direction defines either receive or transmit error(s) has occurred.
 | 
			
		||||
 * @param ErrorWord definition varies with Direction
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*XEmacPs_ErrHandler) (void *CallBackRef, u8 Direction,
 | 
			
		||||
				     u32 ErrorWord);
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for a device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16 DeviceId;	/**< Unique ID  of device */
 | 
			
		||||
	u32 BaseAddress;/**< Physical base address of IPIF registers */
 | 
			
		||||
} XEmacPs_Config;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XEmacPs driver instance data. The user is required to allocate a
 | 
			
		||||
 * structure of this type for every XEmacPs device in the system. A pointer
 | 
			
		||||
 * to a structure of this type is then passed to the driver API functions.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct XEmacPs {
 | 
			
		||||
	XEmacPs_Config Config;	/* Hardware configuration */
 | 
			
		||||
	u32 IsStarted;		/* Device is currently started */
 | 
			
		||||
	u32 IsReady;		/* Device is initialized and ready */
 | 
			
		||||
	u32 Options;		/* Current options word */
 | 
			
		||||
 | 
			
		||||
	XEmacPs_BdRing TxBdRing;	/* Transmit BD ring */
 | 
			
		||||
	XEmacPs_BdRing RxBdRing;	/* Receive BD ring */
 | 
			
		||||
 | 
			
		||||
	XEmacPs_Handler SendHandler;
 | 
			
		||||
	XEmacPs_Handler RecvHandler;
 | 
			
		||||
	void *SendRef;
 | 
			
		||||
	void *RecvRef;
 | 
			
		||||
 | 
			
		||||
	XEmacPs_ErrHandler ErrorHandler;
 | 
			
		||||
	void *ErrorRef;
 | 
			
		||||
 | 
			
		||||
} XEmacPs;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions ********************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Retrieve the Tx ring object. This object can be used in the various Ring
 | 
			
		||||
* API functions.
 | 
			
		||||
*
 | 
			
		||||
* @param  InstancePtr is the DMA channel to operate on.
 | 
			
		||||
*
 | 
			
		||||
* @return TxBdRing attribute
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    XEmacPs_BdRing XEmacPs_GetTxRing(XEmacPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_GetTxRing(InstancePtr) ((InstancePtr)->TxBdRing)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Retrieve the Rx ring object. This object can be used in the various Ring
 | 
			
		||||
* API functions.
 | 
			
		||||
*
 | 
			
		||||
* @param  InstancePtr is the DMA channel to operate on.
 | 
			
		||||
*
 | 
			
		||||
* @return RxBdRing attribute
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    XEmacPs_BdRing XEmacPs_GetRxRing(XEmacPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_GetRxRing(InstancePtr) ((InstancePtr)->RxBdRing)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Enable interrupts specified in <i>Mask</i>. The corresponding interrupt for
 | 
			
		||||
* each bit set to 1 in <i>Mask</i>, will be enabled.
 | 
			
		||||
*
 | 
			
		||||
* @param InstancePtr is a pointer to the instance to be worked on.
 | 
			
		||||
* @param Mask contains a bit mask of interrupts to enable. The mask can
 | 
			
		||||
*        be formed using a set of bitwise or'd values.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* The state of the transmitter and receiver are not modified by this function.
 | 
			
		||||
* C-style signature
 | 
			
		||||
*     void XEmacPs_IntEnable(XEmacPs *InstancePtr, u32 Mask)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_IntEnable(InstancePtr, Mask)                            \
 | 
			
		||||
	XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress,             \
 | 
			
		||||
		XEMACPS_IER_OFFSET,                                     \
 | 
			
		||||
		(Mask & XEMACPS_IXR_ALL_MASK));
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Disable interrupts specified in <i>Mask</i>. The corresponding interrupt for
 | 
			
		||||
* each bit set to 1 in <i>Mask</i>, will be enabled.
 | 
			
		||||
*
 | 
			
		||||
* @param InstancePtr is a pointer to the instance to be worked on.
 | 
			
		||||
* @param Mask contains a bit mask of interrupts to disable. The mask can
 | 
			
		||||
*        be formed using a set of bitwise or'd values.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* The state of the transmitter and receiver are not modified by this function.
 | 
			
		||||
* C-style signature
 | 
			
		||||
*     void XEmacPs_IntDisable(XEmacPs *InstancePtr, u32 Mask)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_IntDisable(InstancePtr, Mask)                           \
 | 
			
		||||
	XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress,             \
 | 
			
		||||
		XEMACPS_IDR_OFFSET,                                     \
 | 
			
		||||
		(Mask & XEMACPS_IXR_ALL_MASK));
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro triggers trasmit circuit to send data currently in TX buffer(s).
 | 
			
		||||
*
 | 
			
		||||
* @param InstancePtr is a pointer to the XEmacPs instance to be worked on.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
*
 | 
			
		||||
* Signature: void XEmacPs_Transmit(XEmacPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_Transmit(InstancePtr)                              \
 | 
			
		||||
        XEmacPs_WriteReg(InstancePtr->Config.BaseAddress,          \
 | 
			
		||||
        XEMACPS_NWCTRL_OFFSET,                                     \
 | 
			
		||||
        (XEmacPs_ReadReg(InstancePtr->Config.BaseAddress,          \
 | 
			
		||||
        XEMACPS_NWCTRL_OFFSET) | XEMACPS_NWCTRL_STARTTX_MASK))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro determines if the device is configured with checksum offloading
 | 
			
		||||
* on the receive channel
 | 
			
		||||
*
 | 
			
		||||
* @param InstancePtr is a pointer to the XEmacPs instance to be worked on.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*
 | 
			
		||||
* Boolean TRUE if the device is configured with checksum offloading, or
 | 
			
		||||
* FALSE otherwise.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
*
 | 
			
		||||
* Signature: u32 XEmacPs_IsRxCsum(XEmacPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_IsRxCsum(InstancePtr)                                     \
 | 
			
		||||
        ((XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress,             \
 | 
			
		||||
          XEMACPS_NWCFG_OFFSET) & XEMACPS_NWCFG_RXCHKSUMEN_MASK)         \
 | 
			
		||||
          ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro determines if the device is configured with checksum offloading
 | 
			
		||||
* on the transmit channel
 | 
			
		||||
*
 | 
			
		||||
* @param InstancePtr is a pointer to the XEmacPs instance to be worked on.
 | 
			
		||||
*
 | 
			
		||||
* @return
 | 
			
		||||
*
 | 
			
		||||
* Boolean TRUE if the device is configured with checksum offloading, or
 | 
			
		||||
* FALSE otherwise.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
*
 | 
			
		||||
* Signature: u32 XEmacPs_IsTxCsum(XEmacPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_IsTxCsum(InstancePtr)                                     \
 | 
			
		||||
        ((XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress,              \
 | 
			
		||||
          XEMACPS_DMACR_OFFSET) & XEMACPS_DMACR_TCPCKSUM_MASK)           \
 | 
			
		||||
          ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes *****************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Initialization functions in xemacps.c
 | 
			
		||||
 */
 | 
			
		||||
int XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config *CfgPtr,
 | 
			
		||||
			   u32 EffectiveAddress);
 | 
			
		||||
void XEmacPs_Start(XEmacPs *InstancePtr);
 | 
			
		||||
void XEmacPs_Stop(XEmacPs *InstancePtr);
 | 
			
		||||
void XEmacPs_Reset(XEmacPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Lookup configuration in xemacps_sinit.c
 | 
			
		||||
 */
 | 
			
		||||
XEmacPs_Config *XEmacPs_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interrupt-related functions in xemacps_intr.c
 | 
			
		||||
 * DMA only and FIFO is not supported. This DMA does not support coalescing.
 | 
			
		||||
 */
 | 
			
		||||
int XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType,
 | 
			
		||||
			void *FuncPtr, void *CallBackRef);
 | 
			
		||||
void XEmacPs_IntrHandler(void *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * MAC configuration/control functions in XEmacPs_control.c
 | 
			
		||||
 */
 | 
			
		||||
int XEmacPs_SetOptions(XEmacPs *InstancePtr, u32 Options);
 | 
			
		||||
int XEmacPs_ClearOptions(XEmacPs *InstancePtr, u32 Options);
 | 
			
		||||
u32 XEmacPs_GetOptions(XEmacPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index);
 | 
			
		||||
void XEmacPs_GetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index);
 | 
			
		||||
 | 
			
		||||
int XEmacPs_SetHash(XEmacPs *InstancePtr, void *AddressPtr);
 | 
			
		||||
void XEmacPs_ClearHash(XEmacPs *InstancePtr);
 | 
			
		||||
void XEmacPs_GetHash(XEmacPs *InstancePtr, void *AddressPtr);
 | 
			
		||||
 | 
			
		||||
void XEmacPs_SetMdioDivisor(XEmacPs *InstancePtr,
 | 
			
		||||
				XEmacPs_MdcDiv Divisor);
 | 
			
		||||
void XEmacPs_SetOperatingSpeed(XEmacPs *InstancePtr, u16 Speed);
 | 
			
		||||
u16 XEmacPs_GetOperatingSpeed(XEmacPs *InstancePtr);
 | 
			
		||||
int XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress,
 | 
			
		||||
		     u32 RegisterNum, u16 *PhyDataPtr);
 | 
			
		||||
int XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress,
 | 
			
		||||
		      u32 RegisterNum, u16 PhyData);
 | 
			
		||||
int XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index);
 | 
			
		||||
 | 
			
		||||
int XEmacPs_SendPausePacket(XEmacPs *InstancePtr);
 | 
			
		||||
void XEmacPs_DMABLengthUpdate(XEmacPs *InstancePtr, int BLength);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,737 @@
 | 
			
		|||
/* $Id: xemacps_bd.h,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @file xemacps_bd.h
 | 
			
		||||
 *
 | 
			
		||||
 * This header provides operations to manage buffer descriptors in support
 | 
			
		||||
 * of scatter-gather DMA.
 | 
			
		||||
 *
 | 
			
		||||
 * The API exported by this header defines abstracted macros that allow the
 | 
			
		||||
 * user to read/write specific BD fields.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Buffer Descriptors</b>
 | 
			
		||||
 *
 | 
			
		||||
 * A buffer descriptor (BD) defines a DMA transaction. The macros defined by
 | 
			
		||||
 * this header file allow access to most fields within a BD to tailor a DMA
 | 
			
		||||
 * transaction according to user and hardware requirements.  See the hardware
 | 
			
		||||
 * IP DMA spec for more information on BD fields and how they affect transfers.
 | 
			
		||||
 *
 | 
			
		||||
 * The XEmacPs_Bd structure defines a BD. The organization of this structure
 | 
			
		||||
 * is driven mainly by the hardware for use in scatter-gather DMA transfers.
 | 
			
		||||
 *
 | 
			
		||||
 * <b>Performance</b>
 | 
			
		||||
 *
 | 
			
		||||
 * Limiting I/O to BDs can improve overall performance of the DMA channel.
 | 
			
		||||
 *
 | 
			
		||||
 * <pre>
 | 
			
		||||
 * MODIFICATION HISTORY:
 | 
			
		||||
 *
 | 
			
		||||
 * Ver   Who  Date     Changes
 | 
			
		||||
 * ----- ---- -------- -------------------------------------------------------
 | 
			
		||||
 * 1.00a wsy  01/10/10 First release
 | 
			
		||||
 * </pre>
 | 
			
		||||
 *
 | 
			
		||||
 * ***************************************************************************
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef XEMACPS_BD_H		/* prevent circular inclusions */
 | 
			
		||||
#define XEMACPS_BD_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/* Minimum BD alignment */
 | 
			
		||||
#define XEMACPS_DMABD_MINIMUM_ALIGNMENT  4
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XEmacPs_Bd is the type for buffer descriptors (BDs).
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_BD_NUM_WORDS 2
 | 
			
		||||
typedef u32 XEmacPs_Bd[XEMACPS_BD_NUM_WORDS];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Zero out BD fields
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @return Nothing
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdClear(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdClear(BdPtr)                                  \
 | 
			
		||||
    memset((BdPtr), 0, sizeof(XEmacPs_Bd))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Read the given Buffer Descriptor word.
 | 
			
		||||
*
 | 
			
		||||
* @param    BaseAddress is the base address of the BD to read
 | 
			
		||||
* @param    Offset is the word offset to be read
 | 
			
		||||
*
 | 
			
		||||
* @return   The 32-bit value of the field
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    u32 XEmacPs_BdRead(u32 BaseAddress, u32 Offset)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRead(BaseAddress, Offset)             \
 | 
			
		||||
    (*(u32*)((u32)(BaseAddress) + (u32)(Offset)))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Write the given Buffer Descriptor word.
 | 
			
		||||
*
 | 
			
		||||
* @param    BaseAddress is the base address of the BD to write
 | 
			
		||||
* @param    Offset is the word offset to be written
 | 
			
		||||
* @param    Data is the 32-bit value to write to the field
 | 
			
		||||
*
 | 
			
		||||
* @return   None.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    void XEmacPs_BdWrite(u32 BaseAddress, u32 Offset, u32 Data)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdWrite(BaseAddress, Offset, Data)              \
 | 
			
		||||
    (*(u32*)((u32)(BaseAddress) + (u32)(Offset)) = (Data))
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Set the BD's Address field (word 0).
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 * @param  Addr  is the value to write to BD's status field.
 | 
			
		||||
 *
 | 
			
		||||
 * @note :
 | 
			
		||||
 *
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetAddressTx(XEmacPs_Bd* BdPtr, u32 Addr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetAddressTx(BdPtr, Addr)                        \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, (u32)(Addr)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Set the BD's Address field (word 0).
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 * @param  Addr  is the value to write to BD's status field.
 | 
			
		||||
 *
 | 
			
		||||
 * @note : Due to some bits are mixed within recevie BD's address field,
 | 
			
		||||
 *         read-modify-write is performed.
 | 
			
		||||
 *
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetAddressRx(XEmacPs_Bd* BdPtr, u32 Addr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetAddressRx(BdPtr, Addr)                        \
 | 
			
		||||
    XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET,              \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) &           \
 | 
			
		||||
    ~XEMACPS_RXBUF_ADD_MASK) | (u32)(Addr)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Set the BD's Status field (word 1).
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 * @param  Data  is the value to write to BD's status field.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetStatus(XEmacPs_Bd* BdPtr, u32 Data)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetStatus(BdPtr, Data)                           \
 | 
			
		||||
    XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,              \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | Data)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieve the BD's Packet DMA transfer status word (word 1).
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @return Status word
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdGetStatus(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 * Due to the BD bit layout differences in transmit and receive. User's
 | 
			
		||||
 * caution is required.
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdGetStatus(BdPtr)                                 \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Get the address (bits 0..31) of the BD's buffer address (word 0)
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdGetBufAddr(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdGetBufAddr(BdPtr)                               \
 | 
			
		||||
    (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Set transfer length in bytes for the given BD. The length must be set each
 | 
			
		||||
 * time a BD is submitted to hardware.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 * @param  LenBytes is the number of bytes to transfer.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetLength(XEmacPs_Bd* BdPtr, u32 LenBytes)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetLength(BdPtr, LenBytes)                       \
 | 
			
		||||
    XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,              \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    ~XEMACPS_TXBUF_LEN_MASK) | (LenBytes)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieve the BD length field.
 | 
			
		||||
 *
 | 
			
		||||
 * For Tx channels, the returned value is the same as that written with
 | 
			
		||||
 * XEmacPs_BdSetLength().
 | 
			
		||||
 *
 | 
			
		||||
 * For Rx channels, the returned value is the size of the received packet.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @return Length field processed by hardware or set by
 | 
			
		||||
 *         XEmacPs_BdSetLength().
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdGetLength(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *    XEAMCPS_RXBUF_LEN_MASK is same as XEMACPS_TXBUF_LEN_MASK.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdGetLength(BdPtr)                                 \
 | 
			
		||||
    (XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &            \
 | 
			
		||||
    XEMACPS_RXBUF_LEN_MASK)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Test whether the given BD has been marked as the last BD of a packet.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @return TRUE if BD represents the "Last" BD of a packet, FALSE otherwise
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsLast(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsLast(BdPtr)                                    \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_EOF_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Tell the DMA engine that the given transmit BD marks the end of the current
 | 
			
		||||
 * packet to be processed.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetLast(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetLast(BdPtr)                                   \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) |             \
 | 
			
		||||
    XEMACPS_TXBUF_LAST_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Tell the DMA engine that the current packet does not end with the given
 | 
			
		||||
 * BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdClearLast(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdClearLast(BdPtr)                                 \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &             \
 | 
			
		||||
    ~XEMACPS_TXBUF_LAST_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Set this bit to mark the last descriptor in the receive buffer descriptor
 | 
			
		||||
 * list.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetRxWrap(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetRxWrap(BdPtr)                                 \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) |             \
 | 
			
		||||
    XEMACPS_RXBUF_WRAP_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the wrap bit of the receive BD which indicates end of the
 | 
			
		||||
 * BD list.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxWrap(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxWrap(BdPtr)                                  \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_WRAP_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Sets this bit to mark the last descriptor in the transmit buffer
 | 
			
		||||
 * descriptor list.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetTxWrap(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetTxWrap(BdPtr)                                 \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) |             \
 | 
			
		||||
    XEMACPS_TXBUF_WRAP_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the wrap bit of the transmit BD which indicates end of the
 | 
			
		||||
 * BD list.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdGetTxWrap(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsTxWrap(BdPtr)                                  \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_TXBUF_WRAP_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Must clear this bit to enable the MAC to write data to the receive
 | 
			
		||||
 * buffer. Hardware sets this bit once it has successfully written a frame to
 | 
			
		||||
 * memory. Once set, software has to clear the bit before the buffer can be
 | 
			
		||||
 * used again. This macro clear the new bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdClearRxNew(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdClearRxNew(BdPtr)                                \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) &             \
 | 
			
		||||
    ~XEMACPS_RXBUF_NEW_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the new bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxNew(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxNew(BdPtr)                                   \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_NEW_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Software sets this bit to disable the buffer to be read by the hardware.
 | 
			
		||||
 * Hardware sets this bit for the first buffer of a frame once it has been
 | 
			
		||||
 * successfully transmitted. This macro sets this bit of transmit BD to avoid
 | 
			
		||||
 * confusion.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdSetTxUsed(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetTxUsed(BdPtr)                                 \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) |             \
 | 
			
		||||
    XEMACPS_TXBUF_USED_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Software clears this bit to enable the buffer to be read by the hardware.
 | 
			
		||||
 * Hardware sets this bit for the first buffer of a frame once it has been
 | 
			
		||||
 * successfully transmitted. This macro clears this bit of transmit BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    void XEmacPs_BdClearTxUsed(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdClearTxUsed(BdPtr)                               \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &             \
 | 
			
		||||
    ~XEMACPS_TXBUF_USED_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the used bit of the transmit BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsTxUsed(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsTxUsed(BdPtr)                                  \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_TXBUF_USED_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine if a frame fails to be transmitted due to too many retries.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsTxRetry(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsTxRetry(BdPtr)                                 \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_TXBUF_RETRY_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine if a frame fails to be transmitted due to data can not be
 | 
			
		||||
 * feteched in time or buffers are exhausted.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsTxUrun(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsTxUrun(BdPtr)                                  \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_TXBUF_URUN_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine if a frame fails to be transmitted due to buffer is exhausted
 | 
			
		||||
 * mid-frame.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsTxExh(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsTxExh(BdPtr)                                   \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_TXBUF_EXH_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Sets this bit, no CRC will be appended to the current frame. This control
 | 
			
		||||
 * bit must be set for the first buffer in a frame and will be ignored for
 | 
			
		||||
 * the subsequent buffers of a frame.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * This bit must be clear when using the transmit checksum generation offload,
 | 
			
		||||
 * otherwise checksum generation and substitution will not occur.
 | 
			
		||||
 *
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdSetTxNoCRC(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdSetTxNoCRC(BdPtr)                                \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) |             \
 | 
			
		||||
    XEMACPS_TXBUF_NOCRC_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Clear this bit, CRC will be appended to the current frame. This control
 | 
			
		||||
 * bit must be set for the first buffer in a frame and will be ignored for
 | 
			
		||||
 * the subsequent buffers of a frame.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * This bit must be clear when using the transmit checksum generation offload,
 | 
			
		||||
 * otherwise checksum generation and substitution will not occur.
 | 
			
		||||
 *
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdClearTxNoCRC(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdClearTxNoCRC(BdPtr)                              \
 | 
			
		||||
    (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET,             \
 | 
			
		||||
    XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &             \
 | 
			
		||||
    ~XEMACPS_TXBUF_NOCRC_MASK))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the broadcast bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxBcast(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxBcast(BdPtr)                                 \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_BCAST_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the multicast hash bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxMultiHash(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxMultiHash(BdPtr)                             \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_MULTIHASH_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the unicast hash bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxUniHash(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxUniHash(BdPtr)                               \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_UNIHASH_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine if the received frame is a VLAN Tagged frame.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxVlan(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxVlan(BdPtr)                                  \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_VLAN_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine if the received frame has Type ID of 8100h and null VLAN
 | 
			
		||||
 * identifier(Priority tag).
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxPri(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxPri(BdPtr)                                   \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_PRI_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine if the received frame's Concatenation Format Indicator (CFI) of
 | 
			
		||||
 * the frames VLANTCI field was set.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdIsRxCFI(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxCFI(BdPtr)                                   \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_CFI_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the End Of Frame (EOF) bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdGetRxEOF(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxEOF(BdPtr)                                   \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_EOF_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * Determine the Start Of Frame (SOF) bit of the receive BD.
 | 
			
		||||
 *
 | 
			
		||||
 * @param  BdPtr is the BD pointer to operate on
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * C-style signature:
 | 
			
		||||
 *    u32 XEmacPs_BdGetRxSOF(XEmacPs_Bd* BdPtr)
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdIsRxSOF(BdPtr)                                   \
 | 
			
		||||
    ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) &           \
 | 
			
		||||
    XEMACPS_RXBUF_SOF_MASK) ? TRUE : FALSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,242 @@
 | 
			
		|||
/* $Id: xemacps_bdring.h,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xemacps_bdring.h
 | 
			
		||||
*
 | 
			
		||||
* The Xiline EmacPs Buffer Descriptor ring driver. This is part of EmacPs
 | 
			
		||||
* DMA functionalities.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- -------------------------------------------------------
 | 
			
		||||
* 1.00a wsy  01/10/10 First release
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XEMACPS_BDRING_H	/* prevent curcular inclusions */
 | 
			
		||||
#define XEMACPS_BDRING_H	/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/** This is an internal structure used to maintain the DMA list */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u32 PhysBaseAddr;/**< Physical address of 1st BD in list */
 | 
			
		||||
	u32 BaseBdAddr;	 /**< Virtual address of 1st BD in list */
 | 
			
		||||
	u32 HighBdAddr;	 /**< Virtual address of last BD in the list */
 | 
			
		||||
	u32 Length;	 /**< Total size of ring in bytes */
 | 
			
		||||
	u32 RunState;	 /**< Flag to indicate DMA is started */
 | 
			
		||||
	u32 Separation;	 /**< Number of bytes between the starting address
 | 
			
		||||
                                  of adjacent BDs */
 | 
			
		||||
	XEmacPs_Bd *FreeHead;
 | 
			
		||||
			     /**< First BD in the free group */
 | 
			
		||||
	XEmacPs_Bd *PreHead;/**< First BD in the pre-work group */
 | 
			
		||||
	XEmacPs_Bd *HwHead; /**< First BD in the work group */
 | 
			
		||||
	XEmacPs_Bd *HwTail; /**< Last BD in the work group */
 | 
			
		||||
	XEmacPs_Bd *PostHead;
 | 
			
		||||
			     /**< First BD in the post-work group */
 | 
			
		||||
	XEmacPs_Bd *BdaRestart;
 | 
			
		||||
			     /**< BDA to load when channel is started */
 | 
			
		||||
	unsigned HwCnt;	     /**< Number of BDs in work group */
 | 
			
		||||
	unsigned PreCnt;     /**< Number of BDs in pre-work group */
 | 
			
		||||
	unsigned FreeCnt;    /**< Number of allocatable BDs in the free group */
 | 
			
		||||
	unsigned PostCnt;    /**< Number of BDs in post-work group */
 | 
			
		||||
	unsigned AllCnt;     /**< Total Number of BDs for channel */
 | 
			
		||||
} XEmacPs_BdRing;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Use this macro at initialization time to determine how many BDs will fit
 | 
			
		||||
* in a BD list within the given memory constraints.
 | 
			
		||||
*
 | 
			
		||||
* The results of this macro can be provided to XEmacPs_BdRingCreate().
 | 
			
		||||
*
 | 
			
		||||
* @param Alignment specifies what byte alignment the BDs must fall on and
 | 
			
		||||
*        must be a power of 2 to get an accurate calculation (32, 64, 128,...)
 | 
			
		||||
* @param Bytes is the number of bytes to be used to store BDs.
 | 
			
		||||
*
 | 
			
		||||
* @return Number of BDs that can fit in the given memory area
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    u32 XEmacPs_BdRingCntCalc(u32 Alignment, u32 Bytes)
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRingCntCalc(Alignment, Bytes)                    \
 | 
			
		||||
    (u32)((Bytes) / ((sizeof(XEmacPs_Bd) + ((Alignment)-1)) &   \
 | 
			
		||||
    ~((Alignment)-1)))
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Use this macro at initialization time to determine how many bytes of memory
 | 
			
		||||
* is required to contain a given number of BDs at a given alignment.
 | 
			
		||||
*
 | 
			
		||||
* @param Alignment specifies what byte alignment the BDs must fall on. This
 | 
			
		||||
*        parameter must be a power of 2 to get an accurate calculation (32, 64,
 | 
			
		||||
*        128,...)
 | 
			
		||||
* @param NumBd is the number of BDs to calculate memory size requirements for
 | 
			
		||||
*
 | 
			
		||||
* @return The number of bytes of memory required to create a BD list with the
 | 
			
		||||
*         given memory constraints.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    u32 XEmacPs_BdRingMemCalc(u32 Alignment, u32 NumBd)
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRingMemCalc(Alignment, NumBd)                    \
 | 
			
		||||
    (u32)((sizeof(XEmacPs_Bd) + ((Alignment)-1)) &              \
 | 
			
		||||
    ~((Alignment)-1)) * (NumBd)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Return the total number of BDs allocated by this channel with
 | 
			
		||||
* XEmacPs_BdRingCreate().
 | 
			
		||||
*
 | 
			
		||||
* @param  RingPtr is the DMA channel to operate on.
 | 
			
		||||
*
 | 
			
		||||
* @return The total number of BDs allocated for this channel.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    u32 XEmacPs_BdRingGetCnt(XEmacPs_BdRing* RingPtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRingGetCnt(RingPtr) ((RingPtr)->AllCnt)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Return the number of BDs allocatable with XEmacPs_BdRingAlloc() for pre-
 | 
			
		||||
* processing.
 | 
			
		||||
*
 | 
			
		||||
* @param  RingPtr is the DMA channel to operate on.
 | 
			
		||||
*
 | 
			
		||||
* @return The number of BDs currently allocatable.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    u32 XEmacPs_BdRingGetFreeCnt(XEmacPs_BdRing* RingPtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRingGetFreeCnt(RingPtr)   ((RingPtr)->FreeCnt)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Return the next BD from BdPtr in a list.
 | 
			
		||||
*
 | 
			
		||||
* @param  RingPtr is the DMA channel to operate on.
 | 
			
		||||
* @param  BdPtr is the BD to operate on.
 | 
			
		||||
*
 | 
			
		||||
* @return The next BD in the list relative to the BdPtr parameter.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    XEmacPs_Bd *XEmacPs_BdRingNext(XEmacPs_BdRing* RingPtr,
 | 
			
		||||
*                                      XEmacPs_Bd *BdPtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRingNext(RingPtr, BdPtr)                           \
 | 
			
		||||
    (((u32)(BdPtr) >= (RingPtr)->HighBdAddr) ?                     \
 | 
			
		||||
    (XEmacPs_Bd*)(RingPtr)->BaseBdAddr :                              \
 | 
			
		||||
    (XEmacPs_Bd*)((u32)(BdPtr) + (RingPtr)->Separation))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* Return the previous BD from BdPtr in the list.
 | 
			
		||||
*
 | 
			
		||||
* @param  RingPtr is the DMA channel to operate on.
 | 
			
		||||
* @param  BdPtr is the BD to operate on
 | 
			
		||||
*
 | 
			
		||||
* @return The previous BD in the list relative to the BdPtr parameter.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    XEmacPs_Bd *XEmacPs_BdRingPrev(XEmacPs_BdRing* RingPtr,
 | 
			
		||||
*                                      XEmacPs_Bd *BdPtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_BdRingPrev(RingPtr, BdPtr)                           \
 | 
			
		||||
    (((u32)(BdPtr) <= (RingPtr)->BaseBdAddr) ?                     \
 | 
			
		||||
    (XEmacPs_Bd*)(RingPtr)->HighBdAddr :                              \
 | 
			
		||||
    (XEmacPs_Bd*)((u32)(BdPtr) - (RingPtr)->Separation))
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Scatter gather DMA related functions in xemacps_bdring.c
 | 
			
		||||
 */
 | 
			
		||||
int XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, u32 PhysAddr,
 | 
			
		||||
			  u32 VirtAddr, u32 Alignment, unsigned BdCount);
 | 
			
		||||
int XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr,
 | 
			
		||||
			 u8 Direction);
 | 
			
		||||
int XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd,
 | 
			
		||||
			 XEmacPs_Bd ** BdSetPtr);
 | 
			
		||||
int XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd,
 | 
			
		||||
			   XEmacPs_Bd * BdSetPtr);
 | 
			
		||||
int XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, unsigned NumBd,
 | 
			
		||||
			XEmacPs_Bd * BdSetPtr);
 | 
			
		||||
int XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, unsigned NumBd,
 | 
			
		||||
			XEmacPs_Bd * BdSetPtr);
 | 
			
		||||
unsigned XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, unsigned BdLimit,
 | 
			
		||||
				 XEmacPs_Bd ** BdSetPtr);
 | 
			
		||||
unsigned XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, unsigned BdLimit,
 | 
			
		||||
				 XEmacPs_Bd ** BdSetPtr);
 | 
			
		||||
int XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macros */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,605 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xemacps_hw.h
 | 
			
		||||
*
 | 
			
		||||
* This header file contains identifiers and low-level driver functions (or
 | 
			
		||||
* macros) that can be used to access the PS Ethernet MAC (XEmacPs) device.
 | 
			
		||||
* High-level driver functions are defined in xemacps.h.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- -------------------------------------------------------
 | 
			
		||||
* 1.00a wsy  01/10/10 First release.
 | 
			
		||||
* 1.02a asa  11/05/12 Added hash defines for DMACR burst length configuration.
 | 
			
		||||
* 1.05a kpc  28/06/13 Added XEmacPs_ResetHw function prototype
 | 
			
		||||
* 1.06a asa  11/02/13 Changed the value for XEMACPS_RXBUF_LEN_MASK from 0x3fff
 | 
			
		||||
*					  to 0x1fff. This fixes the CR#744902.
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XEMACPS_HW_H		/* prevent circular inclusions */
 | 
			
		||||
#define XEMACPS_HW_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_MAX_MAC_ADDR     4   /**< Maxmum number of mac address
 | 
			
		||||
                                           supported */
 | 
			
		||||
#define XEMACPS_MAX_TYPE_ID      4   /**< Maxmum number of type id supported */
 | 
			
		||||
#define XEMACPS_BD_ALIGNMENT     4   /**< Minimum buffer descriptor alignment
 | 
			
		||||
                                           on the local bus */
 | 
			
		||||
#define XEMACPS_RX_BUF_ALIGNMENT 4   /**< Minimum buffer alignment when using
 | 
			
		||||
                                           options that impose alignment
 | 
			
		||||
                                           restrictions on the buffer data on
 | 
			
		||||
                                           the local bus */
 | 
			
		||||
 | 
			
		||||
/** @name Direction identifiers
 | 
			
		||||
 *
 | 
			
		||||
 *  These are used by several functions and callbacks that need
 | 
			
		||||
 *  to specify whether an operation specifies a send or receive channel.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_SEND        1	      /**< send direction */
 | 
			
		||||
#define XEMACPS_RECV        2	      /**< receive direction */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**  @name MDC clock division
 | 
			
		||||
 *  currently supporting 8, 16, 32, 48, 64, 96, 128, 224.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
typedef enum { MDC_DIV_8 = 0, MDC_DIV_16, MDC_DIV_32, MDC_DIV_48,
 | 
			
		||||
	MDC_DIV_64, MDC_DIV_96, MDC_DIV_128, MDC_DIV_224
 | 
			
		||||
} XEmacPs_MdcDiv;
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_RX_BUF_SIZE 1536 /**< Specify the receive buffer size in
 | 
			
		||||
                                       bytes, 64, 128, ... 10240 */
 | 
			
		||||
#define XEMACPS_RX_BUF_UNIT   64 /**< Number of receive buffer bytes as a
 | 
			
		||||
                                       unit, this is HW setup */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_MAX_RXBD     128 /**< Size of RX buffer descriptor queues */
 | 
			
		||||
#define XEMACPS_MAX_TXBD     128 /**< Size of TX buffer descriptor queues */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_MAX_HASH_BITS 64 /**< Maximum value for hash bits. 2**6 */
 | 
			
		||||
 | 
			
		||||
/* Register offset definitions. Unless otherwise noted, register access is
 | 
			
		||||
 * 32 bit. Names are self explained here.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_NWCTRL_OFFSET        0x00000000 /**< Network Control reg */
 | 
			
		||||
#define XEMACPS_NWCFG_OFFSET         0x00000004 /**< Network Config reg */
 | 
			
		||||
#define XEMACPS_NWSR_OFFSET          0x00000008 /**< Network Status reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_DMACR_OFFSET         0x00000010 /**< DMA Control reg */
 | 
			
		||||
#define XEMACPS_TXSR_OFFSET          0x00000014 /**< TX Status reg */
 | 
			
		||||
#define XEMACPS_RXQBASE_OFFSET       0x00000018 /**< RX Q Base address reg */
 | 
			
		||||
#define XEMACPS_TXQBASE_OFFSET       0x0000001C /**< TX Q Base address reg */
 | 
			
		||||
#define XEMACPS_RXSR_OFFSET          0x00000020 /**< RX Status reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_ISR_OFFSET           0x00000024 /**< Interrupt Status reg */
 | 
			
		||||
#define XEMACPS_IER_OFFSET           0x00000028 /**< Interrupt Enable reg */
 | 
			
		||||
#define XEMACPS_IDR_OFFSET           0x0000002C /**< Interrupt Disable reg */
 | 
			
		||||
#define XEMACPS_IMR_OFFSET           0x00000030 /**< Interrupt Mask reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_PHYMNTNC_OFFSET      0x00000034 /**< Phy Maintaince reg */
 | 
			
		||||
#define XEMACPS_RXPAUSE_OFFSET       0x00000038 /**< RX Pause Time reg */
 | 
			
		||||
#define XEMACPS_TXPAUSE_OFFSET       0x0000003C /**< TX Pause Time reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_HASHL_OFFSET         0x00000080 /**< Hash Low address reg */
 | 
			
		||||
#define XEMACPS_HASHH_OFFSET         0x00000084 /**< Hash High address reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_LADDR1L_OFFSET       0x00000088 /**< Specific1 addr low reg */
 | 
			
		||||
#define XEMACPS_LADDR1H_OFFSET       0x0000008C /**< Specific1 addr high reg */
 | 
			
		||||
#define XEMACPS_LADDR2L_OFFSET       0x00000090 /**< Specific2 addr low reg */
 | 
			
		||||
#define XEMACPS_LADDR2H_OFFSET       0x00000094 /**< Specific2 addr high reg */
 | 
			
		||||
#define XEMACPS_LADDR3L_OFFSET       0x00000098 /**< Specific3 addr low reg */
 | 
			
		||||
#define XEMACPS_LADDR3H_OFFSET       0x0000009C /**< Specific3 addr high reg */
 | 
			
		||||
#define XEMACPS_LADDR4L_OFFSET       0x000000A0 /**< Specific4 addr low reg */
 | 
			
		||||
#define XEMACPS_LADDR4H_OFFSET       0x000000A4 /**< Specific4 addr high reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_MATCH1_OFFSET        0x000000A8 /**< Type ID1 Match reg */
 | 
			
		||||
#define XEMACPS_MATCH2_OFFSET        0x000000AC /**< Type ID2 Match reg */
 | 
			
		||||
#define XEMACPS_MATCH3_OFFSET        0x000000B0 /**< Type ID3 Match reg */
 | 
			
		||||
#define XEMACPS_MATCH4_OFFSET        0x000000B4 /**< Type ID4 Match reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_STRETCH_OFFSET       0x000000BC /**< IPG Stretch reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_OCTTXL_OFFSET        0x00000100 /**< Octects transmitted Low
 | 
			
		||||
                                                      reg */
 | 
			
		||||
#define XEMACPS_OCTTXH_OFFSET        0x00000104 /**< Octects transmitted High
 | 
			
		||||
                                                      reg */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_TXCNT_OFFSET         0x00000108 /**< Error-free Frmaes
 | 
			
		||||
                                                      transmitted counter */
 | 
			
		||||
#define XEMACPS_TXBCCNT_OFFSET       0x0000010C /**< Error-free Broadcast
 | 
			
		||||
                                                      Frames counter*/
 | 
			
		||||
#define XEMACPS_TXMCCNT_OFFSET       0x00000110 /**< Error-free Multicast
 | 
			
		||||
                                                      Frame counter */
 | 
			
		||||
#define XEMACPS_TXPAUSECNT_OFFSET    0x00000114 /**< Pause Frames Transmitted
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_TX64CNT_OFFSET       0x00000118 /**< Error-free 64 byte Frames
 | 
			
		||||
                                                      Transmitted counter */
 | 
			
		||||
#define XEMACPS_TX65CNT_OFFSET       0x0000011C /**< Error-free 65-127 byte
 | 
			
		||||
                                                      Frames Transmitted
 | 
			
		||||
                                                      counter */
 | 
			
		||||
#define XEMACPS_TX128CNT_OFFSET      0x00000120 /**< Error-free 128-255 byte
 | 
			
		||||
                                                      Frames Transmitted
 | 
			
		||||
                                                      counter*/
 | 
			
		||||
#define XEMACPS_TX256CNT_OFFSET      0x00000124 /**< Error-free 256-511 byte
 | 
			
		||||
                                                      Frames transmitted
 | 
			
		||||
                                                      counter */
 | 
			
		||||
#define XEMACPS_TX512CNT_OFFSET      0x00000128 /**< Error-free 512-1023 byte
 | 
			
		||||
                                                      Frames transmitted
 | 
			
		||||
                                                      counter */
 | 
			
		||||
#define XEMACPS_TX1024CNT_OFFSET     0x0000012C /**< Error-free 1024-1518 byte
 | 
			
		||||
                                                      Frames transmitted
 | 
			
		||||
                                                      counter */
 | 
			
		||||
#define XEMACPS_TX1519CNT_OFFSET     0x00000130 /**< Error-free larger than
 | 
			
		||||
                                                      1519 byte Frames
 | 
			
		||||
                                                      transmitted counter */
 | 
			
		||||
#define XEMACPS_TXURUNCNT_OFFSET     0x00000134 /**< TX under run error
 | 
			
		||||
                                                      counter */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_SNGLCOLLCNT_OFFSET   0x00000138 /**< Single Collision Frame
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_MULTICOLLCNT_OFFSET  0x0000013C /**< Multiple Collision Frame
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_EXCESSCOLLCNT_OFFSET 0x00000140 /**< Excessive Collision Frame
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_LATECOLLCNT_OFFSET   0x00000144 /**< Late Collision Frame
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_TXDEFERCNT_OFFSET    0x00000148 /**< Deferred Transmission
 | 
			
		||||
                                                      Frame Counter */
 | 
			
		||||
#define XEMACPS_TXCSENSECNT_OFFSET   0x0000014C /**< Transmit Carrier Sense
 | 
			
		||||
                                                      Error Counter */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_OCTRXL_OFFSET        0x00000150 /**< Octects Received register
 | 
			
		||||
                                                      Low */
 | 
			
		||||
#define XEMACPS_OCTRXH_OFFSET        0x00000154 /**< Octects Received register
 | 
			
		||||
                                                      High */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_RXCNT_OFFSET         0x00000158 /**< Error-free Frames
 | 
			
		||||
                                                      Received Counter */
 | 
			
		||||
#define XEMACPS_RXBROADCNT_OFFSET    0x0000015C /**< Error-free Broadcast
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RXMULTICNT_OFFSET    0x00000160 /**< Error-free Multicast
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RXPAUSECNT_OFFSET    0x00000164 /**< Pause Frames
 | 
			
		||||
                                                      Received Counter */
 | 
			
		||||
#define XEMACPS_RX64CNT_OFFSET       0x00000168 /**< Error-free 64 byte Frames
 | 
			
		||||
                                                      Received Counter */
 | 
			
		||||
#define XEMACPS_RX65CNT_OFFSET       0x0000016C /**< Error-free 65-127 byte
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RX128CNT_OFFSET      0x00000170 /**< Error-free 128-255 byte
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RX256CNT_OFFSET      0x00000174 /**< Error-free 256-512 byte
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RX512CNT_OFFSET      0x00000178 /**< Error-free 512-1023 byte
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RX1024CNT_OFFSET     0x0000017C /**< Error-free 1024-1518 byte
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RX1519CNT_OFFSET     0x00000180 /**< Error-free 1519-max byte
 | 
			
		||||
                                                      Frames Received Counter */
 | 
			
		||||
#define XEMACPS_RXUNDRCNT_OFFSET     0x00000184 /**< Undersize Frames Received
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXOVRCNT_OFFSET      0x00000188 /**< Oversize Frames Received
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXJABCNT_OFFSET      0x0000018C /**< Jabbers Received
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXFCSCNT_OFFSET      0x00000190 /**< Frame Check Sequence
 | 
			
		||||
                                                      Error Counter */
 | 
			
		||||
#define XEMACPS_RXLENGTHCNT_OFFSET   0x00000194 /**< Length Field Error
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXSYMBCNT_OFFSET     0x00000198 /**< Symbol Error Counter */
 | 
			
		||||
#define XEMACPS_RXALIGNCNT_OFFSET    0x0000019C /**< Alignment Error Counter */
 | 
			
		||||
#define XEMACPS_RXRESERRCNT_OFFSET   0x000001A0 /**< Receive Resource Error
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXORCNT_OFFSET       0x000001A4 /**< Receive Overrun Counter */
 | 
			
		||||
#define XEMACPS_RXIPCCNT_OFFSET      0x000001A8 /**< IP header Checksum Error
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXTCPCCNT_OFFSET     0x000001AC /**< TCP Checksum Error
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_RXUDPCCNT_OFFSET     0x000001B0 /**< UDP Checksum Error
 | 
			
		||||
                                                      Counter */
 | 
			
		||||
#define XEMACPS_LAST_OFFSET          0x000001B4 /**< Last statistic counter
 | 
			
		||||
						      offset, for clearing */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_1588_SEC_OFFSET      0x000001D0 /**< 1588 second counter */
 | 
			
		||||
#define XEMACPS_1588_NANOSEC_OFFSET  0x000001D4 /**< 1588 nanosecond counter */
 | 
			
		||||
#define XEMACPS_1588_ADJ_OFFSET      0x000001D8 /**< 1588 nanosecond
 | 
			
		||||
						      adjustment counter */
 | 
			
		||||
#define XEMACPS_1588_INC_OFFSET      0x000001DC /**< 1588 nanosecond
 | 
			
		||||
						      increment counter */
 | 
			
		||||
#define XEMACPS_PTP_TXSEC_OFFSET     0x000001E0 /**< 1588 PTP transmit second
 | 
			
		||||
						      counter */
 | 
			
		||||
#define XEMACPS_PTP_TXNANOSEC_OFFSET 0x000001E4 /**< 1588 PTP transmit
 | 
			
		||||
						      nanosecond counter */
 | 
			
		||||
#define XEMACPS_PTP_RXSEC_OFFSET     0x000001E8 /**< 1588 PTP receive second
 | 
			
		||||
						      counter */
 | 
			
		||||
#define XEMACPS_PTP_RXNANOSEC_OFFSET 0x000001EC /**< 1588 PTP receive
 | 
			
		||||
						      nanosecond counter */
 | 
			
		||||
#define XEMACPS_PTPP_TXSEC_OFFSET    0x000001F0 /**< 1588 PTP peer transmit
 | 
			
		||||
						      second counter */
 | 
			
		||||
#define XEMACPS_PTPP_TXNANOSEC_OFFSET 0x000001F4 /**< 1588 PTP peer transmit
 | 
			
		||||
						      nanosecond counter */
 | 
			
		||||
#define XEMACPS_PTPP_RXSEC_OFFSET    0x000001F8 /**< 1588 PTP peer receive
 | 
			
		||||
						      second counter */
 | 
			
		||||
#define XEMACPS_PTPP_RXNANOSEC_OFFSET 0x000001FC /**< 1588 PTP peer receive
 | 
			
		||||
						      nanosecond counter */
 | 
			
		||||
 | 
			
		||||
/* Define some bit positions for registers. */
 | 
			
		||||
 | 
			
		||||
/** @name network control register bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_NWCTRL_FLUSH_DPRAM_MASK	0x00040000 /**< Flush a packet from
 | 
			
		||||
							Rx SRAM */
 | 
			
		||||
#define XEMACPS_NWCTRL_ZEROPAUSETX_MASK 0x00000800 /**< Transmit zero quantum
 | 
			
		||||
                                                         pause frame */
 | 
			
		||||
#define XEMACPS_NWCTRL_PAUSETX_MASK     0x00000800 /**< Transmit pause frame */
 | 
			
		||||
#define XEMACPS_NWCTRL_HALTTX_MASK      0x00000400 /**< Halt transmission
 | 
			
		||||
                                                         after current frame */
 | 
			
		||||
#define XEMACPS_NWCTRL_STARTTX_MASK     0x00000200 /**< Start tx (tx_go) */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_NWCTRL_STATWEN_MASK     0x00000080 /**< Enable writing to
 | 
			
		||||
                                                         stat counters */
 | 
			
		||||
#define XEMACPS_NWCTRL_STATINC_MASK     0x00000040 /**< Increment statistic
 | 
			
		||||
                                                         registers */
 | 
			
		||||
#define XEMACPS_NWCTRL_STATCLR_MASK     0x00000020 /**< Clear statistic
 | 
			
		||||
                                                         registers */
 | 
			
		||||
#define XEMACPS_NWCTRL_MDEN_MASK        0x00000010 /**< Enable MDIO port */
 | 
			
		||||
#define XEMACPS_NWCTRL_TXEN_MASK        0x00000008 /**< Enable transmit */
 | 
			
		||||
#define XEMACPS_NWCTRL_RXEN_MASK        0x00000004 /**< Enable receive */
 | 
			
		||||
#define XEMACPS_NWCTRL_LOOPEN_MASK      0x00000002 /**< local loopback */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name network configuration register bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_NWCFG_BADPREAMBEN_MASK 0x20000000 /**< disable rejection of
 | 
			
		||||
                                                        non-standard preamble */
 | 
			
		||||
#define XEMACPS_NWCFG_IPDSTRETCH_MASK  0x10000000 /**< enable transmit IPG */
 | 
			
		||||
#define XEMACPS_NWCFG_FCSIGNORE_MASK   0x04000000 /**< disable rejection of
 | 
			
		||||
                                                        FCS error */
 | 
			
		||||
#define XEMACPS_NWCFG_HDRXEN_MASK      0x02000000 /**< RX half duplex */
 | 
			
		||||
#define XEMACPS_NWCFG_RXCHKSUMEN_MASK  0x01000000 /**< enable RX checksum
 | 
			
		||||
                                                        offload */
 | 
			
		||||
#define XEMACPS_NWCFG_PAUSECOPYDI_MASK 0x00800000 /**< Do not copy pause
 | 
			
		||||
                                                        Frames to memory */
 | 
			
		||||
#define XEMACPS_NWCFG_MDC_SHIFT_MASK   18	   /**< shift bits for MDC */
 | 
			
		||||
#define XEMACPS_NWCFG_MDCCLKDIV_MASK   0x001C0000 /**< MDC Mask PCLK divisor */
 | 
			
		||||
#define XEMACPS_NWCFG_FCSREM_MASK      0x00020000 /**< Discard FCS from
 | 
			
		||||
                                                        received frames */
 | 
			
		||||
#define XEMACPS_NWCFG_LENGTHERRDSCRD_MASK 0x00010000
 | 
			
		||||
/**< RX length error discard */
 | 
			
		||||
#define XEMACPS_NWCFG_RXOFFS_MASK      0x0000C000 /**< RX buffer offset */
 | 
			
		||||
#define XEMACPS_NWCFG_PAUSEEN_MASK     0x00002000 /**< Enable pause RX */
 | 
			
		||||
#define XEMACPS_NWCFG_RETRYTESTEN_MASK 0x00001000 /**< Retry test */
 | 
			
		||||
#define XEMACPS_NWCFG_EXTADDRMATCHEN_MASK 0x00000200
 | 
			
		||||
/**< External address match enable */
 | 
			
		||||
#define XEMACPS_NWCFG_1000_MASK        0x00000400 /**< 1000 Mbps */
 | 
			
		||||
#define XEMACPS_NWCFG_1536RXEN_MASK    0x00000100 /**< Enable 1536 byte
 | 
			
		||||
                                                        frames reception */
 | 
			
		||||
#define XEMACPS_NWCFG_UCASTHASHEN_MASK 0x00000080 /**< Receive unicast hash
 | 
			
		||||
                                                        frames */
 | 
			
		||||
#define XEMACPS_NWCFG_MCASTHASHEN_MASK 0x00000040 /**< Receive multicast hash
 | 
			
		||||
                                                        frames */
 | 
			
		||||
#define XEMACPS_NWCFG_BCASTDI_MASK     0x00000020 /**< Do not receive
 | 
			
		||||
                                                        broadcast frames */
 | 
			
		||||
#define XEMACPS_NWCFG_COPYALLEN_MASK   0x00000010 /**< Copy all frames */
 | 
			
		||||
#define XEMACPS_NWCFG_JUMBO_MASK       0x00000008 /**< Jumbo frames */
 | 
			
		||||
#define XEMACPS_NWCFG_NVLANDISC_MASK   0x00000004 /**< Receive only VLAN
 | 
			
		||||
                                                        frames */
 | 
			
		||||
#define XEMACPS_NWCFG_FDEN_MASK        0x00000002 /**< full duplex */
 | 
			
		||||
#define XEMACPS_NWCFG_100_MASK         0x00000001 /**< 100 Mbps */
 | 
			
		||||
#define XEMACPS_NWCFG_RESET_MASK       0x00080000 /**< reset value */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name network status register bit definitaions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_NWSR_MDIOIDLE_MASK     0x00000004 /**< PHY management idle */
 | 
			
		||||
#define XEMACPS_NWSR_MDIO_MASK         0x00000002 /**< Status of mdio_in */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name MAC address register word 1 mask
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_LADDR_MACH_MASK        0x0000FFFF /**< Address bits[47:32]
 | 
			
		||||
                                                      bit[31:0] are in BOTTOM */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** @name DMA control register bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_DMACR_RXBUF_MASK		0x00FF0000 /**< Mask bit for RX buffer
 | 
			
		||||
													size */
 | 
			
		||||
#define XEMACPS_DMACR_RXBUF_SHIFT 		16	/**< Shift bit for RX buffer
 | 
			
		||||
												size */
 | 
			
		||||
#define XEMACPS_DMACR_TCPCKSUM_MASK		0x00000800 /**< enable/disable TX
 | 
			
		||||
													    checksum offload */
 | 
			
		||||
#define XEMACPS_DMACR_TXSIZE_MASK		0x00000400 /**< TX buffer memory size */
 | 
			
		||||
#define XEMACPS_DMACR_RXSIZE_MASK		0x00000300 /**< RX buffer memory size */
 | 
			
		||||
#define XEMACPS_DMACR_ENDIAN_MASK		0x00000080 /**< endian configuration */
 | 
			
		||||
#define XEMACPS_DMACR_BLENGTH_MASK		0x0000001F /**< buffer burst length */
 | 
			
		||||
#define XEMACPS_DMACR_SINGLE_AHB_BURST	0x00000001 /**< single AHB bursts */
 | 
			
		||||
#define XEMACPS_DMACR_INCR4_AHB_BURST	0x00000004 /**< 4 bytes AHB bursts */
 | 
			
		||||
#define XEMACPS_DMACR_INCR8_AHB_BURST	0x00000008 /**< 8 bytes AHB bursts */
 | 
			
		||||
#define XEMACPS_DMACR_INCR16_AHB_BURST	0x00000010 /**< 16 bytes AHB bursts */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name transmit status register bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_TXSR_HRESPNOK_MASK    0x00000100 /**< Transmit hresp not OK */
 | 
			
		||||
#define XEMACPS_TXSR_URUN_MASK        0x00000040 /**< Transmit underrun */
 | 
			
		||||
#define XEMACPS_TXSR_TXCOMPL_MASK     0x00000020 /**< Transmit completed OK */
 | 
			
		||||
#define XEMACPS_TXSR_BUFEXH_MASK      0x00000010 /**< Transmit buffs exhausted
 | 
			
		||||
                                                       mid frame */
 | 
			
		||||
#define XEMACPS_TXSR_TXGO_MASK        0x00000008 /**< Status of go flag */
 | 
			
		||||
#define XEMACPS_TXSR_RXOVR_MASK       0x00000004 /**< Retry limit exceeded */
 | 
			
		||||
#define XEMACPS_TXSR_FRAMERX_MASK     0x00000002 /**< Collision tx frame */
 | 
			
		||||
#define XEMACPS_TXSR_USEDREAD_MASK    0x00000001 /**< TX buffer used bit set */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_TXSR_ERROR_MASK      (XEMACPS_TXSR_HRESPNOK_MASK | \
 | 
			
		||||
                                       XEMACPS_TXSR_URUN_MASK | \
 | 
			
		||||
                                       XEMACPS_TXSR_BUFEXH_MASK | \
 | 
			
		||||
                                       XEMACPS_TXSR_RXOVR_MASK | \
 | 
			
		||||
                                       XEMACPS_TXSR_FRAMERX_MASK | \
 | 
			
		||||
                                       XEMACPS_TXSR_USEDREAD_MASK)
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name receive status register bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_RXSR_HRESPNOK_MASK    0x00000008 /**< Receive hresp not OK */
 | 
			
		||||
#define XEMACPS_RXSR_RXOVR_MASK       0x00000004 /**< Receive overrun */
 | 
			
		||||
#define XEMACPS_RXSR_FRAMERX_MASK     0x00000002 /**< Frame received OK */
 | 
			
		||||
#define XEMACPS_RXSR_BUFFNA_MASK      0x00000001 /**< RX buffer used bit set */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_RXSR_ERROR_MASK      (XEMACPS_RXSR_HRESPNOK_MASK | \
 | 
			
		||||
                                       XEMACPS_RXSR_RXOVR_MASK | \
 | 
			
		||||
                                       XEMACPS_RXSR_BUFFNA_MASK)
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @name interrupts bit definitions
 | 
			
		||||
 * Bits definitions are same in XEMACPS_ISR_OFFSET,
 | 
			
		||||
 * XEMACPS_IER_OFFSET, XEMACPS_IDR_OFFSET, and XEMACPS_IMR_OFFSET
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_IXR_PTPPSTX_MASK    0x02000000 /**< PTP Psync transmitted */
 | 
			
		||||
#define XEMACPS_IXR_PTPPDRTX_MASK   0x01000000 /**< PTP Pdelay_req
 | 
			
		||||
						     transmitted */
 | 
			
		||||
#define XEMACPS_IXR_PTPSTX_MASK     0x00800000 /**< PTP Sync transmitted */
 | 
			
		||||
#define XEMACPS_IXR_PTPDRTX_MASK    0x00400000 /**< PTP Delay_req transmitted
 | 
			
		||||
						*/
 | 
			
		||||
#define XEMACPS_IXR_PTPPSRX_MASK    0x00200000 /**< PTP Psync received */
 | 
			
		||||
#define XEMACPS_IXR_PTPPDRRX_MASK   0x00100000 /**< PTP Pdelay_req received */
 | 
			
		||||
#define XEMACPS_IXR_PTPSRX_MASK     0x00080000 /**< PTP Sync received */
 | 
			
		||||
#define XEMACPS_IXR_PTPDRRX_MASK    0x00040000 /**< PTP Delay_req received */
 | 
			
		||||
#define XEMACPS_IXR_PAUSETX_MASK    0x00004000	/**< Pause frame transmitted */
 | 
			
		||||
#define XEMACPS_IXR_PAUSEZERO_MASK  0x00002000	/**< Pause time has reached
 | 
			
		||||
                                                     zero */
 | 
			
		||||
#define XEMACPS_IXR_PAUSENZERO_MASK 0x00001000	/**< Pause frame received */
 | 
			
		||||
#define XEMACPS_IXR_HRESPNOK_MASK   0x00000800	/**< hresp not ok */
 | 
			
		||||
#define XEMACPS_IXR_RXOVR_MASK      0x00000400	/**< Receive overrun occurred */
 | 
			
		||||
#define XEMACPS_IXR_TXCOMPL_MASK    0x00000080	/**< Frame transmitted ok */
 | 
			
		||||
#define XEMACPS_IXR_TXEXH_MASK      0x00000040	/**< Transmit err occurred or
 | 
			
		||||
                                                     no buffers*/
 | 
			
		||||
#define XEMACPS_IXR_RETRY_MASK      0x00000020	/**< Retry limit exceeded */
 | 
			
		||||
#define XEMACPS_IXR_URUN_MASK       0x00000010	/**< Transmit underrun */
 | 
			
		||||
#define XEMACPS_IXR_TXUSED_MASK     0x00000008	/**< Tx buffer used bit read */
 | 
			
		||||
#define XEMACPS_IXR_RXUSED_MASK     0x00000004	/**< Rx buffer used bit read */
 | 
			
		||||
#define XEMACPS_IXR_FRAMERX_MASK    0x00000002	/**< Frame received ok */
 | 
			
		||||
#define XEMACPS_IXR_MGMNT_MASK      0x00000001	/**< PHY management complete */
 | 
			
		||||
#define XEMACPS_IXR_ALL_MASK        0x00007FFF	/**< Everything! */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_IXR_TX_ERR_MASK    (XEMACPS_IXR_TXEXH_MASK |         \
 | 
			
		||||
                                     XEMACPS_IXR_RETRY_MASK |         \
 | 
			
		||||
                                     XEMACPS_IXR_URUN_MASK  |         \
 | 
			
		||||
                                     XEMACPS_IXR_TXUSED_MASK)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_IXR_RX_ERR_MASK    (XEMACPS_IXR_HRESPNOK_MASK |      \
 | 
			
		||||
                                     XEMACPS_IXR_RXUSED_MASK |        \
 | 
			
		||||
                                     XEMACPS_IXR_RXOVR_MASK)
 | 
			
		||||
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name PHY Maintenance bit definitions
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_OP_MASK    0x40020000	/**< operation mask bits */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_OP_R_MASK  0x20000000	/**< read operation */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_OP_W_MASK  0x10000000	/**< write operation */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_ADDR_MASK  0x0F800000	/**< Address bits */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_REG_MASK   0x007C0000	/**< register bits */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_DATA_MASK  0x00000FFF	/**< data bits */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_PHYAD_SHIFT_MASK   23	/**< Shift bits for PHYAD */
 | 
			
		||||
#define XEMACPS_PHYMNTNC_PHREG_SHIFT_MASK   18	/**< Shift bits for PHREG */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/* Transmit buffer descriptor status words offset
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_BD_ADDR_OFFSET  0x00000000 /**< word 0/addr of BDs */
 | 
			
		||||
#define XEMACPS_BD_STAT_OFFSET  0x00000004 /**< word 1/status of BDs */
 | 
			
		||||
/*
 | 
			
		||||
 * @}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Transmit buffer descriptor status words bit positions.
 | 
			
		||||
 * Transmit buffer descriptor consists of two 32-bit registers,
 | 
			
		||||
 * the first - word0 contains a 32-bit address pointing to the location of
 | 
			
		||||
 * the transmit data.
 | 
			
		||||
 * The following register - word1, consists of various information to control
 | 
			
		||||
 * the XEmacPs transmit process.  After transmit, this is updated with status
 | 
			
		||||
 * information, whether the frame was transmitted OK or why it had failed.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_TXBUF_USED_MASK  0x80000000 /**< Used bit. */
 | 
			
		||||
#define XEMACPS_TXBUF_WRAP_MASK  0x40000000 /**< Wrap bit, last descriptor */
 | 
			
		||||
#define XEMACPS_TXBUF_RETRY_MASK 0x20000000 /**< Retry limit exceeded */
 | 
			
		||||
#define XEMACPS_TXBUF_URUN_MASK  0x10000000 /**< Transmit underrun occurred */
 | 
			
		||||
#define XEMACPS_TXBUF_EXH_MASK   0x08000000 /**< Buffers exhausted */
 | 
			
		||||
#define XEMACPS_TXBUF_TCP_MASK   0x04000000 /**< Late collision. */
 | 
			
		||||
#define XEMACPS_TXBUF_NOCRC_MASK 0x00010000 /**< No CRC */
 | 
			
		||||
#define XEMACPS_TXBUF_LAST_MASK  0x00008000 /**< Last buffer */
 | 
			
		||||
#define XEMACPS_TXBUF_LEN_MASK   0x00003FFF /**< Mask for length field */
 | 
			
		||||
/*
 | 
			
		||||
 * @}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Receive buffer descriptor status words bit positions.
 | 
			
		||||
 * Receive buffer descriptor consists of two 32-bit registers,
 | 
			
		||||
 * the first - word0 contains a 32-bit word aligned address pointing to the
 | 
			
		||||
 * address of the buffer. The lower two bits make up the wrap bit indicating
 | 
			
		||||
 * the last descriptor and the ownership bit to indicate it has been used by
 | 
			
		||||
 * the XEmacPs.
 | 
			
		||||
 * The following register - word1, contains status information regarding why
 | 
			
		||||
 * the frame was received (the filter match condition) as well as other
 | 
			
		||||
 * useful info.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XEMACPS_RXBUF_BCAST_MASK     0x80000000 /**< Broadcast frame */
 | 
			
		||||
#define XEMACPS_RXBUF_MULTIHASH_MASK 0x40000000 /**< Multicast hashed frame */
 | 
			
		||||
#define XEMACPS_RXBUF_UNIHASH_MASK   0x20000000 /**< Unicast hashed frame */
 | 
			
		||||
#define XEMACPS_RXBUF_EXH_MASK       0x08000000 /**< buffer exhausted */
 | 
			
		||||
#define XEMACPS_RXBUF_AMATCH_MASK    0x06000000 /**< Specific address
 | 
			
		||||
                                                      matched */
 | 
			
		||||
#define XEMACPS_RXBUF_IDFOUND_MASK   0x01000000 /**< Type ID matched */
 | 
			
		||||
#define XEMACPS_RXBUF_IDMATCH_MASK   0x00C00000 /**< ID matched mask */
 | 
			
		||||
#define XEMACPS_RXBUF_VLAN_MASK      0x00200000 /**< VLAN tagged */
 | 
			
		||||
#define XEMACPS_RXBUF_PRI_MASK       0x00100000 /**< Priority tagged */
 | 
			
		||||
#define XEMACPS_RXBUF_VPRI_MASK      0x000E0000 /**< Vlan priority */
 | 
			
		||||
#define XEMACPS_RXBUF_CFI_MASK       0x00010000 /**< CFI frame */
 | 
			
		||||
#define XEMACPS_RXBUF_EOF_MASK       0x00008000 /**< End of frame. */
 | 
			
		||||
#define XEMACPS_RXBUF_SOF_MASK       0x00004000 /**< Start of frame. */
 | 
			
		||||
#define XEMACPS_RXBUF_LEN_MASK       0x00001FFF /**< Mask for length field */
 | 
			
		||||
 | 
			
		||||
#define XEMACPS_RXBUF_WRAP_MASK      0x00000002 /**< Wrap bit, last BD */
 | 
			
		||||
#define XEMACPS_RXBUF_NEW_MASK       0x00000001 /**< Used bit.. */
 | 
			
		||||
#define XEMACPS_RXBUF_ADD_MASK       0xFFFFFFFC /**< Mask for address */
 | 
			
		||||
/*
 | 
			
		||||
 * @}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define appropriate I/O access method to mempry mapped I/O or other
 | 
			
		||||
 * intarfce if necessary.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XEmacPs_In32  Xil_In32
 | 
			
		||||
#define XEmacPs_Out32 Xil_Out32
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Read the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param    BaseAddress is the base address of the device
 | 
			
		||||
* @param    RegOffset is the register offset to be read
 | 
			
		||||
*
 | 
			
		||||
* @return   The 32-bit value of the register
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    u32 XEmacPs_ReadReg(u32 BaseAddress, u32 RegOffset)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_ReadReg(BaseAddress, RegOffset) \
 | 
			
		||||
    XEmacPs_In32((BaseAddress) + (RegOffset))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* Write the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param    BaseAddress is the base address of the device
 | 
			
		||||
* @param    RegOffset is the register offset to be written
 | 
			
		||||
* @param    Data is the 32-bit value to write to the register
 | 
			
		||||
*
 | 
			
		||||
* @return   None.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* C-style signature:
 | 
			
		||||
*    void XEmacPs_WriteReg(u32 BaseAddress, u32 RegOffset,
 | 
			
		||||
*         u32 Data)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XEmacPs_WriteReg(BaseAddress, RegOffset, Data) \
 | 
			
		||||
    XEmacPs_Out32((BaseAddress) + (RegOffset), (Data))
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes *****************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Perform reset operation to the emacps interface
 | 
			
		||||
 */
 | 
			
		||||
void XEmacPs_ResetHw(u32 BaseAddr);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,177 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
*       XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"
 | 
			
		||||
*       AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND
 | 
			
		||||
*       SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,
 | 
			
		||||
*       OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
 | 
			
		||||
*       APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION
 | 
			
		||||
*       THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,
 | 
			
		||||
*       AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE
 | 
			
		||||
*       FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY
 | 
			
		||||
*       WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE
 | 
			
		||||
*       IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
 | 
			
		||||
*       REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF
 | 
			
		||||
*       INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
			
		||||
*       FOR A PARTICULAR PURPOSE.
 | 
			
		||||
*
 | 
			
		||||
*       (c) Copyright 2002 Xilinx Inc.
 | 
			
		||||
*       All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xenv.h
 | 
			
		||||
*
 | 
			
		||||
* Defines common services that are typically found in a host operating.
 | 
			
		||||
* environment. This include file simply includes an OS specific file based
 | 
			
		||||
* on the compile-time constant BUILD_ENV_*, where * is the name of the target
 | 
			
		||||
* environment.
 | 
			
		||||
*
 | 
			
		||||
* All services are defined as macros.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- -----------------------------------------------
 | 
			
		||||
* 1.00b ch   10/24/02 Added XENV_LINUX
 | 
			
		||||
* 1.00a rmm  04/17/02 First release
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XENV_H /* prevent circular inclusions */
 | 
			
		||||
#define XENV_H /* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Select which target environment we are operating under
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* VxWorks target environment */
 | 
			
		||||
#if defined XENV_VXWORKS
 | 
			
		||||
#include "xenv_vxworks.h"
 | 
			
		||||
 | 
			
		||||
/* Linux target environment */
 | 
			
		||||
#elif defined XENV_LINUX
 | 
			
		||||
#include "xenv_linux.h"
 | 
			
		||||
 | 
			
		||||
/* Unit test environment */
 | 
			
		||||
#elif defined XENV_UNITTEST
 | 
			
		||||
#include "ut_xenv.h"
 | 
			
		||||
 | 
			
		||||
/* Integration test environment */
 | 
			
		||||
#elif defined XENV_INTTEST
 | 
			
		||||
#include "int_xenv.h"
 | 
			
		||||
 | 
			
		||||
/* Standalone environment selected */
 | 
			
		||||
#else
 | 
			
		||||
#include "xenv_standalone.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The following comments specify the types and macro wrappers that are
 | 
			
		||||
 * expected to be defined by the target specific header files
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_TIME_STAMP
 | 
			
		||||
 *
 | 
			
		||||
 * A structure that contains a time stamp used by other time stamp macros
 | 
			
		||||
 * defined below. This structure is processor dependent.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_MEM_COPY(void *DestPtr, void *SrcPtr, unsigned Bytes)
 | 
			
		||||
 *
 | 
			
		||||
 * Copies a non-overlapping block of memory.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   DestPtr is the destination address to copy data to.
 | 
			
		||||
 * @param   SrcPtr is the source address to copy data from.
 | 
			
		||||
 * @param   Bytes is the number of bytes to copy.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  None
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_MEM_FILL(void *DestPtr, char Data, unsigned Bytes)
 | 
			
		||||
 *
 | 
			
		||||
 * Fills an area of memory with constant data.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   DestPtr is the destination address to set.
 | 
			
		||||
 * @param   Data contains the value to set.
 | 
			
		||||
 * @param   Bytes is the number of bytes to set.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  None
 | 
			
		||||
 */
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr)
 | 
			
		||||
 *
 | 
			
		||||
 * Samples the processor's or external timer's time base counter.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   StampPtr is the storage for the retrieved time stamp.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  None
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_TIME_STAMP_DELTA_US(XTIME_STAMP *Stamp1Ptr, XTIME_STAMP* Stamp2Ptr)
 | 
			
		||||
 *
 | 
			
		||||
 * Computes the delta between the two time stamps.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   Stamp1Ptr - First sampled time stamp.
 | 
			
		||||
 * @param   Stamp1Ptr - Sedond sampled time stamp.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  An unsigned int value with units of microseconds.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_TIME_STAMP_DELTA_MS(XTIME_STAMP *Stamp1Ptr, XTIME_STAMP* Stamp2Ptr)
 | 
			
		||||
 *
 | 
			
		||||
 * Computes the delta between the two time stamps.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   Stamp1Ptr - First sampled time stamp.
 | 
			
		||||
 * @param   Stamp1Ptr - Sedond sampled time stamp.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  An unsigned int value with units of milliseconds.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************//**
 | 
			
		||||
 *
 | 
			
		||||
 * XENV_USLEEP(unsigned delay)
 | 
			
		||||
 *
 | 
			
		||||
 * Delay the specified number of microseconds.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   delay is the number of microseconds to delay.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  None
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif            /* end of protection macro */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,356 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
*       XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"
 | 
			
		||||
*       AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND
 | 
			
		||||
*       SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,
 | 
			
		||||
*       OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,
 | 
			
		||||
*       APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION
 | 
			
		||||
*       THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,
 | 
			
		||||
*       AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE
 | 
			
		||||
*       FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY
 | 
			
		||||
*       WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE
 | 
			
		||||
*       IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
 | 
			
		||||
*       REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF
 | 
			
		||||
*       INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
			
		||||
*       FOR A PARTICULAR PURPOSE.
 | 
			
		||||
*
 | 
			
		||||
*       (c) Copyright 2002-2008 Xilinx Inc.
 | 
			
		||||
*       All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xenv_standalone.h
 | 
			
		||||
*
 | 
			
		||||
* Defines common services specified by xenv.h.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* 	This file is not intended to be included directly by driver code.
 | 
			
		||||
* 	Instead, the generic xenv.h file is intended to be included by driver
 | 
			
		||||
* 	code.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- -----------------------------------------------
 | 
			
		||||
* 1.00a wgr  02/28/07 Added cache handling macros.
 | 
			
		||||
* 1.00a wgr  02/27/07 Simplified code. Deprecated old-style macro names.
 | 
			
		||||
* 1.00a rmm  01/24/06 Implemented XENV_USLEEP. Assume implementation is being
 | 
			
		||||
*                     used under Xilinx standalone BSP.
 | 
			
		||||
* 1.00a xd   11/03/04 Improved support for doxygen.
 | 
			
		||||
* 1.00a rmm  03/21/02 First release
 | 
			
		||||
* 1.00a wgr  03/22/07 Converted to new coding style.
 | 
			
		||||
* 1.00a rpm  06/29/07 Added udelay macro for standalone
 | 
			
		||||
* 1.00a xd   07/19/07 Included xparameters.h as XPAR_ constants are referred
 | 
			
		||||
*                     to in MICROBLAZE section
 | 
			
		||||
* 1.00a ecm  09/19/08 updated for v7.20 of Microblaze, new functionality
 | 
			
		||||
*
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XENV_STANDALONE_H
 | 
			
		||||
#define XENV_STANDALONE_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * Get the processor dependent includes
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#if defined __MICROBLAZE__
 | 
			
		||||
#  include "mb_interface.h"
 | 
			
		||||
#  include "xparameters.h"   /* XPAR constants used below in MB section */
 | 
			
		||||
 | 
			
		||||
#elif defined __PPC__
 | 
			
		||||
#  include "sleep.h"
 | 
			
		||||
#  include "xcache_l.h"      /* also include xcache_l.h for caching macros */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * MEMCPY / MEMSET related macros.
 | 
			
		||||
 *
 | 
			
		||||
 * The following are straight forward implementations of memset and memcpy.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE: memcpy may not work if source and target memory area are overlapping.
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * Copies a non-overlapping block of memory.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	DestPtr
 | 
			
		||||
 *		Destination address to copy data to.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	SrcPtr
 | 
			
		||||
 * 		Source address to copy data from.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	Bytes
 | 
			
		||||
 * 		Number of bytes to copy.
 | 
			
		||||
 *
 | 
			
		||||
 * @return	None.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * 		The use of XENV_MEM_COPY is deprecated. Use memcpy() instead.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * 		This implemention MAY BREAK work if source and target memory
 | 
			
		||||
 * 		area are overlapping.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define XENV_MEM_COPY(DestPtr, SrcPtr, Bytes) \
 | 
			
		||||
	memcpy((void *) DestPtr, (const void *) SrcPtr, (size_t) Bytes)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * Fills an area of memory with constant data.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	DestPtr
 | 
			
		||||
 *		Destination address to copy data to.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	Data
 | 
			
		||||
 * 		Value to set.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	Bytes
 | 
			
		||||
 * 		Number of bytes to copy.
 | 
			
		||||
 *
 | 
			
		||||
 * @return	None.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 * 		The use of XENV_MEM_FILL is deprecated. Use memset() instead.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define XENV_MEM_FILL(DestPtr, Data, Bytes) \
 | 
			
		||||
	memset((void *) DestPtr, (int) Data, (size_t) Bytes)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * TIME related macros
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A structure that contains a time stamp used by other time stamp macros
 | 
			
		||||
 * defined below. This structure is processor dependent.
 | 
			
		||||
 */
 | 
			
		||||
typedef int XENV_TIME_STAMP;
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * Time is derived from the 64 bit PPC timebase register
 | 
			
		||||
 *
 | 
			
		||||
 * @param   StampPtr is the storage for the retrieved time stamp.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  None.
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 *
 | 
			
		||||
 * Signature: void XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr)
 | 
			
		||||
 * <br><br>
 | 
			
		||||
 * This macro must be implemented by the user.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XENV_TIME_STAMP_GET(StampPtr)
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * This macro is not yet implemented and always returns 0.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   Stamp1Ptr is the first sampled time stamp.
 | 
			
		||||
 * @param   Stamp2Ptr is the second sampled time stamp.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  0
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 *
 | 
			
		||||
 * This macro must be implemented by the user.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XENV_TIME_STAMP_DELTA_US(Stamp1Ptr, Stamp2Ptr)     (0)
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * This macro is not yet implemented and always returns 0.
 | 
			
		||||
 *
 | 
			
		||||
 * @param   Stamp1Ptr is the first sampled time stamp.
 | 
			
		||||
 * @param   Stamp2Ptr is the second sampled time stamp.
 | 
			
		||||
 *
 | 
			
		||||
 * @return  0
 | 
			
		||||
 *
 | 
			
		||||
 * @note
 | 
			
		||||
 *
 | 
			
		||||
 * This macro must be implemented by the user.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
#define XENV_TIME_STAMP_DELTA_MS(Stamp1Ptr, Stamp2Ptr)     (0)
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * XENV_USLEEP(unsigned delay)
 | 
			
		||||
 *
 | 
			
		||||
 * Delay the specified number of microseconds. Not implemented without OS
 | 
			
		||||
 * support.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	delay
 | 
			
		||||
 * 		Number of microseconds to delay.
 | 
			
		||||
 *
 | 
			
		||||
 * @return	None.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef __PPC__
 | 
			
		||||
#define XENV_USLEEP(delay)	usleep(delay)
 | 
			
		||||
#define udelay(delay)	usleep(delay)
 | 
			
		||||
#else
 | 
			
		||||
#define XENV_USLEEP(delay)
 | 
			
		||||
#define udelay(delay)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * CACHE handling macros / mappings
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * Processor independent macros
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define XCACHE_ENABLE_CACHE()	\
 | 
			
		||||
		{ XCACHE_ENABLE_DCACHE(); XCACHE_ENABLE_ICACHE(); }
 | 
			
		||||
 | 
			
		||||
#define XCACHE_DISABLE_CACHE()	\
 | 
			
		||||
		{ XCACHE_DISABLE_DCACHE(); XCACHE_DISABLE_ICACHE(); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * MicroBlaze case
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE: Currently the following macros will only work on systems that contain
 | 
			
		||||
 * only ONE MicroBlaze processor. Also, the macros will only be enabled if the
 | 
			
		||||
 * system is built using a xparameters.h file.
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined __MICROBLAZE__
 | 
			
		||||
 | 
			
		||||
/* Check if MicroBlaze data cache was built into the core.
 | 
			
		||||
 */
 | 
			
		||||
#if (XPAR_MICROBLAZE_USE_DCACHE == 1)
 | 
			
		||||
#  define XCACHE_ENABLE_DCACHE()		microblaze_enable_dcache()
 | 
			
		||||
#  define XCACHE_DISABLE_DCACHE()		microblaze_disable_dcache()
 | 
			
		||||
#  define XCACHE_INVALIDATE_DCACHE()  	microblaze_invalidate_dcache()
 | 
			
		||||
 | 
			
		||||
#  define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \
 | 
			
		||||
			microblaze_invalidate_dcache_range((int)(Addr), (int)(Len))
 | 
			
		||||
 | 
			
		||||
#if (XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK == 1)
 | 
			
		||||
#  define XCACHE_FLUSH_DCACHE()  		microblaze_flush_dcache()
 | 
			
		||||
#  define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \
 | 
			
		||||
			microblaze_flush_dcache_range((int)(Addr), (int)(Len))
 | 
			
		||||
#else
 | 
			
		||||
#  define XCACHE_FLUSH_DCACHE()  		microblaze_invalidate_dcache()
 | 
			
		||||
#  define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \
 | 
			
		||||
			microblaze_invalidate_dcache_range((int)(Addr), (int)(Len))
 | 
			
		||||
#endif	/*XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK*/
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  define XCACHE_ENABLE_DCACHE()
 | 
			
		||||
#  define XCACHE_DISABLE_DCACHE()
 | 
			
		||||
#  define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len)
 | 
			
		||||
#  define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len)
 | 
			
		||||
#endif	/*XPAR_MICROBLAZE_USE_DCACHE*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Check if MicroBlaze instruction cache was built into the core.
 | 
			
		||||
 */
 | 
			
		||||
#if (XPAR_MICROBLAZE_USE_ICACHE == 1)
 | 
			
		||||
#  define XCACHE_ENABLE_ICACHE()		microblaze_enable_icache()
 | 
			
		||||
#  define XCACHE_DISABLE_ICACHE()		microblaze_disable_icache()
 | 
			
		||||
 | 
			
		||||
#  define XCACHE_INVALIDATE_ICACHE()  	microblaze_invalidate_icache()
 | 
			
		||||
 | 
			
		||||
#  define XCACHE_INVALIDATE_ICACHE_RANGE(Addr, Len) \
 | 
			
		||||
			microblaze_invalidate_icache_range((int)(Addr), (int)(Len))
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  define XCACHE_ENABLE_ICACHE()
 | 
			
		||||
#  define XCACHE_DISABLE_ICACHE()
 | 
			
		||||
#endif	/*XPAR_MICROBLAZE_USE_ICACHE*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * PowerPC case
 | 
			
		||||
 *
 | 
			
		||||
 *   Note that the XCACHE_ENABLE_xxx functions are hardcoded to enable a
 | 
			
		||||
 *   specific memory region (0x80000001). Each bit (0-30) in the regions
 | 
			
		||||
 *   bitmask stands for 128MB of memory. Bit 31 stands for the upper 2GB
 | 
			
		||||
 *   range.
 | 
			
		||||
 *
 | 
			
		||||
 *   regions    --> cached address range
 | 
			
		||||
 *   ------------|--------------------------------------------------
 | 
			
		||||
 *   0x80000000  | [0, 0x7FFFFFF]
 | 
			
		||||
 *   0x00000001  | [0xF8000000, 0xFFFFFFFF]
 | 
			
		||||
 *   0x80000001  | [0, 0x7FFFFFF],[0xF8000000, 0xFFFFFFFF]
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#elif defined __PPC__
 | 
			
		||||
 | 
			
		||||
#define XCACHE_ENABLE_DCACHE()		XCache_EnableDCache(0x80000001)
 | 
			
		||||
#define XCACHE_DISABLE_DCACHE()		XCache_DisableDCache()
 | 
			
		||||
#define XCACHE_ENABLE_ICACHE()		XCache_EnableICache(0x80000001)
 | 
			
		||||
#define XCACHE_DISABLE_ICACHE()		XCache_DisableICache()
 | 
			
		||||
 | 
			
		||||
#define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \
 | 
			
		||||
		XCache_InvalidateDCacheRange((unsigned int)(Addr), (unsigned)(Len))
 | 
			
		||||
 | 
			
		||||
#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \
 | 
			
		||||
		XCache_FlushDCacheRange((unsigned int)(Addr), (unsigned)(Len))
 | 
			
		||||
 | 
			
		||||
#define XCACHE_INVALIDATE_ICACHE()	XCache_InvalidateICache()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *
 | 
			
		||||
 * Unknown processor / architecture
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
/* #error "Unknown processor / architecture. Must be MicroBlaze or PowerPC." */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif	/* #ifndef XENV_STANDALONE_H */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,264 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-14 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xgpiops.h
 | 
			
		||||
*
 | 
			
		||||
* The Xilinx PS GPIO driver. This driver supports the Xilinx PS GPIO
 | 
			
		||||
* Controller.
 | 
			
		||||
*
 | 
			
		||||
* The GPIO Controller supports the following features:
 | 
			
		||||
*	- 4 banks
 | 
			
		||||
*	- Masked writes (There are no masked reads)
 | 
			
		||||
*	- Bypass mode
 | 
			
		||||
*	- Configurable Interrupts (Level/Edge)
 | 
			
		||||
*
 | 
			
		||||
* This driver is intended to be RTOS and processor independent. Any needs for
 | 
			
		||||
* dynamic memory management, threads or thread mutual exclusion, virtual
 | 
			
		||||
* memory, or cache control must be satisfied by the layer above this driver.
 | 
			
		||||
 | 
			
		||||
* This driver supports all the features listed above, if applicable.
 | 
			
		||||
*
 | 
			
		||||
* <b>Driver Description</b>
 | 
			
		||||
*
 | 
			
		||||
* The device driver enables higher layer software (e.g., an application) to
 | 
			
		||||
* communicate to the GPIO.
 | 
			
		||||
*
 | 
			
		||||
* <b>Interrupts</b>
 | 
			
		||||
*
 | 
			
		||||
* The driver provides interrupt management functions and an interrupt handler.
 | 
			
		||||
* Users of this driver need to provide callback functions. An interrupt handler
 | 
			
		||||
* example is available with the driver.
 | 
			
		||||
*
 | 
			
		||||
* <b>Threads</b>
 | 
			
		||||
*
 | 
			
		||||
* This driver is not thread safe. Any needs for threads or thread mutual
 | 
			
		||||
* exclusion must be satisfied by the layer above this driver.
 | 
			
		||||
*
 | 
			
		||||
* <b>Asserts</b>
 | 
			
		||||
*
 | 
			
		||||
* Asserts are used within all Xilinx drivers to enforce constraints on argument
 | 
			
		||||
* values. Asserts can be turned off on a system-wide basis by defining, at
 | 
			
		||||
* compile time, the NDEBUG identifier. By default, asserts are turned on and it
 | 
			
		||||
* is recommended that users leave asserts on during development.
 | 
			
		||||
*
 | 
			
		||||
* <b>Building the driver</b>
 | 
			
		||||
*
 | 
			
		||||
* The XGpioPs driver is composed of several source files. This allows the user
 | 
			
		||||
* to build and link only those parts of the driver that are necessary.
 | 
			
		||||
* <br><br>
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- -----------------------------------------------
 | 
			
		||||
* 1.00a sv   01/15/10 First Release
 | 
			
		||||
* 1.01a sv   04/15/12 Removed the APIs XGpioPs_SetMode, XGpioPs_SetModePin
 | 
			
		||||
*                     XGpioPs_GetMode, XGpioPs_GetModePin as they are not
 | 
			
		||||
*		      relevant to Zynq device.The interrupts are disabled
 | 
			
		||||
*		      for output pins on all banks during initialization.
 | 
			
		||||
* 1.02a hk   08/22/13 Added low level reset API
 | 
			
		||||
* 2.1   hk   04/29/14 Use Input data register DATA_RO for read. CR# 771667.
 | 
			
		||||
*
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#ifndef XGPIOPS_H		/* prevent circular inclusions */
 | 
			
		||||
#define XGPIOPS_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xgpiops_hw.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name Interrupt types
 | 
			
		||||
 *  @{
 | 
			
		||||
 * The following constants define the interrupt types that can be set for each
 | 
			
		||||
 * GPIO pin.
 | 
			
		||||
 */
 | 
			
		||||
#define XGPIOPS_IRQ_TYPE_EDGE_RISING	0  /**< Interrupt on Rising edge */
 | 
			
		||||
#define XGPIOPS_IRQ_TYPE_EDGE_FALLING	1  /**< Interrupt Falling edge */
 | 
			
		||||
#define XGPIOPS_IRQ_TYPE_EDGE_BOTH	2  /**< Interrupt on both edges */
 | 
			
		||||
#define XGPIOPS_IRQ_TYPE_LEVEL_HIGH	3  /**< Interrupt on high level */
 | 
			
		||||
#define XGPIOPS_IRQ_TYPE_LEVEL_LOW	4  /**< Interrupt on low level */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
#define XGPIOPS_BANK0			0  /**< GPIO Bank 0 */
 | 
			
		||||
#define XGPIOPS_BANK1			1  /**< GPIO Bank 1 */
 | 
			
		||||
#define XGPIOPS_BANK2			2  /**< GPIO Bank 2 */
 | 
			
		||||
#define XGPIOPS_BANK3			3  /**< GPIO Bank 3 */
 | 
			
		||||
 | 
			
		||||
#define XGPIOPS_MAX_BANKS		4  /**< Max banks in a GPIO device */
 | 
			
		||||
#define XGPIOPS_BANK_MAX_PINS		32 /**< Max pins in a GPIO bank */
 | 
			
		||||
 | 
			
		||||
#define XGPIOPS_DEVICE_MAX_PIN_NUM	118 /*< Max pins in the GPIO device
 | 
			
		||||
					      * 0 - 31,  Bank 0
 | 
			
		||||
					      * 32 - 53, Bank 1
 | 
			
		||||
					      *	54 - 85, Bank 2
 | 
			
		||||
					      *	86 - 117, Bank 3
 | 
			
		||||
					      */
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
 * This handler data type allows the user to define a callback function to
 | 
			
		||||
 * handle the interrupts for the GPIO device. The application using this
 | 
			
		||||
 * driver is expected to define a handler of this type, to support interrupt
 | 
			
		||||
 * driven mode. The handler executes in an interrupt context such that minimal
 | 
			
		||||
 * processing should be performed.
 | 
			
		||||
 *
 | 
			
		||||
 * @param	CallBackRef is a callback reference passed in by the upper layer
 | 
			
		||||
 *		when setting the callback functions for a GPIO bank. It is
 | 
			
		||||
 *		passed back to the upper layer when the callback is invoked. Its
 | 
			
		||||
 *		type is not important to the driver component, so it is a void
 | 
			
		||||
 *		pointer.
 | 
			
		||||
 * @param	Bank is the bank for which the interrupt status has changed.
 | 
			
		||||
 * @param	Status is the Interrupt status of the GPIO bank.
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
typedef void (*XGpioPs_Handler) (void *CallBackRef, int Bank, u32 Status);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for a device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16 DeviceId;		/**< Unique ID of device */
 | 
			
		||||
	u32 BaseAddr;		/**< Register base address */
 | 
			
		||||
} XGpioPs_Config;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XGpioPs driver instance data. The user is required to allocate a
 | 
			
		||||
 * variable of this type for the GPIO device in the system. A pointer
 | 
			
		||||
 * to a variable of this type is then passed to the driver API functions.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XGpioPs_Config GpioConfig;	/**< Device configuration */
 | 
			
		||||
	u32 IsReady;			/**< Device is initialized and ready */
 | 
			
		||||
	XGpioPs_Handler Handler;	/**< Status handlers for all banks */
 | 
			
		||||
	void *CallBackRef; 		/**< Callback ref for bank handlers */
 | 
			
		||||
} XGpioPs;
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions in xgpiops.c
 | 
			
		||||
 */
 | 
			
		||||
int XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr,
 | 
			
		||||
			   u32 EffectiveAddr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Bank APIs in xgpiops.c
 | 
			
		||||
 */
 | 
			
		||||
u32 XGpioPs_Read(XGpioPs *InstancePtr, u8 Bank);
 | 
			
		||||
void XGpioPs_Write(XGpioPs *InstancePtr, u8 Bank, u32 Data);
 | 
			
		||||
void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction);
 | 
			
		||||
u32 XGpioPs_GetDirection(XGpioPs *InstancePtr, u8 Bank);
 | 
			
		||||
void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 Enable);
 | 
			
		||||
u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank);
 | 
			
		||||
void XGpioPs_GetBankPin(u8 PinNumber,	u8 *BankNumber, u8 *PinNumberInBank);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Pin APIs in xgpiops.c
 | 
			
		||||
 */
 | 
			
		||||
int XGpioPs_ReadPin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
void XGpioPs_WritePin(XGpioPs *InstancePtr, int Pin, int Data);
 | 
			
		||||
void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, int Pin, int Direction);
 | 
			
		||||
int XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, int Pin, int Enable);
 | 
			
		||||
int XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Diagnostic functions in xgpiops_selftest.c
 | 
			
		||||
 */
 | 
			
		||||
int XGpioPs_SelfTest(XGpioPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions in xgpiops_intr.c
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * Bank APIs in xgpiops_intr.c
 | 
			
		||||
 */
 | 
			
		||||
void XGpioPs_IntrEnable(XGpioPs *InstancePtr, u8 Bank, u32 Mask);
 | 
			
		||||
void XGpioPs_IntrDisable(XGpioPs *InstancePtr, u8 Bank, u32 Mask);
 | 
			
		||||
u32 XGpioPs_IntrGetEnabled(XGpioPs *InstancePtr, u8 Bank);
 | 
			
		||||
u32 XGpioPs_IntrGetStatus(XGpioPs *InstancePtr, u8 Bank);
 | 
			
		||||
void XGpioPs_IntrClear(XGpioPs *InstancePtr, u8 Bank, u32 Mask);
 | 
			
		||||
void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType,
 | 
			
		||||
			  u32 IntrPolarity, u32 IntrOnAny);
 | 
			
		||||
void XGpioPs_GetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 *IntrType,
 | 
			
		||||
			  u32 *IntrPolarity, u32 *IntrOnAny);
 | 
			
		||||
void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef,
 | 
			
		||||
			     XGpioPs_Handler FuncPtr);
 | 
			
		||||
void XGpioPs_IntrHandler(XGpioPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Pin APIs in xgpiops_intr.c
 | 
			
		||||
 */
 | 
			
		||||
void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType);
 | 
			
		||||
u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
 | 
			
		||||
void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
int XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
int XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, int Pin);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions in xgpiops_sinit.c
 | 
			
		||||
 */
 | 
			
		||||
XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,159 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-14 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xgpiops_hw.h
 | 
			
		||||
*
 | 
			
		||||
* This header file contains the identifiers and basic driver functions (or
 | 
			
		||||
* macros) that can be used to access the device. Other driver functions
 | 
			
		||||
* are defined in xgpiops.h.
 | 
			
		||||
*
 | 
			
		||||
* <pre>
 | 
			
		||||
* MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who  Date     Changes
 | 
			
		||||
* ----- ---- -------- -------------------------------------------------
 | 
			
		||||
* 1.00a sv   01/15/10 First Release
 | 
			
		||||
* 1.02a hk   08/22/13 Added low level reset API function prototype and
 | 
			
		||||
*                     related constant definitions
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
#ifndef XGPIOPS_HW_H		/* prevent circular inclusions */
 | 
			
		||||
#define XGPIOPS_HW_H		/* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif /* __cplusplus */
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xil_io.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name Register offsets for the GPIO. Each register is 32 bits.
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XGPIOPS_DATA_LSW_OFFSET  0x000  /* Mask and Data Register LSW, WO */
 | 
			
		||||
#define XGPIOPS_DATA_MSW_OFFSET  0x004  /* Mask and Data Register MSW, WO */
 | 
			
		||||
#define XGPIOPS_DATA_OFFSET	 0x040  /* Data Register, RW */
 | 
			
		||||
#define XGPIOPS_DATA_RO_OFFSET	 0x060  /* Data Register - Input, RO */
 | 
			
		||||
#define XGPIOPS_DIRM_OFFSET	 0x204  /* Direction Mode Register, RW */
 | 
			
		||||
#define XGPIOPS_OUTEN_OFFSET	 0x208  /* Output Enable Register, RW */
 | 
			
		||||
#define XGPIOPS_INTMASK_OFFSET	 0x20C  /* Interrupt Mask Register, RO */
 | 
			
		||||
#define XGPIOPS_INTEN_OFFSET	 0x210  /* Interrupt Enable Register, WO */
 | 
			
		||||
#define XGPIOPS_INTDIS_OFFSET	 0x214  /* Interrupt Disable Register, WO*/
 | 
			
		||||
#define XGPIOPS_INTSTS_OFFSET	 0x218  /* Interrupt Status Register, RO */
 | 
			
		||||
#define XGPIOPS_INTTYPE_OFFSET	 0x21C  /* Interrupt Type Register, RW */
 | 
			
		||||
#define XGPIOPS_INTPOL_OFFSET	 0x220  /* Interrupt Polarity Register, RW */
 | 
			
		||||
#define XGPIOPS_INTANY_OFFSET	 0x224  /* Interrupt On Any Register, RW */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/** @name Register offsets for each Bank.
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XGPIOPS_DATA_MASK_OFFSET 0x8  /* Data/Mask Registers offset */
 | 
			
		||||
#define XGPIOPS_DATA_BANK_OFFSET 0x4  /* Data Registers offset */
 | 
			
		||||
#define XGPIOPS_REG_MASK_OFFSET 0x40  /* Registers offset */
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/* For backwards compatibility */
 | 
			
		||||
#define XGPIOPS_BYPM_MASK_OFFSET	XGPIOPS_REG_MASK_OFFSET
 | 
			
		||||
 | 
			
		||||
/** @name Interrupt type reset values for each bank
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
#define XGPIOPS_INTTYPE_BANK0_RESET  0xFFFFFFFF
 | 
			
		||||
#define XGPIOPS_INTTYPE_BANK1_RESET  0x3FFFFFFF
 | 
			
		||||
#define XGPIOPS_INTTYPE_BANK2_RESET  0xFFFFFFFF
 | 
			
		||||
#define XGPIOPS_INTTYPE_BANK3_RESET  0xFFFFFFFF
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro reads the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddr is the base address of the device.
 | 
			
		||||
* @param	RegOffset is the register offset to be read.
 | 
			
		||||
*
 | 
			
		||||
* @return	The 32-bit value of the register
 | 
			
		||||
*
 | 
			
		||||
* @note		None.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XGpioPs_ReadReg(BaseAddr, RegOffset)		\
 | 
			
		||||
		Xil_In32((BaseAddr) + (RegOffset))
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* This macro writes to the given register.
 | 
			
		||||
*
 | 
			
		||||
* @param	BaseAddr is the base address of the device.
 | 
			
		||||
* @param	RegOffset is the offset of the register to be written.
 | 
			
		||||
* @param	Data is the 32-bit value to write to the register.
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		None.
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XGpioPs_WriteReg(BaseAddr, RegOffset, Data)	\
 | 
			
		||||
		Xil_Out32((BaseAddr) + (RegOffset), (Data))
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
void XGpioPs_ResetHw(u32 BaseAddress);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif /* __cplusplus */
 | 
			
		||||
 | 
			
		||||
#endif /* XGPIOPS_HW_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,410 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
*
 | 
			
		||||
* (c) Copyright 2010-14 Xilinx, Inc. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
* This file contains confidential and proprietary information of Xilinx, Inc.
 | 
			
		||||
* and is protected under U.S. and international copyright and other
 | 
			
		||||
* intellectual property laws.
 | 
			
		||||
*
 | 
			
		||||
* DISCLAIMER
 | 
			
		||||
* This disclaimer is not a license and does not grant any rights to the
 | 
			
		||||
* materials distributed herewith. Except as otherwise provided in a valid
 | 
			
		||||
* license issued to you by Xilinx, and to the maximum extent permitted by
 | 
			
		||||
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
 | 
			
		||||
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
 | 
			
		||||
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
 | 
			
		||||
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
 | 
			
		||||
* and (2) Xilinx shall not be liable (whether in contract or tort, including
 | 
			
		||||
* negligence, or under any other theory of liability) for any loss or damage
 | 
			
		||||
* of any kind or nature related to, arising under or in connection with these
 | 
			
		||||
* materials, including for any direct, or any indirect, special, incidental,
 | 
			
		||||
* or consequential loss or damage (including loss of data, profits, goodwill,
 | 
			
		||||
* or any type of loss or damage suffered as a result of any action brought by
 | 
			
		||||
* a third party) even if such damage or loss was reasonably foreseeable or
 | 
			
		||||
* Xilinx had been advised of the possibility of the same.
 | 
			
		||||
*
 | 
			
		||||
* CRITICAL APPLICATIONS
 | 
			
		||||
* Xilinx products are not designed or intended to be fail-safe, or for use in
 | 
			
		||||
* any application requiring fail-safe performance, such as life-support or
 | 
			
		||||
* safety devices or systems, Class III medical devices, nuclear facilities,
 | 
			
		||||
* applications related to the deployment of airbags, or any other applications
 | 
			
		||||
* that could lead to death, personal injury, or severe property or
 | 
			
		||||
* environmental damage (individually and collectively, "Critical
 | 
			
		||||
* Applications"). Customer assumes the sole risk and liability of any use of
 | 
			
		||||
* Xilinx products in Critical Applications, subject only to applicable laws
 | 
			
		||||
* and regulations governing limitations on product liability.
 | 
			
		||||
*
 | 
			
		||||
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
 | 
			
		||||
* AT ALL TIMES.
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
/*****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
*
 | 
			
		||||
* @file xiicps.h
 | 
			
		||||
*
 | 
			
		||||
* This is an implementation of IIC driver in the PS block. The device can
 | 
			
		||||
* be either a master or a slave on the IIC bus. This implementation supports
 | 
			
		||||
* both interrupt mode transfer and polled mode transfer. Only 7-bit address
 | 
			
		||||
* is used in the driver, although the hardware also supports 10-bit address.
 | 
			
		||||
*
 | 
			
		||||
* IIC is a 2-wire serial interface.  The master controls the clock, so it can
 | 
			
		||||
* regulate when it wants to send or receive data. The slave is under control of
 | 
			
		||||
* the master, it must respond quickly since it has no control of the clock and
 | 
			
		||||
* must send/receive data as fast or as slow as the master does.
 | 
			
		||||
*
 | 
			
		||||
* The higher level software must implement a higher layer protocol to inform
 | 
			
		||||
* the slave what to send to the master.
 | 
			
		||||
*
 | 
			
		||||
* <b>Initialization & Configuration</b>
 | 
			
		||||
*
 | 
			
		||||
* The XIicPs_Config structure is used by the driver to configure itself. This
 | 
			
		||||
* configuration structure is typically created by the tool-chain based on HW
 | 
			
		||||
* build properties.
 | 
			
		||||
*
 | 
			
		||||
* To support multiple runtime loading and initialization strategies employed by
 | 
			
		||||
* various operating systems, the driver instance can be initialized in the
 | 
			
		||||
* following way:
 | 
			
		||||
*
 | 
			
		||||
*    - XIicPs_LookupConfig(DeviceId) - Use the device identifier to find
 | 
			
		||||
*      the static configuration structure defined in xiicps_g.c. This is
 | 
			
		||||
*      setup by the tools. For some operating systems the config structure
 | 
			
		||||
*      will be initialized by the software and this call is not needed.
 | 
			
		||||
*
 | 
			
		||||
*   - XIicPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a
 | 
			
		||||
*     configuration structure provided by the caller. If running in a
 | 
			
		||||
*     system with address translation, the provided virtual memory base
 | 
			
		||||
*     address replaces the physical address in the configuration
 | 
			
		||||
*     structure.
 | 
			
		||||
*
 | 
			
		||||
* <b>Multiple Masters</b>
 | 
			
		||||
*
 | 
			
		||||
* More than one master can exist, bus arbitration is defined in the IIC
 | 
			
		||||
* standard. Lost of arbitration causes arbitration loss interrupt on the device.
 | 
			
		||||
*
 | 
			
		||||
* <b>Multiple Slaves</b>
 | 
			
		||||
*
 | 
			
		||||
* Multiple slaves are supported by selecting them with unique addresses. It is
 | 
			
		||||
* up to the system designer to be sure all devices on the IIC bus have
 | 
			
		||||
* unique addresses.
 | 
			
		||||
*
 | 
			
		||||
* <b>Addressing</b>
 | 
			
		||||
*
 | 
			
		||||
* The IIC hardware can use 7 or 10 bit addresses.  The driver provides the
 | 
			
		||||
* ability to control which address size is sent in messages as a master to a
 | 
			
		||||
* slave device.
 | 
			
		||||
*
 | 
			
		||||
* <b>FIFO Size </b>
 | 
			
		||||
* The hardware FIFO is 32 bytes deep. The user must know the limitations of
 | 
			
		||||
* other IIC devices on the bus. Some are only able to receive a limited number
 | 
			
		||||
* of bytes in a single transfer.
 | 
			
		||||
*
 | 
			
		||||
* <b>Data Rates</b>
 | 
			
		||||
*
 | 
			
		||||
* The data rate is set by values in the control register. The formula for
 | 
			
		||||
* determining the correct register values is:
 | 
			
		||||
* Fscl = Fpclk/(22 x (divisor_a+1) x (divisor_b+1))
 | 
			
		||||
*
 | 
			
		||||
* When the device is configured as a slave, the slck setting controls the
 | 
			
		||||
* sample rate and so must be set to be at least as fast as the fastest scl
 | 
			
		||||
* expected to be seen in the system.
 | 
			
		||||
*
 | 
			
		||||
* <b>Polled Mode Operation</b>
 | 
			
		||||
*
 | 
			
		||||
* This driver supports polled mode transfers.
 | 
			
		||||
*
 | 
			
		||||
* <b>Interrupts</b>
 | 
			
		||||
*
 | 
			
		||||
* The user must connect the interrupt handler of the driver,
 | 
			
		||||
* XIicPs_InterruptHandler to an interrupt system such that it will be called
 | 
			
		||||
* when an interrupt occurs. This function does not save and restore the
 | 
			
		||||
* processor context such that the user must provide this processing.
 | 
			
		||||
*
 | 
			
		||||
* The driver handles the following interrupts:
 | 
			
		||||
* - Transfer complete
 | 
			
		||||
* - More Data
 | 
			
		||||
* - Transfer not Acknowledged
 | 
			
		||||
* - Transfer Time out
 | 
			
		||||
* - Monitored slave ready - master mode only
 | 
			
		||||
* - Receive Overflow
 | 
			
		||||
* - Transmit FIFO overflow
 | 
			
		||||
* - Receive FIFO underflow
 | 
			
		||||
* - Arbitration lost
 | 
			
		||||
*
 | 
			
		||||
* <b>Bus Busy</b>
 | 
			
		||||
*
 | 
			
		||||
* Bus busy is checked before the setup of a master mode device, to avoid
 | 
			
		||||
* unnecessary arbitration loss interrupt.
 | 
			
		||||
*
 | 
			
		||||
* <b>RTOS Independence</b>
 | 
			
		||||
*
 | 
			
		||||
* This driver is intended to be RTOS and processor independent.  It works with
 | 
			
		||||
* physical addresses only.  Any needs for dynamic memory management, threads or
 | 
			
		||||
* thread mutual exclusion, virtual memory, or cache control must be satisfied by
 | 
			
		||||
* the layer above this driver.
 | 
			
		||||
*
 | 
			
		||||
* @note
 | 
			
		||||
* . Less than FIFO size transfers work for both 100 KHz and 400 KHz.
 | 
			
		||||
* . Larger than FIFO size interrupt-driven transfers are not reliable on
 | 
			
		||||
*    busy systems where interrupt latency is high.
 | 
			
		||||
* . Larger than FIFO size interrupt-driven transfers are not reliable for
 | 
			
		||||
*    data rate of 400 KHz.
 | 
			
		||||
* . Larger than FIFO size polled mode transfers work reliably.
 | 
			
		||||
*
 | 
			
		||||
* <pre> MODIFICATION HISTORY:
 | 
			
		||||
*
 | 
			
		||||
* Ver   Who     Date     Changes
 | 
			
		||||
* ----- ------  -------- -----------------------------------------------
 | 
			
		||||
* 1.00a drg/jz  01/30/08 First release
 | 
			
		||||
* 1.00a sdm     09/21/11 Fixed an issue in the XIicPs_SetOptions and
 | 
			
		||||
*			 XIicPs_ClearOptions where the InstancePtr->Options
 | 
			
		||||
*			 was not updated correctly.
 | 
			
		||||
* 			 Updated the InstancePtr->Options in the
 | 
			
		||||
*			 XIicPs_CfgInitialize by calling XIicPs_GetOptions.
 | 
			
		||||
*			 Updated the XIicPs_SetupMaster to not check for
 | 
			
		||||
*			 Bus Busy condition when the Hold Bit is set.
 | 
			
		||||
*			 Removed some unused variables.
 | 
			
		||||
* 1.01a sg      03/30/12 Fixed an issue in XIicPs_MasterSendPolled where a
 | 
			
		||||
*			 check for transfer completion is added, which indicates
 | 
			
		||||
*			 the completion of current transfer.
 | 
			
		||||
* 1.02a sg	08/29/12 Updated the logic to arrive at the best divisors
 | 
			
		||||
*			 to achieve I2C clock with minimum error for
 | 
			
		||||
*			 CR #674195
 | 
			
		||||
* 1.03a hk  05/04/13 Initialized BestDivA and BestDivB to 0.
 | 
			
		||||
*			 This is fix for CR#704398 to remove warning.
 | 
			
		||||
* 2.0   hk  03/07/14 Added check for error status in the while loop that
 | 
			
		||||
*                    checks for completion.
 | 
			
		||||
*                    (XIicPs_MasterSendPolled function). CR# 762244, 764875.
 | 
			
		||||
*                    Limited frequency set when 100KHz or 400KHz is
 | 
			
		||||
*                    selected. This is a hardware limitation. CR#779290.
 | 
			
		||||
* 2.1   hk  04/24/14 Fix for CR# 789821 to handle >14 byte transfers.
 | 
			
		||||
*                    Explicitly reset CR and clear FIFO in Abort function
 | 
			
		||||
*                    and state the same in the comments. CR# 784254.
 | 
			
		||||
*                    Fix for CR# 761060 - provision for repeated start.
 | 
			
		||||
*
 | 
			
		||||
* </pre>
 | 
			
		||||
*
 | 
			
		||||
******************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef XIICPS_H       /* prevent circular inclusions */
 | 
			
		||||
#define XIICPS_H       /* by using protection macros */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/***************************** Include Files *********************************/
 | 
			
		||||
 | 
			
		||||
#include "xil_types.h"
 | 
			
		||||
#include "xil_assert.h"
 | 
			
		||||
#include "xstatus.h"
 | 
			
		||||
#include "xiicps_hw.h"
 | 
			
		||||
 | 
			
		||||
/************************** Constant Definitions *****************************/
 | 
			
		||||
 | 
			
		||||
/** @name Configuration options
 | 
			
		||||
 *
 | 
			
		||||
 * The following options may be specified or retrieved for the device and
 | 
			
		||||
 * enable/disable additional features of the IIC.  Each of the options
 | 
			
		||||
 * are bit fields, so more than one may be specified.
 | 
			
		||||
 *
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XIICPS_7_BIT_ADDR_OPTION	0x01  /**< 7-bit address mode */
 | 
			
		||||
#define XIICPS_10_BIT_ADDR_OPTION	0x02  /**< 10-bit address mode */
 | 
			
		||||
#define XIICPS_SLAVE_MON_OPTION		0x04  /**< Slave monitor mode */
 | 
			
		||||
#define XIICPS_REP_START_OPTION		0x08  /**< Repeated Start */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name Callback events
 | 
			
		||||
 *
 | 
			
		||||
 * These constants specify the handler events that are passed to an application
 | 
			
		||||
 * event handler from the driver.  These constants are bit masks such that
 | 
			
		||||
 * more than one event can be passed to the handler.
 | 
			
		||||
 *
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
#define XIICPS_EVENT_COMPLETE_SEND	0x0001  /**< Transmit Complete Event*/
 | 
			
		||||
#define XIICPS_EVENT_COMPLETE_RECV	0x0002  /**< Receive Complete Event*/
 | 
			
		||||
#define XIICPS_EVENT_TIME_OUT		0x0004  /**< Transfer timed out */
 | 
			
		||||
#define XIICPS_EVENT_ERROR		0x0008  /**< Receive error */
 | 
			
		||||
#define XIICPS_EVENT_ARB_LOST		0x0010  /**< Arbitration lost */
 | 
			
		||||
#define XIICPS_EVENT_NACK		0x0020  /**< NACK Received */
 | 
			
		||||
#define XIICPS_EVENT_SLAVE_RDY		0x0040  /**< Slave ready */
 | 
			
		||||
#define XIICPS_EVENT_RX_OVR		0x0080  /**< RX overflow */
 | 
			
		||||
#define XIICPS_EVENT_TX_OVR		0x0100  /**< TX overflow */
 | 
			
		||||
#define XIICPS_EVENT_RX_UNF		0x0200  /**< RX underflow */
 | 
			
		||||
/*@}*/
 | 
			
		||||
 | 
			
		||||
/** @name Role constants
 | 
			
		||||
 *
 | 
			
		||||
 * These constants are used to pass into the device setup routines to
 | 
			
		||||
 * set up the device according to transfer direction.
 | 
			
		||||
 */
 | 
			
		||||
#define SENDING_ROLE		1  /**< Transfer direction is sending */
 | 
			
		||||
#define RECVING_ROLE		0  /**< Transfer direction is receiving */
 | 
			
		||||
 | 
			
		||||
/* Maximum transfer size */
 | 
			
		||||
#define XIICPS_MAX_TRANSFER_SIZE	(255 - 3)
 | 
			
		||||
 | 
			
		||||
/**************************** Type Definitions *******************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* The handler data type allows the user to define a callback function to
 | 
			
		||||
* respond to interrupt events in the system. This function is executed
 | 
			
		||||
* in interrupt context, so amount of processing should be minimized.
 | 
			
		||||
*
 | 
			
		||||
* @param	CallBackRef is the callback reference passed in by the upper
 | 
			
		||||
*		layer when setting the callback functions, and passed back to
 | 
			
		||||
*		the upper layer when the callback is invoked. Its type is
 | 
			
		||||
*		not important to the driver, so it is a void pointer.
 | 
			
		||||
* @param	StatusEvent indicates one or more status events that occurred.
 | 
			
		||||
*/
 | 
			
		||||
typedef void (*XIicPs_IntrHandler) (void *CallBackRef, u32 StatusEvent);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This typedef contains configuration information for the device.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	u16 DeviceId;     /**< Unique ID  of device */
 | 
			
		||||
	u32 BaseAddress;  /**< Base address of the device */
 | 
			
		||||
	u32 InputClockHz; /**< Input clock frequency */
 | 
			
		||||
} XIicPs_Config;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The XIicPs driver instance data. The user is required to allocate a
 | 
			
		||||
 * variable of this type for each IIC device in the system. A pointer
 | 
			
		||||
 * to a variable of this type is then passed to the driver API functions.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
	XIicPs_Config Config;	/* Configuration structure */
 | 
			
		||||
	u32 IsReady;		/* Device is initialized and ready */
 | 
			
		||||
	u32 Options;		/* Options set in the device */
 | 
			
		||||
 | 
			
		||||
	u8 *SendBufferPtr;	/* Pointer to send buffer */
 | 
			
		||||
	u8 *RecvBufferPtr;	/* Pointer to recv buffer */
 | 
			
		||||
	int SendByteCount;	/* Number of bytes still expected to send */
 | 
			
		||||
	int RecvByteCount;	/* Number of bytes still expected to receive */
 | 
			
		||||
	int CurrByteCount;	/* No. of bytes expected in current transfer */
 | 
			
		||||
 | 
			
		||||
	int UpdateTxSize;	/* If tx size register has to be updated */
 | 
			
		||||
	int IsSend;		/* Whether master is sending or receiving */
 | 
			
		||||
	int IsRepeatedStart;	/* Indicates if user set repeated start */
 | 
			
		||||
 | 
			
		||||
	XIicPs_IntrHandler StatusHandler;  /* Event handler function */
 | 
			
		||||
	void *CallBackRef;	/* Callback reference for event handler */
 | 
			
		||||
} XIicPs;
 | 
			
		||||
 | 
			
		||||
/***************** Macros (Inline Functions) Definitions *********************/
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
*
 | 
			
		||||
* Place one byte into the transmit FIFO.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is the instance of IIC
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		void XIicPs_SendByte(XIicPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XIicPs_SendByte(InstancePtr)					\
 | 
			
		||||
{									\
 | 
			
		||||
	 XIicPs_Out32((InstancePtr)->Config.BaseAddress			\
 | 
			
		||||
			 + XIICPS_DATA_OFFSET, 				\
 | 
			
		||||
	*(InstancePtr)->SendBufferPtr ++);				\
 | 
			
		||||
	 (InstancePtr)->SendByteCount --;				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
*
 | 
			
		||||
* Receive one byte from FIFO.
 | 
			
		||||
*
 | 
			
		||||
* @param	InstancePtr is the instance of IIC
 | 
			
		||||
*
 | 
			
		||||
* @return	None.
 | 
			
		||||
*
 | 
			
		||||
* @note		C-Style signature:
 | 
			
		||||
*		u8 XIicPs_RecvByte(XIicPs *InstancePtr)
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
#define XIicPs_RecvByte(InstancePtr)					\
 | 
			
		||||
{									\
 | 
			
		||||
	*(InstancePtr)->RecvBufferPtr ++ =				\
 | 
			
		||||
	 (u8)XIicPs_In32((InstancePtr)->Config.BaseAddress		\
 | 
			
		||||
		  + XIICPS_DATA_OFFSET); 				\
 | 
			
		||||
	 (InstancePtr)->RecvByteCount --; 				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/************************** Function Prototypes ******************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Function for configuration lookup, in xiicps_sinit.c
 | 
			
		||||
 */
 | 
			
		||||
XIicPs_Config *XIicPs_LookupConfig(u16 DeviceId);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for general setup, in xiicps.c
 | 
			
		||||
 */
 | 
			
		||||
int XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config * Config,
 | 
			
		||||
				  u32 EffectiveAddr);
 | 
			
		||||
 | 
			
		||||
void XIicPs_Abort(XIicPs *InstancePtr);
 | 
			
		||||
void XIicPs_Reset(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XIicPs_BusIsBusy(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for interrupts, in xiicps_intr.c
 | 
			
		||||
 */
 | 
			
		||||
void XIicPs_SetStatusHandler(XIicPs *InstancePtr, void *CallBackRef,
 | 
			
		||||
				  XIicPs_IntrHandler FuncPtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for device as master, in xiicps_master.c
 | 
			
		||||
 */
 | 
			
		||||
void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount,
 | 
			
		||||
		u16 SlaveAddr);
 | 
			
		||||
void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount,
 | 
			
		||||
		u16 SlaveAddr);
 | 
			
		||||
int XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount,
 | 
			
		||||
		u16 SlaveAddr);
 | 
			
		||||
int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount,
 | 
			
		||||
		u16 SlaveAddr);
 | 
			
		||||
void XIicPs_EnableSlaveMonitor(XIicPs *InstancePtr, u16 SlaveAddr);
 | 
			
		||||
void XIicPs_DisableSlaveMonitor(XIicPs *InstancePtr);
 | 
			
		||||
void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for device as slave, in xiicps_slave.c
 | 
			
		||||
 */
 | 
			
		||||
void XIicPs_SetupSlave(XIicPs *InstancePtr, u16 SlaveAddr);
 | 
			
		||||
void XIicPs_SlaveSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount);
 | 
			
		||||
void XIicPs_SlaveRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount);
 | 
			
		||||
int XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount);
 | 
			
		||||
int XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount);
 | 
			
		||||
void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for selftest, in xiicps_selftest.c
 | 
			
		||||
 */
 | 
			
		||||
int XIicPs_SelfTest(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Functions for setting and getting data rate, in xiicps_options.c
 | 
			
		||||
 */
 | 
			
		||||
int XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options);
 | 
			
		||||
int XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options);
 | 
			
		||||
u32 XIicPs_GetOptions(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
int XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz);
 | 
			
		||||
u32 XIicPs_GetSClk(XIicPs *InstancePtr);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* end of protection macro */
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue