diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.cproject b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.cproject
new file mode 100644
index 0000000..bbcae40
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.cproject
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>

+<?fileVersion 4.0.0?>

+

+<cproject>

+<storageModule moduleId="org.eclipse.cdt.core.settings">

+<cconfiguration id="0.1109417601">

+<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1109417601" moduleId="org.eclipse.cdt.core.settings" name="Default">

+<externalSettings/>

+<extensions>

+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>

+<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>

+</extensions>

+</storageModule>

+<storageModule moduleId="cdtBuildSystem" version="4.0.0">

+<configuration artifactExtension="" artifactName="RTOSDemo" buildProperties="" description="" id="0.1109417601" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">

+<folderInfo id="0.1109417601." name="/" resourcePath="">

+<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1816209921" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">

+<targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.eclipse.cdt.build.core.prefbase.toolchain.1816209921.1299943801" name=""/>

+<builder autoBuildTarget="all" buildPath="${workspace_loc:/RTOSDemo}" cleanBuildTarget="clean" command="make" enableAutoBuild="false" enableCleanBuild="true" enabledIncrementalBuild="true" id="org.eclipse.cdt.build.core.settings.default.builder.116472864" incrementalBuildTarget="all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder">

+<outputEntries>

+<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name=""/>

+</outputEntries>

+</builder>

+<tool id="org.eclipse.cdt.build.core.settings.holder.libs.260784574" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>

+<tool id="org.eclipse.cdt.build.core.settings.holder.1502006385" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">

+<option id="org.eclipse.cdt.build.core.settings.holder.undef.incpaths.578007234" name="Undefined Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.undef.incpaths"/>

+<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.685511860" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>

+</tool>

+<tool id="org.eclipse.cdt.build.core.settings.holder.1021181093" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">

+<option id="org.eclipse.cdt.build.core.settings.holder.undef.incpaths.1567637665" name="Undefined Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.undef.incpaths"/>

+<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1828415025" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>

+</tool>

+<tool id="org.eclipse.cdt.build.core.settings.holder.164584712" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">

+<option id="org.eclipse.cdt.build.core.settings.holder.undef.incpaths.1309366258" name="Undefined Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.undef.incpaths"/>

+<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1667472855" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>

+</tool>

+</toolChain>

+</folderInfo>

+<sourceEntries>

+<entry excluding="Common Demo Files|FreeRTOS.org Source|Source|Minimal" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>

+<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS.org Source"/>

+<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Common Demo Files"/>

+</sourceEntries>

+</configuration>

+</storageModule>

+<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>

+<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>

+

+

+

+

+<storageModule moduleId="scannerConfiguration">

+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>

+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="true"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="true"/>

+</buildOutputProvider>

+<scannerInfoProvider id="makefileGenerator">

+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">

+<buildOutputProvider>

+<openAction enabled="false" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">

+<buildOutputProvider>

+<openAction enabled="false" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">

+<buildOutputProvider>

+<openAction enabled="false" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">

+<buildOutputProvider>

+<openAction enabled="false" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">

+<buildOutputProvider>

+<openAction enabled="false" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">

+<buildOutputProvider>

+<openAction enabled="false" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<scannerConfigBuildInfo instanceId="0.1109417601">

+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>

+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="true"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="arm-elf-gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="true"/>

+</buildOutputProvider>

+<scannerInfoProvider id="makefileGenerator">

+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">

+<buildOutputProvider>

+<openAction enabled="true" filePath=""/>

+<parser enabled="false"/>

+</buildOutputProvider>

+<scannerInfoProvider id="specsFile">

+<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>

+<parser enabled="true"/>

+</scannerInfoProvider>

+</profile>

+</scannerConfigBuildInfo>

+</storageModule>

+<storageModule moduleId="org.eclipse.cdt.core.language.mapping">

+<project-mappings/>

+</storageModule>

+</cconfiguration>

+</storageModule>

+<storageModule moduleId="cdtBuildSystem" version="4.0.0">

+<project id="RTOSDemo.null.976634949" name="RTOSDemo"/>

+</storageModule>

+</cproject>

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.project b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.project
new file mode 100644
index 0000000..b3776de
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.project
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>RTOSDemo</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>

+			<triggers>clean,full,incremental,</triggers>

+			<arguments>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>

+					<value>clean</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>

+					<value>true</value>

+				</dictionary>

+				<dictionary>

+					<key>?name?</key>

+					<value></value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.append_environment</key>

+					<value>true</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.stopOnError</key>

+					<value>true</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.buildCommand</key>

+					<value>make</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.contents</key>

+					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.buildLocation</key>

+					<value>${workspace_loc:/RTOSDemo}</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>

+					<value>false</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>

+					<value>false</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>

+					<value>true</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.buildArguments</key>

+					<value></value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>

+					<value>all</value>

+				</dictionary>

+				<dictionary>

+					<key>?children?</key>

+					<value>?name?=outputEntries\|?children?=?name?=entry\\\\\\\\\\\\\\\|\\\\\\\|\||</value>

+				</dictionary>

+				<dictionary>

+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>

+					<value>all</value>

+				</dictionary>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>

+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>

+		<nature>org.eclipse.cdt.core.cnature</nature>

+	</natures>

+	<linkedResources>

+		<link>

+			<name>Common Demo Files</name>

+			<type>2</type>

+			<locationURI>FreeRTOS_ROOT/Demo/Common</locationURI>

+		</link>

+		<link>

+			<name>FreeRTOS.org Source</name>

+			<type>2</type>

+			<locationURI>FreeRTOS_ROOT/Source</locationURI>

+		</link>

+	</linkedResources>

+</projectDescription>

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.settings/org.eclipse.ltk.core.refactoring.prefs b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..a9f7e81
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Sun Aug 19 20:36:58 BST 2007

+eclipse.preferences.version=1

+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/FreeRTOSConfig.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/FreeRTOSConfig.h
new file mode 100644
index 0000000..1db7e2b
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/FreeRTOSConfig.h
@@ -0,0 +1,119 @@
+/*

+    FreeRTOS V7.1.0 - 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 FREERTOS_CONFIG_H

+#define FREERTOS_CONFIG_H

+

+#include <stdio.h>

+#include "AT91SAM7X256.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.

+ *----------------------------------------------------------*/

+

+#define configUSE_PREEMPTION		1

+#define configUSE_IDLE_HOOK         0

+#define configUSE_TICK_HOOK         1

+#define configCPU_CLOCK_HZ          ( ( unsigned long ) 47923200 )

+#define configTICK_RATE_HZ          ( ( portTickType ) 1000 )

+#define configMAX_PRIORITIES		( ( unsigned portBASE_TYPE ) 4 )

+#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 130 )

+#define configTOTAL_HEAP_SIZE		( ( size_t ) ( 24 * 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

+

+/* Co-routine definitions. */

+#define configUSE_CO_ROUTINES 		0

+#define configMAX_CO_ROUTINE_PRIORITIES ( 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       0

+#define INCLUDE_vTaskSuspend                1

+#define INCLUDE_vTaskDelayUntil             1

+#define INCLUDE_vTaskDelay                  1

+#define INCLUDE_xTaskGetCurrentTaskHandle	1

+

+

+

+/* MAC address configuration. */

+#define uipMAC_ADDR0	0x00

+#define uipMAC_ADDR1	0x12

+#define uipMAC_ADDR2	0x13

+#define uipMAC_ADDR3	0x10

+#define uipMAC_ADDR4	0x15

+#define uipMAC_ADDR5	0x11

+

+/* IP address configuration. */

+#define uipIP_ADDR0		172

+#define uipIP_ADDR1		25

+#define uipIP_ADDR2		218

+#define uipIP_ADDR3		10	

+

+#endif /* FREERTOS_CONFIG_H */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile
new file mode 100644
index 0000000..3b36831
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile
@@ -0,0 +1,158 @@
+#/*

+#    FreeRTOS V7.1.0 - 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.

+#*/

+

+

+RTOS_SOURCE_DIR=../../../Source

+DEMO_COMMON_DIR=../../Common/Minimal

+DEMO_INCLUDE_DIR=../../Common/include

+UIP_COMMON_DIR=../../Common/ethernet/uIP/uip-1.0/uip

+

+CC=arm-elf-gcc

+OBJCOPY=arm-elf-objcopy

+LDSCRIPT=atmel-rom.ld

+

+LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map

+

+DEBUG=-g

+OPTIM=-O3

+

+

+CFLAGS= $(DEBUG) \

+		$(OPTIM) \

+		-T$(LDSCRIPT) \

+		-I . \

+		-I $(RTOS_SOURCE_DIR)/include \

+		-I $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S \

+		-I $(DEMO_INCLUDE_DIR) \

+		-I ./webserver \

+		-I $(UIP_COMMON_DIR) \

+		-I ./SrcAtmel \

+		-I ./USB \

+		-D SAM7_GCC \

+		-D THUMB_INTERWORK \

+		-mcpu=arm7tdmi \

+		-D PACK_STRUCT_END=__attribute\(\(packed\)\) \

+		-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \

+		-fomit-frame-pointer \

+		-mthumb-interwork \

+		-fno-strict-aliasing \

+		-fno-dwarf2-cfi-asm

+										

+THUMB_SOURCE= \

+		main.c \

+		./ParTest/ParTest.c \

+		$(DEMO_COMMON_DIR)/BlockQ.c \

+		$(DEMO_COMMON_DIR)/blocktim.c \

+		$(DEMO_COMMON_DIR)/flash.c \

+		$(DEMO_COMMON_DIR)/integer.c \

+		$(DEMO_COMMON_DIR)/GenQTest.c \

+		$(DEMO_COMMON_DIR)/QPeek.c \

+		$(DEMO_COMMON_DIR)/dynamic.c \

+		./webserver/uIP_Task.c \

+		./webserver/httpd.c \

+		./webserver/httpd-cgi.c \

+		./webserver/httpd-fs.c \

+		./webserver/http-strings.c \

+		./webserver/SAM7_EMAC.c \

+		$(UIP_COMMON_DIR)/uip_arp.c \

+		$(UIP_COMMON_DIR)/psock.c \

+		$(UIP_COMMON_DIR)/timer.c \

+		$(UIP_COMMON_DIR)/uip.c \

+		$(RTOS_SOURCE_DIR)/list.c \

+		$(RTOS_SOURCE_DIR)/queue.c \

+		$(RTOS_SOURCE_DIR)/tasks.c \

+		$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/port.c \

+		$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c \

+		./USB/USBSample.c \

+		syscalls.c

+

+ARM_SOURCE= \

+		$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/portISR.c \

+		./webserver/EMAC_ISR.c \

+		./SrcAtmel/Cstartup_SAM7.c \

+		./USB/USB_ISR.c

+

+THUMB_OBJS = $(THUMB_SOURCE:.c=.o)

+ARM_OBJS = $(ARM_SOURCE:.c=.o)

+

+

+all: RTOSDemo.bin

+

+RTOSDemo.bin : RTOSDemo.hex

+	$(OBJCOPY) RTOSDemo.elf -O binary RTOSDemo.bin

+	 

+RTOSDemo.hex : RTOSDemo.elf

+	$(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.hex

+

+RTOSDemo.elf : $(THUMB_OBJS) $(ARM_OBJS) boot.s Makefile

+	$(CC) $(CFLAGS) $(ARM_OBJS) $(THUMB_OBJS) $(LIBS) boot.s $(LINKER_FLAGS) 

+

+$(THUMB_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h

+	$(CC) -c $(CFLAGS) -mthumb $< -o $@

+

+$(ARM_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h

+	$(CC) -c $(CFLAGS) $< -o $@

+

+clean :

+	rm $(THUMB_OBJS)

+	rm $(ARM_OBJS)

+	touch Makefile

+	rm RTOSDemo.elf

+	rm RTOSDemo.hex

+	

+	

+	

+

+

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/ParTest/ParTest.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/ParTest/ParTest.c
new file mode 100644
index 0000000..173e7e4
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/ParTest/ParTest.c
@@ -0,0 +1,118 @@
+/*

+    FreeRTOS V7.1.0 - 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.

+*/

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+

+/* Demo application includes. */

+#include "partest.h"

+

+/*-----------------------------------------------------------

+ * Simple parallel port IO routines for the LED's.  LED's can be set, cleared

+ * or toggled.

+ *-----------------------------------------------------------*/

+

+#define partstNUM_LEDS		( 4 )

+#define partstALL_LEDS		( ulLED_Mask[ 0 ] | ulLED_Mask[ 1 ] | ulLED_Mask[ 2 ] | ulLED_Mask[ 3 ] )

+const unsigned long 	ulLED_Mask[ partstNUM_LEDS ]= { (1<<19), (1<<20), (1<<21), (1<<22) };

+

+

+void vParTestInitialise( void )

+{	

+	/* Configure the PIO Lines corresponding to LED1 to LED4 to be outputs. */

+	AT91C_BASE_PIOB->PIO_PER = partstALL_LEDS; 

+	AT91C_BASE_PIOB->PIO_OER = partstALL_LEDS; 

+

+	/* Start with all LED's off. */

+    AT91C_BASE_PIOB->PIO_SODR = partstALL_LEDS;

+}

+/*-----------------------------------------------------------*/

+

+void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )

+{

+	if( uxLED < ( portBASE_TYPE ) partstNUM_LEDS )

+	{

+		if( xValue )

+		{

+			AT91C_BASE_PIOB->PIO_SODR = ulLED_Mask[ uxLED ];

+		}

+		else

+		{

+			AT91C_BASE_PIOB->PIO_CODR = ulLED_Mask[ uxLED ];

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+void vParTestToggleLED( unsigned portBASE_TYPE uxLED )

+{

+	if( uxLED < ( portBASE_TYPE ) partstNUM_LEDS )

+	{

+		if( AT91C_BASE_PIOB->PIO_PDSR & ulLED_Mask[ uxLED ] )

+		{

+			AT91C_BASE_PIOB->PIO_CODR = ulLED_Mask[ uxLED ];

+		}

+		else

+		{

+			AT91C_BASE_PIOB->PIO_SODR = ulLED_Mask[ uxLED ];

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+unsigned portBASE_TYPE uxParTestGetLED( void )

+{

+	/* Return the value of LED DS4 for use by the WEB server. */

+	return !( AT91C_BASE_PIOB->PIO_PDSR & ulLED_Mask[ partstNUM_LEDS - 1 ] );

+}

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Board.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Board.h
new file mode 100644
index 0000000..8b34427
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Board.h
@@ -0,0 +1,68 @@
+/*----------------------------------------------------------------------------

+*         ATMEL Microcontroller Software Support  -  ROUSSET  -

+*----------------------------------------------------------------------------

+* The software is delivered "AS IS" without warranty or condition of any

+* kind, either express, implied or statutory. This includes without

+* limitation any warranty or condition with respect to merchantability or

+* fitness for any particular purpose, or against the infringements of

+* intellectual property rights of others.

+*----------------------------------------------------------------------------

+* File Name           : Board.h

+* Object              : AT91SAM7X Evaluation Board Features Definition File.

+*

+* Creation            : JG   20/Jun/2005

+*----------------------------------------------------------------------------

+*/

+#ifndef Board_h

+#define Board_h

+

+#include "AT91SAM7X256.h"

+#include "ioat91sam7x256.h"

+

+#define true	-1

+#define false	0

+

+/*-------------------------------*/

+/* SAM7Board Memories Definition */

+/*-------------------------------*/

+// The AT91SAM7X128 embeds a 32-Kbyte SRAM bank, and 128K-Byte Flash

+

+#define  FLASH_PAGE_NB		256

+#define  FLASH_PAGE_SIZE	128

+

+/*-----------------*/

+/* Leds Definition */

+/*-----------------*/

+#define LED1            (1<<19)	// PB19

+#define LED2            (1<<20)	// PB20

+#define LED3            (1<<21)	// PB21

+#define LED4            (1<<22)	// PB22

+#define NB_LED			4

+

+#define LED_MASK        (LED1|LED2|LED3|LED4)

+

+/*-------------------------*/

+/* Push Buttons Definition */

+/*-------------------------*/

+

+#define SW1_MASK        (1<<21)	// PA21

+#define SW2_MASK        (1<<22)	// PA22

+#define SW3_MASK        (1<<23)	// PA23

+#define SW4_MASK        (1<<24)	// PA24

+#define SW_MASK         (SW1_MASK|SW2_MASK|SW3_MASK|SW4_MASK)

+

+

+#define SW1 	(1<<21)	// PA21

+#define SW2 	(1<<22)	// PA22

+#define SW3 	(1<<23)	// PA23

+#define SW4 	(1<<24)	// PA24

+#define SWPUSH	(1<<25) // PA25

+/*--------------*/

+/* Master Clock */

+/*--------------*/

+

+#define EXT_OC          18432000   // Exetrnal ocilator MAINCK

+#define MCK             47923200   // MCK (PLLRC div by 2)

+#define MCKKHz          (MCK/1000) //

+

+#endif /* Board_h */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup.s79 b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup.s79
new file mode 100644
index 0000000..b875618
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup.s79
@@ -0,0 +1,223 @@
+;------------------------------------------------------------------------------

+;-         ATMEL Microcontroller Software Support  -  ROUSSET  -

+;------------------------------------------------------------------------------

+; The software is delivered "AS IS" without warranty or condition of any

+; kind, either express, implied or statutory. This includes without

+; limitation any warranty or condition with respect to merchantability or

+; fitness for any particular purpose, or against the infringements of

+; intellectual property rights of others.

+;-----------------------------------------------------------------------------

+;- File source          : Cstartup.s79

+;- Object               : Generic CStartup for IAR No Use REMAP

+;- Compilation flag     : None

+;-

+;- 1.0 15/Jun/04 JPP    : Creation

+;------------------------------------------------------------------------------

+

+#include "AT91SAM7X256_inc.h"

+

+;------------------------------------------------------------------------------

+;- Area Definition

+;------------------------------------------------------------------------------

+

+;---------------------------------------------------------------

+; ?RESET

+; Reset Vector.

+; Normally, segment INTVEC is linked at address 0.

+; For debugging purposes, INTVEC may be placed at other

+; addresses.

+; A debugger that honors the entry point will start the

+; program in a normal way even if INTVEC is not at address 0.

+;-------------------------------------------------------------

+

+		PROGRAM	?RESET

+		RSEG	INTRAMSTART_REMAP

+		RSEG	INTRAMEND_REMAP

+

+		EXTERN	vPortYieldProcessor

+

+		RSEG	ICODE:CODE:ROOT(2)

+		CODE32	; Always ARM mode after reset	

+		org	0	

+reset		

+;------------------------------------------------------------------------------

+;- Exception vectors

+;--------------------

+;- These vectors can be read at address 0 or at RAM address

+;- They ABSOLUTELY requires to be in relative addresssing mode in order to

+;- guarantee a valid jump. For the moment, all are just looping.

+;- If an exception occurs before remap, this would result in an infinite loop.

+;- To ensure if a exeption occurs before start application to infinite loop.

+;------------------------------------------------------------------------------

+

+                B           InitReset           ; 0x00 Reset handler

+undefvec:

+                B           undefvec            ; 0x04 Undefined Instruction

+swivec:

+                B           vPortYieldProcessor ; 0x08 Software Interrupt

+pabtvec:

+                B           pabtvec             ; 0x0C Prefetch Abort

+dabtvec:

+                B           dabtvec             ; 0x10 Data Abort

+rsvdvec:

+                B           rsvdvec             ; 0x14 reserved

+irqvec:

+				LDR			PC, [PC, #-0xF20]	; Jump directly to the address given by the AIC

+

+fiqvec:               							; 0x1c FIQ

+

+;------------------------------------------------------------------------------

+;- Function             : FIQ_Handler_Entry

+;- Treatments           : FIQ Controller Interrupt Handler.

+;- Called Functions     : AIC_FVR[interrupt]

+;------------------------------------------------------------------------------

+

+FIQ_Handler_Entry:

+

+;- Switch in SVC/User Mode to allow User Stack access for C code

+; because the FIQ is not yet acknowledged

+

+;- Save and r0 in FIQ_Register

+            mov         r9,r0

+		    ldr         r0 , [r8, #AIC_FVR]

+            msr         CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC

+

+;- Save scratch/used registers and LR in User Stack

+            stmfd       sp!, { r1-r3, r12, lr}

+

+;- Branch to the routine pointed by the AIC_FVR

+            mov         r14, pc

+            bx          r0

+

+;- Restore scratch/used registers and LR from User Stack

+            ldmia       sp!, { r1-r3, r12, lr}

+

+;- Leave Interrupts disabled and switch back in FIQ mode

+            msr         CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ

+

+;- Restore the R0 ARM_MODE_SVC register

+            mov         r0,r9

+

+;- Restore the Program Counter using the LR_fiq directly in the PC

+            subs        pc,lr,#4

+

+InitReset:

+;------------------------------------------------------------------------------

+;- Low level Init (PMC, AIC, ? ....) by C function AT91F_LowLevelInit

+;------------------------------------------------------------------------------

+            	EXTERN   AT91F_LowLevelInit

+

+#define  __iramend 	SFB(INTRAMEND_REMAP)

+

+;- minumum C initialization

+;- call  AT91F_LowLevelInit( void)

+

+            ldr     r13,=__iramend            ; temporary stack in internal RAM

+;--Call Low level init function in ABSOLUTE through the Interworking

+		    ldr	    r0,=AT91F_LowLevelInit

+       	    mov     lr, pc

+		    bx	    r0

+;------------------------------------------------------------------------------

+;- Stack Sizes Definition

+;------------------------

+;- Interrupt Stack requires 2 words x 8 priority level x 4 bytes when using

+;- the vectoring. This assume that the IRQ management.

+;- The Interrupt Stack must be adjusted depending on the interrupt handlers.

+;- Fast Interrupt not requires stack If in your application it required you must

+;- be definehere.

+;- The System stack size is not defined and is limited by the free internal

+;- SRAM.

+;------------------------------------------------------------------------------

+

+;------------------------------------------------------------------------------

+;- Top of Stack Definition

+;-------------------------

+;- Interrupt and Supervisor Stack are located at the top of internal memory in

+;- order to speed the exception handling context saving and restoring.

+;- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory.

+;------------------------------------------------------------------------------

+

+IRQ_STACK_SIZE          EQU     300

+

+ARM_MODE_FIQ            EQU     0x11

+ARM_MODE_IRQ            EQU     0x12

+ARM_MODE_SVC            EQU     0x13

+

+I_BIT                   EQU     0x80

+F_BIT                   EQU     0x40

+

+;------------------------------------------------------------------------------

+;- Setup the stack for each mode

+;-------------------------------

+                ldr     r0, =__iramend

+

+;- Set up Fast Interrupt Mode and set FIQ Mode Stack

+                msr     CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT

+;- Init the FIQ register

+            	ldr     r8, =AT91C_BASE_AIC

+

+;- Set up Interrupt Mode and set IRQ Mode Stack

+                msr     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT

+                mov     r13, r0                     ; Init stack IRQ

+                sub     r0, r0, #IRQ_STACK_SIZE

+

+;- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack

+                msr     CPSR_c, #ARM_MODE_SVC

+                mov     r13, r0

+

+

+;---------------------------------------------------------------

+; ?CSTARTUP

+;---------------------------------------------------------------

+		EXTERN	__segment_init

+		EXTERN	main

+; Initialize segments.

+; __segment_init is assumed to use

+; instruction set and to be reachable by BL from the ICODE segment

+; (it is safest to link them in segment ICODE).

+		ldr	r0,=__segment_init

+                mov     lr, pc

+		bx	r0

+

+		PUBLIC	__main

+?jump_to_main:

+		ldr	lr,=?call_exit

+		ldr	r0,=main

+__main:

+		bx	r0

+

+;------------------------------------------------------------------------------

+;- Loop for ever

+;---------------

+;- End of application. Normally, never occur.

+;- Could jump on Software Reset ( B 0x0 ).

+;------------------------------------------------------------------------------

+?call_exit:

+End

+            b       End

+

+

+

+;---------------------------------------------------------------

+; ?EXEPTION_VECTOR

+; This module is only linked if needed for closing files.

+;---------------------------------------------------------------

+		PUBLIC	AT91F_Default_FIQ_handler

+		PUBLIC	AT91F_Default_IRQ_handler

+		PUBLIC	AT91F_Spurious_handler

+

+		CODE32	; Always ARM mode after exeption	

+

+AT91F_Default_FIQ_handler

+            b     AT91F_Default_FIQ_handler

+

+AT91F_Default_IRQ_handler

+            b     AT91F_Default_IRQ_handler

+

+AT91F_Spurious_handler

+            b     AT91F_Spurious_handler

+

+	ENDMOD

+

+	END

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup_SAM7.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup_SAM7.c
new file mode 100644
index 0000000..d9716c0
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup_SAM7.c
@@ -0,0 +1,69 @@
+//*----------------------------------------------------------------------------

+//*         ATMEL Microcontroller Software Support  -  ROUSSET  -

+//*----------------------------------------------------------------------------

+//* The software is delivered "AS IS" without warranty or condition of any

+//* kind, either express, implied or statutory. This includes without

+//* limitation any warranty or condition with respect to merchantability or

+//* fitness for any particular purpose, or against the infringements of

+//* intellectual property rights of others.

+//*----------------------------------------------------------------------------

+//* File Name           : Cstartup_SAM7.c

+//* Object              : Low level initializations written in C for IAR

+//*                       tools

+//* 1.0   08/Sep/04 JPP	: Creation

+//* 1.10  10/Sep/04 JPP : Update AT91C_CKGR_PLLCOUNT filed

+//*----------------------------------------------------------------------------

+

+

+// Include the board file description

+#include "Board.h"

+

+//*----------------------------------------------------------------------------

+//* \fn    AT91F_LowLevelInit

+//* \brief This function performs very low level HW initialization

+//*        this function can be use a Stack, depending the compilation

+//*        optimization mode

+//*----------------------------------------------------------------------------

+void AT91F_LowLevelInit( void);

+void AT91F_LowLevelInit( void )

+{

+ AT91PS_PMC     pPMC = AT91C_BASE_PMC;

+

+    //* Set Flash Waite sate

+	//  Single Cycle Access at Up to 30 MHz, or 40

+	//  if MCK = 47923200 I have 50 Cycle for 1 useconde ( flied MC_FMR->FMCN

+	    AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(75 <<16)) | AT91C_MC_FWS_1FWS ;

+

+    //* Watchdog Disable

+        AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

+

+	//* Set MCK at 47 923 200

+    // 1 Enabling the Main Oscillator:

+        // SCK = 1/32768 = 30.51 uSeconde

+    	// Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms

+       pPMC->PMC_MOR = ((( AT91C_CKGR_OSCOUNT & (0x06 <<8)) | AT91C_CKGR_MOSCEN ));

+        // Wait the startup time

+        while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));

+	// 2 Checking the Main Oscillator Frequency (Optional)

+	// 3 Setting PLL and divider:

+		// - div by 5 Fin = 3,6864 =(18,432 / 5)

+		// - Mul 25+1: Fout =	95,8464 =(3,6864 *26)

+		// for 96 MHz the erroe is 0.16%

+		//eld out NOT USED = 0 Fi

+       pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 5) |

+                         (AT91C_CKGR_PLLCOUNT & (28<<8)) |

+                         (AT91C_CKGR_MUL & (25<<16)));

+

+        // Wait the startup time

+        while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));

+	// 4. Selection of Master Clock and Processor Clock

+        // select the PLL clock divided by 2

+       pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 ;

+        while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

+

+        pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;

+        while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

+}

+

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Emac.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Emac.h
new file mode 100644
index 0000000..7551a36
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Emac.h
@@ -0,0 +1,195 @@
+//*----------------------------------------------------------------------------

+//*         ATMEL Microcontroller Software Support  -  ROUSSET  -

+//*----------------------------------------------------------------------------

+//* The software is delivered "AS IS" without warranty or condition of any

+//* kind, either express, implied or statutory. This includes without

+//* limitation any warranty or condition with respect to merchantability or

+//* fitness for any particular purpose, or against the infringements of

+//* intellectual property rights of others.

+//*----------------------------------------------------------------------------

+//* File Name           : Emac.h

+//* Object              : Emac header file

+//* Creation            : Hi   11/18/2002

+//*

+//*----------------------------------------------------------------------------

+#ifndef AT91C_EMAC_H

+#define AT91C_EMAC_H

+

+

+//* Allows to display all IP header in the main.c

+//* If not defined, only ICMP packets are displayed

+#define AT91C_DISPLAY_ALL_IPHEADER		0

+

+#define NB_RX_BUFFERS			25			//* Number of receive buffers

+#define ETH_RX_BUFFER_SIZE		128         //*

+

+#define NB_TX_BUFFERS			2		//* Number of Transmit buffers

+#define ETH_TX_BUFFER_SIZE		UIP_BUFSIZE       //*

+

+#define AT91C_NO_IPPACKET		0

+#define AT91C_IPPACKET	        1

+

+#define ARP_REQUEST				0x0001

+#define ARP_REPLY				0x0002

+#define PROT_ARP				0x0806

+#define PROT_IP					0x0800

+#define PROT_ICMP				0x01

+#define ICMP_ECHO_REQUEST		0x08

+#define ICMP_ECHO_REPLY			0x00

+

+#define AT91C_EMAC_CLKEN 0x2

+#define SWAP16(x)	(((x & 0xff) << 8) | (x >> 8))

+

+#if 0

+//* Transfer descriptor structure

+typedef struct _AT91S_TdDescriptor {

+	unsigned int addr;

+	unsigned int status;

+}AT91S_TdDescriptor, *AT91PS_TdDescriptor;

+#endif

+

+//* Receive Transfer descriptor structure

+typedef struct  _AT91S_RxTdDescriptor {

+	unsigned int addr;

+	union

+	{

+		unsigned int status;

+		struct {

+			unsigned int Length:11;

+			unsigned int Res0:1;

+			unsigned int Rxbuf_off:2;

+			unsigned int StartOfFrame:1;

+			unsigned int EndOfFrame:1;

+			unsigned int Cfi:1;

+			unsigned int VlanPriority:3;

+			unsigned int PriorityTag:1;

+			unsigned int VlanTag:1;

+			unsigned int TypeID:1;

+			unsigned int Sa4Match:1;

+			unsigned int Sa3Match:1;

+			unsigned int Sa2Match:1;

+			unsigned int Sa1Match:1;

+			unsigned int Res1:1;

+			unsigned int ExternalAdd:1;

+			unsigned int UniCast:1;

+			unsigned int MultiCast:1;

+			unsigned int BroadCast:1;

+		}S_Status;		

+	}U_Status;

+}AT91S_RxTdDescriptor, *AT91PS_RxTdDescriptor;

+

+

+//* Transmit Transfer descriptor structure

+typedef struct _AT91S_TxTdDescriptor {

+	unsigned int addr;

+	union

+	{

+		unsigned int status;

+		struct {

+			unsigned int Length:11;

+			unsigned int Res0:4;

+			unsigned int LastBuff:1;

+			unsigned int NoCrc:1;

+			unsigned int Res1:10;

+			unsigned int BufExhausted:1;

+			unsigned int TransmitUnderrun:1;

+			unsigned int TransmitError:1;

+			unsigned int Wrap:1;

+			unsigned int BuffUsed:1;

+		}S_Status;		

+	}U_Status;

+}AT91S_TxTdDescriptor, *AT91PS_TxTdDescriptor;

+

+#define AT91C_OWNERSHIP_BIT		0x00000001

+

+/* Receive status defintion */

+#define AT91C_BROADCAST_ADDR	((unsigned int) (1 << 31))	//* Broadcat address detected

+#define AT91C_MULTICAST_HASH 	((unsigned int) (1 << 30))	//* MultiCast hash match

+#define AT91C_UNICAST_HASH 	    ((unsigned int) (1 << 29))	//* UniCast hash match

+#define AT91C_EXTERNAL_ADDR	    ((unsigned int) (1 << 28))	//* External Address match

+#define AT91C_SA1_ADDR	    	((unsigned int) (1 << 26))	//* Specific address 1 match

+#define AT91C_SA2_ADDR	    	((unsigned int) (1 << 25))	//* Specific address 2 match

+#define AT91C_SA3_ADDR	    	((unsigned int) (1 << 24))	//* Specific address 3 match

+#define AT91C_SA4_ADDR	    	((unsigned int) (1 << 23))	//* Specific address 4 match

+#define AT91C_TYPE_ID	    	((unsigned int) (1 << 22))	//* Type ID match

+#define AT91C_VLAN_TAG	    	((unsigned int) (1 << 21))	//* VLAN tag detected

+#define AT91C_PRIORITY_TAG    	((unsigned int) (1 << 20))	//* PRIORITY tag detected

+#define AT91C_VLAN_PRIORITY    	((unsigned int) (7 << 17))  //* PRIORITY Mask

+#define AT91C_CFI_IND        	((unsigned int) (1 << 16))  //* CFI indicator

+#define AT91C_EOF           	((unsigned int) (1 << 15))  //* EOF

+#define AT91C_SOF           	((unsigned int) (1 << 14))  //* SOF

+#define AT91C_RBF_OFFSET     	((unsigned int) (3 << 12))  //* Receive Buffer Offset Mask

+#define AT91C_LENGTH_FRAME     	((unsigned int) 0x07FF)     //* Length of frame

+

+/* Transmit Status definition */

+#define AT91C_TRANSMIT_OK		((unsigned int) (1 << 31))	//*

+#define AT91C_TRANSMIT_WRAP		((unsigned int) (1 << 30))	//* Wrap bit: mark the last descriptor

+#define AT91C_TRANSMIT_ERR		((unsigned int) (1 << 29))	//* RLE:transmit error

+#define AT91C_TRANSMIT_UND		((unsigned int) (1 << 28))	//* Transmit Underrun

+#define AT91C_BUF_EX     		((unsigned int) (1 << 27))	//* Buffers exhausted in mid frame

+#define AT91C_TRANSMIT_NO_CRC	((unsigned int) (1 << 16))	//* No CRC will be appended to the current frame

+#define AT91C_LAST_BUFFER    	((unsigned int) (1 << 15))	//*

+

+#define ARP_ETHER	 		1		/* Ethernet  hardware address	*/

+#define ARPOP_REQUEST    	1		/* Request  to resolve  address	*/

+#define ARPOP_REPLY	    	2		/* Response to previous request	*/

+#define RARPOP_REQUEST   	3		/* Request  to resolve  address	*/

+#define RARPOP_REPLY	    4		/* Response to previous request */

+

+

+typedef struct _AT91S_EthHdr

+{

+	unsigned char		et_dest[6];	/* Destination node		*/

+	unsigned char		et_src[6];	/* Source node			*/

+	unsigned short		et_protlen;	/* Protocol or length		*/

+} AT91S_EthHdr, *AT91PS_EthHdr;

+

+typedef struct _AT91S_ArpHdr

+{

+	unsigned short		ar_hrd;		/* Format of hardware address	*/

+	unsigned short		ar_pro;		/* Format of protocol address	*/

+	unsigned char		ar_hln;		/* Length of hardware address	*/

+	unsigned char		ar_pln;		/* Length of protocol address	*/

+	unsigned short		ar_op;		/* Operation			*/

+	unsigned char		ar_sha[6];	/* Sender hardware address	*/

+	unsigned char		ar_spa[4];	/* Sender protocol address	*/

+	unsigned char		ar_tha[6];	/* Target hardware address	*/

+	unsigned char		ar_tpa[4];	/* Target protocol address	*/

+} AT91S_ArpHdr, *AT91PS_ArpHdr;

+

+//* IP Header structure

+typedef struct _AT91S_IPheader {

+	unsigned char	ip_hl_v;	/* header length and version	*/

+	unsigned char	ip_tos;		/* type of service		*/

+	unsigned short	ip_len;		/* total length			*/

+	unsigned short	ip_id;		/* identification		*/

+	unsigned short	ip_off;		/* fragment offset field	*/

+	unsigned char	ip_ttl;		/* time to live			*/

+	unsigned char	ip_p;		/* protocol			*/

+	unsigned short	ip_sum;		/* checksum			*/

+	unsigned char	ip_src[4];	/* Source IP address		*/

+	unsigned char	ip_dst[4];	/* Destination IP address	*/

+	unsigned short	udp_src;	/* UDP source port		*/

+	unsigned short	udp_dst;	/* UDP destination port		*/

+	unsigned short	udp_len;	/* Length of UDP packet		*/

+	unsigned short	udp_xsum;	/* Checksum			*/

+} AT91S_IPheader, *AT91PS_IPheader;

+

+//* ICMP echo header structure

+typedef struct _AT91S_IcmpEchoHdr {

+    unsigned char   type;       /* type of message */

+    unsigned char   code;       /* type subcode */

+    unsigned short  cksum;      /* ones complement cksum of struct */

+    unsigned short  id;         /* identifier */

+    unsigned short  seq;        /* sequence number */

+}AT91S_IcmpEchoHdr, *AT91PS_IcmpEchoHdr;

+

+

+typedef struct _AT91S_EthPack

+{

+	AT91S_EthHdr	EthHdr;

+	AT91S_ArpHdr	ArpHdr;

+} AT91S_EthPack, *AT91PS_EthPack;

+

+

+#endif //* AT91C_EMAC_H

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/mii.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/mii.h
new file mode 100644
index 0000000..29b2f53
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/mii.h
@@ -0,0 +1,105 @@
+/* Generic MII registers. */

+

+#define MII_BMCR            0x00        /* Basic mode control register */

+#define MII_BMSR            0x01        /* Basic mode status register  */

+#define MII_PHYSID1         0x02        /* PHYS ID 1                   */

+#define MII_PHYSID2         0x03        /* PHYS ID 2                   */

+#define MII_ADVERTISE       0x04        /* Advertisement control reg   */

+#define MII_LPA             0x05        /* Link partner ability reg    */

+#define MII_EXPANSION       0x06        /* Expansion register          */

+#define MII_DCOUNTER        0x12        /* Disconnect counter          */

+#define MII_FCSCOUNTER      0x13        /* False carrier counter       */

+#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */

+#define MII_RERRCOUNTER     0x15        /* Receive error counter       */

+#define MII_SREVISION       0x16        /* Silicon revision            */

+#define MII_RESV1           0x17        /* Reserved...                 */

+#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */

+#define MII_PHYADDR         0x19        /* PHY address                 */

+#define MII_RESV2           0x1a        /* Reserved...                 */

+#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */

+#define MII_NCONFIG         0x1c        /* Network interface config    */

+

+/* Basic mode control register. */

+#define BMCR_RESV               0x007f  /* Unused...                   */

+#define BMCR_CTST               0x0080  /* Collision test              */

+#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */

+#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */

+#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */

+#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */

+#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */

+#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */

+#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */

+#define BMCR_RESET              0x8000  /* Reset the DP83840           */

+

+/* Basic mode status register. */

+#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */

+#define BMSR_JCD                0x0002  /* Jabber detected             */

+#define BMSR_LSTATUS            0x0004  /* Link status                 */

+#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */

+#define BMSR_RFAULT             0x0010  /* Remote fault detected       */

+#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */

+#define BMSR_RESV               0x07c0  /* Unused...                   */

+#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */

+#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */

+#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */

+#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */

+#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */

+

+/* Advertisement control register. */

+#define ADVERTISE_SLCT          0x001f  /* Selector bits               */

+#define ADVERTISE_CSMA          0x0001  /* Only selector supported     */

+#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_100BASE4      0x0200  /* Try for 100mbps 4k packets  */

+#define ADVERTISE_RESV          0x1c00  /* Unused...                   */

+#define ADVERTISE_RFAULT        0x2000  /* Say we can detect faults    */

+#define ADVERTISE_LPACK         0x4000  /* Ack link partners response  */

+#define ADVERTISE_NPAGE         0x8000  /* Next page bit               */

+

+#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \

+			ADVERTISE_CSMA)

+#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \

+                       ADVERTISE_100HALF | ADVERTISE_100FULL)

+

+/* Link partner ability register. */

+#define LPA_SLCT                0x001f  /* Same as advertise selector  */

+#define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */

+#define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */

+#define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */

+#define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */

+#define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */

+#define LPA_RESV                0x1c00  /* Unused...                   */

+#define LPA_RFAULT              0x2000  /* Link partner faulted        */

+#define LPA_LPACK               0x4000  /* Link partner acked us       */

+#define LPA_NPAGE               0x8000  /* Next page bit               */

+

+#define LPA_DUPLEX		(LPA_10FULL | LPA_100FULL)

+#define LPA_100			(LPA_100FULL | LPA_100HALF | LPA_100BASE4)

+

+/* Expansion register for auto-negotiation. */

+#define EXPANSION_NWAY          0x0001  /* Can do N-way auto-nego      */

+#define EXPANSION_LCWP          0x0002  /* Got new RX page code word   */

+#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */

+#define EXPANSION_NPCAPABLE     0x0008  /* Link partner supports npage */

+#define EXPANSION_MFAULTS       0x0010  /* Multiple faults detected    */

+#define EXPANSION_RESV          0xffe0  /* Unused...                   */

+

+/* N-way test register. */

+#define NWAYTEST_RESV1          0x00ff  /* Unused...                   */

+#define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */

+#define NWAYTEST_RESV2          0xfe00  /* Unused...                   */

+

+#define SPEED_10				10

+#define SPEED_100				100

+

+/* Duplex, half or full. */

+#define DUPLEX_HALF				0x00

+#define DUPLEX_FULL				0x01

+

+/* PHY ID */

+#define MII_DM9161_ID     0x0181b8a0

+#define MII_AM79C875_ID   0x00225540	/* 0x00225541 */

+

+#define AT91C_PHY_ADDR	31

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.c
new file mode 100644
index 0000000..fc503d0
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.c
@@ -0,0 +1,1181 @@
+/*

+    FreeRTOS V7.1.0 - 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.

+*/

+

+/*

+	Sample interrupt driven mouse device driver.  This is a minimal implementation 

+	for demonstration only.  Although functional, it may not be a fully and 

+	compliant implementation.  The small joystick on the SAM7X EK can be used to

+	move the mouse cursor, pressing the joystick transmits mouse clicks.  Note

+	that it might be necessary to run the demo stand along (without the 

+	debugger) in order for the USB device to be recognised by the host computer.

+

+	The interrupt handler itself is contained within USB_ISR.c.

+	

+	See the FreeRTOS.org online documentation for more information.

+*/

+

+/* Standard includes. */

+#include <string.h>

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "queue.h"

+

+/* Demo application includes. */

+#include "USBSample.h"

+

+/* Joystick inputs used to move the 'mouse' cursor. */

+#define usbSW1 	( 1 << 21 )	/* PA21 */

+#define usbSW2 	( 1 << 22 )	/* PA22 */

+#define usbSW3 	( 1 << 23 )	/* PA23 */

+#define usbSW4 	( 1 << 24 )	/* PA24 */

+#define usbSW_CLICK	( 1 << 25 ) /* PA25 */

+

+/* Descriptor type definitions. */

+#define usbDESCRIPTOR_TYPE_DEVICE			( 0x01 )

+#define usbDESCRIPTOR_TYPE_CONFIGURATION	( 0x02 )

+#define usbDESCRIPTOR_TYPE_STRING			( 0x03 )

+

+/* USB request type definitions. */

+#define usbGET_REPORT_REQUEST				( 0x01 )

+#define usbGET_IDLE_REQUEST					( 0x02 )

+#define usbGET_PROTOCOL_REQUEST				( 0x03 )

+#define usbSET_REPORT_REQUEST				( 0x09 )

+#define usbSET_IDLE_REQUEST					( 0x0A )

+#define usbSET_PROTOCOL_REQUEST				( 0x0B )

+#define usbGET_CONFIGURATION_REQUEST		( 0x08 )

+#define usbGET_STATUS_REQUEST				( 0x00 )

+#define usbCLEAR_FEATURE_REQUEST			( 0x01 )

+#define usbSET_FEATURE_REQUEST				( 0x03 )

+#define usbSET_ADDRESS_REQUEST				( 0x05 )

+#define usbGET_DESCRIPTOR_REQUEST			( 0x06 )

+#define usbSET_CONFIGURATION_REQUEST		( 0x09 )

+#define usbGET_INTERFACE_REQUEST			( 0x0A )

+#define usbSET_INTERFACE_REQUEST			( 0x0B )

+

+

+/* Misc USB definitions. */

+#define usbDEVICE_CLASS_VENDOR_SPECIFIC		( 0xFF )

+#define usbBUS_POWERED						( 0x80 )

+#define usbHID_REPORT_DESCRIPTOR			( 0x22 )

+#define AT91C_UDP_TRANSCEIVER_ENABLE			( *( ( unsigned long * ) 0xfffb0074 ) )

+

+/* Index to the various string. */

+#define usbLANGUAGE_STRING					( 0 )

+#define usbMANUFACTURER_STRING				( 1 )

+#define usbPRODUCT_STRING					( 2 )

+#define usbCONFIGURATION_STRING				( 3 )

+#define usbINTERFACE_STRING					( 4 )

+

+/* Data indexes for reading the request from the xISRStatus.ucFifoData[]

+into xUSB_REQUEST.  The data order is designed for speed - so looks a 

+little odd. */

+#define usbREQUEST_TYPE_INDEX				( 7 )

+#define usbREQUEST_INDEX					( 6 )

+#define usbVALUE_HIGH_BYTE					( 4 )

+#define usbVALUE_LOW_BYTE					( 5 )

+#define usbINDEX_HIGH_BYTE					( 2 )

+#define usbINDEX_LOW_BYTE					( 3 )

+#define usbLENGTH_HIGH_BYTE					( 0 )

+#define usbLENGTH_LOW_BYTE					( 1 )

+

+/* Misc application definitions. */

+#define usbINTERRUPT_PRIORITY				( 3 )

+#define usbFIFO_LENGTH						( ( unsigned long ) 8 )

+#define usbXUP								( 1 )

+#define usbXDOWN							( 2 )

+#define usbYUP								( 3 )

+#define usbYDOWN							( 4 )

+#define usbMAX_COORD						( 120 )

+#define usbMAX_TX_MESSAGE_SIZE				( 128 )

+#define usbSHORTEST_DELAY					( ( portTickType ) 1 )

+#define usbINIT_DELAY						( ( portTickType ) 1000 / portTICK_RATE_MS )

+#define usbSHORT_DELAY						( ( portTickType ) 50 / portTICK_RATE_MS )

+#define usbEND_POINT_RESET_MASK				( ( unsigned long ) 0x0f )

+#define usbDATA_INC							( ( char ) 5 )

+#define usbEXPECTED_NUMBER_OF_BYTES			( ( unsigned long ) 8 )

+

+/* Control request types. */

+#define usbSTANDARD_DEVICE_REQUEST			( 0 )

+#define usbSTANDARD_INTERFACE_REQUEST		( 1 )

+#define usbSTANDARD_END_POINT_REQUEST		( 2 )

+#define usbCLASS_INTERFACE_REQUEST			( 5 )

+

+/* Structure used to hold the received requests. */

+typedef struct 

+{

+	unsigned char ucReqType;

+	unsigned char ucRequest;

+	unsigned short usValue;

+	unsigned short usIndex;

+	unsigned short usLength;

+} xUSB_REQUEST;

+

+typedef enum

+{

+	eNOTHING,

+	eJUST_RESET,

+	eJUST_GOT_CONFIG,

+	eJUST_GOT_ADDRESS,

+	eSENDING_EVEN_DESCRIPTOR,

+	eREADY_TO_SEND

+} eDRIVER_STATE;

+

+/* Structure used to control the data being sent to the host. */

+typedef struct

+{

+	unsigned char ucTxBuffer[ usbMAX_TX_MESSAGE_SIZE ];

+	unsigned long ulNextCharIndex;

+	unsigned long ulTotalDataLength;

+} xTX_MESSAGE;

+

+/*-----------------------------------------------------------*/

+

+/* 

+ * The USB interrupt service routine.  This takes a snapshot of the USB

+ * device at the time of the interrupt, clears the interrupts, and posts

+ * the data to the USB processing task.  This is implemented in USB_ISR.c.

+ */

+extern void vUSB_ISR_Wrapper( void );

+

+/*

+ * Called after the bus reset interrupt - this function readies all the

+ * end points for communication.

+ */

+static void prvResetEndPoints( void );

+

+/*

+ * Setup the USB hardware, install the interrupt service routine and 

+ * initialise all the state variables.

+ */

+static void vInitUSBInterface( void );

+

+/*

+ * Decode and act upon an interrupt generated by the control end point.

+ */

+static void prvProcessEndPoint0Interrupt( xISRStatus *pxMessage );

+

+/* 

+ * For simplicity requests are separated into device, interface, class 

+ * interface and end point requests.

+ *

+ * Decode and handle standard device requests originating on the control

+ * end point. 

+ */

+static void prvHandleStandardDeviceRequest( xUSB_REQUEST *pxRequest );

+

+/*

+ * For simplicity requests are separated into device, interface, class 

+ * interface and end point requests.

+ *

+ * Decode and handle standard interface requests originating on the control

+ * end point.

+ */

+static void prvHandleStandardInterfaceRequest( xUSB_REQUEST *pxRequest );

+

+/*

+ * For simplicity requests are separated into device, interface, class 

+ * interface and end point requests.

+ *

+ * Decode and handle standard end point requests originating on the control

+ * end point.

+ */

+static void prvHandleStandardEndPointRequest( xUSB_REQUEST *pxRequest );

+

+/*

+ * For simplicity requests are separated into device, interface, class 

+ * interface and end point requests.

+ *

+ * Decode and handle the class interface requests.

+ */

+static void prvHandleClassInterfaceRequest( xUSB_REQUEST *pxRequest );

+

+/*

+ * Setup the Tx buffer to send data in response to a control request.

+ *

+ * The data to be transmitted is buffered, the state variables are updated,

+ * then prvSendNextSegment() is called to start the transmission off.  Once

+ * the first segment has been sent the remaining segments are transmitted

+ * in response to TXCOMP interrupts until the entire buffer has been

+ * sent.

+ */

+static void prvSendControlData( unsigned char *pucData, unsigned short usRequestedLength, unsigned long ulLengthLeftToSend, long lSendingDescriptor );

+

+/*

+ * Examine the Tx buffer to see if there is any more data to be transmitted.

+ * 

+ * If there is data to be transmitted then send the next segment.  A segment

+ * can have a maximum of 8 bytes (this is defined as the maximum for the end

+ * point by the descriptor).  The final segment may be less than 8 bytes if

+ * the total data length was not an exact multiple of 8.

+ */

+static void prvSendNextSegment( void );

+

+/*

+ * A stall condition is forced each time the host makes a request that is not

+ * supported by this minimal implementation.

+ * 

+ * A stall is forced by setting the appropriate bit in the end points control

+ * and status register. 

+ */

+static void prvSendStall( void );

+

+/*

+ * A NULL (or zero length packet) is transmitted in acknowledge the reception 

+ * of certain events from the host.

+ */

+static void prvUSBTransmitNull( void );

+

+/* 

+ * When the host requests a descriptor this function is called to determine 

+ * which descriptor is being requested and start its transmission.

+ */

+static void prvGetStandardInterfaceDescriptor( xUSB_REQUEST *pxRequest );

+

+/*

+ * Transmit movement and clicks on the EK joystick as mouse inputs.

+ */

+static void prvTransmitSampleValues( void );

+

+/*

+ * The created task to handle the USB demo functionality. 

+ */

+static void vUSBDemoTask( void *pvParameters );

+

+/*

+ * Simple algorithm to ramp up the mouse cursor speed to make it easier to

+ * use.

+ */

+static void prvControlCursorSpeed( signed char *cVal, unsigned long ulInput, unsigned long ulSwitch1, unsigned long ulSwitch2 );

+/*-----------------------------------------------------------*/

+

+/*

+	- DESCRIPTOR DEFINITIONS -

+*/

+

+/* String descriptors used during the enumeration process.

+These take the form:

+

+{

+	Length of descriptor,

+	Descriptor type,

+	Data

+}

+*/

+const char pxLanguageStringDescriptor[] =

+{

+	4,

+	usbDESCRIPTOR_TYPE_STRING,

+	0x09, 0x04

+};

+

+const char pxManufacturerStringDescriptor[] = 

+{

+	18,

+	usbDESCRIPTOR_TYPE_STRING,

+

+	'F', 0x00,

+	'r', 0x00,

+	'e', 0x00,

+	'e', 0x00,

+	'R', 0x00,

+	'T', 0x00,

+	'O', 0x00,

+	'S', 0x00	

+};

+

+const char pxProductStringDescriptor[] = 

+{

+	38,

+	usbDESCRIPTOR_TYPE_STRING,

+

+	'F', 0x00,

+	'r', 0x00,

+	'e', 0x00,

+	'e', 0x00,

+	'R', 0x00,

+	'T', 0x00,

+	'O', 0x00,

+	'S', 0x00,

+	'.', 0x00,

+	'o', 0x00,

+	'r', 0x00,

+	'g', 0x00,

+	' ', 0x00,

+	'M', 0x00,

+	'o', 0x00,

+	'u', 0x00,

+	's', 0x00,

+	'e', 0x00

+};

+

+const char pxConfigurationStringDescriptor[] = 

+{

+	38,

+	usbDESCRIPTOR_TYPE_STRING,

+

+	'C', 0x00,

+	'o', 0x00,

+	'n', 0x00,

+	'f', 0x00,

+	'i', 0x00,

+	'g', 0x00,

+	'u', 0x00,

+	'r', 0x00,

+	'a', 0x00,

+	't', 0x00,

+	'i', 0x00,

+	'o', 0x00,

+	'n', 0x00,

+	' ', 0x00,

+	'N', 0x00,

+	'a', 0x00,

+	'm', 0x00,

+	'e', 0x00

+};

+

+const char pxInterfaceStringDescriptor[] = 

+{

+	30,

+	usbDESCRIPTOR_TYPE_STRING,

+

+	'I', 0x00,

+	'n', 0x00,

+	't', 0x00,

+	'e', 0x00,

+	'r', 0x00,

+	'f', 0x00,

+	'a', 0x00,

+	'c', 0x00,

+	'e', 0x00,

+	' ', 0x00,

+	'N', 0x00,

+	'a', 0x00,

+	'm', 0x00,

+	'e', 0x00

+};

+

+/* Enumeration descriptors. */

+const char pxReportDescriptor[] =

+{

+	0x05, 0x01,						/* USAGE_PAGE (Generic Desktop)			*/

+	0x09, 0x02,						/* USAGE (Mouse)						*/

+	0xa1, 0x01,						/* COLLECTION (Application)				*/

+	0x09, 0x01,						/*   USAGE (Pointer)					*/

+	0xa1, 0x00,						/*   COLLECTION (Physical)				*/

+	0x95, 0x03,						/*     REPORT_COUNT (3)					*/

+	0x75, 0x01,						/*     REPORT_SIZE (1)					*/

+	0x05, 0x09,						/*     USAGE_PAGE (Button)				*/

+	0x19, 0x01,						/*     USAGE_MINIMUM (Button 1)			*/

+	0x29, 0x03,						/*     USAGE_MAXIMUM (Button 3)			*/

+	0x15, 0x00,						/*     LOGICAL_MINIMUM (0)				*/

+	0x25, 0x01,						/*     LOGICAL_MAXIMUM (1)				*/

+	0x81, 0x02,						/*     INPUT (Data,Var,Abs)				*/

+	0x95, 0x01,						/*     REPORT_COUNT (1)					*/

+	0x75, 0x05,						/*     REPORT_SIZE (5)					*/

+	0x81, 0x01,						/*     INPUT (Cnst,Ary,Abs)				*/

+	0x75, 0x08,						/*     REPORT_SIZE (8)					*/

+	0x95, 0x02,						/*     REPORT_COUNT (2)					*/

+	0x05, 0x01,						/*     USAGE_PAGE (Generic Desktop)		*/

+	0x09, 0x30,						/*     USAGE (X)						*/

+	0x09, 0x31,						/*     USAGE (Y)						*/

+	0x15, 0x81,						/*     LOGICAL_MINIMUM (-127)			*/

+	0x25, 0x7f,						/*     LOGICAL_MAXIMUM (127)			*/

+	0x81, 0x06,						/*     INPUT (Data,Var,Rel)				*/

+	0xc0,							/*   END_COLLECTION						*/

+	0xc0							/* END_COLLECTION						*/

+};

+

+

+

+const char pxDeviceDescriptor[] = 

+{

+	/* Device descriptor */

+	0x12,								/* bLength				*/

+	0x01,								/* bDescriptorType		*/

+	0x10, 0x01,							/* bcdUSBL				*/

+	usbDEVICE_CLASS_VENDOR_SPECIFIC,	/* bDeviceClass:		*/

+	0x00,								/* bDeviceSubclass:		*/

+	0x00,								/* bDeviceProtocol:		*/

+	0x08,								/* bMaxPacketSize0		*/

+	0xFF, 0xFF,							/* idVendorL			*/

+	0x02, 0x00,							/* idProductL			*/

+	0x00, 0x01,							/* bcdDeviceL			*/

+	usbMANUFACTURER_STRING,				/* iManufacturer		*/

+	usbPRODUCT_STRING,					/* iProduct				*/

+	0x00,								/* SerialNumber			*/

+	0x01								/* bNumConfigs			*/

+};

+

+

+const char pxConfigDescriptor[] = {

+	/* Configuration 1 descriptor */

+	0x09,			/* CbLength									*/

+	0x02,			/* CbDescriptorType							*/

+	0x22, 0x00,		/* CwTotalLength 2 EP + Control				*/

+	0x01,			/* CbNumInterfaces							*/

+	0x01,			/* CbConfigurationValue						*/

+	usbCONFIGURATION_STRING,/* CiConfiguration					*/

+	usbBUS_POWERED,	/* CbmAttributes Bus powered + Remote Wakeup*/

+	0x32,			/* CMaxPower: 100mA							*/

+

+	/* Mouse Interface Descriptor Requirement */

+	0x09,			/* bLength									*/

+	0x04,			/* bDescriptorType							*/

+	0x00,			/* bInterfaceNumber							*/

+	0x00,			/* bAlternateSetting						*/

+	0x01,			/* bNumEndpoints							*/

+	0x03,			/* bInterfaceClass: HID code				*/

+	0x01,			/* bInterfaceSubclass boot					*/

+	0x02,			/* bInterfaceProtocol mouse boot			*/

+	usbINTERFACE_STRING,/* iInterface							*/

+

+	/* HID Descriptor */

+	0x09,			/* bLength									*/

+	0x21,			/* bDescriptor type: HID Descriptor Type	*/

+	0x00, 0x01,		/* bcdHID									*/

+	0x00,			/* bCountryCode								*/

+	0x01,			/* bNumDescriptors							*/

+	usbHID_REPORT_DESCRIPTOR,	  /* bDescriptorType			*/

+	sizeof( pxReportDescriptor ), 0x00, /* wItemLength			*/

+

+	/* Endpoint 1 descriptor */

+	0x07,			/* bLength									*/

+	0x05,			/* bDescriptorType							*/

+	0x81,			/* bEndpointAddress, Endpoint 01 - IN		*/

+	0x03,			/* bmAttributes      INT					*/

+	0x08, 0x00,		/* wMaxPacketSize: 8?						*/

+	0x0A			/* bInterval								*/

+};

+

+/*-----------------------------------------------------------*/

+

+/* File scope state variables. */

+static unsigned char ucUSBConfig = ( unsigned char ) 0;

+static unsigned long ulReceivedAddress = ( unsigned long ) 0;

+static eDRIVER_STATE eDriverState = eNOTHING;

+

+/* Structure used to control the characters being sent to the host. */

+static xTX_MESSAGE pxCharsForTx;

+

+/* Queue used to pass messages between the ISR and the task. */

+xQueueHandle xUSBInterruptQueue; 

+

+/*-----------------------------------------------------------*/

+

+void vStartUSBTask( unsigned portBASE_TYPE uxPriority )

+{

+	/* Create the queue used to communicate between the USB ISR and task. */

+	xUSBInterruptQueue = xQueueCreate( usbQUEUE_LENGTH + 1, sizeof( xISRStatus * ) );

+

+	/* Create the task itself. */

+	xTaskCreate( vUSBDemoTask, "USB", configMINIMAL_STACK_SIZE, NULL, uxPriority, NULL );

+}

+/*-----------------------------------------------------------*/

+

+static void vUSBDemoTask( void *pvParameters )

+{

+xISRStatus *pxMessage;

+

+	/* The parameters are not used in this task. */

+	( void ) pvParameters;

+

+    /* Init USB device */

+    portENTER_CRITICAL();

+	    vInitUSBInterface();

+    portEXIT_CRITICAL();

+

+	/* Process interrupts as they arrive.   The ISR takes a snapshot of the 

+	interrupt status then posts the information on this queue for processing

+	at the task level.  This simple demo implementation only processes

+	a few interrupt sources. */

+	for( ;; )

+	{

+		if( xQueueReceive( xUSBInterruptQueue, &pxMessage, usbSHORT_DELAY ) )

+		{

+			if( pxMessage->ulISR & AT91C_UDP_EPINT0 )

+			{

+				/* Process end point 0 interrupt. */

+				prvProcessEndPoint0Interrupt( pxMessage );

+			}

+

+			if( pxMessage->ulISR & AT91C_UDP_ENDBUSRES )

+			{

+				/* Process an end of bus reset interrupt. */

+				prvResetEndPoints();		

+			}

+		}

+		else

+		{

+			/* The ISR did not post any data for us to process on the queue, so

+			just generate and send some sample data. */

+			if( eDriverState == eREADY_TO_SEND )

+			{

+				prvTransmitSampleValues();

+			}

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvControlCursorSpeed( signed char *cVal, unsigned long ulInput, unsigned long ulSwitch1, unsigned long ulSwitch2 )

+{

+const char cSpeed = 20;

+

+	if( !( ulInput & ulSwitch1 ) )

+	{

+		/* We are going in the decreasing y direction. */

+		if( *cVal > 0 )

+		{

+			/* We have changed direction since last time so start from

+			0 again. */

+			*cVal = 0;

+		}

+		

+		if( *cVal > -cSpeed )

+		{

+			/* Ramp y down to the max speed. */

+			(*cVal)--;

+		}

+	}

+	else if( !( ulInput & ulSwitch2 ) )

+	{

+		/* We are going in the increasing y direction. */

+		if( *cVal < 0 )

+		{

+			/* We have changed direction since last time, so start from

+			0 again. */

+			*cVal = 0;

+		}

+		

+		if( *cVal < cSpeed )

+		{

+			/* Ramp y up to the max speed again. */

+			(*cVal)++;

+		}

+	}

+	else

+	{

+		*cVal = 0;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvTransmitSampleValues( void )

+{

+/* Variables to hold dummy x, y and z joystick axis data. */

+static signed char x = 0, y = 0, z = 0;

+unsigned long ulStatus;

+

+	ulStatus = 	AT91C_BASE_PIOA->PIO_PDSR;

+

+	prvControlCursorSpeed( &y, ulStatus, ( unsigned long ) usbSW1, ( unsigned long ) usbSW2 );

+	prvControlCursorSpeed( &x, ulStatus, ( unsigned long ) usbSW3, ( unsigned long ) usbSW4 );

+	

+	/* Just make the z axis go up and down. */

+	z = ( ( ulStatus & usbSW_CLICK ) == 0 );

+

+	/* Can we place data in the fifo? */

+	if( !( AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] & AT91C_UDP_TXPKTRDY ) )

+	{

+		/* Write our sample data to the fifo. */

+		AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = z;

+		AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = x;

+		AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_1 ] = y;

+		

+		/* Send the data. */

+		portENTER_CRITICAL();

+		{

+			ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ];

+			usbCSR_SET_BIT( &ulStatus, ( AT91C_UDP_TXPKTRDY ) );

+			AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] = ulStatus;

+		}

+		portEXIT_CRITICAL();

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvUSBTransmitNull( void )

+{

+unsigned long ulStatus;

+

+	/* Wait until the FIFO is free - even though we are not going to use it.

+	THERE IS NO TIMEOUT HERE! */

+	while( AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] & AT91C_UDP_TXPKTRDY )

+	{

+		vTaskDelay( usbSHORTEST_DELAY );

+	}

+

+	portENTER_CRITICAL();

+	{

+		/* Set the length of data to send to equal the index of the next byte

+		to send.  This will prevent the ACK to this NULL packet causing any

+		further data transmissions. */

+		pxCharsForTx.ulTotalDataLength = pxCharsForTx.ulNextCharIndex;

+

+		/* Set the TXPKTRDY bit to cause a transmission with no data. */

+		ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];

+		usbCSR_SET_BIT( &ulStatus, ( AT91C_UDP_TXPKTRDY ) );

+		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulStatus;

+	}

+	portEXIT_CRITICAL();

+}

+/*-----------------------------------------------------------*/

+

+static void prvSendStall( void )

+{

+unsigned long ulStatus;

+

+	portENTER_CRITICAL();

+	{

+		/* Force a stall by simply setting the FORCESTALL bit in the CSR. */

+		ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];

+		usbCSR_SET_BIT( &ulStatus, AT91C_UDP_FORCESTALL );

+		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulStatus;

+	}

+	portEXIT_CRITICAL();

+}

+/*-----------------------------------------------------------*/

+

+static void prvResetEndPoints( void )

+{

+unsigned long ulTemp;

+

+	eDriverState = eJUST_RESET;

+

+	/* Reset all the end points. */

+	AT91C_BASE_UDP->UDP_RSTEP  = usbEND_POINT_RESET_MASK;

+	AT91C_BASE_UDP->UDP_RSTEP  = ( unsigned long ) 0x00;

+

+	/* Enable data to be sent and received. */

+	AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;

+

+	/* Repair the configuration end point. */

+	portENTER_CRITICAL();

+	{

+		ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];

+		usbCSR_SET_BIT( &ulTemp, ( ( unsigned long ) ( AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL ) ) );

+		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;

+		AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT0;

+	}

+	portEXIT_CRITICAL();

+}

+/*-----------------------------------------------------------*/

+

+static void prvProcessEndPoint0Interrupt( xISRStatus *pxMessage )

+{

+	if( pxMessage->ulCSR0 & AT91C_UDP_RX_DATA_BK0 )

+	{		

+		/* We only expect to receive zero length data here as ACK's. 

+		Set the data pointer to the end of the current Tx packet to

+		ensure we don't send out any more data. */	

+		pxCharsForTx.ulNextCharIndex = pxCharsForTx.ulTotalDataLength;

+	}

+

+	if( pxMessage->ulCSR0 & AT91C_UDP_TXCOMP )

+	{

+		/* We received a TX complete interrupt.  What we do depends on

+		what we sent to get this interrupt. */

+

+		if( eDriverState == eJUST_GOT_CONFIG )

+		{

+			/* We sent an acknowledgement of a SET_CONFIG request.  We

+			are now at the end of the enumeration. */

+			AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_CONFG;

+

+			/* Read the end point for data transfer. */

+			portENTER_CRITICAL();

+			{

+				unsigned long ulTemp;

+

+				ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ];					

+				usbCSR_SET_BIT( &ulTemp, AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN );

+				AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] = ulTemp;		

+				AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT1;

+			}

+			portEXIT_CRITICAL();

+

+			eDriverState = eREADY_TO_SEND;

+		}		

+		else if( eDriverState == eJUST_GOT_ADDRESS )

+		{

+			/* We sent an acknowledgement of a SET_ADDRESS request.  Move

+			to the addressed state. */

+			if( ulReceivedAddress != ( unsigned long ) 0 )

+			{			

+				AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN;

+			}

+			else

+			{

+				AT91C_BASE_UDP->UDP_GLBSTATE = 0;

+			}			

+

+			AT91C_BASE_UDP->UDP_FADDR = ( AT91C_UDP_FEN | ulReceivedAddress );		

+			eDriverState = eNOTHING;

+		}

+		else

+		{		

+			/* The TXCOMP was not for any special type of transmission.  See

+			if there is any more data to send. */

+			prvSendNextSegment();

+		}

+	}

+

+	if( pxMessage->ulCSR0 & AT91C_UDP_RXSETUP )

+	{

+		xUSB_REQUEST xRequest;

+		unsigned char ucRequest;

+		unsigned long ulRxBytes;

+

+		/* A data packet is available. */	

+		ulRxBytes = pxMessage->ulCSR0 >> 16;

+		ulRxBytes &= usbRX_COUNT_MASK;

+

+		if( ulRxBytes >= usbEXPECTED_NUMBER_OF_BYTES )

+		{

+			/* Create an xUSB_REQUEST variable from the raw bytes array. */

+

+			xRequest.ucReqType = pxMessage->ucFifoData[ usbREQUEST_TYPE_INDEX ];

+			xRequest.ucRequest = pxMessage->ucFifoData[ usbREQUEST_INDEX ];

+

+			/* NOT PORTABLE CODE! */

+			xRequest.usValue = pxMessage->ucFifoData[ usbVALUE_HIGH_BYTE ];

+			xRequest.usValue <<= 8;

+			xRequest.usValue |= pxMessage->ucFifoData[ usbVALUE_LOW_BYTE ];

+						

+			xRequest.usIndex = pxMessage->ucFifoData[ usbINDEX_HIGH_BYTE ];

+			xRequest.usIndex <<= 8;

+			xRequest.usIndex |= pxMessage->ucFifoData[ usbINDEX_LOW_BYTE ];

+			

+			xRequest.usLength = pxMessage->ucFifoData[ usbLENGTH_HIGH_BYTE ];

+			xRequest.usLength <<= 8;

+			xRequest.usLength |= pxMessage->ucFifoData[ usbLENGTH_LOW_BYTE ];

+	

+			/* Manipulate the ucRequestType and the ucRequest parameters to 

+			generate a zero based request selection.  This is just done to 

+			break up the requests into subsections for clarity.  The 

+			alternative would be to have more huge switch statement that would

+			be difficult to optimise. */

+			ucRequest = ( ( xRequest.ucReqType & 0x60 ) >> 3 );

+			ucRequest |= ( xRequest.ucReqType & 0x03 );

+

+			switch( ucRequest )

+			{

+				case usbSTANDARD_DEVICE_REQUEST:	

+							/* Standard Device request */

+							prvHandleStandardDeviceRequest( &xRequest );

+							break;

+	

+				case usbSTANDARD_INTERFACE_REQUEST:	

+							/* Standard Interface request */

+							prvHandleStandardInterfaceRequest( &xRequest );

+							break;

+	

+				case usbSTANDARD_END_POINT_REQUEST:	

+							/* Standard Endpoint request */

+							prvHandleStandardEndPointRequest( &xRequest );

+							break;

+	

+				case usbCLASS_INTERFACE_REQUEST:	

+							/* Class Interface request */

+							prvHandleClassInterfaceRequest( &xRequest );

+							break;

+	

+				default:	/* This is not something we want to respond to. */

+							prvSendStall();	

+			}

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvGetStandardDeviceDescriptor( xUSB_REQUEST *pxRequest )

+{

+	/* The type is in the high byte.  Return whatever has been requested. */

+	switch( ( pxRequest->usValue & 0xff00 ) >> 8 )

+	{

+	    case usbDESCRIPTOR_TYPE_DEVICE:

+			prvSendControlData( ( unsigned char * ) &pxDeviceDescriptor, pxRequest->usLength, sizeof( pxDeviceDescriptor ), pdTRUE );

+		    break;

+	

+	    case usbDESCRIPTOR_TYPE_CONFIGURATION:

+			prvSendControlData( ( unsigned char * ) &( pxConfigDescriptor ), pxRequest->usLength, sizeof( pxConfigDescriptor ), pdTRUE );

+		    break;

+

+	    case usbDESCRIPTOR_TYPE_STRING:

+

+			/* The index to the string descriptor is the lower byte. */

+		    switch( pxRequest->usValue & 0xff )

+			{			

+		        case usbLANGUAGE_STRING:

+					prvSendControlData( ( unsigned char * ) &pxLanguageStringDescriptor, pxRequest->usLength, sizeof(pxLanguageStringDescriptor), pdTRUE );

+			        break;

+

+		        case usbMANUFACTURER_STRING:

+					prvSendControlData( ( unsigned char * ) &pxManufacturerStringDescriptor, pxRequest->usLength, sizeof( pxManufacturerStringDescriptor ), pdTRUE );

+			        break;

+

+		        case usbPRODUCT_STRING:

+					prvSendControlData( ( unsigned char * ) &pxProductStringDescriptor, pxRequest->usLength, sizeof( pxProductStringDescriptor ), pdTRUE );

+			        break;

+

+		        case usbCONFIGURATION_STRING:

+					prvSendControlData( ( unsigned char * ) &pxConfigurationStringDescriptor, pxRequest->usLength, sizeof( pxConfigurationStringDescriptor ), pdTRUE );

+			        break;

+

+		        case usbINTERFACE_STRING:

+					prvSendControlData( ( unsigned char * ) &pxInterfaceStringDescriptor, pxRequest->usLength, sizeof( pxInterfaceStringDescriptor ), pdTRUE );

+			        break;

+

+		        default:

+			        /* Don't know what this string is. */

+					prvSendStall();

+					break;

+			}

+

+			break;

+

+	    default:

+			/* We are not responding to anything else. */

+			prvSendStall();

+		    break;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvHandleStandardDeviceRequest( xUSB_REQUEST *pxRequest )

+{

+unsigned short usStatus = 0;

+

+	switch( pxRequest->ucRequest )

+	{

+	    case usbGET_STATUS_REQUEST:

+			/* Just send two byte dummy status. */

+			prvSendControlData( ( unsigned char * ) &usStatus, sizeof( usStatus ), sizeof( usStatus ), pdFALSE );

+		    break;

+

+	    case usbGET_DESCRIPTOR_REQUEST:

+			/* Send device descriptor */

+		    prvGetStandardDeviceDescriptor( pxRequest );

+		    break;

+

+	    case usbGET_CONFIGURATION_REQUEST:

+			/* Send selected device configuration */

+			prvSendControlData( ( unsigned char * ) &ucUSBConfig, sizeof( ucUSBConfig ), sizeof( ucUSBConfig ), pdFALSE );

+		    break;

+

+		case usbSET_FEATURE_REQUEST:

+		    prvUSBTransmitNull();

+		    break;

+

+	    case usbSET_ADDRESS_REQUEST:

+	    	

+			/* Acknowledge the SET_ADDRESS, but (according to the manual) we

+			cannot actually move to the addressed state until we get a TXCOMP

+			interrupt from this NULL packet.  Therefore we just remember the

+			address and set our state so we know we have received the address. */

+	    	prvUSBTransmitNull();			

+			eDriverState = eJUST_GOT_ADDRESS;	    	

+			ulReceivedAddress = ( unsigned long ) pxRequest->usValue;

+		    break;

+

+	    case usbSET_CONFIGURATION_REQUEST:

+

+			/* Acknowledge the SET_CONFIGURATION, but (according to the manual) 

+			we cannot actually move to the configured state until we get a 

+			TXCOMP interrupt from this NULL packet.  Therefore we just remember the

+			config and set our state so we know we have received the go ahead. */			

+			ucUSBConfig = ( unsigned char ) ( pxRequest->usValue & 0xff );

+			eDriverState = eJUST_GOT_CONFIG;

+			prvUSBTransmitNull();

+		    break;

+

+	    default:

+

+		    /* We don't answer to anything else. */

+			prvSendStall();

+		    break;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvHandleClassInterfaceRequest( xUSB_REQUEST *pxRequest )

+{

+	switch( pxRequest->ucRequest )

+	{

+	    case usbSET_IDLE_REQUEST:

+	    	prvUSBTransmitNull();

+			break;

+

+		/* This minimal implementation ignores these. */

+	    case usbGET_REPORT_REQUEST:

+	    case usbGET_IDLE_REQUEST:

+	    case usbGET_PROTOCOL_REQUEST:

+	    case usbSET_REPORT_REQUEST:

+	    case usbSET_PROTOCOL_REQUEST:	

+	    default:

+

+			prvSendStall();

+			break;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvGetStandardInterfaceDescriptor( xUSB_REQUEST *pxRequest )

+{

+	switch( ( pxRequest->usValue & ( unsigned short ) 0xff00 ) >> 8 )

+	{

+	    case usbHID_REPORT_DESCRIPTOR:

+			prvSendControlData( ( unsigned char * ) pxReportDescriptor, pxRequest->usLength, sizeof( pxReportDescriptor ), pdTRUE );

+		    break;

+

+	    default:

+

+			/* Don't expect to send any others. */

+			prvSendStall();

+		    break;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvHandleStandardInterfaceRequest( xUSB_REQUEST *pxRequest )

+{

+unsigned short usStatus = 0;

+

+	switch( pxRequest->ucRequest )

+	{

+	    case usbGET_STATUS_REQUEST:

+			/* Send dummy 2 bytes. */

+			prvSendControlData( ( unsigned char * ) &usStatus, sizeof( usStatus ), sizeof( usStatus ), pdFALSE );

+			break;

+

+	    case usbGET_DESCRIPTOR_REQUEST:

+			prvGetStandardInterfaceDescriptor( pxRequest ); 

+			break;

+

+		/* This minimal implementation does not respond to these. */

+	    case usbGET_INTERFACE_REQUEST:

+	    case usbSET_FEATURE_REQUEST:

+	    case usbSET_INTERFACE_REQUEST:	

+

+	    default:

+			prvSendStall();

+			break;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvHandleStandardEndPointRequest( xUSB_REQUEST *pxRequest )

+{

+	switch( pxRequest->ucRequest )

+	{

+		/* This minimal implementation does not expect to respond to these. */

+	    case usbGET_STATUS_REQUEST:

+	    case usbCLEAR_FEATURE_REQUEST: 

+	    case usbSET_FEATURE_REQUEST:

+

+	    default:			

+			prvSendStall();

+			break;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void vInitUSBInterface( void )

+{

+volatile unsigned long ulTemp;

+

+	/* Initialise a few state variables. */

+	pxCharsForTx.ulNextCharIndex = ( unsigned long ) 0;

+	ucUSBConfig = ( unsigned char ) 0;

+	eDriverState = eNOTHING;

+

+	/* HARDWARE SETUP */

+

+    /* Set the PLL USB Divider */

+    AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1;

+

+    /* Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock. */

+    AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;

+    AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);

+

+    /* Setup the PIO for the USB pull up resistor. */

+    AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA16;

+    AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA16;

+    

+

+    /* Start without the pullup - this will get set at the end of this 

+	function. */

+    AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA16;

+

+	/* When using the USB debugger the peripheral registers do not always get

+	set to the correct default values.  To make sure set the relevant registers

+	manually here. */

+	AT91C_BASE_UDP->UDP_IDR = ( unsigned long ) 0xffffffff;

+	AT91C_BASE_UDP->UDP_ICR = ( unsigned long ) 0xffffffff;

+	AT91C_BASE_UDP->UDP_CSR[ 0 ] = ( unsigned long ) 0x00;

+	AT91C_BASE_UDP->UDP_CSR[ 1 ] = ( unsigned long ) 0x00;

+	AT91C_BASE_UDP->UDP_GLBSTATE = 0;

+	AT91C_BASE_UDP->UDP_FADDR = 0;

+

+	/* Enable the transceiver. */

+	AT91C_UDP_TRANSCEIVER_ENABLE = 0;

+

+	/* Enable the USB interrupts - other interrupts get enabled as the 

+	enumeration process progresses. */

+	AT91F_AIC_ConfigureIt( AT91C_ID_UDP, usbINTERRUPT_PRIORITY, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ( void (*)( void ) ) vUSB_ISR_Wrapper );

+	AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_UDP;

+

+	/* Wait a short while before making our presence known. */

+	vTaskDelay( usbINIT_DELAY );

+	AT91C_BASE_PIOA->PIO_CODR = AT91C_PIO_PA16;

+}

+/*-----------------------------------------------------------*/

+

+static void prvSendControlData( unsigned char *pucData, unsigned short usRequestedLength, unsigned long ulLengthToSend, long lSendingDescriptor )

+{

+	if( ( ( unsigned long ) usRequestedLength < ulLengthToSend ) )

+	{

+		/* Cap the data length to that requested. */

+		ulLengthToSend = ( unsigned short ) usRequestedLength;

+	}

+	else if( ( ulLengthToSend < ( unsigned long ) usRequestedLength ) && lSendingDescriptor )

+	{

+		/* We are sending a descriptor.  If the descriptor is an exact 

+		multiple of the FIFO length then it will have to be terminated

+		with a NULL packet.  Set the state to indicate this if

+		necessary. */

+		if( ( ulLengthToSend % usbFIFO_LENGTH ) == 0 )

+		{

+			eDriverState = eSENDING_EVEN_DESCRIPTOR;

+		}

+	}

+

+	/* Here we assume that the previous message has been sent.  THERE IS NO

+	BUFFER OVERFLOW PROTECTION HERE.

+

+	Copy the data to send into the buffer as we cannot send it all at once

+	(if it is greater than 8 bytes in length). */

+	memcpy( pxCharsForTx.ucTxBuffer, pucData, ulLengthToSend );

+

+	/* Reinitialise the buffer index so we start sending from the start of 

+	the data. */

+	pxCharsForTx.ulTotalDataLength = ulLengthToSend;

+	pxCharsForTx.ulNextCharIndex = ( unsigned long ) 0;

+

+	/* Send the first 8 bytes now.  The rest will get sent in response to 

+	TXCOMP interrupts. */

+	prvSendNextSegment();

+}

+/*-----------------------------------------------------------*/

+

+static void prvSendNextSegment( void )

+{

+volatile unsigned long ulNextLength, ulStatus, ulLengthLeftToSend;

+

+	/* Is there any data to send? */

+	if( pxCharsForTx.ulTotalDataLength > pxCharsForTx.ulNextCharIndex )

+	{

+		ulLengthLeftToSend = pxCharsForTx.ulTotalDataLength - pxCharsForTx.ulNextCharIndex;

+	

+		/* We can only send 8 bytes to the fifo at a time. */

+		if( ulLengthLeftToSend > usbFIFO_LENGTH )

+		{

+			ulNextLength = usbFIFO_LENGTH;

+		}

+		else

+		{

+			ulNextLength = ulLengthLeftToSend;

+		}

+

+		/* Wait until we can place data in the fifo.  THERE IS NO TIMEOUT

+		HERE! */

+		while( AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] & AT91C_UDP_TXPKTRDY )

+		{

+			vTaskDelay( usbSHORTEST_DELAY );

+		}

+

+		/* Write the data to the FIFO. */

+		while( ulNextLength > ( unsigned long ) 0 )

+		{

+			AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_0 ] = pxCharsForTx.ucTxBuffer[ pxCharsForTx.ulNextCharIndex ];

+	

+			ulNextLength--;

+			pxCharsForTx.ulNextCharIndex++;

+		}

+	

+		/* Start the transmission. */

+		portENTER_CRITICAL();

+		{

+			ulStatus = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];

+			usbCSR_SET_BIT( &ulStatus, ( ( unsigned long ) 0x10 ) );

+			AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulStatus;

+		}

+		portEXIT_CRITICAL();

+	}

+	else

+	{

+		/* There is no data to send.  If we were sending a descriptor and the 

+		descriptor was an exact multiple of the max packet size then we need

+		to send a null to terminate the transmission. */

+		if( eDriverState == eSENDING_EVEN_DESCRIPTOR )

+		{

+			prvUSBTransmitNull();

+			eDriverState = eNOTHING;

+		}

+	}

+}

+

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.h
new file mode 100644
index 0000000..c001ae7
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.h
@@ -0,0 +1,101 @@
+/*

+    FreeRTOS V7.1.0 - 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 USB_DEMO_H

+#define USB_DEMO_H

+

+

+/*-----------------------------------------------------------*/

+

+#define usbQUEUE_LENGTH						( 0x3 )	/* Must have all bits set! */

+#define usbEND_POINT_0						( 0 )

+#define usbEND_POINT_1						( 1 )

+#define usbRX_COUNT_MASK					( ( unsigned long ) 0x7ff )

+#define AT91C_UDP_STALLSENT					AT91C_UDP_ISOERROR

+

+/* Structure used to take a snapshot of the USB status from within the ISR. */

+typedef struct X_ISR_STATUS

+{

+	unsigned long ulISR;

+	unsigned long ulCSR0;

+	unsigned char ucFifoData[ 8 ];

+} xISRStatus;

+

+/* Macros to manipulate the control and status registers.  These registers 

+cannot be accessed using a direct read modify write operation outside of the 

+ISR as some bits are left unchanged by writing with a 0, and some are left 

+unchanged by writing with a 1. */

+

+#define usbCSR_SET_BIT( pulValueNow, ulBit )											\

+{																						\

+	/* Set TXCOMP, RX_DATA_BK0, RXSETUP, */												\

+	/* STALLSENT and RX_DATA_BK1 to 1 so the */											\

+	/* write has no effect. */															\

+	( * ( ( unsigned long * ) pulValueNow ) ) |= ( unsigned long ) 0x4f;		\

+																						\

+	/* Clear the FORCE_STALL and TXPKTRDY bits */										\

+	/* so the write has no effect. */													\

+	( * ( ( unsigned long * ) pulValueNow ) ) &= ( unsigned long ) 0xffffffcf;	\

+																						\

+	/* Set whichever bit we want set. */												\

+	( * ( ( unsigned long * ) pulValueNow ) ) |= ( ulBit );							\

+}

+

+/*

+ * Creates the queue used to communicate between the USB task and the USB ISR, then

+ * createst the task that manages the USB peripheral.

+ */

+void vStartUSBTask( unsigned portBASE_TYPE uxPriority );

+

+#endif

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c
new file mode 100644
index 0000000..df3ee3a
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c
@@ -0,0 +1,197 @@
+/*

+    FreeRTOS V7.1.0 - 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.

+*/

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "queue.h"

+

+/* Demo app includes. */

+#include "USBSample.h"

+

+#define usbINT_CLEAR_MASK	(AT91C_UDP_TXCOMP | AT91C_UDP_STALLSENT | AT91C_UDP_RXSETUP | AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1 )

+

+#define usbCSR_CLEAR_BIT( pulValueNow, ulBit )											\

+{																						\

+	/* Set TXCOMP, RX_DATA_BK0, RXSETUP, */												\

+	/* STALLSENT and RX_DATA_BK1 to 1 so the */											\

+	/* write has no effect. */															\

+	( * ( ( unsigned long * ) pulValueNow ) ) |= ( unsigned long ) 0x4f;		\

+																						\

+	/* Clear the FORCE_STALL and TXPKTRDY bits */										\

+	/* so the write has no effect. */													\

+	( * ( ( unsigned long * ) pulValueNow ) ) &= ( unsigned long ) 0xffffffcf;	\

+																						\

+	/* Clear whichever bit we want clear. */											\

+	( * ( ( unsigned long * ) pulValueNow ) ) &= ( ~ulBit );						\

+}

+

+

+/*-----------------------------------------------------------*/

+

+/*

+ * ISR entry point.

+ */

+

+void vUSB_ISR_Wrapper( void ) __attribute__((naked));

+

+/*

+ * Actual ISR handler.  This must be separate from the entry point as the stack

+ * is used.

+ */

+void vUSB_ISR_Handler( void ) __attribute__((noinline));

+

+/*-----------------------------------------------------------*/

+

+/* Array in which the USB interrupt status is passed between the ISR and task. */

+static xISRStatus xISRMessages[ usbQUEUE_LENGTH + 1 ];

+

+/* Queue used to pass messages between the ISR and the task. */

+extern xQueueHandle xUSBInterruptQueue; 

+

+/*-----------------------------------------------------------*/

+

+void vUSB_ISR_Handler( void )

+{

+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; 

+static volatile unsigned long ulNextMessage = 0;

+xISRStatus *pxMessage;

+unsigned long ulTemp, ulRxBytes;

+

+	/* To reduce the amount of time spent in this interrupt it would be 

+	possible to defer the majority of this processing to an 'interrupt task',

+	that is a task that runs at a higher priority than any of the application

+	tasks. */

+

+	/* Take the next message from the queue.  Note that usbQUEUE_LENGTH *must*

+	be all 1's, as in 0x01, 0x03, 0x07, etc. */

+	pxMessage = &( xISRMessages[ ( ulNextMessage & usbQUEUE_LENGTH ) ] );

+	ulNextMessage++;

+

+	/* Take a snapshot of the current USB state for processing at the task

+	level. */

+	pxMessage->ulISR = AT91C_BASE_UDP->UDP_ISR;

+	pxMessage->ulCSR0 = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];

+

+	/* Clear the interrupts from the ICR register.  The bus end interrupt is

+	cleared separately as it does not appear in the mask register. */

+	AT91C_BASE_UDP->UDP_ICR = AT91C_BASE_UDP->UDP_IMR | AT91C_UDP_ENDBUSRES;

+	

+	/* If there are bytes in the FIFO then we have to retrieve them here.  

+	Ideally this would be done at the task level.  However we need to clear the

+	RXSETUP interrupt before leaving the ISR, and this may cause the data in

+	the FIFO to be overwritten.  Also the DIR bit has to be changed before the

+	RXSETUP bit is cleared (as per the SAM7 manual). */

+	ulTemp = pxMessage->ulCSR0;

+	

+	/* Are there any bytes in the FIFO? */

+	ulRxBytes = ulTemp >> 16;

+	ulRxBytes &= usbRX_COUNT_MASK;

+	

+	/* With this minimal implementation we are only interested in receiving 

+	setup bytes on the control end point. */

+	if( ( ulRxBytes > 0 ) && ( ulTemp & AT91C_UDP_RXSETUP ) )

+	{

+		/* Take off 1 for a zero based index. */

+		while( ulRxBytes > 0 )

+		{

+			ulRxBytes--;

+			pxMessage->ucFifoData[ ulRxBytes ] = AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_0 ];			

+		}

+		

+		/* The direction must be changed first. */

+		usbCSR_SET_BIT( &ulTemp, ( AT91C_UDP_DIR ) );

+		AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;

+	}

+	

+	/* Must write zero's to TXCOMP, STALLSENT, RXSETUP, and the RX DATA

+	registers to clear the interrupts in the CSR register. */

+	usbCSR_CLEAR_BIT( &ulTemp, usbINT_CLEAR_MASK );

+	AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;

+

+	/* Also clear the interrupts in the CSR1 register. */

+	ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ];

+	usbCSR_CLEAR_BIT( &ulTemp, usbINT_CLEAR_MASK );	

+	AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] = ulTemp;

+

+	/* The message now contains the entire state and optional data from

+	the USB interrupt.  This can now be posted on the Rx queue ready for

+	processing at the task level. */

+	xQueueSendFromISR( xUSBInterruptQueue, &pxMessage, &xHigherPriorityTaskWoken );

+

+	/* We may want to switch to the USB task, if this message has made

+	it the highest priority task that is ready to execute. */

+	if( xHigherPriorityTaskWoken )

+	{

+		portYIELD_FROM_ISR();

+	}

+

+	/* Clear the AIC ready for the next interrupt. */		

+	AT91C_BASE_AIC->AIC_EOICR = 0;

+}

+/*-----------------------------------------------------------*/

+

+void vUSB_ISR_Wrapper( void )

+{

+	/* Save the context of the interrupted task. */

+	portSAVE_CONTEXT();

+

+	/* Call the handler itself.  This must be a separate function as it uses

+	the stack. */

+	__asm volatile ("bl vUSB_ISR_Handler");

+

+	/* Restore the context of the task that is going to 

+	execute next. This might not be the same as the originally 

+	interrupted task.*/

+	portRESTORE_CONTEXT();

+}

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld
new file mode 100644
index 0000000..df33d23
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld
@@ -0,0 +1,55 @@
+MEMORY 

+{

+	flash	: ORIGIN = 0x00100000, LENGTH = 256K

+	ram		: ORIGIN = 0x00200000, LENGTH = 64K

+}

+

+__stack_end__ = 0x00200000 + 64K - 4;

+

+SECTIONS 

+{

+	. = 0;

+	startup : { *(.startup)} >flash

+

+	prog : 

+	{

+		*(.text)

+		*(.rodata)

+		*(.rodata*)

+		*(.glue_7)

+		*(.glue_7t)

+	} >flash

+

+	__end_of_text__ = .;

+	__data_beg_src__ = __end_of_text__;

+

+	.data : 

+	{

+		__data_beg__ = .;		

+		*(.data)

+		__data_end__ = .;

+	} >ram AT>flash

+

+	.bss : 

+	{

+		__bss_beg__ = .;

+		*(.bss)

+	} >ram

+

+	. = ALIGN(4);

+	.eh_frame :

+	{

+		 KEEP (*(.eh_frame))

+	} > ram

+	

+	/* Align here to ensure that the .bss section occupies space up to

+	_end.  Align after .bss to ensure correct alignment even if the

+	.bss section disappears because there are no input sections.  */

+	. = ALIGN(32 / 8);

+}

+	. = ALIGN(32 / 8);

+	_end = .;

+	_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;

+	PROVIDE (end = .);

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/boot.s b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/boot.s
new file mode 100644
index 0000000..1d4dfdf
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/boot.s
@@ -0,0 +1,162 @@
+	/* Sample initialization file */

+

+	.extern main

+	.extern exit

+	.extern AT91F_LowLevelInit

+	.extern vPortYieldProcessor

+

+	.text

+	.code 32

+

+

+	.align  0

+

+	.extern __stack_end__

+	.extern __bss_beg__

+	.extern __bss_end__

+	.extern __data_beg__

+	.extern __data_end__

+	.extern __data+beg_src__

+

+	.global start

+	.global endless_loop

+

+	/* Stack Sizes */

+    .set  UND_STACK_SIZE, 0x00000004

+    .set  ABT_STACK_SIZE, 0x00000004

+    .set  FIQ_STACK_SIZE, 0x00000004

+    .set  IRQ_STACK_SIZE, 0X00000400

+    .set  SVC_STACK_SIZE, 0x00000400

+

+	/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */

+    .set  MODE_USR, 0x10            /* User Mode */

+    .set  MODE_FIQ, 0x11            /* FIQ Mode */

+    .set  MODE_IRQ, 0x12            /* IRQ Mode */

+    .set  MODE_SVC, 0x13            /* Supervisor Mode */

+    .set  MODE_ABT, 0x17            /* Abort Mode */

+    .set  MODE_UND, 0x1B            /* Undefined Mode */

+    .set  MODE_SYS, 0x1F            /* System Mode */

+

+    .equ  I_BIT, 0x80               /* when I bit is set, IRQ is disabled */

+    .equ  F_BIT, 0x40               /* when F bit is set, FIQ is disabled */

+

+

+start:

+_start:

+_mainCRTStartup:

+

+	/* Setup a stack for each mode - note that this only sets up a usable stack

+	for system/user, SWI and IRQ modes.   Also each mode is setup with

+	interrupts initially disabled. */

+    ldr   r0, .LC6

+    msr   CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */

+    mov   sp, r0

+    sub   r0, r0, #UND_STACK_SIZE

+    msr   CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */

+    mov   sp, r0

+    sub   r0, r0, #ABT_STACK_SIZE

+    msr   CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */

+    mov   sp, r0

+    sub   r0, r0, #FIQ_STACK_SIZE

+    msr   CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */

+    mov   sp, r0

+    sub   r0, r0, #IRQ_STACK_SIZE

+    msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */

+    mov   sp, r0

+    sub   r0, r0, #SVC_STACK_SIZE

+    msr   CPSR_c, #MODE_SYS|I_BIT|F_BIT /* System Mode */

+    mov   sp, r0

+

+	/* We want to start in supervisor mode.  Operation will switch to system

+	mode when the first task starts. */

+	msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT

+

+    bl		AT91F_LowLevelInit

+

+	/* Clear BSS. */

+

+	mov     a2, #0			/* Fill value */

+	mov		fp, a2			/* Null frame pointer */

+	mov		r7, a2			/* Null frame pointer for Thumb */

+

+	ldr		r1, .LC1		/* Start of memory block */

+	ldr		r3, .LC2		/* End of memory block */

+	subs	r3, r3, r1      /* Length of block */

+	beq		.end_clear_loop

+	mov		r2, #0

+

+.clear_loop:

+	strb	r2, [r1], #1

+	subs	r3, r3, #1

+	bgt		.clear_loop

+

+.end_clear_loop:

+

+	/* Initialise data. */

+

+	ldr		r1, .LC3		/* Start of memory block */

+	ldr		r2, .LC4		/* End of memory block */

+	ldr		r3, .LC5

+	subs	r3, r3, r1		/* Length of block */

+	beq		.end_set_loop

+

+.set_loop:

+	ldrb	r4, [r2], #1

+	strb	r4, [r1], #1

+	subs	r3, r3, #1

+	bgt		.set_loop

+

+.end_set_loop:

+

+	mov		r0, #0          /* no arguments  */

+	mov		r1, #0          /* no argv either */

+

+    ldr lr, =main	

+	bx	lr

+

+endless_loop:

+	b               endless_loop

+

+

+	.align 0

+

+	.LC1:

+	.word   __bss_beg__

+	.LC2:

+	.word   __bss_end__

+	.LC3:

+	.word   __data_beg__

+	.LC4:

+	.word   __data_beg_src__

+	.LC5:

+	.word   __data_end__

+	.LC6:

+	.word   __stack_end__

+

+

+	/* Setup vector table.  Note that undf, pabt, dabt, fiq just execute

+	a null loop. */

+

+.section .startup,"ax"

+         .code 32

+         .align 0

+

+	b     _start						/* reset - _start			*/

+	ldr   pc, _undf						/* undefined - _undf		*/

+	ldr   pc, _swi						/* SWI - _swi				*/

+	ldr   pc, _pabt						/* program abort - _pabt	*/

+	ldr   pc, _dabt						/* data abort - _dabt		*/

+	nop									/* reserved					*/

+	ldr   pc, [pc,#-0xF20]				/* IRQ - read the AIC		*/

+	ldr   pc, _fiq						/* FIQ - _fiq				*/

+

+_undf:  .word __undf                    /* undefined				*/

+_swi:   .word vPortYieldProcessor       /* SWI						*/

+_pabt:  .word __pabt                    /* program abort			*/

+_dabt:  .word __dabt                    /* data abort				*/

+_fiq:   .word __fiq                     /* FIQ						*/

+

+__undf: b     .                         /* undefined				*/

+__pabt: b     .                         /* program abort			*/

+__dabt: b     .                         /* data abort				*/

+__fiq:  b     .                         /* FIQ						*/

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/main.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/main.c
new file mode 100644
index 0000000..48aa10d
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/main.c
@@ -0,0 +1,253 @@
+/*

+    FreeRTOS V7.1.0 - 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.

+*/

+

+/*

+	NOTE : Tasks run in System mode and the scheduler runs in Supervisor mode.

+	The processor MUST be in supervisor mode when vTaskStartScheduler is

+	called.  The demo applications included in the FreeRTOS.org download switch

+	to supervisor mode prior to main being called.  If you are not using one of

+	these demo application projects then ensure Supervisor mode is used.

+*/

+

+/*

+ * This demo includes a (basic) USB mouse driver and a WEB server.  It is

+ * targeted for the AT91SAM7X EK prototyping board which includes a small

+ * joystick to provide the mouse inputs.  The WEB interface provides some basic

+ * interactivity through the use of a check box to turn on and off an LED.

+ *

+ * main() creates the WEB server, USB, and a set of the standard demo tasks

+ * before starting the scheduler.  See the online FreeRTOS.org documentation 

+ * for more information on the standard demo tasks.  

+ *

+ * LEDs D1 to D3 are controlled by the standard 'flash' tasks - each will 

+ * toggle at a different fixed frequency.

+ *

+ * A tick hook function is used to monitor the standard demo tasks - with LED

+ * D4 being used to indicate the system status.  D4 toggling every 5 seconds

+ * indicates that all the standard demo tasks are executing without error.  The

+ * toggle rate increasing to 500ms is indicative of an error having been found

+ * in at least one demo task.

+ *

+ * See the online documentation page that accompanies this demo for full setup

+ * and usage information.

+ */

+

+/* Standard includes. */

+#include <stdlib.h>

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+

+/* Demo application includes. */

+#include "partest.h"

+#include "USBSample.h"

+#include "uIP_Task.h"

+#include "BlockQ.h"

+#include "blocktim.h"

+#include "flash.h"

+#include "QPeek.h"

+#include "dynamic.h"

+

+/* Priorities for the demo application tasks. */

+#define mainUIP_PRIORITY					( tskIDLE_PRIORITY + 2 )

+#define mainUSB_PRIORITY					( tskIDLE_PRIORITY + 2 )

+#define mainBLOCK_Q_PRIORITY				( tskIDLE_PRIORITY + 1 )

+#define mainFLASH_PRIORITY                  ( tskIDLE_PRIORITY + 2 )

+#define mainGEN_QUEUE_TASK_PRIORITY			( tskIDLE_PRIORITY ) 

+

+/* The task allocated to the uIP task is large to account for its use of the

+sprintf() library function.  Use of a cut down printf() library would allow

+the stack usage to be greatly reduced. */

+#define mainUIP_TASK_STACK_SIZE		( configMINIMAL_STACK_SIZE * 6 )

+

+/* The LED toggle by the tick hook should an error have been found in a task. */

+#define mainERROR_LED						( 3 )

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Configure the processor for use with the Atmel demo board.  Setup is minimal

+ * as the low level init function (called from the startup asm file) takes care

+ * of most things.

+ */

+static void prvSetupHardware( void );

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Starts all the other tasks, then starts the scheduler.

+ */

+int main( void )

+{

+	/* Setup any hardware that has not already been configured by the low

+	level init routines. */

+	prvSetupHardware();

+

+	/* Start the task that handles the TCP/IP and WEB server functionality. */

+    xTaskCreate( vuIP_Task, "uIP", mainUIP_TASK_STACK_SIZE, NULL, mainUIP_PRIORITY, NULL );

+	

+	/* Also start the USB demo which is just for the SAM7. */

+    vStartUSBTask( mainUSB_PRIORITY );

+	

+	/* Start the standard demo tasks. */

+	vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );

+    vCreateBlockTimeTasks();

+    vStartLEDFlashTasks( mainFLASH_PRIORITY );

+    vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );

+    vStartQueuePeekTasks();   

+    vStartDynamicPriorityTasks();

+

+	/* Start the scheduler.

+

+	NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.

+	The processor MUST be in supervisor mode when vTaskStartScheduler is

+	called.  The demo applications included in the FreeRTOS.org download switch

+	to supervisor mode prior to main being called.  If you are not using one of

+	these demo application projects then ensure Supervisor mode is used here. */

+

+	vTaskStartScheduler();

+

+	/* We should never get here as control is now taken by the scheduler. */

+  	return 0;

+}

+/*-----------------------------------------------------------*/

+

+static void prvSetupHardware( void )

+{

+	portDISABLE_INTERRUPTS();

+	

+	/* When using the JTAG debugger the hardware is not always initialised to

+	the correct default state.  This line just ensures that this does not

+	cause all interrupts to be masked at the start. */

+	AT91C_BASE_AIC->AIC_EOICR = 0;

+	

+	/* Most setup is performed by the low level init function called from the

+	startup asm file. */

+

+	/* Enable the peripheral clock. */

+    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;

+    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;

+	AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_EMAC;

+

+	/* Initialise the LED outputs for use by the demo application tasks. */

+	vParTestInitialise();

+}

+/*-----------------------------------------------------------*/

+

+void vApplicationTickHook( void )

+{

+static unsigned long ulCallCount = 0, ulErrorFound = pdFALSE;

+

+/* The rate at which LED D4 will toggle if an error has been found in one or 

+more of the standard demo tasks. */

+const unsigned long ulErrorFlashRate = 500 / portTICK_RATE_MS;

+

+/* The rate at which LED D4 will toggle if no errors have been found in any

+of the standard demo tasks. */

+const unsigned long ulNoErrorCheckRate = 5000 / portTICK_RATE_MS;

+

+	ulCallCount++;

+

+	if( ulErrorFound != pdFALSE )

+	{

+		/* We have already found an error, so flash the LED with the appropriate

+		frequency. */

+		if( ulCallCount > ulErrorFlashRate )

+		{

+			ulCallCount = 0;

+			vParTestToggleLED( mainERROR_LED );

+		}

+	}

+	else

+	{

+		if( ulCallCount > ulNoErrorCheckRate )

+		{

+			ulCallCount = 0;

+			

+			/* We have not yet found an error.  Check all the demo tasks to ensure

+			this is still the case. */

+			

+			if( xAreBlockingQueuesStillRunning() != pdTRUE )

+			{

+				ulErrorFound |= 0x01;

+			}

+			

+			if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )

+			{

+				ulErrorFound |= 0x02;

+			}

+	

+			if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )

+			{

+				ulErrorFound |= 0x04;

+			}

+			

+			if( xAreGenericQueueTasksStillRunning() != pdTRUE )

+			{

+				ulErrorFound |= 0x08;

+			}

+			

+			if( xAreQueuePeekTasksStillRunning() != pdTRUE )

+			{

+				ulErrorFound |= 0x10;

+			}

+			

+			vParTestToggleLED( mainERROR_LED );

+		}

+	}

+}

+

+

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c
new file mode 100644
index 0000000..5dff881
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/syscalls.c
@@ -0,0 +1,162 @@
+/****************************************************************************
+*  Copyright (c) 2009 by Michael Fischer. 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 author 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.
+*
+****************************************************************************
+*  History:
+*
+*  28.03.09  mifi   First Version, based on the original syscall.c from
+*                   newlib version 1.17.0
+****************************************************************************/
+
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+/***************************************************************************/
+
+int _read_r (struct _reent *r, int file, char * ptr, int len)
+{
+  r = r;
+  file = file;
+  ptr = ptr;
+  len = len;
+  
+  errno = EINVAL;
+  return -1;
+}
+
+/***************************************************************************/
+
+int _lseek_r (struct _reent *r, int file, int ptr, int dir)
+{
+  r = r;
+  file = file;
+  ptr = ptr;
+  dir = dir;
+  
+  return 0;
+}
+
+/***************************************************************************/
+
+int _write_r (struct _reent *r, int file, char * ptr, int len)
+{  
+  r = r;
+  file = file;
+  ptr = ptr;
+
+#if 0
+  int index;
+  
+  /* For example, output string by UART */
+  for(index=0; index<len; index++)
+  {
+    if (ptr[index] == '\n')
+    {
+      uart_putc('\r');
+    }  
+
+    uart_putc(ptr[index]);
+  }  
+#endif   
+  
+  return len;
+}
+
+/***************************************************************************/
+
+int _close_r (struct _reent *r, int file)
+{
+  return 0;
+}
+
+/***************************************************************************/
+
+/* Register name faking - works in collusion with the linker.  */
+register char * stack_ptr asm ("sp");
+
+caddr_t _sbrk_r (struct _reent *r, int incr)
+{
+  extern char   end asm ("end"); /* Defined by the linker.  */
+  static char * heap_end;
+  char *        prev_heap_end;
+
+  if (heap_end == NULL)
+    heap_end = & end;
+  
+  prev_heap_end = heap_end;
+  
+  if (heap_end + incr > stack_ptr)
+  {
+      /* Some of the libstdc++-v3 tests rely upon detecting
+        out of memory errors, so do not abort here.  */
+#if 0
+      extern void abort (void);
+
+      _write (1, "_sbrk: Heap and stack collision\n", 32);
+      
+      abort ();
+#else
+      errno = ENOMEM;
+      return (caddr_t) -1;
+#endif
+  }
+  
+  heap_end += incr;
+
+  return (caddr_t) prev_heap_end;
+}
+
+/***************************************************************************/
+
+int _fstat_r (struct _reent *r, int file, struct stat * st)
+{
+  r = r; 
+  file = file;
+   
+  memset (st, 0, sizeof (* st));
+  st->st_mode = S_IFCHR;
+  return 0;
+}
+
+/***************************************************************************/
+
+int _isatty_r(struct _reent *r, int fd)
+{
+  r = r;
+  fd = fd;
+   
+  return 1;
+}
+
+/*** EOF ***/
+
+
diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c
new file mode 100644
index 0000000..b033f26
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c
@@ -0,0 +1,118 @@
+/*

+    FreeRTOS V7.1.0 - 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.

+*/

+

+#include "FreeRTOS.h"

+#include "semphr.h"

+#include "task.h"

+

+/* Wrapper for the EMAC interrupt. */

+void vEMACISR_Wrapper( void ) __attribute__((naked));

+

+/* Handler called by the ISR wrapper.  This must be kept a separate

+function to ensure the stack frame is correctly set up. */

+void vEMACISR_Handler( void ) __attribute__((noinline));

+

+static xSemaphoreHandle xEMACSemaphore;

+

+/*-----------------------------------------------------------*/

+

+void vPassEMACSemaphore( xSemaphoreHandle xSemaphore )

+{

+	xEMACSemaphore = xSemaphore;

+}

+/*-----------------------------------------------------------*/

+

+void vEMACISR_Handler( void )

+{

+volatile unsigned long ulIntStatus, ulRxStatus;

+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

+

+	ulIntStatus = AT91C_BASE_EMAC->EMAC_ISR;

+	ulRxStatus = AT91C_BASE_EMAC->EMAC_RSR;

+

+	if( ( ulIntStatus & AT91C_EMAC_RCOMP ) || ( ulRxStatus & AT91C_EMAC_REC ) )

+	{

+		/* A frame has been received, signal the uIP task so it can process

+		the Rx descriptors. */

+		xSemaphoreGiveFromISR( xEMACSemaphore, &xHigherPriorityTaskWoken );

+		AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_REC;

+	}

+

+	/* Clear the interrupt. */

+	AT91C_BASE_AIC->AIC_EOICR = 0;

+	

+    /* Switch to the uIP task. */

+    if( xHigherPriorityTaskWoken )

+    {

+    	/* If a task of higher priority than the interrupted task was

+    	unblocked by the ISR then this call will ensure that the 

+    	unblocked task is the task the ISR returns to. */

+    	portYIELD_FROM_ISR();

+    }

+}

+/*-----------------------------------------------------------*/

+

+void vEMACISR_Wrapper( void )

+{

+	/* Save the context of the interrupted task. */

+	portSAVE_CONTEXT();

+	

+	/* Call the handler task to do the actual work.  This must be a separate

+	function to ensure the stack frame is correctly set up. */

+	__asm volatile ("bl vEMACISR_Handler");

+	

+	/* Restore the context of whichever task is the next to run. */

+	portRESTORE_CONTEXT();

+}

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/Makefile.webserver b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/Makefile.webserver
new file mode 100644
index 0000000..f38c47a
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/Makefile.webserver
@@ -0,0 +1 @@
+APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.c
new file mode 100644
index 0000000..780e017
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.c
@@ -0,0 +1,691 @@
+/*

+    FreeRTOS V7.1.0 - 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>

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "semphr.h"

+#include "task.h"

+

+/* Demo application includes. */

+#include "SAM7_EMAC.h"

+

+/* uIP includes. */

+#include "uip.h"

+

+/* Hardware specific includes. */

+#include "Emac.h"

+#include "mii.h"

+#include "AT91SAM7X256.h"

+

+

+/* USE_RMII_INTERFACE must be defined as 1 to use an RMII interface, or 0

+to use an MII interface. */

+#define USE_RMII_INTERFACE 0

+

+/* The buffer addresses written into the descriptors must be aligned so the

+last few bits are zero.  These bits have special meaning for the EMAC

+peripheral and cannot be used as part of the address. */

+#define emacADDRESS_MASK			( ( unsigned long ) 0xFFFFFFFC )

+

+/* Bit used within the address stored in the descriptor to mark the last

+descriptor in the array. */

+#define emacRX_WRAP_BIT				( ( unsigned long ) 0x02 )

+

+/* Bit used within the Tx descriptor status to indicate whether the

+descriptor is under the control of the EMAC or the software. */

+#define emacTX_BUF_USED				( ( unsigned long ) 0x80000000 )

+

+/* A short delay is used to wait for a buffer to become available, should

+one not be immediately available when trying to transmit a frame. */

+#define emacBUFFER_WAIT_DELAY		( 2 )

+#define emacMAX_WAIT_CYCLES			( configTICK_RATE_HZ / 40 )

+

+/* Misc defines. */

+#define emacINTERRUPT_LEVEL			( 5 )

+#define emacNO_DELAY				( 0 )

+#define emacTOTAL_FRAME_HEADER_SIZE	( 54 )

+#define emacPHY_INIT_DELAY			( 5000 / portTICK_RATE_MS )

+#define emacRESET_KEY				( ( unsigned long ) 0xA5000000 )

+#define emacRESET_LENGTH			( ( unsigned long ) ( 0x01 << 8 ) )

+

+/* The Atmel header file only defines the TX frame length mask. */

+#define emacRX_LENGTH_FRAME			( 0xfff )

+

+/* Peripheral setup for the EMAC. */

+#define emacPERIPHERAL_A_SETUP 		( ( unsigned long ) AT91C_PB2_ETX0			) | \

+									( ( unsigned long ) AT91C_PB12_ETXER		) | \

+									( ( unsigned long ) AT91C_PB16_ECOL			) | \

+									( ( unsigned long ) AT91C_PB11_ETX3			) | \

+									( ( unsigned long ) AT91C_PB6_ERX1			) | \

+									( ( unsigned long ) AT91C_PB15_ERXDV		) | \

+									( ( unsigned long ) AT91C_PB13_ERX2			) | \

+									( ( unsigned long ) AT91C_PB3_ETX1			) | \

+									( ( unsigned long ) AT91C_PB8_EMDC			) | \

+									( ( unsigned long ) AT91C_PB5_ERX0			) | \

+									( ( unsigned long ) AT91C_PB14_ERX3			) | \

+									( ( unsigned long ) AT91C_PB4_ECRS_ECRSDV	) | \

+									( ( unsigned long ) AT91C_PB1_ETXEN			) | \

+									( ( unsigned long ) AT91C_PB10_ETX2			) | \

+									( ( unsigned long ) AT91C_PB0_ETXCK_EREFCK	) | \

+									( ( unsigned long ) AT91C_PB9_EMDIO			) | \

+									( ( unsigned long ) AT91C_PB7_ERXER			) | \

+									( ( unsigned long ) AT91C_PB17_ERXCK		);

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Prototype for the EMAC interrupt function - called by the asm wrapper.

+ */

+extern void vEMACISR_Wrapper( void ) __attribute__((naked));

+

+/*

+ * Initialise both the Tx and Rx descriptors used by the EMAC.

+ */

+static void prvSetupDescriptors(void);

+

+/*

+ * Write our MAC address into the EMAC.  The MAC address is set as one of the

+ * uip options.

+ */

+static void prvSetupMACAddress( void );

+

+/*

+ * Configure the EMAC and AIC for EMAC interrupts.

+ */

+static void prvSetupEMACInterrupt( void );

+

+/*

+ * Some initialisation functions taken from the Atmel EMAC sample code.

+ */

+static void vReadPHY( unsigned char ucPHYAddress, unsigned char ucAddress, unsigned long *pulValue );

+#if USE_RMII_INTERFACE != 1

+	static void vWritePHY( unsigned char ucPHYAddress, unsigned char ucAddress, unsigned long ulValue);

+#endif

+static portBASE_TYPE xGetLinkSpeed( void );

+static portBASE_TYPE prvProbePHY( void );

+

+/*-----------------------------------------------------------*/

+

+/* Buffer written to by the EMAC DMA.  Must be aligned as described by the

+comment above the emacADDRESS_MASK definition. */

+#pragma data_alignment=8

+static volatile char pcRxBuffer[ NB_RX_BUFFERS * ETH_RX_BUFFER_SIZE ];

+

+/* Buffer read by the EMAC DMA.  Must be aligned as described by he comment

+above the emacADDRESS_MASK definition. */

+#pragma data_alignment=8

+static char pcTxBuffer[ NB_TX_BUFFERS * ETH_TX_BUFFER_SIZE ];

+

+/* Descriptors used to communicate between the program and the EMAC peripheral.

+These descriptors hold the locations and state of the Rx and Tx buffers. */

+static volatile AT91S_TxTdDescriptor xTxDescriptors[ NB_TX_BUFFERS ];

+static volatile AT91S_RxTdDescriptor xRxDescriptors[ NB_RX_BUFFERS ];

+

+/* The IP and Ethernet addresses are read from the uIP setup. */

+const char cMACAddress[ 6 ] = { uipMAC_ADDR0, uipMAC_ADDR1, uipMAC_ADDR2, uipMAC_ADDR3, uipMAC_ADDR4, uipMAC_ADDR5 };

+const unsigned char ucIPAddress[ 4 ]  = { uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 };

+

+/* The semaphore used by the EMAC ISR to wake the EMAC task. */

+static xSemaphoreHandle xSemaphore = NULL;

+

+/*-----------------------------------------------------------*/

+

+xSemaphoreHandle xEMACInit( void )

+{

+	/* Code supplied by Atmel -------------------------------*/

+

+	/* Disable pull up on RXDV => PHY normal mode (not in test mode),

+	PHY has internal pull down. */

+	AT91C_BASE_PIOB->PIO_PPUDR = 1 << 15;

+

+	#if USE_RMII_INTERFACE != 1

+	  	/* PHY has internal pull down : set MII mode. */

+	  	AT91C_BASE_PIOB->PIO_PPUDR = 1 << 16;

+	#endif

+

+	/* Clear PB18 <=> PHY powerdown. */

+   	AT91C_BASE_PIOB->PIO_PER = 1 << 18;

+	AT91C_BASE_PIOB->PIO_OER = 1 << 18;

+	AT91C_BASE_PIOB->PIO_CODR = 1 << 18;

+

+	/* After PHY power up, hardware reset. */

+	AT91C_BASE_RSTC->RSTC_RMR = emacRESET_KEY | emacRESET_LENGTH;

+	AT91C_BASE_RSTC->RSTC_RCR = emacRESET_KEY | AT91C_RSTC_EXTRST;

+

+	/* Wait for hardware reset end. */

+	while( !( AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_NRSTL ) )

+	{

+		__asm volatile ( "NOP" );

+	}

+    __asm volatile ( "NOP" );

+

+	/* Setup the pins. */

+	AT91C_BASE_PIOB->PIO_ASR = emacPERIPHERAL_A_SETUP;

+	AT91C_BASE_PIOB->PIO_PDR = emacPERIPHERAL_A_SETUP;

+

+	/* Enable com between EMAC PHY.

+

+	Enable management port. */

+	AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;	

+

+	/* MDC = MCK/32. */

+	AT91C_BASE_EMAC->EMAC_NCFGR |= ( 2 ) << 10;	

+

+	/* Wait for PHY auto init end (rather crude delay!). */

+	vTaskDelay( emacPHY_INIT_DELAY );

+

+	/* PHY configuration. */

+	#if USE_RMII_INTERFACE != 1

+	{

+		unsigned long ulControl;

+

+		/* PHY has internal pull down : disable MII isolate. */

+		vReadPHY( AT91C_PHY_ADDR, MII_BMCR, &ulControl );

+		vReadPHY( AT91C_PHY_ADDR, MII_BMCR, &ulControl );

+		ulControl &= ~BMCR_ISOLATE;

+		vWritePHY( AT91C_PHY_ADDR, MII_BMCR, ulControl );

+	}

+	#endif

+

+	/* Disable management port again. */

+	AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;

+

+	#if USE_RMII_INTERFACE != 1

+		/* Enable EMAC in MII mode, enable clock ERXCK and ETXCK. */

+		AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN ;

+	#else

+		/* Enable EMAC in RMII mode, enable RMII clock (50MHz from oscillator

+		on ERFCK). */

+		AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_RMII | AT91C_EMAC_CLKEN ;

+	#endif

+

+	/* End of code supplied by Atmel ------------------------*/

+

+	/* Setup the buffers and descriptors. */

+	prvSetupDescriptors();

+	

+	/* Load our MAC address into the EMAC. */

+	prvSetupMACAddress();

+

+	/* Are we connected? */

+	if( prvProbePHY() )

+	{

+		/* Enable the interrupt! */

+		portENTER_CRITICAL();

+		{

+			prvSetupEMACInterrupt();

+			vPassEMACSemaphore( xSemaphore );

+		}

+		portEXIT_CRITICAL();

+	}

+

+	return xSemaphore;

+}

+/*-----------------------------------------------------------*/

+

+long lEMACSend( void )

+{

+static unsigned portBASE_TYPE uxTxBufferIndex = 0;

+portBASE_TYPE xWaitCycles = 0;

+long lReturn = pdPASS;

+char *pcBuffer;

+

+	/* Is a buffer available? */

+	while( !( xTxDescriptors[ uxTxBufferIndex ].U_Status.status & AT91C_TRANSMIT_OK ) )

+	{

+		/* There is no room to write the Tx data to the Tx buffer.  Wait a

+		short while, then try again. */

+		xWaitCycles++;

+		if( xWaitCycles > emacMAX_WAIT_CYCLES )

+		{

+			/* Give up. */

+			lReturn = pdFAIL;

+			break;

+		}

+		else

+		{

+			vTaskDelay( emacBUFFER_WAIT_DELAY );

+		}

+	}

+

+	/* lReturn will only be pdPASS if a buffer is available. */

+	if( lReturn == pdPASS )

+	{

+		/* Copy the headers into the Tx buffer.  These will be in the uIP buffer. */

+		pcBuffer = ( char * ) xTxDescriptors[ uxTxBufferIndex ].addr;

+		memcpy( ( void * ) pcBuffer, ( void * ) uip_buf, emacTOTAL_FRAME_HEADER_SIZE );

+

+		/* If there is room, also copy in the application data if any. */

+		if( ( uip_len > emacTOTAL_FRAME_HEADER_SIZE ) && ( uip_len <= ( ETH_TX_BUFFER_SIZE - emacTOTAL_FRAME_HEADER_SIZE ) ) )

+		{

+			memcpy( ( void * ) &( pcBuffer[ emacTOTAL_FRAME_HEADER_SIZE ] ), ( void * ) uip_appdata, ( uip_len - emacTOTAL_FRAME_HEADER_SIZE ) );

+		}

+

+		/* Send. */	

+		portENTER_CRITICAL();

+		{

+			if( uxTxBufferIndex >= ( NB_TX_BUFFERS - 1 ) )

+			{

+				/* Fill out the necessary in the descriptor to get the data sent. */

+				xTxDescriptors[ uxTxBufferIndex ].U_Status.status = 	( uip_len & ( unsigned long ) AT91C_LENGTH_FRAME )

+																		| AT91C_LAST_BUFFER

+																		| AT91C_TRANSMIT_WRAP;

+				uxTxBufferIndex = 0;

+			}

+			else

+			{

+				/* Fill out the necessary in the descriptor to get the data sent. */

+				xTxDescriptors[ uxTxBufferIndex ].U_Status.status = 	( uip_len & ( unsigned long ) AT91C_LENGTH_FRAME )

+																		| AT91C_LAST_BUFFER;

+				uxTxBufferIndex++;

+			}

+	

+			AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TSTART;

+		}

+		portEXIT_CRITICAL();

+	}

+

+	return lReturn;

+}

+/*-----------------------------------------------------------*/

+

+unsigned long ulEMACPoll( void )

+{

+static unsigned portBASE_TYPE ulNextRxBuffer = 0;

+unsigned long ulSectionLength = 0, ulLengthSoFar = 0, ulEOF = pdFALSE;

+char *pcSource;

+

+	/* Skip any fragments. */

+	while( ( xRxDescriptors[ ulNextRxBuffer ].addr & AT91C_OWNERSHIP_BIT ) && !( xRxDescriptors[ ulNextRxBuffer ].U_Status.status & AT91C_SOF ) )

+	{

+		/* Mark the buffer as free again. */

+		xRxDescriptors[ ulNextRxBuffer ].addr &= ~( AT91C_OWNERSHIP_BIT );		

+		ulNextRxBuffer++;

+		if( ulNextRxBuffer >= NB_RX_BUFFERS )

+		{

+			ulNextRxBuffer = 0;

+		}

+	}

+

+	/* Is there a packet ready? */

+

+	while( ( xRxDescriptors[ ulNextRxBuffer ].addr & AT91C_OWNERSHIP_BIT ) && !ulSectionLength )

+	{

+		pcSource = ( char * )( xRxDescriptors[ ulNextRxBuffer ].addr & emacADDRESS_MASK );

+		ulSectionLength = xRxDescriptors[ ulNextRxBuffer ].U_Status.status & emacRX_LENGTH_FRAME;

+

+		if( ulSectionLength == 0 )

+		{

+			/* The frame is longer than the buffer pointed to by this

+			descriptor so copy the entire buffer to uIP - then move onto

+			the next descriptor to get the rest of the frame. */

+			if( ( ulLengthSoFar + ETH_RX_BUFFER_SIZE ) <= UIP_BUFSIZE )

+			{

+				memcpy( &( uip_buf[ ulLengthSoFar ] ), pcSource, ETH_RX_BUFFER_SIZE );

+				ulLengthSoFar += ETH_RX_BUFFER_SIZE;

+			}			

+		}

+		else

+		{

+			/* This is the last section of the frame.  Copy the section to

+			uIP. */

+			if( ulSectionLength < UIP_BUFSIZE )

+			{

+				/* The section length holds the length of the entire frame.

+				ulLengthSoFar holds the length of the frame sections already

+				copied to uIP, so the length of the final section is

+				ulSectionLength - ulLengthSoFar; */

+				if( ulSectionLength > ulLengthSoFar )

+				{

+					memcpy( &( uip_buf[ ulLengthSoFar ] ), pcSource, ( ulSectionLength - ulLengthSoFar ) );

+				}

+			}			

+

+			/* Is this the last buffer for the frame?  If not why? */

+			ulEOF = xRxDescriptors[ ulNextRxBuffer ].U_Status.status & AT91C_EOF;

+		}

+

+		/* Mark the buffer as free again. */

+		xRxDescriptors[ ulNextRxBuffer ].addr &= ~( AT91C_OWNERSHIP_BIT );

+

+		/* Increment to the next buffer, wrapping if necessary. */

+		ulNextRxBuffer++;

+		if( ulNextRxBuffer >= NB_RX_BUFFERS )

+		{

+			ulNextRxBuffer = 0;

+		}

+	}

+

+	/* If we obtained data but for some reason did not find the end of the

+	frame then discard the data as it must contain an error. */

+	if( !ulEOF )

+	{

+		ulSectionLength = 0;

+	}

+

+	return ulSectionLength;

+}

+/*-----------------------------------------------------------*/

+

+static void prvSetupDescriptors(void)

+{

+unsigned portBASE_TYPE xIndex;

+unsigned long ulAddress;

+

+	/* Initialise xRxDescriptors descriptor. */

+	for( xIndex = 0; xIndex < NB_RX_BUFFERS; ++xIndex )

+	{

+		/* Calculate the address of the nth buffer within the array. */

+		ulAddress = ( unsigned long )( pcRxBuffer + ( xIndex * ETH_RX_BUFFER_SIZE ) );

+

+		/* Write the buffer address into the descriptor.  The DMA will place

+		the data at this address when this descriptor is being used.  Mask off

+		the bottom bits of the address as these have special meaning. */

+		xRxDescriptors[ xIndex ].addr = ulAddress & emacADDRESS_MASK;

+	}	

+

+	/* The last buffer has the wrap bit set so the EMAC knows to wrap back

+	to the first buffer. */

+	xRxDescriptors[ NB_RX_BUFFERS - 1 ].addr |= emacRX_WRAP_BIT;

+

+	/* Initialise xTxDescriptors. */

+	for( xIndex = 0; xIndex < NB_TX_BUFFERS; ++xIndex )

+	{

+		/* Calculate the address of the nth buffer within the array. */

+		ulAddress = ( unsigned long )( pcTxBuffer + ( xIndex * ETH_TX_BUFFER_SIZE ) );

+

+		/* Write the buffer address into the descriptor.  The DMA will read

+		data from here when the descriptor is being used. */

+		xTxDescriptors[ xIndex ].addr = ulAddress & emacADDRESS_MASK;

+		xTxDescriptors[ xIndex ].U_Status.status = AT91C_TRANSMIT_OK;

+	}	

+

+	/* The last buffer has the wrap bit set so the EMAC knows to wrap back

+	to the first buffer. */

+	xTxDescriptors[ NB_TX_BUFFERS - 1 ].U_Status.status = AT91C_TRANSMIT_WRAP | AT91C_TRANSMIT_OK;

+

+	/* Tell the EMAC where to find the descriptors. */

+	AT91C_BASE_EMAC->EMAC_RBQP = ( unsigned long ) xRxDescriptors;

+	AT91C_BASE_EMAC->EMAC_TBQP = ( unsigned long ) xTxDescriptors;

+	

+	/* Clear all the bits in the receive status register. */

+	AT91C_BASE_EMAC->EMAC_RSR = ( AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA );

+

+	/* Enable the copy of data into the buffers, ignore broadcasts,

+	and don't copy FCS. */

+	AT91C_BASE_EMAC->EMAC_NCFGR |= ( AT91C_EMAC_CAF | AT91C_EMAC_NBC | AT91C_EMAC_DRFCS);

+

+	/* Enable Rx and Tx, plus the stats register. */

+	AT91C_BASE_EMAC->EMAC_NCR |= ( AT91C_EMAC_TE | AT91C_EMAC_RE | AT91C_EMAC_WESTAT );

+}	

+/*-----------------------------------------------------------*/

+

+static void prvSetupMACAddress( void )

+{

+	/* Must be written SA1L then SA1H. */

+	AT91C_BASE_EMAC->EMAC_SA1L =	( ( unsigned long ) cMACAddress[ 3 ] << 24 ) |

+									( ( unsigned long ) cMACAddress[ 2 ] << 16 ) |

+									( ( unsigned long ) cMACAddress[ 1 ] << 8  ) |

+									cMACAddress[ 0 ];

+

+	AT91C_BASE_EMAC->EMAC_SA1H =	( ( unsigned long ) cMACAddress[ 5 ] << 8 ) |

+									cMACAddress[ 4 ];

+}

+/*-----------------------------------------------------------*/

+

+static void prvSetupEMACInterrupt( void )

+{

+	/* Create the semaphore used to trigger the EMAC task. */

+	vSemaphoreCreateBinary( xSemaphore );

+	if( xSemaphore )

+	{

+		/* We start by 'taking' the semaphore so the ISR can 'give' it when the

+		first interrupt occurs. */

+		xSemaphoreTake( xSemaphore, emacNO_DELAY );

+		portENTER_CRITICAL();

+		{

+			/* We want to interrupt on Rx events. */

+			AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RCOMP;

+

+			/* Enable the interrupts in the AIC. */

+			AT91F_AIC_ConfigureIt( AT91C_ID_EMAC, emacINTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ( void (*)( void ) ) vEMACISR_Wrapper );

+			AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_EMAC;

+		}

+		portEXIT_CRITICAL();

+	}

+}

+/*-----------------------------------------------------------*/

+

+

+

+

+/*

+ * The following functions are initialisation functions taken from the Atmel

+ * EMAC sample code.

+ */

+

+static portBASE_TYPE prvProbePHY( void )

+{

+unsigned long ulPHYId1, ulPHYId2, ulStatus;

+portBASE_TYPE xReturn = pdPASS;

+	

+	/* Code supplied by Atmel (reformatted) -----------------*/

+

+	/* Enable management port */

+	AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;	

+	AT91C_BASE_EMAC->EMAC_NCFGR |= ( 2 ) << 10;

+

+	/* Read the PHY ID. */

+	vReadPHY( AT91C_PHY_ADDR, MII_PHYSID1, &ulPHYId1 );

+	vReadPHY( AT91C_PHY_ADDR, MII_PHYSID2, &ulPHYId2 );

+

+	/* AMD AM79C875:

+			PHY_ID1 = 0x0022

+			PHY_ID2 = 0x5541

+			Bits 3:0 Revision Number Four bit manufacturerÂ’s revision number.

+				0001 stands for Rev. A, etc.

+	*/

+	if( ( ( ulPHYId1 << 16 ) | ( ulPHYId2 & 0xfff0 ) ) != MII_DM9161_ID )

+	{

+		/* Did not expect this ID. */

+		xReturn = pdFAIL;

+	}

+	else

+	{

+		ulStatus = xGetLinkSpeed();

+

+		if( ulStatus != pdPASS )

+		{

+			xReturn = pdFAIL;

+		}

+	}

+

+	/* Disable management port */

+	AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;	

+

+	/* End of code supplied by Atmel ------------------------*/

+

+	return xReturn;

+}

+/*-----------------------------------------------------------*/

+

+static void vReadPHY( unsigned char ucPHYAddress, unsigned char ucAddress, unsigned long *pulValue )

+{

+	/* Code supplied by Atmel (reformatted) ----------------------*/

+

+	AT91C_BASE_EMAC->EMAC_MAN = 	(AT91C_EMAC_SOF & (0x01<<30))

+									| (2 << 16) | (2 << 28)

+									| ((ucPHYAddress & 0x1f) << 23)

+									| (ucAddress << 18);

+

+	/* Wait until IDLE bit in Network Status register is cleared. */

+	while( !( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE ) )

+	{

+		__asm( "NOP" );

+	}

+

+	*pulValue = ( AT91C_BASE_EMAC->EMAC_MAN & 0x0000ffff );	

+

+	/* End of code supplied by Atmel ------------------------*/

+}

+/*-----------------------------------------------------------*/

+

+#if USE_RMII_INTERFACE != 1

+static void vWritePHY( unsigned char ucPHYAddress, unsigned char ucAddress, unsigned long ulValue )

+{

+	/* Code supplied by Atmel (reformatted) ----------------------*/

+

+	AT91C_BASE_EMAC->EMAC_MAN = (( AT91C_EMAC_SOF & (0x01<<30))

+								| (2 << 16) | (1 << 28)

+								| ((ucPHYAddress & 0x1f) << 23)

+								| (ucAddress << 18))

+								| (ulValue & 0xffff);

+

+	/* Wait until IDLE bit in Network Status register is cleared */

+	while( !( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE ) )

+	{

+		__asm( "NOP" );

+	};

+

+	/* End of code supplied by Atmel ------------------------*/

+}

+#endif

+/*-----------------------------------------------------------*/

+

+static portBASE_TYPE xGetLinkSpeed( void )

+{

+	unsigned long ulBMSR, ulBMCR, ulLPA, ulMACCfg, ulSpeed, ulDuplex;

+

+	/* Code supplied by Atmel (reformatted) -----------------*/

+

+	/* Link status is latched, so read twice to get current value */

+	vReadPHY(AT91C_PHY_ADDR, MII_BMSR, &ulBMSR);

+	vReadPHY(AT91C_PHY_ADDR, MII_BMSR, &ulBMSR);

+

+	if( !( ulBMSR & BMSR_LSTATUS ) )

+	{	

+		/* No Link. */

+		return pdFAIL;

+	}

+

+	vReadPHY(AT91C_PHY_ADDR, MII_BMCR, &ulBMCR);

+	if (ulBMCR & BMCR_ANENABLE)

+	{				

+		/* AutoNegotiation is enabled. */

+		if (!(ulBMSR & BMSR_ANEGCOMPLETE))

+		{

+			/* Auto-negotiation in progress. */

+			return pdFAIL;				

+		}		

+

+		vReadPHY(AT91C_PHY_ADDR, MII_LPA, &ulLPA);

+		if( ( ulLPA & LPA_100FULL ) || ( ulLPA & LPA_100HALF ) )

+		{

+			ulSpeed = SPEED_100;

+		}

+		else

+		{

+			ulSpeed = SPEED_10;

+		}

+

+		if( ( ulLPA & LPA_100FULL ) || ( ulLPA & LPA_10FULL ) )

+		{

+			ulDuplex = DUPLEX_FULL;

+		}

+		else

+		{

+			ulDuplex = DUPLEX_HALF;

+		}

+	}

+	else

+	{

+		ulSpeed = ( ulBMCR & BMCR_SPEED100 ) ? SPEED_100 : SPEED_10;

+		ulDuplex = ( ulBMCR & BMCR_FULLDPLX ) ? DUPLEX_FULL : DUPLEX_HALF;

+	}

+

+	/* Update the MAC */

+	ulMACCfg = AT91C_BASE_EMAC->EMAC_NCFGR & ~( AT91C_EMAC_SPD | AT91C_EMAC_FD );

+	if( ulSpeed == SPEED_100 )

+	{

+		if( ulDuplex == DUPLEX_FULL )

+		{

+			/* 100 Full Duplex */

+			AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg | AT91C_EMAC_SPD | AT91C_EMAC_FD;

+		}

+		else

+		{					

+			/* 100 Half Duplex */

+			AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg | AT91C_EMAC_SPD;

+		}

+	}

+	else

+	{

+		if (ulDuplex == DUPLEX_FULL)

+		{

+			/* 10 Full Duplex */

+			AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg | AT91C_EMAC_FD;

+		}

+		else

+		{

+			/* 10 Half Duplex */

+			AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg;

+		}

+	}

+

+	/* End of code supplied by Atmel ------------------------*/

+

+	return pdPASS;

+}

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.h
new file mode 100644
index 0000000..3e87642
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.h
@@ -0,0 +1,77 @@
+/*

+    FreeRTOS V7.1.0 - 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 SAM_7_EMAC_H

+#define SAM_7_EMAC_H

+

+

+/*

+ * Initialise the EMAC driver.  If successful a semaphore is returned that

+ * is used by the EMAC ISR to indicate that Rx packets have been received.

+ * If the initialisation fails then NULL is returned.

+ */

+xSemaphoreHandle xEMACInit( void );

+

+/*

+ * Send the current uIP buffer.  This copies the uIP buffer to one of the

+ * EMAC Tx buffers, then indicates to the EMAC that the buffer is ready.

+ */

+long lEMACSend( void );

+

+/*

+ * Called in response to an EMAC Rx interrupt.  Copies the received frame

+ * into the uIP buffer.

+ */

+unsigned long ulEMACPoll( void );

+

+#endif

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/clock-arch.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/clock-arch.h
new file mode 100644
index 0000000..cde657b
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/clock-arch.h
@@ -0,0 +1,42 @@
+/*

+ * Copyright (c) 2006, 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 uIP TCP/IP stack

+ *

+ * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $

+ */

+

+#ifndef __CLOCK_ARCH_H__

+#define __CLOCK_ARCH_H__

+

+#include "FreeRTOS.h"

+

+typedef unsigned long clock_time_t;

+#define CLOCK_CONF_SECOND configTICK_RATE_HZ

+

+#endif /* __CLOCK_ARCH_H__ */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/emac_atmel.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/emac_atmel.h
new file mode 100644
index 0000000..7551a36
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/emac_atmel.h
@@ -0,0 +1,195 @@
+//*----------------------------------------------------------------------------

+//*         ATMEL Microcontroller Software Support  -  ROUSSET  -

+//*----------------------------------------------------------------------------

+//* The software is delivered "AS IS" without warranty or condition of any

+//* kind, either express, implied or statutory. This includes without

+//* limitation any warranty or condition with respect to merchantability or

+//* fitness for any particular purpose, or against the infringements of

+//* intellectual property rights of others.

+//*----------------------------------------------------------------------------

+//* File Name           : Emac.h

+//* Object              : Emac header file

+//* Creation            : Hi   11/18/2002

+//*

+//*----------------------------------------------------------------------------

+#ifndef AT91C_EMAC_H

+#define AT91C_EMAC_H

+

+

+//* Allows to display all IP header in the main.c

+//* If not defined, only ICMP packets are displayed

+#define AT91C_DISPLAY_ALL_IPHEADER		0

+

+#define NB_RX_BUFFERS			25			//* Number of receive buffers

+#define ETH_RX_BUFFER_SIZE		128         //*

+

+#define NB_TX_BUFFERS			2		//* Number of Transmit buffers

+#define ETH_TX_BUFFER_SIZE		UIP_BUFSIZE       //*

+

+#define AT91C_NO_IPPACKET		0

+#define AT91C_IPPACKET	        1

+

+#define ARP_REQUEST				0x0001

+#define ARP_REPLY				0x0002

+#define PROT_ARP				0x0806

+#define PROT_IP					0x0800

+#define PROT_ICMP				0x01

+#define ICMP_ECHO_REQUEST		0x08

+#define ICMP_ECHO_REPLY			0x00

+

+#define AT91C_EMAC_CLKEN 0x2

+#define SWAP16(x)	(((x & 0xff) << 8) | (x >> 8))

+

+#if 0

+//* Transfer descriptor structure

+typedef struct _AT91S_TdDescriptor {

+	unsigned int addr;

+	unsigned int status;

+}AT91S_TdDescriptor, *AT91PS_TdDescriptor;

+#endif

+

+//* Receive Transfer descriptor structure

+typedef struct  _AT91S_RxTdDescriptor {

+	unsigned int addr;

+	union

+	{

+		unsigned int status;

+		struct {

+			unsigned int Length:11;

+			unsigned int Res0:1;

+			unsigned int Rxbuf_off:2;

+			unsigned int StartOfFrame:1;

+			unsigned int EndOfFrame:1;

+			unsigned int Cfi:1;

+			unsigned int VlanPriority:3;

+			unsigned int PriorityTag:1;

+			unsigned int VlanTag:1;

+			unsigned int TypeID:1;

+			unsigned int Sa4Match:1;

+			unsigned int Sa3Match:1;

+			unsigned int Sa2Match:1;

+			unsigned int Sa1Match:1;

+			unsigned int Res1:1;

+			unsigned int ExternalAdd:1;

+			unsigned int UniCast:1;

+			unsigned int MultiCast:1;

+			unsigned int BroadCast:1;

+		}S_Status;		

+	}U_Status;

+}AT91S_RxTdDescriptor, *AT91PS_RxTdDescriptor;

+

+

+//* Transmit Transfer descriptor structure

+typedef struct _AT91S_TxTdDescriptor {

+	unsigned int addr;

+	union

+	{

+		unsigned int status;

+		struct {

+			unsigned int Length:11;

+			unsigned int Res0:4;

+			unsigned int LastBuff:1;

+			unsigned int NoCrc:1;

+			unsigned int Res1:10;

+			unsigned int BufExhausted:1;

+			unsigned int TransmitUnderrun:1;

+			unsigned int TransmitError:1;

+			unsigned int Wrap:1;

+			unsigned int BuffUsed:1;

+		}S_Status;		

+	}U_Status;

+}AT91S_TxTdDescriptor, *AT91PS_TxTdDescriptor;

+

+#define AT91C_OWNERSHIP_BIT		0x00000001

+

+/* Receive status defintion */

+#define AT91C_BROADCAST_ADDR	((unsigned int) (1 << 31))	//* Broadcat address detected

+#define AT91C_MULTICAST_HASH 	((unsigned int) (1 << 30))	//* MultiCast hash match

+#define AT91C_UNICAST_HASH 	    ((unsigned int) (1 << 29))	//* UniCast hash match

+#define AT91C_EXTERNAL_ADDR	    ((unsigned int) (1 << 28))	//* External Address match

+#define AT91C_SA1_ADDR	    	((unsigned int) (1 << 26))	//* Specific address 1 match

+#define AT91C_SA2_ADDR	    	((unsigned int) (1 << 25))	//* Specific address 2 match

+#define AT91C_SA3_ADDR	    	((unsigned int) (1 << 24))	//* Specific address 3 match

+#define AT91C_SA4_ADDR	    	((unsigned int) (1 << 23))	//* Specific address 4 match

+#define AT91C_TYPE_ID	    	((unsigned int) (1 << 22))	//* Type ID match

+#define AT91C_VLAN_TAG	    	((unsigned int) (1 << 21))	//* VLAN tag detected

+#define AT91C_PRIORITY_TAG    	((unsigned int) (1 << 20))	//* PRIORITY tag detected

+#define AT91C_VLAN_PRIORITY    	((unsigned int) (7 << 17))  //* PRIORITY Mask

+#define AT91C_CFI_IND        	((unsigned int) (1 << 16))  //* CFI indicator

+#define AT91C_EOF           	((unsigned int) (1 << 15))  //* EOF

+#define AT91C_SOF           	((unsigned int) (1 << 14))  //* SOF

+#define AT91C_RBF_OFFSET     	((unsigned int) (3 << 12))  //* Receive Buffer Offset Mask

+#define AT91C_LENGTH_FRAME     	((unsigned int) 0x07FF)     //* Length of frame

+

+/* Transmit Status definition */

+#define AT91C_TRANSMIT_OK		((unsigned int) (1 << 31))	//*

+#define AT91C_TRANSMIT_WRAP		((unsigned int) (1 << 30))	//* Wrap bit: mark the last descriptor

+#define AT91C_TRANSMIT_ERR		((unsigned int) (1 << 29))	//* RLE:transmit error

+#define AT91C_TRANSMIT_UND		((unsigned int) (1 << 28))	//* Transmit Underrun

+#define AT91C_BUF_EX     		((unsigned int) (1 << 27))	//* Buffers exhausted in mid frame

+#define AT91C_TRANSMIT_NO_CRC	((unsigned int) (1 << 16))	//* No CRC will be appended to the current frame

+#define AT91C_LAST_BUFFER    	((unsigned int) (1 << 15))	//*

+

+#define ARP_ETHER	 		1		/* Ethernet  hardware address	*/

+#define ARPOP_REQUEST    	1		/* Request  to resolve  address	*/

+#define ARPOP_REPLY	    	2		/* Response to previous request	*/

+#define RARPOP_REQUEST   	3		/* Request  to resolve  address	*/

+#define RARPOP_REPLY	    4		/* Response to previous request */

+

+

+typedef struct _AT91S_EthHdr

+{

+	unsigned char		et_dest[6];	/* Destination node		*/

+	unsigned char		et_src[6];	/* Source node			*/

+	unsigned short		et_protlen;	/* Protocol or length		*/

+} AT91S_EthHdr, *AT91PS_EthHdr;

+

+typedef struct _AT91S_ArpHdr

+{

+	unsigned short		ar_hrd;		/* Format of hardware address	*/

+	unsigned short		ar_pro;		/* Format of protocol address	*/

+	unsigned char		ar_hln;		/* Length of hardware address	*/

+	unsigned char		ar_pln;		/* Length of protocol address	*/

+	unsigned short		ar_op;		/* Operation			*/

+	unsigned char		ar_sha[6];	/* Sender hardware address	*/

+	unsigned char		ar_spa[4];	/* Sender protocol address	*/

+	unsigned char		ar_tha[6];	/* Target hardware address	*/

+	unsigned char		ar_tpa[4];	/* Target protocol address	*/

+} AT91S_ArpHdr, *AT91PS_ArpHdr;

+

+//* IP Header structure

+typedef struct _AT91S_IPheader {

+	unsigned char	ip_hl_v;	/* header length and version	*/

+	unsigned char	ip_tos;		/* type of service		*/

+	unsigned short	ip_len;		/* total length			*/

+	unsigned short	ip_id;		/* identification		*/

+	unsigned short	ip_off;		/* fragment offset field	*/

+	unsigned char	ip_ttl;		/* time to live			*/

+	unsigned char	ip_p;		/* protocol			*/

+	unsigned short	ip_sum;		/* checksum			*/

+	unsigned char	ip_src[4];	/* Source IP address		*/

+	unsigned char	ip_dst[4];	/* Destination IP address	*/

+	unsigned short	udp_src;	/* UDP source port		*/

+	unsigned short	udp_dst;	/* UDP destination port		*/

+	unsigned short	udp_len;	/* Length of UDP packet		*/

+	unsigned short	udp_xsum;	/* Checksum			*/

+} AT91S_IPheader, *AT91PS_IPheader;

+

+//* ICMP echo header structure

+typedef struct _AT91S_IcmpEchoHdr {

+    unsigned char   type;       /* type of message */

+    unsigned char   code;       /* type subcode */

+    unsigned short  cksum;      /* ones complement cksum of struct */

+    unsigned short  id;         /* identifier */

+    unsigned short  seq;        /* sequence number */

+}AT91S_IcmpEchoHdr, *AT91PS_IcmpEchoHdr;

+

+

+typedef struct _AT91S_EthPack

+{

+	AT91S_EthHdr	EthHdr;

+	AT91S_ArpHdr	ArpHdr;

+} AT91S_EthPack, *AT91PS_EthPack;

+

+

+#endif //* AT91C_EMAC_H

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings
new file mode 100644
index 0000000..0d3c30c
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings
@@ -0,0 +1,35 @@
+http_http "http://"

+http_200 "200 "

+http_301 "301 "

+http_302 "302 "

+http_get "GET "

+http_10 "HTTP/1.0"

+http_11 "HTTP/1.1"

+http_content_type "content-type: "

+http_texthtml "text/html"

+http_location "location: "

+http_host "host: "

+http_crnl "\r\n"

+http_index_html "/index.html"

+http_404_html "/404.html"

+http_referer "Referer:"

+http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n"

+http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n"

+http_content_type_plain "Content-type: text/plain\r\n\r\n"

+http_content_type_html "Content-type: text/html\r\n\r\n"

+http_content_type_css  "Content-type: text/css\r\n\r\n"

+http_content_type_text "Content-type: text/text\r\n\r\n"

+http_content_type_png  "Content-type: image/png\r\n\r\n"

+http_content_type_gif  "Content-type: image/gif\r\n\r\n"

+http_content_type_jpg  "Content-type: image/jpeg\r\n\r\n"

+http_content_type_binary "Content-type: application/octet-stream\r\n\r\n"

+http_html ".html"

+http_shtml ".shtml"

+http_htm ".htm"

+http_css ".css"

+http_png ".png"

+http_gif ".gif"

+http_jpg ".jpg"

+http_text ".txt"

+http_txt ".txt"

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.c
new file mode 100644
index 0000000..ef7a41c
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.c
@@ -0,0 +1,102 @@
+const char http_http[8] = 

+/* "http://" */

+{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, };

+const char http_200[5] = 

+/* "200 " */

+{0x32, 0x30, 0x30, 0x20, };

+const char http_301[5] = 

+/* "301 " */

+{0x33, 0x30, 0x31, 0x20, };

+const char http_302[5] = 

+/* "302 " */

+{0x33, 0x30, 0x32, 0x20, };

+const char http_get[5] = 

+/* "GET " */

+{0x47, 0x45, 0x54, 0x20, };

+const char http_10[9] = 

+/* "HTTP/1.0" */

+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, };

+const char http_11[9] = 

+/* "HTTP/1.1" */

+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, };

+const char http_content_type[15] = 

+/* "content-type: " */

+{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, };

+const char http_texthtml[10] = 

+/* "text/html" */

+{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, };

+const char http_location[11] = 

+/* "location: " */

+{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, };

+const char http_host[7] = 

+/* "host: " */

+{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, };

+const char http_crnl[3] = 

+/* "\r\n" */

+{0xd, 0xa, };

+const char http_index_html[12] = 

+/* "/index.html" */

+{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, };

+const char http_404_html[10] = 

+/* "/404.html" */

+{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, };

+const char http_referer[9] = 

+/* "Referer:" */

+{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, };

+const char http_header_200[84] = 

+/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */

+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, };

+const char http_header_404[91] = 

+/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */

+{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, };

+const char http_content_type_plain[29] = 

+/* "Content-type: text/plain\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_html[28] = 

+/* "Content-type: text/html\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_css [27] = 

+/* "Content-type: text/css\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_text[28] = 

+/* "Content-type: text/text\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_png [28] = 

+/* "Content-type: image/png\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_gif [28] = 

+/* "Content-type: image/gif\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_jpg [29] = 

+/* "Content-type: image/jpeg\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, };

+const char http_content_type_binary[43] = 

+/* "Content-type: application/octet-stream\r\n\r\n" */

+{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, };

+const char http_html[6] = 

+/* ".html" */

+{0x2e, 0x68, 0x74, 0x6d, 0x6c, };

+const char http_shtml[7] = 

+/* ".shtml" */

+{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, };

+const char http_htm[5] = 

+/* ".htm" */

+{0x2e, 0x68, 0x74, 0x6d, };

+const char http_css[5] = 

+/* ".css" */

+{0x2e, 0x63, 0x73, 0x73, };

+const char http_png[5] = 

+/* ".png" */

+{0x2e, 0x70, 0x6e, 0x67, };

+const char http_gif[5] = 

+/* ".gif" */

+{0x2e, 0x67, 0x69, 0x66, };

+const char http_jpg[5] = 

+/* ".jpg" */

+{0x2e, 0x6a, 0x70, 0x67, };

+const char http_text[5] = 

+/* ".txt" */

+{0x2e, 0x74, 0x78, 0x74, };

+const char http_txt[5] = 

+/* ".txt" */

+{0x2e, 0x74, 0x78, 0x74, };

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.h
new file mode 100644
index 0000000..acbe7e1
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.h
@@ -0,0 +1,34 @@
+extern const char http_http[8];

+extern const char http_200[5];

+extern const char http_301[5];

+extern const char http_302[5];

+extern const char http_get[5];

+extern const char http_10[9];

+extern const char http_11[9];

+extern const char http_content_type[15];

+extern const char http_texthtml[10];

+extern const char http_location[11];

+extern const char http_host[7];

+extern const char http_crnl[3];

+extern const char http_index_html[12];

+extern const char http_404_html[10];

+extern const char http_referer[9];

+extern const char http_header_200[84];

+extern const char http_header_404[91];

+extern const char http_content_type_plain[29];

+extern const char http_content_type_html[28];

+extern const char http_content_type_css [27];

+extern const char http_content_type_text[28];

+extern const char http_content_type_png [28];

+extern const char http_content_type_gif [28];

+extern const char http_content_type_jpg [29];

+extern const char http_content_type_binary[43];

+extern const char http_html[6];

+extern const char http_shtml[7];

+extern const char http_htm[5];

+extern const char http_css[5];

+extern const char http_png[5];

+extern const char http_gif[5];

+extern const char http_jpg[5];

+extern const char http_text[5];

+extern const char http_txt[5];

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.c
new file mode 100644
index 0000000..43b7afb
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.c
@@ -0,0 +1,268 @@
+/**

+ * \addtogroup httpd

+ * @{

+ */

+

+/**

+ * \file

+ *         Web server script interface

+ * \author

+ *         Adam Dunkels <adam@sics.se>

+ *

+ */

+

+/*

+ * Copyright (c) 2001-2006, Adam Dunkels.

+ * 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 uIP TCP/IP stack.

+ *

+ * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $

+ *

+ */

+

+#include "uip.h"

+#include "psock.h"

+#include "httpd.h"

+#include "httpd-cgi.h"

+#include "httpd-fs.h"

+

+#include <stdio.h>

+#include <string.h>

+

+HTTPD_CGI_CALL(file, "file-stats", file_stats);

+HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats);

+HTTPD_CGI_CALL(net, "net-stats", net_stats);

+HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats );

+HTTPD_CGI_CALL(io, "led-io", led_io );

+

+

+static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL };

+

+/*---------------------------------------------------------------------------*/

+static

+PT_THREAD(nullfunction(struct httpd_state *s, char *ptr))

+{

+  PSOCK_BEGIN(&s->sout);

+  PSOCK_END(&s->sout);

+}

+/*---------------------------------------------------------------------------*/

+httpd_cgifunction

+httpd_cgi(char *name)

+{

+  const struct httpd_cgi_call **f;

+

+  /* Find the matching name in the table, return the function. */

+  for(f = calls; *f != NULL; ++f) {

+    if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) {

+      return (*f)->function;

+    }

+  }

+  return nullfunction;

+}

+/*---------------------------------------------------------------------------*/

+static unsigned short

+generate_file_stats(void *arg)

+{

+  char *f = (char *)arg;

+  return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f));

+}

+/*---------------------------------------------------------------------------*/

+static

+PT_THREAD(file_stats(struct httpd_state *s, char *ptr))

+{

+  PSOCK_BEGIN(&s->sout);

+

+  PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1);

+  

+  PSOCK_END(&s->sout);

+}

+/*---------------------------------------------------------------------------*/

+static const char closed[] =   /*  "CLOSED",*/

+{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};

+static const char syn_rcvd[] = /*  "SYN-RCVD",*/

+{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,

+ 0x44,  0};

+static const char syn_sent[] = /*  "SYN-SENT",*/

+{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,

+ 0x54,  0};

+static const char established[] = /*  "ESTABLISHED",*/

+{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,

+ 0x45, 0x44, 0};

+static const char fin_wait_1[] = /*  "FIN-WAIT-1",*/

+{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,

+ 0x54, 0x2d, 0x31, 0};

+static const char fin_wait_2[] = /*  "FIN-WAIT-2",*/

+{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,

+ 0x54, 0x2d, 0x32, 0};

+static const char closing[] = /*  "CLOSING",*/

+{0x43, 0x4c, 0x4f, 0x53, 0x49,

+ 0x4e, 0x47, 0};

+static const char time_wait[] = /*  "TIME-WAIT,"*/

+{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,

+ 0x49, 0x54, 0};

+static const char last_ack[] = /*  "LAST-ACK"*/

+{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,

+ 0x4b, 0};

+

+static const char *states[] = {

+  closed,

+  syn_rcvd,

+  syn_sent,

+  established,

+  fin_wait_1,

+  fin_wait_2,

+  closing,

+  time_wait,

+  last_ack};

+  

+

+static unsigned short

+generate_tcp_stats(void *arg)

+{

+  struct uip_conn *conn;

+  struct httpd_state *s = (struct httpd_state *)arg;

+    

+  conn = &uip_conns[s->count];

+  return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,

+		 "<tr><td>%d</td><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",

+		 htons(conn->lport),

+		 htons(conn->ripaddr[0]) >> 8,

+		 htons(conn->ripaddr[0]) & 0xff,

+		 htons(conn->ripaddr[1]) >> 8,

+		 htons(conn->ripaddr[1]) & 0xff,

+		 htons(conn->rport),

+		 states[conn->tcpstateflags & UIP_TS_MASK],

+		 conn->nrtx,

+		 conn->timer,

+		 (uip_outstanding(conn))? '*':' ',

+		 (uip_stopped(conn))? '!':' ');

+}

+/*---------------------------------------------------------------------------*/

+static

+PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr))

+{

+  

+  PSOCK_BEGIN(&s->sout);

+

+  for(s->count = 0; s->count < UIP_CONNS; ++s->count) {

+    if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {

+      PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s);

+    }

+  }

+

+  PSOCK_END(&s->sout);

+}

+/*---------------------------------------------------------------------------*/

+static unsigned short

+generate_net_stats(void *arg)

+{

+  struct httpd_state *s = (struct httpd_state *)arg;

+  return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,

+		  "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]);

+}

+

+static

+PT_THREAD(net_stats(struct httpd_state *s, char *ptr))

+{

+  PSOCK_BEGIN(&s->sout);

+

+#if UIP_STATISTICS

+

+  for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t);

+      ++s->count) {

+    PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s);

+  }

+  

+#endif /* UIP_STATISTICS */

+  

+  PSOCK_END(&s->sout);

+}

+/*---------------------------------------------------------------------------*/

+

+extern void vTaskList( signed char *pcWriteBuffer );

+static char cCountBuf[ 32 ];

+long lRefreshCount = 0;

+static unsigned short

+generate_rtos_stats(void *arg)

+{

+	lRefreshCount++;

+	sprintf( cCountBuf, "<p><br>Refresh count = %ld", lRefreshCount );

+    vTaskList( uip_appdata );

+	strcat( uip_appdata, cCountBuf );

+  

+	return strlen( uip_appdata );

+}

+/*---------------------------------------------------------------------------*/

+

+

+static

+PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr))

+{

+  PSOCK_BEGIN(&s->sout);

+  PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL);  

+  PSOCK_END(&s->sout);

+}

+/*---------------------------------------------------------------------------*/

+

+char *pcStatus;

+unsigned long ulString;

+extern unsigned long uxParTextGetLED( unsigned long uxLED );

+

+static unsigned short generate_io_state( void *arg )

+{

+	if( uxParTestGetLED() )

+	{

+		pcStatus = "checked";

+	}

+	else

+	{

+		pcStatus = "";

+	}

+

+	sprintf( uip_appdata,

+		"<input type=\"checkbox\" name=\"LED0\" value=\"1\" %s>LED DS4,"\

+		"<p>",

+		pcStatus ); 

+

+	return strlen( uip_appdata );

+}

+

+static PT_THREAD(led_io(struct httpd_state *s, char *ptr))

+{

+  PSOCK_BEGIN(&s->sout);

+  PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL);

+  PSOCK_END(&s->sout);

+}

+

+/** @} */

+

+

+

+

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.h
new file mode 100644
index 0000000..7ae9283
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.h
@@ -0,0 +1,84 @@
+/**

+ * \addtogroup httpd

+ * @{

+ */

+

+/**

+ * \file

+ *         Web server script interface header file

+ * \author

+ *         Adam Dunkels <adam@sics.se>

+ *

+ */

+

+

+

+/*

+ * Copyright (c) 2001, Adam Dunkels.

+ * 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 uIP TCP/IP stack.

+ *

+ * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $

+ *

+ */

+

+#ifndef __HTTPD_CGI_H__

+#define __HTTPD_CGI_H__

+

+#include "psock.h"

+#include "httpd.h"

+

+typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *));

+

+httpd_cgifunction httpd_cgi(char *name);

+

+struct httpd_cgi_call {

+  const char *name;

+  const httpd_cgifunction function;

+};

+

+/**

+ * \brief      HTTPD CGI function declaration

+ * \param name The C variable name of the function

+ * \param str  The string name of the function, used in the script file

+ * \param function A pointer to the function that implements it

+ *

+ *             This macro is used for declaring a HTTPD CGI

+ *             function. This function is then added to the list of

+ *             HTTPD CGI functions with the httpd_cgi_add() function.

+ *

+ * \hideinitializer

+ */

+#define HTTPD_CGI_CALL(name, str, function) \

+static PT_THREAD(function(struct httpd_state *, char *)); \

+static const struct httpd_cgi_call name = {str, function}

+

+void httpd_cgi_init(void);

+#endif /* __HTTPD_CGI_H__ */

+

+/** @} */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.c
new file mode 100644
index 0000000..dc4aef0
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.c
@@ -0,0 +1,132 @@
+/*

+ * 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>

+ *

+ * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $

+ */

+

+#include "httpd.h"

+#include "httpd-fs.h"

+#include "httpd-fsdata.h"

+

+#ifndef NULL

+#define NULL 0

+#endif /* NULL */

+

+#include "httpd-fsdata.c"

+

+#if HTTPD_FS_STATISTICS

+static u16_t count[HTTPD_FS_NUMFILES];

+#endif /* HTTPD_FS_STATISTICS */

+

+/*-----------------------------------------------------------------------------------*/

+static u8_t

+httpd_fs_strcmp(const char *str1, const char *str2)

+{

+  u8_t i;

+  i = 0;

+ loop:

+

+  if(str2[i] == 0 ||

+     str1[i] == '\r' ||

+     str1[i] == '\n') {

+    return 0;

+  }

+

+  if(str1[i] != str2[i]) {

+    return 1;

+  }

+

+

+  ++i;

+  goto loop;

+}

+/*-----------------------------------------------------------------------------------*/

+int

+httpd_fs_open(const char *name, struct httpd_fs_file *file)

+{

+#if HTTPD_FS_STATISTICS

+  u16_t i = 0;

+#endif /* HTTPD_FS_STATISTICS */

+  struct httpd_fsdata_file_noconst *f;

+

+  for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT;

+      f != NULL;

+      f = (struct httpd_fsdata_file_noconst *)f->next) {

+

+    if(httpd_fs_strcmp(name, f->name) == 0) {

+      file->data = f->data;

+      file->len = f->len;

+#if HTTPD_FS_STATISTICS

+      ++count[i];

+#endif /* HTTPD_FS_STATISTICS */

+      return 1;

+    }

+#if HTTPD_FS_STATISTICS

+    ++i;

+#endif /* HTTPD_FS_STATISTICS */

+

+  }

+  return 0;

+}

+/*-----------------------------------------------------------------------------------*/

+void

+httpd_fs_init(void)

+{

+#if HTTPD_FS_STATISTICS

+  u16_t i;

+  for(i = 0; i < HTTPD_FS_NUMFILES; i++) {

+    count[i] = 0;

+  }

+#endif /* HTTPD_FS_STATISTICS */

+}

+/*-----------------------------------------------------------------------------------*/

+#if HTTPD_FS_STATISTICS

+u16_t httpd_fs_count

+(char *name)

+{

+  struct httpd_fsdata_file_noconst *f;

+  u16_t i;

+

+  i = 0;

+  for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT;

+      f != NULL;

+      f = (struct httpd_fsdata_file_noconst *)f->next) {

+

+    if(httpd_fs_strcmp(name, f->name) == 0) {

+      return count[i];

+    }

+    ++i;

+  }

+  return 0;

+}

+#endif /* HTTPD_FS_STATISTICS */

+/*-----------------------------------------------------------------------------------*/

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.h
new file mode 100644
index 0000000..b594eea
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.h
@@ -0,0 +1,57 @@
+/*

+ * 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>

+ *

+ * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $

+ */

+#ifndef __HTTPD_FS_H__

+#define __HTTPD_FS_H__

+

+#define HTTPD_FS_STATISTICS 1

+

+struct httpd_fs_file {

+  char *data;

+  int len;

+};

+

+/* file must be allocated by caller and will be filled in

+   by the function. */

+int httpd_fs_open(const char *name, struct httpd_fs_file *file);

+

+#ifdef HTTPD_FS_STATISTICS

+#if HTTPD_FS_STATISTICS == 1

+u16_t httpd_fs_count(char *name);

+#endif /* HTTPD_FS_STATISTICS */

+#endif /* HTTPD_FS_STATISTICS */

+

+void httpd_fs_init(void);

+

+#endif /* __HTTPD_FS_H__ */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/404.html b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/404.html
new file mode 100644
index 0000000..43e7f4c
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/404.html
@@ -0,0 +1,8 @@
+<html>

+  <body bgcolor="white">

+    <center>

+      <h1>404 - file not found</h1>

+      <h3>Go <a href="/">here</a> instead.</h3>

+    </center>

+  </body>

+</html>
\ No newline at end of file
diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.html b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.html
new file mode 100644
index 0000000..1d3bbee
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

+<html>

+  <head>

+    <title>FreeRTOS.org uIP WEB server demo</title>

+  </head>

+  <BODY onLoad="window.setTimeout(&quot;location.href='index.shtml'&quot;,100)"bgcolor="#CCCCff">

+<font face="arial">

+Loading index.shtml.  Click <a href="index.shtml">here</a> if not automatically redirected.

+</font>

+</font>

+</body>

+</html>

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml
new file mode 100644
index 0000000..0ce405b
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml
@@ -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 uIP WEB server demo</title>

+  </head>

+  <BODY onLoad="window.setTimeout(&quot;location.href='index.shtml'&quot;,2000)"bgcolor="#CCCCff">

+<font face="arial">

+<a href="index.shtml">RTOS Stats</a> <b>|</b> <a href="stats.shtml">TCP Stats</a> <b>|</b> <a href="tcp.shtml">Connections</a> <b>|</b> <a href="http://www.freertos.org/">FreeRTOS.org Homepage</a> <b>|</b> <a href="io.shtml">IO</a>

+<br><p>

+<hr>

+<br><p>

+<h2>Task statistics</h2>

+Page will refresh evey 2 seconds.<p>

+<font face="courier"><pre>Task          State  Priority  Stack	#<br>************************************************<br>

+%! rtos-stats

+</pre></font>

+</font>

+</body>

+</html>

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml
new file mode 100644
index 0000000..bacef5f
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

+<html>

+  <head>

+    <title>FreeRTOS.org uIP WEB server demo</title>

+  </head>

+  <BODY bgcolor="#CCCCff">

+<font face="arial">

+<a href="index.shtml">RTOS Stats</a> <b>|</b> <a href="stats.shtml">TCP Stats</a> <b>|</b> <a href="tcp.shtml">Connections</a> <b>|</b> <a href="http://www.freertos.org/">FreeRTOS.org Homepage</a> <b>|</b> <a href="io.shtml">IO</a>

+<br><p>

+<hr>

+<b>LED IO</b><br>

+

+<p>

+

+Use the check box to set the LED state, then click "Update IO" to send the new state to the microcontroller.

+

+

+<p>

+<form name="aForm" action="/io.shtml" method="get">

+%! led-io

+<p>

+<input type="submit" value="Update IO">

+</form>

+<br><p>

+</font>

+</body>

+</html>

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml
new file mode 100644
index 0000000..d762f40
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

+<html>

+  <head>

+    <title>FreeRTOS.org uIP WEB server demo</title>

+  </head>

+  <BODY bgcolor="#CCCCff">

+<font face="arial">

+<a href="index.shtml">RTOS Stats</a> <b>|</b> <a href="stats.shtml">TCP Stats</a> <b>|</b> <a href="tcp.shtml">Connections</a> <b>|</b> <a href="http://www.freertos.org/">FreeRTOS.org Homepage</a> <b>|</b> <a href="io.shtml">IO</a>

+<br><p>

+<hr>

+<br><p>

+<h2>Network statistics</h2>

+<table width="300" border="0">

+<tr><td align="left"><font face="courier"><pre>

+IP           Packets dropped

+             Packets received

+             Packets sent

+IP errors    IP version/header length

+             IP length, high byte

+             IP length, low byte

+             IP fragments

+             Header checksum

+             Wrong protocol

+ICMP	     Packets dropped

+             Packets received

+             Packets sent

+             Type errors

+TCP          Packets dropped

+             Packets received

+             Packets sent

+             Checksum errors

+             Data packets without ACKs

+             Resets

+             Retransmissions

+	     No connection avaliable

+	     Connection attempts to closed ports

+</pre></font></td><td><pre>%! net-stats

+</pre></table>

+</font>

+</body>

+</html>

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml
new file mode 100644
index 0000000..654d61f
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

+<html>

+  <head>

+    <title>FreeRTOS.org uIP WEB server demo</title>

+  </head>

+  <BODY bgcolor="#CCCCff">

+<font face="arial">

+<a href="index.shtml">RTOS Stats</a> <b>|</b> <a href="stats.shtml">TCP Stats</a> <b>|</b> <a href="tcp.shtml">Connections</a> <b>|</b> <a href="http://www.freertos.org/">FreeRTOS.org Homepage</a> <b>|</b> <a href="io.shtml">IO</a>

+<br><p>

+<hr>

+<br>

+<h2>Network connections</h2>

+<p>

+<table>

+<tr><th>Local</th><th>Remote</th><th>State</th><th>Retransmissions</th><th>Timer</th><th>Flags</th></tr>

+%! tcp-connections

+</pre></font>

+</font>

+</body>

+</html>

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.c
new file mode 100644
index 0000000..481f3af
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.c
@@ -0,0 +1,468 @@
+static const unsigned char data_404_html[] = {
+	/* /404.html */
+	0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0x20, 0x20, 
+	0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 
+	0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 
+	0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 
+	0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 
+	0x34, 0x20, 0x2d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 
+	0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 
+	0x68, 0x31, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x3c, 0x68, 0x33, 0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, 
+	0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 
+	0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 
+	0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 
+	0x33, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 
+	0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, 
+	0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 
+	0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0};
+
+static const unsigned char data_index_html[] = {
+	/* /index.html */
+	0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 
+	0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 
+	0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
+	0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 
+	0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, 
+	0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 
+	0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 
+	0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 
+	0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, 
+	0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 
+	0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, 
+	0x31, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, 0x6c, 
+	0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 
+	0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 
+	0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 
+	0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x4c, 0x6f, 0x61, 0x64, 
+	0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 
+	0x73, 0x68, 0x74, 0x6d, 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, 
+	0x69, 0x63, 0x6b, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 
+	0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, 
+	0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 
+	0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 
+	0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, 
+	0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0xd, 0xa, 0x3c, 
+	0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 
+	0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 
+	0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 
+	0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0};
+
+static const unsigned char data_index_shtml[] = {
+	/* /index.shtml */
+	0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 
+	0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 
+	0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
+	0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 
+	0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, 
+	0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 
+	0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 
+	0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 
+	0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, 
+	0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 
+	0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, 
+	0x32, 0x30, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, 
+	0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 
+	0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 
+	0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 
+	0x69, 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 
+	0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 
+	0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 
+	0x54, 0x4f, 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 
+	0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 
+	0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 
+	0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 
+	0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 
+	0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 
+	0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 
+	0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 
+	0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 
+	0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 
+	0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 
+	0x77, 0x77, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 
+	0x73, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 
+	0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 
+	0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 
+	0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 
+	0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 
+	0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 
+	0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 
+	0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 
+	0x68, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 
+	0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, 
+	0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 
+	0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, 
+	0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 
+	0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x65, 0x76, 
+	0x65, 0x79, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 
+	0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x66, 
+	0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 
+	0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 
+	0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 
+	0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6f, 0x72, 
+	0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 
+	0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, 0x2a, 0x2a, 0x2a, 
+	0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 
+	0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 
+	0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 
+	0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 
+	0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 
+	0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, 0x73, 0x74, 
+	0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, 0x70, 0x72, 0x65, 
+	0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 
+	0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 
+	0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 
+	0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0};
+
+static const unsigned char data_io_shtml[] = {
+	/* /io.shtml */
+	0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 
+	0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 
+	0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
+	0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 
+	0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, 
+	0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 
+	0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 
+	0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 
+	0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 
+	0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 
+	0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, 
+	0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 
+	0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 
+	0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 
+	0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 
+	0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 
+	0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 
+	0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 
+	0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 
+	0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 
+	0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, 
+	0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, 
+	0x3e, 0xd, 0xa, 0x3c, 0x62, 0x3e, 0x4c, 0x45, 0x44, 0x20, 
+	0x49, 0x4f, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 
+	0xd, 0xa, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0xd, 
+	0xa, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 
+	0x68, 0x65, 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 
+	0x6f, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 
+	0x4c, 0x45, 0x44, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 
+	0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 
+	0x6b, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 
+	0x49, 0x4f, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x6e, 
+	0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, 
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 
+	0x68, 0x65, 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x63, 0x6f, 
+	0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0xd, 
+	0xa, 0xd, 0xa, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 
+	0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 
+	0x3d, 0x22, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, 0x61, 
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, 0x6f, 
+	0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, 0x65, 
+	0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, 
+	0x3e, 0xd, 0xa, 0x25, 0x21, 0x20, 0x6c, 0x65, 0x64, 0x2d, 
+	0x69, 0x6f, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 
+	0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 
+	0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x55, 0x70, 0x64, 
+	0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x3e, 0xd, 0xa, 
+	0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xd, 0xa, 0x3c, 
+	0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 
+	0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 
+	0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 
+	0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0};
+
+static const unsigned char data_stats_shtml[] = {
+	/* /stats.shtml */
+	0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 
+	0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 
+	0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
+	0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 
+	0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, 
+	0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 
+	0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 
+	0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 
+	0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 
+	0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 
+	0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, 
+	0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 
+	0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 
+	0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 
+	0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 
+	0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 
+	0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 
+	0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 
+	0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 
+	0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 
+	0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, 
+	0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, 
+	0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 
+	0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, 
+	0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 
+	0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 
+	0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 
+	0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x20, 
+	0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 
+	0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 
+	0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, 
+	0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 
+	0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, 
+	0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 
+	0xd, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 
+	0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 
+	0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 
+	0x49, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 
+	0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, 
+	0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 
+	0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 
+	0x68, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, 
+	0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 
+	0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, 
+	0x77, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 
+	0x6e, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, 
+	0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 
+	0x73, 0x75, 0x6d, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, 
+	0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 
+	0x6f, 0x6c, 0xd, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 
+	0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xd, 
+	0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 
+	0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 
+	0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, 
+	0x6f, 0x72, 0x73, 0xd, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 
+	0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 
+	0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 
+	0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 
+	0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 
+	0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 
+	0x74, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, 
+	0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 
+	0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x61, 0x74, 0x61, 
+	0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x77, 
+	0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x41, 0x43, 0x4b, 
+	0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x73, 0x65, 
+	0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x74, 
+	0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 
+	0x6e, 0x73, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, 
+	0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 
+	0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, 
+	0x62, 0x6c, 0x65, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 
+	0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 
+	0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 
+	0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 
+	0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, 
+	0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 
+	0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 
+	0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, 
+	0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, 
+	0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 
+	0x6c, 0x65, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 
+	0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 
+	0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+	0xd, 0xa, 0};
+
+static const unsigned char data_tcp_shtml[] = {
+	/* /tcp.shtml */
+	0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
+	0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 
+	0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 
+	0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 
+	0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 
+	0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 
+	0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 
+	0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 
+	0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 
+	0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 
+	0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 
+	0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 
+	0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
+	0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 
+	0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 
+	0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, 
+	0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 
+	0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, 
+	0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 
+	0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 
+	0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 
+	0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 
+	0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, 
+	0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 
+	0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 
+	0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 
+	0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 
+	0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 
+	0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 
+	0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 
+	0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 
+	0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 
+	0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 
+	0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 
+	0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 
+	0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 
+	0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, 
+	0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, 
+	0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 0x3c, 
+	0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 
+	0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 
+	0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, 0x3c, 
+	0x70, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 
+	0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 
+	0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, 
+	0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 
+	0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 
+	0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 
+	0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, 
+	0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 
+	0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, 
+	0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 
+	0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, 
+	0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xd, 0xa, 0x25, 
+	0x21, 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xd, 0xa, 0x3c, 
+	0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 
+	0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 
+	0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 
+	0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 
+	0xa, 0xd, 0xa, 0};
+
+const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}};
+
+const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}};
+
+const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}};
+
+const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}};
+
+const struct httpd_fsdata_file file_stats_shtml[] = {{file_io_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}};
+
+const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}};
+
+#define HTTPD_FS_ROOT file_tcp_shtml
+
+#define HTTPD_FS_NUMFILES 6
diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.h
new file mode 100644
index 0000000..52d35c2
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.h
@@ -0,0 +1,64 @@
+/*

+ * 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>

+ *

+ * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $

+ */

+#ifndef __HTTPD_FSDATA_H__

+#define __HTTPD_FSDATA_H__

+

+#include "uip.h"

+

+struct httpd_fsdata_file {

+  const struct httpd_fsdata_file *next;

+  const char *name;

+  const char *data;

+  const int len;

+#ifdef HTTPD_FS_STATISTICS

+#if HTTPD_FS_STATISTICS == 1

+  u16_t count;

+#endif /* HTTPD_FS_STATISTICS */

+#endif /* HTTPD_FS_STATISTICS */

+};

+

+struct httpd_fsdata_file_noconst {

+  struct httpd_fsdata_file *next;

+  char *name;

+  char *data;

+  int len;

+#ifdef HTTPD_FS_STATISTICS

+#if HTTPD_FS_STATISTICS == 1

+  u16_t count;

+#endif /* HTTPD_FS_STATISTICS */

+#endif /* HTTPD_FS_STATISTICS */

+};

+

+#endif /* __HTTPD_FSDATA_H__ */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.c
new file mode 100644
index 0000000..5c0b409
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.c
@@ -0,0 +1,413 @@
+/*$T httpd.c GC 1.138 11/17/07 13:10:22 */

+

+/*

+ * \addtogroup apps @{ £

+ * \defgroup httpd Web server @{ The uIP web server is a very simplistic

+ * implementation of an HTTP server. It can serve web pages and files from a

+ * read-only ROM filesystem, and provides a very small scripting language. £

+ * \file Web server \author Adam Dunkels <adam@sics.se> £

+ * Copyright (c) 2004, Adam Dunkels. 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 uIP TCP/IP stack. Author: Adam Dunkels

+ * <adam@sics.se> $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $

+ */

+#include "uip.h"

+#include "httpd.h"

+#include "httpd-fs.h"

+#include "httpd-cgi.h"

+#include "http-strings.h"

+

+#include <string.h>

+

+#define STATE_WAITING	0

+#define STATE_OUTPUT	1

+

+#define ISO_nl			0x0a

+#define ISO_space		0x20

+#define ISO_bang		0x21

+#define ISO_percent		0x25

+#define ISO_period		0x2e

+#define ISO_slash		0x2f

+#define ISO_colon		0x3a

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static unsigned short generate_part_of_file(void *state)

+{

+	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

+	struct httpd_state	*s = (struct httpd_state *) state;

+	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

+

+	if(s->file.len > uip_mss())

+	{

+		s->len = uip_mss();

+	}

+	else

+	{

+		s->len = s->file.len;

+	}

+

+	memcpy(uip_appdata, s->file.data, s->len);

+

+	return s->len;

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static PT_THREAD(send_file (struct httpd_state *s))

+{

+	PSOCK_BEGIN(&s->sout);

+

+	do

+	{

+		PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s);

+		s->file.len -= s->len;

+		s->file.data += s->len;

+	} while(s->file.len > 0);

+

+	PSOCK_END(&s->sout);

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static PT_THREAD(send_part_of_file (struct httpd_state *s))

+{

+	PSOCK_BEGIN(&s->sout);

+

+	PSOCK_SEND(&s->sout, s->file.data, s->len);

+

+	PSOCK_END(&s->sout);

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static void next_scriptstate(struct httpd_state *s)

+{

+	/*~~~~~~~*/

+	char	*p;

+	/*~~~~~~~*/

+

+	p = strchr(s->scriptptr, ISO_nl) + 1;

+	s->scriptlen -= (unsigned short) (p - s->scriptptr);

+	s->scriptptr = p;

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static PT_THREAD(handle_script (struct httpd_state *s))

+{

+	/*~~~~~~~~~*/

+	char	*ptr;

+	/*~~~~~~~~~*/

+

+	PT_BEGIN(&s->scriptpt);

+

+	while(s->file.len > 0)

+	{

+		/* Check if we should start executing a script. */

+		if(*s->file.data == ISO_percent && *(s->file.data + 1) == ISO_bang)

+		{

+			s->scriptptr = s->file.data + 3;

+			s->scriptlen = s->file.len - 3;

+			if(*(s->scriptptr - 1) == ISO_colon)

+			{

+				httpd_fs_open(s->scriptptr + 1, &s->file);

+				PT_WAIT_THREAD(&s->scriptpt, send_file(s));

+			}

+			else

+			{

+				PT_WAIT_THREAD(&s->scriptpt, httpd_cgi(s->scriptptr) (s, s->scriptptr));

+			}

+

+			next_scriptstate(s);

+

+			/*

+			 * The script is over, so we reset the pointers and continue sending the rest of

+			 * the file.

+			 */

+			s->file.data = s->scriptptr;

+			s->file.len = s->scriptlen;

+		}

+		else

+		{

+			/* See if we find the start of script marker in the block of HTML to be sent. */

+			if(s->file.len > uip_mss())

+			{

+				s->len = uip_mss();

+			}

+			else

+			{

+				s->len = s->file.len;

+			}

+

+			if(*s->file.data == ISO_percent)

+			{

+				ptr = strchr(s->file.data + 1, ISO_percent);

+			}

+			else

+			{

+				ptr = strchr(s->file.data, ISO_percent);

+			}

+

+			if(ptr != NULL && ptr != s->file.data)

+			{

+				s->len = (int) (ptr - s->file.data);

+				if(s->len >= uip_mss())

+				{

+					s->len = uip_mss();

+				}

+			}

+

+			PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s));

+			s->file.data += s->len;

+			s->file.len -= s->len;

+		}

+	}

+

+	PT_END(&s->scriptpt);

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static PT_THREAD(send_headers (struct httpd_state *s, const char *statushdr))

+{

+	/*~~~~~~~~~*/

+	char	*ptr;

+	/*~~~~~~~~~*/

+

+	PSOCK_BEGIN(&s->sout);

+

+	PSOCK_SEND_STR(&s->sout, statushdr);

+

+	ptr = strrchr(s->filename, ISO_period);

+	if(ptr == NULL)

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_binary);

+	}

+	else if(strncmp(http_html, ptr, 5) == 0 || strncmp(http_shtml, ptr, 6) == 0)

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_html);

+	}

+	else if(strncmp(http_css, ptr, 4) == 0)

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_css);

+	}

+	else if(strncmp(http_png, ptr, 4) == 0)

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_png);

+	}

+	else if(strncmp(http_gif, ptr, 4) == 0)

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_gif);

+	}

+	else if(strncmp(http_jpg, ptr, 4) == 0)

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_jpg);

+	}

+	else

+	{

+		PSOCK_SEND_STR(&s->sout, http_content_type_plain);

+	}

+

+	PSOCK_END(&s->sout);

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static PT_THREAD(handle_output (struct httpd_state *s))

+{

+	/*~~~~~~~~~*/

+	char	*ptr;

+	/*~~~~~~~~~*/

+

+	PT_BEGIN(&s->outputpt);

+

+	if(!httpd_fs_open(s->filename, &s->file))

+	{

+		httpd_fs_open(http_404_html, &s->file);

+		strcpy(s->filename, http_404_html);

+		PT_WAIT_THREAD(&s->outputpt, send_headers(s, http_header_404));

+		PT_WAIT_THREAD(&s->outputpt, send_file(s));

+	}

+	else

+	{

+		PT_WAIT_THREAD(&s->outputpt, send_headers(s, http_header_200));

+		ptr = strchr(s->filename, ISO_period);

+		if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0)

+		{

+			vProcessInput( s->filename );

+			PT_INIT(&s->scriptpt);

+			PT_WAIT_THREAD(&s->outputpt, handle_script(s));

+		}

+		else

+		{

+			PT_WAIT_THREAD(&s->outputpt, send_file(s));

+		}

+	}

+

+	PSOCK_CLOSE(&s->sout);

+	PT_END(&s->outputpt);

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static PT_THREAD(handle_input (struct httpd_state *s))

+{

+	PSOCK_BEGIN(&s->sin);

+

+	PSOCK_READTO(&s->sin, ISO_space);

+

+	if(strncmp(s->inputbuf, http_get, 4) != 0)

+	{

+		PSOCK_CLOSE_EXIT(&s->sin);

+	}

+

+	PSOCK_READTO(&s->sin, ISO_space);

+

+	if(s->inputbuf[0] != ISO_slash)

+	{

+		PSOCK_CLOSE_EXIT(&s->sin);

+	}

+

+	if(s->inputbuf[1] == ISO_space)

+	{

+		strncpy(s->filename, http_index_html, sizeof(s->filename));

+	}

+	else

+	{

+		s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0;

+

+		/* Process any form input being sent to the server. */

+		{

+			/*

+			 * extern void vApplicationProcessFormInput( char *pcInputString, long

+			 * xInputLength ); £

+			 * vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) );

+			 */

+		}

+

+		strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename));

+	}

+

+	/* httpd_log_file(uip_conn->ripaddr, s->filename); */

+	s->state = STATE_OUTPUT;

+

+	while(1)

+	{

+		PSOCK_READTO(&s->sin, ISO_nl);

+

+		if(strncmp(s->inputbuf, http_referer, 8) == 0)

+		{

+			s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0;

+

+			/* httpd_log(&s->inputbuf[9]); */

+		}

+	}

+

+	PSOCK_END(&s->sin);

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+static void handle_connection(struct httpd_state *s)

+{

+	handle_input(s);

+	if(s->state == STATE_OUTPUT)

+	{

+		handle_output(s);

+	}

+}

+

+/*

+ =======================================================================================================================

+ =======================================================================================================================

+ */

+void httpd_appcall(void)

+{

+	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

+	struct httpd_state	*s = (struct httpd_state *) &(uip_conn->appstate);

+	/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

+

+	if(uip_closed() || uip_aborted() || uip_timedout())

+	{

+	}

+	else if(uip_connected())

+	{

+		PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1);

+		PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1);

+		PT_INIT(&s->outputpt);

+		s->state = STATE_WAITING;

+

+		/* timer_set(&s->timer, CLOCK_SECOND * 100); */

+		s->timer = 0;

+		handle_connection(s);

+	}

+	else if(s != NULL)

+	{

+		if(uip_poll())

+		{

+			++s->timer;

+			if(s->timer >= 20)

+			{

+				uip_abort();

+			}

+		}

+		else

+		{

+			s->timer = 0;

+		}

+

+		handle_connection(s);

+	}

+	else

+	{

+		uip_abort();

+	}

+}

+

+/*

+ =======================================================================================================================

+    \brief Initialize the web server This function initializes the web server and should be called at system boot-up.

+ =======================================================================================================================

+ */

+void httpd_init(void)

+{

+	uip_listen(HTONS(80));

+}

+

+/* @} */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.h
new file mode 100644
index 0000000..7f7a666
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.h
@@ -0,0 +1,62 @@
+/*

+ * Copyright (c) 2001-2005, Adam Dunkels.

+ * 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 uIP TCP/IP stack.

+ *

+ * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $

+ *

+ */

+

+#ifndef __HTTPD_H__

+#define __HTTPD_H__

+

+#include "psock.h"

+#include "httpd-fs.h"

+

+struct httpd_state {

+  unsigned char timer;

+  struct psock sin, sout;

+  struct pt outputpt, scriptpt;

+  char inputbuf[50];

+  char filename[20];

+  char state;

+  struct httpd_fs_file file;

+  int len;

+  char *scriptptr;

+  int scriptlen;

+  

+  unsigned short count;

+};

+

+void httpd_init(void);

+void httpd_appcall(void);

+

+void httpd_log(char *msg);

+void httpd_log_file(u16_t *requester, char *file);

+

+#endif /* __HTTPD_H__ */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makefsdata b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makefsdata
new file mode 100644
index 0000000..8d2715a
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makefsdata
@@ -0,0 +1,78 @@
+#!/usr/bin/perl

+

+open(OUTPUT, "> httpd-fsdata.c");

+

+chdir("httpd-fs");

+

+opendir(DIR, ".");

+@files =  grep { !/^\./ && !/(CVS|~)/ } readdir(DIR);

+closedir(DIR);

+

+foreach $file (@files) {  

+   

+    if(-d $file && $file !~ /^\./) {

+	print "Processing directory $file\n";

+	opendir(DIR, $file);

+	@newfiles =  grep { !/^\./ && !/(CVS|~)/ } readdir(DIR);

+	closedir(DIR);

+	printf "Adding files @newfiles\n";

+	@files = (@files, map { $_ = "$file/$_" } @newfiles);

+	next;

+    }

+}

+

+foreach $file (@files) {

+    if(-f $file) {

+	

+	print "Adding file $file\n";

+	

+	open(FILE, $file) || die "Could not open file $file\n";

+

+	$file =~ s-^-/-;

+	$fvar = $file;

+	$fvar =~ s-/-_-g;

+	$fvar =~ s-\.-_-g;

+	# for AVR, add PROGMEM here

+	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 "0};\n\n");

+	close(FILE);

+	push(@fvars, $fvar);

+	push(@pfiles, $file);

+    }

+}

+

+for($i = 0; $i < @fvars; $i++) {

+    $file = $pfiles[$i];

+    $fvar = $fvars[$i];

+

+    if($i == 0) {

+        $prevfile = "NULL";

+    } else {

+        $prevfile = "file" . $fvars[$i - 1];

+    }

+    print(OUTPUT "const struct httpd_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 HTTPD_FS_ROOT file$fvars[$i - 1]\n\n");

+print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n");

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makestrings b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makestrings
new file mode 100644
index 0000000..8a13c6d
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makestrings
@@ -0,0 +1,40 @@
+#!/usr/bin/perl

+

+

+sub stringify {

+  my $name = shift(@_);

+  open(OUTPUTC, "> $name.c");

+  open(OUTPUTH, "> $name.h");

+  

+  open(FILE, "$name");

+  

+  while(<FILE>) {

+    if(/(.+) "(.+)"/) {

+      $var = $1;

+      $data = $2;

+      

+      $datan = $data;

+      $datan =~ s/\\r/\r/g;

+      $datan =~ s/\\n/\n/g;

+      $datan =~ s/\\01/\01/g;      

+      $datan =~ s/\\0/\0/g;

+      

+      printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1);

+      printf(OUTPUTC "/* \"$data\" */\n");

+      printf(OUTPUTC "{");

+      for($j = 0; $j < length($datan); $j++) {

+	printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1)));

+      }

+      printf(OUTPUTC "};\n");

+      

+      printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1);

+      

+    }

+  }

+  close(OUTPUTC);

+  close(OUTPUTH);

+}

+stringify("http-strings");

+

+exit 0;

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.c b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.c
new file mode 100644
index 0000000..4f2d2a8
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.c
@@ -0,0 +1,197 @@
+/*

+ * Modified from an original work that is Copyright (c) 2001-2003, Adam Dunkels.

+ * 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 uIP TCP/IP stack.

+ *

+ * $Id: main.c,v 1.10.2.4 2003/10/21 21:27:51 adam Exp $

+ *

+ */

+

+/* Standard includes. */

+#include <stdlib.h>

+#include <string.h>

+#include <stdio.h>

+

+/* Scheduler includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "semphr.h"

+

+/* uip includes. */

+#include "uip.h"

+#include "uip_arp.h"

+#include "httpd.h"

+#include "timer.h"

+#include "clock-arch.h"

+

+/* Demo includes. */

+#include "SAM7_EMAC.h"

+#include "partest.h"

+

+/* How long to wait before attempting to connect the MAC again. */

+#define uipINIT_WAIT    ( 100 / portTICK_RATE_MS )

+

+/* Shortcut to the header within the Rx buffer. */

+#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])

+

+/* The semaphore used by the ISR to wake the uIP task. */

+static xSemaphoreHandle xEMACSemaphore;

+

+/*-----------------------------------------------------------*/

+

+void vuIP_Task( void *pvParameters )

+{

+portBASE_TYPE i;

+uip_ipaddr_t xIPAddr;

+struct timer periodic_timer, arp_timer;

+

+	/* Initialise the uIP stack. */

+	timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );

+	timer_set( &arp_timer, configTICK_RATE_HZ * 10 );

+	uip_init();

+	uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );

+	uip_sethostaddr( xIPAddr );

+	httpd_init();

+

+	/* Initialise the MAC. */

+	do

+    {

+		vTaskDelay( uipINIT_WAIT );

+		xEMACSemaphore = xEMACInit();        

+    } while( xEMACSemaphore == NULL );

+

+	for( ;; )

+	{

+		/* Is there received data ready to be processed? */

+		uip_len = ulEMACPoll();

+		

+		if( uip_len > 0 )

+		{

+			/* Standard uIP loop taken from the uIP manual. */

+			if( xHeader->type == htons( UIP_ETHTYPE_IP ) )

+			{

+				uip_arp_ipin();

+				uip_input();

+

+				/* If the above function invocation resulted in data that 

+				should be sent out on the network, the global variable 

+				uip_len is set to a value > 0. */

+				if( uip_len > 0 )

+				{

+					uip_arp_out();

+					lEMACSend();

+				}

+			}

+			else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )

+			{

+				uip_arp_arpin();

+

+				/* If the above function invocation resulted in data that 

+				should be sent out on the network, the global variable 

+				uip_len is set to a value > 0. */

+				if( uip_len > 0 )

+				{

+					lEMACSend();

+				}

+			}

+		}

+		else

+		{

+			if( timer_expired( &periodic_timer ) )

+			{

+				timer_reset( &periodic_timer );

+				for( i = 0; i < UIP_CONNS; i++ )

+				{

+					uip_periodic( i );

+	

+					/* If the above function invocation resulted in data that 

+					should be sent out on the network, the global variable 

+					uip_len is set to a value > 0. */

+					if( uip_len > 0 )

+					{

+						uip_arp_out();

+						lEMACSend();

+					}

+				}	

+	

+				/* Call the ARP timer function every 10 seconds. */

+				if( timer_expired( &arp_timer ) )

+				{

+					timer_reset( &arp_timer );

+					uip_arp_timer();

+				}

+			}

+			else

+			{			

+				/* We did not receive a packet, and there was no periodic

+				processing to perform.  Block for a fixed period.  If a packet

+				is received during this period we will be woken by the ISR

+				giving us the Semaphore. */

+				xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );			

+			}

+		}

+	}

+}

+/*-----------------------------------------------------------------------------------*/

+

+void clock_init(void)

+{

+	/* This is done when the scheduler starts. */

+}

+/*-----------------------------------------------------------*/

+

+clock_time_t clock_time( void )

+{

+	return xTaskGetTickCount();

+}

+/*-----------------------------------------------------------*/

+

+void vProcessInput( char *pcInput )

+{

+char *c;

+

+	/* Turn the LED on or off depending on the checkbox status. */

+

+	c = strstr( pcInput, "?" );

+	if( c )

+	{

+		if( strstr( c, "LED0=1" ) != NULL )

+		{

+			vParTestSetLED( 3, 0 );

+		}

+		else

+		{

+			vParTestSetLED( 3, 1 );

+		}		

+	}

+}

+

+

+

+

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.h
new file mode 100644
index 0000000..ec26fb7
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.h
@@ -0,0 +1,61 @@
+/*

+    FreeRTOS V7.1.0 - 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 UIP_TASK_H

+#define UIP_TASK_H

+

+/* The task that handles all uIP data. */

+void vuIP_Task( void *pvParameters );

+

+#endif

+

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uip-conf.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uip-conf.h
new file mode 100644
index 0000000..3e6f7f3
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uip-conf.h
@@ -0,0 +1,157 @@
+/**

+ * \addtogroup uipopt

+ * @{

+ */

+

+/**

+ * \name Project-specific configuration options

+ * @{

+ *

+ * uIP has a number of configuration options that can be overridden

+ * for each project. These are kept in a project-specific uip-conf.h

+ * file and all configuration names have the prefix UIP_CONF.

+ */

+

+/*

+ * Copyright (c) 2006, 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 uIP TCP/IP stack

+ *

+ * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $

+ */

+

+/**

+ * \file

+ *         An example uIP configuration file

+ * \author

+ *         Adam Dunkels <adam@sics.se>

+ */

+

+#ifndef __UIP_CONF_H__

+#define __UIP_CONF_H__

+

+#include <stdint.h>

+

+/**

+ * 8 bit datatype

+ *

+ * This typedef defines the 8-bit type used throughout uIP.

+ *

+ * \hideinitializer

+ */

+typedef uint8_t u8_t;

+

+/**

+ * 16 bit datatype

+ *

+ * This typedef defines the 16-bit type used throughout uIP.

+ *

+ * \hideinitializer

+ */

+typedef uint16_t u16_t;

+

+/**

+ * Statistics datatype

+ *

+ * This typedef defines the dataype used for keeping statistics in

+ * uIP.

+ *

+ * \hideinitializer

+ */

+typedef unsigned short uip_stats_t;

+

+/**

+ * Maximum number of TCP connections.

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_MAX_CONNECTIONS 40

+

+/**

+ * Maximum number of listening TCP ports.

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_MAX_LISTENPORTS 40

+

+/**

+ * uIP buffer size.

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_BUFFER_SIZE     1480

+

+/**

+ * CPU byte order.

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_BYTE_ORDER      LITTLE_ENDIAN

+

+/**

+ * Logging on or off

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_LOGGING         0

+

+/**

+ * UDP support on or off

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_UDP             0

+

+/**

+ * UDP checksums on or off

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_UDP_CHECKSUMS   1

+

+/**

+ * uIP statistics on or off

+ *

+ * \hideinitializer

+ */

+#define UIP_CONF_STATISTICS      1

+

+/* Here we include the header file for the application(s) we use in

+   our project. */

+/*#include "smtp.h"*/

+/*#include "hello-world.h"*/

+/*#include "telnetd.h"*/

+#include "webserver.h"

+/*#include "dhcpc.h"*/

+/*#include "resolv.h"*/

+/*#include "webclient.h"*/

+

+#endif /* __UIP_CONF_H__ */

+

+/** @} */

+/** @} */

diff --git a/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/webserver.h b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/webserver.h
new file mode 100644
index 0000000..1acb290
--- /dev/null
+++ b/20120401V7.1.1-RC1/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/webserver.h
@@ -0,0 +1,49 @@
+/*

+ * Copyright (c) 2002, Adam Dunkels.

+ * 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 uIP TCP/IP stack

+ *

+ * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $

+ *

+ */

+#ifndef __WEBSERVER_H__

+#define __WEBSERVER_H__

+

+#include "httpd.h"

+

+typedef struct httpd_state uip_tcp_appstate_t;

+/* UIP_APPCALL: the name of the application function. This function

+   must return void and take no arguments (i.e., C type "void

+   appfunc(void)"). */

+#ifndef UIP_APPCALL

+#define UIP_APPCALL     httpd_appcall

+#endif

+

+

+#endif /* __WEBSERVER_H__ */