From: RichardBarry Date: Wed, 21 Nov 2007 18:29:41 +0000 (+0000) Subject: Add the SAM7X Eclipse files. X-Git-Tag: V4.7.0~7 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=bbb7ed1854d15f1529e1d3c4bd70c84ccb1a36fa;p=freertos Add the SAM7X Eclipse files. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@117 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.lock b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.lock new file mode 100644 index 000000000..e69de29bb diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.core/.log b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 000000000..128e868b5 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -0,0 +1,17 @@ +*** SESSION Sep 07, 2007 11:40:29.515 ------------------------------------------ +*** SESSION Sep 26, 2007 20:59:04.640 ------------------------------------------ +*** SESSION Sep 27, 2007 17:22:58.687 ------------------------------------------ +*** SESSION Oct 04, 2007 20:29:08.859 ------------------------------------------ +*** SESSION Oct 23, 2007 19:47:01.875 ------------------------------------------ +*** SESSION Oct 23, 2007 21:13:26.296 ------------------------------------------ +*** SESSION Oct 23, 2007 21:22:16.187 ------------------------------------------ +*** SESSION Oct 28, 2007 12:37:13.93 ------------------------------------------- +*** SESSION Nov 06, 2007 16:04:46.31 ------------------------------------------- +*** SESSION Nov 06, 2007 20:19:12.359 ------------------------------------------ +*** SESSION Nov 07, 2007 18:40:55.281 ------------------------------------------ +*** SESSION Nov 13, 2007 20:49:09.875 ------------------------------------------ +*** SESSION Nov 17, 2007 17:59:26.734 ------------------------------------------ +*** SESSION Nov 17, 2007 19:36:59.656 ------------------------------------------ +*** SESSION Nov 21, 2007 08:36:47.312 ------------------------------------------ +*** SESSION Nov 21, 2007 15:42:29.171 ------------------------------------------ +*** SESSION Nov 21, 2007 17:07:49.515 ------------------------------------------ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml new file mode 100644 index 000000000..c4b91cfab --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/.log b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/.log new file mode 100644 index 000000000..e69de29bb diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/RTOSDemo.sc b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/RTOSDemo.sc new file mode 100644 index 000000000..2a3f9d1a8 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/RTOSDemo.sc @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml new file mode 100644 index 000000000..9e62c4bb5 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.make.ui/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml new file mode 100644 index 000000000..5240b1825 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.ui/cHelpSettings.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 000000000..ab95b0564 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,12 @@ + +
+ + + + + +
+
+
+
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/64/history.index b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/64/history.index new file mode 100644 index 000000000..f57b88c62 Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/64/history.index differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/69/history.index b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/69/history.index new file mode 100644 index 000000000..fd79ef2da Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/69/history.index differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/b3/history.index b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/b3/history.index new file mode 100644 index 000000000..b648a4a60 Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/b3/history.index differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/history.index b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/history.index new file mode 100644 index 000000000..67cbcdf96 Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/history.index differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/properties.index b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/properties.index new file mode 100644 index 000000000..401e243bb Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.indexes/properties.index differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.markers b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.markers new file mode 100644 index 000000000..c4a7f2f91 Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.projects/RTOSDemo/.markers differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 000000000..25cb955ba --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 000000000..14ccfeddd Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 000000000..6b2aaa764 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/47.tree b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/47.tree new file mode 100644 index 000000000..68bdc1b42 Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.root/47.tree differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 000000000..44f79aa39 Binary files /dev/null and b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-RTOSDemo.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-RTOSDemo.prefs new file mode 100644 index 000000000..bb305ff00 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-RTOSDemo.prefs @@ -0,0 +1,3 @@ +#Sun Aug 19 15:20:24 BST 2007 +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 000000000..1c0fdf149 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,3 @@ +#Sun Aug 19 15:19:23 BST 2007 +org.eclipse.cdt.debug.core.cDebug.common_source_containers=\r\n\r\n\r\n\r\n +eclipse.preferences.version=1 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs new file mode 100644 index 000000000..d7fcb8db3 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs @@ -0,0 +1,5 @@ +#Tue Oct 23 21:13:09 BST 2007 +pref_state_memento.org.eclipse.cdt.debug.ui.ModulesView=\r\n +eclipse.preferences.version=1 +org.eclipse.debug.ui.DebugView.org.eclipse.cdt.debug.ui.cDebug.show_full_paths=true +org.eclipse.debug.ui.BreakpointView.org.eclipse.cdt.debug.ui.cDebug.show_full_paths=true diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 000000000..ab5a1605c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,3 @@ +#Wed Nov 21 16:20:43 GMT 2007 +eclipse.preferences.version=1 +properties/RTOSDemo.null.976634949/0.1109417601=\#\r\n\#Wed Nov 21 16\:20\:43 GMT 2007\r\n0.1109417601\=\\\#\\r\\n\\\#Wed Nov 21 16\\\:20\\\:43 GMT 2007\\r\\nrcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.1502006385\=\\\#\\r\\n\\\#Wed Nov 21 16\\\:20\\\:43 GMT 2007\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.1021181093\=\\\#\\r\\n\\\#Wed Nov 21 16\\\:20\\\:43 GMT 2007\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.164584712\=\\\#\\r\\n\\\#Wed Nov 21 16\\\:20\\\:43 GMT 2007\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.libs.260784574\=\\\#\\r\\n\\\#Wed Nov 21 16\\\:20\\\:43 GMT 2007\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.prefbase.toolchain.1816209921\=\\\#\\r\\n\\\#Wed Nov 21 16\\\:20\\\:43 GMT 2007\\r\\nrebuildState\\\=false\\r\\n\r\n diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 000000000..8a970dac4 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,12 @@ +#Thu Aug 23 20:22:58 BST 2007 +useQuickDiffPrefPage=true +closeBrackets=false +ensureNewlineAtEOF=true +useAnnotationsPrefPage=true +closeAngularBrackets=false +eclipse.preferences.version=1 +org.eclipse.cdt.ui.text.templates.custom= +hoverModifierMasks=org.eclipse.cdt.ui.BestMatchHover;0;org.eclipse.cdt.ui.CSourceHover;131072;org.eclipse.cdt.debug.internal.ui.editors.DebugTextHover;0;org.eclipse.cdt.ui.CDocHover;0;org.eclipse.cdt.ui.AnnotationHover;0; +hoverModifiers=org.eclipse.cdt.ui.BestMatchHover;0;org.eclipse.cdt.ui.CSourceHover;Shift;org.eclipse.cdt.debug.internal.ui.editors.DebugTextHover;\!0;org.eclipse.cdt.ui.CDocHover;\!0;org.eclipse.cdt.ui.AnnotationHover;\!0; +closeBraces=false +closeStrings=false diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..242e94194 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +#Fri Aug 31 14:25:00 BST 2007 +version=1 +eclipse.preferences.version=1 +pathvariable.FreeRTOS_ROOT=C\:/E/Dev/FreeRTOS +description.autobuilding=false diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 000000000..4e5b3d8cb --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,3 @@ +#Sat Nov 17 13:34:58 GMT 2007 +prefWatchExpressions=\r\n\r\n +eclipse.preferences.version=1 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 000000000..c88e84313 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,14 @@ +#Wed Nov 07 18:56:22 GMT 2007 +org.eclipse.debug.ui.PREF_FILTER_WORKING_SETS=false +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +org.eclipse.debug.ui.BreakpointView+org.eclipse.debug.ui.ShowSupportedBreakpointsAction=true +pref_state_memento.org.eclipse.debug.ui.VariableView=\r\n +pref_state_memento.org.eclipse.debug.ui.RegisterView=\r\n +org.eclipse.debug.ui.memory.columnSize\:org.eclipse.cdt.debug.core=4 +pref_state_memento.org.eclipse.debug.ui.ExpressionView=\r\n +org.eclipse.debug.ui.PREF_FILTER_LAUNCH_CLOSED=false +preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane| +org.eclipse.debug.ui.PREF_FILTER_LAUNCH_DELETED=false +eclipse.preferences.version=1 +org.eclipse.debug.ui.memory.rowSize\:org.eclipse.cdt.debug.core=16 +org.eclipse.debug.ui.user_view_bindings=\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.help.ui.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.help.ui.prefs new file mode 100644 index 000000000..8d1b31164 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.help.ui.prefs @@ -0,0 +1,7 @@ +#Sun Aug 26 17:32:13 BST 2007 +browser.x=177 +browser.w=1024 +eclipse.preferences.version=1 +browser.h=768 +browser.maximized=false +browser.y=128 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs new file mode 100644 index 000000000..2426c2b79 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs @@ -0,0 +1,3 @@ +#Sun Aug 19 19:39:29 BST 2007 +org.eclipse.search.defaultPerspective=org.eclipse.search.defaultPerspective.none +eclipse.preferences.version=1 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs new file mode 100644 index 000000000..06f8f1043 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.ui.prefs @@ -0,0 +1,3 @@ +#Fri Aug 31 18:19:04 BST 2007 +eclipse.preferences.version=1 +org.eclipse.team.ui.first_time=false diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 000000000..1affd268e --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,3 @@ +#Sun Aug 19 20:45:57 BST 2007 +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 000000000..b96f5d0dd --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,4 @@ +#Tue Nov 06 22:57:01 GMT 2007 +eclipse.preferences.version=1 +tipsAndTricks=true +platformState=1187207632259 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 000000000..3e5b2b17d --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,3 @@ +#Sun Aug 19 20:45:58 BST 2007 +eclipse.preferences.version=1 +showIntro=false diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 000000000..06cd1e9cd --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,3 @@ +#Mon Aug 20 21:59:49 BST 2007 +eclipse.preferences.version=1 +org.eclipse.ui.commands=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/OpenOCD Programmer.launch b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/OpenOCD Programmer.launch new file mode 100644 index 000000000..822c04f0c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/OpenOCD Programmer.launch @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/OpenOCD Server.launch b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/OpenOCD Server.launch new file mode 100644 index 000000000..6a59edf70 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/OpenOCD Server.launch @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.elf.launch b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.elf.launch new file mode 100644 index 000000000..1c911f23d --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.elf.launch @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch new file mode 100644 index 000000000..fca7b0ac4 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 000000000..4e6586f56 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,41 @@ + +
+
+ + + + + +
+
+ + + + + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 000000000..aa1b7aaee --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/dialog_settings.xml new file mode 100644 index 000000000..1ef2b05b5 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/dialog_settings.xml @@ -0,0 +1,3 @@ + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/Default.pref b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/Default.pref new file mode 100644 index 000000000..fc158177d --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/Default.pref @@ -0,0 +1,2 @@ +#Sun Aug 26 17:54:18 BST 2007 +__DEFAULT__=true diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/relative_path.hist b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/relative_path.hist new file mode 100644 index 000000000..713e72168 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/relative_path.hist @@ -0,0 +1,4 @@ +#Sun Aug 26 17:36:29 BST 2007 +__DEFAULT__=false +org.eclipse.help.ui.localSearch.master=true +expression=relative path diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/working_set.hist b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/working_set.hist new file mode 100644 index 000000000..197837b95 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/working_set.hist @@ -0,0 +1,4 @@ +#Sun Aug 26 17:29:25 BST 2007 +__DEFAULT__=false +org.eclipse.help.ui.localSearch.master=true +expression=working set diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/working_sets.hist b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/working_sets.hist new file mode 100644 index 000000000..a88e15eb8 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.help.ui/scope_sets/working_sets.hist @@ -0,0 +1,4 @@ +#Sun Aug 26 17:54:21 BST 2007 +__DEFAULT__=false +org.eclipse.help.ui.localSearch.master=true +expression=working sets diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 000000000..ac671478c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,6 @@ + +
+
+ +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.search/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.search/dialog_settings.xml new file mode 100644 index 000000000..839aca5ed --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.search/dialog_settings.xml @@ -0,0 +1,46 @@ + +
+
+ +
+
+ + + + + +
+
+ + + + + + + + +
+
+ +
+
+ + + + +
+ + + + + + + + + +
+
+
+ +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.cheatsheets/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.cheatsheets/dialog_settings.xml new file mode 100644 index 000000000..1df8b48c3 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.cheatsheets/dialog_settings.xml @@ -0,0 +1,10 @@ + +
+
+ + + + + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 000000000..070a4abfc --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,26 @@ + +
+
+ + +
+
+
+
+
+
+ + + + + +
+
+ + + + + + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml new file mode 100644 index 000000000..d3014f5c1 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.intro/dialog_settings.xml @@ -0,0 +1,4 @@ + +
+ +
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml new file mode 100644 index 000000000..e891f2879 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench.texteditor/dialog_settings.xml @@ -0,0 +1,38 @@ + +
+
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 000000000..77beade3e --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,19 @@ + +
+
+ + +
+
+ + + + +
+
+ + + + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml new file mode 100644 index 000000000..97c7cfce9 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workbench.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 000000000..a34189f07 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui/dialog_settings.xml new file mode 100644 index 000000000..64561b65c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.ui/dialog_settings.xml @@ -0,0 +1,10 @@ + +
+
+ + + + + +
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.update.ui/dialog_settings.xml b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.update.ui/dialog_settings.xml new file mode 100644 index 000000000..86928e08c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.plugins/org.eclipse.update.ui/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/version.ini b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/version.ini new file mode 100644 index 000000000..c51ff745b --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/version.ini @@ -0,0 +1 @@ +org.eclipse.core.runtime=1 \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.cproject b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.cproject new file mode 100644 index 000000000..bbcae405f --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.cproject @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.project b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.project new file mode 100644 index 000000000..b3776decb --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.project @@ -0,0 +1,97 @@ + + + RTOSDemo + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/RTOSDemo} + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + false + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + ?children? + ?name?=outputEntries\|?children?=?name?=entry\\\\\\\\\\\\\\\|\\\\\\\|\|| + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.cnature + + + + Common Demo Files + 2 + FreeRTOS_ROOT/Demo/Common + + + FreeRTOS.org Source + 2 + FreeRTOS_ROOT/Source + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.settings/org.eclipse.ltk.core.refactoring.prefs b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/.settings/org.eclipse.ltk.core.refactoring.prefs new file mode 100644 index 000000000..a9f7e81cf --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/FreeRTOSConfig.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/FreeRTOSConfig.h new file mode 100644 index 000000000..1f4221194 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/FreeRTOSConfig.h @@ -0,0 +1,99 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#include +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 47923200 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile new file mode 100644 index 000000000..8b486a147 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/Makefile @@ -0,0 +1,132 @@ +# FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. +# +# This file is part of the FreeRTOS.org distribution. +# +# FreeRTOS.org is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# FreeRTOS.org 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 +# along with FreeRTOS.org; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# A special exception to the GPL can be applied should you wish to distribute +# a combined work that includes FreeRTOS.org, without being obliged to provide +# the source code for any proprietary components. See the licensing section +# of http://www.FreeRTOS.org for full details of how and when the exception +# can be applied. +# +# *************************************************************************** +# See http://www.FreeRTOS.org for documentation, latest information, license +# and contact details. Please ensure to read the configuration and relevant +# port sections of the online documentation. +# *************************************************************************** + + +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 + +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 + +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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/ParTest/ParTest.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/ParTest/ParTest.c new file mode 100644 index 000000000..3ef97ab39 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/ParTest/ParTest.c @@ -0,0 +1,101 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +/* 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 portLONG 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Board.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Board.h new file mode 100644 index 000000000..8b34427a0 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup.s79 b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup.s79 new file mode 100644 index 000000000..b875618fc --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup_SAM7.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Cstartup_SAM7.c new file mode 100644 index 000000000..d9716c0ef --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Emac.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/Emac.h new file mode 100644 index 000000000..7551a3648 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/mii.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/SrcAtmel/mii.h new file mode 100644 index 000000000..29b2f53d5 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.c new file mode 100644 index 000000000..21a80cc84 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.c @@ -0,0 +1,1164 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +/* + 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 + +/* 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 portLONG ) 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 portLONG ) 0x0f ) +#define usbDATA_INC ( ( portCHAR ) 5 ) +#define usbEXPECTED_NUMBER_OF_BYTES ( ( unsigned portLONG ) 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 portCHAR ucReqType; + unsigned portCHAR ucRequest; + unsigned portSHORT usValue; + unsigned portSHORT usIndex; + unsigned portSHORT 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 portCHAR ucTxBuffer[ usbMAX_TX_MESSAGE_SIZE ]; + unsigned portLONG ulNextCharIndex; + unsigned portLONG 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 portCHAR *pucData, unsigned portSHORT usRequestedLength, unsigned portLONG ulLengthLeftToSend, portLONG 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 portCHAR *cVal, unsigned portLONG ulInput, unsigned portLONG ulSwitch1, unsigned portLONG ulSwitch2 ); +/*-----------------------------------------------------------*/ + +/* + - DESCRIPTOR DEFINITIONS - +*/ + +/* String descriptors used during the enumeration process. +These take the form: + +{ + Length of descriptor, + Descriptor type, + Data +} +*/ +const portCHAR pxLanguageStringDescriptor[] = +{ + 4, + usbDESCRIPTOR_TYPE_STRING, + 0x09, 0x04 +}; + +const portCHAR pxManufacturerStringDescriptor[] = +{ + 18, + usbDESCRIPTOR_TYPE_STRING, + + 'F', 0x00, + 'r', 0x00, + 'e', 0x00, + 'e', 0x00, + 'R', 0x00, + 'T', 0x00, + 'O', 0x00, + 'S', 0x00 +}; + +const portCHAR 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 portCHAR 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 portCHAR 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 portCHAR 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 portCHAR ucUSBConfig = ( unsigned portCHAR ) 0; +static unsigned portLONG ulReceivedAddress = ( unsigned portLONG ) 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 portCHAR *cVal, unsigned portLONG ulInput, unsigned portLONG ulSwitch1, unsigned portLONG ulSwitch2 ) +{ +const portCHAR 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 portCHAR x = 0, y = 0, z = 0; +unsigned portLONG 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 portLONG 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 portLONG 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 portLONG ulTemp; + + eDriverState = eJUST_RESET; + + /* Reset all the end points. */ + AT91C_BASE_UDP->UDP_RSTEP = usbEND_POINT_RESET_MASK; + AT91C_BASE_UDP->UDP_RSTEP = ( unsigned portLONG ) 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 portLONG ) ( 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 portLONG 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 portLONG ) 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 portCHAR ucRequest; + unsigned portLONG 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 portCHAR * ) &pxDeviceDescriptor, pxRequest->usLength, sizeof( pxDeviceDescriptor ), pdTRUE ); + break; + + case usbDESCRIPTOR_TYPE_CONFIGURATION: + prvSendControlData( ( unsigned portCHAR * ) &( 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 portCHAR * ) &pxLanguageStringDescriptor, pxRequest->usLength, sizeof(pxLanguageStringDescriptor), pdTRUE ); + break; + + case usbMANUFACTURER_STRING: + prvSendControlData( ( unsigned portCHAR * ) &pxManufacturerStringDescriptor, pxRequest->usLength, sizeof( pxManufacturerStringDescriptor ), pdTRUE ); + break; + + case usbPRODUCT_STRING: + prvSendControlData( ( unsigned portCHAR * ) &pxProductStringDescriptor, pxRequest->usLength, sizeof( pxProductStringDescriptor ), pdTRUE ); + break; + + case usbCONFIGURATION_STRING: + prvSendControlData( ( unsigned portCHAR * ) &pxConfigurationStringDescriptor, pxRequest->usLength, sizeof( pxConfigurationStringDescriptor ), pdTRUE ); + break; + + case usbINTERFACE_STRING: + prvSendControlData( ( unsigned portCHAR * ) &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 portSHORT usStatus = 0; + + switch( pxRequest->ucRequest ) + { + case usbGET_STATUS_REQUEST: + /* Just send two byte dummy status. */ + prvSendControlData( ( unsigned portCHAR * ) &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 portCHAR * ) &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 portLONG ) 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 portCHAR ) ( 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 portSHORT ) 0xff00 ) >> 8 ) + { + case usbHID_REPORT_DESCRIPTOR: + prvSendControlData( ( unsigned portCHAR * ) pxReportDescriptor, pxRequest->usLength, sizeof( pxReportDescriptor ), pdTRUE ); + break; + + default: + + /* Don't expect to send any others. */ + prvSendStall(); + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvHandleStandardInterfaceRequest( xUSB_REQUEST *pxRequest ) +{ +unsigned portSHORT usStatus = 0; + + switch( pxRequest->ucRequest ) + { + case usbGET_STATUS_REQUEST: + /* Send dummy 2 bytes. */ + prvSendControlData( ( unsigned portCHAR * ) &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 portLONG ulTemp; + + /* Initialise a few state variables. */ + pxCharsForTx.ulNextCharIndex = ( unsigned portLONG ) 0; + ucUSBConfig = ( unsigned portCHAR ) 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 portLONG ) 0xffffffff; + AT91C_BASE_UDP->UDP_ICR = ( unsigned portLONG ) 0xffffffff; + AT91C_BASE_UDP->UDP_CSR[ 0 ] = ( unsigned portLONG ) 0x00; + AT91C_BASE_UDP->UDP_CSR[ 1 ] = ( unsigned portLONG ) 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 portCHAR *pucData, unsigned portSHORT usRequestedLength, unsigned portLONG ulLengthToSend, portLONG lSendingDescriptor ) +{ + if( ( ( unsigned portLONG ) usRequestedLength < ulLengthToSend ) ) + { + /* Cap the data length to that requested. */ + ulLengthToSend = ( unsigned portSHORT ) usRequestedLength; + } + else if( ( ulLengthToSend < ( unsigned portLONG ) 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 portLONG ) 0; + + /* Send the first 8 bytes now. The rest will get sent in response to + TXCOMP interrupts. */ + prvSendNextSegment(); +} +/*-----------------------------------------------------------*/ + +static void prvSendNextSegment( void ) +{ +volatile unsigned portLONG 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 portLONG ) 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 portLONG ) 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.h new file mode 100644 index 000000000..4e33db00f --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USBSample.h @@ -0,0 +1,84 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +#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 portLONG ) 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 portLONG ulISR; + unsigned portLONG ulCSR0; + unsigned portCHAR 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 portLONG * ) pulValueNow ) ) |= ( unsigned portLONG ) 0x4f; \ + \ + /* Clear the FORCE_STALL and TXPKTRDY bits */ \ + /* so the write has no effect. */ \ + ( * ( ( unsigned portLONG * ) pulValueNow ) ) &= ( unsigned portLONG ) 0xffffffcf; \ + \ + /* Set whichever bit we want set. */ \ + ( * ( ( unsigned portLONG * ) 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c new file mode 100644 index 000000000..d37c5a939 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/USB/USB_ISR.c @@ -0,0 +1,180 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +/* 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 portLONG * ) pulValueNow ) ) |= ( unsigned portLONG ) 0x4f; \ + \ + /* Clear the FORCE_STALL and TXPKTRDY bits */ \ + /* so the write has no effect. */ \ + ( * ( ( unsigned portLONG * ) pulValueNow ) ) &= ( unsigned portLONG ) 0xffffffcf; \ + \ + /* Clear whichever bit we want clear. */ \ + ( * ( ( unsigned portLONG * ) 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 ); + +/*-----------------------------------------------------------*/ + +/* 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 xTaskWokenByPost = pdFALSE; +static volatile unsigned portLONG ulNextMessage = 0; +xISRStatus *pxMessage; +unsigned portLONG 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. */ + xTaskWokenByPost = xQueueSendFromISR( xUSBInterruptQueue, &pxMessage, xTaskWokenByPost ); + + /* 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( xTaskWokenByPost ) + { + 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. */ + 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld new file mode 100644 index 000000000..db22b4acd --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/atmel-rom.ld @@ -0,0 +1,49 @@ +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 : + { + __data_beg__ = .; + __data_beg_src__ = __end_of_text__; + *(.data) + __data_end__ = .; + } >ram AT>flash + + .bss : + { + __bss_beg__ = .; + *(.bss) + } >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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/boot.s b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/boot.s new file mode 100644 index 000000000..1d4dfdf0e --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/main.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/main.c new file mode 100644 index 000000000..618e2d60c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/main.c @@ -0,0 +1,236 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +/* + 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 + +/* 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 portLONG 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 portLONG 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 portLONG 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c new file mode 100644 index 000000000..dc0423892 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/EMAC_ISR.c @@ -0,0 +1,101 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +#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 ); + +static xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void vPassEMACSemaphore( xSemaphoreHandle xSemaphore ) +{ + xEMACSemaphore = xSemaphore; +} +/*-----------------------------------------------------------*/ + +void vEMACISR_Handler( void ) +{ +volatile unsigned portLONG ulIntStatus, ulRxStatus; +portBASE_TYPE xSwitchRequired = 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. */ + xSwitchRequired = xSemaphoreGiveFromISR( xEMACSemaphore, pdFALSE ); + AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_REC; + } + + /* Clear the interrupt. */ + AT91C_BASE_AIC->AIC_EOICR = 0; + + /* Switch to the uIP task. */ + if( xSwitchRequired ) + { + /* 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. */ + vEMACISR_Handler(); + + /* Restore the context of whichever task is the next to run. */ + portRESTORE_CONTEXT(); +} + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/Makefile.webserver b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/Makefile.webserver new file mode 100644 index 000000000..f38c47a72 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.c new file mode 100644 index 000000000..1b304fae6 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.c @@ -0,0 +1,674 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +/* Standard includes. */ +#include + +/* 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 portLONG ) 0xFFFFFFFC ) + +/* Bit used within the address stored in the descriptor to mark the last +descriptor in the array. */ +#define emacRX_WRAP_BIT ( ( unsigned portLONG ) 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 portLONG ) 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 portLONG ) 0xA5000000 ) +#define emacRESET_LENGTH ( ( unsigned portLONG ) ( 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 portLONG ) AT91C_PB2_ETX0 ) | \ + ( ( unsigned portLONG ) AT91C_PB12_ETXER ) | \ + ( ( unsigned portLONG ) AT91C_PB16_ECOL ) | \ + ( ( unsigned portLONG ) AT91C_PB11_ETX3 ) | \ + ( ( unsigned portLONG ) AT91C_PB6_ERX1 ) | \ + ( ( unsigned portLONG ) AT91C_PB15_ERXDV ) | \ + ( ( unsigned portLONG ) AT91C_PB13_ERX2 ) | \ + ( ( unsigned portLONG ) AT91C_PB3_ETX1 ) | \ + ( ( unsigned portLONG ) AT91C_PB8_EMDC ) | \ + ( ( unsigned portLONG ) AT91C_PB5_ERX0 ) | \ + ( ( unsigned portLONG ) AT91C_PB14_ERX3 ) | \ + ( ( unsigned portLONG ) AT91C_PB4_ECRS_ECRSDV ) | \ + ( ( unsigned portLONG ) AT91C_PB1_ETXEN ) | \ + ( ( unsigned portLONG ) AT91C_PB10_ETX2 ) | \ + ( ( unsigned portLONG ) AT91C_PB0_ETXCK_EREFCK ) | \ + ( ( unsigned portLONG ) AT91C_PB9_EMDIO ) | \ + ( ( unsigned portLONG ) AT91C_PB7_ERXER ) | \ + ( ( unsigned portLONG ) 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 portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG *pulValue ); +#if USE_RMII_INTERFACE != 1 + static void vWritePHY( unsigned portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG 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 portCHAR 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 portCHAR 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 portCHAR 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 portLONG 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; +} +/*-----------------------------------------------------------*/ + +portLONG lEMACSend( void ) +{ +static unsigned portBASE_TYPE uxTxBufferIndex = 0; +portBASE_TYPE xWaitCycles = 0; +portLONG lReturn = pdPASS; +portCHAR *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 = ( portCHAR * ) 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 portLONG ) 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 portLONG ) AT91C_LENGTH_FRAME ) + | AT91C_LAST_BUFFER; + uxTxBufferIndex++; + } + + AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TSTART; + } + portEXIT_CRITICAL(); + } + + return lReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portLONG ulEMACPoll( void ) +{ +static unsigned portBASE_TYPE ulNextRxBuffer = 0; +unsigned portLONG ulSectionLength = 0, ulLengthSoFar = 0, ulEOF = pdFALSE; +portCHAR *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 = ( portCHAR * )( 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 portLONG ulAddress; + + /* Initialise xRxDescriptors descriptor. */ + for( xIndex = 0; xIndex < NB_RX_BUFFERS; ++xIndex ) + { + /* Calculate the address of the nth buffer within the array. */ + ulAddress = ( unsigned portLONG )( 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 portLONG )( 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 portLONG ) xRxDescriptors; + AT91C_BASE_EMAC->EMAC_TBQP = ( unsigned portLONG ) 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 portLONG ) cMACAddress[ 3 ] << 24 ) | + ( ( unsigned portLONG ) cMACAddress[ 2 ] << 16 ) | + ( ( unsigned portLONG ) cMACAddress[ 1 ] << 8 ) | + cMACAddress[ 0 ]; + + AT91C_BASE_EMAC->EMAC_SA1H = ( ( unsigned portLONG ) 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 portLONG 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 portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG *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 portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG 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 portLONG 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.h new file mode 100644 index 000000000..3231488a4 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/SAM7_EMAC.h @@ -0,0 +1,60 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +#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. + */ +portLONG lEMACSend( void ); + +/* + * Called in response to an EMAC Rx interrupt. Copies the received frame + * into the uIP buffer. + */ +unsigned portLONG ulEMACPoll( void ); + +#endif diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/clock-arch.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/clock-arch.h new file mode 100644 index 000000000..cde657b62 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/emac_atmel.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/emac_atmel.h new file mode 100644 index 000000000..7551a3648 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings new file mode 100644 index 000000000..0d3c30cdd --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.c new file mode 100644 index 000000000..ef7a41c7d --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/http-strings.h new file mode 100644 index 000000000..acbe7e17f --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.c new file mode 100644 index 000000000..43b7afba2 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.c @@ -0,0 +1,268 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * 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 +#include + +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, + "%d%u.%u.%u.%u:%u%s%u%u%c %c\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, "


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, + "LED DS4,"\ + "

", + 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-cgi.h new file mode 100644 index 000000000..7ae928321 --- /dev/null +++ b/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 + * + */ + + + +/* + * 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.c new file mode 100644 index 000000000..dc4aef011 --- /dev/null +++ b/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 + * + * $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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs.h new file mode 100644 index 000000000..b594eea56 --- /dev/null +++ b/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 + * + * $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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/404.html b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/404.html new file mode 100644 index 000000000..43e7f4cad --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.html b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.html new file mode 100644 index 000000000..1d3bbeee1 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml new file mode 100644 index 000000000..0ce405ba0 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh evey 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml new file mode 100644 index 000000000..bacef5f7d --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED IO
+ +

+ +Use the check box to set the LED state, then click "Update IO" to send the new state to the microcontroller. + + +

+

+%! led-io +

+ +

+

+ + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml new file mode 100644 index 000000000..d762f40d8 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+ +
+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
+
%! net-stats
+
+
+ + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml new file mode 100644 index 000000000..654d61f21 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.c new file mode 100644 index 000000000..481f3af15 --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd-fsdata.h new file mode 100644 index 000000000..52d35c265 --- /dev/null +++ b/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 + * + * $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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.c new file mode 100644 index 000000000..5c0b40933 --- /dev/null +++ b/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 £ + * 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 + * $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 + +#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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/httpd.h new file mode 100644 index 000000000..7f7a6666e --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makefsdata b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makefsdata new file mode 100644 index 000000000..8d2715a8a --- /dev/null +++ b/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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makestrings b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/makestrings new file mode 100644 index 000000000..8a13c6d29 --- /dev/null +++ b/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() { + 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.c b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.c new file mode 100644 index 000000000..4f2d2a8bb --- /dev/null +++ b/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 +#include +#include + +/* 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.h new file mode 100644 index 000000000..3b9e73a8c --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uIP_Task.h @@ -0,0 +1,44 @@ +/* + FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org 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 + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com a version that has been certified for use + in safety critical systems, plus commercial licensing, development and + support options. + *************************************************************************** +*/ + +#ifndef UIP_TASK_H +#define UIP_TASK_H + +/* The task that handles all uIP data. */ +void vuIP_Task( void *pvParameters ); + +#endif + diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uip-conf.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/uip-conf.h new file mode 100644 index 000000000..3e6f7f381 --- /dev/null +++ b/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 + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 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/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/webserver.h b/Demo/ARM7_AT91SAM7X256_Eclipse/RTOSDemo/webserver/webserver.h new file mode 100644 index 000000000..1acb290b8 --- /dev/null +++ b/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__ */ diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/SAM7_flash.cfg b/Demo/ARM7_AT91SAM7X256_Eclipse/SAM7_flash.cfg new file mode 100644 index 000000000..2fb93b3dd --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/SAM7_flash.cfg @@ -0,0 +1,30 @@ +#daemon configuration +telnet_port 4444 +gdb_port 3333 + +#interface +interface parport +parport_port 0x378 +parport_cable wiggler +jtag_speed 2 + +#use combined on interfaces or targets that can't set TRST/SRST separately +reset_config trst_and_srst srst_pulls_trst + +#jtag scan chain +#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) +jtag_device 4 0x1 0xf 0xe + +#target configuration +daemon_startup reset + +#target +#target arm7tdmi +target arm7tdmi little run_and_init 0 arm7tdmi +run_and_halt_time 0 30 +working_area 0 0x40000000 0x40000 nobackup + +#flash configuration +flash bank at91sam7 0 0 0 0 0 + +target_script 0 reset program.script diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/SAM7_pp.cfg b/Demo/ARM7_AT91SAM7X256_Eclipse/SAM7_pp.cfg new file mode 100644 index 000000000..3cb965fec --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/SAM7_pp.cfg @@ -0,0 +1,26 @@ +#daemon configuration +telnet_port 4444 +gdb_port 3333 + +#interface +interface parport +parport_port 0x378 +parport_cable wiggler +jtag_speed 2 +reset_config srst_only + +#jtag scan chain +#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) +jtag_device 4 0x1 0xf 0xe + +#target configuration +daemon_startup reset + +#target +#target arm7tdmi +target arm7tdmi little reset_halt 0 arm7tdmi +target_script 0 reset at91sam7_ecr.script +working_area 0 0x40000000 0x40000 nobackup + +#flash configuration +flash bank at91sam7 0 0 0 0 0 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/at91sam7_ecr.cfg b/Demo/ARM7_AT91SAM7X256_Eclipse/at91sam7_ecr.cfg new file mode 100644 index 000000000..69a2d4d74 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/at91sam7_ecr.cfg @@ -0,0 +1,25 @@ +#daemon configuration +telnet_port 4444 +gdb_port 3333 + +#interface +interface at91rm9200 +at91rm9200_device rea_ecr +jtag_speed 0 +reset_config srst_only + +#jtag scan chain +#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) +jtag_device 4 0x1 0xf 0xe + +#target configuration +daemon_startup reset + +#target +#target arm7tdmi +target arm7tdmi little reset_halt 0 arm7tdmi +target_script 0 reset at91sam7_ecr.script +working_area 0 0x40000000 0x40000 nobackup + +#flash configuration +flash bank at91sam7 0 0 0 0 0 diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/at91sam7_ecr.script b/Demo/ARM7_AT91SAM7X256_Eclipse/at91sam7_ecr.script new file mode 100644 index 000000000..2d4738093 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/at91sam7_ecr.script @@ -0,0 +1,13 @@ +halt +wait_halt +sleep 10 +mww 0xfffffd44 0x00008000 # disable watchdog +mww 0xfffffd08 0xa5000001 # enable user reset +mww 0xfffffc20 0x00000601 # CKGR_MOR : enable the main oscillator +sleep 10 +mww 0xfffffc2c 0x12560a64 # CKGR_PLLR: 119.8MHz (DIV=100,MUL=598+1) +sleep 10 +mww 0xfffffc30 0x00000007 # PMC_MCKR : MCK = PLL / 2 = 59.9MHz +sleep 10 +mww 0xffffff60 0x003c0100 # MC_FMR: flash mode (FWS=1,FMCN=60) +arm7_9 force_hw_bkpts enable # program resides in flash diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/program.script b/Demo/ARM7_AT91SAM7X256_Eclipse/program.script new file mode 100644 index 000000000..a60e13571 --- /dev/null +++ b/Demo/ARM7_AT91SAM7X256_Eclipse/program.script @@ -0,0 +1,11 @@ +arm7_9 dcc_downloads enable +halt +wait_halt +sleep 10 +poll +flash probe 0 +#flash protect 0 0 26 'off' +flash erase 0 0 15 +flash write 0 ./RTOSDemo/RTOSDemo.bin 0x0 +sleep 10 +shutdown
LocalRemoteStateRetransmissionsTimerFlags