From 24f2951b050119459cd77ec123a510a5c67cb960 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 16 Feb 2016 18:38:57 +0000 Subject: [PATCH 001/144] Update CMSIS to 4.5 - checked implementation of osXxxxDef objects - need to add cpp define for __FPU_PRESENT because CMSIS code has changed and the FP checks on previous versions that produced warning are now errors --- CMSIS/ReadMe.md | 2 +- DeviceCode/Targets/OS/CMSIS_RTOS/CMSIS_RTOS.settings | 6 ++++-- DeviceCode/Targets/OS/CMSIS_RTOS/cmsis_os_cpp.h | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CMSIS/ReadMe.md b/CMSIS/ReadMe.md index d712fb476..72bcad7b0 100644 --- a/CMSIS/ReadMe.md +++ b/CMSIS/ReadMe.md @@ -2,6 +2,6 @@ This folder is a placeholder for the CMSIS source code installation. CMSIS is available from ARM on the [ARM web site](http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php) -CMSIS comes as a ZIP file, **_the version this code base is validated and tested with is v4.3 (CMSIS-SP-00300-r4p3-00rel0.zip)_** +CMSIS comes as a ZIP file, **_the version this code base is validated and tested with is v4.5 (CMSIS-SP-00300-r4p5-00rel0.zip)_** Extract the contents of the zip file into the same directory as this readme.md file. The build system will look for the CMSIS support files here. diff --git a/DeviceCode/Targets/OS/CMSIS_RTOS/CMSIS_RTOS.settings b/DeviceCode/Targets/OS/CMSIS_RTOS/CMSIS_RTOS.settings index cd7350d15..65dd7b457 100644 --- a/DeviceCode/Targets/OS/CMSIS_RTOS/CMSIS_RTOS.settings +++ b/DeviceCode/Targets/OS/CMSIS_RTOS/CMSIS_RTOS.settings @@ -1,4 +1,5 @@ - + + CMSIS_RTOS Thumb2 @@ -15,11 +16,12 @@ CMSIS_RTOS OS false - 4.3.0 + 4.5.0 + diff --git a/DeviceCode/Targets/OS/CMSIS_RTOS/cmsis_os_cpp.h b/DeviceCode/Targets/OS/CMSIS_RTOS/cmsis_os_cpp.h index d6a28c5b9..475c5651f 100644 --- a/DeviceCode/Targets/OS/CMSIS_RTOS/cmsis_os_cpp.h +++ b/DeviceCode/Targets/OS/CMSIS_RTOS/cmsis_os_cpp.h @@ -9,14 +9,14 @@ #error "Unsupported CMSIS version: This header requires a CMSIS-RTOS API implementation with at least version 1.2" #endif -#if !defined(osCMSIS_RTX) || osCMSIS_RTX != CMSIS_VERSION(4, 78) +#if !defined(osCMSIS_RTX) || osCMSIS_RTX != CMSIS_VERSION(4, 80) // unfortunately the implementation of the osXxxxDef and other similar macros // are implementation defined and, at least for CMSIS-RTX cannot be used to // declare a C++ data member. Thus, this header is specific to a particular // version of CMSIS-RTX and requires re-evaluation and verification on any // other versions. The structures can and have changed even on minor version // changes, so the check here is for an exact match on the supported version. -#error "Unsupported CMSIS-RTOS implementation: This header requires the CMSIS-RTX v4.78 implementation of the CMSIS-RTOS API" +#error "Unsupported CMSIS-RTOS implementation: This header requires the CMSIS-RTX v4.80 implementation of the CMSIS-RTOS API" #endif // The following two fields are culled from the CMSIS-RTX header implementation From b8e2035fd5b33291d86165666ebe0ad5d09943e9 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 16 Feb 2016 18:42:16 +0000 Subject: [PATCH 002/144] revert gitignore to match upstream dev --- .gitignore | 5 - Firmware License (Crypto).rtf | 466 +++++++++++++ License (Crypto).rtf | 466 +++++++++++++ PKCryptoWelcome.rtf | 1228 +++++++++++++++++++++++++++++++++ REDIST_CRYPTO.TXT | 83 +++ ReleaseNotesCrypto.txt | 96 +++ 6 files changed, 2339 insertions(+), 5 deletions(-) create mode 100644 Firmware License (Crypto).rtf create mode 100644 License (Crypto).rtf create mode 100644 PKCryptoWelcome.rtf create mode 100644 REDIST_CRYPTO.TXT create mode 100644 ReleaseNotesCrypto.txt diff --git a/.gitignore b/.gitignore index a15d34c63..a3b2312da 100644 --- a/.gitignore +++ b/.gitignore @@ -42,8 +42,3 @@ Listings/ *.axfdump /crypto/lib -Firmware License (Crypto).rtf -License (Crypto).rtf -PKCryptoWelcome.rtf -REDIST_CRYPTO.TXT -ReleaseNotesCrypto.txt diff --git a/Firmware License (Crypto).rtf b/Firmware License (Crypto).rtf new file mode 100644 index 000000000..de92090fc --- /dev/null +++ b/Firmware License (Crypto).rtf @@ -0,0 +1,466 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Wingdings 3};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ?????????\'a1\'ec?????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ?????????????????????????};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};} +{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Batang};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f293\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f294\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f296\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\f297\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f298\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f299\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\f300\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f301\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f313\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier};} +{\f314\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier};}{\f316\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier};}{\f317\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier};} +{\f318\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier};}{\f319\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier};}{\f320\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier};} +{\f321\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier};}{\f405\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f403\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} +{\f404\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f406\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f407\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} +{\f410\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f425\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ?????????\'a1\'ec?????};}{\f633\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};} +{\f634\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f636\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f637\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};} +{\f640\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f641\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};} +{\f673\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ?????????????????????????};}{\f674\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ?????????????????????????};} +{\f676\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ?????????????????????????};}{\f677\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ?????????????????????????};} +{\f678\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ?????????????????????????};}{\f679\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ?????????????????????????};} +{\f680\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ?????????????????????????};}{\f681\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ?????????????????????????};} +{\f682\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ?????????????????????????};}{\f683\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f684\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};} +{\f686\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}{\f687\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f690\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};} +{\f695\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f693\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f694\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f696\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f697\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f700\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f705\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Batang};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\snext0 \sautoupd \sqformat \spriority0 \styrsid10632156 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat \styrsid10632156 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext2 \slink16 \sqformat \styrsid10632156 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat \styrsid10632156 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext4 \slink18 \sqformat \styrsid10632156 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat \styrsid10632156 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar +\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext6 \slink20 \sqformat \styrsid10632156 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat \styrsid10632156 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar +\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext8 \slink22 \sqformat \styrsid10632156 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat \styrsid10632156 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid10632156 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 +\ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink2 \slocked \styrsid10632156 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink3 \slocked \styrsid10632156 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid10632156 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 +\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink5 \slocked \styrsid10632156 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink6 \slocked \styrsid10632156 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid10632156 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 +\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink8 \slocked \styrsid10632156 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink9 \slocked \styrsid10632156 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid10632156 Body 1;}{\s25\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 \styrsid10632156 +Bullet 2;}{\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \styrsid10632156 Bullet 4;}{\s27\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 Heading EULA;}{\s28\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 +Heading Software Title;}{\s29\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \styrsid10632156 Preamble;}{\s30\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon3 \snext30 \styrsid10632156 Heading 3 Bold;}{\s31\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon26 \snext31 \styrsid10632156 Bullet 4 Underline;}{\*\cs32 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \styrsid10632156 Body 2 Char;}{\*\cs33 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid10632156 Body 3 Char;}{\s34\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon29 \snext34 \styrsid10632156 +Preamble Border Above;}{\s35\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink36 \ssemihidden \styrsid10632156 annotation text;}{\*\cs36 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink35 \slocked \ssemihidden \styrsid10632156 Comment Text Char;}{\*\cs37 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \styrsid10632156 annotation reference;}{\*\cs38 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\ul\cf2 \sbasedon10 \styrsid10632156 Hyperlink;}{\s39\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 +\fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \slink40 \ssemihidden \sunhideused \styrsid10632156 Balloon Text;}{\*\cs40 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 +\fs16\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink39 \slocked \ssemihidden \styrsid10632156 Balloon Text Char;}}{\*\listtable{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s30\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel +\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 +\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 +\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s25\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 +\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s5\fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 +\s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0\hres0\chhres0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 +\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid-41362566\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s26\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}}{\*\listoverridetable{\listoverride\listid477573462\listoverridecount0\ls1} +{\listoverride\listid1559511898\listoverridecount0\ls2}{\listoverride\listid398796681\listoverridecount0\ls3}{\listoverride\listid752163927\listoverridecount0\ls4}}{\*\rsidtbl \rsid80797\rsid96267\rsid556931\rsid1649263\rsid1735106\rsid2981673\rsid3045873 +\rsid3046839\rsid3489817\rsid3496438\rsid3685900\rsid3897294\rsid4803141\rsid4882226\rsid5115434\rsid5532184\rsid5659162\rsid5993271\rsid6887591\rsid6892738\rsid7096544\rsid7232338\rsid7823532\rsid8085732\rsid8681548\rsid8800392\rsid9190636\rsid9579676 +\rsid9776685\rsid10632156\rsid10689454\rsid11026981\rsid11078160\rsid11808667\rsid11827439\rsid12520861\rsid12792726\rsid15140419\rsid15216572\rsid16342489}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 +\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author yonglee}{\operator yonglee}{\creatim\yr2010\mo5\dy3\hr18\min25}{\revtim\yr2010\mo5\dy4\hr13\min20}{\version5}{\edmins3}{\nofpages3}{\nofwords1464}{\nofchars7570}{\*\company Microsoft}{\nofcharsws9016} +{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\revisions\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot10632156\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid556931\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s27\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT SOFTWARE LICENSE TERMS +\par }\pard\plain \ltrpar\s28\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid11827439 \hich\af38\dbch\af13\loch\f38 CRYPTOGRAPHY LIBRARIES }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 FOR THE .NET MICRO FRAMEWORK }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 +\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the pre-release software named above, which includes the media on which you received it, if any +.\hich\af38\dbch\af13\loch\f38 The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid9776685 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 + +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 updates, +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 supplements, +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 Internet-based services, and +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 support services +\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +for this software, unless other terms accompany those items. If so, those terms apply. +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 By using the software, you accept these terms. If you\hich\af38\dbch\af13\loch\f38 do not accept them, do not use the software. +\par }\pard\plain \ltrpar\s34\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you comply with these license terms, you have the rights below. + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 GENERAL.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + The software consists of Microsoft cryptography libraries, to be used in conjunction with the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid556931 \hich\af38\dbch\af13\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 .NET Micro Framework, whic\hich\af38\dbch\af13\loch\f38 h is licensed under its own separate license.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 2.\tab}\hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 You }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 may install and use }{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid3045873 \hich\af38\dbch\af13\loch\f38 one copy}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 of the software }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +with each copy of the .NET Micro Framework you install }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 on your devices }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 to }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 design, develop and test your programs}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 and hardware devices (collectively, \'93\loch\f38 \hich\f38 your programs\'94\loch\f38 )}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 3.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\af3\hich\af3\dbch\af11\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 \hich\f38 You may copy and distribute the object code form of the software solely in conjunction with the Microsoft .NET Micro Framework runtime. For the purpose of this section, \'93 +\loch\f38 \hich\f38 .NET Micro Framework\'94\loch\f38 means the Microsoft .NET M\hich\af38\dbch\af11\loch\f38 icro Framework 4.0}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid556931 \hich\af38\dbch\af11\loch\f38 or later}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid10632156 \hich\af38\dbch\af11\loch\f38 , whether unmodified or modified as needed in order to adapt the .NET Micro Framework runtime to specific hardware or operating systems. +\par {\listtext\pard\plain\ltrpar \s31 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid4882226 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s31\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid4882226 \hich\af38\dbch\af13\loch\f38 Third Party}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 + Distribution. You may permit distributors of your programs to copy and distri\hich\af38\dbch\af13\loch\f38 bute the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +software in conjunction with the .NET Micro Framework runtime }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 as part of those programs. +\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 you distribute}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 , you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 requi\hich\af38\dbch\af13\loch\f38 re distributors and external end users to agree to terms that protect it at least as much as this agreement; +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +display your valid copyright notice on your programs; and +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f38 \rquote \hich\af38\dbch\af13\loch\f38 fees, related to the distribution or use of your programs. +\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 modify or alter the software; +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 software}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ; +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 +s trademarks in your programs\hich\f38 \rquote \loch\f38 name\hich\af38\dbch\af13\loch\f38 s or in a way that suggests your programs come from or are endorsed by Microsoft; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 include }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 in malicious, deceptive or unlawful programs}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Scope of License}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is licensed, not sold. This agreement only gives you some rights to \hich\af38\dbch\af13\loch\f38 +use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations +\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid11808667 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 \hich\af38\dbch\af13\loch\f38 disclose the results of any benchmark tests of the software to any third party without Microsoft\hich\f38 \rquote \loch\f38 s prior written approval}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156\charrsid11808667 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid8800392 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 make m}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +ore copies of the software than specified in this agreement or allowed by applicable law, desp\hich\af38\dbch\af13\loch\f38 ite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 publish the software for others to copy}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 + You may make \hich\af38\dbch\af13\loch\f38 one backup copy of the software. You may use it only to reinstall the software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 6.\tab}\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 7.\tab}\hich\af38\dbch\af13\loch\f38 TRANSFER TO\hich\af38\dbch\af13\loch\f38 + ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 + You may uninstall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 Export Restrictions}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is subject to +{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}\hich\af38\dbch\af13\loch\f38 + export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{ +\rtlch\fcs1 \ab0\af0\afs20 \ltrch\fcs0 \cs38\b0\fs20\ul\cf2\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 www.microsoft.\hich\af38\dbch\af13\loch\f38 com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 .}{ +\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \cs38\fs20\ul\dbch\af13\insrsid10632156\charrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\caps\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we may}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 not provide support services for it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 Entire Agreement.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are t\hich\af38\dbch\af13\loch\f38 he entire agreement for the software and support services. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Applicable Law}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . +\par {\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 a.\tab} +}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you acquired the software in the {\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}, +{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname State}}\hich\af38\dbch\af13\loch\f38 Washington{\*\xmlclose}{\*\xmlclose} state law governs the interpretation of this agreement\hich\af38\dbch\af13\loch\f38 + and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 b.\tab}\hich\af38\dbch\af13\loch\f38 Outside the {\*\xmlopen\xmlns2{\factoidname place}} +{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + If you acquired the software in any other country, the laws of that country apply.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Legal Effect.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also hav\hich\af38\dbch\af13\loch\f38 +e rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\caps\fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 13.\tab}\hich\af38\dbch\af13\loch\f38 Disclaimer of Warranty.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 The software is licensed \'93\loch\f38 a\hich\af38\dbch\af13\loch\f38 \hich\f38 s-is.\'94\loch\f38 + You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microso +\hich\af38\dbch\af13\loch\f38 f\hich\af38\dbch\af13\loch\f38 t excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +Limitation on and Exclusion of Remedies and Damages. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You +\hich\af38\dbch\af13\loch\f38 cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 This limitation applies to +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third par\hich\af38\dbch\af13\loch\f38 ty programs; and +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +It also applies even if Microsoft knew or should have known about the possi\hich\af38\dbch\af13\loch\f38 +bility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\insrsid10632156 \hich\af38\dbch\af11\loch\f38 Please note: As this software is distributed in Quebec, Canada, some +\hich\af38\dbch\af11\loch\f38 of the clauses in this agreement are provided below in French. +\par }\pard \ltrpar\ql \li0\ri0\sb240\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Remarque : Ce logiciel \'e9\loch\f38 \hich\f38 tant distribu\'e9\loch\f38 \hich\f38 au Qu\'e9\loch\f38 \hich\f38 bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f38 ais. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 EXON\'c9 +\loch\f38 RATION DE GARANTIE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le logiciel vis\'e9\hich\af38\dbch\af11\loch\f38 \hich\f38 par une licence est offert +\'ab\loch\f38 \hich\f38 tel quel \'bb\loch\f38 \hich\f38 . Toute utilisation de ce logiciel est \'e0\loch\f38 \hich\f38 votre seule risque et p\'e9\loch\f38 ril. Microsoft n\hich\f38 \rquote \loch\f38 \hich\f38 +accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 ficier de droits additionnels en vertu du droit local sur la protection des c\hich\af38\dbch\af11\loch\f38 o\hich\af38\dbch\af11\loch\f38 \hich\f38 +nsommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9\loch\f38 marchande, d\hich\f38 \rquote \loch\f38 \hich\f38 ad\'e9\loch\f38 \hich\f38 quation \'e0\loch\f38 + un usage particulier et d\hich\f38 \rquote \loch\f38 \hich\f38 absence de contrefa\'e7\loch\f38 on sont exclues. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\keepn\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 +LIMITATION DES DOMMAGES-INT\'c9\loch\f38 \hich\f38 R\'ca\loch\f38 TS ET EX\hich\af38\dbch\af11\loch\f38 \hich\f38 CLUSION DE RESPONSABILIT\'c9\loch\f38 POUR LES DOMMAGES.}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f38 \hich\f38 + hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f38 \hich\f38 tendre \'e0\loch\f38 aucune indemnisation pour les autres dommages, \hich\af38\dbch\af11\loch\f38 \hich\f38 y compris les dommages sp\'e9\loch\f38 \hich\f38 +ciaux, indirects ou accessoires et pertes de b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 fices. +\par \hich\af38\dbch\af11\loch\f38 Cette limitation concerne : +\par }\pard \ltrpar\ql \fi-360\li720\ri0\sb120\sa120\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 +\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 tout ce qui est reli\'e9\loch\f38 + au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes \hich\af38\dbch\af11\loch\f38 tiers ; et +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 +\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 les r\'e9\loch\f38 \hich\f38 +clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9\loch\f38 \hich\f38 stricte, de n\'e9\loch\f38 gligence ou d}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156 +\loch\af38\dbch\af11\hich\f38 \rquote }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 une autre faute dans la limite autoris\'e9\loch\f38 e par la loi en vigueur. + +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 Elle s\hich\f38 \rquote +\loch\f38 \hich\f38 applique \'e9\loch\f38 \hich\f38 galement, m\'ea\hich\af38\dbch\af11\loch\f38 \hich\f38 me si Microsoft connaissait ou devrait conna\'ee\loch\f38 tre l\hich\f38 \rquote \'e9\loch\f38 \hich\f38 ventualit\'e9\loch\f38 d\hich\f38 +\rquote \loch\f38 un tel dommage. Si votre pays n\hich\f38 \rquote \loch\f38 autorise pas l\hich\f38 \rquote \loch\f38 \hich\f38 exclusion ou la limitation de responsabilit\'e9\loch\f38 + pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limi\hich\af38\dbch\af11\loch\f38 t\hich\af38\dbch\af11\loch\f38 ation ou l\hich\f38 \rquote \loch\f38 exclusion ci-dessus ne s\hich\f38 \rquote \loch\f38 +\hich\f38 appliquera pas \'e0\loch\f38 \hich\f38 votre \'e9\loch\f38 gard. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 +\hich\af38\dbch\af11\loch\f38 EFFET JURIDIQUE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat d\'e9\loch\f38 +crit certains droits juridiques. Vous pourriez avoir d\hich\f38 \rquote \loch\f38 \hich\f38 autres droits pr\'e9\loch\f38 \hich\f38 vus par les lois de votre pays. Le pr\'e9\loch\f38 sent contrat ne modifie pas les droits q\hich\af38\dbch\af11\loch\f38 +\hich\f38 ue vous conf\'e8\loch\f38 rent les lois de votre pays si celles-ci ne le permettent pas.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1649263 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6; +\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4; +\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; +\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; +\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000005021 +203fc7ebca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/License (Crypto).rtf b/License (Crypto).rtf new file mode 100644 index 000000000..de92090fc --- /dev/null +++ b/License (Crypto).rtf @@ -0,0 +1,466 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Wingdings 3};} +{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ?????????\'a1\'ec?????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ?????????????????????????};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};} +{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Batang};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f293\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f294\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f296\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\f297\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f298\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f299\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\f300\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f301\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f313\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier};} +{\f314\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier};}{\f316\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier};}{\f317\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier};} +{\f318\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier};}{\f319\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier};}{\f320\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier};} +{\f321\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier};}{\f405\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f403\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} +{\f404\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f406\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f407\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} +{\f410\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f425\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ?????????\'a1\'ec?????};}{\f633\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};} +{\f634\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f636\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f637\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};} +{\f640\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f641\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};} +{\f673\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ?????????????????????????};}{\f674\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ?????????????????????????};} +{\f676\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ?????????????????????????};}{\f677\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ?????????????????????????};} +{\f678\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ?????????????????????????};}{\f679\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ?????????????????????????};} +{\f680\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ?????????????????????????};}{\f681\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ?????????????????????????};} +{\f682\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ?????????????????????????};}{\f683\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f684\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};} +{\f686\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}{\f687\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f690\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};} +{\f695\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f693\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f694\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} +{\f696\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f697\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f700\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} +{\f705\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Batang};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\snext0 \sautoupd \sqformat \spriority0 \styrsid10632156 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 +\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat \styrsid10632156 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext2 \slink16 \sqformat \styrsid10632156 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat \styrsid10632156 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext4 \slink18 \sqformat \styrsid10632156 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat \styrsid10632156 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar +\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext6 \slink20 \sqformat \styrsid10632156 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat \styrsid10632156 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar +\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext8 \slink22 \sqformat \styrsid10632156 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat \styrsid10632156 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid10632156 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 +\ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink2 \slocked \styrsid10632156 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink3 \slocked \styrsid10632156 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid10632156 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 +\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink5 \slocked \styrsid10632156 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink6 \slocked \styrsid10632156 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid10632156 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 +\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink8 \slocked \styrsid10632156 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink9 \slocked \styrsid10632156 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid10632156 Body 1;}{\s25\ql \fi-363\li720\ri0\sb120\sa120\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 \styrsid10632156 +Bullet 2;}{\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \styrsid10632156 Bullet 4;}{\s27\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 Heading EULA;}{\s28\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 +Heading Software Title;}{\s29\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \styrsid10632156 Preamble;}{\s30\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon3 \snext30 \styrsid10632156 Heading 3 Bold;}{\s31\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon26 \snext31 \styrsid10632156 Bullet 4 Underline;}{\*\cs32 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 +\sbasedon10 \styrsid10632156 Body 2 Char;}{\*\cs33 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid10632156 Body 3 Char;}{\s34\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon29 \snext34 \styrsid10632156 +Preamble Border Above;}{\s35\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink36 \ssemihidden \styrsid10632156 annotation text;}{\*\cs36 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink35 \slocked \ssemihidden \styrsid10632156 Comment Text Char;}{\*\cs37 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \styrsid10632156 annotation reference;}{\*\cs38 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\ul\cf2 \sbasedon10 \styrsid10632156 Hyperlink;}{\s39\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 +\fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \slink40 \ssemihidden \sunhideused \styrsid10632156 Balloon Text;}{\*\cs40 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 +\fs16\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink39 \slocked \ssemihidden \styrsid10632156 Balloon Text Char;}}{\*\listtable{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s30\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel +\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 +\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 +\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s25\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 +\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s5\fi-357\li1792 +\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 +\s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 +\b0\i0\f39\fs20\fbias0\hres0\chhres0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 +\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 +\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid-41362566\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s26\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}}{\*\listoverridetable{\listoverride\listid477573462\listoverridecount0\ls1} +{\listoverride\listid1559511898\listoverridecount0\ls2}{\listoverride\listid398796681\listoverridecount0\ls3}{\listoverride\listid752163927\listoverridecount0\ls4}}{\*\rsidtbl \rsid80797\rsid96267\rsid556931\rsid1649263\rsid1735106\rsid2981673\rsid3045873 +\rsid3046839\rsid3489817\rsid3496438\rsid3685900\rsid3897294\rsid4803141\rsid4882226\rsid5115434\rsid5532184\rsid5659162\rsid5993271\rsid6887591\rsid6892738\rsid7096544\rsid7232338\rsid7823532\rsid8085732\rsid8681548\rsid8800392\rsid9190636\rsid9579676 +\rsid9776685\rsid10632156\rsid10689454\rsid11026981\rsid11078160\rsid11808667\rsid11827439\rsid12520861\rsid12792726\rsid15140419\rsid15216572\rsid16342489}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 +\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author yonglee}{\operator yonglee}{\creatim\yr2010\mo5\dy3\hr18\min25}{\revtim\yr2010\mo5\dy4\hr13\min20}{\version5}{\edmins3}{\nofpages3}{\nofwords1464}{\nofchars7570}{\*\company Microsoft}{\nofcharsws9016} +{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\revisions\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot10632156\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid556931\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s27\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT SOFTWARE LICENSE TERMS +\par }\pard\plain \ltrpar\s28\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 +\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid11827439 \hich\af38\dbch\af13\loch\f38 CRYPTOGRAPHY LIBRARIES }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 FOR THE .NET MICRO FRAMEWORK }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 +\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the pre-release software named above, which includes the media on which you received it, if any +.\hich\af38\dbch\af13\loch\f38 The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid9776685 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 + +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 updates, +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 supplements, +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 Internet-based services, and +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 support services +\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +for this software, unless other terms accompany those items. If so, those terms apply. +\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 By using the software, you accept these terms. If you\hich\af38\dbch\af13\loch\f38 do not accept them, do not use the software. +\par }\pard\plain \ltrpar\s34\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you comply with these license terms, you have the rights below. + +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 GENERAL.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + The software consists of Microsoft cryptography libraries, to be used in conjunction with the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid556931 \hich\af38\dbch\af13\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 .NET Micro Framework, whic\hich\af38\dbch\af13\loch\f38 h is licensed under its own separate license.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 2.\tab}\hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 You }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 may install and use }{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid3045873 \hich\af38\dbch\af13\loch\f38 one copy}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{ +\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 of the software }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +with each copy of the .NET Micro Framework you install }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 on your devices }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 to }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 design, develop and test your programs}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 and hardware devices (collectively, \'93\loch\f38 \hich\f38 your programs\'94\loch\f38 )}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 3.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\af3\hich\af3\dbch\af11\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 \hich\f38 You may copy and distribute the object code form of the software solely in conjunction with the Microsoft .NET Micro Framework runtime. For the purpose of this section, \'93 +\loch\f38 \hich\f38 .NET Micro Framework\'94\loch\f38 means the Microsoft .NET M\hich\af38\dbch\af11\loch\f38 icro Framework 4.0}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid556931 \hich\af38\dbch\af11\loch\f38 or later}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid10632156 \hich\af38\dbch\af11\loch\f38 , whether unmodified or modified as needed in order to adapt the .NET Micro Framework runtime to specific hardware or operating systems. +\par {\listtext\pard\plain\ltrpar \s31 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid4882226 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s31\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid4882226 \hich\af38\dbch\af13\loch\f38 Third Party}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 + Distribution. You may permit distributors of your programs to copy and distri\hich\af38\dbch\af13\loch\f38 bute the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +software in conjunction with the .NET Micro Framework runtime }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 as part of those programs. +\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 you distribute}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 , you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 requi\hich\af38\dbch\af13\loch\f38 re distributors and external end users to agree to terms that protect it at least as much as this agreement; +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +display your valid copyright notice on your programs; and +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f38 \rquote \hich\af38\dbch\af13\loch\f38 fees, related to the distribution or use of your programs. +\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 modify or alter the software; +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 software}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ; +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 +s trademarks in your programs\hich\f38 \rquote \loch\f38 name\hich\af38\dbch\af13\loch\f38 s or in a way that suggests your programs come from or are endorsed by Microsoft; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 include }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 in malicious, deceptive or unlawful programs}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Scope of License}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is licensed, not sold. This agreement only gives you some rights to \hich\af38\dbch\af13\loch\f38 +use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations +\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid11808667 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 \hich\af38\dbch\af13\loch\f38 disclose the results of any benchmark tests of the software to any third party without Microsoft\hich\f38 \rquote \loch\f38 s prior written approval}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156\charrsid11808667 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid8800392 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 make m}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +ore copies of the software than specified in this agreement or allowed by applicable law, desp\hich\af38\dbch\af13\loch\f38 ite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; }{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 publish the software for others to copy}{\rtlch\fcs1 \af38 +\ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services}{ +\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 + You may make \hich\af38\dbch\af13\loch\f38 one backup copy of the software. You may use it only to reinstall the software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 6.\tab}\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 7.\tab}\hich\af38\dbch\af13\loch\f38 TRANSFER TO\hich\af38\dbch\af13\loch\f38 + ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 + You may uninstall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 Export Restrictions}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is subject to +{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}\hich\af38\dbch\af13\loch\f38 + export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{ +\rtlch\fcs1 \ab0\af0\afs20 \ltrch\fcs0 \cs38\b0\fs20\ul\cf2\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 www.microsoft.\hich\af38\dbch\af13\loch\f38 com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 .}{ +\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \cs38\fs20\ul\dbch\af13\insrsid10632156\charrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\caps\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 +\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we may}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 +\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 not provide support services for it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\hich\af38\dbch\af13\loch\f38 Entire Agreement.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are t\hich\af38\dbch\af13\loch\f38 he entire agreement for the software and support services. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Applicable Law}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . +\par {\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 a.\tab} +}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 +\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you acquired the software in the {\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}, +{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname State}}\hich\af38\dbch\af13\loch\f38 Washington{\*\xmlclose}{\*\xmlclose} state law governs the interpretation of this agreement\hich\af38\dbch\af13\loch\f38 + and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 b.\tab}\hich\af38\dbch\af13\loch\f38 Outside the {\*\xmlopen\xmlns2{\factoidname place}} +{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + If you acquired the software in any other country, the laws of that country apply.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Legal Effect.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 + This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also hav\hich\af38\dbch\af13\loch\f38 +e rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 +\caps\fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 13.\tab}\hich\af38\dbch\af13\loch\f38 Disclaimer of Warranty.}{\rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 The software is licensed \'93\loch\f38 a\hich\af38\dbch\af13\loch\f38 \hich\f38 s-is.\'94\loch\f38 + You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microso +\hich\af38\dbch\af13\loch\f38 f\hich\af38\dbch\af13\loch\f38 t excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +Limitation on and Exclusion of Remedies and Damages. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You +\hich\af38\dbch\af13\loch\f38 cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 +\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 This limitation applies to +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third par\hich\af38\dbch\af13\loch\f38 ty programs; and +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 +claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. +\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 +It also applies even if Microsoft knew or should have known about the possi\hich\af38\dbch\af13\loch\f38 +bility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\insrsid10632156 \hich\af38\dbch\af11\loch\f38 Please note: As this software is distributed in Quebec, Canada, some +\hich\af38\dbch\af11\loch\f38 of the clauses in this agreement are provided below in French. +\par }\pard \ltrpar\ql \li0\ri0\sb240\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 +Remarque : Ce logiciel \'e9\loch\f38 \hich\f38 tant distribu\'e9\loch\f38 \hich\f38 au Qu\'e9\loch\f38 \hich\f38 bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f38 ais. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 EXON\'c9 +\loch\f38 RATION DE GARANTIE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le logiciel vis\'e9\hich\af38\dbch\af11\loch\f38 \hich\f38 par une licence est offert +\'ab\loch\f38 \hich\f38 tel quel \'bb\loch\f38 \hich\f38 . Toute utilisation de ce logiciel est \'e0\loch\f38 \hich\f38 votre seule risque et p\'e9\loch\f38 ril. Microsoft n\hich\f38 \rquote \loch\f38 \hich\f38 +accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 ficier de droits additionnels en vertu du droit local sur la protection des c\hich\af38\dbch\af11\loch\f38 o\hich\af38\dbch\af11\loch\f38 \hich\f38 +nsommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9\loch\f38 marchande, d\hich\f38 \rquote \loch\f38 \hich\f38 ad\'e9\loch\f38 \hich\f38 quation \'e0\loch\f38 + un usage particulier et d\hich\f38 \rquote \loch\f38 \hich\f38 absence de contrefa\'e7\loch\f38 on sont exclues. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\keepn\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 +LIMITATION DES DOMMAGES-INT\'c9\loch\f38 \hich\f38 R\'ca\loch\f38 TS ET EX\hich\af38\dbch\af11\loch\f38 \hich\f38 CLUSION DE RESPONSABILIT\'c9\loch\f38 POUR LES DOMMAGES.}{\rtlch\fcs1 \af38 \ltrch\fcs0 +\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f38 \hich\f38 + hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f38 \hich\f38 tendre \'e0\loch\f38 aucune indemnisation pour les autres dommages, \hich\af38\dbch\af11\loch\f38 \hich\f38 y compris les dommages sp\'e9\loch\f38 \hich\f38 +ciaux, indirects ou accessoires et pertes de b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 fices. +\par \hich\af38\dbch\af11\loch\f38 Cette limitation concerne : +\par }\pard \ltrpar\ql \fi-360\li720\ri0\sb120\sa120\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 +\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 tout ce qui est reli\'e9\loch\f38 + au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes \hich\af38\dbch\af11\loch\f38 tiers ; et +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 +\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 les r\'e9\loch\f38 \hich\f38 +clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9\loch\f38 \hich\f38 stricte, de n\'e9\loch\f38 gligence ou d}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156 +\loch\af38\dbch\af11\hich\f38 \rquote }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 une autre faute dans la limite autoris\'e9\loch\f38 e par la loi en vigueur. + +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 Elle s\hich\f38 \rquote +\loch\f38 \hich\f38 applique \'e9\loch\f38 \hich\f38 galement, m\'ea\hich\af38\dbch\af11\loch\f38 \hich\f38 me si Microsoft connaissait ou devrait conna\'ee\loch\f38 tre l\hich\f38 \rquote \'e9\loch\f38 \hich\f38 ventualit\'e9\loch\f38 d\hich\f38 +\rquote \loch\f38 un tel dommage. Si votre pays n\hich\f38 \rquote \loch\f38 autorise pas l\hich\f38 \rquote \loch\f38 \hich\f38 exclusion ou la limitation de responsabilit\'e9\loch\f38 + pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limi\hich\af38\dbch\af11\loch\f38 t\hich\af38\dbch\af11\loch\f38 ation ou l\hich\f38 \rquote \loch\f38 exclusion ci-dessus ne s\hich\f38 \rquote \loch\f38 +\hich\f38 appliquera pas \'e0\loch\f38 \hich\f38 votre \'e9\loch\f38 gard. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 +\hich\af38\dbch\af11\loch\f38 EFFET JURIDIQUE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat d\'e9\loch\f38 +crit certains droits juridiques. Vous pourriez avoir d\hich\f38 \rquote \loch\f38 \hich\f38 autres droits pr\'e9\loch\f38 \hich\f38 vus par les lois de votre pays. Le pr\'e9\loch\f38 sent contrat ne modifie pas les droits q\hich\af38\dbch\af11\loch\f38 +\hich\f38 ue vous conf\'e8\loch\f38 rent les lois de votre pays si celles-ci ne le permettent pas.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1649263 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6; +\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4; +\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; +\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; +\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000005021 +203fc7ebca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/PKCryptoWelcome.rtf b/PKCryptoWelcome.rtf new file mode 100644 index 000000000..24ca70e87 --- /dev/null +++ b/PKCryptoWelcome.rtf @@ -0,0 +1,1228 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier};} +{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Wingdings 3};}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};} +{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????????\'a1\'a7???????};} +{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????????\'a1\'a7???????};}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri{\*\falt Arial Rounded MT Bold};} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ?????????????????????????};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};} +{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Batang};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri{\*\falt Arial Rounded MT Bold};}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f52\fbidi \fswiss\fcharset238\fprq2 Arial CE;} +{\f53\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f55\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f56\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f57\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\f58\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f59\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f60\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier};} +{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier};}{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier};}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier};} +{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier};}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier};}{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier};} +{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier};}{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} +{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} +{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????????\'a1\'a7???????};} +{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????????\'a1\'a7???????};}{\f412\fbidi \fswiss\fcharset238\fprq2 Calibri CE{\*\falt Arial Rounded MT Bold};}{\f413\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr{\*\falt Arial Rounded MT Bold};} +{\f415\fbidi \fswiss\fcharset161\fprq2 Calibri Greek{\*\falt Arial Rounded MT Bold};}{\f416\fbidi \fswiss\fcharset162\fprq2 Calibri Tur{\*\falt Arial Rounded MT Bold};}{\f419\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic{\*\falt Arial Rounded MT Bold};} +{\f420\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese){\*\falt Arial Rounded MT Bold};}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ?????????????????????????};} +{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ?????????????????????????};}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ?????????????????????????};} +{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ?????????????????????????};}{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ?????????????????????????};} +{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ?????????????????????????};}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ?????????????????????????};} +{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ?????????????????????????};}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ?????????????????????????};} +{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};} +{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};}{\f444\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};} +{\f442\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f443\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f445\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};} +{\f446\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f449\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\f454\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Batang};} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE{\*\falt Arial Rounded MT Bold};} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr{\*\falt Arial Rounded MT Bold};}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek{\*\falt Arial Rounded MT Bold};} +{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur{\*\falt Arial Rounded MT Bold};}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic{\*\falt Arial Rounded MT Bold};} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese){\*\falt Arial Rounded MT Bold};}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0; +\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; +\chyperlink\ctint255\cshade255\red0\green0\blue255;\ctextone\ctint255\cshade255\red0\green0\blue0;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128;\red233\green238\blue243;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 \styrsid12539996 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext1 \slink15 \sqformat \styrsid10253358 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat \styrsid10253358 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar +\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext3 \slink17 \sqformat \styrsid10253358 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 +\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat \styrsid10253358 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar +\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext5 \slink19 \sqformat \styrsid10253358 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 +\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat \styrsid10253358 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar +\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext7 \slink21 \sqformat \styrsid10253358 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 +\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat \styrsid10253358 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar +\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext9 \slink23 \sqformat \styrsid10253358 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive +\rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid10253358 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink2 \slocked \styrsid10253358 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink3 \slocked \styrsid10253358 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 +\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid10253358 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink5 \slocked \styrsid10253358 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink6 \slocked \styrsid10253358 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 +\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid10253358 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 +\sbasedon10 \slink8 \slocked \styrsid10253358 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink9 \slocked \styrsid10253358 Heading 9 Char;}{ +\s24\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 +\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid10253358 Bullet 3;}{\s25\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10253358 Heading EULA;}{\s26\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10253358 +Heading Software Title;}{\s27\ql \li0\ri0\sb144\sa288\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext27 \ssemihidden \sunhideused \styrsid5012459 Normal (Web);}{\s28\ql \li0\ri0\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 +\f2\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 \slink29 \sunhideused \styrsid5012459 HTML Preformatted;}{\*\cs29 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20 \sbasedon10 \slink28 \slocked \styrsid5012459 +HTML Preformatted Char;}{\*\cs30 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf17 \sbasedon10 \sunhideused \styrsid13251211 Hyperlink;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 \slink32 \ssemihidden \sunhideused \styrsid9916094 Balloon Text;}{\*\cs32 \additive \rtlch\fcs1 \af38\afs16 +\ltrch\fcs0 \fs16\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink31 \slocked \ssemihidden \styrsid9916094 Balloon Text Char;}{\s33\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace +\rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 \sqformat \spriority34 \styrsid1725511 List Paragraph;}{\*\ts34\tsrowd\trbrdrt\brdrs\brdrw10\brdrcf18 +\trbrdrl\brdrs\brdrw10\brdrcf18 \trbrdrb\brdrs\brdrw10\brdrcf18 \trbrdrr\brdrs\brdrw10\brdrcf18 \trbrdrh\brdrs\brdrw10\brdrcf18 \trbrdrv\brdrs\brdrw10\brdrcf18 +\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon11 \snext34 \spriority59 \styrsid1725511 Table Grid;}{\* +\cs35 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \sunhideused \styrsid5642075 annotation reference;}{\s36\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 \slink37 \ssemihidden \sunhideused \styrsid5642075 annotation text;}{\*\cs37 \additive \rtlch\fcs1 \af38\afs20 +\ltrch\fcs0 \fs20\loch\f38\hich\af38\dbch\af13 \sbasedon10 \slink36 \slocked \ssemihidden \styrsid5642075 Comment Text Char;}{\s38\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext36 \slink39 \ssemihidden \sunhideused \styrsid5642075 annotation subject;}{\*\cs39 \additive \rtlch\fcs1 +\ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\f38\hich\af38\dbch\af13 \sbasedon37 \slink38 \slocked \ssemihidden \styrsid5642075 Comment Subject Char;}{\s40\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \snext40 \shidden \ssemihidden \styrsid5642075 Revision;}{\*\cs41 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf19 +\sbasedon10 \ssemihidden \sunhideused \styrsid5642075 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927} +{\list\listtemplateid1887227464{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li810\jclisttab\tx810\lin810 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1530\jclisttab\tx1530\lin1530 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2250\jclisttab\tx2250\lin2250 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2970\jclisttab\tx2970\lin2970 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3690\jclisttab\tx3690\lin3690 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4410\jclisttab\tx4410\lin4410 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5130\jclisttab\tx5130\lin5130 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers +\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5850\jclisttab\tx5850\lin5850 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 +\ltrch\fcs0 \fi-360\li6570\jclisttab\tx6570\lin6570 }{\listname ;}\listid987594221}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid2033377338\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s24\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 +\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-1560004652{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li810\jclisttab\tx810\lin810 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1530\jclisttab\tx1530\lin1530 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2250\jclisttab\tx2250\lin2250 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2970\jclisttab\tx2970\lin2970 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers +\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3690\jclisttab\tx3690\lin3690 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 +\ltrch\fcs0 \fi-360\li4410\jclisttab\tx4410\lin4410 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5130 +\jclisttab\tx5130\lin5130 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5850\jclisttab\tx5850\lin5850 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6570\jclisttab\tx6570\lin6570 }{\listname +;}\listid1814174743}}{\*\listoverridetable{\listoverride\listid1567649130\listoverridecount0\ls1}{\listoverride\listid752163927\listoverridecount0\ls2}{\listoverride\listid987594221\listoverridecount0\ls3}{\listoverride\listid1814174743 +\listoverridecount0\ls4}}{\*\pgptbl {\pgp\ipgp13\itap0\li-390\ri-390\sb0\sa360\brdrb\brdrs\brdrw15\brsp360\brdrcf20 }{\pgp\ipgp12\itap0\li0\ri0\sb144\sa144}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp8\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp17\itap0\li0\ri0\sb0 +\sa0}{\pgp\ipgp16\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp14\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp9\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp3\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp1\itap0\li0\ri0\sb144\sa144}{\pgp\ipgp7\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp11\itap0\li-390\ri-390\sb0 +\sa360\brdrb\brdrs\brdrw15\brsp360\brdrcf20 }{\pgp\ipgp19\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp4\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp6\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp10\itap0\li720\ri720\sb100 +\sa100}{\pgp\ipgp20\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp5\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid80797\rsid96267\rsid1447428\rsid1649263\rsid1725511\rsid3093603\rsid3159240\rsid3287017\rsid3897294\rsid4205128\rsid5012459\rsid5330529\rsid5532184\rsid5576486 +\rsid5642075\rsid5838308\rsid5993271\rsid6892738\rsid7096544\rsid7739184\rsid8409143\rsid8723433\rsid9190636\rsid9846002\rsid9916094\rsid10241836\rsid10253358\rsid10435762\rsid10447979\rsid10689454\rsid11756618\rsid12539996\rsid12664258\rsid13251211 +\rsid13788253\rsid14156743\rsid15140419\rsid16062179\rsid16668801\rsid16737971}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author yonglee} +{\operator Lorenzo Tessiore}{\creatim\yr2010\mo5\dy3\hr19\min6}{\revtim\yr2011\mo8\dy16\hr12\min3}{\version10}{\edmins28}{\nofpages1}{\nofwords423}{\nofchars2414}{\*\company Microsoft}{\nofcharsws2832}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.micr +osoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin1440\dgvorigin1440\dghshow2\dgvshow1 +\jexpand\viewkind1\viewscale92\viewzk1\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel +\wrppunct\asianbrkrule\rsidroot10253358\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3 +\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10447979 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\af38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 Dear Porting Kit developer, +\par +\par \hich\af37\dbch\af13\loch\f37 Welcome to one of the most exciting and innovative embedded development platforms around \hich\f37 \endash \hich\af37\dbch\af13\loch\f37 + the Microsoft .NET Micro Framework! With the .NET Micro Framework, you can build compact, robust, and powerful embedded designs in less time than you \hich\af37\dbch\af13\loch\f37 thought possible. \hich\af37\dbch\af13\loch\f37 +Most importantly, you are using the same tools and programming models that are used o\hich\af37\dbch\af13\loch\f37 n the web, the PC, the server, and in the cloud. With the coming of the \hich\f37 \lquote \loch\f37 Internet of Things\hich\f37 \rquote +\loch\f37 , more and more solutions now include devices and more and more devices are becoming connected. It only makes sense to build as much of those solutions with the \hich\af37\dbch\af13\loch\f37 s\hich\af37\dbch\af13\loch\f37 ame skill set. + +\par \hich\af37\dbch\af13\loch\f37 +This latest release is our third release since becoming and Open Source project and it is really gratifying to see the amount of work that the community is putting into this project. With this release, a significant percentage of the new +\hich\af37\dbch\af13\loch\f37 features are generated by the community. One \hich\af37\dbch\af13\loch\f37 new feature \hich\af37\dbch\af13\loch\f37 +that will be especially interesting to porting kit customers is the PK Studio which is an IDE to help you build the platform. When we made the porting kit available, we knew it could be easier and \hich\af37\dbch\af13\loch\f37 +the community has stepped up and done just that. +\par \hich\af37\dbch\af13\loch\f37 The porting \hich\af37\dbch\af13\loch\f37 kit is intended to provide the truly engaged \hich\af37\dbch\af13\loch\f37 the ability to debug through the entire stack \hich\af37\dbch\af13\loch\f37 +and to support them in creating ports on their own\hich\af37\dbch\af13\loch\f37 . +\par \hich\af37\dbch\af13\loch\f37 With this Porting Kit you\hich\f37 \rquote \loch\f37 ll be able to create, \hich\af37\dbch\af13\loch\f37 modify, and build Micro Framework firmware images that are customized to your needs. Using the Solution Wizard +\hich\af37\dbch\af13\loch\f37 or the PK Studio,\hich\af37\dbch\af13\loch\f37 you can select the right set of features, libraries, and memory settings to provide the optimal image size for your needs. You \hich\af37\dbch\af13\loch\f37 +can then write new drivers, leverage native code routines through interop, and deploy them on your device hardware. +\par }\pard \ltrpar\ql \li0\ri0\sb120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10447979 {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 +To get started, please read the introductory material in the Porting Kit documentation. The documentation contains a lot of useful informati\hich\af37\dbch\af13\loch\f37 on on the architecture\hich\af37\dbch\af13\loch\f37 of the Micro Framework +\hich\af37\dbch\af13\loch\f37 , \hich\af37\dbch\af13\loch\f37 the \hich\af37\dbch\af13\loch\f37 build system, \hich\af37\dbch\af13\loch\f37 the \hich\af37\dbch\af13\loch\f37 driver model, \hich\af37\dbch\af13\loch\f37 the \hich\af37\dbch\af13\loch\f37 +libraries, and how you can put it all together. In addition, we have extended our very successful newsgroups to include groups specific to porting as well as the SDK so \hich\af37\dbch\af13\loch\f37 +that you can exchange information with other engaged in the same process. You can find links to \hich\af37\dbch\af13\loch\f37 support forums\hich\af37\dbch\af13\loch\f37 and other useful information at }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af37 +\ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 \hich\af37\dbch\af13\loch\f37 HYPERLINK \hich\af37\dbch\af13\loch\f37 "\hich\af37\dbch\af13\loch\f37 http://\hich\af37\dbch\af13\loch\f37 www. +\hich\af37\dbch\af13\loch\f37 netmf.com\hich\af37\dbch\af13\loch\f37 "\hich\af37\dbch\af13\loch\f37 }}{\fldrslt {\rtlch\fcs1 \af37 \ltrch\fcs0 \cs30\f37\fs22\ul\cf17\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 http:// +\hich\af37\dbch\af13\loch\f37 www.\hich\af37\dbch\af13\loch\f37 netmf.com}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 . +\hich\af37\dbch\af13\loch\f37 You can also browse \hich\af37\dbch\af13\loch\f37 or\hich\af37\dbch\af13\loch\f37 download \hich\af37\dbch\af13\loch\f37 the .NET Micro Framework\hich\af37\dbch\af13\loch\f37 \hich\af37\dbch\af13\loch\f37 +codebase and track any issue at }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 \hich\af37\dbch\af13\loch\f37 HYPERLINK \hich\af37\dbch\af13\loch\f37 " +\hich\af37\dbch\af13\loch\f37 http://netmf.codeplex.com\hich\af37\dbch\af13\loch\f37 "\hich\af37\dbch\af13\loch\f37 }}{\fldrslt {\rtlch\fcs1 \af37 \ltrch\fcs0 \cs30\f37\fs22\ul\cf17\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 +http://netmf.codeplex.com}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 . +\par +\par \hich\af37\dbch\af13\loch\f37 We are very excited about the great embedded solutions already being built with the .NET Mic\hich\af37\dbch\af13\loch\f37 +ro Framework, and look forward to a long-term partnership with you as you build your new product. Thank you for choosing the .NET Micro Framework! +\par }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\fs22\lang1024\langfe1024\noproof\insrsid10435762\charrsid10435762 {\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLockAspectRatio}{\sv 1}}{\sp{\sn fLockPosition}{\sv 0}}{\sp{\sn fLockAgainstSelect}{\sv 0}}{\sp{\sn fLockAgainstGrouping}{\sv 0}}{\sp{\sn pictureGray}{\sv 0}}{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn fFilled}{\sv 0}} +{\sp{\sn fNoFillHitTest}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn wzName}{\sv Picture 1}}{\sp{\sn dhgt}{\sv 251658240}}{\sp{\sn fHidden}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley99\piccropl0\piccropr0\piccropt0\piccropb0 +\picw5108\pich1734\picwgoal2896\pichgoal983\wmetafile8\bliptag-1185998603\blipupi369{\*\blipuid b94f18f58a70323005ba05ecd8e4c07f} +010009000003d27200000000652f000000001610000026060f002220574d46430100000000000100402f00000000050000000020000094650000948500000100 +00006c0000000000000000000000e5020000fb00000000000000000000002b660000b222000020454d4600000100948500000c00000001000000000000000000 +00000000000040060000b004000034020000a7010000000000000000000000000000dc9c0800a5750600460000002c00000020000000454d462b014001001c00 +0000100000000210c0db010000006000000060000000460000003025000024250000454d462b224004000c000000000000001e4009000c000000000000002440 +01000c000000000000003040020010000000040000000000803f214007000c00000000000000084000057c240000702400000210c0db01000000000000000000 +000000000000000000000100000089504e470d0a1a0a0000000d49484452000002e6000000fc0802000000b429f6d0000000017352474200aece1ce900000004 +67414d410000b18f0bfc6105000000206348524d00007a26000080840000fa00000080e8000075300000ea6000003a98000017709cba513c0000000774494d45 +07d80a030d110541d7c7610000003774455874536f667477617265004d6963726f736f66742057696e646f77732050686f746f2047616c6c65727920362e302e +363030302e3136333836803c4fb70000001374455874536f75726365005865726f7820574350203535427788360000235d49444154785eed9cdbb625278e45dd +ffffd1d5e9de653a1c1710200909663ed4f0c8227499126205714efecf7ffef39fbff8030108400002108000048213f82359f8030108400002108000048213f8 +2b787c8407010840000210800004fefe280405084000021080000420109f0092257e8d881002108000042000016e59e80108400002108000043210e096254395 +8811021080000420703c0124cbf12d000008400002108040060248960c552246084000021080c0f104902cc7b700002000010840000219082059325489182100 +0108400002c71340b21cdf02008000042000010864208064c9502562840004200001081c4f00c9727c0b00000210800004209081009225439588110210800004 +20703c0124cbf12d000008400002108040060248960c552246084000021080c0f104902cc7b7000020000108400002190820593254891821000108400002c713 +40b21cdf02008000042000010864208064c9502562840004200001081c4f00c9727c0b0000021080000420908100922543958811021080000420703c0124cbf1 +2d000008400002108040060248963555faebafbfc95fff774d1c788500042000010824218064f12bd41f8152fe3cbdfee40b7f20000108400002107825c03169 +de18722d5256ca1f318f1e07108000042000811804902c567518fee8835eb12a09762100010840203301244be6ea113b042000010840e018024816e5520f5fae +dce2e0ae45b93098830004200081e404902c6a05fcfd68ad9ab97f7e9f48d120a6200001084000027909681eb17929cc47ae2b56fec4a36e703e472c40000210 +800004161240b2ccc2b7d616d6f667f3e779084000021080800b0124cb1466533d616a7c2a6d1e86000420000108b81340b20c22474f0c82d37eecfa8fd93c7f +9c883269f3c61e042000816504902cdde89d4f416777dd38963e507e3feb46e9faaf0c03706989700e010840408d0092a50fa5f3f9e7ecae8fc5d2d5e5424588 +48b86c694e388700042000811a01248bb43f38f3a4a4ecd70dd762f841fb9cf00001084000020d024896e82dc229fb5a21b0446f5ce283000420a04d00c92222 +ca0129c264bfe8fa432ac3dea8e6303a1e84000420b0900092a5750da5fa0fda0e54faf95b300346f678a4fcb0ed7c3aa89679865880000420e04c00c95203ce +c1e6dc8e7577eaea8dfa86aa2fc140000210689c02007a2510e73053bc5ac85b6b95ef4179d327720840000210f843805b16da200701f52b961c691325042000 +0108fc4300c992a017e25cf92c81657ac5c225d6929ae214021080c0000124cb1d5a347dc099cafdcac0c6e61108400002fb1140b2ec57d3dd3272106dd174ea +6e25241f084000021a04902c1a148d6d9c7ca09a7e1532ae1be6210001084040930092e56f9ac135c1c95f46829746732f620b0210800004aa04902c091ae458 +c9e2f049e85a7ee45182cd40881080c0c104902c09ae588eedcf63b5dab11527710840000215024816da232e01e76b0f677771b91319042000819004902c21cb +f2efa0ce3c4af9c1db04ad4988108000041c0920591c614fb83a50b52c497989d389bee0510840000207113857b2a4389c9c7ffe345ae3a7a8513468c4030108 +40605702274a962c07e1c97a85af42bb4e1cf282000420304ce044c9320ccbffc1c355cb2ae0fe7ef10801084000024d02489626a2650b4efe15df85b72c592e +e196f5258e210001082c22806459045ee076e1b12d88ce70c9c95acd102ba62100010824278064095ac0ab5e39f0bd1fd512b42f090b021080c03a02489675ec +5b9e4fbe65f9c36695505be5b7d50efcff108000044e27806409da01b783f3b473f4b47c8376216141000210884400c912a91aff8e855b96b8b5213208400002 +107027b0bf6449fabe7e0d3b690ac3cdcc0fb20ca3e341084000021b13d85fb2a42ede6962e557acb592e54ce6a9b709c14300028710d85fb2e43d81cefc77e4 +8a5ec95bb843660769420002107026b0bf647106aae5eed803fbd89fe0d1ea1cec40000210d8950092256e654f562d0bab722cf685cc710d010840404200c922 +a1e4bda67c12fa3a3e373e56d7fe208b77a5f107010840000262024816312adf85f5937bfbaf271b6b32df3ec21b042000817d08ec2959b63ff08a64b9fec706 +5d19418a6ddf3c1bf409294000026712d853b21c52cbebaf14eda45d100d8734306942000210e8228064e9c2e5b1b8f7779baf3ff872bb7df10857db077a459b +28f6200001086c42604fc9b2cdb1d795c8ebd7a25c3fcd1ae1c3d0263b9b34200001086c476037c9d275c687ade66416a9b54bef25937a1127e1abc783410840 +000210f811d84ab2ec77d84c66f4a55d22777fae6ba1c824890d021080c06604b6922c7bd4c6e29a218b7641afecd1c36401010840c082c03e9265f242c2026e +409b5fbf1d1d8adeda60d67a0fd83384b48ac0ad15e9cc5585c06f1c02fb4896384c5522b1b86b298185fd61176e59549a072379095c7f01f0bf1feffffa7b4a +17bdf25c9037592287402f817d24cb4eaf206eb9c4fc60e4967eef6e613d042c0814a53ef0a2727d848d63511d6c8622b0896461afce74551ce1c22dcb4c1d79 +362301f5d975bb8fc9c8849821f04520bd6451dff0c7f6caf5c2f926623c99a05a3c69e36b1581e7854ad974e57bd0cc70bb3e3b6367159f49bfd73172fb9436 +709535190c8f2b12482f59ae5f7915b99c6c6ae1a5cb81b3f5e44e3b36f7d71f58b13e4af7de5caf1fc86e5fdc4abf3d17ef0d67a78db68364d9a91ea17259a2 +5d16deb230b642b5dfaec1bcdeaff8246bad8a7cb2b879b9dd27bdcac17a60372ccc812575143a4d2f59169e7042c4d9977d09170bf20c8becdd42fccdd3d162 +e3f462df60a35da5c917d201d45baabadef688bc3eb764d960e3456e8e676c15f9a295c8c094d1728d1d08981228dbc7d48bdc78debd76d32bbf946fc7c16476 +1c2ef246f25c9958b2d0529e8df2bc8cb5f86c3439651602c1350452dcafbcbe8724aa5d1911d7ff789d4e2a4955bca8d8c7482f81c492e529ab7b9367fd2481 +e7ddece47be4da5b5944f0643ff0788540e4ee8a1c5b415a82acbfd8d8e56267998d23279058b2d040f2323bacac5cba7455aa6bb1435eb880c03c81f8d7876b +df16848417624cc1478831f5b2c4922535f78d839ff960b470246d5c11525b4b204b57877d5bb88e94b5a5e46a7f3dffe5110c0480e01d80e6ffc880765958d9 +b0f3dabf70785424b0b0a507b298fcb03be0b1f9485dafb06d9b00375b90f596854e4dd48872ed92e57d34117c425d4e20d7b08aa3b1425daedcba8849b56a5b +a5942cb946c0aad246f3fb255c4a35cb14a0bed16a473cc304327675840d58945364711001d47067267d30a56449ca9ab07f042ada25f278a27c10e82590b79f +d7461ef97e85eb96de5da0bb3ea56441dbea36c12a6b75edb22a2afc42408540c09f0b91e7b576c6ae154c724a65e55a5c0301e77d249f64a139f276db57e46b +b50b1db55f4705c928756badd20daf3f4c1399649c9ffe09d2f6a66124932c34876937ac35ce07a3b5fcf1ae4b608361e5af5a925e4d6d506bdde6b7b3964cb2 +d881c07210024de112f97d2b0843c28840e076fad2b7cda2a43ef8a96fb3be2a0b9249167fd5af42192312025f2f586590bdaa1989e5ca1a06cd24401eaf7fee +2cff6fc64ef3bcf3f0f465d4b41c4f4660af663349968c7bdea1849bb9a85479ed8fbc6cc69974ac097080c9096fa057526b5379a596afcc2459fec042b52cef +18d3008437c3cd8f47a641621c0212027b1cc33e59f87891546d720d3a751260f3f14c9205bdd22c67f605031b7ef2ea85a6cade3361e31f68e6b0b99806b619 +a8cdd2312dfd807124cb00341e312430b3e12bf2c530624c43e08d003707c2bed806d4355fde8584d5ef5d9643b250fedeba665c3f23566ef94aae5e68aa8c4d +922866c57e8e90b5d17ed94faf6c56f708bdf72f2d182da04a3c467b261181ed43b5985f12f9b23d58125c42608fd3cb2e0b8bfdbea4d04fa79c564685c871cb +f227793ac0a803a299b52b7453bbd8b98e0699781c086c761e5bec8ecd1095a6fab1b220e6d0b7c15da4912cc139129e0a019fad5ed72e0c1a955262e47768ed +d14e461b731b3eafb72c7b943eda46ce2159a87db4beb18bc7b3d6651057448c5da658de9bc0665708ea1b73333eb76656c7b5f76691679743b270c926af68ea +956e53ec6ba0343f1ea5c64bf0ce04dcfad93a2f8beb906de07c8915548b455ba6912c16c96313025f04d02ef4c63c018b937e3eaa610bba67f06670ae544b6a +bac4860bb7d3830924cbc69dbd5327a9e4e2f3e235304750302af53dcd884f3ffb501dd83595c0ae1bca277e7f2fbac4fce38fe931816489098ea88c0804dfe7 +4ded123c7ea3aa61b67e5db7011ff557c71376ca09393af77602c942d59d7b62a13b87b752ad76aa6b979f172d5f0b2b82eb19023bdd25e836b3c34e9f299cca +b3bac45442dac04874c9c2e8dfa0c9ba52c8b8cf4b975674cc4dc1644cb3ab8e2cfe1150bf9c58055677146f83a55e0eb6b97abb46972cbcaaaa973cb841d359 +e633419a17303e61042ff421e16d739da0bb31b7c15269635d9177c87e69a6195db230dc9b25dc6981ee588c40e63ab6e47730112227061502db9ccdbaa378bf +9dfeda2dbad0541a32bb91e892855b96ec1dd61bbfd12c8b333b84773025e038910f94b27c1c3979231bb5746f39e6d72bb6e2364cf83034df575d16a24b16c5 +4dd2c585c56b099c53778982b95dd55c4bb31654094c98c52107d56defec71d1a258bb3d80ac9d90c77a0f2d59f816785a5f32cbe422e07a6ff1255cae7fffb5 +9b2ad739c2af5a5d7a45f1e4cbb23bf6e86a4571fcda038af6e334c681dd6e0d3fb464b14e1efb61096c39bf8669cb75cc4d3dfc644d999bc37684a2a4b8bb7e +0fba49ab3387f806592ba6f0aae1b6dcf25b26353cc7541e0c2d591437890a2c8c3810b028fa9683c35a7fd4d5cff38ea709f96ad0a19142b9b0e86ae7049bf5 +15c6b3c79d9324d9b243258b592324105ab2dcded58429b12c3501f6b962f9ae306fff5dbf7d31da7ae71c57b7226e90b89664b9ddfc15508af61577d0a4a90d +a4ea2401f5c7a34b962dfb58bd8aaf0693a2d3dde44921f87488bf17dde2fac73fe331bb6a51ac9da2a9998a383ccbfc51871c5ab250efb17aa7be81e79665ac +e8f19f4add962a78f31ed5ba9167576fc26660940941752d0b2d597e57885df9b0f87a30a4db33ba01d33cd1b683eec9172dbb663ca9d3d7da4d4729572d68cd +d63a6741684140bd7b1bf1360e328ec843dec07a2bbbc17a2afb7b07cb38d674634e0a61600fea721b0860bf47424b166e59e40d57ee279ee320d7b639679cc9 +8bbbc1caa3dead2bf5caabdb14c7485e08bd3b51115aafeb5dd787962cd4bbabed2ab8129154196789f2ed2a71eac588d15ff93236a76ecc2a7b3ccb5ed04597 +256bbb38a34b16ea2dac7d13547381d091f5320e366bc2abec1f7550352f5a565561ccafeef438678feb721babdd664f85962c49df48fc5ba4b9319a0bfc63fe +f2387fb0254a360e76eb48e6cb6a1da1a7fd7467b66ec0e734832e37cf160deb2bb464e1ec91f4cd7e9486f7f97e28240d9065cd7059b324d81567a2635b7d5b +1dd20987a4d9d5f6f38b434b166e592405561f2812a7766b8647f9661cec082fb13c5cd625d13a38cdd5aebad19ed30cbadc1cda32be8bd092857a371b685744 +bbe6d52ce8ae0bce39a5e415ccf216fedb8c8a5bf290665024266faaed5786962c3ffa14feab0bbbc8742d5edbf703233251766bd9aef27ec829d58b37856a51 +df5ca519d42df7f2375d9fa2b8a6042c8c87962c7b37f4643907cef5498f3e8fef9a970fbdb05e902cafa5c9d2edeaa3f89ce35c1d5dd83dee135868c9c2154b +bd0976dd0ce78c339f4dbedccb216fd5639c83ab168b2173887e658e8ded88c6a9676154cbe6219d3d86cb62948c4562f1947cb7efcdc182ed129bf2822e096f +add3e0702cb6d8f6b33d784dd736fc8c776e5966e82d7ed662942c4ee9ffdc4b76fbaeb947e0af1e03b72c92eb5249dbab97a669d068a36d2f59ca27022380cd +c2edba20b46489b98723b482169980dbe9845916a1859c63d0ea58e7b0dddc1dc867fb94034e57b77eb673145ab2fcd2a6f05fe5ef255366c4f5ad37e0e068e6 +d55c60b761b03c468092352f5a628a75a3f91033d9b1de7e7dead7f0b4bd22d2ffea01758b8a06a97745ac74c1b9ce9dab70f96daa68e3235a3c8a2d7da6290a +2aa97bc09d28097b6ccd51c98e21e2a9772d189f4bd7d91c3f1d9508e54c9e02a52e83e4965512791ae1edc408ec42b3481621fc68a08cae58fefbbafc4fb642 +38899631c4ec8a95e0c3905df2792d778d92db154b25eb3813f355392d9753791b666de471fa6a2d0789f738a79df576dbbb2bace9497a69cb35d1254bd7d9bc +65852693ea05186162f6c63c8988c7ad09ec7d38e9d28bf6c5c4eee8ddb82b224c51ddb68c632d8164f903cb6edbc4a9445724f243fd3a17ba30ca5d74452e59 +bcd0b5243cd60c10a0a6726841cef2ae7121cfeeba3248a663c1f3d41202d1250b7ae5b52dbaa6c9c05c58fb963010f092cd835321010a2a04f55b16e7a2a56b +ce74e578cd74e0c1e08f20d0ed0a145db2ac3d3bedb84f5a966f89e1f1b7903c27dc647b047c5cdeb101835f12d2f0ced58ad65aaf5cc59956ccd8d99e4074c9 +c22d4ba5058533655801f81f334527f9bb9ee7bcfdb0184e70f9e93b1cf9c2075741f37c57191e4d0beb22712d9ccc1253acb911482059502dcfaeed3dd1838f +86eb94bcaa9608db355a3c11980cc4d0dbb1032ef67b64956af124197c340da040af0c40933f9240b278aa7e39b8b52b0776c5d868b03e69beae55acfd0acb57 +380789471876b465271cbd46ccc7b6ed7c30031366cce9663bcb8ddb18ed0d9e4a2059b86579edb381bd313cfe067c35f74619554fe3c371369d762df892535d +4658fc2310a4a619cbe18fce62bf7f91df4fce7ad2cbd8cf933127902cdcb23c6b3ccc6460fc0dfb7a0dfbaa03bec4e8409093dba0394f8dec1f62364e413302 +f73cd4fd8fdb9d7ac39f5ec67e9e8c398164e19645eb96e56aa7eb3e76722bde444fd39ae78c6e8a9566b4933bf090c7773a99fc4be6b0234a9ffb373cbde1df +51793de6902ca896ca8d854ff30d0fb2b14b9a2e45a54bc0e87bd03040ddec9658533c718f3dde141956647af6f65812ffed5570790c7b079043b28c1d7b7b57 +ee97ddfc4158c44105b2f09cb8bda80dc7e6309debbda11ec0c257d820bb40d842cd68afa5196eb0a697980bd4dbb2a4b9bc3f17bea2c4ac35517d0aeb2c6850 +2db74a396cf2eb91f074f735e6540e1287ec5e3bdfe844a47b5524cbad3a2a9d96650096571407e1e2cfc42e299f5cd8e03e9cff7e4b77f334e968d5193619b6 +f5e33e589c078ab3bbdbbba6cae1fa7a577ce0117b653bdfab5795ac5e26ebadaa685f31f772d6ae6d4ec58c1439632a20813492e5f71164edbe8a56bfdb2d88 +6978cef097b8b3904a46d736a6b5b6303e7326bdbec29e0cd6a2512d8ade6573a643ba1c192de66c32027bffbce0e346c50b3d712fde3fbb5c056fdd88e74071 +9ec8b7c34f3dd3ebdd8043a562ba50a75ade619cd56d10bc2a8a2dc815cb0fa9f3aed7ad2367932ecf8ab54cb72c5cb43c0be936afdd1c5de797c336b80d4af5 +9335975e514fbf5470d8721d60ea736eb2bd27554b28bd72532d93649c1f7fbd05748ee11c77f924cb4fb89c53a19adefcbfa1e503648964312df4ebc41f3e59 +5fcb54a0e99a556ffec9c34f18cf00846603f8442e4cd07fd970fa5721d884ec99d740937886d7dce6cb83d93e807c67bfdb219da2f66e4ac2739458bf3a5706 +bd6e9ab78321e6d9307cec756d105db057d73ef17725ebb9b837fd6b13866ac8db454bc0d8d02b9e8dfde52ba564c9d2cd0e05b63b096ec1bb69a3ebe4520778 +9befcf4652e47923a6687906cb93805b60038e843bbdf7d89e0118f359a1ca2fef7bcedb590e4d9888dca0e9ca5bb4c276350d697be3f9244b39d2b6af8d2441 +9f1d3e70d84882afac51f7d8142bba52e936bcd4d3e9c27b3ba89e07bcc3a81d68d4aea806ec77318cbfb84bb785952c7f38a7286569ce42b2ecb2f8ad923ac2 +949265ed0110adde3e3bdc79c629ba138a1553c9721dc4cefdf3a5579cc3e825d0a557aeb5ab748ecf4ef1075b3c565abd4bd02c4c21856479dd536ba19de33d +a564f9b57569ee73aa75cdf43ad3ad359ca28090176bdee97382370fc279a7a5396f992e392f6fb3550edf62a5bc4b8759350fe661cb16402c6c0a0958b856b4 +296f1545a7c3a66ea378d80e0f4a0864952ce5bd4a92e47e6b9e47afe9265739c8bbaa309f4e7376bfc633ef378e648926ebe56caf2b4bef9574ea8d54afbb3c +86ae768db6f855acfbefe2612cc195e5b515177654f3056c987fe407134b16e1088b4c7f2cb6af4eb51b49fe7b6378103c87b51cf2b0d3afdbafca458b29d262 +5c252339c0e64a493c92353f5df8cab0de00c1cfc22640f9822fd522b7b076a5b00dfc837c9e3b3705e313d2b9c79f0f5f232f0796ad72d4d98d63d3f355e5b6 +a374c22484c941d904753b488cf64539d19bf1d805f0b42c2c8d8af27e152e6ef03da97ef97a952c110213c620ec16a135ad655f278ef3462bee9cfd6a619cb1 +93f896e597f651aaa5d9a09327ee977a98e9b0b167e58994134ef7a81b08bb599dd2b14667e7ed6d4f18cf40a6c38f34cfa16bdd27e37f3db35fa5cc703a911f +fc4a3f72ccb7d89adde29c4bfdacf13c89aeb36e729bd4df18030adff492e51cd5226c4ddd7d2e747a958f2a73a42259ca68503cde4acc72a9744db397b9fa20 +b88db0aeaaa9d44b68a489b79764ddaf50b584c525a45a39e96f7ba4c97fcca3dd5341022e1d526f95eb36b463723df2745b57be5f16d66507c9625742d3b693 +1befda09b7b6937b79aeec7a6fb81d36937be969edb949265d345f2fe4e8c636b08a70791a9187edbfb2ae48145bb77e8aff26462e749262d533b2c32b896d6c +8dae841d8ba1bc8f35f54a3989661c359fbd1e075a337040acac6aa74d244b99413e4dd3ec2ac505634d39bfd5e7fdd6b7c155687e1d21af5a6d4c1fc82bd26b +7f0675055133e0a4276e1def0ccc26b1ba8ef174dd1b6a65fd6f9f0a1558c69ee9dd8f8a6c8b58b99e2ff55a8c8dcdae986f2e263d7e8da0eb7cbe9660666475 +a5f9b5781fc9726d2f1534118c68b563572e93b37b5eb07fcddf491a4208f2f4b5de338453e0eb7012e615645905af16cfde4c2b53bbd794f3fad79668c6b08a +7333b0cf53ea9f88872d8c3d58068e70f2f8a8ab9f97f9f34e28739b45b9ed6821abb18afc2da4869f8cf9a04fd338e47eedcb6177cfa66c9ad21a678ac2a519 +b3fa02491769812ac18f1153cfdddae0976451e7d99b4822e122d4b87502cb81cb0b5491b97223632bbbe670d7e2f97824634a2e38c6e2f95b437cff19b65979 +7037c952b4a7b5d6b328c6bc707e8d4a225c261577178d5f695e5f14ae7fe9b0ff25fb5982b42b7dc9e2af722c6422095bb846a25a84a6749795ceacf0d7f5d8 +654dfd6cc8a85aba88cd2c1ed86b331a4218ea2daade202567813092e7329f43644fc972957ec30558f2a09dd2aabc445634c4120811ca2739567be745174c9f +fddf1592d6e257b6d18ecfe67ed1a251d7cdd7bd60d412a6c79816a5affda865bfd8b90ec3ae0deed3c0ba92459dde15a311906d25cbad05ed6aa362f9261a54 +6c0a5570cc81e5f0bed2845c79a98d105e33fec80b9e2790db99d48545de03cf2d2c7ffd28cf4adc759da3c264630e815bf00e1d722b8490de6fd9752658d4a8 +b878ca02619c4ba6967ad536972c4b8a246ca0d2e85deb15171ba96095082314ae7e7ea8a479ac91db20539f6b46602b2df13b515e8f2eb910a9db374acae1cd +582b72873e19531bb77935664442e9a98385cad801dd57fcbaae37972c4ffd2b690b8735cf773207a7895c44902cb7e6d1dd78896a6114ead7f16ce44edd6c25 +fed797f52ee1b2f07d26f28d8be95bd68cceb83d6b34be5ef54aaf6451df0842835a47de1192e5f61a51de8784ac59b684c0cc04b10858381a2c5c6f69f3f508 +cf9be94da6dc04ee57b2a5c9a3755758e162a15a26df469e934a5db2d40d369b27da2c9dd9e6074996e77468567a86ecebb3fe1ed553f031a8bee77dc2c64b17 +81b0e7625716cdc579777dd80229ce87f9e3fcd5c2a40c7a36d56b1749825764d56c758705074996e73dffefbac561a0943730878a6ee3c2a734dbe04a9a88fa +644fca2172d8afc2c5616c5698a8dcb5a89ce59531a562bf1c5b751a4d56911bac2bb6e3244ba1736d35c5debad247a974f5e20d1d9265985ea2078db65e2202 +8942ad5cbaf82b9801b15b06b256d7d5ed0c44f8d50cf5615881bfdf143d57b25c2f5d9e1730c33b50b14d13cd328b50f7db6c1694b009017f0241ee5dbaee5a +aef26278bcf7be56cd6ba3e618acbf18371ff76f9e498fa74b96e7a5cb73377efdcd9f672baf1d938539fc7194dfe10d40faf1095446e56f36faa4f03a2b6e02 +c52218a1cdc95126113daf91481ef42990ae17a7aed20ddadadaf3feb06855879d609d5d16fbfbbd1f64214f9c10e825f09c99e5eabad754d7facafba4e2ddf9 +2da42e35d07515f4ccbd39065f6f59ba22ec02be7c319265790908e09d4073af020e02108849e055497c5dbd944b82ebe97bddfeb7bfffd911fed1e5f3aa1610 +000026060f002220574d46430100000000000100000000000000050000000020000094450000948500000f242e06ee5a84b2e33927077c495208b206c912a410 +84f12f02c2ed0a350840203281bab02822e655b5bc5e9308958aee0019562ad7d2f48624571e37d5d2eb2872ffbc5c3be50a9768cf21b0f7c63ba78e640a8142 +a09cfd72e5d145efcb6c9791fae2e1dbdf676c956b27b95eb9de39ddee9f14b38e638a5b9638b52092ff27805ea11b2000810102c27b9ddbfd47b9d1b9fdc753 +100c84f47ad7f21425af7a4ee2ee362df71e9e4816494bb0660181bd37de02a0b884c04904ba2e72cadd49f944f57505328fb02b3089bb5783920733ae41b264 +acda11310f5fc01e4187242100010181a63e78952657e1227032b2a4791bd465f4f5ab5397852c8b912c592a755c9cdcb21c57721286801981e1cf2e6611fdbf +e1d73b1eb95f6e59e4ac5809012b0248162bb2d8850004f62270532d7b25f7af6cb865d9b8b8b953e3c350eefa113d0420e04500c9e2451a3f10f826806aa13b +20000108340920599a885800015b027c18b2e58b7508406017025dff8e4beaa4f93094ba7c3b07cf15cbced5253708404095c021aa05c9a2da3518d323c02d8b +1e4b2c4100023b133844affc29219265e73ece9e9bc3bf8e901d11f143000210f81138e1661ac942b70725c02d4bd0c210160420108fc0212f78489678ad4744 +97378643f621358700042000812601244b13110b961138e19e73195c1c43000210c84600c992ad62c7c4cb87a1634a4da2108000044404902c224c2c5a42805b +9625d8710a010840202601244bccba10d57f7ffa9d9f65a1152000010840e04700c94227c425c02d4bdcda1019042000017702481677e438ec21806ae9a1c55a +084000023b1340b2ec5cddecb9a157b25790f821000108281240b228c2c49432017e69481928e62000010864268064c95cbddd63e79665f70a931f042000810e +0248960e582c7526c02d8b3370dc41000210884c00c912b93aa7c7c62dcbe91d40fe108000042e04902cb4435c02dcb2c4ad0d91410002107027806471478ec3 +1e02fc53723db4580b01084060670248969dabbb416e48960d8a480a1080000454082059543062c484c04fafa05a4ce0621402108040360248966c153b2c5ef4 +ca6105275d084000029f04902c34475c02e895b8b5213208400002ee04902ceec871d84380df73eea1c55a084000023b1340b2ec5cdd0d72e3a2658322920204 +20000115024816158c183121c0bfcb628215a310800004721240b2e4ac1b51430002108000040e23806439ace0a9d2e5962555b90816021080802d01248b2d5f +ac4300021080000420a04200c9a28211232604b86531c18a51084000023909205972d68da821000108400002871140b21c56f054e9f28fb2a42a17c142000210 +b0258064b1e58b75084000021080000454082059543062c48a00ff949c1559ec42000210c84600c992ad6227c58b5e39a9dae40a010840a04100c9428b842680 +6a095d1e8283000420e04800c9e2081b5710800004200001088c1240b28c92e33908400002108000041c0920591c61e30a02108000042000815102489651723c +0701084000021080802301248b236c5c4100021080000420304a00c9324a8ee720000108400002107024806471848d2b08400002108000044609205946c9f11c +04200001084000028e04902c8eb0710501084000021080c0280124cb28399e8300042000010840c0910092c51136ae2000010840000210182580641925c77310 +80000420000108381240b238c2c6150420000108400002a304902ca3e4780e02108000042000014702481647d8b882000420000108406094009265941ccf4100 +021080000420e04800c9e2081b5710800004200001088c1240b28c92e33908400002108000041c0920591c61e30a02108000042000815102ff0b07992244e25f +151b0000000049454e44ae4260820840010824000000180000000210c0db01000000030000000000000000000000000000001b40000040000000340000000100 +000002000000000000bf000000bf0080394400007c4303000000000080b3000080b3ff7f3944000080b3000080b3ffff7b432100000008000000620000000c00 +000001000000150000000c00000004000000150000000c0000000400000051000000005f00000000000000000000e5020000fb00000000000000000000000000 +000000000000e6020000fc000000500000003000000080000000805e0000000000002000cc00e6020000fc00000028000000e6020000fc000000010001000000 +0000000000000000000000000000020000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffebfffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffcffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff87fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd07ffffffffffcbfffe03fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffe002fbfffffffc00ffff03fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80012efffffff0003ffe03fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffc00bedb8bffffe0341ffe31fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0003fff807fffffcffff817e0ffe21fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff002b5c00001fffffd7ffff8fff87fe71fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bf6a6a8001ffffffaffff0fff8ffcf0fffffffffffffffffc010101ffff +fffffffffffffffffff4089ffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff437fffffff00e0fffffe3ffc1fffe7fd78fffffffffffffffffc010101ffffffffffffffffffffff200040fffffffffffffffffffffffffff87fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005ffffffff8713ffffffbffc3fffe3fefc7ffffffffffffffffc010101ffff +fffffffffffffffff983ffff0ffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +c0bffffffffe0ffc5fffff8ff8ffffe7fd7f3ffffffffffffffffc010101ffffffffffffffffffffe63f1610000026060f002220574d46430100000000000100 +00000000000005000000002000009425000094850000fffff5fffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffff1fffffffffff +fffffffffffffffffffffffe077ffffffffc3ffe87ffffc7f0fffff9feff3ffffffffffffffffc010101ffffffffffffffffffff09fffffffebfffffffffffff +fffffffffffcffffffffffffffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffffffff02ffffffffff83ffff1ffffe7f1fffffbfeff9fff +fffffffffffffc010101fffffffffffffffffffcb7ffffffffdffffffffffffffffffffffff8fffffffffffffffffffffffffffffffffffffffe07ffffffffff +fffffff7ffffffffffffffc0fffffffffff8fffffcfffff3e1fffffdf9ff8ffffffffffffffffc010101fffffffffffffffffffe5fffffffffffffffffffffff +fffffffffffcfffffffffffdfffffffffffffffffffffffffffc07ffffffffffffffe808097fffffffffff03ffffffffffe0fffffe1ffff3c7fffff8feffcfff +fffffffffffffc010101fffffffffffffffffff1fffffffffffafffffffffffffffffffffff8ffffffffffe03ffffffffffffffffffffffffffc03ffffffffff +fffc028c0006fffffffffc0fffffffffffc1ffffff9ffff9c7fffffef9ffe3fffffffffd7ffffc010101ffffffffffffffffffc7ffffffffffff7fffffffff83 +fffffffffff8ffffffffff801ffffffffffffffffffffffffff843ffffffffffffc0144000001ffffffff03fffffffffffc3ffffffe7fff8cfffffff7dffe1ff +fffffff0fffffc010101ffffffffffffffffffefffffffffffffd7fffffff0007ffffffffff8ffffffffff8007fffffffffffffffffffffffff861ffffffffff +f8006bbffe8000ffffffc0ffffffffffff87ffffffd1fffc4ffffffe71fff1ffffffffe1fffffc010101ffffffffffffffffff1ffffffffffffffbffffffe015 +bffffffffff8ffffffffff0f03ffffffe03ffffffffffffffff0e0ffffffffffe017fffffffc801fffff81ffffffffffff0fffffffea7ffc1fffffff39fff83f +ffffff03fffffc010101fffffffffffffffffe7ffffffffffffffdffffff81f80fffffffadd8fffffffffe1fc1ffffffc04ffffffffffffffff0f0fffffffffe +805ffffffffff007fffe0fffffffffffff1ffffffffcfffe3fffffff39fff81ffffff01ffffffc010101fffffffffffffffff8ffffffffffffffff3ffffe07ff +07ffff0000007ffffffffe3fe0fffffc0000ffffffffffffffe1e0fffffffffc03fffffffffffe00fffc1ffffffffffffe1fffffffff3ffe7fffffff31ffff03 +ffff803ffffffc010101fffffffffffffffffbffffffffffffffffdffffe3fff87fffc00000017fffffffc3ff07ffff007a07fffffffffffffe1f07ffffffff0 +0fffffffffffffd07ff07ffffffffffffe3ffffffffedffe3fffffff9bffff80fffc05fffffffc010101ffffffffffffffffe5ffffffffffffffffeffff87fff +effff80015007c7ffffffc7ffc3fffc01ffc0fffffffffffffe3f87fffffff803fffffffffffffe80fc0fffffffffffffc7fffffffffa7fe7fffffffbdffffe0 +14200ffffffffc010101ffffffffffffffffd3fffffffffffffffff3ffe0fffff5ffe17ffff843bffffff87ffe3fff80ffff03ffffffffffffc3f07fffffc101 +fffffffffffffffe0783fffffffffffff87fffffffffe7fd7fffffff9bfffff800001ffffffffc010101ffffffffffffffffaffffffffffffffffffdffe1ffff +fbfff7fffff8fd0bfffff8fffe1ffe03ffffccffffffffffffc7f87ffffe0007ffffffffffffffff8087fffffffffffff8ffffffffffdbfe7fffffffd3fffffe +0000fffffffffc010101ffffffffffffffff5ffffffffffffffffffeffc7fffffdfffffffff8ffe4fffff8ffffbffc0ffffff53fffffffffffc3f8bffffc001f +ffffffffffffffffe01ffffffffffffff0fffffffffff5fd7fffffffcdffffffc00ffffffffffc010101fffffffffffffffebfffffffffffffffffff7f87ffff +fefffffffff8fffa0ffff8ffffdff83fffffff1fffffffffff87fcfffff8107fffffffffffffffffe03fffffffffffffe1fffffffffffafbffffffffdbffffff +fffffffffffffc010101fffffffffffffffd7fffffffffffffffffffbf9ffffffefffffffff8ffff03fff1ffffeff07ffffffec7ffffffffffc7fc7fe7e0787f +ffffffffffffffffe01fffffffffffffe3fffffffffffd757fffffffebfffffffffffffffffffc010101fffffffffffffffeffffffffffffffffffffdf1fffff +fe7ffffffff8ffffe0fff8fffff7e1ffffffffa7ffffffffff8ffe257fe0f8ffffffffffffffffffc01fffffffffffffc3fffffffffffea3fffffffff7ffffff +fffffffffffffc010101fffffffffffffffa7fffffffffffffffffffee3ffffffe7ffffffffcfffff01ff9fffff7e1ffffffffd1ffffffffff8ffe1fffc1f87f +ffffffffffffffff07e7ffffffffffffc7fffffffffffff77ffffffffffffffffffffffffffffc010101fffffffffffffff1fffffffffffffffffffffc3fffff +ff3ffffffff9fffffc0ff9fffffbe3ffffffffe81fffffffff8fff7fff87f0fffffffffffffffffe0707ffffffffffff87fffffffffffe83ffffffffffffffff +fffffffffffffc010101fffffffffffffffbfffffffffffffffffffff87ffffffe3ffffffff8ffffff03f9fffffbc7fffffffff402ffffffff0fffbfff0fffff +fffffffffffffffc1ff9ffffffffffff87ffffffffffff657ffffffffffffffffffffffffffffc010101ffffffffffffffe7fffffffffffffffffffff8ffffff +ff3ffffffff9ffffffc0f8fffffce3ffffffffff007fffffff8fffdffe0ffffffffffffffffffff87fd1ffffffffffff0fffffffffffffc2ffffffffffffffff +fffffffffffffc010101ffffffffffffffebfffffffffffffffffffff9ffffffff1ffffffff0fffffff078fffffec7ffffffffffe01fffffff1ffffffc1fffff +ffffffffffffffe0ffeeffffffffffff0fffffffffffffe5fffffffffffffffffffffffffffffc010101ffffffffffffffd7fffffffffffffffffffff2ffffff +ff3ffffffff8fffffffc18fffffe47fffffffffffe0fffffff8fffdff83fffffffffffffffffffc1fffb3fffffffffff1ffffffffffffff2ffffffffffffffff +fffffffffffffc010101ffffffffffffffcffffffffffffffffffffff9ffffffff3ffffffff9ffffffff08ffffff6fffffffffffffc7ffffff1fffedf87fffff +ffffffffffffff83fffd3ffffffffffe3ffffffffffffff5fffffffffffffffffffffffffffffc010101ffffffffffffffbffffffffffffffffffffff1ffffff +ff1ffffffff0ffffffff807fffffb7ffffffffffffffffffff1ffffff0ffffffffffffffffffff07fffe9ffffffffffc3ffffffffffffffbffffffffffffffff +fffffffffffffc010101ffffffffffffff9ffffffffffffffffffffff77fffffff3ffffffff9ffffffffc0ffffff07ffffffffffffffffffff1ffff5e0ffffff +fffffffffffffe1ffffffffffffffffc7ffffffffffffffdfffffffffffffffffffffffffffffc010101ffffffffffffff3ffffffffffffffffffffff9ffffff +fe1ffffffff0fffffffff47fffffb7ffffffffffffffffffff1ffffec3fffffffffffffffffffe3fffff4ffffffffff8ffffffffffffffffffffffffffffffff +fffffffffffffc010101ffffffffffffff5fffffffffffffffffffffe7fffffff73dbdfffff9fffffffff83fffffd7ffffffffffffffffffff1ffffe07ffffff +fffffffffffff83ffffff7fffffffff87ffffffffffffffafffffffffffffffffffffffffffffc010101fffffffffffffebffffffffffffffffffffffbffffe5 +7e3ff6bffff0fffffffffe1fffffdbffffffffffffffffffff1fffff07fffffffffffffffffff0ffffffdbfffffffff9ffffffffffffffffffffffffffffffff +fffffffffffffc010101ffffffffffffff7fffffffffffffffffffffe7ffffffff7fffebfff9fffffffffd1fffffeffffffffffffffffffffe1fffff1fffffff +ffffffffffffe1fffffff7fffffffff0ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffefffff3f +fefffff5bff0ffffffffff0fffffffffffffffffffffffffff1fffffffffffffffffffffffffc3ffffffedfffffffff1ffffffffffffffffffffffffffffffff +fffffffffffffc010101fffffffffffffd7fffffffffffffffffffffd7fff8fffd7ffffe4bf1ffffffffffc7fffffffffffffffffffffffffe3fffffffffffff +ffffffffffff87fffffffbffffffffe3fffffffffffffffefffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffeffff1ff +feffffffe5f1ffffffffffa3ffffffffffffffffffffffffff1fffffffffffffffffffffffff8ffffffffeffffffffe1ffffffffffffffffbfffffffffffffff +fffffffffffffc010101fffffffffffffd7fffffffffffffffffffffdfffe3fff9fffffffa39ffffffffffd9fffffffffffffffffffffffffe1fffffffffffff +ffffffffffff1fffffffff7fffffffe7ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffcfffc7ff +fffffffffea9ffffffffffe9ffffffffffffffffffffffffff3ffffffffffffffffffffffffe1fffffffffffffffffe3ffffffffffffffffbfffffffffffffff +fffffffffffffc010101fffffffffffffdfffffffffffffffffffffff7ff8ffff3ffffffffd1fffffffffff7fffffffffffffffffffffffffe1fffffffffffff +fffffffffffc3ffffffffd7fffffffc7ffffffffffffffffdffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff0fff +ebfffffffff1ffffffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffffc3fffffffffbfffffffc7ffffffffffffffffffffffffffffffff +fffffffffffffc010101fffffffffffffdffffffffffffffffffffffdfff8fffd7fffffffff1fffffffffffffffffffffffffffffffffffffe3fffffffffffff +fffffffffff0ffffffffffdfffffffcfffffffffffffffffcffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff17ff +e7fffffffff3ffffffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffff1ffffffffffbfffffffc7ffffffffffffffffffffffffffffffff +fffffffffffffc010101fffffffffffff9ffffffffffffffffffffffffff3fff5ffffffffff3fffffffffffffffffffffffffffffffffffffe3fffffffffffff +ffffffffffe1ffffffffffefffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffcfff9bfe +3ffffffffffbf7fffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffebffffffffffbfffffff8fffffffffffffffffefffffffffffffff +fffffffffffffc010101fffffffffffffdffffffffffffffffffffffdfff2bfc7fffffffffebfffffffffffffffffffffffffffffffffffffe3fffffffffffff +ffffffffffc7ffffffffffcfffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffcfffcca1 +fffffffffff1fffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffff87ffffffffffffffffff0fffffffffffffffffffffffffffffffff +fffffffffffffc010101fffffffffffffdfffffffffffffffffffffff7fff207fffffffffff7feffffffffffffffffffffffffffffffffffff7fffffffffffff +ffffffffff0fffffffffffe7ffffff1fffffffffffffffffebfffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffcfffffdf +ffffffffffe3ffffffffffffffffffffffffffffffffffffff3fffffffffffffffffffffff3fffffffffffffffffff9ffffffffffffffffff7ffffffffffffff +fffffffffffffc010101fffffffffffffbfffffffffffffffffffffff7fffffffffffffffff3ff7ffffffffffffffffffffffffffffffffffe1fffffffffffff +fffffffffe9fffffffffffefffffff1ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffff1ffffffffffffffffffffffefffffff +fffffffffff9ffefffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffe7ffffffffffff7ffffff1fffffffffffffffffe7ffffffffffffff +fffffffffffffc010101fffffffffffffbfffffffffffffffffffffff7fffffffffffffffff3fffffffffffffffffffffffffffffffffffffe1fffffffffffff +fffffffffd7fffffffffffeffffffe3ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffebffffff +ffffffffffebffffffffffffffffffffffffffffffffffffff1ffffffffffffffffffffffafffffffffffffbffffff3ffffffffffffffffffdffffffffffffff +fffffffffffffc010101fffffffffffffdfffffffffffffffffffffff7ffeffffffffffffff5fffbffffffffffffffffffffffffffffffffff1fffffffffffff +fffffffff9fffffffffffff7fffffe1ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffbffffff +fffffffffffbffffffffffffffffffffffffffffffffffffff1ffffffffffffffffffffff3fffffffffffff5fffffe3ffffffffffffffffff7ffffffffffffff +fffffffffffffc010101fffffffffffffbfffffffffffffffffffffffdffffffffffffffffe3fffdffffffffffffffffffffffffffffffffff1fffffffffffff +ffffffffeffffffffffffffbfffffe3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffdffffff +fffffffffff3fffeffffffffffffffffffffffffffffffffff9fffffffffffffffffffffe3fffffffffffff7fffffe7ffffffffffffffffff3ffffffffffffff +fffffffffffffc010101fffffffffffffbfffffffffffffffffffffffeffdfffffffffffffe3ffffbfffffffffffffffffffffffffffffffff1fffffffffffff +ffffffffcffffffffffffff9fffffe3ffffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffff7fefff +ffffffffffe7ffffffffffffffffffffffffffffffffffffff8fffffffffffffffffffff9ffffffffffffffbfffffe7ffffffffffffffffffbffffffffffffff +fffffffffffffc010101fffffffffffff7ffffffffffffffffffffffffbfdfffffffffffffe3ffffdfffffffffffffffffffffffffffffffff9fffffffffffff +ffffffffbffffffffffffffbfffffe3ffffffffffffffffffdfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffff47bfff +ffffffffffe7ffffffffffffffffffffffffffffffffffffff0fffffffffffffffffffff1ffffffffffffffdfffffe3ffffffffffffffffffbffffffffffffff +fffffffffffffc010101fffffffffffff7ffffffffffffffffffffffffc27fffffffffffffe3ffffffffffffffffffffffffffffffffffffff8fffffffffffff +ffffffff3ffffffffffffffbfffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffffe0bfff +ffffffffffd7fffff7ffffffffffffffffffffffffffffffffcffffffffffffffffffffe7ffffffffffffffdfffffc3ffffffffffffffffffbffffffffffffff +fffffffffffffc010101fffffffffffff7fffffffffffffffffffffffff0ffffffffffffffebffffffffffffffffffffffffffffffffffffff87ffffffffffff +fffffffe7ffffffffffffff9fffffe3ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffffbfffffffffffffffffffffffffdffff +ffffffffffe7fffffbffffffffffffffffffffffffffffffffcffffffffffffffffffffc7ffffffffffffffcfffffe7ffffffffffffffffffbffffffffffffff +fffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffebffffffffffffffffffffffffffd54286ffffffc7ffffffffffff +fffffff8fffffffffffffffdfffffe3dfffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffffffffff +ffffffffffe7fffffefffffffffffffffffd0000000011b5ff87fffffffffffffffffff9fffffffffffffffdfffffc7ffffffffffffffffff5ffffffffffffff +fffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffe8000228000000136c7ffffffffffff +fffffff9fffffffffffffffcfffffe3dfffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff5ffffffffffffffffffffffffffffff +ffffffffffc7ffffffffffffffffffff4002dfdd7dbea0000007fffffffffffffffffff1fffffffffffffffdfffffe7dfffffffffffffffff9ffffffffffffff +fffffffffffffc010101fffffffffffffbfffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffe000af7fffffffffd0000fffffffffffff +fffffff1fffffffffffffffcfffffe3ffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffff +ffffffffffe7ffffff7ffffffffffc002dfffffffffffffff6bffffffffffffffffffff3fffffffffffffffeffffff3ffffffffffffffffffbffffffffffffff +fffffffffffffc010101fffffffffffffbffffffffffffffffffffffffffffffffffffffffcfffffffffffffffff5005ffffffffffffffffffffffffffffffff +ffffffe3fffffffffffffffdffffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffff +ffffffffffe7ffffffdffffffff000ffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffcffffff1ffffffffffffffffff5ffffffffffffff +fffffffffffffc010101fffffffffffffaffffffffffffffffffffffffffffffffffffffffeffffffffffffffe80177fffffffffffffffffffffffffffffffff +ffffffe7fffffffffffffffd7fffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffff +ffffffffffc7ffffffefffffe002ffffffffffffffffffffffffffffffffffffffffffc3fffffffffffffffdffffff1ffffffffffffffffff7ffffffffffffff +fffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffff002fffffffffffffffffffffffffffffffffffff +ffffffe7fffffffffffffffcffffffbffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffcffffffffffffffffffffffffffffff +ffffffffffc7fffffff7fff801ffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffdffffff0ffffffffffffffffff7ffffffffffffff +fffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003fffffffffffffffffffffffffffffffffffffff +ffffffcffffffffffffffffeffffff9fffffffffffffffffcbfffffffffffffffffffffffffffc010101ffffffffffffff7fffffffffffffffffffffffffffff +ffffffffffc7fffffffbf801ffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffff9ffffff8fffffffffffffffffb7ffffffffffffff +fffffffffffffc010101fffffffffffffeffffffffffffffffffffffffffffffffffffffffeffffffffe801fffffffffffffffffffffffffffffffffffffffff +ffffff8ffffffffffffffffdffffff8fffffffffffffffffeffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffd7fffffff001ffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffaffffffcfffffffffffffffffe7ffffffffffffff +fffffffffffffc010101ffffffffffffff7fffffffffffffffffffffffffffffffffffffffefffffff8017ffffffffffffffffffffffffffffffffffffffffff +ffffff8ffffffffffffffffdffffffc7ffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffff +ffffffffffc7fffffc00ffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffff3ffffffc7ffffffffffffffffefffffffffffffff +fffffffffffffc010101fffffffffffffeffffffffffffffffffffffffffffffffffffffff9fffffc00dffffffffffffffffffffffffffffffffffffffffffff +ffffff9ffffffffffffffffdffffffe3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffff +ffffffffffe7fffe00ffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffff3fffffff1ffffffffffffffffefffffffffffffff +fffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffcfffe007ff7fffffffffffffffffffffffffffffffffffffffffff +ffffff9ffffffffffffffffffffffff3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffdfffffffffffffffffffffffffffff +ffffffffffd7fe003fffffffffffffffffffffffffffffffffffffffffffffffffffff8fffffffffffffffe3fffffff8ffffffffffffffff3fffffffffffffff +fffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffeff003ffffffffffffffffffffffffffffffffffffffffffffffff +ffffff9ffffffffffffffffffffffff8ffffffffffffffffbffffffffffffffffffffffffffffc010101ffffffffffffffcfffffffffffffffffffffffffffff +ffffffffff8fa01fffff7fffffffffffffffffffffff1610000026060f002220574d464301000000000001000000000000000500000000200000940500009485 +0000ffffffffffffffffffffffffff9dffffffffffffffc7fffffffc7ffffffffffffffe7ffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffe001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dfffffffffffffffffffffffebfffffff +fffffffdfffffffffffffffffffffffffffffc010101ffffffffffffffd7ffffffffffffffffffffffffffffffffffffff800fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffafffffffffffffffcfffffffff1ffffffffffffffafffffffffffffffffffffffffffffc010101ffffffffffffffefffff +fffffffffffffffffffffffffffffffffe007fffffffbfffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffff9fffffffffaf7fffff +fffffff5fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffff003ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff8fffffffffffffff7fffffffffcffffffffffffffbfffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffff800fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffffff3fffffffffc3ffffff +ffffffe7fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffc0197ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffe5fffffffffffffeffffffffffe8ffffffffffffdffffffffffffffffffffffffffffffc010101fffffffffffffffbffff +fffffffffffffffffffffffffffffff00fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffd7ffffffffff0ffffff +ffffff3ffffffffffffffffffffffffffffffc010101fffffffffffffff5ffffffffffffffffffffffffffffffffff807fd7ffffffffefffffffffffffffffff +ffffffffffffffffffffffffffffffebfffffffffffff8fffffffffffc3f7ffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffffffffffffffffffc03ffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffff7fffffffffffe1fffff +fffffdfffffffffffffffffffffffffffffffc010101fffffffffffffffdffffffffffffffffffffffffffffffffe017ffefffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff9ffffffffffffebffffffffffffcfffffffffebfffffffffffffffffffffffffffffffc010101fffffffffffffffeffff +fffffffffffffffffffffffffffe80ffffd7fffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffdfffffffffffffb3fdff +fffff7fffffffffffffffffffffffffffffffc010101fffffffffffffffdfffffffffffffffffffffffffffffff803ffffcfffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffc7fffffffffffbfffffffffffffe4be7fffff2ffffffffffffffffffffffffffffffffc010101fffffffffffffffeffff +ffffffffffffffffffffffffffc01fffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3ffffffffffe7ffffffffffffffa379f +fffdfffffffffffffffffffffffffffffffffc010101ffffffffffffffff3ffffffffffffffffffffffffffffc00ffffffdfffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff1ffffffffffbfffffffffffffffd0fcfffebfffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffffffffffffff00fffffffe7fffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffaeffffffffd7ffffffffffffffffb937 +feb7fffffffffffffffffffffffffffffffffc010101ffffffffffffffffbfffffffffffffffffffffffffff807fffffffdfffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffd32fffffffbfffffffffffffffffeacbd57ffffffffffffffffffffffffffffffffffc010101ffffffffffffffff7fff +fffffffffffffffffffffffd01ffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb8cffffeeffffffffffffffffffff34 +affffffffffffffffffffffffffffffffffffc010101ffffffffffffffffdffffffffffffffffffffffffff00fffffffffcfffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffdffffffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffefff +fffffffffffffeffffffffc03ffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe57ffeaffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff5ffffffe00ffffffffffcfffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffe9ad3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffefff +fffffffffffffffffffff80bfffffffffff7fffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffef7ffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7fffffc03fffffffffffcfffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffff7ff +ffffffffffffffdffffe01ffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffbfffffffffffffffefffff007ffffffffffffebfffffffffdffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffeff +ffffffffffffffdfff803fffffffffffffc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7ffd01ffffffffffffffefffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffffff50ffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffeffffffffffffffffffc07fffffffffffffffc7fffffffffdffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffff3fc7fffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffe9fdfffffffffffffffffe7ffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffbffffffffffffffffffff7fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff7fffffffffffffffffffe3ffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffef +ffffffffffffffafffffffffffffffffffe5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffdffffffffffffffffffff3fffffffffdffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffef +ffffffffffffff77fffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5ffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffff7bfffffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5fffffffffdffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffff17fffffffffffffffffff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff3ffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffff9ffffffffffffffffffff8fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffd7fffffffffffffffffffdfffffffffbffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +bfffffffffffffaffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffefffffffffffffd7fffffffffffffffffffeffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffffbfffffffffffffffffffdfffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7fffffffffffffffffffc7fffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffffffffffffffffffffffffefffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffdffffffffffffeffffffffffffffffffffe7fffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffff3fffffffffffffffffffebffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffefffffffffffff3ffffffffffffffffffff7fffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffffffffff7ffffffffffffffffffff1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffffffdfffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffefffffffffffebffffffffffffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7ffffffffffffffffffff8fffffff5fffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffbffffffffffebffffffffffffffffffffc7ffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffefffffffffffffffffffffffffffffffff3fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffff7fffffffffe7fffffffffffffffffffff5fffffbffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffdffffffffffffffffffffffffffffffff8fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffefffffffffffffffffffffff7fffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffeffffffffffffffffffffffffffffffffeffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffbffffffffdfffffffffffffffffffffff2fff7fffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffdffffffffefffffffffffffffffffffffd3c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffec7bffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffdfffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +fffffffbffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffcffffffbfffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffff5fffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffebfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffdfff6ffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffff87efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffabfffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffe002000026060f00b605574d4643010000000000010000000000000005000000940500000000000094850000fffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 +0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0101014c000000640000000000000000000000e5020000fb000000000000000000 +0000e6020000fc0000002900aa0000000000000000000000803f00000000000000000000803f0000000000000000000000000000000000000000000000000000 +000000000000220000000c000000ffffffff460000001c00000010000000454d462b024000000c000000000000000e0000001400000000000000100000001400 +00000400000003010800050000000b0200000000050000000c02fc00e602030000001e0004000000070104000400000007010400652f0000410b2000cc00fc00 +e60200000000fc00e6020000000028000000e6020000fc0000000100010000000000000000000000000000000000020000000000000000000000ffffff00ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffebfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffbffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffd07ffffffffffcbfffe03fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe002fbfffffffc00ffff03fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff80012efffffff0003ffe03fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00bedb8bffffe0341ffe31fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffa0003fff807fffffcffff817e0ffe21fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff002b5c00001fffffd7ffff8fff87fe71fffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff80bf6a6a8001ffffffaffff0fff8ffcf0fffffffffffffffffc010101fffffffffffffffffffffff4089ffffffffffffffffffffffffffffcffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff437fffffff00e0fffffe3ffc1fffe7fd78fffffffffffffffffc010101ffff +ffffffffffffffffff200040fffffffffffffffffffffffffff87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f005ffffffff8713ffffffbffc3fffe3fefc7ffffffffffffffffc010101fffffffffffffffffffff983ffff0ffffffffffffffffffffffffffcffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0bffffffffe0ffc5fffff8ff8ffffe7fd7f3ffffffffffffffffc010101ffff +ffffffffffffffffe63ffffff5fffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffff1ffffffffffffffffffffffffffffffffffe +077ffffffffc3ffe87ffffc7f0fffff9feff3ffffffffffffffffc010101ffffffffffffffffffff09fffffffebffffffffffffffffffffffffcffffffffffff +ffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffffffff02ffffffffff83ffff1ffffe7f1fffffbfeff9ffffffffffffffffc010101ffff +fffffffffffffffcb7ffffffffdffffffffffffffffffffffff8fffffffffffffffffffffffffffffffffffffffe07fffffffffffffffff7ffffffffffffffc0 +fffffffffff8fffffcfffff3e1fffffdf9ff8ffffffffffffffffc010101fffffffffffffffffffe5ffffffffffffffffffffffffffffffffffcfffffffffffd +fffffffffffffffffffffffffffc07ffffffffffffffe808097fffffffffff03ffffffffffe0fffffe1ffff3c7fffff8feffcffffffffffffffffc010101ffff +fffffffffffffff1fffffffffffafffffffffffffffffffffff8ffffffffffe03ffffffffffffffffffffffffffc03fffffffffffffc028c0006fffffffffc0f +ffffffffffc1ffffff9ffff9c7fffffef9ffe3fffffffffd7ffffc010101ffffffffffffffffffc7ffffffffffff7fffffffff83fffffffffff8ffffffffff80 +1ffffffffffffffffffffffffff843ffffffffffffc0144000001ffffffff03fffffffffffc3ffffffe7fff8cfffffff7dffe1fffffffff0fffffc010101ffff +ffffffffffffffefffffffffffffd7fffffff0007ffffffffff8ffffffffff8007fffffffffffffffffffffffff861fffffffffff8006bbffe8000ffffffc0ff +ffffffffff87ffffffd1fffc4ffffffe71fff1ffffffffe1fffffc010101ffffffffffffffffff1ffffffffffffffbffffffe015bffffffffff8ffffffffff0f +03ffffffe03ffffffffffffffff0e0ffffffffffe017fffffffc801fffff81ffffffffffff0fffffffea7ffc1fffffff39fff83fffffff03fffffc010101ffff +fffffffffffffe7ffffffffffffffdffffff81f80fffffffadd8fffffffffe1fc1ffffffc04ffffffffffffffff0f0fffffffffe805ffffffffff007fffe0fff +ffffffffff1ffffffffcfffe3fffffff39fff81ffffff01ffffffc010101fffffffffffffffff8ffffffffffffffff3ffffe07ff07ffff0000007ffffffffe3f +e0fffffc0000ffffffffffffffe1e0fffffffffc03fffffffffffe00fffc1ffffffffffffe1fffffffff3ffe7fffffff31ffff03ffff803ffffffc010101ffff +fffffffffffffbffffffffffffffffdffffe3fff87fffc00000017fffffffc3ff07ffff007a07fffffffffffffe1f07ffffffff00fffffffffffffd07ff07fff +fffffffffe3ffffffffedffe3fffffff9bffff80fffc05fffffffc010101ffffffffffffffffe5ffffffffffffffffeffff87fffeffff80015007c7ffffffc7f +fc3fffc01ffc0fffffffffffffe3f87fffffff803fffffffffffffe80fc0fffffffffffffc7fffffffffa7fe7fffffffbdffffe014200ffffffffc010101ffff +ffffffffffffd3fffffffffffffffff3ffe0fffff5ffe17ffff843bffffff87ffe3fff80ffff03ffffffffffffc3f07fffffc101fffffffffffffffe0783ffff +fffffffff87fffffffffe7fd7fffffff9bfffff800001ffffffffc010101ffffffffffffffffaffffffffffffffffffdffe1fffffbfff7fffff8fd0bfffff8ff +fe1ffe03ffffccffffffffffffc7f87ffffe0007ffffffffffffffff8087fffffffffffff8ffffffffffdbfe7fffffffd3fffffe0000fffffffffc010101ffff +ffffffffffff5ffffffffffffffffffeffc7fffffdfffffffff8ffe4fffff8ffffbffc0ffffff53fffffffffffc3f8bffffc001fffffffffffffffffe01fffff +fffffffff0fffffffffff5fd7fffffffcdffffffc00ffffffffffc010101fffffffffffffffebfffffffffffffffffff7f87fffffefffffffff8fffa0ffff8ff +ffdff83fffffff1fffffffffff87fcfffff8107fffffffffffffffffe03fffffffffffffe1fffffffffffafbffffffffdbfffffffffffffffffffc010101ffff +fffffffffffd7fffffffffffffffffffbf9ffffffefffffffff8ffff03fff1ffffeff07ffffffec7ffffffffffc7fc7fe7e0787fffffffffffffffffe01fffff +ffffffffe3fffffffffffd757fffffffebfffffffffffffffffffc010101fffffffffffffffeffffffffffffffffffffdf1ffffffe7ffffffff8ffffe0fff8ff +fff7e1ffffffffa7ffffffffff8ffe257fe0f8ffffffffffffffffffc01fffffffffffffc3fffffffffffea3fffffffff7fffffffffffffffffffc010101ffff +fffffffffffa7fffffffffffffffffffee3ffffffe7ffffffffcfffff01ff9fffff7e1ffffffffd1ffffffffff8ffe1fffc1f87fffffffffffffffff07e7ffff +ffffffffc7fffffffffffff77ffffffffffffffffffffffffffffc010101fffffffffffffff1fffffffffffffffffffffc3fffffff3ffffffff9fffffc0ff9ff +fffbe3ffffffffe81fffffffff8fff7fff87f0fffffffffffffffffe0707ffffffffffff87fffffffffffe83fffffffffffffffffffffffffffffc010101ffff +fffffffffffbfffffffffffffffffffff87ffffffe3ffffffff8ffffff03f9fffffbc7fffffffff402ffffffff0fffbfff0ffffffffffffffffffffc1ff9ffff +ffffffff87ffffffffffff657ffffffffffffffffffffffffffffc010101ffffffffffffffe7fffffffffffffffffffff8ffffffff3ffffffff9ffffffc0f8ff +fffce3ffffffffff007fffffff8fffdffe0ffffffffffffffffffff87fd1ffffffffffff0fffffffffffffc2fffffffffffffffffffffffffffffc010101ffff +ffffffffffebfffffffffffffffffffff9ffffffff1ffffffff0fffffff078fffffec7ffffffffffe01fffffff1ffffffc1fffffffffffffffffffe0ffeeffff +ffffffff0fffffffffffffe5fffffffffffffffffffffffffffffc010101ffffffffffffffd7fffffffffffffffffffff2ffffffff3ffffffff8fffffffc18ff +fffe47fffffffffffe0fffffff8fffdff83fffffffffffffffffffc1fffb3fffffffffff1ffffffffffffff2fffffffffffffffffffffffffffffc010101ffff +ffffffffffcffffffffffffffffffffff9ffffffff3ffffffff9ffffffff08ffffff6fffffffffffffc7ffffff1fffedf87fffffffffffffffffff83fffd3fff +fffffffe3ffffffffffffff5fffffffffffffffffffffffffffffc010101ffffffffffffffbffffffffffffffffffffff1ffffffff1ffffffff0ffffffff807f +ffffb7ffffffffffffffffffff1ffffff0ffffffffffffffffffff07fffe9ffffffffffc3ffffffffffffffbfffffffffffffffffffffffffffffc010101ffff +ffffffffff9ffffffffffffffffffffff77fffffff3ffffffff9ffffffffc0ffffff07ffffffffffffffffffff1ffff5e0fffffffffffffffffffe1fffffffff +fffffffc7ffffffffffffffdfffffffffffffffffffffffffffffc010101ffffffffffffff3ffffffffffffffffffffff9fffffffe1ffffffff0fffffffff47f +ffffb7ffffffffffffffffffff1ffffec3fffffffffffffffffffe3fffff4ffffffffff8fffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffff5fffffffffffffffffffffe7fffffff73dbdfffff9fffffffff83fffffd7ffffffffffffffffffff1ffffe07fffffffffffffffffff83ffffff7ff +fffffff87ffffffffffffffafffffffffffffffffffffffffffffc010101fffffffffffffebffffffffffffffffffffffbffffe57e3ff6bffff0fffffffffe1f +ffffdbffffffffffffffffffff1fffff07fffffffffffffffffff0ffffffdbfffffffff9fffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffff7fffffffffffffffffffffe7ffffffff7fffebfff9fffffffffd1fffffeffffffffffffffffffffe1fffff1fffffffffffffffffffe1fffffff7ff +fffffff0ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffefffff3ffefffff5bff0ffffffffff0f +ffffffffffffffffffffffffff1fffffffffffffffffffffffffc3ffffffedfffffffff1fffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffd7fffffffffffffffffffffd7fff8fffd7ffffe4bf1ffffffffffc7fffffffffffffffffffffffffe3fffffffffffffffffffffffff87fffffffbff +ffffffe3fffffffffffffffefffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffeffff1fffeffffffe5f1ffffffffffa3 +ffffffffffffffffffffffffff1fffffffffffffffffffffffff8ffffffffeffffffffe1ffffffffffffffffbffffffffffffffffffffffffffffc010101ffff +fffffffffd7fffffffffffffffffffffdfffe3fff9fffffffa39ffffffffffd9fffffffffffffffffffffffffe1fffffffffffffffffffffffff1fffffffff7f +ffffffe7ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffcfffc7fffffffffffea9ffffffffffe9 +ffffffffffffffffffffffffff3ffffffffffffffffffffffffe1fffffffffffffffffe3ffffffffffffffffbffffffffffffffffffffffffffffc010101ffff +fffffffffdfffffffffffffffffffffff7ff8ffff3ffffffffd1fffffffffff7fffffffffffffffffffffffffe1ffffffffffffffffffffffffc3ffffffffd7f +ffffffc7ffffffffffffffffdffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff0fffebfffffffff1ffffffffffff +ffffffffffffffffffffffffff3ffffffffffffffffffffffffc3fffffffffbfffffffc7fffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffdffffffffffffffffffffffdfff8fffd7fffffffff1fffffffffffffffffffffffffffffffffffffe3ffffffffffffffffffffffff0ffffffffffdf +ffffffcfffffffffffffffffcffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff17ffe7fffffffff3ffffffffffff +ffffffffffffffffffffffffff3ffffffffffffffffffffffff1ffffffffffbfffffffc7fffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffff9ffffffffffffffffffffffffff3fff5ffffffffff3fffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffe1ffffffffffef +ffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffcfff9bfe3ffffffffffbf7ffffffffff +fffffffffffffffffffffffffe3fffffffffffffffffffffffebffffffffffbfffffff8fffffffffffffffffeffffffffffffffffffffffffffffc010101ffff +fffffffffdffffffffffffffffffffffdfff2bfc7fffffffffebfffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffc7ffffffffffcf +ffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffcfffcca1fffffffffff1ffffffffffff +fffffffffffffffffffffffffe3fffffffffffffffffffffff87ffffffffffffffffff0ffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffdfffffffffffffffffffffff7fff207fffffffffff7feffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff0fffffffffffe7 +ffffff1fffffffffffffffffebfffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffcfffffdfffffffffffe3ffffffffffff +ffffffffffffffffffffffffff3fffffffffffffffffffffff3fffffffffffffffffff9ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff +fffffffffbfffffffffffffffffffffff7fffffffffffffffff3ff7ffffffffffffffffffffffffffffffffffe1ffffffffffffffffffffffe9fffffffffffef +ffffff1ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffff1ffffffffffffffffffffffeffffffffffffffffff9ffefffffffff +ffffffffffffffffffffffffff3ffffffffffffffffffffffe7ffffffffffff7ffffff1fffffffffffffffffe7fffffffffffffffffffffffffffc010101ffff +fffffffffbfffffffffffffffffffffff7fffffffffffffffff3fffffffffffffffffffffffffffffffffffffe1ffffffffffffffffffffffd7fffffffffffef +fffffe3ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffebffffffffffffffffebffffffffffff +ffffffffffffffffffffffffff1ffffffffffffffffffffffafffffffffffffbffffff3ffffffffffffffffffdfffffffffffffffffffffffffffc010101ffff +fffffffffdfffffffffffffffffffffff7ffeffffffffffffff5fffbffffffffffffffffffffffffffffffffff1ffffffffffffffffffffff9fffffffffffff7 +fffffe1ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffbfffffffffffffffffbffffffffffff +ffffffffffffffffffffffffff1ffffffffffffffffffffff3fffffffffffff5fffffe3ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff +fffffffffbfffffffffffffffffffffffdffffffffffffffffe3fffdffffffffffffffffffffffffffffffffff1fffffffffffffffffffffeffffffffffffffb +fffffe3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffdfffffffffffffffff3fffeffffffff +ffffffffffffffffffffffffff9fffffffffffffffffffffe3fffffffffffff7fffffe7ffffffffffffffffff3fffffffffffffffffffffffffffc010101ffff +fffffffffbfffffffffffffffffffffffeffdfffffffffffffe3ffffbfffffffffffffffffffffffffffffffff1fffffffffffffffffffffcffffffffffffff9 +fffffe3ffffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffff7fefffffffffffffe7ffffffffffff +ffffffffffffffffffffffffff8fffffffffffffffffffff9ffffffffffffffbfffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff +fffffffff7ffffffffffffffffffffffffbfdfffffffffffffe3ffffdfffffffffffffffffffffffffffffffff9fffffffffffffffffffffbffffffffffffffb +fffffe3ffffffffffffffffffdfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffff47bfffffffffffffe7ffffffffffff +ffffffffffffffffffffffffff0fffffffffffffffffffff1ffffffffffffffdfffffe3ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff +fffffffff7ffffffffffffffffffffffffc27fffffffffffffe3ffffffffffffffffffffffffffffffffffffff8fffffffffffffffffffff3ffffffffffffffb +fffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffffe0bfffffffffffffd7fffff7ffffff +ffffffffffffffffffffffffffcffffffffffffffffffffe7ffffffffffffffdfffffc3ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff +fffffffff7fffffffffffffffffffffffff0ffffffffffffffebffffffffffffffffffffffffffffffffffffff87fffffffffffffffffffe7ffffffffffffff9 +fffffe3ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffffbfffffffffffffffffffffffffdffffffffffffffe7fffffbffffff +ffffffffffffffffffffffffffcffffffffffffffffffffc7ffffffffffffffcfffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff +fffffffffdffffffffffffffffffffffffffffffffffffffffebffffffffffffffffffffffffffd54286ffffffc7fffffffffffffffffff8fffffffffffffffd +fffffe3dfffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffffffffffffffffffffe7fffffeffffff +fffffffffffd0000000011b5ff87fffffffffffffffffff9fffffffffffffffdfffffc7ffffffffffffffffff5fffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffe8000228000000136c7fffffffffffffffffff9fffffffffffffffc +fffffe3dfffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff5ffffffffffffffffffffffffffffffffffffffffc7ffffffffffff +ffffffff4002dfdd7dbea0000007fffffffffffffffffff1fffffffffffffffdfffffe7dfffffffffffffffff9fffffffffffffffffffffffffffc010101ffff +fffffffffbfffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffe000af7fffffffffd0000ffffffffffffffffffff1fffffffffffffffc +fffffe3ffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffe7ffffff7fffff +fffffc002dfffffffffffffff6bffffffffffffffffffff3fffffffffffffffeffffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff +fffffffffbffffffffffffffffffffffffffffffffffffffffcfffffffffffffffff5005ffffffffffffffffffffffffffffffffffffffe3fffffffffffffffd +ffffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffe7ffffffdfffff +fff000ffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffcffffff1ffffffffffffffffff5fffffffffffffffffffffffffffc010101ffff +fffffffffaffffffffffffffffffffffffffffffffffffffffeffffffffffffffe80177fffffffffffffffffffffffffffffffffffffffe7fffffffffffffffd +7fffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffc7ffffffefffff +e002ffffffffffffffffffffffffffffffffffffffffffc3fffffffffffffffdffffff1ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffff002fffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffc +ffffffbffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffcffffffffffffffffffffffffffffffffffffffffc7fffffff7fff8 +01ffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffdffffff0ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003fffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffe +ffffff9fffffffffffffffffcbfffffffffffffffffffffffffffc010101ffffffffffffff7fffffffffffffffffffffffffffffffffffffffc7fffffffbf801 +ffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffff9ffffff8fffffffffffffffffb7fffffffffffffffffffffffffffc010101ffff +fffffffffeffffffffffffffffffffffffffffffffffffffffeffffffffe801fffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffd +ffffff8fffffffffffffffffeffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffd7fffffff001ff +ffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffaffffffcfffffffffffffffffe7fffffffffffffffffffffffffffc010101ffff +ffffffffff7fffffffffffffffffffffffffffffffffffffffefffffff8017ffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffd +ffffffc7ffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffc7fffffc00ffff +ffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffff3ffffffc7ffffffffffffffffeffffffffffffffffffffffffffffc010101ffff +fffffffffeffffffffffffffffffffffffffffffffffffffff9fffffc00dffffffffffffffffffffffffffffffffffffffffffffffffff9ffffffffffffffffd +ffffffe3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffe7fffe00ffffff +ffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffff3fffffff1ffffffffffffffffeffffffffffffffffffffffffffffc010101ffff +ffffffffffbfffffffffffffffffffffffffffffffffffffffcfffe007ff7fffffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff +fffffff3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffdfffffffffffffffffffffffffffffffffffffffd7fe003fffffff +ffffffffffffffffffffffffffffffffffffffffffffff8fffffffffffffffe3fffffff8ffffffffffffffff3ffffffffffffffffffffffffffffc010101ffff +ffffffffffbfffffffffffffffffffffffffffffffffffffffeff003ffffffffffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff +fffffff8ffffffffffffffffbffffffffffffffffffffffffffffc010101ffffffffffffffcfffffffffffffffffffffffffffffffffffffff8fa01fffff7fff +ffffffffffffffffffffffffffffffffffffffffffffff9dffffffffffffffc7fffffffc7ffffffffffffffe7ffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffe001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dffffffffffffffff +fffffffebffffffffffffffdfffffffffffffffffffffffffffffc010101ffffffffffffffd7ffffffffffffffffffffffffffffffffffffff800fffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffafffffffffffffffcfffffffff1ffffffffffffffafffffffffffffffffffffffffffffc010101ffff +ffffffffffeffffffffffffffffffffffffffffffffffffffe007fffffffbfffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffff9f +ffffffffaf7ffffffffffff5fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffff003ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff8fffffffffffffff7fffffffffcffffffffffffffbfffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffff800fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffffff3f +ffffffffc3ffffffffffffe7fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffc0197ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffe5fffffffffffffeffffffffffe8ffffffffffffdffffffffffffffffffffffffffffffc010101ffff +fffffffffffbfffffffffffffffffffffffffffffffffff00fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffd7f +fffffffff0ffffffffffff3ffffffffffffffffffffffffffffffc010101fffffffffffffff5ffffffffffffffffffffffffffffffffff807fd7ffffffffefff +ffffffffffffffffffffffffffffffffffffffffffffffebfffffffffffff8fffffffffffc3f7ffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffc03ffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffff7ff +fffffffffe1ffffffffffdfffffffffffffffffffffffffffffffc010101fffffffffffffffdffffffffffffffffffffffffffffffffe017ffefffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffff9ffffffffffffebffffffffffffcfffffffffebfffffffffffffffffffffffffffffffc010101ffff +fffffffffffefffffffffffffffffffffffffffffffe80ffffd7fffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffdfff +ffffffffffb3fdfffffff7fffffffffffffffffffffffffffffffc010101fffffffffffffffdfffffffffffffffffffffffffffffff803ffffcfffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffbfffffffffffffe4be7fffff2ffffffffffffffffffffffffffffffffc010101ffff +fffffffffffeffffffffffffffffffffffffffffffc01fffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3ffffffffffe7fff +fffffffffffa379ffffdfffffffffffffffffffffffffffffffffc010101ffffffffffffffff3ffffffffffffffffffffffffffffc00ffffffdfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff1ffffffffffbfffffffffffffffd0fcfffebfffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffff00fffffffe7fffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffaeffffffffd7ffff +ffffffffffffb937feb7fffffffffffffffffffffffffffffffffc010101ffffffffffffffffbfffffffffffffffffffffffffff807fffffffdfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffd32fffffffbfffffffffffffffffeacbd57ffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffff7ffffffffffffffffffffffffffd01ffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb8cffffeeffffff +ffffffffffffff34affffffffffffffffffffffffffffffffffffc010101ffffffffffffffffdffffffffffffffffffffffffff00fffffffffcfffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffdffffffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffeffffffffffffffffeffffffffc03ffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe57ffeaffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff5ffffffe00ffffffffffcfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffe9ad3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffeffffffffffffffffffffffff80bfffffffffff7fffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffef7ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7fffffc03fffffffffffcfffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffff7ffffffffffffffffdffffe01ffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffbfffffffffffffffefffff007ffffffffffffebfffffffffdff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffeffffffffffffffffdfff803fffffffffffffc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7ffd01ffffffffffffffefffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffff50ffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffeffffffffffffffffffc07fffffffffffffffc7fffffffffdff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffff3fc7fffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffe9fdfffffffffffffffffe7ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffbffffffffffffffffffff7fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff7fffffffffffffffffffe3ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffefffffffffffffffafffffffffffffffffffe5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffdffffffffffffffffffff3fffffffffdff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffefffffffffffffff77fffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffff7bfffffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5fffffffffdff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffff17fffffffffffffffffff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff3ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffff9ffffffffffffffffffff8fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffd7fffffffffffffffffffdfffffffffbff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffbfffffffffffffaffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffefffffffffffffd7fffffffffffffffffffeffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffbfffffffffffffffffffdfffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7fffffffffffffffffffc7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffffffffffffffffffffffffefffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffdffffffffffffeffffffffffffffffffffe7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffff3fffffffffffffffffffebffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffefffffffffffff3ffffffffffffffffffff7fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffffffffff7ffffffffffffffffffff1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffffffdfff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffefffffffffffebffffffffffffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7ffffffffffffffffffff8fffffff5fff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffbffffffffffebffffffffffffffffffffc7ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffefffffffffffffffffffffffffffffffff3fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffff7fffffffffe7fffffffffffffffffffff5fffffbffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffdffffffffffffffffffffffffffffffff8fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffefffffffffffffffffffffff7fffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffeffffffffffffffffffffffffffffffffeffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffbffffffffdfffffffffffffffffffffff2fff7fffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffdffffffffefffffffffffffffffffffffd3c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffec7bffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffdfffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +fffffffffffffffffffffffbffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffcffffffbfffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffff5fffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffebfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffdfff6ffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffff87efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffabfffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0101010c00000040092900aa00000000000000fc00e60200000000040000002701ffff030000000000}}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\f37\fs22\insrsid10447979\charrsid10447979 +\par \hich\af37\dbch\af13\loch\f37 Colin Miller +\par \hich\af37\dbch\af13\loch\f37 Product Unit Manager +\par \hich\af37\dbch\af13\loch\f37 Micros\hich\af37\dbch\af13\loch\f37 oft .NET Micro Framework +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10447979 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid16668801\charrsid10447979 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb +44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a +6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c +3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 +5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 +b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 +c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e +51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 +b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff +6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 +9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 +b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 +59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 +2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 +656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 +350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 +52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 +73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 +0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 +000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 +0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 +000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 +00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6; +\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4; +\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; +\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; +\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000d0e5 +4b32475ccc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/REDIST_CRYPTO.TXT b/REDIST_CRYPTO.TXT new file mode 100644 index 000000000..7123484a1 --- /dev/null +++ b/REDIST_CRYPTO.TXT @@ -0,0 +1,83 @@ +The following list is a list of files available with the Microsoft .NET Micro Framework 4.3 Software Development Kit for redistribution under the .NET Micro Framework 4.3 SDK license. + +As of the 4.0 version and subsequent versions, the .NET Micro Framework has an Apache 2.0 license and there is no limitation to redistributing binaries, although the RTIP TCP/IP stack from EBSnet Inc. and the Crypto Libraries are subject to special conditions. Please refer to the specific licenses for details. + +_____________________________________________________________ + +Micro Framework library files + +Subject to the license terms for the software, you may redistribute the .PE files (unmodified) listed below: + +MFDpwsClient.pe +MFDpwsDevice.pe +MFDpwsExtensions.pe +MFWsStack.pe +Microsoft.SPOT.Graphics.pe +Microsoft.SPOT.Hardware.pe +Microsoft.SPOT.Hardware.PWM.pe +Microsoft.SPOT.Hardware.SerialPort.pe +Microsoft.SPOT.Hardware.Usb.pe +Microsoft.SPOT.Hardware.OneWire.pe +Microsoft.SPOT.Ink.pe +Microsoft.SPOT.InteropSample.pe +Microsoft.SPOT.IO.pe +Microsoft.SPOT.Native.pe +Microsoft.SPOT.Net.pe +Microsoft.SPOT.Net.Security.pe +Microsoft.SPOT.RPC.pe +Microsoft.SPOT.Time.pe +Microsoft.SPOT.TinyCore.pe +Microsoft.SPOT.Touch.pe +Microsoft.SPOT.Wireless.IEEE_802_15_4.pe +Microsoft.SPOT.Wireless.IEEE_802_15_4.Mac.pe +Microsoft.SPOT.Wireless.IEEE_802_15_4.Phy.CC2420.pe +Microsoft.SPOT.Wireless.IEEE_802_15_4.Phy.pe +Microsoft.VisualBasic.pe +MFUpdate.pe +mscorlib.pe +mscorlib.resources.pe +System.Http.pe +System.Ftp.pe +System.IO.pe +System.Net.Security.pe +System.pe +System.Text.RegularExpressions.pe +System.Xml.pe +System.Xml.Legacy.pe + +_____________________________________________________________ + +Micro Framework font files + +Subject to the license terms for the software, you may redistribute the .tinyfnt files (unmodified) listed below: + +Nina.tinyfnt + +Small.tinyfnt + +_____________________________________________________________ + +Micro Framework MFDeploy files + +Subject to the license terms for the software, you may redistribute the files (unmodified) listed below: + +Microsoft.SPOT.Debugger.dll +MFDeploy.chm +MFDeploy.exe +MFDeploy.exe.config +MFDeployEngine.dll + + +_____________________________________________________________ + +Micro Framework emulator files + + +Subject to the license terms for the software, you may redistribute the .DLL files (unmodified) listed below: + +Microsoft.SPOT.CLR.dll +Microsoft.SPOT.Debugger.CorDebug.dll +Microsoft.SPOT.Debugger.dll +Microsoft.SPOT.Emulator.dll +Microsoft.SPOT.Emulator.Interface.dll +Microsoft.SPOT.Tasks.dll \ No newline at end of file diff --git a/ReleaseNotesCrypto.txt b/ReleaseNotesCrypto.txt new file mode 100644 index 000000000..6bcf1f496 --- /dev/null +++ b/ReleaseNotesCrypto.txt @@ -0,0 +1,96 @@ +=============================================================================== +=============================================================================== +Release Notes for the Microsoft .NET Micro Framework Porting Kit Version 4.3 + +This document details the system requirements, migration information, and +known issues in the Porting Kit. +=============================================================================== +=============================================================================== + + +=============================================================================== +System Requirements +=============================================================================== +Microsoft Windows XP, Vista, Windows 7 or Windows 8 + +2 GB of free hard-disk space + +Either Visual Studio 2012 (Express edition or greater) or both .NET +Framework 3.5 and Windows SDK for Windows (downloadable from microsoft.com). + +Compatible build tools for your processor. The following toolsets have been +tested by Microsoft. +* ARM RealView 3.x,4.x +* Keil MDK 3.x +* GCC 4.2.1 for ARM +* VisualDSP++ 5.0 for Blackfin + + +NOTE: The .NET Micro Framework SDK Version 4.3 does not support side-by-side +installation with any other previous version of the same product. Please +uninstall any previous versions before proceeding. Choose the appropriate +target framework from the Application tab of your project properties to +address legacy applications. + + +=============================================================================== +Migrating from the V3.0 porting kit to the V4.0 porting kit and later +=============================================================================== +If you are upgrading your HAL from version 3.0 to 4.3, you should be aware of +the following differences: + +1) Block Storage API: The block storage API has changed substantially. + +2) Time API: The Time API at the HAL level has a changed naming convention. + The functions to be implemented are now prefixed with 'HAL_Time_' and + 'CPU_', and are located in the Time_decl.h header. + +3) The SPI and LCD APIs have undergone marginal changes. + +For information about these topics, refer to the Porting Kit documentation. + + +=============================================================================== +Migrating from the V4.0 porting kit to the V4.3 porting kit +=============================================================================== +Please refer to the Porting Kit Documentation + + +=============================================================================== +Known issues +=============================================================================== + +Interop: +Parameter names for all marshaled parameters in native code are called +param0, param1, param2, etc… instead of the identifier name used in the managed +code. This is due to how the code is generated from the .PE file after the +symbolic parameter names have already been stripped off. +When using the SDK through Visual Studio, interop stub generation settings and +checksums are stored in the .csproj.user file. If you are using multiple +development machines or a version control system in your development, you +should share the .csproj.user file along with your source files. + +Side-by-Side installation with previous versions: +Side-by-side installation and functionality are currently untested and +unsupported. + + + +=============================================================================== +USB device with USB debugging: + +If you are building an image with the debugger set to communicate over USB, the +USB_ALLOW_CONFIGURATION_OVERRIDE switch lets you control whether the C# +developer can override the USB configuration. + +By default, when the debugger is set to USB, changes to the USB configuration +(through MFDeploy) are ignored. This prevents accidental overwriting of USB +configuration settings. If you want to enable the user to modify the USB +configuration using MFDeploy, define USB_ALLOW_CONFIGURATION_OVERRIDE in your +platform_selector.h file. + +=============================================================================== +MDK Support: + +When building with ARM Keil MDK, be sure to properly set the MDK_DEVICE_TYPE +property. From f698ca247c843209b9a0e598d3e04c4d7373907d Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 16 Feb 2016 18:44:26 +0000 Subject: [PATCH 003/144] remove licenses and other txt files from crypto libs --- Firmware License (Crypto).rtf | 466 ------------- License (Crypto).rtf | 466 ------------- PKCryptoWelcome.rtf | 1228 --------------------------------- REDIST_CRYPTO.TXT | 83 --- ReleaseNotesCrypto.txt | 96 --- 5 files changed, 2339 deletions(-) delete mode 100644 Firmware License (Crypto).rtf delete mode 100644 License (Crypto).rtf delete mode 100644 PKCryptoWelcome.rtf delete mode 100644 REDIST_CRYPTO.TXT delete mode 100644 ReleaseNotesCrypto.txt diff --git a/Firmware License (Crypto).rtf b/Firmware License (Crypto).rtf deleted file mode 100644 index de92090fc..000000000 --- a/Firmware License (Crypto).rtf +++ /dev/null @@ -1,466 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Wingdings 3};} -{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} -{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ?????????\'a1\'ec?????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} -{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ?????????????????????????};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};} -{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Batang};} -{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\f293\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f294\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f296\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\f297\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f298\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f299\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\f300\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f301\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f313\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier};} -{\f314\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier};}{\f316\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier};}{\f317\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier};} -{\f318\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier};}{\f319\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier};}{\f320\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier};} -{\f321\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier};}{\f405\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f403\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} -{\f404\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f406\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f407\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} -{\f410\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f425\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ?????????\'a1\'ec?????};}{\f633\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};} -{\f634\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f636\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f637\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};} -{\f640\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f641\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};} -{\f673\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ?????????????????????????};}{\f674\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ?????????????????????????};} -{\f676\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ?????????????????????????};}{\f677\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ?????????????????????????};} -{\f678\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ?????????????????????????};}{\f679\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ?????????????????????????};} -{\f680\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ?????????????????????????};}{\f681\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ?????????????????????????};} -{\f682\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ?????????????????????????};}{\f683\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f684\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};} -{\f686\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}{\f687\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f690\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};} -{\f695\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f693\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f694\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} -{\f696\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f697\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f700\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} -{\f705\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Batang};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} -{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} -{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} -{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; -\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; -\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ -\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\snext0 \sautoupd \sqformat \spriority0 \styrsid10632156 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 -\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat \styrsid10632156 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext2 \slink16 \sqformat \styrsid10632156 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat \styrsid10632156 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext4 \slink18 \sqformat \styrsid10632156 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat \styrsid10632156 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar -\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext6 \slink20 \sqformat \styrsid10632156 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat \styrsid10632156 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar -\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext8 \slink22 \sqformat \styrsid10632156 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat \styrsid10632156 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 -\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid10632156 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 -\ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink2 \slocked \styrsid10632156 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink3 \slocked \styrsid10632156 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid10632156 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 -\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink5 \slocked \styrsid10632156 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink6 \slocked \styrsid10632156 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid10632156 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 -\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink8 \slocked \styrsid10632156 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink9 \slocked \styrsid10632156 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid10632156 Body 1;}{\s25\ql \fi-363\li720\ri0\sb120\sa120\widctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 \styrsid10632156 -Bullet 2;}{\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \styrsid10632156 Bullet 4;}{\s27\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 Heading EULA;}{\s28\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 -\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 -Heading Software Title;}{\s29\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \styrsid10632156 Preamble;}{\s30\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar -\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon3 \snext30 \styrsid10632156 Heading 3 Bold;}{\s31\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon26 \snext31 \styrsid10632156 Bullet 4 Underline;}{\*\cs32 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 -\sbasedon10 \styrsid10632156 Body 2 Char;}{\*\cs33 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid10632156 Body 3 Char;}{\s34\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 -\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon29 \snext34 \styrsid10632156 -Preamble Border Above;}{\s35\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink36 \ssemihidden \styrsid10632156 annotation text;}{\*\cs36 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink35 \slocked \ssemihidden \styrsid10632156 Comment Text Char;}{\*\cs37 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \styrsid10632156 annotation reference;}{\*\cs38 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 -\ul\cf2 \sbasedon10 \styrsid10632156 Hyperlink;}{\s39\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 -\fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \slink40 \ssemihidden \sunhideused \styrsid10632156 Balloon Text;}{\*\cs40 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 -\fs16\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink39 \slocked \ssemihidden \styrsid10632156 Balloon Text Char;}}{\*\listtable{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s30\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel -\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-357\li1792 -\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 -\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 -\b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 -\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 -\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s25\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 -\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 -\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s5\fi-357\li1792 -\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 -\s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 -\b0\i0\f39\fs20\fbias0\hres0\chhres0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 -\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 -\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid-41362566\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s26\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600 -\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}}{\*\listoverridetable{\listoverride\listid477573462\listoverridecount0\ls1} -{\listoverride\listid1559511898\listoverridecount0\ls2}{\listoverride\listid398796681\listoverridecount0\ls3}{\listoverride\listid752163927\listoverridecount0\ls4}}{\*\rsidtbl \rsid80797\rsid96267\rsid556931\rsid1649263\rsid1735106\rsid2981673\rsid3045873 -\rsid3046839\rsid3489817\rsid3496438\rsid3685900\rsid3897294\rsid4803141\rsid4882226\rsid5115434\rsid5532184\rsid5659162\rsid5993271\rsid6887591\rsid6892738\rsid7096544\rsid7232338\rsid7823532\rsid8085732\rsid8681548\rsid8800392\rsid9190636\rsid9579676 -\rsid9776685\rsid10632156\rsid10689454\rsid11026981\rsid11078160\rsid11808667\rsid11827439\rsid12520861\rsid12792726\rsid15140419\rsid15216572\rsid16342489}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 -\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author yonglee}{\operator yonglee}{\creatim\yr2010\mo5\dy3\hr18\min25}{\revtim\yr2010\mo5\dy4\hr13\min20}{\version5}{\edmins3}{\nofpages3}{\nofwords1464}{\nofchars7570}{\*\company Microsoft}{\nofcharsws9016} -{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\revisions\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 -\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot10632156\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid556931\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s27\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 -\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT SOFTWARE LICENSE TERMS -\par }\pard\plain \ltrpar\s28\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 -\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid11827439 \hich\af38\dbch\af13\loch\f38 CRYPTOGRAPHY LIBRARIES }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 FOR THE .NET MICRO FRAMEWORK }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 -\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the pre-release software named above, which includes the media on which you received it, if any -.\hich\af38\dbch\af13\loch\f38 The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid9776685 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 - -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 updates, -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 supplements, -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 Internet-based services, and -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 support services -\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -for this software, unless other terms accompany those items. If so, those terms apply. -\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 By using the software, you accept these terms. If you\hich\af38\dbch\af13\loch\f38 do not accept them, do not use the software. -\par }\pard\plain \ltrpar\s34\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you comply with these license terms, you have the rights below. - -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 GENERAL.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - The software consists of Microsoft cryptography libraries, to be used in conjunction with the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid556931 \hich\af38\dbch\af13\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 .NET Micro Framework, whic\hich\af38\dbch\af13\loch\f38 h is licensed under its own separate license.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 2.\tab}\hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 You }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 may install and use }{ -\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid3045873 \hich\af38\dbch\af13\loch\f38 one copy}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{ -\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 of the software }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -with each copy of the .NET Micro Framework you install }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 on your devices }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 to }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 design, develop and test your programs}{\rtlch\fcs1 -\ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 and hardware devices (collectively, \'93\loch\f38 \hich\f38 your programs\'94\loch\f38 )}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 3.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 -\ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\af3\hich\af3\dbch\af11\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 \hich\f38 You may copy and distribute the object code form of the software solely in conjunction with the Microsoft .NET Micro Framework runtime. For the purpose of this section, \'93 -\loch\f38 \hich\f38 .NET Micro Framework\'94\loch\f38 means the Microsoft .NET M\hich\af38\dbch\af11\loch\f38 icro Framework 4.0}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid556931 \hich\af38\dbch\af11\loch\f38 or later}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\insrsid10632156 \hich\af38\dbch\af11\loch\f38 , whether unmodified or modified as needed in order to adapt the .NET Micro Framework runtime to specific hardware or operating systems. -\par {\listtext\pard\plain\ltrpar \s31 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid4882226 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s31\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid4882226 \hich\af38\dbch\af13\loch\f38 Third Party}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 - Distribution. You may permit distributors of your programs to copy and distri\hich\af38\dbch\af13\loch\f38 bute the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -software in conjunction with the .NET Micro Framework runtime }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 as part of those programs. -\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 you distribute}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 , you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 requi\hich\af38\dbch\af13\loch\f38 re distributors and external end users to agree to terms that protect it at least as much as this agreement; -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -display your valid copyright notice on your programs; and -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f38 \rquote \hich\af38\dbch\af13\loch\f38 fees, related to the distribution or use of your programs. -\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 modify or alter the software; -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 software}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ; -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 -s trademarks in your programs\hich\f38 \rquote \loch\f38 name\hich\af38\dbch\af13\loch\f38 s or in a way that suggests your programs come from or are endorsed by Microsoft; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 include }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 in malicious, deceptive or unlawful programs}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Scope of License}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is licensed, not sold. This agreement only gives you some rights to \hich\af38\dbch\af13\loch\f38 -use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations -\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid11808667 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 \hich\af38\dbch\af13\loch\f38 disclose the results of any benchmark tests of the software to any third party without Microsoft\hich\f38 \rquote \loch\f38 s prior written approval}{ -\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156\charrsid11808667 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid8800392 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 make m}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -ore copies of the software than specified in this agreement or allowed by applicable law, desp\hich\af38\dbch\af13\loch\f38 ite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; }{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 publish the software for others to copy}{\rtlch\fcs1 \af38 -\ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party}{ -\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services}{ -\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 - You may make \hich\af38\dbch\af13\loch\f38 one backup copy of the software. You may use it only to reinstall the software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 6.\tab}\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 -\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 7.\tab}\hich\af38\dbch\af13\loch\f38 TRANSFER TO\hich\af38\dbch\af13\loch\f38 - ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 - You may uninstall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 Export Restrictions}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is subject to -{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}\hich\af38\dbch\af13\loch\f38 - export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{ -\rtlch\fcs1 \ab0\af0\afs20 \ltrch\fcs0 \cs38\b0\fs20\ul\cf2\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 www.microsoft.\hich\af38\dbch\af13\loch\f38 com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 .}{ -\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \cs38\fs20\ul\dbch\af13\insrsid10632156\charrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\caps\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 -\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we may}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 not provide support services for it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 Entire Agreement.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are t\hich\af38\dbch\af13\loch\f38 he entire agreement for the software and support services. -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Applicable Law}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . -\par {\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 a.\tab} -}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 -\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you acquired the software in the {\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}, -{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname State}}\hich\af38\dbch\af13\loch\f38 Washington{\*\xmlclose}{\*\xmlclose} state law governs the interpretation of this agreement\hich\af38\dbch\af13\loch\f38 - and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 b.\tab}\hich\af38\dbch\af13\loch\f38 Outside the {\*\xmlopen\xmlns2{\factoidname place}} -{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - If you acquired the software in any other country, the laws of that country apply.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Legal Effect.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also hav\hich\af38\dbch\af13\loch\f38 -e rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\caps\fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 13.\tab}\hich\af38\dbch\af13\loch\f38 Disclaimer of Warranty.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 The software is licensed \'93\loch\f38 a\hich\af38\dbch\af13\loch\f38 \hich\f38 s-is.\'94\loch\f38 - You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microso -\hich\af38\dbch\af13\loch\f38 f\hich\af38\dbch\af13\loch\f38 t excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -Limitation on and Exclusion of Remedies and Damages. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You -\hich\af38\dbch\af13\loch\f38 cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 This limitation applies to -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third par\hich\af38\dbch\af13\loch\f38 ty programs; and -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. -\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -It also applies even if Microsoft knew or should have known about the possi\hich\af38\dbch\af13\loch\f38 -bility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\insrsid10632156 \hich\af38\dbch\af11\loch\f38 Please note: As this software is distributed in Quebec, Canada, some -\hich\af38\dbch\af11\loch\f38 of the clauses in this agreement are provided below in French. -\par }\pard \ltrpar\ql \li0\ri0\sb240\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 -Remarque : Ce logiciel \'e9\loch\f38 \hich\f38 tant distribu\'e9\loch\f38 \hich\f38 au Qu\'e9\loch\f38 \hich\f38 bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f38 ais. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 EXON\'c9 -\loch\f38 RATION DE GARANTIE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le logiciel vis\'e9\hich\af38\dbch\af11\loch\f38 \hich\f38 par une licence est offert -\'ab\loch\f38 \hich\f38 tel quel \'bb\loch\f38 \hich\f38 . Toute utilisation de ce logiciel est \'e0\loch\f38 \hich\f38 votre seule risque et p\'e9\loch\f38 ril. Microsoft n\hich\f38 \rquote \loch\f38 \hich\f38 -accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 ficier de droits additionnels en vertu du droit local sur la protection des c\hich\af38\dbch\af11\loch\f38 o\hich\af38\dbch\af11\loch\f38 \hich\f38 -nsommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9\loch\f38 marchande, d\hich\f38 \rquote \loch\f38 \hich\f38 ad\'e9\loch\f38 \hich\f38 quation \'e0\loch\f38 - un usage particulier et d\hich\f38 \rquote \loch\f38 \hich\f38 absence de contrefa\'e7\loch\f38 on sont exclues. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\keepn\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 -LIMITATION DES DOMMAGES-INT\'c9\loch\f38 \hich\f38 R\'ca\loch\f38 TS ET EX\hich\af38\dbch\af11\loch\f38 \hich\f38 CLUSION DE RESPONSABILIT\'c9\loch\f38 POUR LES DOMMAGES.}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f38 \hich\f38 - hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f38 \hich\f38 tendre \'e0\loch\f38 aucune indemnisation pour les autres dommages, \hich\af38\dbch\af11\loch\f38 \hich\f38 y compris les dommages sp\'e9\loch\f38 \hich\f38 -ciaux, indirects ou accessoires et pertes de b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 fices. -\par \hich\af38\dbch\af11\loch\f38 Cette limitation concerne : -\par }\pard \ltrpar\ql \fi-360\li720\ri0\sb120\sa120\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 -\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 tout ce qui est reli\'e9\loch\f38 - au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes \hich\af38\dbch\af11\loch\f38 tiers ; et -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 -\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 les r\'e9\loch\f38 \hich\f38 -clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9\loch\f38 \hich\f38 stricte, de n\'e9\loch\f38 gligence ou d}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156 -\loch\af38\dbch\af11\hich\f38 \rquote }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 une autre faute dans la limite autoris\'e9\loch\f38 e par la loi en vigueur. - -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 Elle s\hich\f38 \rquote -\loch\f38 \hich\f38 applique \'e9\loch\f38 \hich\f38 galement, m\'ea\hich\af38\dbch\af11\loch\f38 \hich\f38 me si Microsoft connaissait ou devrait conna\'ee\loch\f38 tre l\hich\f38 \rquote \'e9\loch\f38 \hich\f38 ventualit\'e9\loch\f38 d\hich\f38 -\rquote \loch\f38 un tel dommage. Si votre pays n\hich\f38 \rquote \loch\f38 autorise pas l\hich\f38 \rquote \loch\f38 \hich\f38 exclusion ou la limitation de responsabilit\'e9\loch\f38 - pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limi\hich\af38\dbch\af11\loch\f38 t\hich\af38\dbch\af11\loch\f38 ation ou l\hich\f38 \rquote \loch\f38 exclusion ci-dessus ne s\hich\f38 \rquote \loch\f38 -\hich\f38 appliquera pas \'e0\loch\f38 \hich\f38 votre \'e9\loch\f38 gard. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 -\hich\af38\dbch\af11\loch\f38 EFFET JURIDIQUE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat d\'e9\loch\f38 -crit certains droits juridiques. Vous pourriez avoir d\hich\f38 \rquote \loch\f38 \hich\f38 autres droits pr\'e9\loch\f38 \hich\f38 vus par les lois de votre pays. Le pr\'e9\loch\f38 sent contrat ne modifie pas les droits q\hich\af38\dbch\af11\loch\f38 -\hich\f38 ue vous conf\'e8\loch\f38 rent les lois de votre pays si celles-ci ne le permettent pas.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1649263 -\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 -72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 -2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b -44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 -065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 -00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 -84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc -52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 -bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 -656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c -070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 -29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 -312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 -a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 -98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c -94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 -7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 -9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 -e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 -193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 -17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 -8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 -6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a -668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 -bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e -16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b -5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 -8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 -c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 -0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b -7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb -9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 -088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf -8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 -ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 -28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 -345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 -b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 -254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 -68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 -51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 -720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 -a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 -000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 -002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 -656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 -00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 -00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6; -\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4; -\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; -\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; -\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000005021 -203fc7ebca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/License (Crypto).rtf b/License (Crypto).rtf deleted file mode 100644 index de92090fc..000000000 --- a/License (Crypto).rtf +++ /dev/null @@ -1,466 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Wingdings 3};} -{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} -{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ?????????\'a1\'ec?????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};} -{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ?????????????????????????};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};} -{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Batang};} -{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\f293\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f294\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f296\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\f297\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f298\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f299\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\f300\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f301\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f313\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier};} -{\f314\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier};}{\f316\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier};}{\f317\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier};} -{\f318\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier};}{\f319\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier};}{\f320\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier};} -{\f321\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier};}{\f405\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f403\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} -{\f404\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f406\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f407\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} -{\f410\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f425\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ?????????\'a1\'ec?????};}{\f633\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};} -{\f634\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f636\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f637\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};} -{\f640\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f641\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};} -{\f673\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ?????????????????????????};}{\f674\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ?????????????????????????};} -{\f676\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ?????????????????????????};}{\f677\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ?????????????????????????};} -{\f678\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ?????????????????????????};}{\f679\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ?????????????????????????};} -{\f680\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ?????????????????????????};}{\f681\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ?????????????????????????};} -{\f682\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ?????????????????????????};}{\f683\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f684\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};} -{\f686\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}{\f687\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f690\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};} -{\f695\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f693\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f694\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};} -{\f696\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f697\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f700\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};} -{\f705\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Batang};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} -{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} -{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} -{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; -\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; -\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ -\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\snext0 \sautoupd \sqformat \spriority0 \styrsid10632156 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 -\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink15 \sqformat \styrsid10632156 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext2 \slink16 \sqformat \styrsid10632156 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink17 \sqformat \styrsid10632156 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext4 \slink18 \sqformat \styrsid10632156 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink19 \sqformat \styrsid10632156 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar -\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext6 \slink20 \sqformat \styrsid10632156 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink21 \sqformat \styrsid10632156 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar -\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext8 \slink22 \sqformat \styrsid10632156 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 -\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink23 \sqformat \styrsid10632156 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 -\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid10632156 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 -\ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink2 \slocked \styrsid10632156 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink3 \slocked \styrsid10632156 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid10632156 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 -\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink5 \slocked \styrsid10632156 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink6 \slocked \styrsid10632156 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid10632156 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 -\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink8 \slocked \styrsid10632156 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink9 \slocked \styrsid10632156 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid10632156 Body 1;}{\s25\ql \fi-363\li720\ri0\sb120\sa120\widctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 \styrsid10632156 -Bullet 2;}{\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \styrsid10632156 Bullet 4;}{\s27\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 Heading EULA;}{\s28\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 -\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10632156 -Heading Software Title;}{\s29\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \styrsid10632156 Preamble;}{\s30\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar -\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon3 \snext30 \styrsid10632156 Heading 3 Bold;}{\s31\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon26 \snext31 \styrsid10632156 Bullet 4 Underline;}{\*\cs32 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 -\sbasedon10 \styrsid10632156 Body 2 Char;}{\*\cs33 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid10632156 Body 3 Char;}{\s34\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 -\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon29 \snext34 \styrsid10632156 -Preamble Border Above;}{\s35\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink36 \ssemihidden \styrsid10632156 annotation text;}{\*\cs36 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink35 \slocked \ssemihidden \styrsid10632156 Comment Text Char;}{\*\cs37 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \styrsid10632156 annotation reference;}{\*\cs38 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 -\ul\cf2 \sbasedon10 \styrsid10632156 Hyperlink;}{\s39\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 -\fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \slink40 \ssemihidden \sunhideused \styrsid10632156 Balloon Text;}{\*\cs40 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 -\fs16\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink39 \slocked \ssemihidden \styrsid10632156 Balloon Text Char;}}{\*\listtable{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0\hres0\chhres0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s30\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel -\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \fi-357\li1792 -\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 -\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 -\b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 -\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 -\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s25\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 -\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0\hres0\chhres0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1 -\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0\hres0\chhres0 \s5\fi-357\li1792 -\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 -\s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 -\b0\i0\f39\fs20\fbias0\hres0\chhres0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 -\ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 -\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0\hres0\chhres0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid-41362566\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \s26\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600 -\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}}{\*\listoverridetable{\listoverride\listid477573462\listoverridecount0\ls1} -{\listoverride\listid1559511898\listoverridecount0\ls2}{\listoverride\listid398796681\listoverridecount0\ls3}{\listoverride\listid752163927\listoverridecount0\ls4}}{\*\rsidtbl \rsid80797\rsid96267\rsid556931\rsid1649263\rsid1735106\rsid2981673\rsid3045873 -\rsid3046839\rsid3489817\rsid3496438\rsid3685900\rsid3897294\rsid4803141\rsid4882226\rsid5115434\rsid5532184\rsid5659162\rsid5993271\rsid6887591\rsid6892738\rsid7096544\rsid7232338\rsid7823532\rsid8085732\rsid8681548\rsid8800392\rsid9190636\rsid9579676 -\rsid9776685\rsid10632156\rsid10689454\rsid11026981\rsid11078160\rsid11808667\rsid11827439\rsid12520861\rsid12792726\rsid15140419\rsid15216572\rsid16342489}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 -\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author yonglee}{\operator yonglee}{\creatim\yr2010\mo5\dy3\hr18\min25}{\revtim\yr2010\mo5\dy4\hr13\min20}{\version5}{\edmins3}{\nofpages3}{\nofwords1464}{\nofchars7570}{\*\company Microsoft}{\nofcharsws9016} -{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\revisions\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 -\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot10632156\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid556931\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s27\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 -\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT SOFTWARE LICENSE TERMS -\par }\pard\plain \ltrpar\s28\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 -\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 \hich\af38\dbch\af13\loch\f38 MICROSOFT}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid11827439 \hich\af38\dbch\af13\loch\f38 CRYPTOGRAPHY LIBRARIES }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 FOR THE .NET MICRO FRAMEWORK }{\rtlch\fcs1 \af38 \ltrch\fcs0 \dbch\af13\insrsid10632156\charrsid96267 -\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the pre-release software named above, which includes the media on which you received it, if any -.\hich\af38\dbch\af13\loch\f38 The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid9776685 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 - -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 updates, -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 supplements, -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 Internet-based services, and -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 support services -\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -for this software, unless other terms accompany those items. If so, those terms apply. -\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 By using the software, you accept these terms. If you\hich\af38\dbch\af13\loch\f38 do not accept them, do not use the software. -\par }\pard\plain \ltrpar\s34\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you comply with these license terms, you have the rights below. - -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 GENERAL.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - The software consists of Microsoft cryptography libraries, to be used in conjunction with the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid556931 \hich\af38\dbch\af13\loch\f38 Microsoft }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 .NET Micro Framework, whic\hich\af38\dbch\af13\loch\f38 h is licensed under its own separate license.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 2.\tab}\hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 You }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 may install and use }{ -\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid3045873 \hich\af38\dbch\af13\loch\f38 one copy}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 }{ -\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 of the software }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -with each copy of the .NET Micro Framework you install }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid5659162 \hich\af38\dbch\af13\loch\f38 on your devices }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 to }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 design, develop and test your programs}{\rtlch\fcs1 -\ab0\af38\afs20 \ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 and hardware devices (collectively, \'93\loch\f38 \hich\f38 your programs\'94\loch\f38 )}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 3.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 -\ltrch\fcs0 \cs32\b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid11078160 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11078160 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\af3\hich\af3\dbch\af11\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 \hich\f38 You may copy and distribute the object code form of the software solely in conjunction with the Microsoft .NET Micro Framework runtime. For the purpose of this section, \'93 -\loch\f38 \hich\f38 .NET Micro Framework\'94\loch\f38 means the Microsoft .NET M\hich\af38\dbch\af11\loch\f38 icro Framework 4.0}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid556931 \hich\af38\dbch\af11\loch\f38 or later}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\insrsid10632156 \hich\af38\dbch\af11\loch\f38 , whether unmodified or modified as needed in order to adapt the .NET Micro Framework runtime to specific hardware or operating systems. -\par {\listtext\pard\plain\ltrpar \s31 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid4882226 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s31\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid4882226 \hich\af38\dbch\af13\loch\f38 Third Party}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 - Distribution. You may permit distributors of your programs to copy and distri\hich\af38\dbch\af13\loch\f38 bute the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -software in conjunction with the .NET Micro Framework runtime }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 as part of those programs. -\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Requirements.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 you distribute}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 , you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 requi\hich\af38\dbch\af13\loch\f38 re distributors and external end users to agree to terms that protect it at least as much as this agreement; -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -display your valid copyright notice on your programs; and -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f38 \rquote \hich\af38\dbch\af13\loch\f38 fees, related to the distribution or use of your programs. -\par {\listtext\pard\plain\ltrpar \s30 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s30\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls3\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Distribution Restrictions.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \cs33\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 modify or alter the software; -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 software}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 ; -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 -s trademarks in your programs\hich\f38 \rquote \loch\f38 name\hich\af38\dbch\af13\loch\f38 s or in a way that suggests your programs come from or are endorsed by Microsoft; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid2981673 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 include }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 the software }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 in malicious, deceptive or unlawful programs}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Scope of License}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is licensed, not sold. This agreement only gives you some rights to \hich\af38\dbch\af13\loch\f38 -use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations -\hich\af38\dbch\af13\loch\f38 \hich\af38\dbch\af13\loch\f38 in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid11808667 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 \hich\af38\dbch\af13\loch\f38 disclose the results of any benchmark tests of the software to any third party without Microsoft\hich\f38 \rquote \loch\f38 s prior written approval}{ -\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156\charrsid11808667 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid11808667 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156\charrsid8800392 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\fs20\dbch\af13\insrsid10632156\charrsid8800392 \hich\af38\dbch\af13\loch\f38 make m}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -ore copies of the software than specified in this agreement or allowed by applicable law, desp\hich\af38\dbch\af13\loch\f38 ite this limitation}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; }{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 publish the software for others to copy}{\rtlch\fcs1 \af38 -\ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 rent, lease or lend the software}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\insrsid10632156 \hich\af38\dbch\af11\loch\f38 ;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 transfer the software or this agreement to any third party}{ -\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 \hich\af38\dbch\af11\loch\f38 ; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 use the software for commercial software hosting services}{ -\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid10632156 .}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 5.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 - You may make \hich\af38\dbch\af13\loch\f38 one backup copy of the software. You may use it only to reinstall the software.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 6.\tab}\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 -\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 7.\tab}\hich\af38\dbch\af13\loch\f38 TRANSFER TO\hich\af38\dbch\af13\loch\f38 - ANOTHER DEVICE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid2981673 \hich\af38\dbch\af13\loch\f38 - You may uninstall the software and install it on another device for your use. You may not do so to share this license between devices.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid2981673 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 Export Restrictions}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 The software is subject to -{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}\hich\af38\dbch\af13\loch\f38 - export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{ -\rtlch\fcs1 \ab0\af0\afs20 \ltrch\fcs0 \cs38\b0\fs20\ul\cf2\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 www.microsoft.\hich\af38\dbch\af13\loch\f38 com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 .}{ -\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \cs38\fs20\ul\dbch\af13\insrsid10632156\charrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 9.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\caps\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 }{\rtlch\fcs1 \ab0\af38\afs20 -\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156\charrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 Because this software is \'93\loch\f38 \hich\f38 as is,\'94\loch\f38 we may}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 -\b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 not provide support services for it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 10.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\hich\af38\dbch\af13\loch\f38 Entire Agreement.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are t\hich\af38\dbch\af13\loch\f38 he entire agreement for the software and support services. -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 11.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Applicable Law}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 . -\par {\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname country-region}}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 a.\tab} -}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 -\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 If you acquired the software in the {\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}, -{\*\xmlopen\xmlns2{\factoidname place}}{\*\xmlopen\xmlns2{\factoidname State}}\hich\af38\dbch\af13\loch\f38 Washington{\*\xmlclose}{\*\xmlclose} state law governs the interpretation of this agreement\hich\af38\dbch\af13\loch\f38 - and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 b.\tab}\hich\af38\dbch\af13\loch\f38 Outside the {\*\xmlopen\xmlns2{\factoidname place}} -{\*\xmlopen\xmlns2{\factoidname country-region}}\hich\af38\dbch\af13\loch\f38 United States{\*\xmlclose}{\*\xmlclose}.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - If you acquired the software in any other country, the laws of that country apply.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 Legal Effect.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 - This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also hav\hich\af38\dbch\af13\loch\f38 -e rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 -\caps\fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 13.\tab}\hich\af38\dbch\af13\loch\f38 Disclaimer of Warranty.}{\rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 \hich\f38 The software is licensed \'93\loch\f38 a\hich\af38\dbch\af13\loch\f38 \hich\f38 s-is.\'94\loch\f38 - You bear the risk of using it. Microsoft gives no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microso -\hich\af38\dbch\af13\loch\f38 f\hich\af38\dbch\af13\loch\f38 t excludes the implied warranties of merchantability, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\caps\fs20\loch\af38\hich\af38\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 14.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls4\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid10632156 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -Limitation on and Exclusion of Remedies and Damages. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You -\hich\af38\dbch\af13\loch\f38 cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid10632156 -\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 This limitation applies to -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar -\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 -\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (including code) on third party Internet sites, or third par\hich\af38\dbch\af13\loch\f38 ty programs; and -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid10632156 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af38\dbch\af13\loch\f38 -claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. -\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid10632156 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid10632156 \hich\af38\dbch\af13\loch\f38 -It also applies even if Microsoft knew or should have known about the possi\hich\af38\dbch\af13\loch\f38 -bility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\insrsid10632156 \hich\af38\dbch\af11\loch\f38 Please note: As this software is distributed in Quebec, Canada, some -\hich\af38\dbch\af11\loch\f38 of the clauses in this agreement are provided below in French. -\par }\pard \ltrpar\ql \li0\ri0\sb240\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 -Remarque : Ce logiciel \'e9\loch\f38 \hich\f38 tant distribu\'e9\loch\f38 \hich\f38 au Qu\'e9\loch\f38 \hich\f38 bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f38 ais. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 EXON\'c9 -\loch\f38 RATION DE GARANTIE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le logiciel vis\'e9\hich\af38\dbch\af11\loch\f38 \hich\f38 par une licence est offert -\'ab\loch\f38 \hich\f38 tel quel \'bb\loch\f38 \hich\f38 . Toute utilisation de ce logiciel est \'e0\loch\f38 \hich\f38 votre seule risque et p\'e9\loch\f38 ril. Microsoft n\hich\f38 \rquote \loch\f38 \hich\f38 -accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 ficier de droits additionnels en vertu du droit local sur la protection des c\hich\af38\dbch\af11\loch\f38 o\hich\af38\dbch\af11\loch\f38 \hich\f38 -nsommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9\loch\f38 marchande, d\hich\f38 \rquote \loch\f38 \hich\f38 ad\'e9\loch\f38 \hich\f38 quation \'e0\loch\f38 - un usage particulier et d\hich\f38 \rquote \loch\f38 \hich\f38 absence de contrefa\'e7\loch\f38 on sont exclues. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\keepn\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 -LIMITATION DES DOMMAGES-INT\'c9\loch\f38 \hich\f38 R\'ca\loch\f38 TS ET EX\hich\af38\dbch\af11\loch\f38 \hich\f38 CLUSION DE RESPONSABILIT\'c9\loch\f38 POUR LES DOMMAGES.}{\rtlch\fcs1 \af38 \ltrch\fcs0 -\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f38 \hich\f38 - hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f38 \hich\f38 tendre \'e0\loch\f38 aucune indemnisation pour les autres dommages, \hich\af38\dbch\af11\loch\f38 \hich\f38 y compris les dommages sp\'e9\loch\f38 \hich\f38 -ciaux, indirects ou accessoires et pertes de b\'e9\loch\f38 \hich\f38 n\'e9\loch\f38 fices. -\par \hich\af38\dbch\af11\loch\f38 Cette limitation concerne : -\par }\pard \ltrpar\ql \fi-360\li720\ri0\sb120\sa120\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 -\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 tout ce qui est reli\'e9\loch\f38 - au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes \hich\af38\dbch\af11\loch\f38 tiers ; et -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid10632156 {\rtlch\fcs1 \af3 \ltrch\fcs0 \f3\insrsid10632156 \loch\af3\dbch\af11\hich\f3 \'b7}{\rtlch\fcs1 \af3 \ltrch\fcs0 -\f3\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \tab }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 les r\'e9\loch\f38 \hich\f38 -clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9\loch\f38 \hich\f38 stricte, de n\'e9\loch\f38 gligence ou d}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156 -\loch\af38\dbch\af11\hich\f38 \rquote }{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 une autre faute dans la limite autoris\'e9\loch\f38 e par la loi en vigueur. - -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 Elle s\hich\f38 \rquote -\loch\f38 \hich\f38 applique \'e9\loch\f38 \hich\f38 galement, m\'ea\hich\af38\dbch\af11\loch\f38 \hich\f38 me si Microsoft connaissait ou devrait conna\'ee\loch\f38 tre l\hich\f38 \rquote \'e9\loch\f38 \hich\f38 ventualit\'e9\loch\f38 d\hich\f38 -\rquote \loch\f38 un tel dommage. Si votre pays n\hich\f38 \rquote \loch\f38 autorise pas l\hich\f38 \rquote \loch\f38 \hich\f38 exclusion ou la limitation de responsabilit\'e9\loch\f38 - pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limi\hich\af38\dbch\af11\loch\f38 t\hich\af38\dbch\af11\loch\f38 ation ou l\hich\f38 \rquote \loch\f38 exclusion ci-dessus ne s\hich\f38 \rquote \loch\f38 -\hich\f38 appliquera pas \'e0\loch\f38 \hich\f38 votre \'e9\loch\f38 gard. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10632156 {\rtlch\fcs1 \ab\af38 \ltrch\fcs0 \b\lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 -\hich\af38\dbch\af11\loch\f38 EFFET JURIDIQUE.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \lang1036\langfe1033\langnp1036\insrsid10632156\charrsid8681548 \hich\af38\dbch\af11\loch\f38 \hich\f38 Le pr\'e9\loch\f38 \hich\f38 sent contrat d\'e9\loch\f38 -crit certains droits juridiques. Vous pourriez avoir d\hich\f38 \rquote \loch\f38 \hich\f38 autres droits pr\'e9\loch\f38 \hich\f38 vus par les lois de votre pays. Le pr\'e9\loch\f38 sent contrat ne modifie pas les droits q\hich\af38\dbch\af11\loch\f38 -\hich\f38 ue vous conf\'e8\loch\f38 rent les lois de votre pays si celles-ci ne le permettent pas.}{\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1649263 -\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 -72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 -2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b -44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 -065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 -00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 -84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc -52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 -bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 -656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c -070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 -29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 -312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 -a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 -98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c -94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 -7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 -9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 -e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 -193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 -17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 -8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 -6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a -668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 -bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e -16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b -5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 -8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 -c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 -0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b -7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb -9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 -088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf -8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 -ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 -28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 -345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 -b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 -254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 -68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 -51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 -720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 -a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 -000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 -002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 -656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 -00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 -00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6; -\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4; -\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; -\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; -\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000005021 -203fc7ebca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/PKCryptoWelcome.rtf b/PKCryptoWelcome.rtf deleted file mode 100644 index 24ca70e87..000000000 --- a/PKCryptoWelcome.rtf +++ /dev/null @@ -1,1228 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Courier};} -{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Wingdings 3};}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};} -{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????????\'a1\'a7???????};} -{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????????????\'a1\'a7???????};}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri{\*\falt Arial Rounded MT Bold};} -{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ?????????????????????????};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Univers};} -{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun{\*\falt @Batang};} -{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri{\*\falt Arial Rounded MT Bold};}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} -{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f52\fbidi \fswiss\fcharset238\fprq2 Arial CE;} -{\f53\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f55\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f56\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f57\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);} -{\f58\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f59\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f60\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Courier};} -{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Courier};}{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Courier};}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Courier};} -{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Courier};}{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Courier};}{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Courier};} -{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Courier};}{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};} -{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};} -{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????????\'a1\'a7???????};} -{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????????\'a1\'a7???????};}{\f412\fbidi \fswiss\fcharset238\fprq2 Calibri CE{\*\falt Arial Rounded MT Bold};}{\f413\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr{\*\falt Arial Rounded MT Bold};} -{\f415\fbidi \fswiss\fcharset161\fprq2 Calibri Greek{\*\falt Arial Rounded MT Bold};}{\f416\fbidi \fswiss\fcharset162\fprq2 Calibri Tur{\*\falt Arial Rounded MT Bold};}{\f419\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic{\*\falt Arial Rounded MT Bold};} -{\f420\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese){\*\falt Arial Rounded MT Bold};}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ?????????????????????????};} -{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ?????????????????????????};}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ?????????????????????????};} -{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ?????????????????????????};}{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ?????????????????????????};} -{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ?????????????????????????};}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ?????????????????????????};} -{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ?????????????????????????};}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ?????????????????????????};} -{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};} -{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};}{\f444\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};} -{\f442\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}{\f443\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f445\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};} -{\f446\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}{\f449\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\f454\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt @Batang};} -{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} -{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} -{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} -{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} -{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE{\*\falt Arial Rounded MT Bold};} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr{\*\falt Arial Rounded MT Bold};}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek{\*\falt Arial Rounded MT Bold};} -{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur{\*\falt Arial Rounded MT Bold};}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic{\*\falt Arial Rounded MT Bold};} -{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese){\*\falt Arial Rounded MT Bold};}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} -{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} -{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} -{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0; -\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; -\chyperlink\ctint255\cshade255\red0\green0\blue255;\ctextone\ctint255\cshade255\red0\green0\blue0;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128;\red233\green238\blue243;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 -\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 \styrsid12539996 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext1 \slink15 \sqformat \styrsid10253358 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 -\ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat \styrsid10253358 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar -\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext3 \slink17 \sqformat \styrsid10253358 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 -\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat \styrsid10253358 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar -\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext5 \slink19 \sqformat \styrsid10253358 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 -\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat \styrsid10253358 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar -\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext7 \slink21 \sqformat \styrsid10253358 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 -\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat \styrsid10253358 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar -\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext9 \slink23 \sqformat \styrsid10253358 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive -\rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid10253358 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink2 \slocked \styrsid10253358 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink3 \slocked \styrsid10253358 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 -\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid10253358 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink5 \slocked \styrsid10253358 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink6 \slocked \styrsid10253358 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 -\af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid10253358 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 -\sbasedon10 \slink8 \slocked \styrsid10253358 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \fs19\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink9 \slocked \styrsid10253358 Heading 9 Char;}{ -\s24\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 -\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid10253358 Bullet 3;}{\s25\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10253358 Heading EULA;}{\s26\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 -\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid10253358 -Heading Software Title;}{\s27\ql \li0\ri0\sb144\sa288\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext27 \ssemihidden \sunhideused \styrsid5012459 Normal (Web);}{\s28\ql \li0\ri0\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 -\f2\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 \slink29 \sunhideused \styrsid5012459 HTML Preformatted;}{\*\cs29 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20 \sbasedon10 \slink28 \slocked \styrsid5012459 -HTML Preformatted Char;}{\*\cs30 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf17 \sbasedon10 \sunhideused \styrsid13251211 Hyperlink;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 \slink32 \ssemihidden \sunhideused \styrsid9916094 Balloon Text;}{\*\cs32 \additive \rtlch\fcs1 \af38\afs16 -\ltrch\fcs0 \fs16\loch\f38\hich\af38\dbch\af11 \sbasedon10 \slink31 \slocked \ssemihidden \styrsid9916094 Balloon Text Char;}{\s33\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace -\rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 \sqformat \spriority34 \styrsid1725511 List Paragraph;}{\*\ts34\tsrowd\trbrdrt\brdrs\brdrw10\brdrcf18 -\trbrdrl\brdrs\brdrw10\brdrcf18 \trbrdrb\brdrs\brdrw10\brdrcf18 \trbrdrr\brdrs\brdrw10\brdrcf18 \trbrdrh\brdrs\brdrw10\brdrcf18 \trbrdrv\brdrs\brdrw10\brdrcf18 -\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f1\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon11 \snext34 \spriority59 \styrsid1725511 Table Grid;}{\* -\cs35 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \sunhideused \styrsid5642075 annotation reference;}{\s36\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 \slink37 \ssemihidden \sunhideused \styrsid5642075 annotation text;}{\*\cs37 \additive \rtlch\fcs1 \af38\afs20 -\ltrch\fcs0 \fs20\loch\f38\hich\af38\dbch\af13 \sbasedon10 \slink36 \slocked \ssemihidden \styrsid5642075 Comment Text Char;}{\s38\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext36 \slink39 \ssemihidden \sunhideused \styrsid5642075 annotation subject;}{\*\cs39 \additive \rtlch\fcs1 -\ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\f38\hich\af38\dbch\af13 \sbasedon37 \slink38 \slocked \ssemihidden \styrsid5642075 Comment Subject Char;}{\s40\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 \snext40 \shidden \ssemihidden \styrsid5642075 Revision;}{\*\cs41 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf19 -\sbasedon10 \ssemihidden \sunhideused \styrsid5642075 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927} -{\list\listtemplateid1887227464{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li810\jclisttab\tx810\lin810 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1530\jclisttab\tx1530\lin1530 }{\listlevel\levelnfc0\levelnfcn0 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2250\jclisttab\tx2250\lin2250 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2970\jclisttab\tx2970\lin2970 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3690\jclisttab\tx3690\lin3690 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4410\jclisttab\tx4410\lin4410 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5130\jclisttab\tx5130\lin5130 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers -\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5850\jclisttab\tx5850\lin5850 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-360\li6570\jclisttab\tx6570\lin6570 }{\listname ;}\listid987594221}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid2033377338\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s24\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691 -\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880 -\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-1560004652{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace360\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li810\jclisttab\tx810\lin810 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1530\jclisttab\tx1530\lin1530 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2250\jclisttab\tx2250\lin2250 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2970\jclisttab\tx2970\lin2970 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers -\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3690\jclisttab\tx3690\lin3690 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-360\li4410\jclisttab\tx4410\lin4410 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5130 -\jclisttab\tx5130\lin5130 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5850\jclisttab\tx5850\lin5850 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6570\jclisttab\tx6570\lin6570 }{\listname -;}\listid1814174743}}{\*\listoverridetable{\listoverride\listid1567649130\listoverridecount0\ls1}{\listoverride\listid752163927\listoverridecount0\ls2}{\listoverride\listid987594221\listoverridecount0\ls3}{\listoverride\listid1814174743 -\listoverridecount0\ls4}}{\*\pgptbl {\pgp\ipgp13\itap0\li-390\ri-390\sb0\sa360\brdrb\brdrs\brdrw15\brsp360\brdrcf20 }{\pgp\ipgp12\itap0\li0\ri0\sb144\sa144}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp8\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp17\itap0\li0\ri0\sb0 -\sa0}{\pgp\ipgp16\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp14\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp9\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp3\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp1\itap0\li0\ri0\sb144\sa144}{\pgp\ipgp7\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp11\itap0\li-390\ri-390\sb0 -\sa360\brdrb\brdrs\brdrw15\brsp360\brdrcf20 }{\pgp\ipgp19\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp4\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp6\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp10\itap0\li720\ri720\sb100 -\sa100}{\pgp\ipgp20\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp5\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid80797\rsid96267\rsid1447428\rsid1649263\rsid1725511\rsid3093603\rsid3159240\rsid3287017\rsid3897294\rsid4205128\rsid5012459\rsid5330529\rsid5532184\rsid5576486 -\rsid5642075\rsid5838308\rsid5993271\rsid6892738\rsid7096544\rsid7739184\rsid8409143\rsid8723433\rsid9190636\rsid9846002\rsid9916094\rsid10241836\rsid10253358\rsid10435762\rsid10447979\rsid10689454\rsid11756618\rsid12539996\rsid12664258\rsid13251211 -\rsid13788253\rsid14156743\rsid15140419\rsid16062179\rsid16668801\rsid16737971}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author yonglee} -{\operator Lorenzo Tessiore}{\creatim\yr2010\mo5\dy3\hr19\min6}{\revtim\yr2011\mo8\dy16\hr12\min3}{\version10}{\edmins28}{\nofpages1}{\nofwords423}{\nofchars2414}{\*\company Microsoft}{\nofcharsws2832}{\vern49255}}{\*\xmlnstbl {\xmlns1 http://schemas.micr -osoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen -\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin1440\dgvorigin1440\dghshow2\dgvshow1 -\jexpand\viewkind1\viewscale92\viewzk1\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel -\wrppunct\asianbrkrule\rsidroot10253358\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3 -\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} -{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar -\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10447979 \rtlch\fcs1 \af38\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\af38\hich\af38\dbch\af13\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 Dear Porting Kit developer, -\par -\par \hich\af37\dbch\af13\loch\f37 Welcome to one of the most exciting and innovative embedded development platforms around \hich\f37 \endash \hich\af37\dbch\af13\loch\f37 - the Microsoft .NET Micro Framework! With the .NET Micro Framework, you can build compact, robust, and powerful embedded designs in less time than you \hich\af37\dbch\af13\loch\f37 thought possible. \hich\af37\dbch\af13\loch\f37 -Most importantly, you are using the same tools and programming models that are used o\hich\af37\dbch\af13\loch\f37 n the web, the PC, the server, and in the cloud. With the coming of the \hich\f37 \lquote \loch\f37 Internet of Things\hich\f37 \rquote -\loch\f37 , more and more solutions now include devices and more and more devices are becoming connected. It only makes sense to build as much of those solutions with the \hich\af37\dbch\af13\loch\f37 s\hich\af37\dbch\af13\loch\f37 ame skill set. - -\par \hich\af37\dbch\af13\loch\f37 -This latest release is our third release since becoming and Open Source project and it is really gratifying to see the amount of work that the community is putting into this project. With this release, a significant percentage of the new -\hich\af37\dbch\af13\loch\f37 features are generated by the community. One \hich\af37\dbch\af13\loch\f37 new feature \hich\af37\dbch\af13\loch\f37 -that will be especially interesting to porting kit customers is the PK Studio which is an IDE to help you build the platform. When we made the porting kit available, we knew it could be easier and \hich\af37\dbch\af13\loch\f37 -the community has stepped up and done just that. -\par \hich\af37\dbch\af13\loch\f37 The porting \hich\af37\dbch\af13\loch\f37 kit is intended to provide the truly engaged \hich\af37\dbch\af13\loch\f37 the ability to debug through the entire stack \hich\af37\dbch\af13\loch\f37 -and to support them in creating ports on their own\hich\af37\dbch\af13\loch\f37 . -\par \hich\af37\dbch\af13\loch\f37 With this Porting Kit you\hich\f37 \rquote \loch\f37 ll be able to create, \hich\af37\dbch\af13\loch\f37 modify, and build Micro Framework firmware images that are customized to your needs. Using the Solution Wizard -\hich\af37\dbch\af13\loch\f37 or the PK Studio,\hich\af37\dbch\af13\loch\f37 you can select the right set of features, libraries, and memory settings to provide the optimal image size for your needs. You \hich\af37\dbch\af13\loch\f37 -can then write new drivers, leverage native code routines through interop, and deploy them on your device hardware. -\par }\pard \ltrpar\ql \li0\ri0\sb120\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10447979 {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 -To get started, please read the introductory material in the Porting Kit documentation. The documentation contains a lot of useful informati\hich\af37\dbch\af13\loch\f37 on on the architecture\hich\af37\dbch\af13\loch\f37 of the Micro Framework -\hich\af37\dbch\af13\loch\f37 , \hich\af37\dbch\af13\loch\f37 the \hich\af37\dbch\af13\loch\f37 build system, \hich\af37\dbch\af13\loch\f37 the \hich\af37\dbch\af13\loch\f37 driver model, \hich\af37\dbch\af13\loch\f37 the \hich\af37\dbch\af13\loch\f37 -libraries, and how you can put it all together. In addition, we have extended our very successful newsgroups to include groups specific to porting as well as the SDK so \hich\af37\dbch\af13\loch\f37 -that you can exchange information with other engaged in the same process. You can find links to \hich\af37\dbch\af13\loch\f37 support forums\hich\af37\dbch\af13\loch\f37 and other useful information at }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af37 -\ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 \hich\af37\dbch\af13\loch\f37 HYPERLINK \hich\af37\dbch\af13\loch\f37 "\hich\af37\dbch\af13\loch\f37 http://\hich\af37\dbch\af13\loch\f37 www. -\hich\af37\dbch\af13\loch\f37 netmf.com\hich\af37\dbch\af13\loch\f37 "\hich\af37\dbch\af13\loch\f37 }}{\fldrslt {\rtlch\fcs1 \af37 \ltrch\fcs0 \cs30\f37\fs22\ul\cf17\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 http:// -\hich\af37\dbch\af13\loch\f37 www.\hich\af37\dbch\af13\loch\f37 netmf.com}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 . -\hich\af37\dbch\af13\loch\f37 You can also browse \hich\af37\dbch\af13\loch\f37 or\hich\af37\dbch\af13\loch\f37 download \hich\af37\dbch\af13\loch\f37 the .NET Micro Framework\hich\af37\dbch\af13\loch\f37 \hich\af37\dbch\af13\loch\f37 -codebase and track any issue at }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 \hich\af37\dbch\af13\loch\f37 HYPERLINK \hich\af37\dbch\af13\loch\f37 " -\hich\af37\dbch\af13\loch\f37 http://netmf.codeplex.com\hich\af37\dbch\af13\loch\f37 "\hich\af37\dbch\af13\loch\f37 }}{\fldrslt {\rtlch\fcs1 \af37 \ltrch\fcs0 \cs30\f37\fs22\ul\cf17\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 -http://netmf.codeplex.com}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\fs22\insrsid10447979\charrsid10447979 \hich\af37\dbch\af13\loch\f37 . -\par -\par \hich\af37\dbch\af13\loch\f37 We are very excited about the great embedded solutions already being built with the .NET Mic\hich\af37\dbch\af13\loch\f37 -ro Framework, and look forward to a long-term partnership with you as you build your new product. Thank you for choosing the .NET Micro Framework! -\par }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\fs22\lang1024\langfe1024\noproof\insrsid10435762\charrsid10435762 {\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} -{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLockAspectRatio}{\sv 1}}{\sp{\sn fLockPosition}{\sv 0}}{\sp{\sn fLockAgainstSelect}{\sv 0}}{\sp{\sn fLockAgainstGrouping}{\sv 0}}{\sp{\sn pictureGray}{\sv 0}}{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn fFilled}{\sv 0}} -{\sp{\sn fNoFillHitTest}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn wzName}{\sv Picture 1}}{\sp{\sn dhgt}{\sv 251658240}}{\sp{\sn fHidden}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley99\piccropl0\piccropr0\piccropt0\piccropb0 -\picw5108\pich1734\picwgoal2896\pichgoal983\wmetafile8\bliptag-1185998603\blipupi369{\*\blipuid b94f18f58a70323005ba05ecd8e4c07f} -010009000003d27200000000652f000000001610000026060f002220574d46430100000000000100402f00000000050000000020000094650000948500000100 -00006c0000000000000000000000e5020000fb00000000000000000000002b660000b222000020454d4600000100948500000c00000001000000000000000000 -00000000000040060000b004000034020000a7010000000000000000000000000000dc9c0800a5750600460000002c00000020000000454d462b014001001c00 -0000100000000210c0db010000006000000060000000460000003025000024250000454d462b224004000c000000000000001e4009000c000000000000002440 -01000c000000000000003040020010000000040000000000803f214007000c00000000000000084000057c240000702400000210c0db01000000000000000000 -000000000000000000000100000089504e470d0a1a0a0000000d49484452000002e6000000fc0802000000b429f6d0000000017352474200aece1ce900000004 -67414d410000b18f0bfc6105000000206348524d00007a26000080840000fa00000080e8000075300000ea6000003a98000017709cba513c0000000774494d45 -07d80a030d110541d7c7610000003774455874536f667477617265004d6963726f736f66742057696e646f77732050686f746f2047616c6c65727920362e302e -363030302e3136333836803c4fb70000001374455874536f75726365005865726f7820574350203535427788360000235d49444154785eed9cdbb625278e45dd -ffffd1d5e9de653a1c1710200909663ed4f0c8227499126205714efecf7ffef39fbff8030108400002108000048213f82359f8030108400002108000048213f8 -2b787c8407010840000210800004fefe280405084000021080000420109f0092257e8d881002108000042000016e59e80108400002108000043210e096254395 -8811021080000420703c0124cbf12d000008400002108040060248960c552246084000021080c0f104902cc7b700002000010840000219082059325489182100 -0108400002c71340b21cdf02008000042000010864208064c9502562840004200001081c4f00c9727c0b00000210800004209081009225439588110210800004 -20703c0124cbf12d000008400002108040060248960c552246084000021080c0f104902cc7b7000020000108400002190820593254891821000108400002c713 -40b21cdf02008000042000010864208064c9502562840004200001081c4f00c9727c0b0000021080000420908100922543958811021080000420703c0124cbf1 -2d000008400002108040060248963555faebafbfc95fff774d1c788500042000010824218064f12bd41f8152fe3cbdfee40b7f20000108400002107825c03169 -de18722d5256ca1f318f1e07108000042000811804902c567518fee8835eb12a09762100010840203301244be6ea113b042000010840e018024816e5520f5fae -dce2e0ae45b93098830004200081e404902c6a05fcfd68ad9ab97f7e9f48d120a6200001084000027909681eb17929cc47ae2b56fec4a36e703e472c40000210 -800004161240b2ccc2b7d616d6f667f3e779084000021080800b0124cb1466533d616a7c2a6d1e86000420000108b81340b20c22474f0c82d37eecfa8fd93c7f -9c883269f3c61e042000816504902cdde89d4f416777dd38963e507e3feb46e9faaf0c03706989700e010840408d0092a50fa5f3f9e7ecae8fc5d2d5e5424588 -48b86c694e388700042000811a01248bb43f38f3a4a4ecd70dd762f841fb9cf00001084000020d024896e82dc229fb5a21b0446f5ce283000420a04d00c92222 -ca0129c264bfe8fa432ac3dea8e6303a1e84000420b0900092a5750da5fa0fda0e54faf95b300346f678a4fcb0ed7c3aa89679865880000420e04c00c95203ce -c1e6dc8e7577eaea8dfa86aa2fc140000210689c02007a2510e73053bc5ac85b6b95ef4179d327720840000210f843805b16da200701f52b961c691325042000 -0108fc4300c992a017e25cf92c81657ac5c225d6929ae214021080c0000124cb1d5a347dc099cafdcac0c6e61108400002fb1140b2ec57d3dd3272106dd174ea -6e25241f084000021a04902c1a148d6d9c7ca09a7e1532ae1be6210001084040930092e56f9ac135c1c95f46829746732f620b0210800004aa04902c091ae458 -c9e2f049e85a7ee45182cd40881080c0c104902c09ae588eedcf63b5dab11527710840000215024816da232e01e76b0f677771b91319042000819004902c21cb -f2efa0ce3c4af9c1db04ad4988108000041c0920591c614fb83a50b52c497989d389bee0510840000207113857b2a4389c9c7ffe345ae3a7a8513468c4030108 -40605702274a962c07e1c97a85af42bb4e1cf282000420304ce044c9320ccbffc1c355cb2ae0fe7ef10801084000024d02489626a2650b4efe15df85b72c592e -e196f5258e210001082c22806459045ee076e1b12d88ce70c9c95acd102ba62100010824278064095ac0ab5e39f0bd1fd512b42f090b021080c03a02489675ec -5b9e4fbe65f9c36695505be5b7d50efcff108000044e27806409da01b783f3b473f4b47c8376216141000210884400c912a91aff8e855b96b8b5213208400002 -107027b0bf6449fabe7e0d3b690ac3cdcc0fb20ca3e341084000021b13d85fb2a42ede6962e557acb592e54ce6a9b709c14300028710d85fb2e43d81cefc77e4 -8a5ec95bb843660769420002107026b0bf647106aae5eed803fbd89fe0d1ea1cec40000210d8950092256e654f562d0bab722cf685cc710d010840404200c922 -a1e4bda67c12fa3a3e373e56d7fe208b77a5f107010840000262024816312adf85f5937bfbaf271b6b32df3ec21b042000817d08ec2959b63ff08a64b9fec706 -5d19418a6ddf3c1bf409294000026712d853b21c52cbebaf14eda45d100d8734306942000210e8228064e9c2e5b1b8f7779baf3ff872bb7df10857db077a459b -28f6200001086c42604fc9b2cdb1d795c8ebd7a25c3fcd1ae1c3d0263b9b34200001086c476037c9d275c687ade66416a9b54bef25937a1127e1abc783410840 -000210f811d84ab2ec77d84c66f4a55d22777fae6ba1c824890d021080c06604b6922c7bd4c6e29a218b7641afecd1c36401010840c082c03e9265f242c2026e -409b5fbf1d1d8adeda60d67a0fd83384b48ac0ad15e9cc5585c06f1c02fb4896384c5522b1b86b298185fd61176e59549a072379095c7f01f0bf1feffffa7b4a -17bdf25c9037592287402f817d24cb4eaf206eb9c4fc60e4967eef6e613d042c0814a53ef0a2727d848d63511d6c8622b0896461afce74551ce1c22dcb4c1d79 -362301f5d975bb8fc9c8849821f04520bd6451dff0c7f6caf5c2f926623c99a05a3c69e36b1581e7854ad974e57bd0cc70bb3e3b6367159f49bfd73172fb9436 -709535190c8f2b12482f59ae5f7915b99c6c6ae1a5cb81b3f5e44e3b36f7d71f58b13e4af7de5caf1fc86e5fdc4abf3d17ef0d67a78db68364d9a91ea17259a2 -5d16deb230b642b5dfaec1bcdeaff8246bad8a7cb2b879b9dd27bdcac17a60372ccc812575143a4d2f59169e7042c4d9977d09170bf20c8becdd42fccdd3d162 -e3f462df60a35da5c917d201d45baabadef688bc3eb764d960e3456e8e676c15f9a295c8c094d1728d1d08981228dbc7d48bdc78debd76d32bbf946fc7c16476 -1c2ef246f25c9958b2d0529e8df2bc8cb5f86c3439651602c1350452dcafbcbe8724aa5d1911d7ff789d4e2a4955bca8d8c7482f81c492e529ab7b9367fd2481 -e7ddece47be4da5b5944f0643ff0788540e4ee8a1c5b415a82acbfd8d8e56267998d23279058b2d040f2323bacac5cba7455aa6bb1435eb880c03c81f8d7876b -df16848417624cc1478831f5b2c4922535f78d839ff960b470246d5c11525b4b204b57877d5bb88e94b5a5e46a7f3dffe5110c0480e01d80e6ffc880765958d9 -b0f3dabf70785424b0b0a507b298fcb03be0b1f9485dafb06d9b00375b90f596854e4dd48872ed92e57d34117c425d4e20d7b08aa3b1425daedcba8849b56a5b -a5942cb946c0aad246f3fb255c4a35cb14a0bed16a473cc304327675840d58945364711001d47067267d30a56449ca9ab07f042ada25f278a27c10e82590b79f -d7461ef97e85eb96de5da0bb3ea56441dbea36c12a6b75edb22a2afc42408540c09f0b91e7b576c6ae154c724a65e55a5c0301e77d249f64a139f276db57e46b -b50b1db55f4705c928756badd20daf3f4c1399649c9ffe09d2f6a66124932c34876937ac35ce07a3b5fcf1ae4b608361e5af5a925e4d6d506bdde6b7b3964cb2 -d881c07210024de112f97d2b0843c28840e076fad2b7cda2a43ef8a96fb3be2a0b9249167fd5af42192312025f2f586590bdaa1989e5ca1a06cd24401eaf7fee -2cff6fc64ef3bcf3f0f465d4b41c4f4660af663349968c7bdea1849bb9a85479ed8fbc6cc69974ac097080c9096fa057526b5379a596afcc2459fec042b52cef -18d3008437c3cd8f47a641621c0212027b1cc33e59f87891546d720d3a751260f3f14c9205bdd22c67f605031b7ef2ea85a6cade3361e31f68e6b0b99806b619 -a8cdd2312dfd807124cb00341e312430b3e12bf2c530624c43e08d003707c2bed806d4355fde8584d5ef5d9643b250fedeba665c3f23566ef94aae5e68aa8c4d -922866c57e8e90b5d17ed94faf6c56f708bdf72f2d182da04a3c467b261181ed43b5985f12f9b23d58125c42608fd3cb2e0b8bfdbea4d04fa79c564685c871cb -f227793ac0a803a299b52b7453bbd8b98e0699781c086c761e5bec8ecd1095a6fab1b220e6d0b7c15da4912cc139129e0a019fad5ed72e0c1a955262e47768ed -d14e461b731b3eafb72c7b943eda46ce2159a87db4beb18bc7b3d6651057448c5da658de9bc0665708ea1b73333eb76656c7b5f76691679743b270c926af68ea -956e53ec6ba0343f1ea5c64bf0ce04dcfad93a2f8beb906de07c8915548b455ba6912c16c96313025f04d02ef4c63c018b937e3eaa610bba67f06670ae544b6a -bac4860bb7d3830924cbc69dbd5327a9e4e2f3e235304750302af53dcd884f3ffb501dd83595c0ae1bca277e7f2fbac4fce38fe931816489098ea88c0804dfe7 -4ded123c7ea3aa61b67e5db7011ff557c71376ca09393af77602c942d59d7b62a13b87b752ad76aa6b979f172d5f0b2b82eb19023bdd25e836b3c34e9f299cca -b3bac45442dac04874c9c2e8dfa0c9ba52c8b8cf4b975674cc4dc1644cb3ab8e2cfe1150bf9c58055677146f83a55e0eb6b97abb46972cbcaaaa973cb841d359 -e633419a17303e61042ff421e16d739da0bb31b7c15269635d9177c87e69a6195db230dc9b25dc6981ee588c40e63ab6e47730112227061502db9ccdbaa378bf -9dfeda2dbad0541a32bb91e892855b96ec1dd61bbfd12c8b333b84773025e038910f94b27c1c3979231bb5746f39e6d72bb6e2364cf83034df575d16a24b16c5 -4dd2c585c56b099c53778982b95dd55c4bb31654094c98c52107d56defec71d1a258bb3d80ac9d90c77a0f2d59f816785a5f32cbe422e07a6ff1255cae7fffb5 -9b2ad739c2af5a5d7a45f1e4cbb23bf6e86a4571fcda038af6e334c681dd6e0d3fb464b14e1efb61096c39bf8669cb75cc4d3dfc644d999bc37684a2a4b8bb7e -0fba49ab3387f806592ba6f0aae1b6dcf25b26353cc7541e0c2d591437890a2c8c3810b028fa9683c35a7fd4d5cff38ea709f96ad0a19142b9b0e86ae7049bf5 -15c6b3c79d9324d9b243258b592324105ab2dcded58429b12c3501f6b962f9ae306fff5dbf7d31da7ae71c57b7226e90b89664b9ddfc15508af61577d0a4a90d -a4ea2401f5c7a34b962dfb58bd8aaf0693a2d3dde44921f87488bf17dde2fac73fe331bb6a51ac9da2a9998a383ccbfc51871c5ab250efb17aa7be81e79665ac -e8f19f4add962a78f31ed5ba9167576fc26660940941752d0b2d597e57885df9b0f87a30a4db33ba01d33cd1b683eec9172dbb663ca9d3d7da4d4729572d68cd -d63a6741684140bd7b1bf1360e328ec843dec07a2bbbc17a2afb7b07cb38d674634e0a61600fea721b0860bf47424b166e59e40d57ee279ee320d7b639679cc9 -8bbbc1caa3dead2bf5caabdb14c7485e08bd3b51115aafeb5dd787962cd4bbabed2ab8129154196789f2ed2a71eac588d15ff93236a76ecc2a7b3ccb5ed04597 -256bbb38a34b16ea2dac7d13547381d091f5320e366bc2abec1f7550352f5a565561ccafeef438678feb721babdd664f85962c49df48fc5ba4b9319a0bfc63fe -f2387fb0254a360e76eb48e6cb6a1da1a7fd7467b66ec0e734832e37cf160deb2bb464e1ec91f4cd7e9486f7f97e28240d9065cd7059b324d81567a2635b7d5b -1dd20987a4d9d5f6f38b434b166e592405561f2812a7766b8647f9661cec082fb13c5cd625d13a38cdd5aebad19ed30cbadc1cda32be8bd092857a371b685744 -bbe6d52ce8ae0bce39a5e415ccf216fedb8c8a5bf290665024266faaed5786962c3ffa14feab0bbbc8742d5edbf703233251766bd9aef27ec829d58b37856a51 -df5ca519d42df7f2375d9fa2b8a6042c8c87962c7b37f4643907cef5498f3e8fef9a970fbdb05e902cafa5c9d2edeaa3f89ce35c1d5dd83dee135868c9c2154b -bd0976dd0ce78c339f4dbedccb216fd5639c83ab168b2173887e658e8ded88c6a9676154cbe6219d3d86cb62948c4562f1947cb7efcdc182ed129bf2822e096f -add3e0702cb6d8f6b33d784dd736fc8c776e5966e82d7ed662942c4ee9ffdc4b76fbaeb947e0af1e03b72c92eb5249dbab97a669d068a36d2f59ca27022380cd -c2edba20b46489b98723b482169980dbe9845916a1859c63d0ea58e7b0dddc1dc867fb94034e57b77eb673145ab2fcd2a6f05fe5ef255366c4f5ad37e0e068e6 -d55c60b761b03c468092352f5a628a75a3f91033d9b1de7e7dead7f0b4bd22d2ffea01758b8a06a97745ac74c1b9ce9dab70f96daa68e3235a3c8a2d7da6290a -2aa97bc09d28097b6ccd51c98e21e2a9772d189f4bd7d91c3f1d9508e54c9e02a52e83e4965512791ae1edc408ec42b3481621fc68a08cae58fefbbafc4fb642 -38899631c4ec8a95e0c3905df2792d778d92db154b25eb3813f355392d9753791b666de471fa6a2d0789f738a79df576dbbb2bace9497a69cb35d1254bd7d9bc -65852693ea05186162f6c63c8988c7ad09ec7d38e9d28bf6c5c4eee8ddb82b224c51ddb68c632d8164f903cb6edbc4a9445724f243fd3a17ba30ca5d74452e59 -bcd0b5243cd60c10a0a6726841cef2ae7121cfeeba3248a663c1f3d41202d1250b7ae5b52dbaa6c9c05c58fb963010f092cd835321010a2a04f55b16e7a2a56b -ce74e578cd74e0c1e08f20d0ed0a145db2ac3d3bedb84f5a966f89e1f1b7903c27dc647b047c5cdeb101835f12d2f0ced58ad65aaf5cc59956ccd8d99e4074c9 -c22d4ba5058533655801f81f334527f9bb9ee7bcfdb0184e70f9e93b1cf9c2075741f37c57191e4d0beb22712d9ccc1253acb911482059502dcfaeed3dd1838f -86eb94bcaa9608db355a3c11980cc4d0dbb1032ef67b64956af124197c340da040af0c40933f9240b278aa7e39b8b52b0776c5d868b03e69beae55acfd0acb57 -380789471876b465271cbd46ccc7b6ed7c30031366cce9663bcb8ddb18ed0d9e4a2059b86579edb381bd313cfe067c35f74619554fe3c371369d762df892535d -4658fc2310a4a619cbe18fce62bf7f91df4fce7ad2cbd8cf933127902cdcb23c6b3ccc6460fc0dfb7a0dfbaa03bec4e8409093dba0394f8dec1f62364e413302 -f73cd4fd8fdb9d7ac39f5ec67e9e8c398164e19645eb96e56aa7eb3e76722bde444fd39ae78c6e8a9566b4933bf090c7773a99fc4be6b0234a9ffb373cbde1df -51793de6902ca896ca8d854ff30d0fb2b14b9a2e45a54bc0e87bd03040ddec9658533c718f3dde141956647af6f65812ffed5570790c7b079043b28c1d7b7b57 -ee97ddfc4158c44105b2f09cb8bda80dc7e6309debbda11ec0c257d820bb40d842cd68afa5196eb0a697980bd4dbb2a4b9bc3f17bea2c4ac35517d0aeb2c6850 -2db74a396cf2eb91f074f735e6540e1287ec5e3bdfe844a47b5524cbad3a2a9d96650096571407e1e2cfc42e299f5cd8e03e9cff7e4b77f334e968d5193619b6 -f5e33e589c078ab3bbdbbba6cae1fa7a577ce0117b653bdfab5795ac5e26ebadaa685f31f772d6ae6d4ec58c1439632a20813492e5f71164edbe8a56bfdb2d88 -6978cef097b8b3904a46d736a6b5b6303e7326bdbec29e0cd6a2512d8ade6573a643ba1c192de66c32027bffbce0e346c50b3d712fde3fbb5c056fdd88e74071 -9ec8b7c34f3dd3ebdd8043a562ba50a75ade619cd56d10bc2a8a2dc815cb0fa9f3aed7ad2367932ecf8ab54cb72c5cb43c0be936afdd1c5de797c336b80d4af5 -9335975e514fbf5470d8721d60ea736eb2bd27554b28bd72532d93649c1f7fbd05748ee11c77f924cb4fb89c53a19adefcbfa1e503648964312df4ebc41f3e59 -5fcb54a0e99a556ffec9c34f18cf00846603f8442e4cd07fd970fa5721d884ec99d740937886d7dce6cb83d93e807c67bfdb219da2f66e4ac2739458bf3a5706 -bd6e9ab78321e6d9307cec756d105db057d73ef17725ebb9b837fd6b13866ac8db454bc0d8d02b9e8dfde52ba564c9d2cd0e05b63b096ec1bb69a3ebe4520778 -9befcf4652e47923a6687906cb93805b60038e843bbdf7d89e0118f359a1ca2fef7bcedb590e4d9888dca0e9ca5bb4c276350d697be3f9244b39d2b6af8d2441 -9f1d3e70d84882afac51f7d8142bba52e936bcd4d3e9c27b3ba89e07bcc3a81d68d4aea806ec77318cbfb84bb785952c7f38a7286569ce42b2ecb2f8ad923ac2 -949265ed0110adde3e3bdc79c629ba138a1553c9721dc4cefdf3a5579cc3e825d0a557aeb5ab748ecf4ef1075b3c565abd4bd02c4c21856479dd536ba19de33d -a564f9b57569ee73aa75cdf43ad3ad359ca28090176bdee97382370fc279a7a5396f992e392f6fb3550edf62a5bc4b8759350fe661cb16402c6c0a0958b856b4 -296f1545a7c3a66ea378d80e0f4a0864952ce5bd4a92e47e6b9e47afe9265739c8bbaa309f4e7376bfc633ef378e648926ebe56caf2b4bef9574ea8d54afbb3c -86ae768db6f855acfbefe2612cc195e5b515177654f3056c987fe407134b16e1088b4c7f2cb6af4eb51b49fe7b6378103c87b51cf2b0d3afdbafca458b29d262 -5c252339c0e64a493c92353f5df8cab0de00c1cfc22640f9822fd522b7b076a5b00dfc837c9e3b3705e313d2b9c79f0f5f232f0796ad72d4d98d63d3f355e5b6 -a374c22484c941d904753b488cf64539d19bf1d805f0b42c2c8d8af27e152e6ef03da97ef97a952c110213c620ec16a135ad655f278ef3462bee9cfd6a619cb1 -93f896e597f651aaa5d9a09327ee977a98e9b0b167e58994134ef7a81b08bb599dd2b14667e7ed6d4f18cf40a6c38f34cfa16bdd27e37f3db35fa5cc703a911f -fc4a3f72ccb7d89adde29c4bfdacf13c89aeb36e729bd4df18030adff492e51cd5226c4ddd7d2e747a958f2a73a42259ca68503cde4acc72a9744db397b9fa20 -b88db0aeaaa9d44b68a489b79764ddaf50b584c525a45a39e96f7ba4c97fcca3dd5341022e1d526f95eb36b463723df2745b57be5f16d66507c9625742d3b693 -1befda09b7b6937b79aeec7a6fb81d36937be969edb949265d345f2fe4e8c636b08a70791a9187edbfb2ae48145bb77e8aff26462e749262d533b2c32b896d6c -8dae841d8ba1bc8f35f54a3989661c359fbd1e075a337040acac6aa74d244b99413e4dd3ec2ac505634d39bfd5e7fdd6b7c155687e1d21af5a6d4c1fc82bd26b -7f0675055133e0a4276e1def0ccc26b1ba8ef174dd1b6a65fd6f9f0a1558c69ee9dd8f8a6c8b58b99e2ff55a8c8dcdae986f2e263d7e8da0eb7cbe9660666475 -a5f9b5781fc9726d2f1534118c68b563572e93b37b5eb07fcddf491a4208f2f4b5de338453e0eb7012e615645905af16cfde4c2b53bbd794f3fad79668c6b08a -7333b0cf53ea9f88872d8c3d58068e70f2f8a8ab9f97f9f34e28739b45b9ed6821abb18afc2da4869f8cf9a04fd338e47eedcb6177cfa66c9ad21a678ac2a519 -b3fa02491769812ac18f1153cfdddae0976451e7d99b4822e122d4b87502cb81cb0b5491b97223632bbbe670d7e2f97824634a2e38c6e2f95b437cff19b65979 -7037c952b4a7b5d6b328c6bc707e8d4a225c261577178d5f695e5f14ae7fe9b0ff25fb5982b42b7dc9e2af722c6422095bb846a25a84a6749795ceacf0d7f5d8 -654dfd6cc8a85aba88cd2c1ed86b331a4218ea2daade202567813092e7329f43644fc972957ec30558f2a09dd2aabc445634c4120811ca2739567be745174c9f -fddf1592d6e257b6d18ecfe67ed1a251d7cdd7bd60d412a6c79816a5affda865bfd8b90ec3ae0deed3c0ba92459dde15a311906d25cbad05ed6aa362f9261a54 -6c0a5570cc81e5f0bed2845c79a98d105e33fec80b9e2790db99d48545de03cf2d2c7ffd28cf4adc759da3c264630e815bf00e1d722b8490de6fd9752658d4a8 -b878ca02619c4ba6967ad536972c4b8a246ca0d2e85deb15171ba96095082314ae7e7ea8a479ac91db20539f6b46602b2df13b515e8f2eb910a9db374acae1cd -582b72873e19531bb77935664442e9a98385cad801dd57fcbaae37972c4ffd2b690b8735cf773207a7895c44902cb7e6d1dd78896a6114ead7f16ce44edd6c25 -fed797f52ee1b2f07d26f28d8be95bd68cceb83d6b34be5ef54aaf6451df0842835a47de1192e5f61a51de8784ac59b684c0cc04b10858381a2c5c6f69f3f508 -cf9be94da6dc04ee57b2a5c9a3755758e162a15a26df469e934a5db2d40d369b27da2c9dd9e6074996e77468567a86ecebb3fe1ed553f031a8bee77dc2c64b17 -81b0e7625716cdc579777dd80229ce87f9e3fcd5c2a40c7a36d56b1749825764d56c758705074996e73dffefbac561a0943730878a6ee3c2a734dbe04a9a88fa -644fca2172d8afc2c5616c5698a8dcb5a89ce59531a562bf1c5b751a4d56911bac2bb6e3244ba1736d35c5debad247a974f5e20d1d9265985ea2078db65e2202 -8942ad5cbaf82b9801b15b06b256d7d5ed0c44f8d50cf5615881bfdf143d57b25c2f5d9e1730c33b50b14d13cd328b50f7db6c1694b009017f0241ee5dbaee5a -aef26278bcf7be56cd6ba3e618acbf18371ff76f9e498fa74b96e7a5cb73377efdcd9f672baf1d938539fc7194dfe10d40faf1095446e56f36faa4f03a2b6e02 -c52218a1cdc95126113daf91481ef42990ae17a7aed20ddadadaf3feb06855879d609d5d16fbfbbd1f64214f9c10e825f09c99e5eabad754d7facafba4e2ddf9 -2da42e35d07515f4ccbd39065f6f59ba22ec02be7c319265790908e09d4073af020e02108849e055497c5dbd944b82ebe97bddfeb7bfffd911fed1e5f3aa1610 -000026060f002220574d46430100000000000100000000000000050000000020000094450000948500000f242e06ee5a84b2e33927077c495208b206c912a410 -84f12f02c2ed0a350840203281bab02822e655b5bc5e9308958aee0019562ad7d2f48624571e37d5d2eb2872ffbc5c3be50a9768cf21b0f7c63ba78e640a8142 -a09cfd72e5d145efcb6c9791fae2e1dbdf676c956b27b95eb9de39ddee9f14b38e638a5b9638b52092ff27805ea11b2000810102c27b9ddbfd47b9d1b9fdc753 -100c84f47ad7f21425af7a4ee2ee362df71e9e4816494bb0660181bd37de02a0b884c04904ba2e72cadd49f944f57505328fb02b3089bb5783920733ae41b264 -acda11310f5fc01e4187242100010181a63e78952657e1227032b2a4791bd465f4f5ab5397852c8b912c592a755c9cdcb21c57721286801981e1cf2e6611fdbf -e1d73b1eb95f6e59e4ac5809012b0248162bb2d8850004f62270532d7b25f7af6cb865d9b8b8b953e3c350eefa113d0420e04500c9e2451a3f10f826806aa13b -20000108340920599a885800015b027c18b2e58b7508406017025dff8e4beaa4f93094ba7c3b07cf15cbced5253708404095c021aa05c9a2da3518d323c02d8b -1e4b2c4100023b133844affc29219265e73ece9e9bc3bf8e901d11f143000210f81138e1661ac942b70725c02d4bd0c210160420108fc0212f78489678ad4744 -97378643f621358700042000812601244b13110b961138e19e73195c1c43000210c84600c992ad62c7c4cb87a1634a4da2108000044404902c224c2c5a42805b -9625d8710a010840202601244bccba10d57f7ffa9d9f65a1152000010840e04700c94227c425c02d4bdcda1019042000017702481677e438ec21806ae9a1c55a -084000023b1340b2ec5cddecb9a157b25790f821000108281240b228c2c49432017e69481928e62000010864268064c95cbddd63e79665f70a931f042000810e -0248960e582c7526c02d8b3370dc41000210884c00c912b93aa7c7c62dcbe91d40fe108000042e04902cb4435c02dcb2c4ad0d91410002107027806471478ec3 -1e02fc53723db4580b01084060670248969dabbb416e48960d8a480a1080000454082059543062c484c04fafa05a4ce0621402108040360248966c153b2c5ef4 -ca6105275d084000029f04902c34475c02e895b8b5213208400002ee04902ceec871d84380df73eea1c55a084000023b1340b2ec5cdd0d72e3a2658322920204 -20000115024816158c183121c0bfcb628215a310800004721240b2e4ac1b51430002108000040e23806439ace0a9d2e5962555b90816021080802d01248b2d5f -ac4300021080000420a04200c9a28211232604b86531c18a51084000023909205972d68da821000108400002871140b21c56f054e9f28fb2a42a17c142000210 -b0258064b1e58b75084000021080000454082059543062c48a00ff949c1559ec42000210c84600c992ad6227c58b5e39a9dae40a010840a04100c9428b842680 -6a095d1e8283000420e04800c9e2081b5710800004200001088c1240b28c92e33908400002108000041c0920591c61e30a02108000042000815102489651723c -0701084000021080802301248b236c5c4100021080000420304a00c9324a8ee720000108400002107024806471848d2b08400002108000044609205946c9f11c -04200001084000028e04902c8eb0710501084000021080c0280124cb28399e8300042000010840c0910092c51136ae2000010840000210182580641925c77310 -80000420000108381240b238c2c6150420000108400002a304902ca3e4780e02108000042000014702481647d8b882000420000108406094009265941ccf4100 -021080000420e04800c9e2081b5710800004200001088c1240b28c92e33908400002108000041c0920591c61e30a02108000042000815102ff0b07992244e25f -151b0000000049454e44ae4260820840010824000000180000000210c0db01000000030000000000000000000000000000001b40000040000000340000000100 -000002000000000000bf000000bf0080394400007c4303000000000080b3000080b3ff7f3944000080b3000080b3ffff7b432100000008000000620000000c00 -000001000000150000000c00000004000000150000000c0000000400000051000000005f00000000000000000000e5020000fb00000000000000000000000000 -000000000000e6020000fc000000500000003000000080000000805e0000000000002000cc00e6020000fc00000028000000e6020000fc000000010001000000 -0000000000000000000000000000020000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffebfffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffcffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff87fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd07ffffffffffcbfffe03fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffe002fbfffffffc00ffff03fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80012efffffff0003ffe03fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffc00bedb8bffffe0341ffe31fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0003fff807fffffcffff817e0ffe21fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff002b5c00001fffffd7ffff8fff87fe71fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bf6a6a8001ffffffaffff0fff8ffcf0fffffffffffffffffc010101ffff -fffffffffffffffffff4089ffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff437fffffff00e0fffffe3ffc1fffe7fd78fffffffffffffffffc010101ffffffffffffffffffffff200040fffffffffffffffffffffffffff87fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff005ffffffff8713ffffffbffc3fffe3fefc7ffffffffffffffffc010101ffff -fffffffffffffffff983ffff0ffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -c0bffffffffe0ffc5fffff8ff8ffffe7fd7f3ffffffffffffffffc010101ffffffffffffffffffffe63f1610000026060f002220574d46430100000000000100 -00000000000005000000002000009425000094850000fffff5fffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffff1fffffffffff -fffffffffffffffffffffffe077ffffffffc3ffe87ffffc7f0fffff9feff3ffffffffffffffffc010101ffffffffffffffffffff09fffffffebfffffffffffff -fffffffffffcffffffffffffffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffffffff02ffffffffff83ffff1ffffe7f1fffffbfeff9fff -fffffffffffffc010101fffffffffffffffffffcb7ffffffffdffffffffffffffffffffffff8fffffffffffffffffffffffffffffffffffffffe07ffffffffff -fffffff7ffffffffffffffc0fffffffffff8fffffcfffff3e1fffffdf9ff8ffffffffffffffffc010101fffffffffffffffffffe5fffffffffffffffffffffff -fffffffffffcfffffffffffdfffffffffffffffffffffffffffc07ffffffffffffffe808097fffffffffff03ffffffffffe0fffffe1ffff3c7fffff8feffcfff -fffffffffffffc010101fffffffffffffffffff1fffffffffffafffffffffffffffffffffff8ffffffffffe03ffffffffffffffffffffffffffc03ffffffffff -fffc028c0006fffffffffc0fffffffffffc1ffffff9ffff9c7fffffef9ffe3fffffffffd7ffffc010101ffffffffffffffffffc7ffffffffffff7fffffffff83 -fffffffffff8ffffffffff801ffffffffffffffffffffffffff843ffffffffffffc0144000001ffffffff03fffffffffffc3ffffffe7fff8cfffffff7dffe1ff -fffffff0fffffc010101ffffffffffffffffffefffffffffffffd7fffffff0007ffffffffff8ffffffffff8007fffffffffffffffffffffffff861ffffffffff -f8006bbffe8000ffffffc0ffffffffffff87ffffffd1fffc4ffffffe71fff1ffffffffe1fffffc010101ffffffffffffffffff1ffffffffffffffbffffffe015 -bffffffffff8ffffffffff0f03ffffffe03ffffffffffffffff0e0ffffffffffe017fffffffc801fffff81ffffffffffff0fffffffea7ffc1fffffff39fff83f -ffffff03fffffc010101fffffffffffffffffe7ffffffffffffffdffffff81f80fffffffadd8fffffffffe1fc1ffffffc04ffffffffffffffff0f0fffffffffe -805ffffffffff007fffe0fffffffffffff1ffffffffcfffe3fffffff39fff81ffffff01ffffffc010101fffffffffffffffff8ffffffffffffffff3ffffe07ff -07ffff0000007ffffffffe3fe0fffffc0000ffffffffffffffe1e0fffffffffc03fffffffffffe00fffc1ffffffffffffe1fffffffff3ffe7fffffff31ffff03 -ffff803ffffffc010101fffffffffffffffffbffffffffffffffffdffffe3fff87fffc00000017fffffffc3ff07ffff007a07fffffffffffffe1f07ffffffff0 -0fffffffffffffd07ff07ffffffffffffe3ffffffffedffe3fffffff9bffff80fffc05fffffffc010101ffffffffffffffffe5ffffffffffffffffeffff87fff -effff80015007c7ffffffc7ffc3fffc01ffc0fffffffffffffe3f87fffffff803fffffffffffffe80fc0fffffffffffffc7fffffffffa7fe7fffffffbdffffe0 -14200ffffffffc010101ffffffffffffffffd3fffffffffffffffff3ffe0fffff5ffe17ffff843bffffff87ffe3fff80ffff03ffffffffffffc3f07fffffc101 -fffffffffffffffe0783fffffffffffff87fffffffffe7fd7fffffff9bfffff800001ffffffffc010101ffffffffffffffffaffffffffffffffffffdffe1ffff -fbfff7fffff8fd0bfffff8fffe1ffe03ffffccffffffffffffc7f87ffffe0007ffffffffffffffff8087fffffffffffff8ffffffffffdbfe7fffffffd3fffffe -0000fffffffffc010101ffffffffffffffff5ffffffffffffffffffeffc7fffffdfffffffff8ffe4fffff8ffffbffc0ffffff53fffffffffffc3f8bffffc001f -ffffffffffffffffe01ffffffffffffff0fffffffffff5fd7fffffffcdffffffc00ffffffffffc010101fffffffffffffffebfffffffffffffffffff7f87ffff -fefffffffff8fffa0ffff8ffffdff83fffffff1fffffffffff87fcfffff8107fffffffffffffffffe03fffffffffffffe1fffffffffffafbffffffffdbffffff -fffffffffffffc010101fffffffffffffffd7fffffffffffffffffffbf9ffffffefffffffff8ffff03fff1ffffeff07ffffffec7ffffffffffc7fc7fe7e0787f -ffffffffffffffffe01fffffffffffffe3fffffffffffd757fffffffebfffffffffffffffffffc010101fffffffffffffffeffffffffffffffffffffdf1fffff -fe7ffffffff8ffffe0fff8fffff7e1ffffffffa7ffffffffff8ffe257fe0f8ffffffffffffffffffc01fffffffffffffc3fffffffffffea3fffffffff7ffffff -fffffffffffffc010101fffffffffffffffa7fffffffffffffffffffee3ffffffe7ffffffffcfffff01ff9fffff7e1ffffffffd1ffffffffff8ffe1fffc1f87f -ffffffffffffffff07e7ffffffffffffc7fffffffffffff77ffffffffffffffffffffffffffffc010101fffffffffffffff1fffffffffffffffffffffc3fffff -ff3ffffffff9fffffc0ff9fffffbe3ffffffffe81fffffffff8fff7fff87f0fffffffffffffffffe0707ffffffffffff87fffffffffffe83ffffffffffffffff -fffffffffffffc010101fffffffffffffffbfffffffffffffffffffff87ffffffe3ffffffff8ffffff03f9fffffbc7fffffffff402ffffffff0fffbfff0fffff -fffffffffffffffc1ff9ffffffffffff87ffffffffffff657ffffffffffffffffffffffffffffc010101ffffffffffffffe7fffffffffffffffffffff8ffffff -ff3ffffffff9ffffffc0f8fffffce3ffffffffff007fffffff8fffdffe0ffffffffffffffffffff87fd1ffffffffffff0fffffffffffffc2ffffffffffffffff -fffffffffffffc010101ffffffffffffffebfffffffffffffffffffff9ffffffff1ffffffff0fffffff078fffffec7ffffffffffe01fffffff1ffffffc1fffff -ffffffffffffffe0ffeeffffffffffff0fffffffffffffe5fffffffffffffffffffffffffffffc010101ffffffffffffffd7fffffffffffffffffffff2ffffff -ff3ffffffff8fffffffc18fffffe47fffffffffffe0fffffff8fffdff83fffffffffffffffffffc1fffb3fffffffffff1ffffffffffffff2ffffffffffffffff -fffffffffffffc010101ffffffffffffffcffffffffffffffffffffff9ffffffff3ffffffff9ffffffff08ffffff6fffffffffffffc7ffffff1fffedf87fffff -ffffffffffffff83fffd3ffffffffffe3ffffffffffffff5fffffffffffffffffffffffffffffc010101ffffffffffffffbffffffffffffffffffffff1ffffff -ff1ffffffff0ffffffff807fffffb7ffffffffffffffffffff1ffffff0ffffffffffffffffffff07fffe9ffffffffffc3ffffffffffffffbffffffffffffffff -fffffffffffffc010101ffffffffffffff9ffffffffffffffffffffff77fffffff3ffffffff9ffffffffc0ffffff07ffffffffffffffffffff1ffff5e0ffffff -fffffffffffffe1ffffffffffffffffc7ffffffffffffffdfffffffffffffffffffffffffffffc010101ffffffffffffff3ffffffffffffffffffffff9ffffff -fe1ffffffff0fffffffff47fffffb7ffffffffffffffffffff1ffffec3fffffffffffffffffffe3fffff4ffffffffff8ffffffffffffffffffffffffffffffff -fffffffffffffc010101ffffffffffffff5fffffffffffffffffffffe7fffffff73dbdfffff9fffffffff83fffffd7ffffffffffffffffffff1ffffe07ffffff -fffffffffffff83ffffff7fffffffff87ffffffffffffffafffffffffffffffffffffffffffffc010101fffffffffffffebffffffffffffffffffffffbffffe5 -7e3ff6bffff0fffffffffe1fffffdbffffffffffffffffffff1fffff07fffffffffffffffffff0ffffffdbfffffffff9ffffffffffffffffffffffffffffffff -fffffffffffffc010101ffffffffffffff7fffffffffffffffffffffe7ffffffff7fffebfff9fffffffffd1fffffeffffffffffffffffffffe1fffff1fffffff -ffffffffffffe1fffffff7fffffffff0ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffefffff3f -fefffff5bff0ffffffffff0fffffffffffffffffffffffffff1fffffffffffffffffffffffffc3ffffffedfffffffff1ffffffffffffffffffffffffffffffff -fffffffffffffc010101fffffffffffffd7fffffffffffffffffffffd7fff8fffd7ffffe4bf1ffffffffffc7fffffffffffffffffffffffffe3fffffffffffff -ffffffffffff87fffffffbffffffffe3fffffffffffffffefffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffeffff1ff -feffffffe5f1ffffffffffa3ffffffffffffffffffffffffff1fffffffffffffffffffffffff8ffffffffeffffffffe1ffffffffffffffffbfffffffffffffff -fffffffffffffc010101fffffffffffffd7fffffffffffffffffffffdfffe3fff9fffffffa39ffffffffffd9fffffffffffffffffffffffffe1fffffffffffff -ffffffffffff1fffffffff7fffffffe7ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffcfffc7ff -fffffffffea9ffffffffffe9ffffffffffffffffffffffffff3ffffffffffffffffffffffffe1fffffffffffffffffe3ffffffffffffffffbfffffffffffffff -fffffffffffffc010101fffffffffffffdfffffffffffffffffffffff7ff8ffff3ffffffffd1fffffffffff7fffffffffffffffffffffffffe1fffffffffffff -fffffffffffc3ffffffffd7fffffffc7ffffffffffffffffdffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff0fff -ebfffffffff1ffffffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffffc3fffffffffbfffffffc7ffffffffffffffffffffffffffffffff -fffffffffffffc010101fffffffffffffdffffffffffffffffffffffdfff8fffd7fffffffff1fffffffffffffffffffffffffffffffffffffe3fffffffffffff -fffffffffff0ffffffffffdfffffffcfffffffffffffffffcffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff17ff -e7fffffffff3ffffffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffff1ffffffffffbfffffffc7ffffffffffffffffffffffffffffffff -fffffffffffffc010101fffffffffffff9ffffffffffffffffffffffffff3fff5ffffffffff3fffffffffffffffffffffffffffffffffffffe3fffffffffffff -ffffffffffe1ffffffffffefffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffcfff9bfe -3ffffffffffbf7fffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffebffffffffffbfffffff8fffffffffffffffffefffffffffffffff -fffffffffffffc010101fffffffffffffdffffffffffffffffffffffdfff2bfc7fffffffffebfffffffffffffffffffffffffffffffffffffe3fffffffffffff -ffffffffffc7ffffffffffcfffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffcfffcca1 -fffffffffff1fffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffff87ffffffffffffffffff0fffffffffffffffffffffffffffffffff -fffffffffffffc010101fffffffffffffdfffffffffffffffffffffff7fff207fffffffffff7feffffffffffffffffffffffffffffffffffff7fffffffffffff -ffffffffff0fffffffffffe7ffffff1fffffffffffffffffebfffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffcfffffdf -ffffffffffe3ffffffffffffffffffffffffffffffffffffff3fffffffffffffffffffffff3fffffffffffffffffff9ffffffffffffffffff7ffffffffffffff -fffffffffffffc010101fffffffffffffbfffffffffffffffffffffff7fffffffffffffffff3ff7ffffffffffffffffffffffffffffffffffe1fffffffffffff -fffffffffe9fffffffffffefffffff1ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffff1ffffffffffffffffffffffefffffff -fffffffffff9ffefffffffffffffffffffffffffffffffffff3ffffffffffffffffffffffe7ffffffffffff7ffffff1fffffffffffffffffe7ffffffffffffff -fffffffffffffc010101fffffffffffffbfffffffffffffffffffffff7fffffffffffffffff3fffffffffffffffffffffffffffffffffffffe1fffffffffffff -fffffffffd7fffffffffffeffffffe3ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffebffffff -ffffffffffebffffffffffffffffffffffffffffffffffffff1ffffffffffffffffffffffafffffffffffffbffffff3ffffffffffffffffffdffffffffffffff -fffffffffffffc010101fffffffffffffdfffffffffffffffffffffff7ffeffffffffffffff5fffbffffffffffffffffffffffffffffffffff1fffffffffffff -fffffffff9fffffffffffff7fffffe1ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffbffffff -fffffffffffbffffffffffffffffffffffffffffffffffffff1ffffffffffffffffffffff3fffffffffffff5fffffe3ffffffffffffffffff7ffffffffffffff -fffffffffffffc010101fffffffffffffbfffffffffffffffffffffffdffffffffffffffffe3fffdffffffffffffffffffffffffffffffffff1fffffffffffff -ffffffffeffffffffffffffbfffffe3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffdffffff -fffffffffff3fffeffffffffffffffffffffffffffffffffff9fffffffffffffffffffffe3fffffffffffff7fffffe7ffffffffffffffffff3ffffffffffffff -fffffffffffffc010101fffffffffffffbfffffffffffffffffffffffeffdfffffffffffffe3ffffbfffffffffffffffffffffffffffffffff1fffffffffffff -ffffffffcffffffffffffff9fffffe3ffffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffff7fefff -ffffffffffe7ffffffffffffffffffffffffffffffffffffff8fffffffffffffffffffff9ffffffffffffffbfffffe7ffffffffffffffffffbffffffffffffff -fffffffffffffc010101fffffffffffff7ffffffffffffffffffffffffbfdfffffffffffffe3ffffdfffffffffffffffffffffffffffffffff9fffffffffffff -ffffffffbffffffffffffffbfffffe3ffffffffffffffffffdfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffff47bfff -ffffffffffe7ffffffffffffffffffffffffffffffffffffff0fffffffffffffffffffff1ffffffffffffffdfffffe3ffffffffffffffffffbffffffffffffff -fffffffffffffc010101fffffffffffff7ffffffffffffffffffffffffc27fffffffffffffe3ffffffffffffffffffffffffffffffffffffff8fffffffffffff -ffffffff3ffffffffffffffbfffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffffe0bfff -ffffffffffd7fffff7ffffffffffffffffffffffffffffffffcffffffffffffffffffffe7ffffffffffffffdfffffc3ffffffffffffffffffbffffffffffffff -fffffffffffffc010101fffffffffffff7fffffffffffffffffffffffff0ffffffffffffffebffffffffffffffffffffffffffffffffffffff87ffffffffffff -fffffffe7ffffffffffffff9fffffe3ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffffbfffffffffffffffffffffffffdffff -ffffffffffe7fffffbffffffffffffffffffffffffffffffffcffffffffffffffffffffc7ffffffffffffffcfffffe7ffffffffffffffffffbffffffffffffff -fffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffebffffffffffffffffffffffffffd54286ffffffc7ffffffffffff -fffffff8fffffffffffffffdfffffe3dfffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffffffffff -ffffffffffe7fffffefffffffffffffffffd0000000011b5ff87fffffffffffffffffff9fffffffffffffffdfffffc7ffffffffffffffffff5ffffffffffffff -fffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffe8000228000000136c7ffffffffffff -fffffff9fffffffffffffffcfffffe3dfffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff5ffffffffffffffffffffffffffffff -ffffffffffc7ffffffffffffffffffff4002dfdd7dbea0000007fffffffffffffffffff1fffffffffffffffdfffffe7dfffffffffffffffff9ffffffffffffff -fffffffffffffc010101fffffffffffffbfffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffe000af7fffffffffd0000fffffffffffff -fffffff1fffffffffffffffcfffffe3ffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffff -ffffffffffe7ffffff7ffffffffffc002dfffffffffffffff6bffffffffffffffffffff3fffffffffffffffeffffff3ffffffffffffffffffbffffffffffffff -fffffffffffffc010101fffffffffffffbffffffffffffffffffffffffffffffffffffffffcfffffffffffffffff5005ffffffffffffffffffffffffffffffff -ffffffe3fffffffffffffffdffffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffff -ffffffffffe7ffffffdffffffff000ffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffcffffff1ffffffffffffffffff5ffffffffffffff -fffffffffffffc010101fffffffffffffaffffffffffffffffffffffffffffffffffffffffeffffffffffffffe80177fffffffffffffffffffffffffffffffff -ffffffe7fffffffffffffffd7fffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffff -ffffffffffc7ffffffefffffe002ffffffffffffffffffffffffffffffffffffffffffc3fffffffffffffffdffffff1ffffffffffffffffff7ffffffffffffff -fffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffff002fffffffffffffffffffffffffffffffffffff -ffffffe7fffffffffffffffcffffffbffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffcffffffffffffffffffffffffffffff -ffffffffffc7fffffff7fff801ffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffdffffff0ffffffffffffffffff7ffffffffffffff -fffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003fffffffffffffffffffffffffffffffffffffff -ffffffcffffffffffffffffeffffff9fffffffffffffffffcbfffffffffffffffffffffffffffc010101ffffffffffffff7fffffffffffffffffffffffffffff -ffffffffffc7fffffffbf801ffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffff9ffffff8fffffffffffffffffb7ffffffffffffff -fffffffffffffc010101fffffffffffffeffffffffffffffffffffffffffffffffffffffffeffffffffe801fffffffffffffffffffffffffffffffffffffffff -ffffff8ffffffffffffffffdffffff8fffffffffffffffffeffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffd7fffffff001ffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffaffffffcfffffffffffffffffe7ffffffffffffff -fffffffffffffc010101ffffffffffffff7fffffffffffffffffffffffffffffffffffffffefffffff8017ffffffffffffffffffffffffffffffffffffffffff -ffffff8ffffffffffffffffdffffffc7ffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffff -ffffffffffc7fffffc00ffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffff3ffffffc7ffffffffffffffffefffffffffffffff -fffffffffffffc010101fffffffffffffeffffffffffffffffffffffffffffffffffffffff9fffffc00dffffffffffffffffffffffffffffffffffffffffffff -ffffff9ffffffffffffffffdffffffe3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffff -ffffffffffe7fffe00ffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffff3fffffff1ffffffffffffffffefffffffffffffff -fffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffcfffe007ff7fffffffffffffffffffffffffffffffffffffffffff -ffffff9ffffffffffffffffffffffff3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffdfffffffffffffffffffffffffffff -ffffffffffd7fe003fffffffffffffffffffffffffffffffffffffffffffffffffffff8fffffffffffffffe3fffffff8ffffffffffffffff3fffffffffffffff -fffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffeff003ffffffffffffffffffffffffffffffffffffffffffffffff -ffffff9ffffffffffffffffffffffff8ffffffffffffffffbffffffffffffffffffffffffffffc010101ffffffffffffffcfffffffffffffffffffffffffffff -ffffffffff8fa01fffff7fffffffffffffffffffffff1610000026060f002220574d464301000000000001000000000000000500000000200000940500009485 -0000ffffffffffffffffffffffffff9dffffffffffffffc7fffffffc7ffffffffffffffe7ffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffe001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dfffffffffffffffffffffffebfffffff -fffffffdfffffffffffffffffffffffffffffc010101ffffffffffffffd7ffffffffffffffffffffffffffffffffffffff800fffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffafffffffffffffffcfffffffff1ffffffffffffffafffffffffffffffffffffffffffffc010101ffffffffffffffefffff -fffffffffffffffffffffffffffffffffe007fffffffbfffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffff9fffffffffaf7fffff -fffffff5fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffff003ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffff8fffffffffffffff7fffffffffcffffffffffffffbfffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffff800fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffffff3fffffffffc3ffffff -ffffffe7fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffc0197ffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffe5fffffffffffffeffffffffffe8ffffffffffffdffffffffffffffffffffffffffffffc010101fffffffffffffffbffff -fffffffffffffffffffffffffffffff00fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffd7ffffffffff0ffffff -ffffff3ffffffffffffffffffffffffffffffc010101fffffffffffffff5ffffffffffffffffffffffffffffffffff807fd7ffffffffefffffffffffffffffff -ffffffffffffffffffffffffffffffebfffffffffffff8fffffffffffc3f7ffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffffffffffffffffffc03ffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffff7fffffffffffe1fffff -fffffdfffffffffffffffffffffffffffffffc010101fffffffffffffffdffffffffffffffffffffffffffffffffe017ffefffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffff9ffffffffffffebffffffffffffcfffffffffebfffffffffffffffffffffffffffffffc010101fffffffffffffffeffff -fffffffffffffffffffffffffffe80ffffd7fffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffdfffffffffffffb3fdff -fffff7fffffffffffffffffffffffffffffffc010101fffffffffffffffdfffffffffffffffffffffffffffffff803ffffcfffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffc7fffffffffffbfffffffffffffe4be7fffff2ffffffffffffffffffffffffffffffffc010101fffffffffffffffeffff -ffffffffffffffffffffffffffc01fffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3ffffffffffe7ffffffffffffffa379f -fffdfffffffffffffffffffffffffffffffffc010101ffffffffffffffff3ffffffffffffffffffffffffffffc00ffffffdfffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff1ffffffffffbfffffffffffffffd0fcfffebfffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffffffffffffff00fffffffe7fffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffaeffffffffd7ffffffffffffffffb937 -feb7fffffffffffffffffffffffffffffffffc010101ffffffffffffffffbfffffffffffffffffffffffffff807fffffffdfffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffd32fffffffbfffffffffffffffffeacbd57ffffffffffffffffffffffffffffffffffc010101ffffffffffffffff7fff -fffffffffffffffffffffffd01ffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb8cffffeeffffffffffffffffffff34 -affffffffffffffffffffffffffffffffffffc010101ffffffffffffffffdffffffffffffffffffffffffff00fffffffffcfffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffdffffffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffefff -fffffffffffffeffffffffc03ffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe57ffeaffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff5ffffffe00ffffffffffcfffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffe9ad3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffefff -fffffffffffffffffffff80bfffffffffff7fffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffef7ffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7fffffc03fffffffffffcfffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffff7ff -ffffffffffffffdffffe01ffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffbfffffffffffffffefffff007ffffffffffffebfffffffffdffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffeff -ffffffffffffffdfff803fffffffffffffc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7ffd01ffffffffffffffefffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffffff50ffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffeffffffffffffffffffc07fffffffffffffffc7fffffffffdffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffff3fc7fffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffe9fdfffffffffffffffffe7ffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffbffffffffffffffffffff7fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff7fffffffffffffffffffe3ffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffef -ffffffffffffffafffffffffffffffffffe5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffdffffffffffffffffffff3fffffffffdffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffef -ffffffffffffff77fffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5ffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffff7bfffffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5fffffffffdffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffff17fffffffffffffffffff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff3ffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffff9ffffffffffffffffffff8fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffd7fffffffffffffffffffdfffffffffbffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -bfffffffffffffaffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffefffffffffffffd7fffffffffffffffffffeffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffffbfffffffffffffffffffdfffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7fffffffffffffffffffc7fffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffffffffffffffffffffffffefffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffdffffffffffffeffffffffffffffffffffe7fffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffff3fffffffffffffffffffebffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffefffffffffffff3ffffffffffffffffffff7fffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffffffffff7ffffffffffffffffffff1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffffffdfffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffefffffffffffebffffffffffffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7ffffffffffffffffffff8fffffff5fffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffbffffffffffebffffffffffffffffffffc7ffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffefffffffffffffffffffffffffffffffff3fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffff7fffffffffe7fffffffffffffffffffff5fffffbffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffdffffffffffffffffffffffffffffffff8fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffefffffffffffffffffffffff7fffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffeffffffffffffffffffffffffffffffffeffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffbffffffffdfffffffffffffffffffffff2fff7fffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffdffffffffefffffffffffffffffffffffd3c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffec7bffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffdfffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -fffffffbffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffcffffffbfffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffff5fffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffebfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffdfff6ffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffff87efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffabfffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffe002000026060f00b605574d4643010000000000010000000000000005000000940500000000000094850000fffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01 -0101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0101014c000000640000000000000000000000e5020000fb000000000000000000 -0000e6020000fc0000002900aa0000000000000000000000803f00000000000000000000803f0000000000000000000000000000000000000000000000000000 -000000000000220000000c000000ffffffff460000001c00000010000000454d462b024000000c000000000000000e0000001400000000000000100000001400 -00000400000003010800050000000b0200000000050000000c02fc00e602030000001e0004000000070104000400000007010400652f0000410b2000cc00fc00 -e60200000000fc00e6020000000028000000e6020000fc0000000100010000000000000000000000000000000000020000000000000000000000ffffff00ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffebfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffbffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff0ffffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffd07ffffffffffcbfffe03fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe002fbfffffffc00ffff03fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffff80012efffffff0003ffe03fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00bedb8bffffe0341ffe31fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffa0003fff807fffffcffff817e0ffe21fffffffffffffffffc010101fffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff002b5c00001fffffd7ffff8fff87fe71fffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fff80bf6a6a8001ffffffaffff0fff8ffcf0fffffffffffffffffc010101fffffffffffffffffffffff4089ffffffffffffffffffffffffffffcffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff437fffffff00e0fffffe3ffc1fffe7fd78fffffffffffffffffc010101ffff -ffffffffffffffffff200040fffffffffffffffffffffffffff87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -f005ffffffff8713ffffffbffc3fffe3fefc7ffffffffffffffffc010101fffffffffffffffffffff983ffff0ffffffffffffffffffffffffffcffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0bffffffffe0ffc5fffff8ff8ffffe7fd7f3ffffffffffffffffc010101ffff -ffffffffffffffffe63ffffff5fffffffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffff1ffffffffffffffffffffffffffffffffffe -077ffffffffc3ffe87ffffc7f0fffff9feff3ffffffffffffffffc010101ffffffffffffffffffff09fffffffebffffffffffffffffffffffffcffffffffffff -ffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffffffff02ffffffffff83ffff1ffffe7f1fffffbfeff9ffffffffffffffffc010101ffff -fffffffffffffffcb7ffffffffdffffffffffffffffffffffff8fffffffffffffffffffffffffffffffffffffffe07fffffffffffffffff7ffffffffffffffc0 -fffffffffff8fffffcfffff3e1fffffdf9ff8ffffffffffffffffc010101fffffffffffffffffffe5ffffffffffffffffffffffffffffffffffcfffffffffffd -fffffffffffffffffffffffffffc07ffffffffffffffe808097fffffffffff03ffffffffffe0fffffe1ffff3c7fffff8feffcffffffffffffffffc010101ffff -fffffffffffffff1fffffffffffafffffffffffffffffffffff8ffffffffffe03ffffffffffffffffffffffffffc03fffffffffffffc028c0006fffffffffc0f -ffffffffffc1ffffff9ffff9c7fffffef9ffe3fffffffffd7ffffc010101ffffffffffffffffffc7ffffffffffff7fffffffff83fffffffffff8ffffffffff80 -1ffffffffffffffffffffffffff843ffffffffffffc0144000001ffffffff03fffffffffffc3ffffffe7fff8cfffffff7dffe1fffffffff0fffffc010101ffff -ffffffffffffffefffffffffffffd7fffffff0007ffffffffff8ffffffffff8007fffffffffffffffffffffffff861fffffffffff8006bbffe8000ffffffc0ff -ffffffffff87ffffffd1fffc4ffffffe71fff1ffffffffe1fffffc010101ffffffffffffffffff1ffffffffffffffbffffffe015bffffffffff8ffffffffff0f -03ffffffe03ffffffffffffffff0e0ffffffffffe017fffffffc801fffff81ffffffffffff0fffffffea7ffc1fffffff39fff83fffffff03fffffc010101ffff -fffffffffffffe7ffffffffffffffdffffff81f80fffffffadd8fffffffffe1fc1ffffffc04ffffffffffffffff0f0fffffffffe805ffffffffff007fffe0fff -ffffffffff1ffffffffcfffe3fffffff39fff81ffffff01ffffffc010101fffffffffffffffff8ffffffffffffffff3ffffe07ff07ffff0000007ffffffffe3f -e0fffffc0000ffffffffffffffe1e0fffffffffc03fffffffffffe00fffc1ffffffffffffe1fffffffff3ffe7fffffff31ffff03ffff803ffffffc010101ffff -fffffffffffffbffffffffffffffffdffffe3fff87fffc00000017fffffffc3ff07ffff007a07fffffffffffffe1f07ffffffff00fffffffffffffd07ff07fff -fffffffffe3ffffffffedffe3fffffff9bffff80fffc05fffffffc010101ffffffffffffffffe5ffffffffffffffffeffff87fffeffff80015007c7ffffffc7f -fc3fffc01ffc0fffffffffffffe3f87fffffff803fffffffffffffe80fc0fffffffffffffc7fffffffffa7fe7fffffffbdffffe014200ffffffffc010101ffff -ffffffffffffd3fffffffffffffffff3ffe0fffff5ffe17ffff843bffffff87ffe3fff80ffff03ffffffffffffc3f07fffffc101fffffffffffffffe0783ffff -fffffffff87fffffffffe7fd7fffffff9bfffff800001ffffffffc010101ffffffffffffffffaffffffffffffffffffdffe1fffffbfff7fffff8fd0bfffff8ff -fe1ffe03ffffccffffffffffffc7f87ffffe0007ffffffffffffffff8087fffffffffffff8ffffffffffdbfe7fffffffd3fffffe0000fffffffffc010101ffff -ffffffffffff5ffffffffffffffffffeffc7fffffdfffffffff8ffe4fffff8ffffbffc0ffffff53fffffffffffc3f8bffffc001fffffffffffffffffe01fffff -fffffffff0fffffffffff5fd7fffffffcdffffffc00ffffffffffc010101fffffffffffffffebfffffffffffffffffff7f87fffffefffffffff8fffa0ffff8ff -ffdff83fffffff1fffffffffff87fcfffff8107fffffffffffffffffe03fffffffffffffe1fffffffffffafbffffffffdbfffffffffffffffffffc010101ffff -fffffffffffd7fffffffffffffffffffbf9ffffffefffffffff8ffff03fff1ffffeff07ffffffec7ffffffffffc7fc7fe7e0787fffffffffffffffffe01fffff -ffffffffe3fffffffffffd757fffffffebfffffffffffffffffffc010101fffffffffffffffeffffffffffffffffffffdf1ffffffe7ffffffff8ffffe0fff8ff -fff7e1ffffffffa7ffffffffff8ffe257fe0f8ffffffffffffffffffc01fffffffffffffc3fffffffffffea3fffffffff7fffffffffffffffffffc010101ffff -fffffffffffa7fffffffffffffffffffee3ffffffe7ffffffffcfffff01ff9fffff7e1ffffffffd1ffffffffff8ffe1fffc1f87fffffffffffffffff07e7ffff -ffffffffc7fffffffffffff77ffffffffffffffffffffffffffffc010101fffffffffffffff1fffffffffffffffffffffc3fffffff3ffffffff9fffffc0ff9ff -fffbe3ffffffffe81fffffffff8fff7fff87f0fffffffffffffffffe0707ffffffffffff87fffffffffffe83fffffffffffffffffffffffffffffc010101ffff -fffffffffffbfffffffffffffffffffff87ffffffe3ffffffff8ffffff03f9fffffbc7fffffffff402ffffffff0fffbfff0ffffffffffffffffffffc1ff9ffff -ffffffff87ffffffffffff657ffffffffffffffffffffffffffffc010101ffffffffffffffe7fffffffffffffffffffff8ffffffff3ffffffff9ffffffc0f8ff -fffce3ffffffffff007fffffff8fffdffe0ffffffffffffffffffff87fd1ffffffffffff0fffffffffffffc2fffffffffffffffffffffffffffffc010101ffff -ffffffffffebfffffffffffffffffffff9ffffffff1ffffffff0fffffff078fffffec7ffffffffffe01fffffff1ffffffc1fffffffffffffffffffe0ffeeffff -ffffffff0fffffffffffffe5fffffffffffffffffffffffffffffc010101ffffffffffffffd7fffffffffffffffffffff2ffffffff3ffffffff8fffffffc18ff -fffe47fffffffffffe0fffffff8fffdff83fffffffffffffffffffc1fffb3fffffffffff1ffffffffffffff2fffffffffffffffffffffffffffffc010101ffff -ffffffffffcffffffffffffffffffffff9ffffffff3ffffffff9ffffffff08ffffff6fffffffffffffc7ffffff1fffedf87fffffffffffffffffff83fffd3fff -fffffffe3ffffffffffffff5fffffffffffffffffffffffffffffc010101ffffffffffffffbffffffffffffffffffffff1ffffffff1ffffffff0ffffffff807f -ffffb7ffffffffffffffffffff1ffffff0ffffffffffffffffffff07fffe9ffffffffffc3ffffffffffffffbfffffffffffffffffffffffffffffc010101ffff -ffffffffff9ffffffffffffffffffffff77fffffff3ffffffff9ffffffffc0ffffff07ffffffffffffffffffff1ffff5e0fffffffffffffffffffe1fffffffff -fffffffc7ffffffffffffffdfffffffffffffffffffffffffffffc010101ffffffffffffff3ffffffffffffffffffffff9fffffffe1ffffffff0fffffffff47f -ffffb7ffffffffffffffffffff1ffffec3fffffffffffffffffffe3fffff4ffffffffff8fffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffff5fffffffffffffffffffffe7fffffff73dbdfffff9fffffffff83fffffd7ffffffffffffffffffff1ffffe07fffffffffffffffffff83ffffff7ff -fffffff87ffffffffffffffafffffffffffffffffffffffffffffc010101fffffffffffffebffffffffffffffffffffffbffffe57e3ff6bffff0fffffffffe1f -ffffdbffffffffffffffffffff1fffff07fffffffffffffffffff0ffffffdbfffffffff9fffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffff7fffffffffffffffffffffe7ffffffff7fffebfff9fffffffffd1fffffeffffffffffffffffffffe1fffff1fffffffffffffffffffe1fffffff7ff -fffffff0ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffefffff3ffefffff5bff0ffffffffff0f -ffffffffffffffffffffffffff1fffffffffffffffffffffffffc3ffffffedfffffffff1fffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffd7fffffffffffffffffffffd7fff8fffd7ffffe4bf1ffffffffffc7fffffffffffffffffffffffffe3fffffffffffffffffffffffff87fffffffbff -ffffffe3fffffffffffffffefffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffeffff1fffeffffffe5f1ffffffffffa3 -ffffffffffffffffffffffffff1fffffffffffffffffffffffff8ffffffffeffffffffe1ffffffffffffffffbffffffffffffffffffffffffffffc010101ffff -fffffffffd7fffffffffffffffffffffdfffe3fff9fffffffa39ffffffffffd9fffffffffffffffffffffffffe1fffffffffffffffffffffffff1fffffffff7f -ffffffe7ffffffffffffffff7ffffffffffffffffffffffffffffc010101fffffffffffffeffffffffffffffffffffffcfffc7fffffffffffea9ffffffffffe9 -ffffffffffffffffffffffffff3ffffffffffffffffffffffffe1fffffffffffffffffe3ffffffffffffffffbffffffffffffffffffffffffffffc010101ffff -fffffffffdfffffffffffffffffffffff7ff8ffff3ffffffffd1fffffffffff7fffffffffffffffffffffffffe1ffffffffffffffffffffffffc3ffffffffd7f -ffffffc7ffffffffffffffffdffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff0fffebfffffffff1ffffffffffff -ffffffffffffffffffffffffff3ffffffffffffffffffffffffc3fffffffffbfffffffc7fffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffdffffffffffffffffffffffdfff8fffd7fffffffff1fffffffffffffffffffffffffffffffffffffe3ffffffffffffffffffffffff0ffffffffffdf -ffffffcfffffffffffffffffcffffffffffffffffffffffffffffc010101fffffffffffffaffffffffffffffffffffffcfff17ffe7fffffffff3ffffffffffff -ffffffffffffffffffffffffff3ffffffffffffffffffffffff1ffffffffffbfffffffc7fffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffff9ffffffffffffffffffffffffff3fff5ffffffffff3fffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffe1ffffffffffef -ffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffcfff9bfe3ffffffffffbf7ffffffffff -fffffffffffffffffffffffffe3fffffffffffffffffffffffebffffffffffbfffffff8fffffffffffffffffeffffffffffffffffffffffffffffc010101ffff -fffffffffdffffffffffffffffffffffdfff2bfc7fffffffffebfffffffffffffffffffffffffffffffffffffe3fffffffffffffffffffffffc7ffffffffffcf -ffffff8fffffffffffffffffd7fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffcfffcca1fffffffffff1ffffffffffff -fffffffffffffffffffffffffe3fffffffffffffffffffffff87ffffffffffffffffff0ffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffdfffffffffffffffffffffff7fff207fffffffffff7feffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff0fffffffffffe7 -ffffff1fffffffffffffffffebfffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffcfffffdfffffffffffe3ffffffffffff -ffffffffffffffffffffffffff3fffffffffffffffffffffff3fffffffffffffffffff9ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff -fffffffffbfffffffffffffffffffffff7fffffffffffffffff3ff7ffffffffffffffffffffffffffffffffffe1ffffffffffffffffffffffe9fffffffffffef -ffffff1ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffff1ffffffffffffffffffffffeffffffffffffffffff9ffefffffffff -ffffffffffffffffffffffffff3ffffffffffffffffffffffe7ffffffffffff7ffffff1fffffffffffffffffe7fffffffffffffffffffffffffffc010101ffff -fffffffffbfffffffffffffffffffffff7fffffffffffffffff3fffffffffffffffffffffffffffffffffffffe1ffffffffffffffffffffffd7fffffffffffef -fffffe3ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7ffffffffffffffffffffffebffffffffffffffffebffffffffffff -ffffffffffffffffffffffffff1ffffffffffffffffffffffafffffffffffffbffffff3ffffffffffffffffffdfffffffffffffffffffffffffffc010101ffff -fffffffffdfffffffffffffffffffffff7ffeffffffffffffff5fffbffffffffffffffffffffffffffffffffff1ffffffffffffffffffffff9fffffffffffff7 -fffffe1ffffffffffffffffff3fffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffbfffffffffffffffffbffffffffffff -ffffffffffffffffffffffffff1ffffffffffffffffffffff3fffffffffffff5fffffe3ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff -fffffffffbfffffffffffffffffffffffdffffffffffffffffe3fffdffffffffffffffffffffffffffffffffff1fffffffffffffffffffffeffffffffffffffb -fffffe3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff7fffffffffffffffffffffffdfffffffffffffffff3fffeffffffff -ffffffffffffffffffffffffff9fffffffffffffffffffffe3fffffffffffff7fffffe7ffffffffffffffffff3fffffffffffffffffffffffffffc010101ffff -fffffffffbfffffffffffffffffffffffeffdfffffffffffffe3ffffbfffffffffffffffffffffffffffffffff1fffffffffffffffffffffcffffffffffffff9 -fffffe3ffffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffff7fefffffffffffffe7ffffffffffff -ffffffffffffffffffffffffff8fffffffffffffffffffff9ffffffffffffffbfffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff -fffffffff7ffffffffffffffffffffffffbfdfffffffffffffe3ffffdfffffffffffffffffffffffffffffffff9fffffffffffffffffffffbffffffffffffffb -fffffe3ffffffffffffffffffdfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffff47bfffffffffffffe7ffffffffffff -ffffffffffffffffffffffffff0fffffffffffffffffffff1ffffffffffffffdfffffe3ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff -fffffffff7ffffffffffffffffffffffffc27fffffffffffffe3ffffffffffffffffffffffffffffffffffffff8fffffffffffffffffffff3ffffffffffffffb -fffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffbffffffffffffffffffffffffe0bfffffffffffffd7fffff7ffffff -ffffffffffffffffffffffffffcffffffffffffffffffffe7ffffffffffffffdfffffc3ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff -fffffffff7fffffffffffffffffffffffff0ffffffffffffffebffffffffffffffffffffffffffffffffffffff87fffffffffffffffffffe7ffffffffffffff9 -fffffe3ffffffffffffffffff5fffffffffffffffffffffffffffc010101fffffffffffffbfffffffffffffffffffffffffdffffffffffffffe7fffffbffffff -ffffffffffffffffffffffffffcffffffffffffffffffffc7ffffffffffffffcfffffe7ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff -fffffffffdffffffffffffffffffffffffffffffffffffffffebffffffffffffffffffffffffffd54286ffffffc7fffffffffffffffffff8fffffffffffffffd -fffffe3dfffffffffffffffff9fffffffffffffffffffffffffffc010101fffffffffffff3ffffffffffffffffffffffffffffffffffffffffe7fffffeffffff -fffffffffffd0000000011b5ff87fffffffffffffffffff9fffffffffffffffdfffffc7ffffffffffffffffff5fffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffe8000228000000136c7fffffffffffffffffff9fffffffffffffffc -fffffe3dfffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffff5ffffffffffffffffffffffffffffffffffffffffc7ffffffffffff -ffffffff4002dfdd7dbea0000007fffffffffffffffffff1fffffffffffffffdfffffe7dfffffffffffffffff9fffffffffffffffffffffffffffc010101ffff -fffffffffbfffffffffffffffffffffffffffffffffffffffffbffffffffffffffffffe000af7fffffffffd0000ffffffffffffffffffff1fffffffffffffffc -fffffe3ffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffe7ffffff7fffff -fffffc002dfffffffffffffff6bffffffffffffffffffff3fffffffffffffffeffffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101ffff -fffffffffbffffffffffffffffffffffffffffffffffffffffcfffffffffffffffff5005ffffffffffffffffffffffffffffffffffffffe3fffffffffffffffd -ffffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffe7ffffffdfffff -fff000ffffffffffffffffffffffffffffffffffffffffe3fffffffffffffffcffffff1ffffffffffffffffff5fffffffffffffffffffffffffffc010101ffff -fffffffffaffffffffffffffffffffffffffffffffffffffffeffffffffffffffe80177fffffffffffffffffffffffffffffffffffffffe7fffffffffffffffd -7fffff3ffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffdffffffffffffffffffffffffffffffffffffffffc7ffffffefffff -e002ffffffffffffffffffffffffffffffffffffffffffc3fffffffffffffffdffffff1ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffff002fffffffffffffffffffffffffffffffffffffffffffe7fffffffffffffffc -ffffffbffffffffffffffffffbfffffffffffffffffffffffffffc010101fffffffffffffcffffffffffffffffffffffffffffffffffffffffc7fffffff7fff8 -01ffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffffdffffff0ffffffffffffffffff7fffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003fffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffe -ffffff9fffffffffffffffffcbfffffffffffffffffffffffffffc010101ffffffffffffff7fffffffffffffffffffffffffffffffffffffffc7fffffffbf801 -ffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffffff9ffffff8fffffffffffffffffb7fffffffffffffffffffffffffffc010101ffff -fffffffffeffffffffffffffffffffffffffffffffffffffffeffffffffe801fffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffd -ffffff8fffffffffffffffffeffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffd7fffffff001ff -ffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffffaffffffcfffffffffffffffffe7fffffffffffffffffffffffffffc010101ffff -ffffffffff7fffffffffffffffffffffffffffffffffffffffefffffff8017ffffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffffd -ffffffc7ffffffffffffffffd7fffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffc7fffffc00ffff -ffffffffffffffffffffffffffffffffffffffffffffffcffffffffffffffff3ffffffc7ffffffffffffffffeffffffffffffffffffffffffffffc010101ffff -fffffffffeffffffffffffffffffffffffffffffffffffffff9fffffc00dffffffffffffffffffffffffffffffffffffffffffffffffff9ffffffffffffffffd -ffffffe3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffbfffffffffffffffffffffffffffffffffffffffe7fffe00ffffff -ffffffffffffffffffffffffffffffffffffffffffffff8ffffffffffffffff3fffffff1ffffffffffffffffeffffffffffffffffffffffffffffc010101ffff -ffffffffffbfffffffffffffffffffffffffffffffffffffffcfffe007ff7fffffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff -fffffff3ffffffffffffffff9ffffffffffffffffffffffffffffc010101ffffffffffffffdfffffffffffffffffffffffffffffffffffffffd7fe003fffffff -ffffffffffffffffffffffffffffffffffffffffffffff8fffffffffffffffe3fffffff8ffffffffffffffff3ffffffffffffffffffffffffffffc010101ffff -ffffffffffbfffffffffffffffffffffffffffffffffffffffeff003ffffffffffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff -fffffff8ffffffffffffffffbffffffffffffffffffffffffffffc010101ffffffffffffffcfffffffffffffffffffffffffffffffffffffff8fa01fffff7fff -ffffffffffffffffffffffffffffffffffffffffffffff9dffffffffffffffc7fffffffc7ffffffffffffffe7ffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffe001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8dffffffffffffffff -fffffffebffffffffffffffdfffffffffffffffffffffffffffffc010101ffffffffffffffd7ffffffffffffffffffffffffffffffffffffff800fffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffafffffffffffffffcfffffffff1ffffffffffffffafffffffffffffffffffffffffffffc010101ffff -ffffffffffeffffffffffffffffffffffffffffffffffffffe007fffffffbfffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffff9f -ffffffffaf7ffffffffffff5fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffff003ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff8fffffffffffffff7fffffffffcffffffffffffffbfffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffff800fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffffff3f -ffffffffc3ffffffffffffe7fffffffffffffffffffffffffffffc010101fffffffffffffff7fffffffffffffffffffffffffffffffffffc0197ffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffe5fffffffffffffeffffffffffe8ffffffffffffdffffffffffffffffffffffffffffffc010101ffff -fffffffffffbfffffffffffffffffffffffffffffffffff00fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffd7f -fffffffff0ffffffffffff3ffffffffffffffffffffffffffffffc010101fffffffffffffff5ffffffffffffffffffffffffffffffffff807fd7ffffffffefff -ffffffffffffffffffffffffffffffffffffffffffffffebfffffffffffff8fffffffffffc3f7ffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffc03ffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffff7ff -fffffffffe1ffffffffffdfffffffffffffffffffffffffffffffc010101fffffffffffffffdffffffffffffffffffffffffffffffffe017ffefffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffff9ffffffffffffebffffffffffffcfffffffffebfffffffffffffffffffffffffffffffc010101ffff -fffffffffffefffffffffffffffffffffffffffffffe80ffffd7fffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffdfff -ffffffffffb3fdfffffff7fffffffffffffffffffffffffffffffc010101fffffffffffffffdfffffffffffffffffffffffffffffff803ffffcfffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffc7fffffffffffbfffffffffffffe4be7fffff2ffffffffffffffffffffffffffffffffc010101ffff -fffffffffffeffffffffffffffffffffffffffffffc01fffffe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3ffffffffffe7fff -fffffffffffa379ffffdfffffffffffffffffffffffffffffffffc010101ffffffffffffffff3ffffffffffffffffffffffffffffc00ffffffdfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffff1ffffffffffbfffffffffffffffd0fcfffebfffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffff00fffffffe7fffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffaeffffffffd7ffff -ffffffffffffb937feb7fffffffffffffffffffffffffffffffffc010101ffffffffffffffffbfffffffffffffffffffffffffff807fffffffdfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffd32fffffffbfffffffffffffffffeacbd57ffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffff7ffffffffffffffffffffffffffd01ffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb8cffffeeffffff -ffffffffffffff34affffffffffffffffffffffffffffffffffffc010101ffffffffffffffffdffffffffffffffffffffffffff00fffffffffcfffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffdffffffb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffeffffffffffffffffeffffffffc03ffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe57ffeaffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff5ffffffe00ffffffffffcfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffe9ad3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffeffffffffffffffffffffffff80bfffffffffff7fffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffef7ffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7fffffc03fffffffffffcfffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffff7ffffffffffffffffdffffe01ffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffbfffffffffffffffefffff007ffffffffffffebfffffffffdff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffeffffffffffffffffdfff803fffffffffffffc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffd7ffd01ffffffffffffffefffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffff50ffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffeffffffffffffffffffc07fffffffffffffffc7fffffffffdff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffff3fc7fffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffe9fdfffffffffffffffffe7ffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffbffffffffffffffffffff7fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff7fffffffffffffffffffe3ffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffefffffffffffffffafffffffffffffffffffe5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffdffffffffffffffffffff3fffffffffdff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffefffffffffffffff77fffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5ffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffff7bfffffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff5fffffffffdff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffff17fffffffffffffffffff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffff8ffffffffffffffffffff3ffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffff9ffffffffffffffffffff8fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffd7fffffffffffffffffffdfffffffffbff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffbfffffffffffffaffffffffffffffffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffefffffffffffffd7fffffffffffffffffffeffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffbfffffffffffffffffffdfffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7fffffffffffffffffffc7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffffffffffffffffffffffffefffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffdffffffffffffeffffffffffffffffffffe7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffff3fffffffffffffffffffebffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffefffffffffffff3ffffffffffffffffffff7fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffffffffff7ffffffffffffffffffff1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffffffdfff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffefffffffffffebffffffffffffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffffff7ffffffffffffffffffff8fffffff5fff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffbffffffffffebffffffffffffffffffffc7ffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffefffffffffffffffffffffffffffffffff3fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffff7fffffffffe7fffffffffffffffffffff5fffffbffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffdffffffffffffffffffffffffffffffff8fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffefffffffffffffffffffffff7fffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffeffffffffffffffffffffffffffffffffeffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffbffffffffdfffffffffffffffffffffff2fff7fffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffdffffffffefffffffffffffffffffffffd3c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffec7bffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffdfffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffefffffffefffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -fffffffffffffffffffffffbffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffcffffffbfffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffff5fffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffebfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffdfff6ffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffff87efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101fffffffffffffffffffffffffffffffabfffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffc010101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0101010c00000040092900aa00000000000000fc00e60200000000040000002701ffff030000000000}}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\f37\fs22\insrsid10447979\charrsid10447979 -\par \hich\af37\dbch\af13\loch\f37 Colin Miller -\par \hich\af37\dbch\af13\loch\f37 Product Unit Manager -\par \hich\af37\dbch\af13\loch\f37 Micros\hich\af37\dbch\af13\loch\f37 oft .NET Micro Framework -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10447979 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid16668801\charrsid10447979 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb -44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a -6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c -3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256 -5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276 -b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8 -c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e -51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95 -b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff -6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6 -9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239 -b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449 -59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8 -2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468 -656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4 -350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624 -52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141 -73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000 -0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000 -000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019 -0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000 -000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027 -00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6; -\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4; -\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; -\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; -\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000d0e5 -4b32475ccc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/REDIST_CRYPTO.TXT b/REDIST_CRYPTO.TXT deleted file mode 100644 index 7123484a1..000000000 --- a/REDIST_CRYPTO.TXT +++ /dev/null @@ -1,83 +0,0 @@ -The following list is a list of files available with the Microsoft .NET Micro Framework 4.3 Software Development Kit for redistribution under the .NET Micro Framework 4.3 SDK license. - -As of the 4.0 version and subsequent versions, the .NET Micro Framework has an Apache 2.0 license and there is no limitation to redistributing binaries, although the RTIP TCP/IP stack from EBSnet Inc. and the Crypto Libraries are subject to special conditions. Please refer to the specific licenses for details. - -_____________________________________________________________ - -Micro Framework library files - -Subject to the license terms for the software, you may redistribute the .PE files (unmodified) listed below: - -MFDpwsClient.pe -MFDpwsDevice.pe -MFDpwsExtensions.pe -MFWsStack.pe -Microsoft.SPOT.Graphics.pe -Microsoft.SPOT.Hardware.pe -Microsoft.SPOT.Hardware.PWM.pe -Microsoft.SPOT.Hardware.SerialPort.pe -Microsoft.SPOT.Hardware.Usb.pe -Microsoft.SPOT.Hardware.OneWire.pe -Microsoft.SPOT.Ink.pe -Microsoft.SPOT.InteropSample.pe -Microsoft.SPOT.IO.pe -Microsoft.SPOT.Native.pe -Microsoft.SPOT.Net.pe -Microsoft.SPOT.Net.Security.pe -Microsoft.SPOT.RPC.pe -Microsoft.SPOT.Time.pe -Microsoft.SPOT.TinyCore.pe -Microsoft.SPOT.Touch.pe -Microsoft.SPOT.Wireless.IEEE_802_15_4.pe -Microsoft.SPOT.Wireless.IEEE_802_15_4.Mac.pe -Microsoft.SPOT.Wireless.IEEE_802_15_4.Phy.CC2420.pe -Microsoft.SPOT.Wireless.IEEE_802_15_4.Phy.pe -Microsoft.VisualBasic.pe -MFUpdate.pe -mscorlib.pe -mscorlib.resources.pe -System.Http.pe -System.Ftp.pe -System.IO.pe -System.Net.Security.pe -System.pe -System.Text.RegularExpressions.pe -System.Xml.pe -System.Xml.Legacy.pe - -_____________________________________________________________ - -Micro Framework font files - -Subject to the license terms for the software, you may redistribute the .tinyfnt files (unmodified) listed below: - -Nina.tinyfnt - -Small.tinyfnt - -_____________________________________________________________ - -Micro Framework MFDeploy files - -Subject to the license terms for the software, you may redistribute the files (unmodified) listed below: - -Microsoft.SPOT.Debugger.dll -MFDeploy.chm -MFDeploy.exe -MFDeploy.exe.config -MFDeployEngine.dll - - -_____________________________________________________________ - -Micro Framework emulator files - - -Subject to the license terms for the software, you may redistribute the .DLL files (unmodified) listed below: - -Microsoft.SPOT.CLR.dll -Microsoft.SPOT.Debugger.CorDebug.dll -Microsoft.SPOT.Debugger.dll -Microsoft.SPOT.Emulator.dll -Microsoft.SPOT.Emulator.Interface.dll -Microsoft.SPOT.Tasks.dll \ No newline at end of file diff --git a/ReleaseNotesCrypto.txt b/ReleaseNotesCrypto.txt deleted file mode 100644 index 6bcf1f496..000000000 --- a/ReleaseNotesCrypto.txt +++ /dev/null @@ -1,96 +0,0 @@ -=============================================================================== -=============================================================================== -Release Notes for the Microsoft .NET Micro Framework Porting Kit Version 4.3 - -This document details the system requirements, migration information, and -known issues in the Porting Kit. -=============================================================================== -=============================================================================== - - -=============================================================================== -System Requirements -=============================================================================== -Microsoft Windows XP, Vista, Windows 7 or Windows 8 - -2 GB of free hard-disk space - -Either Visual Studio 2012 (Express edition or greater) or both .NET -Framework 3.5 and Windows SDK for Windows (downloadable from microsoft.com). - -Compatible build tools for your processor. The following toolsets have been -tested by Microsoft. -* ARM RealView 3.x,4.x -* Keil MDK 3.x -* GCC 4.2.1 for ARM -* VisualDSP++ 5.0 for Blackfin - - -NOTE: The .NET Micro Framework SDK Version 4.3 does not support side-by-side -installation with any other previous version of the same product. Please -uninstall any previous versions before proceeding. Choose the appropriate -target framework from the Application tab of your project properties to -address legacy applications. - - -=============================================================================== -Migrating from the V3.0 porting kit to the V4.0 porting kit and later -=============================================================================== -If you are upgrading your HAL from version 3.0 to 4.3, you should be aware of -the following differences: - -1) Block Storage API: The block storage API has changed substantially. - -2) Time API: The Time API at the HAL level has a changed naming convention. - The functions to be implemented are now prefixed with 'HAL_Time_' and - 'CPU_', and are located in the Time_decl.h header. - -3) The SPI and LCD APIs have undergone marginal changes. - -For information about these topics, refer to the Porting Kit documentation. - - -=============================================================================== -Migrating from the V4.0 porting kit to the V4.3 porting kit -=============================================================================== -Please refer to the Porting Kit Documentation - - -=============================================================================== -Known issues -=============================================================================== - -Interop: -Parameter names for all marshaled parameters in native code are called -param0, param1, param2, etc… instead of the identifier name used in the managed -code. This is due to how the code is generated from the .PE file after the -symbolic parameter names have already been stripped off. -When using the SDK through Visual Studio, interop stub generation settings and -checksums are stored in the .csproj.user file. If you are using multiple -development machines or a version control system in your development, you -should share the .csproj.user file along with your source files. - -Side-by-Side installation with previous versions: -Side-by-side installation and functionality are currently untested and -unsupported. - - - -=============================================================================== -USB device with USB debugging: - -If you are building an image with the debugger set to communicate over USB, the -USB_ALLOW_CONFIGURATION_OVERRIDE switch lets you control whether the C# -developer can override the USB configuration. - -By default, when the debugger is set to USB, changes to the USB configuration -(through MFDeploy) are ignored. This prevents accidental overwriting of USB -configuration settings. If you want to enable the user to modify the USB -configuration using MFDeploy, define USB_ALLOW_CONFIGURATION_OVERRIDE in your -platform_selector.h file. - -=============================================================================== -MDK Support: - -When building with ARM Keil MDK, be sure to properly set the MDK_DEVICE_TYPE -property. From 1ef482db129de18c20f16fc2a9ad7e3077941d42 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 16 Feb 2016 18:54:02 +0000 Subject: [PATCH 004/144] update with crypto lib licenses and other txt --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index a3b2312da..a15d34c63 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,8 @@ Listings/ *.axfdump /crypto/lib +Firmware License (Crypto).rtf +License (Crypto).rtf +PKCryptoWelcome.rtf +REDIST_CRYPTO.TXT +ReleaseNotesCrypto.txt From 5517cae699f82a66268f3c0e7553aa3dbfd1e329 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 17 Feb 2016 23:33:52 +0000 Subject: [PATCH 005/144] Add extension to image files generated with GCC. (this makes them ready to be uploaded with ST-Link app, DFU manager or similar) --- tools/Targets/Microsoft.Spot.system.gcc.targets | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index 270c6375d..6810d54a7 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -279,21 +279,21 @@ - - - + + + - - - + + + - + From e4aaaff4590ad2a147abe15a8d321a2124853044 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 23 Feb 2016 18:04:57 +0000 Subject: [PATCH 006/144] Revert changes in adding extension to images built with GCC --- tools/Targets/Microsoft.Spot.system.gcc.targets | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index 6810d54a7..270c6375d 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -279,21 +279,21 @@ - - - + + + - - - + + + - + From feaf5ad8eae4274a4ed2b097a531128a6a5c6314 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 23 Feb 2016 19:08:30 +0000 Subject: [PATCH 007/144] Tweak gcc targets for GCC 5-2015-q4-major - replace gcc with g++ fro CPP files - add extra information to debug flavors and axfdump file - add debug flavored configurations for arch (linked file) --- .../Targets/Microsoft.Spot.system.gcc.targets | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index 270c6375d..3b4265ee1 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -15,8 +15,8 @@ "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" - "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" - "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" + "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-g++.exe" + "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-g++.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-as.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-g++.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-ar.exe" @@ -46,13 +46,19 @@ -fpic - $(CC_CPP_COMMON_FLAGS) -mabi=aapcs -ffunction-sections -fomit-frame-pointer -mlong-calls -fdollars-in-identifiers -fshort-wchar -fno-exceptions -funsigned-char -mstructure-size-boundary=8 + $(CC_CPP_COMMON_FLAGS) -mabi=aapcs -ffunction-sections -fdata-sections -fomit-frame-pointer -mlong-calls -fdollars-in-identifiers -fshort-wchar -fno-exceptions -funsigned-char -mstructure-size-boundary=8 $(CC_CPP_TARGETTYPE_FLAGS) -O3 - $(CC_CPP_TARGETTYPE_FLAGS) -O0 -femit-class-debug-always + $(CC_CPP_TARGETTYPE_FLAGS) -Og -femit-class-debug-always -g3 -ggdb $(CC_CPP_TARGETTYPE_FLAGS) -O0 $(CC_CPP_TARGETTYPE_FLAGS) -Os $(CC_FLAGS)-xc + + -O3 + -Og -femit-class-debug-always -g3 -ggdb + -O0 + -Os + - $(CPP_FLAGS)-xc++ -w -fcheck-new + $(CPP_FLAGS)-xc++ -w -fcheck-new -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -mfloat-abi=hard -mfpu=fpv4-sp-d16 - -mfloat-abi=soft + -mfloat-abi=softfp -mfpu=fpv4-sp-d16 $(AS_CC_CPP_COMMON_FLAGS) $(FLOATING_POINT_FLAG) $(AS_CC_CPP_COMMON_FLAGS) $(ARCH_TYPE_FLAGS) @@ -126,7 +132,8 @@ $(CC_CPP_COMMON_FLAGS) -DHAL_REDUCESIZE $(CC_CPP_COMMON_FLAGS) -DHAL_TIMEWARP $(CC_CPP_COMMON_FLAGS) -DARM_PROFILE_ACTIVE - $(CC_CPP_COMMON_FLAGS) -DTINYCLR_ENABLE_SOURCELEVELDEBUGGING + $(CC_CPP_COMMON_FLAGS) -DTINYCLR_ENABLE_SOURCELEVELDEBUGGING + $(CC_CPP_COMMON_FLAGS) -DTINYCLR_PROFILE_NEW -DTINYCLR_PROFILE_NEW_CALLS -DTINYCLR_PROFILE_NEW_ALLOCATIONS -DTINYCLR_PROFILE_HANDLER -DPROFILE_BUILD $(CC_CPP_COMMON_FLAGS) -DFIQ_SAMPLING_PROFILER $(CC_CPP_COMMON_FLAGS) -DFIQ_LATENCY_PROFILER $(CC_CPP_COMMON_FLAGS) -DCOMPILE_ARM @@ -168,6 +175,7 @@ $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Hardware $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Graphics $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Net + $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Net_Security $(CC_CPP_INCS) -I"$(ARMINC)" $(CC_CPP_INCS) @(IncludePaths->'-I$(CLRROOT)\%(relativedir)%(filename)',' ') $(CC_CPP_INCS) @(DirectIncludePaths->'-I%(FullPath)',' ') @@ -211,10 +219,10 @@ - -lstdc++ -lsupc++ -lm -lgcc -lc -lgcc -lc + -lstdc++ -lsupc++ -lm -lgcc -lc - -specs="$(GNU_LIBGCC_DIR)\nano.specs" + -specs="$(GNU_LIBGCC_DIR)\nano.specs" -specs="$(GNU_LIBGCC_DIR)\nosys.specs" @@ -271,9 +279,9 @@ (platform independent). Thus the linker looks in the current working directory and finds the specified library without needing to list the full path for each one. --> - + - + From 75456794fbf706cd14798a039e0d36b2c5f55f00 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 23 Feb 2016 19:11:47 +0000 Subject: [PATCH 008/144] Revert "Tweak gcc targets for GCC 5-2015-q4-major" This reverts commit feaf5ad8eae4274a4ed2b097a531128a6a5c6314. --- .../Targets/Microsoft.Spot.system.gcc.targets | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index 3b4265ee1..270c6375d 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -15,8 +15,8 @@ "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" - "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-g++.exe" - "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-g++.exe" + "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" + "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-gcc.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-as.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-g++.exe" "$(GNU_TOOLS_BIN)\$(GNU_TARGET)-ar.exe" @@ -46,19 +46,13 @@ -fpic - $(CC_CPP_COMMON_FLAGS) -mabi=aapcs -ffunction-sections -fdata-sections -fomit-frame-pointer -mlong-calls -fdollars-in-identifiers -fshort-wchar -fno-exceptions -funsigned-char -mstructure-size-boundary=8 + $(CC_CPP_COMMON_FLAGS) -mabi=aapcs -ffunction-sections -fomit-frame-pointer -mlong-calls -fdollars-in-identifiers -fshort-wchar -fno-exceptions -funsigned-char -mstructure-size-boundary=8 $(CC_CPP_TARGETTYPE_FLAGS) -O3 - $(CC_CPP_TARGETTYPE_FLAGS) -Og -femit-class-debug-always -g3 -ggdb + $(CC_CPP_TARGETTYPE_FLAGS) -O0 -femit-class-debug-always $(CC_CPP_TARGETTYPE_FLAGS) -O0 $(CC_CPP_TARGETTYPE_FLAGS) -Os $(CC_FLAGS)-xc - - -O3 - -Og -femit-class-debug-always -g3 -ggdb - -O0 - -Os - - $(CPP_FLAGS)-xc++ -w -fcheck-new -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics + $(CPP_FLAGS)-xc++ -w -fcheck-new -mfloat-abi=hard -mfpu=fpv4-sp-d16 - -mfloat-abi=softfp -mfpu=fpv4-sp-d16 + -mfloat-abi=soft $(AS_CC_CPP_COMMON_FLAGS) $(FLOATING_POINT_FLAG) $(AS_CC_CPP_COMMON_FLAGS) $(ARCH_TYPE_FLAGS) @@ -132,8 +126,7 @@ $(CC_CPP_COMMON_FLAGS) -DHAL_REDUCESIZE $(CC_CPP_COMMON_FLAGS) -DHAL_TIMEWARP $(CC_CPP_COMMON_FLAGS) -DARM_PROFILE_ACTIVE - $(CC_CPP_COMMON_FLAGS) -DTINYCLR_ENABLE_SOURCELEVELDEBUGGING - $(CC_CPP_COMMON_FLAGS) -DTINYCLR_PROFILE_NEW -DTINYCLR_PROFILE_NEW_CALLS -DTINYCLR_PROFILE_NEW_ALLOCATIONS -DTINYCLR_PROFILE_HANDLER -DPROFILE_BUILD + $(CC_CPP_COMMON_FLAGS) -DTINYCLR_ENABLE_SOURCELEVELDEBUGGING $(CC_CPP_COMMON_FLAGS) -DFIQ_SAMPLING_PROFILER $(CC_CPP_COMMON_FLAGS) -DFIQ_LATENCY_PROFILER $(CC_CPP_COMMON_FLAGS) -DCOMPILE_ARM @@ -175,7 +168,6 @@ $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Hardware $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Graphics $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Net - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Net_Security $(CC_CPP_INCS) -I"$(ARMINC)" $(CC_CPP_INCS) @(IncludePaths->'-I$(CLRROOT)\%(relativedir)%(filename)',' ') $(CC_CPP_INCS) @(DirectIncludePaths->'-I%(FullPath)',' ') @@ -219,10 +211,10 @@ - -lstdc++ -lsupc++ -lm -lgcc -lc + -lstdc++ -lsupc++ -lm -lgcc -lc -lgcc -lc - -specs="$(GNU_LIBGCC_DIR)\nano.specs" -specs="$(GNU_LIBGCC_DIR)\nosys.specs" + -specs="$(GNU_LIBGCC_DIR)\nano.specs" @@ -279,9 +271,9 @@ (platform independent). Thus the linker looks in the current working directory and finds the specified library without needing to list the full path for each one. --> - + - + From aa6974a4987d7d8f084d2384e186de8b972d9e5d Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 1 Mar 2016 09:20:09 +0000 Subject: [PATCH 009/144] Add folder to work as placeholder for STM32Cube packages - add PowerShell script to download and install SMT32F4 support pack from ST web site (work in progress as the destination folders and final layout are still unknow) --- .gitignore | 5 ++ Install-STM32Cube_F4.ps1 | 99 ++++++++++++++++++++++++++++++++++++++++ STM32Cube/ReadMe.md | 24 ++++++++++ 3 files changed, 128 insertions(+) create mode 100644 Install-STM32Cube_F4.ps1 create mode 100644 STM32Cube/ReadMe.md diff --git a/.gitignore b/.gitignore index 26554d703..4c189f5a6 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,8 @@ ReleaseNotesCrypto.txt /Solutions/Windows/TinyCLR/FLASH_MEMORY.bin *.opendb *.dbgconf + +# STM32 Cube and installation folders +STM32Cube/* +!STM32Cube/ReadMe.m +DeviceCode/Targets/Native/ST/STM32F4XX/* diff --git a/Install-STM32Cube_F4.ps1 b/Install-STM32Cube_F4.ps1 new file mode 100644 index 000000000..50119ad8e --- /dev/null +++ b/Install-STM32Cube_F4.ps1 @@ -0,0 +1,99 @@ +<# +.SYNOPSIS + +Retrieves and extracts STM32CubeMX support pack for F4 familly from ST website. + +.EXAMPLE + +#> + +Import-Module .\tools\scripts\Build-netmf.psm1 + +# current officially supported version +$packVersion = "1.11.0" + + +# pack file name +$packFileName = "stm32cube_fw_f4_v" + ($packVersion -replace "[.]","") + ".zip" + +# zip folder name +$zipPackFileName = "STM32Cube_FW_F4_V" + $packVersion + +# directory for the SMT32Cube +$stmCubePath = [System.IO.Path]::Combine( $SPOCLIENT, "STM32Cube" ) + +# directory for the series under STM32Cube folder +$seriesPath = [System.IO.Path]::Combine( $stmCubePath, "F4" ) + +# make sure the destination directory is empty (if it exists at all) +if([System.IO.Directory]::Exists( $seriesPath ) ) +{ + [System.IO.Directory]::Delete( $seriesPath, $true) } +else +{ + # need to create destination directory first + [System.IO.Directory]::CreateDirectory( $seriesPath ) +} + +# base URL to download the pack file from +$packSourceURLBase = "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/" + $packFileName + +# $packSourceURLBase = "http://www.colorado.edu/conflict/peace/download/peace_essay.ZIP" + +# download the pack... +Write-Host "Downloading SMT32F4 pack from ST web site. This will take a while, be patient..." + +# check is pack file is already there +if(-not [System.IO.File]::Exists( [System.IO.Path]::Combine( $stmCubePath , $packFileName ) )) +{ + # must use WebClient because the pack file is huge + $webclient = New-Object System.Net.WebClient + #$webclient.DownloadFile( $packSourceURLBase , [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) +} + +# ... and extract the files into the series directory +Write-Host "Extracting SMT32F4 pack" + +$zipArchive = [IO.Compression.ZipFile]::OpenRead( [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) + +try +{ + # source folders and files that are to be copied + $cmsisDeviceFolder = $zipPackFileName + "/Drivers/CMSIS/Device/ST/" + $halDriverIncFolder = $zipPackFileName + "/Drivers/STM32F4xx_HAL_Driver/Inc/" + $halDriverSrcFolder = $zipPackFileName + "/Drivers/STM32F4xx_HAL_Driver/Src/" + $halDriverReleaseNotes = $zipPackFileName + "/Drivers/STM32F4xx_HAL_Driver/Release_Notes.html" + + foreach($zipItem in $zipArchive.Entries) + { + + if($zipItem.FullName.StartsWith( $cmsisDeviceFolder ) -Or + $zipItem.FullName.StartsWith( $halDriverIncFolder ) -Or + $zipItem.FullName.StartsWith( $halDriverSrcFolder ) -Or + $zipItem.FullName.StartsWith( $halDriverReleaseNotes )) + { + $destinationFile = [System.IO.Path]::Combine( $seriesPath, $zipItem.FullName.Replace($zipPackFileName, "").Replace("/", "\").SubString(1)) + $parentDir = [System.IO.Path]::GetDirectoryName( $destinationFile ) + + # create directory if it doesn't exist + if((-not [System.IO.Path]::HasExtension($parentDir)) -And (-not [System.IO.Directory]::Exists( $parentDir )) ) + { + [System.IO.Directory]::CreateDirectory( $parentDir ) + } + else + { + [IO.Compression.ZipFileExtensions]::ExtractToFile($zipItem, $destinationFile, $true) + } + } + } +} +finally +{ + # free file + $zipArchive.Dispose() +} + +# copy CMSIS folder from STM32Cube folder to DeviceCode repository folder +# Copy-Item [System.IO.Path]::Combine( $seriesPath, "") + +Copy-Item ( $seriesPath + "\Drivers\CMSIS\Device\ST" ) -Destination ( $SPOCLIENT + "\DeviceCode\Targets\Native\ST\" ) -recurse -Force diff --git a/STM32Cube/ReadMe.md b/STM32Cube/ReadMe.md new file mode 100644 index 000000000..c6066242e --- /dev/null +++ b/STM32Cube/ReadMe.md @@ -0,0 +1,24 @@ +## STM32 Cube embedded software libraries ## +This folder is a placeholder for the SMT32 Cube embedded software libraries source code. STM32 Cube embedded software libraries include: +- The HAL hardware abstraction layer, enabling portability between different STM32 devices via standardized API calls +- A collection of Middleware components, like RTOS, USB library, file system, TCP/IP stack, Touch sensing library or Graphic Library (depending on the MCU series) + +The SMTCube is available from [ST web site](http://www.st.com/web/en/catalog/tools/FM146/CL2167/SC2004) + +There are software packages for each STM32 device familly. Each one should go into its own folder. E.g. F0 folder for STM32 F0 series, F4 for STM32 F4 series, etc. The build system will look the code and header files there. + +### Download and install ### +To download and install the SMT32Cube source use the respective Powershell command available at the root folder. E.g. `Install-STM32Cube_F4.ps1` for F4 familly. + +### Supported and tested versions ### +**_This code base was validated and tested with the following versions:_** + +- F0: not implmented/ not tested +- F1: not implmented/ not tested +- F2: not implmented/ not tested +- F3: not implmented/ not tested +- F4: v1.11.0 +- F7: not implmented/ not tested +- L0: not implmented/ not tested +- L1: not implmented/ not tested +- L4: not implmented/ not tested From 6a815afb58c13cad5e7b8c42736ab4d4ecc326c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Tue, 1 Mar 2016 10:06:35 +0000 Subject: [PATCH 010/144] Remove comment so script actually downloads the pack file --- Install-STM32Cube_F4.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Install-STM32Cube_F4.ps1 b/Install-STM32Cube_F4.ps1 index 50119ad8e..6c67c53f2 100644 --- a/Install-STM32Cube_F4.ps1 +++ b/Install-STM32Cube_F4.ps1 @@ -28,7 +28,8 @@ $seriesPath = [System.IO.Path]::Combine( $stmCubePath, "F4" ) # make sure the destination directory is empty (if it exists at all) if([System.IO.Directory]::Exists( $seriesPath ) ) { - [System.IO.Directory]::Delete( $seriesPath, $true) } + [System.IO.Directory]::Delete( $seriesPath, $true) +} else { # need to create destination directory first @@ -48,7 +49,7 @@ if(-not [System.IO.File]::Exists( [System.IO.Path]::Combine( $stmCubePath , $pac { # must use WebClient because the pack file is huge $webclient = New-Object System.Net.WebClient - #$webclient.DownloadFile( $packSourceURLBase , [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) + $webclient.DownloadFile( $packSourceURLBase , [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) } # ... and extract the files into the series directory From 5e30acdbeaca5347c40058e07c287030f6e8716f Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 1 Mar 2016 23:27:55 +0000 Subject: [PATCH 011/144] Update PowerShell script - script is now generic to be able to handle all available STM32 series - add code to copy source files to correct destination directories - rename script --- ...TM32Cube_F4.ps1 => Install-CMSIS-STM32.ps1 | 57 +++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) rename Install-STM32Cube_F4.ps1 => Install-CMSIS-STM32.ps1 (50%) diff --git a/Install-STM32Cube_F4.ps1 b/Install-CMSIS-STM32.ps1 similarity index 50% rename from Install-STM32Cube_F4.ps1 rename to Install-CMSIS-STM32.ps1 index 50119ad8e..a52b4b5ab 100644 --- a/Install-STM32Cube_F4.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -1,7 +1,7 @@ <# .SYNOPSIS -Retrieves and extracts STM32CubeMX support pack for F4 familly from ST website. +Downloads and and extracts STM32CubeMX support pack for STM32 series from ST website. .EXAMPLE @@ -9,26 +9,30 @@ Retrieves and extracts STM32CubeMX support pack for F4 familly from ST website. Import-Module .\tools\scripts\Build-netmf.psm1 -# current officially supported version +# target version for STM32Cube pack $packVersion = "1.11.0" +# STM32 series +$seriesName = "F4" + # pack file name -$packFileName = "stm32cube_fw_f4_v" + ($packVersion -replace "[.]","") + ".zip" +$packFileName = "stm32cube_fw_" + $seriesName.ToLower() + "_v" + ($packVersion -replace "[.]","") + ".zip" # zip folder name -$zipPackFileName = "STM32Cube_FW_F4_V" + $packVersion +$zipPackFileName = "STM32Cube_FW_" + $seriesName + "_V" + $packVersion # directory for the SMT32Cube $stmCubePath = [System.IO.Path]::Combine( $SPOCLIENT, "STM32Cube" ) # directory for the series under STM32Cube folder -$seriesPath = [System.IO.Path]::Combine( $stmCubePath, "F4" ) +$seriesPath = [System.IO.Path]::Combine( $stmCubePath, $seriesName ) # make sure the destination directory is empty (if it exists at all) if([System.IO.Directory]::Exists( $seriesPath ) ) { - [System.IO.Directory]::Delete( $seriesPath, $true) } + [System.IO.Directory]::Delete( $seriesPath, $true) +} else { # need to create destination directory first @@ -36,9 +40,7 @@ else } # base URL to download the pack file from -$packSourceURLBase = "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/" + $packFileName - -# $packSourceURLBase = "http://www.colorado.edu/conflict/peace/download/peace_essay.ZIP" +$packSourceURL = "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/" + $packFileName # download the pack... Write-Host "Downloading SMT32F4 pack from ST web site. This will take a while, be patient..." @@ -48,11 +50,14 @@ if(-not [System.IO.File]::Exists( [System.IO.Path]::Combine( $stmCubePath , $pac { # must use WebClient because the pack file is huge $webclient = New-Object System.Net.WebClient - #$webclient.DownloadFile( $packSourceURLBase , [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) + $webclient.DownloadFile( $packSourceURL , [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) } # ... and extract the files into the series directory -Write-Host "Extracting SMT32F4 pack" +Write-Host "Extracting SMT32 pack" + +# must load this type to open Zip files +Add-Type -assembly System.IO.Compression.FileSystem $zipArchive = [IO.Compression.ZipFile]::OpenRead( [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) @@ -60,9 +65,9 @@ try { # source folders and files that are to be copied $cmsisDeviceFolder = $zipPackFileName + "/Drivers/CMSIS/Device/ST/" - $halDriverIncFolder = $zipPackFileName + "/Drivers/STM32F4xx_HAL_Driver/Inc/" - $halDriverSrcFolder = $zipPackFileName + "/Drivers/STM32F4xx_HAL_Driver/Src/" - $halDriverReleaseNotes = $zipPackFileName + "/Drivers/STM32F4xx_HAL_Driver/Release_Notes.html" + $halDriverIncFolder = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Inc/" + $halDriverSrcFolder = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Src/" + $halDriverReleaseNotes = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Release_Notes.html" foreach($zipItem in $zipArchive.Entries) { @@ -93,7 +98,25 @@ finally $zipArchive.Dispose() } -# copy CMSIS folder from STM32Cube folder to DeviceCode repository folder -# Copy-Item [System.IO.Path]::Combine( $seriesPath, "") +# copy CMSIS folder for this series from STM32Cube folder to the respective Device folder in CMSIS folder +# first make sure the destination directory is empty (if it exists at all) before copying as we don't want to mix versions +$cmsisPathForSeries = $SPOCLIENT + "\CMSIS\Device\ST" + +if([System.IO.Directory]::Exists( $cmsisPathForSeries ) ) +{ + [System.IO.Directory]::Delete( $cmsisPathForSeries , $true) +} + +Copy-Item ( $seriesPath + "\Drivers\CMSIS\Device\ST" ) -Destination $cmsisPathForSeries -recurse -Force + +# copy HAL drivers for this series from STM32Cube folder to the respective DeviceCode folder +# first make sure the destination directories are empty (if they exists at all) before copying as we don't want to mix versions +$deviceCodePathForSeries = $SPOCLIENT + "\DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver" + +if([System.IO.Directory]::Exists( $deviceCodePathForSeries ) ) +{ + [System.IO.Directory]::Delete( $deviceCodePathForSeries + "\Src" , $true) +} + -Copy-Item ( $seriesPath + "\Drivers\CMSIS\Device\ST" ) -Destination ( $SPOCLIENT + "\DeviceCode\Targets\Native\ST\" ) -recurse -Force +Copy-Item ( $seriesPath + "\Drivers\STM32" + $seriesName + "xx_HAL_Driver" ) -Destination $deviceCodePathForSeries -recurse -Force From 354be6e427e63404296558b4fc7384d87e1acba5 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 3 Mar 2016 11:22:46 +0000 Subject: [PATCH 012/144] Several improvement in script - now accepts series names and target version as parameters - add validation for parameters - add code to check if script is running from repository home or being called from a build project and adjusting working path accordingly - add standard help to script --- Install-CMSIS-STM32.ps1 | 61 +++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index 2096b70af..cd8a789a5 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -1,30 +1,67 @@ <# .SYNOPSIS +Downloads and and extracts STM32CubeMX CMSIS pack. + +.DESCRIPTION +The script downloads and and extracts an STM32CubeMX CMSIS support pack for STM32 series from ST website. +Accepts as parameters the series name and the pack version. -Downloads and and extracts STM32CubeMX support pack for STM32 series from ST website. .EXAMPLE +Install-CMSIS-STM32.ps1 F4 1.11.00 + +.PARAMETER seriesName +STM32 series name. Valid series are: F0, F1, F2, F3, F4, F7, L0, L1 and L4. + +.PARAMETER packVersion +The pack version to donwload. Format is N.NN.NN. Example: 1.11.00. #> -Import-Module .\tools\scripts\Build-netmf.psm1 +[CmdletBinding()] +Param( + [Parameter(Mandatory=$True,Position=1)] + [ValidateNotNullOrEmpty()] + [string]$seriesName, + + [Parameter(Mandatory=$True,Position=2)] + [ValidateNotNullOrEmpty()] + [string]$packVersion +) + +# check running path +$spotClientPath = Get-Location +if($spotClientPath.Path.Contains("solutions")) +{ + # path includes 'Solutions' so presume that this is being called from a solution project, repository home must be two levels up + $spotClientPath = [System.IO.Path]::GetFullPath( [System.IO.Path]::Combine( $spotClientPath, "..","..") ) + "spot" + $spotClientPath +} + +# validate pack version +if(-not ($packVersion -match "\d{1}.\d{2}.\d{2}")) +{ + # path includes 'Solutions' so presume that this is being called from a solution project, repository home must be two levels up + throw "Pack version is invalid. Must have format N.NN.NN." +} -# target version for STM32Cube pack -$packVersion = "1.11.0" +# validate series name +if(-not ($seriesName -match "(^F0$|^F1$|^F2$|^F3$|^F4$|^F7$|^L0$|^L1$|^L4$)")) +{ + throw "Unsupported series. Valid series are: F0, F1, F2, F3, F4, F7, L0, L1 and L4." +} -# STM32 series -$seriesName = "F4" -Write-Host "Installing STM32Cube CMSIS pack for STM32$seriesName series" +Write-Host "Installing STM32Cube CMSIS pack v$packVersion for STM32$seriesName series" # pack file name $packFileName = "stm32cube_fw_" + $seriesName.ToLower() + "_v" + ($packVersion -replace "[.]","") + ".zip" # zip folder name -$zipPackFileName = "STM32Cube_FW_" + $seriesName + "_V" + $packVersion +$zipPackFileName = "STM32Cube_FW_" + $seriesName.ToUpper() + "_V" + $packVersion # directory for the SMT32Cube -$stmCubePath = [System.IO.Path]::Combine( $SPOCLIENT, "STM32Cube" ) +$stmCubePath = [System.IO.Path]::Combine( $spotClientPath, "STM32Cube" ) # directory for the series under STM32Cube folder $seriesPath = [System.IO.Path]::Combine( $stmCubePath, $seriesName ) @@ -108,7 +145,7 @@ finally # first make sure the destination directory is empty (if it exists at all) before copying as we don't want to mix versions Write-Host "Copying CMSIS driver..." -$cmsisPathForSeries = $SPOCLIENT + "\CMSIS\Device\ST" +$cmsisPathForSeries = $spotClientPath + "\CMSIS\Device\ST" if([System.IO.Directory]::Exists( $cmsisPathForSeries ) ) { @@ -121,7 +158,7 @@ Copy-Item ( $seriesPath + "\Drivers\CMSIS\Device\ST" ) -Destination $cmsisPathFo # first make sure the destination directories are empty (if they exists at all) before copying as we don't want to mix versions Write-Host "Copying HAL driver..." -$deviceCodePathForSeries = $SPOCLIENT + "\DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver" +$deviceCodePathForSeries = $spotClientPath + "\DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver" if([System.IO.Directory]::Exists( $deviceCodePathForSeries ) ) { @@ -131,4 +168,4 @@ if([System.IO.Directory]::Exists( $deviceCodePathForSeries ) ) Copy-Item ( $seriesPath + "\Drivers\STM32" + $seriesName + "xx_HAL_Driver" ) -Destination $deviceCodePathForSeries -recurse -Force -Write-Host "Installation of STM32Cube CMSIS pack for STM32$seriesName series completed" +Write-Host "Installation of STM32Cube CMSIS pack v$packVersion for STM32$seriesName series completed" From 8a33df8a67b5334d9f97d6b5f70e21ee91aba0e9 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 3 Mar 2016 13:34:31 +0000 Subject: [PATCH 013/144] Improvements in script - correct pack target version validation - correct documentation - remove debug code --- Install-CMSIS-STM32.ps1 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index cd8a789a5..e46856c2f 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -14,7 +14,7 @@ Install-CMSIS-STM32.ps1 F4 1.11.00 STM32 series name. Valid series are: F0, F1, F2, F3, F4, F7, L0, L1 and L4. .PARAMETER packVersion -The pack version to donwload. Format is N.NN.NN. Example: 1.11.00. +The pack version to donwload. Format is N.NN.N. Example: 1.11.0 #> @@ -31,18 +31,17 @@ Param( # check running path $spotClientPath = Get-Location -if($spotClientPath.Path.Contains("solutions")) +if($spotClientPath.Path.Contains("Solutions")) { # path includes 'Solutions' so presume that this is being called from a solution project, repository home must be two levels up $spotClientPath = [System.IO.Path]::GetFullPath( [System.IO.Path]::Combine( $spotClientPath, "..","..") ) - "spot" + $spotClientPath } # validate pack version -if(-not ($packVersion -match "\d{1}.\d{2}.\d{2}")) +if(-not ($packVersion -match "\d{1}.\d{2}.\d{1}$")) { # path includes 'Solutions' so presume that this is being called from a solution project, repository home must be two levels up - throw "Pack version is invalid. Must have format N.NN.NN." + throw "Pack version is invalid. Must have format N.NN.N" } # validate series name From 1499e00f12ac0621022dfa66e13305bdde673028 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 3 Mar 2016 16:09:53 +0000 Subject: [PATCH 014/144] Improvements in script - replace several calls with PowerShell comandlets to improve eficiency - source folder is now deleted after copy - destination directories are now cleared before copying files --- Install-CMSIS-STM32.ps1 | 50 +++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index e46856c2f..d32335f15 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -45,6 +45,7 @@ if(-not ($packVersion -match "\d{1}.\d{2}.\d{1}$")) } # validate series name +$seriesName = $seriesName.ToUpper() if(-not ($seriesName -match "(^F0$|^F1$|^F2$|^F3$|^F4$|^F7$|^L0$|^L1$|^L4$)")) { throw "Unsupported series. Valid series are: F0, F1, F2, F3, F4, F7, L0, L1 and L4." @@ -57,7 +58,7 @@ Write-Host "Installing STM32Cube CMSIS pack v$packVersion for STM32$seriesName s $packFileName = "stm32cube_fw_" + $seriesName.ToLower() + "_v" + ($packVersion -replace "[.]","") + ".zip" # zip folder name -$zipPackFileName = "STM32Cube_FW_" + $seriesName.ToUpper() + "_V" + $packVersion +$zipPackFileName = "STM32Cube_FW_" + $seriesName + "_V" + $packVersion # directory for the SMT32Cube $stmCubePath = [System.IO.Path]::Combine( $spotClientPath, "STM32Cube" ) @@ -66,18 +67,18 @@ $stmCubePath = [System.IO.Path]::Combine( $spotClientPath, "STM32Cube" ) $seriesPath = [System.IO.Path]::Combine( $stmCubePath, $seriesName ) # make sure the destination directory is empty (if it exists at all) -if([System.IO.Directory]::Exists( $seriesPath ) ) +if( Test-Path $seriesPath ) { - [System.IO.Directory]::Delete( $seriesPath, $true) + Remove-Item -Path $seriesPath -Force -Recurse -ErrorAction Ignore | Out-Null } else { # need to create destination directory first - [System.IO.Directory]::CreateDirectory( $seriesPath ) + New-Item -Path $seriesPath -Force -ItemType directory | Out-Null } # check is pack file is already there -if(-not [System.IO.File]::Exists( [System.IO.Path]::Combine( $stmCubePath , $packFileName ) )) +if(-not (Test-Path ([System.IO.Path]::Combine( $stmCubePath , $packFileName ))) ) { # base URL to download the pack file from $packSourceURL = "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/" + $packFileName @@ -123,9 +124,9 @@ try $parentDir = [System.IO.Path]::GetDirectoryName( $destinationFile ) # create directory if it doesn't exist - if((-not [System.IO.Path]::HasExtension($parentDir)) -And (-not [System.IO.Directory]::Exists( $parentDir )) ) + if((-not [System.IO.Path]::HasExtension($parentDir)) -And (-not (Test-Path -Path $parentDir)) ) { - [System.IO.Directory]::CreateDirectory( $parentDir ) + New-Item -Path $parentDir -Force -ItemType directory | Out-Null } else { @@ -140,31 +141,26 @@ finally $zipArchive.Dispose() } -# copy CMSIS folder for this series from STM32Cube folder to the respective Device folder in CMSIS folder -# first make sure the destination directory is empty (if it exists at all) before copying as we don't want to mix versions +# move CMSIS folder for this series from STM32Cube folder to the respective Device folder in CMSIS folder +# first clear the destination directory before copying as we don't want to mix versions Write-Host "Copying CMSIS driver..." -$cmsisPathForSeries = $spotClientPath + "\CMSIS\Device\ST" +$cmsisPathForSeries = [System.IO.Path]::Combine($spotClientPath.Path , "CMSIS\Device\ST") +Remove-Item -Path $cmsisPathForSeries -Force -Recurse -ErrorAction Ignore +New-Item -Path $cmsisPathForSeries -Force -ItemType directory | Out-Null +Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\CMSIS\Device\ST\*") ) -Destination $cmsisPathForSeries -Force -if([System.IO.Directory]::Exists( $cmsisPathForSeries ) ) -{ - [System.IO.Directory]::Delete( $cmsisPathForSeries , $true) -} - -Copy-Item ( $seriesPath + "\Drivers\CMSIS\Device\ST" ) -Destination $cmsisPathForSeries -recurse -Force - -# copy HAL drivers for this series from STM32Cube folder to the respective DeviceCode folder -# first make sure the destination directories are empty (if they exists at all) before copying as we don't want to mix versions +# move HAL drivers for this series from STM32Cube folder to the respective DeviceCode folder +# first clear the destination directory before copying as we don't want to mix versions Write-Host "Copying HAL driver..." -$deviceCodePathForSeries = $spotClientPath + "\DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver" - -if([System.IO.Directory]::Exists( $deviceCodePathForSeries ) ) -{ - [System.IO.Directory]::Delete( $deviceCodePathForSeries , $true) -} - +$deviceCodePathForSeries = [System.IO.Path]::Combine( $spotClientPath.Path, "DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver") +Remove-Item -Path $deviceCodePathForSeries -Force -Recurse -ErrorAction Ignore +New-Item -Path $deviceCodePathForSeries -Force -ItemType directory | Out-Null +Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\STM32" + $seriesName + "xx_HAL_Driver\*") ) -Destination $deviceCodePathForSeries -Force -Copy-Item ( $seriesPath + "\Drivers\STM32" + $seriesName + "xx_HAL_Driver" ) -Destination $deviceCodePathForSeries -recurse -Force +# delete source folder in STM32Cube becasause we don't need it anymore +Remove-Item -Path $seriesPath -Force -Recurse -ErrorAction Ignore +# done here Write-Host "Installation of STM32Cube CMSIS pack v$packVersion for STM32$seriesName series completed" From 01a0a7b31f81204a1f1eda46efa5303942c5bd45 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 3 Mar 2016 16:21:33 +0000 Subject: [PATCH 015/144] Update feedback messages --- Install-CMSIS-STM32.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index d32335f15..28ead5973 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -84,7 +84,7 @@ if(-not (Test-Path ([System.IO.Path]::Combine( $stmCubePath , $packFileName ))) $packSourceURL = "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/" + $packFileName # download the pack... - Write-Host "Downloading SMT32Cube pack from ST web site. This will take a while, be patient..." + Write-Host "Downloading pack from ST web site. This will take a while, be patient..." # must use WebClient because the pack file is huge $webclient = New-Object System.Net.WebClient @@ -93,11 +93,11 @@ if(-not (Test-Path ([System.IO.Path]::Combine( $stmCubePath , $packFileName ))) else { # pack is available... - Write-Host "SMT32Cube pack is already available, skipping download" + Write-Host "Pack already available, skipping download" } # ... and extract the files into the series directory -Write-Host "Extracting SMT32 pack..." +Write-Host "Extracting pack..." # must load this type to open Zip files Add-Type -assembly System.IO.Compression.FileSystem From acc540c9e495c4975b7336edc71345a71aa5bfb0 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 4 Mar 2016 00:40:16 +0000 Subject: [PATCH 016/144] Rename SD card commands because some colide with STM32 HAL declarations --- .../Drivers/BlockStorage/SD/SD_BL_driver.cpp | 38 +++++++++---------- DeviceCode/include/SD_decl.h | 30 +++++++-------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/DeviceCode/Drivers/BlockStorage/SD/SD_BL_driver.cpp b/DeviceCode/Drivers/BlockStorage/SD/SD_BL_driver.cpp index b115dba04..6195c7157 100644 --- a/DeviceCode/Drivers/BlockStorage/SD/SD_BL_driver.cpp +++ b/DeviceCode/Drivers/BlockStorage/SD/SD_BL_driver.cpp @@ -364,10 +364,10 @@ BOOL SD_BS_Driver::ChipInitialize(void *context) // send CMD16, set block length to 512 #ifdef SD_DEBUG - debug_printf" SD SendCmdWithR1Resp: SD_SET_BLOCKLEN[512] -> R1_IN_READY_STATUS\r\n"); + debug_printf" SD SendCmdWithR1Resp: SD_CMD_SET_BLOCKLEN[512] -> R1_IN_READY_STATUS\r\n"); #endif - response = SD_SendCmdWithR1Resp(SD_SET_BLOCKLEN, 512, 0xFF, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_SET_BLOCKLEN, 512, 0xFF, R1_IN_READY_STATUS); if(response != R1_IN_READY_STATUS) { @@ -391,10 +391,10 @@ BOOL SD_BS_Driver::ChipInitialize(void *context) #ifdef SD_DEBUG - debug_printf(" SD SendCmdWithR1Resp: SD_SEND_CSD[0] -> SD_START_DATA_BLOCK_TOKEN=%02X\r\n",SD_START_DATA_BLOCK_TOKEN); + debug_printf(" SD SendCmdWithR1Resp: SD_CMD_SEND_CSD[0] -> SD_START_DATA_BLOCK_TOKEN=%02X\r\n",SD_START_DATA_BLOCK_TOKEN); #endif - response = SD_SendCmdWithR1Resp(SD_SEND_CSD, 0, 0xFF, SD_START_DATA_BLOCK_TOKEN); + response = SD_SendCmdWithR1Resp(SD_CMD_SEND_CSD, 0, 0xFF, SD_START_DATA_BLOCK_TOKEN); if(response != SD_START_DATA_BLOCK_TOKEN) { @@ -412,7 +412,7 @@ BOOL SD_BS_Driver::ChipInitialize(void *context) //Table 5-5: TAAC Access Time Definition //TAAC bit position code - //2:0 time unit 0=1ns, 1=10ns, 2=100ns, 3=1µs, 4=10µs,5=100µs, 6=1ms, 7=10ms + //2:0 time unit 0=1ns, 1=10ns, 2=100ns, 3=1�s, 4=10�s,5=100�s, 6=1ms, 7=10ms //6:3 time value 0=reserved, 1=1.0, 2=1.2, 3=1.3, 4=1.5, 5=2.0, 6=2.5, 7=3.0, // 8=3.5, 9=4.0, A=4.5, B=5.0, C=5.5, D=6.0, E=7.0, F=8.0 // 7 reserved @@ -543,8 +543,8 @@ BOOL SD_BS_Driver::ChipInitialize(void *context) //CMD55+ACMD51 to get SCR register BYTE regSCR[8]; - SD_SendCmdWithR1Resp(SD_APP_CMD, 0, 0xFF, R1_IN_READY_STATUS); - response = SD_SendCmdWithR1Resp(SD_SEND_SCR, 0, 0xFF, SD_START_DATA_BLOCK_TOKEN); + SD_SendCmdWithR1Resp(SD_CMD_APP_CMD, 0, 0xFF, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_SEND_SCR, 0, 0xFF, SD_START_DATA_BLOCK_TOKEN); if(response != SD_START_DATA_BLOCK_TOKEN) { @@ -582,7 +582,7 @@ BOOL SD_BS_Driver::ChipInitialize(void *context) BYTE ProductName[5]; - response = SD_SendCmdWithR1Resp(SD_SEND_CID, 0, 0xFF, SD_START_DATA_BLOCK_TOKEN); + response = SD_SendCmdWithR1Resp(SD_CMD_SEND_CID, 0, 0xFF, SD_START_DATA_BLOCK_TOKEN); if(response != SD_START_DATA_BLOCK_TOKEN) { @@ -652,7 +652,7 @@ BYTE SD_BS_Driver::SD_Cmd_GO_IDLE_STATE() // send CMD0, card should enter IDLE state for(i = 0; i < 10; i++) { - response = SD_SendCmdWithR1Resp(SD_GO_IDLE_STATE, 0, 0x95, R1_IN_IDLE_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_GO_IDLE_STATE, 0, 0x95, R1_IN_IDLE_STATUS); if(response == R1_IN_IDLE_STATUS) break; } @@ -687,7 +687,7 @@ BYTE SD_BS_Driver::ReadOCR_R3(UINT32* pOCR) *pOCR=0; // SD_SEND_OCR - BYTE R3response = SD_SendCmdWithR3Resp(SD_READ_OCR, 0, pOCR); + BYTE R3response = SD_SendCmdWithR3Resp(SD_CMD_READ_OCR, 0, pOCR); #ifdef SD_DEBUG debug_printf(" SD %s OCR=%08X : BUSY=%d CCS=%d\r\n",(Get_OCR_CCS() ? "HC/XC" : "SC"), @@ -725,7 +725,7 @@ BOOL SD_BS_Driver::SD_Cmd_SEND_IF_COND(BOOL isLowVoltageRequired, BOOL *pIs_SD_v supply_voltage = 1; CMD8_Arg |= (supply_voltage << 8); - BYTE R7response = SD_SendCmdWithR7Resp(SD_SEND_IF_COND, CMD8_Arg, &support_voltage); + BYTE R7response = SD_SendCmdWithR7Resp(SD_CMD_SEND_IF_COND, CMD8_Arg, &support_voltage); // check if command was successful? if(R7response == R7_ILLEGAL_COOMMAND) { @@ -765,9 +765,9 @@ BOOL SD_BS_Driver::SD_Set_In_READY_STATUS(BOOL isHC_XC_Supported) for(i=0; i<0x7fff; i++) { //send CMD55 + ACMD41 until return 0x00 for type 1 cards - SD_SendCmdWithR1Resp(SD_APP_CMD, 0, 0xFF, R1_IN_IDLE_STATUS); + SD_SendCmdWithR1Resp(SD_CMD_APP_CMD, 0, 0xFF, R1_IN_IDLE_STATUS); - response = SD_SendCmdWithR1Resp(SD_SEND_OP_COND, (isHC_XC_Supported ? CMD41_HCS_PATTERN : 0), 0xFF, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_SEND_OP_COND, (isHC_XC_Supported ? CMD41_HCS_PATTERN : 0), 0xFF, R1_IN_READY_STATUS); if(response == R1_IN_READY_STATUS) { @@ -778,7 +778,7 @@ BOOL SD_BS_Driver::SD_Set_In_READY_STATUS(BOOL isHC_XC_Supported) if (isHC_XC_Supported) { // use v2.0 command - response = SD_SendCmdWithR1Resp(SD_V2_SEND_OP_COND, 0, 0xFF, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_V2_SEND_OP_COND, 0, 0xFF, R1_IN_READY_STATUS); if(response == R1_IN_READY_STATUS) { return TRUE; @@ -890,7 +890,7 @@ BOOL SD_BS_Driver::ReadSector(SectorAddress sectorAddress, UINT32 Offset, UINT32 SD_CsSetLow(); // send CMD17 and wait for DATA_BLOCK_TOKEN - response = SD_SendCmdWithR1Resp(SD_READ_SINGLE_BLOCK, sectorAddress << 9, 0xff, SD_START_DATA_BLOCK_TOKEN, 10000); + response = SD_SendCmdWithR1Resp(SD_CMD_READ_SINGLE_BLOCK, sectorAddress << 9, 0xff, SD_START_DATA_BLOCK_TOKEN, 10000); if(response == SD_START_DATA_BLOCK_TOKEN) { @@ -1109,7 +1109,7 @@ BOOL SD_BS_Driver::WriteX(void *context, ByteAddress phyAddr, UINT32 NumBytes, B SD_CsSetLow(); // send CMD24 --read single block data - response = SD_SendCmdWithR1Resp(SD_WRITE_SINGLE_BLOCK, StartSector << 9, 0xff, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_WRITE_SINGLE_BLOCK, StartSector << 9, 0xff, R1_IN_READY_STATUS); if(response == R1_IN_READY_STATUS) { @@ -1207,7 +1207,7 @@ BOOL SD_BS_Driver::EraseSectors(SectorAddress Address, INT32 SectorCount) SD_CsSetLow(); // cs low //send ERASE_WR_BLK_START command - response = SD_SendCmdWithR1Resp(SD_ERASE_WR_BLK_START, Address << 9, 0xff, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_ERASE_WR_BLK_START, Address << 9, 0xff, R1_IN_READY_STATUS); if(response != R1_IN_READY_STATUS) { @@ -1216,7 +1216,7 @@ BOOL SD_BS_Driver::EraseSectors(SectorAddress Address, INT32 SectorCount) } //send ERASE_WR_BLK_END command - response = SD_SendCmdWithR1Resp(SD_ERASE_WR_BLK_END, (Address + SectorCount - 1) << 9, 0xff, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_ERASE_WR_BLK_END, (Address + SectorCount - 1) << 9, 0xff, R1_IN_READY_STATUS); if(response != R1_IN_READY_STATUS) { @@ -1225,7 +1225,7 @@ BOOL SD_BS_Driver::EraseSectors(SectorAddress Address, INT32 SectorCount) } // send erase command - response = SD_SendCmdWithR1Resp(SD_ERASE, 0xffffffff, 0xff, R1_IN_READY_STATUS); + response = SD_SendCmdWithR1Resp(SD_CMD_ERASE, 0xffffffff, 0xff, R1_IN_READY_STATUS); if(response != R1_IN_READY_STATUS) { diff --git a/DeviceCode/include/SD_decl.h b/DeviceCode/include/SD_decl.h index b8779088c..ea730a05d 100644 --- a/DeviceCode/include/SD_decl.h +++ b/DeviceCode/include/SD_decl.h @@ -54,21 +54,21 @@ struct SD_BS_Driver #define OCR_BUSY_BIT 0x80000000 #define OCR_CCS_BIT 0x40000000 - #define SD_GO_IDLE_STATE 0x00 // CMD0 - #define SD_V2_SEND_OP_COND 0x01 // CMD1 - #define SD_SEND_IF_COND 0x08 // CMD8 - #define SD_SEND_CSD 0x09 // CMD9 - #define SD_SEND_CID 0x0A // CMD10 - #define SD_READ_SINGLE_BLOCK 0x11 // CMD17 - #define SD_SET_BLOCKLEN 0x10 // CMD16 - #define SD_WRITE_SINGLE_BLOCK 0x18 // CMD24 - #define SD_ERASE_WR_BLK_START 0x20 // CMD32 - #define SD_ERASE_WR_BLK_END 0x21 // CMD33 - #define SD_ERASE 0x26 // CMD38 - #define SD_APP_CMD 0x37 // CMD55 - #define SD_SEND_OP_COND 0x29 // ACMD41 - #define SD_SEND_SCR 0x33 // ACMD51 - #define SD_READ_OCR 58 // ACMD58 + #define SD_CMD_GO_IDLE_STATE 0x00 // CMD0 + #define SD_CMD_V2_SEND_OP_COND 0x01 // CMD1 + #define SD_CMD_SEND_IF_COND 0x08 // CMD8 + #define SD_CMD_SEND_CSD 0x09 // CMD9 + #define SD_CMD_SEND_CID 0x0A // CMD10 + #define SD_CMD_READ_SINGLE_BLOCK 0x11 // CMD17 + #define SD_CMD_SET_BLOCKLEN 0x10 // CMD16 + #define SD_CMD_WRITE_SINGLE_BLOCK 0x18 // CMD24 + #define SD_CMD_ERASE_WR_BLK_START 0x20 // CMD32 + #define SD_CMD_ERASE_WR_BLK_END 0x21 // CMD33 + #define SD_CMD_ERASE 0x26 // CMD38 + #define SD_CMD_APP_CMD 0x37 // CMD55 + #define SD_CMD_SEND_OP_COND 0x29 // ACMD41 + #define SD_CMD_SEND_SCR 0x33 // ACMD51 + #define SD_CMD_READ_OCR 58 // ACMD58 #define SD_START_DATA_BLOCK_TOKEN 0xfe From f4e40b2946044e1d4bfb4340404aaa61156a1ca2 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Sat, 5 Mar 2016 12:21:41 +0000 Subject: [PATCH 017/144] Correct bug in script --- Install-CMSIS-STM32.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index 28ead5973..8982486ff 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -145,7 +145,7 @@ finally # first clear the destination directory before copying as we don't want to mix versions Write-Host "Copying CMSIS driver..." -$cmsisPathForSeries = [System.IO.Path]::Combine($spotClientPath.Path , "CMSIS\Device\ST") +$cmsisPathForSeries = [System.IO.Path]::Combine($spotClientPath , "CMSIS\Device\ST") Remove-Item -Path $cmsisPathForSeries -Force -Recurse -ErrorAction Ignore New-Item -Path $cmsisPathForSeries -Force -ItemType directory | Out-Null Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\CMSIS\Device\ST\*") ) -Destination $cmsisPathForSeries -Force @@ -154,7 +154,7 @@ Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\CMSIS\Device\S # first clear the destination directory before copying as we don't want to mix versions Write-Host "Copying HAL driver..." -$deviceCodePathForSeries = [System.IO.Path]::Combine( $spotClientPath.Path, "DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver") +$deviceCodePathForSeries = [System.IO.Path]::Combine( $spotClientPath, "DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver") Remove-Item -Path $deviceCodePathForSeries -Force -Recurse -ErrorAction Ignore New-Item -Path $deviceCodePathForSeries -Force -ItemType directory | Out-Null Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\STM32" + $seriesName + "xx_HAL_Driver\*") ) -Destination $deviceCodePathForSeries -Force From ea2655a9eb4c7c8814d4b74f5124a97a33d7df92 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Sat, 5 Mar 2016 17:09:32 +0000 Subject: [PATCH 018/144] Rename FLASH in HAL_SYSTEM_CONFIG because it was coliding with a CMSIS declaration with the same name --- Application/TinyBooter/Commands.cpp | 4 ++-- DeviceCode/include/tinyhal.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Application/TinyBooter/Commands.cpp b/Application/TinyBooter/Commands.cpp index 6c7bf7768..c0afa8e00 100644 --- a/Application/TinyBooter/Commands.cpp +++ b/Application/TinyBooter/Commands.cpp @@ -1426,8 +1426,8 @@ bool Loader_Engine::Monitor_MemoryMap( WP_Message* msg ) map[ 0 ].m_length = HalSystemConfig.RAM1.Size; map[ 0 ].m_flags = CLR_DBG_Commands::Monitor_MemoryMap::c_RAM; - map[ 1 ].m_address = HalSystemConfig.FLASH.Base; - map[ 1 ].m_length = HalSystemConfig.FLASH.Size; + map[ 1 ].m_address = HalSystemConfig.FLASH1.Base; + map[ 1 ].m_length = HalSystemConfig.FLASH1.Size; map[ 1 ].m_flags = CLR_DBG_Commands::Monitor_MemoryMap::c_FLASH; ReplyToCommand( msg, true, false, map, sizeof(map) ); diff --git a/DeviceCode/include/tinyhal.h b/DeviceCode/include/tinyhal.h index 18f2e0522..50f175834 100644 --- a/DeviceCode/include/tinyhal.h +++ b/DeviceCode/include/tinyhal.h @@ -412,7 +412,7 @@ struct HAL_SYSTEM_CONFIG COM_HANDLE stdio; HAL_SYSTEM_MEMORY_CONFIG RAM1; - HAL_SYSTEM_MEMORY_CONFIG FLASH; + HAL_SYSTEM_MEMORY_CONFIG FLASH1; //--// From 275d7d951ee118ec33feb03538f61e9ba3b5ee0e Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Sat, 5 Mar 2016 17:15:05 +0000 Subject: [PATCH 019/144] Rename variable because it was coliding with a CMSIS declaration with the same name --- DeviceCode/pal/configuration/ConfigHelper.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DeviceCode/pal/configuration/ConfigHelper.cpp b/DeviceCode/pal/configuration/ConfigHelper.cpp index 3bf81f25e..17ebb363c 100644 --- a/DeviceCode/pal/configuration/ConfigHelper.cpp +++ b/DeviceCode/pal/configuration/ConfigHelper.cpp @@ -29,13 +29,13 @@ BOOL HAL_CONFIG_BLOCK::IsGoodBlock() const DEBUG_TRACE2( TRACE_CONFIG, "read header CRC=0x%08x at %08x\r\n", HeaderCRC, (size_t)this ); // what is the header's CRC - UINT32 CRC = SUPPORT_ComputeCRC( ((UINT8*)&DataCRC), sizeof(*this) - offsetof(HAL_CONFIG_BLOCK,DataCRC), c_Seed ); + UINT32 crc = SUPPORT_ComputeCRC( ((UINT8*)&DataCRC), sizeof(*this) - offsetof(HAL_CONFIG_BLOCK,DataCRC), c_Seed ); - DEBUG_TRACE1(TRACE_CONFIG, "calc header CRC=0x%08x\r\n", CRC); + DEBUG_TRACE1(TRACE_CONFIG, "calc header CRC=0x%08x\r\n", crc); - if(CRC != HeaderCRC) + if(crc != HeaderCRC) { - DEBUG_TRACE3( TRACE_ALWAYS, "FAILED HEADER CRC at %08x: 0x%08x != 0x%08x\r\n", (size_t)this, CRC, HeaderCRC ); + DEBUG_TRACE3( TRACE_ALWAYS, "FAILED HEADER CRC at %08x: 0x%08x != 0x%08x\r\n", (size_t)this, crc, HeaderCRC ); return FALSE; } @@ -47,13 +47,13 @@ BOOL HAL_CONFIG_BLOCK::IsGoodData() const DEBUG_TRACE1( TRACE_CONFIG, "read Size=%5d\r\n", Size ); // what is the blob's CRC - UINT32 CRC = SUPPORT_ComputeCRC( Data(), Size, 0 ); + UINT32 crc = SUPPORT_ComputeCRC( Data(), Size, 0 ); - DEBUG_TRACE1( TRACE_CONFIG, "calc blob CRC=0x%08x\r\n", CRC ); + DEBUG_TRACE1( TRACE_CONFIG, "calc blob CRC=0x%08x\r\n", crc ); // this indicates that this record has been marked as invalid, but still allows the helper to move // to the next record. - if(CRC != DataCRC) + if(crc != DataCRC) { return FALSE; } From 0e60929bc649e5a68f242d9384b18e991a05f82f Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 11 Mar 2016 11:41:50 +0000 Subject: [PATCH 020/144] Added project for HAL CMSIS GPIO --- .../Targets/CMSIS/GPIO/GPIO_functions.cpp | 572 ++++++++++++++++++ DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj | 75 +++ 2 files changed, 647 insertions(+) create mode 100644 DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp new file mode 100644 index 000000000..5b7662b7b --- /dev/null +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -0,0 +1,572 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** GPIO Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +#define Gpio_MaxPins (TOTAL_GPIO_PORT * 16) +#define Gpio_MaxInt 16 + +// indexed port configuration access +#define Port(port) ((GPIO_TypeDef *) (GPIOA_BASE + (port << 10))) + +struct Int_State +{ + HAL_COMPLETION completion; // debounce completion + BYTE pin; // pin number + BYTE mode; // edge mode + BYTE debounce; // debounce flag + BYTE expected; // expected pin state + GPIO_INTERRUPT_SERVICE_ROUTINE ISR; // interrupt handler + void* param; // interrupt handler parameter + UINT32 debounceTicks; +}; + +static Int_State g_int_state[ Gpio_MaxInt ]; // interrupt state + +static UINT32 g_debounceTicks; +static UINT16 g_pinReserved[ TOTAL_GPIO_PORT ]; // 1 bit per pin + +/* + * Debounce Completion Handler + */ +void GPIO_DebounceHandler( void* arg ) +{ + Int_State* state = ( Int_State* )arg; + if( state->ISR ) + { + UINT32 actual = CPU_GPIO_GetPinState( state->pin ); // get actual pin state + if( actual == state->expected ) + { + state->ISR( state->pin, actual, state->param ); + if( state->mode == GPIO_INT_EDGE_BOTH ) + { // both edges + state->expected ^= 1; // update expected state + } + } + } +} + +/* + * Interrupt Handler + */ +void GPIO_ISR( int num ) // 0 <= num <= 15 +{ + INTERRUPT_START + + Int_State* state = &g_int_state[ num ]; + state->completion.Abort( ); + UINT32 bit = 1 << num; + UINT32 actual; + do + { + EXTI->PR = bit; // reset pending bit + actual = CPU_GPIO_GetPinState( state->pin ); // get actual pin state + } while( EXTI->PR & bit ); // repeat if pending again + + if( state->ISR ) + { + if( state->debounce ) + { // debounce enabled + // for back compat treat state.debounceTicks == 0 as indication to use global debounce setting + UINT32 debounceDeltaTicks = state->debounceTicks == 0 ? g_debounceTicks : state->debounceTicks; + state->completion.EnqueueTicks( HAL_Time_CurrentTicks( ) + debounceDeltaTicks ); + } + else + { + state->ISR( state->pin, state->expected, state->param ); + if( state->mode == GPIO_INT_EDGE_BOTH ) + { // both edges + if( actual != state->expected ) + { // fire another isr to keep in synch + state->ISR( state->pin, actual, state->param ); + } + else + { + state->expected ^= 1; // update expected state + } + } + } + } + + INTERRUPT_END +} + +void GPIO_Interrupt0( void* param ) // EXTI0 +{ + GPIO_ISR( 0 ); +} + +void GPIO_Interrupt1( void* param ) // EXTI1 +{ + GPIO_ISR( 1 ); +} + +void GPIO_Interrupt2( void* param ) // EXTI2 +{ + GPIO_ISR( 2 ); +} + +void GPIO_Interrupt3( void* param ) // EXTI3 +{ + GPIO_ISR( 3 ); +} + +void GPIO_Interrupt4( void* param ) // EXTI4 +{ + GPIO_ISR( 4 ); +} + +void GPIO_Interrupt5( void* param ) // EXTI5 - EXTI9 +{ + UINT32 pending = EXTI->PR & EXTI->IMR & 0x03E0; // pending bits 5..9 + int num = 5; pending >>= 5; + do + { + if( pending & 1 ) GPIO_ISR( num ); + num++; pending >>= 1; + } while( pending ); +} + +void GPIO_Interrupt10( void* param ) // EXTI10 - EXTI15 +{ + UINT32 pending = EXTI->PR & EXTI->IMR & 0xFC00; // pending bits 10..15 + int num = 10; pending >>= 10; + do + { + if( pending & 1 ) GPIO_ISR( num ); + num++; pending >>= 1; + } while( pending ); +} + +BOOL GPIO_Set_Interrupt( UINT32 pin + , GPIO_INTERRUPT_SERVICE_ROUTINE ISR + , void* ISR_Param + , GPIO_INT_EDGE mode + , BOOL GlitchFilterEnable + ) +{ + UINT32 num = pin & 0x0F; + UINT32 bit = 1 << num; + UINT32 shift = ( num & 0x3 ) << 2; // 4 bit fields + UINT32 idx = num >> 2; + UINT32 mask = 0xF << shift; + UINT32 config = ( pin >> 4 ) << shift; // port number configuration + + Int_State* state = &g_int_state[ num ]; + + GLOBAL_LOCK( irq ); + + if( ISR ) + { + if( ( SYSCFG->EXTICR[ idx ] & mask ) != config ) + { + if( EXTI->IMR & bit ) + return FALSE; // interrupt in use + + SYSCFG->EXTICR[ idx ] = SYSCFG->EXTICR[ idx ] & ~mask | config; + } + state->pin = ( BYTE )pin; + state->mode = ( BYTE )mode; + state->debounce = ( BYTE )GlitchFilterEnable; + state->param = ISR_Param; + state->ISR = ISR; + state->completion.Abort( ); + state->completion.SetArgument( state ); + + EXTI->RTSR &= ~bit; + EXTI->FTSR &= ~bit; + switch( mode ) + { + case GPIO_INT_EDGE_LOW: + case GPIO_INT_LEVEL_LOW: + EXTI->FTSR |= bit; + state->expected = FALSE; + break; + + case GPIO_INT_EDGE_HIGH: + case GPIO_INT_LEVEL_HIGH: + EXTI->RTSR |= bit; + state->expected = TRUE; + break; + + case GPIO_INT_EDGE_BOTH: + EXTI->FTSR |= bit; + EXTI->RTSR |= bit; + UINT32 actual; + do + { + EXTI->PR = bit; // remove pending interrupt + actual = CPU_GPIO_GetPinState( pin ); // get actual pin state + } while( EXTI->PR & bit ); // repeat if pending again + state->expected = ( BYTE )( actual ^ 1 ); + } + + EXTI->IMR |= bit; // enable interrupt + // check for level interrupts + if( mode == GPIO_INT_LEVEL_HIGH && CPU_GPIO_GetPinState( pin ) + || mode == GPIO_INT_LEVEL_LOW && !CPU_GPIO_GetPinState( pin ) ) + { + EXTI->SWIER = bit; // force interrupt + } + } + else if( ( SYSCFG->EXTICR[ idx ] & mask ) == config ) + { + EXTI->IMR &= ~bit; // disable interrupt + state->ISR = NULL; + state->completion.Abort( ); + } + return TRUE; +} + + +// mode: 0: input, 1: output, 2: alternate, 3: analog +// alternate: od | AF << 4 | speed << 8 +void GPIO_Pin_Config( GPIO_PIN pin, UINT32 mode, GPIO_RESISTOR resistor, UINT32 alternate ) +{ + GPIO_TypeDef* port = Port( pin >> 4 ); // pointer to the actual port registers + pin &= 0x0F; // bit number + UINT32 bit = 1 << pin; + UINT32 shift = pin << 1; // 2 bits / pin + UINT32 mask = 0x3 << shift; + UINT32 pull = 0; + if( resistor == RESISTOR_PULLUP ) + pull = GPIO_PUPDR_PUPDR0_0; + + if( resistor == RESISTOR_PULLDOWN ) + pull = GPIO_PUPDR_PUPDR0_1; + + pull <<= shift; + mode <<= shift; + UINT32 speed = ( alternate >> 8 ) << shift; + UINT32 altSh = ( pin & 0x7 ) << 2; // 4 bits / pin + UINT32 altMsk = 0xF << altSh; + UINT32 idx = pin >> 3; + UINT32 af = ( ( alternate >> 4 ) & 0xF ) << altSh; + + GLOBAL_LOCK( irq ); + + port->MODER = port->MODER & ~mask | mode; + port->PUPDR = port->PUPDR & ~mask | pull; + port->OSPEEDR = port->OSPEEDR & ~mask | speed; + port->AFR[ idx ] = port->AFR[ idx ] & ~altMsk | af; + if( alternate & 1 ) + { // open drain + port->OTYPER |= bit; + } + else + { + port->OTYPER &= ~bit; + } +} + +BOOL CPU_GPIO_Initialize( ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + + CPU_GPIO_SetDebounce( 20 ); // ??? + + for( int i = 0; i < TOTAL_GPIO_PORT; i++ ) + { + g_pinReserved[ i ] = 0; + } + + for( int i = 0; i < Gpio_MaxInt; i++ ) + { + g_int_state[ i ].completion.InitializeForISR( &GPIO_DebounceHandler ); + } + +#if defined (STM32F401xC) || defined (STM32F401xE) || (STM32F411xE) + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + + +#elif defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ + defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + __HAL_RCC_GPIOJ_CLK_ENABLE(); + + +#elif defined (STM32F405xx) || defined (STM32F407xx) || defined (STM32F415xx) || \ + defined (STM32F417xx) + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + +#elif defined (STM32F410Cx) || defined (STM32F410Rx) || defined (STM32F410Tx) + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + +#elif defined (STM32F446xx) + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + +#endif + + + EXTI->IMR = 0; // disable all external interrups; + + CPU_INTC_ActivateInterrupt( EXTI0_IRQn, GPIO_Interrupt0, 0 ); + CPU_INTC_ActivateInterrupt( EXTI1_IRQn, GPIO_Interrupt1, 0 ); + CPU_INTC_ActivateInterrupt( EXTI2_IRQn, GPIO_Interrupt2, 0 ); + CPU_INTC_ActivateInterrupt( EXTI3_IRQn, GPIO_Interrupt3, 0 ); + CPU_INTC_ActivateInterrupt( EXTI4_IRQn, GPIO_Interrupt4, 0 ); + CPU_INTC_ActivateInterrupt( EXTI9_5_IRQn, GPIO_Interrupt5, 0 ); + CPU_INTC_ActivateInterrupt( EXTI15_10_IRQn, GPIO_Interrupt10, 0 ); + + return TRUE; +} + +BOOL CPU_GPIO_Uninitialize( ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + + for( int i = 0; i < Gpio_MaxInt; i++ ) + { + g_int_state[ i ].completion.Abort( ); + } + + EXTI->IMR = 0; // disable all external interrups; + CPU_INTC_DeactivateInterrupt( EXTI0_IRQn ); + CPU_INTC_DeactivateInterrupt( EXTI1_IRQn ); + CPU_INTC_DeactivateInterrupt( EXTI2_IRQn ); + CPU_INTC_DeactivateInterrupt( EXTI3_IRQn ); + CPU_INTC_DeactivateInterrupt( EXTI4_IRQn ); + CPU_INTC_DeactivateInterrupt( EXTI9_5_IRQn ); + CPU_INTC_DeactivateInterrupt( EXTI15_10_IRQn ); + + return TRUE; +} + +UINT32 CPU_GPIO_Attributes( GPIO_PIN pin ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin < Gpio_MaxPins ) + { + return GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; + } + return GPIO_ATTRIBUTE_NONE; +} + +/* + * alternate: + * GPIO_ALT_PRIMARY: GPIO + * GPIO_ALT_MODE_1: Analog + * GPIO_ALT_MODE_2 | AF << 4 | speed << 8: Alternate Function + * GPIO_ALT_MODE_3 | AF << 4 | speed << 8: Alternate Function with open drain + * speed: 0: 2MHZ, 1: 25MHz, 2: 50MHz, 3: 100MHz + */ +void CPU_GPIO_DisablePin( GPIO_PIN pin, GPIO_RESISTOR resistor, UINT32 output, GPIO_ALT_MODE alternate ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin < Gpio_MaxPins ) + { + UINT32 mode = output; + UINT32 altMode = ( UINT32 )alternate & 0x0F; + + if( altMode == 1 ) + mode = 3; // analog + else if( altMode ) + mode = 2; // alternate pin function + + GPIO_Pin_Config( pin, mode, resistor, ( UINT32 )alternate ); + GPIO_Set_Interrupt( pin, NULL, 0, GPIO_INT_NONE, FALSE ); // disable interrupt + } +} + +void CPU_GPIO_EnableOutputPin( GPIO_PIN pin, BOOL initialState ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin < Gpio_MaxPins ) + { + CPU_GPIO_SetPinState( pin, initialState ); + GPIO_Pin_Config( pin, 1, RESISTOR_DISABLED, 0 ); // general purpose output + GPIO_Set_Interrupt( pin, NULL, 0, GPIO_INT_NONE, FALSE ); // disable interrupt + } +} + +BOOL CPU_GPIO_EnableInputPin( GPIO_PIN pin + , BOOL GlitchFilterEnable + , GPIO_INTERRUPT_SERVICE_ROUTINE ISR + , GPIO_INT_EDGE edge + , GPIO_RESISTOR resistor + ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + return CPU_GPIO_EnableInputPin2( pin, GlitchFilterEnable, ISR, 0, edge, resistor ); +} + +BOOL CPU_GPIO_EnableInputPin2( GPIO_PIN pin + , BOOL GlitchFilterEnable + , GPIO_INTERRUPT_SERVICE_ROUTINE ISR + , void* ISR_Param + , GPIO_INT_EDGE edge + , GPIO_RESISTOR resistor + ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin >= Gpio_MaxPins ) + return FALSE; + + GPIO_Pin_Config( pin, 0, resistor, 0 ); // input + return GPIO_Set_Interrupt( pin, ISR, ISR_Param, edge, GlitchFilterEnable ); +} + +BOOL CPU_GPIO_GetPinState( GPIO_PIN pin ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin >= Gpio_MaxPins ) + return FALSE; + + GPIO_TypeDef* port = Port( pin >> 4 ); // pointer to the actual port registers + return ( port->IDR >> ( pin & 0xF ) ) & 1; +} + +void CPU_GPIO_SetPinState( GPIO_PIN pin, BOOL pinState ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin < Gpio_MaxPins ) + { + GPIO_TypeDef* port = Port( pin >> 4 ); // pointer to the actual port registers + UINT16 bit = 1 << ( pin & 0x0F ); + if( pinState ) + port->BSRR = bit; // set bit + else + port->BSRR = (uint32_t)bit << 16U; // reset bit + } +} + +BOOL CPU_GPIO_PinIsBusy( GPIO_PIN pin ) // busy == reserved +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin >= Gpio_MaxPins ) + return FALSE; + + int port = pin >> 4, sh = pin & 0x0F; + return ( g_pinReserved[ port ] >> sh ) & 1; +} + +BOOL CPU_GPIO_ReservePin( GPIO_PIN pin, BOOL fReserve ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( pin >= Gpio_MaxPins ) + return FALSE; + + int port = pin >> 4, bit = 1 << ( pin & 0x0F ); + GLOBAL_LOCK( irq ); + if( fReserve ) + { + if( g_pinReserved[ port ] & bit ) + return FALSE; // already reserved + + g_pinReserved[ port ] |= bit; + } + else + { + g_pinReserved[ port ] &= ~bit; + } + return TRUE; +} + +UINT32 CPU_GPIO_GetDebounce( ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + return g_debounceTicks / ( SLOW_CLOCKS_PER_SECOND / 1000 ); // ticks -> ms +} + +BOOL CPU_GPIO_SetDebounce( INT64 debounceTimeMilliseconds ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + if( debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000 ) + { + g_debounceTicks = CPU_MillisecondsToTicks( ( UINT32 )debounceTimeMilliseconds ); + return TRUE; + } + return FALSE; +} + +INT32 CPU_GPIO_GetPinCount( ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + return Gpio_MaxPins; +} + +void CPU_GPIO_GetPinsMap( UINT8* pins, size_t size ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + for( int i = 0; i < size && i < Gpio_MaxPins; i++ ) + { + pins[ i ] = GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; + } +} + +UINT8 CPU_GPIO_GetSupportedResistorModes( GPIO_PIN pin ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + return ( 1 << RESISTOR_DISABLED ) | ( 1 << RESISTOR_PULLUP ) | ( 1 << RESISTOR_PULLDOWN ); +} + +UINT8 CPU_GPIO_GetSupportedInterruptModes( GPIO_PIN pin ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + return ( 1 << GPIO_INT_EDGE_LOW ) | ( 1 << GPIO_INT_EDGE_HIGH ) | ( 1 << GPIO_INT_EDGE_BOTH ) + | ( 1 << GPIO_INT_LEVEL_LOW ) | ( 1 << GPIO_INT_LEVEL_HIGH ); +} + +UINT32 CPU_GPIO_GetPinDebounce( GPIO_PIN pin ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + UINT32 num = pin & 0x0F; + Int_State& state = g_int_state[ num ]; + + return state.debounceTicks / ( SLOW_CLOCKS_PER_SECOND / 1000 ); // ticks -> ms +} + +BOOL CPU_GPIO_SetPinDebounce( GPIO_PIN pin, INT64 debounceTimeMilliseconds ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + UINT32 num = pin & 0x0F; + Int_State& state = g_int_state[ num ]; + + if( debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000 ) + { + state.debounceTicks = CPU_MillisecondsToTicks( ( UINT32 )debounceTimeMilliseconds ); + return TRUE; + } + return FALSE; +} diff --git a/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj b/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj new file mode 100644 index 000000000..99077398e --- /dev/null +++ b/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj @@ -0,0 +1,75 @@ + + + CMSIS_GPIO + + + {463E3E9A-9C28-444A-B3C7-5EC97A9F9B59} + CMSIS GPIO driver + HAL + CMSIS_GPIO.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\GPIO\dotNetMF.proj + CMSIS_GPIO.$(LIB_EXT).manifest + + + + False + + + False + False + False + + + + DeviceCode\Targets\CMSIS\GPIO + Library + false + 4.0.0.0 + + + + + + + + + From 957afedbdc3e0495ab5439c134ef21c0ece3f679 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 11 Mar 2016 15:42:18 +0000 Subject: [PATCH 021/144] Add CMSIS includes for STM32F4 series --- DeviceCode/include/tinyhal.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/DeviceCode/include/tinyhal.h b/DeviceCode/include/tinyhal.h index 50f175834..95724da8a 100644 --- a/DeviceCode/include/tinyhal.h +++ b/DeviceCode/include/tinyhal.h @@ -1538,6 +1538,22 @@ extern bool g_fDoNotUninitializeDebuggerPort; #include #include +//--// + +// HAL includes for CMSIS vendor implementations + +// STM32F4 series +#if defined STM32F405xx|| defined STM32F415xx|| defined STM32F407xx|| defined STM32F417xx|| \ + defined STM32F427xx|| defined STM32F437xx|| defined STM32F429xx|| defined STM32F439xx|| \ + defined STM32F401xC|| defined STM32F401xE|| defined STM32F410Tx|| defined STM32F410Cx|| \ + defined STM32F410Rx|| defined STM32F411xE|| defined STM32F446xx|| defined STM32F469xx|| \ + defined STM32F479xx + +#include "stm32f4xx_hal.h" + +#endif + + //--// #endif // _TINYHAL_H_ From 70c50f106530dbcfca2310809c38e5042488e5df Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 11 Mar 2016 18:37:26 +0000 Subject: [PATCH 022/144] Remove custom heap (as discussed in issue #417) - remove references to SimpleHeap projects - remove calls to SimpleHeap config and init - remove Simple Heap declarations from TinyHal.h - replace private_malloc and private_free with standard C malloc and free - implement redirect functions for private_malloc and private_free because they were being referenced from the pre-compiled crypto libs - rework scatter files to have a managed heap and standard heap that are managed from C standard code --- Application/MicroBooter/MicroBooter.cpp | 8 +- Application/TinyBooter/Commands.cpp | 45 ++--- .../TinyBooter/ConfigurationManager.cpp | 4 +- Application/TinyBooter/CryptoInterface.cpp | 2 +- Application/TinyBooter/TinyBooter.cpp | 17 +- DeviceCode/include/tinyhal.h | 182 +++++++++--------- DeviceCode/pal/COM/usb/usb.cpp | 8 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 4 +- .../MCBSTM32F400/TinyBooter/allocator.cpp | 12 ++ .../TinyBooter/scatterfile_bootloader_gcc.xml | 86 +++++---- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 8 +- Solutions/MCBSTM32F400/TinyCLR/allocator.cpp | 40 ++-- .../TinyCLR/scatterfile_tinyclr_gcc.xml | 81 ++++---- .../TinyCLR_NONET/TinyCLR_NONET.proj | 8 +- .../MCBSTM32F400/TinyCLR_NONET/allocator.cpp | 38 ++-- .../scatterfile_tinyclr_nonet_gcc.xml | 64 +++--- .../STM32F4DISCOVERY/TinyBooter/allocator.cpp | 12 ++ .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 8 +- .../STM32F4DISCOVERY/TinyCLR/allocator.cpp | 40 ++-- 19 files changed, 376 insertions(+), 291 deletions(-) diff --git a/Application/MicroBooter/MicroBooter.cpp b/Application/MicroBooter/MicroBooter.cpp index 4185b6247..0675649c1 100644 --- a/Application/MicroBooter/MicroBooter.cpp +++ b/Application/MicroBooter/MicroBooter.cpp @@ -3,7 +3,7 @@ // // // Microsoft dotNetMF Project -// Copyright ©2004 Microsoft Corporation +// Copyright �2004 Microsoft Corporation // One Microsoft Way, Redmond, Washington 98052-6399 U.S.A. // All rights reserved. // MICROSOFT CONFIDENTIAL @@ -22,7 +22,7 @@ BOOL MemStreamSeekBlockAddress( BlockStorageStream &stream, UINT32 address ); static SREC_Handler g_SREC; #endif -HAL_DECLARE_CUSTOM_HEAP( SimpleHeap_Allocate, SimpleHeap_Release, SimpleHeap_ReAllocate ); +//HAL_DECLARE_CUSTOM_HEAP( SimpleHeap_Allocate, SimpleHeap_Release, SimpleHeap_ReAllocate ); #pragma arm section zidata = "s_SystemStates" static INT32 s_SystemStates[SYSTEM_STATE_TOTAL_STATES]; @@ -438,8 +438,8 @@ void BootEntryLoader() HeapLocation( BaseAddress, SizeInBytes ); - // Initialize custom heap with heap block returned from CustomHeapLocation - SimpleHeap_Initialize( BaseAddress, SizeInBytes ); + //// Initialize custom heap with heap block returned from CustomHeapLocation + //SimpleHeap_Initialize( BaseAddress, SizeInBytes ); // this is the place where interrupts are enabled after boot for the first time after boot ENABLE_INTERRUPTS(); diff --git a/Application/TinyBooter/Commands.cpp b/Application/TinyBooter/Commands.cpp index c0afa8e00..c50495655 100644 --- a/Application/TinyBooter/Commands.cpp +++ b/Application/TinyBooter/Commands.cpp @@ -80,7 +80,7 @@ struct BitFieldManager { const BlockDeviceInfo* deviceInfo = m_blockDevice->GetDeviceInfo(); - data = (BYTE*)private_malloc( m_region->BytesPerBlock ); + data = (BYTE*)malloc( m_region->BytesPerBlock ); if(data != NULL) { @@ -99,7 +99,7 @@ struct BitFieldManager ConfigurationSector *pCfg = (ConfigurationSector*)data; memset( (void*)&pCfg->SignatureCheck[ 0 ], 0xFF, sizeof(pCfg->SignatureCheck) ); m_blockDevice->Write( m_cfgPhysicalAddress, m_region->BytesPerBlock,data, FALSE ); - private_free(data); + free(data); } else { @@ -150,7 +150,7 @@ struct BitFieldManager else { UINT32 length = m_region->BytesPerBlock; - BYTE* dataptr = (BYTE*)private_malloc(length); + BYTE* dataptr = (BYTE*)malloc(length); if(dataptr != NULL) { @@ -174,7 +174,7 @@ struct BitFieldManager // write back to sector, as we only change one bit from 0 to 1, no need to erase sector m_blockDevice->Write( m_cfgPhysicalAddress, length, dataptr, FALSE ); - private_free(dataptr); + free(dataptr); } } @@ -227,7 +227,7 @@ struct BitFieldManager UINT32 length = sizeof(ConfigurationSector); memset( &m_skipCfgSectorCheck, 0xff, sizeof(m_skipCfgSectorCheck) ); - data = (BYTE*)private_malloc(length); + data = (BYTE*)malloc(length); stream.Device->Read( m_cfgPhysicalAddress, length, (BYTE *)data ); configSector = (ConfigurationSector*)data; m_signatureCheck = NULL; @@ -253,7 +253,7 @@ struct BitFieldManager m_signatureCheck = &m_skipCfgSectorCheck; } - private_free(data); + free(data); } else // XIP device @@ -476,7 +476,7 @@ static bool AccessMemory( UINT32 location, UINT32 lengthInBytes, BYTE* buf, int { if (mode == AccessMemory_Check) { - bufPtr = (BYTE*) private_malloc(NumOfBytes); + bufPtr = (BYTE*) malloc(NumOfBytes); if(!bufPtr) return false; } @@ -486,7 +486,7 @@ static bool AccessMemory( UINT32 location, UINT32 lengthInBytes, BYTE* buf, int { if (mode == AccessMemory_Check) { - private_free(bufPtr); + free(bufPtr); } break; @@ -495,7 +495,7 @@ static bool AccessMemory( UINT32 location, UINT32 lengthInBytes, BYTE* buf, int if (mode == AccessMemory_Check) { *(UINT32*)buf = SUPPORT_ComputeCRC( bufPtr, NumOfBytes, *(UINT32*)buf ); - private_free(bufPtr); + free(bufPtr); } } break; @@ -525,18 +525,18 @@ static bool AccessMemory( UINT32 location, UINT32 lengthInBytes, BYTE* buf, int { if(g_ConfigBuffer != NULL) { - private_free(g_ConfigBuffer); + free(g_ConfigBuffer); } g_ConfigBufferLength = 0; - // g_ConfigBuffer = (UINT8*)private_malloc(pRegion->BytesPerBlock); + // g_ConfigBuffer = (UINT8*)malloc(pRegion->BytesPerBlock); // Just allocate the configuration Sector size, configuration block can be large and not necessary to have that buffer. - g_ConfigBuffer = (UINT8*)private_malloc(g_ConfigBufferTotalSize); + g_ConfigBuffer = (UINT8*)malloc(g_ConfigBufferTotalSize); } else if(g_ConfigBufferTotalSize < ( g_ConfigBufferLength + lengthInBytes)) { - UINT8* tmp = (UINT8*)private_malloc(g_ConfigBufferLength + lengthInBytes); + UINT8* tmp = (UINT8*)malloc(g_ConfigBufferLength + lengthInBytes); if(tmp == NULL) { @@ -545,7 +545,7 @@ static bool AccessMemory( UINT32 location, UINT32 lengthInBytes, BYTE* buf, int memcpy( tmp, g_ConfigBuffer, g_ConfigBufferLength ); - private_free(g_ConfigBuffer); + free(g_ConfigBuffer); g_ConfigBuffer = tmp; } @@ -754,7 +754,7 @@ bool Loader_Engine::SignedDataState::VerifySignature( UINT8* signature, UINT32 l const BlockDeviceInfo* deviceInfo = m_pDevice->GetDeviceInfo(); if(!deviceInfo->Attribute.SupportsXIP) { - signCheckedAddr = (BYTE*)private_malloc(m_dataLength); + signCheckedAddr = (BYTE*)malloc(m_dataLength); if (signCheckedAddr == NULL) { EraseMemoryAndReset(); @@ -764,7 +764,7 @@ bool Loader_Engine::SignedDataState::VerifySignature( UINT8* signature, UINT32 l if(!m_pDevice->Read( m_dataAddress, m_dataLength, signCheckedAddr )) { EraseMemoryAndReset(); - private_free(signCheckedAddr); + free(signCheckedAddr); return false; } @@ -791,7 +791,7 @@ bool Loader_Engine::SignedDataState::VerifySignature( UINT8* signature, UINT32 l if(!deviceInfo->Attribute.SupportsXIP) { - private_free(signCheckedAddr); + free(signCheckedAddr); } return fret; @@ -1076,7 +1076,8 @@ void Loader_Engine::Launch( ApplicationStartAddress startAddress ) if (retAddress != NULL) startAddress = retAddress; - LCD_Clear(); + // FIXME + //LCD_Clear(); DebuggerPort_Flush( m_port ); @@ -1088,8 +1089,8 @@ void Loader_Engine::Launch( ApplicationStartAddress startAddress ) } DISABLE_INTERRUPTS(); - - LCD_Uninitialize(); +// FIXME + //LCD_Uninitialize(); CPU_DisableCaches(); @@ -1542,7 +1543,7 @@ bool Loader_Engine::Monitor_FlashSectorMap( WP_Message* msg ) if(cnt == 1) { - pData = (struct Flash_Sector*)private_malloc(rangeCount * sizeof(struct Flash_Sector)); + pData = (struct Flash_Sector*)malloc(rangeCount * sizeof(struct Flash_Sector)); if(pData == NULL) { @@ -1582,7 +1583,7 @@ bool Loader_Engine::Monitor_FlashSectorMap( WP_Message* msg ) ReplyToCommand(msg, true, false, (void*)pData, rangeCount * sizeof (struct Flash_Sector) ); - private_free(pData); + free(pData); return true; } diff --git a/Application/TinyBooter/ConfigurationManager.cpp b/Application/TinyBooter/ConfigurationManager.cpp index 493fa5512..2474b6f8d 100644 --- a/Application/TinyBooter/ConfigurationManager.cpp +++ b/Application/TinyBooter/ConfigurationManager.cpp @@ -130,7 +130,7 @@ void ConfigurationSectorManager::WriteConfiguration( UINT32 writeOffset, BYTE *d // Copy the whole block to a buffer, for NonXIP or need to erase block if ((eraseWrite) || (!m_fSupportsXIP)) { - configurationInBytes =(BYTE*)private_malloc(writeLengthInBytes); + configurationInBytes =(BYTE*)malloc(writeLengthInBytes); // load data to the local buffer. if (configurationInBytes) @@ -154,7 +154,7 @@ void ConfigurationSectorManager::WriteConfiguration( UINT32 writeOffset, BYTE *d // rewrite from the start of block m_device->Write( m_cfgPhysicalAddress, writeLengthInBytes, configurationInBytes, FALSE ); - private_free(configurationInBytes); + free(configurationInBytes); } diff --git a/Application/TinyBooter/CryptoInterface.cpp b/Application/TinyBooter/CryptoInterface.cpp index caf1afe3c..40ac50f36 100644 --- a/Application/TinyBooter/CryptoInterface.cpp +++ b/Application/TinyBooter/CryptoInterface.cpp @@ -111,7 +111,7 @@ bool CryptoState::VerifySignature( UINT32 keyIndex ) } // free RAM buffer - private_free(g_ConfigBuffer); + free(g_ConfigBuffer); g_ConfigBuffer = NULL; return fRet; diff --git a/Application/TinyBooter/TinyBooter.cpp b/Application/TinyBooter/TinyBooter.cpp index 9b98750bc..5a886e3b7 100644 --- a/Application/TinyBooter/TinyBooter.cpp +++ b/Application/TinyBooter/TinyBooter.cpp @@ -16,11 +16,11 @@ extern bool WaitForTinyBooterUpload( INT32 &timeout_ms ); Loader_Engine g_eng; -//--// +// //--// -HAL_DECLARE_CUSTOM_HEAP( SimpleHeap_Allocate, SimpleHeap_Release, SimpleHeap_ReAllocate ); +// HAL_DECLARE_CUSTOM_HEAP( SimpleHeap_Allocate, SimpleHeap_Release, SimpleHeap_ReAllocate ); -//--// +// //--// void ApplicationEntryPoint() { @@ -32,7 +32,7 @@ void ApplicationEntryPoint() UINT32 SizeInBytes; HeapLocation ( BaseAddress, SizeInBytes ); - SimpleHeap_Initialize( BaseAddress, SizeInBytes ); + //SimpleHeap_Initialize( BaseAddress, SizeInBytes ); g_eng.Initialize( HalSystemConfig.DebuggerPorts[ 0 ] ); @@ -55,10 +55,11 @@ void ApplicationEntryPoint() if(enterBootMode) { - LCD_Clear(); - - hal_fprintf( STREAM_LCD, "TinyBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); - hal_fprintf( STREAM_LCD, "%s Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__ ); + // FIXME + //LCD_Clear(); + // FIXME + //hal_fprintf( STREAM_LCD, "TinyBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + //hal_fprintf( STREAM_LCD, "%s Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__ ); DebuggerPort_Initialize( HalSystemConfig.DebuggerPorts[ 0 ] ); diff --git a/DeviceCode/include/tinyhal.h b/DeviceCode/include/tinyhal.h index 95724da8a..3ac8ddf57 100644 --- a/DeviceCode/include/tinyhal.h +++ b/DeviceCode/include/tinyhal.h @@ -1191,97 +1191,97 @@ UINT32 Stack_MaxUsed(); #endif // defined(PLATFORM_ARM) -//--// - -// Simple Heap is for use by Porting Kit users who need private memory allocation. -/************************************************************************************* -** -** Function: SimpleHeap_Allocate -** -** Synopsis: Initializes simple heap from supplied buffer. -** Pointer to buffer is saved in global variable. -** Later is used for allocation of blocks by SimpleHeap_Allocate -** -** Arguments: [pHeapBuffer] - Pointer to heap buffer. This pointer is saved in global variable, -** later used by SimpleHeap_* function. -** [pHeapBuffer] - Size of memory block pointed by pHeapBuffer -** -**************************************************************************************/ -void SimpleHeap_Initialize( void* pHeapBuffer, UINT32 heapBuufferSize ); - -/********************************************************************** -** -** Function: SimpleHeap_Allocate -** -** Synopsis: Allocates block of memory from heap buffer initialized by SimpleHeap_Initialize -** -** -** Arguments: [len] - Size of block to allocate. -** -** Returns: Pointer to newly allocated memory - or NULL if there is no free memory to accomodate block of size len -**********************************************************************/ -void* SimpleHeap_Allocate ( size_t len ); - -/********************************************************************** -** -** Function: SimpleHeap_Release -** -** Synopsis: Releases memory block allocated by SimpleHeap_Allocate -** -** -** Arguments: [pHeapBlock] - Memory block to release. -** -**********************************************************************/ -void SimpleHeap_Release ( void* pHeapBlock ); - - -/********************************************************************** -** -** Function: SimpleHeap_ReAllocate -** -** Synopsis: Reallocates memory on an existing pointer and copies bck the -** data -** -** Arguments: [pHeapBlock] - Memory block to reallocate. -** Arguments: [len] - Size of block to allocate. -** -**********************************************************************/ -void* SimpleHeap_ReAllocate( void* pHeapBlock, size_t len ); - -/********************************************************************** -** -** Function: SimpleHeap_IsAllocated -** -** Synopsis: Checks if pHeapBlock points to memory block allocated by SimpleHeap_Allocate -** -** Arguments: [pHeapBlock] - Memory block to release. -** -** Returns: TRUE if pHeapBlock points to memory allocated, FALSE otherwise. -**********************************************************************/ -BOOL SimpleHeap_IsAllocated( void* pHeapBlock ); - -/********************************************************************** -** -** Function: HAL_Init_Custom_Heap -** -** Synopsis: Initializes simple heap with memory buffer provided by CustomHeapLocation function. -** -**********************************************************************/ -inline void HAL_Init_Custom_Heap() -{ - UINT8* BaseAddress = 0; - UINT32 SizeInBytes = 0; - - // Retrieve location for Custom Heap. The location is defined in scatter file. - CustomHeapLocation( BaseAddress, SizeInBytes ); - - // Initialize custom heap with heap block returned from CustomHeapLocation - SimpleHeap_Initialize( BaseAddress, SizeInBytes ); -} - - -//--// +// //--// + +// // Simple Heap is for use by Porting Kit users who need private memory allocation. +// /************************************************************************************* +// ** +// ** Function: SimpleHeap_Allocate +// ** +// ** Synopsis: Initializes simple heap from supplied buffer. +// ** Pointer to buffer is saved in global variable. +// ** Later is used for allocation of blocks by SimpleHeap_Allocate +// ** +// ** Arguments: [pHeapBuffer] - Pointer to heap buffer. This pointer is saved in global variable, +// ** later used by SimpleHeap_* function. +// ** [pHeapBuffer] - Size of memory block pointed by pHeapBuffer +// ** +// **************************************************************************************/ +// void SimpleHeap_Initialize( void* pHeapBuffer, UINT32 heapBuufferSize ); + +// /********************************************************************** +// ** +// ** Function: SimpleHeap_Allocate +// ** +// ** Synopsis: Allocates block of memory from heap buffer initialized by SimpleHeap_Initialize +// ** +// ** +// ** Arguments: [len] - Size of block to allocate. +// ** +// ** Returns: Pointer to newly allocated memory +// or NULL if there is no free memory to accomodate block of size len +// **********************************************************************/ +// void* SimpleHeap_Allocate ( size_t len ); + +// /********************************************************************** +// ** +// ** Function: SimpleHeap_Release +// ** +// ** Synopsis: Releases memory block allocated by SimpleHeap_Allocate +// ** +// ** +// ** Arguments: [pHeapBlock] - Memory block to release. +// ** +// **********************************************************************/ +// void SimpleHeap_Release ( void* pHeapBlock ); + + +// /********************************************************************** +// ** +// ** Function: SimpleHeap_ReAllocate +// ** +// ** Synopsis: Reallocates memory on an existing pointer and copies bck the +// ** data +// ** +// ** Arguments: [pHeapBlock] - Memory block to reallocate. +// ** Arguments: [len] - Size of block to allocate. +// ** +// **********************************************************************/ +// void* SimpleHeap_ReAllocate( void* pHeapBlock, size_t len ); + +// /********************************************************************** +// ** +// ** Function: SimpleHeap_IsAllocated +// ** +// ** Synopsis: Checks if pHeapBlock points to memory block allocated by SimpleHeap_Allocate +// ** +// ** Arguments: [pHeapBlock] - Memory block to release. +// ** +// ** Returns: TRUE if pHeapBlock points to memory allocated, FALSE otherwise. +// **********************************************************************/ +// BOOL SimpleHeap_IsAllocated( void* pHeapBlock ); + +// /********************************************************************** +// ** +// ** Function: HAL_Init_Custom_Heap +// ** +// ** Synopsis: Initializes simple heap with memory buffer provided by CustomHeapLocation function. +// ** +// **********************************************************************/ +// inline void HAL_Init_Custom_Heap() +// { +// UINT8* BaseAddress = 0; +// UINT32 SizeInBytes = 0; + +// // Retrieve location for Custom Heap. The location is defined in scatter file. +// CustomHeapLocation( BaseAddress, SizeInBytes ); + +// // Initialize custom heap with heap block returned from CustomHeapLocation +// SimpleHeap_Initialize( BaseAddress, SizeInBytes ); +// } + + +// //--// // hal cleanup for CLR reboot diff --git a/DeviceCode/pal/COM/usb/usb.cpp b/DeviceCode/pal/COM/usb/usb.cpp index 56ea0c0ab..c1d9152d4 100644 --- a/DeviceCode/pal/COM/usb/usb.cpp +++ b/DeviceCode/pal/COM/usb/usb.cpp @@ -330,13 +330,13 @@ int USB_Driver::Configure( int Controller, const USB_DYNAMIC_CONFIGURATION* Conf // if(State->Configuration != &UsbDefaultConfiguration) { - private_free((void*)State->Configuration); + free((void*)State->Configuration); } // // Make sure that we allocate the native configuration buffer, the one passed in will be garbage collected // - State->Configuration = (USB_DYNAMIC_CONFIGURATION*)private_malloc(Length); + State->Configuration = (USB_DYNAMIC_CONFIGURATION*)malloc(Length); // @@ -355,7 +355,7 @@ int USB_Driver::Configure( int Controller, const USB_DYNAMIC_CONFIGURATION* Conf // // The GetConfiguration method will attempt to load the configurate from the config sector in flash -// Since the USB configuration is of variable size, this method may use private_malloc, therefore, +// Since the USB configuration is of variable size, this method may use malloc, therefore, // this method should not be called prior to the heap initialization. // const USB_DYNAMIC_CONFIGURATION * USB_Driver::GetConfiguration( int Controller ) @@ -385,7 +385,7 @@ const USB_DYNAMIC_CONFIGURATION * USB_Driver::GetConfiguration( int Controller ) // If the requested USB configuration was not found in the Flash configuration sector void *pConfig = NULL; - // this calls private_malloc + // this calls malloc if(HAL_CONFIG_BLOCK::ApplyConfig( configName, NULL, 0, (void**)&pConfig ) && pConfig != NULL) { State->Configuration = (const USB_DYNAMIC_CONFIGURATION *)pConfig; diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index d9d1375cf..d7dd9e8a0 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -146,11 +146,11 @@ - + - + diff --git a/Solutions/MCBSTM32F400/TinyBooter/allocator.cpp b/Solutions/MCBSTM32F400/TinyBooter/allocator.cpp index 59ddd068e..36898c3e5 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/allocator.cpp +++ b/Solutions/MCBSTM32F400/TinyBooter/allocator.cpp @@ -41,3 +41,15 @@ void operator delete[] (void*) } //////////////////////////////////////////////////////////////////////////////// + +// remap private_malloc to standard C malloc +void *private_malloc(size_t size) +{ + return malloc(size); +} + +// remap private_free to standard C free +void private_free(void *ptr) +{ + free(ptr); +} diff --git a/Solutions/MCBSTM32F400/TinyBooter/scatterfile_bootloader_gcc.xml b/Solutions/MCBSTM32F400/TinyBooter/scatterfile_bootloader_gcc.xml index 1237b057d..712cb5a07 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/scatterfile_bootloader_gcc.xml +++ b/Solutions/MCBSTM32F400/TinyBooter/scatterfile_bootloader_gcc.xml @@ -127,24 +127,38 @@ (See Section 4.4.4 of the ARM Cortex-M4 Generic User Guide [ ARM DUI 0553A (ID121610) ] ) Since this starts the SRAM block, it's aligned just fine for any size table. --> - - - - + + + + + + + + + + - + - - - - - - + + + + + + + + + + + + + + @@ -153,44 +167,40 @@ - - + + + + + + + + - - - - - + + + + + + + - - - - - - - - - + - - - + + + + - - - - - - - + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 2869bc261..61fd0ea60 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -210,14 +210,14 @@ - + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/allocator.cpp b/Solutions/MCBSTM32F400/TinyCLR/allocator.cpp index 372f95138..b40a5f435 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/allocator.cpp +++ b/Solutions/MCBSTM32F400/TinyCLR/allocator.cpp @@ -8,24 +8,36 @@ //////////////////////////////////////////////////////////////////////////////// -void *operator new( size_t n ) -{ - return private_malloc( n ); -} +// void *operator new( size_t n ) +// { +// return private_malloc( n ); +// } + +// void *operator new[]( size_t n ) +// { +// return private_malloc( n ); +// } + +// void operator delete( void* p ) +// { +// return private_free( p ); +// } + +// void operator delete[]( void* p ) +// { +// return private_free( p ); +// } -void *operator new[]( size_t n ) -{ - return private_malloc( n ); -} +//////////////////////////////////////////////////////////////////////////////// -void operator delete( void* p ) +// remap private_malloc to standard C malloc +void *private_malloc(size_t size) { - return private_free( p ); + return malloc(size); } -void operator delete[]( void* p ) +// remap private_free to standard C free +void private_free(void *ptr) { - return private_free( p ); + free(ptr); } - -//////////////////////////////////////////////////////////////////////////////// diff --git a/Solutions/MCBSTM32F400/TinyCLR/scatterfile_tinyclr_gcc.xml b/Solutions/MCBSTM32F400/TinyCLR/scatterfile_tinyclr_gcc.xml index 4fdb0b8f4..f5fac3661 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/scatterfile_tinyclr_gcc.xml +++ b/Solutions/MCBSTM32F400/TinyCLR/scatterfile_tinyclr_gcc.xml @@ -143,6 +143,9 @@ + + + @@ -162,17 +165,28 @@ - - + + + - + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + - + + + - - - - - - - - + + + + - + @@ -258,9 +259,9 @@ - - - + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 868d7a2c6..79db677e2 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -178,14 +178,14 @@ - + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/allocator.cpp b/Solutions/MCBSTM32F400/TinyCLR_NONET/allocator.cpp index 372f95138..ce58cbb3a 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/allocator.cpp +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/allocator.cpp @@ -8,24 +8,36 @@ //////////////////////////////////////////////////////////////////////////////// -void *operator new( size_t n ) -{ - return private_malloc( n ); +// void *operator new( size_t n ) +// { +// return private_malloc( n ); +// } + +// void *operator new[]( size_t n ) +// { +// return private_malloc( n ); +// } + +// void operator delete( void* p ) +// { +// return private_free( p ); +// } + +// void operator delete[]( void* p ) +// { +// return private_free( p ); } -void *operator new[]( size_t n ) -{ - return private_malloc( n ); -} +//////////////////////////////////////////////////////////////////////////////// -void operator delete( void* p ) +// remap private_malloc to standard C malloc +void *private_malloc(size_t size) { - return private_free( p ); + return malloc(size); } -void operator delete[]( void* p ) +// remap private_free to standard C free +void private_free(void *ptr) { - return private_free( p ); + free(ptr); } - -//////////////////////////////////////////////////////////////////////////////// diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/scatterfile_tinyclr_nonet_gcc.xml b/Solutions/MCBSTM32F400/TinyCLR_NONET/scatterfile_tinyclr_nonet_gcc.xml index c3c7be81f..8faa22065 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/scatterfile_tinyclr_nonet_gcc.xml +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/scatterfile_tinyclr_nonet_gcc.xml @@ -132,17 +132,35 @@ - + + + + + + + + + - + + + + + + + + + + + @@ -157,35 +175,29 @@ - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + - - - + - - - + + + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/allocator.cpp b/Solutions/STM32F4DISCOVERY/TinyBooter/allocator.cpp index 59ddd068e..36898c3e5 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/allocator.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/allocator.cpp @@ -41,3 +41,15 @@ void operator delete[] (void*) } //////////////////////////////////////////////////////////////////////////////// + +// remap private_malloc to standard C malloc +void *private_malloc(size_t size) +{ + return malloc(size); +} + +// remap private_free to standard C free +void private_free(void *ptr) +{ + free(ptr); +} diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index bb8254842..1e0a6e9c9 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -180,14 +180,14 @@ - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/allocator.cpp b/Solutions/STM32F4DISCOVERY/TinyCLR/allocator.cpp index 372f95138..b40a5f435 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/allocator.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/allocator.cpp @@ -8,24 +8,36 @@ //////////////////////////////////////////////////////////////////////////////// -void *operator new( size_t n ) -{ - return private_malloc( n ); -} +// void *operator new( size_t n ) +// { +// return private_malloc( n ); +// } + +// void *operator new[]( size_t n ) +// { +// return private_malloc( n ); +// } + +// void operator delete( void* p ) +// { +// return private_free( p ); +// } + +// void operator delete[]( void* p ) +// { +// return private_free( p ); +// } -void *operator new[]( size_t n ) -{ - return private_malloc( n ); -} +//////////////////////////////////////////////////////////////////////////////// -void operator delete( void* p ) +// remap private_malloc to standard C malloc +void *private_malloc(size_t size) { - return private_free( p ); + return malloc(size); } -void operator delete[]( void* p ) +// remap private_free to standard C free +void private_free(void *ptr) { - return private_free( p ); + free(ptr); } - -//////////////////////////////////////////////////////////////////////////////// From 8659b44c81e0f1fbc8118818fdaeaa9384c22c12 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 14 Mar 2016 09:45:23 +0000 Subject: [PATCH 023/144] Changed ifdef block for STM32 families - now looking for bit definition and not for the family --- .../Targets/CMSIS/GPIO/GPIO_functions.cpp | 83 +++++++------------ 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp index 5b7662b7b..229669b78 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -285,58 +285,37 @@ BOOL CPU_GPIO_Initialize( ) g_int_state[ i ].completion.InitializeForISR( &GPIO_DebounceHandler ); } -#if defined (STM32F401xC) || defined (STM32F401xE) || (STM32F411xE) - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - - -#elif defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ - defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOI_CLK_ENABLE(); - __HAL_RCC_GPIOJ_CLK_ENABLE(); - - -#elif defined (STM32F405xx) || defined (STM32F407xx) || defined (STM32F415xx) || \ - defined (STM32F417xx) - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOI_CLK_ENABLE(); - -#elif defined (STM32F410Cx) || defined (STM32F410Rx) || defined (STM32F410Tx) - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - -#elif defined (STM32F446xx) - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - -#endif + #if defined (RCC_AHB1ENR_GPIOAEN) + __HAL_RCC_GPIOA_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOBEN) + __HAL_RCC_GPIOB_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOCEN) + __HAL_RCC_GPIOC_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIODEN) + __HAL_RCC_GPIOD_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOEEN) + __HAL_RCC_GPIOE_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOFEN) + __HAL_RCC_GPIOF_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOGEN) + __HAL_RCC_GPIOG_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOHEN) + __HAL_RCC_GPIOH_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOIEN) + __HAL_RCC_GPIOI_CLK_ENABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOJEN) + __HAL_RCC_GPIOJ_CLK_ENABLE(); + #endif + EXTI->IMR = 0; // disable all external interrups; From b7bf2b14906910244bf0226d193328da926ac841 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 14 Mar 2016 10:45:15 +0000 Subject: [PATCH 024/144] Added project for HAL CMSIS I2C --- DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj | 78 ++++++ .../Targets/CMSIS/I2C/i2c_functions.cpp | 254 ++++++++++++++++++ 2 files changed, 332 insertions(+) create mode 100644 DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj create mode 100644 DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj b/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj new file mode 100644 index 000000000..2e2b34d72 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj @@ -0,0 +1,78 @@ + + + CMSIS_I2C + + + {1745D6CE-8C0D-4796-B9CC-70185FE7F192} + CMSIS I2C driver + HAL + CMSIS_I2C.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\I2C\dotNetMF.proj + CMSIS_I2C.$(LIB_EXT).manifest + + + + False + + + False + False + False + + + + DeviceCode\Targets\CMSIS\I2C + Library + false + 4.0.0.0 + + + true + + + + + + + + + diff --git a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp new file mode 100644 index 000000000..771b49b49 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp @@ -0,0 +1,254 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** I2C Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +////////////////////////////////////// +// to simplify, as NETMF only use I2C1, other ports will be despised +////////////////////////////////////// +// #if I2C_PORT == 2 +// #define I2Cx I2C2 +// #define I2Cx_EV_IRQn I2C2_EV_IRQn +// #define I2Cx_ER_IRQn I2C2_ER_IRQn +// #define RCC_APB1ENR_I2CxEN RCC_APB1ENR_I2C2EN +// #define RCC_APB1RSTR_I2CxRST RCC_APB1RSTR_I2C2RST +// #if !defined(I2C_SCL_PIN) +// #define I2C_SCL_PIN 26 // PB10 +// #endif +// #if !defined(I2C_SDA_PIN) +// #define I2C_SDA_PIN 27 // PB11 +// #endif +// #elif I2C_PORT == 3 +// #define I2Cx I2C3 +// #define I2Cx_EV_IRQn I2C3_EV_IRQn +// #define I2Cx_ER_IRQn I2C3_ER_IRQn +// #define RCC_APB1ENR_I2CxEN RCC_APB1ENR_I2C3EN +// #define RCC_APB1RSTR_I2CxRST RCC_APB1RSTR_I2C3RST +// #if !defined(I2C_SCL_PIN) +// #define I2C_SCL_PIN 8 // PA8 +// #endif +// #if !defined(I2C_SDA_PIN) +// #define I2C_SDA_PIN 41 // PC9 +// #endif +// #else // use I2C1 by default + #define I2Cx I2C1 + #define I2Cx_EV_IRQn I2C1_EV_IRQn + #define I2Cx_ER_IRQn I2C1_ER_IRQn + #define RCC_APB1ENR_I2CxEN RCC_APB1ENR_I2C1EN + #define RCC_APB1RSTR_I2CxRST RCC_APB1RSTR_I2C1RST + #if !defined(I2C_SCL_PIN) + #define I2C_SCL_PIN 22 // PB6 + #endif + #if !defined(I2C_SDA_PIN) + #define I2C_SDA_PIN 23 // PB7 + #endif +// #endif + +static I2C_HAL_XACTION* currentI2CXAction; +static I2C_HAL_XACTION_UNIT* currentI2CUnit; + + +void I2C_ER_Interrupt (void* param) // Error Interrupt Handler +{ + INTERRUPT_START + + // pre: + // I2C_SR1_BERR | I2C_SR1_ARLO | I2C_SR1_AF | I2C_SR1_TIMEOUT + + I2C_HAL_XACTION* xAction = currentI2CXAction; + + I2Cx->SR1 = 0; // reset errors + xAction->Signal(I2C_HAL_XACTION::c_Status_Aborted); // calls XActionStop() + + INTERRUPT_END +} + +void I2C_EV_Interrupt (void* param) // Event Interrupt Handler +{ + INTERRUPT_START + + // pre: + // I2C_SR1_SB | I2C_SR1_ADDR | I2C_SR1_BTF | I2C_CR2_ITBUFEN & (I2C_SR1_RXNE | I2C_SR1_TXE) + + I2C_HAL_XACTION* xAction = currentI2CXAction; + I2C_HAL_XACTION_UNIT* unit = currentI2CUnit; + + int todo = unit->m_bytesToTransfer; + int sr1 = I2Cx->SR1; // read status register + int sr2 = I2Cx->SR2; // clear ADDR bit + int cr1 = I2Cx->CR1; // initial control register + + if (unit->IsReadXActionUnit()) { // read transaction + if (sr1 & I2C_SR1_SB) { // start bit + if (todo == 1) { + I2Cx->CR1 = (cr1 &= ~I2C_CR1_ACK); // last byte nack + } else if (todo == 2) { + I2Cx->CR1 = (cr1 |= I2C_CR1_POS); // prepare 2nd byte nack + } + UINT8 addr = xAction->m_address << 1; // address bits + I2Cx->DR = addr + 1; // send header byte with read bit; + } else { + if (sr1 & I2C_SR1_ADDR) { // address sent + if (todo == 1) { + I2Cx->CR1 = (cr1 |= I2C_CR1_STOP); // send stop after single byte + } else if (todo == 2) { + I2Cx->CR1 = (cr1 &= ~I2C_CR1_ACK); // last byte nack + } + } else { + while (sr1 & I2C_SR1_RXNE) { // data available + if (todo == 2) { // 2 bytes remaining + I2Cx->CR1 = (cr1 |= I2C_CR1_STOP); // stop after last byte + } else if (todo == 3) { // 3 bytes remaining + if (!(sr1 & I2C_SR1_BTF)) break; // assure 2 bytes are received + I2Cx->CR1 = (cr1 &= ~I2C_CR1_ACK); // last byte nack + } + UINT8 data = I2Cx->DR; // read data + *(unit->m_dataQueue.Push()) = data; // save data + unit->m_bytesTransferred++; + unit->m_bytesToTransfer = --todo; // update todo + sr1 = I2Cx->SR1; // update status register copy + } + } + if (todo == 1) { + I2Cx->CR2 |= I2C_CR2_ITBUFEN; // enable I2C_SR1_RXNE interrupt + } + } + } else { // write transaction + if (sr1 & I2C_SR1_SB) { // start bit + UINT8 addr = xAction->m_address << 1; // address bits + I2Cx->DR = addr; // send header byte with write bit; + } else { + while (todo && (sr1 & I2C_SR1_TXE)) { + I2Cx->DR = *(unit->m_dataQueue.Pop()); // next data byte; + unit->m_bytesTransferred++; + unit->m_bytesToTransfer = --todo; // update todo + sr1 = I2Cx->SR1; // update status register copy + } + if (!(sr1 & I2C_SR1_BTF)) todo++; // last byte not yet sent + } + + } + + if (todo == 0) { // all received or all sent + if (!xAction->ProcessingLastUnit()) { // start next unit + I2Cx->CR2 &= ~I2C_CR2_ITBUFEN; // disable I2C_SR1_RXNE interrupt + currentI2CUnit = xAction->m_xActionUnits[ xAction->m_current++ ]; + I2Cx->CR1 = I2C_CR1_PE | I2C_CR1_START | I2C_CR1_ACK; // send restart + } else { + xAction->Signal(I2C_HAL_XACTION::c_Status_Completed); // calls XActionStop() + } + } + + INTERRUPT_END +} + + +BOOL I2C_Internal_Initialize() +{ + NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + + if (!(RCC->APB1ENR & RCC_APB1ENR_I2CxEN)) { // only once + currentI2CXAction = NULL; + currentI2CUnit = NULL; + + // set pins to AF4 and open drain + CPU_GPIO_DisablePin( I2C_SDA_PIN, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)0x43 ); + CPU_GPIO_DisablePin( I2C_SCL_PIN, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)0x43 ); + + RCC->APB1ENR |= RCC_APB1ENR_I2CxEN; // enable I2C clock + RCC->APB1RSTR = RCC_APB1RSTR_I2CxRST; // reset I2C peripheral + RCC->APB1RSTR = 0; + + I2Cx->CR2 = SYSTEM_APB1_CLOCK_HZ / 1000000; // APB1 clock in MHz + I2Cx->CCR = (SYSTEM_APB1_CLOCK_HZ / 1000 / 2 - 1) / 100 + 1; // 100KHz + I2Cx->TRISE = SYSTEM_APB1_CLOCK_HZ / (1000 * 1000) + 1; // 1ns; + I2Cx->OAR1 = 0x4000; // init address register + + I2Cx->CR1 = I2C_CR1_PE; // enable peripheral + + CPU_INTC_ActivateInterrupt(I2Cx_EV_IRQn, I2C_EV_Interrupt, 0); + CPU_INTC_ActivateInterrupt(I2Cx_ER_IRQn, I2C_ER_Interrupt, 0); + } + + return TRUE; +} + +BOOL I2C_Internal_Uninitialize() +{ + NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + + CPU_INTC_DeactivateInterrupt(I2Cx_EV_IRQn); + CPU_INTC_DeactivateInterrupt(I2Cx_ER_IRQn); + I2Cx->CR1 = 0; // disable peripheral + RCC->APB1ENR &= ~RCC_APB1ENR_I2CxEN; // disable I2C clock + + return TRUE; +} + +void I2C_Internal_XActionStart( I2C_HAL_XACTION* xAction, bool repeatedStart ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + + currentI2CXAction = xAction; + currentI2CUnit = xAction->m_xActionUnits[ xAction->m_current++ ]; + + UINT32 ccr = xAction->m_clockRate + (xAction->m_clockRate2 << 8); + if (I2Cx->CCR != ccr) { // set clock rate and rise time + UINT32 trise; + if (ccr & I2C_CCR_FS) { // fast => 0.3ns rise time + trise = SYSTEM_APB1_CLOCK_HZ / (1000 * 3333) + 1; // PCLK1 / 3333kHz + } else { // slow => 1.0ns rise time + trise = SYSTEM_APB1_CLOCK_HZ / (1000 * 1000) + 1; // PCLK1 / 1000kHz + } + I2Cx->CR1 = 0; // disable peripheral + I2Cx->CCR = ccr; + I2Cx->TRISE = trise; + } + + I2Cx->CR1 = I2C_CR1_PE; // enable and reset special flags + I2Cx->SR1 = 0; // reset error flags + I2Cx->CR2 |= I2C_CR2_ITEVTEN | I2C_CR2_ITERREN; // enable interrupts + I2Cx->CR1 = I2C_CR1_PE | I2C_CR1_START | I2C_CR1_ACK; // send start +} + +void I2C_Internal_XActionStop() +{ + NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + if (I2Cx->SR2 & I2C_SR2_BUSY && !(I2Cx->CR1 & I2C_CR1_STOP)) { + I2Cx->CR1 |= I2C_CR1_STOP; // send stop + } + I2Cx->CR2 &= ~(I2C_CR2_ITBUFEN | I2C_CR2_ITEVTEN | I2C_CR2_ITERREN); // disable interrupts + currentI2CXAction = NULL; + currentI2CUnit = NULL; +} + +void I2C_Internal_GetClockRate( UINT32 rateKhz, UINT8& clockRate, UINT8& clockRate2) +{ + NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + if (rateKhz > 400) rateKhz = 400; // upper limit + UINT32 ccr; + if (rateKhz <= 100) { // slow clock + ccr = (SYSTEM_APB1_CLOCK_HZ / 1000 / 2 - 1) / rateKhz + 1; // round up + if (ccr > 0xFFF) ccr = 0xFFF; // max divider + } else { // fast clock + ccr = (SYSTEM_APB1_CLOCK_HZ / 1000 / 3 - 1) / rateKhz + 1; // round up + ccr |= 0x8000; // set fast mode (duty cycle 1:2) + } + clockRate = (UINT8)ccr; // low byte + clockRate2 = (UINT8)(ccr >> 8); // high byte +} + +void I2C_Internal_GetPins(GPIO_PIN& scl, GPIO_PIN& sda) +{ + scl = I2C_SCL_PIN; + sda = I2C_SDA_PIN; +} From dd4d34739073f9bc4708392c1ea6e0f6625f049e Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 14 Mar 2016 17:40:17 +0000 Subject: [PATCH 025/144] Added project for HAL CMSIS SPI --- .../Targets/CMSIS/SPI/SPI_functions.cpp | 567 ++++++++++++++++++ DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj | 78 +++ 2 files changed, 645 insertions(+) create mode 100644 DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj diff --git a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp new file mode 100644 index 000000000..6aaf151fb --- /dev/null +++ b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp @@ -0,0 +1,567 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** SPI Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +/* +struct SPI_CONFIGURATION +{ + GPIO_PIN DeviceCS; + BOOL CS_Active; // False = LOW active, TRUE = HIGH active + BOOL MSK_IDLE; // False = LOW during idle, TRUE = HIGH during idle + BOOL MSK_SampleEdge; // False = sample falling edge, TRUE = samples on rising + BOOL MD_16bits; + UINT32 Clock_RateKHz; + UINT32 CS_Setup_uSecs; + UINT32 CS_Hold_uSecs; + UINT32 SPI_mod; + GPIO_FLAG BusyPin; +}; +*/ + +typedef SPI_TypeDef* ptr_SPI_TypeDef; + +// IO addresses +// SPI channels availability according to STM32F4 variant + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) +// static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = {SPI1, SPI2, SPI3, SPI4}; + +// #elif defined (STM32F411xE) +// static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = {SPI1, SPI2, SPI3, SPI4, SPI5}; + +// #elif defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ +// defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) +// static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = {SPI1, SPI2, SPI3, SPI4, SPI5, SPI6}; + +// #elif defined (STM32F405xx) || defined (STM32F407xx) || defined (STM32F415xx) || \ +// defined (STM32F417xx) +// static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = {SPI1, SPI2, SPI3}; + +// #elif defined (STM32F410Cx) || defined (STM32F410Rx) +// static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = {SPI1, SPI2, SPI5}; + +// #elif defined (STM32F410Tx) +// static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = {SPI1}; + +// #endif + +static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = SPI_PORTS; + + +// Pins +// static const BYTE g_Spi_Sclk_Pins[] = SPI_SCLK_PINS; +// static const BYTE g_Spi_Miso_Pins[] = SPI_MISO_PINS; +// static const BYTE g_Spi_Mosi_Pins[] = SPI_MOSI_PINS; +static BYTE g_Spi_Sclk_Pins[ARRAYSIZE(g_STM32_Spi_Port)]; +static BYTE g_Spi_Miso_Pins[ARRAYSIZE(g_STM32_Spi_Port)]; +static BYTE g_Spi_Mosi_Pins[ARRAYSIZE(g_STM32_Spi_Port)]; + +#define SPI_MODS ARRAYSIZE_CONST_EXPR(g_Spi_Sclk_Pins) // number of modules + + +BOOL CPU_SPI_Initialize() +{ + for (int i = 0; i < ARRAYSIZE( g_STM32_Spi_Port ); i++) + { + if(g_STM32_Spi_Port[i] == SPI1) + { + g_Spi_Sclk_Pins[i] = 5; // PA5 + g_Spi_Miso_Pins[i] = 6; // PA6 + g_Spi_Mosi_Pins[i] = 7; // PA7 + } + #if defined (SPI2) + else if(g_STM32_Spi_Port[i] == SPI2) + { + g_Spi_Sclk_Pins[i] = 29; // PB13 + g_Spi_Miso_Pins[i] = 30; // PB14 + g_Spi_Mosi_Pins[i] = 31; // PB15 + } + #endif + #if defined (SPI3) + else if(g_STM32_Spi_Port[i] == SPI3) + { + g_Spi_Sclk_Pins[i] = 42; // PC10 + g_Spi_Miso_Pins[i] = 43; // PC11 + g_Spi_Mosi_Pins[i] = 44; // PC12 + } + #endif + #if defined (SPI4) + else if(g_STM32_Spi_Port[i] == SPI4) + { + g_Spi_Sclk_Pins[i] = 76; // PE12 + g_Spi_Miso_Pins[i] = 77; // PE13 + g_Spi_Mosi_Pins[i] = 78; // PE14 + } + #endif + #if defined (SPI5) + else if(g_STM32_Spi_Port[i] == SPI5) + { + g_Spi_Sclk_Pins[i] = 87; // PF7 + g_Spi_Miso_Pins[i] = 88; // PF8 + g_Spi_Mosi_Pins[i] = 89; // PF9 + } + #endif + #if defined (SPI6) + else if(g_STM32_Spi_Port[i] == SPI6) + { + g_Spi_Sclk_Pins[i] = 109; // PG13 + g_Spi_Miso_Pins[i] = 108; // PG12 + g_Spi_Mosi_Pins[i] = 110; // PG14 + } + #endif + } + return TRUE; +} + +void CPU_SPI_Uninitialize() +{ +} + +BOOL CPU_SPI_nWrite16_nRead16( const SPI_CONFIGURATION& Configuration, UINT16* Write16, INT32 WriteCount, UINT16* Read16, INT32 ReadCount, INT32 ReadStartOffset ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + if(!CPU_SPI_Xaction_Start( Configuration )) + { + return FALSE; + } + + SPI_XACTION_16 Transaction; + Transaction.Read16 = Read16; + Transaction.ReadCount = ReadCount; + Transaction.ReadStartOffset = ReadStartOffset; + Transaction.Write16 = Write16; + Transaction.WriteCount = WriteCount; + Transaction.SPI_mod = Configuration.SPI_mod; + if(!CPU_SPI_Xaction_nWrite16_nRead16( Transaction )) + { + return FALSE; + } + + return CPU_SPI_Xaction_Stop( Configuration ); +} + +BOOL CPU_SPI_nWrite8_nRead8( const SPI_CONFIGURATION& Configuration, UINT8* Write8, INT32 WriteCount, UINT8* Read8, INT32 ReadCount, INT32 ReadStartOffset ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + if(!CPU_SPI_Xaction_Start( Configuration )) + { + return FALSE; + } + + SPI_XACTION_8 Transaction; + Transaction.Read8 = Read8; + Transaction.ReadCount = ReadCount; + Transaction.ReadStartOffset = ReadStartOffset; + Transaction.Write8 = Write8; + Transaction.WriteCount = WriteCount; + Transaction.SPI_mod = Configuration.SPI_mod; + if(!CPU_SPI_Xaction_nWrite8_nRead8( Transaction )) + { + return FALSE; + } + + return CPU_SPI_Xaction_Stop( Configuration ); +} + +BOOL CPU_SPI_Xaction_Start( const SPI_CONFIGURATION& Configuration ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + if (Configuration.SPI_mod >= SPI_MODS) + return FALSE; + + switch (Configuration.SPI_mod) + { + case 0: + RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; + break; // enable SPI1 clock + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ +// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ +// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ +// defined (STM32F410Rx) +#if defined (SPI2) + + case 1: + RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; + break; // enable SPI2 clock +#endif + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ +// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ +// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ +// defined (STM32F410Rx) +#if defined (SPI3) + + case 2: + RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; + break; // enable SPI3 clock +#endif + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ +// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F405xx) +#if defined (SPI4) + + case 3: + RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; + break; // enable SPI4 clock +#endif + +// #if defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F410Cx) || defined (STM32F410Rx) +#if defined (SPI5) + + case 4: + RCC->APB2ENR |= RCC_APB2ENR_SPI5EN; + break; // enable SPI5 clock +#endif + +// #if defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ +// defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) +#if defined (SPI6) + + case 5: + RCC->APB2ENR |= RCC_APB2ENR_SPI6EN; + break; // enable SPI6 clock +#endif + + } + + ptr_SPI_TypeDef spi = g_STM32_Spi_Port[Configuration.SPI_mod]; + + // set mode bits + UINT32 cr1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_SPE; + if (Configuration.MD_16bits) + { + cr1 |= SPI_CR1_DFF; + } + + if (Configuration.MSK_IDLE) + { + cr1 |= SPI_CR1_CPOL | SPI_CR1_CPHA; + } + + if (!Configuration.MSK_SampleEdge) + { + cr1 ^= SPI_CR1_CPHA; // toggle phase + } + + // set clock prescaler + UINT32 clock = SYSTEM_APB2_CLOCK_HZ / 2000; // SPI1 on APB2 + if (Configuration.SPI_mod > 0 && Configuration.SPI_mod < 3) + { + clock = SYSTEM_APB1_CLOCK_HZ / 2000; // SPI2/3 on APB1 + } + + if (clock > Configuration.Clock_RateKHz << 3) + { + clock >>= 4; + cr1 |= SPI_CR1_BR_2; + } + + if (clock > Configuration.Clock_RateKHz << 1) + { + clock >>= 2; + cr1 |= SPI_CR1_BR_1; + } + + if (clock > Configuration.Clock_RateKHz) + { + cr1 |= SPI_CR1_BR_0; + } + spi->CR1 = cr1; + + // I/O setup + GPIO_PIN msk, miso, mosi; + CPU_SPI_GetPins(Configuration.SPI_mod, msk, miso, mosi); + UINT32 alternate = 0x252; // AF5, speed = 2 (50MHz) + if (Configuration.SPI_mod == 2 && mosi != 54) + { + alternate = 0x262; // SPI3 on AF6 + } + + CPU_GPIO_DisablePin( msk, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); + CPU_GPIO_DisablePin( miso, RESISTOR_DISABLED, 0, (GPIO_ALT_MODE)alternate); + CPU_GPIO_DisablePin( mosi, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); + + // CS setup + CPU_GPIO_EnableOutputPin( Configuration.DeviceCS, Configuration.CS_Active ); + if(Configuration.CS_Setup_uSecs) + { + HAL_Time_Sleep_MicroSeconds_InterruptEnabled( Configuration.CS_Setup_uSecs ); + } + + return TRUE; +} + +BOOL CPU_SPI_Xaction_Stop( const SPI_CONFIGURATION& Configuration ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + + ptr_SPI_TypeDef spi = g_STM32_Spi_Port[Configuration.SPI_mod]; + while (spi->SR & SPI_SR_BSY); // wait for completion + spi->CR1 = 0; // disable SPI + + if(Configuration.CS_Hold_uSecs) + { + HAL_Time_Sleep_MicroSeconds_InterruptEnabled( Configuration.CS_Hold_uSecs ); + } + + CPU_GPIO_SetPinState( Configuration.DeviceCS, !Configuration.CS_Active ); + GPIO_RESISTOR res = RESISTOR_PULLDOWN; + if (Configuration.MSK_IDLE) + { + res = RESISTOR_PULLUP; + } + + GPIO_PIN msk, miso, mosi; + CPU_SPI_GetPins(Configuration.SPI_mod, msk, miso, mosi); + CPU_GPIO_EnableInputPin( msk, FALSE, NULL, GPIO_INT_NONE, res ); + CPU_GPIO_EnableInputPin( miso, FALSE, NULL, GPIO_INT_NONE, RESISTOR_PULLDOWN ); + CPU_GPIO_EnableInputPin( mosi, FALSE, NULL, GPIO_INT_NONE, RESISTOR_PULLDOWN ); + + switch (Configuration.SPI_mod) + { + case 0: + RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN; + break; // disable SPI1 clock + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ +// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ +// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ +// defined (STM32F410Rx) +#if defined (SPI2) + + case 1: + RCC->APB1ENR &= ~RCC_APB1ENR_SPI2EN; + break; // disable SPI2 clock +#endif + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ +// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ +// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ +// defined (STM32F410Rx) +#if defined (SPI3) + + case 2: + RCC->APB1ENR &= ~RCC_APB1ENR_SPI3EN; + break; // disable SPI3 clock +#endif + +// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ +// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F405xx) +#if defined (SPI4) + + case 3: + RCC->APB2ENR &= ~RCC_APB2ENR_SPI4EN; + break; // disable SPI4 clock +#endif + +// #if defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ +// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ +// defined (STM32F479xx) || defined (STM32F410Cx) || defined (STM32F410Rx) +#if defined (SPI5) + + case 4: + RCC->APB2ENR &= ~RCC_APB2ENR_SPI5EN; + break; // disable SPI5 clock +#endif + +// #if defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ +// defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) +#if defined (SPI6) + + case 5: + RCC->APB2ENR &= ~RCC_APB2ENR_SPI6EN; + break; // disable SPI6 clock +#endif + + } + + return TRUE; +} + +BOOL CPU_SPI_Xaction_nWrite16_nRead16( SPI_XACTION_16& Transaction ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + + ptr_SPI_TypeDef spi = g_STM32_Spi_Port[Transaction.SPI_mod]; + + UINT16* outBuf = Transaction.Write16; + UINT16* inBuf = Transaction.Read16; + INT32 outLen = Transaction.WriteCount; + INT32 num, ii, i = 0; + + if (Transaction.ReadCount) + { // write & read + num = Transaction.ReadCount + Transaction.ReadStartOffset; + ii = -Transaction.ReadStartOffset; + } + else + { // write only + num = outLen; + ii = 0x80000000; // disable write to inBuf + } + + UINT16 out = outBuf[0]; + UINT16 in; + spi->DR = out; // write first word + while (++i < num) + { + if (i < outLen) + { + out = outBuf[i]; // get new output data + } + + while (!(spi->SR & SPI_SR_RXNE)) + { /* wait for Rx buffer full */ } + + in = spi->DR; // read input + spi->DR = out; // start output + if (ii >= 0) + inBuf[ii] = in; // save input data + ii++; + } + while (!(spi->SR & SPI_SR_RXNE)) + { /* wait for Rx buffer full */ } + + in = spi->DR; // read last input + if (ii >= 0) + inBuf[ii] = in; // save last input + + return TRUE; +} + +BOOL CPU_SPI_Xaction_nWrite8_nRead8( SPI_XACTION_8& Transaction ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + + ptr_SPI_TypeDef spi = g_STM32_Spi_Port[Transaction.SPI_mod]; + + UINT8* outBuf = Transaction.Write8; + UINT8* inBuf = Transaction.Read8; + INT32 outLen = Transaction.WriteCount; + INT32 num, ii, i = 0; + + if (Transaction.ReadCount) + { // write & read + num = Transaction.ReadCount + Transaction.ReadStartOffset; + ii = -Transaction.ReadStartOffset; + } + else + { // write only + num = outLen; + ii = 0x80000000; // disable write to inBuf + } + + UINT8 out = outBuf[0]; + UINT16 in; + spi->DR = out; // write first word + while (++i < num) + { + if (i < outLen) + { + out = outBuf[i]; // get new output data + } + + while (!(spi->SR & SPI_SR_RXNE)) + { /* wait for Rx buffer full */ } + + in = spi->DR; // read input + spi->DR = out; // start output + if (ii >= 0) + { + inBuf[ii] = (UINT8)in; // save input data + } + ii++; + } + while (!(spi->SR & SPI_SR_RXNE)) + { /* wait for Rx buffer full */ } + + in = spi->DR; // read last input + if (ii >= 0) + { + inBuf[ii] = (UINT8)in; // save last input + } + + return TRUE; +} + +UINT32 CPU_SPI_PortsCount() +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + return SPI_MODS; +} + +void CPU_SPI_GetPins( UINT32 spi_mod, GPIO_PIN& msk, GPIO_PIN& miso, GPIO_PIN& mosi ) +{ + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); + msk = miso = mosi = GPIO_PIN_NONE; + if (spi_mod >= SPI_MODS) + { + return; + } + + msk = g_Spi_Sclk_Pins[spi_mod]; + miso = g_Spi_Miso_Pins[spi_mod]; + mosi = g_Spi_Mosi_Pins[spi_mod]; +} + +UINT32 CPU_SPI_MinClockFrequency( UINT32 spi_mod ) +{ + // Theoretically this could read the Clock and PLL configurations + // to determine an actual realistic minimum, however there doesn't + // seem to be a lot of value in that since the CPU_SPI_Xaction_Start + // has to determine the applicability of the selected speed at the + // time a transaction is started anyway. + return 1; +} + +UINT32 CPU_SPI_MaxClockFrequency( UINT32 spi_mod ) +{ + // Theoretically this could read the Clock and PLL configurations + // to determine an actual realistic maximum, however there doesn't + // seem to be a lot of value in that since the CPU_SPI_Xaction_Start + // has to determine the applicability of the selected speed at the + // time a transaction is started anyway. + // Max supported (e.g. not overclocked) AHB speed / 2 + return 48000000; +} + +UINT32 CPU_SPI_ChipSelectLineCount( UINT32 spi_mod ) +{ + // This could maintain a map of the actual pins + // that are available for a particular port. + // (Not all pins can be mapped to all ports.) + // The value of doing that, however, is marginal + // since the count of possible chip selects doesn't + // really help in determining which chip select to + // use so just report the total count of all GPIO + // pins as possible so that the selected Chip select + // line coresponds to a GPIO pin number directly + // without needing any additional translation/mapping. + return TOTAL_GPIO_PINS; +} diff --git a/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj b/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj new file mode 100644 index 000000000..dcf6bedc2 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj @@ -0,0 +1,78 @@ + + + CMSIS_SPI + + + {A6C6B6D5-2B03-497F-97DA-108BFBA2E8AC} + CMSIS SPI driver + HAL + CMSIS_SPI.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\SPI\dotNetMF.proj + CMSIS_SPI.$(LIB_EXT).manifest + + + + False + + + False + False + False + + + + DeviceCode\Targets\CMSIS\SPI + Library + false + 4.0.0.0 + + + true + + + + + + + + + From 33ac6dcda033f9a3c60b4ad7f97fa593084de83c Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 14 Mar 2016 17:52:15 +0000 Subject: [PATCH 026/144] Rename file i2c_functions.cpp to I2C_functions.cpp --- DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj | 2 +- DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj b/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj index 2e2b34d72..6a7a61d17 100644 --- a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj +++ b/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj @@ -71,7 +71,7 @@ - + diff --git a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp index 771b49b49..5f500c4fb 100644 --- a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp +++ b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp @@ -11,7 +11,7 @@ // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include +#include ////////////////////////////////////// // to simplify, as NETMF only use I2C1, other ports will be despised ////////////////////////////////////// From 025713325e3d29cf5cf6d7ba8c4fd60e40c777b9 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 15 Mar 2016 01:54:58 +0000 Subject: [PATCH 027/144] Correct comments and projects cleanup --- .../Targets/CMSIS/GPIO/GPIO_functions.cpp | 2 +- DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj | 42 ------------------- DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj | 42 ------------------- .../Targets/CMSIS/I2C/i2c_functions.cpp | 4 +- .../Targets/CMSIS/SPI/SPI_functions.cpp | 2 +- DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj | 42 ------------------- 6 files changed, 4 insertions(+), 130 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp index 229669b78..e9fe1b4dc 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -5,7 +5,7 @@ // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // // Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda. Based in original code from Oberon microsystems, Inc. // // *** GPIO Driver *** // diff --git a/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj b/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj index 99077398e..e325a5b2b 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj +++ b/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj @@ -18,48 +18,6 @@ False False False - - - DeviceCode\Targets\CMSIS\GPIO Library false diff --git a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj b/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj index 6a7a61d17..cbbe04d6a 100644 --- a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj +++ b/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj @@ -18,48 +18,6 @@ False False False - - - DeviceCode\Targets\CMSIS\I2C Library false diff --git a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp index 5f500c4fb..b9966fe45 100644 --- a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp +++ b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp @@ -5,7 +5,7 @@ // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // // Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda. Based in original code from Oberon microsystems, Inc. // // *** I2C Driver *** // @@ -13,7 +13,7 @@ #include ////////////////////////////////////// -// to simplify, as NETMF only use I2C1, other ports will be despised +// to simplify, becasue NETMF only use a single I2C1 port ////////////////////////////////////// // #if I2C_PORT == 2 // #define I2Cx I2C2 diff --git a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp index 6aaf151fb..2d522e106 100644 --- a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp +++ b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp @@ -5,7 +5,7 @@ // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // // Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda. Based in original code from Oberon microsystems, Inc. // // *** SPI Driver *** // diff --git a/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj b/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj index dcf6bedc2..cb73f5ce5 100644 --- a/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj +++ b/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj @@ -18,48 +18,6 @@ False False False - - - DeviceCode\Targets\CMSIS\SPI Library false From 285a06cecae3316a7efc930794a8e5c97206ab34 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 15 Mar 2016 02:02:08 +0000 Subject: [PATCH 028/144] Add CMSIS HAL project for STM32F4xx series - This projects glues the HAL and PAL for pure CMSIS - Includes new approach for features selection at solution level - Minor changes in several files to make them suitable for CMSIS --- .gitignore | 8 +- .../CortexMx/GlobalLock/SmartPtr_cortex.cpp | 3 + .../Processors/CortexMx/ItmPort/ItmPort.cpp | 2 - .../CortexMx/TinyHal/GNU_S/OtherHandlers.s | 82 +++ .../CortexMx/TinyHal/RVD_S/OtherHandlers.s | 82 +++ .../Initialization/SystemState.cpp | 0 DeviceCode/Initialization/tinyhal.cpp | 490 +++------------ .../STM32F4xx/GNU_S/startup_tinyBooter.s | 534 ++++++++++++++++ .../Native/STM32F4xx/GNU_S/startup_tinyCLR.s | 575 ++++++++++++++++++ .../Targets/Native/STM32F4xx/Int_Handlers.cpp | 189 ++++++ .../Targets/Native/STM32F4xx/Int_Handlers.h | 73 +++ .../Native/STM32F4xx/STM32F4xx.settings | 50 ++ .../Native/STM32F4xx/SystemClock_Config.c | 80 +++ .../Targets/Native/STM32F4xx/dotNetMF.proj | 96 +++ .../Native/STM32F4xx/dotNetMF_loader.proj | 136 +++++ .../Native/STM32F4xx/processor_selector.h | 109 ++++ .../Native/STM32F4xx/stm32f4xx_hal_msp.c | 108 ++++ 17 files changed, 2211 insertions(+), 406 deletions(-) create mode 100644 DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/GNU_S/OtherHandlers.s create mode 100644 DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/RVD_S/OtherHandlers.s rename {Solutions/STM32F4DISCOVERY/DeviceCode => DeviceCode}/Initialization/SystemState.cpp (100%) create mode 100644 DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s create mode 100644 DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s create mode 100644 DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp create mode 100644 DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h create mode 100644 DeviceCode/Targets/Native/STM32F4xx/STM32F4xx.settings create mode 100644 DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c create mode 100644 DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj create mode 100644 DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj create mode 100644 DeviceCode/Targets/Native/STM32F4xx/processor_selector.h create mode 100644 DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c diff --git a/.gitignore b/.gitignore index 4c189f5a6..5bea6acd7 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,11 @@ ReleaseNotesCrypto.txt *.opendb *.dbgconf -# STM32 Cube and installation folders +# STM32 Cube STM32Cube/* !STM32Cube/ReadMe.m -DeviceCode/Targets/Native/ST/STM32F4XX/* + +# CMSIS PAL and HAL folders +DeviceCode/Targets/Native/STM32F4XX/HAL_Driver +!DeviceCode/Targets/Native/*.proj +!DeviceCode/Targets/Native/*.settings diff --git a/DeviceCode/Cores/arm/Processors/CortexMx/GlobalLock/SmartPtr_cortex.cpp b/DeviceCode/Cores/arm/Processors/CortexMx/GlobalLock/SmartPtr_cortex.cpp index 5d1fd943f..caee7ee4e 100644 --- a/DeviceCode/Cores/arm/Processors/CortexMx/GlobalLock/SmartPtr_cortex.cpp +++ b/DeviceCode/Cores/arm/Processors/CortexMx/GlobalLock/SmartPtr_cortex.cpp @@ -11,11 +11,14 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include +#include "processor_selector.h" + #define __CMSIS_GENERIC /* disable NVIC and Systick functions */ #if defined (CORTEX_M7) #include "core_cm7.h" #elif defined (CORTEX_M4) + #define __FPU_PRESENT 1 #include "core_cm4.h" #elif defined (CORTEX_M3) #include "core_cm3.h" diff --git a/DeviceCode/Cores/arm/Processors/CortexMx/ItmPort/ItmPort.cpp b/DeviceCode/Cores/arm/Processors/CortexMx/ItmPort/ItmPort.cpp index a62c83c75..7b8cdfd60 100644 --- a/DeviceCode/Cores/arm/Processors/CortexMx/ItmPort/ItmPort.cpp +++ b/DeviceCode/Cores/arm/Processors/CortexMx/ItmPort/ItmPort.cpp @@ -1,7 +1,5 @@ #include -#include "cmsis_generic.h" - // only one "generic" port supported for ITM tracing messages to hardware debugger // so pInstance is ignored static int ItmPort_Write( void* pInstance, const char* Data, size_t size ) diff --git a/DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/GNU_S/OtherHandlers.s b/DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/GNU_S/OtherHandlers.s new file mode 100644 index 000000000..d426718d6 --- /dev/null +++ b/DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/GNU_S/OtherHandlers.s @@ -0,0 +1,82 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@ This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. +@@ Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +@@ +@@ Licensed under the Apache License, Version 2.0 (the "License")@ you may not use these files except in compliance with the License. +@@ You may obtain a copy of the License at: +@@ +@@ http://www.apache.org/licenses/LICENSE-2.0 +@@ +@@ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, +@@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing +@@ permissions and limitations under the License. +@@ +@@ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +@@ NOTE: +@@ This is only an example for use as a template in creating SoC specific versions and is not intended to be used directly +@@ for any particular SoC. Each SoC must provide a version of these handlers (and the corresponding VectorTables) that is +@@ specific to the SoC. +@@ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .syntax unified + .arch armv7-m + .thumb + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Dummy Exception Handlers (infinite loops which can be overloaded since they are exported with weak linkage ) + + .section SectionForBootsrtapOperations, "ax", %progbits + + .global FAULT_SubHandler + .extern FAULT_Handler @ void FAULT_Handler(UINT32*, UINT32) + + .global HARD_Breakpoint + .extern HARD_Breakpoint_Handler @ HARD_Breakpoint_Handler(UINT32*) + +@ This serves as an adapter from the Cortex-M exception signature +@ to map back to the original CLR API designed around the older ARM +@ mode exception architecture. + .section i.FAULT_SubHandler, "ax", %progbits + .thumb_func + +FAULT_SubHandler: + @ on entry, we have an exception frame on the stack: + @ SP+00: R0 + @ SP+04: R1 + @ SP+08: R2 + @ SP+12: R3 + @ SP+16: R12 + @ SP+20: LR + @ SP+24: PC + @ SP+28: PSR + @ R0-R12 are not overwritten yet + add sp,sp,#16 @ remove R0-R3 + push {r0-r11} @ store R0-R11 + mov r0,sp + @ R0+00: R0-R12 + @ R0+52: LR + @ R0+56: PC + @ R0+60: PSR + mrs r1,IPSR @ exception number + b FAULT_Handler + @ never expect to return + + .section i.HARD_Breakpoint, "ax", %progbits + HARD_Breakpoint: + @ on entry, were are being called from C/C++ in Thread mode + add sp,sp,#-4 @ space for PSR + push {r14} @ store original PC + push {r0-r12,r14} @ store R0 - R12, LR + mov r0,sp + mrs r1,XPSR + str r1,[r0,#60] @ store PSR + @ R0+00: R0-R12 + @ R0+52: LR + @ R0+56: PC + @ R0+60: PSR + b HARD_Breakpoint_Handler + @ never expect to return + +.end diff --git a/DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/RVD_S/OtherHandlers.s b/DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/RVD_S/OtherHandlers.s new file mode 100644 index 000000000..61087e420 --- /dev/null +++ b/DeviceCode/Cores/arm/Processors/CortexMx/TinyHal/RVD_S/OtherHandlers.s @@ -0,0 +1,82 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. +;; Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +;; +;; Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. +;; You may obtain a copy of the License at: +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing +;; permissions and limitations under the License. +;; +;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +;; NOTE: +;; This is only an example for use as a template in creating SoC specific versions and is not intended to be used directly +;; for any particular SoC. Each SoC must provide a version of these handlers (and the corresponding VectorTables) that is +;; specific to the SoC. +;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + PRESERVE8 + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + AREA |SectionForBootstrapOperations|, CODE, READONLY + + + EXPORT FAULT_SubHandler + IMPORT FAULT_Handler ; void FAULT_Handler(UINT32*, UINT32) + + EXPORT HARD_Breakpoint + IMPORT HARD_Breakpoint_Handler ; HARD_Breakpoint_Handler(UINT32*) + +; This serves as an adapter from the Cortex-M exception signature +; to map back to the original CLR API designed around the older ARM +; mode exception architecture. + AREA ||i.FAULT_SubHandler||, CODE, READONLY +FAULT_SubHandler + ; on entry, we have an exception frame on the stack: + ; SP+00: R0 + ; SP+04: R1 + ; SP+08: R2 + ; SP+12: R3 + ; SP+16: R12 + ; SP+20: LR + ; SP+24: PC + ; SP+28: PSR + ; R0-R12 are not overwritten yet + add sp,sp,#16 ; remove R0-R3 + push {r0-r11} ; store R0-R11 + mov r0,sp + ; R0+00: R0-R12 + ; R0+52: LR + ; R0+56: PC + ; R0+60: PSR + mrs r1,IPSR ; exception number + b FAULT_Handler + ; never expect to return + + ;***************************************************************************** + + AREA ||i.HARD_Breakpoint||, CODE, READONLY +HARD_Breakpoint + ; on entry, were are being called from C/C++ in Thread mode + add sp,sp,#-4 ; space for PSR + push {r14} ; store original PC + push {r0-r12,r14} ; store R0 - R12, LR + mov r0,sp + mrs r1,XPSR + str r1,[r0,#60] ; store PSR + ; R0+00: R0-R12 + ; R0+52: LR + ; R0+56: PC + ; R0+60: PSR + b HARD_Breakpoint_Handler + ; never expect to return + + ;***************************************************************************** + + END \ No newline at end of file diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/SystemState.cpp b/DeviceCode/Initialization/SystemState.cpp similarity index 100% rename from Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/SystemState.cpp rename to DeviceCode/Initialization/SystemState.cpp diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index 48f42b66d..e1ddeea81 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -8,11 +8,11 @@ #include #endif -//--// +extern "C" void SystemClock_Config(void); -// we need this to force inclusion from library at link time -#pragma import(EntryPoint) +//--// +//extern UINT32 _end; #undef TRACE_ALWAYS #define TRACE_ALWAYS 0x00000001 @@ -22,194 +22,6 @@ //--// -#if !defined(BUILD_RTM) && !defined(PLATFORM_ARM_OS_PORT) - -UINT32 Stack_MaxUsed() -{ - // this is the value we check for stack overruns - const UINT32 StackCheckVal = 0xBAADF00D; - - size_t size = (size_t)&StackTop - (size_t)&StackBottom; - UINT32* ptr = (UINT32*)&StackBottom; - - DEBUG_TRACE1(TRACE_ALWAYS, "Stack Max = %d\r\n", size); - - while(*ptr == StackCheckVal) - { - size -= 4; - ptr++; - } - - DEBUG_TRACE1(TRACE_ALWAYS, "Stack Used = %d\r\n", size); - - return size; -} - -#endif // !defined(BUILD_RTM) - -//--// -// this is the first C function called after bootstrapping ourselves into ram - -// these define the region to zero initialize -extern UINT32 Image$$ER_RAM_RW$$ZI$$Base; -extern UINT32 Image$$ER_RAM_RW$$ZI$$Length; - -// here is the execution address/length of code to move from FLASH to RAM -#define IMAGE_RAM_RO_BASE Image$$ER_RAM_RO$$Base -#define IMAGE_RAM_RO_LENGTH Image$$ER_RAM_RO$$Length - -extern UINT32 IMAGE_RAM_RO_BASE; -extern UINT32 IMAGE_RAM_RO_LENGTH; - -// here is the execution address/length of data to move from FLASH to RAM -extern UINT32 Image$$ER_RAM_RW$$Base; -extern UINT32 Image$$ER_RAM_RW$$Length; - -// here is the load address of the RAM code/data -#define LOAD_RAM_RO_BASE Load$$ER_RAM_RO$$Base - -extern UINT32 LOAD_RAM_RO_BASE; -extern UINT32 Load$$ER_RAM_RW$$Base; - -//--// - -#if defined(TARGETLOCATION_RAM) - -extern UINT32 Load$$ER_RAM$$Base; -extern UINT32 Image$$ER_RAM$$Length; - -#elif defined(TARGETLOCATION_FLASH) - -extern UINT32 Load$$ER_FLASH$$Base; -extern UINT32 Image$$ER_FLASH$$Length; - -#else - !ERROR -#endif - -UINT32 LOAD_IMAGE_Start; -UINT32 LOAD_IMAGE_Length; -UINT32 LOAD_IMAGE_CalcCRC; - -// -// The ARM linker is not keeping FirstEntry.obj (and EntryPoint) for RTM builds of NativeSample (possibly others) -// The --keep FirstEntry.obj linker option also does not work, however, this unused method call to EntryPoint does the trick. -// -void KEEP_THE_LINKER_HAPPY_SINCE_KEEP_IS_NOT_WORKING() -{ - EntryPoint(); -} - -//--// - -#pragma arm section code = "SectionForBootstrapOperations" - -static void __section("SectionForBootstrapOperations") Prepare_Copy( UINT32* src, UINT32* dst, UINT32 len ) -{ - if(dst != src) - { - INT32 extraLen = len & 0x00000003; - len = len & 0xFFFFFFFC; - - while(len != 0) - { - *dst++ = *src++; - - len -= 4; - } - - // thumb2 code can be multiples of 2... - - UINT8 *dst8 = (UINT8*) dst, *src8 = (UINT8*) src; - - while (extraLen > 0) - { - *dst8++ = *src8++; - - extraLen--; - } - } -} - -static void __section("SectionForBootstrapOperations") Prepare_Zero( UINT32* dst, UINT32 len ) -{ - INT32 extraLen = len & 0x00000003; - len = len & 0xFFFFFFFC; - - while(len != 0) - { - *dst++ = 0; - - len -= 4; - } - - // thumb2 code can be multiples of 2... - - UINT8 *dst8 = (UINT8*) dst; - - while (extraLen > 0) - { - *dst8++ = 0; - - extraLen--; - } -} - -void __section("SectionForBootstrapOperations") PrepareImageRegions() -{ - // - // Copy RAM RO regions into proper location. - // - { - UINT32* src = (UINT32*)&LOAD_RAM_RO_BASE; - UINT32* dst = (UINT32*)&IMAGE_RAM_RO_BASE; - UINT32 len = (UINT32 )&IMAGE_RAM_RO_LENGTH; - - Prepare_Copy( src, dst, len ); - } - - // - // Copy RAM RW regions into proper location. - // - { - UINT32* src = (UINT32*)&Load$$ER_RAM_RW$$Base; - UINT32* dst = (UINT32*)&Image$$ER_RAM_RW$$Base; - UINT32 len = (UINT32)&Image$$ER_RAM_RW$$Length; - - Prepare_Copy( src, dst, len ); - } - - // - // Initialize RAM ZI regions. - // - { - UINT32* dst = (UINT32*)&Image$$ER_RAM_RW$$ZI$$Base; - UINT32 len = (UINT32 )&Image$$ER_RAM_RW$$ZI$$Length; - - Prepare_Zero( dst, len ); - } -} - -#pragma arm section code - -//--// - -static void InitCRuntime() -{ -#if (defined(HAL_REDUCESIZE) || defined(PLATFORM_EMULATED_FLOATINGPOINT)) - - // Don't initialize floating-point on small builds. - -#else - -#if !defined(__GNUC__) - _fp_init(); -#endif - - setlocale( LC_ALL, "" ); -#endif -} - #if !defined(BUILD_RTM) static UINT32 g_Boot_RAMConstants_CRC = 0; #endif @@ -349,20 +161,36 @@ void HAL_EnterBooterMode() bool g_fDoNotUninitializeDebuggerPort = false; void HAL_Initialize() -{ +{ +#if defined(PLATFORM_ARM_OS_PORT) + // Interrupts must be enabled to handle calls to OS + // (Network stack uses the CMSIS-RTX OS, which uses + // SVC calls, which will hard fault if the interrupts + // are disabled at the Svc instruction ) + // SystemInit handles this for the startup from reset + // However, this is also called from the CLR when doing + // a soft reboot. + __enable_irq(); +#endif + HAL_CONTINUATION::InitializeList(); HAL_COMPLETION ::InitializeList(); - HAL_Init_Custom_Heap(); - Time_Initialize(); Events_Initialize(); +#ifdef FEATURE_GPIO CPU_GPIO_Initialize(); +#endif + +#ifdef FEATURE_SPI CPU_SPI_Initialize(); +#endif +#if !defined(PLATFORM_ARM_OS_PORT) // this is the place where interrupts are enabled after boot for the first time after boot ENABLE_INTERRUPTS(); +#endif // have to initialize the blockstorage first, as the USB device needs to update the configure block @@ -372,6 +200,7 @@ void HAL_Initialize() BlockStorageList::InitializeDevices(); +#ifdef FEATURE_FS FS_Initialize(); FileSystemVolumeList::Initialize(); @@ -379,27 +208,47 @@ void HAL_Initialize() FS_AddVolumes(); FileSystemVolumeList::InitializeVolumes(); +#endif +#ifdef FEATURE_LCD LCD_Initialize(); +#endif CPU_InitializeCommunication(); +#ifdef FEATURE_I2C I2C_Initialize(); +#endif +#ifdef FEATURE_BUTTONS Buttons_Initialize(); +#endif +#ifdef FEATURE_BACKLIGHT // Initialize the backlight to a default off state BackLight_Initialize(); +#endif +#ifdef FEATURE_PIEZO Piezo_Initialize(); +#endif +#ifdef FEATURE_BATTERY Battery_Initialize(); - +#endif +#ifdef FEATURE_CHARGER Charger_Initialize(); +#endif PalEvent_Initialize(); +#ifdef FEATURE_GESTURE Gesture_Initialize(); +#endif + +#ifdef FEATURE_INK Ink_Initialize(); +#endif + TimeService_Initialize(); #if defined(ENABLE_NATIVE_PROFILER) @@ -435,23 +284,44 @@ void HAL_Uninitialize() } } +#ifdef FEATURE_LCD LCD_Uninitialize(); +#endif +#ifdef FEATURE_I2C I2C_Uninitialize(); +#endif +#ifdef FEATURE_BUTTONS Buttons_Uninitialize(); +#endif +#ifdef FEATURE_BACKLIGHT // Initialize the backlight to a default off state BackLight_Uninitialize(); +#endif +#ifdef FEATURE_PIEZO Piezo_Uninitialize(); +#endif +#ifdef FEATURE_BATTERY Battery_Uninitialize(); +#endif + +#ifdef FEATURE_CHARGER Charger_Uninitialize(); +#endif TimeService_UnInitialize(); +#ifdef FEATURE_INK Ink_Uninitialize(); +#endif + +#ifdef FEATURE_GESTURE Gesture_Uninitialize(); +#endif + PalEvent_Uninitialize(); SOCKETS_CloseConnections(); @@ -460,17 +330,23 @@ void HAL_Uninitialize() CPU_UninitializeCommunication(); #endif +#ifdef FEATURE_FS FileSystemVolumeList::UninitializeVolumes(); +#endif BlockStorageList::UnInitializeDevices(); USART_CloseAllPorts(); +#ifdef FEATURE_SPI CPU_SPI_Uninitialize(); +#endif HAL_UnReserveAllGpios(); +#ifdef FEATURE_GPIO CPU_GPIO_Uninitialize(); +#endif DISABLE_INTERRUPTS(); @@ -483,62 +359,14 @@ void HAL_Uninitialize() extern "C" { - -void BootEntry() +// defined as weak to allow it to be overriden by equivalent function at Solution level +__attribute__((weak)) int main(void) { - -#if (defined(GCCOP) && defined(COMPILE_THUMB)) - -// the IRQ_Handler routine generated from the compiler is incorrect, the return address LR has been decrement twice -// it decrements LR at the first instruction of IRQ_handler and then before return, it decrements LR again. -// temporary fix is at the ARM_Vector ( IRQ), make it jump to 2nd instruction of IRQ_handler to skip teh first subs LR, LR #4; -// - volatile int *ptr; - ptr =(int*) 0x28; - *ptr = *ptr +4; -#endif - - -#if !defined(BUILD_RTM) && !defined(PLATFORM_ARM_OS_PORT) - { - int marker; - int* ptr = &marker - 1; // This will point to the current top of the stack. - int* end = &StackBottom; - - while(ptr >= end) - { - *ptr-- = 0xBAADF00D; - } - } -#endif - - // these are needed for patch access - -#if defined(TARGETLOCATION_RAM) - - LOAD_IMAGE_Start = (UINT32)&Load$$ER_RAM$$Base; - LOAD_IMAGE_Length = (UINT32)&Image$$ER_RAM$$Length; - -#elif defined(TARGETLOCATION_FLASH) - - LOAD_IMAGE_Start = (UINT32)&Load$$ER_FLASH$$Base; - LOAD_IMAGE_Length = (UINT32)&Image$$ER_FLASH$$Length; - -#else - !ERROR -#endif - - InitCRuntime(); - - LOAD_IMAGE_Length += (UINT32)&IMAGE_RAM_RO_LENGTH + (UINT32)&Image$$ER_RAM_RW$$Length; - -#if !defined(BUILD_RTM) - g_Boot_RAMConstants_CRC = Checksum_RAMConstants(); -#endif - - - CPU_Initialize(); - + HAL_Init(); + + /* Configure the system clock */ + SystemClock_Config(); + HAL_Time_Initialize(); HAL_Initialize(); @@ -559,7 +387,7 @@ void BootEntry() memset ( BaseAddress, 0, SizeInBytes ); lcd_printf("\f"); - + lcd_printf("%-15s\r\n", HalName); lcd_printf("%-15s\r\n", "Build Date:"); lcd_printf(" %-13s\r\n", __DATE__); @@ -603,23 +431,23 @@ void BootEntry() #if !defined(BUILD_RTM) +void lcd_printf( const char* format, ... ); + void debug_printf( const char* format, ... ) { - char buffer[256]; + char buffer[256] = {0}; va_list arg_ptr; va_start( arg_ptr, format ); int len = hal_vsnprintf( buffer, sizeof(buffer)-1, format, arg_ptr ); - // flush existing characters - DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); - - // write string - DebuggerPort_Write( HalSystemConfig.DebugTextPort, buffer, len, 0 ); - - // flush new characters - DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); + { // take CLR lock to send whole message + GLOBAL_LOCK(clrLock); + // send characters directly to the trace port + for( char* p = buffer; *p != '\0' || p-buffer >= 256; ++p ) + ITM_SendChar( *p ); + } va_end( arg_ptr ); } @@ -634,145 +462,3 @@ void lcd_printf( const char* format, ... ) } #endif // !defined(BUILD_RTM) - -//--// - -volatile INT32 SystemStates[SYSTEM_STATE_TOTAL_STATES]; - - -#if defined(PLATFORM_ARM) - - void SystemState_SetNoLock( SYSTEM_STATE State ) -{ - //ASSERT(State < SYSTEM_STATE_TOTAL_STATES); - - ASSERT_IRQ_MUST_BE_OFF(); - - SystemStates[State]++; - - //ASSERT(SystemStates[State] > 0); -} - - -void SystemState_ClearNoLock( SYSTEM_STATE State ) -{ - //ASSERT(State < SYSTEM_STATE_TOTAL_STATES); - - ASSERT_IRQ_MUST_BE_OFF(); - - SystemStates[State]--; - - //ASSERT(SystemStates[State] >= 0); -} - - - BOOL SystemState_QueryNoLock( SYSTEM_STATE State ) -{ - //ASSERT(State < SYSTEM_STATE_TOTAL_STATES); - - ASSERT_IRQ_MUST_BE_OFF(); - - return (SystemStates[State] > 0) ? TRUE : FALSE; -} - -#endif - - - -void SystemState_Set( SYSTEM_STATE State ) -{ - GLOBAL_LOCK(irq); - - SystemState_SetNoLock( State ); -} - - -void SystemState_Clear( SYSTEM_STATE State ) -{ - GLOBAL_LOCK(irq); - - SystemState_ClearNoLock( State ); -} - - -BOOL SystemState_Query( SYSTEM_STATE State ) -{ - GLOBAL_LOCK(irq); - - return SystemState_QueryNoLock( State ); -} - -//--// - -#if !defined(BUILD_RTM) - -UINT32 Checksum_RAMConstants() -{ - UINT32* RAMConstants = (UINT32*)&IMAGE_RAM_RO_BASE; - UINT32 Length = (UINT32 )&IMAGE_RAM_RO_LENGTH; - - UINT32 CRC; - - // start with Vector area CRC - CRC = SUPPORT_ComputeCRC( NULL, 0x00000020, 0 ); - - // add the big block of RAM constants to CRC - CRC = SUPPORT_ComputeCRC( RAMConstants, Length, CRC ); - - return CRC; -} - -void Verify_RAMConstants( void* arg ) -{ - BOOL BreakpointOnError = (BOOL)arg; - - //debug_printf("RAMC\r\n"); - - UINT32 CRC = Checksum_RAMConstants(); - - if(CRC != g_Boot_RAMConstants_CRC) - { - hal_printf( "RAMC CRC:%08x!=%08x\r\n", CRC, g_Boot_RAMConstants_CRC ); - - UINT32* ROMConstants = (UINT32*)&LOAD_RAM_RO_BASE; - UINT32* RAMConstants = (UINT32*)&IMAGE_RAM_RO_BASE; - UINT32 Length = (UINT32 )&IMAGE_RAM_RO_LENGTH; - BOOL FoundMismatch = FALSE; - - for(int i = 0; i < Length; i += 4) - { - if(*RAMConstants != *ROMConstants) - { - hal_printf( "RAMC %08x:%08x!=%08x\r\n", (UINT32) RAMConstants, *RAMConstants, *ROMConstants ); - - if(!FoundMismatch) lcd_printf( "\fRAMC:%08x\r\n", (UINT32)RAMConstants ); // first one only to LCD - FoundMismatch = TRUE; - } - - RAMConstants++; - ROMConstants++; - } - - if(!FoundMismatch) - { - // the vector area must have been trashed - lcd_printf("\fRAMC:%08x\r\n", (UINT32) NULL); - RAMConstants = (UINT32*)NULL; - - for(int i = 0; i < 32; i += 4) - { - hal_printf( "RAMC %02x:%08x\r\n", i, *RAMConstants ); - lcd_printf( "%02x:%08x\r\n" , i, *RAMConstants++ ); - } - } - - DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); - - if(BreakpointOnError) - { - HARD_BREAKPOINT(); - } - } -} - -#endif // !defined(BUILD_RTM) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s new file mode 100644 index 000000000..a3bc310a5 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s @@ -0,0 +1,534 @@ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author Eclo Solutions + * @brief STM32F407xx Devices vector table for GCC based toolchains. Based in startup_stm32f407xx.s V2.4.3 + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global ARM_Vectors +.global Default_Handler +.global HeapBegin +.global HeapEnd +.global _end + + .global Fault_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/* start address of managed heap */ +.word HeapBegin +/* end address of managed heap */ +.word HeapEnd + + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type ARM_Vectors, %object + .size ARM_Vectors, .-ARM_Vectors + + +ARM_Vectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + /*.weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler*/ + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s new file mode 100644 index 000000000..25e052656 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s @@ -0,0 +1,575 @@ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author Eclo Solutions + * @brief STM32F407xx Devices vector table for GCC based toolchains. Based in startup_stm32f407xx.s V2.4.3 + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global ARM_Vectors +.global Default_Handler + + .global EntryPoint + + .global StackBottom + .global StackTop + .global HeapBegin + .global HeapEnd + .global CustomHeapBegin + .global CustomHeapEnd + .global __initial_sp + + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + + .section SectionForStackBottom, "w", %nobits +StackBottom: + .word 0 + + .section SectionForStackTop, "w", %nobits +__initial_sp: +StackTop: + .word 0 + + .section SectionForHeapBegin, "w", %nobits +HeapBegin: + .word 0 + + .section SectionForHeapEnd, "w", %nobits +HeapEnd: + .word 0 + + .section SectionForCustomHeapBegin, "w", %nobits +CustomHeapBegin: + .word 0 + + .section SectionForCustomHeapEnd, "w", %nobits +CustomHeapEnd: + .word 0 + + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + +.section SectionForPowerOnReset, "ax", %progbits +PowerOnReset: + + .word __initial_sp + .word Reset_Handler @ Reset + .word Fault_Handler @ NMI + .word Fault_Handler @ Hard Fault + .word Fault_Handler @ MMU Fault + .word Fault_Handler @ Bus Fault + .word Fault_Handler @ Usage Fault + + .text + .thumb + .thumb_func + .align 2 + .weak Reset_Handler + .type Reset_Handler, %function + + .section i.EntryPoint, "ax", %progbits +EntryPoint: +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .VectorTable,"a",%progbits + .type ARM_Vectors, %object + .size ARM_Vectors, .-ARM_Vectors + + +ARM_Vectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp new file mode 100644 index 000000000..2d3584886 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp @@ -0,0 +1,189 @@ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2016 STMicroelectronics + * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "Int_Handlers.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern PCD_HandleTypeDef hpcd; + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ + +/******************************************************************************/ +/* Cortex-M4 Processor Exceptions Handlers */ +/******************************************************************************/ + +/** + * @brief This function handles NMI exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard Fault exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Memory Manage exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Bus Fault exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Usage Fault exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles SVCall exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Debug Monitor exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void DebugMon_Handler(void) +{ +} + +/** + * @brief This function handles PendSVC exception. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles SysTick Handler. + * @param None + * @retval None + */ +// defined as weak so it can be overriden at the solution +__weak void SysTick_Handler(void) +{ + HAL_IncTick(); + + /* Call user callback */ + HAL_SYSTICK_IRQHandler(); + +} + +/******************************************************************************/ +/* STM32F4xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) , for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f407xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles External line 0 interrupt request. + * @param None + * @retval None + */ +void EXTI0_IRQHandler(void) +{ + //HAL_GPIO_EXTI_IRQHandler(KEY_BUTTON_PIN); +} + +/** + * @brief This function handles USB-On-The-Go FS/HS global interrupt request. + * @param None + * @retval None + */ +void OTG_FS_IRQHandler(void) +{ + HAL_PCD_IRQHandler(&hpcd); +} +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h new file mode 100644 index 000000000..513927bea --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h @@ -0,0 +1,73 @@ +/** + ****************************************************************************** + * @file Int_Handlers.h + * @brief This file contains the headers for interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2016 STMicroelectronics + * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __Int_Handlers_H +#define __Int_Handlers_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "core_cm4.h" + +// /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +// standard names. */ +// #define vPortSVCHandler SVC_Handler +// #define xPortPendSVHandler PendSV_Handler +//#define mySysTick_Handler SysTick_Handler + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void EXTI0_IRQHandler(void); +void OTG_FS_IRQHandler(void); +#ifdef __cplusplus +} +#endif + +#endif /* __Int_Handlers_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/STM32F4xx.settings b/DeviceCode/Targets/Native/STM32F4xx/STM32F4xx.settings new file mode 100644 index 000000000..74f1c5982 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/STM32F4xx.settings @@ -0,0 +1,50 @@ + + + + STM32F4xx + Cortex-M4 + THUMB2FP + {AA5A88E3-BA72-4B26-9603-72516BBABAE3} + + + + + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\STM32F4xx.settings + ARM + Cortex + THUMB2FP + Native + + + + + + + + + Cortex-M4.fp + {40DBF35F-0EBE-46A7-BC9E-AC26FC7F739A} + + + Cortex-M4.fp + {5C2FD367-F42C-4AF9-96F6-AAD40F45EFCD} + + + cortex-m4 + {64411CEA-8E47-452D-84C5-B980E16A953B} + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c b/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c new file mode 100644 index 000000000..1f31d1cb5 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing +// permissions and limitations under the License. +// +#include "stm32f4xx_hal.h" + +void SystemClock_Config(void) __attribute__((weak)); + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 168000000 + * HCLK(Hz) = 168000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 336 + * PLL_P = 2 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * @param None + * @retval None + */ +// defined as weak to allow it to be overriden by equivalent function at Solution level +void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_4); + + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); +} diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj new file mode 100644 index 000000000..706f18731 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -0,0 +1,96 @@ + + + TinyHal_STM32F4xx + {49A36823-B4BC-439C-9223-E5395314A422} + + + STM32F4xx HAL library + HAL + TinyHal_STM32F4xx.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\dotNetMF.proj + TinyHal_STM32F4xx.$(LIB_EXT).manifest + HAL + + + False + + + False + False + False + DeviceCode\Targets\Native\STM32F4xx + false + 4.0.0.0 + + + + + Library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj new file mode 100644 index 000000000..b7862af91 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -0,0 +1,136 @@ + + + + TinyHal_loader_STM32F4xx + {004F0043-0024-0097-95A3-64C26394C72A} + + + STM32F4xx HAL library (for boot loaders) + HAL + TinyHAL_loader_STM32F4xx.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\dotNetMF_loader.proj + TinyHAL_loader_STM32F4xx.$(LIB_EXT).manifest + HAL + + + False + + + False + False + False + DeviceCode\Targets\Native\STM32F4xx + true + false + 4.0.0.0 + + + + + Library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h b/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h new file mode 100644 index 000000000..f578a2373 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// STM32F2/F4 specific definitions +// +///////////////////////////////////////////////////////////////////////////////////////////// + + +#ifndef _STM32F4_PROCESSOR_SELECTOR_H_ +#define _STM32F4_PROCESSOR_SELECTOR_H_ 1 + +#define PLATFORM_ARM_DEFINED + +// #if defined(PLATFORM_ARM_STM32F2) +// #define STM32F2XX +// #elif defined(PLATFORM_ARM_STM32F4) +// #define STM32F4XX +// #else +// ERROR - WE SHOULD NOT INCLUDE THIS HEADER IF NOT BUILDING AN STM32F2/F4 PLATFORM +#endif + +///////////////////////////////////////////////////////// +// +// macros +// + +#define GLOBAL_LOCK(x) SmartPtr_IRQ x +#define DISABLE_INTERRUPTS() SmartPtr_IRQ::ForceDisabled() +#define ENABLE_INTERRUPTS() SmartPtr_IRQ::ForceEnabled() +#define INTERRUPTS_ENABLED_STATE() SmartPtr_IRQ::GetState() +#define GLOBAL_LOCK_SOCKETS(x) SmartPtr_IRQ x + +#if defined(_DEBUG) +#define ASSERT_IRQ_MUST_BE_OFF() /*ASSERT(!SmartPtr_IRQ::GetState())*/ +#define ASSERT_IRQ_MUST_BE_ON() /*ASSERT( SmartPtr_IRQ::GetState())*/ +#else +#define ASSERT_IRQ_MUST_BE_OFF() +#define ASSERT_IRQ_MUST_BE_ON() +#endif + + +#define INTERRUPT_START SystemState_SetNoLock( SYSTEM_STATE_ISR ); \ + SystemState_SetNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); +#define INTERRUPT_END SystemState_ClearNoLock( SYSTEM_STATE_NO_CONTINUATIONS ); \ + SystemState_ClearNoLock( SYSTEM_STATE_ISR ); + + +// +// macros +// +///////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////// +// communicaiton facilities +// + +// Port definitions +#ifndef ITM_GENERIC_PORTNUM +#define ITM_GENERIC_PORTNUM 0 +#endif + +#define ITM0 ConvertCOM_GenericHandle( ITM_GENERIC_PORTNUM ) +#define COM1 ConvertCOM_ComHandle(0) +#define COM2 ConvertCOM_ComHandle(1) +#define COM3 ConvertCOM_ComHandle(2) +#define COM4 ConvertCOM_ComHandle(3) +#define COM5 ConvertCOM_ComHandle(4) +#define COM6 ConvertCOM_ComHandle(5) + +#define USB1 ConvertCOM_UsbHandle(0) +#define USB2 ConvertCOM_UsbHandle(1) + +#define TOTAL_DEBUG_PORT 1 +#define COM_DEBUG ConvertCOM_DebugHandle(0) + +#define COM_MESSAGING ConvertCOM_MessagingHandle(0) + +#define USART_TX_IRQ_INDEX(x) 6 // dummy index (EXTI0, always on) +#define USB_IRQ_INDEX 6 // dummy index (EXTI0, always on) + + +#define PLATFORM_DEPENDENT_TX_USART_BUFFER_SIZE 256 // there is one TX for each usart port +#define PLATFORM_DEPENDENT_RX_USART_BUFFER_SIZE 256 // there is one RX for each usart port +#define PLATFORM_DEPENDENT_USB_QUEUE_PACKET_COUNT 8 // there is one queue for each pipe of each endpoint and the size of a single packet is sizeof(USB_PACKET64) == 68 bytes + +// +// communicaiton facilities +///////////////////////////////////////////////////////// + +// // disable conflicting and overly generic macro definitions +//#undef FLASH +//#undef CRC +// #undef HASH + +// CMSIS-Core SOC Specific header +//#include "stm32f4xx_hal.h" + +// // disable conflicting and overly generic macro definitions +//#undef FLASH +//#undef CRC +//#undef __FPU_PRESENT +// #undef HASH +// #endif diff --git a/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c b/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c new file mode 100644 index 000000000..0f96361dc --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c @@ -0,0 +1,108 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_msp.c + * @brief This file contains the HAL System and Peripheral (PPP) MSP initialization + * and de-initialization functions. Based in stm32f4xx_hal_msp_template.c V1.4.4 + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL_MSP HAL MSP + * @brief HAL MSP module. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup HAL_MSP_Private_Functions HAL MSP Private Functions + * @{ + */ + +/** + * @brief Initializes the Global MSP. + * @note This function is called from HAL_Init() function to perform system + * level initialization (GPIOs, clock, DMA, interrupt). + * @retval None + */ +// defined as weak to allow it to be overriden by equivalent function at Solution level +__weak void HAL_MspInit(void) +{ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* System interrupt init*/ + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); +} + +/** + * @brief DeInitializes the Global MSP. + * @note This functiona is called from HAL_DeInit() function to perform system + * level de-initialization (GPIOs, clock, DMA, interrupt). + * @retval None + */ +// defined as weak to allow it to be overriden by equivalent function at Solution level +__weak void HAL_MspDeInit(void) +{ + +} + +/** + * @brief Initializes the PPP MSP. + * @note This functiona is called from HAL_PPP_Init() function to perform + * peripheral(PPP) system level initialization (GPIOs, clock, DMA, interrupt) + * @retval None + */ +__weak void HAL_PPP_MspInit(void) +{ + +} + +/** + * @brief DeInitializes the PPP MSP. + * @note This functiona is called from HAL_PPP_DeInit() function to perform + * peripheral(PPP) system level de-initialization (GPIOs, clock, DMA, interrupt) + * @retval None + */ +// defined as weak to allow it to be overriden by equivalent function at Solution level +__weak void HAL_PPP_MspDeInit(void) +{ + +} From c884505c07e8f96a5f0787b19ddf1b835f1bd5a8 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 15 Mar 2016 02:41:48 +0000 Subject: [PATCH 029/144] Implemented new "feature selection" approach at solution level - change current 'solution'.settings to accomodate new approach - change current 'solution'.settings and others to use new CMSIS HAL - change scatter files to remove simple heap, add auto size for managed heap, add C/C++ standard heap - change TinyCLR and TinyBooter projects to use new feature selection approach - add call to PowerShell script to install CMSIS package before building solution *** WORK IN PROGRESS *** - tested with DISCOVERY4 TinyBooter and GCC --- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 100 ++-- .../TinyBooter/TinyBooter.settings | 13 + .../MCBSTM32F400/TinyBooter/features.settings | 26 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 112 ++--- .../MCBSTM32F400/TinyCLR/TinyCLR.settings | 13 + .../MCBSTM32F400/TinyCLR/features.settings | 26 + .../TinyCLR_NONET/TinyCLR_NONET.proj | 112 ++--- .../TinyCLR_NONET/TinyCLR_NONET.settings | 13 + .../TinyCLR_NONET/features.settings | 26 + Solutions/MCBSTM32F400/dotnetmf.proj | 32 +- Solutions/MCBSTM32F400/platform_selector.h | 3 + .../DeviceCode/USB/usb_config.cpp | 1 + .../STM32F4DISCOVERY.settings | 22 +- .../TinyBooter/TinyBooter.proj | 125 ++--- .../TinyBooter/TinyBooter.settings | 13 + .../TinyBooter/TinyBooterEntry.cpp | 1 - .../TinyBooter/features.settings | 26 + .../TinyBooter/scatterfile_bootloader_gcc.xml | 202 +++++--- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 112 ++--- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.settings | 13 + .../TinyCLR/features.settings | 26 + .../TinyCLR/scatterfile_tinyclr_gcc.xml | 315 +++++++++++-- .../TinyCLR/scatterfile_tinyclr_net_gcc.xml | 403 ++++++++++++++++ Solutions/STM32F4DISCOVERY/dotnetmf.proj | 27 +- .../STM32F4DISCOVERY/platform_selector.h | 4 +- .../STM32F4DISCOVERY/stm32f4xx_hal_conf.h | 444 ++++++++++++++++++ 26 files changed, 1679 insertions(+), 531 deletions(-) create mode 100644 Solutions/MCBSTM32F400/TinyBooter/TinyBooter.settings create mode 100644 Solutions/MCBSTM32F400/TinyBooter/features.settings create mode 100644 Solutions/MCBSTM32F400/TinyCLR/TinyCLR.settings create mode 100644 Solutions/MCBSTM32F400/TinyCLR/features.settings create mode 100644 Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.settings create mode 100644 Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings create mode 100644 Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.settings create mode 100644 Solutions/STM32F4DISCOVERY/TinyBooter/features.settings create mode 100644 Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.settings create mode 100644 Solutions/STM32F4DISCOVERY/TinyCLR/features.settings create mode 100644 Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_net_gcc.xml create mode 100644 Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index d7dd9e8a0..5963dbb86 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -9,7 +9,7 @@ False - $(SPOCLIENT)\Solutions\MCBSTM32F400\MCBSTM32F400.settings + $(SPOCLIENT)\Solutions\MCBSTM32F400\TinyBooter\TinyBooter.settings True true
@@ -29,10 +29,6 @@
- - - - @@ -42,12 +38,38 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -65,10 +87,6 @@ - - - - @@ -85,10 +103,6 @@ - - - - @@ -117,10 +131,6 @@ - - - - @@ -129,10 +139,6 @@ - - - - @@ -157,10 +163,6 @@ - - - - @@ -173,22 +175,6 @@ - - - - - - - - - - - - - - - - @@ -201,26 +187,6 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.settings b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.settings new file mode 100644 index 000000000..d57861ada --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.settings @@ -0,0 +1,13 @@ + + + + Eclo Solutions + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings new file mode 100644 index 000000000..217fbafa2 --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -0,0 +1,26 @@ + + + + Eclo Solutions + + + + + + + + True + False + False + + False + False + False + False + False + False + False + False + False + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 61fd0ea60..79e5947d1 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -9,7 +9,7 @@ True - $(SPOCLIENT)\Solutions\MCBSTM32F400\MCBSTM32F400.settings + $(SPOCLIENT)\Solutions\MCBSTM32F400\TinyCLR\TinyCLR.settings True false @@ -61,8 +61,6 @@ - - @@ -75,8 +73,40 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -150,18 +180,6 @@ - - - - - - - - - - - - @@ -194,10 +212,6 @@ - - - - @@ -206,18 +220,6 @@ - - - - - - @@ -230,18 +232,6 @@ - - - - - - - - - - - - @@ -250,42 +240,18 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -350,10 +316,6 @@ - - - - @@ -370,10 +332,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.settings b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.settings new file mode 100644 index 000000000..03dc6a383 --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.settings @@ -0,0 +1,13 @@ + + + + Eclo Solutions + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings new file mode 100644 index 000000000..9939bd899 --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -0,0 +1,26 @@ + + + + Eclo Solutions + + + + + + + + True + True + False + + False + False + False + False + False + False + False + False + False + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 79db677e2..f226b262a 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -9,7 +9,7 @@ True - $(SPOCLIENT)\Solutions\MCBSTM32F400\MCBSTM32F400_NONET.settings + $(SPOCLIENT)\Solutions\MCBSTM32F400\TinyCLR_NONET\TinyCLR_NONET.settings True false @@ -57,14 +57,44 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -118,18 +148,6 @@ - - - - - - - - - - - - @@ -162,10 +180,6 @@ - - - - @@ -174,18 +188,6 @@ - - - - - - @@ -198,18 +200,6 @@ - - - - - - - - - - - - @@ -218,10 +208,6 @@ - - - - @@ -230,34 +216,14 @@ - - - - - - - - - - - - - - - - - - - - @@ -322,10 +288,6 @@ - - - - @@ -342,10 +304,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.settings new file mode 100644 index 000000000..4291246aa --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.settings @@ -0,0 +1,13 @@ + + + + Eclo Solutions + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings new file mode 100644 index 000000000..e7817430e --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -0,0 +1,26 @@ + + + + Eclo Solutions + + + + + + + + True + True + False + + False + False + False + False + False + False + False + False + False + + diff --git a/Solutions/MCBSTM32F400/dotnetmf.proj b/Solutions/MCBSTM32F400/dotnetmf.proj index 0904d3e23..7ddb1ad94 100644 --- a/Solutions/MCBSTM32F400/dotnetmf.proj +++ b/Solutions/MCBSTM32F400/dotnetmf.proj @@ -1,15 +1,21 @@  - - - Solutions\MCBSTM32F400 - $(SPOCLIENT)\Solutions\MCBSTM32F400\MCBSTM32F400.settings - - - - - - - - - + + + Solutions\MCBSTM32F400 + $(SPOCLIENT)\Solutions\STM32F4DISCOVERY + $(SPOCLIENT)\Solutions\MCBSTM32F400\MCBSTM32F400.settings + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Solutions/MCBSTM32F400/platform_selector.h b/Solutions/MCBSTM32F400/platform_selector.h index aa4f4f418..15a631da6 100644 --- a/Solutions/MCBSTM32F400/platform_selector.h +++ b/Solutions/MCBSTM32F400/platform_selector.h @@ -26,6 +26,9 @@ #if defined(PLATFORM_ARM_MCBSTM32F400) #define HAL_SYSTEM_NAME "MCBSTM32F400" +// FIXME +// the following can be removed after complete migration to CMSIS HAL/PAL +#define STM32F4XX 1 #define PLATFORM_ARM_STM32F4 1 // STM32F407 cpu #define STM32F4_ETH_PHY_RMII 1 #define USB_ALLOW_CONFIGURATION_OVERRIDE 1 diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp b/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp index fdd49964c..0e0c417fd 100644 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp +++ b/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp @@ -73,6 +73,7 @@ ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION extern const ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration; + const struct USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration = { // Device descriptor diff --git a/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings b/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings index a2a5d139c..2b2c03ca2 100644 --- a/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings +++ b/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings @@ -1,12 +1,13 @@  - CW2 + Eclo Solutions @@ -16,13 +17,24 @@ True le true + true - - STM32F4DISCOVERY by CW2 + STM32F4DISCOVERY by Eclo Solutions + + + + STM32F407xx + F4 + 1.11.0 + + - + + + + \ No newline at end of file diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index d8c4f5188..f7db515e9 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -9,7 +9,7 @@ False - $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\STM32F4DISCOVERY.settings + $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\TinyBooter\TinyBooter.settings True true @@ -23,16 +23,13 @@ $(ExtraTargets);CompressBin scatterfile_bootloader_$(COMPILER_TOOL).$(SCATTER_EXT) scatterfile_bootloader_$(COMPILER_TOOL).$(SCATTER_EXT) + true - - - - @@ -42,21 +39,43 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - @@ -65,10 +84,6 @@ - - - - @@ -85,17 +100,13 @@ - - - - - - + + @@ -117,10 +128,6 @@ - - - - @@ -129,38 +136,22 @@ - - - - - - + + - - - - - - - - - - - - @@ -173,22 +164,6 @@ - - - - - - - - - - - - - - - - @@ -202,28 +177,8 @@ - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.settings new file mode 100644 index 000000000..193188a17 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.settings @@ -0,0 +1,13 @@ + + + + Eclo Solutions + + + + + + + + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp index 69c5a71a7..b6a50a586 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp @@ -279,4 +279,3 @@ BOOL TinyBooter_GetReleaseInfo(MfReleaseInfo& releaseInfo) ); return TRUE; } - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings new file mode 100644 index 000000000..eb0bf6331 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -0,0 +1,26 @@ + + + + Eclo Solutions + + + + + + + + True + False + False + + False + False + False + False + False + False + False + False + False + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml b/Solutions/STM32F4DISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml index 9b7ada5df..fb4da2c05 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml @@ -32,7 +32,7 @@ --> - + @@ -43,11 +43,9 @@ - - - + - + @@ -60,102 +58,166 @@ - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + - - - - + + + - - - + - + - - + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + - - - - + + + + + + + + - - - + + + + + + + + - - - + + + + + + + + + - - - + + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 1e0a6e9c9..7e8044e66 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -9,7 +9,7 @@ True - $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\STM32F4DISCOVERY.settings + $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\TinyBooter.settings True false @@ -59,14 +59,42 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -120,18 +148,7 @@ - - - - - - - - - - - - + @@ -164,10 +181,6 @@ - - - - @@ -176,18 +189,6 @@ - - - - - - @@ -200,18 +201,6 @@ - - - - - - - - - - - - @@ -220,10 +209,6 @@ - - - - @@ -232,34 +217,15 @@ - - - - - - - - + - - - - - - - - - - - - @@ -324,10 +290,6 @@ - - - - @@ -344,10 +306,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.settings new file mode 100644 index 000000000..0f2ed8e3f --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.settings @@ -0,0 +1,13 @@ + + + + Eclo Solutions + + + + + + + + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings new file mode 100644 index 000000000..ede19d670 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -0,0 +1,26 @@ + + + + Eclo Solutions + + + + + + + + True + True + False + + False + False + False + False + False + False + False + False + False + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml b/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml index ad604bb70..190adef3d 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml @@ -6,7 +6,6 @@ - - - + + + + + + - + - - @@ -70,29 +71,117 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + - + - + + - + - - + + + - + + + + + + + + + + + + + + + + + + - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + - + @@ -180,4 +400,3 @@ - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_net_gcc.xml b/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_net_gcc.xml new file mode 100644 index 000000000..f604dd19d --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_net_gcc.xml @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Solutions/STM32F4DISCOVERY/dotnetmf.proj b/Solutions/STM32F4DISCOVERY/dotnetmf.proj index b62b5da84..9f1b38c9c 100644 --- a/Solutions/STM32F4DISCOVERY/dotnetmf.proj +++ b/Solutions/STM32F4DISCOVERY/dotnetmf.proj @@ -1,14 +1,21 @@  - - - Solutions\STM32F4DISCOVERY - $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\STM32F4DISCOVERY.settings - - + + + Solutions\STM32F4DISCOVERY + $(SPOCLIENT)\Solutions\STM32F4DISCOVERY + $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\STM32F4DISCOVERY.settings + + - - - - + + + + + + + + + + \ No newline at end of file diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index e1cf20592..67229be80 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -25,7 +25,9 @@ #if defined(PLATFORM_ARM_STM32F4DISCOVERY) #define HAL_SYSTEM_NAME "STM32F4DISCOVERY" - +// FIXME +// the following can be removed after complete migration to CMSIS HAL/PAL +#define STM32F4XX 1 #define PLATFORM_ARM_STM32F4 1 // STM32F407 cpu #define USB_ALLOW_CONFIGURATION_OVERRIDE 1 diff --git a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h new file mode 100644 index 000000000..8b946b868 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h @@ -0,0 +1,444 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file based in stm32f4xx_hal_conf_template.h V1.4.4 + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CAN_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_CEC_MODULE_ENABLED +#define HAL_CRYP_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +#define HAL_DCMI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_DMA2D_MODULE_ENABLED +#define HAL_ETH_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_NAND_MODULE_ENABLED +#define HAL_NOR_MODULE_ENABLED +#define HAL_PCCARD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#define HAL_SDRAM_MODULE_ENABLED +#define HAL_HASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +#define HAL_LTDC_MODULE_ENABLED +#define HAL_DSI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_QSPI_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RNG_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SAI_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_IRDA_MODULE_ENABLED +#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_PCD_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED +#define HAL_FMPI2C_MODULE_ENABLED +#define HAL_SPDIFRX_MODULE_ENABLED +#define HAL_LPTIM_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16800000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010U) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011U) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012U) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000U) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 1U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From f754d8945bdcc7ab1e0f702a4379db08e2663530 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 15 Mar 2016 03:30:39 +0000 Subject: [PATCH 030/144] Update script to copy USB device library files --- Install-CMSIS-STM32.ps1 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index 8982486ff..720e14ce5 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -111,6 +111,7 @@ try $halDriverIncFolder = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Inc/" $halDriverSrcFolder = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Src/" $halDriverReleaseNotes = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Release_Notes.html" + $cmsisUSBClientLib = $zipPackFileName + "/Middlewares/ST/STM32_USB_Device_Library/" foreach($zipItem in $zipArchive.Entries) { @@ -118,7 +119,8 @@ try if($zipItem.FullName.StartsWith( $cmsisDeviceFolder ) -Or $zipItem.FullName.StartsWith( $halDriverIncFolder ) -Or $zipItem.FullName.StartsWith( $halDriverSrcFolder ) -Or - $zipItem.FullName.StartsWith( $halDriverReleaseNotes )) + $zipItem.FullName.StartsWith( $halDriverReleaseNotes ) -Or + $zipItem.FullName.StartsWith( $cmsisUSBClientLib )) { $destinationFile = [System.IO.Path]::Combine( $seriesPath, $zipItem.FullName.Replace($zipPackFileName, "").Replace("/", "\").SubString(1)) $parentDir = [System.IO.Path]::GetDirectoryName( $destinationFile ) @@ -159,6 +161,16 @@ Remove-Item -Path $deviceCodePathForSeries -Force -Recurse -ErrorAction Ignore New-Item -Path $deviceCodePathForSeries -Force -ItemType directory | Out-Null Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\STM32" + $seriesName + "xx_HAL_Driver\*") ) -Destination $deviceCodePathForSeries -Force +# move USB device client library from STM32Cube folder to USB DeviceCode folder +# first clear the destination directory before copying as we don't want to mix versions +Write-Host "Copying USB device client library..." + +$usbClientLibPath = [System.IO.Path]::Combine( $spotClientPath, "DeviceCode\Targets\CMSIS\USB\STM32_USB_Device_Library") +Remove-Item -Path $usbClientLibPath -Force -Recurse -ErrorAction Ignore +New-Item -Path $usbClientLibPath -Force -ItemType directory | Out-Null +Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Middlewares\ST\STM32_USB_Device_Library\Core\*") ) -Destination $usbClientLibPath -Force + + # delete source folder in STM32Cube becasause we don't need it anymore Remove-Item -Path $seriesPath -Force -Recurse -ErrorAction Ignore From ce11b9c1c5bf86e3d8602f735c3a2b44d25f4c6d Mon Sep 17 00:00:00 2001 From: sjmneves Date: Tue, 15 Mar 2016 10:42:29 +0000 Subject: [PATCH 031/144] Change define for SPI ports now user must define available SPI ports in a preloaded define in platform_selector.h --- DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp | 4 ++++ Solutions/STM32F4DISCOVERY/platform_selector.h | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp index 2d522e106..a15699cb7 100644 --- a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp +++ b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp @@ -56,6 +56,10 @@ typedef SPI_TypeDef* ptr_SPI_TypeDef; // #endif +#if !defined(SPI_PORTS) +#error "No SPI ports defined! Please go to platform_selector.h (in solution folder) and uncomment the define that matches the SPI ports available in the device datasheet" +#endif + static const ptr_SPI_TypeDef g_STM32_Spi_Port[] = SPI_PORTS; diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 67229be80..51523229f 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -25,9 +25,10 @@ #if defined(PLATFORM_ARM_STM32F4DISCOVERY) #define HAL_SYSTEM_NAME "STM32F4DISCOVERY" + // FIXME // the following can be removed after complete migration to CMSIS HAL/PAL -#define STM32F4XX 1 +#define STM32F4XX 1 #define PLATFORM_ARM_STM32F4 1 // STM32F407 cpu #define USB_ALLOW_CONFIGURATION_OVERRIDE 1 @@ -110,9 +111,11 @@ #define STM32F4_PWM_CHNL {0,1,2,3} #define STM32F4_PWM_PINS {60,61,62,63} // PD12-PD15 -#define STM32F4_SPI_SCLK_PINS {5, 29, 42} // PA5, PB13, PC10 -#define STM32F4_SPI_MISO_PINS {6, 30, 43} // PA6, PB14, PC11 -#define STM32F4_SPI_MOSI_PINS {7, 31, 44} // PA7, PB15, PC12 +// #define STM32F4_SPI_SCLK_PINS {5, 29, 42} // PA5, PB13, PC10 +// #define STM32F4_SPI_MISO_PINS {6, 30, 43} // PA6, PB14, PC11 +// #define STM32F4_SPI_MOSI_PINS {7, 31, 44} // PA7, PB15, PC12 +#define SPI_PORTS {SPI1, SPI2, SPI3} + #define STM32F4_I2C_PORT 1 #define STM32F4_I2C_SCL_PIN PORT_PIN( GPIO_PORTB, 8 ) // PB8 @@ -138,7 +141,7 @@ // constants ///////////////////////////////////////////////////////// -#include +#include "processor_selector.h" #endif // PLATFORM_ARM_STM32F4DISCOVERY From 11a58f9abced2e8ab19e67010c16365dc6c009ea Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 15 Mar 2016 16:09:30 +0000 Subject: [PATCH 032/144] Improve script - renames library souce files to .cpp so they get compiled as CPP code (required in order to include tinyhal.h - delete template files from library source code --- Install-CMSIS-STM32.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index 720e14ce5..3db05927e 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -170,6 +170,12 @@ Remove-Item -Path $usbClientLibPath -Force -Recurse -ErrorAction Ignore New-Item -Path $usbClientLibPath -Force -ItemType directory | Out-Null Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Middlewares\ST\STM32_USB_Device_Library\Core\*") ) -Destination $usbClientLibPath -Force +# rename the USB device client library source files to cpp extension so they get compiled as CPP code +Get-childItem -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Src") ) *.c | rename-item -newname { $_.name -replace '\.c','.cpp' } + +# delete the template files from USB device client library destination folder +Remove-Item -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Src\usbd_conf_template.cpp") ) -Force +Remove-Item -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Inc\usbd_conf_template.h") ) -Force # delete source folder in STM32Cube becasause we don't need it anymore Remove-Item -Path $seriesPath -Force -Recurse -ErrorAction Ignore From bbf6f2d0d609f95e74306e90dd9ad7f95209fd42 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 17 Mar 2016 02:16:02 +0000 Subject: [PATCH 033/144] Improvements in CMSIS HAL - moved system_stm32f4xx.c to HAL folder - add feature setting for cpu cache, rework solution projects and add if/defs on the code - start working on CMSIS time - add missing if/defs in code for LCD feature - improvements in system clock config --- Application/MicroBooter/SrecProcessor.cpp | 4 + Application/TinyBooter/Commands.cpp | 22 +- .../TinyBooter/ConfigurationManager.cpp | 8 + Application/TinyBooter/CryptoInterface.cpp | 4 + Application/TinyBooter/TinyBooter.cpp | 12 +- DeviceCode/Initialization/tinyhal.cpp | 116 +-- .../Native/STM32F4xx/SystemClock_Config.c | 78 +- .../Targets/Native/STM32F4xx/dotNetMF.proj | 21 +- .../Native/STM32F4xx/dotNetMF_loader.proj | 19 +- .../Native/STM32F4xx/system_stm32f4xx.c | 761 ++++++++++++++++++ .../DeviceCode/Initialization/tinyhal.cpp | 8 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 6 +- .../MCBSTM32F400/TinyBooter/features.settings | 2 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 6 +- .../MCBSTM32F400/TinyCLR/features.settings | 2 + .../TinyCLR_NONET/TinyCLR_NONET.proj | 6 +- .../TinyCLR_NONET/features.settings | 2 + .../TinyBooter/TinyBooter.proj | 15 +- .../TinyBooter/features.settings | 2 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 7 +- .../TinyCLR/features.settings | 2 + .../STM32F4DISCOVERY/stm32f4xx_hal_conf.h | 4 +- 22 files changed, 974 insertions(+), 133 deletions(-) create mode 100644 DeviceCode/Targets/Native/STM32F4xx/system_stm32f4xx.c diff --git a/Application/MicroBooter/SrecProcessor.cpp b/Application/MicroBooter/SrecProcessor.cpp index feb4b904b..5cbfd8b22 100644 --- a/Application/MicroBooter/SrecProcessor.cpp +++ b/Application/MicroBooter/SrecProcessor.cpp @@ -75,7 +75,9 @@ BOOL SREC_Handler::Process( char c ) { ApplicationStartAddress str = (ApplicationStartAddress)m_ImageStart; + #ifdef FEATURE_LCD LCD_Clear(); + #endif DebuggerPort_Uninitialize( HalSystemConfig.DebuggerPorts[0] ); @@ -83,7 +85,9 @@ BOOL SREC_Handler::Process( char c ) LCD_Uninitialize(); + #ifdef FEATURE_CPUCACHE CPU_DisableCaches(); + #endif (*str)(); } diff --git a/Application/TinyBooter/Commands.cpp b/Application/TinyBooter/Commands.cpp index c50495655..3f4c4a0a3 100644 --- a/Application/TinyBooter/Commands.cpp +++ b/Application/TinyBooter/Commands.cpp @@ -140,7 +140,12 @@ struct BitFieldManager dataAddr = (volatile FLASH_WORD*)&m_signatureCheck->BitField[ sectorIndex / BITS_PER_UINT32 ]; // read back the + +#ifdef FEATURE_CPUCACHE dataRdAddr = (volatile FLASH_WORD*)CPU_GetUncachableAddress( dataAddr ); +#else + dataRdAddr = (volatile FLASH_WORD*)dataAddr; +#endif data = (*dataRdAddr) & ~( 1ul << (sectorIndex % BITS_PER_UINT32) ); // write directly @@ -259,7 +264,11 @@ struct BitFieldManager else // XIP device { +#ifdef FEATURE_CPUCACHE configSector = (ConfigurationSector*)CPU_GetUncachableAddress( m_cfgPhysicalAddress ); // global config not in flash for bootloader +#else + configSector = (ConfigurationSector*)m_cfgPhysicalAddress; // global config not in flash for bootloader +#endif m_signatureCheck = NULL; @@ -1076,8 +1085,9 @@ void Loader_Engine::Launch( ApplicationStartAddress startAddress ) if (retAddress != NULL) startAddress = retAddress; - // FIXME - //LCD_Clear(); + #ifdef FEATURE_LCD + LCD_Clear(); + #endif DebuggerPort_Flush( m_port ); @@ -1089,10 +1099,14 @@ void Loader_Engine::Launch( ApplicationStartAddress startAddress ) } DISABLE_INTERRUPTS(); -// FIXME - //LCD_Uninitialize(); + #ifdef FEATURE_LCD + LCD_Uninitialize(); + #endif + + #ifdef FEATURE_CPUCACHE CPU_DisableCaches(); + #endif if(Tinybooter_ImageIsCompressed()) { diff --git a/Application/TinyBooter/ConfigurationManager.cpp b/Application/TinyBooter/ConfigurationManager.cpp index 2474b6f8d..e694a3845 100644 --- a/Application/TinyBooter/ConfigurationManager.cpp +++ b/Application/TinyBooter/ConfigurationManager.cpp @@ -38,7 +38,11 @@ void ConfigurationSectorManager::LocateConfigurationSector( UINT32 BlockUsage ) m_fSupportsXIP = TRUE; m_fUsingRAM = FALSE; // Get the real address +#ifdef FEATURE_CPUCACHE m_configurationSector = (ConfigurationSector *)CPU_GetUncachableAddress( m_cfgPhysicalAddress ); +#else + m_configurationSector = (ConfigurationSector *)m_cfgPhysicalAddress; +#endif } else { @@ -74,7 +78,11 @@ void ConfigurationSectorManager::LoadConfiguration() if (m_fSupportsXIP) { // Get the real address +#ifdef FEATURE_CPUCACHE m_configurationSector = (ConfigurationSector *)CPU_GetUncachableAddress( m_cfgPhysicalAddress ); +#else + m_configurationSector = (ConfigurationSector *)m_cfgPhysicalAddress; +#endif return ; } diff --git a/Application/TinyBooter/CryptoInterface.cpp b/Application/TinyBooter/CryptoInterface.cpp index 40ac50f36..c77bfc71c 100644 --- a/Application/TinyBooter/CryptoInterface.cpp +++ b/Application/TinyBooter/CryptoInterface.cpp @@ -10,7 +10,11 @@ extern int g_ConfigBufferLength; CryptoState::CryptoState( UINT32 dataAddress, UINT32 dataLength, BYTE* sig, UINT32 sigLength, UINT32 sectorType ) : #if defined(ARM_V1_2) +#ifdef FEATURE_CPUCACHE m_dataAddress( CPU_GetCachableAddress( dataAddress ) ), +#else + m_dataAddress(dataAddress), +#endif #else m_dataAddress( dataAddress ), #endif diff --git a/Application/TinyBooter/TinyBooter.cpp b/Application/TinyBooter/TinyBooter.cpp index 5a886e3b7..199f3db5f 100644 --- a/Application/TinyBooter/TinyBooter.cpp +++ b/Application/TinyBooter/TinyBooter.cpp @@ -32,7 +32,6 @@ void ApplicationEntryPoint() UINT32 SizeInBytes; HeapLocation ( BaseAddress, SizeInBytes ); - //SimpleHeap_Initialize( BaseAddress, SizeInBytes ); g_eng.Initialize( HalSystemConfig.DebuggerPorts[ 0 ] ); @@ -55,11 +54,12 @@ void ApplicationEntryPoint() if(enterBootMode) { - // FIXME - //LCD_Clear(); - // FIXME - //hal_fprintf( STREAM_LCD, "TinyBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); - //hal_fprintf( STREAM_LCD, "%s Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__ ); +#ifdef FEATURE_LCD + LCD_Clear(); +#endif + + hal_fprintf( STREAM_LCD, "TinyBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + hal_fprintf( STREAM_LCD, "%s Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__ ); DebuggerPort_Initialize( HalSystemConfig.DebuggerPorts[ 0 ] ); diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index e1ddeea81..f539eeab3 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -87,7 +87,11 @@ void HAL_EnterBooterMode() { // will be either directly read from NOR +#ifdef FEATURE_CPUCACHE dataAddress = (volatile UINT32*)CPU_GetUncachableAddress(&pAddr[i]); +#else + dataAddress = (volatile UINT32*)&pAddr[i]; +#endif // write directly bRet = (TRUE == pBlockDevice->Write( (UINT32)dataAddress, sizeof(UINT32), (PBYTE)&c_Key, FALSE )); @@ -362,61 +366,74 @@ extern "C" // defined as weak to allow it to be overriden by equivalent function at Solution level __attribute__((weak)) int main(void) { - HAL_Init(); - - /* Configure the system clock */ - SystemClock_Config(); + /* CMSIS HAL library initialization: + - Configure the Flash prefetch, instruction and Data caches + - Configure the Systick to generate an interrupt each 1 msec + - Set NVIC Group Priority to 4 + - Global MSP (MCU Support Package) initialization + */ + if(HAL_Init() == HAL_OK) + { + + /* Configure the system clock */ + SystemClock_Config(); + +CPU_USB_Initialize(0); + + HAL_Time_Initialize(); + + HAL_Initialize(); + + #if !defined(BUILD_RTM) + DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); + #if defined(__GNUC__) + DEBUG_TRACE1(TRACE_ALWAYS, "GNU Compiler version %d\r\n", __GNUC__); + #else + DEBUG_TRACE1(TRACE_ALWAYS, "ARM Compiler version %d\r\n", __ARMCC_VERSION); + #endif + + UINT8* BaseAddress; + UINT32 SizeInBytes; + + HeapLocation( BaseAddress, SizeInBytes ); + memset ( BaseAddress, 0, SizeInBytes ); + + #ifdef FEATURE_LCD + lcd_printf("\f"); - HAL_Time_Initialize(); - - HAL_Initialize(); - -#if !defined(BUILD_RTM) - DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); - DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); -#if defined(__GNUC__) - DEBUG_TRACE1(TRACE_ALWAYS, "GNU Compiler version %d\r\n", __GNUC__); -#else - DEBUG_TRACE1(TRACE_ALWAYS, "ARM Compiler version %d\r\n", __ARMCC_VERSION); -#endif - - UINT8* BaseAddress; - UINT32 SizeInBytes; - - HeapLocation( BaseAddress, SizeInBytes ); - memset ( BaseAddress, 0, SizeInBytes ); - - lcd_printf("\f"); - - lcd_printf("%-15s\r\n", HalName); - lcd_printf("%-15s\r\n", "Build Date:"); - lcd_printf(" %-13s\r\n", __DATE__); - lcd_printf(" %-13s\r\n", __TIME__); + lcd_printf("%-15s\r\n", HalName); + lcd_printf("%-15s\r\n", "Build Date:"); + lcd_printf(" %-13s\r\n", __DATE__); + lcd_printf(" %-13s\r\n", __TIME__); + #endif -#endif // !defined(BUILD_RTM) + #endif // !defined(BUILD_RTM) - /***********************************************************************************/ + /***********************************************************************************/ - { -#if defined(FIQ_SAMPLING_PROFILER) - FIQ_Profiler_Init(); -#endif - } + { + #if defined(FIQ_SAMPLING_PROFILER) + FIQ_Profiler_Init(); + #endif + } - // - // the runtime is by default using a watchdog - // - - Watchdog_GetSetTimeout ( WATCHDOG_TIMEOUT , TRUE ); - Watchdog_GetSetBehavior( WATCHDOG_BEHAVIOR, TRUE ); - Watchdog_GetSetEnabled ( WATCHDOG_ENABLE, TRUE ); + // + // the runtime is by default using a watchdog + // + + Watchdog_GetSetTimeout ( WATCHDOG_TIMEOUT , TRUE ); + Watchdog_GetSetBehavior( WATCHDOG_BEHAVIOR, TRUE ); + Watchdog_GetSetEnabled ( WATCHDOG_ENABLE, TRUE ); - - // HAL initialization completed. Interrupts are enabled. Jump to the Application routine - ApplicationEntryPoint(); + // CMSIS & NETMF HALs initialization completed. Interrupts are enabled. Jump to the Application routine + ApplicationEntryPoint(); - lcd_printf("\fmain exited!!???. Halting CPU\r\n"); - debug_printf("main exited!!???. Halting CPU\r\n"); + #ifdef FEATURE_LCD + lcd_printf("\fmain exited!!???. Halting CPU\r\n"); + #endif + //debug_printf("main exited!!???. Halting CPU\r\n"); + } #if defined(BUILD_RTM) CPU_Reset(); @@ -431,6 +448,7 @@ __attribute__((weak)) int main(void) #if !defined(BUILD_RTM) +#ifdef FEATURE_LCD void lcd_printf( const char* format, ... ); void debug_printf( const char* format, ... ) @@ -460,5 +478,5 @@ void lcd_printf( const char* format, ... ) hal_vfprintf( STREAM_LCD, format, arg_ptr ); } - +#endif // !defined(FEATURE_LCD) #endif // !defined(BUILD_RTM) diff --git a/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c b/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c index 1f31d1cb5..a61991332 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c +++ b/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c @@ -38,43 +38,55 @@ void SystemClock_Config(void) __attribute__((weak)); // defined as weak to allow it to be overriden by equivalent function at Solution level void SystemClock_Config(void) { - RCC_ClkInitTypeDef RCC_ClkInitStruct; - RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + HAL_StatusTypeDef ret = HAL_OK; - /* Enable Power Control clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* The voltage scaling allows optimizing the power consumption when the device is - clocked below the maximum system frequency, to update the voltage scaling value - regarding system frequency refer to product datasheet. */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /* Enable HSE Oscillator and activate PLL with HSE as source */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - HAL_RCC_OscConfig(&RCC_OscInitStruct); + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); - /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 - clocks dividers */ - RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_4); + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + + ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); + if(ret != HAL_OK) + { + // RCC Osc config failed + while(1) { ; } + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + if(ret != HAL_OK) + { + while(1) { ; } + } + + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_4); - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); } diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 706f18731..0c8a15a45 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -36,16 +36,16 @@ - - +
- - + + + + - @@ -85,7 +85,16 @@ - + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index b7862af91..dc397ae21 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -38,15 +38,15 @@ - - - - + + + + @@ -129,7 +129,16 @@ - + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/system_stm32f4xx.c b/DeviceCode/Targets/Native/STM32F4xx/system_stm32f4xx.c new file mode 100644 index 000000000..843cd75f9 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/system_stm32f4xx.c @@ -0,0 +1,761 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @version V2.4.3 + * @date 22-January-2016 + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Solutions/MCBSTM32F400/DeviceCode/Initialization/tinyhal.cpp b/Solutions/MCBSTM32F400/DeviceCode/Initialization/tinyhal.cpp index a81e9ebdf..d0a0ab12c 100644 --- a/Solutions/MCBSTM32F400/DeviceCode/Initialization/tinyhal.cpp +++ b/Solutions/MCBSTM32F400/DeviceCode/Initialization/tinyhal.cpp @@ -242,7 +242,11 @@ void HAL_EnterBooterMode() { // will be either directly read from NOR +#ifdef FEATURE_CPUCACHE dataAddress = (volatile UINT32*)CPU_GetUncachableAddress(&pAddr[i]); +#else + dataAddress = (volatile UINT32*)&pAddr[i]; +#endif // write directly bRet = (TRUE == pBlockDevice->Write( (UINT32)dataAddress, sizeof(UINT32), (PBYTE)&c_Key, FALSE )); @@ -460,7 +464,9 @@ void HAL_Uninitialize() } } - //LCD_Uninitialize(); + #ifdef FEATURE_LCD + LCD_Uninitialize(); + #endif I2C_Uninitialize(); diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 5963dbb86..c0ba1ba4f 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -47,6 +47,8 @@ + + @@ -79,10 +81,6 @@
- - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 217fbafa2..321cce563 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -13,6 +13,8 @@ False False + False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 79e5947d1..965f7368c 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -84,6 +84,8 @@ + + @@ -244,10 +246,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 9939bd899..01a0c5ba1 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -13,6 +13,8 @@ True False + False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index f226b262a..37d8f72e3 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -72,6 +72,8 @@ + + @@ -216,10 +218,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index e7817430e..d767019f0 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -13,6 +13,8 @@ True False + False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index f7db515e9..5cf73b256 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -48,6 +48,8 @@ + + @@ -71,14 +73,7 @@ - - - - - - - - + @@ -97,8 +92,8 @@ - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index eb0bf6331..af9b13a47 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -13,6 +13,8 @@ False False + False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 7e8044e66..ae27a32e2 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -74,6 +74,8 @@ + + @@ -217,11 +219,6 @@ - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index ede19d670..2aeac05b8 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -13,6 +13,8 @@ True False + False + False False False diff --git a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h index 8b946b868..8be503621 100644 --- a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h +++ b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h @@ -112,7 +112,7 @@ * (when HSI is used as system clock source, directly or through the PLL). */ #if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16800000U) /*!< Value of the Internal oscillator in Hz*/ + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ #endif /* HSI_VALUE */ /** @@ -153,7 +153,7 @@ #define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ #define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ #define USE_RTOS 0U -#define PREFETCH_ENABLE 1U +//#define PREFETCH_ENABLE 0U #define INSTRUCTION_CACHE_ENABLE 1U #define DATA_CACHE_ENABLE 1U From 3122df1fdb22ad316613790241a75fc87c40dfcb Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 17 Mar 2016 10:24:58 +0000 Subject: [PATCH 034/144] Correct indentations --- DeviceCode/Initialization/tinyhal.cpp | 90 +++++++++++++-------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index f539eeab3..5ec9ba171 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -87,11 +87,11 @@ void HAL_EnterBooterMode() { // will be either directly read from NOR -#ifdef FEATURE_CPUCACHE + #ifdef FEATURE_CPUCACHE dataAddress = (volatile UINT32*)CPU_GetUncachableAddress(&pAddr[i]); -#else + #else dataAddress = (volatile UINT32*)&pAddr[i]; -#endif + #endif // write directly bRet = (TRUE == pBlockDevice->Write( (UINT32)dataAddress, sizeof(UINT32), (PBYTE)&c_Key, FALSE )); @@ -377,45 +377,44 @@ __attribute__((weak)) int main(void) /* Configure the system clock */ SystemClock_Config(); - -CPU_USB_Initialize(0); - + HAL_Time_Initialize(); HAL_Initialize(); - #if !defined(BUILD_RTM) - DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); - DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); - #if defined(__GNUC__) - DEBUG_TRACE1(TRACE_ALWAYS, "GNU Compiler version %d\r\n", __GNUC__); - #else - DEBUG_TRACE1(TRACE_ALWAYS, "ARM Compiler version %d\r\n", __ARMCC_VERSION); - #endif - - UINT8* BaseAddress; - UINT32 SizeInBytes; - - HeapLocation( BaseAddress, SizeInBytes ); - memset ( BaseAddress, 0, SizeInBytes ); - - #ifdef FEATURE_LCD - lcd_printf("\f"); - - lcd_printf("%-15s\r\n", HalName); - lcd_printf("%-15s\r\n", "Build Date:"); - lcd_printf(" %-13s\r\n", __DATE__); - lcd_printf(" %-13s\r\n", __TIME__); - #endif - - #endif // !defined(BUILD_RTM) + #if !defined(BUILD_RTM) + //DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + //DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); + + #if defined(__GNUC__) + //DEBUG_TRACE1(TRACE_ALWAYS, "GNU Compiler version %d\r\n", __GNUC__); + #else + //DEBUG_TRACE1(TRACE_ALWAYS, "ARM Compiler version %d\r\n", __ARMCC_VERSION); + #endif + + UINT8* BaseAddress; + UINT32 SizeInBytes; + + HeapLocation( BaseAddress, SizeInBytes ); + memset ( BaseAddress, 0, SizeInBytes ); + + #ifdef FEATURE_LCD + lcd_printf("\f"); + + lcd_printf("%-15s\r\n", HalName); + lcd_printf("%-15s\r\n", "Build Date:"); + lcd_printf(" %-13s\r\n", __DATE__); + lcd_printf(" %-13s\r\n", __TIME__); + #endif + + #endif // !defined(BUILD_RTM) /***********************************************************************************/ { - #if defined(FIQ_SAMPLING_PROFILER) - FIQ_Profiler_Init(); - #endif + #if defined(FIQ_SAMPLING_PROFILER) + FIQ_Profiler_Init(); + #endif } // @@ -429,17 +428,17 @@ CPU_USB_Initialize(0); // CMSIS & NETMF HALs initialization completed. Interrupts are enabled. Jump to the Application routine ApplicationEntryPoint(); - #ifdef FEATURE_LCD - lcd_printf("\fmain exited!!???. Halting CPU\r\n"); - #endif + #ifdef FEATURE_LCD + lcd_printf("\fmain exited!!???. Halting CPU\r\n"); + #endif //debug_printf("main exited!!???. Halting CPU\r\n"); } -#if defined(BUILD_RTM) - CPU_Reset(); -#else - CPU_Halt(); -#endif + #if defined(BUILD_RTM) + CPU_Reset(); + #else + CPU_Halt(); + #endif } } // extern "C" @@ -448,9 +447,6 @@ CPU_USB_Initialize(0); #if !defined(BUILD_RTM) -#ifdef FEATURE_LCD -void lcd_printf( const char* format, ... ); - void debug_printf( const char* format, ... ) { char buffer[256] = {0}; @@ -470,6 +466,9 @@ void debug_printf( const char* format, ... ) va_end( arg_ptr ); } +#ifdef FEATURE_LCD +void lcd_printf( const char* format, ... ); + void lcd_printf( const char* format, ... ) { va_list arg_ptr; @@ -479,4 +478,5 @@ void lcd_printf( const char* format, ... ) hal_vfprintf( STREAM_LCD, format, arg_ptr ); } #endif // !defined(FEATURE_LCD) + #endif // !defined(BUILD_RTM) From e8b9e803f4c41173d597e12617db5af04a30225a Mon Sep 17 00:00:00 2001 From: sjmneves Date: Thu, 17 Mar 2016 10:39:26 +0000 Subject: [PATCH 035/144] Added project for HAL CMSIS USART --- .../Targets/CMSIS/USART/USART_functions.cpp | 997 ++++++++++++++++++ DeviceCode/Targets/CMSIS/USART/dotNetMF.proj | 33 + .../Targets/Native/STM32F4xx/dotNetMF.proj | 21 +- .../Native/STM32F4xx/dotNetMF_loader.proj | 14 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 12 +- .../MCBSTM32F400/TinyBooter/features.settings | 1 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 12 +- .../MCBSTM32F400/TinyCLR/features.settings | 1 + .../TinyCLR_NONET/TinyCLR_NONET.proj | 12 +- .../TinyCLR_NONET/features.settings | 1 + .../TinyBooter/TinyBooter.proj | 18 +- .../TinyBooter/features.settings | 1 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 14 +- .../TinyCLR/features.settings | 6 +- 14 files changed, 1094 insertions(+), 49 deletions(-) create mode 100644 DeviceCode/Targets/CMSIS/USART/USART_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/USART/dotNetMF.proj diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp new file mode 100644 index 000000000..109f25cec --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp @@ -0,0 +1,997 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** Serial Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +#if (!defined(USART_PORTS) || !defined(USART_PORTS_TX_RX)) +#error "No USART ports defined! Please go to platform_selector.h (in solution folder) and uncomment the define that matches the USART ports available in the device datasheet" +#endif + +// IO addresses +static const USART_TypeDef* g_Uart_Ports[] = USART_PORTS; +static const GPIO_TypeDef* g_Uart_Ports_Tx_Rx[] = USART_PORTS_TX_RX; + +// Pins +static BYTE g_Uart_RxD_Pins[ARRAYSIZE(g_Uart_Ports)]; +static BYTE g_Uart_TxD_Pins[ARRAYSIZE(g_Uart_Ports)]; +#ifdef USART_PORTS_FLOW_CONTROL + static const GPIO_TypeDef* g_Uart_Ports_Flow_Control[] = USART_PORTS_FLOW_CONTROL; + static BYTE g_Uart_CTS_Pins[ARRAYSIZE(g_Uart_Ports)]; + static BYTE g_Uart_RTS_Pins[ARRAYSIZE(g_Uart_Ports)]; +#endif + +void USART_Handle_RX_IRQ (int ComPortNum, USART_TypeDef* uart) +{ + INTERRUPT_START; + + char c = (char)(uart->DR); // read RX data + USART_AddCharToRxBuffer(ComPortNum, c); + Events_Set(SYSTEM_EVENT_FLAG_COM_IN); + + INTERRUPT_END; +} + +void USART_Handle_TX_IRQ (int ComPortNum, USART_TypeDef* uart) +{ + INTERRUPT_START; + + char c; + if (USART_RemoveCharFromTxBuffer(ComPortNum, c)) { + uart->DR = c; // write TX data + } else { + uart->CR1 &= ~USART_CR1_TXEIE; // TX int disable + } + Events_Set(SYSTEM_EVENT_FLAG_COM_OUT); + + INTERRUPT_END; +} + +void USART_Interrupt0 (void* param) +{ + UINT16 sr = USART1->SR; + if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(0, USART1); + if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(0, USART1); +} + +void USART_Interrupt1 (void* param) +{ + UINT16 sr = USART2->SR; + if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(1, USART2); + if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(1, USART2); +} + +void USART_Interrupt2 (void* param) +{ + UINT16 sr = USART3->SR; + if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(2, USART3); + if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(2, USART3); +} + +void USART_Interrupt3 (void* param) +{ + UINT16 sr = UART4->SR; + if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(3, UART4); + if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(3, UART4); +} + +void USART_Interrupt4 (void* param) +{ + UINT16 sr = UART5->SR; + if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(4, UART5); + if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(4, UART5); +} + +void USART_Interrupt5 (void* param) +{ + UINT16 sr = USART6->SR; + if (sr & USART_SR_RXNE) + USART_Handle_RX_IRQ(5, USART6); + + if (sr & USART_SR_TXE) + USART_Handle_TX_IRQ(5, USART6); +} + +BOOL ComputeUSARTPins() +{ + // sanity check + if(ARRAYSIZE(g_Uart_Ports) != ARRAYSIZE(g_Uart_Ports_Tx_Rx)) + { + return FALSE; + } + #ifdef USART_PORTS_FLOW_CONTROL + if(ARRAYSIZE(g_Uart_Ports) != ARRAYSIZE(g_Uart_Ports_Flow_Control)) + { + return FALSE; + } + #endif + + // fill arrays with user USART ports definitions + for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) + { + if(g_Uart_Ports[i] == USART1) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOA) + { + g_Uart_RxD_Pins[i] = 10; // PA10 + g_Uart_TxD_Pins[i] = 9; // PA9 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOB) + { + g_Uart_RxD_Pins[i] = 23; // PB7 + g_Uart_TxD_Pins[i] = 22; // PB6 + } + else + { + // invalid port selection + return FALSE; + } + + #ifdef USART_PORTS_FLOW_CONTROL + if(g_Uart_Ports_Flow_Control[i] != GPIO_NO_PORT && g_Uart_Ports_Flow_Control[i] == GPIOA) + { + g_Uart_CTS_Pins[i] = 11; // PA11 + g_Uart_RTS_Pins[i] = 12; // PA12 + } + else if(g_Uart_Ports_Flow_Control[i] != GPIO_NO_PORT) + { + // invalid port selection + return FALSE; + } + #endif + } + #ifdef USART2 + else if(g_Uart_Ports[i] == USART2) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOA) + { + g_Uart_RxD_Pins[i] = 3; // PA3 + g_Uart_TxD_Pins[i] = 2; // PA2 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOD) + { + g_Uart_RxD_Pins[i] = 54; // PD6 + g_Uart_TxD_Pins[i] = 53; // PD5 + } + else + { + // invalid port selection + return FALSE; + } + + #ifdef USART_PORTS_FLOW_CONTROL + if(g_Uart_Ports_Flow_Control[i] != GPIO_NO_PORT) + { + if(g_Uart_Ports_Flow_Control[i] == GPIOA) + { + g_Uart_CTS_Pins[i] = 1; // PA1 + g_Uart_RTS_Pins[i] = 0; // PA0 + } + else if(g_Uart_Ports_Flow_Control[i] == GPIOA) + { + g_Uart_CTS_Pins[i] = 52; // PD4 + g_Uart_RTS_Pins[i] = 51; // PD3 + } + else + { + // invalid port selection + return FALSE; + } + } + #endif + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[i] == USART3) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOB) + { + g_Uart_RxD_Pins[i] = 27; // PB11 + g_Uart_TxD_Pins[i] = 26; // PB10 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOC) + { + g_Uart_RxD_Pins[i] = 43; // PC11 + g_Uart_TxD_Pins[i] = 42; // PC10 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOD) + { + g_Uart_RxD_Pins[i] = 57; // PD9 + g_Uart_TxD_Pins[i] = 56; // PD8 + } + else + // shouldn't get here! + return FALSE; + + #ifdef USART_PORTS_FLOW_CONTROL + if(g_Uart_Ports_Flow_Control[i] != GPIO_NO_PORT) + { + if(g_Uart_Ports_Flow_Control[i] == GPIOB) + { + g_Uart_CTS_Pins[i] = 30; // PB14 + g_Uart_RTS_Pins[i] = 29; // PB13 + } + else if(g_Uart_Ports_Flow_Control[i] == GPIOD) + { + g_Uart_CTS_Pins[i] = 60; // PD12 + g_Uart_RTS_Pins[i] = 59; // PD11 + } + else + { + // invalid port selection + return FALSE; + } + } + #endif + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[i] == UART4) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOA) + { + g_Uart_RxD_Pins[i] = 1; // PA1 + g_Uart_TxD_Pins[i] = 0; // PA0 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOC) + { + g_Uart_RxD_Pins[i] = 43; // PC11 + g_Uart_TxD_Pins[i] = 42; // PC10 + } + else + { + // invalid port selection + return FALSE; + } + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[i] == USART6) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOC) + { + g_Uart_RxD_Pins[i] = 39; // PC7 + g_Uart_TxD_Pins[i] = 38; // PC6 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOG) + { + g_Uart_RxD_Pins[i] = 105; // PG9 + g_Uart_TxD_Pins[i] = 110; // PG14 + } + else + { + // invalid port selection + return FALSE; + } + #ifdef USART_PORTS_FLOW_CONTROL + if(g_Uart_Ports_Flow_Control[i] != GPIO_NO_PORT && g_Uart_Ports_Flow_Control[i] == GPIOG) + { + g_Uart_CTS_Pins[i] = 109; // PG13 + g_Uart_RTS_Pins[i] = 108; // PG12 + } + else if(g_Uart_Ports_Flow_Control[i] != GPIO_NO_PORT) + { + // invalid port selection + return FALSE; + } + #endif + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[i] == UART7) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOE) + { + g_Uart_RxD_Pins[i] = 71; // PE7 + g_Uart_TxD_Pins[i] = 72; // PE8 + } + else if(g_Uart_Ports_Tx_Rx[i] == GPIOF) + { + g_Uart_RxD_Pins[i] = 86; // PF6 + g_Uart_TxD_Pins[i] = 87; // PF7 + } + else + { + // invalid port selection + return FALSE; + } + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[i] == UART8) + { + if(g_Uart_Ports_Tx_Rx[i] == GPIOE) + { + g_Uart_RxD_Pins[i] = 64; // PE0 + g_Uart_TxD_Pins[i] = 65; // PE1 + } + else + { + // invalid port selection + return FALSE; + } + } + #endif + } +} + +void EnableUSARTGPIOClocks(int ComPortNum) +{ + // Enable GPIO TX/RX clock + if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOA) + { + __HAL_RCC_GPIOA_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOB) + { + __HAL_RCC_GPIOB_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOC) + { + __HAL_RCC_GPIOC_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOD) + { + __HAL_RCC_GPIOD_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOE) + { + __HAL_RCC_GPIOE_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOF) + { + __HAL_RCC_GPIOF_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOG) + { + __HAL_RCC_GPIOG_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOH) + { + __HAL_RCC_GPIOH_CLK_ENABLE(); + } + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOI) + { + __HAL_RCC_GPIOI_CLK_ENABLE(); + } + #ifdef GPIOJ + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOJ) + { + __HAL_RCC_GPIOJ_CLK_ENABLE(); + } + #endif + #ifdef GPIOK + else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOK) + { + __HAL_RCC_GPIOK_CLK_ENABLE(); + } + #endif + + // Enable USART1 clock + if(g_Uart_Ports[ComPortNum] == USART1) + { + __HAL_RCC_USART1_CLK_ENABLE(); + } + #ifdef USART2 + else if(g_Uart_Ports[ComPortNum] == USART2) + { + __HAL_RCC_USART2_CLK_ENABLE(); + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[ComPortNum] == USART3) + { + __HAL_RCC_USART3_CLK_ENABLE(); + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[ComPortNum] == UART4) + { + __HAL_RCC_UART4_CLK_ENABLE(); + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[ComPortNum] == USART6) + { + __HAL_RCC_USART6_CLK_ENABLE(); + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[ComPortNum] == UART7) + { + __HAL_RCC_UART7_CLK_ENABLE(); + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[ComPortNum] == UART8) + { + __HAL_RCC_UART8_CLK_ENABLE(); + } + #endif +} + +void ConfigureUSARTGPIOPin(int ComPortNum) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + // USART/UART alternate function + if(g_Uart_Ports[ComPortNum] == USART1) + { + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + } + #ifdef USART2 + else if(g_Uart_Ports[ComPortNum] == USART2) + { + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[ComPortNum] == USART3) + { + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[ComPortNum] == UART4) + { + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[ComPortNum] == USART6) + { + GPIO_InitStruct.Alternate = GPIO_AF8_USART6; + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[ComPortNum] == UART7) + { + GPIO_InitStruct.Alternate = GPIO_AF8_UART7; + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[ComPortNum] == UART8) + { + GPIO_InitStruct.Alternate = GPIO_AF8_UART8; + } + #endif + + // UART TX GPIO pin configuration + GPIO_InitStruct.Pin = g_Uart_TxD_Pins[ComPortNum]; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + + HAL_GPIO_Init((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[ComPortNum], &GPIO_InitStruct); + + // UART RX GPIO pin configuration + GPIO_InitStruct.Pin = g_Uart_RxD_Pins[ComPortNum]; + + HAL_GPIO_Init((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[ComPortNum], &GPIO_InitStruct); +} + +/** + * @brief UART MSP Initialization + * This function configures the hardware resources used: + * - Compute peripherals pin arrays (only once) + * - Peripheral's clock enable + * - Peripheral's GPIO Configuration + * @param huart: UART handle pointer + * @retval None + */ +void HAL_UART_MspInit(UART_HandleTypeDef *huart) +{ + if(g_Uart_RxD_Pins[0] == 0) + { + // need to fill USART pin arrays + ComputeUSARTPins(); + } + + for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) + { + if(g_Uart_Ports[i] == huart->Instance) + { + // Enable GPIO TX/RX clock and USART clock + EnableUSARTGPIOClocks(i); + // UART TX/RX GPIO pin configuration + ConfigureUSARTGPIOPin(i); + // exit loop + break; + } + } +} + +/** + * @brief UART MSP De-Initialization + * This function frees the hardware resources used in this example: + * - Disable the Peripheral's clock + * - Revert GPIO configuration to their default state + * @param huart: UART handle pointer + * @retval None + */ +void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) +{ + /*##-1- Reset peripherals ##################################################*/ + for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) + { + if(g_Uart_Ports[i] == huart->Instance) + { + if(g_Uart_Ports[i] == USART1) + { + __HAL_RCC_USART1_FORCE_RESET(); + __HAL_RCC_USART1_RELEASE_RESET(); + } + #ifdef USART2 + else if(g_Uart_Ports[i] == USART2) + { + __HAL_RCC_USART2_FORCE_RESET(); + __HAL_RCC_USART2_RELEASE_RESET(); + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[i] == USART3) + { + __HAL_RCC_USART3_FORCE_RESET(); + __HAL_RCC_USART3_RELEASE_RESET(); + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[i] == UART4) + { + __HAL_RCC_UART4_FORCE_RESET(); + __HAL_RCC_UART4_RELEASE_RESET(); + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[i] == USART6) + { + __HAL_RCC_USART6_FORCE_RESET(); + __HAL_RCC_USART6_RELEASE_RESET(); + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[i] == UART7) + { + __HAL_RCC_UART7_FORCE_RESET(); + __HAL_RCC_UART7_RELEASE_RESET(); + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[i] == UART8) + { + __HAL_RCC_UART8_FORCE_RESET(); + __HAL_RCC_UART8_RELEASE_RESET(); + } + #endif + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure UART Tx as alternate function */ + HAL_GPIO_DeInit((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[i], g_Uart_TxD_Pins[i]); + /* Configure UART Rx as alternate function */ + HAL_GPIO_DeInit((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[i], g_Uart_RxD_Pins[i]); + } + } +} + +BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) +{ + UART_HandleTypeDef UartHandle; + + if (ComPortNum >= TOTAL_USART_PORT) + return FALSE; + + if (Parity >= USART_PARITY_MARK) + return FALSE; + + GLOBAL_LOCK(irq); + + // USART_TypeDef* uart = g_Uart_Ports[ComPortNum]; + + // UINT32 clk; + + // // enable UART clock + // if (ComPortNum == 5) + // { // COM6 on APB2 + // RCC->APB2ENR |= RCC_APB2ENR_USART6EN; + // clk = SYSTEM_APB2_CLOCK_HZ; + // } + // else if (ComPortNum == 0) + // { // COM1 on APB2 + // RCC->APB2ENR |= RCC_APB2ENR_USART1EN; + // clk = SYSTEM_APB2_CLOCK_HZ; + // } + // else if (ComPortNum < 5) + // { // COM2-5 on APB1 + // RCC->APB1ENR |= RCC_APB1ENR_USART2EN >> 1 << ComPortNum; + // clk = SYSTEM_APB1_CLOCK_HZ; + // } + // else + // { // COM7-8 on APB1 + // RCC->APB1ENR |= RCC_APB1ENR_UART7EN >> 6 << ComPortNum; + // clk = SYSTEM_APB1_CLOCK_HZ; + // } + + // baudrate + // UINT16 div = (UINT16)((clk + (BaudRate >> 1)) / BaudRate); // rounded + // uart->BRR = div; + + UartHandle.Instance = (USART_TypeDef*)g_Uart_Ports[ComPortNum]; + UartHandle.Init.BaudRate = BaudRate; + // UART Number of Stop Bits + if (StopBits == USART_STOP_BITS_TWO) + { + UartHandle.Init.StopBits = USART_CR2_STOP_1; + } + else + { + UartHandle.Init.StopBits = 0; + } + // UART Parity + if(Parity == UART_PARITY_ODD) + { + UartHandle.Init.Parity = USART_CR1_PCE | USART_CR1_PS; + } + else if(Parity == UART_PARITY_EVEN) + { + UartHandle.Init.Parity = USART_CR1_PCE; + DataBits++; + } + else + { + UartHandle.Init.Parity = 0; + } + // UART Word Length + if (DataBits == 9) + UartHandle.Init.WordLength = USART_CR1_M; + else + { + if (DataBits != 8) + return FALSE; + UartHandle.Init.WordLength = 0; + } + // UART Hardware Flow Control + if (FlowValue & USART_FLOW_NONE) + { + UartHandle.Init.HwFlowCtl |= 0; + } + if (FlowValue & USART_FLOW_HW_OUT_EN) + { + UartHandle.Init.HwFlowCtl |= USART_CR3_CTSE; + } + if (FlowValue & USART_FLOW_HW_IN_EN) + { + UartHandle.Init.HwFlowCtl |= USART_CR3_RTSE; + } + + UartHandle.Init.Mode = UART_MODE_TX_RX; + UartHandle.Init.OverSampling = UART_OVERSAMPLING_16; + + // // control + // UINT16 ctrl = USART_CR1_TE | USART_CR1_RE; + // if (Parity) { + // ctrl |= USART_CR1_PCE; + // DataBits++; + // } + + // if (Parity == USART_PARITY_ODD) + // ctrl |= USART_CR1_PS; + + // if (DataBits == 9) + // ctrl |= USART_CR1_M; + // else + // { + // if (DataBits != 8) + // return FALSE; + // } + // uart->CR1 = ctrl; + + // if (StopBits == USART_STOP_BITS_ONE) + // StopBits = 0; + + // uart->CR2 = (UINT16)(StopBits << 12); + + // ctrl = 0; + // if (FlowValue & USART_FLOW_HW_OUT_EN) + // ctrl |= USART_CR3_CTSE; + + // if (FlowValue & USART_FLOW_HW_IN_EN) + // ctrl |= USART_CR3_RTSE; + + // uart->CR3 = ctrl; + + // GPIO_PIN rxPin, txPin, ctsPin, rtsPin; + // CPU_USART_GetPins(ComPortNum, rxPin, txPin, ctsPin, rtsPin); + // UINT32 alternate = 0x72; // AF7 = USART1-3 + // if (ComPortNum >= 3) + // alternate = 0x82; // AF8 = UART4-8 + + // CPU_GPIO_DisablePin(rxPin, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); + // CPU_GPIO_DisablePin(txPin, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); + // if (FlowValue & USART_FLOW_HW_OUT_EN) + // { + // if (ctsPin == GPIO_PIN_NONE) + // return FALSE; + + // CPU_GPIO_DisablePin(ctsPin, RESISTOR_DISABLED, 0, (GPIO_ALT_MODE)alternate); + // } + + // if (FlowValue & USART_FLOW_HW_IN_EN) + // { + // if (rtsPin == GPIO_PIN_NONE) + // return FALSE; + + // CPU_GPIO_DisablePin(rtsPin, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); + // } + + // CPU_USART_ProtectPins(ComPortNum, FALSE); + +// switch (ComPortNum) +// { +// case 0: +// CPU_INTC_ActivateInterrupt(USART1_IRQn, USART_Interrupt0, 0); +// break; + +// case 1: +// CPU_INTC_ActivateInterrupt(USART2_IRQn, USART_Interrupt1, 0); +// break; + +// case 2: +// CPU_INTC_ActivateInterrupt(USART3_IRQn, USART_Interrupt2, 0); +// break; + +// case 3: +// CPU_INTC_ActivateInterrupt(UART4_IRQn, USART_Interrupt3, 0); +// break; + +// case 4: +// CPU_INTC_ActivateInterrupt(UART5_IRQn, USART_Interrupt4, 0); +// break; + +// case 5: +// CPU_INTC_ActivateInterrupt(USART6_IRQn, USART_Interrupt5, 0); +// break; + +// // some SoCS have more UARTs (default is 6 ) +// #if TOTAL_USART_PORT > 6 +// case 6: +// CPU_INTC_ActivateInterrupt(UART7_IRQn, USART_Interrupt4, 0); +// break; + +// case 7: +// CPU_INTC_ActivateInterrupt(UART8_IRQn, USART_Interrupt5, 0); +// break; +// #endif +// } + +// uart->CR1 |= USART_CR1_UE; // start uart + + if(HAL_UART_Init(&UartHandle) != HAL_OK) + { + return FALSE; + } + return TRUE; +} + +BOOL CPU_USART_Uninitialize( int ComPortNum ) +{ + GLOBAL_LOCK(irq); + + ((USART_TypeDef*)g_Uart_Ports[ComPortNum])->CR1 = 0; // stop uart + +// switch (ComPortNum) +// { +// case 0: +// CPU_INTC_DeactivateInterrupt(USART1_IRQn); +// break; + +// case 1: +// CPU_INTC_DeactivateInterrupt(USART2_IRQn); +// break; + +// case 2: +// CPU_INTC_DeactivateInterrupt(USART3_IRQn); +// break; + +// case 3: +// CPU_INTC_DeactivateInterrupt(UART4_IRQn); +// break; + +// case 4: +// CPU_INTC_DeactivateInterrupt(UART5_IRQn); +// break; + +// case 5: +// CPU_INTC_DeactivateInterrupt(USART6_IRQn); +// break; + +// // some SoCS have more UARTs (default is 6 ) +// #if TOTAL_USART_PORT > 6 +// case 6: +// CPU_INTC_DeactivateInterrupt(UART7_IRQn); +// break; + +// case 7: +// CPU_INTC_DeactivateInterrupt(UART8_IRQn); +// break; +// #endif +// } + + CPU_USART_ProtectPins(ComPortNum, TRUE); + + // // disable UART clock + // if (ComPortNum == 5) + // { // COM6 on APB2 + // RCC->APB2ENR &= ~RCC_APB2ENR_USART6EN; + // } + // else if (ComPortNum == 0) + // { // COM1 on APB2 + // RCC->APB2ENR &= ~RCC_APB2ENR_USART1EN; + // } + // else if (ComPortNum < 5) + // { // COM2-5 on APB1 + // RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN >> 1 << ComPortNum); + // } + // else + // { // COM7-8 on APB1 + // RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN >> 6 << ComPortNum); + // } + + return TRUE; +} + +BOOL CPU_USART_TxBufferEmpty( int ComPortNum ) +{ + if (g_Uart_Ports[ComPortNum]->SR & USART_SR_TXE) + return TRUE; + + return FALSE; +} + +BOOL CPU_USART_TxShiftRegisterEmpty( int ComPortNum ) +{ + if (g_Uart_Ports[ComPortNum]->SR & USART_SR_TC) + return TRUE; + + return FALSE; +} + +void CPU_USART_WriteCharToTxBuffer( int ComPortNum, UINT8 c ) +{ +#ifdef DEBUG + ASSERT(CPU_USART_TxBufferEmpty(ComPortNum)); +#endif + ((USART_TypeDef*)g_Uart_Ports[ComPortNum])->DR = c; +} + +void CPU_USART_TxBufferEmptyInterruptEnable( int ComPortNum, BOOL Enable ) +{ + USART_TypeDef* uart = (USART_TypeDef*)g_Uart_Ports[ComPortNum]; + if (Enable) + { + uart->CR1 |= USART_CR1_TXEIE; // tx int enable + } + else + { + uart->CR1 &= ~USART_CR1_TXEIE; // tx int disable + } +} + +BOOL CPU_USART_TxBufferEmptyInterruptState( int ComPortNum ) +{ + if (g_Uart_Ports[ComPortNum]->CR1 & USART_CR1_TXEIE) + return TRUE; + + return FALSE; +} + +void CPU_USART_RxBufferFullInterruptEnable( int ComPortNum, BOOL Enable ) +{ + USART_TypeDef* uart = (USART_TypeDef*)g_Uart_Ports[ComPortNum]; + if (Enable) + { + uart->CR1 |= USART_CR1_RXNEIE; // rx int enable + } + else + { + uart->CR1 &= ~USART_CR1_RXNEIE; // rx int disable + } +} + +BOOL CPU_USART_RxBufferFullInterruptState( int ComPortNum ) +{ + if (g_Uart_Ports[ComPortNum]->CR1 & USART_CR1_RXNEIE) + return TRUE; + + return FALSE; +} + +BOOL CPU_USART_TxHandshakeEnabledState( int ComPortNum ) +{ + // The state of the CTS input only matters if Flow Control is enabled +#ifdef USART_PORTS_FLOW_CONTROL + if( (UINT32)ComPortNum < ARRAYSIZE_CONST_EXPR(g_Uart_CTS_Pins) + && g_Uart_Ports[ComPortNum]->CR3 & USART_CR3_CTSE + ) + { + return !CPU_GPIO_GetPinState(g_Uart_CTS_Pins[ComPortNum]); // CTS active + } +#endif + + return TRUE; // If this handshake input is not being used, it is assumed to be good +} + +void CPU_USART_ProtectPins( int ComPortNum, BOOL On ) // idempotent +{ + if (On) + { + CPU_USART_RxBufferFullInterruptEnable(ComPortNum, FALSE); + CPU_USART_TxBufferEmptyInterruptEnable(ComPortNum, FALSE); + } + else + { + CPU_USART_TxBufferEmptyInterruptEnable(ComPortNum, TRUE); + CPU_USART_RxBufferFullInterruptEnable(ComPortNum, TRUE); + } +} + +UINT32 CPU_USART_PortsCount() +{ + return TOTAL_USART_PORT; +} + +void CPU_USART_GetPins( int ComPortNum, GPIO_PIN& rxPin, GPIO_PIN& txPin,GPIO_PIN& ctsPin, GPIO_PIN& rtsPin ) +{ + rxPin = txPin = ctsPin = rtsPin = GPIO_PIN_NONE; + if ((UINT32)ComPortNum >= ARRAYSIZE_CONST_EXPR(g_Uart_RxD_Pins)) + return; + + rxPin = g_Uart_RxD_Pins[ComPortNum]; + txPin = g_Uart_TxD_Pins[ComPortNum]; + +#if defined(UART_CTS_PINS) && defined(UART_RTS_PINS) + if ((UINT32)ComPortNum >= ARRAYSIZE_CONST_EXPR(g_Uart_CTS_Pins)) + return; // no CTS/RTS + + ctsPin = g_Uart_CTS_Pins[ComPortNum]; + rtsPin = g_Uart_RTS_Pins[ComPortNum]; +#endif +} + +void CPU_USART_GetBaudrateBoundary( int ComPortNum, UINT32 & maxBaudrateHz, UINT32 & minBaudrateHz ) +{ + UINT32 clk = SYSTEM_APB2_CLOCK_HZ; + if (ComPortNum && ComPortNum != 5) + clk = SYSTEM_APB1_CLOCK_HZ; + + maxBaudrateHz = clk >> 4; + minBaudrateHz = clk >> 16; +} + +BOOL CPU_USART_SupportNonStandardBaudRate( int ComPortNum ) +{ + return TRUE; +} + +BOOL CPU_USART_IsBaudrateSupported( int ComPortNum, UINT32& BaudrateHz ) +{ + UINT32 max = SYSTEM_APB2_CLOCK_HZ >> 4; + if (ComPortNum && ComPortNum != 5) + max = SYSTEM_APB1_CLOCK_HZ >> 4; + + if (BaudrateHz <= max) + return TRUE; + + BaudrateHz = max; + return FALSE; +} + + diff --git a/DeviceCode/Targets/CMSIS/USART/dotNetMF.proj b/DeviceCode/Targets/CMSIS/USART/dotNetMF.proj new file mode 100644 index 000000000..8b23c9ea0 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USART/dotNetMF.proj @@ -0,0 +1,33 @@ + + + CMSIS_USART + + + {54531FA9-DF5E-4FA5-A0D7-0D5129EEC321} + CMSIS USART driver + HAL + CMSIS_USART.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\USART\dotNetMF.proj + CMSIS_USART.$(LIB_EXT).manifest + + + + False + + + False + False + False + DeviceCode\Targets\CMSIS\USART + Library + false + 4.0.0.0 + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 0c8a15a45..d032f73ce 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -36,7 +36,8 @@ - + + @@ -84,17 +85,27 @@ +
+ + + + + + + + + + + + - - - - + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index dc397ae21..750438b47 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -129,6 +129,18 @@ + + + + + + + + + + + + @@ -138,7 +150,7 @@ - + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index c0ba1ba4f..843fb742b 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -46,6 +46,10 @@ + + + + @@ -101,10 +105,6 @@ - - - - @@ -137,10 +137,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 321cce563..60fe7af31 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -12,6 +12,7 @@ True False False + False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 965f7368c..658a78c7b 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -83,6 +83,10 @@ + + + + @@ -250,10 +254,6 @@ - - - - @@ -306,10 +306,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 01a0c5ba1..7ad6666d3 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -12,6 +12,7 @@ True True False + False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 37d8f72e3..057216609 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -71,6 +71,10 @@ + + + + @@ -222,10 +226,6 @@ - - - - @@ -278,10 +278,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index d767019f0..b8f1852fe 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -12,6 +12,7 @@ True True False + False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 5cf73b256..bd5c3ae9f 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -47,6 +47,10 @@ + + + + @@ -91,13 +95,13 @@ - + - - + + @@ -131,10 +135,6 @@ - - - - @@ -220,4 +220,4 @@ -
\ No newline at end of file +
diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index af9b13a47..4b3dcc309 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -12,6 +12,7 @@ True False False + True False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index ae27a32e2..774d9c8f2 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -73,9 +73,13 @@ + + + + - + @@ -223,10 +227,6 @@ - - - - @@ -279,10 +279,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 2aeac05b8..9735a88d4 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -10,10 +10,14 @@ True - True + False False + True +<<<<<<< Updated upstream False +======= +>>>>>>> Stashed changes False False From 12a5e52fda652a3f6604e785edf1105d192726d4 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Thu, 17 Mar 2016 12:11:20 +0000 Subject: [PATCH 036/144] Missing file from last commit, defines needed --- .../STM32F4DISCOVERY/platform_selector.h | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 51523229f..97e751572 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -111,15 +111,20 @@ #define STM32F4_PWM_CHNL {0,1,2,3} #define STM32F4_PWM_PINS {60,61,62,63} // PD12-PD15 -// #define STM32F4_SPI_SCLK_PINS {5, 29, 42} // PA5, PB13, PC10 -// #define STM32F4_SPI_MISO_PINS {6, 30, 43} // PA6, PB14, PC11 -// #define STM32F4_SPI_MOSI_PINS {7, 31, 44} // PA7, PB15, PC12 -#define SPI_PORTS {SPI1, SPI2, SPI3} - - -#define STM32F4_I2C_PORT 1 -#define STM32F4_I2C_SCL_PIN PORT_PIN( GPIO_PORTB, 8 ) // PB8 -#define STM32F4_I2C_SDA_PIN PORT_PIN( GPIO_PORTB, 9 ) // PB9 +// add to SPI_PORTS array the SPI ports that are available in the solution +// please check which SPI ports are available in the device datasheet +// uncomment the following define and leave the SPI ports that are available in your hardware +//#define SPI_PORTS {SPI1, SPI2, SPI3, SPI4, SPI5, SPI6} + +// add to USART_PORTS array the USART ports that are available in the solution +// please check which USART ports are available in the device datasheet +// uncomment the following define and leave the USART ports that are available in your hardware and you intend to use +// NOTE: UART5 is not supported because TX and RX are handled in different ports +#define USART_PORTS {USART1, USART2, USART6} +#define USART_PORTS_TX_RX {GPIOA, GPIOD, GPIOC, GPIOC, GPIOG} +// to use flow control, uncomment below define and leave the USART ports that are available in your hardware and you intend to use +#define GPIO_NO_PORT 0 +#define USART_PORTS_FLOW_CONTROL {GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT} #define STM32F4_UART_RXD_PINS {23, 54, 43} // PB7, D6, C11 #define STM32F4_UART_TXD_PINS {22, 53, 42} // PB6, D5, C10 From 26568a6070de3a33f91d2997e8189b694f1291ab Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 17 Mar 2016 13:03:03 +0000 Subject: [PATCH 037/144] Add back wrongly removed feature project for SPI and I2C --- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 2 ++ Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 2 ++ Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 658a78c7b..5f6af2870 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -61,6 +61,8 @@ + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 057216609..eea64e717 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -57,6 +57,8 @@ + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 774d9c8f2..cc4b0d6a0 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -59,6 +59,8 @@ + + From c6575b1ca2e579a4703d6fd780fe2d1ec205bd9c Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 18 Mar 2016 10:50:45 +0000 Subject: [PATCH 038/144] Implement CMSIS time to provide NETMF time base --- .../Targets/CMSIS/Time/Time_functions.cpp | 323 ++++++++++++++++++ DeviceCode/Targets/CMSIS/Time/dotNetMF.proj | 35 ++ 2 files changed, 358 insertions(+) create mode 100644 DeviceCode/Targets/CMSIS/Time/Time_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/Time/dotNetMF.proj diff --git a/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp b/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp new file mode 100644 index 000000000..38bff4812 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp @@ -0,0 +1,323 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Eclo Solutions Lda. +// +// *** System Timer Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +static UINT64 g_nextEvent; // tick time of next event to be scheduled +TIM_HandleTypeDef masterTimerHandle; +TIM_HandleTypeDef slaveTimerHandle; + +//--// + +/* +NETMF time base requires a resolution of 100ns (1MHz). +That requires a timer with 48 bits resolution, which doesn't exit in the supported Cortex M platforms. +The solution is to synchronize 2 timers: + - MASTER with 32 bits resolution (lower bits) + - SLAVE with 16 bits resolution (upper bits) + (32+16=48, check!) + +In previous NETMF HAL implementations the developer could choose which timers would be synchronized to implement the HAL timer. +For the current HAL implementation (CMSIS based) we choose to go with a fixed configuration, for simplicity. + +TIM2 will be used as "master" timer synchronized with TIM1 "slave". + +*/ +BOOL HAL_Time_Initialize() +{ + g_nextEvent = 0xFFFFFFFFFFFF; // never + + TIM_MasterConfigTypeDef sMasterConfig; + TIM_SlaveConfigTypeDef sSlaveConfig; + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock, uwAPB1Prescaler = 0U; + uint32_t uwPrescalerValue = 0U; + uint32_t pFLatency; + + // master (32 bit) timer is Timer 2 + masterTimerHandle.Instance = TIM2; + // slave (16 bit) timer is Timer 2 + slaveTimerHandle.Instance = TIM3; + + // enable master clock + __TIM2_CLK_ENABLE(); + + // Configure the master timer IRQ priority one level above the HAL tick + HAL_NVIC_SetPriority(TIM2_IRQn, TICK_INT_PRIORITY + 1, 0U); + // enable master timer global Interrupt + HAL_NVIC_EnableIRQ(TIM2_IRQn); + + // enable slave clock + __TIM3_CLK_ENABLE(); + + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + + /* Get APB1 prescaler */ + uwAPB1Prescaler = clkconfig.APB1CLKDivider; + + /* Compute TIM6 clock */ + if (uwAPB1Prescaler == RCC_HCLK_DIV1) + { + uwTimclock = HAL_RCC_GetPCLK1Freq(); + } + else + { + uwTimclock = 2*HAL_RCC_GetPCLK1Freq(); + } + + /* Compute the prescaler value to have the timer counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); + + /* master timer initialization as follows: + Period = [(TIM2CLK/1000) - 1]. to have a (1/1000) s time base. + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + ClockDivision = 0 + Counter direction = Up + */ + masterTimerHandle.Init.Period = (1000000U / 1000U) - 1U; + masterTimerHandle.Init.Prescaler = uwPrescalerValue; + masterTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + masterTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + + // Only counter overflow/underflow generates an update interrupt request + //masterTimerHandle.Instance->CR1 |= TIM_CR1_URS; + + // master configration for the master timer + sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; + if(HAL_TIMEx_MasterConfigSynchronization(&masterTimerHandle, &sMasterConfig) != HAL_OK) + { + /* Configuration Error */ + // FIXME + //Error_Handler(); + } + + if(HAL_TIM_Base_Init(&masterTimerHandle) != HAL_OK) + { + // something went wrong + return FALSE; + } + + // slave timer + slaveTimerHandle.Init.Period = 0; + slaveTimerHandle.Init.Prescaler = 0; + slaveTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + slaveTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + + // Only counter overflow/underflow generates an update interrupt request + //slaveTimerHandle.Instance->CR1 |= TIM_CR1_URS; + + // slave configuration for the slave timer + sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; + sSlaveConfig.InputTrigger = TIM_TS_ITR1; + if(HAL_TIM_SlaveConfigSynchronization(&slaveTimerHandle, &sSlaveConfig) != HAL_OK) + { + /* Configuration Error */ + // FIXME + //Error_Handler(); + } + + // config master sync for slave + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE; + if(HAL_TIMEx_MasterConfigSynchronization(&slaveTimerHandle, &sMasterConfig) != HAL_OK) + { + /* Configuration Error */ + // FIXME + //Error_Handler(); + } + + if(HAL_TIM_Base_Init(&slaveTimerHandle) != HAL_OK) + { + // something went wrong + return FALSE; + } + + // Starts the 32 bits timer Input Capture measurement in interrupt mode for channel 1 + + if(HAL_TIM_Base_Start(&slaveTimerHandle) == HAL_OK) + { + // Starts the 32 bits timer Input Capture measurement in interrupt mode for channel 1 + if(HAL_TIM_IC_Start_IT(&masterTimerHandle, TIM_CHANNEL_1) == HAL_OK) + { + return TRUE; + } + } + + return FALSE; +} + +BOOL HAL_Time_Uninitialize() +{ + // disable master timer clock + __TIM2_CLK_DISABLE(); + // disable interrupt for master timer + HAL_NVIC_DisableIRQ(TIM2_IRQn); + // disable slave timer clock + __TIM3_CLK_DISABLE(); + + return TRUE; +} + +#pragma arm section code = "SectionForFlashOperations" +UINT64 __section("SectionForFlashOperations") HAL_Time_CurrentTicks() +{ + UINT32 t2, t3; // cascaded timers + do + { + t3 = slaveTimerHandle.Instance->CNT; + t2 = masterTimerHandle.Instance->CNT; + } + while (t3 != slaveTimerHandle.Instance->CNT); // asure consistent values + + return t2 | (UINT64)t3 << 32; +} +#pragma arm section code + +INT64 HAL_Time_TicksToTime(UINT64 ticks) +{ + return CPU_TicksToTime(ticks); +} + +INT64 HAL_Time_CurrentTime() +{ + return CPU_TicksToTime(HAL_Time_CurrentTicks()); +} + +void HAL_Time_SetCompare(UINT64 compareValue) +{ + GLOBAL_LOCK(irq); + + g_nextEvent = compareValue; + + masterTimerHandle.Instance->CCR1 = (UINT32)compareValue; // compare to low bits + + if (HAL_Time_CurrentTicks() >= compareValue) + { + // missed event + // trigger immediate interrupt with event source being capture compare 1 + HAL_TIM_GenerateEvent(&masterTimerHandle, TIM_EVENTSOURCE_CC1); + } +} + +#pragma arm section code = "SectionForFlashOperations" +// +// To calibrate this constant, uncomment #define CALIBRATE_SLEEP_USEC in TinyHAL.c +// +#define STM32F4_SLEEP_USEC_FIXED_OVERHEAD_CLOCKS 3 + +void __section("SectionForFlashOperations") HAL_Time_Sleep_MicroSeconds(UINT32 uSec) +{ + GLOBAL_LOCK(irq); + + UINT32 current = HAL_Time_CurrentTicks(); + UINT32 maxDiff = CPU_MicrosecondsToTicks(uSec); + + if(maxDiff <= STM32F4_SLEEP_USEC_FIXED_OVERHEAD_CLOCKS) + { + maxDiff = 0; + } + else + { + maxDiff -= STM32F4_SLEEP_USEC_FIXED_OVERHEAD_CLOCKS; + } + + while(((INT32)(HAL_Time_CurrentTicks() - current)) <= maxDiff); +} + +void HAL_Time_Sleep_MicroSeconds_InterruptEnabled(UINT32 uSec) +{ + // iterations must be signed so that negative iterations will result in the minimum delay + uSec *= (HAL_RCC_GetHCLKFreq() / 1000000); + + // iterations is equal to the number of CPU instruction cycles in the required time minus + // overhead cycles required to call this subroutine. + int iterations = (int)uSec - 5; // Subtract off call & calculation overhead + + CYCLE_DELAY_LOOP(iterations); +} +#pragma arm section code + +void HAL_Time_GetDriftParameters(INT32* a, INT32* b, INT64* c) +{ + *a = 1; + *b = 1; + *c = 0; +} + +UINT32 CPU_SystemClock() +{ + return HAL_RCC_GetHCLKFreq(); +} + +UINT32 CPU_TicksPerSecond() +{ + // this is always 1MHz because of the configuration of the base timer used for the NETMF HAL + return 1000000; +} + +UINT64 CPU_MillisecondsToTicks(UINT64 ticks) +{ + return ticks; +} + +UINT64 CPU_MillisecondsToTicks(UINT32 ticks32) +{ + return (UINT64)ticks32; +} + +#pragma arm section code = "SectionForFlashOperations" +UINT64 __section("SectionForFlashOperations") CPU_MicrosecondsToTicks(UINT64 uSec) +{ + return uSec; +} + +UINT32 __section("SectionForFlashOperations") CPU_MicrosecondsToTicks(UINT32 uSec) +{ + return uSec; +} +#pragma arm section code + +UINT32 CPU_MicrosecondsToSystemClocks(UINT32 uSec) +{ + return uSec * (HAL_RCC_GetHCLKFreq() / 1000000); +} + +UINT64 CPU_TicksToTime(UINT64 ticks) +{ + return ticks * 10; +} + +UINT64 CPU_TicksToTime(UINT32 ticks32) +{ + return (UINT64)ticks32 * 10; +} + +// must add pragma/section here otherwise the linker doesn't replace the weak declaration for it that is in startup +extern "C" void TIM2_IRQHandler(void) +{ + HAL_TIM_IRQHandler(&masterTimerHandle); +} + +void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) + { + if (HAL_Time_CurrentTicks() >= g_nextEvent) + { + // handle event + HAL_COMPLETION::DequeueAndExec(); // this also schedules the next one, if there is one + } + } +} diff --git a/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj b/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj new file mode 100644 index 000000000..f2df7ee47 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj @@ -0,0 +1,35 @@ + + + + CMSIS_time + + + {21D7B547-C341-4DAC-8F5D-3CA47C2AF70F} + CMSIS time driver + HAL + CMSIS_time.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Time\dotNetMF.proj + CMSIS_time.$(LIB_EXT).manifest + Processor\STM32F4 + + + False + + + False + False + False + DeviceCode\CMSIS\Time + Library + false + 4.0.0.0 + + + + + + + + + + From 75813c1e49dd7a4921c4f3f66e08c934eee24fdd Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 18 Mar 2016 11:02:25 +0000 Subject: [PATCH 039/144] Rework HAL - add file with interrupt handlers - removed NVIC call to set priority of SysTickIRS (HAL_Init is already taking care of this) - removed code to config HAL_SYSTICK in System_Clock_Config (HAL_Init is already taking care of this) - remove definition of several interrupt handlers from the startup code (GCC is not replacing the weak refs with the hard ones, maybe a bug?) - moved asm files to the bottom - correct indentation --- .../STM32F4xx/GNU_S/startup_tinyBooter.s | 223 +++++++++--------- .../Native/STM32F4xx/GNU_S/startup_tinyCLR.s | 23 +- .../{Int_Handlers.cpp => Int_Handlers.c} | 38 +-- .../Native/STM32F4xx/SystemClock_Config.c | 9 - .../Native/STM32F4xx/dotNetMF_loader.proj | 101 ++++---- .../Native/STM32F4xx/stm32f4xx_hal_msp.c | 4 - 6 files changed, 181 insertions(+), 217 deletions(-) rename DeviceCode/Targets/Native/STM32F4xx/{Int_Handlers.cpp => Int_Handlers.c} (79%) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s index a3bc310a5..ec34b630c 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s @@ -51,8 +51,7 @@ .global HeapBegin .global HeapEnd .global _end - - .global Fault_Handler +.extern FAULT_SubHandler /* start address for the initialization values of the .data section. defined in linker script */ @@ -150,110 +149,108 @@ Infinite_Loop: .type ARM_Vectors, %object .size ARM_Vectors, .-ARM_Vectors - ARM_Vectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler + .long _estack + .long Reset_Handler + .long NMI_Handler + .long HardFault_Handler + .long MemManage_Handler + .long BusFault_Handler + .long UsageFault_Handler + .long 0 + .long 0 + .long 0 + .long 0 + .long SVC_Handler + .long DebugMon_Handler + .long 0 + .long PendSV_Handler + .long SysTick_Handler /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word 0 /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - - + .long WWDG_IRQHandler /* Window WatchDog */ + .long PVD_IRQHandler /* PVD through EXTI Line detection */ + .long TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .long RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .long FLASH_IRQHandler /* FLASH */ + .long RCC_IRQHandler /* RCC */ + .long EXTI0_IRQHandler /* EXTI Line0 */ + .long EXTI1_IRQHandler /* EXTI Line1 */ + .long EXTI2_IRQHandler /* EXTI Line2 */ + .long EXTI3_IRQHandler /* EXTI Line3 */ + .long EXTI4_IRQHandler /* EXTI Line4 */ + .long DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .long DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .long DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .long DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .long DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .long DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .long DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .long ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .long CAN1_TX_IRQHandler /* CAN1 TX */ + .long CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .long CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .long CAN1_SCE_IRQHandler /* CAN1 SCE */ + .long EXTI9_5_IRQHandler /* External Line[9:5]s */ + .long TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .long TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .long TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .long TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .long TIM2_IRQHandler /* TIM2 */ + .long TIM3_IRQHandler /* TIM3 */ + .long TIM4_IRQHandler /* TIM4 */ + .long I2C1_EV_IRQHandler /* I2C1 Event */ + .long I2C1_ER_IRQHandler /* I2C1 Error */ + .long I2C2_EV_IRQHandler /* I2C2 Event */ + .long I2C2_ER_IRQHandler /* I2C2 Error */ + .long SPI1_IRQHandler /* SPI1 */ + .long SPI2_IRQHandler /* SPI2 */ + .long USART1_IRQHandler /* USART1 */ + .long USART2_IRQHandler /* USART2 */ + .long USART3_IRQHandler /* USART3 */ + .long EXTI15_10_IRQHandler /* External Line[15:10]s */ + .long RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .long OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .long TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .long TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .long TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .long TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .long DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .long FSMC_IRQHandler /* FSMC */ + .long SDIO_IRQHandler /* SDIO */ + .long TIM5_IRQHandler /* TIM5 */ + .long SPI3_IRQHandler /* SPI3 */ + .long UART4_IRQHandler /* UART4 */ + .long UART5_IRQHandler /* UART5 */ + .long TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .long TIM7_IRQHandler /* TIM7 */ + .long DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .long DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .long DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .long DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .long DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .long ETH_IRQHandler /* Ethernet */ + .long ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .long CAN2_TX_IRQHandler /* CAN2 TX */ + .long CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .long CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .long CAN2_SCE_IRQHandler /* CAN2 SCE */ + .long OTG_FS_IRQHandler /* USB OTG FS */ + .long DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .long DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .long DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .long USART6_IRQHandler /* USART6 */ + .long I2C3_EV_IRQHandler /* I2C3 event */ + .long I2C3_ER_IRQHandler /* I2C3 error */ + .long OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .long OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .long OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .long OTG_HS_IRQHandler /* USB OTG HS */ + .long DCMI_IRQHandler /* DCMI */ + .long 0 /* CRYP crypto */ + .long HASH_RNG_IRQHandler /* Hash and Rng */ + .long FPU_IRQHandler /* FPU */ + /******************************************************************************* * * Provide weak aliases for each Exception handler to the Default_Handler. @@ -262,19 +259,19 @@ ARM_Vectors: * *******************************************************************************/ .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler + .thumb_set NMI_Handler,FAULT_SubHandler .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler + .thumb_set HardFault_Handler,FAULT_SubHandler .weak MemManage_Handler .thumb_set MemManage_Handler,Default_Handler - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler + /*.weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler*/ - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler + /*.weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler*/ .weak SVC_Handler .thumb_set SVC_Handler,Default_Handler @@ -285,8 +282,9 @@ ARM_Vectors: .weak PendSV_Handler .thumb_set PendSV_Handler,Default_Handler + /* implemented at Int_Handlers.c */ /*.weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler*/ + .thumb_set SysTick_Handler,Default_Handler*/ .weak WWDG_IRQHandler .thumb_set WWDG_IRQHandler,Default_Handler @@ -372,8 +370,9 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler + /* implemented at Time_functions.cpp */ + /*.weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler*/ .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s index 25e052656..34a3ee266 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s @@ -59,6 +59,7 @@ .global CustomHeapEnd .global __initial_sp +.external FAULT_SubHandler /* start address for the initialization values of the .data section. defined in linker script */ @@ -303,19 +304,19 @@ ARM_Vectors: * *******************************************************************************/ .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler + .thumb_set NMI_Handler,FAULT_SubHandler .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler + .thumb_set HardFault_Handler,FAULT_SubHandler .weak MemManage_Handler .thumb_set MemManage_Handler,Default_Handler - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler + /*.weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler*/ - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler + /*.weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler*/ .weak SVC_Handler .thumb_set SVC_Handler,Default_Handler @@ -326,8 +327,9 @@ ARM_Vectors: .weak PendSV_Handler .thumb_set PendSV_Handler,Default_Handler - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler + /* implemented at Int_Handlers.c */ + /*.weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler*/ .weak WWDG_IRQHandler .thumb_set WWDG_IRQHandler,Default_Handler @@ -413,8 +415,9 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler + /* implemented at Time_functions.cpp */ + /*.weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler*/ .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c similarity index 79% rename from DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp rename to DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c index 2d3584886..c57d2a86b 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c @@ -39,7 +39,6 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ -extern PCD_HandleTypeDef hpcd; /******************************************************************************/ /* Cortex-M4 Processor Interruption and Exception Handlers */ @@ -150,40 +149,13 @@ __weak void PendSV_Handler(void) * @param None * @retval None */ -// defined as weak so it can be overriden at the solution +// defined as weak so it can be overriden at the solution __weak void SysTick_Handler(void) { - HAL_IncTick(); - - /* Call user callback */ - HAL_SYSTICK_IRQHandler(); - + // required to provide accurate timming for HAL + // the following call ensures a milliseconds timming + HAL_IncTick(); + HAL_SYSTICK_IRQHandler(); } -/******************************************************************************/ -/* STM32F4xx Peripherals Interrupt Handlers */ -/* Add here the Interrupt Handler for the used peripheral(s) , for the */ -/* available peripheral interrupt handler's name please refer to the startup */ -/* file (startup_stm32f407xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles External line 0 interrupt request. - * @param None - * @retval None - */ -void EXTI0_IRQHandler(void) -{ - //HAL_GPIO_EXTI_IRQHandler(KEY_BUTTON_PIN); -} - -/** - * @brief This function handles USB-On-The-Go FS/HS global interrupt request. - * @param None - * @retval None - */ -void OTG_FS_IRQHandler(void) -{ - HAL_PCD_IRQHandler(&hpcd); -} /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c b/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c index a61991332..86988a538 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c +++ b/DeviceCode/Targets/Native/STM32F4xx/SystemClock_Config.c @@ -80,13 +80,4 @@ void SystemClock_Config(void) { while(1) { ; } } - - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_4); - - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); - - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); } diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 750438b47..661ecf905 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -1,53 +1,49 @@  - - TinyHal_loader_STM32F4xx - {004F0043-0024-0097-95A3-64C26394C72A} - - - STM32F4xx HAL library (for boot loaders) - HAL - TinyHAL_loader_STM32F4xx.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\dotNetMF_loader.proj - TinyHAL_loader_STM32F4xx.$(LIB_EXT).manifest - HAL - - - False - - - False - False - False - DeviceCode\Targets\Native\STM32F4xx - true - false - 4.0.0.0 - - - - - Library - - - - - - - - - - - - - + + TinyHal_loader_STM32F4xx + {004F0043-0024-0097-95A3-64C26394C72A} + + + STM32F4xx HAL library (for boot loaders) + HAL + TinyHAL_loader_STM32F4xx.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\dotNetMF_loader.proj + TinyHAL_loader_STM32F4xx.$(LIB_EXT).manifest + HAL + + + False + + + False + False + False + DeviceCode\Targets\Native\STM32F4xx + true + false + 4.0.0.0 + + + + + Library + + + + + + + + + - - - - - - + + + + + + @@ -152,6 +148,13 @@ - - + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c b/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c index 0f96361dc..d310bf8d6 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c +++ b/DeviceCode/Targets/Native/STM32F4xx/stm32f4xx_hal_msp.c @@ -65,11 +65,7 @@ // defined as weak to allow it to be overriden by equivalent function at Solution level __weak void HAL_MspInit(void) { - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - /* System interrupt init*/ - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); } /** From 80d267d2ff96c1048a5a5de907a648f8464c28a2 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 18 Mar 2016 11:02:50 +0000 Subject: [PATCH 040/144] Correct comment --- DeviceCode/Targets/CMSIS/Time/Time_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp b/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp index 38bff4812..dac85c083 100644 --- a/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp +++ b/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp @@ -304,7 +304,7 @@ UINT64 CPU_TicksToTime(UINT32 ticks32) return (UINT64)ticks32 * 10; } -// must add pragma/section here otherwise the linker doesn't replace the weak declaration for it that is in startup +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler extern "C" void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&masterTimerHandle); From 6720441c895f07dc80e0831dec108ea9d58980b9 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 18 Mar 2016 11:05:00 +0000 Subject: [PATCH 041/144] Enable MCU debug when not building RTM --- DeviceCode/Initialization/tinyhal.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index 5ec9ba171..32669122c 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -374,10 +374,16 @@ __attribute__((weak)) int main(void) */ if(HAL_Init() == HAL_OK) { - + // debug enable options + #if !defined(BUILD_RTM) + HAL_DBGMCU_EnableDBGSleepMode(); + HAL_DBGMCU_EnableDBGStopMode(); + HAL_DBGMCU_EnableDBGStandbyMode(); + #endif + /* Configure the system clock */ SystemClock_Config(); - + HAL_Time_Initialize(); HAL_Initialize(); From 1c35f1aac51efd1fd24e3c64647d1081942bf16c Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 18 Mar 2016 18:13:39 +0000 Subject: [PATCH 042/144] - Handle USART/UART interupts --- .../Targets/CMSIS/USART/USART_functions.cpp | 709 +++++++++--------- 1 file changed, 371 insertions(+), 338 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp index 109f25cec..2e23661e8 100644 --- a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp +++ b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp @@ -30,23 +30,44 @@ static BYTE g_Uart_TxD_Pins[ARRAYSIZE(g_Uart_Ports)]; static BYTE g_Uart_RTS_Pins[ARRAYSIZE(g_Uart_Ports)]; #endif -void USART_Handle_RX_IRQ (int ComPortNum, USART_TypeDef* uart) +static UART_HandleTypeDef * uartHandlers[ARRAYSIZE(g_Uart_Ports)]; + +/** + * @brief Get USART/UART Index + * This function goes throw g_Uart_Ports to find uart index + * @param uart: UART + * @retval uart index in g_Uart_Ports array + */ +int GetUsartIndex(USART_TypeDef* uart) +{ + for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) + { + if(g_Uart_Ports[i] == uart) + { + return i; + } + } + // need a default + return 0; +} + +void USART_Handle_RX_IRQ (int comPortNum, USART_TypeDef* uart) { INTERRUPT_START; char c = (char)(uart->DR); // read RX data - USART_AddCharToRxBuffer(ComPortNum, c); + USART_AddCharToRxBuffer(comPortNum, c); Events_Set(SYSTEM_EVENT_FLAG_COM_IN); INTERRUPT_END; } -void USART_Handle_TX_IRQ (int ComPortNum, USART_TypeDef* uart) +void USART_Handle_TX_IRQ (int comPortNum, USART_TypeDef* uart) { INTERRUPT_START; char c; - if (USART_RemoveCharFromTxBuffer(ComPortNum, c)) { + if (USART_RemoveCharFromTxBuffer(comPortNum, c)) { uart->DR = c; // write TX data } else { uart->CR1 &= ~USART_CR1_TXEIE; // TX int disable @@ -56,51 +77,6 @@ void USART_Handle_TX_IRQ (int ComPortNum, USART_TypeDef* uart) INTERRUPT_END; } -void USART_Interrupt0 (void* param) -{ - UINT16 sr = USART1->SR; - if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(0, USART1); - if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(0, USART1); -} - -void USART_Interrupt1 (void* param) -{ - UINT16 sr = USART2->SR; - if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(1, USART2); - if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(1, USART2); -} - -void USART_Interrupt2 (void* param) -{ - UINT16 sr = USART3->SR; - if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(2, USART3); - if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(2, USART3); -} - -void USART_Interrupt3 (void* param) -{ - UINT16 sr = UART4->SR; - if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(3, UART4); - if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(3, UART4); -} - -void USART_Interrupt4 (void* param) -{ - UINT16 sr = UART5->SR; - if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(4, UART5); - if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(4, UART5); -} - -void USART_Interrupt5 (void* param) -{ - UINT16 sr = USART6->SR; - if (sr & USART_SR_RXNE) - USART_Handle_RX_IRQ(5, USART6); - - if (sr & USART_SR_TXE) - USART_Handle_TX_IRQ(5, USART6); -} - BOOL ComputeUSARTPins() { // sanity check @@ -324,159 +300,292 @@ BOOL ComputeUSARTPins() } } -void EnableUSARTGPIOClocks(int ComPortNum) +void EnableUSARTGPIOClocks(int comPortNum) { // Enable GPIO TX/RX clock - if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOA) + if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOA) { __HAL_RCC_GPIOA_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOB) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOB) { __HAL_RCC_GPIOB_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOC) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOC) { __HAL_RCC_GPIOC_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOD) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOD) { __HAL_RCC_GPIOD_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOE) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOE) { __HAL_RCC_GPIOE_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOF) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOF) { __HAL_RCC_GPIOF_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOG) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOG) { __HAL_RCC_GPIOG_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOH) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOH) { __HAL_RCC_GPIOH_CLK_ENABLE(); } - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOI) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOI) { __HAL_RCC_GPIOI_CLK_ENABLE(); } #ifdef GPIOJ - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOJ) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOJ) { __HAL_RCC_GPIOJ_CLK_ENABLE(); } #endif #ifdef GPIOK - else if(g_Uart_Ports_Tx_Rx[ComPortNum] == GPIOK) + else if(g_Uart_Ports_Tx_Rx[comPortNum] == GPIOK) { __HAL_RCC_GPIOK_CLK_ENABLE(); } #endif // Enable USART1 clock - if(g_Uart_Ports[ComPortNum] == USART1) + if(g_Uart_Ports[comPortNum] == USART1) { __HAL_RCC_USART1_CLK_ENABLE(); } #ifdef USART2 - else if(g_Uart_Ports[ComPortNum] == USART2) + else if(g_Uart_Ports[comPortNum] == USART2) { __HAL_RCC_USART2_CLK_ENABLE(); } #endif #ifdef USART3 - else if(g_Uart_Ports[ComPortNum] == USART3) + else if(g_Uart_Ports[comPortNum] == USART3) { __HAL_RCC_USART3_CLK_ENABLE(); } #endif #ifdef UART4 - else if(g_Uart_Ports[ComPortNum] == UART4) + else if(g_Uart_Ports[comPortNum] == UART4) { __HAL_RCC_UART4_CLK_ENABLE(); } #endif #ifdef USART6 - else if(g_Uart_Ports[ComPortNum] == USART6) + else if(g_Uart_Ports[comPortNum] == USART6) { __HAL_RCC_USART6_CLK_ENABLE(); } #endif #ifdef UART7 - else if(g_Uart_Ports[ComPortNum] == UART7) + else if(g_Uart_Ports[comPortNum] == UART7) { __HAL_RCC_UART7_CLK_ENABLE(); } #endif #ifdef UART8 - else if(g_Uart_Ports[ComPortNum] == UART8) + else if(g_Uart_Ports[comPortNum] == UART8) { __HAL_RCC_UART8_CLK_ENABLE(); } #endif } -void ConfigureUSARTGPIOPin(int ComPortNum) +void ConfigureUSARTGPIOPin(int comPortNum) { GPIO_InitTypeDef GPIO_InitStruct; // USART/UART alternate function - if(g_Uart_Ports[ComPortNum] == USART1) + if(g_Uart_Ports[comPortNum] == USART1) { GPIO_InitStruct.Alternate = GPIO_AF7_USART1; } #ifdef USART2 - else if(g_Uart_Ports[ComPortNum] == USART2) + else if(g_Uart_Ports[comPortNum] == USART2) { GPIO_InitStruct.Alternate = GPIO_AF7_USART2; } #endif #ifdef USART3 - else if(g_Uart_Ports[ComPortNum] == USART3) + else if(g_Uart_Ports[comPortNum] == USART3) { GPIO_InitStruct.Alternate = GPIO_AF7_USART3; } #endif #ifdef UART4 - else if(g_Uart_Ports[ComPortNum] == UART4) + else if(g_Uart_Ports[comPortNum] == UART4) { GPIO_InitStruct.Alternate = GPIO_AF8_UART4; } #endif #ifdef USART6 - else if(g_Uart_Ports[ComPortNum] == USART6) + else if(g_Uart_Ports[comPortNum] == USART6) { GPIO_InitStruct.Alternate = GPIO_AF8_USART6; } #endif #ifdef UART7 - else if(g_Uart_Ports[ComPortNum] == UART7) + else if(g_Uart_Ports[comPortNum] == UART7) { GPIO_InitStruct.Alternate = GPIO_AF8_UART7; } #endif #ifdef UART8 - else if(g_Uart_Ports[ComPortNum] == UART8) + else if(g_Uart_Ports[comPortNum] == UART8) { GPIO_InitStruct.Alternate = GPIO_AF8_UART8; } #endif // UART TX GPIO pin configuration - GPIO_InitStruct.Pin = g_Uart_TxD_Pins[ComPortNum]; + GPIO_InitStruct.Pin = g_Uart_TxD_Pins[comPortNum]; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; - HAL_GPIO_Init((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[ComPortNum], &GPIO_InitStruct); + HAL_GPIO_Init((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[comPortNum], &GPIO_InitStruct); // UART RX GPIO pin configuration - GPIO_InitStruct.Pin = g_Uart_RxD_Pins[ComPortNum]; + GPIO_InitStruct.Pin = g_Uart_RxD_Pins[comPortNum]; + + HAL_GPIO_Init((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[comPortNum], &GPIO_InitStruct); +} + +void SetUSARTPriority(int comPortNum) +{ + // USART/UART alternate function + if(g_Uart_Ports[comPortNum] == USART1) + { + HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); + } + #ifdef USART2 + else if(g_Uart_Ports[comPortNum] == USART2) + { + HAL_NVIC_SetPriority(USART2_IRQn, 0, 1); + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[comPortNum] == USART3) + { + HAL_NVIC_SetPriority(USART3_IRQn, 0, 1); + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[comPortNum] == UART4) + { + HAL_NVIC_SetPriority(UART4_IRQn, 0, 1); + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[comPortNum] == USART6) + { + HAL_NVIC_SetPriority(USART6_IRQn, 0, 1); + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[comPortNum] == UART7) + { + HAL_NVIC_SetPriority(UART7_IRQn, 0, 1); + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[comPortNum] == UART8) + { + HAL_NVIC_SetPriority(UART8_IRQn, 0, 1); + } + #endif +} + +void EnableUSARTInt(int comPortNum) +{ + if(g_Uart_Ports[comPortNum] == USART1) + { + HAL_NVIC_EnableIRQ(USART1_IRQn); + } + #ifdef USART2 + else if(g_Uart_Ports[comPortNum] == USART2) + { + HAL_NVIC_EnableIRQ(USART2_IRQn); + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[comPortNum] == USART3) + { + HAL_NVIC_EnableIRQ(USART3_IRQn); + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[comPortNum] == UART4) + { + HAL_NVIC_EnableIRQ(UART4_IRQn); + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[comPortNum] == USART6) + { + HAL_NVIC_EnableIRQ(USART6_IRQn); + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[comPortNum] == UART7) + { + HAL_NVIC_EnableIRQ(UART7_IRQn); + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[comPortNum] == UART8) + { + HAL_NVIC_EnableIRQ(UART8_IRQn); + } + #endif +} - HAL_GPIO_Init((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[ComPortNum], &GPIO_InitStruct); +void DisableUSARTInt(int comPortNum) +{ + if(g_Uart_Ports[comPortNum] == USART1) + { + HAL_NVIC_DisableIRQ(USART1_IRQn); + } + #ifdef USART2 + else if(g_Uart_Ports[comPortNum] == USART2) + { + HAL_NVIC_DisableIRQ(USART2_IRQn); + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[comPortNum] == USART3) + { + HAL_NVIC_DisableIRQ(USART3_IRQn); + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[comPortNum] == UART4) + { + HAL_NVIC_DisableIRQ(UART4_IRQn); + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[comPortNum] == USART6) + { + HAL_NVIC_DisableIRQ(USART6_IRQn); + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[comPortNum] == UART7) + { + HAL_NVIC_DisableIRQ(UART7_IRQn); + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[comPortNum] == UART8) + { + HAL_NVIC_DisableIRQ(UART8_IRQn); + } + #endif } /** @@ -490,24 +599,21 @@ void ConfigureUSARTGPIOPin(int ComPortNum) */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { + // get usart index + int index = GetUsartIndex(huart->Instance); + if(g_Uart_RxD_Pins[0] == 0) { // need to fill USART pin arrays ComputeUSARTPins(); } - for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) - { - if(g_Uart_Ports[i] == huart->Instance) - { - // Enable GPIO TX/RX clock and USART clock - EnableUSARTGPIOClocks(i); - // UART TX/RX GPIO pin configuration - ConfigureUSARTGPIOPin(i); - // exit loop - break; - } - } + // Enable GPIO TX/RX clock and USART clock + EnableUSARTGPIOClocks(index); + // UART TX/RX GPIO pin configuration + ConfigureUSARTGPIOPin(index); + // Set USARTx priority + SetUSARTPriority(index); } /** @@ -520,114 +626,83 @@ void HAL_UART_MspInit(UART_HandleTypeDef *huart) */ void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) { + // get usart index + int index = GetUsartIndex(huart->Instance); /*##-1- Reset peripherals ##################################################*/ - for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) + if(huart->Instance == USART1) { - if(g_Uart_Ports[i] == huart->Instance) - { - if(g_Uart_Ports[i] == USART1) - { - __HAL_RCC_USART1_FORCE_RESET(); - __HAL_RCC_USART1_RELEASE_RESET(); - } - #ifdef USART2 - else if(g_Uart_Ports[i] == USART2) - { - __HAL_RCC_USART2_FORCE_RESET(); - __HAL_RCC_USART2_RELEASE_RESET(); - } - #endif - #ifdef USART3 - else if(g_Uart_Ports[i] == USART3) - { - __HAL_RCC_USART3_FORCE_RESET(); - __HAL_RCC_USART3_RELEASE_RESET(); - } - #endif - #ifdef UART4 - else if(g_Uart_Ports[i] == UART4) - { - __HAL_RCC_UART4_FORCE_RESET(); - __HAL_RCC_UART4_RELEASE_RESET(); - } - #endif - #ifdef USART6 - else if(g_Uart_Ports[i] == USART6) - { - __HAL_RCC_USART6_FORCE_RESET(); - __HAL_RCC_USART6_RELEASE_RESET(); - } - #endif - #ifdef UART7 - else if(g_Uart_Ports[i] == UART7) - { - __HAL_RCC_UART7_FORCE_RESET(); - __HAL_RCC_UART7_RELEASE_RESET(); - } - #endif - #ifdef UART8 - else if(g_Uart_Ports[i] == UART8) - { - __HAL_RCC_UART8_FORCE_RESET(); - __HAL_RCC_UART8_RELEASE_RESET(); - } - #endif - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure UART Tx as alternate function */ - HAL_GPIO_DeInit((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[i], g_Uart_TxD_Pins[i]); - /* Configure UART Rx as alternate function */ - HAL_GPIO_DeInit((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[i], g_Uart_RxD_Pins[i]); - } + __HAL_RCC_USART1_FORCE_RESET(); + __HAL_RCC_USART1_RELEASE_RESET(); + } + #ifdef USART2 + else if(huart->Instance == USART2) + { + __HAL_RCC_USART2_FORCE_RESET(); + __HAL_RCC_USART2_RELEASE_RESET(); + } + #endif + #ifdef USART3 + else if(huart->Instance == USART3) + { + __HAL_RCC_USART3_FORCE_RESET(); + __HAL_RCC_USART3_RELEASE_RESET(); + } + #endif + #ifdef UART4 + else if(huart->Instance == UART4) + { + __HAL_RCC_UART4_FORCE_RESET(); + __HAL_RCC_UART4_RELEASE_RESET(); + } + #endif + #ifdef USART6 + else if(huart->Instance == USART6) + { + __HAL_RCC_USART6_FORCE_RESET(); + __HAL_RCC_USART6_RELEASE_RESET(); + } + #endif + #ifdef UART7 + else if(huart->Instance == UART7) + { + __HAL_RCC_UART7_FORCE_RESET(); + __HAL_RCC_UART7_RELEASE_RESET(); + } + #endif + #ifdef UART8 + else if(huart->Instance == UART8) + { + __HAL_RCC_UART8_FORCE_RESET(); + __HAL_RCC_UART8_RELEASE_RESET(); } + #endif + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure UART Tx as alternate function */ + HAL_GPIO_DeInit((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[index], g_Uart_TxD_Pins[index]); + /* Configure UART Rx as alternate function */ + HAL_GPIO_DeInit((GPIO_TypeDef*)g_Uart_Ports_Tx_Rx[index], g_Uart_RxD_Pins[index]); } -BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) +BOOL CPU_USART_Initialize(int comPortNum, int baudRate, int parity, int dataBits, int stopBits, int flowValue) { UART_HandleTypeDef UartHandle; - if (ComPortNum >= TOTAL_USART_PORT) + + uartHandlers[comPortNum]; + + if (comPortNum >= TOTAL_USART_PORT) return FALSE; - if (Parity >= USART_PARITY_MARK) + if (parity >= USART_PARITY_MARK) return FALSE; GLOBAL_LOCK(irq); - // USART_TypeDef* uart = g_Uart_Ports[ComPortNum]; - - // UINT32 clk; - - // // enable UART clock - // if (ComPortNum == 5) - // { // COM6 on APB2 - // RCC->APB2ENR |= RCC_APB2ENR_USART6EN; - // clk = SYSTEM_APB2_CLOCK_HZ; - // } - // else if (ComPortNum == 0) - // { // COM1 on APB2 - // RCC->APB2ENR |= RCC_APB2ENR_USART1EN; - // clk = SYSTEM_APB2_CLOCK_HZ; - // } - // else if (ComPortNum < 5) - // { // COM2-5 on APB1 - // RCC->APB1ENR |= RCC_APB1ENR_USART2EN >> 1 << ComPortNum; - // clk = SYSTEM_APB1_CLOCK_HZ; - // } - // else - // { // COM7-8 on APB1 - // RCC->APB1ENR |= RCC_APB1ENR_UART7EN >> 6 << ComPortNum; - // clk = SYSTEM_APB1_CLOCK_HZ; - // } - - // baudrate - // UINT16 div = (UINT16)((clk + (BaudRate >> 1)) / BaudRate); // rounded - // uart->BRR = div; - - UartHandle.Instance = (USART_TypeDef*)g_Uart_Ports[ComPortNum]; - UartHandle.Init.BaudRate = BaudRate; + UartHandle.Instance = (USART_TypeDef*)g_Uart_Ports[comPortNum]; + UartHandle.Init.BaudRate = baudRate; // UART Number of Stop Bits - if (StopBits == USART_STOP_BITS_TWO) + if (stopBits == USART_STOP_BITS_TWO) { UartHandle.Init.StopBits = USART_CR2_STOP_1; } @@ -636,38 +711,38 @@ BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBit UartHandle.Init.StopBits = 0; } // UART Parity - if(Parity == UART_PARITY_ODD) + if(parity == UART_PARITY_ODD) { UartHandle.Init.Parity = USART_CR1_PCE | USART_CR1_PS; } - else if(Parity == UART_PARITY_EVEN) + else if(parity == UART_PARITY_EVEN) { UartHandle.Init.Parity = USART_CR1_PCE; - DataBits++; + dataBits++; } else { UartHandle.Init.Parity = 0; } // UART Word Length - if (DataBits == 9) + if (dataBits == 9) UartHandle.Init.WordLength = USART_CR1_M; else { - if (DataBits != 8) + if (dataBits != 8) return FALSE; UartHandle.Init.WordLength = 0; } // UART Hardware Flow Control - if (FlowValue & USART_FLOW_NONE) + if (flowValue & USART_FLOW_NONE) { UartHandle.Init.HwFlowCtl |= 0; } - if (FlowValue & USART_FLOW_HW_OUT_EN) + if (flowValue & USART_FLOW_HW_OUT_EN) { UartHandle.Init.HwFlowCtl |= USART_CR3_CTSE; } - if (FlowValue & USART_FLOW_HW_IN_EN) + if (flowValue & USART_FLOW_HW_IN_EN) { UartHandle.Init.HwFlowCtl |= USART_CR3_RTSE; } @@ -709,9 +784,9 @@ BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBit // uart->CR3 = ctrl; // GPIO_PIN rxPin, txPin, ctsPin, rtsPin; - // CPU_USART_GetPins(ComPortNum, rxPin, txPin, ctsPin, rtsPin); + // CPU_USART_GetPins(comPortNum, rxPin, txPin, ctsPin, rtsPin); // UINT32 alternate = 0x72; // AF7 = USART1-3 - // if (ComPortNum >= 3) + // if (comPortNum >= 3) // alternate = 0x82; // AF8 = UART4-8 // CPU_GPIO_DisablePin(rxPin, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); @@ -732,150 +807,59 @@ BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBit // CPU_GPIO_DisablePin(rtsPin, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); // } - // CPU_USART_ProtectPins(ComPortNum, FALSE); + // CPU_USART_ProtectPins(comPortNum, FALSE); -// switch (ComPortNum) -// { -// case 0: -// CPU_INTC_ActivateInterrupt(USART1_IRQn, USART_Interrupt0, 0); -// break; - -// case 1: -// CPU_INTC_ActivateInterrupt(USART2_IRQn, USART_Interrupt1, 0); -// break; - -// case 2: -// CPU_INTC_ActivateInterrupt(USART3_IRQn, USART_Interrupt2, 0); -// break; - -// case 3: -// CPU_INTC_ActivateInterrupt(UART4_IRQn, USART_Interrupt3, 0); -// break; - -// case 4: -// CPU_INTC_ActivateInterrupt(UART5_IRQn, USART_Interrupt4, 0); -// break; - -// case 5: -// CPU_INTC_ActivateInterrupt(USART6_IRQn, USART_Interrupt5, 0); -// break; - -// // some SoCS have more UARTs (default is 6 ) -// #if TOTAL_USART_PORT > 6 -// case 6: -// CPU_INTC_ActivateInterrupt(UART7_IRQn, USART_Interrupt4, 0); -// break; - -// case 7: -// CPU_INTC_ActivateInterrupt(UART8_IRQn, USART_Interrupt5, 0); -// break; -// #endif -// } - -// uart->CR1 |= USART_CR1_UE; // start uart - if(HAL_UART_Init(&UartHandle) != HAL_OK) { return FALSE; } + + // Enable the NVIC for UART + EnableUSARTInt(comPortNum); + return TRUE; } -BOOL CPU_USART_Uninitialize( int ComPortNum ) +BOOL CPU_USART_Uninitialize(int comPortNum) { GLOBAL_LOCK(irq); - ((USART_TypeDef*)g_Uart_Ports[ComPortNum])->CR1 = 0; // stop uart - -// switch (ComPortNum) -// { -// case 0: -// CPU_INTC_DeactivateInterrupt(USART1_IRQn); -// break; - -// case 1: -// CPU_INTC_DeactivateInterrupt(USART2_IRQn); -// break; - -// case 2: -// CPU_INTC_DeactivateInterrupt(USART3_IRQn); -// break; - -// case 3: -// CPU_INTC_DeactivateInterrupt(UART4_IRQn); -// break; - -// case 4: -// CPU_INTC_DeactivateInterrupt(UART5_IRQn); -// break; - -// case 5: -// CPU_INTC_DeactivateInterrupt(USART6_IRQn); -// break; - -// // some SoCS have more UARTs (default is 6 ) -// #if TOTAL_USART_PORT > 6 -// case 6: -// CPU_INTC_DeactivateInterrupt(UART7_IRQn); -// break; - -// case 7: -// CPU_INTC_DeactivateInterrupt(UART8_IRQn); -// break; -// #endif -// } - - CPU_USART_ProtectPins(ComPortNum, TRUE); - - // // disable UART clock - // if (ComPortNum == 5) - // { // COM6 on APB2 - // RCC->APB2ENR &= ~RCC_APB2ENR_USART6EN; - // } - // else if (ComPortNum == 0) - // { // COM1 on APB2 - // RCC->APB2ENR &= ~RCC_APB2ENR_USART1EN; - // } - // else if (ComPortNum < 5) - // { // COM2-5 on APB1 - // RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN >> 1 << ComPortNum); - // } - // else - // { // COM7-8 on APB1 - // RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN >> 6 << ComPortNum); - // } + ((USART_TypeDef*)g_Uart_Ports[comPortNum])->CR1 = 0; // stop uart + + // Disable the NVIC for UART + DisableUSARTInt(comPortNum); return TRUE; } -BOOL CPU_USART_TxBufferEmpty( int ComPortNum ) +BOOL CPU_USART_TxBufferEmpty(int comPortNum) { - if (g_Uart_Ports[ComPortNum]->SR & USART_SR_TXE) + if (g_Uart_Ports[comPortNum]->SR & USART_SR_TXE) return TRUE; return FALSE; } -BOOL CPU_USART_TxShiftRegisterEmpty( int ComPortNum ) +BOOL CPU_USART_TxShiftRegisterEmpty(int comPortNum) { - if (g_Uart_Ports[ComPortNum]->SR & USART_SR_TC) + if (g_Uart_Ports[comPortNum]->SR & USART_SR_TC) return TRUE; return FALSE; } -void CPU_USART_WriteCharToTxBuffer( int ComPortNum, UINT8 c ) +void CPU_USART_WriteCharToTxBuffer(int comPortNum, UINT8 c) { #ifdef DEBUG - ASSERT(CPU_USART_TxBufferEmpty(ComPortNum)); + ASSERT(CPU_USART_TxBufferEmpty(comPortNum)); #endif - ((USART_TypeDef*)g_Uart_Ports[ComPortNum])->DR = c; + ((USART_TypeDef*)g_Uart_Ports[comPortNum])->DR = c; } -void CPU_USART_TxBufferEmptyInterruptEnable( int ComPortNum, BOOL Enable ) +void CPU_USART_TxBufferEmptyInterruptEnable(int comPortNum, BOOL enable) { - USART_TypeDef* uart = (USART_TypeDef*)g_Uart_Ports[ComPortNum]; - if (Enable) + USART_TypeDef* uart = (USART_TypeDef*)g_Uart_Ports[comPortNum]; + if (enable) { uart->CR1 |= USART_CR1_TXEIE; // tx int enable } @@ -885,18 +869,18 @@ void CPU_USART_TxBufferEmptyInterruptEnable( int ComPortNum, BOOL Enable ) } } -BOOL CPU_USART_TxBufferEmptyInterruptState( int ComPortNum ) +BOOL CPU_USART_TxBufferEmptyInterruptState(int comPortNum) { - if (g_Uart_Ports[ComPortNum]->CR1 & USART_CR1_TXEIE) + if (g_Uart_Ports[comPortNum]->CR1 & USART_CR1_TXEIE) return TRUE; return FALSE; } -void CPU_USART_RxBufferFullInterruptEnable( int ComPortNum, BOOL Enable ) +void CPU_USART_RxBufferFullInterruptEnable(int comPortNum, BOOL enable) { - USART_TypeDef* uart = (USART_TypeDef*)g_Uart_Ports[ComPortNum]; - if (Enable) + USART_TypeDef* uart = (USART_TypeDef*)g_Uart_Ports[comPortNum]; + if (enable) { uart->CR1 |= USART_CR1_RXNEIE; // rx int enable } @@ -906,40 +890,40 @@ void CPU_USART_RxBufferFullInterruptEnable( int ComPortNum, BOOL Enable ) } } -BOOL CPU_USART_RxBufferFullInterruptState( int ComPortNum ) +BOOL CPU_USART_RxBufferFullInterruptState(int comPortNum) { - if (g_Uart_Ports[ComPortNum]->CR1 & USART_CR1_RXNEIE) + if (g_Uart_Ports[comPortNum]->CR1 & USART_CR1_RXNEIE) return TRUE; return FALSE; } -BOOL CPU_USART_TxHandshakeEnabledState( int ComPortNum ) +BOOL CPU_USART_TxHandshakeEnabledState(int comPortNum) { // The state of the CTS input only matters if Flow Control is enabled #ifdef USART_PORTS_FLOW_CONTROL - if( (UINT32)ComPortNum < ARRAYSIZE_CONST_EXPR(g_Uart_CTS_Pins) - && g_Uart_Ports[ComPortNum]->CR3 & USART_CR3_CTSE - ) + if( (UINT32)comPortNum < ARRAYSIZE_CONST_EXPR(g_Uart_CTS_Pins) + && g_Uart_Ports[comPortNum]->CR3 & USART_CR3_CTSE + ) { - return !CPU_GPIO_GetPinState(g_Uart_CTS_Pins[ComPortNum]); // CTS active + return !CPU_GPIO_GetPinState(g_Uart_CTS_Pins[comPortNum]); // CTS active } #endif return TRUE; // If this handshake input is not being used, it is assumed to be good } -void CPU_USART_ProtectPins( int ComPortNum, BOOL On ) // idempotent +void CPU_USART_ProtectPins(int comPortNum, BOOL on) // idempotent { - if (On) + if (on) { - CPU_USART_RxBufferFullInterruptEnable(ComPortNum, FALSE); - CPU_USART_TxBufferEmptyInterruptEnable(ComPortNum, FALSE); + CPU_USART_RxBufferFullInterruptEnable(comPortNum, FALSE); + CPU_USART_TxBufferEmptyInterruptEnable(comPortNum, FALSE); } else { - CPU_USART_TxBufferEmptyInterruptEnable(ComPortNum, TRUE); - CPU_USART_RxBufferFullInterruptEnable(ComPortNum, TRUE); + CPU_USART_TxBufferEmptyInterruptEnable(comPortNum, TRUE); + CPU_USART_RxBufferFullInterruptEnable(comPortNum, TRUE); } } @@ -948,50 +932,99 @@ UINT32 CPU_USART_PortsCount() return TOTAL_USART_PORT; } -void CPU_USART_GetPins( int ComPortNum, GPIO_PIN& rxPin, GPIO_PIN& txPin,GPIO_PIN& ctsPin, GPIO_PIN& rtsPin ) +void CPU_USART_GetPins(int comPortNum, GPIO_PIN& rxPin, GPIO_PIN& txPin,GPIO_PIN& ctsPin, GPIO_PIN& rtsPin) { rxPin = txPin = ctsPin = rtsPin = GPIO_PIN_NONE; - if ((UINT32)ComPortNum >= ARRAYSIZE_CONST_EXPR(g_Uart_RxD_Pins)) + if ((UINT32)comPortNum >= ARRAYSIZE_CONST_EXPR(g_Uart_RxD_Pins)) return; - rxPin = g_Uart_RxD_Pins[ComPortNum]; - txPin = g_Uart_TxD_Pins[ComPortNum]; + rxPin = g_Uart_RxD_Pins[comPortNum]; + txPin = g_Uart_TxD_Pins[comPortNum]; #if defined(UART_CTS_PINS) && defined(UART_RTS_PINS) - if ((UINT32)ComPortNum >= ARRAYSIZE_CONST_EXPR(g_Uart_CTS_Pins)) + if ((UINT32)comPortNum >= ARRAYSIZE_CONST_EXPR(g_Uart_CTS_Pins)) return; // no CTS/RTS - ctsPin = g_Uart_CTS_Pins[ComPortNum]; - rtsPin = g_Uart_RTS_Pins[ComPortNum]; + ctsPin = g_Uart_CTS_Pins[comPortNum]; + rtsPin = g_Uart_RTS_Pins[comPortNum]; #endif } -void CPU_USART_GetBaudrateBoundary( int ComPortNum, UINT32 & maxBaudrateHz, UINT32 & minBaudrateHz ) +void CPU_USART_GetBaudrateBoundary(int comPortNum, UINT32 & maxBaudrateHz, UINT32 & minBaudrateHz) { UINT32 clk = SYSTEM_APB2_CLOCK_HZ; - if (ComPortNum && ComPortNum != 5) + if (comPortNum && comPortNum != 5) clk = SYSTEM_APB1_CLOCK_HZ; maxBaudrateHz = clk >> 4; minBaudrateHz = clk >> 16; } -BOOL CPU_USART_SupportNonStandardBaudRate( int ComPortNum ) +BOOL CPU_USART_SupportNonStandardBaudRate(int comPortNum) { return TRUE; } -BOOL CPU_USART_IsBaudrateSupported( int ComPortNum, UINT32& BaudrateHz ) +BOOL CPU_USART_IsBaudrateSupported(int comPortNum, UINT32& baudrateHz) { UINT32 max = SYSTEM_APB2_CLOCK_HZ >> 4; - if (ComPortNum && ComPortNum != 5) + if (comPortNum && comPortNum != 5) max = SYSTEM_APB1_CLOCK_HZ >> 4; - if (BaudrateHz <= max) + if (baudrateHz <= max) return TRUE; - BaudrateHz = max; + baudrateHz = max; return FALSE; } +void GlobalUsartHandler(USART_TypeDef* uart) +{ + UINT16 sr = uart->SR; + if (sr & USART_SR_RXNE) USART_Handle_RX_IRQ(GetUsartIndex(uart), uart); + if (sr & USART_SR_TXE) USART_Handle_TX_IRQ(GetUsartIndex(uart), uart); +} + +#ifdef USART1 +void USART1_IRQHandler(void) +{ + GlobalUsartHandler(USART1); +} +#endif +#ifdef USART2 +void USART2_IRQHandler(void) +{ + GlobalUsartHandler(USART2); +} +#endif +#ifdef USART3 +void USART3_IRQHandler(void) +{ + GlobalUsartHandler(USART3); +} +#endif +#ifdef UART4 +void UART4_IRQHandler(void) +{ + GlobalUsartHandler(UART4); +} +#endif +#ifdef USART6 +void USART6_IRQHandler(void) +{ + GlobalUsartHandler(USART6); +} +#endif +#ifdef UART7 +void UART7_IRQHandler(void) +{ + GlobalUsartHandler(UART7); +} +#endif +#ifdef UART8 +void UART8_IRQHandler(void) +{ + GlobalUsartHandler(UART8); +} +#endif From a1e5ddeabfb8c6920d947fe786626a1e027ce883 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Sat, 19 Mar 2016 17:41:49 +0000 Subject: [PATCH 043/144] Implement CMCSIS power - this includes a different (simplified) implemention to be used in TinyBooter - manages CPU power modes changes and reset - remove repeated code in tinybooter.cpp - remove unused stubs from TinyBooter projects --- DeviceCode/Initialization/tinyhal.cpp | 9 +- .../Targets/CMSIS/Power/Power_functions.cpp | 143 ++++++++++++++++++ .../CMSIS/Power/Power_functions_loader.cpp | 76 ++++++++++ DeviceCode/Targets/CMSIS/Power/dotNetMF.proj | 37 +++++ .../Targets/CMSIS/Power/dotNetMF_loader.proj | 37 +++++ .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 6 +- .../TinyBooter/TinyBooterEntry.cpp | 9 -- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 6 +- .../TinyCLR_NONET/TinyCLR_NONET.proj | 4 +- .../TinyBooter/TinyBooter.proj | 23 +-- .../TinyBooter/TinyBooterEntry.cpp | 9 -- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 9 +- 12 files changed, 314 insertions(+), 54 deletions(-) create mode 100644 DeviceCode/Targets/CMSIS/Power/Power_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/Power/Power_functions_loader.cpp create mode 100644 DeviceCode/Targets/CMSIS/Power/dotNetMF.proj create mode 100644 DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index 32669122c..a08046fa2 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -387,7 +387,14 @@ __attribute__((weak)) int main(void) HAL_Time_Initialize(); HAL_Initialize(); - + + // check if system is waking-up from STANDBY power mode + if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) + { + // TODO + // we may want to handle this to pass it somehow to the NETMF API + } + #if !defined(BUILD_RTM) //DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); //DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); diff --git a/DeviceCode/Targets/CMSIS/Power/Power_functions.cpp b/DeviceCode/Targets/CMSIS/Power/Power_functions.cpp new file mode 100644 index 000000000..128ca8e8c --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Power/Power_functions.cpp @@ -0,0 +1,143 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Open Technologies. All rights reserved. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda +// +// *** CPU Power States *** +// +////////////////////////////////////////////////////////////////////////////////////////// + +#include + +//--// + +void HAL_AssertEx() +{ + __BKPT(0); + while(true) { ; } +} + +/* + Cortex-M core features 3 low power modes: + SLEEP mode: Cortex-M core stopped, peripherals kept running. + STOP mode: all clocks are stopped, regulator running, regulator in low power mode + STANDBY mode: 1.2V domain powered off + + The NETMF SLEEP_LEVEL enum equivalence is: + SLEEP_LEVEL__SELECTIVE_OFF => Cortex-M SLEEP mode + SLEEP_LEVEL__SLEEP => Cortex-M SLEEP mode + SLEEP_LEVEL__DEEP_SLEEP => Cortex-M STOP mode + SLEEP_LEVEL__OFF => Cortex-M STANDBY mode + +*/ +void HAL_CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) +{ + NATIVE_PROFILE_HAL_PROCESSOR_POWER(); + + switch(level) + { + ///////////////////////////// + case SLEEP_LEVEL__DEEP_SLEEP: + // Cortex-M STOP mode + + // power down flash before entering STOP mode + HAL_PWREx_EnableFlashPowerDown(); + + #ifdef FAST_WAKEUP_FROM_STOP + // enter STOP mode with main power regulator enabled + HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI); + #else + // enter STOP mode with low power regulator enabled + HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); + #endif + + // need to reconfigure system clock after wake-up from STOP mode + SystemClock_Config(); + + // power up flash after resuming from Stop mode + HAL_PWREx_DisableFlashPowerDown(); + + // done here + break; + + ////////////////////// + case SLEEP_LEVEL__OFF: + // Cortex-M STANDBY mode + + // First disable all used wakeup sources + // Disable wake-up pin + HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); + + // Clear PWR wake-up flag + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); + + // Enable wake-up pin (WKUP) + HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); + + // actually enter STANDBY mode + HAL_PWR_EnterSTANDBYMode(); + + // never reachs here, but we need to keep the compiler happy... + break; + + /////////////////////////////// + default: + // all other modes revert to Cortex-M SLEEP mode + + // enter SLEEP mode + HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); + + // done here + break; + } +} + +//--// + +BOOL CPU_Initialize() +{ + // nothing to do here... + // CMSIS HAL_Init() should be called from main and it takes care of everything required to init the CPU and modules + return TRUE; +} + +void CPU_Reset() +{ + NVIC_SystemReset(); +} + +void CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) +{ + HAL_CPU_Sleep(level, wakeEvents); +} + +void CPU_ChangePowerLevel(POWER_LEVEL level) +{ + switch(level) + { + case POWER_LEVEL__MID_POWER: + break; + + case POWER_LEVEL__LOW_POWER: + break; + + case POWER_LEVEL__HIGH_POWER: + default: + break; + } +} + +BOOL CPU_IsSoftRebootSupported () +{ + return FALSE; +} + +void CPU_Halt() +{ + NATIVE_PROFILE_HAL_PROCESSOR_POWER(); + while(1); +} diff --git a/DeviceCode/Targets/CMSIS/Power/Power_functions_loader.cpp b/DeviceCode/Targets/CMSIS/Power/Power_functions_loader.cpp new file mode 100644 index 000000000..fca47ee59 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Power/Power_functions_loader.cpp @@ -0,0 +1,76 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Open Technologies. All rights reserved. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda +// +// *** CPU Power States for bootloader (with only the minimal possible implementation *** +// +////////////////////////////////////////////////////////////////////////////////////////// + +#include + +//--// + +void HAL_AssertEx() +{ + __BKPT(0); + while(true) { ; } +} + +void HAL_CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) +{ + NATIVE_PROFILE_HAL_PROCESSOR_POWER(); + + // enter SLEEP mode + HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); +} + +//--// + +BOOL CPU_Initialize() +{ + // nothing to do here... + // CMSIS HAL_Init() should be called from main and it takes care of everything required to init the CPU and modules + return TRUE; +} + +void CPU_Reset() +{ + NVIC_SystemReset(); +} + +void CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) +{ + HAL_CPU_Sleep(level, wakeEvents); +} + +void CPU_ChangePowerLevel(POWER_LEVEL level) +{ + switch(level) + { + case POWER_LEVEL__MID_POWER: + break; + + case POWER_LEVEL__LOW_POWER: + break; + + case POWER_LEVEL__HIGH_POWER: + default: + break; + } +} + +BOOL CPU_IsSoftRebootSupported () +{ + return FALSE; +} + +void CPU_Halt() +{ + NATIVE_PROFILE_HAL_PROCESSOR_POWER(); + while(1); +} diff --git a/DeviceCode/Targets/CMSIS/Power/dotNetMF.proj b/DeviceCode/Targets/CMSIS/Power/dotNetMF.proj new file mode 100644 index 000000000..c38e57161 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Power/dotNetMF.proj @@ -0,0 +1,37 @@ + + + + CMSIS_power + {1FC7E0E0-C703-4571-8BF8-1398DD8B8821} + + + CMSIS CPU power library + HAL + CMSIS_power.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Power\dotNetMF.proj + CMSIS_power.$(LIB_EXT).manifest + + + + False + + + False + False + True + DeviceCode\Targets\CMSIS\Power + Library + false + 4.0.0.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj b/DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj new file mode 100644 index 000000000..07c36ea1b --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj @@ -0,0 +1,37 @@ + + + + CMSIS_power_loader + {F4BDE754-B128-4335-AE34-3FE2B253E026} + + + CMSIS CPU power library for bootloader + HAL + CMSIS_power_loader.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Power\dotNetMF_loader.proj + CMSIS_power_loader.$(LIB_EXT).manifest + + + + False + + + False + False + True + DeviceCode\Targets\CMSIS\Power + Library + false + 4.0.0.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 843fb742b..b81b6a46a 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -98,9 +98,9 @@ - - - + + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp b/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp index e589db26f..8009b9c5c 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp @@ -17,15 +17,6 @@ #define BUTTON_ENTR BUTTON_B4 #define BUTTON_USER_IDX BUTTON_B5_BITIDX -// boot loader doesn't use the CMSIS-RTOS kernel, so sleep goes direct -// to the low level support -extern void HAL_CPU_Sleep( SLEEP_LEVEL level, UINT64 wakeEvents ); - -void CPU_Sleep( SLEEP_LEVEL level, UINT64 wakeEvents ) -{ - HAL_CPU_Sleep( level, wakeEvents ); -} - //////////////////////////////////////////////////////////////////////////////// // Tinybooter_ProgramWordCheck // diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 5f6af2870..5ff298332 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -189,9 +189,9 @@ - - - + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index eea64e717..66913c59e 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -157,8 +157,8 @@ - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index bd5c3ae9f..d6424c2f7 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -77,31 +77,14 @@ - - - - - - - - - - - - + + + - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp index b6a50a586..274290f61 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp @@ -14,15 +14,6 @@ #include #include -// boot loader doesn't use the CMSIS-RTOS kernel, so sleep goes direct -// to the low level support -extern void HAL_CPU_Sleep( SLEEP_LEVEL level, UINT64 wakeEvents ); - -void CPU_Sleep( SLEEP_LEVEL level, UINT64 wakeEvents ) -{ - HAL_CPU_Sleep( level, wakeEvents ); -} - //////////////////////////////////////////////////////////////////////////////// // Tinybooter_ProgramWordCheck // diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index cc4b0d6a0..15673257d 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -156,14 +156,9 @@ - - - - - - - + + From 248f369e99c512e561d3cf641f0ab4d8bd4bccf0 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Sat, 19 Mar 2016 17:42:19 +0000 Subject: [PATCH 044/144] Cleanup comments --- .../Targets/Native/STM32F4xx/processor_selector.h | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h b/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h index f578a2373..0112a336d 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h +++ b/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h @@ -92,18 +92,3 @@ // // communicaiton facilities ///////////////////////////////////////////////////////// - -// // disable conflicting and overly generic macro definitions -//#undef FLASH -//#undef CRC -// #undef HASH - -// CMSIS-Core SOC Specific header -//#include "stm32f4xx_hal.h" - -// // disable conflicting and overly generic macro definitions -//#undef FLASH -//#undef CRC -//#undef __FPU_PRESENT -// #undef HASH -// #endif From 9b30713922b5856319558f1b8cdb0599e7d884f4 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Sat, 19 Mar 2016 17:42:58 +0000 Subject: [PATCH 045/144] Cleanup comments --- Solutions/STM32F4DISCOVERY/TinyCLR/features.settings | 3 --- 1 file changed, 3 deletions(-) diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 9735a88d4..27c168cee 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -13,11 +13,8 @@ False False True -<<<<<<< Updated upstream False -======= ->>>>>>> Stashed changes False False From eb338d8589b533de51e2fb68ddc73066b11bbbf8 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 10:09:49 +0000 Subject: [PATCH 046/144] Remove Groups from Time proj --- DeviceCode/Targets/CMSIS/Time/dotNetMF.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj b/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj index f2df7ee47..0da5cda4b 100644 --- a/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj +++ b/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj @@ -10,7 +10,7 @@ CMSIS_time.$(LIB_EXT) $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Time\dotNetMF.proj CMSIS_time.$(LIB_EXT).manifest - Processor\STM32F4 + False From 80a168181bb839864497e8c81b2544c9a8f1e5a2 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 10:28:46 +0000 Subject: [PATCH 047/144] Add function to get USART interrupt enable state (required for PAL) --- .../Targets/CMSIS/USART/USART_functions.cpp | 47 +++++++++++++++++++ DeviceCode/pal/COM/usart/usart.cpp | 7 ++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp index 2e23661e8..c70137a29 100644 --- a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp +++ b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp @@ -588,6 +588,53 @@ void DisableUSARTInt(int comPortNum) #endif } +uint32_t GetUSARTInterruptEnableState(int comPortNum) +{ + if(g_Uart_Ports[comPortNum] == USART1) + { + return HAL_NVIC_GetActive(USART1_IRQn); + } + #ifdef USART2 + else if(g_Uart_Ports[comPortNum] == USART2) + { + return HAL_NVIC_GetActive(USART2_IRQn); + } + #endif + #ifdef USART3 + else if(g_Uart_Ports[comPortNum] == USART3) + { + return HAL_NVIC_GetActive(USART3_IRQn); + } + #endif + #ifdef UART4 + else if(g_Uart_Ports[comPortNum] == UART4) + { + return HAL_NVIC_GetActive(UART4_IRQn); + } + #endif + #ifdef USART6 + else if(g_Uart_Ports[comPortNum] == USART6) + { + return HAL_NVIC_GetActive(USART6_IRQn); + } + #endif + #ifdef UART7 + else if(g_Uart_Ports[comPortNum] == UART7) + { + return HAL_NVIC_GetActive(UART7_IRQn); + } + #endif + #ifdef UART8 + else if(g_Uart_Ports[comPortNum] == UART8) + { + return HAL_NVIC_GetActive(UART8_IRQn); + } + #endif + + // shouldn't reach here + return -1; +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used: diff --git a/DeviceCode/pal/COM/usart/usart.cpp b/DeviceCode/pal/COM/usart/usart.cpp index 6e93a9bde..3b1729af9 100644 --- a/DeviceCode/pal/COM/usart/usart.cpp +++ b/DeviceCode/pal/COM/usart/usart.cpp @@ -12,6 +12,8 @@ static const INT8 XOFF_CLOCK_HALT = 0x02; //--// +extern uint32_t GetUSARTInterruptEnableState(int comPortNum); + BOOL USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) { @@ -416,9 +418,6 @@ BOOL USART_Driver::Flush( int ComPortNum ) if ( IS_POWERSAVE_ENABLED(State) || (!IS_USART_INITIALIZED(State))) return TRUE; - - UINT32 IrqId = USART_TX_IRQ_INDEX(ComPortNum); - if ((USART_FLAG_STATE(State, HAL_USART_STATE::c_TX_SWFLOW_CTRL) && (!USART_FLAG_STATE(State, HAL_USART_STATE::c_TX_XON_STATE))) || !CPU_USART_TxHandshakeEnabledState(ComPortNum)) { @@ -431,7 +430,7 @@ BOOL USART_Driver::Flush( int ComPortNum ) { GLOBAL_LOCK(irq); - if(irq.WasDisabled() || !CPU_USART_TxBufferEmptyInterruptState( ComPortNum ) || 0 == CPU_INTC_InterruptEnableState( IrqId )) + if(irq.WasDisabled() || !CPU_USART_TxBufferEmptyInterruptState( ComPortNum ) || 0 == GetUSARTInterruptEnableState(ComPortNum)) { while(State.TxQueue.IsEmpty() == false) { From 6a3309b37ba0dbfe0c92a9d1234ac1b5fd3abb50 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 12:37:17 +0000 Subject: [PATCH 048/144] Add project for USB device (WinUSB) - this is a work in progress - right now it's able to enumerate the device as WinUSB device, set the NETMF class for debug and reply with the appropriate descriptors to be found by MFDeploy --- DeviceCode/Targets/CMSIS/USB/dotNetMF.proj | 48 + DeviceCode/Targets/CMSIS/USB/usb_conf.cpp | 520 ++++++++++ .../Targets/CMSIS/USB/usb_functions.cpp | 192 ++++ DeviceCode/Targets/CMSIS/USB/usbd_conf.h | 101 ++ DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp | 265 +++++ DeviceCode/Targets/CMSIS/USB/usbd_desc.h | 69 ++ DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp | 903 ++++++++++++++++++ DeviceCode/Targets/CMSIS/USB/usbd_winusb.h | 221 +++++ .../STM32F4xx/GNU_S/startup_tinyBooter.s | 4 +- .../Native/STM32F4xx/GNU_S/startup_tinyCLR.s | 4 +- .../Targets/Native/STM32F4xx/Int_Handlers.c | 1 - 11 files changed, 2323 insertions(+), 5 deletions(-) create mode 100644 DeviceCode/Targets/CMSIS/USB/dotNetMF.proj create mode 100644 DeviceCode/Targets/CMSIS/USB/usb_conf.cpp create mode 100644 DeviceCode/Targets/CMSIS/USB/usb_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/USB/usbd_conf.h create mode 100644 DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp create mode 100644 DeviceCode/Targets/CMSIS/USB/usbd_desc.h create mode 100644 DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp create mode 100644 DeviceCode/Targets/CMSIS/USB/usbd_winusb.h diff --git a/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj b/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj new file mode 100644 index 000000000..058b70760 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj @@ -0,0 +1,48 @@ + + + + CMSIS_USB + + {4BA06E07-3576-4A8F-8DE6-DB2CFD370967} + CMSIS USB driver + HAL + CMSIS_USB.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\USB\dotNetMF.proj + CMSIS_USB.$(LIB_EXT).manifest + + + False + + False + False + False + DeviceCode\Targets\CMSIS\USB + Library + false + 4.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/CMSIS/USB/usb_conf.cpp b/DeviceCode/Targets/CMSIS/USB/usb_conf.cpp new file mode 100644 index 000000000..23f5c79d8 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usb_conf.cpp @@ -0,0 +1,520 @@ +/** + ****************************************************************************** + * @file USB_Device/CustomHID_Standalone/Src/usbd_conf.c + * @author MCD Application Team + * @version V1.4.3 + * @date 29-January-2016 + * @brief This file implements the USB Device library callbacks and MSP + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include + +#include "usbd_conf.h" +#include "usbd_core.h" +#include "usbd_winusb.h" + +extern USB_CONTROLLER_STATE usbControlerState; +extern void USB_StateCallback(USB_CONTROLLER_STATE* State); +extern UINT8 previousDeviceState; + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +PCD_HandleTypeDef hpcd; + +// int USB_TRACE_STATE = 0; +// #define USB_Debug(s) USB_TRACE_STATE = s//ITM_SendChar( s ) + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* + PCD BSP Routines +*******************************************************************************/ + +/** + * @brief Initializes the PCD MSP. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + if(hpcd->Instance == USB_OTG_FS) + { + /* Configure USB FS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /* Configure DM DP Pins */ + GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12); + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Configure VBUS Pin */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Configure ID pin */ + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Enable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + + /* Set USBFS Interrupt to the lowest priority */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 4, 0); + + /* Enable USBFS Interrupt */ + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); + } +} + +/** + * @brief De-Initializes the PCD MSP. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) +{ + if(hpcd->Instance == USB_OTG_FS) + { + /* Disable USB FS Clocks */ + __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); + __HAL_RCC_SYSCFG_CLK_DISABLE(); + } +} + +/******************************************************************************* + LL Driver Callbacks (PCD -> USB Device Library) +*******************************************************************************/ + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_StatusTypeDef ret = USBD_OK; + USBD_HandleTypeDef *pdev = (USBD_HandleTypeDef*)hpcd->pData; + + USBD_ParseSetupRequest(&pdev->request, (uint8_t *)hpcd->Setup); + + if ( ( USB_REQ_TYPE_VENDOR == (pdev->request.bmRequest & USB_REQ_TYPE_MASK) ) && ( OS_DESCRIPTOR_STRING_VENDOR_CODE == pdev->request.bRequest ) ) + { + pdev->ep0_state = USBD_EP0_SETUP; + pdev->ep0_data_len = pdev->request.wLength; + + ret = (USBD_StatusTypeDef)pdev->pClass->Setup((USBD_HandleTypeDef*)pdev, &pdev->request); + + if( (pdev->request.wLength == 0) && (ret == USBD_OK) ) + { + USBD_CtlSendStatus(pdev); + } + return; + } + + USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint Number + * @retval None + */ +void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint Number + * @retval None + */ +void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_SpeedTypeDef speed = USBD_SPEED_FULL; + + //USB_Debug( '!' ); + + /* Set USB Current Speed */ + switch(hpcd->Init.speed) + { + case PCD_SPEED_HIGH: + speed = USBD_SPEED_HIGH; + break; + + case PCD_SPEED_FULL: + speed = USBD_SPEED_FULL; + break; + + default: + speed = USBD_SPEED_FULL; + break; + } + USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); + + /* Reset Device */ + USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); + + // /* clear all flags */ + // USB_ClearEvent( 0, USB_EVENT_ALL ); + + // usbControlerState.FirstGetDescriptor = TRUE; + + // usbControlerState.DeviceState = USB_DEVICE_STATE_DEFAULT; + // usbControlerState.Address = 0; + // USB_StateCallback(&usbControlerState); +} + +/** + * @brief Suspend callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +{ + //USB_Debug( 'S' ); + + USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); + + previousDeviceState = usbControlerState.DeviceState; + usbControlerState.DeviceState = USB_DEVICE_STATE_SUSPENDED; + USB_StateCallback(&usbControlerState); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +{ + //USB_Debug( 'R' ); + + USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); + + usbControlerState.DeviceState = previousDeviceState; + USB_StateCallback(&usbControlerState); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint Number + * @retval None + */ +void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint Number + * @retval None + */ +void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); +} + +/******************************************************************************* + LL Driver Interface (USB Device Library --> PCD) +*******************************************************************************/ + +/** + * @brief Initializes the Low Level portion of the Device driver. + * @param pdev: Device handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) +{ + + /* Set LL Driver parameters */ + hpcd.Instance = USB_OTG_FS; + hpcd.Init.dev_endpoints = 4; + hpcd.Init.use_dedicated_ep1 = 0; + hpcd.Init.ep0_mps = 0x40; + hpcd.Init.dma_enable = 0; + hpcd.Init.low_power_enable = 0; + hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; + hpcd.Init.Sof_enable = 0; + hpcd.Init.speed = PCD_SPEED_FULL; + hpcd.Init.vbus_sensing_enable = 1; + /* Link The driver to the stack */ + hpcd.pData = pdev; + pdev->pData = &hpcd; + /* Initialize LL Driver */ + HAL_PCD_Init(&hpcd); + + HAL_PCDEx_SetRxFiFo(&hpcd, 0x80); + HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40); + HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80); + + return USBD_OK; +} + +/** + * @brief De-Initializes the Low Level portion of the Device driver. + * @param pdev: Device handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) +{ + HAL_PCD_DeInit((PCD_HandleTypeDef*)pdev->pData); + return USBD_OK; +} + +/** + * @brief Starts the Low Level portion of the Device driver. + * @param pdev: Device handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) +{ + HAL_PCD_Start((PCD_HandleTypeDef*)pdev->pData); + return USBD_OK; +} + +/** + * @brief Stops the Low Level portion of the Device driver. + * @param pdev: Device handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) +{ + HAL_PCD_Stop((PCD_HandleTypeDef*)pdev->pData); + return USBD_OK; +} + +/** + * @brief Opens an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @param ep_type: Endpoint Type + * @param ep_mps: Endpoint Max Packet Size + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_mps) +{ + HAL_PCD_EP_Open((PCD_HandleTypeDef*)pdev->pData, + ep_addr, + ep_mps, + ep_type); + + return USBD_OK; +} + +/** + * @brief Closes an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_PCD_EP_Close((PCD_HandleTypeDef*)pdev->pData, ep_addr); + return USBD_OK; +} + +/** + * @brief Flushes an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_PCD_EP_Flush((PCD_HandleTypeDef*)pdev->pData, ep_addr); + return USBD_OK; +} + +/** + * @brief Sets a Stall condition on an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_PCD_EP_SetStall((PCD_HandleTypeDef*)pdev->pData, ep_addr); + return USBD_OK; +} + +/** + * @brief Clears a Stall condition on an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_PCD_EP_ClrStall((PCD_HandleTypeDef*)pdev->pData, ep_addr); + return USBD_OK; +} + +/** + * @brief Returns Stall condition. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval Stall (1: Yes, 0: No) + */ +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*)pdev->pData; + + if((ep_addr & 0x80) == 0x80) + { + return hpcd->IN_ep[ep_addr & 0x7F].is_stall; + } + else + { + return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; + } +} + +/** + * @brief Assigns a USB address to the device. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) +{ + HAL_PCD_SetAddress((PCD_HandleTypeDef*)pdev->pData, dev_addr); + return USBD_OK; +} + +/** + * @brief Transmits data over an endpoint. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @param pbuf: Pointer to data to be sent + * @param size: Data size + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t size) +{ + HAL_PCD_EP_Transmit((PCD_HandleTypeDef*)pdev->pData, ep_addr, pbuf, size); + return USBD_OK; +} + +/** + * @brief Prepares an endpoint for reception. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @param pbuf: Pointer to data to be received + * @param size: Data size + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t size) +{ + HAL_PCD_EP_Receive((PCD_HandleTypeDef*)pdev->pData, ep_addr, pbuf, size); + return USBD_OK; +} + +/** + * @brief Returns the last transfered packet size. + * @param pdev: Device handle + * @param ep_addr: Endpoint Number + * @retval Recived Data Size + */ +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*)pdev->pData, ep_addr); +} + +/** + * @brief Delays routine for the USB Device Library. + * @param Delay: Delay in ms + * @retval None + */ +void USBD_LL_Delay(uint32_t Delay) +{ + HAL_Delay(Delay); +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/CMSIS/USB/usb_functions.cpp b/DeviceCode/Targets/CMSIS/USB/usb_functions.cpp new file mode 100644 index 000000000..3c2b7398c --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usb_functions.cpp @@ -0,0 +1,192 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda. +// +// *** USB WinUSB device for debug *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + + +#include "usbd_desc.h" +#include "usbd_conf.h" +#include "usbd_core.h" +#include "usbd_winusb.h" + +//--// +USB_CONTROLLER_STATE usbControlerState; +static UINT8 ep0Buffer[64]; +static UINT16 endpointStatus[USB_MAX_QUEUES]; +static UINT16 EP_Type; +UINT8 previousDeviceState; + +/* Queues for all data endpoints */ +Hal_Queue_KnownSize QueueBuffers[4]; + +USBD_HandleTypeDef USBD_Device; +extern PCD_HandleTypeDef hpcd; + +USB_CONTROLLER_STATE *CPU_USB_GetState(int Controller) +{ + //return NULL; + return &usbControlerState; +} + +HRESULT CPU_USB_Initialize(int Controller) +{ + // setup usb state variables + usbControlerState.EndpointStatus = endpointStatus; + + // FIXME + usbControlerState.EndpointCount = 2; + + // FIXME + // get max ep0 packet size from actual configuration + //const USB_DEVICE_DESCRIPTOR* desc = ( USB_DEVICE_DESCRIPTOR* )USB_FindRecord( &usbControlerState, USB_DEVICE_DESCRIPTOR_MARKER, 0 ); + //usbControlerState.PacketSize = desc ? desc->bMaxPacketSize0 : 8; + usbControlerState.PacketSize = WINUSB_MAX_FS_PACKET; + + // config endpoints + // EP1 + // IN direction + usbControlerState.IsTxQueue[0] = TRUE; + // max packet size + usbControlerState.MaxPacketSize[0] = WINUSB_MAX_FS_PACKET; + // assign queues + // clear queue before use + QueueBuffers[0].Initialize(); + // Attach queue to endpoint + usbControlerState.Queues[0] = &QueueBuffers[0]; + + // EP2 + // OUT direction + usbControlerState.IsTxQueue[1] = FALSE; + // max packet size + usbControlerState.MaxPacketSize[1] = WINUSB_MAX_FS_PACKET; + // assign queues + // clear queue before use + QueueBuffers[1].Initialize(); + // Attach queue to endpoint + usbControlerState.Queues[1] = &QueueBuffers[1]; + + // ????????????? + EP_Type = 0xE0; + + USBD_Device.pUserData = &usbControlerState; + + // Init Device Library + USBD_Init(&USBD_Device, &WINUSB_Desc, 0); + + // Add Supported Class + USBD_RegisterClass(&USBD_Device, USBD_WINUSB_CLASS); + + /* Add WinUSB callbacks */ + //USBD_WINUSB_RegisterInterface(&USBD_Device, &USBD_WINUSB_fops); + + // Start Device Process + USBD_Start(&USBD_Device); + + return S_OK; +} + +HRESULT CPU_USB_Uninitialize(int Controller) +{ + USBD_Stop(&USBD_Device); + USBD_DeInit(&USBD_Device); + + return S_OK; +} + +BOOL CPU_USB_StartOutput(USB_CONTROLLER_STATE* state, int endpoint) +{ + if(state == NULL || endpoint >= state->EndpointCount) + { + return FALSE; + } + + //OTG_TypeDef* OTG = STM32F4_USB_REGS( State->ControllerNum ); + + //USB_Debug( 't' ); + + GLOBAL_LOCK(irq); + + // If endpoint is not an output + if(state->Queues[endpoint] == NULL || !state->IsTxQueue[endpoint]) + { + return FALSE; + } + + /* if the halt feature for this endpoint is set, then just clear all the characters */ + if(state->EndpointStatus[endpoint] & USB_STATUS_ENDPOINT_HALT) + { + while(USB_TxDequeue(state, endpoint, TRUE) != NULL) + { + } // clear TX queue + + return TRUE; + } + + if(irq.WasDisabled()) + { + // check all endpoints for pending actions + //STM32F4_USB_Driver_Interrupt( OTG, state ); + } + + // FIXME + // write first packet if not done yet + //USBD_WINUSB_DataIn(&USBD_Device, endpoint); + + return TRUE; +} + +BOOL CPU_USB_RxEnable(USB_CONTROLLER_STATE* state, int endpoint) +{ + // If this is not a legal Rx queue + if(state == NULL || state->Queues[endpoint] == NULL || state->IsTxQueue[endpoint]) + { + return FALSE; + } + + //OTG_TypeDef* OTG = STM32F4_USB_REGS( State->ControllerNum ); + + //USB_Debug( 'e' ); + + GLOBAL_LOCK(irq); + + // enable Rx + // if( !( OTG->DOEP[ endpoint ].CTL & OTG_DOEPCTL_EPENA ) ) + // { + // OTG->DOEP[ endpoint ].TSIZ = OTG_DOEPTSIZ_PKTCNT_1 | State->MaxPacketSize[ endpoint ]; + // OTG->DOEP[ endpoint ].CTL |= OTG_DOEPCTL_EPENA | OTG_DOEPCTL_CNAK; // enable endpoint + // } + + return TRUE; +} + +BOOL CPU_USB_GetInterruptState() +{ + return FALSE; +} + +BOOL CPU_USB_ProtectPins(int controller, BOOL On) +{ + return TRUE; +} + +/** + * @brief This function handles USB-On-The-Go FS/HS global interrupt request. + * @param None + * @retval None + */ +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void OTG_FS_IRQHandler(void) +{ + HAL_PCD_IRQHandler(&hpcd); +} diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_conf.h b/DeviceCode/Targets/CMSIS/USB/usbd_conf.h new file mode 100644 index 000000000..c9db0b2da --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usbd_conf.h @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file USB_Device/CustomHID_Standalone/Inc/usbd_conf.h + * @author MCD Application Team + * @version V1.4.3 + * @date 29-January-2016 + * @brief General low level driver configuration + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF_H +#define __USBD_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Common Config */ +#define USBD_MAX_NUM_INTERFACES 1 +#define USBD_MAX_NUM_CONFIGURATION 1 +#define USBD_MAX_STR_DESC_SIZ 0x100 +#define USBD_SUPPORT_USER_STRING 1 +#define USBD_SELF_POWERED 1 +#define USBD_DEBUG_LEVEL 0 + + +/* Exported macro ------------------------------------------------------------*/ +/* Memory management macros */ +#define USBD_malloc malloc +#define USBD_free free +#define USBD_memset memset +#define USBD_memcpy memcpy + +/* DEBUG macros */ +#if (USBD_DEBUG_LEVEL > 0) +#define USBD_UsrLog(...) printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_UsrLog(...) +#endif + +#if (USBD_DEBUG_LEVEL > 1) + +#define USBD_ErrLog(...) printf("ERROR: ") ;\ + printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_ErrLog(...) +#endif + +#if (USBD_DEBUG_LEVEL > 2) +#define USBD_DbgLog(...) printf("DEBUG : ") ;\ + printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_DbgLog(...) +#endif + + + +#ifdef DEBUG +#define _ASSERT(x) ASSERT(x) +#else +#define _ASSERT(x) +#endif + + +/* Exported functions ------------------------------------------------------- */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp b/DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp new file mode 100644 index 000000000..16fd271bd --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp @@ -0,0 +1,265 @@ +/** + ****************************************************************************** + * @file USB_Device/CustomHID_Standalone/Src/usbd_desc.c + * @author MCD Application Team + * @version V1.4.3 + * @date 29-January-2016 + * @brief This file provides the USBD descriptors and string formating method. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include + +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_conf.h" +#include "usbd_winusb.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/* Private macro -------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +uint8_t *USBD_WINUSB_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_ManufacturerStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_ProductStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t *USBD_WINUSB_USRStringDesc (USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); + + +/* Private variables ---------------------------------------------------------*/ +USBD_DescriptorsTypeDef WINUSB_Desc = { + USBD_WINUSB_DeviceDescriptor, + USBD_WINUSB_LangIDStrDescriptor, + USBD_WINUSB_ManufacturerStrDescriptor, + USBD_WINUSB_ProductStrDescriptor, + USBD_WINUSB_SerialStrDescriptor, + NULL, // don't need support for configuration descriptor + NULL // don't need support for interface descriptor +}; + +/* USB Standard Device Descriptor */ +const uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] = { + 0x12, /* bLength */ + USB_DESC_TYPE_DEVICE, /* bDescriptorType */ + 0x00, /* bcdUSB */ + 0x02, + 0x00, /* bDeviceClass */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + USB_MAX_EP0_SIZE, /* bMaxPacketSize */ + LOBYTE(USBD_VID), /* idVendor */ + HIBYTE(USBD_VID), /* idVendor */ + LOBYTE(USBD_PID), /* idVendor */ + HIBYTE(USBD_PID), /* idVendor */ + 0x00, /* bcdDevice rel. 1.00 */ + 0x03, + USBD_IDX_MFC_STR, /* Index of manufacturer string */ + USBD_IDX_PRODUCT_STR, /* Index of product string */ + 0x00, /* Index of serial number string */ + USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ +}; /* USB_DeviceDescriptor */ + +/* USB Standard Device Descriptor */ +const uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] = { + USB_LEN_LANGID_STR_DESC, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; + +uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] = +{ + USB_SIZ_STRING_SERIAL, + USB_DESC_TYPE_STRING, +}; + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 +#endif +__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; + + +/* Private functions ---------------------------------------------------------*/ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len); +static void Get_SerialNum(void); + +/** + * @brief Returns the device descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + *length = sizeof(USBD_DeviceDesc); + return (uint8_t*)USBD_DeviceDesc; +} + +/** + * @brief Returns the LangID string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + *length = sizeof(USBD_LangIDDesc); + return (uint8_t*)USBD_LangIDDesc; +} + +/** + * @brief Returns the product string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString((uint8_t *)(uint8_t *)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)(uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Returns the manufacturer string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + USBD_GetString((uint8_t *)(uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** + * @brief Returns the serial number string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + *length = USB_SIZ_STRING_SERIAL; + + /* Update the serial number string descriptor with the data from the unique ID*/ + Get_SerialNum(); + + return (uint8_t*)USBD_StringSerial; +} + +/** + * @brief Returns the configuration string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == USBD_SPEED_HIGH) + { + USBD_GetString((uint8_t *)(uint8_t *)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)(uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Returns the interface string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_WINUSB_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString((uint8_t *)(uint8_t *)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)(uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Create the serial number string descriptor + * @param None + * @retval None + */ +static void Get_SerialNum(void) +{ + uint32_t deviceserial0, deviceserial1, deviceserial2; + + deviceserial0 = *(uint32_t*)DEVICE_ID1; + deviceserial1 = *(uint32_t*)DEVICE_ID2; + deviceserial2 = *(uint32_t*)DEVICE_ID3; + + deviceserial0 += deviceserial2; + + if (deviceserial0 != 0) + { + IntToUnicode (deviceserial0, &USBD_StringSerial[2] ,8); + IntToUnicode (deviceserial1, &USBD_StringSerial[18] ,4); + } +} + +/** + * @brief Convert Hex 32Bits value into char + * @param value: value to convert + * @param pbuf: pointer to the buffer + * @param len: buffer length + * @retval None + */ +static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len) +{ + uint8_t idx = 0; + + for( idx = 0; idx < len; idx ++) + { + if( ((value >> 28)) < 0xA ) + { + pbuf[ 2* idx] = (value >> 28) + '0'; + } + else + { + pbuf[2* idx] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[ 2* idx + 1] = 0; + } +} diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_desc.h b/DeviceCode/Targets/CMSIS/USB/usbd_desc.h new file mode 100644 index 000000000..2c6fd628b --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usbd_desc.h @@ -0,0 +1,69 @@ +/** + ****************************************************************************** + * @file USB_Device/HID_Standalone/Inc/usbd_desc.h + * @author MCD Application Team + * @version V1.4.3 + * @date 29-January-2016 + * @brief Header for usbd_desc.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_DESC_H +#define __USBD_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_winusb.h" + +#define USBD_VID 0x0483 +#define USBD_PID 0xA08F +#define USBD_LANGID_STRING 0x409 +#define USBD_MANUFACTURER_STRING "Microsoft OpenTech" +#define USBD_PRODUCT_HS_STRING "STM32F4DISCOVERY" +#define USBD_PRODUCT_FS_STRING "STM32F4DISCOVERY" + +// not used +#define USBD_CONFIGURATION_HS_STRING "STM32F4DISCOVERY" +#define USBD_INTERFACE_HS_STRING "a7e70ea2" + +// not used +#define USBD_CONFIGURATION_FS_STRING "STM32F4DISCOVERY" +#define USBD_INTERFACE_FS_STRING "a7e70ea2" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#define DEVICE_ID1 (0x1FFF7A10) +#define DEVICE_ID2 (0x1FFF7A14) +#define DEVICE_ID3 (0x1FFF7A18) + +#define USB_SIZ_STRING_SERIAL 0x1A +#define USB_DESCRIPTOR_MAX_PACKET_SIZE +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +extern USBD_DescriptorsTypeDef WINUSB_Desc; + +uint8_t *USBD_WINUSB_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); + +#endif /* __USBD_DESC_H */ + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp b/DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp new file mode 100644 index 000000000..9ce304fe0 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp @@ -0,0 +1,903 @@ + /** + ****************************************************************************** + * @file usbd_winusb.c + * @author MCD Application Team + * @version V2.4.2 + * @date 11-December-2015 + * @brief This file provides the HID core functions. + * + * @verbatim + * + * =================================================================== + * WINUSB Class Description + * =================================================================== + * + * + * + * + * + * + * @note In HS mode and when the DMA is used, all variables and data structures + * dealing with the DMA during the transaction process should be 32-bit aligned. + * + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + // https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx + + +/* Includes ------------------------------------------------------------------*/ +#include + +#include "usbd_winusb.h" +#include "usbd_desc.h" +#include "usbd_ctlreq.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_WINUSB + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_WINUSB_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_WINUSB_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_WINUSB_Private_Macros + * @{ + */ + +/** + * @} + */ + + + + +/** @defgroup USBD_WINUSB_Private_FunctionPrototypes + * @{ + */ + + +static uint8_t USBD_WINUSB_Init (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_WINUSB_DeInit (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_WINUSB_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t *USBD_WINUSB_GetCfgDesc (uint16_t *length); + +static uint8_t *USBD_WINUSB_GetDeviceQualifierDesc (uint16_t *length); + +static uint8_t USBD_WINUSB_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t USBD_WINUSB_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t USBD_WINUSB_EP0_RxReady (USBD_HandleTypeDef *pdev); + +static uint8_t USBD_WINUSB_EP0_TxReady (USBD_HandleTypeDef *pdev); + +static uint8_t USBD_WINUSB_SOF (USBD_HandleTypeDef *pdev); + +static uint8_t USBD_WINUSB_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t USBD_WINUSB_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t *USBD_WINUSB_GetUsrStrDescriptor(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); + +static uint8_t *USBD_WINUSB_OSStringDescriptor(USBD_SpeedTypeDef speed , uint16_t *length); +static uint8_t *USBD_WINUSB_ExtendedPropertiesOSFeatureDescriptor(USBD_SpeedTypeDef speed , uint16_t *length); +static uint8_t *USBD_WINUSB_ExtendedCompatIDOSDescriptor(USBD_SpeedTypeDef speed , uint16_t *length); +static uint8_t USBD_WINUSB_StandardRequest(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_WINUSB_VendorRequest(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_WINUSB_GetMSExtendedCompatIDOSDescriptor (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_WINUSB_GetMSExtendedPropertiesOSDescriptor (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_WINUSB_VendorRequestDevice(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_WINUSB_VendorRequestInterface(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + +/** + * @} + */ + +/** @defgroup USBD_WINUSB_Private_Variables + * @{ + */ + +USBD_ClassTypeDef USBD_WINUSB = +{ + USBD_WINUSB_Init, + USBD_WINUSB_DeInit, + USBD_WINUSB_Setup, + USBD_WINUSB_EP0_TxReady, + USBD_WINUSB_EP0_RxReady, + USBD_WINUSB_DataIn, + USBD_WINUSB_DataOut, + NULL, // was USBD_WINUSB_SOF, + NULL, // was USBD_WINUSB_IsoINIncomplete, + NULL, // was USBD_WINUSB_IsoOutIncomplete, + USBD_WINUSB_GetCfgDesc, + USBD_WINUSB_GetCfgDesc, + USBD_WINUSB_GetCfgDesc, + USBD_WINUSB_GetDeviceQualifierDesc, + USBD_WINUSB_GetUsrStrDescriptor, +}; + +/* USB WINUSB device Configuration Descriptor */ +const uint8_t USBD_WINUSB_CfgDesc[USB_WINUSB_CONFIG_DESC_SIZ]= +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_WINUSB_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing the configuration*/ + 0xE0, /*bmAttributes: bus powered and Supports Remote Wakeup */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + // Interface 0 descriptor + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0xFF, /* bInterfaceClass: Vendor Class */ + 0x01, /* bInterfaceSubClass : none*/ + 0x01, /* nInterfaceProtocol */ + 0x00, /* iInterface: */ + + // Endpoint 1 descriptor + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + WINUSB_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(WINUSB_MAX_FS_PACKET), + HIBYTE(WINUSB_MAX_FS_PACKET), + 0x00, /*Polling interval in milliseconds */ + + // Endpoint 2 descriptor + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + WINUSB_EPOUT_ADDR, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(WINUSB_MAX_FS_PACKET), + HIBYTE(WINUSB_MAX_FS_PACKET), + 0x00, /*Polling interval in milliseconds */ +}; + +/* USB Standard Device Descriptor */ +const uint8_t USBD_WINUSB_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]= +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +// Microsoft OS descriptor +const WINUSB_OSStringDescStruct USBD_WINUSB_OS_String_Descriptor= +{ + sizeof(USBD_WINUSB_OS_String_Descriptor), + USB_DESC_TYPE_STRING, + // this is the Unicode representation of "MSFT100" which can't be used here as a string because it would include the terminator thus overflowing the expected 14 bytes lenght + {0x4D, 0x00, 0x53, 0x00, 0x46, 0x00, 0x54, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00}, + OS_DESCRIPTOR_STRING_VENDOR_CODE, + 0 +}; + +const WINUSB_ExtendedCompatIDOSDescStruct USBD_WINUSB_Extended_Compat_ID_OS_Descriptor= +{ + // Header + sizeof(USBD_WINUSB_Extended_Compat_ID_OS_Descriptor), + OS_DESCRIPTOR_EX_VERSION, + USB_XCOMPATIBLE_OS_REQUEST, + 0x01, + {0}, + + // Section 1 + { + 0, + 0, + "WINUSB", + {0}, + {0}, + }, +}; + +// Extended properties descriptior +const WINUSB_ExtendedPropertiesDescStruct USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor = +{ + // Header + sizeof(USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor), + OS_DESCRIPTOR_EX_VERSION, + USB_XPROPERTY_OS_REQUEST, + 0x1, + + // Section 1 + { + sizeof(USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor.propertySection1), //0x84, + EX_PROPERTY_DATA_TYPE__REG_SZ, + sizeof(USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor.propertySection1.bPropertyName), //0x28, + L"DeviceInterfaceGuid", + sizeof(USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor.propertySection1.bPropertyData), //0x4E, + WINUSB_DEVICE_INTERFACE_GUID, + }, +}; + + +/** + * @} + */ + +/** @defgroup USBD_WINUSB_Private_Functions + * @{ + */ + +/** + * @brief USBD_WINUSB_Init + * Initialize the WINUSB interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_WINUSB_Init (USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + uint8_t ret = 0; + USB_CONTROLLER_STATE* state; + + /* Open EP OUT */ + USBD_LL_OpenEP(pdev, + WINUSB_EPOUT_ADDR, + USBD_EP_TYPE_BULK, + WINUSB_MAX_FS_PACKET); + + /* Open EP IN */ + USBD_LL_OpenEP(pdev, + WINUSB_EPIN_ADDR, + USBD_EP_TYPE_BULK, + WINUSB_MAX_FS_PACKET); + + + state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + /* Prepare Out endpoint to receive next packet */ + USBD_LL_PrepareReceive(pdev, + WINUSB_EPOUT_ADDR, + state->Data, + WINUSB_MAX_FS_PACKET); + + + return ret; +} + +/** + * @brief USBD_WINUSB_Init + * DeInitialize the WINUSB layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_WINUSB_DeInit (USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + // close end points/ + USBD_LL_CloseEP(pdev, WINUSB_EPOUT_ADDR); + USBD_LL_CloseEP(pdev, WINUSB_EPIN_ADDR); + + // free class + pdev->pClassData = NULL; + + return USBD_OK; +} + +// static void USBD_WINUSB_UpdateState(SWinUSBCommSTM32F4 *psWinUSBCommSTM32F4) +// { +// USB_CONTROLLER_STATE* state +// } + +/** + * @brief USBD_WINUSB_Setup + * Handle the WINUSB specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_WINUSB_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + break; + + case USB_REQ_TYPE_STANDARD: + return USBD_WINUSB_StandardRequest(pdev, req); + + case USB_REQ_TYPE_VENDOR: + return USBD_WINUSB_VendorRequest(pdev, req); + + default: + USBD_CtlError (pdev, req); + return USBD_FAIL; + } + + return USBD_OK; +} + + +/** + * @brief USBD_WINUSB_GetCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_WINUSB_GetCfgDesc (uint16_t *length) +{ + *length = sizeof (USBD_WINUSB_CfgDesc); + return (uint8_t*)USBD_WINUSB_CfgDesc; +} + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_WINUSB_DeviceQualifierDescriptor (uint16_t *length) +{ + *length = sizeof (USBD_WINUSB_DeviceQualifierDesc); + return (uint8_t*)USBD_WINUSB_DeviceQualifierDesc; +} + + +/** + * @brief USBD_WINUSB_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_WINUSB_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + USB_CONTROLLER_STATE* state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + ASSERT_IRQ_MUST_BE_OFF( ); + + // UINT32 bits = OTG->DIEP[epnum].INT; + // if( bits & OTG_DIEPINT_XFRC ) + // { + // // transfer completed + // //USB_Debug( '3' ); + // OTG->DIEP[epnum].INT = OTG_DIEPINT_XFRC; // clear interrupt + // } + + // if( !( OTG->DIEP[epnum].CTL & OTG_DIEPCTL_EPENA ) ) + // { + // // Tx idle + + // UINT32* ps = NULL; + // UINT32 count; + + // if(epnum== 0 ) + // { + // // control endpoint + // if( state->DataCallback ) + // { + // // data to send + // state->DataCallback( state ); // this call can't fail + // ps = ( UINT32* )state->Data; + // count = state->DataSize; + + // //USB_Debug( count ? 'x' : 'n' ); + // } + // } + // else if( state->Queues[epnum] != NULL && state->IsTxQueue[epnum] ) + // { + // // Tx data endpoint + // USB_PACKET64* Packet64 = USB_TxDequeue( state, ep, TRUE ); + // if( Packet64 ) + // { + // // data to send + // ps = ( UINT32* )Packet64->Buffer; + // count = Packet64->Size; + + // //USB_Debug( 's' ); + // } + // } + + if(epnum == 1) + { + + } + + // if( ps ) + // { + // // data to send + // // enable endpoint + // OTG->DIEP[epnum].TSIZ = OTG_DIEPTSIZ_PKTCNT_1 | count; + // OTG->DIEP[epnum].CTL |= OTG_DIEPCTL_EPENA | OTG_DIEPCTL_CNAK; + + // // write data + // uint32_t volatile* pd = OTG->DFIFO[epnum]; + // for( int c = count; c > 0; c -= 4 ) + // { + // *pd = *ps++; + // } + // } + // else + // { // no data + // // disable endpoint + // OTG->DIEP[epnum].CTL |= OTG_DIEPCTL_SNAK; + // } + // } + + // FIXME + return USBD_OK; +} + +/** + * @brief USBD_WINUSB_EP0_RxReady + * handle EP0 Rx Ready event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_WINUSB_EP0_RxReady (USBD_HandleTypeDef *pdev) +{ + USB_CONTROLLER_STATE* state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + ASSERT_IRQ_MUST_BE_OFF( ); + + UINT32* pd; + + // if(epnum== 0 ) + // { + // // control endpoint + // //USB_Debug( count ? 'c' : '0' ); + + // pd = ( UINT32* )( ( STM32F4_USB_STATE* )state )->ep0Buffer; + // state->Data = ( BYTE* )pd; + // state->DataSize = count; + // } + // else + // { + // // data endpoint + // //USB_Debug( 'r' ); + + // BOOL full; + // USB_PACKET64* Packet64 = USB_RxEnqueue( state, ep, full ); + // if( Packet64 == NULL ) + // { + // // should not happen + // //USB_Debug( '?' ); + // _ASSERT( 0 ); + // } + // pd = ( UINT32* )Packet64->Buffer; + // Packet64->Size = count; + // } + + // // read data + // uint32_t volatile* ps = OTG->DFIFO[epnum]; + // for( int c = count; c > 0; c -= 4 ) + // { + // *pd++ = *ps; + // } + + // data handling & Rx reenabling delayed to transfer completed interrupt + + // FIXME + return USBD_OK; +} + +/** + * @brief USBD_WINUSB_EP0_TxReady + * handle EP0 TRx Ready event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_WINUSB_EP0_TxReady(USBD_HandleTypeDef *pdev) +{ + USB_CONTROLLER_STATE* state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + ASSERT_IRQ_MUST_BE_OFF( ); + + // UINT32 bits = OTG->DOEP[epnum].INT; + + // if( bits & OTG_DOEPINT_XFRC ) + // { + // // transfer completed + // //USB_Debug( '1' ); + // OTG->DOEP[epnum].INT = OTG_DOEPINT_XFRC; // clear interrupt + // } + + // if( bits & OTG_DOEPINT_STUP ) + // { + // // setup phase done + // //USB_Debug( '2' ); + // OTG->DOEP[epnum].INT = OTG_DOEPINT_STUP; // clear interrupt + // } + + // if(epnum == 0 ) + // { + // // control endpoint + // //USB_Debug( '$' ); + // // enable endpoint + // OTG->DOEP[ 0 ].TSIZ = OTG_DOEPTSIZ_STUPCNT | OTG_DOEPTSIZ_PKTCNT_1 | state->PacketSize; + // OTG->DOEP[ 0 ].CTL |= OTG_DOEPCTL_EPENA | OTG_DOEPCTL_CNAK; + // // Handle Setup data in upper layer + // STM32F4_USB_Driver_Handle_Setup( OTG, state ); + // } + // else if( !state->Queues[epnum]->IsFull( ) ) + // { + // // enable endpoint + // OTG->DOEP[epnum].TSIZ = OTG_DOEPTSIZ_PKTCNT_1 | state->MaxPacketSize[epnum]; + // OTG->DOEP[epnum].CTL |= OTG_DOEPCTL_EPENA | OTG_DOEPCTL_CNAK; + // //USB_Debug( 'E' ); + // } + // else + // { + // // disable endpoint + // OTG->DOEP[epnum].CTL |= OTG_DOEPCTL_SNAK; + // //USB_Debug( 'v' ); + // } + + // FIXME + return USBD_OK; +} +/** + * @brief USBD_WINUSB_SOF + * handle SOF event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_WINUSB_SOF (USBD_HandleTypeDef *pdev) +{ + + return USBD_OK; +} +/** + * @brief USBD_WINUSB_IsoINIncomplete + * handle data ISO IN Incomplete event + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_WINUSB_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + + return USBD_OK; +} +/** + * @brief USBD_WINUSB_IsoOutIncomplete + * handle data ISO OUT Incomplete event + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_WINUSB_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + + return USBD_OK; +} +/** + * @brief USBD_WINUSB_DataOut + * handle data OUT Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_WINUSB_DataOut (USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + // FIXME + return USBD_OK; +} + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +static uint8_t *USBD_WINUSB_GetDeviceQualifierDesc (uint16_t *length) +{ + *length = sizeof (USBD_WINUSB_DeviceQualifierDesc); + return (uint8_t*)USBD_WINUSB_DeviceQualifierDesc; +} + +/** +* @brief GetUsrStrDescriptor +* return non standard string descriptor +* @param pdev: device instance +* @param index : descriptor index +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +static uint8_t * USBD_WINUSB_GetUsrStrDescriptor(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length) +{ + *length = 0; + + // MS OS String Descriptor is in index 0xEE + if (index == 0xEE) + { + *length = sizeof(USBD_WINUSB_OS_String_Descriptor); + return (uint8_t*)&USBD_WINUSB_OS_String_Descriptor; + } + return NULL; +} + + +static uint8_t *USBD_WINUSB_ExtendedPropertiesOSFeatureDescriptor(USBD_SpeedTypeDef speed , uint16_t *length) +{ + *length = sizeof(USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor); + return (uint8_t*)&USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor; +} + +static uint8_t *USBD_WINUSB_ExtendedCompatIDOSDescriptor(USBD_SpeedTypeDef speed , uint16_t *length) +{ + *length = sizeof(USBD_WINUSB_Extended_Compat_ID_OS_Descriptor); + return (uint8_t*)&USBD_WINUSB_Extended_Compat_ID_OS_Descriptor; +} + +static uint8_t USBD_WINUSB_StandardRequest(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + //SSTM32F4USB *psSTM32F4USB = (SSTM32F4USB *)pdev->pUserData; + + switch (req->bRequest) + { + case USB_REQ_GET_INTERFACE : + //USBD_CtlSendData (pdev, (uint8_t *)&psSTM32F4USB->m_eCurrentInterface, 1); + //while(1); + break; + + case USB_REQ_SET_INTERFACE : + //psSTM32F4USB->m_eCurrentInterface = (uint8_t)(req->wValue); + //while(1); + break; + + case USB_REQ_CLEAR_FEATURE: + + /* Flush the FIFO and Clear the stall status */ + USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex); + + /* Re-activate the EP */ + USBD_LL_CloseEP (pdev , (uint8_t)req->wIndex); + if((((uint8_t)req->wIndex) & 0x80) == 0x80) + { + /* Open EP IN */ + USBD_LL_OpenEP(pdev, WINUSB_EPIN_ADDR, USBD_EP_TYPE_BULK, WINUSB_MAX_FS_PACKET); + } + else + { + /* Open EP IN */ + USBD_LL_OpenEP(pdev, WINUSB_EPOUT_ADDR, USBD_EP_TYPE_BULK, WINUSB_MAX_FS_PACKET); + } + break; + + default: + USBD_CtlError(pdev , req); + return USBD_FAIL; + } + + return USBD_OK; +} + +static uint8_t USBD_WINUSB_VendorRequest(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + uint16_t len; + uint8_t *pbuf; + + switch ( req->bmRequest & USB_REQ_RECIPIENT_MASK ) + { + case USB_REQ_RECIPIENT_DEVICE: + if(req->bRequest == OS_DESCRIPTOR_STRING_VENDOR_CODE) + { + return USBD_WINUSB_GetMSExtendedCompatIDOSDescriptor(pdev, req); + } + else + { + return USBD_WINUSB_VendorRequestDevice(pdev, req); + } + break; + + case USB_REQ_RECIPIENT_INTERFACE: + if(req->bRequest == OS_DESCRIPTOR_STRING_VENDOR_CODE) + { + return USBD_WINUSB_GetMSExtendedPropertiesOSDescriptor(pdev, req); + } + else if(req->bRequest == USB_REQ_GET_DESCRIPTOR) + { + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_CONFIG_STR: + // NETMF specific + // sending the product string descriptor here + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + // NETMF specific + // sending the device serial number to have an unique ID for each connected device in MFDeploy and VStudio + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + break; + } + + if((len != 0)&& (req->wLength != 0)) + { + + len = MIN(len , req->wLength); + + USBD_CtlSendData (pdev, + pbuf, + len); + } + + return USBD_OK; + } + else + { + return USBD_WINUSB_VendorRequestInterface(pdev, req); + } + + case USB_REQ_RECIPIENT_ENDPOINT: + default: + break; + } + + USBD_CtlError(pdev , req); + return USBD_FAIL; +} + +static uint8_t USBD_WINUSB_VendorRequestDevice(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + USBD_CtlError(pdev , req); + return USBD_FAIL; +} + +static uint8_t USBD_WINUSB_VendorRequestInterface(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ +// SSTM32F4USB *psSTM32F4USB = (SSTM32F4USB *)pdev->pUserData; +// SWINUSBSTM32F4 *psWINUSBSTM32F4 = &psSTM32F4USB->m_sWINUSBSTM32F4; + +// switch ( req->wIndex ) +// { +// case stm32f4usbinterface_WINUSB: +// switch ( req->bRequest ) +// { +// case WINUSB2commandReset: +// psWINUSBSTM32F4->m_dwExpectedByteCountUSB = 0; +// psWINUSBSTM32F4->m_pbyReceivePtrUSB = psWINUSBSTM32F4->m_pbyBuffer; +// psWINUSBSTM32F4->m_dwSendByteCountUSB = 0; +// break; +// case WINUSB2commandGetVersion: USBD_CtlSendData(pdev, &s_byWINUSBVersion, 1); break; +// case WINUSB2commandGetState: USBD_CtlSendData(pdev, &psWINUSBSTM32F4->m_byStateUSB, 1); break; +// case WINUSB2commandGetBufferSize: USBD_CtlSendData(pdev, (uint8_t*)(&psWINUSBSTM32F4->m_dwBufferSizeInBytes), 4); break; +// case WINUSB2commandGetReturnSize: +// if ( psWINUSBSTM32F4->m_dwSendByteCountUSB ) +// { +// if ( psWINUSBSTM32F4->m_pbyWritePtr > psWINUSBSTM32F4->m_pbyBuffer ) +// { +// USBD_LL_Transmit(pdev, WINUSB_EPIN_ADDR, psWINUSBSTM32F4->m_pbySendPtrUSB, psWINUSBSTM32F4->m_dwSendByteCountUSB); +// } +// psWINUSBSTM32F4->m_pbyReceivePtrUSB = psWINUSBSTM32F4->m_pbyBuffer; +// psWINUSBSTM32F4->m_pbyWritePtr = psWINUSBSTM32F4->m_pbyBuffer; +// } +// USBD_CtlSendData(pdev, (uint8_t*)(&psWINUSBSTM32F4->m_dwSendByteCountUSB), 4); +// break; +// case WINUSB2commandFollowingPacketSize: +// psWINUSBSTM32F4->m_pbyReceivePtrUSB = psWINUSBSTM32F4->m_pbyBuffer; +// USBD_CtlPrepareRx(pdev, (uint8_t*)(&psWINUSBSTM32F4->m_dwExpectedByteCountUSB), 4); +// break; +// default: USBD_CtlError(pdev , req); return USBD_FAIL; +// } +// //USBD_WINUSB_UpdateState(psWINUSBSTM32F4); +// break; +// default: +// USBD_CtlError(pdev , req); +// return USBD_FAIL; +// } + return USBD_OK; +} + +static uint8_t USBD_WINUSB_GetMSExtendedCompatIDOSDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + switch (req->wIndex) + { + case 0x04: + USBD_CtlSendData (pdev, (uint8_t*)&USBD_WINUSB_Extended_Compat_ID_OS_Descriptor, req->wLength); + break; + default: + USBD_CtlError(pdev , req); + return USBD_FAIL; + } + return USBD_OK; +} + +static uint8_t USBD_WINUSB_GetMSExtendedPropertiesOSDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + uint8_t byInterfaceIndex = (uint8_t)req->wValue; + uint16_t len; + uint8_t *pbuf; + + if ( req->wIndex != 0x05 ) + { + USBD_CtlError(pdev , req); + return USBD_FAIL; + } + + switch ( byInterfaceIndex ) + { + case 0: + case 1: + USBD_CtlSendData (pdev, (uint8_t*)&USBD_WINUSB_Extended_Properties_OS_Feature_Descriptor, req->wLength); + break; + + default: + USBD_CtlError(pdev , req); + return USBD_FAIL; + } + + return USBD_OK; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_winusb.h b/DeviceCode/Targets/CMSIS/USB/usbd_winusb.h new file mode 100644 index 000000000..84ed99920 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/USB/usbd_winusb.h @@ -0,0 +1,221 @@ +/** + ****************************************************************************** + * @file usbd_WINUSB_core.h + * @author MCD Application Team + * @version V2.4.2 + * @date 11-December-2015 + * @brief Header file for the usbd_WINUSB_core.c file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_WINUSB_CORE_H +#define __USB_WINUSB_CORE_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_WINUSB + * @brief This file is the header file for usbd_WINUSB_core.c + * @{ + */ + + +/** @defgroup USBD_WINUSB_Exported_Defines + * @{ + */ +#define WINUSB_EPIN_ADDR 0x81 +#define WINUSB_EPIN_SIZE 0x10 + +#define WINUSB_EPOUT_ADDR 0x02 +#define WINUSB_EPOUT_SIZE 0x10 + +#define USB_WINUSB_CONFIG_DESC_SIZ (9 + 9 + 7 + 7) + +#define WINUSB_MAX_FS_PACKET 0x40 +#define WINUSB_MAX_HS_PACKET 0x40 + +// interface GUID supported by this device +#define WINUSB_DEVICE_INTERFACE_GUID L"{D32D1D64-963D-463E-874A-8EC8C8082CBF}" + +// dwPropertyDataType +#define EX_PROPERTY_DATA_TYPE__RESERVED 0 +#define EX_PROPERTY_DATA_TYPE__REG_SZ 1 +#define EX_PROPERTY_DATA_TYPE__REG_SZ_ENV 2 +#define EX_PROPERTY_DATA_TYPE__REG_BINARY 3 +#define EX_PROPERTY_DATA_TYPE__REG_DWORD_LITTLE_ENDIAN 4 +#define EX_PROPERTY_DATA_TYPE__REG_DWORD_BIG_ENDIAN 5 +#define EX_PROPERTY_DATA_TYPE__REG_LINK 6 +#define EX_PROPERTY_DATA_TYPE__REG_MULTI_SZ 7 + + +#define OS_DESCRIPTOR_STRING_VENDOR_CODE 0xA5 +#define OS_DESCRIPTOR_EX_VERSION 0x0100 +#define USB_XPROPERTY_OS_REQUEST 0x05 +#define USB_XCOMPATIBLE_OS_REQUEST 0x04 + +// these defines should be in usbd_def.h +//#define USB_REQ_GET_OS_FEATURE_DESCRIPTOR 0x20 + + +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + +//////////////////////////////////////////////////////////////////////////////////////////// +/* need to add pack pragma to the following structs with 1 byte width to force the compiler +to line up data without padding otherwise the USB descriptors won't be properly formed */ +//////////////////////////////////////////////////////////////////////////////////////////// + +// OS String Descriptor structure +// see https://msdn.microsoft.com/en-us/windows/hardware/gg463179.aspx +#pragma pack(push, 1) +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t qwSignature[2*7]; + uint8_t bMS_VendorCode; + const uint8_t bPad; +} WINUSB_OSStringDescStruct; +#pragma pack (pop) + +// Extended Properties OS Feature Descriptor +// see https://msdn.microsoft.com/en-us/windows/hardware/gg463179.aspx +// see https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx +#pragma pack(push, 1) +typedef struct +{ + uint32_t dwSize; + uint32_t dwPropertyDataType; + uint16_t wPropertyNameLength; + // despite the spec calls for a variable lenght we can have a fixed size here + // because we need to set this to 'DeviceInterfaceGUID' + wchar_t bPropertyName[sizeof("DeviceInterfaceGUID")]; + uint32_t dwPropertyDataLength; + // despite the spec calls for a variable lenght we can have a fixed size here + // because we need to set this to a GUID such as '{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}' + wchar_t bPropertyData[sizeof("{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}")]; + +} WINUSB_CustomPropertySectionStruct; +#pragma pack (pop) + +#pragma pack(push, 1) +typedef struct +{ + // Header + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint16_t wCount; + + // Custom Property Sections + // Section 1 + WINUSB_CustomPropertySectionStruct propertySection1; + +} WINUSB_ExtendedPropertiesDescStruct; +#pragma pack (pop) + +#pragma pack(push, 1) +typedef struct +{ + uint8_t bFirstInterfaceNumber; + uint8_t reserved1; + uint8_t compatibleID[8]; + uint8_t subCompatibleID[8]; + uint8_t reserved2[6]; + +} WINUSB_CompatIDFunctionStruct; + +#pragma pack(push, 1) +typedef struct +{ + // Header + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint8_t bCount; + uint8_t bReserved[7]; + + // Funcion sections + // Section 1 + WINUSB_CompatIDFunctionStruct section1; + +} WINUSB_ExtendedCompatIDOSDescStruct; +#pragma pack (pop) + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_ClassTypeDef USBD_WINUSB; +#define USBD_WINUSB_CLASS &USBD_WINUSB +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_WINUSB_CORE_H */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s index ec34b630c..1596d9b84 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s @@ -488,8 +488,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler + /*.weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler*/ .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s index 34a3ee266..2d1101fa3 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s @@ -533,8 +533,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler + /*.weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler*/ .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c index c57d2a86b..a0f567442 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c @@ -32,7 +32,6 @@ */ /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" -#include "Int_Handlers.h" /* USER CODE BEGIN 0 */ From 2863a6455a4c0632f8fdc79e30dd267727ca6fbe Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 12:39:10 +0000 Subject: [PATCH 049/144] Correct comment --- DeviceCode/Targets/CMSIS/Time/Time_functions.cpp | 2 +- DeviceCode/Targets/CMSIS/USART/USART_functions.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp b/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp index dac85c083..89346b333 100644 --- a/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp +++ b/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp @@ -5,7 +5,7 @@ // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // // Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for STM32F4: Copyright (c) Eclo Solutions Lda. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda. // // *** System Timer Driver *** // diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp index c70137a29..864c51509 100644 --- a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp +++ b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp @@ -5,7 +5,7 @@ // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // // Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// Implementation for CMSIS: Copyright (c) Oberon microsystems, Inc. // // *** Serial Driver *** // From 953d38740c52312911070bd6547a30c2bef04122 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 12:40:33 +0000 Subject: [PATCH 050/144] Project for CMSIS USB implementation - this is a work in progress --- DeviceCode/pal/COM/usb_cmsis/dotNetMF.proj | 52 + .../pal/COM/usb_cmsis/stubs/dotNetMF.proj | 51 + .../pal/COM/usb_cmsis/stubs/usb_config.cpp | 64 + .../pal/COM/usb_cmsis/stubs/usb_stubs.cpp | 84 + DeviceCode/pal/COM/usb_cmsis/usb.cpp | 1921 +++++++++++++++++ DeviceCode/pal/COM/usb_cmsis/usb.h | 142 ++ 6 files changed, 2314 insertions(+) create mode 100644 DeviceCode/pal/COM/usb_cmsis/dotNetMF.proj create mode 100644 DeviceCode/pal/COM/usb_cmsis/stubs/dotNetMF.proj create mode 100644 DeviceCode/pal/COM/usb_cmsis/stubs/usb_config.cpp create mode 100644 DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp create mode 100644 DeviceCode/pal/COM/usb_cmsis/usb.cpp create mode 100644 DeviceCode/pal/COM/usb_cmsis/usb.h diff --git a/DeviceCode/pal/COM/usb_cmsis/dotNetMF.proj b/DeviceCode/pal/COM/usb_cmsis/dotNetMF.proj new file mode 100644 index 000000000..febed39ff --- /dev/null +++ b/DeviceCode/pal/COM/usb_cmsis/dotNetMF.proj @@ -0,0 +1,52 @@ + + + + usb_cmsis_pal + + + {3d058cbb-bf52-4d63-aa81-bd051aff8e57} + USB CMSIS driver + PAL + usb_cmsis_pal.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\PAL\COM\USB_CMSIS\dotNetMF.proj + usb_cmsis_pal.$(LIB_EXT).manifest + USB + + + + 4 + 0 + 0 + 0 + + 2009-04-30 + + LibraryCategory + + + + + False + + + False + False + False + DeviceCode\pal\COM\usb_cmsis + Library + false + 4.0.0.0 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DeviceCode/pal/COM/usb_cmsis/stubs/dotNetMF.proj b/DeviceCode/pal/COM/usb_cmsis/stubs/dotNetMF.proj new file mode 100644 index 000000000..d1a1d4126 --- /dev/null +++ b/DeviceCode/pal/COM/usb_cmsis/stubs/dotNetMF.proj @@ -0,0 +1,51 @@ + + + + usb_cmsis_pal_stubs + + + {bfafed59-3a1d-446f-a7c1-1a2c9f43aaa2} + USB CMSIS stub driver + PAL + usb_cmsis_pal_stubs.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\PAL\COM\USB_CMSIS\stubs\dotNetMF.proj + usb_cmsis_pal_stubs.$(LIB_EXT).manifest + USB + + + + 4 + 0 + 0 + 0 + + 2009-04-30 + + LibraryCategory + + + + + False + + + False + False + True + DeviceCode\pal\COM\usb_cmsis\stubs + Library + false + 4.0.0.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/DeviceCode/pal/COM/usb_cmsis/stubs/usb_config.cpp b/DeviceCode/pal/COM/usb_cmsis/stubs/usb_config.cpp new file mode 100644 index 000000000..c16cb25e3 --- /dev/null +++ b/DeviceCode/pal/COM/usb_cmsis/stubs/usb_config.cpp @@ -0,0 +1,64 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +//--// + +const char* UsbStrings[] = { NULL }; + +#define MANUFACTURER_NAME_SIZE 1 +#define PRODUCT_NAME_SIZE 1 +#define DISPLAY_NAME_SIZE 1 +#define FRIENDLY_NAME_SIZE 1 + + +ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION +{ + USB_DEVICE_DESCRIPTOR device; + USB_CONFIGURATION_DESCRIPTOR config; + USB_INTERFACE_DESCRIPTOR itfc0; + USB_ENDPOINT_DESCRIPTOR ep1; + USB_ENDPOINT_DESCRIPTOR ep2; + USB_STRING_DESCRIPTOR_HEADER manHeader; + USB_STRING_CHAR manString[MANUFACTURER_NAME_SIZE]; + USB_STRING_DESCRIPTOR_HEADER prodHeader; + USB_STRING_CHAR prodString[PRODUCT_NAME_SIZE]; + USB_STRING_DESCRIPTOR_HEADER string4; + USB_STRING_CHAR displayString[DISPLAY_NAME_SIZE]; + USB_STRING_DESCRIPTOR_HEADER string5; + USB_STRING_CHAR friendlyString[FRIENDLY_NAME_SIZE]; + USB_OS_STRING_DESCRIPTOR OS_String; + USB_XCOMPATIBLE_OS_ID OS_XCompatible_ID; + USB_XPROPERTIES_OS_WINUSB OS_XProperty; + USB_DESCRIPTOR_HEADER endList; +}; + +extern const ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration; + +const ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration= +{ + { + { + 0, + 0, + 0, + }, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + }, +}; diff --git a/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp b/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp new file mode 100644 index 000000000..7cd937e1c --- /dev/null +++ b/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp @@ -0,0 +1,84 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "tinyhal.h" + +//--// + + +int USB_GetControllerCount() +{ + return 0; +} + +BOOL USB_Initialize( int Controller ) +{ + return TRUE; +} + +int USB_Configure( int Controller, const USB_DYNAMIC_CONFIGURATION *config ) +{ + return 0; +} + +const USB_DYNAMIC_CONFIGURATION * USB_GetConfiguration( int Controller ) +{ + return NULL; +} + +BOOL USB_Uninitialize( int Controller ) +{ + return TRUE; +} + +BOOL USB_OpenStream( int UsbStream, int writeEP, int readEP ) +{ + return TRUE; +} + +BOOL USB_CloseStream( int UsbStream ) +{ + return TRUE; +} + +int USB_Write( int UsbStream, const char* Data, size_t size ) +{ + return 0; +} + +int USB_Read( int UsbStream, char* Data, size_t size ) +{ + return 0; +} + +BOOL USB_Flush( int UsbStream ) +{ + return TRUE; +} + +UINT32 USB_GetEvent( int Controller, UINT32 Mask ) +{ + return 0; +} + +UINT32 USB_SetEvent( int Controller, UINT32 Event ) +{ + return 0; +} + +UINT32 USB_ClearEvent( int Controller, UINT32 Event ) +{ + return 0; +} + +UINT8 USB_GetStatus( int Controller ) +{ + return USB_DEVICE_STATE_NO_CONTROLLER; +} + +void USB_DiscardData( int UsbStream, BOOL fTx ) +{ +} + + diff --git a/DeviceCode/pal/COM/usb_cmsis/usb.cpp b/DeviceCode/pal/COM/usb_cmsis/usb.cpp new file mode 100644 index 000000000..5223ea4fd --- /dev/null +++ b/DeviceCode/pal/COM/usb_cmsis/usb.cpp @@ -0,0 +1,1921 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "USB.h" + +#define USB_FLUSH_RETRY_COUNT 1000 + +//--// + +#if defined(BUILD_RTM) +void USB_debug_printf( const char*format, ... ) {} +#else +void USB_debug_printf( const char*format, ... ) {} + +// void USB_debug_printf( const char*format, ... ) +// { +// char buffer[256]; +// va_list arg_ptr; + +// va_start( arg_ptr, format ); + +// int len = hal_vsnprintf( buffer, sizeof(buffer)-1, format, arg_ptr ); + +// // flush existing characters +// DebuggerPort_Flush( USART_DEFAULT_PORT ); + +// // write string +// DebuggerPort_Write( USART_DEFAULT_PORT, buffer, len, 0 ); + +// // flush new characters +// DebuggerPort_Flush( USART_DEFAULT_PORT ); + +// va_end( arg_ptr ); +// } +#endif + +//--// + +// This version of the USB code supports only one language - which +// is not specified by USB configuration records - it is defined here. +// This is the String 0 descriptor.This array includes the String descriptor +// header and exactly one language. + +//#define USB_LANGUAGE_DESCRIPTOR_SIZE 4 + +// UINT8 USB_LanguageDescriptor[USB_LANGUAGE_DESCRIPTOR_SIZE] = +// { +// USB_LANGUAGE_DESCRIPTOR_SIZE, +// USB_STRING_DESCRIPTOR_TYPE, +// 0x09, 0x04 // U.S. English +// }; + +// // This provides storage for the "friendly name" (String 5) if it is specified +// // by the Flash configuration sector +// ADS_PACKED struct GNU_PACKED +// { +// UINT8 bLength; +// UINT8 bDescriptorType; +// UINT8 sFriendlyName[USB_FRIENDLY_NAME_LENGTH * sizeof(USB_STRING_CHAR)]; +// static LPCSTR GetDriverName() { return "USB_NAME_CONFIG"; } +// }FriendlyNameString; + +//USB_SETUP_PACKET RequestPacket = { 0, 0, 0, 0, 0 }; + +//--// + +int USB_GetControllerCount() +{ + return USB_Driver::GetControllerCount(); +} + +BOOL USB_Initialize( int Controller ) +{ + return USB_Driver::Initialize( Controller ); +} + +int USB_Configure( int Controller, const USB_DYNAMIC_CONFIGURATION *config ) +{ + return USB_Driver::Configure( Controller, config ); +} + +const USB_DYNAMIC_CONFIGURATION * USB_GetConfiguration( int Controller ) +{ + return USB_Driver::GetConfiguration( Controller ); +} + +BOOL USB_Uninitialize( int Controller ) +{ + return USB_Driver::Uninitialize( Controller ); +} + +BOOL USB_OpenStream( int UsbStream, int writeEP, int readEP ) +{ + return USB_Driver::OpenStream( UsbStream, writeEP, readEP ); +} + +BOOL USB_CloseStream( int UsbStream ) +{ + return USB_Driver::CloseStream( UsbStream ); +} + +int USB_Write( int UsbStream, const char* Data, size_t size ) +{ + return USB_Driver::Write( UsbStream, Data, size ); +} + +int USB_Read( int UsbStream, char* Data, size_t size ) +{ + return USB_Driver::Read( UsbStream, Data, size ); +} + +BOOL USB_Flush( int UsbStream ) +{ + return USB_Driver::Flush(UsbStream); +} + +UINT32 USB_GetEvent( int Controller, UINT32 Mask ) +{ + return USB_Driver::GetEvent( Controller, Mask ); +} + +UINT32 USB_SetEvent( int Controller, UINT32 Event ) +{ + return USB_Driver::SetEvent( Controller, Event ); +} + +UINT32 USB_ClearEvent( int Controller, UINT32 Event ) +{ + return USB_Driver::ClearEvent( Controller, Event ); +} + +UINT8 USB_GetStatus( int Controller ) +{ + return USB_Driver::GetStatus( Controller ); +} + +void USB_DiscardData( int UsbStream, BOOL fTx ) +{ + USB_Driver::DiscardData(UsbStream, fTx); +} + +//--// + +int USB_Driver::GetControllerCount() +{ + return TOTAL_USB_CONTROLLER; +} + +BOOL USB_Driver::Initialize( int Controller ) +{ + NATIVE_PROFILE_PAL_COM(); + + //char szFriendlyName[USB_FRIENDLY_NAME_LENGTH]; + + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + GLOBAL_LOCK(irq); + + USB_CONFIGURATION_DESCRIPTOR * Config; + + if(State == NULL) return FALSE; + + +// #if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) +// // +// // If initialized, uninitilize the current usb stack so that we can override it with a new configuration +// // +// if(State->Initialized && COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && Controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) +// { +// USB_Driver::Uninitialize( Controller ); +// } +// #endif + + // if(State->Configuration == NULL) + // { + // USB_Driver::Configure( Controller, NULL ); + // } + + // // Check if friendly name has been changed + // if(HAL_CONFIG_BLOCK::ApplyConfig( FriendlyNameString.GetDriverName(), (void*)&szFriendlyName[0], sizeof(szFriendlyName) )) + // { + // int length = 0; + + // // Find the real length of the string & expand into String 5 response record + // for(length = 0; length < USB_FRIENDLY_NAME_LENGTH; length++ ) + // { + // // Expand Friendly Name to wchar type in string response buffer + // FriendlyNameString.sFriendlyName[length * sizeof(USB_STRING_CHAR)] = szFriendlyName[length]; + // FriendlyNameString.sFriendlyName[length * sizeof(USB_STRING_CHAR) + 1] = 0; // Roughly convert to wchar_t + + // if( szFriendlyName[length] == 0 ) + // break; + // } + + // // Finish filling out the String descriptor response record + // FriendlyNameString.bLength = (length * sizeof(USB_STRING_CHAR)) + USB_STRING_DESCRIPTOR_HEADER_LENGTH; + // FriendlyNameString.bDescriptorType = USB_STRING_DESCRIPTOR_TYPE; + // } + // else + // { + // // Indicate that "String 5" (if it exists) comes from the configuration + // FriendlyNameString.bLength = 0; + // } + + +// Config = (USB_CONFIGURATION_DESCRIPTOR *)USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, 0 ); + +// /* now we actually initialize everything */ +// if(State->Initialized == FALSE && Config != NULL) +// { +// // Remember only the USB configuration information +// const USB_DYNAMIC_CONFIGURATION *Save = State->Configuration; + +// // Wipe the Controller state clean before passing to the hardware driver +// memset( State, 0, sizeof(USB_CONTROLLER_STATE) ); + +// State->Configuration = Save; // Restore the configuration information + +// // Set all streams to unused +// for( int stream = 0; stream < USB_MAX_QUEUES; stream++ ) +// { +// State->streams[stream].RxEP = USB_NULL_ENDPOINT; +// State->streams[stream].TxEP = USB_NULL_ENDPOINT; +// } + +// State->ControllerNum = Controller; +// State->CurrentState = USB_DEVICE_STATE_UNINITIALIZED; + + +// // at configuration descriptor, BUS powered, bmAttribute(bit 6 = 0 and MaxPower != 0) +// // but the Status report is reversed + +// if(Config->bmAttributes & USB_ATTRIBUTE_SELF_POWER) +// { +// State->DeviceStatus |= USB_STATUS_DEVICE_SELF_POWERED; +// } +// else +// { +// State->DeviceStatus &= ~USB_STATUS_DEVICE_SELF_POWERED; +// } + +// // The Remote Wake Up status feature is disabled by default +// // It is currently not necessary since at this time there are +// // no host-side drivers that place the device in a SUSPEND state +// #if defined(USB_REMOTE_WAKEUP) +// if((Config->bmAttributes & USB_ATTRIBUTE_REMOTE_WAKEUP) +// { +// State->DeviceStatus |= USB_STATUS_DEVICE_REMOTE_WAKEUP; +// } +// else +// { +// State->DeviceStatus &= ~USB_STATUS_DEVICE_REMOTE_WAKEUP; +// } +// #endif + +// FIXME +// USB init is not working when called here... issue with bad timmer configuration? + // if( S_OK != CPU_USB_Initialize( Controller ) ) + // { + // return FALSE; // If Hardware initialization fails + // } + +#if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) + // + // Re-initialize the Debugger stream + // + if(COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && Controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) + { + USB_OpenStream( ConvertCOM_UsbStream(HalSystemConfig.DebuggerPorts[0]), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); + } +#endif + + State->Initialized = TRUE; + return TRUE; +// } + + //return FALSE; +} + +int USB_Driver::Configure( int Controller, const USB_DYNAMIC_CONFIGURATION* Config ) +{ + NATIVE_PROFILE_PAL_COM(); + if( Controller > 9 ) + return USB_CONFIG_ERR_NO_CONTROLLER; + + int err; + size_t Length = 0; + USB_DESCRIPTOR_HEADER *configHeader; + char configName[5] = { 'U', 'S', 'B', '1' + (char)Controller, 0 }; + USB_CONTROLLER_STATE* State = CPU_USB_GetState( Controller ); + + // Check if controller exists + if( NULL == State ) + return USB_CONFIG_ERR_NO_CONTROLLER; + + // Cannot alter the configuration while the Controller is running +#if !defined(USB_ALLOW_CONFIGURATION_OVERRIDE) + if( State->Initialized ) + return USB_CONFIG_ERR_STARTED; +#endif + + // If the default configuration is to be used + if( Config == NULL ) + { + // FIXME + //Config = &UsbDefaultConfiguration; + } + + // Check the configuration to be sure that there are no glaring errors + err = UsbConfigurationCheck( Config ); + + if( err != USB_CONFIG_ERR_OK ) + return err; + + // only save non default configurations + // FIXME + //if(Config != &UsbDefaultConfiguration) + if(Config != 0) + { + configHeader = (USB_DESCRIPTOR_HEADER *)Config; + + // Calculate the size of the default USB configuration + while( configHeader->marker != USB_END_DESCRIPTOR_MARKER ) + { + Length += configHeader->size; + configHeader = configHeader->next(configHeader); + } + Length += sizeof(USB_DESCRIPTOR_HEADER); // Don't forget to include the ending header + + // Write the default USB configuration to the Flash config sector + HAL_CONFIG_BLOCK::UpdateBlockWithName(configName, (void *)Config, Length, TRUE); + + + // + // Free the old configuration (UsbDefaultConfiguration is a global variable so do not free it) + // + // if(State->Configuration != &UsbDefaultConfiguration) + // { + // private_free((void*)State->Configuration); + // } + + // + // Make sure that we allocate the native configuration buffer, the one passed in will be garbage collected + // + State->Configuration = (USB_DYNAMIC_CONFIGURATION*)private_malloc(Length); + + // + + // Copy the configuration from the temporary config (from the caller) + // + memcpy((void*)State->Configuration, (void*)Config, Length); + } + else + { + // Set the configuration for this Controller + State->Configuration = Config; + } + + return err; +} + +// +// The GetConfiguration method will attempt to load the configurate from the config sector in flash +// Since the USB configuration is of variable size, this method may use private_malloc, therefore, +// this method should not be called prior to the heap initialization. +// +const USB_DYNAMIC_CONFIGURATION * USB_Driver::GetConfiguration( int Controller ) +{ + NATIVE_PROFILE_PAL_COM(); + + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + char configName[5] = { 'U', 'S', 'B', '1' + Controller, 0 }; + + // Check if controller exists + if(NULL == State) + return NULL; + + // return immediately if we already have a configuration (other than the default) + // FIXME + // if(State->Configuration != NULL && State->Configuration != &UsbDefaultConfiguration) + // { + // if(USB_CONFIG_ERR_OK == UsbConfigurationCheck( State->Configuration )) + // { + // return State->Configuration; + // } + // } + + // It is assumed that the Flash config sector will only change while in TinyBooter, and so if the + // configuration is in the Flash config sector, it will always be OK since TinyBooter always + // uses the configuration in initialized RAM. + + // If the requested USB configuration was not found in the Flash configuration sector + void *pConfig = NULL; + + // this calls private_malloc + if(HAL_CONFIG_BLOCK::ApplyConfig( configName, NULL, 0, (void**)&pConfig ) && pConfig != NULL) + { + State->Configuration = (const USB_DYNAMIC_CONFIGURATION *)pConfig; + + // Check the configuration to be sure that there are no glaring errors + if(USB_CONFIG_ERR_OK != UsbConfigurationCheck( State->Configuration )) + { + // FIXME + //State->Configuration = &UsbDefaultConfiguration; + } + } + else + { + // FIXME + // Use the default USB configuration + //State->Configuration = &UsbDefaultConfiguration; + } + + return State->Configuration; +} + +BOOL USB_Driver::Uninitialize( int Controller ) +{ + NATIVE_PROFILE_PAL_COM(); + + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + if(NULL == State) return FALSE; + + GLOBAL_LOCK(irq); + + if(State->Initialized == FALSE) return FALSE; + + // All streams must be closed on the Controller, or it may not be uninitialized (stopped) + for(int stream = 0; stream < USB_MAX_QUEUES; stream++) + { +#if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) + // + // Ignore the debugger stream as we will only close it if we need to + // + if((TRUE == COM_IsUsb (HalSystemConfig.DebuggerPorts[0])) && + (Controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) && + (stream == ConvertCOM_UsbStream (HalSystemConfig.DebuggerPorts[0]))) + { + continue; + } +#endif + + if(State->streams[stream].RxEP != USB_NULL_ENDPOINT || State->streams[stream].TxEP != USB_NULL_ENDPOINT) + { + return FALSE; + } + } + + // + // If we have gotten this far then all other streams are closed so close the debugger streams (if applicable) + // +#if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) + if(COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && Controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) + { + USB_CloseStream(ConvertCOM_UsbStream(HalSystemConfig.DebuggerPorts[0])); + } +#endif + + // Stop all activity on the specified Controller and make it appear disconnected from the host + State->Initialized = FALSE; + + CPU_USB_Uninitialize( Controller ); + + // for soft reboot allow the USB to be off for at least 100ms + HAL_Time_Sleep_MicroSeconds(100000); // 100ms + + return TRUE; +} + +BOOL USB_Driver::OpenStream( int UsbStream, int writeEP, int readEP ) +{ + NATIVE_PROFILE_PAL_COM(); + + int Controller = ConvertCOM_UsbController ( UsbStream ); + int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + + USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); + + if( NULL == State || !State->Initialized ) // If no such controller exists (or it is not initialized) + return FALSE; + + // Check the StreamIndex and the two endpoint numbers for validity (both endpoints cannot be zero) + if( StreamIndex >= USB_MAX_QUEUES + || (readEP == USB_NULL_ENDPOINT && writeEP == USB_NULL_ENDPOINT) + || (readEP != USB_NULL_ENDPOINT && (readEP < 1 || readEP >= USB_MAX_QUEUES)) + || (writeEP != USB_NULL_ENDPOINT && (writeEP < 1 || writeEP >= USB_MAX_QUEUES)) ) + return FALSE; + + // The Stream must be currently closed + if( State->streams[StreamIndex].RxEP != USB_NULL_ENDPOINT || State->streams[StreamIndex].TxEP != USB_NULL_ENDPOINT ) + return FALSE; + + // The requested endpoints must have been configured + if( (readEP != USB_NULL_ENDPOINT && State->Queues[readEP] == NULL) || (writeEP != USB_NULL_ENDPOINT && State->Queues[writeEP] == NULL) ) + return FALSE; + + // The requested endpoints can only be used in the direction specified by the configuration + if( (readEP != USB_NULL_ENDPOINT && State->IsTxQueue[readEP]) || (writeEP != USB_NULL_ENDPOINT && !State->IsTxQueue[writeEP]) ) + return FALSE; + + // The specified endpoints must not be in use by another stream + for( int stream = 0; stream < USB_MAX_QUEUES; stream++ ) + { + if( readEP != USB_NULL_ENDPOINT && (State->streams[stream].RxEP == readEP || State->streams[stream].TxEP == readEP) ) + return FALSE; + if( writeEP != USB_NULL_ENDPOINT && (State->streams[stream].RxEP == writeEP || State->streams[stream].TxEP == writeEP) ) + return FALSE; + } + + // All tests pass, assign the endpoints to the stream + { + GLOBAL_LOCK(irq); + + State->streams[StreamIndex].RxEP = readEP; + State->streams[StreamIndex].TxEP = writeEP; + } + + return TRUE; +} + +BOOL USB_Driver::CloseStream ( int UsbStream ) +{ + NATIVE_PROFILE_PAL_COM(); + + int Controller = ConvertCOM_UsbController ( UsbStream ); + int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + + USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); + + if( NULL == State || !State->Initialized ) + return FALSE; + + if( StreamIndex >= USB_MAX_QUEUES ) + return FALSE; + + { + int endpoint; + GLOBAL_LOCK(irq); + + // Close the Rx stream + endpoint = State->streams[StreamIndex].RxEP; + if( endpoint != USB_NULL_ENDPOINT && State->Queues[endpoint] ) + { + State->Queues[endpoint]->Initialize(); // Clear the queue + } + State->streams[StreamIndex].RxEP = USB_NULL_ENDPOINT; + + // Close the TX stream + endpoint = State->streams[StreamIndex].TxEP; + if( endpoint != USB_NULL_ENDPOINT && State->Queues[endpoint] ) + { + State->Queues[endpoint]->Initialize(); // Clear the queue + } + State->streams[StreamIndex].TxEP = USB_NULL_ENDPOINT; + } + + return TRUE; +} + +int USB_Driver::Write( int UsbStream, const char* Data, size_t size ) +{ + NATIVE_PROFILE_PAL_COM(); + + int Controller = ConvertCOM_UsbController ( UsbStream ); + int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + int endpoint; + int totWrite = 0; + USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); + + if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) + { + return -1; + } + + if(size == 0 ) return 0; + if(Data == NULL) + { + return -1; + } + + // If the Controller is not yet initialized + if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + { + // No data can be sent until the controller is initialized + return -1; + } + + endpoint = State->streams[StreamIndex].TxEP; + // If no Write side to stream (or if not yet open) + if( endpoint == USB_NULL_ENDPOINT || State->Queues[endpoint] == NULL ) + { + return -1; + } + else + { + GLOBAL_LOCK(irq); + + const char* ptr = Data; + UINT32 count = size; + BOOL Done = FALSE; + UINT32 WaitLoopCnt = 0; + + // This loop packetizes the data and sends it out. All packets sent have + // the maximum size for the given endpoint except for the last packet which + // will always have less than the maximum size - even if the packet length + // must be zero for this to occur. This is done to comply with standard + // USB bulk-mode transfers. + while(!Done) + { + + USB_PACKET64* Packet64 = State->Queues[endpoint]->Push(); + + if(Packet64) + { + UINT32 max_move; + + if(count > State->MaxPacketSize[endpoint]) + max_move = State->MaxPacketSize[endpoint]; + else + max_move = count; + + if(max_move) + { + memcpy( Packet64->Buffer, ptr, max_move ); + } + + // we are done when we send a non-full length packet + if(max_move < State->MaxPacketSize[endpoint]) + { + Done = TRUE; + } + + Packet64->Size = max_move; + count -= max_move; + ptr += max_move; + + totWrite += max_move; + + WaitLoopCnt = 0; + } + else + { + // a 64-byte USB packet takes less than 50uSec + // according to the timing calculations of the USB Chief + // this is way too short to bother with a call + // to WaitForEventsInternal, so just uSec delay the path + // here for 50uSec. + + // if in ISR, return + + // if more than 100*50us=5ms,still no packet avaialable, PC side go wrong,stop the loop + // otherwise it will spin here forever and stopwatch get kick in. + WaitLoopCnt++; + if(WaitLoopCnt > 100) + { + // if we were unable to send any data then no one is listening so lets + if(count == size) + { + State->Queues[endpoint]->Initialize(); + } + + return totWrite; + } + + if(SystemState_QueryNoLock( SYSTEM_STATE_ISR )) + { + return totWrite; + } + + if(irq.WasDisabled()) // @todo - this really needs more checks to be totally valid + { + return totWrite; + } + + if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + { + return totWrite; + } + + CPU_USB_StartOutput( State, endpoint ); + + irq.Release(); +// lcd_printf("Looping in write\r\n"); + + HAL_Time_Sleep_MicroSeconds_InterruptEnabled(50); + + irq.Acquire(); + } + } + + // here we have a post-condition that IRQs are disabled for all paths through conditional block above + + if(State->DeviceState == USB_DEVICE_STATE_CONFIGURED) + { + CPU_USB_StartOutput( State, endpoint ); + } + + return totWrite; + } +} + +int USB_Driver::Read( int UsbStream, char* Data, size_t size ) +{ + NATIVE_PROFILE_PAL_COM(); + + int Controller = ConvertCOM_UsbController ( UsbStream ); + int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + int endpoint; + USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); + + if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) + { + return 0; + } + + /* not configured, no data can go in or out */ + if( State->DeviceState != USB_DEVICE_STATE_CONFIGURED ) + { + return 0; + } + + endpoint = State->streams[StreamIndex].RxEP; + // If no Read side to stream (or if not yet open) + if( endpoint == USB_NULL_ENDPOINT || State->Queues[endpoint] == NULL ) + { + return 0; + } + + { + GLOBAL_LOCK(irq); + + USB_PACKET64* Packet64 = NULL; + UINT8* ptr = (UINT8*)Data; + UINT32 count = 0; + UINT32 remain = size; + + while(count < size) + { + UINT32 max_move; + + if(!Packet64) Packet64 = State->Queues[endpoint]->Peek(); + + if(!Packet64) + { + USB_ClearEvent( Controller, 1 << endpoint ); + break; + } + + max_move = Packet64->Size - State->CurrentPacketOffset[endpoint]; + if(remain < max_move) max_move = remain; + + memcpy( ptr, &Packet64->Buffer[ State->CurrentPacketOffset[endpoint] ], max_move ); + + State->CurrentPacketOffset[endpoint] += max_move; + ptr += max_move; + count += max_move; + remain -= max_move; + + /* if we're done with this packet, move onto the next */ + if(State->CurrentPacketOffset[endpoint] == Packet64->Size) + { + State->CurrentPacketOffset[endpoint] = 0; + Packet64 = NULL; + + State->Queues[endpoint]->Pop(); + + CPU_USB_RxEnable( State, endpoint ); + } + } + + return count; + } +} + +BOOL USB_Driver::Flush( int UsbStream ) +{ + NATIVE_PROFILE_PAL_COM(); + + int Controller = ConvertCOM_UsbController ( UsbStream ); + int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + int endpoint; + int retries = USB_FLUSH_RETRY_COUNT; + int queueCnt; + USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); + + if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) + { + return FALSE; + } + + /* not configured, no data can go in or out */ + if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + { + return TRUE; + } + + endpoint = State->streams[StreamIndex].TxEP; + // If no Write side to stream (or if not yet open) + if( endpoint == USB_NULL_ENDPOINT || State->Queues[endpoint] == NULL ) + { + return FALSE; + } + + queueCnt = State->Queues[endpoint]->NumberOfElements(); + + // interrupts were disabled or USB interrupt was disabled for whatever reason, so force the flush + while(State->Queues[endpoint]->IsEmpty() == false && retries > 0) + { + CPU_USB_StartOutput( State, endpoint ); + + HAL_Time_Sleep_MicroSeconds_InterruptEnabled(100); // don't call Events_WaitForEventsXXX because it will turn off interrupts + + int cnt = State->Queues[endpoint]->NumberOfElements(); + retries = (queueCnt == cnt) ? retries-1: USB_FLUSH_RETRY_COUNT; + queueCnt = cnt; + } + + if(retries <=0) + { + State->Queues[endpoint]->Initialize(); + } + + return TRUE; +} + +UINT32 USB_Driver::GetEvent( int Controller, UINT32 Mask ) +{ + GLOBAL_LOCK(irq); + + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + if( State ) + return (State->Event & Mask); + else + return 0; +} + +UINT32 USB_Driver::SetEvent( int Controller, UINT32 Event ) +{ + GLOBAL_LOCK(irq); + + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + if( State == NULL ) + return 0; + + UINT32 OldEvent = State->Event; + + State->Event |= Event; + + if(OldEvent != State->Event) + { + Events_Set( SYSTEM_EVENT_FLAG_USB_IN ); + } + +//printf("SetEv %d\r\n",State->Event); + return OldEvent; +} + +UINT32 USB_Driver::ClearEvent( int Controller, UINT32 Event ) +{ + GLOBAL_LOCK(irq); + + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + if( State == NULL ) + return 0; + + UINT32 OldEvent = State->Event; + + State->Event &= ~Event; + + if( State->Event == 0 ) + { + Events_Clear( SYSTEM_EVENT_FLAG_USB_IN ); + } + +//printf("ClrEV %d\r\n",State->Event); + return OldEvent; +} + +UINT8 USB_Driver::GetStatus( int Controller ) +{ + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + if( State == NULL ) + return USB_DEVICE_STATE_NO_CONTROLLER; + + if( !State->Initialized || State->Configuration == NULL ) + return USB_DEVICE_STATE_UNINITIALIZED; + + return State->CurrentState; +} + +void USB_Driver::DiscardData( int UsbStream, BOOL fTx ) +{ + int Controller = ConvertCOM_UsbController ( UsbStream ); + int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + int endpoint; + USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); + + if( State == NULL ) + return; + + if( !State->Initialized || State->Configuration == NULL ) + return; + + if(fTx) + { + endpoint = State->streams[StreamIndex].TxEP; + } + else + { + endpoint = State->streams[StreamIndex].RxEP; + } + + // If no Read side to stream (or if not yet open) + if( endpoint == USB_NULL_ENDPOINT || State->Queues[endpoint] == NULL ) + { + return; + } + + if( State->Queues[endpoint] ) + { + State->Queues[endpoint]->Initialize(); + } +} + +//--// + +void USB_ClearQueues( USB_CONTROLLER_STATE *State, BOOL ClrRxQueue, BOOL ClrTxQueue ) +{ + GLOBAL_LOCK(irq); + + if(ClrRxQueue) + { + for(int endpoint = 0; endpoint < USB_MAX_QUEUES; endpoint++) + { + if( State->Queues[endpoint] == NULL || State->IsTxQueue[endpoint] ) + continue; + State->Queues[endpoint]->Initialize(); + + /* since this queue is now reset, we have room available for newly arrived packets */ + CPU_USB_RxEnable( State, endpoint ); + } + } + + if( ClrTxQueue ) + { + for(int endpoint = 0; endpoint < USB_MAX_QUEUES; endpoint++) + { + if( State->Queues[endpoint] && State->IsTxQueue[endpoint] ) + State->Queues[endpoint]->Initialize(); + } + } +} + +void USB_StateCallback( USB_CONTROLLER_STATE* State ) +{ + if(State->CurrentState != State->DeviceState) + { + /* whenever we leave the configured state, re-initialize all of the queues */ +//Not necessary, as TxBuffer may hold any data and then send them out when it is configured again. +// The RxQueue is clear when it is configured. + + if(USB_DEVICE_STATE_CONFIGURED == State->CurrentState) + { + USB_ClearQueues( State, TRUE, TRUE ); + } + + State->CurrentState = State->DeviceState; + + switch(State->DeviceState) + { + case USB_DEVICE_STATE_DETACHED: + State->ResidualCount =0; + State->DataCallback = NULL; +// hal_printf("USB_DEVICE_STATE_DETACHED\r\n"); + break; + + case USB_DEVICE_STATE_ATTACHED: +// hal_printf("USB_DEVICE_STATE_ATTACHED\r\n"); + break; + + case USB_DEVICE_STATE_POWERED: +// hal_printf("USB_DEVICE_STATE_POWERED\r\n"); + break; + + case USB_DEVICE_STATE_DEFAULT: +// hal_printf("USB_DEVICE_STATE_DEFAULT\r\n"); + break; + + case USB_DEVICE_STATE_ADDRESS: +// hal_printf("USB_DEVICE_STATE_ADDRESS\r\n"); + break; + + case USB_DEVICE_STATE_CONFIGURED: +// hal_printf("USB_DEVICE_STATE_CONFIGURED\r\n"); + + /* whenever we enter the configured state, re-initialize all of the RxQueues */ + /* Txqueue has stored some data to be transmitted */ + USB_ClearQueues( State, TRUE, FALSE ); + break; + + case USB_DEVICE_STATE_SUSPENDED: +// hal_printf("USB_DEVICE_STATE_SUSPENDED\r\n"); + break; + + default: + ASSERT(0); + break; + } + } +} + +void USB_DataCallback( USB_CONTROLLER_STATE* State ) +{ + UINT32 length = __min(State->PacketSize, State->ResidualCount); + + memcpy( State->Data, State->ResidualData, length ); + + State->DataSize = length; + State->ResidualData += length; + State->ResidualCount -= length; + + if(length == State->PacketSize) + { + State->Expected -= length; + } + else + { + State->Expected = 0; + } + + if(State->Expected) + { + State->DataCallback = USB_DataCallback; + } + else + { + State->DataCallback = NULL; + } +} + +UINT8 USB_HandleGetStatus( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) +{ + UINT16* status; + UINT16 zero = 0; + + /* validate setup packet */ + if(Setup->wValue != 0 || Setup->wLength != 2) + { + return USB_STATE_STALL; + } + + /* validate based on device state */ + if(State->DeviceState == USB_DEVICE_STATE_DEFAULT) + { + return USB_STATE_STALL; + } + + switch(USB_SETUP_RECIPIENT(Setup->bmRequestType)) + { + case USB_SETUP_RECIPIENT_DEVICE: + status = &State->DeviceStatus; + break; + + case USB_SETUP_RECIPIENT_INTERFACE: + if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + { + return USB_STATE_STALL; + } + + status = &zero; + break; + + case USB_SETUP_RECIPIENT_ENDPOINT: + if(State->DeviceState == USB_DEVICE_STATE_ADDRESS && Setup->wIndex != 0) + { + return USB_STATE_STALL; + } + + /* bit 0x80 designates direction, which we don't utilize in this calculation */ + Setup->wIndex &= 0x7F; + + if(Setup->wIndex >= State->EndpointCount) + { + return USB_STATE_STALL; + } + + status = &State->EndpointStatus[Setup->wIndex]; + break; + + default: + return USB_STATE_STALL; + } + + /* send requested status to host */ + State->ResidualData = (UINT8*)status; + State->ResidualCount = 2; + State->DataCallback = USB_DataCallback; + + return USB_STATE_DATA; +} + +UINT8 USB_HandleClearFeature( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) +{ + USB_CONFIGURATION_DESCRIPTOR * Config; + UINT8 retState; + + /* validate setup packet */ + if(Setup->wLength != 0) + { + return USB_STATE_STALL; + } + + /* validate based on device state */ + if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + { + return USB_STATE_STALL; + } + + switch(USB_SETUP_RECIPIENT(Setup->bmRequestType)) + { + case USB_SETUP_RECIPIENT_DEVICE: + // only support Remote wakeup + if(Setup->wValue != USB_FEATURE_DEVICE_REMOTE_WAKEUP) + return USB_STATE_STALL; + + // Locate the configuration descriptor + Config = (USB_CONFIGURATION_DESCRIPTOR *)USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, Setup ); + + if(Config && (Config->bmAttributes & USB_ATTRIBUTE_REMOTE_WAKEUP)) + { + State->DeviceStatus &= ~USB_STATUS_DEVICE_REMOTE_WAKEUP; + retState = USB_STATE_REMOTE_WAKEUP; + } + else + { + return USB_STATE_STALL; + } + break; + + case USB_SETUP_RECIPIENT_INTERFACE: + /* there are no interface features to clear */ + return USB_STATE_STALL; + + case USB_SETUP_RECIPIENT_ENDPOINT: + if(State->DeviceState == USB_DEVICE_STATE_ADDRESS && Setup->wIndex != 0) + return USB_STATE_STALL; + + /* bit 0x80 designates direction, which we dont utilize in this calculation */ + Setup->wIndex &= 0x7F; + + if(Setup->wIndex == 0 || Setup->wIndex >= State->EndpointCount) + return USB_STATE_STALL; + + if(Setup->wValue != USB_FEATURE_ENDPOINT_HALT) + return USB_STATE_STALL; + + /* clear the halt feature */ + State->EndpointStatus[Setup->wIndex] &= ~USB_STATUS_ENDPOINT_HALT; + State->EndpointStatusChange = Setup->wIndex; + retState= USB_STATE_STATUS; + break; + + default: + return USB_STATE_STALL; + } + + /* send zero-length packet to tell host we're done */ + State->ResidualCount = 0; + State->DataCallback = USB_DataCallback; + + /* notify lower layer of status change */ + return retState; +} + +UINT8 USB_HandleSetFeature( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) +{ + USB_CONFIGURATION_DESCRIPTOR * Config; + UINT8 retState; + + /* validate setup packet */ + if(Setup->wLength != 0) + { + return USB_STATE_STALL; + } + + /* validate based on device state */ + if(State->DeviceState == USB_DEVICE_STATE_DEFAULT) + { + return USB_STATE_STALL; + } + + switch(USB_SETUP_RECIPIENT(Setup->bmRequestType)) + { + case USB_SETUP_RECIPIENT_DEVICE: + // only support Remote wakeup + if(Setup->wValue != USB_FEATURE_DEVICE_REMOTE_WAKEUP) + { + return USB_STATE_STALL; + } + + Config = (USB_CONFIGURATION_DESCRIPTOR *)USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, Setup ); + if( Config == NULL ) // If the configuration record could not be found + return USB_STATE_STALL; // Something pretty serious is wrong + + if(Config->bmAttributes & USB_ATTRIBUTE_REMOTE_WAKEUP) + { + State->DeviceStatus |= USB_STATUS_DEVICE_REMOTE_WAKEUP; + } + + retState = USB_STATE_REMOTE_WAKEUP; + break; + + case USB_SETUP_RECIPIENT_INTERFACE: + /* there are no interface features to set */ + return USB_STATE_STALL; + + case USB_SETUP_RECIPIENT_ENDPOINT: + if(State->DeviceState == USB_DEVICE_STATE_ADDRESS && Setup->wIndex != 0) + { + return USB_STATE_STALL; + } + + /* bit 0x80 designates direction, which we don't utilize in this calculation */ + Setup->wIndex &= 0x7F; + + if(Setup->wIndex == 0 || Setup->wIndex >= State->EndpointCount) + { + return USB_STATE_STALL; + } + + if(Setup->wValue != USB_FEATURE_ENDPOINT_HALT) + { + return USB_STATE_STALL; + } + + /* set the halt feature */ + State->EndpointStatus[Setup->wIndex] |= USB_STATUS_ENDPOINT_HALT; + State->EndpointStatusChange = Setup->wIndex; + retState = USB_STATE_STATUS; + break; + + default: + return USB_STATE_STALL; + } + + /* send zero-length packet to tell host we're done */ + State->ResidualCount = 0; + State->DataCallback = USB_DataCallback; + + /* notify lower layer of status change */ + return retState; +} + +UINT8 USB_HandleSetAddress( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) +{ + /* validate setup packet */ + if(Setup->wValue > 127 || Setup->wIndex != 0 || Setup->wLength != 0) + { + return USB_STATE_STALL; + } + + /* validate based on device state */ + if(State->DeviceState >= USB_DEVICE_STATE_CONFIGURED) + { + return USB_STATE_STALL; + } + + /* set address */ + State->Address = Setup->wValue; + + /* catch state changes */ + if(State->Address == 0) + { + State->DeviceState = USB_DEVICE_STATE_DEFAULT; + } + else + { + State->DeviceState = USB_DEVICE_STATE_ADDRESS; + } + + USB_StateCallback( State ); + + /* send zero-length packet to tell host we're done */ + State->ResidualCount = 0; + State->DataCallback = USB_DataCallback; + + /* notify hardware of address change */ + return USB_STATE_ADDRESS; +} + +// UINT8 USB_HandleConfigurationRequests( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) +// { +// const USB_DESCRIPTOR_HEADER * header; +// UINT8 type; +// UINT8 DescriptorIndex; + +// /* this request is valid regardless of device state */ +// type = ((Setup->wValue & 0xFF00) >> 8); +// DescriptorIndex = (Setup->wValue & 0x00FF); +// State->Expected = Setup->wLength; + +// if(State->Expected == 0) +// { +// // just return an empty Status packet +// State->ResidualCount = 0; +// State->DataCallback = USB_DataCallback; +// return USB_STATE_DATA; +// } + +// // +// // The very first GET_DESCRIPTOR command out of reset should always return at most PacketSize bytes. +// // After that, you can return as many as the host has asked. +// // +// if(State->DeviceState <= USB_DEVICE_STATE_DEFAULT) +// { +// if(State->FirstGetDescriptor) +// { +// State->FirstGetDescriptor = FALSE; + +// State->Expected = __min(State->Expected, State->PacketSize); +// } +// } + +// State->ResidualData = NULL; +// State->ResidualCount = 0; + +// if( Setup->bRequest == USB_GET_DESCRIPTOR ) +// { +// switch(type) +// { +// case USB_DEVICE_DESCRIPTOR_TYPE: +// header = USB_FindRecord( State, USB_DEVICE_DESCRIPTOR_MARKER, Setup ); +// if( header ) +// { +// const USB_DEVICE_DESCRIPTOR * device = (USB_DEVICE_DESCRIPTOR *)header; +// State->ResidualData = (UINT8 *)&device->bLength; // Start of the device descriptor +// State->ResidualCount = __min(State->Expected, device->bLength); +// } +// break; + +// case USB_CONFIGURATION_DESCRIPTOR_TYPE: +// header = USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, Setup ); +// if( header ) +// { +// const USB_CONFIGURATION_DESCRIPTOR * Config = (USB_CONFIGURATION_DESCRIPTOR *)header; +// State->ResidualData = (UINT8 *)&Config->bLength; +// State->ResidualCount = __min(State->Expected, Config->wTotalLength); +// } +// break; + +// case USB_STRING_DESCRIPTOR_TYPE: +// if(DescriptorIndex == 0) // If host is requesting the language list +// { +// State->ResidualData = USB_LanguageDescriptor; +// State->ResidualCount = __min(State->Expected, USB_LANGUAGE_DESCRIPTOR_SIZE); +// } +// else if( DescriptorIndex == USB_FRIENDLY_STRING_NUM && FriendlyNameString.bLength != 0 ) // If "friendly name" was changed by Flash Config sector +// { +// State->ResidualData = (UINT8 *)&FriendlyNameString; +// State->ResidualCount = __min(State->Expected, FriendlyNameString.bLength); +// } +// else if( NULL != (header = USB_FindRecord( State, USB_STRING_DESCRIPTOR_MARKER, Setup )) ) +// { +// const USB_STRING_DESCRIPTOR_HEADER * string = (USB_STRING_DESCRIPTOR_HEADER *)header; +// State->ResidualData = (UINT8 *)&string->bLength; +// State->ResidualCount = __min(State->Expected, string->bLength); +// } +// break; + +// default: +// break; +// } +// } + +// // If the request was not recognized, the generic types should be searched +// if( State->ResidualData == NULL ) +// { +// if( NULL != (header = USB_FindRecord( State, USB_GENERIC_DESCRIPTOR_MARKER, Setup )) ) +// { +// State->ResidualData = (UINT8 *)header; +// State->ResidualData += sizeof(USB_GENERIC_DESCRIPTOR_HEADER); // Data is located right after the header +// State->ResidualCount = __min(State->Expected, header->size - sizeof(USB_GENERIC_DESCRIPTOR_HEADER)); +// } +// else +// return USB_STATE_STALL; +// } + +// State->DataCallback = USB_DataCallback; + +// return USB_STATE_DATA; +// } + +// UINT8 USB_HandleGetConfiguration( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) +// { +// /* validate setup packet */ +// if(Setup->wValue != 0 || Setup->wIndex != 0 || Setup->wLength != 1) +// { +// return USB_STATE_STALL; +// } + +// /* validate based on device state */ +// if(State->DeviceState == USB_DEVICE_STATE_DEFAULT) +// { +// return USB_STATE_STALL; +// } + +// State->ResidualData = &State->ConfigurationNum; +// State->ResidualCount = 1; +// State->Expected = 1; +// State->DataCallback = USB_DataCallback; + +// return USB_STATE_DATA; +// } + +// UINT8 USB_HandleSetConfiguration( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup, BOOL DataPhase ) +// { +// /* validate setup packet */ +// if(Setup->wIndex != 0 || Setup->wLength != 0) +// { +// return USB_STATE_STALL; +// } + +// /* validate based on device state */ +// if(State->DeviceState == USB_DEVICE_STATE_DEFAULT) +// { +// return USB_STATE_STALL; +// } + +// /* we only support one configuration */ +// if(Setup->wValue > 1) +// { +// return USB_STATE_STALL; +// } + +// State->ConfigurationNum = Setup->wValue; + +// /* catch state changes */ +// if(State->ConfigurationNum == 0) +// { +// State->DeviceState = USB_DEVICE_STATE_ADDRESS; +// } +// else +// { +// State->DeviceState = USB_DEVICE_STATE_CONFIGURED; +// } + +// USB_StateCallback( State ); + +// if (DataPhase) +// { +// /* send zero-length packet to tell host we're done */ +// State->ResidualCount = 0; +// State->DataCallback = USB_DataCallback; +// } + +// return USB_STATE_CONFIGURATION; +// } + +//--// + +// Searches through the USB Configuration records for the requested type +// Returns a pointer to the header information if found and NULL if not +const USB_DESCRIPTOR_HEADER * USB_FindRecord( USB_CONTROLLER_STATE* State, UINT8 marker, USB_SETUP_PACKET * setup ) +{ + bool Done = false; + const USB_DESCRIPTOR_HEADER * header = (const USB_DESCRIPTOR_HEADER *)State->Configuration; + + // If there is no configuration for this Controller + if( NULL == header ) + return header; + + while( !Done ) + { + const UINT8 * next = (const UINT8 *)header; + next += header->size; // Calculate address of next record + const USB_GENERIC_DESCRIPTOR_HEADER *generic = (USB_GENERIC_DESCRIPTOR_HEADER *)header; + + switch( header->marker ) + { + case USB_DEVICE_DESCRIPTOR_MARKER: + case USB_CONFIGURATION_DESCRIPTOR_MARKER: + if( header->marker == marker ) + Done = true; + break; + case USB_STRING_DESCRIPTOR_MARKER: + // If String descriptor then the index is significant + if( (header->marker == marker) && (header->iValue == (setup->wValue & 0x00FF)) ) + Done = true; + break; + case USB_GENERIC_DESCRIPTOR_MARKER: + if( generic->bmRequestType == setup->bmRequestType && + generic->bRequest == setup->bRequest && + generic->wValue == setup->wValue && + generic->wIndex == setup->wIndex ) + { + Done = true; + } + break; + case USB_END_DESCRIPTOR_MARKER: + default: + Done = true; + header = NULL; + break; + } + if( !Done ) + header = (const USB_DESCRIPTOR_HEADER *)next; // Try next record + } + + return header; +} + +// UINT8 USB_ControlCallback( USB_CONTROLLER_STATE* State ) +// { +// USB_SETUP_PACKET* Setup; + +// if(State->DataSize == 0) +// { +// return USB_STATE_DONE; +// } + +// Setup = (USB_SETUP_PACKET*)State->Data; + +// switch(Setup->bRequest) +// { +// case USB_GET_STATUS: +// return USB_HandleGetStatus ( State, Setup ); +// case USB_CLEAR_FEATURE: +// return USB_HandleClearFeature ( State, Setup ); +// case USB_SET_FEATURE: +// return USB_HandleSetFeature ( State, Setup ); +// case USB_SET_ADDRESS: +// return USB_HandleSetAddress ( State, Setup ); +// case USB_GET_CONFIGURATION: +// return USB_HandleGetConfiguration ( State, Setup ); +// case USB_SET_CONFIGURATION: +// return USB_HandleSetConfiguration ( State, Setup, TRUE ); +// default: +// return USB_HandleConfigurationRequests( State, Setup ); +// } + +// return USB_STATE_STALL; +// } + +USB_PACKET64* USB_RxEnqueue( USB_CONTROLLER_STATE* State, int endpoint, BOOL& DisableRx ) +{ + ASSERT_IRQ_MUST_BE_OFF(); + ASSERT( State && (endpoint < USB_MAX_QUEUES) ); + ASSERT( State->Queues[endpoint] && !State->IsTxQueue[endpoint] ) + + USB_PACKET64* Packet64 = State->Queues[endpoint]->Push(); + + DisableRx = State->Queues[endpoint]->IsFull(); + + USB_SetEvent( State->ControllerNum, 1 << endpoint ); + + return Packet64; +} + +USB_PACKET64* USB_TxDequeue( USB_CONTROLLER_STATE* State, int endpoint, BOOL Done ) +{ + ASSERT_IRQ_MUST_BE_OFF(); + ASSERT( State && (endpoint < USB_MAX_QUEUES) ); + ASSERT( State->Queues[endpoint] && State->IsTxQueue[endpoint] ) + + if(Done) + { + return State->Queues[endpoint]->Pop(); + } + else + { + return State->Queues[endpoint]->Peek(); + } +} + +// UsbConfigurationCheck() +// Checks each record of a USB descriptor list for simple mistakes. This test should +// always be performed before allowing a USB port to be initialized with the descriptor +// list. +// +// NOTE: TODO: Endpoints need to be checked for overlap (must not be used more than once). +int UsbConfigurationCheck( const USB_DYNAMIC_CONFIGURATION *firstRecord ) +{ + const UINT8 *next; + const USB_DESCRIPTOR_HEADER *record; + + const USB_DEVICE_DESCRIPTOR *device; + const USB_CONFIGURATION_DESCRIPTOR *configuration; + const USB_INTERFACE_DESCRIPTOR *interface; + const USB_ENDPOINT_DESCRIPTOR *endpoint; + const USB_STRING_DESCRIPTOR_HEADER *string; + const USB_GENERIC_DESCRIPTOR_HEADER *generic; + + UINT8 nInterfaces = 0; + UINT8 nEndpoints = 0; + bool foundDevice = false; + bool foundConfig = false; + bool epUsed[31]; + UINT8 itfcUsed[10]; + int i; + + int recordError = USB_CONFIG_ERR_OK; + + for( i = 0; i < 31; i++ ) + epUsed[i] = false; // Set all endpoints to unused + + for( i = 0; i < 10; i++ ) + itfcUsed[i] = 0xFF; // Empty interface list + + for( record = (const USB_DESCRIPTOR_HEADER *)firstRecord; USB_CONFIG_ERR_OK == recordError; record = (const USB_DESCRIPTOR_HEADER *)next ) + { + next = (const UINT8 *)record; + next += record->size; // Calculate address of next record + + switch( record->marker ) + { + case USB_END_DESCRIPTOR_MARKER: + if( foundDevice && foundConfig ) + return recordError; + recordError = USB_CONFIG_ERR_MISSING_RECORD; + break; + + case USB_DEVICE_DESCRIPTOR_MARKER: + if( foundDevice ) + { + recordError = USB_CONFIG_ERR_DUP_DEVICE; + break; // Only one device descriptor allowed + } + device = (const USB_DEVICE_DESCRIPTOR *)record; + if( record->size != sizeof(USB_DEVICE_DESCRIPTOR) || device->bLength != USB_DEVICE_DESCRIPTOR_LENGTH ) + { + recordError = USB_CONFIG_ERR_DEVICE_SIZE; + break; // Record has wrong length + } + if( device->bDescriptorType != USB_DEVICE_DESCRIPTOR_TYPE ) + { + recordError = USB_CONFIG_ERR_DEVICE_TYPE; + break; // Not actually a device descriptor + } + if( device->bMaxPacketSize0 != 8 && device->bMaxPacketSize0 != 16 + && device->bMaxPacketSize0 != 32 && device->bMaxPacketSize0 != 64 ) + { + recordError = USB_CONFIG_ERR_EP0_SIZE; + break; // Endpoint 0 packet size is not legal + } + if( device->bNumConfigurations != 1 ) + { + recordError = USB_CONFIG_ERR_NCONFIGS; + break; // Only exactly 1 configuration is allowed + } + foundDevice = true; + break; + case USB_CONFIGURATION_DESCRIPTOR_MARKER: + if( foundConfig ) + { + recordError = USB_CONFIG_ERR_DUP_CONFIG; + break; // Only one configuration descriptor allowed + } + configuration = (USB_CONFIGURATION_DESCRIPTOR *)record; + if( configuration->bLength != USB_CONFIGURATION_DESCRIPTOR_LENGTH + || record->size != (configuration->wTotalLength + sizeof(USB_DESCRIPTOR_HEADER)) ) + { + recordError = USB_CONFIG_ERR_CONFIG_SIZE; + break; // Record sizes wrong or do not match + } + if( configuration->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE ) + { + recordError = USB_CONFIG_ERR_CONFIG_TYPE; + break; // Not actually a configuration descriptor + } + nInterfaces = configuration->bNumInterfaces; + if( nInterfaces == 0 ) + { + recordError = USB_CONFIG_ERR_NO_INTERFACE; + break; // There must be at least one interface + } + if( configuration->bConfigurationValue > 1 ) + { + recordError = USB_CONFIG_ERR_CONFIG_NUM; + break; // Only allow configuration numbers less than 2 + } + if( (configuration->bmAttributes & 0x8F) != 0x80 ) + { + recordError = USB_CONFIG_ERR_CONFIG_ATTR; + break; // Attribute byte has wrong format + } + // First interface descriptor is right after configuration descriptor + interface = (const USB_INTERFACE_DESCRIPTOR *)&configuration[1]; + while( nInterfaces-- ) + { + if( interface->bDescriptorType != USB_INTERFACE_DESCRIPTOR_TYPE ) + { + recordError = USB_CONFIG_ERR_INTERFACE_TYPE; + break; // Not really an interface descriptor + } + if( interface->bLength != sizeof(USB_INTERFACE_DESCRIPTOR) ) + { + recordError = USB_CONFIG_ERR_INTERFACE_LEN; + break; // Length of interface descriptor is wrong + } + if( interface->bAlternateSetting != 0 ) + { + recordError = USB_CONFIG_ERR_INTERFACE_ALT; + break; // Alternate interfaces not allowed + } + nEndpoints = interface->bNumEndpoints; + if( nEndpoints == 0 ) + { + recordError = USB_CONFIG_ERR_NO_ENDPOINT; + break; // Each interface must have at least one endpoint + } + for( i = 0; itfcUsed[i] != 0xFF && i < 10; i++ ) + { + // If this interface number has already been used + if( itfcUsed[i] == interface->bInterfaceNumber ) + { + recordError = USB_CONFIG_ERR_DUP_INTERFACE; + break; + } + } + if( i >= 10 ) + { + recordError = USB_CONFIG_ERR_TOO_MANY_ITFC; + break; + } + itfcUsed[i] = interface->bInterfaceNumber; // Mark interface as used + endpoint = (const USB_ENDPOINT_DESCRIPTOR *)&interface[1]; // First endpoint is right after interface + // Records after interface descriptor may be some kind of class descriptor + while( endpoint->bDescriptorType != USB_ENDPOINT_DESCRIPTOR_TYPE ) + { + // Leap over possible interface class descriptor + const UINT8 *classDescriptor = (const UINT8 *)endpoint; + classDescriptor += endpoint->bLength; // Position of length is the same for any descriptor + endpoint = (const USB_ENDPOINT_DESCRIPTOR *)classDescriptor; + } + while( nEndpoints-- ) + { + if( endpoint->bDescriptorType != USB_ENDPOINT_DESCRIPTOR_TYPE ) + { + recordError = USB_CONFIG_ERR_ENDPOINT_TYPE; + break; // Not really an endpoint descriptor + } + if( endpoint->bLength != sizeof(USB_ENDPOINT_DESCRIPTOR) ) + { + recordError = USB_CONFIG_ERR_ENDPOINT_LEN; + break; // Length of endpoint descriptor is wrong + } + if( (endpoint->bEndpointAddress & 0x7F) < 1 || (endpoint->bEndpointAddress & 0x7F) > 31 ) + { + recordError = USB_CONFIG_ERR_ENDPOINT_RANGE; + break; // Endpoint number either zero or too large + } + if( (endpoint->bmAttributes & 0x03) == 0 || (endpoint->bmAttributes & 0xC0) != 0 ) + { + recordError = USB_CONFIG_ERR_ENDPOINT_ATTR; + break; // Endpoint set to control type or has reserved bits set + } + if( epUsed[(endpoint->bEndpointAddress & 0x7F)-1] ) + { + recordError = USB_CONFIG_ERR_DUP_ENDPOINT; + break; + } + epUsed[(endpoint->bEndpointAddress & 0x7F)-1] = true; // Show endpoint as being used + endpoint = &endpoint[1]; // Next endpoint immediately follows last one + } + if( recordError != USB_CONFIG_ERR_OK ) + break; + interface = (USB_INTERFACE_DESCRIPTOR *)endpoint; // Next interface descriptor is right after last endpoint + } + // If all interfaces & endpoints are OK and end of all configuration descriptors coincides + // with the start of the next record, only then is this record good. + if( recordError != USB_CONFIG_ERR_OK ) + break; + if( ((UINT8 *)interface == next) ) + foundConfig = true; + else + recordError = USB_CONFIG_ERR_CONFIG_SIZE; + break; + + case USB_STRING_DESCRIPTOR_MARKER: + string = (const USB_STRING_DESCRIPTOR_HEADER *)record; + if( record->size != (string->bLength + sizeof(USB_DESCRIPTOR_HEADER)) ) + { + recordError = USB_CONFIG_ERR_STRING_SIZE; + break; // Record sizes do not match + } + if( string->bDescriptorType != USB_STRING_DESCRIPTOR_TYPE ) + { + recordError = USB_CONFIG_ERR_STRING_TYPE; + break; // Not actually a string descriptor + } + break; + case USB_GENERIC_DESCRIPTOR_MARKER: + generic = (const USB_GENERIC_DESCRIPTOR_HEADER *)record; + if( (generic->bmRequestType & 0x80) != 0x80 ) + { + recordError = USB_CONFIG_ERR_GENERIC_DIR; + break; // Must be a request for information + } + break; + default: + recordError = USB_CONFIG_ERR_UNKNOWN_RECORD; + break; + } + } + + return recordError; +} + + +// USB_NextEndpoint() +// Returns a pointer to the next endpoint descriptor in the USB configuration list along with +// a pointer to its interface descriptor. Returns FALSE if ep or itfc are bogus pointers or +// if the end of the configuration list has been reached (no more endpoints). +// To get the first endpoint and its interface, this should be called with ep = NULL. + +// BOOL USB_NextEndpoint( USB_CONTROLLER_STATE* State, const USB_ENDPOINT_DESCRIPTOR * &ep, const USB_INTERFACE_DESCRIPTOR* &itfc ) +// { +// const UINT8 *next; +// const UINT8 *end; +// const USB_CONFIGURATION_DESCRIPTOR *Config; + +// // Locate the configuration descriptor +// Config = (const USB_CONFIGURATION_DESCRIPTOR *)USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, NULL ); +// if( NULL == Config ) // If configuration is bogus +// return FALSE; + +// // Calculate the range of addresses where endpoint descriptors may be found +// next = (const UINT8 *)&Config[1]; +// end = ((const UINT8 *)Config) + Config->header.size; + +// // If requesting the first endpoint +// if( NULL == ep ) +// { +// // Possible location of first endpoint descriptor - actually, this will +// // always be the first interface descriptor, but it doesn't matter. +// ep = (const USB_ENDPOINT_DESCRIPTOR *)next; +// itfc = NULL; +// } +// // If not, make sure that both pointers are good +// else if( (UINT8 *)ep > next +// && (UINT8 *)ep < end +// && (UINT8 *)itfc >= next +// && (UINT8 *)itfc < end +// && USB_ENDPOINT_DESCRIPTOR_TYPE == ep->bDescriptorType +// && sizeof(USB_ENDPOINT_DESCRIPTOR) == ep->bLength +// && USB_INTERFACE_DESCRIPTOR_TYPE == itfc->bDescriptorType +// && sizeof(USB_INTERFACE_DESCRIPTOR) == itfc->bLength ) +// { +// // Possible location of next endpoint descriptor is right after +// // the current endpoint descriptor +// ep = &ep[1]; +// } +// else +// { +// // If ep or itfc are bad +// return FALSE; +// } + +// // While still within the configuration descriptor +// while( (const UINT8 *)ep < end ) +// { +// // Check for interfaces +// if( USB_INTERFACE_DESCRIPTOR_TYPE == ep->bDescriptorType +// && sizeof(USB_INTERFACE_DESCRIPTOR) == ep->bLength ) +// { +// itfc = (const USB_INTERFACE_DESCRIPTOR *)ep; // Remember the interface +// } +// // If current points to an endpoint descriptor +// else if( USB_ENDPOINT_DESCRIPTOR_TYPE == ep->bDescriptorType +// && sizeof(USB_ENDPOINT_DESCRIPTOR) == ep->bLength ) +// { +// // Found next endpoint descriptor +// return TRUE; +// } + +// // For all configuration descriptors, the first byte is its size. +// // Use this to find the next descriptor in the list +// next = (const UINT8 *)ep; +// next += ep->bLength; +// ep = (const USB_ENDPOINT_DESCRIPTOR *)next; +// } + +// // If we've run past the end of the configuration descriptor, +// // then there are no more endpoints +// return FALSE; +// } + +//--// + +STREAM_DRIVER_DETAILS* USB1_driver_details( UINT32 handle ) +{ + static STREAM_DRIVER_DETAILS details = { + SYSTEM_BUFFERED_IO, + NULL, + NULL, + 1024, + 1024, + TRUE, + TRUE, + FALSE + }; + + return &details; +} + +int USB1_read( char* buffer, size_t size ) +{ + return USB_Read( ConvertCOM_UsbStream(USB1), buffer, size ); +} + +int USB1_write( char* buffer, size_t size ) +{ + return USB_Write( ConvertCOM_UsbStream(USB1), buffer, size ); +} + diff --git a/DeviceCode/pal/COM/usb_cmsis/usb.h b/DeviceCode/pal/COM/usb_cmsis/usb.h new file mode 100644 index 000000000..9b18a0743 --- /dev/null +++ b/DeviceCode/pal/COM/usb_cmsis/usb.h @@ -0,0 +1,142 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _PAL_USB_H_ +#define _PAL_USB_H_ 1 + +//--// + +#include "Tinyhal.h" + +//--// + +void USB_debug_printf( const char*format, ... ); + +//--// + +#if defined(BUILD_RTM) + #undef USB_METRIC_COUNTING + #undef USB_METRIC_NAK_COUNTING + +#else + #define USB_METRIC_COUNTING 1 +// #undef USB_METRIC_COUNTING +// turn off NAK, as NAK-in will trigger all the time +// #define USB_METRIC_NAK_COUNTING 1 + #undef USB_METRIC_NAK_COUNTING +#endif + +//--// + +#define PORT_TX_TO_ENDPOINT(P) (((P) << 1) | 1) +#define PORT_RX_TO_ENDPOINT(P) (((P) << 1) + 2) + +//--// + +extern USB_SETUP_PACKET RequestPacket; + +//--// + +extern UINT8 USB_HandleSetConfiguration( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup, BOOL DataPhase); + +extern USB_PACKET64* USB_RxEnqueue( USB_CONTROLLER_STATE* State, int queue, BOOL& DisableRx ); +extern USB_PACKET64* USB_TxDequeue( USB_CONTROLLER_STATE* State, int queue, BOOL Done ); + +extern UINT8 USB_ControlCallback ( USB_CONTROLLER_STATE* State ); +extern void USB_StateCallback ( USB_CONTROLLER_STATE* State ); + +extern int UsbConfigurationCheck ( const USB_DYNAMIC_CONFIGURATION* firstRecord ); +extern BOOL USB_NextEndpoint ( USB_CONTROLLER_STATE* State, const USB_ENDPOINT_DESCRIPTOR* &ep, const USB_INTERFACE_DESCRIPTOR* &itfc ); + +//--// + +#if defined( USB_REMOTE_WAKEUP) +enum USB_REMOTEWKUP_STATE +{ + USB_REMOTEWKUP_NOT_READY = 0, // not allowed any remote wake up + USB_REMOTEWKUP_WAIT_SD5 = 1, // wait for 5ms idle for allow remote wk up + USB_REMOTEWKUP_SD5_READY = 2, // SD5 is fulfilled + USB_REMOTEWKUP_WAIT_10MS = 3, // hold remote wk up signal for 10ms when Remotewk up is implememnted + USB_REMOTEWKUP_10MS_READY = 4, // complete 10 ms RESUME + USB_REMOTEWKUP_WAIT_EOP = 5, // wait for the EOP + USB_REMOTEWKUP_EOP_READY = 6, // Receive EOP isr + USB_REMOTEWKUP_100MS_EXPIRE =0xBA //error of not found EOP +}; +#endif + +#if defined(USB_METRIC_COUNTING) +struct USB_PERFORMANCE_METRICS +{ + UINT32 RxErrCnt; // sum of any Rx err + UINT32 TxErrCnt; // sum of any Tx Err + UINT32 ULDCnt; + UINT32 InNAKCnt[3]; // NAK cnt for each endpoint, except ep0 + UINT32 OutNAKCnt[3]; + UINT32 FrameCnt; + UINT32 OverunCnt[3]; //For ep2, ep4, ep6 (rx ep) (ep0 no err) + UINT32 UnderunCnt[3]; // for ep1, ep3, ep5, (tx ep) + UINT32 SD5Cnt; + UINT32 SD3Cnt; + UINT32 EOPCnt; + UINT32 DMACnt; + UINT32 ResumeCnt; +}; +#endif + +//--// + +extern const char* UsbStrings[]; + +extern +#if !defined(_ARC) // the ARC compiler does not like const in ths situation +const +#else +#endif +ADS_PACKED struct USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration; + +//--// + +void USB_ClearQueues( USB_CONTROLLER_STATE *State, BOOL ClrRxQueue, BOOL ClrTxQueue ); + +USB_PACKET64* USB_RxEnqueue( int queue, BOOL& DisableRx ); +USB_PACKET64* USB_TxDequeue( int queue, BOOL Done ); + +UINT8 USB_VendorControl( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup); + +UINT8 USB_ControlCallback( USB_CONTROLLER_STATE* State ); + +void USB_StateCallback(USB_CONTROLLER_STATE *State); + +void USB_DataCallback(USB_CONTROLLER_STATE *State); + +const USB_DESCRIPTOR_HEADER * USB_FindRecord(USB_CONTROLLER_STATE* State, UINT8 marker, USB_SETUP_PACKET * iValue); + +//--// + +struct USB_Driver +{ + static int GetControllerCount(); + static BOOL Initialize ( int Controller ); + static BOOL Uninitialize( int Controller ); + static int Configure ( int Controller, const USB_DYNAMIC_CONFIGURATION* Config ); + static const USB_DYNAMIC_CONFIGURATION * GetConfiguration( int Controller ); + + static BOOL OpenStream ( int stream, int writeEP, int readEP ); + static BOOL CloseStream ( int stream ); + + static int Write( int UsbStream, const char* Data, size_t size ); + static int Read ( int UsbStream, char* Data, size_t size ); + static BOOL Flush( int UsbStream ); + + static UINT32 GetEvent ( int Controller, UINT32 Mask ); + static UINT32 SetEvent ( int Controller, UINT32 Event ); + static UINT32 ClearEvent( int Controller, UINT32 Event ); + static UINT8 GetStatus ( int Controller ); + + static void DiscardData( int UsbStream, BOOL fTx ); +}; + +//--// + +#endif /* _PAL_USB_H_ */ From 00920e1de4c5a89c75fae96df4c8fe749c4af622 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 13:08:46 +0000 Subject: [PATCH 051/144] Add readme with steps on how to configure a solution --- Solutions/STM32F4DISCOVERY/readme.md | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Solutions/STM32F4DISCOVERY/readme.md diff --git a/Solutions/STM32F4DISCOVERY/readme.md b/Solutions/STM32F4DISCOVERY/readme.md new file mode 100644 index 000000000..ed3f6ab03 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/readme.md @@ -0,0 +1,63 @@ +### Recipe to configure a NETMF solution ### + +Please note the following (**and this is _EXTREMELY_ important**): +- you must keep the solution name consistent throughout the find/replace/renaming that follows. Failing to do so will result in compilation errors and possibly in bugs that might be hard to track specially if they are using other solutions that already exist in the repository tree. +- In all proj files and some settings file there are GUIDs with tags `````` and ``````. You have to replace them with new ones. + + +##### Pre-requisites ##### + +In order to start configuring a new solution you need to check if the HAL/PAL of the MCU you are targeting are already implemented. +The current NETMF implementation is based in CMSIS. You may want to look into the following folders and search for the appropriate MCU vendor and series/familly names: +- \CMSIS\Device\... +- \DeviceCode\Targets\Native\... + +For example, to implement a solution targeting ST's STM32F4-DISCOVERY board, you should find there: +- \CMSIS\Device\**_ST_**\**_STM32F4xx_** +- \DeviceCode\Targets\Native\**_STM32F4xx_** + +The CMSIS folder has the header files for the STM32F4 series. +The Tartgets\Native folder has the header and code that implements the HAL for the STM32F4 series. + +If these don't exist then you must start by adding support for the appropriate vendor and series/familly CMSIS and HAL/PAL. + +##### Step-by-step ##### + +1. Start by copying an existing solution folder and rename it to something appropriate. For obvious reasons it's recommended that you choose one that is similar to the MCU/board that you are targeting. + +2. Edit the **dotnetmf.proj** file (located in the solution home folder) + a) Find/replace the original solution name in the first `````` block + b) Near the bottom finf the group `````` and at ``` Date: Mon, 21 Mar 2016 13:10:07 +0000 Subject: [PATCH 052/144] Remove unused file --- .../scatterfile_gcc_missing_symbols.xml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 Solutions/STM32F4DISCOVERY/scatterfile_gcc_missing_symbols.xml diff --git a/Solutions/STM32F4DISCOVERY/scatterfile_gcc_missing_symbols.xml b/Solutions/STM32F4DISCOVERY/scatterfile_gcc_missing_symbols.xml deleted file mode 100644 index 65d649caa..000000000 --- a/Solutions/STM32F4DISCOVERY/scatterfile_gcc_missing_symbols.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - From b9c89f682c9e4859a4c808316c4ce6f44b97af23 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 17:09:29 +0000 Subject: [PATCH 053/144] Correct file name case --- DeviceCode/Targets/CMSIS/USB/dotNetMF.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj b/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj index 058b70760..28cca64e3 100644 --- a/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj +++ b/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj @@ -28,7 +28,7 @@ - + From 4dde0e6003bbc4245517e7b32f86dad753839d63 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 17:12:55 +0000 Subject: [PATCH 054/144] Implement CMSIS Flash driver - update solution projects and block storage definitions accordingly --- DeviceCode/Targets/CMSIS/Flash/Flash.h | 56 +++++ .../Targets/CMSIS/Flash/Flash_driver.cpp | 216 ++++++++++++++++++ DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj | 38 +++ .../Targets/Native/STM32F4xx/dotNetMF.proj | 9 +- .../Native/STM32F4xx/dotNetMF_loader.proj | 9 +- .../Blockstorage/addDevices/Bl_addDevices.cpp | 4 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 5 +- .../MCBSTM32F400/TinyBooter/features.settings | 1 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 5 +- .../MCBSTM32F400/TinyCLR/features.settings | 1 + .../TinyCLR_NONET/TinyCLR_NONET.proj | 5 +- .../TinyCLR_NONET/features.settings | 1 + .../Blockstorage/addDevices/Bl_addDevices.cpp | 4 +- .../TinyBooter/TinyBooter.proj | 5 +- .../TinyBooter/features.settings | 3 +- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 5 +- .../TinyCLR/features.settings | 1 + .../STM32F4DISCOVERY/stm32f4xx_hal_conf.h | 2 +- 18 files changed, 342 insertions(+), 28 deletions(-) create mode 100644 DeviceCode/Targets/CMSIS/Flash/Flash.h create mode 100644 DeviceCode/Targets/CMSIS/Flash/Flash_driver.cpp create mode 100644 DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj diff --git a/DeviceCode/Targets/CMSIS/Flash/Flash.h b/DeviceCode/Targets/CMSIS/Flash/Flash.h new file mode 100644 index 000000000..7fa6ac71c --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Flash/Flash.h @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for CMSIS: Copyright (c) Eclo Solutions based in original code from Oberon microsystems, Inc. +// +// *** Flash Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +//--// +#ifndef _DRIVERS_FLASH_DRIVER_ +#define _DRIVERS_FLASH_DRIVER_ 1 + +//--// + +struct Flash_Driver +{ + + static BOOL ChipInitialize( void* context ); + + static BOOL ChipUnInitialize( void* context ); + + static const BlockDeviceInfo* GetDeviceInfo( void* context ); + + static BOOL Read( void* context, ByteAddress Address, UINT32 NumBytes, BYTE * pSectorBuff ); + + static BOOL Write( void* context, ByteAddress Address, UINT32 NumBytes, BYTE * pSectorBuff, BOOL ReadModifyWrite ); + + static BOOL Memset( void* context, ByteAddress Address, UINT8 Data, UINT32 NumBytes ); + + static BOOL GetSectorMetadata(void* context, ByteAddress SectorStart, SectorMetadata* pSectorMetadata); + + static BOOL SetSectorMetadata(void* context, ByteAddress SectorStart, SectorMetadata* pSectorMetadata); + + static BOOL IsBlockErased( void* context, ByteAddress BlockStart, UINT32 BlockLength ); + + static BOOL EraseBlock( void* context, ByteAddress Address ); + + static void SetPowerState( void* context, UINT32 State ); + + static UINT32 MaxSectorWrite_uSec( void* context ); + + static UINT32 MaxBlockErase_uSec( void* context ); + + +}; + +//--// + +#endif // _DRIVERS_FLASH_DRIVER_ diff --git a/DeviceCode/Targets/CMSIS/Flash/Flash_driver.cpp b/DeviceCode/Targets/CMSIS/Flash/Flash_driver.cpp new file mode 100644 index 000000000..99530032f --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Flash/Flash_driver.cpp @@ -0,0 +1,216 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for CMSIS: Copyright (c) Eclo Solutions based in original code from Oberon microsystems, Inc. +// +// *** Flash Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include "tinyhal.h" +#include "Flash.h" + +//--// + +BOOL __section("SectionForFlashOperations")Flash_Driver::ChipInitialize(void* context) +{ + NATIVE_PROFILE_HAL_DRIVERS_FLASH(); + return TRUE; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::ChipUnInitialize(void* context) +{ + NATIVE_PROFILE_HAL_DRIVERS_FLASH(); + return TRUE; +} + +const BlockDeviceInfo* __section("SectionForFlashOperations")Flash_Driver::GetDeviceInfo(void* context) +{ + MEMORY_MAPPED_NOR_BLOCK_CONFIG* config = (MEMORY_MAPPED_NOR_BLOCK_CONFIG*)context; + + return config->BlockConfig.BlockDeviceInformation; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::Read(void* context, ByteAddress startSector, UINT32 numBytes, BYTE * pSectorBuff) +{ + NATIVE_PROFILE_HAL_DRIVERS_FLASH(); + + if (pSectorBuff == NULL) return FALSE; + + UINT16* address = (UINT16 *)startSector; + UINT16* endAddress = (UINT16 *)(startSector + numBytes); + UINT16 *pBuf = (UINT16 *)pSectorBuff; + + while(address < endAddress) + { + *pBuf++ = *address++; + } + + return TRUE; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::Write(void* context, ByteAddress address, UINT32 numBytes, BYTE * dataBuffer, BOOL readModifyWrite) +{ + NATIVE_PROFILE_PAL_FLASH(); + + // Read-modify-write is used for FAT filesystems only + if (readModifyWrite) return FALSE; + + __IO uint32_t programAddress = address; + UINT16* bufferPointer = (UINT16*)dataBuffer; + + while(programAddress < (address + numBytes)) + { + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, programAddress, *bufferPointer) != HAL_OK) + { + debug_printf( "Flash_WriteToSector failure @ 0x%08x\r\n", (UINT32)programAddress); + return FALSE; + } + + programAddress++; + bufferPointer++; + } + + return TRUE; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::Memset(void* context, ByteAddress Address, UINT8 Data, UINT32 NumBytes) +{ + NATIVE_PROFILE_PAL_FLASH(); + + // used for FAT filesystems only + return FALSE; +} + + +BOOL __section("SectionForFlashOperations")Flash_Driver::GetSectorMetadata(void* context, ByteAddress SectorStart, SectorMetadata* pSectorMetadata) +{ + // no metadata + return FALSE; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::SetSectorMetadata(void* context, ByteAddress SectorStart, SectorMetadata* pSectorMetadata) +{ + // no metadata + return FALSE; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::IsBlockErased(void* context, ByteAddress blockStart, UINT32 blockLength) +{ + NATIVE_PROFILE_HAL_DRIVERS_FLASH(); + + UINT16* address = (UINT16 *) blockStart; + UINT16* endAddress = (UINT16 *)(blockStart + blockLength); + + while(address < endAddress) + { + if(*address != (UINT16)-1) + { + return FALSE; + } + address++; + } + + return TRUE; +} + +BOOL __section("SectionForFlashOperations")Flash_Driver::EraseBlock(void* context, ByteAddress sector) +{ + NATIVE_PROFILE_HAL_DRIVERS_FLASH(); + + FLASH_EraseInitTypeDef FLASH_EraseInitStruct; + uint32_t sectorError = 0; + + // NETMF PAL 'block' designation is the equivalent to Cortex-M 'sector' so it's OK to use the address directly into the FLASH erase init struct + + // init FLASH erase structure with following configs + // erase a single sector in flash bank 1 (NETMF doesn't have the concept of multiple FLASH banks) + // sector to erase + FLASH_EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; + FLASH_EraseInitStruct.Sector = (UINT32)sector; + FLASH_EraseInitStruct.NbSectors = 1; + FLASH_EraseInitStruct.Banks = FLASH_BANK_1; + + // set voltage range according to VDD_VALUE + // FLASH_VOLTAGE_RANGE_1: when the device voltage range is 1.8V to 2.1V + #if ((VDD_VALUE >= 1800U) && (VDD_VALUE < 2100U)) + FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_1; + // FLASH_VOLTAGE_RANGE_2: when the device voltage range is 2.1V to 2.7V + #elif ((VDD_VALUE >= 2100U) && (VDD_VALUE < 2700U)) + FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_2; + // FLASH_VOLTAGE_RANGE_3: when the device voltage range is 2.7V to 3.6V, + #elif ((VDD_VALUE >= 2700U) && (VDD_VALUE < 3600U)) + FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; + // FLASH_VOLTAGE_RANGE_4: when the device voltage range is 2.7V to 3.6V + External Vpp + #elif (VDD_VALUE >= 3600U) + FLASH_EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_4; + #else + #error CONFIGURATION ERROR: missing or invalid value for VDD_VALUE (check xxxxxxxxx_hal_conf.h in solution folder) + #endif + + // perform erase operation + if(HAL_FLASHEx_Erase(&FLASH_EraseInitStruct, §orError) != HAL_OK) + { + debug_printf( "Flash_EraseBlock failure @ sector %08x\r\n", (UINT32)sectorError); + return FALSE; + } + + return TRUE; +} + +void __section("SectionForFlashOperations")Flash_Driver::SetPowerState(void* context, UINT32 state) +{ +} + + +//--// --------------------------------------------------- + +#pragma arm section code = "SectionForFlashOperations" + +UINT32 __section("SectionForFlashOperations")Flash_Driver::MaxSectorWrite_uSec(void* context) +{ + NATIVE_PROFILE_PAL_FLASH(); + + MEMORY_MAPPED_NOR_BLOCK_CONFIG* config = (MEMORY_MAPPED_NOR_BLOCK_CONFIG*)context; + + return config->BlockConfig.BlockDeviceInformation->MaxSectorWrite_uSec; +} + + +UINT32 __section("SectionForFlashOperations")Flash_Driver::MaxBlockErase_uSec(void* context) +{ + NATIVE_PROFILE_PAL_FLASH(); + + MEMORY_MAPPED_NOR_BLOCK_CONFIG* config = (MEMORY_MAPPED_NOR_BLOCK_CONFIG*)context; + + return config->BlockConfig.BlockDeviceInformation->MaxBlockErase_uSec; +} + +#if defined(ADS_LINKER_BUG__NOT_ALL_UNUSED_VARIABLES_ARE_REMOVED) +#pragma arm section rodata = "g_CMSIS_Flash_DeviceTable" +#endif + +struct IBlockStorageDevice g_CMSIS_Flash_DeviceTable = +{ + &Flash_Driver::ChipInitialize, + &Flash_Driver::ChipUnInitialize, + &Flash_Driver::GetDeviceInfo, + &Flash_Driver::Read, + &Flash_Driver::Write, + &Flash_Driver::Memset, + &Flash_Driver::GetSectorMetadata, + &Flash_Driver::SetSectorMetadata, + &Flash_Driver::IsBlockErased, + &Flash_Driver::EraseBlock, + &Flash_Driver::SetPowerState, + &Flash_Driver::MaxSectorWrite_uSec, + &Flash_Driver::MaxBlockErase_uSec, +}; + +#if defined(ADS_LINKER_BUG__NOT_ALL_UNUSED_VARIABLES_ARE_REMOVED) +#pragma arm section rodata +#endif diff --git a/DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj b/DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj new file mode 100644 index 000000000..3825c7bbf --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj @@ -0,0 +1,38 @@ + + + + CMSIS_Flash + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Flash\dotNetMF.proj + {00650055-00D3-008E-9D45-3758F085F71F} + + + CMSIS internal flash block storage driver + HAL + CMSIS_Flash.$(LIB_EXT) + CMSIS_Flash.$(LIB_EXT).manifest + BlockStorage + + + False + + + False + False + False + DeviceCode\Targets\CMSIS\Flash + Library + false + 4.0.0.0 + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index d032f73ce..c46844192 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -99,7 +99,14 @@ - + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 661ecf905..b39650117 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -137,7 +137,14 @@ - + + + + + + + + diff --git a/Solutions/MCBSTM32F400/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp b/Solutions/MCBSTM32F400/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp index 5972d2748..fdf0a2931 100644 --- a/Solutions/MCBSTM32F400/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp +++ b/Solutions/MCBSTM32F400/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp @@ -15,7 +15,7 @@ extern struct BlockStorageDevice g_STM32F4_BS; -extern struct IBlockStorageDevice g_STM32F4_Flash_DeviceTable; +extern struct IBlockStorageDevice g_CMSIS_Flash_DeviceTable; extern struct BLOCK_CONFIG g_STM32F4_BS_Config; extern struct BlockStorageDevice g_M29W640FB_BS; @@ -25,7 +25,7 @@ extern struct BLOCK_CONFIG g_M29W640FB_BS_Config; void BlockStorage_AddDevices() { BlockStorageList::AddDevice( &g_STM32F4_BS, - &g_STM32F4_Flash_DeviceTable, + &g_CMSIS_Flash_DeviceTable, &g_STM32F4_BS_Config, FALSE ); BlockStorageList::AddDevice( &g_M29W640FB_BS, &g_M29W640FB_Flash_DeviceTable, diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index b81b6a46a..34eb2ad36 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -51,6 +51,7 @@ + @@ -181,10 +182,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 60fe7af31..e0be2ba82 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -14,6 +14,7 @@ False False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 5ff298332..291a41d6f 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -90,6 +90,7 @@ + @@ -252,10 +253,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 7ad6666d3..8a7bb4306 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -14,6 +14,7 @@ False False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 66913c59e..e3f0f250d 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -78,6 +78,7 @@ + @@ -224,10 +225,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index b8f1852fe..a3f4d6818 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -14,6 +14,7 @@ False False + True False False diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp b/Solutions/STM32F4DISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp index 4b84ebf65..9f5aff89e 100644 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp +++ b/Solutions/STM32F4DISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp @@ -15,13 +15,13 @@ extern struct BlockStorageDevice g_STM32F4_BS; -extern struct IBlockStorageDevice g_STM32F4_Flash_DeviceTable; +extern struct IBlockStorageDevice g_CMSIS_Flash_DeviceTable; extern struct BLOCK_CONFIG g_STM32F4_BS_Config; void BlockStorage_AddDevices() { - BlockStorageList::AddDevice( &g_STM32F4_BS, &g_STM32F4_Flash_DeviceTable, &g_STM32F4_BS_Config, FALSE ); + BlockStorageList::AddDevice( &g_STM32F4_BS, &g_CMSIS_Flash_DeviceTable, &g_STM32F4_BS_Config, FALSE ); } diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index d6424c2f7..df6ca4252 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -52,6 +52,7 @@ + @@ -154,10 +155,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 4b3dcc309..8cff09887 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -12,8 +12,9 @@ True False False - True + False + True False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 15673257d..ea328bff9 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -80,6 +80,7 @@ + @@ -220,10 +221,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 27c168cee..e87a6b60a 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -14,6 +14,7 @@ False True + True False False diff --git a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h index 8be503621..eb0c9c508 100644 --- a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h +++ b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h @@ -150,7 +150,7 @@ /** * @brief This is the HAL system configuration section */ -#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define VDD_VALUE (3300U) /*!< Value of VDD in mv */ #define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ #define USE_RTOS 0U //#define PREFETCH_ENABLE 0U From 326b149f9c92379dc11efdd40dab9512ef45342c Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 21 Mar 2016 17:16:20 +0000 Subject: [PATCH 055/144] Correct implementation of CMSIS for MCBSTM32F400 solution - add missing hal_conf file - add missing groups in global dotnetmf proj --- Solutions/MCBSTM32F400/MCBSTM32F400.settings | 15 +- Solutions/MCBSTM32F400/dotnetmf.proj | 2 +- Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h | 444 +++++++++++++++++++ 3 files changed, 459 insertions(+), 2 deletions(-) create mode 100644 Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h diff --git a/Solutions/MCBSTM32F400/MCBSTM32F400.settings b/Solutions/MCBSTM32F400/MCBSTM32F400.settings index 19746763e..7aacd0090 100644 --- a/Solutions/MCBSTM32F400/MCBSTM32F400.settings +++ b/Solutions/MCBSTM32F400/MCBSTM32F400.settings @@ -19,11 +19,24 @@ Copyright (C) Microsoft Corporation + + + STM32F407xx + F4 + 1.11.0 + + - + + + + + + +
\ No newline at end of file diff --git a/Solutions/MCBSTM32F400/dotnetmf.proj b/Solutions/MCBSTM32F400/dotnetmf.proj index 7ddb1ad94..c0b45bee3 100644 --- a/Solutions/MCBSTM32F400/dotnetmf.proj +++ b/Solutions/MCBSTM32F400/dotnetmf.proj @@ -2,7 +2,7 @@ Solutions\MCBSTM32F400 - $(SPOCLIENT)\Solutions\STM32F4DISCOVERY + $(SPOCLIENT)\Solutions\MCBSTM32F400 $(SPOCLIENT)\Solutions\MCBSTM32F400\MCBSTM32F400.settings diff --git a/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h b/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h new file mode 100644 index 000000000..eb0c9c508 --- /dev/null +++ b/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h @@ -0,0 +1,444 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file based in stm32f4xx_hal_conf_template.h V1.4.4 + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CAN_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_CEC_MODULE_ENABLED +#define HAL_CRYP_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +#define HAL_DCMI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_DMA2D_MODULE_ENABLED +#define HAL_ETH_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_NAND_MODULE_ENABLED +#define HAL_NOR_MODULE_ENABLED +#define HAL_PCCARD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#define HAL_SDRAM_MODULE_ENABLED +#define HAL_HASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +#define HAL_LTDC_MODULE_ENABLED +#define HAL_DSI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_QSPI_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RNG_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SAI_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_IRDA_MODULE_ENABLED +#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_PCD_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED +#define HAL_FMPI2C_MODULE_ENABLED +#define HAL_SPDIFRX_MODULE_ENABLED +#define HAL_LPTIM_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE (3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ +#define USE_RTOS 0U +//#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010U) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011U) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012U) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000U) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 1U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From 513db50378f410c528f4c7533d96b63fd0901757 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:32:56 +0000 Subject: [PATCH 056/144] Make all function "weak" --- .../pal/AsyncProcCall/stubs/async_stubs.cpp | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/DeviceCode/pal/AsyncProcCall/stubs/async_stubs.cpp b/DeviceCode/pal/AsyncProcCall/stubs/async_stubs.cpp index 61e94b88e..32965e757 100644 --- a/DeviceCode/pal/AsyncProcCall/stubs/async_stubs.cpp +++ b/DeviceCode/pal/AsyncProcCall/stubs/async_stubs.cpp @@ -5,38 +5,38 @@ #include //--// // continuation list -void HAL_CONTINUATION::InitializeList() +__weak void HAL_CONTINUATION::InitializeList() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_CONTINUATION::Uninitialize() +__weak void HAL_CONTINUATION::Uninitialize() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_CONTINUATION::InitializeCallback( HAL_CALLBACK_FPN EntryPoint, void* Argument ) +__weak void HAL_CONTINUATION::InitializeCallback( HAL_CALLBACK_FPN EntryPoint, void* Argument ) { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_CONTINUATION::Enqueue() +__weak void HAL_CONTINUATION::Enqueue() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_CONTINUATION::Abort () +__weak void HAL_CONTINUATION::Abort () { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -BOOL HAL_CONTINUATION::Dequeue_And_Execute() +__weak BOOL HAL_CONTINUATION::Dequeue_And_Execute() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); return TRUE; } -bool HAL_CONTINUATION::IsLinked() +__weak bool HAL_CONTINUATION::IsLinked() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); return false; @@ -44,41 +44,41 @@ bool HAL_CONTINUATION::IsLinked() //-// // completion list -void HAL_COMPLETION::InitializeList() +__weak void HAL_COMPLETION::InitializeList() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::Uninitialize() +__weak void HAL_COMPLETION::Uninitialize() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::EnqueueTicks(UINT64 EventTimeTicks) +__weak void HAL_COMPLETION::EnqueueTicks(UINT64 EventTimeTicks) { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::EnqueueDelta( UINT32 uSecFromNow ) +__weak void HAL_COMPLETION::EnqueueDelta( UINT32 uSecFromNow ) { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::Abort() +__weak void HAL_COMPLETION::Abort() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::Execute() +__weak void HAL_COMPLETION::Execute() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::DequeueAndExec() +__weak void HAL_COMPLETION::DequeueAndExec() { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } -void HAL_COMPLETION::WaitForInterrupts( UINT64 Expire, UINT32 sleepLevel, UINT64 wakeEvents ) +__weak void HAL_COMPLETION::WaitForInterrupts( UINT64 Expire, UINT32 sleepLevel, UINT64 wakeEvents ) { NATIVE_PROFILE_PAL_ASYNC_PROC_CALL(); } From 7ef98aa8d986c062a66afcdb6c4efaae8b4b8f08 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:36:37 +0000 Subject: [PATCH 057/144] Turn all functions "weak" --- .../stubs/blockstorageList_stubs.cpp | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/DeviceCode/pal/BlockStorage/stubs/blockstorageList_stubs.cpp b/DeviceCode/pal/BlockStorage/stubs/blockstorageList_stubs.cpp index 0c20d27d0..38c71dbb1 100644 --- a/DeviceCode/pal/BlockStorage/stubs/blockstorageList_stubs.cpp +++ b/DeviceCode/pal/BlockStorage/stubs/blockstorageList_stubs.cpp @@ -10,98 +10,98 @@ BlockStorageDevice* BlockStorageList::s_primaryDevice = NULL; //--// -void BlockStorageList::Initialize() +__weak void BlockStorageList::Initialize() { } -BOOL BlockStorageList::InitializeDevices() +__weak BOOL BlockStorageList::InitializeDevices() { return TRUE; } -BOOL BlockStorageList::UnInitializeDevices() +__weak BOOL BlockStorageList::UnInitializeDevices() { return TRUE; } -BOOL BlockStorageList::AddDevice( BlockStorageDevice* pBSD, IBlockStorageDevice* vtable, void* config, BOOL Init) +__weak BOOL BlockStorageList::AddDevice( BlockStorageDevice* pBSD, IBlockStorageDevice* vtable, void* config, BOOL Init) { return TRUE; } -BOOL BlockStorageList::RemoveDevice( BlockStorageDevice* pBSD, BOOL UnInit) +__weak BOOL BlockStorageList::RemoveDevice( BlockStorageDevice* pBSD, BOOL UnInit) { return TRUE; } -BlockStorageDevice* BlockStorageList::GetFirstDevice() +__weak BlockStorageDevice* BlockStorageList::GetFirstDevice() { return NULL; } -BlockStorageDevice* BlockStorageList::GetNextDevice( BlockStorageDevice& device ) +__weak BlockStorageDevice* BlockStorageList::GetNextDevice( BlockStorageDevice& device ) { return NULL; } -UINT32 BlockStorageList::GetNumDevices() +__weak UINT32 BlockStorageList::GetNumDevices() { return 0; } -BOOL BlockStorageList::FindDeviceForPhysicalAddress( BlockStorageDevice** pBSD, UINT32 PhysicalAddress, ByteAddress &SectAddress) +__weak BOOL BlockStorageList::FindDeviceForPhysicalAddress( BlockStorageDevice** pBSD, UINT32 PhysicalAddress, ByteAddress &SectAddress) { *pBSD = NULL; return FALSE; } -BOOL BlockStorageStream::Initialize(UINT32 blockUsage) +__weak BOOL BlockStorageStream::Initialize(UINT32 blockUsage) { return FALSE; } -BOOL BlockStorageStream::Initialize(UINT32 usage, BlockStorageDevice* pDevice) +__weak BOOL BlockStorageStream::Initialize(UINT32 usage, BlockStorageDevice* pDevice) { return FALSE; } -UINT32 BlockStorageStream::CurrentAddress() +__weak UINT32 BlockStorageStream::CurrentAddress() { return 0xFFFFFFFF; } -BOOL BlockStorageStream::PrevStream() +__weak BOOL BlockStorageStream::PrevStream() { return FALSE; } -BOOL BlockStorageStream::NextStream() +__weak BOOL BlockStorageStream::NextStream() { return FALSE; } -BOOL BlockStorageStream::Seek( INT32 offset, SeekOrigin origin ) +__weak BOOL BlockStorageStream::Seek( INT32 offset, SeekOrigin origin ) { return TRUE; } -BOOL BlockStorageStream::Erase( UINT32 length ) +__weak BOOL BlockStorageStream::Erase( UINT32 length ) { return TRUE; } -BOOL BlockStorageStream::Write( UINT8* data , UINT32 length ) +__weak BOOL BlockStorageStream::Write( UINT8* data , UINT32 length ) { return TRUE; } -BOOL BlockStorageStream::ReadIntoBuffer( UINT8* pBuffer, UINT32 length ) +__weak BOOL BlockStorageStream::ReadIntoBuffer( UINT8* pBuffer, UINT32 length ) { return TRUE; } -BOOL BlockStorageStream::Read( UINT8** ppBuffer, UINT32 length ) +__weak BOOL BlockStorageStream::Read( UINT8** ppBuffer, UINT32 length ) { return TRUE; } @@ -109,22 +109,22 @@ BOOL BlockStorageStream::Read( UINT8** ppBuffer, UINT32 length ) //--// -SectorAddress BlockDeviceInfo::PhysicalToSectorAddress( const BlockRegionInfo* pRegion, ByteAddress phyAddress ) const +__weak SectorAddress BlockDeviceInfo::PhysicalToSectorAddress( const BlockRegionInfo* pRegion, ByteAddress phyAddress ) const { return phyAddress; } -BOOL BlockDeviceInfo::FindRegionFromAddress(ByteAddress Address, UINT32 &BlockRegionIndex, UINT32 &BlockRangeIndex ) const +__weak BOOL BlockDeviceInfo::FindRegionFromAddress(ByteAddress Address, UINT32 &BlockRegionIndex, UINT32 &BlockRangeIndex ) const { return FALSE; } -BOOL BlockDeviceInfo::FindNextUsageBlock(UINT32 BlockUsage, ByteAddress &Address, UINT32 &BlockRegionIndex, UINT32 &BlockRangeIndex ) const +__weak BOOL BlockDeviceInfo::FindNextUsageBlock(UINT32 BlockUsage, ByteAddress &Address, UINT32 &BlockRegionIndex, UINT32 &BlockRangeIndex ) const { return FALSE; } -BOOL BlockDeviceInfo::FindForBlockUsage(UINT32 BlockUsage, ByteAddress &Address, UINT32 &BlockRegionIndex, UINT32 &BlockRangeIndex ) const +__weak BOOL BlockDeviceInfo::FindForBlockUsage(UINT32 BlockUsage, ByteAddress &Address, UINT32 &BlockRegionIndex, UINT32 &BlockRangeIndex ) const { return FALSE; } From 432b0577faf15bf57ae8c2681bfbed85816f1415 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:39:05 +0000 Subject: [PATCH 058/144] Turn all function "weak" --- DeviceCode/pal/Buttons/stubs/buttons_stubs.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DeviceCode/pal/Buttons/stubs/buttons_stubs.cpp b/DeviceCode/pal/Buttons/stubs/buttons_stubs.cpp index 5e29f6bf2..9c2270fed 100644 --- a/DeviceCode/pal/Buttons/stubs/buttons_stubs.cpp +++ b/DeviceCode/pal/Buttons/stubs/buttons_stubs.cpp @@ -6,43 +6,43 @@ //--// -BOOL Buttons_Initialize() +__weak BOOL Buttons_Initialize() { NATIVE_PROFILE_PAL_BUTTONS(); return TRUE; } -BOOL Buttons_Uninitialize() +__weak BOOL Buttons_Uninitialize() { NATIVE_PROFILE_PAL_BUTTONS(); return TRUE; } -BOOL Buttons_RegisterStateChange( UINT32 ButtonsPressed, UINT32 ButtonsReleased ) +__weak BOOL Buttons_RegisterStateChange( UINT32 ButtonsPressed, UINT32 ButtonsReleased ) { NATIVE_PROFILE_PAL_BUTTONS(); return FALSE; } -BOOL Buttons_GetNextStateChange( UINT32& ButtonsPressed, UINT32& ButtonsReleased ) +__weak BOOL Buttons_GetNextStateChange( UINT32& ButtonsPressed, UINT32& ButtonsReleased ) { NATIVE_PROFILE_PAL_BUTTONS(); return FALSE; } -UINT32 Buttons_CurrentState() +__weak UINT32 Buttons_CurrentState() { NATIVE_PROFILE_PAL_BUTTONS(); return 0; } -UINT32 Buttons_HW_To_Hal_Button( UINT32 HW_Buttons ) +__weak UINT32 Buttons_HW_To_Hal_Button( UINT32 HW_Buttons ) { NATIVE_PROFILE_PAL_BUTTONS(); return 0; } -UINT32 Buttons_CurrentHWState() +__weak UINT32 Buttons_CurrentHWState() { NATIVE_PROFILE_PAL_BUTTONS(); return 0; From c60bfd8277047cae3b73f423eebcf1ba537c0f7a Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:41:11 +0000 Subject: [PATCH 059/144] Turn all function "weak" --- DeviceCode/pal/COM/Config/DebuggerPort_SSL_config_stub.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DeviceCode/pal/COM/Config/DebuggerPort_SSL_config_stub.cpp b/DeviceCode/pal/COM/Config/DebuggerPort_SSL_config_stub.cpp index 5b26a7a95..165ea4c24 100644 --- a/DeviceCode/pal/COM/Config/DebuggerPort_SSL_config_stub.cpp +++ b/DeviceCode/pal/COM/Config/DebuggerPort_SSL_config_stub.cpp @@ -1,20 +1,20 @@ #include #include -static BOOL DebuggerPort_SSL_GetCACert( UINT8** caCert, UINT32* certLen ) +__weak static BOOL DebuggerPort_SSL_GetCACert( UINT8** caCert, UINT32* certLen ) { *caCert = NULL; *certLen = 0; return FALSE; } -static BOOL DebuggerPort_SSL_GetTargetHost( LPCSTR* strTargetHost ) +__weak static BOOL DebuggerPort_SSL_GetTargetHost( LPCSTR* strTargetHost ) { *strTargetHost = NULL; return TRUE; } -static BOOL DebuggerPort_SSL_GetDeviceCert( UINT8** caCert, UINT32* certLen ) +__weak static BOOL DebuggerPort_SSL_GetDeviceCert( UINT8** caCert, UINT32* certLen ) { *caCert = NULL; *certLen = 0; From b3ce499a67547def558304e1b197664330e88ad9 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:41:47 +0000 Subject: [PATCH 060/144] Turn all function "weak" --- DeviceCode/pal/COM/i2c/stubs/i2c_stubs.cpp | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/DeviceCode/pal/COM/i2c/stubs/i2c_stubs.cpp b/DeviceCode/pal/COM/i2c/stubs/i2c_stubs.cpp index 193d9c3cc..c4340f324 100644 --- a/DeviceCode/pal/COM/i2c/stubs/i2c_stubs.cpp +++ b/DeviceCode/pal/COM/i2c/stubs/i2c_stubs.cpp @@ -15,70 +15,70 @@ #include //--// -BOOL I2C_Initialize() +__weak BOOL I2C_Initialize() { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL I2C_Uninitialize() +__weak BOOL I2C_Uninitialize() { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL I2C_Enqueue( I2C_HAL_XACTION* xAction ) +__weak BOOL I2C_Enqueue( I2C_HAL_XACTION* xAction ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -void I2C_Cancel( I2C_HAL_XACTION* xAction, bool signal ) +__weak void I2C_Cancel( I2C_HAL_XACTION* xAction, bool signal ) { NATIVE_PROFILE_PAL_COM(); } -void I2C_InitializeTransaction( I2C_HAL_XACTION* xAction, I2C_USER_CONFIGURATION& config, I2C_HAL_XACTION_UNIT** xActions, size_t numXActions ) +__weak void I2C_InitializeTransaction( I2C_HAL_XACTION* xAction, I2C_USER_CONFIGURATION& config, I2C_HAL_XACTION_UNIT** xActions, size_t numXActions ) { NATIVE_PROFILE_PAL_COM(); } -void I2C_InitializeTransactionUnit( I2C_HAL_XACTION_UNIT* xActionUnit, I2C_WORD* src, I2C_WORD* dst, size_t size, BOOL fRead ) +__weak void I2C_InitializeTransactionUnit( I2C_HAL_XACTION_UNIT* xActionUnit, I2C_WORD* src, I2C_WORD* dst, size_t size, BOOL fRead ) { NATIVE_PROFILE_PAL_COM(); } //--// -void I2C_XAction_SetState( I2C_HAL_XACTION* xAction, UINT8 state ) +__weak void I2C_XAction_SetState( I2C_HAL_XACTION* xAction, UINT8 state ) { NATIVE_PROFILE_PAL_COM(); } -UINT8 I2C_XAction_GetState( I2C_HAL_XACTION* xAction ) +__weak UINT8 I2C_XAction_GetState( I2C_HAL_XACTION* xAction ) { NATIVE_PROFILE_PAL_COM(); return 0; } -BOOL I2C_XAction_CheckState( I2C_HAL_XACTION* xAction, UINT8 state ) +__weak BOOL I2C_XAction_CheckState( I2C_HAL_XACTION* xAction, UINT8 state ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -size_t I2C_XAction_TransactedBytes( I2C_HAL_XACTION* xAction ) +__weak size_t I2C_XAction_TransactedBytes( I2C_HAL_XACTION* xAction ) { NATIVE_PROFILE_PAL_COM(); return 0; } -void I2C_XActionUnit_CopyBuffer( I2C_HAL_XACTION_UNIT* xActionUnit, I2C_WORD* data, size_t length ) +__weak void I2C_XActionUnit_CopyBuffer( I2C_HAL_XACTION_UNIT* xActionUnit, I2C_WORD* data, size_t length ) { NATIVE_PROFILE_PAL_COM(); } -BOOL I2C_XActionUnit_IsRead( I2C_HAL_XACTION_UNIT* xActionUnit ) +__weak BOOL I2C_XActionUnit_IsRead( I2C_HAL_XACTION_UNIT* xActionUnit ) { NATIVE_PROFILE_PAL_COM(); return FALSE; From 7805bc5b793ed776e6931f194c38208a449be3ed Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:46:01 +0000 Subject: [PATCH 061/144] Turn all function "weak" --- .../COM/sockets/Ssl/stubs/ssl_pal_stubs.cpp | 34 ++++---- .../openssl/stubs/openssl_pal_stubs.cpp | 34 ++++---- .../pal/COM/sockets/stubs/sockets_stubs.cpp | 78 +++++++++---------- 3 files changed, 73 insertions(+), 73 deletions(-) diff --git a/DeviceCode/pal/COM/sockets/Ssl/stubs/ssl_pal_stubs.cpp b/DeviceCode/pal/COM/sockets/Ssl/stubs/ssl_pal_stubs.cpp index b38541270..672bb53f6 100644 --- a/DeviceCode/pal/COM/sockets/Ssl/stubs/ssl_pal_stubs.cpp +++ b/DeviceCode/pal/COM/sockets/Ssl/stubs/ssl_pal_stubs.cpp @@ -8,98 +8,98 @@ extern "C" { -void ssl_rand_seed(const void *seed, int length) +__weak void ssl_rand_seed(const void *seed, int length) { } } -BOOL SSL_Initialize() +__weak BOOL SSL_Initialize() { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL SSL_Uninitialize() +__weak BOOL SSL_Uninitialize() { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SSL_ServerInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) +__weak BOOL SSL_ServerInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SSL_ClientInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) +__weak BOOL SSL_ClientInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SSL_AddCertificateAuthority( int sslContextHandle, const char* certificate, int cert_len, const char* szCertPwd ) +__weak BOOL SSL_AddCertificateAuthority( int sslContextHandle, const char* certificate, int cert_len, const char* szCertPwd ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -void SSL_ClearCertificateAuthority( int sslContextHandle ) +__weak void SSL_ClearCertificateAuthority( int sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); } -BOOL SSL_ExitContext( INT32 sslContextHandle ) +__weak BOOL SSL_ExitContext( INT32 sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -INT32 SSL_Accept( SOCK_SOCKET socket, INT32 sslContextHandle ) +__weak INT32 SSL_Accept( SOCK_SOCKET socket, INT32 sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_Connect( SOCK_SOCKET socket, const char* szTargetHost, INT32 sslContextHandle ) +__weak INT32 SSL_Connect( SOCK_SOCKET socket, const char* szTargetHost, INT32 sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_Write( SOCK_SOCKET socket, const char* Data, size_t size ) +__weak INT32 SSL_Write( SOCK_SOCKET socket, const char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_Read( SOCK_SOCKET socket, char* Data, size_t size ) +__weak INT32 SSL_Read( SOCK_SOCKET socket, char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_CloseSocket( SOCK_SOCKET socket ) +__weak INT32 SSL_CloseSocket( SOCK_SOCKET socket ) { NATIVE_PROFILE_PAL_COM(); return 0; } -void SSL_GetTime(DATE_TIME_INFO* pdt) +__weak void SSL_GetTime(DATE_TIME_INFO* pdt) { NATIVE_PROFILE_PAL_COM(); } -void SSL_RegisterTimeCallback(SSL_DATE_TIME_FUNC pfn) +__weak void SSL_RegisterTimeCallback(SSL_DATE_TIME_FUNC pfn) { NATIVE_PROFILE_PAL_COM(); } -BOOL SSL_ParseCertificate( const char* certificate, size_t cert_length, const char* szPwd, X509CertData* certData ) +__weak BOOL SSL_ParseCertificate( const char* certificate, size_t cert_length, const char* szPwd, X509CertData* certData ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -INT32 SSL_DataAvailable( SOCK_SOCKET socket ) +__weak INT32 SSL_DataAvailable( SOCK_SOCKET socket ) { NATIVE_PROFILE_PAL_COM(); return 0; diff --git a/DeviceCode/pal/COM/sockets/openssl/stubs/openssl_pal_stubs.cpp b/DeviceCode/pal/COM/sockets/openssl/stubs/openssl_pal_stubs.cpp index b38541270..672bb53f6 100644 --- a/DeviceCode/pal/COM/sockets/openssl/stubs/openssl_pal_stubs.cpp +++ b/DeviceCode/pal/COM/sockets/openssl/stubs/openssl_pal_stubs.cpp @@ -8,98 +8,98 @@ extern "C" { -void ssl_rand_seed(const void *seed, int length) +__weak void ssl_rand_seed(const void *seed, int length) { } } -BOOL SSL_Initialize() +__weak BOOL SSL_Initialize() { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL SSL_Uninitialize() +__weak BOOL SSL_Uninitialize() { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SSL_ServerInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) +__weak BOOL SSL_ServerInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SSL_ClientInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) +__weak BOOL SSL_ClientInit( INT32 sslMode, INT32 sslVerify, const char* certificate, INT32 cert_len, const char* szCertPwd, INT32& sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SSL_AddCertificateAuthority( int sslContextHandle, const char* certificate, int cert_len, const char* szCertPwd ) +__weak BOOL SSL_AddCertificateAuthority( int sslContextHandle, const char* certificate, int cert_len, const char* szCertPwd ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -void SSL_ClearCertificateAuthority( int sslContextHandle ) +__weak void SSL_ClearCertificateAuthority( int sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); } -BOOL SSL_ExitContext( INT32 sslContextHandle ) +__weak BOOL SSL_ExitContext( INT32 sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -INT32 SSL_Accept( SOCK_SOCKET socket, INT32 sslContextHandle ) +__weak INT32 SSL_Accept( SOCK_SOCKET socket, INT32 sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_Connect( SOCK_SOCKET socket, const char* szTargetHost, INT32 sslContextHandle ) +__weak INT32 SSL_Connect( SOCK_SOCKET socket, const char* szTargetHost, INT32 sslContextHandle ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_Write( SOCK_SOCKET socket, const char* Data, size_t size ) +__weak INT32 SSL_Write( SOCK_SOCKET socket, const char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_Read( SOCK_SOCKET socket, char* Data, size_t size ) +__weak INT32 SSL_Read( SOCK_SOCKET socket, char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -INT32 SSL_CloseSocket( SOCK_SOCKET socket ) +__weak INT32 SSL_CloseSocket( SOCK_SOCKET socket ) { NATIVE_PROFILE_PAL_COM(); return 0; } -void SSL_GetTime(DATE_TIME_INFO* pdt) +__weak void SSL_GetTime(DATE_TIME_INFO* pdt) { NATIVE_PROFILE_PAL_COM(); } -void SSL_RegisterTimeCallback(SSL_DATE_TIME_FUNC pfn) +__weak void SSL_RegisterTimeCallback(SSL_DATE_TIME_FUNC pfn) { NATIVE_PROFILE_PAL_COM(); } -BOOL SSL_ParseCertificate( const char* certificate, size_t cert_length, const char* szPwd, X509CertData* certData ) +__weak BOOL SSL_ParseCertificate( const char* certificate, size_t cert_length, const char* szPwd, X509CertData* certData ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -INT32 SSL_DataAvailable( SOCK_SOCKET socket ) +__weak INT32 SSL_DataAvailable( SOCK_SOCKET socket ) { NATIVE_PROFILE_PAL_COM(); return 0; diff --git a/DeviceCode/pal/COM/sockets/stubs/sockets_stubs.cpp b/DeviceCode/pal/COM/sockets/stubs/sockets_stubs.cpp index 016d72a4b..e7a570021 100644 --- a/DeviceCode/pal/COM/sockets/stubs/sockets_stubs.cpp +++ b/DeviceCode/pal/COM/sockets/stubs/sockets_stubs.cpp @@ -12,235 +12,235 @@ volatile int errno; int errno; #endif -BOOL Network_Initialize() +__weak BOOL Network_Initialize() { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL Network_Uninitialize() +__weak BOOL Network_Uninitialize() { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SOCKETS_Initialize( int ComPortNum ) +__weak BOOL SOCKETS_Initialize( int ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SOCKETS_Uninitialize( int ComPortNum ) +__weak BOOL SOCKETS_Uninitialize( int ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -int SOCKETS_Write( int ComPortNum, const char* Data, size_t size ) +__weak int SOCKETS_Write( int ComPortNum, const char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -int SOCKETS_Read( int ComPortNum, char* Data, size_t size ) +__weak int SOCKETS_Read( int ComPortNum, char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -BOOL SOCKETS_Flush( int ComPortNum ) +__weak BOOL SOCKETS_Flush( int ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -void SOCKETS_CloseConnections() +__weak void SOCKETS_CloseConnections() { NATIVE_PROFILE_PAL_COM(); } -BOOL SOCKETS_UpgradeToSsl( INT32 ComPortNum, const UINT8* pCACert, UINT32 caCertLen, const UINT8* pDeviceCert, UINT32 deviceCertLen, LPCSTR szTargetHost ) +__weak BOOL SOCKETS_UpgradeToSsl( INT32 ComPortNum, const UINT8* pCACert, UINT32 caCertLen, const UINT8* pDeviceCert, UINT32 deviceCertLen, LPCSTR szTargetHost ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL SOCKETS_IsUsingSsl( INT32 ComPortNum ) +__weak BOOL SOCKETS_IsUsingSsl( INT32 ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL SOCKETS_ProcessSocketActivity(SOCK_SOCKET signalSocket) +__weak BOOL SOCKETS_ProcessSocketActivity(SOCK_SOCKET signalSocket) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -UINT32 SOCK_CONFIGURATION_GetAdapterCount() +__weak UINT32 SOCK_CONFIGURATION_GetAdapterCount() { NATIVE_PROFILE_PAL_COM(); return 0; } -HRESULT SOCK_CONFIGURATION_LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) +__weak HRESULT SOCK_CONFIGURATION_LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_UpdateAdapterConfiguration( UINT32 interfaceIndex, UINT32 updateFlags, SOCK_NetworkConfiguration* config ) +__weak HRESULT SOCK_CONFIGURATION_UpdateAdapterConfiguration( UINT32 interfaceIndex, UINT32 updateFlags, SOCK_NetworkConfiguration* config ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_LoadConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) +__weak HRESULT SOCK_CONFIGURATION_LoadConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_UpdateWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT SOCK_CONFIGURATION_UpdateWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_SaveAllWirelessConfigurations( ) +__weak HRESULT SOCK_CONFIGURATION_SaveAllWirelessConfigurations( ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT HAL_SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT HAL_SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -int SOCK_socket( int family, int type, int protocol ) +__weak int SOCK_socket( int family, int type, int protocol ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_bind( int socket, const struct SOCK_sockaddr* address, int addressLen ) +__weak int SOCK_bind( int socket, const struct SOCK_sockaddr* address, int addressLen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_connect(int socket, const struct SOCK_sockaddr* address, int addressLen) +__weak int SOCK_connect(int socket, const struct SOCK_sockaddr* address, int addressLen) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_send(int socket, const char* buf, int len, int flags) +__weak int SOCK_send(int socket, const char* buf, int len, int flags) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_recv(int socket, char* buf, int len, int timeout) +__weak int SOCK_recv(int socket, char* buf, int len, int timeout) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_close(int socket) +__weak int SOCK_close(int socket) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_listen( int socket, int backlog ) +__weak int SOCK_listen( int socket, int backlog ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_accept( int socket, struct SOCK_sockaddr* address, int* addressLen ) +__weak int SOCK_accept( int socket, struct SOCK_sockaddr* address, int* addressLen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_shutdown( int socket, int how ) +__weak int SOCK_shutdown( int socket, int how ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getaddrinfo( const char* nodename, char* servname, const struct SOCK_addrinfo* hints, struct SOCK_addrinfo** res ) +__weak int SOCK_getaddrinfo( const char* nodename, char* servname, const struct SOCK_addrinfo* hints, struct SOCK_addrinfo** res ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -void SOCK_freeaddrinfo( struct SOCK_addrinfo* ai ) +__weak void SOCK_freeaddrinfo( struct SOCK_addrinfo* ai ) { NATIVE_PROFILE_PAL_COM(); } -int SOCK_ioctl( int socket, int cmd, int* data ) +__weak int SOCK_ioctl( int socket, int cmd, int* data ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getlasterror() +__weak int SOCK_getlasterror() { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_select( int socket, SOCK_fd_set* readfds, SOCK_fd_set* writefds, SOCK_fd_set* except, const struct SOCK_timeval* timeout ) +__weak int SOCK_select( int socket, SOCK_fd_set* readfds, SOCK_fd_set* writefds, SOCK_fd_set* except, const struct SOCK_timeval* timeout ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_setsockopt( int socket, int level, int optname, const char* optval, int optlen ) +__weak int SOCK_setsockopt( int socket, int level, int optname, const char* optval, int optlen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getsockopt( int socket, int level, int optname, char* optval, int* optlen ) +__weak int SOCK_getsockopt( int socket, int level, int optname, char* optval, int* optlen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getpeername( int socket, struct SOCK_sockaddr* name, int* namelen ) +__weak int SOCK_getpeername( int socket, struct SOCK_sockaddr* name, int* namelen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getsockname( int socket, struct SOCK_sockaddr* name, int* namelen ) +__weak int SOCK_getsockname( int socket, struct SOCK_sockaddr* name, int* namelen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_recvfrom( int s, char* buf, int len, int flags, struct SOCK_sockaddr* from, int* fromlen ) +__weak int SOCK_recvfrom( int s, char* buf, int len, int flags, struct SOCK_sockaddr* from, int* fromlen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_sendto( int s, const char* buf, int len, int flags, const struct SOCK_sockaddr* to, int tolen ) +__weak int SOCK_sendto( int s, const char* buf, int len, int flags, const struct SOCK_sockaddr* to, int tolen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; From 08de75a610a3e14deb202a26a15651623ab4193c Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:51:17 +0000 Subject: [PATCH 062/144] Turn all function "weak" --- .../stubs/sockets_stubs_lwip.cpp | 78 +++++++++---------- .../pal/COM/stubs/ComDirector_stubs.cpp | 22 +++--- .../pal/COM/usart/stubs/usart_stubs.cpp | 32 ++++---- DeviceCode/pal/COM/usb/stubs/usb_stubs.cpp | 30 +++---- .../pal/COM/usb_cmsis/stubs/usb_stubs.cpp | 30 +++---- 5 files changed, 96 insertions(+), 96 deletions(-) diff --git a/DeviceCode/pal/COM/sockets_lwip_os/stubs/sockets_stubs_lwip.cpp b/DeviceCode/pal/COM/sockets_lwip_os/stubs/sockets_stubs_lwip.cpp index 864f6499a..f0dd7d645 100644 --- a/DeviceCode/pal/COM/sockets_lwip_os/stubs/sockets_stubs_lwip.cpp +++ b/DeviceCode/pal/COM/sockets_lwip_os/stubs/sockets_stubs_lwip.cpp @@ -6,235 +6,235 @@ //--// -BOOL Network_Initialize() +__weak BOOL Network_Initialize() { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL Network_Uninitialize() +__weak BOOL Network_Uninitialize() { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SOCKETS_Initialize( int ComPortNum ) +__weak BOOL SOCKETS_Initialize( int ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -BOOL SOCKETS_Uninitialize( int ComPortNum ) +__weak BOOL SOCKETS_Uninitialize( int ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -int SOCKETS_Write( int ComPortNum, const char* Data, size_t size ) +__weak int SOCKETS_Write( int ComPortNum, const char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -int SOCKETS_Read( int ComPortNum, char* Data, size_t size ) +__weak int SOCKETS_Read( int ComPortNum, char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -BOOL SOCKETS_Flush( int ComPortNum ) +__weak BOOL SOCKETS_Flush( int ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -void SOCKETS_CloseConnections() +__weak void SOCKETS_CloseConnections() { NATIVE_PROFILE_PAL_COM(); } -BOOL SOCKETS_UpgradeToSsl( INT32 ComPortNum, const UINT8* pCACert, UINT32 caCertLen, const UINT8* pDeviceCert, UINT32 deviceCertLen, LPCSTR szTargetHost ) +__weak BOOL SOCKETS_UpgradeToSsl( INT32 ComPortNum, const UINT8* pCACert, UINT32 caCertLen, const UINT8* pDeviceCert, UINT32 deviceCertLen, LPCSTR szTargetHost ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL SOCKETS_IsUsingSsl( INT32 ComPortNum ) +__weak BOOL SOCKETS_IsUsingSsl( INT32 ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL SOCKETS_ProcessSocketActivity(SOCK_SOCKET signalSocket) +__weak BOOL SOCKETS_ProcessSocketActivity(SOCK_SOCKET signalSocket) { NATIVE_PROFILE_PAL_COM(); return TRUE; } -UINT32 SOCK_CONFIGURATION_GetAdapterCount() +__weak UINT32 SOCK_CONFIGURATION_GetAdapterCount() { NATIVE_PROFILE_PAL_COM(); return 0; } -HRESULT SOCK_CONFIGURATION_LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) +__weak HRESULT SOCK_CONFIGURATION_LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_UpdateAdapterConfiguration( UINT32 interfaceIndex, UINT32 updateFlags, SOCK_NetworkConfiguration* config ) +__weak HRESULT SOCK_CONFIGURATION_UpdateAdapterConfiguration( UINT32 interfaceIndex, UINT32 updateFlags, SOCK_NetworkConfiguration* config ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_LoadConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) +__weak HRESULT SOCK_CONFIGURATION_LoadConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_UpdateWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT SOCK_CONFIGURATION_UpdateWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT SOCK_CONFIGURATION_SaveAllWirelessConfigurations( ) +__weak HRESULT SOCK_CONFIGURATION_SaveAllWirelessConfigurations( ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -HRESULT HAL_SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT HAL_SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { NATIVE_PROFILE_PAL_COM(); return CLR_E_FAIL; } -int SOCK_socket( int family, int type, int protocol ) +__weak int SOCK_socket( int family, int type, int protocol ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_bind( int socket, const struct SOCK_sockaddr* address, int addressLen ) +__weak int SOCK_bind( int socket, const struct SOCK_sockaddr* address, int addressLen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_connect(int socket, const struct SOCK_sockaddr* address, int addressLen) +__weak int SOCK_connect(int socket, const struct SOCK_sockaddr* address, int addressLen) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_send(int socket, const char* buf, int len, int flags) +__weak int SOCK_send(int socket, const char* buf, int len, int flags) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_recv(int socket, char* buf, int len, int timeout) +__weak int SOCK_recv(int socket, char* buf, int len, int timeout) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_close(int socket) +__weak int SOCK_close(int socket) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_listen( int socket, int backlog ) +__weak int SOCK_listen( int socket, int backlog ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_accept( int socket, struct SOCK_sockaddr* address, int* addressLen ) +__weak int SOCK_accept( int socket, struct SOCK_sockaddr* address, int* addressLen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_shutdown( int socket, int how ) +__weak int SOCK_shutdown( int socket, int how ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getaddrinfo( const char* nodename, char* servname, const struct SOCK_addrinfo* hints, struct SOCK_addrinfo** res ) +__weak int SOCK_getaddrinfo( const char* nodename, char* servname, const struct SOCK_addrinfo* hints, struct SOCK_addrinfo** res ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -void SOCK_freeaddrinfo( struct SOCK_addrinfo* ai ) +__weak void SOCK_freeaddrinfo( struct SOCK_addrinfo* ai ) { NATIVE_PROFILE_PAL_COM(); } -int SOCK_ioctl( int socket, int cmd, int* data ) +__weak int SOCK_ioctl( int socket, int cmd, int* data ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getlasterror() +__weak int SOCK_getlasterror() { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_select( int socket, SOCK_fd_set* readfds, SOCK_fd_set* writefds, SOCK_fd_set* except, const struct SOCK_timeval* timeout ) +__weak int SOCK_select( int socket, SOCK_fd_set* readfds, SOCK_fd_set* writefds, SOCK_fd_set* except, const struct SOCK_timeval* timeout ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_setsockopt( int socket, int level, int optname, const char* optval, int optlen ) +__weak int SOCK_setsockopt( int socket, int level, int optname, const char* optval, int optlen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getsockopt( int socket, int level, int optname, char* optval, int* optlen ) +__weak int SOCK_getsockopt( int socket, int level, int optname, char* optval, int* optlen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getpeername( int socket, struct SOCK_sockaddr* name, int* namelen ) +__weak int SOCK_getpeername( int socket, struct SOCK_sockaddr* name, int* namelen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_getsockname( int socket, struct SOCK_sockaddr* name, int* namelen ) +__weak int SOCK_getsockname( int socket, struct SOCK_sockaddr* name, int* namelen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_recvfrom( int s, char* buf, int len, int flags, struct SOCK_sockaddr* from, int* fromlen ) +__weak int SOCK_recvfrom( int s, char* buf, int len, int flags, struct SOCK_sockaddr* from, int* fromlen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; } -int SOCK_sendto( int s, const char* buf, int len, int flags, const struct SOCK_sockaddr* to, int tolen ) +__weak int SOCK_sendto( int s, const char* buf, int len, int flags, const struct SOCK_sockaddr* to, int tolen ) { NATIVE_PROFILE_PAL_COM(); return SOCK_SOCKET_ERROR; diff --git a/DeviceCode/pal/COM/stubs/ComDirector_stubs.cpp b/DeviceCode/pal/COM/stubs/ComDirector_stubs.cpp index 53166f175..a34232837 100644 --- a/DeviceCode/pal/COM/stubs/ComDirector_stubs.cpp +++ b/DeviceCode/pal/COM/stubs/ComDirector_stubs.cpp @@ -6,51 +6,51 @@ ////////////////////////////////////////////////////////////////////////////////// -BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) +__weak BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return true; } -BOOL DebuggerPort_Uninitialize( COM_HANDLE ComPortNum ) +__weak BOOL DebuggerPort_Uninitialize( COM_HANDLE ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return true; } -int DebuggerPort_Write( COM_HANDLE ComPortNum, const char* Data, size_t size, int maxRetries ) +__weak int DebuggerPort_Write( COM_HANDLE ComPortNum, const char* Data, size_t size, int maxRetries ) { NATIVE_PROFILE_PAL_COM(); return 0; } -int DebuggerPort_Read( COM_HANDLE ComPortNum, char* Data, size_t size ) +__weak int DebuggerPort_Read( COM_HANDLE ComPortNum, char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); return 0; } -BOOL DebuggerPort_Flush( COM_HANDLE ComPortNum ) +__weak BOOL DebuggerPort_Flush( COM_HANDLE ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return true; } -BOOL DebuggerPort_IsSslSupported( COM_HANDLE ComPortNum ) +__weak BOOL DebuggerPort_IsSslSupported( COM_HANDLE ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL DebuggerPort_UpgradeToSsl( COM_HANDLE ComPortNum, UINT32 flags ) +__weak BOOL DebuggerPort_UpgradeToSsl( COM_HANDLE ComPortNum, UINT32 flags ) { NATIVE_PROFILE_PAL_COM(); return FALSE; } -BOOL DebuggerPort_IsUsingSsl( COM_HANDLE ComPortNum ) +__weak BOOL DebuggerPort_IsUsingSsl( COM_HANDLE ComPortNum ) { NATIVE_PROFILE_PAL_COM(); return FALSE; @@ -58,18 +58,18 @@ BOOL DebuggerPort_IsUsingSsl( COM_HANDLE ComPortNum ) ////////////////////////////////////////////////////////////////////////////////// -void CPU_InitializeCommunication() +__weak void CPU_InitializeCommunication() { NATIVE_PROFILE_PAL_COM(); } -void CPU_UninitializeCommunication() +__weak void CPU_UninitializeCommunication() { NATIVE_PROFILE_PAL_COM(); } -void CPU_ProtectCommunicationGPIOs( BOOL On ) +__weak void CPU_ProtectCommunicationGPIOs( BOOL On ) { NATIVE_PROFILE_PAL_COM(); } diff --git a/DeviceCode/pal/COM/usart/stubs/usart_stubs.cpp b/DeviceCode/pal/COM/usart/stubs/usart_stubs.cpp index b024ffef4..4505800ec 100644 --- a/DeviceCode/pal/COM/usart/stubs/usart_stubs.cpp +++ b/DeviceCode/pal/COM/usart/stubs/usart_stubs.cpp @@ -7,77 +7,77 @@ //--// -BOOL USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) +__weak BOOL USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) { return TRUE; } -BOOL USART_Uninitialize( int ComPortNum ) +__weak BOOL USART_Uninitialize( int ComPortNum ) { return TRUE; } -int USART_Write( int ComPortNum, const char* Data, size_t size ) +__weak int USART_Write( int ComPortNum, const char* Data, size_t size ) { return 0; } -int USART_Read( int ComPortNum, char* Data, size_t size ) +__weak int USART_Read( int ComPortNum, char* Data, size_t size ) { return 0; } -BOOL USART_Flush( int ComPortNum ) +__weak BOOL USART_Flush( int ComPortNum ) { return TRUE; } -BOOL USART_AddCharToRxBuffer( int ComPortNum, char c ) +__weak BOOL USART_AddCharToRxBuffer( int ComPortNum, char c ) { return TRUE; } -BOOL USART_RemoveCharFromTxBuffer( int ComPortNum, char& c ) +__weak BOOL USART_RemoveCharFromTxBuffer( int ComPortNum, char& c ) { return TRUE; } -INT8 USART_PowerSave( int ComPortNum, INT8 Enable ) +__weak INT8 USART_PowerSave( int ComPortNum, INT8 Enable ) { return 0; } -void USART_PrepareForClockStop() +__weak void USART_PrepareForClockStop() { } -void USART_ClockStopFinished() +__weak void USART_ClockStopFinished() { } -void USART_ForceXON(int ComPortNum) +__weak void USART_ForceXON(int ComPortNum) { } -void USART_CloseAllPorts() +__weak void USART_CloseAllPorts() { } -int USART_BytesInBuffer( int ComPortNum, BOOL fRx ) +__weak int USART_BytesInBuffer( int ComPortNum, BOOL fRx ) { return 0; } -void USART_DiscardBuffer( int ComPortNum, BOOL fRx ) +__weak void USART_DiscardBuffer( int ComPortNum, BOOL fRx ) { } -BOOL USART_ConnectEventSink( int ComPortNum, int EventType, void* pContext, PFNUsartEvent pfnUsartEvtHandler, void** ppArg ) +__weak BOOL USART_ConnectEventSink( int ComPortNum, int EventType, void* pContext, PFNUsartEvent pfnUsartEvtHandler, void** ppArg ) { return TRUE; } -void USART_SetEvent( int ComPortNum, unsigned int event ) +__weak void USART_SetEvent( int ComPortNum, unsigned int event ) { } diff --git a/DeviceCode/pal/COM/usb/stubs/usb_stubs.cpp b/DeviceCode/pal/COM/usb/stubs/usb_stubs.cpp index 7cd937e1c..2dfa61666 100644 --- a/DeviceCode/pal/COM/usb/stubs/usb_stubs.cpp +++ b/DeviceCode/pal/COM/usb/stubs/usb_stubs.cpp @@ -7,77 +7,77 @@ //--// -int USB_GetControllerCount() +__weak int USB_GetControllerCount() { return 0; } -BOOL USB_Initialize( int Controller ) +__weak BOOL USB_Initialize( int Controller ) { return TRUE; } -int USB_Configure( int Controller, const USB_DYNAMIC_CONFIGURATION *config ) +__weak int USB_Configure( int Controller, const USB_DYNAMIC_CONFIGURATION *config ) { return 0; } -const USB_DYNAMIC_CONFIGURATION * USB_GetConfiguration( int Controller ) +__weak const USB_DYNAMIC_CONFIGURATION * USB_GetConfiguration( int Controller ) { return NULL; } -BOOL USB_Uninitialize( int Controller ) +__weak BOOL USB_Uninitialize( int Controller ) { return TRUE; } -BOOL USB_OpenStream( int UsbStream, int writeEP, int readEP ) +__weak BOOL USB_OpenStream( int UsbStream, int writeEP, int readEP ) { return TRUE; } -BOOL USB_CloseStream( int UsbStream ) +__weak BOOL USB_CloseStream( int UsbStream ) { return TRUE; } -int USB_Write( int UsbStream, const char* Data, size_t size ) +__weak int USB_Write( int UsbStream, const char* Data, size_t size ) { return 0; } -int USB_Read( int UsbStream, char* Data, size_t size ) +__weak int USB_Read( int UsbStream, char* Data, size_t size ) { return 0; } -BOOL USB_Flush( int UsbStream ) +__weak BOOL USB_Flush( int UsbStream ) { return TRUE; } -UINT32 USB_GetEvent( int Controller, UINT32 Mask ) +__weak UINT32 USB_GetEvent( int Controller, UINT32 Mask ) { return 0; } -UINT32 USB_SetEvent( int Controller, UINT32 Event ) +__weak UINT32 USB_SetEvent( int Controller, UINT32 Event ) { return 0; } -UINT32 USB_ClearEvent( int Controller, UINT32 Event ) +__weak UINT32 USB_ClearEvent( int Controller, UINT32 Event ) { return 0; } -UINT8 USB_GetStatus( int Controller ) +__weak UINT8 USB_GetStatus( int Controller ) { return USB_DEVICE_STATE_NO_CONTROLLER; } -void USB_DiscardData( int UsbStream, BOOL fTx ) +__weak void USB_DiscardData( int UsbStream, BOOL fTx ) { } diff --git a/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp b/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp index 7cd937e1c..2dfa61666 100644 --- a/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp +++ b/DeviceCode/pal/COM/usb_cmsis/stubs/usb_stubs.cpp @@ -7,77 +7,77 @@ //--// -int USB_GetControllerCount() +__weak int USB_GetControllerCount() { return 0; } -BOOL USB_Initialize( int Controller ) +__weak BOOL USB_Initialize( int Controller ) { return TRUE; } -int USB_Configure( int Controller, const USB_DYNAMIC_CONFIGURATION *config ) +__weak int USB_Configure( int Controller, const USB_DYNAMIC_CONFIGURATION *config ) { return 0; } -const USB_DYNAMIC_CONFIGURATION * USB_GetConfiguration( int Controller ) +__weak const USB_DYNAMIC_CONFIGURATION * USB_GetConfiguration( int Controller ) { return NULL; } -BOOL USB_Uninitialize( int Controller ) +__weak BOOL USB_Uninitialize( int Controller ) { return TRUE; } -BOOL USB_OpenStream( int UsbStream, int writeEP, int readEP ) +__weak BOOL USB_OpenStream( int UsbStream, int writeEP, int readEP ) { return TRUE; } -BOOL USB_CloseStream( int UsbStream ) +__weak BOOL USB_CloseStream( int UsbStream ) { return TRUE; } -int USB_Write( int UsbStream, const char* Data, size_t size ) +__weak int USB_Write( int UsbStream, const char* Data, size_t size ) { return 0; } -int USB_Read( int UsbStream, char* Data, size_t size ) +__weak int USB_Read( int UsbStream, char* Data, size_t size ) { return 0; } -BOOL USB_Flush( int UsbStream ) +__weak BOOL USB_Flush( int UsbStream ) { return TRUE; } -UINT32 USB_GetEvent( int Controller, UINT32 Mask ) +__weak UINT32 USB_GetEvent( int Controller, UINT32 Mask ) { return 0; } -UINT32 USB_SetEvent( int Controller, UINT32 Event ) +__weak UINT32 USB_SetEvent( int Controller, UINT32 Event ) { return 0; } -UINT32 USB_ClearEvent( int Controller, UINT32 Event ) +__weak UINT32 USB_ClearEvent( int Controller, UINT32 Event ) { return 0; } -UINT8 USB_GetStatus( int Controller ) +__weak UINT8 USB_GetStatus( int Controller ) { return USB_DEVICE_STATE_NO_CONTROLLER; } -void USB_DiscardData( int UsbStream, BOOL fTx ) +__weak void USB_DiscardData( int UsbStream, BOOL fTx ) { } From 823566601c03e074b3726bed3b7cadbd8d8cd0f9 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Mon, 21 Mar 2016 17:59:58 +0000 Subject: [PATCH 063/144] Turn all function "weak" --- .../stubs/native_profiler_stubs.cpp | 16 +++--- .../pal/Gesture/stubs/gesture_stubs.cpp | 6 +- DeviceCode/pal/Ink/stubs/ink_stubs.cpp | 8 +-- .../pal/MFUpdate/stubs/MFUpdate_stub.cpp | 26 ++++----- .../stubs/ConfigHelper_stubs.cpp | 28 +++++----- DeviceCode/pal/events/stubs/events_stubs.cpp | 24 ++++---- .../pal/fs/stubs/Config/FS_config_stubs.cpp | 4 +- DeviceCode/pal/fs/stubs/fs_stubs.cpp | 28 +++++----- .../pal/graphics/stubs/graphics_stubs.cpp | 26 ++++----- DeviceCode/pal/heap/stubs/heap_stubs.cpp | 2 +- DeviceCode/pal/io/stubs/GPIO_Output_Stubs.cpp | 16 +++--- .../stubs/SocketsDriver_stubs.cpp | 56 +++++++++---------- 12 files changed, 120 insertions(+), 120 deletions(-) diff --git a/DeviceCode/pal/Diagnostics/stubs/native_profiler_stubs.cpp b/DeviceCode/pal/Diagnostics/stubs/native_profiler_stubs.cpp index bfc66847d..0696e6382 100644 --- a/DeviceCode/pal/Diagnostics/stubs/native_profiler_stubs.cpp +++ b/DeviceCode/pal/Diagnostics/stubs/native_profiler_stubs.cpp @@ -15,41 +15,41 @@ #include "..\Native_Profiler.h" -Native_Profiler::Native_Profiler() +__weak Native_Profiler::Native_Profiler() { } -Native_Profiler::~Native_Profiler() +__weak Native_Profiler::~Native_Profiler() { } -void Native_Profiler_Init() +__weak void Native_Profiler_Init() { } -void Native_Profiler_Dump() +__weak void Native_Profiler_Dump() { } -void Native_Profiler_WriteToCOM(void *buffer, UINT32 size) +__weak void Native_Profiler_WriteToCOM(void *buffer, UINT32 size) { } -UINT64 Native_Profiler_TimeInMicroseconds() +__weak UINT64 Native_Profiler_TimeInMicroseconds() { return 0; } -void Native_Profiler_Start() +__weak void Native_Profiler_Start() { } -void Native_Profiler_Stop() +__weak void Native_Profiler_Stop() { } diff --git a/DeviceCode/pal/Gesture/stubs/gesture_stubs.cpp b/DeviceCode/pal/Gesture/stubs/gesture_stubs.cpp index 29b97bd09..cccf71318 100644 --- a/DeviceCode/pal/Gesture/stubs/gesture_stubs.cpp +++ b/DeviceCode/pal/Gesture/stubs/gesture_stubs.cpp @@ -4,17 +4,17 @@ #include -HRESULT Gesture_Initialize() +__weak HRESULT Gesture_Initialize() { return CLR_E_NOTIMPL; } -HRESULT Gesture_Uninitialize() +__weak HRESULT Gesture_Uninitialize() { return CLR_E_NOTIMPL; } -void Gesture_ProcessPoint(UINT32 flags, UINT16 source, UINT16 x, UINT16 y, INT64 time) +__weak void Gesture_ProcessPoint(UINT32 flags, UINT16 source, UINT16 x, UINT16 y, INT64 time) { } diff --git a/DeviceCode/pal/Ink/stubs/ink_stubs.cpp b/DeviceCode/pal/Ink/stubs/ink_stubs.cpp index 1543cf5d8..66b8f879b 100644 --- a/DeviceCode/pal/Ink/stubs/ink_stubs.cpp +++ b/DeviceCode/pal/Ink/stubs/ink_stubs.cpp @@ -4,22 +4,22 @@ #include -HRESULT Ink_Initialize() +__weak HRESULT Ink_Initialize() { return CLR_E_NOTIMPL; } -HRESULT Ink_Uninitialize() +__weak HRESULT Ink_Uninitialize() { return CLR_E_NOTIMPL; } -HRESULT Ink_SetRegion(InkRegionInfo* inkRegionInfo) +__weak HRESULT Ink_SetRegion(InkRegionInfo* inkRegionInfo) { return CLR_E_NOTIMPL; } -HRESULT Ink_ResetRegion() +__weak HRESULT Ink_ResetRegion() { return CLR_E_NOTIMPL; } diff --git a/DeviceCode/pal/MFUpdate/stubs/MFUpdate_stub.cpp b/DeviceCode/pal/MFUpdate/stubs/MFUpdate_stub.cpp index 77031d908..14e753cc0 100644 --- a/DeviceCode/pal/MFUpdate/stubs/MFUpdate_stub.cpp +++ b/DeviceCode/pal/MFUpdate/stubs/MFUpdate_stub.cpp @@ -4,67 +4,67 @@ #include -void MFUpdate_Initialize(void) +__weak void MFUpdate_Initialize(void) { } -BOOL MFUpdate_GetProperty( UINT32 updateHandle, LPCSTR szPropName, UINT8* pPropValue, INT32* pPropValueSize ) +__weak BOOL MFUpdate_GetProperty( UINT32 updateHandle, LPCSTR szPropName, UINT8* pPropValue, INT32* pPropValueSize ) { return FALSE; } -BOOL MFUpdate_SetProperty( UINT32 updateHandle, LPCSTR szPropName, UINT8* pPropValue, INT32 pPropValueSize ) +__weak BOOL MFUpdate_SetProperty( UINT32 updateHandle, LPCSTR szPropName, UINT8* pPropValue, INT32 pPropValueSize ) { return FALSE; } -INT32 MFUpdate_InitUpdate( LPCSTR szProvider, MFUpdateHeader& update ) +__weak INT32 MFUpdate_InitUpdate( LPCSTR szProvider, MFUpdateHeader& update ) { return -1; } -BOOL MFUpdate_AuthCommand( INT32 updateHandle, UINT32 cmd, UINT8* pArgs, INT32 argsLen, UINT8* pResponse, INT32& responseLen ) +__weak BOOL MFUpdate_AuthCommand( INT32 updateHandle, UINT32 cmd, UINT8* pArgs, INT32 argsLen, UINT8* pResponse, INT32& responseLen ) { return FALSE; } -BOOL MFUpdate_Authenticate( INT32 updateHandle, UINT8* pAuthData, INT32 authLen ) +__weak BOOL MFUpdate_Authenticate( INT32 updateHandle, UINT8* pAuthData, INT32 authLen ) { return FALSE; } -BOOL MFUpdate_Open( INT32 updateHandle ) +__weak BOOL MFUpdate_Open( INT32 updateHandle ) { return FALSE; } -BOOL MFUpdate_Create( INT32 updateHandle ) +__weak BOOL MFUpdate_Create( INT32 updateHandle ) { return FALSE; } -BOOL MFUpdate_GetMissingPackets( INT32 updateHandle, UINT32* pPacketBits, INT32* pCount ) +__weak BOOL MFUpdate_GetMissingPackets( INT32 updateHandle, UINT32* pPacketBits, INT32* pCount ) { return FALSE; } -BOOL MFUpdate_AddPacket( INT32 updateHandle, INT32 packetIndex, UINT8* packetData, INT32 packetLen, UINT8* pValidationData, INT32 validationLen ) +__weak BOOL MFUpdate_AddPacket( INT32 updateHandle, INT32 packetIndex, UINT8* packetData, INT32 packetLen, UINT8* pValidationData, INT32 validationLen ) { return FALSE; } -BOOL MFUpdate_Validate( INT32 updateHandle, UINT8* pValidationData, INT32 validationLen ) +__weak BOOL MFUpdate_Validate( INT32 updateHandle, UINT8* pValidationData, INT32 validationLen ) { return FALSE; } -BOOL MFUpdate_Install( INT32 updateHandle, UINT8* pValidationData, INT32 validationLen ) +__weak BOOL MFUpdate_Install( INT32 updateHandle, UINT8* pValidationData, INT32 validationLen ) { return FALSE; } -BOOL MFUpdate_Delete( INT32 updateHandle ) +__weak BOOL MFUpdate_Delete( INT32 updateHandle ) { return FALSE; } diff --git a/DeviceCode/pal/configuration/stubs/ConfigHelper_stubs.cpp b/DeviceCode/pal/configuration/stubs/ConfigHelper_stubs.cpp index 558956db7..a2c0633ad 100644 --- a/DeviceCode/pal/configuration/stubs/ConfigHelper_stubs.cpp +++ b/DeviceCode/pal/configuration/stubs/ConfigHelper_stubs.cpp @@ -6,78 +6,78 @@ //--// -BOOL HAL_CONFIG_BLOCK::IsGoodBlock() const +__weak BOOL HAL_CONFIG_BLOCK::IsGoodBlock() const { return TRUE; } -BOOL HAL_CONFIG_BLOCK::IsGoodData() const +__weak BOOL HAL_CONFIG_BLOCK::IsGoodData() const { return TRUE; } -BOOL HAL_CONFIG_BLOCK::IsGood() const +__weak BOOL HAL_CONFIG_BLOCK::IsGood() const { return TRUE; } -const HAL_CONFIG_BLOCK* HAL_CONFIG_BLOCK::Next() const +__weak const HAL_CONFIG_BLOCK* HAL_CONFIG_BLOCK::Next() const { return NULL; } -const void* HAL_CONFIG_BLOCK::Data() const +__weak const void* HAL_CONFIG_BLOCK::Data() const { return NULL; } //--// -BOOL HAL_CONFIG_BLOCK::Prepare( const char* Name, void* Data, UINT32 Size ) +__weak BOOL HAL_CONFIG_BLOCK::Prepare( const char* Name, void* Data, UINT32 Size ) { return TRUE; } //--// -const HAL_CONFIG_BLOCK* HAL_CONFIG_BLOCK::Find( const char* Name, BOOL fSkipCurrent, BOOL fAppend ) const +__weak const HAL_CONFIG_BLOCK* HAL_CONFIG_BLOCK::Find( const char* Name, BOOL fSkipCurrent, BOOL fAppend ) const { return NULL; } //--// -BOOL HAL_CONFIG_BLOCK::GetConfigSectorAddress(HAL_CONFIG_BLOCK_STORAGE_DATA& blData) +__weak BOOL HAL_CONFIG_BLOCK::GetConfigSectorAddress(HAL_CONFIG_BLOCK_STORAGE_DATA& blData) { return FALSE; } -BOOL HAL_CONFIG_BLOCK::CompactBlock(HAL_CONFIG_BLOCK_STORAGE_DATA& blData, const ConfigurationSector* cfgStatic, const HAL_CONFIG_BLOCK* cfgEnd) +__weak BOOL HAL_CONFIG_BLOCK::CompactBlock(HAL_CONFIG_BLOCK_STORAGE_DATA& blData, const ConfigurationSector* cfgStatic, const HAL_CONFIG_BLOCK* cfgEnd) { return FALSE; } -BOOL HAL_CONFIG_BLOCK::UpdateBlock( const HAL_CONFIG_BLOCK_STORAGE_DATA &blData, const void* pAddress, const HAL_CONFIG_BLOCK *Header, void* Data, size_t Length, const void* LastConfigAddress, BOOL isChipRO ) +__weak BOOL HAL_CONFIG_BLOCK::UpdateBlock( const HAL_CONFIG_BLOCK_STORAGE_DATA &blData, const void* pAddress, const HAL_CONFIG_BLOCK *Header, void* Data, size_t Length, const void* LastConfigAddress, BOOL isChipRO ) { return FALSE; } -BOOL HAL_CONFIG_BLOCK::UpdateBlockWithName( const char* Name, void* Data, size_t Length, BOOL isChipRO ) +__weak BOOL HAL_CONFIG_BLOCK::UpdateBlockWithName( const char* Name, void* Data, size_t Length, BOOL isChipRO ) { return FALSE; } -BOOL HAL_CONFIG_BLOCK::ApplyConfig( const char* Name, void* Address, size_t Length ) +__weak BOOL HAL_CONFIG_BLOCK::ApplyConfig( const char* Name, void* Address, size_t Length ) { return FALSE; } -BOOL HAL_CONFIG_BLOCK::ApplyConfig( const char* Name, void* Address, size_t Length, void** newAlloc ) +__weak BOOL HAL_CONFIG_BLOCK::ApplyConfig( const char* Name, void* Address, size_t Length, void** newAlloc ) { return FALSE; } -unsigned int /* ie, BOOL */ GetHalSystemInfo(HalSystemInfo& systemInfo) +__weak unsigned int /* ie, BOOL */ GetHalSystemInfo(HalSystemInfo& systemInfo) { return FALSE; } diff --git a/DeviceCode/pal/events/stubs/events_stubs.cpp b/DeviceCode/pal/events/stubs/events_stubs.cpp index 71bde2340..e3f0a83ba 100644 --- a/DeviceCode/pal/events/stubs/events_stubs.cpp +++ b/DeviceCode/pal/events/stubs/events_stubs.cpp @@ -6,74 +6,74 @@ //--// -BOOL Events_Initialize() +__weak BOOL Events_Initialize() { NATIVE_PROFILE_PAL_EVENTS(); return TRUE; } -BOOL Events_Uninitialize() +__weak BOOL Events_Uninitialize() { NATIVE_PROFILE_PAL_EVENTS(); return TRUE; } -void Events_Set( UINT32 Events ) +__weak void Events_Set( UINT32 Events ) { NATIVE_PROFILE_PAL_EVENTS(); } -UINT32 Events_Get( UINT32 EventsOfInterest ) +__weak UINT32 Events_Get( UINT32 EventsOfInterest ) { NATIVE_PROFILE_PAL_EVENTS(); return 0; } -void Events_Clear( UINT32 Events ) +__weak void Events_Clear( UINT32 Events ) { NATIVE_PROFILE_PAL_EVENTS(); } -UINT32 Events_MaskedRead( UINT32 EventsOfInterest ) +__weak UINT32 Events_MaskedRead( UINT32 EventsOfInterest ) { NATIVE_PROFILE_PAL_EVENTS(); return 0; } -UINT32 Events_WaitForEvents( UINT32 powerLevel, UINT32 WakeupSystemEvents, UINT32 Timeout_Milliseconds ) +__weak UINT32 Events_WaitForEvents( UINT32 powerLevel, UINT32 WakeupSystemEvents, UINT32 Timeout_Milliseconds ) { NATIVE_PROFILE_PAL_EVENTS(); return 0; } -UINT32 Events_WaitForEventsInternal( UINT32 powerLevel, UINT32 WakeupSystemEvents, UINT32 Timeout_Milliseconds ) +__weak UINT32 Events_WaitForEventsInternal( UINT32 powerLevel, UINT32 WakeupSystemEvents, UINT32 Timeout_Milliseconds ) { NATIVE_PROFILE_PAL_EVENTS(); return 0; } -void local_Events_SetBoolTimer_Callback( void* arg ) +__weak void local_Events_SetBoolTimer_Callback( void* arg ) { NATIVE_PROFILE_PAL_EVENTS(); } -void Events_SetBoolTimer( BOOL* TimerCompleteFlag, UINT32 MillisecondsFromNow ) +__weak void Events_SetBoolTimer( BOOL* TimerCompleteFlag, UINT32 MillisecondsFromNow ) { NATIVE_PROFILE_PAL_EVENTS(); } -void Events_SetCallback( set_Event_Callback pfn, void* arg ) +__weak void Events_SetCallback( set_Event_Callback pfn, void* arg ) { NATIVE_PROFILE_PAL_EVENTS(); } -void FreeManagedEvent(UINT8 category, UINT8 subCategory, UINT16 data1, UINT32 data2) +__weak void FreeManagedEvent(UINT8 category, UINT8 subCategory, UINT16 data1, UINT32 data2) { NATIVE_PROFILE_PAL_EVENTS(); } diff --git a/DeviceCode/pal/fs/stubs/Config/FS_config_stubs.cpp b/DeviceCode/pal/fs/stubs/Config/FS_config_stubs.cpp index e3b07de0c..fba9e52da 100644 --- a/DeviceCode/pal/fs/stubs/Config/FS_config_stubs.cpp +++ b/DeviceCode/pal/fs/stubs/Config/FS_config_stubs.cpp @@ -8,11 +8,11 @@ #pragma arm section rwdata = "g_AvailableFSInterfaces" #endif -void FS_AddVolumes() +__weak void FS_AddVolumes() { } -void FS_MountRemovableVolumes() +__weak void FS_MountRemovableVolumes() { } diff --git a/DeviceCode/pal/fs/stubs/fs_stubs.cpp b/DeviceCode/pal/fs/stubs/fs_stubs.cpp index f84d6bc85..73f0a0799 100644 --- a/DeviceCode/pal/fs/stubs/fs_stubs.cpp +++ b/DeviceCode/pal/fs/stubs/fs_stubs.cpp @@ -5,73 +5,73 @@ //--// -void FS_MountVolume( LPCSTR nameSpace, UINT32 serialNumber, UINT32 deviceFlags, BlockStorageDevice* blockStorageDevice ) +__weak void FS_MountVolume( LPCSTR nameSpace, UINT32 serialNumber, UINT32 deviceFlags, BlockStorageDevice* blockStorageDevice ) { } -void FS_UnmountVolume( BlockStorageDevice* blockStorageDevice ) +__weak void FS_UnmountVolume( BlockStorageDevice* blockStorageDevice ) { } //--// -void FS_Initialize() +__weak void FS_Initialize() { } //--// -HAL_DblLinkedList FileSystemVolumeList::s_volumeList; +__weak HAL_DblLinkedList FileSystemVolumeList::s_volumeList; //--// -void FileSystemVolumeList::Initialize() +__weak void FileSystemVolumeList::Initialize() { } -BOOL FileSystemVolumeList::InitializeVolumes() +__weak BOOL FileSystemVolumeList::InitializeVolumes() { return TRUE; } -BOOL FileSystemVolumeList::UninitializeVolumes() +__weak BOOL FileSystemVolumeList::UninitializeVolumes() { return TRUE; } -BOOL FileSystemVolumeList::AddVolume( FileSystemVolume* fsv, LPCSTR nameSpace, UINT32 serialNumber, UINT32 deviceFlags, +__weak BOOL FileSystemVolumeList::AddVolume( FileSystemVolume* fsv, LPCSTR nameSpace, UINT32 serialNumber, UINT32 deviceFlags, STREAM_DRIVER_INTERFACE* streamDriver, FILESYSTEM_DRIVER_INTERFACE* fsDriver, BlockStorageDevice* blockStorageDevice, UINT32 volumeId, BOOL init ) { return TRUE; } -BOOL FileSystemVolumeList::RemoveVolume( FileSystemVolume* fsv, BOOL uninit ) +__weak BOOL FileSystemVolumeList::RemoveVolume( FileSystemVolume* fsv, BOOL uninit ) { return TRUE; } -FileSystemVolume* FileSystemVolumeList::GetFirstVolume() +__weak FileSystemVolume* FileSystemVolumeList::GetFirstVolume() { return NULL; } -FileSystemVolume* FileSystemVolumeList::GetNextVolume( FileSystemVolume& volume ) +__weak FileSystemVolume* FileSystemVolumeList::GetNextVolume( FileSystemVolume& volume ) { return NULL; } -UINT32 FileSystemVolumeList::GetNumVolumes() +__weak UINT32 FileSystemVolumeList::GetNumVolumes() { return 0; } -FileSystemVolume* FileSystemVolumeList::FindVolume( LPCSTR nameSpace, UINT32 nameSpaceLength ) +__weak FileSystemVolume* FileSystemVolumeList::FindVolume( LPCSTR nameSpace, UINT32 nameSpaceLength ) { return NULL; } -BOOL FileSystemVolumeList::Contains( FileSystemVolume* fsv ) +__weak BOOL FileSystemVolumeList::Contains( FileSystemVolume* fsv ) { return FALSE; } diff --git a/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp b/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp index f3a1483d1..c0824e489 100644 --- a/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp +++ b/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp @@ -6,71 +6,71 @@ //--// -int Graphics_GetSize( int width, int height ) +__weak int Graphics_GetSize( int width, int height ) { NATIVE_PROFILE_PAL_GRAPHICS(); return 0; } -int Graphics_GetWidthInWords( int width ) +__weak int Graphics_GetWidthInWords( int width ) { NATIVE_PROFILE_PAL_GRAPHICS(); return 0; } -void Graphics_Clear( const PAL_GFX_Bitmap& bitmap ) +__weak void Graphics_Clear( const PAL_GFX_Bitmap& bitmap ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -UINT32 Graphics_GetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y ) +__weak UINT32 Graphics_GetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y ) { NATIVE_PROFILE_PAL_GRAPHICS(); return 0; } -void Graphics_SetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y, UINT32 color ) +__weak void Graphics_SetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y, UINT32 color ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_DrawLine( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) +__weak void Graphics_DrawLine( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_DrawLineRaw( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) +__weak void Graphics_DrawLineRaw( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_DrawRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle ) +__weak void Graphics_DrawRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_DrawRoundedRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle, +__weak void Graphics_DrawRoundedRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle, int radiusX, int radiusY ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_DrawEllipse( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, int x, int y, int radiusX, int radiusY ) +__weak void Graphics_DrawEllipse( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, int x, int y, int radiusX, int radiusY ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_DrawImage( const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) +__weak void Graphics_DrawImage( const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_RotateImage( int angle, const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) +__weak void Graphics_RotateImage( int angle, const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -void Graphics_SetPixelsHelper( const PAL_GFX_Bitmap& bitmap, const GFX_Rect& rect, UINT32 config, GFX_SetPixelsCallback callback, void* param ) +__weak void Graphics_SetPixelsHelper( const PAL_GFX_Bitmap& bitmap, const GFX_Rect& rect, UINT32 config, GFX_SetPixelsCallback callback, void* param ) { NATIVE_PROFILE_PAL_GRAPHICS(); } diff --git a/DeviceCode/pal/heap/stubs/heap_stubs.cpp b/DeviceCode/pal/heap/stubs/heap_stubs.cpp index 1c9c0a01f..9cdb910df 100644 --- a/DeviceCode/pal/heap/stubs/heap_stubs.cpp +++ b/DeviceCode/pal/heap/stubs/heap_stubs.cpp @@ -6,7 +6,7 @@ //--// -void HeapLocation( UINT8*& BaseAddress, UINT32& SizeInBytes ) +__weak void HeapLocation( UINT8*& BaseAddress, UINT32& SizeInBytes ) { NATIVE_PROFILE_PAL_HEAP(); BaseAddress = 0; diff --git a/DeviceCode/pal/io/stubs/GPIO_Output_Stubs.cpp b/DeviceCode/pal/io/stubs/GPIO_Output_Stubs.cpp index 587126628..8a27f6c14 100644 --- a/DeviceCode/pal/io/stubs/GPIO_Output_Stubs.cpp +++ b/DeviceCode/pal/io/stubs/GPIO_Output_Stubs.cpp @@ -6,47 +6,47 @@ //--// -void Instrumentation_Initialize() +__weak void Instrumentation_Initialize() { NATIVE_PROFILE_PAL_IO(); } -void Instrumentation_Uninitialize() +__weak void Instrumentation_Uninitialize() { NATIVE_PROFILE_PAL_IO(); } -void Instrumentation_Running() +__weak void Instrumentation_Running() { NATIVE_PROFILE_PAL_IO(); } -void Instrumentation_Sleeping() +__weak void Instrumentation_Sleeping() { NATIVE_PROFILE_PAL_IO(); } //--// -BOOL OUTPUT_GPIO_Driver::Initialize( OUTPUT_GPIO_CONFIG* Config ) +__weak BOOL OUTPUT_GPIO_Driver::Initialize( OUTPUT_GPIO_CONFIG* Config ) { NATIVE_PROFILE_PAL_IO(); return TRUE; } -void OUTPUT_GPIO_Driver::Uninitialize( OUTPUT_GPIO_CONFIG* Config ) +__weak void OUTPUT_GPIO_Driver::Uninitialize( OUTPUT_GPIO_CONFIG* Config ) { NATIVE_PROFILE_PAL_IO(); } -void OUTPUT_GPIO_Driver::Set( OUTPUT_GPIO_CONFIG* Config, BOOL On ) +__weak void OUTPUT_GPIO_Driver::Set( OUTPUT_GPIO_CONFIG* Config, BOOL On ) { NATIVE_PROFILE_PAL_IO(); } -void OUTPUT_GPIO_Driver::RefCount( OUTPUT_GPIO_CONFIG* Config, BOOL Add ) +__weak void OUTPUT_GPIO_Driver::RefCount( OUTPUT_GPIO_CONFIG* Config, BOOL Add ) { NATIVE_PROFILE_PAL_IO(); } diff --git a/DeviceCode/pal/lwip_1_4_1_os/SocketsDriver/stubs/SocketsDriver_stubs.cpp b/DeviceCode/pal/lwip_1_4_1_os/SocketsDriver/stubs/SocketsDriver_stubs.cpp index dcaece722..55f477992 100644 --- a/DeviceCode/pal/lwip_1_4_1_os/SocketsDriver/stubs/SocketsDriver_stubs.cpp +++ b/DeviceCode/pal/lwip_1_4_1_os/SocketsDriver/stubs/SocketsDriver_stubs.cpp @@ -4,119 +4,119 @@ #include -BOOL HAL_SOCK_Initialize() +__weak BOOL HAL_SOCK_Initialize() { return FALSE; } -BOOL HAL_SOCK_Uninitialize() +__weak BOOL HAL_SOCK_Uninitialize() { return FALSE; } -SOCK_SOCKET HAL_SOCK_socket( int family, int type, int protocol ) +__weak SOCK_SOCKET HAL_SOCK_socket( int family, int type, int protocol ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_bind( SOCK_SOCKET socket, const struct SOCK_sockaddr* address, int addressLen ) +__weak int HAL_SOCK_bind( SOCK_SOCKET socket, const struct SOCK_sockaddr* address, int addressLen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_connect(SOCK_SOCKET socket, const struct SOCK_sockaddr* address, int addressLen) +__weak int HAL_SOCK_connect(SOCK_SOCKET socket, const struct SOCK_sockaddr* address, int addressLen) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_send(SOCK_SOCKET socket, const char* buf, int len, int flags) +__weak int HAL_SOCK_send(SOCK_SOCKET socket, const char* buf, int len, int flags) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_recv(SOCK_SOCKET socket, char* buf, int len, int flags) +__weak int HAL_SOCK_recv(SOCK_SOCKET socket, char* buf, int len, int flags) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_close(SOCK_SOCKET socket) +__weak int HAL_SOCK_close(SOCK_SOCKET socket) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_listen( SOCK_SOCKET socket, int backlog ) +__weak int HAL_SOCK_listen( SOCK_SOCKET socket, int backlog ) { return SOCK_SOCKET_ERROR; } -SOCK_SOCKET HAL_SOCK_accept( SOCK_SOCKET socket, struct SOCK_sockaddr* address, int* addressLen ) +__weak SOCK_SOCKET HAL_SOCK_accept( SOCK_SOCKET socket, struct SOCK_sockaddr* address, int* addressLen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_shutdown( SOCK_SOCKET socket, int how ) +__weak int HAL_SOCK_shutdown( SOCK_SOCKET socket, int how ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_getaddrinfo( const char* nodename, char* servname, const struct SOCK_addrinfo* hints, struct SOCK_addrinfo** res ) +__weak int HAL_SOCK_getaddrinfo( const char* nodename, char* servname, const struct SOCK_addrinfo* hints, struct SOCK_addrinfo** res ) { return SOCK_SOCKET_ERROR; } -void HAL_SOCK_freeaddrinfo( struct SOCK_addrinfo* ai ) +__weak void HAL_SOCK_freeaddrinfo( struct SOCK_addrinfo* ai ) { } -int HAL_SOCK_ioctl( SOCK_SOCKET socket, int cmd, int* data ) +__weak int HAL_SOCK_ioctl( SOCK_SOCKET socket, int cmd, int* data ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_getlasterror() +__weak int HAL_SOCK_getlasterror() { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_select( int nfds, SOCK_fd_set* readfds, SOCK_fd_set* writefds, SOCK_fd_set* except, const struct SOCK_timeval* timeout ) +__weak int HAL_SOCK_select( int nfds, SOCK_fd_set* readfds, SOCK_fd_set* writefds, SOCK_fd_set* except, const struct SOCK_timeval* timeout ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_setsockopt( SOCK_SOCKET socket, int level, int optname, const char* optval, int optlen ) +__weak int HAL_SOCK_setsockopt( SOCK_SOCKET socket, int level, int optname, const char* optval, int optlen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_getsockopt( SOCK_SOCKET socket, int level, int optname, char* optval, int* optlen ) +__weak int HAL_SOCK_getsockopt( SOCK_SOCKET socket, int level, int optname, char* optval, int* optlen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_getpeername( SOCK_SOCKET socket, struct SOCK_sockaddr* name, int* namelen ) +__weak int HAL_SOCK_getpeername( SOCK_SOCKET socket, struct SOCK_sockaddr* name, int* namelen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_getsockname( SOCK_SOCKET socket, struct SOCK_sockaddr* name, int* namelen ) +__weak int HAL_SOCK_getsockname( SOCK_SOCKET socket, struct SOCK_sockaddr* name, int* namelen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_recvfrom( SOCK_SOCKET s, char* buf, int len, int flags, struct SOCK_sockaddr* from, int* fromlen ) +__weak int HAL_SOCK_recvfrom( SOCK_SOCKET s, char* buf, int len, int flags, struct SOCK_sockaddr* from, int* fromlen ) { return SOCK_SOCKET_ERROR; } -int HAL_SOCK_sendto( SOCK_SOCKET s, const char* buf, int len, int flags, const struct SOCK_sockaddr* to, int tolen ) +__weak int HAL_SOCK_sendto( SOCK_SOCKET s, const char* buf, int len, int flags, const struct SOCK_sockaddr* to, int tolen ) { return SOCK_SOCKET_ERROR; } -UINT32 HAL_SOCK_CONFIGURATION_GetAdapterCount() +__weak UINT32 HAL_SOCK_CONFIGURATION_GetAdapterCount() { return 0; } -HRESULT HAL_SOCK_CONFIGURATION_LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) +__weak HRESULT HAL_SOCK_CONFIGURATION_LoadAdapterConfiguration( UINT32 interfaceIndex, SOCK_NetworkConfiguration* config ) { return CLR_E_FAIL; } -HRESULT HAL_SOCK_CONFIGURATION_UpdateAdapterConfiguration( UINT32 interfaceIndex, UINT32 updateFlags, SOCK_NetworkConfiguration* config ) +__weak HRESULT HAL_SOCK_CONFIGURATION_UpdateAdapterConfiguration( UINT32 interfaceIndex, UINT32 updateFlags, SOCK_NetworkConfiguration* config ) { return CLR_E_FAIL; } -HRESULT HAL_SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) +__weak HRESULT HAL_SOCK_CONFIGURATION_LoadWirelessConfiguration( UINT32 interfaceIndex, SOCK_WirelessConfiguration* wirelessConfig ) { return CLR_E_FAIL; } -void HAL_SOCK_EventsSet( UINT32 events ) +__weak void HAL_SOCK_EventsSet( UINT32 events ) { } -void * HAL_SOCK_GlobalLockContext() +__weak void * HAL_SOCK_GlobalLockContext() { return NULL; } From f6f99f8e5740fec1ca4fd3c6d2f6d2a57b5bea80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Mon, 21 Mar 2016 23:58:32 +0000 Subject: [PATCH 064/144] Correct some typos and formating --- Solutions/STM32F4DISCOVERY/readme.md | 40 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Solutions/STM32F4DISCOVERY/readme.md b/Solutions/STM32F4DISCOVERY/readme.md index ed3f6ab03..a3f82f144 100644 --- a/Solutions/STM32F4DISCOVERY/readme.md +++ b/Solutions/STM32F4DISCOVERY/readme.md @@ -13,8 +13,8 @@ The current NETMF implementation is based in CMSIS. You may want to look into th - \DeviceCode\Targets\Native\... For example, to implement a solution targeting ST's STM32F4-DISCOVERY board, you should find there: -- \CMSIS\Device\**_ST_**\**_STM32F4xx_** -- \DeviceCode\Targets\Native\**_STM32F4xx_** +- \CMSIS\Device\\**ST**\\**STM32F4xx** +- \DeviceCode\Targets\Native\\**STM32F4xx** The CMSIS folder has the header files for the STM32F4 series. The Tartgets\Native folder has the header and code that implements the HAL for the STM32F4 series. @@ -25,20 +25,20 @@ If these don't exist then you must start by adding support for the appropriate v 1. Start by copying an existing solution folder and rename it to something appropriate. For obvious reasons it's recommended that you choose one that is similar to the MCU/board that you are targeting. -2. Edit the **dotnetmf.proj** file (located in the solution home folder) - a) Find/replace the original solution name in the first `````` block - b) Near the bottom finf the group `````` and at `````` and at ``````. + 2. Find/replace the original solution name throughout the file. + 3. Find the `````` block that includes the device ID and replace it with the appropriate names. + 4. Make sure the last ``` -BOOL Network_Interface_Bind(int index) +__weak BOOL Network_Interface_Bind(int index) { return FALSE; } -int Network_Interface_Open(int index) + +__weak int Network_Interface_Open(int index) { return 0; } -BOOL Network_Interface_Close(int index) + +__weak BOOL Network_Interface_Close(int index) { return FALSE; } diff --git a/DeviceCode/Drivers/Stubs/Network/Loopback/loopback_stubs.cpp b/DeviceCode/Drivers/Stubs/Network/Loopback/loopback_stubs.cpp index eadfbbefc..84bfed110 100644 --- a/DeviceCode/Drivers/Stubs/Network/Loopback/loopback_stubs.cpp +++ b/DeviceCode/Drivers/Stubs/Network/Loopback/loopback_stubs.cpp @@ -24,21 +24,21 @@ LOOPBACK_Driver g_LOOPBACK_Driver; INIT_FNCS RTP_FAR loop_fnc; -void init_loopback(void) +__weak void init_loopback(void) { } -int LOOPBACK_Driver::Open( ) +__weak int LOOPBACK_Driver::Open( ) { return 0; } -BOOL LOOPBACK_Driver::Close( ) +__weak BOOL LOOPBACK_Driver::Close( ) { return FALSE; } -BOOL LOOPBACK_Driver::Bind ( ) +__weak BOOL LOOPBACK_Driver::Bind ( ) { return FALSE; } diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_DA/stubs_functions_DA.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_DA/stubs_functions_DA.cpp index 7a5357e72..c28efd705 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_DA/stubs_functions_DA.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_DA/stubs_functions_DA.cpp @@ -6,31 +6,30 @@ //--// -BOOL DA_Initialize( DA_CHANNEL channel, INT32 precisionInBits ) +__weak BOOL DA_Initialize( DA_CHANNEL channel, INT32 precisionInBits ) { return FALSE; } -void DA_Uninitialize( DA_CHANNEL channel ) +__weak void DA_Uninitialize( DA_CHANNEL channel ) { } -void DA_Write( DA_CHANNEL channel, INT32 level ) +__weak void DA_Write( DA_CHANNEL channel, INT32 level ) { } -UINT32 DA_DAChannels() +__weak UINT32 DA_DAChannels() { return 0; } -GPIO_PIN DA_GetPinForChannel( DA_CHANNEL channel ) +__weak GPIO_PIN DA_GetPinForChannel( DA_CHANNEL channel ) { return GPIO_PIN_NONE; } -BOOL DA_GetAvailablePrecisionsForChannel( DA_CHANNEL channel, INT32* precisions, UINT32& size ) +__weak BOOL DA_GetAvailablePrecisionsForChannel( DA_CHANNEL channel, INT32* precisions, UINT32& size ) { size = 0; return FALSE; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_DMA/stubs_functions_DMA.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_DMA/stubs_functions_DMA.cpp index 023e590da..014b82e8b 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_DMA/stubs_functions_DMA.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_DMA/stubs_functions_DMA.cpp @@ -5,26 +5,24 @@ #include //--// -BOOL DMA_Initialize() +__weak BOOL DMA_Initialize() { return true; } -BOOL DMA_Uninitialize() +__weak BOOL DMA_Uninitialize() { return true; } -void DMA_MemCpy( void* dst, void*src, UINT32 size, BOOL async = FALSE ) +__weak void DMA_MemCpy( void* dst, void*src, UINT32 size, BOOL async = FALSE ) { } -void DMA_MemCpy2D( void* dst, void*src, UINT32 width, UINT32 height, UINT32 dataWidth, BOOL async = FALSE ) +__weak void DMA_MemCpy2D( void* dst, void*src, UINT32 width, UINT32 height, UINT32 dataWidth, BOOL async = FALSE ) { } -void DMA_StartDummyDMA() +__weak void DMA_StartDummyDMA() { } - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_EBIU/stubs_functions_EBIU.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_EBIU/stubs_functions_EBIU.cpp index 7dfb1a999..16ce708d5 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_EBIU/stubs_functions_EBIU.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_EBIU/stubs_functions_EBIU.cpp @@ -5,12 +5,11 @@ #include //--// -void CPU_EBIU_ConfigMemoryBlock( const CPU_MEMORY_CONFIG& CPUMemoryConfig ) +__weak void CPU_EBIU_ConfigMemoryBlock( const CPU_MEMORY_CONFIG& CPUMemoryConfig ) { } -BOOL CPU_EBIU_Memory_ReadOnly( const CPU_MEMORY_CONFIG& CPUMemoryConfig, BOOL ReadOnly ) +__weak BOOL CPU_EBIU_Memory_ReadOnly( const CPU_MEMORY_CONFIG& CPUMemoryConfig, BOOL ReadOnly ) { return FALSE; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_I2C/stubs_functions_I2C.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_I2C/stubs_functions_I2C.cpp index 397818dd4..def7b2882 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_I2C/stubs_functions_I2C.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_I2C/stubs_functions_I2C.cpp @@ -7,32 +7,31 @@ //--// struct I2C_CONFIGURATION; -BOOL I2C_Internal_Initialize() +__weak BOOL I2C_Internal_Initialize() { return FALSE; } -BOOL I2C_Internal_Uninitialize() +__weak BOOL I2C_Internal_Uninitialize() { return FALSE; } -void I2C_Internal_XActionStart( I2C_HAL_XACTION* xAction, bool repeatedStart ) +__weak void I2C_Internal_XActionStart( I2C_HAL_XACTION* xAction, bool repeatedStart ) { } -void I2C_Internal_XActionStop() +__weak void I2C_Internal_XActionStop() { } -void I2C_Internal_GetClockRate( UINT32 rateKhz, UINT8& clockRate, UINT8& clockRate2) +__weak void I2C_Internal_GetClockRate( UINT32 rateKhz, UINT8& clockRate, UINT8& clockRate2) { return ; } -void I2C_Internal_GetPins( GPIO_PIN& scl, GPIO_PIN& sda ) +__weak void I2C_Internal_GetPins( GPIO_PIN& scl, GPIO_PIN& sda ) { scl = GPIO_PIN_NONE; sda = GPIO_PIN_NONE; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_INTC/stubs_functions_INTC.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_INTC/stubs_functions_INTC.cpp index 119a42802..ee8fad260 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_INTC/stubs_functions_INTC.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_INTC/stubs_functions_INTC.cpp @@ -5,42 +5,40 @@ #include //--// -void __irq IRQ_Handler() +__weak void __irq IRQ_Handler() { } -void CPU_INTC_Initialize() +__weak void CPU_INTC_Initialize() { } -BOOL CPU_INTC_ActivateInterrupt( UINT32 Irq_Index, HAL_CALLBACK_FPN ISR, void* ISR_Param ) +__weak BOOL CPU_INTC_ActivateInterrupt( UINT32 Irq_Index, HAL_CALLBACK_FPN ISR, void* ISR_Param ) { return FALSE; } -BOOL CPU_INTC_DeactivateInterrupt( UINT32 Irq_Index ) +__weak BOOL CPU_INTC_DeactivateInterrupt( UINT32 Irq_Index ) { return FALSE; } -BOOL CPU_INTC_InterruptEnable( UINT32 Irq_Index ) +__weak BOOL CPU_INTC_InterruptEnable( UINT32 Irq_Index ) { return FALSE; } -BOOL CPU_INTC_InterruptDisable( UINT32 Irq_Index ) +__weak BOOL CPU_INTC_InterruptDisable( UINT32 Irq_Index ) { return FALSE; } -BOOL CPU_INTC_InterruptEnableState( UINT32 Irq_Index ) +__weak BOOL CPU_INTC_InterruptEnableState( UINT32 Irq_Index ) { return FALSE; } -BOOL CPU_INTC_InterruptState( UINT32 Irq_Index ) +__weak BOOL CPU_INTC_InterruptState( UINT32 Irq_Index ) { return FALSE; } - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_LCD/stubs_functions_LCD.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_LCD/stubs_functions_LCD.cpp index 4988cbe40..01ed21d41 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_LCD/stubs_functions_LCD.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_LCD/stubs_functions_LCD.cpp @@ -6,18 +6,17 @@ //--// -BOOL LCD_Controller_Initialize( DISPLAY_CONTROLLER_CONFIG& config ) +__weak BOOL LCD_Controller_Initialize( DISPLAY_CONTROLLER_CONFIG& config ) { return FALSE; } -BOOL LCD_Controller_Uninitialize() +__weak BOOL LCD_Controller_Uninitialize() { return TRUE; } -BOOL LCD_Controller_Enable( BOOL fEnable ) +__weak BOOL LCD_Controller_Enable( BOOL fEnable ) { return TRUE; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_MMU/stubs_functions_MMU.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_MMU/stubs_functions_MMU.cpp index d1317229a..64a0e5f81 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_MMU/stubs_functions_MMU.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_MMU/stubs_functions_MMU.cpp @@ -5,21 +5,19 @@ #include //--// -void CPU_InvalidateTLBs() +__weak void CPU_InvalidateTLBs() { } -void CPU_EnableMMU( void* TTB ) +__weak void CPU_EnableMMU( void* TTB ) { } -void CPU_DisableMMU() +__weak void CPU_DisableMMU() { } -BOOL CPU_IsMMUEnabled() +__weak BOOL CPU_IsMMUEnabled() { return FALSE; } - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_PCU/stubs_functions_PCU.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_PCU/stubs_functions_PCU.cpp index 6715c46e5..7468fe0fd 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_PCU/stubs_functions_PCU.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_PCU/stubs_functions_PCU.cpp @@ -5,17 +5,15 @@ #include //--// -void CPU_PCU_Regulator_Switcher1_On () {} +__weak void CPU_PCU_Regulator_Switcher1_On () {} -void CPU_PCU_Regulator_Switcher1_Off() {} -BOOL CPU_PCU_Regulator_Switcher1_Status() { return TRUE; } - -void CPU_PCU_Regulator_Linear1_On () {} -void CPU_PCU_Regulator_Linear1_Off() {} -BOOL CPU_PCU_Regulator_Linear1_Status() { return FALSE; } - -void CPU_PCU_Regulator_Linear2_On () {} -void CPU_PCU_Regulator_Linear2_Off() {} -BOOL CPU_PCU_Regulator_Linear2_Status() { return FALSE; } +__weak void CPU_PCU_Regulator_Switcher1_Off() {} +__weak BOOL CPU_PCU_Regulator_Switcher1_Status() { return TRUE; } +__weak void CPU_PCU_Regulator_Linear1_On () {} +__weak void CPU_PCU_Regulator_Linear1_Off() {} +__weak BOOL CPU_PCU_Regulator_Linear1_Status() { return FALSE; } +__weak void CPU_PCU_Regulator_Linear2_On () {} +__weak void CPU_PCU_Regulator_Linear2_Off() {} +__weak BOOL CPU_PCU_Regulator_Linear2_Status() { return FALSE; } diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_PWM/stubs_functions_pwm.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_PWM/stubs_functions_pwm.cpp index 2d504f184..2d0c01279 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_PWM/stubs_functions_pwm.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_PWM/stubs_functions_pwm.cpp @@ -6,46 +6,45 @@ //--// -BOOL PWM_Initialize(PWM_CHANNEL channel) +__weak BOOL PWM_Initialize(PWM_CHANNEL channel) { return TRUE; } -BOOL PWM_Uninitialize(PWM_CHANNEL channel) +__weak BOOL PWM_Uninitialize(PWM_CHANNEL channel) { return TRUE; } -BOOL PWM_ApplyConfiguration(PWM_CHANNEL channel, GPIO_PIN pin, UINT32& period, UINT32& duration, PWM_SCALE_FACTOR& scale, BOOL invert) +__weak BOOL PWM_ApplyConfiguration(PWM_CHANNEL channel, GPIO_PIN pin, UINT32& period, UINT32& duration, PWM_SCALE_FACTOR& scale, BOOL invert) { return TRUE; } -BOOL PWM_Start(PWM_CHANNEL channel, GPIO_PIN pin) +__weak BOOL PWM_Start(PWM_CHANNEL channel, GPIO_PIN pin) { return TRUE; } -void PWM_Stop(PWM_CHANNEL channel, GPIO_PIN pin) +__weak void PWM_Stop(PWM_CHANNEL channel, GPIO_PIN pin) { } -BOOL PWM_Start(PWM_CHANNEL* channel, GPIO_PIN* pin, UINT32 count) +__weak BOOL PWM_Start(PWM_CHANNEL* channel, GPIO_PIN* pin, UINT32 count) { return TRUE; } -void PWM_Stop(PWM_CHANNEL* channel, GPIO_PIN* pin, UINT32 count) +__weak void PWM_Stop(PWM_CHANNEL* channel, GPIO_PIN* pin, UINT32 count) { } -UINT32 PWM_PWMChannels() +__weak UINT32 PWM_PWMChannels() { return 0; } -GPIO_PIN PWM_GetPinForChannel( PWM_CHANNEL channel ) +__weak GPIO_PIN PWM_GetPinForChannel( PWM_CHANNEL channel ) { return GPIO_PIN_NONE; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_PerfCounter/stubs_functions_Perf.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_PerfCounter/stubs_functions_Perf.cpp index 38b4fc70e..db619b142 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_PerfCounter/stubs_functions_Perf.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_PerfCounter/stubs_functions_Perf.cpp @@ -7,16 +7,15 @@ //--// -void Time_PerformanceCounter_Initialize() +__weak void Time_PerformanceCounter_Initialize() { } -void Time_PerformanceCounter_Uninitialize() +__weak void Time_PerformanceCounter_Uninitialize() { } -UINT32 Time_PerformanceCounter() +__weak UINT32 Time_PerformanceCounter() { return 0; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_SPI/stubs_functions_SPI.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_SPI/stubs_functions_SPI.cpp index b1c95c59f..dea9e5529 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_SPI/stubs_functions_SPI.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_SPI/stubs_functions_SPI.cpp @@ -14,51 +14,51 @@ #include //--// -BOOL CPU_SPI_Initialize() +__weak BOOL CPU_SPI_Initialize() { return TRUE; } -void CPU_SPI_Uninitialize() +__weak void CPU_SPI_Uninitialize() { } -BOOL CPU_SPI_nWrite16_nRead16( const SPI_CONFIGURATION& Configuration, UINT16* Write16, INT32 WriteCount, UINT16* Read16, INT32 ReadCount, INT32 ReadStartOffset ) +__weak BOOL CPU_SPI_nWrite16_nRead16( const SPI_CONFIGURATION& Configuration, UINT16* Write16, INT32 WriteCount, UINT16* Read16, INT32 ReadCount, INT32 ReadStartOffset ) { return FALSE; } -BOOL CPU_SPI_nWrite8_nRead8( const SPI_CONFIGURATION& Configuration, UINT8* Write8, INT32 WriteCount, UINT8* Read8, INT32 ReadCount, INT32 ReadStartOffset ) +__weak BOOL CPU_SPI_nWrite8_nRead8( const SPI_CONFIGURATION& Configuration, UINT8* Write8, INT32 WriteCount, UINT8* Read8, INT32 ReadCount, INT32 ReadStartOffset ) { return FALSE; } -BOOL CPU_SPI_Xaction_Start( const SPI_CONFIGURATION& Configuration ) +__weak BOOL CPU_SPI_Xaction_Start( const SPI_CONFIGURATION& Configuration ) { return FALSE; } -BOOL CPU_SPI_Xaction_Stop( const SPI_CONFIGURATION& Configuration ) +__weak BOOL CPU_SPI_Xaction_Stop( const SPI_CONFIGURATION& Configuration ) { return FALSE; } -BOOL CPU_SPI_Xaction_nWrite16_nRead16( SPI_XACTION_16& Transaction ) +__weak BOOL CPU_SPI_Xaction_nWrite16_nRead16( SPI_XACTION_16& Transaction ) { return FALSE; } -BOOL CPU_SPI_Xaction_nWrite8_nRead8( SPI_XACTION_8& Transaction ) +__weak BOOL CPU_SPI_Xaction_nWrite8_nRead8( SPI_XACTION_8& Transaction ) { return FALSE; } -UINT32 CPU_SPI_PortsCount() +__weak UINT32 CPU_SPI_PortsCount() { return 0; } -void CPU_SPI_GetPins( UINT32 spi_mod, GPIO_PIN& msk, GPIO_PIN& miso, GPIO_PIN& mosi ) +__weak void CPU_SPI_GetPins( UINT32 spi_mod, GPIO_PIN& msk, GPIO_PIN& miso, GPIO_PIN& mosi ) { msk = GPIO_PIN_NONE; miso = GPIO_PIN_NONE; @@ -66,17 +66,17 @@ void CPU_SPI_GetPins( UINT32 spi_mod, GPIO_PIN& msk, GPIO_PIN& miso, GPIO_PIN& m return; } -UINT32 CPU_SPI_MinClockFrequency( UINT32 spi_mod ) +__weak UINT32 CPU_SPI_MinClockFrequency( UINT32 spi_mod ) { return 0; } -UINT32 CPU_SPI_MaxClockFrequency( UINT32 spi_mod ) +__weak UINT32 CPU_SPI_MaxClockFrequency( UINT32 spi_mod ) { return 0; } -UINT32 CPU_SPI_ChipSelectLineCount( UINT32 spi_mod ) +__weak UINT32 CPU_SPI_ChipSelectLineCount( UINT32 spi_mod ) { return 0; } diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_USART/stubs_functions_USART.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_USART/stubs_functions_USART.cpp index 859dc5ac9..17e7a3dd1 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_USART/stubs_functions_USART.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_USART/stubs_functions_USART.cpp @@ -5,58 +5,58 @@ #include //--// -BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) +__weak BOOL CPU_USART_Initialize( int ComPortNum, int BaudRate, int Parity, int DataBits, int StopBits, int FlowValue ) { return TRUE; } -BOOL CPU_USART_Uninitialize( int ComPortNum ) +__weak BOOL CPU_USART_Uninitialize( int ComPortNum ) { return TRUE; } -BOOL CPU_USART_TxBufferEmpty( int ComPortNum ) +__weak BOOL CPU_USART_TxBufferEmpty( int ComPortNum ) { return TRUE; } -BOOL CPU_USART_TxShiftRegisterEmpty( int ComPortNum ) +__weak BOOL CPU_USART_TxShiftRegisterEmpty( int ComPortNum ) { return TRUE; } -void CPU_USART_WriteCharToTxBuffer( int ComPortNum, UINT8 c ) +__weak void CPU_USART_WriteCharToTxBuffer( int ComPortNum, UINT8 c ) { } -void CPU_USART_TxBufferEmptyInterruptEnable( int ComPortNum, BOOL Enable ) +__weak void CPU_USART_TxBufferEmptyInterruptEnable( int ComPortNum, BOOL Enable ) { } -BOOL CPU_USART_TxBufferEmptyInterruptState( int ComPortNum ) +__weak BOOL CPU_USART_TxBufferEmptyInterruptState( int ComPortNum ) { return TRUE; } -void CPU_USART_RxBufferFullInterruptEnable( int ComPortNum, BOOL Enable ) +__weak void CPU_USART_RxBufferFullInterruptEnable( int ComPortNum, BOOL Enable ) { } -BOOL CPU_USART_RxBufferFullInterruptState( int ComPortNum ) +__weak BOOL CPU_USART_RxBufferFullInterruptState( int ComPortNum ) { return TRUE; } -void CPU_USART_ProtectPins( int ComPortNum, BOOL On ) +__weak void CPU_USART_ProtectPins( int ComPortNum, BOOL On ) { } -UINT32 CPU_USART_PortsCount() +__weak UINT32 CPU_USART_PortsCount() { return 0; } -void CPU_USART_GetPins( int ComPortNum, GPIO_PIN& rxPin, GPIO_PIN& txPin,GPIO_PIN& ctsPin, GPIO_PIN& rtsPin ) +__weak void CPU_USART_GetPins( int ComPortNum, GPIO_PIN& rxPin, GPIO_PIN& txPin,GPIO_PIN& ctsPin, GPIO_PIN& rtsPin ) { rxPin = GPIO_PIN_NONE; txPin = GPIO_PIN_NONE; @@ -66,27 +66,23 @@ void CPU_USART_GetPins( int ComPortNum, GPIO_PIN& rxPin, GPIO_PIN& txPin,GPIO_PI return; } -BOOL CPU_USART_SupportNonStandardBaudRate ( int ComPortNum ) +__weak BOOL CPU_USART_SupportNonStandardBaudRate ( int ComPortNum ) { return FALSE; } -void CPU_USART_GetBaudrateBoundary( int ComPortNum, UINT32& maxBaudrateHz, UINT32& minBaudrateHz ) +__weak void CPU_USART_GetBaudrateBoundary( int ComPortNum, UINT32& maxBaudrateHz, UINT32& minBaudrateHz ) { maxBaudrateHz = 0; minBaudrateHz = 0; } -BOOL CPU_USART_IsBaudrateSupported( int ComPortNum, UINT32 & BaudrateHz ) +__weak BOOL CPU_USART_IsBaudrateSupported( int ComPortNum, UINT32 & BaudrateHz ) { return FALSE; } -BOOL CPU_USART_TxHandshakeEnabledState( int comPort ) +__weak BOOL CPU_USART_TxHandshakeEnabledState( int comPort ) { return TRUE; } - - - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_USB/stubs_functions_USB.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_USB/stubs_functions_USB.cpp index 64122a0df..0b6ef2e6f 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_USB/stubs_functions_USB.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_USB/stubs_functions_USB.cpp @@ -1,4 +1,4 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +__weak //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) Microsoft Corporation. All rights reserved. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -7,39 +7,37 @@ //--// struct USB_CONTROLLER_STATE; -USB_CONTROLLER_STATE *CPU_USB_GetState( int Controller ) +__weak USB_CONTROLLER_STATE *CPU_USB_GetState( int Controller ) { return NULL; } -HRESULT CPU_USB_Initialize( int Controller ) +__weak HRESULT CPU_USB_Initialize( int Controller ) { return S_OK; } -HRESULT CPU_USB_Uninitialize( int Controller ) +__weak HRESULT CPU_USB_Uninitialize( int Controller ) { return S_OK; } -BOOL CPU_USB_StartOutput( USB_CONTROLLER_STATE* State, int endpoint ) +__weak BOOL CPU_USB_StartOutput( USB_CONTROLLER_STATE* State, int endpoint ) { return FALSE; } -BOOL CPU_USB_RxEnable( USB_CONTROLLER_STATE* State, int endpoint ) +__weak BOOL CPU_USB_RxEnable( USB_CONTROLLER_STATE* State, int endpoint ) { return FALSE; } -BOOL CPU_USB_GetInterruptState() +__weak BOOL CPU_USB_GetInterruptState() { return FALSE; } -BOOL CPU_USB_ProtectPins( int Controller, BOOL On ) +__weak BOOL CPU_USB_ProtectPins( int Controller, BOOL On ) { return FALSE; } - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_WATCHDOG/stubs_functions_WATCHDOG.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_WATCHDOG/stubs_functions_WATCHDOG.cpp index 3c05773ea..f7e2828a7 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_WATCHDOG/stubs_functions_WATCHDOG.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_WATCHDOG/stubs_functions_WATCHDOG.cpp @@ -6,20 +6,19 @@ //--// -HRESULT Watchdog_Enable( UINT32 TimeoutMilliseconds, WATCHDOG_INTERRUPT_CALLBACK isr, void* context ) +__weak HRESULT Watchdog_Enable( UINT32 TimeoutMilliseconds, WATCHDOG_INTERRUPT_CALLBACK isr, void* context ) { return CLR_E_FAIL; } -void Watchdog_Disable() +__weak void Watchdog_Disable() { } -void Watchdog_ResetCpu() +__weak void Watchdog_ResetCpu() { } -void Watchdog_ResetCounter() +__weak void Watchdog_ResetCounter() { } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_analog/stubs_functions_analog.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_analog/stubs_functions_analog.cpp index 4a962c00d..cc64dc400 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_analog/stubs_functions_analog.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_analog/stubs_functions_analog.cpp @@ -6,32 +6,31 @@ //--// -BOOL AD_Initialize( ANALOG_CHANNEL channel, INT32 precisionInBits ) +__weak BOOL AD_Initialize( ANALOG_CHANNEL channel, INT32 precisionInBits ) { return FALSE; } -void AD_Uninitialize( ANALOG_CHANNEL channel ) +__weak void AD_Uninitialize( ANALOG_CHANNEL channel ) { } -INT32 AD_Read( ANALOG_CHANNEL channel ) +__weak INT32 AD_Read( ANALOG_CHANNEL channel ) { return 0; } -UINT32 AD_ADChannels() +__weak UINT32 AD_ADChannels() { return 0; } -GPIO_PIN AD_GetPinForChannel( ANALOG_CHANNEL channel ) +__weak GPIO_PIN AD_GetPinForChannel( ANALOG_CHANNEL channel ) { return GPIO_PIN_NONE; } -BOOL AD_GetAvailablePrecisionsForChannel( ANALOG_CHANNEL channel, INT32* precisions, UINT32& size ) +__weak BOOL AD_GetAvailablePrecisionsForChannel( ANALOG_CHANNEL channel, INT32* precisions, UINT32& size ) { size = 0; return FALSE; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_bootstrap/stubs_functions_bootstrap.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_bootstrap/stubs_functions_bootstrap.cpp index 36f7595be..37ea52f8f 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_bootstrap/stubs_functions_bootstrap.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_bootstrap/stubs_functions_bootstrap.cpp @@ -6,7 +6,6 @@ //--// -void BootstrapCode() +__weak void BootstrapCode() { } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp index 0a4b0f1f0..a8584eb2e 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp @@ -6,47 +6,46 @@ //--// -void CPU_FlushCaches() +__weak void CPU_FlushCaches() { } -void CPU_DrainWriteBuffers() +__weak void CPU_DrainWriteBuffers() { } -void CPU_InvalidateCaches() +__weak void CPU_InvalidateCaches() { } -void CPU_EnableCaches() +__weak void CPU_EnableCaches() { } -void CPU_DisableCaches() +__weak void CPU_DisableCaches() { } //--// -template void CPU_InvalidateAddress( T* address ) +__weak template void CPU_InvalidateAddress( T* address ) { } -template void CPU_InvalidateAddress( volatile T* address ) +__weak template void CPU_InvalidateAddress( volatile T* address ) { } //--// -size_t CPU_GetCachableAddress( size_t address ) +__weak size_t CPU_GetCachableAddress( size_t address ) { return address; } //--// -size_t CPU_GetUncachableAddress( size_t address ) +__weak size_t CPU_GetUncachableAddress( size_t address ) { return address; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_cmu/stubs_functions_cmu.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_cmu/stubs_functions_cmu.cpp index 48bb74488..fc61b4f99 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_cmu/stubs_functions_cmu.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_cmu/stubs_functions_cmu.cpp @@ -5,17 +5,15 @@ #include //--// -UINT32 CPU_CMU_ReadPeripheralClock() +__weak UINT32 CPU_CMU_ReadPeripheralClock() { return 0; } -void CPU_CMU_ClockDivisor( UINT32 Divisor ) +__weak void CPU_CMU_ClockDivisor( UINT32 Divisor ) { } -void CPU_CMU_PeripheralClock( UINT32 Peripheral, BOOL On ) +__weak void CPU_CMU_PeripheralClock( UINT32 Peripheral, BOOL On ) { } - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_gpio/stubs_functions_gpio.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_gpio/stubs_functions_gpio.cpp index d6379daf9..88154de78 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_gpio/stubs_functions_gpio.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_gpio/stubs_functions_gpio.cpp @@ -5,86 +5,86 @@ #include //--// -BOOL CPU_GPIO_Initialize() +__weak BOOL CPU_GPIO_Initialize() { return FALSE; } -BOOL CPU_GPIO_Uninitialize() +__weak BOOL CPU_GPIO_Uninitialize() { return FALSE; } -UINT32 CPU_GPIO_Attributes( GPIO_PIN Pin ) +__weak UINT32 CPU_GPIO_Attributes( GPIO_PIN Pin ) { return GPIO_ATTRIBUTE_NONE; } -void CPU_GPIO_DisablePin( GPIO_PIN Pin, GPIO_RESISTOR ResistorState, UINT32 Direction, GPIO_ALT_MODE AltFunction ) +__weak void CPU_GPIO_DisablePin( GPIO_PIN Pin, GPIO_RESISTOR ResistorState, UINT32 Direction, GPIO_ALT_MODE AltFunction ) { } -void CPU_GPIO_EnableOutputPin( GPIO_PIN Pin, BOOL InitialState ) +__weak void CPU_GPIO_EnableOutputPin( GPIO_PIN Pin, BOOL InitialState ) { } -BOOL CPU_GPIO_EnableInputPin( GPIO_PIN Pin, BOOL GlitchFilterEnable, GPIO_INTERRUPT_SERVICE_ROUTINE PIN_ISR, GPIO_INT_EDGE IntEdge, GPIO_RESISTOR ResistorState ) +__weak BOOL CPU_GPIO_EnableInputPin( GPIO_PIN Pin, BOOL GlitchFilterEnable, GPIO_INTERRUPT_SERVICE_ROUTINE PIN_ISR, GPIO_INT_EDGE IntEdge, GPIO_RESISTOR ResistorState ) { return FALSE; } -BOOL CPU_GPIO_EnableInputPin2( GPIO_PIN Pin, BOOL GlitchFilterEnable, GPIO_INTERRUPT_SERVICE_ROUTINE PIN_ISR, void* ISR_Param, GPIO_INT_EDGE IntEdge, GPIO_RESISTOR ResistorState ) +__weak BOOL CPU_GPIO_EnableInputPin2( GPIO_PIN Pin, BOOL GlitchFilterEnable, GPIO_INTERRUPT_SERVICE_ROUTINE PIN_ISR, void* ISR_Param, GPIO_INT_EDGE IntEdge, GPIO_RESISTOR ResistorState ) { return FALSE; } -BOOL CPU_GPIO_GetPinState( GPIO_PIN Pin ) +__weak BOOL CPU_GPIO_GetPinState( GPIO_PIN Pin ) { return FALSE; } -void CPU_GPIO_SetPinState( GPIO_PIN Pin, BOOL PinState ) +__weak void CPU_GPIO_SetPinState( GPIO_PIN Pin, BOOL PinState ) { } -BOOL CPU_GPIO_PinIsBusy( GPIO_PIN Pin ) +__weak BOOL CPU_GPIO_PinIsBusy( GPIO_PIN Pin ) { return FALSE; } -BOOL CPU_GPIO_ReservePin( GPIO_PIN Pin, BOOL fReserve ) +__weak BOOL CPU_GPIO_ReservePin( GPIO_PIN Pin, BOOL fReserve ) { return FALSE; } -UINT32 CPU_GPIO_GetDebounce() +__weak UINT32 CPU_GPIO_GetDebounce() { return 0; } -BOOL CPU_GPIO_SetDebounce( INT64 debounceTimeMilliseconds ) +__weak BOOL CPU_GPIO_SetDebounce( INT64 debounceTimeMilliseconds ) { return FALSE; } -INT32 CPU_GPIO_GetPinCount() +__weak INT32 CPU_GPIO_GetPinCount() { return 0; } -void CPU_GPIO_GetPinsMap( UINT8* pins, size_t size ) +__weak void CPU_GPIO_GetPinsMap( UINT8* pins, size_t size ) { pins = NULL; } -UINT8 CPU_GPIO_GetSupportedResistorModes( GPIO_PIN pin ) +__weak UINT8 CPU_GPIO_GetSupportedResistorModes( GPIO_PIN pin ) { // as it is stub, return 0; return 0; } -UINT8 CPU_GPIO_GetSupportedInterruptModes( GPIO_PIN pin ) + +__weak UINT8 CPU_GPIO_GetSupportedInterruptModes( GPIO_PIN pin ) { // as it is stub, return 0; return 0; } - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_power/stubs_functions_power.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_power/stubs_functions_power.cpp index b4137137d..69461d4be 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_power/stubs_functions_power.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_power/stubs_functions_power.cpp @@ -6,7 +6,7 @@ //--// -void HAL_AssertEx() +__weak void HAL_AssertEx() { // cause an abort and let the abort handler take over //*((char*)0xFFFFFFFF) = 'a'; @@ -14,7 +14,7 @@ void HAL_AssertEx() //--// -BOOL CPU_Initialize() +__weak BOOL CPU_Initialize() { return TRUE; } @@ -27,18 +27,15 @@ BOOL CPU_Initialize() //{ //} -void CPU_ChangePowerLevel(POWER_LEVEL level) +__weak void CPU_ChangePowerLevel(POWER_LEVEL level) { } -BOOL CPU_IsSoftRebootSupported () +__weak BOOL CPU_IsSoftRebootSupported () { return FALSE; } - -void CPU_Halt() +__weak void CPU_Halt() { } - - diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_time/stubs_functions_time.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_time/stubs_functions_time.cpp index c7dc78c00..095cd3204 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_time/stubs_functions_time.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_time/stubs_functions_time.cpp @@ -6,95 +6,94 @@ //--// -BOOL HAL_Time_Initialize() +__weak BOOL HAL_Time_Initialize() { return FALSE; } -BOOL HAL_Time_Uninitialize() +__weak BOOL HAL_Time_Uninitialize() { return FALSE; } -UINT64 HAL_Time_CurrentTicks() +__weak UINT64 HAL_Time_CurrentTicks() { return 0; } -INT64 HAL_Time_TicksToTime( UINT64 Ticks ) +__weak INT64 HAL_Time_TicksToTime( UINT64 Ticks ) { return 0; } -INT64 HAL_Time_CurrentTime() +__weak INT64 HAL_Time_CurrentTime() { return 0; } -void HAL_Time_SetCompare( UINT64 CompareValue ) +__weak void HAL_Time_SetCompare( UINT64 CompareValue ) { } -void HAL_Time_Sleep_MicroSeconds( UINT32 uSec ) +__weak void HAL_Time_Sleep_MicroSeconds( UINT32 uSec ) { } -void HAL_Time_Sleep_MicroSeconds_InterruptEnabled( UINT32 uSec ) +__weak void HAL_Time_Sleep_MicroSeconds_InterruptEnabled( UINT32 uSec ) { } -void HAL_Time_GetDriftParameters ( INT32* a, INT32* b, INT64* c ) +__weak void HAL_Time_GetDriftParameters ( INT32* a, INT32* b, INT64* c ) { *a = 1; *b = 1; *c = 0; } -UINT32 CPU_SystemClock() +__weak UINT32 CPU_SystemClock() { return 0; } -UINT32 CPU_TicksPerSecond() +__weak UINT32 CPU_TicksPerSecond() { return 0; } -UINT64 CPU_MillisecondsToTicks( UINT64 Ticks ) +__weak UINT64 CPU_MillisecondsToTicks( UINT64 Ticks ) { return 0; } -UINT64 CPU_MillisecondsToTicks( UINT32 Ticks32 ) +__weak UINT64 CPU_MillisecondsToTicks( UINT32 Ticks32 ) { return 0; } -UINT64 CPU_MicrosecondsToTicks( UINT64 uSec ) +__weak UINT64 CPU_MicrosecondsToTicks( UINT64 uSec ) { return 0; } -UINT32 CPU_MicrosecondsToTicks( UINT32 uSec ) +__weak UINT32 CPU_MicrosecondsToTicks( UINT32 uSec ) { return 0; } -UINT32 CPU_MicrosecondsToSystemClocks( UINT32 uSec ) +__weak UINT32 CPU_MicrosecondsToSystemClocks( UINT32 uSec ) { return 0; } -UINT64 CPU_TicksToTime( UINT64 Ticks ) +__weak UINT64 CPU_TicksToTime( UINT64 Ticks ) { return 0; } -UINT64 CPU_TicksToTime( UINT32 Ticks32 ) +__weak UINT64 CPU_TicksToTime( UINT32 Ticks32 ) { return 0; } - diff --git a/DeviceCode/Drivers/Stubs/VirtualKey/virtualkey_stubs.cpp b/DeviceCode/Drivers/Stubs/VirtualKey/virtualkey_stubs.cpp index 9d20823b5..022744c13 100644 --- a/DeviceCode/Drivers/Stubs/VirtualKey/virtualkey_stubs.cpp +++ b/DeviceCode/Drivers/Stubs/VirtualKey/virtualkey_stubs.cpp @@ -4,8 +4,7 @@ #include -GPIO_PIN VirtualKey_GetPins( UINT32 virtualKey) +__weak GPIO_PIN VirtualKey_GetPins( UINT32 virtualKey) { return GPIO_PIN_NONE; } - diff --git a/DeviceCode/Drivers/Thermistor/stubs/Thermistor_stubs_functions.cpp b/DeviceCode/Drivers/Thermistor/stubs/Thermistor_stubs_functions.cpp index 193f1a2e7..0cacaa136 100644 --- a/DeviceCode/Drivers/Thermistor/stubs/Thermistor_stubs_functions.cpp +++ b/DeviceCode/Drivers/Thermistor/stubs/Thermistor_stubs_functions.cpp @@ -6,9 +6,7 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// -INT32 Thermistor_ResistanceToTemperature( UINT32 R_Thermistor, UINT32 R_Nominal, INT32 T_Nominal_x100, INT32 B_VAL ) +__weak INT32 Thermistor_ResistanceToTemperature( UINT32 R_Thermistor, UINT32 R_Nominal, INT32 T_Nominal_x100, INT32 B_VAL ) { return 250; // 25.0 C } - - diff --git a/DeviceCode/Drivers/TimeService/stubs/timeservice_stubs_functions.cpp b/DeviceCode/Drivers/TimeService/stubs/timeservice_stubs_functions.cpp index 0a3508b0b..6bca24ee4 100644 --- a/DeviceCode/Drivers/TimeService/stubs/timeservice_stubs_functions.cpp +++ b/DeviceCode/Drivers/TimeService/stubs/timeservice_stubs_functions.cpp @@ -7,12 +7,12 @@ //--// -INT32 HAL_TIMESERVICE_GetTimeFromSNTPServer(UINT8* serverIP, SYSTEMTIME* systemTime) +__weak INT32 HAL_TIMESERVICE_GetTimeFromSNTPServer(UINT8* serverIP, SYSTEMTIME* systemTime) { return -1; } -INT32 HAL_TIMESERVICE_GetTimeFromSNTPServerList(UINT8* serverIP, INT32 serverNum, SYSTEMTIME* systemTime) +__weak INT32 HAL_TIMESERVICE_GetTimeFromSNTPServerList(UINT8* serverIP, INT32 serverNum, SYSTEMTIME* systemTime) { return -1; } diff --git a/DeviceCode/Drivers/TouchPanel/stubs/touchpanel_stubs_functions.cpp b/DeviceCode/Drivers/TouchPanel/stubs/touchpanel_stubs_functions.cpp index 1d45fc827..8b7f973a6 100644 --- a/DeviceCode/Drivers/TouchPanel/stubs/touchpanel_stubs_functions.cpp +++ b/DeviceCode/Drivers/TouchPanel/stubs/touchpanel_stubs_functions.cpp @@ -6,21 +6,21 @@ //--// -BOOL HAL_TOUCH_PANEL_Enable(GPIO_INTERRUPT_SERVICE_ROUTINE touchIsrProc) +__weak BOOL HAL_TOUCH_PANEL_Enable(GPIO_INTERRUPT_SERVICE_ROUTINE touchIsrProc) { return FALSE; } -BOOL HAL_TOUCH_PANEL_Disable() +__weak BOOL HAL_TOUCH_PANEL_Disable() { return FALSE; } -void HAL_TOUCH_PANEL_GetPoint( TOUCH_PANEL_SAMPLE_FLAGS* pTipState, int* pSource, int* pUnCalX, int* pUnCalY) +__weak void HAL_TOUCH_PANEL_GetPoint( TOUCH_PANEL_SAMPLE_FLAGS* pTipState, int* pSource, int* pUnCalX, int* pUnCalY) { } -HRESULT HAL_TOUCH_PANEL_GetDeviceCaps(unsigned int iIndex, void* lpOutput) +__weak HRESULT HAL_TOUCH_PANEL_GetDeviceCaps(unsigned int iIndex, void* lpOutput) { return 0; // return CLR_E_NOTIMPL; diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp index e9fe1b4dc..e81e98bf3 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -319,14 +319,15 @@ BOOL CPU_GPIO_Initialize( ) EXTI->IMR = 0; // disable all external interrups; - - CPU_INTC_ActivateInterrupt( EXTI0_IRQn, GPIO_Interrupt0, 0 ); - CPU_INTC_ActivateInterrupt( EXTI1_IRQn, GPIO_Interrupt1, 0 ); - CPU_INTC_ActivateInterrupt( EXTI2_IRQn, GPIO_Interrupt2, 0 ); - CPU_INTC_ActivateInterrupt( EXTI3_IRQn, GPIO_Interrupt3, 0 ); - CPU_INTC_ActivateInterrupt( EXTI4_IRQn, GPIO_Interrupt4, 0 ); - CPU_INTC_ActivateInterrupt( EXTI9_5_IRQn, GPIO_Interrupt5, 0 ); - CPU_INTC_ActivateInterrupt( EXTI15_10_IRQn, GPIO_Interrupt10, 0 ); + + // FIXME + // CPU_INTC_ActivateInterrupt( EXTI0_IRQn, GPIO_Interrupt0, 0 ); + // CPU_INTC_ActivateInterrupt( EXTI1_IRQn, GPIO_Interrupt1, 0 ); + // CPU_INTC_ActivateInterrupt( EXTI2_IRQn, GPIO_Interrupt2, 0 ); + // CPU_INTC_ActivateInterrupt( EXTI3_IRQn, GPIO_Interrupt3, 0 ); + // CPU_INTC_ActivateInterrupt( EXTI4_IRQn, GPIO_Interrupt4, 0 ); + // CPU_INTC_ActivateInterrupt( EXTI9_5_IRQn, GPIO_Interrupt5, 0 ); + // CPU_INTC_ActivateInterrupt( EXTI15_10_IRQn, GPIO_Interrupt10, 0 ); return TRUE; } @@ -341,13 +342,14 @@ BOOL CPU_GPIO_Uninitialize( ) } EXTI->IMR = 0; // disable all external interrups; - CPU_INTC_DeactivateInterrupt( EXTI0_IRQn ); - CPU_INTC_DeactivateInterrupt( EXTI1_IRQn ); - CPU_INTC_DeactivateInterrupt( EXTI2_IRQn ); - CPU_INTC_DeactivateInterrupt( EXTI3_IRQn ); - CPU_INTC_DeactivateInterrupt( EXTI4_IRQn ); - CPU_INTC_DeactivateInterrupt( EXTI9_5_IRQn ); - CPU_INTC_DeactivateInterrupt( EXTI15_10_IRQn ); + // FIXME + // CPU_INTC_DeactivateInterrupt( EXTI0_IRQn ); + // CPU_INTC_DeactivateInterrupt( EXTI1_IRQn ); + // CPU_INTC_DeactivateInterrupt( EXTI2_IRQn ); + // CPU_INTC_DeactivateInterrupt( EXTI3_IRQn ); + // CPU_INTC_DeactivateInterrupt( EXTI4_IRQn ); + // CPU_INTC_DeactivateInterrupt( EXTI9_5_IRQn ); + // CPU_INTC_DeactivateInterrupt( EXTI15_10_IRQn ); return TRUE; } diff --git a/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelDriver_stubs.cpp b/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelDriver_stubs.cpp index 07a06b8fc..67035b029 100644 --- a/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelDriver_stubs.cpp +++ b/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelDriver_stubs.cpp @@ -47,7 +47,7 @@ // Returns: TRUE(1): presense pulse(s) detected, device(s) reset // FALSE(0): no presense pulses detected // -SMALLINT owTouchReset(int portnum) +__weak SMALLINT owTouchReset(int portnum) { return FALSE; //no presense pulses detected } @@ -65,7 +65,7 @@ SMALLINT owTouchReset(int portnum) // Returns: 0: 0 bit read from sendbit // 1: 1 bit read from sendbit // -SMALLINT owTouchBit(int portnum, SMALLINT sendbit) +__weak SMALLINT owTouchBit(int portnum, SMALLINT sendbit) { return 0; } @@ -82,7 +82,7 @@ SMALLINT owTouchBit(int portnum, SMALLINT sendbit) // // Returns: 8 bits read from sendbyte // -SMALLINT owTouchByte(int portnum, SMALLINT sendbyte) +__weak SMALLINT owTouchByte(int portnum, SMALLINT sendbyte) { return 0; } @@ -99,7 +99,7 @@ SMALLINT owTouchByte(int portnum, SMALLINT sendbyte) // Returns: TRUE: bytes written and echo was the same // FALSE: echo was not the same // -SMALLINT owWriteByte(int portnum, SMALLINT sendbyte) +__weak SMALLINT owWriteByte(int portnum, SMALLINT sendbyte) { return FALSE; } @@ -113,7 +113,7 @@ SMALLINT owWriteByte(int portnum, SMALLINT sendbyte) // // Returns: 8 bytes read from 1-Wire Net // -SMALLINT owReadByte(int portnum) +__weak SMALLINT owReadByte(int portnum) { return 0; } @@ -129,7 +129,7 @@ SMALLINT owReadByte(int portnum) // // Returns: current 1-Wire Net speed // -SMALLINT owSpeed(int portnum, SMALLINT new_speed) +__weak SMALLINT owSpeed(int portnum, SMALLINT new_speed) { return 0; } @@ -149,7 +149,7 @@ SMALLINT owSpeed(int portnum, SMALLINT new_speed) // Returns: current 1-Wire Net level // // Note: Strong and Program not supported on 520 target. -SMALLINT owLevel(int portnum, SMALLINT new_level) +__weak SMALLINT owLevel(int portnum, SMALLINT new_level) { return 0x00; } @@ -164,7 +164,7 @@ SMALLINT owLevel(int portnum, SMALLINT new_level) // Returns: TRUE successful // FALSE program voltage not available // -SMALLINT owProgramPulse(int portnum) +__weak SMALLINT owProgramPulse(int portnum) { return 0; } @@ -183,7 +183,7 @@ SMALLINT owProgramPulse(int portnum) // Returns: TRUE: bytes written and echo was the same // FALSE: echo was not the same // -SMALLINT owWriteBytePower(int portnum, SMALLINT sendbyte) +__weak SMALLINT owWriteBytePower(int portnum, SMALLINT sendbyte) { // not supported on the by the DS520 return FALSE; @@ -203,7 +203,7 @@ SMALLINT owWriteBytePower(int portnum, SMALLINT sendbyte) // Returns: TRUE: bit written and response correct, strong pullup now on // FALSE: response incorrect // -SMALLINT owReadBitPower(int portnum, SMALLINT applyPowerResponse) +__weak SMALLINT owReadBitPower(int portnum, SMALLINT applyPowerResponse) { // not supported on the by the DS520 return FALSE; @@ -217,7 +217,7 @@ SMALLINT owReadBitPower(int portnum, SMALLINT applyPowerResponse) // // Returns: TRUE if adapter is capable of delivering power. // -SMALLINT owHasPowerDelivery(int portnum) +__weak SMALLINT owHasPowerDelivery(int portnum) { // add adapter specific code here return FALSE; @@ -231,7 +231,7 @@ SMALLINT owHasPowerDelivery(int portnum) // // Returns: TRUE if adapter is capable of over drive. // -SMALLINT owHasOverDrive(int portnum) +__weak SMALLINT owHasOverDrive(int portnum) { // add adapter specific code here return FALSE; @@ -245,7 +245,7 @@ SMALLINT owHasOverDrive(int portnum) // // Returns: TRUE program volatage available // FALSE program voltage not available -SMALLINT owHasProgramPulse(int portnum) +__weak SMALLINT owHasProgramPulse(int portnum) { // add adapter specific code here return FALSE; diff --git a/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelSession_stubs.cpp b/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelSession_stubs.cpp index 449fc2c47..3dcf36663 100644 --- a/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelSession_stubs.cpp +++ b/DeviceCode/pal/OneWire/Stubs/OneWireLinkLevelSession_stubs.cpp @@ -47,7 +47,7 @@ // // Returns: FALSE - failed // -SMALLINT owAcquire(int portnum, char *port_zstr) +__weak SMALLINT owAcquire(int portnum, char *port_zstr) { return (FALSE); } @@ -58,9 +58,7 @@ SMALLINT owAcquire(int portnum, char *port_zstr) // 'portnum' - number 0 to MAX_PORTNUM-1. This number is provided to // indicate the symbolic port number. // -void owRelease(int portnum) +__weak void owRelease(int portnum) { portnum = 0; } - - diff --git a/DeviceCode/pal/OneWire/Stubs/ownet_stubs.cpp b/DeviceCode/pal/OneWire/Stubs/ownet_stubs.cpp index 006f5995b..782ded7e2 100644 --- a/DeviceCode/pal/OneWire/Stubs/ownet_stubs.cpp +++ b/DeviceCode/pal/OneWire/Stubs/ownet_stubs.cpp @@ -60,7 +60,7 @@ // Serial Number placed in the global SerialNum[portnum] // FALSE (0): There are no devices on the 1-Wire Net. // -SMALLINT owFirst(int portnum, SMALLINT do_reset, SMALLINT alarm_only) +__weak SMALLINT owFirst(int portnum, SMALLINT do_reset, SMALLINT alarm_only) { return FALSE; @@ -89,7 +89,7 @@ SMALLINT owFirst(int portnum, SMALLINT do_reset, SMALLINT alarm_only) // last search was the last device or there // are no devices on the 1-Wire Net. // -SMALLINT owNext(int portnum, SMALLINT do_reset, SMALLINT alarm_only) +__weak SMALLINT owNext(int portnum, SMALLINT do_reset, SMALLINT alarm_only) { return FALSE; } @@ -112,6 +112,6 @@ SMALLINT owNext(int portnum, SMALLINT do_reset, SMALLINT alarm_only) // 'do_read' - flag to indicate reading (1) or setting (0) the current // serial number. // -void owSerialNum(int portnum, uchar *serialnum_buf, SMALLINT do_read) +__weak void owSerialNum(int portnum, uchar *serialnum_buf, SMALLINT do_read) { } diff --git a/DeviceCode/pal/PKCS11/Storage/stubs/PKCS11_storage_stub.cpp b/DeviceCode/pal/PKCS11/Storage/stubs/PKCS11_storage_stub.cpp index 7c1a690f1..c8f1f4971 100644 --- a/DeviceCode/pal/PKCS11/Storage/stubs/PKCS11_storage_stub.cpp +++ b/DeviceCode/pal/PKCS11/Storage/stubs/PKCS11_storage_stub.cpp @@ -4,24 +4,28 @@ #include "PKCS11_storage_stub.h" //--// -BOOL SecureStorage_Stub::CreateFile( LPCSTR fileName , LPCSTR groupName, UINT32 fileType, UINT8* data, UINT32 dataLength ) +__weak BOOL SecureStorage_Stub::CreateFile( LPCSTR fileName , LPCSTR groupName, UINT32 fileType, UINT8* data, UINT32 dataLength ) { return FALSE; } -BOOL SecureStorage_Stub::ReadFile( LPCSTR fileName , LPCSTR groupName, UINT32& fileType, UINT8* data, UINT32& dataLength ) + +__weak BOOL SecureStorage_Stub::ReadFile( LPCSTR fileName , LPCSTR groupName, UINT32& fileType, UINT8* data, UINT32& dataLength ) { return FALSE; } -BOOL SecureStorage_Stub::GetFileEnum( LPCSTR groupName, UINT32 fileType , FileEnumCtx& enumCtx ) + +__weak BOOL SecureStorage_Stub::GetFileEnum( LPCSTR groupName, UINT32 fileType , FileEnumCtx& enumCtx ) { return FALSE; } -BOOL SecureStorage_Stub::GetNextFile( FileEnumCtx& enumCtx, CHAR*fileName,UINT32 fileNameLen ) + +__weak BOOL SecureStorage_Stub::GetNextFile( FileEnumCtx& enumCtx, CHAR*fileName,UINT32 fileNameLen ) { return FALSE; } -BOOL SecureStorage_Stub::Delete( LPCSTR fileName , LPCSTR groupName ) -{ + +__weak BOOL SecureStorage_Stub::Delete( LPCSTR fileName , LPCSTR groupName ) +{ + return FALSE; } - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_Token_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_Token_stub.cpp index 023f08dba..5e5254d7d 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_Token_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_Token_stub.cpp @@ -1,23 +1,22 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Token_stub::Initialize() +__weak CK_RV PKCS11_Token_stub::Initialize() { return CKR_OK; } -CK_RV PKCS11_Token_stub::Uninitialize() + +__weak CK_RV PKCS11_Token_stub::Uninitialize() { return CKR_OK; } -CK_RV PKCS11_Token_stub::InitializeToken(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen, CK_UTF8CHAR_PTR pLabel, CK_ULONG ulLabelLen) +__weak CK_RV PKCS11_Token_stub::InitializeToken(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen, CK_UTF8CHAR_PTR pLabel, CK_ULONG ulLabelLen) { return CKR_OK; } -CK_RV PKCS11_Token_stub::GetDeviceError(CK_ULONG_PTR pErrorCode) +__weak CK_RV PKCS11_Token_stub::GetDeviceError(CK_ULONG_PTR pErrorCode) { *pErrorCode = 0; return CKR_OK; } - - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_digest_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_digest_stub.cpp index 5fd357ab7..dc10126aa 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_digest_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_digest_stub.cpp @@ -1,27 +1,26 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Digest_stub::DigestInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism) +__weak CK_RV PKCS11_Digest_stub::DigestInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Digest_stub::Digest(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen) +__weak CK_RV PKCS11_Digest_stub::Digest(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Digest_stub::Update(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen) +__weak CK_RV PKCS11_Digest_stub::Update(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Digest_stub::DigestKey(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hKey) +__weak CK_RV PKCS11_Digest_stub::DigestKey(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Digest_stub::Final(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen) +__weak CK_RV PKCS11_Digest_stub::Final(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen) { return CKR_FUNCTION_NOT_SUPPORTED; } - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_encryption_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_encryption_stub.cpp index bfda96207..fc3c42fc4 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_encryption_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_encryption_stub.cpp @@ -1,43 +1,41 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Encryption_stub::EncryptInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pEncryptMech, CK_OBJECT_HANDLE hKey) +__weak CK_RV PKCS11_Encryption_stub::EncryptInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pEncryptMech, CK_OBJECT_HANDLE hKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::Encrypt(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen) +__weak CK_RV PKCS11_Encryption_stub::Encrypt(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::EncryptUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen) +__weak CK_RV PKCS11_Encryption_stub::EncryptUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart, CK_ULONG_PTR pulEncryptedPartLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::EncryptFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen) +__weak CK_RV PKCS11_Encryption_stub::EncryptFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pulLastEncryptedPartLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::DecryptInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pDecryptMech, CK_OBJECT_HANDLE hKey) +__weak CK_RV PKCS11_Encryption_stub::DecryptInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pDecryptMech, CK_OBJECT_HANDLE hKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::Decrypt(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen) +__weak CK_RV PKCS11_Encryption_stub::Decrypt(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::DecryptUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen) +__weak CK_RV PKCS11_Encryption_stub::DecryptUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pEncryptedPart, CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart, CK_ULONG_PTR pulPartLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Encryption_stub::DecryptFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen) +__weak CK_RV PKCS11_Encryption_stub::DecryptFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pLastPart, CK_ULONG_PTR pulLastPartLen) { return CKR_FUNCTION_NOT_SUPPORTED; } - - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_keys_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_keys_stub.cpp index 8be161bda..63fa70a83 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_keys_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_keys_stub.cpp @@ -1,11 +1,11 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Keys_stub::GenerateKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::GenerateKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::GenerateKeyPair(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, +__weak CK_RV PKCS11_Keys_stub::GenerateKeyPair(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pPublicKeyTemplate , CK_ULONG ulPublicCount, CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateCount, CK_OBJECT_HANDLE_PTR phPublicKey , CK_OBJECT_HANDLE_PTR phPrivateKey) @@ -13,43 +13,42 @@ CK_RV PKCS11_Keys_stub::GenerateKeyPair(Cryptoki_Session_Context* pSessionCtx, C return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::WrapKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey, CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen) +__weak CK_RV PKCS11_Keys_stub::WrapKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey, CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pulWrappedKeyLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::UnwrapKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey, CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::UnwrapKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey, CK_ULONG ulWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::DeriveKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::DeriveKey(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::LoadKeyBlob(Cryptoki_Session_Context* pSessionCtx, const PBYTE pKey, CK_ULONG keyLen, CK_KEY_TYPE keyType, KEY_ATTRIB keyAttrib, CK_OBJECT_HANDLE_PTR phKey ) +__weak CK_RV PKCS11_Keys_stub::LoadKeyBlob(Cryptoki_Session_Context* pSessionCtx, const PBYTE pKey, CK_ULONG keyLen, CK_KEY_TYPE keyType, KEY_ATTRIB keyAttrib, CK_OBJECT_HANDLE_PTR phKey ) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::LoadSecretKey(Cryptoki_Session_Context* pSessionCtx, CK_KEY_TYPE keyType, const UINT8* pKey, CK_ULONG ulKeyLength, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::LoadSecretKey(Cryptoki_Session_Context* pSessionCtx, CK_KEY_TYPE keyType, const UINT8* pKey, CK_ULONG ulKeyLength, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::LoadRsaKey(Cryptoki_Session_Context* pSessionCtx, const RsaKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::LoadRsaKey(Cryptoki_Session_Context* pSessionCtx, const RsaKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::LoadDsaKey(Cryptoki_Session_Context* pSessionCtx, const DsaKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::LoadDsaKey(Cryptoki_Session_Context* pSessionCtx, const DsaKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Keys_stub::LoadEcKey(Cryptoki_Session_Context* pSessionCtx, const EcKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey) +__weak CK_RV PKCS11_Keys_stub::LoadEcKey(Cryptoki_Session_Context* pSessionCtx, const EcKeyData& keyData, CK_BBOOL isPrivate, CK_OBJECT_HANDLE_PTR phKey) { return CKR_FUNCTION_NOT_SUPPORTED; } - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_objects_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_objects_stub.cpp index 4a58a6d40..5340c177c 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_objects_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_objects_stub.cpp @@ -1,47 +1,46 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Objects_stub::CreateObject(Cryptoki_Session_Context* pSessionCtx, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject) +__weak CK_RV PKCS11_Objects_stub::CreateObject(Cryptoki_Session_Context* pSessionCtx, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::CopyObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phNewObject) +__weak CK_RV PKCS11_Objects_stub::CopyObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phNewObject) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::DestroyObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject) +__weak CK_RV PKCS11_Objects_stub::DestroyObject(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::GetObjectSize(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ULONG_PTR pulSize) +__weak CK_RV PKCS11_Objects_stub::GetObjectSize(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ULONG_PTR pulSize) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::GetAttributeValue(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) +__weak CK_RV PKCS11_Objects_stub::GetAttributeValue(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::SetAttributeValue(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) +__weak CK_RV PKCS11_Objects_stub::SetAttributeValue(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::FindObjectsInit(Cryptoki_Session_Context* pSessionCtx, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) +__weak CK_RV PKCS11_Objects_stub::FindObjectsInit(Cryptoki_Session_Context* pSessionCtx, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::FindObjects(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE_PTR phObjects, CK_ULONG ulMaxCount, CK_ULONG_PTR pulObjectCount) +__weak CK_RV PKCS11_Objects_stub::FindObjects(Cryptoki_Session_Context* pSessionCtx, CK_OBJECT_HANDLE_PTR phObjects, CK_ULONG ulMaxCount, CK_ULONG_PTR pulObjectCount) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Objects_stub::FindObjectsFinal(Cryptoki_Session_Context* pSessionCtx) +__weak CK_RV PKCS11_Objects_stub::FindObjectsFinal(Cryptoki_Session_Context* pSessionCtx) { return CKR_FUNCTION_NOT_SUPPORTED; } - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_random_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_random_stub.cpp index ea15fadcb..8d06b5332 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_random_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_random_stub.cpp @@ -1,12 +1,11 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Random_stub::SeedRandom(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen) +__weak CK_RV PKCS11_Random_stub::SeedRandom(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSeed, CK_ULONG ulSeedLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Random_stub::GenerateRandom(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pRandomData, CK_ULONG ulRandomLen) +__weak CK_RV PKCS11_Random_stub::GenerateRandom(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pRandomData, CK_ULONG ulRandomLen) { return CKR_FUNCTION_NOT_SUPPORTED; } - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_session_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_session_stub.cpp index ab948cb32..8d0e01938 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_session_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_session_stub.cpp @@ -1,32 +1,31 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Session_stub::InitPin(Cryptoki_Session_Context* pSessionCtx, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen) +__weak CK_RV PKCS11_Session_stub::InitPin(Cryptoki_Session_Context* pSessionCtx, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Session_stub::SetPin(Cryptoki_Session_Context* pSessionCtx, CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewPinLen) +__weak CK_RV PKCS11_Session_stub::SetPin(Cryptoki_Session_Context* pSessionCtx, CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewPinLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Session_stub::OpenSession(Cryptoki_Session_Context* pSessionCtx, CK_BBOOL fReadWrite) +__weak CK_RV PKCS11_Session_stub::OpenSession(Cryptoki_Session_Context* pSessionCtx, CK_BBOOL fReadWrite) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Session_stub::CloseSession(Cryptoki_Session_Context* pSessionCtx) +__weak CK_RV PKCS11_Session_stub::CloseSession(Cryptoki_Session_Context* pSessionCtx) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Session_stub::Login(Cryptoki_Session_Context* pSessionCtx, CK_USER_TYPE userType, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen) +__weak CK_RV PKCS11_Session_stub::Login(Cryptoki_Session_Context* pSessionCtx, CK_USER_TYPE userType, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Session_stub::Logout(Cryptoki_Session_Context* pSessionCtx) +__weak CK_RV PKCS11_Session_stub::Logout(Cryptoki_Session_Context* pSessionCtx) { return CKR_FUNCTION_NOT_SUPPORTED; } - diff --git a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_signature_stub.cpp b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_signature_stub.cpp index fd4adf045..223301b22 100644 --- a/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_signature_stub.cpp +++ b/DeviceCode/pal/PKCS11/Tokens/stubs/PKCS11_signature_stub.cpp @@ -1,43 +1,41 @@ #include "pkcs11_stub.h" -CK_RV PKCS11_Signature_stub::SignInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) +__weak CK_RV PKCS11_Signature_stub::SignInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::Sign(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) +__weak CK_RV PKCS11_Signature_stub::Sign(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::SignUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) +__weak CK_RV PKCS11_Signature_stub::SignUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::SignFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) +__weak CK_RV PKCS11_Signature_stub::SignFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::VerifyInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) +__weak CK_RV PKCS11_Signature_stub::VerifyInit(Cryptoki_Session_Context* pSessionCtx, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::Verify(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen) +__weak CK_RV PKCS11_Signature_stub::Verify(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::VerifyUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) +__weak CK_RV PKCS11_Signature_stub::VerifyUpdate(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pPart, CK_ULONG ulPartLen) { return CKR_FUNCTION_NOT_SUPPORTED; } -CK_RV PKCS11_Signature_stub::VerifyFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen) +__weak CK_RV PKCS11_Signature_stub::VerifyFinal(Cryptoki_Session_Context* pSessionCtx, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen) { return CKR_FUNCTION_NOT_SUPPORTED; } - - diff --git a/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp b/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp index 05c40f48c..87eb9aa71 100644 --- a/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp +++ b/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp @@ -6,20 +6,20 @@ //--// -void SimpleHeap_Initialize( void* buffer, UINT32 length ) +__weak void SimpleHeap_Initialize( void* buffer, UINT32 length ) { } -void* SimpleHeap_Allocate( size_t len ) +__weak void* SimpleHeap_Allocate( size_t len ) { return NULL; } -void SimpleHeap_Release( void* ptr ) +__weak void SimpleHeap_Release( void* ptr ) { } -void* SimpleHeap_ReAllocate( void* ptr, size_t len ) +__weak void* SimpleHeap_ReAllocate( void* ptr, size_t len ) { return NULL; } diff --git a/DeviceCode/pal/SimpleStorage/stubs/SimpleStorage_stub.cpp b/DeviceCode/pal/SimpleStorage/stubs/SimpleStorage_stub.cpp index 20616c57b..654abf63a 100644 --- a/DeviceCode/pal/SimpleStorage/stubs/SimpleStorage_stub.cpp +++ b/DeviceCode/pal/SimpleStorage/stubs/SimpleStorage_stub.cpp @@ -12,7 +12,7 @@ BlockStorageStream SimpleStorage::s_BsStreamB; //--// -BOOL SimpleStorage::Initialize() +__weak BOOL SimpleStorage::Initialize() { BOOL retVal = s_IsInitialized; @@ -57,7 +57,7 @@ BOOL SimpleStorage::Initialize() return retVal; } -BOOL SimpleStorage::ReadToNextFile(SIMPLESTORAGE_FILE_HEADER& header) +__weak BOOL SimpleStorage::ReadToNextFile(SIMPLESTORAGE_FILE_HEADER& header) { UINT32 crc = 0; @@ -101,7 +101,7 @@ BOOL SimpleStorage::ReadToNextFile(SIMPLESTORAGE_FILE_HEADER& header) return FALSE; } -BOOL SimpleStorage::Compact() +__weak BOOL SimpleStorage::Compact() { GLOBAL_LOCK(irq); BlockStorageStream* pFreeBlock = (s_pCurrentStream == &s_BsStreamA) ? &s_BsStreamB : &s_BsStreamA; @@ -153,7 +153,7 @@ BOOL SimpleStorage::Compact() return TRUE; } -BOOL SimpleStorage::SeekToFile(LPCSTR fileName, LPCSTR groupName, SIMPLESTORAGE_FILE_HEADER& header, BOOL createNew) +__weak BOOL SimpleStorage::SeekToFile(LPCSTR fileName, LPCSTR groupName, SIMPLESTORAGE_FILE_HEADER& header, BOOL createNew) { s_pCurrentStream->Seek(sizeof(SIMPLESTORAGE_BLOCK_HEADER), BlockStorageStream::SeekBegin); @@ -184,7 +184,7 @@ BOOL SimpleStorage::SeekToFile(LPCSTR fileName, LPCSTR groupName, SIMPLESTORAGE_ return FALSE; } -BOOL SimpleStorage::Create( LPCSTR fileName, LPCSTR groupName, UINT32 fileType, UINT8* data, UINT32 dataLength ) +__weak BOOL SimpleStorage::Create( LPCSTR fileName, LPCSTR groupName, UINT32 fileType, UINT8* data, UINT32 dataLength ) { BOOL retVal = FALSE; SIMPLESTORAGE_FILE_HEADER header; @@ -232,7 +232,7 @@ BOOL SimpleStorage::Create( LPCSTR fileName, LPCSTR groupName, UINT32 fileType, return retVal; } -BOOL SimpleStorage::Read ( LPCSTR fileName, LPCSTR groupName, UINT32& fileType, UINT8* data, UINT32& dataLength ) +__weak BOOL SimpleStorage::Read ( LPCSTR fileName, LPCSTR groupName, UINT32& fileType, UINT8* data, UINT32& dataLength ) { SIMPLESTORAGE_FILE_HEADER header; @@ -262,7 +262,7 @@ BOOL SimpleStorage::Read ( LPCSTR fileName, LPCSTR groupName, UINT32& fileType } -BOOL SimpleStorage::GetFileEnum( LPCSTR groupName, UINT32 fileType , FileEnumCtx& enumCtx ) +__weak BOOL SimpleStorage::GetFileEnum( LPCSTR groupName, UINT32 fileType , FileEnumCtx& enumCtx ) { if(groupName == NULL) return FALSE; @@ -273,7 +273,7 @@ BOOL SimpleStorage::GetFileEnum( LPCSTR groupName, UINT32 fileType , FileEnumCtx return TRUE; } -BOOL SimpleStorage::GetNextFile( FileEnumCtx& enumCtx, CHAR* fileName, UINT32 fileNameLen ) +__weak BOOL SimpleStorage::GetNextFile( FileEnumCtx& enumCtx, CHAR* fileName, UINT32 fileNameLen ) { BOOL fRes = FALSE; SIMPLESTORAGE_FILE_HEADER header; @@ -306,7 +306,7 @@ BOOL SimpleStorage::GetNextFile( FileEnumCtx& enumCtx, CHAR* fileName, UINT32 fi return fRes; } -BOOL SimpleStorage::Delete ( LPCSTR fileName, LPCSTR groupName ) +__weak BOOL SimpleStorage::Delete ( LPCSTR fileName, LPCSTR groupName ) { SIMPLESTORAGE_FILE_HEADER header; @@ -320,4 +320,3 @@ BOOL SimpleStorage::Delete ( LPCSTR fileName, LPCSTR groupName ) return s_pCurrentStream->Write((UINT8*)&header, sizeof(header)); } - diff --git a/DeviceCode/pal/StateDebounce/stubs/StateDebounce_stubs.cpp b/DeviceCode/pal/StateDebounce/stubs/StateDebounce_stubs.cpp index f0b8dff87..1299d6ccf 100644 --- a/DeviceCode/pal/StateDebounce/stubs/StateDebounce_stubs.cpp +++ b/DeviceCode/pal/StateDebounce/stubs/StateDebounce_stubs.cpp @@ -6,14 +6,14 @@ /***************************************************************************/ -void HAL_STATE_DEBOUNCE::Initialize( UINT32 debounce_uSec, HAL_CALLBACK_FPN isr ) +__weak void HAL_STATE_DEBOUNCE::Initialize( UINT32 debounce_uSec, HAL_CALLBACK_FPN isr ) { } -void HAL_STATE_DEBOUNCE::Change( UINT32 state ) +__weak void HAL_STATE_DEBOUNCE::Change( UINT32 state ) { } -void HAL_STATE_DEBOUNCE::Abort() +__weak void HAL_STATE_DEBOUNCE::Abort() { } diff --git a/DeviceCode/pal/TouchPanel/stubs/touchpanel_stubs.cpp b/DeviceCode/pal/TouchPanel/stubs/touchpanel_stubs.cpp index 9acaa7083..8ebbae7f2 100644 --- a/DeviceCode/pal/TouchPanel/stubs/touchpanel_stubs.cpp +++ b/DeviceCode/pal/TouchPanel/stubs/touchpanel_stubs.cpp @@ -6,48 +6,47 @@ //--// -HRESULT TOUCH_PANEL_Initialize() +__weak HRESULT TOUCH_PANEL_Initialize() { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_Uninitialize() +__weak HRESULT TOUCH_PANEL_Uninitialize() { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_GetDeviceCaps(UINT32 iIndex, void* lpOutput) +__weak HRESULT TOUCH_PANEL_GetDeviceCaps(UINT32 iIndex, void* lpOutput) { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_ResetCalibration() +__weak HRESULT TOUCH_PANEL_ResetCalibration() { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_SetCalibration( INT32 pointCount, INT16* sx, INT16* sy, INT16* ux, INT16* uy ) +__weak HRESULT TOUCH_PANEL_SetCalibration( INT32 pointCount, INT16* sx, INT16* sy, INT16* ux, INT16* uy ) { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_SetNativeBufferSize(INT32 transientBufferSize, INT32 strokeBufferSize) +__weak HRESULT TOUCH_PANEL_SetNativeBufferSize(INT32 transientBufferSize, INT32 strokeBufferSize) { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_EnableTouchCollection(INT32 flags, INT32 x1, INT32 x2, INT32 y1, INT32 y2, PAL_GFX_Bitmap* bitmap) +__weak HRESULT TOUCH_PANEL_EnableTouchCollection(INT32 flags, INT32 x1, INT32 x2, INT32 y1, INT32 y2, PAL_GFX_Bitmap* bitmap) { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_GetTouchPoints(INT32* pointCount, INT16* sx, INT16* sy) +__weak HRESULT TOUCH_PANEL_GetTouchPoints(INT32* pointCount, INT16* sx, INT16* sy) { return CLR_E_NOTIMPL; } -HRESULT TOUCH_PANEL_GetSetTouchInfo(UINT32 flags, INT32* param1, INT32* param2, INT32* param3) +__weak HRESULT TOUCH_PANEL_GetSetTouchInfo(UINT32 flags, INT32* param1, INT32* param2, INT32* param3) { return CLR_E_NOTIMPL; } - diff --git a/DeviceCode/pal/palevent/Stubs/palevent_stubs.cpp b/DeviceCode/pal/palevent/Stubs/palevent_stubs.cpp index 854cbe600..e4b20a462 100644 --- a/DeviceCode/pal/palevent/Stubs/palevent_stubs.cpp +++ b/DeviceCode/pal/palevent/Stubs/palevent_stubs.cpp @@ -4,24 +4,22 @@ #include -HRESULT PalEvent_Initialize() +__weak HRESULT PalEvent_Initialize() { return CLR_E_NOT_SUPPORTED; } -HRESULT PalEvent_Uninitialize() +__weak HRESULT PalEvent_Uninitialize() { return CLR_E_NOT_SUPPORTED; } -HRESULT PalEvent_Post(unsigned int e, unsigned int param) +__weak HRESULT PalEvent_Post(unsigned int e, unsigned int param) { return CLR_E_NOT_SUPPORTED; } -HRESULT PalEvent_Enlist(PalEventListener* listener) +__weak HRESULT PalEvent_Enlist(PalEventListener* listener) { return CLR_E_NOT_SUPPORTED; } - - diff --git a/DeviceCode/pal/piezo/stubs/piezo_stubs.cpp b/DeviceCode/pal/piezo/stubs/piezo_stubs.cpp index afcbbc0cd..94787ba8d 100644 --- a/DeviceCode/pal/piezo/stubs/piezo_stubs.cpp +++ b/DeviceCode/pal/piezo/stubs/piezo_stubs.cpp @@ -6,21 +6,20 @@ //--// -void Piezo_Initialize() +__weak void Piezo_Initialize() { } -void Piezo_Uninitialize() +__weak void Piezo_Uninitialize() { } -BOOL Piezo_Tone( UINT32 Frequency_Hertz, UINT32 Duration_Milliseconds ) +__weak BOOL Piezo_Tone( UINT32 Frequency_Hertz, UINT32 Duration_Milliseconds ) { return TRUE; } -BOOL Piezo_IsEnabled() +__weak BOOL Piezo_IsEnabled() { return FALSE; } - diff --git a/DeviceCode/pal/time/stubs/time_stubs.cpp b/DeviceCode/pal/time/stubs/time_stubs.cpp index 3667ad4f8..9aaea1814 100644 --- a/DeviceCode/pal/time/stubs/time_stubs.cpp +++ b/DeviceCode/pal/time/stubs/time_stubs.cpp @@ -4,103 +4,102 @@ #include -HRESULT Time_Initialize() +__weak HRESULT Time_Initialize() { return CLR_E_NOTIMPL; } -HRESULT Time_Uninitialize() +__weak HRESULT Time_Uninitialize() { return CLR_E_NOTIMPL; } -INT64 Time_GetUtcTime() +__weak INT64 Time_GetUtcTime() { return 0; } -INT64 Time_SetUtcTime( INT64 UtcTime, bool calibrate ) +__weak INT64 Time_SetUtcTime( INT64 UtcTime, bool calibrate ) { return 0; } -INT64 Time_GetLocalTime() +__weak INT64 Time_GetLocalTime() { return 0; } -INT32 Time_GetTimeZoneOffset() +__weak INT32 Time_GetTimeZoneOffset() { return 0; } -INT32 Time_SetTimeZoneOffset(INT32 offset) +__weak INT32 Time_SetTimeZoneOffset(INT32 offset) { return 0; } -INT64 Time_GetTickCount() +__weak INT64 Time_GetTickCount() { return 0; } -INT64 Time_GetMachineTime() +__weak INT64 Time_GetMachineTime() { return 0; } -BOOL Time_ToSystemTime(INT64 time, SYSTEMTIME* systemTime) +__weak BOOL Time_ToSystemTime(INT64 time, SYSTEMTIME* systemTime) { return FALSE; } -INT64 Time_FromSystemTime(const SYSTEMTIME* systemTime) +__weak INT64 Time_FromSystemTime(const SYSTEMTIME* systemTime) { return 0; } -HRESULT Time_DaysInMonth(INT32 year, INT32 month, INT32* days) +__weak HRESULT Time_DaysInMonth(INT32 year, INT32 month, INT32* days) { return CLR_E_NOTIMPL; } -HRESULT Time_AccDaysInMonth(INT32 year, INT32 month, INT32* days) +__weak HRESULT Time_AccDaysInMonth(INT32 year, INT32 month, INT32* days) { return CLR_E_NOTIMPL; } -BOOL Utility_SafeSprintfV( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, va_list arg ) +__weak BOOL Utility_SafeSprintfV( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, va_list arg ) { return FALSE; } -BOOL Utility_SafeSprintf( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, ... ) +__weak BOOL Utility_SafeSprintf( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, ... ) { return FALSE; } -BOOL Time_TimeSpanToStringEx( const INT64& ticks, LPSTR& buf, size_t& len ) +__weak BOOL Time_TimeSpanToStringEx( const INT64& ticks, LPSTR& buf, size_t& len ) { return FALSE; } -LPCSTR Time_TimeSpanToString( const INT64& ticks ) +__weak LPCSTR Time_TimeSpanToString( const INT64& ticks ) { return NULL; } -BOOL Time_DateTimeToStringEx( const INT64& time, LPSTR& buf, size_t& len ) +__weak BOOL Time_DateTimeToStringEx( const INT64& time, LPSTR& buf, size_t& len ) { return FALSE; } -LPCSTR Time_DateTimeToString( const INT64& time) +__weak LPCSTR Time_DateTimeToString( const INT64& time) { return NULL; } -LPCSTR Time_CurrentDateTimeToString() +__weak LPCSTR Time_CurrentDateTimeToString() { return NULL; } - diff --git a/DeviceCode/pal/timeservice/stubs/timeservice_stubs.cpp b/DeviceCode/pal/timeservice/stubs/timeservice_stubs.cpp index 54460eead..b264a0dd8 100644 --- a/DeviceCode/pal/timeservice/stubs/timeservice_stubs.cpp +++ b/DeviceCode/pal/timeservice/stubs/timeservice_stubs.cpp @@ -4,42 +4,42 @@ #include -HRESULT TimeService_Initialize() +__weak HRESULT TimeService_Initialize() { return CLR_E_NOTIMPL; } -HRESULT TimeService_UnInitialize() +__weak HRESULT TimeService_UnInitialize() { return CLR_E_NOTIMPL; } -HRESULT TimeService_Start() +__weak HRESULT TimeService_Start() { return CLR_E_NOTIMPL; } -HRESULT TimeService_Stop() +__weak HRESULT TimeService_Stop() { return CLR_E_NOTIMPL; } -HRESULT TimeService_Update(UINT32 serverIP, UINT32 tolerance, TimeService_Status* status) +__weak HRESULT TimeService_Update(UINT32 serverIP, UINT32 tolerance, TimeService_Status* status) { return CLR_E_NOTIMPL; } -HRESULT TimeService_GetLastSyncStatus(TimeService_Status* status) +__weak HRESULT TimeService_GetLastSyncStatus(TimeService_Status* status) { return CLR_E_NOTIMPL; } -HRESULT TimeService_LoadSettings(TimeService_Settings* settings) +__weak HRESULT TimeService_LoadSettings(TimeService_Settings* settings) { return CLR_E_NOTIMPL; } -HRESULT TimeService_SaveSettings(TimeService_Settings* settings) +__weak HRESULT TimeService_SaveSettings(TimeService_Settings* settings) { return CLR_E_NOTIMPL; } diff --git a/DeviceCode/pal/watchdog/stubs/Watchdog_stubs.cpp b/DeviceCode/pal/watchdog/stubs/Watchdog_stubs.cpp index 73cc230a9..487dcea49 100644 --- a/DeviceCode/pal/watchdog/stubs/Watchdog_stubs.cpp +++ b/DeviceCode/pal/watchdog/stubs/Watchdog_stubs.cpp @@ -6,27 +6,27 @@ //--// -BOOL Watchdog_GetSetEnabled( BOOL enabled, BOOL fSet ) +__weak BOOL Watchdog_GetSetEnabled( BOOL enabled, BOOL fSet ) { return FALSE; } -UINT32 Watchdog_GetSetTimeout( INT32 timeout_ms , BOOL fSet ) +__weak UINT32 Watchdog_GetSetTimeout( INT32 timeout_ms , BOOL fSet ) { return 0; } -Watchdog_Behavior Watchdog_GetSetBehavior( Watchdog_Behavior behavior, BOOL fSet ) +__weak Watchdog_Behavior Watchdog_GetSetBehavior( Watchdog_Behavior behavior, BOOL fSet ) { return Watchdog_Behavior__None; } -BOOL Watchdog_LastOccurence( INT64& time, INT64& timeout, UINT32& assembly, UINT32& method, BOOL fSet ) +__weak BOOL Watchdog_LastOccurence( INT64& time, INT64& timeout, UINT32& assembly, UINT32& method, BOOL fSet ) { return FALSE; } -void EmulatorHook__Watchdog_Callback() +__weak void EmulatorHook__Watchdog_Callback() { } From 81d91c11ccb2ff8fb8c0d17f7cf2a299501500ba Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 10:58:02 +0000 Subject: [PATCH 067/144] Correct issues with build --- .../Stubs/Processor/stubs_cache/stubs_functions_cache.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp b/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp index a8584eb2e..78dc20643 100644 --- a/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp +++ b/DeviceCode/Drivers/Stubs/Processor/stubs_cache/stubs_functions_cache.cpp @@ -2,6 +2,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#include #include //--// @@ -28,11 +29,11 @@ __weak void CPU_DisableCaches() //--// -__weak template void CPU_InvalidateAddress( T* address ) +template void CPU_InvalidateAddress( T* address ) { } -__weak template void CPU_InvalidateAddress( volatile T* address ) +template void CPU_InvalidateAddress( volatile T* address ) { } From d03b241817b8a64d1becc8487082122a9b1c75b4 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 11:07:56 +0000 Subject: [PATCH 068/144] Add new feature selection: watchdog - add feature to features settings files - update solution projects accordingly - rework HAL projects to always add all stubs projects (now have weak references and will be replaced by actual implementation when appropriate) - rework solution projects to include mandatory and stubs projects --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 48 ++++++++++++------- .../Native/STM32F4xx/dotNetMF_loader.proj | 44 +++++++++++------ .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 39 ++++++++------- .../MCBSTM32F400/TinyBooter/features.settings | 3 +- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 39 ++++++++------- .../MCBSTM32F400/TinyCLR/features.settings | 3 +- .../TinyCLR_NONET/TinyCLR_NONET.proj | 39 ++++++++------- .../TinyCLR_NONET/features.settings | 3 +- .../TinyBooter/TinyBooter.proj | 44 ++++++++--------- .../TinyBooter/features.settings | 1 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 35 +++++++++----- .../TinyCLR/features.settings | 3 +- 12 files changed, 183 insertions(+), 118 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index c46844192..5ec24389a 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -61,9 +61,6 @@
- - - @@ -71,9 +68,6 @@ - - - @@ -82,11 +76,7 @@ - - - - - + @@ -95,10 +85,6 @@ - - - - @@ -112,9 +98,39 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index b39650117..20cc4d02b 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -100,9 +100,6 @@ - - - @@ -110,9 +107,6 @@ - - - @@ -122,9 +116,6 @@ - - - @@ -133,10 +124,6 @@ - - - - @@ -150,12 +137,39 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 34eb2ad36..891a48738 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -53,6 +53,10 @@ + + + + @@ -78,6 +82,25 @@ + + + + + + + + + + + + + + + + + + + @@ -98,30 +121,14 @@ - - - - - - - - - - - - - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index e0be2ba82..f4de1c9c5 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -16,7 +16,8 @@ True False - + False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 291a41d6f..4a2a4f14d 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -92,6 +92,10 @@ + + + + @@ -117,6 +121,25 @@ + + + + + + + + + + + + + + + + + + + @@ -189,18 +212,6 @@ - - - - - - - - - - - - @@ -209,10 +220,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 8a7bb4306..f8456b3f5 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -16,7 +16,8 @@ True False - + False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index e3f0f250d..a936e3046 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -80,6 +80,10 @@ + + + + @@ -105,6 +109,25 @@ + + + + + + + + + + + + + + + + + + + @@ -157,18 +180,6 @@ - - - - - - - - - - - - @@ -177,10 +188,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index a3f4d6818..02bb56c59 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -16,7 +16,8 @@ True False - + False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index df6ca4252..b4d9090ee 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -54,55 +54,53 @@ + + + + - - - - - - - - - - - + + - - - - + + + + + + + + + + + + + + + - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 8cff09887..7a8d83bac 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -16,6 +16,7 @@ True False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index ea328bff9..ac760f883 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -82,6 +82,10 @@ + + + + @@ -105,6 +109,25 @@ + + + + + + + + + + + + + + + + + + + @@ -157,14 +180,6 @@ - - - - - - - - @@ -173,10 +188,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index e87a6b60a..f7de2b644 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -16,7 +16,8 @@ True False - + False + False False False From a9c6671433984905770e947187ae6f11b9b42dbd Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 11:15:55 +0000 Subject: [PATCH 069/144] Add new feature selection: analog (ADC) (CMSIS not available yet) --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 10 ++++++++- .../Native/STM32F4xx/dotNetMF_loader.proj | 10 ++++++++- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 8 +++---- .../MCBSTM32F400/TinyBooter/features.settings | 3 ++- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 8 +++---- .../MCBSTM32F400/TinyCLR/features.settings | 3 ++- .../TinyCLR_NONET/TinyCLR_NONET.proj | 8 +++---- .../TinyCLR_NONET/features.settings | 3 ++- .../TinyBooter/TinyBooter.proj | 6 ++--- .../TinyBooter/features.settings | 1 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 8 +++---- .../TinyCLR/features.settings | 3 ++- .../STM32F4DISCOVERY/platform_selector.h | 22 +++++++++++++------ 13 files changed, 56 insertions(+), 37 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 5ec24389a..981798106 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -85,7 +85,14 @@ - + + + + + + + + @@ -122,6 +129,7 @@ + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 20cc4d02b..adbcd782c 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -124,7 +124,14 @@ - + + + + + + + + @@ -161,6 +168,7 @@ + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 891a48738..a15afa907 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -50,7 +50,9 @@ - + + + @@ -201,10 +203,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index f4de1c9c5..5eea416b8 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -13,7 +13,8 @@ False False False - + False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 4a2a4f14d..5c5ec04e5 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -89,7 +89,9 @@ - + + + @@ -272,10 +274,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index f8456b3f5..4d1a6dd8b 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -13,7 +13,8 @@ True False False - + False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index a936e3046..6d977b823 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -77,7 +77,9 @@ - + + + @@ -244,10 +246,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index 02bb56c59..af49039f0 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -13,7 +13,8 @@ True False False - + False + True False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index b4d9090ee..276498031 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -51,6 +51,8 @@ + + @@ -165,10 +167,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 7a8d83bac..a25b38588 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -13,6 +13,7 @@ False False False + False True False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index ac760f883..3ca947d57 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -79,7 +79,9 @@ - + + + @@ -244,10 +246,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index f7de2b644..898a3c0fe 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -13,7 +13,8 @@ False False True - + False + True False False diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 97e751572..0cb855dd2 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -58,15 +58,15 @@ #define SYSTEM_APB1_CLOCK_HZ 42000000 // 42 MHz #define SYSTEM_APB2_CLOCK_HZ 84000000 // 84 MHz -#define SYSTEM_CRYSTAL_CLOCK_HZ 8000000 // 8 MHz external clock +//#define SYSTEM_CRYSTAL_CLOCK_HZ 8000000 // 8 MHz external clock -#define SUPPLY_VOLTAGE_MV 3300 // 3.3V supply +//#define SUPPLY_VOLTAGE_MV 3300 // 3.3V supply -#define CLOCK_COMMON_FACTOR 1000000 // GCD(SYSTEM_CLOCK_HZ, 1M) +//#define CLOCK_COMMON_FACTOR 1000000 // GCD(SYSTEM_CLOCK_HZ, 1M) #define SLOW_CLOCKS_PER_SECOND 1000000 // 1 MHz -#define SLOW_CLOCKS_TEN_MHZ_GCD 1000000 // GCD(SLOW_CLOCKS_PER_SECOND, 10M) -#define SLOW_CLOCKS_MILLISECOND_GCD 1000 // GCD(SLOW_CLOCKS_PER_SECOND, 1k) +// #define SLOW_CLOCKS_TEN_MHZ_GCD 1000000 // GCD(SLOW_CLOCKS_PER_SECOND, 10M) +// #define SLOW_CLOCKS_MILLISECOND_GCD 1000 // GCD(SLOW_CLOCKS_PER_SECOND, 1k) #define FLASH_MEMORY_Base 0x08000000 #define FLASH_MEMORY_Size 0x00100000 @@ -100,8 +100,16 @@ #define USB_MAX_QUEUES 4 // 4 endpoints (EP0 + 3) // System Timer Configuration -#define STM32F4_32B_TIMER 2 -#define STM32F4_16B_TIMER 3 +// #define HAL_32B_TIMER 2 +// #define HAL_16B_TIMER 3 + +/* Choose if wake-up from STOP mode is in fast mode or not. +This selects which regulator is on during stop mode. +By keeping the internal regulator ON during Stop mode, the consumption +is higher although the startup time is reduced. +When the voltage regulator operates in low power mode, an additional +startup delay is incurred when waking up from Stop mode. */ +//#define FAST_WAKEUP_FROM_STOP // Pin Configuration #define STM32F4_ADC 3 From 42da12f0ab21600ed5e0657007c1d79931a31ae0 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 11:21:40 +0000 Subject: [PATCH 070/144] Remove CPU EBIU and interrupt management from MCBSTM32F400 projects --- Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 12 ------------ .../MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 4 ---- 2 files changed, 16 deletions(-) diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index a15afa907..a0ec3aa7a 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -107,18 +107,6 @@ - - - - - - - - - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 6d977b823..df387a3c9 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -238,10 +238,6 @@ - - - - From dc5a85941f452b5cad62194b0d26716caf224546 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 11:32:43 +0000 Subject: [PATCH 071/144] Add new feature selection: PWM (CMSIS not available yet) --- DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj | 10 +++++++++- .../Targets/Native/STM32F4xx/dotNetMF_loader.proj | 10 +++++++++- Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 6 ++---- Solutions/MCBSTM32F400/TinyBooter/features.settings | 1 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 8 +++----- Solutions/MCBSTM32F400/TinyCLR/features.settings | 3 ++- .../MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 8 +++----- Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings | 3 ++- Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj | 6 ++---- .../STM32F4DISCOVERY/TinyBooter/features.settings | 1 + Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 8 +++----- Solutions/STM32F4DISCOVERY/TinyCLR/features.settings | 3 ++- 12 files changed, 39 insertions(+), 28 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 981798106..0fc18d1c4 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -92,7 +92,14 @@ - + + + + + + + + @@ -130,6 +137,7 @@ + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index adbcd782c..b3ca7d7f1 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -131,7 +131,14 @@ - + + + + + + + + @@ -169,6 +176,7 @@ + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index a0ec3aa7a..feec8a32f 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -52,6 +52,8 @@ + + @@ -191,10 +193,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 5eea416b8..2ce347f63 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -14,6 +14,7 @@ False False False + False True False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 5c5ec04e5..5588a3702 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -91,7 +91,9 @@ - + + + @@ -270,10 +272,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 4d1a6dd8b..8acb6e38a 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -14,7 +14,8 @@ False False False - + False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index df387a3c9..ce8370526 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -79,7 +79,9 @@ - + + + @@ -238,10 +240,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index af49039f0..b0ae30e98 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -14,7 +14,8 @@ False False False - + False + True False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 276498031..915a07af7 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -53,6 +53,8 @@ + + @@ -167,10 +169,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index a25b38588..ebe19b5f7 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -14,6 +14,7 @@ False False False + False True False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 3ca947d57..1551b95aa 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -81,7 +81,9 @@ - + + + @@ -242,10 +244,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 898a3c0fe..e3763d5cc 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -14,7 +14,8 @@ False True False - + False + True False False From af0eac0720e1b3a89f320cb3b14a6f5b008c264e Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 11:39:04 +0000 Subject: [PATCH 072/144] Add new feature selection: DA (CMSIS not available yet) --- DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj | 10 +++++++++- .../Targets/Native/STM32F4xx/dotNetMF_loader.proj | 8 ++++++++ Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 8 +++----- Solutions/MCBSTM32F400/TinyBooter/features.settings | 1 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 8 +++----- Solutions/MCBSTM32F400/TinyCLR/features.settings | 1 + .../MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 8 +++----- Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings | 3 ++- Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj | 6 ++---- .../STM32F4DISCOVERY/TinyBooter/features.settings | 3 ++- Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 8 +++----- Solutions/STM32F4DISCOVERY/TinyCLR/features.settings | 3 ++- 12 files changed, 39 insertions(+), 28 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 0fc18d1c4..e48f98ffe 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -99,7 +99,14 @@ - + + + + + + + + @@ -138,6 +145,7 @@ + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index b3ca7d7f1..6526c5442 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -138,6 +138,13 @@ + + + + + + + @@ -177,6 +184,7 @@ + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index feec8a32f..f46ebaf5a 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -54,7 +54,9 @@ - + + + @@ -193,10 +195,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 2ce347f63..a471c0e25 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -15,6 +15,7 @@ False False False + False True False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 5588a3702..dc7b573a1 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -93,7 +93,9 @@ - + + + @@ -272,10 +274,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 8acb6e38a..009be4822 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -15,6 +15,7 @@ False False False + False True False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index ce8370526..10b33ab3e 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -81,7 +81,9 @@ - + + + @@ -240,10 +242,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index b0ae30e98..edbc47a2c 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -15,7 +15,8 @@ False False False - + False + True False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 915a07af7..3d41b7aae 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -55,6 +55,8 @@ + + @@ -169,10 +171,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index ebe19b5f7..615b2bfbb 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -15,7 +15,8 @@ False False False - + False + True False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 1551b95aa..b0b95ea6f 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -83,7 +83,9 @@ - + + + @@ -244,10 +246,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index e3763d5cc..4e9e81473 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -15,7 +15,8 @@ True False False - + False + True False False From ede1e10e51dde1c0252fac2a5698be96d3f95faf Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 11:46:18 +0000 Subject: [PATCH 073/144] Remove unused code --- .../DeviceCode/Initialization/MasterConfig.h | 23 - .../OEM_Model_SKU_NetworkID.cpp | 212 ----- .../DeviceCode/Initialization/dotNetMF.proj | 60 -- .../Initialization/dotNetMF_loader.proj | 62 -- .../DeviceCode/Initialization/tinyhal.cpp | 760 ------------------ 5 files changed, 1117 deletions(-) delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/MasterConfig.h delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF.proj delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/tinyhal.cpp diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/MasterConfig.h b/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/MasterConfig.h deleted file mode 100644 index d4ce06bf0..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/MasterConfig.h +++ /dev/null @@ -1,23 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) Microsoft Corporation. All rights reserved. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -//--// - -#ifndef _MASTER_CONFIG_H_ -#define _MASTER_CONFIG_H_ 1 - -//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// - -#include - -//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// - -#define NUM_DEBUGGERS 1 -#define NUM_MESSAGING 1 - -#define DEBUGGER_PORT_INDEX 0 - -//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// - -#endif // _MASTER_CONFIG_H_ diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp b/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp deleted file mode 100644 index 19fecc373..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp +++ /dev/null @@ -1,212 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Copyright (c) Microsoft Corporation. All rights reserved. -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include -#include - -HAL_SYSTEM_CONFIG HalSystemConfig = -{ - { TRUE }, // HAL_DRIVER_CONFIG_HEADER Header; - { DEBUGGER_PORT }, // UINT32 DebuggerPorts[MAX_DEBUGGERS]; - { MESSAGING_PORT }, // UINT32 MessagingPorts[MAX_MESSAGING]; - DEBUG_TEXT_PORT, // UINT32 DebugTextPort; - 115200, // UINT32 USART_DefaultBaudRate; - STDIO, // FILE* stdio; - { SRAM1_MEMORY_Base, SRAM1_MEMORY_Size }, // HAL_SYSTEM_MEMORY_CONFIG RAM1; - { FLASH_MEMORY_Base, FLASH_MEMORY_Size }, // HAL_SYSTEM_MEMORY_CONFIG FLASH; -}; - -/***************************************************************************/ - -const char HalName[] = HAL_SYSTEM_NAME; - -OEM_MODEL_SKU OEM_Model_SKU; - -#define OEM_ALL 0 -#define OEM_MS 0xFF - -#pragma arm section rodata = "SectionForConfig" - -const ConfigurationSector __section("SectionForConfig") g_ConfigurationSector = -{ - // ConfigurationLength - offsetof(ConfigurationSector, FirstConfigBlock), - - //CONFIG_SECTOR_VERSION - { - ConfigurationSector::c_CurrentVersionMajor, - ConfigurationSector::c_CurrentVersionMinor, - ConfigurationSector::c_CurrentVersionTinyBooter, - 0, // extra - }, - - // backwards compatibility buffer (88 bytes to put booterflagarray at offset 96) - { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - }, - - // BooterFlagArray - determines if we enter the tinybooter or not - { - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - }, - - // UINT32 SectorSignatureCheck[9*8]; // 287 sectors max * 8 changes before erase - { - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, - }, - - //TINYBOOTER_KEY_CONFIG DeploymentKey = - { - {// ODM key configuration for programming firmware (non deployment sectors) - { // ODM public key for firware sectors - // exponent length - 0xFF,0xFF,0xFF, 0xFF, - - // module - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - - // exponent - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - } - }, - {// OEM key configuration for programming Deployment sector - { // OEM public key for Deployment sector - // exponent length - 0xFF,0xFF,0xFF, 0xFF, - - // module - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - - // exponent - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - } - } - }, - - // OEM_MODEL_SKU OEM_Model_SKU; - { - OEM_MS, // UINT8 OEM; - 0, // UINT8 Model; - 0xFFFF, // UINT16 SKU; - }, - - // OEM_SERIAL_NUMBERS OemSerialNumbers - { - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // UINT8 module_serial_number[32]; - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }, - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, } // UINT8 system_serial_number[16]; - }, - - // CLR Config Data - { - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, - }, - - // HAL_CONFIG_BLOCK FirstConfigBlock; - { - HAL_CONFIG_BLOCK::c_Version_V2, // UINT32 Signature; - 0x8833794c, // UINT32 HeaderCRC; - 0x00000000, // UINT32 DataCRC; - 0x00000000, // UINT32 Size; - // char DriverName[64]; - }, -}; -#pragma arm section rodata diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF.proj b/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF.proj deleted file mode 100644 index ae05cbf58..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF.proj +++ /dev/null @@ -1,60 +0,0 @@ - - - - STM32F4DISCOVERY_initialization_hal - {413207C2-BC11-461F-A060-A1B05C9D5817} - - - System initialization library for STM32F4DISCOVERY - HAL - STM32F4DISCOVERY_initialization_hal.$(LIB_EXT) - STM32F4DISCOVERY_initialization_hal.$(LIB_EXT).manifest - System - - - - 4 - 0 - 0 - 0 - - 2009-04-30 - - LibraryCategory - - - - - False - - - False - False - False - DeviceCode\Targets\Native\STM32F4\DeviceCode\Initialization - false - 4.0.0.0 - - - - - - - - - - - - - - - Library - - - - - - - - - \ No newline at end of file diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj b/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj deleted file mode 100644 index 7f745c770..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj +++ /dev/null @@ -1,62 +0,0 @@ - - - - STM32F4DISCOVERY_initialization_hal_loader - {D0939448-2D69-42F3-99F1-221C5433823C} - - - System initialization library for STM32F4DISCOVERY (for boot loaders) - HAL - STM32F4DISCOVERY_initialization_hal_loader.$(LIB_EXT) - STM32F4DISCOVERY_initialization_hal_loader.$(LIB_EXT).manifest - System - - - - 4 - 0 - 0 - 0 - - 2009-04-30 - - LibraryCategory - - - - - False - - - False - False - False - DeviceCode\Targets\Native\STM32F4\DeviceCode\Initialization\reducesize - true - false - 4.0.0.0 - - - - - - - - - - - - - - - - Library - - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/tinyhal.cpp b/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/tinyhal.cpp deleted file mode 100644 index a81e9ebdf..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Initialization/tinyhal.cpp +++ /dev/null @@ -1,760 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. -// You may obtain a copy of the License at: -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing -// permissions and limitations under the License. -// -#include -#include "stm32f4xx.h" - -#if defined(PLATFORM_ARM_OS_PORT) -#include -#include -#endif - -#undef TRACE_ALWAYS -#define TRACE_ALWAYS 0x00000001 - -#undef DEBUG_TRACE -#define DEBUG_TRACE (TRACE_ALWAYS) -// these define the region to zero initialize -extern UINT32 Image$$ER_RAM_RW$$ZI$$Base; -extern UINT32 Image$$ER_RAM_RW$$ZI$$Length; - -// here is the execution address/length of code to move from FLASH to RAM -#define IMAGE_RAM_RO_BASE Image$$ER_RAM_RO$$Base -#define IMAGE_RAM_RO_LENGTH Image$$ER_RAM_RO$$Length - -extern UINT32 IMAGE_RAM_RO_BASE; -extern UINT32 IMAGE_RAM_RO_LENGTH; - -// here is the execution address/length of data to move from FLASH to RAM -extern UINT32 Image$$ER_RAM_RW$$Base; -extern UINT32 Image$$ER_RAM_RW$$Length; - -// here is the load address of the RAM code/data -#define LOAD_RAM_RO_BASE Load$$ER_RAM_RO$$Base - -extern UINT32 LOAD_RAM_RO_BASE; -extern UINT32 Load$$ER_RAM_RW$$Base; - -#if defined(TARGETLOCATION_RAM) - -extern UINT32 Load$$ER_RAM$$Base; -extern UINT32 Image$$ER_RAM$$Length; - -#elif defined(TARGETLOCATION_FLASH) - -extern UINT32 Load$$ER_FLASH$$Base; -extern UINT32 Image$$ER_FLASH$$Length; - -#else - !ERROR -#endif - -UINT32 LOAD_IMAGE_Start; -UINT32 LOAD_IMAGE_Length; -UINT32 LOAD_IMAGE_CalcCRC; - -#if defined(PLATFORM_ARM_OS_PORT) && defined(TCPIP_LWIP_OS) -extern UINT32 Load$$ER_LWIP_OS$$RW$$Base; -extern UINT32 Image$$ER_LWIP_OS$$RW$$Base; -extern UINT32 Image$$ER_LWIP_OS$$RW$$Length; -extern UINT32 Image$$ER_LWIP_OS$$ZI$$Base; -extern UINT32 Image$$ER_LWIP_OS$$ZI$$Length; -#endif - -#pragma arm section code = "SectionForBootstrapOperations" - -static void __section("SectionForBootstrapOperations") Prepare_Copy( UINT32* src, UINT32* dst, UINT32 len ) -{ - if(dst != src) - { - INT32 extraLen = len & 0x00000003; - len = len & 0xFFFFFFFC; - - while(len != 0) - { - *dst++ = *src++; - - len -= 4; - } - - // thumb2 code can be multiples of 2... - - UINT8 *dst8 = (UINT8*) dst, *src8 = (UINT8*) src; - - while (extraLen > 0) - { - *dst8++ = *src8++; - - extraLen--; - } - } -} - -static void __section("SectionForBootstrapOperations") Prepare_Zero( UINT32* dst, UINT32 len ) -{ - INT32 extraLen = len & 0x00000003; - len = len & 0xFFFFFFFC; - - while(len != 0) - { - *dst++ = 0; - - len -= 4; - } - - // thumb2 code can be multiples of 2... - - UINT8 *dst8 = (UINT8*) dst; - - while (extraLen > 0) - { - *dst8++ = 0; - - extraLen--; - } -} - -#if !defined(PLATFORM_ARM_OS_PORT) || defined(__GNUC__) -void __section("SectionForBootstrapOperations") PrepareImageRegions() -{ - // - // Copy RAM RO regions into proper location. - // - { - UINT32* src = (UINT32*)&LOAD_RAM_RO_BASE; - UINT32* dst = (UINT32*)&IMAGE_RAM_RO_BASE; - UINT32 len = (UINT32 )&IMAGE_RAM_RO_LENGTH; - - Prepare_Copy( src, dst, len ); - } - - // - // Copy RAM RW regions into proper location. - // - { - UINT32* src = (UINT32*)&Load$$ER_RAM_RW$$Base; - UINT32* dst = (UINT32*)&Image$$ER_RAM_RW$$Base; - UINT32 len = (UINT32)&Image$$ER_RAM_RW$$Length; - - Prepare_Copy( src, dst, len ); - } - - // - // Initialize RAM ZI regions. - // - { - UINT32* dst = (UINT32*)&Image$$ER_RAM_RW$$ZI$$Base; - UINT32 len = (UINT32 )&Image$$ER_RAM_RW$$ZI$$Length; - - Prepare_Zero( dst, len ); - } -} -#else -extern "C" void PrepareImageRegions() -{ - // This space intentionally left blank... 8^) - // - // The OS boot of CLR on CMSIS-RTX doesn't - // use this as it relies on the C/C++ runtime - // to handle initialization. However, to keep - // from adding more libraries or #if checks - // in code this is defined to allow normal - // linking with the same HAL libs used in a - // boot loader. -} -#endif - -#pragma arm section code - -//--// - -#if !defined(BUILD_RTM) -static UINT32 g_Boot_RAMConstants_CRC = 0; -#endif - -static ON_SOFT_REBOOT_HANDLER s_rebootHandlers[16] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; - -void HAL_AddSoftRebootHandler(ON_SOFT_REBOOT_HANDLER handler) -{ - for(int i=0; iGetDeviceInfo(); - - ByteAddress configSectAddress; - UINT32 iRegion, iRange; - - pBlockDevice->FindForBlockUsage(BlockUsage::CONFIG, configSectAddress, iRegion, iRange ); - - // if non-XIP, load data - if (!deviceInfo->Attribute.SupportsXIP) - { - pBlockDevice->Read(configSectAddress, sizeof(ConfigurationSector), (BYTE*)&g_ConfigurationSector); - } - - - for(int i=0; !bDone && iAttribute.SupportsXIP) - { - - // will be either directly read from NOR - dataAddress = (volatile UINT32*)CPU_GetUncachableAddress(&pAddr[i]); - - // write directly - bRet = (TRUE == pBlockDevice->Write( (UINT32)dataAddress, sizeof(UINT32), (PBYTE)&c_Key, FALSE )); - } - else - { - // updated the g_ConfigurationSector with the latest value - // as the g_ConfigurationSector must be at the RAM area, so it should be ok to write to it. - - dataAddress =(volatile UINT32 *) &(g_ConfigurationSector.BooterFlagArray[i]); - (*dataAddress) = c_Key; - - // write back to sector, as we only change one bit from 0 to 1, no need to erase sector - bRet = (TRUE == pBlockDevice->Write( configSectAddress, sizeof(ConfigurationSector), (BYTE*)&g_ConfigurationSector, FALSE )); - - } - - bDone = true; - break; - - case ConfigurationSector::c_BootEntryKey: // looks like we already have a key set - bDone = true; - break; - } - } - - if(!bDone) // we must be full, so rewrite sector - { - // reading whole block, not just the configurationsector - const BlockRegionInfo * pBlockRegionInfo = &deviceInfo->Regions[iRegion]; - - ::Watchdog_ResetCounter(); - - BYTE *data = (BYTE*) private_malloc(pBlockRegionInfo->BytesPerBlock); - - if(data != NULL) - { - ConfigurationSector *pCfg; - - if(deviceInfo->Attribute.SupportsXIP) - { - memcpy(data, (void*)configSectAddress, pBlockRegionInfo->BytesPerBlock); - } - else - { - pBlockDevice->Read(configSectAddress, pBlockRegionInfo->BytesPerBlock, data); - } - - pCfg = (ConfigurationSector *)data; - memset( (void*)&pCfg->BooterFlagArray[0], 0xFF, sizeof(pCfg->BooterFlagArray) ); - - // updated the g_ConfigurationSector with the latest value - // as the g_ConfigurationSector must be at the RAM area, so it should be ok to write to it. - pCfg->BooterFlagArray[0] = c_Key; - - pBlockDevice->EraseBlock(configSectAddress); - - ::Watchdog_ResetCounter(); - - // write back to sector, as we only change one bit from 0 to 1, no need to erase sector - bRet = (TRUE == pBlockDevice->Write( configSectAddress, pBlockRegionInfo->BytesPerBlock, data, FALSE )); - - private_free(data); - } - } - - CPU_Reset(); - } -} - -bool g_fDoNotUninitializeDebuggerPort = false; - -void HAL_Initialize() -{ -#if defined(PLATFORM_ARM_OS_PORT) - // Interrupts must be enabled to handle calls to OS - // (Network stack uses the CMSIS-RTX OS, which uses - // SVC calls, which will hard fault if the interrupts - // are disabled at the Svc instruction ) - // SystemInit handles this for the startup from reset - // However, this is also called from the CLR when doing - // a soft reboot. - __enable_irq(); -#endif - - HAL_CONTINUATION::InitializeList(); - HAL_COMPLETION ::InitializeList(); - - HAL_Init_Custom_Heap(); - - Time_Initialize(); - Events_Initialize(); - - CPU_GPIO_Initialize(); - CPU_SPI_Initialize(); - -#if !defined(PLATFORM_ARM_OS_PORT) - // this is the place where interrupts are enabled after boot for the first time after boot - ENABLE_INTERRUPTS(); -#endif - - // have to initialize the blockstorage first, as the USB device needs to update the configure block - - BlockStorageList::Initialize(); - - BlockStorage_AddDevices(); - - BlockStorageList::InitializeDevices(); - - //FS_Initialize(); - - //FileSystemVolumeList::Initialize(); - - //FS_AddVolumes(); - - //FileSystemVolumeList::InitializeVolumes(); - - //LCD_Initialize(); - -#if !defined(HAL_REDUCESIZE) - CPU_InitializeCommunication(); -#endif - - I2C_Initialize(); - - Buttons_Initialize(); - - // Initialize the backlight to a default off state - //BackLight_Initialize(); - - //Piezo_Initialize(); - - //Battery_Initialize(); - - //Charger_Initialize(); - - PalEvent_Initialize(); - //Gesture_Initialize(); - //Ink_Initialize(); - TimeService_Initialize(); - -#if defined(ENABLE_NATIVE_PROFILER) - Native_Profiler_Init(); -#endif -} - -void HAL_UnReserveAllGpios() -{ - for(INT32 i = CPU_GPIO_GetPinCount()-1; i >=0; i--) - { - CPU_GPIO_ReservePin((GPIO_PIN)i, false); - } -} - -#if defined(PLATFORM_ARM_OS_PORT) && defined(TCPIP_LWIP_OS) -// Hack: refer to work item #2374 -// For reasons unknown, the ARM linker is getting the -// fixup for the LoadRegion symbol incorrect. The data -// is located correctly but the fixed up pointer stored -// in the literal pool that this code loads for the address -// of the load base (src) is off by some factor. In initial -// testing it was always 0x90, unfortunately it turns out -// not to be consistent and bumped up to 0xED0, and is now -// back at 0x90... Sigh... Hope to hear back from ARM support -// on this soon. ARM has confirmed the bug as related to the -// use of a non-compressed region in the scatter file. Since -// the code here doesn't understand the linker compression -// the region is uncompressed, however the linker bug is -// that an uncompressed region that follows after a compressed -// one will get the invalid Load$$xxx$$Base value. If the -// scatter file is updated to ensure all regions occuring -// before this one are also uncompressed it works ok. -const UINT32 ArmLinkerLoadRegionOffsetHack = 0x00000000; -void LwipRegionInit() -{ - // Copy RAM RW regions into proper location. - { - UINT32* src = &Load$$ER_LWIP_OS$$RW$$Base; - UINT32* dst = &Image$$ER_LWIP_OS$$RW$$Base; - UINT32 len = (UINT32) &Image$$ER_LWIP_OS$$RW$$Length; - - // Hack: refer to work item #2374 - src = reinterpret_cast(reinterpret_cast(src) - ArmLinkerLoadRegionOffsetHack ); - - Prepare_Copy( src, dst, len ); - } - - // Initialize RAM ZI regions. - { - UINT32* dst = &Image$$ER_LWIP_OS$$ZI$$Base; - UINT32 len = (UINT32) &Image$$ER_LWIP_OS$$ZI$$Length; - - Prepare_Zero( dst, len ); - } -} -#endif - -void HAL_Uninitialize() -{ - int i; - -#if defined(ENABLE_NATIVE_PROFILER) - Native_Profiler_Stop(); -#endif - - for(i=0; i= end) - { - *ptr-- = 0xBAADF00D; - } - } -#endif - - // these are needed for patch access - -#if defined(TARGETLOCATION_RAM) - - LOAD_IMAGE_Start = (UINT32)&Load$$ER_RAM$$Base; - LOAD_IMAGE_Length = (UINT32)&Image$$ER_RAM$$Length; - -#elif defined(TARGETLOCATION_FLASH) - - LOAD_IMAGE_Start = (UINT32)&Load$$ER_FLASH$$Base; - LOAD_IMAGE_Length = (UINT32)&Image$$ER_FLASH$$Length; - -#else - !ERROR -#endif - - LOAD_IMAGE_Length += (UINT32)&IMAGE_RAM_RO_LENGTH + (UINT32)&Image$$ER_RAM_RW$$Length; - -#if !defined(BUILD_RTM) - g_Boot_RAMConstants_CRC = Checksum_RAMConstants(); -#endif - - - CPU_Initialize(); - - HAL_Time_Initialize(); - - HAL_Initialize(); - -#if !defined(BUILD_RTM) - DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); - DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); -#if defined(__GNUC__) - DEBUG_TRACE1(TRACE_ALWAYS, "GNU Compiler version %d\r\n", __GNUC__); -#else - DEBUG_TRACE1(TRACE_ALWAYS, "ARM Compiler version %d\r\n", __ARMCC_VERSION); -#endif - - UINT8* BaseAddress; - UINT32 SizeInBytes; - - HeapLocation( BaseAddress, SizeInBytes ); - memset ( BaseAddress, 0, SizeInBytes ); - - debug_printf("\f"); - - debug_printf("%-15s\r\n", HalName); - debug_printf("%-15s\r\n", "Build Date:"); - debug_printf(" %-13s\r\n", __DATE__); - debug_printf(" %-13s\r\n", __TIME__); - -#endif // !defined(BUILD_RTM) - - /***********************************************************************************/ - - { -#if defined(FIQ_SAMPLING_PROFILER) - FIQ_Profiler_Init(); -#endif - } - - // the runtime is by default using a watchdog - - Watchdog_GetSetTimeout ( WATCHDOG_TIMEOUT , TRUE ); - Watchdog_GetSetBehavior( WATCHDOG_BEHAVIOR, TRUE ); - Watchdog_GetSetEnabled ( WATCHDOG_ENABLE, TRUE ); - - - // HAL initialization completed. Interrupts are enabled. Jump to the Application routine - ApplicationEntryPoint(); - - debug_printf("main exited!!???. Halting CPU\r\n"); - -#if defined(BUILD_RTM) - CPU_Reset(); -#else - CPU_Halt(); -#endif -} -#endif - -} // extern "C" - - -#if defined(PLATFORM_ARM_OS_PORT) -extern "C" void STM32F4_BootstrapCode(); - -// performs base level system initialization -// This typically consists of setting up clocks -// and PLLs along with any external memory needed -// to boot. -// NOTE: -// It is important to keep in mind that this is -// called *BEFORE* any C/C++ runtime initialization -// That is, zero init of uninitialied writeable data -// and copying of initialized values for initialized -// writeable data have not yet occured. Thus, any code -// called from SystemInit must not use or rely on -// initializtion having occured. This also precludes -// the use of any OS provided primitives and support -// as the kernel isn't initialized yet either. -extern "C" void SystemInit() -{ - STM32F4_BootstrapCode(); - CPU_Initialize(); - __enable_irq(); -} - -#endif //PLATFORM_ARM_OS_PORT - -#if !defined(BUILD_RTM) - -void debug_printf( const char* format, ... ) -{ - char buffer[256] = {0}; - va_list arg_ptr; - - va_start( arg_ptr, format ); - - int len = hal_vsnprintf( buffer, sizeof(buffer)-1, format, arg_ptr ); - - { // take CLR lock to send whole message - GLOBAL_LOCK(clrLock); - // send characters directly to the trace port - for( char* p = buffer; *p != '\0' || p-buffer >= 256; ++p ) - ITM_SendChar( *p ); - } - - va_end( arg_ptr ); -} - -void lcd_printf( const char* format, ... ) -{ - va_list arg_ptr; - - va_start( arg_ptr, format ); - - hal_vfprintf( STREAM_LCD, format, arg_ptr ); -} - -#endif // !defined(BUILD_RTM) - -#if !defined(BUILD_RTM) - -UINT32 Checksum_RAMConstants() -{ - UINT32* RAMConstants = (UINT32*)&IMAGE_RAM_RO_BASE; - UINT32 Length = (UINT32 )&IMAGE_RAM_RO_LENGTH; - - UINT32 crc; - - // start with Vector area CRC - crc = SUPPORT_ComputeCRC(NULL, 0x00000020, 0); - - // add the big block of RAM constants to CRC - crc = SUPPORT_ComputeCRC(RAMConstants, Length, crc); - - return crc; -} - -void Verify_RAMConstants( void* arg ) -{ - BOOL BreakpointOnError = (BOOL)arg; - - //debug_printf("RAMC\r\n"); - - UINT32 crc = Checksum_RAMConstants(); - - if (crc != g_Boot_RAMConstants_CRC) - { - hal_printf("RAMC CRC:%08x!=%08x\r\n", crc, g_Boot_RAMConstants_CRC); - - UINT32* ROMConstants = (UINT32*)&LOAD_RAM_RO_BASE; - UINT32* RAMConstants = (UINT32*)&IMAGE_RAM_RO_BASE; - UINT32 Length = (UINT32 )&IMAGE_RAM_RO_LENGTH; - BOOL FoundMismatch = FALSE; - - for(int i = 0; i < Length; i += 4) - { - if(*RAMConstants != *ROMConstants) - { - hal_printf( "RAMC %08x:%08x!=%08x\r\n", (UINT32) RAMConstants, *RAMConstants, *ROMConstants ); - - if(!FoundMismatch) lcd_printf( "\fRAMC:%08x\r\n", (UINT32)RAMConstants ); // first one only to LCD - FoundMismatch = TRUE; - } - - RAMConstants++; - ROMConstants++; - } - - if(!FoundMismatch) - { - // the vector area must have been trashed - lcd_printf("\fRAMC:%08x\r\n", (UINT32) NULL); - RAMConstants = (UINT32*)NULL; - - for(int i = 0; i < 32; i += 4) - { - hal_printf( "RAMC %02x:%08x\r\n", i, *RAMConstants ); - lcd_printf( "%02x:%08x\r\n" , i, *RAMConstants++ ); - } - } - - DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); - - if(BreakpointOnError) - { - HARD_BREAKPOINT(); - } - } -} - -#endif // !defined(BUILD_RTM) From 4be19f65d1263d44d346f8bdc8a55aa709280b2a Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 12:04:56 +0000 Subject: [PATCH 074/144] Move Itm0GenericPort and g_GenericPorts declaration to start code in each solution - this was the last usable code in solution\DeviceCode\Init\ proj - remove unused code --- .../TinyBooter/TinyBooterEntry.cpp | 3 ++ Solutions/MCBSTM32F400/TinyCLR/tinyclr.cpp | 3 ++ .../MCBSTM32F400/TinyCLR_NONET/tinyclr.cpp | 3 ++ .../DeviceCode/Init/IO_Init.cpp | 35 ------------------- .../DeviceCode/Init/dotNetMF.proj | 33 ----------------- .../TinyBooter/TinyBooter.proj | 4 --- .../TinyBooter/TinyBooterEntry.cpp | 3 ++ .../STM32F4DISCOVERY/TinyCLR/tinyclr.cpp | 3 ++ 8 files changed, 15 insertions(+), 72 deletions(-) delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Init/IO_Init.cpp delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/Init/dotNetMF.proj diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp b/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp index 8009b9c5c..25e2015a4 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooterEntry.cpp @@ -17,6 +17,9 @@ #define BUTTON_ENTR BUTTON_B4 #define BUTTON_USER_IDX BUTTON_B5_BITIDX +extern GenericPortTableEntry const Itm0GenericPort; +extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; + //////////////////////////////////////////////////////////////////////////////// // Tinybooter_ProgramWordCheck // diff --git a/Solutions/MCBSTM32F400/TinyCLR/tinyclr.cpp b/Solutions/MCBSTM32F400/TinyCLR/tinyclr.cpp index 051970c5a..ed5c7ca58 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/tinyclr.cpp +++ b/Solutions/MCBSTM32F400/TinyCLR/tinyclr.cpp @@ -5,6 +5,9 @@ #include #include +extern GenericPortTableEntry const Itm0GenericPort; +extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; + //////////////////////////////////////////////////////////////////////////////// void ApplicationEntryPoint() { diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/tinyclr.cpp b/Solutions/MCBSTM32F400/TinyCLR_NONET/tinyclr.cpp index 14990758b..2e123ba90 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/tinyclr.cpp +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/tinyclr.cpp @@ -5,6 +5,9 @@ #include #include +extern GenericPortTableEntry const Itm0GenericPort; +extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; + extern void HAL_CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents); void CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) { diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Init/IO_Init.cpp b/Solutions/STM32F4DISCOVERY/DeviceCode/Init/IO_Init.cpp deleted file mode 100644 index 9b9d4c6e4..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Init/IO_Init.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. -// -// *** STM32F4DISCOVERY Board specific IO Port Initialization *** -// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include -#include "..\..\..\..\DeviceCode\Targets\Native\STM32F4\DeviceCode\stm32f4xx.h" - -// Define the generic port table, only one generic extensionn port type supported -// and that is the ITM hardware trace port on Channel 0. -extern GenericPortTableEntry const Itm0GenericPort; -extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; - -extern void STM32F4_GPIO_Pin_Config( GPIO_PIN pin, UINT32 mode, GPIO_RESISTOR resistor, UINT32 alternate ); // Workaround, since CPU_GPIO_DisablePin() does not correctly initialize pin speeds - -void __section("SectionForBootstrapOperations") BootstrapCode_GPIO() -{ - // Enable GPIO clocks for ports A - E - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN - | RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN; - - // TODO: Restore at the end of bootloader? - CPU_GPIO_EnableOutputPin(LED3, FALSE); - CPU_GPIO_EnableOutputPin(LED4, FALSE); - CPU_GPIO_EnableOutputPin(LED5, FALSE); - CPU_GPIO_EnableOutputPin(LED6, FALSE); -} diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/Init/dotNetMF.proj b/Solutions/STM32F4DISCOVERY/DeviceCode/Init/dotNetMF.proj deleted file mode 100644 index fffe870d9..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/Init/dotNetMF.proj +++ /dev/null @@ -1,33 +0,0 @@ - - - IO_Init_STM32F4DISCOVERY - - - {EC3ADEC7-57CC-4F26-B540-30EBA51C32DA} - IO port initialization for STM32F4DISCOVERY solution - HAL - IO_Init_STM32F4DISCOVERY.$(LIB_EXT) - IO_Init_STM32F4DISCOVERY.$(LIB_EXT).manifest - Solutions\STM32F4DISCOVERY - - - - - False - False - False - False - Solutions\STM32F4DISCOVERY\DeviceCode\Init - Library - false - 4.0.0.0 - - - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 3d41b7aae..aecf16557 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -179,10 +179,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp index 274290f61..69a37676f 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooterEntry.cpp @@ -14,6 +14,9 @@ #include #include +extern GenericPortTableEntry const Itm0GenericPort; +extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; + //////////////////////////////////////////////////////////////////////////////// // Tinybooter_ProgramWordCheck // diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp b/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp index 14990758b..2e123ba90 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp @@ -5,6 +5,9 @@ #include #include +extern GenericPortTableEntry const Itm0GenericPort; +extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; + extern void HAL_CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents); void CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) { From 5edaba0ef6e07038bd6ee21597d0517aa023393b Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 12:48:41 +0000 Subject: [PATCH 075/144] Add new feature selection: sockets - add compiler defs to remove calls to socket methods in ComDirector when socket feature is not available (CMSIS not available yet) --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 8 +- .../Native/STM32F4xx/dotNetMF_loader.proj | 6 + DeviceCode/pal/COM/ComDirector.cpp | 185 ++++++++++-------- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 5 +- .../MCBSTM32F400/TinyBooter/features.settings | 1 + .../MCBSTM32F400/TinyCLR/features.settings | 1 + .../TinyCLR_NONET/TinyCLR_NONET.proj | 5 +- .../TinyCLR_NONET/features.settings | 1 + .../TinyBooter/TinyBooter.proj | 6 +- .../TinyBooter/features.settings | 1 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 5 +- .../TinyCLR/features.settings | 3 +- 12 files changed, 130 insertions(+), 97 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index e48f98ffe..b471ab305 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -128,7 +128,13 @@ - + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 6526c5442..95291106e 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -168,6 +168,12 @@ + + + + + + diff --git a/DeviceCode/pal/COM/ComDirector.cpp b/DeviceCode/pal/COM/ComDirector.cpp index d670095dc..9ea4958fd 100644 --- a/DeviceCode/pal/COM/ComDirector.cpp +++ b/DeviceCode/pal/COM/ComDirector.cpp @@ -20,10 +20,12 @@ BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) return FALSE; return USB_OpenStream( ConvertCOM_UsbStream(ComPortNum), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); - + + #ifdef FEATURE_SOCKETS case SOCKET_TRANSPORT: return SOCKETS_Initialize(ConvertCOM_SockPort(ComPortNum)); - + #endif + case GENERIC_TRANSPORT: return GenericPort_Initialize( ConvertCOM_GenericPort( ComPortNum ) ); } @@ -43,9 +45,11 @@ BOOL DebuggerPort_Uninitialize( COM_HANDLE ComPortNum ) USB_CloseStream( ConvertCOM_UsbStream(ComPortNum) ); return USB_Uninitialize( ConvertCOM_UsbController(ComPortNum) ); + #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: return SOCKETS_Uninitialize(ConvertCOM_SockPort(ComPortNum)); - + #endif + case GENERIC_TRANSPORT: return GenericPort_Uninitialize( ConvertCOM_GenericPort( ComPortNum ) ); } @@ -68,18 +72,22 @@ int DebuggerPort_Write( COM_HANDLE ComPortNum, const char* Data, size_t size, in switch(transport) { - case USART_TRANSPORT: - ret = USART_Write( ConvertCOM_ComPort( ComPortNum ), dataTmp, size ); - break; - case USB_TRANSPORT: - ret = USB_Write( ConvertCOM_UsbStream( ComPortNum ), dataTmp, size ); - break; - case SOCKET_TRANSPORT: - ret = SOCKETS_Write( ConvertCOM_SockPort(ComPortNum), dataTmp, size ); - break; - - case GENERIC_TRANSPORT: - return GenericPort_Write( ConvertCOM_GenericPort( ComPortNum ), dataTmp, size ); + case USART_TRANSPORT: + ret = USART_Write( ConvertCOM_ComPort( ComPortNum ), dataTmp, size ); + break; + + case USB_TRANSPORT: + ret = USB_Write( ConvertCOM_UsbStream( ComPortNum ), dataTmp, size ); + break; + + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + ret = SOCKETS_Write( ConvertCOM_SockPort(ComPortNum), dataTmp, size ); + break; + #endif + + case GENERIC_TRANSPORT: + return GenericPort_Write( ConvertCOM_GenericPort( ComPortNum ), dataTmp, size ); } if(ret < 0) @@ -117,20 +125,22 @@ int DebuggerPort_Read( COM_HANDLE ComPortNum, char* Data, size_t size ) switch(ExtractTransport(ComPortNum)) { - case USART_TRANSPORT: - ret = USART_Read( ConvertCOM_ComPort( ComPortNum ), Data, size ); - break; + case USART_TRANSPORT: + ret = USART_Read( ConvertCOM_ComPort( ComPortNum ), Data, size ); + break; - case USB_TRANSPORT: - ret = USB_Read( ConvertCOM_UsbStream( ComPortNum ), Data, size ); - break; + case USB_TRANSPORT: + ret = USB_Read( ConvertCOM_UsbStream( ComPortNum ), Data, size ); + break; - case SOCKET_TRANSPORT: - ret = SOCKETS_Read( ConvertCOM_SockPort(ComPortNum), Data, size ); - break; + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + ret = SOCKETS_Read( ConvertCOM_SockPort(ComPortNum), Data, size ); + break; + #endif - case GENERIC_TRANSPORT: - return GenericPort_Read( ConvertCOM_GenericPort( ComPortNum ), Data, size ); + case GENERIC_TRANSPORT: + return GenericPort_Read( ConvertCOM_GenericPort( ComPortNum ), Data, size ); } return ret; @@ -142,17 +152,19 @@ BOOL DebuggerPort_Flush( COM_HANDLE ComPortNum ) NATIVE_PROFILE_PAL_COM(); switch( ExtractTransport( ComPortNum ) ) { - case USART_TRANSPORT: - return USART_Flush( ConvertCOM_ComPort( ComPortNum ) ); + case USART_TRANSPORT: + return USART_Flush( ConvertCOM_ComPort( ComPortNum ) ); - case USB_TRANSPORT: - return USB_Flush( ConvertCOM_UsbStream( ComPortNum ) ); + case USB_TRANSPORT: + return USB_Flush( ConvertCOM_UsbStream( ComPortNum ) ); - case SOCKET_TRANSPORT: - return SOCKETS_Flush( ConvertCOM_SockPort( ComPortNum ) ); + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + return SOCKETS_Flush( ConvertCOM_SockPort( ComPortNum ) ); + #endif - case GENERIC_TRANSPORT: - return GenericPort_Flush( ConvertCOM_GenericPort( ComPortNum ) ); + case GENERIC_TRANSPORT: + return GenericPort_Flush( ConvertCOM_GenericPort( ComPortNum ) ); } return FALSE; @@ -163,15 +175,18 @@ BOOL DebuggerPort_IsSslSupported( COM_HANDLE ComPortNum ) NATIVE_PROFILE_PAL_COM(); switch(ExtractTransport(ComPortNum)) { - case SOCKET_TRANSPORT: - return g_DebuggerPortSslConfig.GetCertificateAuthority != NULL; + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + return g_DebuggerPortSslConfig.GetCertificateAuthority != NULL; + #endif - case GENERIC_TRANSPORT: - return GenericPort_IsSslSupported( ConvertCOM_GenericPort( ComPortNum ) ); - case USART_TRANSPORT: - case USB_TRANSPORT: - default: - break; + case GENERIC_TRANSPORT: + return GenericPort_IsSslSupported( ConvertCOM_GenericPort( ComPortNum ) ); + + case USART_TRANSPORT: + case USB_TRANSPORT: + default: + break; } return FALSE; @@ -202,11 +217,13 @@ BOOL DebuggerPort_UpgradeToSsl( COM_HANDLE ComPortNum, UINT32 flags ) switch(ExtractTransport(ComPortNum)) { - case SOCKET_TRANSPORT: - return SOCKETS_UpgradeToSsl(ConvertCOM_ComPort(ComPortNum), pCACert, caCertLen, pDeviceCert, deviceCertLen, szTargetHost); + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + return SOCKETS_UpgradeToSsl(ConvertCOM_ComPort(ComPortNum), pCACert, caCertLen, pDeviceCert, deviceCertLen, szTargetHost); + #endif - case GENERIC_TRANSPORT: - return GenericPort_UpgradeToSsl( ComPortNum, pCACert, caCertLen, pDeviceCert, deviceCertLen, szTargetHost ); + case GENERIC_TRANSPORT: + return GenericPort_UpgradeToSsl( ComPortNum, pCACert, caCertLen, pDeviceCert, deviceCertLen, szTargetHost ); } return FALSE; @@ -216,11 +233,13 @@ BOOL DebuggerPort_IsUsingSsl( COM_HANDLE ComPortNum ) { switch(ExtractTransport(ComPortNum)) { - case SOCKET_TRANSPORT: - return SOCKETS_IsUsingSsl(ConvertCOM_ComPort(ComPortNum)); + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + return SOCKETS_IsUsingSsl(ConvertCOM_ComPort(ComPortNum)); + #endif - case GENERIC_TRANSPORT: - return GenericPort_IsUsingSsl( ConvertCOM_GenericPort( ComPortNum ) ); + case GENERIC_TRANSPORT: + return GenericPort_IsUsingSsl( ConvertCOM_GenericPort( ComPortNum ) ); } return FALSE; } @@ -230,21 +249,23 @@ void InitializePort( COM_HANDLE ComPortNum ) { switch(ExtractTransport(ComPortNum)) { - case USART_TRANSPORT: - USART_Initialize( ConvertCOM_ComPort( ComPortNum ), HalSystemConfig.USART_DefaultBaudRate, USART_PARITY_NONE, 8, USART_STOP_BITS_ONE, USART_FLOW_NONE ); - break; + case USART_TRANSPORT: + USART_Initialize( ConvertCOM_ComPort( ComPortNum ), HalSystemConfig.USART_DefaultBaudRate, USART_PARITY_NONE, 8, USART_STOP_BITS_ONE, USART_FLOW_NONE ); + break; - case USB_TRANSPORT: - USB_Initialize( ConvertCOM_UsbStream( ComPortNum ) ); - break; + case USB_TRANSPORT: + USB_Initialize( ConvertCOM_UsbStream( ComPortNum ) ); + break; - case SOCKET_TRANSPORT: - SOCKETS_Initialize( ConvertCOM_SockPort(ComPortNum) ); - break; + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + SOCKETS_Initialize( ConvertCOM_SockPort(ComPortNum) ); + break; + #endif - case GENERIC_TRANSPORT: - GenericPort_Initialize( ConvertCOM_GenericPort( ComPortNum ) ); - break; + case GENERIC_TRANSPORT: + GenericPort_Initialize( ConvertCOM_GenericPort( ComPortNum ) ); + break; } } @@ -252,25 +273,27 @@ void UninitializePort( COM_HANDLE ComPortNum ) { switch(ExtractTransport(ComPortNum)) { - case USART_TRANSPORT: - USART_Uninitialize( ConvertCOM_ComPort( ComPortNum ) ); - break; + case USART_TRANSPORT: + USART_Uninitialize( ConvertCOM_ComPort( ComPortNum ) ); + break; - case USB_TRANSPORT: - if(USB_CONFIG_ERR_OK == USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) - { - USB_Initialize( ConvertCOM_UsbController(ComPortNum) ); - USB_OpenStream( ConvertCOM_UsbStream(ComPortNum), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); - } - break; + case USB_TRANSPORT: + if(USB_CONFIG_ERR_OK == USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) + { + USB_Initialize( ConvertCOM_UsbController(ComPortNum) ); + USB_OpenStream( ConvertCOM_UsbStream(ComPortNum), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); + } + break; - case SOCKET_TRANSPORT: - SOCKETS_Uninitialize( ConvertCOM_SockPort(ComPortNum) ); - break; + #ifdef FEATURE_SOCKET + case SOCKET_TRANSPORT: + SOCKETS_Uninitialize( ConvertCOM_SockPort(ComPortNum) ); + break; + #endif - case GENERIC_TRANSPORT: - GenericPort_Uninitialize( ConvertCOM_GenericPort( ComPortNum ) ); - break; + case GENERIC_TRANSPORT: + GenericPort_Uninitialize( ConvertCOM_GenericPort( ComPortNum ) ); + break; } } @@ -281,7 +304,9 @@ void CPU_InitializeCommunication() // do these first so we can print out messages InitializePort( HalSystemConfig.DebugTextPort ); InitializePort( HalSystemConfig.stdio ); +#ifdef FEATURE_SOCKET Network_Initialize(); +#endif } void CPU_UninitializeCommunication() @@ -307,7 +332,9 @@ void CPU_UninitializeCommunication() } USB_Uninitialize(0); // USB_Uninitialize will only stop USB controller 0 if it has no open streams - Network_Uninitialize(); + #ifdef FEATURE_SOCKET + Network_Uninitialize(); + #endif } diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index f46ebaf5a..08ef0acf4 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -105,6 +105,7 @@ + @@ -187,10 +188,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index a471c0e25..848f8a043 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -20,6 +20,7 @@ True False False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 009be4822..259fec645 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -20,6 +20,7 @@ True False False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 10b33ab3e..f03c51817 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -132,6 +132,7 @@ + @@ -342,10 +343,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index edbc47a2c..c7a46143d 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -20,6 +20,7 @@ True False False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index aecf16557..b827515c9 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -64,6 +64,7 @@ + @@ -97,6 +98,7 @@ + @@ -163,10 +165,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 615b2bfbb..1394cde01 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -20,6 +20,7 @@ True False False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index b0b95ea6f..cc63ef9d1 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -132,6 +132,7 @@ + @@ -346,10 +347,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 4e9e81473..6ec611bf8 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -20,7 +20,8 @@ True False False - + False + False False False From 4164e7e8c2de121e94fab336a087e62370ebc7b5 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 12:53:36 +0000 Subject: [PATCH 076/144] Add compiler defs to remove calls to USART methods in ComDirector when USART feature is not available --- DeviceCode/pal/COM/ComDirector.cpp | 42 +++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/DeviceCode/pal/COM/ComDirector.cpp b/DeviceCode/pal/COM/ComDirector.cpp index 9ea4958fd..7321f3883 100644 --- a/DeviceCode/pal/COM/ComDirector.cpp +++ b/DeviceCode/pal/COM/ComDirector.cpp @@ -9,8 +9,10 @@ BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) NATIVE_PROFILE_PAL_COM(); switch(ExtractTransport(ComPortNum)) { + #ifdef FEATURE_USART case USART_TRANSPORT: return USART_Initialize( ConvertCOM_ComPort(ComPortNum), HalSystemConfig.USART_DefaultBaudRate, USART_PARITY_NONE, 8, USART_STOP_BITS_ONE, USART_FLOW_NONE ); + #endif case USB_TRANSPORT: if(USB_CONFIG_ERR_OK != USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) @@ -38,8 +40,10 @@ BOOL DebuggerPort_Uninitialize( COM_HANDLE ComPortNum ) NATIVE_PROFILE_PAL_COM(); switch(ExtractTransport(ComPortNum)) { + #ifdef FEATURE_USART case USART_TRANSPORT: return USART_Uninitialize( ConvertCOM_ComPort(ComPortNum) ); + #endif case USB_TRANSPORT: USB_CloseStream( ConvertCOM_UsbStream(ComPortNum) ); @@ -72,9 +76,11 @@ int DebuggerPort_Write( COM_HANDLE ComPortNum, const char* Data, size_t size, in switch(transport) { + #ifdef FEATURE_USART case USART_TRANSPORT: ret = USART_Write( ConvertCOM_ComPort( ComPortNum ), dataTmp, size ); break; + #endif case USB_TRANSPORT: ret = USB_Write( ConvertCOM_UsbStream( ComPortNum ), dataTmp, size ); @@ -125,9 +131,11 @@ int DebuggerPort_Read( COM_HANDLE ComPortNum, char* Data, size_t size ) switch(ExtractTransport(ComPortNum)) { + #ifdef FEATURE_USART case USART_TRANSPORT: ret = USART_Read( ConvertCOM_ComPort( ComPortNum ), Data, size ); break; + #endif case USB_TRANSPORT: ret = USB_Read( ConvertCOM_UsbStream( ComPortNum ), Data, size ); @@ -152,8 +160,10 @@ BOOL DebuggerPort_Flush( COM_HANDLE ComPortNum ) NATIVE_PROFILE_PAL_COM(); switch( ExtractTransport( ComPortNum ) ) { + #ifdef FEATURE_USART case USART_TRANSPORT: return USART_Flush( ConvertCOM_ComPort( ComPortNum ) ); + #endif case USB_TRANSPORT: return USB_Flush( ConvertCOM_UsbStream( ComPortNum ) ); @@ -182,8 +192,10 @@ BOOL DebuggerPort_IsSslSupported( COM_HANDLE ComPortNum ) case GENERIC_TRANSPORT: return GenericPort_IsSslSupported( ConvertCOM_GenericPort( ComPortNum ) ); - + + #ifdef FEATURE_USART case USART_TRANSPORT: + #endif case USB_TRANSPORT: default: break; @@ -249,9 +261,11 @@ void InitializePort( COM_HANDLE ComPortNum ) { switch(ExtractTransport(ComPortNum)) { + #ifdef FEATURE_USART case USART_TRANSPORT: USART_Initialize( ConvertCOM_ComPort( ComPortNum ), HalSystemConfig.USART_DefaultBaudRate, USART_PARITY_NONE, 8, USART_STOP_BITS_ONE, USART_FLOW_NONE ); break; + #endif case USB_TRANSPORT: USB_Initialize( ConvertCOM_UsbStream( ComPortNum ) ); @@ -273,9 +287,11 @@ void UninitializePort( COM_HANDLE ComPortNum ) { switch(ExtractTransport(ComPortNum)) { + #ifdef FEATURE_USART case USART_TRANSPORT: USART_Uninitialize( ConvertCOM_ComPort( ComPortNum ) ); break; + #endif case USB_TRANSPORT: if(USB_CONFIG_ERR_OK == USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) @@ -344,18 +360,20 @@ void CPU_ProtectCommunicationGPIOs( BOOL On ) switch(ExtractTransport(HalSystemConfig.DebugTextPort)) { - case USART_TRANSPORT: - CPU_USART_ProtectPins( ConvertCOM_ComPort(HalSystemConfig.DebugTextPort), On ); - return ; - - case USB_TRANSPORT: - CPU_USB_ProtectPins( ConvertCOM_UsbController(HalSystemConfig.DebugTextPort), On ); - return; + #ifdef FEATURE_USART + case USART_TRANSPORT: + CPU_USART_ProtectPins( ConvertCOM_ComPort(HalSystemConfig.DebugTextPort), On ); + return ; + #endif + + case USB_TRANSPORT: + CPU_USB_ProtectPins( ConvertCOM_UsbController(HalSystemConfig.DebugTextPort), On ); + return; - case GENERIC_TRANSPORT: - GenericPort_ProtectPins( ConvertCOM_GenericPort(HalSystemConfig.DebugTextPort), On ); + case GENERIC_TRANSPORT: + GenericPort_ProtectPins( ConvertCOM_GenericPort(HalSystemConfig.DebugTextPort), On ); - default: - return; + default: + return; } } From 427ea4b1055726eeda63a297cce69e6292940853 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 14:20:21 +0000 Subject: [PATCH 077/144] Add compiler defs to remove calls to Watchdog methods when Watchdog feature is not available --- DeviceCode/Initialization/tinyhal.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index a08046fa2..d8f67ba2b 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -81,7 +81,10 @@ void HAL_EnterBooterMode() switch(pAddr[i]) { case c_Empty: - ::Watchdog_ResetCounter(); + + #ifdef FEATURE_WATCHDOG + ::Watchdog_ResetCounter(); + #endif if(deviceInfo->Attribute.SupportsXIP) { @@ -123,7 +126,9 @@ void HAL_EnterBooterMode() // reading whole block, not just the configurationsector const BlockRegionInfo * pBlockRegionInfo = &deviceInfo->Regions[iRegion]; - ::Watchdog_ResetCounter(); + #ifdef FEATURE_WATCHDOG + ::Watchdog_ResetCounter(); + #endif BYTE *data = (BYTE*) private_malloc(pBlockRegionInfo->BytesPerBlock); @@ -149,7 +154,9 @@ void HAL_EnterBooterMode() pBlockDevice->EraseBlock(configSectAddress); - ::Watchdog_ResetCounter(); + #ifdef FEATURE_WATCHDOG + ::Watchdog_ResetCounter(); + #endif // write back to sector, as we only change one bit from 0 to 1, no need to erase sector bRet = (TRUE == pBlockDevice->Write( configSectAddress, pBlockRegionInfo->BytesPerBlock, data, FALSE )); @@ -430,14 +437,12 @@ __attribute__((weak)) int main(void) #endif } - // - // the runtime is by default using a watchdog - // - - Watchdog_GetSetTimeout ( WATCHDOG_TIMEOUT , TRUE ); - Watchdog_GetSetBehavior( WATCHDOG_BEHAVIOR, TRUE ); - Watchdog_GetSetEnabled ( WATCHDOG_ENABLE, TRUE ); - + #ifdef FEATURE_WATCHDOG + Watchdog_GetSetTimeout ( WATCHDOG_TIMEOUT , TRUE ); + Watchdog_GetSetBehavior( WATCHDOG_BEHAVIOR, TRUE ); + Watchdog_GetSetEnabled ( WATCHDOG_ENABLE, TRUE ); + #endif + // CMSIS & NETMF HALs initialization completed. Interrupts are enabled. Jump to the Application routine ApplicationEntryPoint(); From 55fd5efa713d7ddb16d8dbcbe59ddf709935e8f3 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 14:23:01 +0000 Subject: [PATCH 078/144] Add missing lib reference for I2C in bootloader projects --- Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 1 + Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj | 1 + 2 files changed, 2 insertions(+) diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 08ef0acf4..536466348 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -45,6 +45,7 @@ + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index b827515c9..a71022496 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -46,6 +46,7 @@ + From 216bf28cfdcb88ca5eec82e1f9a826968b18d263 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 15:16:14 +0000 Subject: [PATCH 079/144] Add new feature selection: time service --- DeviceCode/Initialization/tinyhal.cpp | 4 ++- .../Targets/Native/STM32F4xx/dotNetMF.proj | 6 ++++ .../Native/STM32F4xx/dotNetMF_loader.proj | 6 ++++ .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 23 ++++++++------- .../MCBSTM32F400/TinyBooter/features.settings | 3 +- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 17 +++++++---- .../MCBSTM32F400/TinyCLR/features.settings | 3 +- .../TinyCLR_NONET/TinyCLR_NONET.proj | 24 ++++++++-------- .../TinyCLR_NONET/features.settings | 3 +- .../TinyBooter/TinyBooter.proj | 24 ++++++++-------- .../TinyBooter/features.settings | 1 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 28 +++++++++++-------- .../TinyCLR/features.settings | 1 + 13 files changed, 88 insertions(+), 55 deletions(-) diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index d8f67ba2b..b73f4217e 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -259,8 +259,10 @@ void HAL_Initialize() #ifdef FEATURE_INK Ink_Initialize(); #endif - + +#ifdef FEATURE_TIMESERVICE TimeService_Initialize(); +#endif #if defined(ENABLE_NATIVE_PROFILER) Native_Profiler_Init(); diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index b471ab305..36f7fdff7 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -134,6 +134,12 @@ + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 95291106e..26a6d9c35 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -173,6 +173,12 @@ + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 536466348..f8b3b978b 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -64,6 +64,12 @@ + + + + + + @@ -88,12 +94,16 @@ + + + + + - - + @@ -107,6 +117,7 @@ + @@ -177,14 +188,6 @@ - - - - - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 848f8a043..c3d9de249 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -21,7 +21,8 @@ False False False - + False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index dc7b573a1..503e0c9cf 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -102,6 +102,11 @@ + + + + + @@ -126,12 +131,16 @@ + + + + + - - + @@ -258,10 +267,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 259fec645..ac33cbd12 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -21,7 +21,8 @@ False False False - + False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index f03c51817..4ad0a42c4 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -90,6 +90,11 @@ + + + + + @@ -113,13 +118,17 @@ - + + + + + + - - + @@ -133,6 +142,7 @@ + @@ -227,14 +237,6 @@ - - - - - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index c7a46143d..21915c26d 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -21,7 +21,8 @@ False False False - + False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index a71022496..c644c0c74 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -66,7 +66,12 @@ - + + + + + + @@ -79,13 +84,15 @@ + + + + + - - - @@ -100,6 +107,7 @@ + @@ -154,14 +162,6 @@ - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 1394cde01..40f19cc11 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -21,6 +21,7 @@ False False False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index cc63ef9d1..58ec567f9 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -92,7 +92,14 @@ - + + + + + + + + @@ -113,13 +120,17 @@ - + + + + + + - - + @@ -133,6 +144,7 @@ + @@ -227,14 +239,6 @@ - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 6ec611bf8..5416ac5cf 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -21,6 +21,7 @@ False False False + False False False From d7d26b9473afadc6aea180f815c66477461e07ed Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 15:41:17 +0000 Subject: [PATCH 080/144] Reorganized HAL/PAL projects inclusion order and arrangement for clarity --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 6 ---- .../Native/STM32F4xx/dotNetMF_loader.proj | 6 ---- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 29 ++++++++++--------- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 29 ++++++++++--------- .../TinyCLR_NONET/TinyCLR_NONET.proj | 29 ++++++++++--------- .../TinyBooter/TinyBooter.proj | 16 ++++++++-- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 28 +++++++++--------- 7 files changed, 74 insertions(+), 69 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 36f7fdff7..251fdfdd5 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -74,8 +74,6 @@ - - @@ -83,7 +81,6 @@ - @@ -124,9 +121,6 @@ - - - diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 26a6d9c35..975a1473e 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -113,8 +113,6 @@ - - @@ -122,7 +120,6 @@ - @@ -163,9 +160,6 @@ - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index f8b3b978b..5e424e838 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -66,33 +66,20 @@ - - - - - - - - - - - - - @@ -105,7 +92,21 @@ - + + + + + + + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 503e0c9cf..6587cbf85 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -103,33 +103,20 @@ - - - - - - - - - - - - - @@ -142,7 +129,21 @@ - + + + + + + + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 4ad0a42c4..43d591cd0 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -91,33 +91,20 @@ - - - - - - - - - - - - - @@ -130,7 +117,21 @@ - + + + + + + + + + + + + + + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index c644c0c74..4950cbef7 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -67,9 +67,7 @@ - - @@ -95,6 +93,20 @@ + + + + + + + + + + + + + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 58ec567f9..da15223a5 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -95,31 +95,19 @@ - - - - - - - - - - - - @@ -132,7 +120,21 @@ - + + + + + + + + + + + + + + + From 6bbab7faf21a9122e964c653500727f09991b276 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 16:19:22 +0000 Subject: [PATCH 081/144] Further reorganization of PAL/HAL inclusion in solution projects --- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 66 ++++++----------- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 59 ++++++--------- .../TinyCLR_NONET/TinyCLR_NONET.proj | 65 ++++++----------- .../TinyBooter/TinyBooter.proj | 71 +++++++------------ .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 64 ++++++----------- 5 files changed, 115 insertions(+), 210 deletions(-) diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 5e424e838..e4a34ece7 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -65,6 +65,7 @@ + @@ -85,17 +86,36 @@ + + + + + + + + + - + + + + + + + + + + + @@ -133,50 +153,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -189,10 +169,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 6587cbf85..11a2bc5a7 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -102,6 +102,8 @@ + + @@ -122,17 +124,36 @@ + + + + + + + + + - + + + + + + + + + + + @@ -236,34 +257,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -280,18 +277,6 @@ - - - - - - - - - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 43d591cd0..c47cf5fc1 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -90,6 +90,8 @@ + + @@ -110,17 +112,36 @@ - + + + + + + + + + + - + + + + + + + + + + + @@ -198,42 +219,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -246,18 +239,6 @@ - - - - - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 4950cbef7..713cb2986 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -66,6 +66,7 @@ + @@ -86,20 +87,39 @@ - + + + + + + + + + + - + - + + + + + + + + + + - + + - + @@ -108,7 +128,7 @@ - + @@ -120,64 +140,27 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index da15223a5..ed8d6cc93 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -94,6 +94,7 @@ + @@ -113,17 +114,36 @@ - + + + + + + + + + + - + + + + + + + + + + + @@ -201,42 +221,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -253,18 +245,6 @@ - - - - - - - - - - - - From cfb566ae0a4598f3cfbf687a061a0702b0b50792 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 16:29:49 +0000 Subject: [PATCH 082/144] Add new feature selection: PAL event --- DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj | 6 ++++++ .../Targets/Native/STM32F4xx/dotNetMF_loader.proj | 6 ++++++ Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 7 +++---- Solutions/MCBSTM32F400/TinyBooter/features.settings | 1 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 7 +++---- Solutions/MCBSTM32F400/TinyCLR/features.settings | 1 + .../MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 7 +++---- .../MCBSTM32F400/TinyCLR_NONET/features.settings | 1 + Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj | 11 +++++++---- .../STM32F4DISCOVERY/TinyBooter/features.settings | 1 + Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 9 ++++----- Solutions/STM32F4DISCOVERY/TinyCLR/features.settings | 1 + 12 files changed, 37 insertions(+), 21 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 251fdfdd5..1ec403415 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -135,6 +135,12 @@ + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 975a1473e..4c0e5696e 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -174,6 +174,12 @@ + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index e4a34ece7..b0cd2312f 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -69,6 +69,8 @@ + + @@ -125,6 +127,7 @@ + @@ -165,10 +168,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index c3d9de249..0533d1d48 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -22,6 +22,7 @@ False False False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 11a2bc5a7..22042e381 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -107,6 +107,8 @@ + + @@ -163,6 +165,7 @@ + @@ -261,10 +264,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index ac33cbd12..b6055108b 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -22,6 +22,7 @@ False False False + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index c47cf5fc1..45dba5854 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -95,6 +95,8 @@ + + @@ -151,6 +153,7 @@ + @@ -227,10 +230,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index 21915c26d..714f08ec7 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -22,6 +22,7 @@ False False False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 713cb2986..1d8366a55 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -70,7 +70,9 @@ - + + + @@ -126,6 +128,7 @@ + @@ -140,7 +143,7 @@ - + @@ -158,8 +161,8 @@ - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 40f19cc11..f771a07e4 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -22,6 +22,7 @@ False False False + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index ed8d6cc93..2b0fad1ab 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -98,7 +98,9 @@ - + + + @@ -153,6 +155,7 @@ + @@ -229,10 +232,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 5416ac5cf..3808dcc21 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -22,6 +22,7 @@ False False False + False False False From d57af941cd7146c979dd84b0f6e4b785a0ca63d1 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 17:29:35 +0000 Subject: [PATCH 083/144] Add project with HAL interface for Cortex-M CRC calculation unit --- .../Targets/CMSIS/CRC/CRC_functions.cpp | 56 +++++++++++++++++++ DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj | 37 ++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj diff --git a/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp b/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp new file mode 100644 index 000000000..8376cc0e4 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp @@ -0,0 +1,56 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Open Technologies. All rights reserved. +// Implementation for CMSIS: Copyright (c) Eclo Solutions Lda +// +// *** Interface for Cortex-M CRC Calculation Unit *** +// +////////////////////////////////////////////////////////////////////////////////////////// + +#include + +UINT32 SUPPORT_ComputeCRC( const void* rgBlock , + int nLength , + UINT32 crc ) +{ + CRC_HandleTypeDef hcrc; + uint32_t index = 0U; + + // init CRC unit + hcrc.Instance = CRC; + HAL_CRC_Init(&hcrc); + + // Process Locked + __HAL_LOCK(&hcrc); + + // Change CRC peripheral state + hcrc.State = HAL_CRC_STATE_BUSY; + + // if crc (argument for initial value) is not 0, init the CRC calculation unit with this value + if(crc != 0) + { + // init CRC value + hcrc.Instance->DR = crc; + } + + const UINT8* ptr = (const UINT8*)rgBlock; + + // Enter Data to the CRC calculator + for(index = 0U; index < nLength; index++) + { + hcrc.Instance->DR = (uint32_t)*ptr++; + } + + // Change CRC peripheral state to ready + hcrc.State = HAL_CRC_STATE_READY; + + // Process Unlocked + __HAL_UNLOCK(&hcrc); + + // Return the CRC computed value + return hcrc.Instance->DR; +} diff --git a/DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj b/DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj new file mode 100644 index 000000000..73a328acc --- /dev/null +++ b/DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj @@ -0,0 +1,37 @@ + + + + CMSIS_CRC + {157C5580-48A2-4F69-8EFB-C5CEB7123177} + + + CMSIS CRC library + HAL + CMSIS_CRC.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\CRC\dotNetMF.proj + CMSIS_CRC.$(LIB_EXT).manifest + + + + False + + + False + False + True + DeviceCode\Targets\CMSIS\CRC + Library + false + 4.0.0.0 + + + + + + + + + + + + \ No newline at end of file From 4b242fab1299815fa5471067fd6faccb143a01e2 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 17:47:35 +0000 Subject: [PATCH 084/144] Add comments --- DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp b/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp index 8376cc0e4..606f64a80 100644 --- a/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp +++ b/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp @@ -13,9 +13,14 @@ #include -UINT32 SUPPORT_ComputeCRC( const void* rgBlock , - int nLength , - UINT32 crc ) +/* + Interface to Cortex-M CRC calculation unit that implements the equivalent to the software implementation in Support\CRC project. + CRC-32 (Ethernet) polynomial: 0x4C11DB7. + rgBlock: pointer to the region block to be CRCed + nLength: lenght of rgBlock to compute CRC + crc: previous CRC value to start CRC computing +*/ +UINT32 SUPPORT_ComputeCRC(const void* rgBlock, int nLength, UINT32 crc) { CRC_HandleTypeDef hcrc; uint32_t index = 0U; From 21f99d09854831b7d3a0be5f7e28cb2e501ed8af Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 22 Mar 2016 18:08:47 +0000 Subject: [PATCH 085/144] Add new features selection: Software CRC and Cortex-M CRC --- DeviceCode/Initialization/tinyhal.cpp | 22 +++++++++++++++++++ .../Targets/Native/STM32F4xx/dotNetMF.proj | 15 +++++++++++++ .../Native/STM32F4xx/dotNetMF_loader.proj | 15 +++++++++++++ .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 11 +++++----- .../MCBSTM32F400/TinyBooter/features.settings | 2 ++ Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 13 +++++------ .../MCBSTM32F400/TinyCLR/features.settings | 2 ++ .../TinyCLR_NONET/TinyCLR_NONET.proj | 11 +++++----- .../TinyCLR_NONET/features.settings | 2 ++ .../TinyBooter/TinyBooter.proj | 22 +++++-------------- .../TinyBooter/features.settings | 2 ++ .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 7 ++---- .../TinyCLR/features.settings | 2 ++ 13 files changed, 86 insertions(+), 40 deletions(-) diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index b73f4217e..eb8ae3bc0 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -188,7 +188,10 @@ void HAL_Initialize() HAL_COMPLETION ::InitializeList(); Time_Initialize(); + +#ifdef FEATURE_PALEVENT Events_Initialize(); +#endif #ifdef FEATURE_GPIO CPU_GPIO_Initialize(); @@ -251,7 +254,10 @@ void HAL_Initialize() Charger_Initialize(); #endif +#ifdef FEATURE_PALEVENT PalEvent_Initialize(); +#endif + #ifdef FEATURE_GESTURE Gesture_Initialize(); #endif @@ -267,6 +273,12 @@ void HAL_Initialize() #if defined(ENABLE_NATIVE_PROFILER) Native_Profiler_Init(); #endif + +#ifdef FEATURE_CORTEX_CRC + // enable clock for the CRC calculation module + __HAL_RCC_CRC_CLK_ENABLE(); +#endif + } void HAL_UnReserveAllGpios() @@ -297,6 +309,11 @@ void HAL_Uninitialize() } } +#ifdef FEATURE_CORTEX_CRC + // disable clock for the CRC calculation module + __HAL_RCC_CRC_CLK_DISABLE(); +#endif + #ifdef FEATURE_LCD LCD_Uninitialize(); #endif @@ -335,7 +352,9 @@ void HAL_Uninitialize() Gesture_Uninitialize(); #endif +#ifdef FEATURE_PALEVENT PalEvent_Uninitialize(); +#endif SOCKETS_CloseConnections(); @@ -363,7 +382,10 @@ void HAL_Uninitialize() DISABLE_INTERRUPTS(); +#ifdef FEATURE_PALEVENT Events_Uninitialize(); +#endif + Time_Uninitialize(); HAL_CONTINUATION::Uninitialize(); diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 1ec403415..5b0a33df4 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -140,6 +140,21 @@ + + + + + + + + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 4c0e5696e..acb39cd88 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -179,6 +179,21 @@ + + + + + + + + + + + + + + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index b0cd2312f..c54e9e9a9 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -57,6 +57,8 @@ + + @@ -114,10 +116,11 @@ - + - + + @@ -160,10 +163,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 0533d1d48..66dd6f1d8 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -23,6 +23,8 @@ False False False + True + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 22042e381..64bbaf970 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -95,7 +95,9 @@ - + + + @@ -152,10 +154,11 @@ - + - + + @@ -260,10 +263,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index b6055108b..9ee190005 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -23,6 +23,8 @@ False False False + True + False False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 45dba5854..2b76a8a0d 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -83,6 +83,8 @@ + + @@ -140,10 +142,11 @@ - + - + + @@ -226,10 +229,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index 714f08ec7..900542c6e 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -23,6 +23,8 @@ False False False + True + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 1d8366a55..185268b7d 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -58,7 +58,9 @@ - + + + @@ -115,10 +117,11 @@ - + + @@ -153,16 +156,6 @@ - - - - - - - - - - @@ -180,9 +173,6 @@ - - - - +
diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index f771a07e4..c89e50e67 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -23,6 +23,8 @@ False False False + True + False False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 2b0fad1ab..9f41fbc1b 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -142,10 +142,11 @@ - + + @@ -228,10 +229,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 3808dcc21..03c3de650 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -23,6 +23,8 @@ False False False + True + False False False From 53441d47917ff4bbd07424dd5438e08b669892dd Mon Sep 17 00:00:00 2001 From: sjmneves Date: Wed, 23 Mar 2016 13:20:05 +0000 Subject: [PATCH 086/144] Rework GPIO to make it CMSIS compliant --- .../Targets/CMSIS/GPIO/GPIO_functions.cpp | 658 ++++++++++++------ 1 file changed, 445 insertions(+), 213 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp index e81e98bf3..879a0d66a 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -22,7 +22,7 @@ struct Int_State { HAL_COMPLETION completion; // debounce completion - BYTE pin; // pin number + BYTE packed_port_pin; // encoded number with port and pin number BYTE mode; // edge mode BYTE debounce; // debounce flag BYTE expected; // expected pin state @@ -31,24 +31,24 @@ struct Int_State UINT32 debounceTicks; }; -static Int_State g_int_state[ Gpio_MaxInt ]; // interrupt state +static Int_State g_int_state[Gpio_MaxInt]; // interrupt state static UINT32 g_debounceTicks; -static UINT16 g_pinReserved[ TOTAL_GPIO_PORT ]; // 1 bit per pin +static UINT16 g_pinReserved[TOTAL_GPIO_PORT]; // 1 bit per pin /* * Debounce Completion Handler */ -void GPIO_DebounceHandler( void* arg ) +void GPIO_DebounceHandler(void* arg) { - Int_State* state = ( Int_State* )arg; - if( state->ISR ) + Int_State* state = (Int_State*)arg; + if(state->ISR) { - UINT32 actual = CPU_GPIO_GetPinState( state->pin ); // get actual pin state - if( actual == state->expected ) + UINT32 actual = CPU_GPIO_GetPinState(state->packed_port_pin); // get actual pin state + if(actual == state->expected) { - state->ISR( state->pin, actual, state->param ); - if( state->mode == GPIO_INT_EDGE_BOTH ) + state->ISR(state->packed_port_pin, actual, state->param); + if(state->mode == GPIO_INT_EDGE_BOTH) { // both edges state->expected ^= 1; // update expected state } @@ -59,36 +59,33 @@ void GPIO_DebounceHandler( void* arg ) /* * Interrupt Handler */ -void GPIO_ISR( int num ) // 0 <= num <= 15 +void GlobalGPIOHandler(int num) // 0 <= num <= 15 { - INTERRUPT_START - - Int_State* state = &g_int_state[ num ]; - state->completion.Abort( ); - UINT32 bit = 1 << num; + Int_State* state = &g_int_state[num]; + state->completion.Abort(); + UINT32 gpio_pin = 1 << num; UINT32 actual; - do - { - EXTI->PR = bit; // reset pending bit - actual = CPU_GPIO_GetPinState( state->pin ); // get actual pin state - } while( EXTI->PR & bit ); // repeat if pending again + + HAL_GPIO_EXTI_IRQHandler(gpio_pin); + + actual = CPU_GPIO_GetPinState(state->packed_port_pin); // get actual pin state - if( state->ISR ) + if(state->ISR) { - if( state->debounce ) + if(state->debounce) { // debounce enabled // for back compat treat state.debounceTicks == 0 as indication to use global debounce setting UINT32 debounceDeltaTicks = state->debounceTicks == 0 ? g_debounceTicks : state->debounceTicks; - state->completion.EnqueueTicks( HAL_Time_CurrentTicks( ) + debounceDeltaTicks ); + state->completion.EnqueueTicks(HAL_Time_CurrentTicks() + debounceDeltaTicks); } else { - state->ISR( state->pin, state->expected, state->param ); - if( state->mode == GPIO_INT_EDGE_BOTH ) + state->ISR(state->packed_port_pin, state->expected, state->param); + if(state->mode == GPIO_INT_EDGE_BOTH) { // both edges - if( actual != state->expected ) + if(actual != state->expected) { // fire another isr to keep in synch - state->ISR( state->pin, actual, state->param ); + state->ISR(state->packed_port_pin, actual, state->param); } else { @@ -98,94 +95,107 @@ void GPIO_ISR( int num ) // 0 <= num <= 15 } } - INTERRUPT_END } -void GPIO_Interrupt0( void* param ) // EXTI0 + + +void EXTI0_IRQHandler(void) // EXTI0 { - GPIO_ISR( 0 ); + GlobalGPIOHandler(0); } -void GPIO_Interrupt1( void* param ) // EXTI1 +void EXTI1_IRQHandler(void) // EXTI1 { - GPIO_ISR( 1 ); + GlobalGPIOHandler(1); } -void GPIO_Interrupt2( void* param ) // EXTI2 +void EXTI2_IRQHandler(void) // EXTI2 { - GPIO_ISR( 2 ); + GlobalGPIOHandler(2); } -void GPIO_Interrupt3( void* param ) // EXTI3 +void EXTI3_IRQHandler(void) // EXTI3 { - GPIO_ISR( 3 ); + GlobalGPIOHandler(3); } -void GPIO_Interrupt4( void* param ) // EXTI4 +void EXTI4_IRQHandler(void) // EXTI4 { - GPIO_ISR( 4 ); + GlobalGPIOHandler(4); } -void GPIO_Interrupt5( void* param ) // EXTI5 - EXTI9 +void EXTI5_IRQHandler(void) // EXTI5 - EXTI9 { UINT32 pending = EXTI->PR & EXTI->IMR & 0x03E0; // pending bits 5..9 - int num = 5; pending >>= 5; + int num = 5; + pending >>= 5; do { - if( pending & 1 ) GPIO_ISR( num ); - num++; pending >>= 1; - } while( pending ); + if(pending & 1) + { + GlobalGPIOHandler(num); + } + num++; + pending >>= 1; + } + while(pending); } -void GPIO_Interrupt10( void* param ) // EXTI10 - EXTI15 +void EXTI10_IRQHandler(void) // EXTI10 - EXTI15 { UINT32 pending = EXTI->PR & EXTI->IMR & 0xFC00; // pending bits 10..15 - int num = 10; pending >>= 10; + int num = 10; + pending >>= 10; do { - if( pending & 1 ) GPIO_ISR( num ); - num++; pending >>= 1; - } while( pending ); + if(pending & 1) + { + GlobalGPIOHandler(num); + } + num++; + pending >>= 1; + } + while(pending); } -BOOL GPIO_Set_Interrupt( UINT32 pin +BOOL GPIO_Set_Interrupt(UINT32 pin , GPIO_INTERRUPT_SERVICE_ROUTINE ISR , void* ISR_Param , GPIO_INT_EDGE mode , BOOL GlitchFilterEnable - ) + ) { UINT32 num = pin & 0x0F; UINT32 bit = 1 << num; - UINT32 shift = ( num & 0x3 ) << 2; // 4 bit fields + UINT32 shift = (num & 0x3) << 2; // 4 bit fields UINT32 idx = num >> 2; UINT32 mask = 0xF << shift; - UINT32 config = ( pin >> 4 ) << shift; // port number configuration + UINT32 config = (pin >> 4) << shift; // port number configuration - Int_State* state = &g_int_state[ num ]; + Int_State* state = &g_int_state[num]; - GLOBAL_LOCK( irq ); + GLOBAL_LOCK(irq); - if( ISR ) + if(ISR) { - if( ( SYSCFG->EXTICR[ idx ] & mask ) != config ) + if((SYSCFG->EXTICR[idx] & mask) != config) { - if( EXTI->IMR & bit ) + if(EXTI->IMR & bit) return FALSE; // interrupt in use - SYSCFG->EXTICR[ idx ] = SYSCFG->EXTICR[ idx ] & ~mask | config; + SYSCFG->EXTICR[idx] = SYSCFG->EXTICR[idx] & ~mask | config; } - state->pin = ( BYTE )pin; - state->mode = ( BYTE )mode; - state->debounce = ( BYTE )GlitchFilterEnable; + state->packed_port_pin = (BYTE)pin; + state->mode = (BYTE)mode; + state->debounce = (BYTE)GlitchFilterEnable; state->param = ISR_Param; state->ISR = ISR; - state->completion.Abort( ); - state->completion.SetArgument( state ); + state->completion.Abort(); + state->completion.SetArgument(state); EXTI->RTSR &= ~bit; EXTI->FTSR &= ~bit; - switch( mode ) + switch(mode) { case GPIO_INT_EDGE_LOW: case GPIO_INT_LEVEL_LOW: @@ -206,158 +216,380 @@ BOOL GPIO_Set_Interrupt( UINT32 pin do { EXTI->PR = bit; // remove pending interrupt - actual = CPU_GPIO_GetPinState( pin ); // get actual pin state - } while( EXTI->PR & bit ); // repeat if pending again - state->expected = ( BYTE )( actual ^ 1 ); + actual = CPU_GPIO_GetPinState(pin); // get actual pin state + } while(EXTI->PR & bit); // repeat if pending again + state->expected = (BYTE)(actual ^ 1); } EXTI->IMR |= bit; // enable interrupt // check for level interrupts - if( mode == GPIO_INT_LEVEL_HIGH && CPU_GPIO_GetPinState( pin ) - || mode == GPIO_INT_LEVEL_LOW && !CPU_GPIO_GetPinState( pin ) ) + if(mode == GPIO_INT_LEVEL_HIGH && CPU_GPIO_GetPinState(pin) + || mode == GPIO_INT_LEVEL_LOW && !CPU_GPIO_GetPinState(pin)) { EXTI->SWIER = bit; // force interrupt } } - else if( ( SYSCFG->EXTICR[ idx ] & mask ) == config ) + else if((SYSCFG->EXTICR[idx] & mask) == config) { EXTI->IMR &= ~bit; // disable interrupt state->ISR = NULL; - state->completion.Abort( ); + state->completion.Abort(); } return TRUE; } +void EnableIRQ(uint16_t gpio_pin) +{ + if(gpio_pin == GPIO_PIN_0) + { + HAL_NVIC_EnableIRQ(EXTI0_IRQn); + } + else if(gpio_pin == GPIO_PIN_1) + { + HAL_NVIC_EnableIRQ(EXTI1_IRQn); + } + else if(gpio_pin == GPIO_PIN_2) + { + HAL_NVIC_EnableIRQ(EXTI2_IRQn); + } + else if(gpio_pin == GPIO_PIN_3) + { + HAL_NVIC_EnableIRQ(EXTI3_IRQn); + } + else if(gpio_pin == GPIO_PIN_4) + { + HAL_NVIC_EnableIRQ(EXTI4_IRQn); + } + else if(gpio_pin == GPIO_PIN_5) + { + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + } + else if(gpio_pin == GPIO_PIN_6) + { + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + } + else if(gpio_pin == GPIO_PIN_7) + { + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + } + else if(gpio_pin == GPIO_PIN_8) + { + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + } + else if(gpio_pin == GPIO_PIN_9) + { + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + } + else if(gpio_pin == GPIO_PIN_10) + { + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } + else if(gpio_pin == GPIO_PIN_11) + { + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } + else if(gpio_pin == GPIO_PIN_12) + { + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } + else if(gpio_pin == GPIO_PIN_13) + { + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } + else if(gpio_pin == GPIO_PIN_14) + { + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } + else if(gpio_pin == GPIO_PIN_15) + { + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } +} // mode: 0: input, 1: output, 2: alternate, 3: analog // alternate: od | AF << 4 | speed << 8 -void GPIO_Pin_Config( GPIO_PIN pin, UINT32 mode, GPIO_RESISTOR resistor, UINT32 alternate ) -{ - GPIO_TypeDef* port = Port( pin >> 4 ); // pointer to the actual port registers - pin &= 0x0F; // bit number - UINT32 bit = 1 << pin; - UINT32 shift = pin << 1; // 2 bits / pin - UINT32 mask = 0x3 << shift; - UINT32 pull = 0; - if( resistor == RESISTOR_PULLUP ) - pull = GPIO_PUPDR_PUPDR0_0; - - if( resistor == RESISTOR_PULLDOWN ) - pull = GPIO_PUPDR_PUPDR0_1; - - pull <<= shift; - mode <<= shift; - UINT32 speed = ( alternate >> 8 ) << shift; - UINT32 altSh = ( pin & 0x7 ) << 2; // 4 bits / pin - UINT32 altMsk = 0xF << altSh; - UINT32 idx = pin >> 3; - UINT32 af = ( ( alternate >> 4 ) & 0xF ) << altSh; - - GLOBAL_LOCK( irq ); - - port->MODER = port->MODER & ~mask | mode; - port->PUPDR = port->PUPDR & ~mask | pull; - port->OSPEEDR = port->OSPEEDR & ~mask | speed; - port->AFR[ idx ] = port->AFR[ idx ] & ~altMsk | af; - if( alternate & 1 ) - { // open drain - port->OTYPER |= bit; +void GPIO_Pin_Config(GPIO_PIN packed_port_pin, UINT32 mode, GPIO_RESISTOR resistor, UINT32 alternate) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_TypeDef* port = Port(packed_port_pin >> 4); // pointer to the actual port registers + packed_port_pin &= 0x0F; // bit number + UINT32 gpio_pin = 1 << packed_port_pin; + + // Configure PA0 pin as input floating + GPIO_InitStructure.Mode = mode; + if(resistor == RESISTOR_PULLUP) + GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_0; + if(resistor == RESISTOR_PULLDOWN) + GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_1; + GPIO_InitStructure.Pin = gpio_pin; + + // Enable GPIO clock + #if defined (RCC_AHB1ENR_GPIOAEN) + if(port == GPIOA) + { + __HAL_RCC_GPIOA_CLK_ENABLE(); + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); } - else + #endif + #if defined (RCC_AHB1ENR_GPIOBEN) + if(port == GPIOB) { - port->OTYPER &= ~bit; + __HAL_RCC_GPIOB_CLK_ENABLE(); + HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); } + #endif + #if defined (RCC_AHB1ENR_GPIOCEN) + if(port == GPIOC) + { + __HAL_RCC_GPIOC_CLK_ENABLE(); + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIODEN) + if(port == GPIOD) + { + __HAL_RCC_GPIOD_CLK_ENABLE(); + HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIOEEN) + if(port == GPIOE) + { + __HAL_RCC_GPIOE_CLK_ENABLE(); + HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIOFEN) + if(port == GPIOF) + { + __HAL_RCC_GPIOF_CLK_ENABLE(); + HAL_GPIO_Init(GPIOF, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIOGEN) + if(port == GPIOG) + { + __HAL_RCC_GPIOG_CLK_ENABLE(); + HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIOHEN) + if(port == GPIOH) + { + __HAL_RCC_GPIOH_CLK_ENABLE(); + HAL_GPIO_Init(GPIOH, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIOIEN) + if(port == GPIOI) + { + __HAL_RCC_GPIOI_CLK_ENABLE(); + HAL_GPIO_Init(GPIOI, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + #if defined (RCC_AHB1ENR_GPIOJEN) + if(port == GPIOJ) + { + __HAL_RCC_GPIOJ_CLK_ENABLE(); + HAL_GPIO_Init(GPIOJ, &GPIO_InitStructure); + // Enable and set EXTI Line Interrupt + EnableIRQ(gpio_pin); + } + #endif + + + // GPIO_TypeDef* port = Port(pin >> 4); // pointer to the actual port registers + // pin &= 0x0F; // bit number + // UINT32 bit = 1 << pin; + // UINT32 shift = pin << 1; // 2 bits / pin + // UINT32 mask = 0x3 << shift; + // UINT32 pull = 0; + // if(resistor == RESISTOR_PULLUP) + // pull = GPIO_PUPDR_PUPDR0_0; + + // if(resistor == RESISTOR_PULLDOWN) + // pull = GPIO_PUPDR_PUPDR0_1; + + // pull <<= shift; + // mode <<= shift; + // UINT32 speed = (alternate >> 8) << shift; + // UINT32 altSh = (pin & 0x7) << 2; // 4 bits / pin + // UINT32 altMsk = 0xF << altSh; + // UINT32 idx = pin >> 3; + // UINT32 af = ((alternate >> 4) & 0xF) << altSh; + + // GLOBAL_LOCK(irq); + + // port->MODER = port->MODER & ~mask | mode; + // port->PUPDR = port->PUPDR & ~mask | pull; + // port->OSPEEDR = port->OSPEEDR & ~mask | speed; + // port->AFR[idx] = port->AFR[idx] & ~altMsk | af; + // if(alternate & 1) + // { // open drain + // port->OTYPER |= bit; + // } + // else + // { + // port->OTYPER &= ~bit; + // } } -BOOL CPU_GPIO_Initialize( ) +BOOL CPU_GPIO_Initialize() { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + GPIO_InitTypeDef GPIO_InitStruct; + + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - CPU_GPIO_SetDebounce( 20 ); // ??? + CPU_GPIO_SetDebounce(20); // ??? - for( int i = 0; i < TOTAL_GPIO_PORT; i++ ) + for(int i = 0; i < TOTAL_GPIO_PORT; i++) { - g_pinReserved[ i ] = 0; + g_pinReserved[i] = 0; } - for( int i = 0; i < Gpio_MaxInt; i++ ) + for(int i = 0; i < Gpio_MaxInt; i++) { - g_int_state[ i ].completion.InitializeForISR( &GPIO_DebounceHandler ); + g_int_state[i].completion.InitializeForISR(&GPIO_DebounceHandler); } + // Configure all GPIO as analog to reduce current consumption on non used IOs + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Pin = GPIO_PIN_All; #if defined (RCC_AHB1ENR_GPIOAEN) __HAL_RCC_GPIOA_CLK_ENABLE(); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOBEN) __HAL_RCC_GPIOB_CLK_ENABLE(); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOCEN) __HAL_RCC_GPIOC_CLK_ENABLE(); + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIODEN) __HAL_RCC_GPIOD_CLK_ENABLE(); + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOEEN) __HAL_RCC_GPIOE_CLK_ENABLE(); + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOFEN) __HAL_RCC_GPIOF_CLK_ENABLE(); + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOGEN) __HAL_RCC_GPIOG_CLK_ENABLE(); + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOHEN) __HAL_RCC_GPIOH_CLK_ENABLE(); + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOIEN) __HAL_RCC_GPIOI_CLK_ENABLE(); + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); #endif #if defined (RCC_AHB1ENR_GPIOJEN) __HAL_RCC_GPIOJ_CLK_ENABLE(); + HAL_GPIO_Init(GPIOJ, &GPIO_InitStruct); #endif - - EXTI->IMR = 0; // disable all external interrups; - // FIXME - // CPU_INTC_ActivateInterrupt( EXTI0_IRQn, GPIO_Interrupt0, 0 ); - // CPU_INTC_ActivateInterrupt( EXTI1_IRQn, GPIO_Interrupt1, 0 ); - // CPU_INTC_ActivateInterrupt( EXTI2_IRQn, GPIO_Interrupt2, 0 ); - // CPU_INTC_ActivateInterrupt( EXTI3_IRQn, GPIO_Interrupt3, 0 ); - // CPU_INTC_ActivateInterrupt( EXTI4_IRQn, GPIO_Interrupt4, 0 ); - // CPU_INTC_ActivateInterrupt( EXTI9_5_IRQn, GPIO_Interrupt5, 0 ); - // CPU_INTC_ActivateInterrupt( EXTI15_10_IRQn, GPIO_Interrupt10, 0 ); + // Disable GPIOs clock + #if defined (RCC_AHB1ENR_GPIOAEN) + __HAL_RCC_GPIOA_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOBEN) + __HAL_RCC_GPIOB_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOCEN) + __HAL_RCC_GPIOC_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIODEN) + __HAL_RCC_GPIOD_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOEEN) + __HAL_RCC_GPIOE_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOFEN) + __HAL_RCC_GPIOF_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOGEN) + __HAL_RCC_GPIOG_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOHEN) + __HAL_RCC_GPIOH_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOIEN) + __HAL_RCC_GPIOI_CLK_DISABLE(); + #endif + #if defined (RCC_AHB1ENR_GPIOJEN) + __HAL_RCC_GPIOJ_CLK_DISABLE(); + #endif + + // EXTI->IMR = 0; // disable all external interrups; + // FIXME + // CPU_INTC_ActivateInterrupt(EXTI0_IRQn, GPIO_Interrupt0, 0); + // CPU_INTC_ActivateInterrupt(EXTI1_IRQn, GPIO_Interrupt1, 0); + // CPU_INTC_ActivateInterrupt(EXTI2_IRQn, GPIO_Interrupt2, 0); + // CPU_INTC_ActivateInterrupt(EXTI3_IRQn, GPIO_Interrupt3, 0); + // CPU_INTC_ActivateInterrupt(EXTI4_IRQn, GPIO_Interrupt4, 0); + // CPU_INTC_ActivateInterrupt(EXTI9_5_IRQn, GPIO_Interrupt5, 0); + // CPU_INTC_ActivateInterrupt(EXTI15_10_IRQn, GPIO_Interrupt10, 0); return TRUE; } -BOOL CPU_GPIO_Uninitialize( ) +BOOL CPU_GPIO_Uninitialize() { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - for( int i = 0; i < Gpio_MaxInt; i++ ) + for(int i = 0; i < Gpio_MaxInt; i++) { - g_int_state[ i ].completion.Abort( ); + g_int_state[i].completion.Abort(); } EXTI->IMR = 0; // disable all external interrups; // FIXME - // CPU_INTC_DeactivateInterrupt( EXTI0_IRQn ); - // CPU_INTC_DeactivateInterrupt( EXTI1_IRQn ); - // CPU_INTC_DeactivateInterrupt( EXTI2_IRQn ); - // CPU_INTC_DeactivateInterrupt( EXTI3_IRQn ); - // CPU_INTC_DeactivateInterrupt( EXTI4_IRQn ); - // CPU_INTC_DeactivateInterrupt( EXTI9_5_IRQn ); - // CPU_INTC_DeactivateInterrupt( EXTI15_10_IRQn ); + // CPU_INTC_DeactivateInterrupt(EXTI0_IRQn); + // CPU_INTC_DeactivateInterrupt(EXTI1_IRQn); + // CPU_INTC_DeactivateInterrupt(EXTI2_IRQn); + // CPU_INTC_DeactivateInterrupt(EXTI3_IRQn); + // CPU_INTC_DeactivateInterrupt(EXTI4_IRQn); + // CPU_INTC_DeactivateInterrupt(EXTI9_5_IRQn); + // CPU_INTC_DeactivateInterrupt(EXTI15_10_IRQn); return TRUE; } -UINT32 CPU_GPIO_Attributes( GPIO_PIN pin ) +UINT32 CPU_GPIO_Attributes(GPIO_PIN pin) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin < Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin < Gpio_MaxPins) { return GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; } @@ -372,181 +604,181 @@ UINT32 CPU_GPIO_Attributes( GPIO_PIN pin ) * GPIO_ALT_MODE_3 | AF << 4 | speed << 8: Alternate Function with open drain * speed: 0: 2MHZ, 1: 25MHz, 2: 50MHz, 3: 100MHz */ -void CPU_GPIO_DisablePin( GPIO_PIN pin, GPIO_RESISTOR resistor, UINT32 output, GPIO_ALT_MODE alternate ) +void CPU_GPIO_DisablePin(GPIO_PIN pin, GPIO_RESISTOR resistor, UINT32 output, GPIO_ALT_MODE alternate) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin < Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin < Gpio_MaxPins) { UINT32 mode = output; - UINT32 altMode = ( UINT32 )alternate & 0x0F; + UINT32 altMode = (UINT32)alternate & 0x0F; - if( altMode == 1 ) + if(altMode == 1) mode = 3; // analog - else if( altMode ) + else if(altMode) mode = 2; // alternate pin function - GPIO_Pin_Config( pin, mode, resistor, ( UINT32 )alternate ); - GPIO_Set_Interrupt( pin, NULL, 0, GPIO_INT_NONE, FALSE ); // disable interrupt + GPIO_Pin_Config(pin, mode, resistor, (UINT32)alternate); + GPIO_Set_Interrupt(pin, NULL, 0, GPIO_INT_NONE, FALSE); // disable interrupt } } -void CPU_GPIO_EnableOutputPin( GPIO_PIN pin, BOOL initialState ) +void CPU_GPIO_EnableOutputPin(GPIO_PIN pin, BOOL initialState) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin < Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin < Gpio_MaxPins) { - CPU_GPIO_SetPinState( pin, initialState ); - GPIO_Pin_Config( pin, 1, RESISTOR_DISABLED, 0 ); // general purpose output - GPIO_Set_Interrupt( pin, NULL, 0, GPIO_INT_NONE, FALSE ); // disable interrupt + CPU_GPIO_SetPinState(pin, initialState); + GPIO_Pin_Config(pin, 1, RESISTOR_DISABLED, 0); // general purpose output + GPIO_Set_Interrupt(pin, NULL, 0, GPIO_INT_NONE, FALSE); // disable interrupt } } -BOOL CPU_GPIO_EnableInputPin( GPIO_PIN pin +BOOL CPU_GPIO_EnableInputPin(GPIO_PIN pin , BOOL GlitchFilterEnable , GPIO_INTERRUPT_SERVICE_ROUTINE ISR , GPIO_INT_EDGE edge , GPIO_RESISTOR resistor - ) + ) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - return CPU_GPIO_EnableInputPin2( pin, GlitchFilterEnable, ISR, 0, edge, resistor ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + return CPU_GPIO_EnableInputPin2(pin, GlitchFilterEnable, ISR, 0, edge, resistor); } -BOOL CPU_GPIO_EnableInputPin2( GPIO_PIN pin +BOOL CPU_GPIO_EnableInputPin2(GPIO_PIN pin , BOOL GlitchFilterEnable , GPIO_INTERRUPT_SERVICE_ROUTINE ISR , void* ISR_Param , GPIO_INT_EDGE edge , GPIO_RESISTOR resistor - ) + ) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin >= Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin >= Gpio_MaxPins) return FALSE; - GPIO_Pin_Config( pin, 0, resistor, 0 ); // input - return GPIO_Set_Interrupt( pin, ISR, ISR_Param, edge, GlitchFilterEnable ); + GPIO_Pin_Config(pin, 0, resistor, 0); // input + return GPIO_Set_Interrupt(pin, ISR, ISR_Param, edge, GlitchFilterEnable); } -BOOL CPU_GPIO_GetPinState( GPIO_PIN pin ) +BOOL CPU_GPIO_GetPinState(GPIO_PIN pin) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin >= Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin >= Gpio_MaxPins) return FALSE; - GPIO_TypeDef* port = Port( pin >> 4 ); // pointer to the actual port registers - return ( port->IDR >> ( pin & 0xF ) ) & 1; + GPIO_TypeDef* port = Port(pin >> 4); // pointer to the actual port registers + return (port->IDR >> (pin & 0xF)) & 1; } -void CPU_GPIO_SetPinState( GPIO_PIN pin, BOOL pinState ) +void CPU_GPIO_SetPinState(GPIO_PIN pin, BOOL pinState) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin < Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin < Gpio_MaxPins) { - GPIO_TypeDef* port = Port( pin >> 4 ); // pointer to the actual port registers - UINT16 bit = 1 << ( pin & 0x0F ); - if( pinState ) + GPIO_TypeDef* port = Port(pin >> 4); // pointer to the actual port registers + UINT16 bit = 1 << (pin & 0x0F); + if(pinState) port->BSRR = bit; // set bit else port->BSRR = (uint32_t)bit << 16U; // reset bit } } -BOOL CPU_GPIO_PinIsBusy( GPIO_PIN pin ) // busy == reserved +BOOL CPU_GPIO_PinIsBusy(GPIO_PIN pin) // busy == reserved { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin >= Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin >= Gpio_MaxPins) return FALSE; int port = pin >> 4, sh = pin & 0x0F; - return ( g_pinReserved[ port ] >> sh ) & 1; + return (g_pinReserved[port] >> sh) & 1; } -BOOL CPU_GPIO_ReservePin( GPIO_PIN pin, BOOL fReserve ) +BOOL CPU_GPIO_ReservePin(GPIO_PIN pin, BOOL fReserve) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( pin >= Gpio_MaxPins ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(pin >= Gpio_MaxPins) return FALSE; - int port = pin >> 4, bit = 1 << ( pin & 0x0F ); - GLOBAL_LOCK( irq ); - if( fReserve ) + int port = pin >> 4, bit = 1 << (pin & 0x0F); + GLOBAL_LOCK(irq); + if(fReserve) { - if( g_pinReserved[ port ] & bit ) + if(g_pinReserved[port] & bit) return FALSE; // already reserved - g_pinReserved[ port ] |= bit; + g_pinReserved[port] |= bit; } else { - g_pinReserved[ port ] &= ~bit; + g_pinReserved[port] &= ~bit; } return TRUE; } -UINT32 CPU_GPIO_GetDebounce( ) +UINT32 CPU_GPIO_GetDebounce() { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - return g_debounceTicks / ( SLOW_CLOCKS_PER_SECOND / 1000 ); // ticks -> ms + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + return g_debounceTicks / (SLOW_CLOCKS_PER_SECOND / 1000); // ticks -> ms } -BOOL CPU_GPIO_SetDebounce( INT64 debounceTimeMilliseconds ) +BOOL CPU_GPIO_SetDebounce(INT64 debounceTimeMilliseconds) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - if( debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000 ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000) { - g_debounceTicks = CPU_MillisecondsToTicks( ( UINT32 )debounceTimeMilliseconds ); + g_debounceTicks = CPU_MillisecondsToTicks((UINT32)debounceTimeMilliseconds); return TRUE; } return FALSE; } -INT32 CPU_GPIO_GetPinCount( ) +INT32 CPU_GPIO_GetPinCount() { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); return Gpio_MaxPins; } -void CPU_GPIO_GetPinsMap( UINT8* pins, size_t size ) +void CPU_GPIO_GetPinsMap(UINT8* pins, size_t size) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - for( int i = 0; i < size && i < Gpio_MaxPins; i++ ) + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + for(int i = 0; i < size && i < Gpio_MaxPins; i++) { - pins[ i ] = GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; + pins[i] = GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; } } -UINT8 CPU_GPIO_GetSupportedResistorModes( GPIO_PIN pin ) +UINT8 CPU_GPIO_GetSupportedResistorModes(GPIO_PIN pin) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - return ( 1 << RESISTOR_DISABLED ) | ( 1 << RESISTOR_PULLUP ) | ( 1 << RESISTOR_PULLDOWN ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + return (1 << RESISTOR_DISABLED) | (1 << RESISTOR_PULLUP) | (1 << RESISTOR_PULLDOWN); } -UINT8 CPU_GPIO_GetSupportedInterruptModes( GPIO_PIN pin ) +UINT8 CPU_GPIO_GetSupportedInterruptModes(GPIO_PIN pin) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); - return ( 1 << GPIO_INT_EDGE_LOW ) | ( 1 << GPIO_INT_EDGE_HIGH ) | ( 1 << GPIO_INT_EDGE_BOTH ) - | ( 1 << GPIO_INT_LEVEL_LOW ) | ( 1 << GPIO_INT_LEVEL_HIGH ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + return (1 << GPIO_INT_EDGE_LOW) | (1 << GPIO_INT_EDGE_HIGH) | (1 << GPIO_INT_EDGE_BOTH) + | (1 << GPIO_INT_LEVEL_LOW) | (1 << GPIO_INT_LEVEL_HIGH); } -UINT32 CPU_GPIO_GetPinDebounce( GPIO_PIN pin ) +UINT32 CPU_GPIO_GetPinDebounce(GPIO_PIN pin) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); UINT32 num = pin & 0x0F; - Int_State& state = g_int_state[ num ]; + Int_State& state = g_int_state[num]; - return state.debounceTicks / ( SLOW_CLOCKS_PER_SECOND / 1000 ); // ticks -> ms + return state.debounceTicks / (SLOW_CLOCKS_PER_SECOND / 1000); // ticks -> ms } -BOOL CPU_GPIO_SetPinDebounce( GPIO_PIN pin, INT64 debounceTimeMilliseconds ) +BOOL CPU_GPIO_SetPinDebounce(GPIO_PIN pin, INT64 debounceTimeMilliseconds) { - NATIVE_PROFILE_HAL_PROCESSOR_GPIO( ); + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); UINT32 num = pin & 0x0F; - Int_State& state = g_int_state[ num ]; + Int_State& state = g_int_state[num]; - if( debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000 ) + if(debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000) { - state.debounceTicks = CPU_MillisecondsToTicks( ( UINT32 )debounceTimeMilliseconds ); + state.debounceTicks = CPU_MillisecondsToTicks((UINT32)debounceTimeMilliseconds); return TRUE; } return FALSE; From 391b0e8bcd4f47999d580ec6077e8273f9902c2b Mon Sep 17 00:00:00 2001 From: sjmneves Date: Wed, 23 Mar 2016 14:27:32 +0000 Subject: [PATCH 087/144] Clean code --- .../Targets/CMSIS/GPIO/GPIO_functions.cpp | 54 ------------------- 1 file changed, 54 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp index 879a0d66a..33023c06a 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -415,42 +415,6 @@ void GPIO_Pin_Config(GPIO_PIN packed_port_pin, UINT32 mode, GPIO_RESISTOR resist EnableIRQ(gpio_pin); } #endif - - - // GPIO_TypeDef* port = Port(pin >> 4); // pointer to the actual port registers - // pin &= 0x0F; // bit number - // UINT32 bit = 1 << pin; - // UINT32 shift = pin << 1; // 2 bits / pin - // UINT32 mask = 0x3 << shift; - // UINT32 pull = 0; - // if(resistor == RESISTOR_PULLUP) - // pull = GPIO_PUPDR_PUPDR0_0; - - // if(resistor == RESISTOR_PULLDOWN) - // pull = GPIO_PUPDR_PUPDR0_1; - - // pull <<= shift; - // mode <<= shift; - // UINT32 speed = (alternate >> 8) << shift; - // UINT32 altSh = (pin & 0x7) << 2; // 4 bits / pin - // UINT32 altMsk = 0xF << altSh; - // UINT32 idx = pin >> 3; - // UINT32 af = ((alternate >> 4) & 0xF) << altSh; - - // GLOBAL_LOCK(irq); - - // port->MODER = port->MODER & ~mask | mode; - // port->PUPDR = port->PUPDR & ~mask | pull; - // port->OSPEEDR = port->OSPEEDR & ~mask | speed; - // port->AFR[idx] = port->AFR[idx] & ~altMsk | af; - // if(alternate & 1) - // { // open drain - // port->OTYPER |= bit; - // } - // else - // { - // port->OTYPER &= ~bit; - // } } BOOL CPU_GPIO_Initialize() @@ -550,16 +514,6 @@ BOOL CPU_GPIO_Initialize() #if defined (RCC_AHB1ENR_GPIOJEN) __HAL_RCC_GPIOJ_CLK_DISABLE(); #endif - - // EXTI->IMR = 0; // disable all external interrups; - // FIXME - // CPU_INTC_ActivateInterrupt(EXTI0_IRQn, GPIO_Interrupt0, 0); - // CPU_INTC_ActivateInterrupt(EXTI1_IRQn, GPIO_Interrupt1, 0); - // CPU_INTC_ActivateInterrupt(EXTI2_IRQn, GPIO_Interrupt2, 0); - // CPU_INTC_ActivateInterrupt(EXTI3_IRQn, GPIO_Interrupt3, 0); - // CPU_INTC_ActivateInterrupt(EXTI4_IRQn, GPIO_Interrupt4, 0); - // CPU_INTC_ActivateInterrupt(EXTI9_5_IRQn, GPIO_Interrupt5, 0); - // CPU_INTC_ActivateInterrupt(EXTI15_10_IRQn, GPIO_Interrupt10, 0); return TRUE; } @@ -574,14 +528,6 @@ BOOL CPU_GPIO_Uninitialize() } EXTI->IMR = 0; // disable all external interrups; - // FIXME - // CPU_INTC_DeactivateInterrupt(EXTI0_IRQn); - // CPU_INTC_DeactivateInterrupt(EXTI1_IRQn); - // CPU_INTC_DeactivateInterrupt(EXTI2_IRQn); - // CPU_INTC_DeactivateInterrupt(EXTI3_IRQn); - // CPU_INTC_DeactivateInterrupt(EXTI4_IRQn); - // CPU_INTC_DeactivateInterrupt(EXTI9_5_IRQn); - // CPU_INTC_DeactivateInterrupt(EXTI15_10_IRQn); return TRUE; } From 5776492c9c2654f63efddd341d068a22e01d515f Mon Sep 17 00:00:00 2001 From: sjmneves Date: Wed, 23 Mar 2016 17:09:46 +0000 Subject: [PATCH 088/144] Rework Initialize and Uninitialize functions to be compliant with CMSIS --- .../Targets/CMSIS/GPIO/GPIO_functions.cpp | 57 +++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp index 33023c06a..352f20c1e 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp @@ -440,98 +440,121 @@ BOOL CPU_GPIO_Initialize() GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pin = GPIO_PIN_All; + #if defined (RCC_AHB1ENR_GPIOAEN) + #if !defined(BUILD_RTM) + // don't change PA13 and PA14 as they maybe used in JTAG + GPIO_InitStruct.Pin = GPIO_PIN_All & (~GPIO_PIN_13) & (~GPIO_PIN_14); + #endif __HAL_RCC_GPIOA_CLK_ENABLE(); - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + #if defined(BUILD_RTM) + __HAL_RCC_GPIOA_CLK_DISABLE(); + #endif #endif #if defined (RCC_AHB1ENR_GPIOBEN) __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + __HAL_RCC_GPIOB_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOCEN) __HAL_RCC_GPIOC_CLK_ENABLE(); HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + __HAL_RCC_GPIOC_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIODEN) __HAL_RCC_GPIOD_CLK_ENABLE(); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + __HAL_RCC_GPIOD_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOEEN) __HAL_RCC_GPIOE_CLK_ENABLE(); HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + __HAL_RCC_GPIOE_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOFEN) __HAL_RCC_GPIOF_CLK_ENABLE(); HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + __HAL_RCC_GPIOF_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOGEN) __HAL_RCC_GPIOG_CLK_ENABLE(); HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + __HAL_RCC_GPIOG_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOHEN) __HAL_RCC_GPIOH_CLK_ENABLE(); HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + __HAL_RCC_GPIOH_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOIEN) __HAL_RCC_GPIOI_CLK_ENABLE(); HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + __HAL_RCC_GPIOI_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOJEN) __HAL_RCC_GPIOJ_CLK_ENABLE(); HAL_GPIO_Init(GPIOJ, &GPIO_InitStruct); + __HAL_RCC_GPIOJ_CLK_DISABLE(); #endif + return TRUE; +} + +BOOL CPU_GPIO_Uninitialize() +{ + NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + + for(int i = 0; i < Gpio_MaxInt; i++) + { + g_int_state[i].completion.Abort(); + } - // FIXME - // Disable GPIOs clock + // disable all GPIO external interrups and clock; #if defined (RCC_AHB1ENR_GPIOAEN) + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_All); __HAL_RCC_GPIOA_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOBEN) + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_All); __HAL_RCC_GPIOB_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOCEN) + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_All); __HAL_RCC_GPIOC_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIODEN) + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_All); __HAL_RCC_GPIOD_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOEEN) + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_All); __HAL_RCC_GPIOE_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOFEN) + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_All); __HAL_RCC_GPIOF_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOGEN) + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_All); __HAL_RCC_GPIOG_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOHEN) + HAL_GPIO_DeInit(GPIOH, GPIO_PIN_All); __HAL_RCC_GPIOH_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOIEN) + HAL_GPIO_DeInit(GPIOI, GPIO_PIN_All); __HAL_RCC_GPIOI_CLK_DISABLE(); #endif #if defined (RCC_AHB1ENR_GPIOJEN) + HAL_GPIO_DeInit(GPIOJ, GPIO_PIN_All); __HAL_RCC_GPIOJ_CLK_DISABLE(); #endif return TRUE; } -BOOL CPU_GPIO_Uninitialize() -{ - NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - - for(int i = 0; i < Gpio_MaxInt; i++) - { - g_int_state[i].completion.Abort(); - } - - EXTI->IMR = 0; // disable all external interrups; - - return TRUE; -} - UINT32 CPU_GPIO_Attributes(GPIO_PIN pin) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); From 062b019f6500c34c6599469d2dc52727780cfcea Mon Sep 17 00:00:00 2001 From: sjmneves Date: Thu, 24 Mar 2016 10:45:10 +0000 Subject: [PATCH 089/144] Added arrays size validation --- .../Targets/CMSIS/USART/USART_functions.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp index 864c51509..9a03fb2c0 100644 --- a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp +++ b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp @@ -32,6 +32,18 @@ static BYTE g_Uart_TxD_Pins[ARRAYSIZE(g_Uart_Ports)]; static UART_HandleTypeDef * uartHandlers[ARRAYSIZE(g_Uart_Ports)]; +#define CHECK_ARRAY_SIZE(condition) ((void)sizeof(char[(-1) + 1*!!(condition)])) + +void DummyToPerformArrayCheck() +{ + // g_Uart_Ports and g_Uart_Ports_Tx_Rx (and g_Uart_Ports_Flow_Control, if defined) arrays size must match + // Please go to platform_selector.h (in solution folder) and check related arrays + CHECK_ARRAY_SIZE(sizeof(g_Uart_Ports) == sizeof(g_Uart_Ports_Tx_Rx)); + #ifdef USART_PORTS_FLOW_CONTROL + CHECK_ARRAY_SIZE(sizeof(g_Uart_Ports) == sizeof(g_Uart_Ports_Flow_Control)); + #endif +} + /** * @brief Get USART/UART Index * This function goes throw g_Uart_Ports to find uart index @@ -79,18 +91,6 @@ void USART_Handle_TX_IRQ (int comPortNum, USART_TypeDef* uart) BOOL ComputeUSARTPins() { - // sanity check - if(ARRAYSIZE(g_Uart_Ports) != ARRAYSIZE(g_Uart_Ports_Tx_Rx)) - { - return FALSE; - } - #ifdef USART_PORTS_FLOW_CONTROL - if(ARRAYSIZE(g_Uart_Ports) != ARRAYSIZE(g_Uart_Ports_Flow_Control)) - { - return FALSE; - } - #endif - // fill arrays with user USART ports definitions for(int i = 0; i < ARRAYSIZE(g_Uart_Ports); i++) { From 183e1540c985e4042e2023a49ff7e201d19eb0d7 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Thu, 24 Mar 2016 15:47:22 +0000 Subject: [PATCH 090/144] Rework code to make it CMSIS compliant --- .../Targets/CMSIS/SPI/SPI_functions.cpp | 585 +++++++++++++++--- 1 file changed, 482 insertions(+), 103 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp index a15699cb7..c9749813c 100644 --- a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp +++ b/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp @@ -73,17 +73,18 @@ static BYTE g_Spi_Mosi_Pins[ARRAYSIZE(g_STM32_Spi_Port)]; #define SPI_MODS ARRAYSIZE_CONST_EXPR(g_Spi_Sclk_Pins) // number of modules - -BOOL CPU_SPI_Initialize() +void ComputeSPIPins() { - for (int i = 0; i < ARRAYSIZE( g_STM32_Spi_Port ); i++) + for (int i = 0; i < ARRAYSIZE(g_STM32_Spi_Port); i++) { + #if defined (SPI1) if(g_STM32_Spi_Port[i] == SPI1) { g_Spi_Sclk_Pins[i] = 5; // PA5 g_Spi_Miso_Pins[i] = 6; // PA6 g_Spi_Mosi_Pins[i] = 7; // PA7 } + #endif #if defined (SPI2) else if(g_STM32_Spi_Port[i] == SPI2) { @@ -125,6 +126,415 @@ BOOL CPU_SPI_Initialize() } #endif } +} + +void Configure_GPIOs() +{ + for (int i = 0; i < ARRAYSIZE(g_STM32_Spi_Port); i++) + { + GPIO_InitTypeDef GPIO_InitStruct; + + #if defined (SPI1) + if(g_STM32_Spi_Port[i] == SPI1) + { + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + /* Enable SPI clock */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* SPI SCK GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + #if defined (GPIO_AF5_SPI1) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + #elif defined (GPIO_AF6_SPI1) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI1; + #endif + + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* SPI MISO GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + #if defined (GPIO_AF5_SPI1) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + #elif defined (GPIO_AF6_SPI1) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI1; + #endif + + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* SPI MOSI GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_7; + #if defined (GPIO_AF5_SPI1) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + #elif defined (GPIO_AF6_SPI1) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI1; + #endif + + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + } + #endif + #if defined (SPI2) + else if(g_STM32_Spi_Port[i] == SPI2) + { + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + /* Enable SPI clock */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* SPI SCK GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + #if defined (GPIO_AF5_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + #elif defined (GPIO_AF6_SPI2) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI2; + #elif defined (GPIO_AF7_SPI2) + GPIO_InitStruct.Alternate = GPIO_AF7_SPI2; + #endif + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* SPI MISO GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_14; + #if defined (GPIO_AF5_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + #elif defined (GPIO_AF6_SPI2) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI2; + #elif defined (GPIO_AF7_SPI2) + GPIO_InitStruct.Alternate = GPIO_AF7_SPI2; + #endif + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* SPI MOSI GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_15; + #if defined (GPIO_AF5_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + #elif defined (GPIO_AF6_SPI2) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI2; + #elif defined (GPIO_AF7_SPI2) + GPIO_InitStruct.Alternate = GPIO_AF7_SPI2; + #endif + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } + #endif + #if defined (SPI3) + else if(g_STM32_Spi_Port[i] == SPI3) + { + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + /* Enable SPI clock */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* SPI SCK GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + #if defined (GPIO_AF5_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + #elif defined (GPIO_AF6_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + #elif defined (GPIO_AF7_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + #endif + + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* SPI MISO GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_11; + #if defined (GPIO_AF5_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + #elif defined (GPIO_AF6_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + #elif defined (GPIO_AF7_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + #endif + + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* SPI MOSI GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_12; + #if defined (GPIO_AF5_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + #elif defined (GPIO_AF6_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + #elif defined (GPIO_AF7_SPI3) + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + #endif + + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + } + #endif + #if defined (SPI4) + else if(g_STM32_Spi_Port[i] == SPI4) + { + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOE_CLK_ENABLE(); + /* Enable SPI clock */ + __HAL_RCC_SPI4_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* SPI SCK GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + #if defined (GPIO_AF5_SPI4) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; + #elif defined (GPIO_AF6_SPI4) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI4; + #endif + + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* SPI MISO GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_13; + #if defined (GPIO_AF5_SPI4) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; + #elif defined (GPIO_AF6_SPI4) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI4; + #endif + + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* SPI MOSI GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_14; + #if defined (GPIO_AF5_SPI4) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; + #elif defined (GPIO_AF6_SPI4) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI4; + #endif + + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + } + #endif + #if defined (SPI5) + else if(g_STM32_Spi_Port[i] == SPI5) + { + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + /* Enable SPI clock */ + __HAL_RCC_SPI5_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* SPI SCK GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + #if defined (GPIO_AF5_SPI5) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; + #elif defined (GPIO_AF6_SPI5) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI5; + #endif + + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* SPI MISO GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_8; + #if defined (GPIO_AF5_SPI5) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; + #elif defined (GPIO_AF6_SPI5) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI5; + #endif + + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* SPI MOSI GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_9; + #if defined (GPIO_AF5_SPI5) + GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; + #elif defined (GPIO_AF6_SPI5) + GPIO_InitStruct.Alternate = GPIO_AF6_SPI5; + #endif + + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + } + #endif + #if defined (SPI6) + else if(g_STM32_Spi_Port[i] == SPI6) + { + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOG_CLK_ENABLE(); + /* Enable SPI clock */ + __HAL_RCC_SPI6_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* SPI SCK GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI6; + + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* SPI MISO GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI6; + + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* SPI MOSI GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_14; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI6; + + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + } + #endif + } +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + if(g_Spi_Sclk_Pins[0] == 0) + { + // need to fill SPI pin arrays + ComputeSPIPins(); + // configure and enable GPIO clocks + Configure_GPIOs(); + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +{ + for (int i = 0; i < ARRAYSIZE(g_STM32_Spi_Port); i++) + { + #if defined (SPI1) + if(g_STM32_Spi_Port[i] == SPI1) + { + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_SPI1_FORCE_RESET(); + __HAL_RCC_SPI1_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure SPI SCK as alternate function */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5); + /* Configure SPI MISO as alternate function */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6); + /* Configure SPI MOSI as alternate function */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7); + + /*##-3- Disable the NVIC for SPI ###########################################*/ + HAL_NVIC_DisableIRQ(SPI1_IRQn); + } + #endif + #if defined (SPI2) + else if(g_STM32_Spi_Port[i] == SPI2) + { + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_SPI2_FORCE_RESET(); + __HAL_RCC_SPI2_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure SPI SCK as alternate function */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13); + /* Configure SPI MISO as alternate function */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14); + /* Configure SPI MOSI as alternate function */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_15); + + /*##-3- Disable the NVIC for SPI ###########################################*/ + HAL_NVIC_DisableIRQ(SPI2_IRQn); + } + #endif + #if defined (SPI3) + else if(g_STM32_Spi_Port[i] == SPI3) + { + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_SPI3_FORCE_RESET(); + __HAL_RCC_SPI3_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure SPI SCK as alternate function */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10); + /* Configure SPI MISO as alternate function */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11); + /* Configure SPI MOSI as alternate function */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12); + + /*##-3- Disable the NVIC for SPI ###########################################*/ + HAL_NVIC_DisableIRQ(SPI3_IRQn); + } + #endif + #if defined (SPI4) + else if(g_STM32_Spi_Port[i] == SPI4) + { + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_SPI4_FORCE_RESET(); + __HAL_RCC_SPI4_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure SPI SCK as alternate function */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_12); + /* Configure SPI MISO as alternate function */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_13); + /* Configure SPI MOSI as alternate function */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_14); + + /*##-3- Disable the NVIC for SPI ###########################################*/ + HAL_NVIC_DisableIRQ(SPI4_IRQn); + } + #endif + #if defined (SPI5) + else if(g_STM32_Spi_Port[i] == SPI5) + { + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_SPI5_FORCE_RESET(); + __HAL_RCC_SPI5_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure SPI SCK as alternate function */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_7); + /* Configure SPI MISO as alternate function */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_8); + /* Configure SPI MOSI as alternate function */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_9); + + /*##-3- Disable the NVIC for SPI ###########################################*/ + HAL_NVIC_DisableIRQ(SPI5_IRQn); + } + #endif + #if defined (SPI6) + else if(g_STM32_Spi_Port[i] == SPI6) + { + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_SPI6_FORCE_RESET(); + __HAL_RCC_SPI6_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure SPI SCK as alternate function */ + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_13); + /* Configure SPI MISO as alternate function */ + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_12); + /* Configure SPI MOSI as alternate function */ + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_14); + + /*##-3- Disable the NVIC for SPI ###########################################*/ + HAL_NVIC_DisableIRQ(SPI6_IRQn); + } + #endif + } +} + +BOOL CPU_SPI_Initialize() +{ return TRUE; } @@ -180,94 +590,84 @@ BOOL CPU_SPI_nWrite8_nRead8( const SPI_CONFIGURATION& Configuration, UINT8* Writ BOOL CPU_SPI_Xaction_Start( const SPI_CONFIGURATION& Configuration ) { + // SPI handler declaration + SPI_HandleTypeDef SpiHandle; + NATIVE_PROFILE_HAL_PROCESSOR_SPI(); if (Configuration.SPI_mod >= SPI_MODS) return FALSE; + // Configure the SPI peripheral + // Set the SPI parameters switch (Configuration.SPI_mod) { +#if defined (SPI1) case 0: - RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; - break; // enable SPI1 clock - -// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ -// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ -// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ -// defined (STM32F410Rx) + SpiHandle.Instance = SPI1; + break; // set instance +#endif #if defined (SPI2) - case 1: - RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; - break; // enable SPI2 clock + SpiHandle.Instance = SPI2; + break; // set instance #endif - -// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ -// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ -// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ -// defined (STM32F410Rx) #if defined (SPI3) - case 2: - RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; - break; // enable SPI3 clock + SpiHandle.Instance = SPI3; + break; // set instance #endif - -// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ -// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F405xx) #if defined (SPI4) - case 3: - RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; - break; // enable SPI4 clock + SpiHandle.Instance = SPI4; + break; // set instance #endif - -// #if defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F410Cx) || defined (STM32F410Rx) #if defined (SPI5) - case 4: - RCC->APB2ENR |= RCC_APB2ENR_SPI5EN; - break; // enable SPI5 clock + SpiHandle.Instance = SPI5; + break; // set instance #endif - -// #if defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ -// defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) #if defined (SPI6) - case 5: - RCC->APB2ENR |= RCC_APB2ENR_SPI6EN; - break; // enable SPI6 clock + SpiHandle.Instance = SPI6; + break; // set instance #endif - } + + SpiHandle.Init.Mode = SPI_MODE_MASTER; + SpiHandle.Init.Direction = SPI_DIRECTION_2LINES; + SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SpiHandle.Init.CRCPolynomial = 7; + SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB; + SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE; - ptr_SPI_TypeDef spi = g_STM32_Spi_Port[Configuration.SPI_mod]; + //ptr_SPI_TypeDef spi = g_STM32_Spi_Port[Configuration.SPI_mod]; // set mode bits - UINT32 cr1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_SPE; + //UINT32 cr1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_SPE; + SpiHandle.Init.NSS = SPI_NSS_SOFT; + + SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT; if (Configuration.MD_16bits) { - cr1 |= SPI_CR1_DFF; + //cr1 |= SPI_CR1_DFF; + SpiHandle.Init.DataSize = SPI_DATASIZE_16BIT; } if (Configuration.MSK_IDLE) { - cr1 |= SPI_CR1_CPOL | SPI_CR1_CPHA; + //cr1 |= SPI_CR1_CPOL | SPI_CR1_CPHA; + SpiHandle.Init.CLKPhase = SPI_PHASE_2EDGE; + SpiHandle.Init.CLKPolarity = SPI_POLARITY_HIGH; } if (!Configuration.MSK_SampleEdge) { - cr1 ^= SPI_CR1_CPHA; // toggle phase + //cr1 ^= SPI_CR1_CPHA; // toggle phase + SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE; } // set clock prescaler + SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; UINT32 clock = SYSTEM_APB2_CLOCK_HZ / 2000; // SPI1 on APB2 if (Configuration.SPI_mod > 0 && Configuration.SPI_mod < 3) { @@ -277,40 +677,49 @@ BOOL CPU_SPI_Xaction_Start( const SPI_CONFIGURATION& Configuration ) if (clock > Configuration.Clock_RateKHz << 3) { clock >>= 4; - cr1 |= SPI_CR1_BR_2; + // cr1 |= SPI_CR1_BR_2; + SpiHandle.Init.BaudRatePrescaler |= SPI_BAUDRATEPRESCALER_32; } if (clock > Configuration.Clock_RateKHz << 1) { clock >>= 2; - cr1 |= SPI_CR1_BR_1; + // cr1 |= SPI_CR1_BR_1; + SpiHandle.Init.BaudRatePrescaler |= SPI_BAUDRATEPRESCALER_8; } if (clock > Configuration.Clock_RateKHz) { - cr1 |= SPI_CR1_BR_0; + // cr1 |= SPI_CR1_BR_0; + SpiHandle.Init.BaudRatePrescaler |= SPI_BAUDRATEPRESCALER_4; } - spi->CR1 = cr1; + //spi->CR1 = cr1; - // I/O setup - GPIO_PIN msk, miso, mosi; - CPU_SPI_GetPins(Configuration.SPI_mod, msk, miso, mosi); - UINT32 alternate = 0x252; // AF5, speed = 2 (50MHz) - if (Configuration.SPI_mod == 2 && mosi != 54) + if(HAL_SPI_Init(&SpiHandle) != HAL_OK) { - alternate = 0x262; // SPI3 on AF6 + /* Initialization Error */ + return FALSE; } - CPU_GPIO_DisablePin( msk, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); - CPU_GPIO_DisablePin( miso, RESISTOR_DISABLED, 0, (GPIO_ALT_MODE)alternate); - CPU_GPIO_DisablePin( mosi, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); + // // I/O setup + // GPIO_PIN msk, miso, mosi; + // CPU_SPI_GetPins(Configuration.SPI_mod, msk, miso, mosi); + // UINT32 alternate = 0x252; // AF5, speed = 2 (50MHz) + // if (Configuration.SPI_mod == 2 && mosi != 54) + // { + // alternate = 0x262; // SPI3 on AF6 + // } + + // CPU_GPIO_DisablePin( msk, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); + // CPU_GPIO_DisablePin( miso, RESISTOR_DISABLED, 0, (GPIO_ALT_MODE)alternate); + // CPU_GPIO_DisablePin( mosi, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)alternate); - // CS setup - CPU_GPIO_EnableOutputPin( Configuration.DeviceCS, Configuration.CS_Active ); - if(Configuration.CS_Setup_uSecs) - { - HAL_Time_Sleep_MicroSeconds_InterruptEnabled( Configuration.CS_Setup_uSecs ); - } + // // CS setup + // CPU_GPIO_EnableOutputPin( Configuration.DeviceCS, Configuration.CS_Active ); + // if(Configuration.CS_Setup_uSecs) + // { + // HAL_Time_Sleep_MicroSeconds_InterruptEnabled( Configuration.CS_Setup_uSecs ); + // } return TRUE; } @@ -343,66 +752,36 @@ BOOL CPU_SPI_Xaction_Stop( const SPI_CONFIGURATION& Configuration ) switch (Configuration.SPI_mod) { +#if defined (SPI6) case 0: RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN; break; // disable SPI1 clock - -// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ -// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ -// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ -// defined (STM32F410Rx) +#endif #if defined (SPI2) - case 1: RCC->APB1ENR &= ~RCC_APB1ENR_SPI2EN; break; // disable SPI2 clock #endif - -// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ -// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F405xx) || defined (STM32F407xx) || \ -// defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F410Cx) || \ -// defined (STM32F410Rx) #if defined (SPI3) - case 2: RCC->APB1ENR &= ~RCC_APB1ENR_SPI3EN; break; // disable SPI3 clock #endif - -// #if defined (STM32F401xC) || defined (STM32F401xE) || defined (STM32F446xx) || \ -// defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F405xx) #if defined (SPI4) - case 3: RCC->APB2ENR &= ~RCC_APB2ENR_SPI4EN; break; // disable SPI4 clock #endif - -// #if defined (STM32F411xE) || defined (STM32F427xx) || defined (STM32F429xx) || \ -// defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F469xx) || \ -// defined (STM32F479xx) || defined (STM32F410Cx) || defined (STM32F410Rx) #if defined (SPI5) - case 4: RCC->APB2ENR &= ~RCC_APB2ENR_SPI5EN; break; // disable SPI5 clock #endif - -// #if defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || \ -// defined (STM32F439xx) || defined (STM32F469xx) || defined (STM32F479xx) #if defined (SPI6) - case 5: RCC->APB2ENR &= ~RCC_APB2ENR_SPI6EN; break; // disable SPI6 clock #endif - } return TRUE; From 1cc11d1e312b437678c2834018dabf8207b636a3 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 24 Mar 2016 15:52:46 +0000 Subject: [PATCH 091/144] Set NVIC priorities for USART modules --- DeviceCode/Targets/CMSIS/USART/USART_functions.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp index 9a03fb2c0..6101be32c 100644 --- a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp +++ b/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp @@ -460,42 +460,42 @@ void SetUSARTPriority(int comPortNum) // USART/UART alternate function if(g_Uart_Ports[comPortNum] == USART1) { - HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); + HAL_NVIC_SetPriority(USART1_IRQn, USART1_PRIORITY, 1); } #ifdef USART2 else if(g_Uart_Ports[comPortNum] == USART2) { - HAL_NVIC_SetPriority(USART2_IRQn, 0, 1); + HAL_NVIC_SetPriority(USART2_IRQn, USART2_PRIORITY, 1); } #endif #ifdef USART3 else if(g_Uart_Ports[comPortNum] == USART3) { - HAL_NVIC_SetPriority(USART3_IRQn, 0, 1); + HAL_NVIC_SetPriority(USART3_IRQn, USART3_PRIORITY, 1); } #endif #ifdef UART4 else if(g_Uart_Ports[comPortNum] == UART4) { - HAL_NVIC_SetPriority(UART4_IRQn, 0, 1); + HAL_NVIC_SetPriority(UART4_IRQn, USART4_PRIORITY, 1); } #endif #ifdef USART6 else if(g_Uart_Ports[comPortNum] == USART6) { - HAL_NVIC_SetPriority(USART6_IRQn, 0, 1); + HAL_NVIC_SetPriority(USART6_IRQn, USART6_PRIORITY, 1); } #endif #ifdef UART7 else if(g_Uart_Ports[comPortNum] == UART7) { - HAL_NVIC_SetPriority(UART7_IRQn, 0, 1); + HAL_NVIC_SetPriority(UART7_IRQn, USART7_PRIORITY, 1); } #endif #ifdef UART8 else if(g_Uart_Ports[comPortNum] == UART8) { - HAL_NVIC_SetPriority(UART8_IRQn, 0, 1); + HAL_NVIC_SetPriority(UART8_IRQn, USART8_PRIORITY, 1); } #endif } From 233823970a4acff4a955cf29a4dcb6989d9f66d2 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 09:05:17 +0100 Subject: [PATCH 092/144] Correct implementation of interface to hardware CRC calculation unit - fully working for 0 init value and when size is multiple of 4 - still needs work for the remanining situations --- .../Targets/CMSIS/CRC/CRC_functions.cpp | 69 ++++++++++++------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp b/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp index 606f64a80..0ab429349 100644 --- a/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp +++ b/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp @@ -14,48 +14,71 @@ #include /* - Interface to Cortex-M CRC calculation unit that implements the equivalent to the software implementation in Support\CRC project. + Interface to Cortex-M CRC calculation unit that implements the equivalent to the software implementation at Support\CRC project. CRC-32 (Ethernet) polynomial: 0x4C11DB7. - rgBlock: pointer to the region block to be CRCed - nLength: lenght of rgBlock to compute CRC + buffer: pointer to the region block to be CRCed + size: lenght of buffer to compute CRC crc: previous CRC value to start CRC computing */ -UINT32 SUPPORT_ComputeCRC(const void* rgBlock, int nLength, UINT32 crc) +UINT32 SUPPORT_ComputeCRC(const void* buffer, int size, UINT32 initCrc) { CRC_HandleTypeDef hcrc; + uint32_t index = 0U; - + uint32_t arg1; + UINT32 crc; + + // anything to do here? + if(size == 0) + { + return initCrc; + } + // init CRC unit hcrc.Instance = CRC; HAL_CRC_Init(&hcrc); - // Process Locked - __HAL_LOCK(&hcrc); + // Reset CRC Calculation Unit + __HAL_CRC_DR_RESET(&hcrc); + + // // if crc (argument for initial value) is not 0, init the CRC calculation unit with this value + // if(crc != 0) + // { + // // init CRC value + // hcrc.Instance->DR = __RBIT(crc); + // } - // Change CRC peripheral state - hcrc.State = HAL_CRC_STATE_BUSY; + uint8_t* ptr = (uint8_t*)buffer; - // if crc (argument for initial value) is not 0, init the CRC calculation unit with this value - if(crc != 0) + // CRC calculation unit is initialed with 0xFFFFFFFF which is not good for our CRC calculations + // feeding 0xFFFFFFFF to the calculation unit will set the register to 0x00000000 + + while(hcrc.Instance->DR != 0x0) { - // init CRC value - hcrc.Instance->DR = crc; - } + hcrc.Instance->DR = 0xFFFFFFFF; + } - const UINT8* ptr = (const UINT8*)rgBlock; + // we'll be reading the buffer in steps of 4 bytes, so the size must be recalculated accordingly + size = size >> 2; // Enter Data to the CRC calculator - for(index = 0U; index < nLength; index++) + for(index = 0U; index < size; index++) { - hcrc.Instance->DR = (uint32_t)*ptr++; - } + // take the next 4 bytes as if they were a UINT32 + // because the CRC calculation unit expects the bytes in reverse order, reverse the byte order first + arg1 = __REV(*(uint32_t*)(ptr)); + + // feed the bytes to the CRC + hcrc.Instance->DR = arg1; - // Change CRC peripheral state to ready - hcrc.State = HAL_CRC_STATE_READY; + // copy to return value + crc = (uint32_t)hcrc.Instance->DR; - // Process Unlocked - __HAL_UNLOCK(&hcrc); + // increase pointer by 4 to the next position + // we are reading UINT32 from a UINT8 pointer + ptr +=4; + } // Return the CRC computed value - return hcrc.Instance->DR; + return crc; } From 65da50a4531e49edd17f1edf483eb36bb6f7840a Mon Sep 17 00:00:00 2001 From: sjmneves Date: Tue, 5 Apr 2016 09:28:08 +0100 Subject: [PATCH 093/144] Correct include path for Analog, PWM and DA features --- DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index acb39cd88..359f43403 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -126,21 +126,21 @@ - + - + - + - + From c658d9e9a2ed2561b4948914406f2977a7bb233f Mon Sep 17 00:00:00 2001 From: sjmneves Date: Tue, 5 Apr 2016 11:39:09 +0100 Subject: [PATCH 094/144] Added CMSIS Analog, PWM, DA drivers (work in progress) - updated I2C code (work in progress) - added new defines to platform_selector (work in progress) --- .../Targets/CMSIS/Analog/AD_functions.cpp | 304 ++++++++++++++++++ DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj | 33 ++ DeviceCode/Targets/CMSIS/DA/DA_functions.cpp | 199 ++++++++++++ DeviceCode/Targets/CMSIS/DA/dotNetMF.proj | 33 ++ .../Targets/CMSIS/I2C/i2c_functions.cpp | 172 ++++++++-- DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj | 33 ++ .../Targets/CMSIS/PWM/pwm_functions.cpp | 238 ++++++++++++++ .../STM32F4DISCOVERY/platform_selector.h | 17 +- 8 files changed, 997 insertions(+), 32 deletions(-) create mode 100644 DeviceCode/Targets/CMSIS/Analog/AD_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj create mode 100644 DeviceCode/Targets/CMSIS/DA/DA_functions.cpp create mode 100644 DeviceCode/Targets/CMSIS/DA/dotNetMF.proj create mode 100644 DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj create mode 100644 DeviceCode/Targets/CMSIS/PWM/pwm_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/Analog/AD_functions.cpp b/DeviceCode/Targets/CMSIS/Analog/AD_functions.cpp new file mode 100644 index 000000000..e71c3cbe7 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Analog/AD_functions.cpp @@ -0,0 +1,304 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** AD Conversion *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +//--// + + +#define AD_SAMPLE_TIME 2 // sample time = 28 cycles + +#if USER_ADC == 1 + #define ADCx ADC1 + #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC1EN + // ADC1 pins plus two internally connected channels thus the 0 for 'no pin' + // Vsense for temperature sensor @ ADC1_IN16 + // Vrefubt for internal voltage reference (1.21V) @ ADC1_IN17 + // to access the internal channels need to include '16' and/or '17' at the AD_CHANNELS array in 'platform_selector.h' + #define ADC_PINS {0,1,2,3,4,5,6,7,16,17,32,33,34,35,36,37,0,0} +#elif USER_ADC == 3 + #define ADCx ADC3 + #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC3EN + #define ADC_PINS {0,1,2,3,86,87,88,89,90,83,32,33,34,35,84,85} // ADC3 pins +#else + #error "wrong USER_ADC value (1 or 3). Please go to platform_selector.h (in solution folder) and re-define USER_ADC" +#endif + +// Channels +static const BYTE g_AD_Channel[] = AD_CHANNELS; +static const uint32_t g_ADC_Channel[] = ADC_CHANNELS; +static const BYTE g_AD_Pins[] = ADC_PINS; +#define AD_NUM ARRAYSIZE_CONST_EXPR(g_AD_Channel) // number of channels + +// ADC handler declaration +ADC_HandleTypeDef AdcHandle; + + +//--// + +/** + * @brief ADC MSP Initialization + * This function configures the hardware resources used in this example: + * - Peripheral's clock enable + * - Peripheral's GPIO Configuration + * @param huart: UART handle pointer + * @retval None + */ +void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct; + static DMA_HandleTypeDef hdma_adc; + + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO clock */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + /* ADC3 Periph clock enable */ + __HAL_RCC_ADC1_CLK_ENABLE(); + /* Enable DMA2 clock */ + __HAL_RCC_DMA2_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* ADC3 Channel8 GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_0; // FIXME + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*##-3- Configure the DMA streams ##########################################*/ + /* Set the parameters to be configured */ + hdma_adc.Instance = DMA2_Stream0; + + hdma_adc.Init.Channel = DMA_CHANNEL_0; // FIXME + hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_adc.Init.MemInc = DMA_MINC_ENABLE; + hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_adc.Init.Mode = DMA_CIRCULAR; + hdma_adc.Init.Priority = DMA_PRIORITY_HIGH; + hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL; + hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE; + hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE; + + HAL_DMA_Init(&hdma_adc); + + /* Associate the initialized DMA handle to the the ADC handle */ + __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc); + + /*##-4- Configure the NVIC for DMA #########################################*/ + /* NVIC configuration for DMA transfer complete interrupt */ + HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); +} + +/** + * @brief ADC MSP De-Initialization + * This function frees the hardware resources used in this example: + * - Disable the Peripheral's clock + * - Revert GPIO to their default state + * @param hadc: ADC handle pointer + * @retval None + */ +void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc) +{ + static DMA_HandleTypeDef hdma_adc; + + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_ADC_FORCE_RESET(); + __HAL_RCC_ADC_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* De-initialize the ADC3 Channel8 GPIO pin */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0); + + /*##-3- Disable the DMA Streams ############################################*/ + /* De-Initialize the DMA Stream associate to transmission process */ + HAL_DMA_DeInit(&hdma_adc); + + /*##-4- Disable the NVIC for DMA ###########################################*/ + HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn); +} + +BOOL AD_Initialize(ANALOG_CHANNEL channel, INT32 precisionInBits) +{ + ADC_ChannelConfTypeDef sConfig; + + int chNum = g_AD_Channel[channel]; + + // init this channel if it's listed in the AD_CHANNELS array + // FIXME + /*##-1- Configure the ADC peripheral #######################################*/ + AdcHandle.Instance = ADCx; + + AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; + AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; + AdcHandle.Init.ScanConvMode = DISABLE; + AdcHandle.Init.ContinuousConvMode = ENABLE; + AdcHandle.Init.DiscontinuousConvMode = DISABLE; + AdcHandle.Init.NbrOfDiscConversion = 0; + AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; + AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; + AdcHandle.Init.NbrOfConversion = 1; + AdcHandle.Init.DMAContinuousRequests = ENABLE; + AdcHandle.Init.EOCSelection = DISABLE; + + if(HAL_ADC_Init(&AdcHandle) != HAL_OK) + { + // channel not available + return FALSE; + } + + /*##-2- Configure ADC regular channel ######################################*/ + /* Note: Considering IT occurring after each number of size of */ + /* "uhADCxConvertedValue" ADC conversions (IT by DMA end */ + /* of transfer), select sampling time and ADC clock with sufficient */ + /* duration to not create an overhead situation in IRQHandler. */ + sConfig.Channel = g_ADC_Channel[chNum];//ADCx_CHANNEL; + sConfig.Rank = 1; + sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES; + sConfig.Offset = 0; + + if(HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK) + { + // channel not available + return FALSE; + } + return TRUE; + + // FIXME + // /*##-3- Start the conversion process and enable interrupt ##################*/ + // /* Note: Considering IT occurring after each number of ADC conversions */ + // /* (IT by DMA end of transfer), select sampling time and ADC clock */ + // /* with sufficient duration to not create an overhead situation in */ + // /* IRQHandler. */ + // if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1) != HAL_OK) + // { + // // channel not available + // return FALSE; + // } + + // for (int i = 0; i < AD_NUM ; i++) + // { + // if (g_AD_Channel[i] == chNum) + // { + // // valid channel + // if (!(RCC->APB2ENR & RCC_APB2ENR_ADCxEN)) { // not yet initialized + // RCC->APB2ENR |= RCC_APB2ENR_ADCxEN; // enable AD clock + // ADC->CCR = 0; // ADCCLK = PB2CLK / 2; + // ADCx->SQR1 = 0; // 1 conversion + // ADCx->CR1 = 0; + // ADCx->CR2 = ADC_CR2_ADON; // AD on + // ADCx->SMPR1 = 0x01249249 * AD_SAMPLE_TIME; + // ADCx->SMPR2 = 0x09249249 * AD_SAMPLE_TIME; + // } + + // // set pin as analog input if channel is not one of the internally connected + // if(chNum <= 15) { + // CPU_GPIO_DisablePin(AD_GetPinForChannel(channel), RESISTOR_DISABLED, 0, GPIO_ALT_MODE_1); + // return TRUE; + // } + // } + // } + + // // channel not available + // return FALSE; +} + +void AD_Uninitialize(ANALOG_CHANNEL channel) +{ + // FIXME + HAL_ADC_DeInit(&AdcHandle); + + // int chNum = g_AD_Channel[channel]; + + // // free GPIO pin if this channel is listed in the AD_CHANNELS array + // // and if it's not one of the internally connected ones as these channels don't take any GPIO pins + // if(chNum <= 15) { + // CPU_GPIO_DisablePin(AD_GetPinForChannel(channel), RESISTOR_DISABLED, 0, GPIO_ALT_PRIMARY); + // } +} + +INT32 AD_Read(ANALOG_CHANNEL channel) +{ + int chNum = g_AD_Channel[channel]; + + // check if this channel is listed in the AD_CHANNELS array + for (int i = 0; i < AD_NUM ; i++) { + if (g_AD_Channel[i] == chNum) { + // valid channel + int x = ADCx->DR; // clear EOC flag + + ADCx->SQR3 = chNum; // select channel + + // need to enable internal reference at ADC->CCR register to work with internally connected channels + if(chNum == 16 || chNum == 17) + { + ADC->CCR |= ADC_CCR_TSVREFE; // Enable internal reference to work with temperature sensor and VREFINT channels + } + + ADCx->CR2 |= ADC_CR2_SWSTART; // start AD + while (!(ADCx->SR & ADC_SR_EOC)); // wait for completion + + // disable internally reference + if(chNum == 16 || chNum == 17) { + ADC->CCR &= ~ADC_CCR_TSVREFE; + } + + return ADCx->DR; // read result + } + } + + // channel not available + return 0; +} + +UINT32 AD_ADChannels() +{ + return AD_NUM; +} + +GPIO_PIN AD_GetPinForChannel(ANALOG_CHANNEL channel) +{ + // return GPIO pin + // for internally connected channels this is GPIO_PIN_NONE as these don't take any GPIO pins + int chNum = g_AD_Channel[channel]; + + for (int i = 0; i < AD_NUM ; i++) { + if (g_AD_Channel[i] == chNum) { + return (GPIO_PIN)g_AD_Pins[chNum]; + } + } + + // channel not available + return GPIO_PIN_NONE; +} + +BOOL AD_GetAvailablePrecisionsForChannel(ANALOG_CHANNEL channel, INT32* precisions, UINT32& size) +{ + int chNum = g_AD_Channel[channel]; + + // check if this channel is listed in the AD_CHANNELS array + for (int i = 0; i < AD_NUM ; i++) { + if (g_AD_Channel[i] == chNum) { + precisions[0] = 12; + size = 1; + return TRUE; + } + } + + // channel not available + size = 0; + return FALSE; +} diff --git a/DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj b/DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj new file mode 100644 index 000000000..e49cb2450 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj @@ -0,0 +1,33 @@ + + + CMSIS_Analog + {BAF21A91-C7D1-43F3-A9D0-8098D48E2D29} + + + CMSIS Analog driver + HAL + CMSIS_Analog.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Analog\dotNetMF.proj + CMSIS_Analog.$(LIB_EXT).manifest + + + + False + + + False + False + False + DeviceCode\Targets\Native\CMSIS\DeviceCode\CMSIS_Analog + Library + false + 4.0.0.0 + + + + + + + + + diff --git a/DeviceCode/Targets/CMSIS/DA/DA_functions.cpp b/DeviceCode/Targets/CMSIS/DA/DA_functions.cpp new file mode 100644 index 000000000..c45c32781 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/DA/DA_functions.cpp @@ -0,0 +1,199 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** DA Conversion *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +/////////////////////////////////////////////////////////////////////////////// + +#define DA_CHANNELS 2 // number of channels +#define DA_FIRST_PIN 4 // channel 0 pin (A4) + +//--// + +DAC_HandleTypeDef DacHandle; + +/** + * @brief DAC MSP De-Initialization + * This function frees the hardware resources used in this example: + * - Disable the Peripheral's clock + * - Revert GPIO to their default state + * @param hadc: DAC handle pointer + * @retval None + */ +void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* DAC Periph clock enable */ + __HAL_RCC_DAC_CLK_ENABLE(); + /* Enable GPIO clock ****************************************/ + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* DAC Channel1 GPIO pin configuration */ + GPIO_InitStruct.Pin = GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +} + +/** + * @brief DeInitializes the DAC MSP. + * @param hdac: pointer to a DAC_HandleTypeDef structure that contains + * the configuration information for the specified DAC. + * @retval None + */ +void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) +{ + static DMA_HandleTypeDef hdma_dac1; + + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_DAC_FORCE_RESET(); + __HAL_RCC_DAC_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* De-initialize the DAC Channel1 GPIO pin */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4); +} + +BOOL DA_Initialize(DA_CHANNEL channel, INT32 precisionInBits) +{ + DAC_ChannelConfTypeDef sConfig; + + if (precisionInBits != 12) return FALSE; + + // FIXME *##-1- Configure the DAC peripheral #######################################*/ + DacHandle.Instance = DAC; + /*##-1- Initialize the DAC peripheral ######################################*/ + if(HAL_DAC_Init(&DacHandle) != HAL_OK) + { + /* Initialization Error */ + return FALSE; + } + + /*##-2- Configure DAC channel1 #############################################*/ + sConfig.DAC_Trigger = DAC_TRIGGER_NONE; + sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; + + if (channel) + { + // enable channel 2 + if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_2) != HAL_OK) + { + /* Channel configuration Error */ + return FALSE; + } + /*##-3- Set DAC Channel1 DHR register ######################################*/ + if (HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 0xFF) != HAL_OK) + { + /* Setting value Error */ + return FALSE; + } + /*##-4- Enable DAC Channel ################################################*/ + if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_2) != HAL_OK) + { + /* Start Error */ + return FALSE; + } + } + else + { + // enable channel 1 + if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK) + { + /* Channel configuration Error */ + return FALSE; + } + /*##-3- Set DAC Channel1 DHR register ######################################*/ + if (HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0xFF) != HAL_OK) + { + /* Setting value Error */ + return FALSE; + } + /*##-4- Enable DAC Channel ################################################*/ + if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK) + { + /* Start Error */ + return FALSE; + } + } + + // // enable DA clock + // RCC->APB1ENR |= RCC_APB1ENR_DACEN; + // // set pin as analog + // CPU_GPIO_DisablePin(DA_FIRST_PIN + channel, RESISTOR_DISABLED, 0, GPIO_ALT_MODE_1); + // if (channel) { + // DAC->CR |= DAC_CR_EN2; // enable channel 2 + // } else { + // DAC->CR |= DAC_CR_EN1; // enable channel 1 + // } + return TRUE; +} + +void DA_Uninitialize(DA_CHANNEL channel) +{ + // FIXME + HAL_DAC_DeInit(&DacHandle); + + // if (channel) { + // DAC->CR &= ~DAC_CR_EN2; // disable channel 2 + // } else { + // DAC->CR &= ~DAC_CR_EN1; // disable channel 1 + // } + // // free pin + // CPU_GPIO_DisablePin(DA_FIRST_PIN + channel, RESISTOR_DISABLED, 0, GPIO_ALT_PRIMARY); + // if ((DAC->CR & (DAC_CR_EN1 | DAC_CR_EN2)) == 0) { // all channels off + // // disable DA clock + // RCC->APB1ENR &= ~RCC_APB1ENR_DACEN; + // } +} + +// level is a 12 bit value +void DA_Write(DA_CHANNEL channel, INT32 level) +{ + if (channel) + { + DAC->DHR12R2 = level; + } + else + { + DAC->DHR12R1 = level; + } +} + +UINT32 DA_DAChannels() +{ + return DA_CHANNELS; +} + +GPIO_PIN DA_GetPinForChannel(DA_CHANNEL channel) +{ + if ((UINT32)channel >= DA_CHANNELS) + { + return GPIO_PIN_NONE; + } + return DA_FIRST_PIN + channel; +} + +BOOL DA_GetAvailablePrecisionsForChannel(DA_CHANNEL channel, INT32* precisions, UINT32& size) +{ + size = 0; + if (precisions == NULL || (UINT32)channel >= DA_CHANNELS) + { + return FALSE; + } + precisions[0] = 12; + size = 1; + return TRUE; +} diff --git a/DeviceCode/Targets/CMSIS/DA/dotNetMF.proj b/DeviceCode/Targets/CMSIS/DA/dotNetMF.proj new file mode 100644 index 000000000..26919d6bf --- /dev/null +++ b/DeviceCode/Targets/CMSIS/DA/dotNetMF.proj @@ -0,0 +1,33 @@ + + + CMSIS_DA + + + {DC611111-BDE0-479C-A1A4-AC76DE4F96B6} + CMSIS DA driver + HAL + CMSIS_DA.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\DA\dotNetMF.proj + CMSIS_DA.$(LIB_EXT).manifest + + + + False + + + False + False + False + DeviceCode\Targets\CMSIS\DA + Library + false + 4.0.0.0 + + + + + + + + + diff --git a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp index b9966fe45..1973fb82f 100644 --- a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp +++ b/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp @@ -40,7 +40,7 @@ // #define I2C_SDA_PIN 41 // PC9 // #endif // #else // use I2C1 by default - #define I2Cx I2C1 + #define I2Cx I2C1 #define I2Cx_EV_IRQn I2C1_EV_IRQn #define I2Cx_ER_IRQn I2C1_ER_IRQn #define RCC_APB1ENR_I2CxEN RCC_APB1ENR_I2C1EN @@ -56,6 +56,108 @@ static I2C_HAL_XACTION* currentI2CXAction; static I2C_HAL_XACTION_UNIT* currentI2CUnit; +/** + * @brief This function handles I2C event interrupt request. + * @param None + * @retval None + * @Note This function is redefined in "main.h" and related to I2C data transmission + */ +void I2C1_EV_IRQHandler(void) +{ + HAL_I2C_EV_IRQHandler(& I2cHandle); +} + +/** + * @brief This function handles I2C error interrupt request. + * @param None + * @retval None + * @Note This function is redefined in "main.h" and related to I2C error + */ +void I2C1_ER_IRQHandler(void) +{ + HAL_I2C_ER_IRQHandler(& I2cHandle); +} + +/** + * @brief Master Tx Transfer completed callbacks. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) +{ +} + +/** + * @brief Master Rx Transfer completed callbacks. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) +{ +} + +/** + * @brief I2C error callbacks. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for I2C module + * @retval None + */ +void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) +{ +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + /* Enable I2C1 clock */ + __HAL_RCC_I2C1_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* I2C TX GPIO pin configuration */ + GPIO_InitStruct.Pin = I2C_SCL_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C RX GPIO pin configuration */ + GPIO_InitStruct.Pin = I2C_SDA_PIN; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*##-3- Configure the NVIC for I2C #########################################*/ + /* NVIC for I2C1 */ + HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); + HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 2); + HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) +{ + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_I2C1_FORCE_RESET(); + __HAL_RCC_I2C1_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure I2C Tx as alternate function */ + HAL_GPIO_DeInit(GPIOB, I2C_SCL_PIN); + /* Configure I2C Rx as alternate function */ + HAL_GPIO_DeInit(GPIOB, I2C_SDA_PIN); + + /*##-3- Disable the NVIC for I2C ###########################################*/ + HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); + HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); +} void I2C_ER_Interrupt (void* param) // Error Interrupt Handler { @@ -154,42 +256,42 @@ void I2C_EV_Interrupt (void* param) // Event Interrupt Handler BOOL I2C_Internal_Initialize() { - NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + // NATIVE_PROFILE_HAL_PROCESSOR_I2C(); - if (!(RCC->APB1ENR & RCC_APB1ENR_I2CxEN)) { // only once - currentI2CXAction = NULL; - currentI2CUnit = NULL; + // if (!(RCC->APB1ENR & RCC_APB1ENR_I2CxEN)) { // only once + // currentI2CXAction = NULL; + // currentI2CUnit = NULL; - // set pins to AF4 and open drain - CPU_GPIO_DisablePin( I2C_SDA_PIN, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)0x43 ); - CPU_GPIO_DisablePin( I2C_SCL_PIN, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)0x43 ); + // // set pins to AF4 and open drain + // CPU_GPIO_DisablePin( I2C_SDA_PIN, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)0x43 ); + // CPU_GPIO_DisablePin( I2C_SCL_PIN, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)0x43 ); - RCC->APB1ENR |= RCC_APB1ENR_I2CxEN; // enable I2C clock - RCC->APB1RSTR = RCC_APB1RSTR_I2CxRST; // reset I2C peripheral - RCC->APB1RSTR = 0; + // RCC->APB1ENR |= RCC_APB1ENR_I2CxEN; // enable I2C clock + // RCC->APB1RSTR = RCC_APB1RSTR_I2CxRST; // reset I2C peripheral + // RCC->APB1RSTR = 0; - I2Cx->CR2 = SYSTEM_APB1_CLOCK_HZ / 1000000; // APB1 clock in MHz - I2Cx->CCR = (SYSTEM_APB1_CLOCK_HZ / 1000 / 2 - 1) / 100 + 1; // 100KHz - I2Cx->TRISE = SYSTEM_APB1_CLOCK_HZ / (1000 * 1000) + 1; // 1ns; - I2Cx->OAR1 = 0x4000; // init address register + // I2Cx->CR2 = SYSTEM_APB1_CLOCK_HZ / 1000000; // APB1 clock in MHz + // I2Cx->CCR = (SYSTEM_APB1_CLOCK_HZ / 1000 / 2 - 1) / 100 + 1; // 100KHz + // I2Cx->TRISE = SYSTEM_APB1_CLOCK_HZ / (1000 * 1000) + 1; // 1ns; + // I2Cx->OAR1 = 0x4000; // init address register - I2Cx->CR1 = I2C_CR1_PE; // enable peripheral + // I2Cx->CR1 = I2C_CR1_PE; // enable peripheral - CPU_INTC_ActivateInterrupt(I2Cx_EV_IRQn, I2C_EV_Interrupt, 0); - CPU_INTC_ActivateInterrupt(I2Cx_ER_IRQn, I2C_ER_Interrupt, 0); - } + // CPU_INTC_ActivateInterrupt(I2Cx_EV_IRQn, I2C_EV_Interrupt, 0); + // CPU_INTC_ActivateInterrupt(I2Cx_ER_IRQn, I2C_ER_Interrupt, 0); + // } return TRUE; } BOOL I2C_Internal_Uninitialize() { - NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + // NATIVE_PROFILE_HAL_PROCESSOR_I2C(); - CPU_INTC_DeactivateInterrupt(I2Cx_EV_IRQn); - CPU_INTC_DeactivateInterrupt(I2Cx_ER_IRQn); - I2Cx->CR1 = 0; // disable peripheral - RCC->APB1ENR &= ~RCC_APB1ENR_I2CxEN; // disable I2C clock + // CPU_INTC_DeactivateInterrupt(I2Cx_EV_IRQn); + // CPU_INTC_DeactivateInterrupt(I2Cx_ER_IRQn); + // I2Cx->CR1 = 0; // disable peripheral + // RCC->APB1ENR &= ~RCC_APB1ENR_I2CxEN; // disable I2C clock return TRUE; } @@ -198,6 +300,28 @@ void I2C_Internal_XActionStart( I2C_HAL_XACTION* xAction, bool repeatedStart ) { NATIVE_PROFILE_HAL_PROCESSOR_I2C(); + // I2C handler declaration + I2C_HandleTypeDef I2cHandle; + + /*##-1- Configure the I2C peripheral ######################################*/ + I2cHandle.Instance = I2Cx; + + I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_10BIT; + I2cHandle.Init.ClockSpeed = xAction->m_clockRate + (xAction->m_clockRate2 << 8);//400000; + I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9; + I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + I2cHandle.Init.OwnAddress1 = xAction->m_address;//I2C_ADDRESS; + I2cHandle.Init.OwnAddress2 = 0xFE; + + if(HAL_I2C_Init(&I2cHandle) != HAL_OK) + { + // Initialization Error + return FALSE; + } + + currentI2CXAction = xAction; currentI2CUnit = xAction->m_xActionUnits[ xAction->m_current++ ]; diff --git a/DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj b/DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj new file mode 100644 index 000000000..8980bd93f --- /dev/null +++ b/DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj @@ -0,0 +1,33 @@ + + + CMSIS_PWM + + + {F8B057D8-D36B-4103-BDC3-A2D482DFA0C9} + CMSIS PWM driver + HAL + CMSIS_PWM.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\CMSIS\PWM\dotNetMF.proj + CMSIS_PWM.$(LIB_EXT).manifest + + + + False + + + False + False + False + DeviceCode\Targets\CMSIS\PWM + Library + false + 4.0.0.0 + + + + + + + + + diff --git a/DeviceCode/Targets/CMSIS/PWM/pwm_functions.cpp b/DeviceCode/Targets/CMSIS/PWM/pwm_functions.cpp new file mode 100644 index 000000000..bc630d6b9 --- /dev/null +++ b/DeviceCode/Targets/CMSIS/PWM/pwm_functions.cpp @@ -0,0 +1,238 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc. +// +// *** PWM Driver *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + + +#if SYSTEM_APB1_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ + #define PWM1_CLK_HZ (SYSTEM_APB1_CLOCK_HZ) +#else + #define PWM1_CLK_HZ (SYSTEM_APB1_CLOCK_HZ * 2) +#endif +#define PWM1_CLK_MHZ (PWM1_CLK_HZ / ONE_MHZ) + +#if SYSTEM_APB2_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ + #define PWM2_CLK_HZ (SYSTEM_APB2_CLOCK_HZ) +#else + #define PWM2_CLK_HZ (SYSTEM_APB2_CLOCK_HZ * 2) +#endif +#define PWM2_CLK_MHZ (PWM2_CLK_HZ / ONE_MHZ) + +#if PWM2_CLK_MHZ > PWM1_CLK_MHZ + #define PWM_MAX_CLK_MHZ PWM2_CLK_MHZ +#else + #define PWM_MAX_CLK_MHZ PWM1_CLK_MHZ +#endif + + +typedef TIM_TypeDef* ptr_TIM_TypeDef; + +//Timers +static const BYTE g_PWM_Timer[] = PWM_TIMER; +static const BYTE g_PWM_Channel[] = PWM_CHNL; + +// Pins +static const BYTE g_PWM_Pins[] = PWM_PINS; +#define PWM_CHANNELS ARRAYSIZE_CONST_EXPR(g_PWM_Pins) // number of channels + +// IO addresses +static const ptr_TIM_TypeDef g_PWM_Ports[] = + {TIM1, TIM2, TIM3, TIM4, TIM5, NULL, NULL, TIM8, TIM9, TIM10, TIM11, TIM12, TIM13, TIM14}; + +// Alternate Function Number +static const BYTE g_PWM_Alt[] = {0x12,0x12,0x22,0x22,0x22,0,0,0x32,0x32,0x32,0x32,0x92,0x92,0x92}; // AF1/2/3/9 + + +//--// + +void PWM_UnitializeAll() +{ + for (int c = 0; c < PWM_CHANNELS; c++) { + PWM_Stop((PWM_CHANNEL)c, PWM_GetPinForChannel((PWM_CHANNEL)c)); + PWM_Uninitialize((PWM_CHANNEL)c); + } +} + +BOOL PWM_Initialize(PWM_CHANNEL channel) +{ + if (channel >= PWM_CHANNELS) return FALSE; + int timer = g_PWM_Timer[channel]; + int tchnl = g_PWM_Channel[channel]; + ptr_TIM_TypeDef treg = g_PWM_Ports[timer - 1]; + + // relevant RCC register & bit + __IO uint32_t* enReg = &RCC->APB1ENR; + if ((UINT32)treg & 0x10000) enReg = &RCC->APB2ENR; + int enBit = 1 << (((UINT32)treg >> 10) & 0x1F); + + if (!(*enReg & enBit)) { // not yet initialized + *enReg |= enBit; // enable timer clock + treg->CR1 = TIM_CR1_URS | TIM_CR1_ARPE; // double buffered update + treg->EGR = TIM_EGR_UG; // enforce first update + if (timer == 1 || timer == 8) { + treg->BDTR |= TIM_BDTR_MOE; // main output enable (timer 1 & 8 only) + } + } + + *(__IO uint16_t*)&((uint32_t*)&treg->CCR1)[tchnl] = 0; // reset compare register + + // enable PWM channel + UINT32 mode = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE; // PWM1 mode, double buffered + if (tchnl & 1) mode <<= 8; // 1 or 3 + __IO uint16_t* reg = &treg->CCMR1; + if (tchnl & 2) reg = &treg->CCMR2; // 2 or 3 + *reg |= mode; + + // Ensure driver gets unitialized during soft reboot + HAL_AddSoftRebootHandler(PWM_UnitializeAll); + + return TRUE; +} + +BOOL PWM_Uninitialize(PWM_CHANNEL channel) +{ + int timer = g_PWM_Timer[channel]; + int tchnl = g_PWM_Channel[channel]; + ptr_TIM_TypeDef treg = g_PWM_Ports[timer - 1]; + + UINT32 mask = 0xFF; // disable PWM channel + if (tchnl & 1) mask = 0xFF00; // 1 or 3 + __IO uint16_t* reg = &treg->CCMR1; + if (tchnl & 2) reg = &treg->CCMR2; // 2 or 3 + *reg &= ~mask; + + if ((treg->CCMR1 | treg->CCMR2) == 0) { // no channel active + __IO uint32_t* enReg = &RCC->APB1ENR; + if ((UINT32)treg & 0x10000) enReg = &RCC->APB2ENR; + int enBit = 1 << (((UINT32)treg >> 10) & 0x1F); + *enReg &= ~enBit; // disable timer clock + } + + return TRUE; +} + +BOOL PWM_ApplyConfiguration(PWM_CHANNEL channel, GPIO_PIN pin, UINT32& period, UINT32& duration, PWM_SCALE_FACTOR& scale, BOOL invert) +{ + int timer = g_PWM_Timer[channel]; + int tchnl = g_PWM_Channel[channel]; + ptr_TIM_TypeDef treg = g_PWM_Ports[timer - 1]; + + UINT32 p = period, d = duration, s = scale; + if (d > p) d = p; + + // set pre, p, & d such that: + // pre * p = PWM_CLK * period / scale + // pre * d = PWM_CLK * duration / scale + + UINT32 clk = PWM1_CLK_HZ; + if ((UINT32)treg & 0x10000) clk = PWM2_CLK_HZ; // APB2 + + UINT32 pre = clk / s; // prescaler + if (pre == 0) { // s > PWM_CLK + UINT32 sm = s / ONE_MHZ; // scale in MHz + clk = PWM1_CLK_MHZ; // clock in MHz + if ((UINT32)treg & 0x10000) clk = PWM2_CLK_MHZ; // APB2 + if (p > 0xFFFFFFFF / PWM_MAX_CLK_MHZ) { // avoid overflow + pre = clk; + p /= sm; + d /= sm; + } else { + pre = 1; + p = p * clk / sm; + d = d * clk / sm; + } + } else { + while (pre > 0x10000) { // prescaler too large + if (p >= 0x80000000) return FALSE; + pre >>= 1; + p <<= 1; + d <<= 1; + } + } + if (timer != 2 && timer != 5) { // 16 bit timer + while (p >= 0x10000) { // period too large + if (pre > 0x8000) return FALSE; + pre <<= 1; + p >>= 1; + d >>= 1; + } + } + treg->PSC = pre - 1; + treg->ARR = p - 1; + *(__IO uint16_t*)&((uint32_t*)&treg->CCR1)[tchnl] = d; + UINT32 invBit = TIM_CCER_CC1P << (4 * tchnl); + if (invert) { + treg->CCER |= invBit; + } else { + treg->CCER &= ~invBit; + } + return TRUE; +} + +BOOL PWM_Start(PWM_CHANNEL channel, GPIO_PIN pin) +{ + int timer = g_PWM_Timer[channel]; + int tchnl = g_PWM_Channel[channel]; + ptr_TIM_TypeDef treg = g_PWM_Ports[timer - 1]; + + CPU_GPIO_DisablePin( pin, RESISTOR_DISABLED, 1, (GPIO_ALT_MODE)g_PWM_Alt[timer - 1] ); + UINT16 enBit = TIM_CCER_CC1E << (4 * tchnl); + treg->CCER |= enBit; // enable output + UINT16 cr1 = treg->CR1; + if ((cr1 & TIM_CR1_CEN) == 0) { // timer stopped + treg->EGR = TIM_EGR_UG; // enforce register update + treg->CR1 = cr1 | TIM_CR1_CEN; // start timer + } + return TRUE; +} + +void PWM_Stop(PWM_CHANNEL channel, GPIO_PIN pin) +{ + int timer = g_PWM_Timer[channel]; + int tchnl = g_PWM_Channel[channel]; + ptr_TIM_TypeDef treg = g_PWM_Ports[timer - 1]; + + UINT16 ccer = treg->CCER; + ccer &= ~(TIM_CCER_CC1E << (4 * tchnl)); + treg->CCER = ccer; // disable output + CPU_GPIO_DisablePin( pin, RESISTOR_DISABLED, 0, GPIO_ALT_PRIMARY ); + if ((ccer & (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) == 0) { // idle + treg->CR1 &= ~TIM_CR1_CEN; // stop timer + } +} + +BOOL PWM_Start(PWM_CHANNEL* channel, GPIO_PIN* pin, UINT32 count) +{ + for (int i = 0; i < count; i++) { + if (!PWM_Start(channel[i], pin[i])) return FALSE; + } + return TRUE; +} + +void PWM_Stop(PWM_CHANNEL* channel, GPIO_PIN* pin, UINT32 count) +{ + for (int i = 0; i < count; i++) { + PWM_Stop(channel[i], pin[i]); + } +} + +UINT32 PWM_PWMChannels() +{ + return PWM_CHANNELS; +} + +GPIO_PIN PWM_GetPinForChannel( PWM_CHANNEL channel ) +{ + if ((UINT32)channel >= PWM_CHANNELS) return GPIO_PIN_NONE; + return g_PWM_Pins[channel]; +} diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 0cb855dd2..79f6dcc88 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -112,27 +112,28 @@ startup delay is incurred when waking up from Stop mode. */ //#define FAST_WAKEUP_FROM_STOP // Pin Configuration -#define STM32F4_ADC 3 -#define STM32F4_AD_CHANNELS {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} +#define USER_ADC 3 +#define AD_CHANNELS {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} +#define ADC_CHANNELS {ADC_CHANNEL_0,ADC_CHANNEL_1,ADC_CHANNEL_2,ADC_CHANNEL_3,ADC_CHANNEL_4,ADC_CHANNEL_5,ADC_CHANNEL_6,ADC_CHANNEL_7,ADC_CHANNEL_8,ADC_CHANNEL_9,ADC_CHANNEL_10,ADC_CHANNEL_11,ADC_CHANNEL_12,ADC_CHANNEL_13,ADC_CHANNEL_14,ADC_CHANNEL_15} -#define STM32F4_PWM_TIMER {4,4,4,4} -#define STM32F4_PWM_CHNL {0,1,2,3} -#define STM32F4_PWM_PINS {60,61,62,63} // PD12-PD15 +#define PWM_TIMER {4,4,4,4} +#define PWM_CHNL {0,1,2,3} +#define PWM_PINS {60,61,62,63} // PD12-PD15 // add to SPI_PORTS array the SPI ports that are available in the solution // please check which SPI ports are available in the device datasheet // uncomment the following define and leave the SPI ports that are available in your hardware -//#define SPI_PORTS {SPI1, SPI2, SPI3, SPI4, SPI5, SPI6} +#define SPI_PORTS {SPI1, SPI2, SPI3} // add to USART_PORTS array the USART ports that are available in the solution // please check which USART ports are available in the device datasheet // uncomment the following define and leave the USART ports that are available in your hardware and you intend to use // NOTE: UART5 is not supported because TX and RX are handled in different ports #define USART_PORTS {USART1, USART2, USART6} -#define USART_PORTS_TX_RX {GPIOA, GPIOD, GPIOC, GPIOC, GPIOG} +#define USART_PORTS_TX_RX {GPIOA, GPIOD, GPIOC} // to use flow control, uncomment below define and leave the USART ports that are available in your hardware and you intend to use #define GPIO_NO_PORT 0 -#define USART_PORTS_FLOW_CONTROL {GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT} +#define USART_PORTS_FLOW_CONTROL {GPIO_NO_PORT, GPIO_NO_PORT, GPIO_NO_PORT} #define STM32F4_UART_RXD_PINS {23, 54, 43} // PB7, D6, C11 #define STM32F4_UART_TXD_PINS {22, 53, 42} // PB6, D5, C10 From c8b5519f4c5d55de0b88e86f7339b67c4913e6fa Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 11:45:29 +0100 Subject: [PATCH 095/144] Add NVIC priorities to processor selector --- .../Native/STM32F4xx/processor_selector.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h b/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h index 0112a336d..a9de7c5a3 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h +++ b/DeviceCode/Targets/Native/STM32F4xx/processor_selector.h @@ -23,7 +23,6 @@ // #define STM32F4XX // #else // ERROR - WE SHOULD NOT INCLUDE THIS HEADER IF NOT BUILDING AN STM32F2/F4 PLATFORM -#endif ///////////////////////////////////////////////////////// // @@ -92,3 +91,20 @@ // // communicaiton facilities ///////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////// +// NVIC priorities + +#define USB_PRIORITY 10 + +#define USART1_PRIORITY 12 +#define USART2_PRIORITY 13 +#define USART3_PRIORITY 14 +#define USART4_PRIORITY 15 +#define USART6_PRIORITY 16 +#define USART7_PRIORITY 17 +#define USART8_PRIORITY 18 + +///////////////////////////////////////////////////////// + +#endif \ No newline at end of file From 546fb3a18198b629456db14a5909124597ea9a7f Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 11:46:09 +0100 Subject: [PATCH 096/144] Update script to copy USB midleware to correct target folder --- Install-CMSIS-STM32.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index 3db05927e..e0122cab4 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -165,7 +165,7 @@ Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\STM32" + $seri # first clear the destination directory before copying as we don't want to mix versions Write-Host "Copying USB device client library..." -$usbClientLibPath = [System.IO.Path]::Combine( $spotClientPath, "DeviceCode\Targets\CMSIS\USB\STM32_USB_Device_Library") +$usbClientLibPath = [System.IO.Path]::Combine( $spotClientPath, "DeviceCode\Targets\Native\STM32" + $seriesName + "xx\USB\STM32_USB_Device_Library") Remove-Item -Path $usbClientLibPath -Force -Recurse -ErrorAction Ignore New-Item -Path $usbClientLibPath -Force -ItemType directory | Out-Null Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Middlewares\ST\STM32_USB_Device_Library\Core\*") ) -Destination $usbClientLibPath -Force From eec97438b95fe4d24881fb2d10839b2f059544a6 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 11:47:33 +0100 Subject: [PATCH 097/144] Add ignore path to USB midleware library folders --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5bea6acd7..a0215a814 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,7 @@ STM32Cube/* !STM32Cube/ReadMe.m # CMSIS PAL and HAL folders -DeviceCode/Targets/Native/STM32F4XX/HAL_Driver +DeviceCode/Targets/Native/*/HAL_Driver +DeviceCode/Targets/Native/*/USB/STM32_USB_Device_Library !DeviceCode/Targets/Native/*.proj !DeviceCode/Targets/Native/*.settings From 7b7b7acd3416b511642e41835747dfb52a21ffec Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 11:49:26 +0100 Subject: [PATCH 098/144] Update TICK_INT_PRIORITY to make it usable in other preprocessor defines --- Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h index eb0c9c508..084dba1c4 100644 --- a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h +++ b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h @@ -151,7 +151,7 @@ * @brief This is the HAL system configuration section */ #define VDD_VALUE (3300U) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ +#define TICK_INT_PRIORITY ((uint32_t)0x0) /*!< tick interrupt priority */ #define USE_RTOS 0U //#define PREFETCH_ENABLE 0U #define INSTRUCTION_CACHE_ENABLE 1U From 30fe3d77efa25598366e65a70b66f39b42867312 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 12:08:48 +0100 Subject: [PATCH 099/144] Move STM32F4xx HAL to correct folder - update paths - delete unused folders --- .../STM32F4xx}/Analog/AD_functions.cpp | 0 .../STM32F4xx}/Analog/dotNetMF.proj | 4 +- .../STM32F4xx}/CRC/CRC_functions.cpp | 0 .../STM32F4xx}/CRC/dotNetMF.proj | 4 +- .../STM32F4xx}/DA/DA_functions.cpp | 0 .../STM32F4xx}/DA/dotNetMF.proj | 4 +- .../{CMSIS => Native/STM32F4xx}/Flash/Flash.h | 0 .../STM32F4xx}/Flash/Flash_driver.cpp | 0 .../STM32F4xx}/Flash/dotNetMF.proj | 4 +- .../STM32F4xx}/GPIO/GPIO_functions.cpp | 0 .../STM32F4xx}/GPIO/dotNetMF.proj | 4 +- .../STM32F4xx}/I2C/dotNetMF.proj | 4 +- .../STM32F4xx}/I2C/i2c_functions.cpp | 0 .../Targets/Native/STM32F4xx/Int_Handlers.h | 20 ++-- .../Native/STM32F4xx/NVIC_Priorities.h | 22 ++++ .../STM32F4xx}/PWM/dotNetMF.proj | 4 +- .../STM32F4xx}/PWM/pwm_functions.cpp | 0 .../STM32F4xx}/Power/Power_functions.cpp | 0 .../Power/Power_functions_loader.cpp | 0 .../STM32F4xx}/Power/dotNetMF.proj | 4 +- .../STM32F4xx}/Power/dotNetMF_loader.proj | 4 +- .../STM32F4xx}/SPI/SPI_functions.cpp | 0 .../STM32F4xx}/SPI/dotNetMF.proj | 4 +- .../STM32F4xx}/Time/Time_functions.cpp | 0 .../STM32F4xx}/Time/dotNetMF.proj | 4 +- .../STM32F4xx}/USART/USART_functions.cpp | 0 .../STM32F4xx}/USART/dotNetMF.proj | 4 +- .../STM32F4xx/USB/USB_functions.cpp} | 75 ++++++++---- .../STM32F4xx}/USB/dotNetMF.proj | 6 +- .../STM32F4xx}/USB/usb_conf.cpp | 108 +++++++++++++++++- .../STM32F4xx}/USB/usbd_conf.h | 0 .../STM32F4xx}/USB/usbd_desc.cpp | 0 .../STM32F4xx}/USB/usbd_desc.h | 0 .../STM32F4xx}/USB/usbd_winusb.cpp | 78 +++++++++++-- .../STM32F4xx}/USB/usbd_winusb.h | 0 .../Targets/Native/STM32F4xx/dotNetMF.proj | 22 ++-- .../Native/STM32F4xx/dotNetMF_loader.proj | 22 ++-- .../TinyBooter/TinyBooter.proj | 2 +- 38 files changed, 302 insertions(+), 101 deletions(-) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Analog/AD_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Analog/dotNetMF.proj (84%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/CRC/CRC_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/CRC/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/DA/DA_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/DA/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Flash/Flash.h (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Flash/Flash_driver.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Flash/dotNetMF.proj (86%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/GPIO/GPIO_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/GPIO/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/I2C/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/I2C/i2c_functions.cpp (100%) create mode 100644 DeviceCode/Targets/Native/STM32F4xx/NVIC_Priorities.h rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/PWM/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/PWM/pwm_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Power/Power_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Power/Power_functions_loader.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Power/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Power/dotNetMF_loader.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/SPI/SPI_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/SPI/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Time/Time_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/Time/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USART/USART_functions.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USART/dotNetMF.proj (85%) rename DeviceCode/Targets/{CMSIS/USB/usb_functions.cpp => Native/STM32F4xx/USB/USB_functions.cpp} (72%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/dotNetMF.proj (84%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/usb_conf.cpp (79%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/usbd_conf.h (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/usbd_desc.cpp (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/usbd_desc.h (100%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/usbd_winusb.cpp (89%) rename DeviceCode/Targets/{CMSIS => Native/STM32F4xx}/USB/usbd_winusb.h (100%) diff --git a/DeviceCode/Targets/CMSIS/Analog/AD_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Analog/AD_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/Analog/AD_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/Analog/AD_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/Analog/dotNetMF.proj similarity index 84% rename from DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/Analog/dotNetMF.proj index e49cb2450..e6bef7c41 100644 --- a/DeviceCode/Targets/CMSIS/Analog/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/Analog/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS Analog driver HAL CMSIS_Analog.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Analog\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\Analog\dotNetMF.proj CMSIS_Analog.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\Native\CMSIS\DeviceCode\CMSIS_Analog + DeviceCode\Targets\Native\STM32F4xx\DeviceCode\CMSIS_Analog Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/CRC/CRC_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/CRC/CRC_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/CRC/CRC_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/CRC/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/CRC/dotNetMF.proj index 73a328acc..70a6aaf45 100644 --- a/DeviceCode/Targets/CMSIS/CRC/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/CRC/dotNetMF.proj @@ -8,7 +8,7 @@ CMSIS CRC library HAL CMSIS_CRC.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\CRC\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\CRC\dotNetMF.proj CMSIS_CRC.$(LIB_EXT).manifest @@ -19,7 +19,7 @@ False False True - DeviceCode\Targets\CMSIS\CRC + DeviceCode\Targers\Native\STM32F4xx\CRC Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/DA/DA_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/DA/DA_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/DA/DA_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/DA/DA_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/DA/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/DA/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/DA/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/DA/dotNetMF.proj index 26919d6bf..3b7792b45 100644 --- a/DeviceCode/Targets/CMSIS/DA/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/DA/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS DA driver HAL CMSIS_DA.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\DA\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\DA\dotNetMF.proj CMSIS_DA.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\CMSIS\DA + DeviceCode\Targets\Native\STM32F4xx\DA Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/Flash/Flash.h b/DeviceCode/Targets/Native/STM32F4xx/Flash/Flash.h similarity index 100% rename from DeviceCode/Targets/CMSIS/Flash/Flash.h rename to DeviceCode/Targets/Native/STM32F4xx/Flash/Flash.h diff --git a/DeviceCode/Targets/CMSIS/Flash/Flash_driver.cpp b/DeviceCode/Targets/Native/STM32F4xx/Flash/Flash_driver.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/Flash/Flash_driver.cpp rename to DeviceCode/Targets/Native/STM32F4xx/Flash/Flash_driver.cpp diff --git a/DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/Flash/dotNetMF.proj similarity index 86% rename from DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/Flash/dotNetMF.proj index 3825c7bbf..2fc1b37c3 100644 --- a/DeviceCode/Targets/CMSIS/Flash/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/Flash/dotNetMF.proj @@ -2,7 +2,7 @@ CMSIS_Flash - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Flash\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\Flash\dotNetMF.proj {00650055-00D3-008E-9D45-3758F085F71F} @@ -19,7 +19,7 @@ False False False - DeviceCode\Targets\CMSIS\Flash + DeviceCode\Targets\Native\STM32F4xx\Flash Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/GPIO/GPIO_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/GPIO/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/GPIO/dotNetMF.proj index e325a5b2b..803cdf732 100644 --- a/DeviceCode/Targets/CMSIS/GPIO/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/GPIO/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS GPIO driver HAL CMSIS_GPIO.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\GPIO\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\GPIO\dotNetMF.proj CMSIS_GPIO.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\CMSIS\GPIO + DeviceCode\Targets\Native\STM32F4xx\GPIO Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/I2C/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/I2C/dotNetMF.proj index cbbe04d6a..35484d717 100644 --- a/DeviceCode/Targets/CMSIS/I2C/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/I2C/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS I2C driver HAL CMSIS_I2C.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\I2C\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\I2C\dotNetMF.proj CMSIS_I2C.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\CMSIS\I2C + DeviceCode\Targets\Native\STM32F4xx\I2C Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/I2C/i2c_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/I2C/i2c_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/I2C/i2c_functions.cpp diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h index 513927bea..34c2a6790 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.h @@ -53,17 +53,15 @@ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void EXTI0_IRQHandler(void); -void OTG_FS_IRQHandler(void); +// __weak void NMI_Handler(void); +// __weak void HardFault_Handler(void); +// __weak void MemManage_Handler(void); +// __weak void BusFault_Handler(void); +// __weak void UsageFault_Handler(void); +// __weak void SVC_Handler(void); +// __weak void DebugMon_Handler(void); +// __weak __weak __weak void PendSV_Handler(void); +// __weak void SysTick_Handler(void); #ifdef __cplusplus } #endif diff --git a/DeviceCode/Targets/Native/STM32F4xx/NVIC_Priorities.h b/DeviceCode/Targets/Native/STM32F4xx/NVIC_Priorities.h new file mode 100644 index 000000000..b98b682b3 --- /dev/null +++ b/DeviceCode/Targets/Native/STM32F4xx/NVIC_Priorities.h @@ -0,0 +1,22 @@ +#ifndef __NVIC_Priorities_H +#define __NVIC_Priorities_H + +#ifdef __cplusplus + extern "C" { +#endif + +#define USB_PRIORITY 10 + +#define USART1_PRIORITY 12 +#define USART2_PRIORITY 13 +#define USART3_PRIORITY 14 +#define USART4_PRIORITY 15 +#define USART6_PRIORITY 16 +#define USART7_PRIORITY 17 +#define USART8_PRIORITY 18 + +#ifdef __cplusplus +} +#endif + +#endif /* __NVIC_Priorities_H */ \ No newline at end of file diff --git a/DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/PWM/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/PWM/dotNetMF.proj index 8980bd93f..848bdcd5f 100644 --- a/DeviceCode/Targets/CMSIS/PWM/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/PWM/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS PWM driver HAL CMSIS_PWM.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\PWM\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\PWM\dotNetMF.proj CMSIS_PWM.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\CMSIS\PWM + DeviceCode\Targets\Native\STM32F4xx\PWM Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/PWM/pwm_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/PWM/pwm_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/PWM/pwm_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/PWM/pwm_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/Power/Power_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/Power/Power_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/Power/Power_functions_loader.cpp b/DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions_loader.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/Power/Power_functions_loader.cpp rename to DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions_loader.cpp diff --git a/DeviceCode/Targets/CMSIS/Power/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/Power/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/Power/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/Power/dotNetMF.proj index c38e57161..0c49a4717 100644 --- a/DeviceCode/Targets/CMSIS/Power/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/Power/dotNetMF.proj @@ -8,7 +8,7 @@ CMSIS CPU power library HAL CMSIS_power.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Power\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\Power\dotNetMF.proj CMSIS_power.$(LIB_EXT).manifest @@ -19,7 +19,7 @@ False False True - DeviceCode\Targets\CMSIS\Power + DeviceCode\Targets\Native\STM32F4xx\Power Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/Power/dotNetMF_loader.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj rename to DeviceCode/Targets/Native/STM32F4xx/Power/dotNetMF_loader.proj index 07c36ea1b..5debfad49 100644 --- a/DeviceCode/Targets/CMSIS/Power/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/Power/dotNetMF_loader.proj @@ -8,7 +8,7 @@ CMSIS CPU power library for bootloader HAL CMSIS_power_loader.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Power\dotNetMF_loader.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\Power\dotNetMF_loader.proj CMSIS_power_loader.$(LIB_EXT).manifest @@ -19,7 +19,7 @@ False False True - DeviceCode\Targets\CMSIS\Power + DeviceCode\Targets\Native\STM32F4xx\Power Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/SPI/SPI_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/SPI/SPI_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/SPI/SPI_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/SPI/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/SPI/dotNetMF.proj index cb73f5ce5..df445b8f5 100644 --- a/DeviceCode/Targets/CMSIS/SPI/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/SPI/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS SPI driver HAL CMSIS_SPI.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\SPI\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\SPI\dotNetMF.proj CMSIS_SPI.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\CMSIS\SPI + DeviceCode\Targets\Native\STM32F4xx\SPI Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/Time/Time_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/Time/Time_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/Time/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/Time/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/Time/dotNetMF.proj index 0da5cda4b..1e0b08c14 100644 --- a/DeviceCode/Targets/CMSIS/Time/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/Time/dotNetMF.proj @@ -8,7 +8,7 @@ CMSIS time driver HAL CMSIS_time.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\Time\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\Time\dotNetMF.proj CMSIS_time.$(LIB_EXT).manifest @@ -19,7 +19,7 @@ False False False - DeviceCode\CMSIS\Time + DeviceCode\Targets\Native\STM32F4xx\Time Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/USART/USART_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/USART/USART_functions.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/USART/USART_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/USART/USART_functions.cpp diff --git a/DeviceCode/Targets/CMSIS/USART/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/USART/dotNetMF.proj similarity index 85% rename from DeviceCode/Targets/CMSIS/USART/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/USART/dotNetMF.proj index 8b23c9ea0..de8f33894 100644 --- a/DeviceCode/Targets/CMSIS/USART/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/USART/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS USART driver HAL CMSIS_USART.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\USART\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\USART\dotNetMF.proj CMSIS_USART.$(LIB_EXT).manifest @@ -18,7 +18,7 @@ False False False - DeviceCode\Targets\CMSIS\USART + DeviceCode\Targets\Native\STM32F4xx\USART Library false 4.0.0.0 diff --git a/DeviceCode/Targets/CMSIS/USB/usb_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp similarity index 72% rename from DeviceCode/Targets/CMSIS/USB/usb_functions.cpp rename to DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp index 3c2b7398c..274a4a833 100644 --- a/DeviceCode/Targets/CMSIS/USB/usb_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp @@ -45,7 +45,7 @@ HRESULT CPU_USB_Initialize(int Controller) usbControlerState.EndpointStatus = endpointStatus; // FIXME - usbControlerState.EndpointCount = 2; + usbControlerState.EndpointCount = 4; // FIXME // get max ep0 packet size from actual configuration @@ -56,25 +56,25 @@ HRESULT CPU_USB_Initialize(int Controller) // config endpoints // EP1 // IN direction - usbControlerState.IsTxQueue[0] = TRUE; + usbControlerState.IsTxQueue[1] = TRUE; // max packet size - usbControlerState.MaxPacketSize[0] = WINUSB_MAX_FS_PACKET; + usbControlerState.MaxPacketSize[1] = WINUSB_MAX_FS_PACKET; // assign queues // clear queue before use - QueueBuffers[0].Initialize(); + QueueBuffers[1].Initialize(); // Attach queue to endpoint - usbControlerState.Queues[0] = &QueueBuffers[0]; + usbControlerState.Queues[1] = &QueueBuffers[1]; // EP2 // OUT direction - usbControlerState.IsTxQueue[1] = FALSE; + usbControlerState.IsTxQueue[2] = FALSE; // max packet size - usbControlerState.MaxPacketSize[1] = WINUSB_MAX_FS_PACKET; + usbControlerState.MaxPacketSize[2] = WINUSB_MAX_FS_PACKET; // assign queues // clear queue before use - QueueBuffers[1].Initialize(); + QueueBuffers[2].Initialize(); // Attach queue to endpoint - usbControlerState.Queues[1] = &QueueBuffers[1]; + usbControlerState.Queues[2] = &QueueBuffers[2]; // ????????????? EP_Type = 0xE0; @@ -93,6 +93,11 @@ HRESULT CPU_USB_Initialize(int Controller) // Start Device Process USBD_Start(&USBD_Device); + // controller is now initialized + usbControlerState.Initialized = TRUE; + + usbControlerState.DeviceState = USB_DEVICE_STATE_CONFIGURED; + return S_OK; } @@ -115,7 +120,7 @@ BOOL CPU_USB_StartOutput(USB_CONTROLLER_STATE* state, int endpoint) //USB_Debug( 't' ); - GLOBAL_LOCK(irq); + //GLOBAL_LOCK(irq); // If endpoint is not an output if(state->Queues[endpoint] == NULL || !state->IsTxQueue[endpoint]) @@ -124,24 +129,46 @@ BOOL CPU_USB_StartOutput(USB_CONTROLLER_STATE* state, int endpoint) } /* if the halt feature for this endpoint is set, then just clear all the characters */ - if(state->EndpointStatus[endpoint] & USB_STATUS_ENDPOINT_HALT) - { - while(USB_TxDequeue(state, endpoint, TRUE) != NULL) - { - } // clear TX queue + // if(state->EndpointStatus[endpoint] & USB_STATUS_ENDPOINT_HALT) + // { + // while(USB_TxDequeue(state, endpoint, TRUE) != NULL) + // { + // } // clear TX queue - return TRUE; - } + // return TRUE; + // } - if(irq.WasDisabled()) - { - // check all endpoints for pending actions - //STM32F4_USB_Driver_Interrupt( OTG, state ); - } + //if(irq.WasDisabled()) + //{ + // // check all endpoints for pending actions + // //STM32F4_USB_Driver_Interrupt( OTG, state ); + // } + + // USBD_WINUSB_CLASS winUSBclass = (USBD_WINUSB_CLASS)USBD_Device.pClass; + + //winUSBclass->DataIn(&USBD_Device, endpoint); - // FIXME // write first packet if not done yet + //USBD_WINUSB_DataIn //USBD_WINUSB_DataIn(&USBD_Device, endpoint); + USBD_LL_DataInStage(&USBD_Device, endpoint, NULL); + + + //USBD_WINUSB_CLASS.DataIn(&USBD_Device, endpoint); + + // // Tx data endpoint + // USB_PACKET64* usbPacket = USB_TxDequeue(state, ep, TRUE); + + // if(usbPacket) + // { + // // data to send + // // Transmit next packet + // USBD_LL_Transmit(&USBD_Device->pdev, + // 1, + // usbPacket->Buffer, + // usbPacket->Size); + // // USB_Debug( 's' ); + // } return TRUE; } @@ -158,7 +185,7 @@ BOOL CPU_USB_RxEnable(USB_CONTROLLER_STATE* state, int endpoint) //USB_Debug( 'e' ); - GLOBAL_LOCK(irq); + //GLOBAL_LOCK(irq); // enable Rx // if( !( OTG->DOEP[ endpoint ].CTL & OTG_DOEPCTL_EPENA ) ) diff --git a/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj similarity index 84% rename from DeviceCode/Targets/CMSIS/USB/dotNetMF.proj rename to DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj index 28cca64e3..b0fe0a136 100644 --- a/DeviceCode/Targets/CMSIS/USB/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj @@ -7,7 +7,7 @@ CMSIS USB driver HAL CMSIS_USB.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\CMSIS\USB\dotNetMF.proj + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\USB\dotNetMF.proj CMSIS_USB.$(LIB_EXT).manifest @@ -16,7 +16,7 @@ False False False - DeviceCode\Targets\CMSIS\USB + DeviceCode\Targets\Native\STM32F4xx\USB Library false 4.0.0.0 @@ -39,7 +39,7 @@ - + diff --git a/DeviceCode/Targets/CMSIS/USB/usb_conf.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp similarity index 79% rename from DeviceCode/Targets/CMSIS/USB/usb_conf.cpp rename to DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp index 23f5c79d8..5b9694c31 100644 --- a/DeviceCode/Targets/CMSIS/USB/usb_conf.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp @@ -27,6 +27,7 @@ /* Includes ------------------------------------------------------------------*/ #include +#include #include "usbd_conf.h" #include "usbd_core.h" @@ -91,7 +92,7 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); /* Set USBFS Interrupt to the lowest priority */ - HAL_NVIC_SetPriority(OTG_FS_IRQn, 4, 0); + HAL_NVIC_SetPriority(OTG_FS_IRQn, USB_PRIORITY, 0); /* Enable USBFS Interrupt */ HAL_NVIC_EnableIRQ(OTG_FS_IRQn); @@ -147,25 +148,120 @@ void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) } /** - * @brief SOF callback. + * @brief Data out callback. * @param hpcd: PCD handle * @param epnum: Endpoint Number * @retval None */ void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { - USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); + USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); + + // moving this to USBD_WINUSB_DataOut + // USB_CONTROLLER_STATE* state; + // USBD_HandleTypeDef *pdev = (USBD_HandleTypeDef*)hpcd->pData; + // state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + // if(epnum == 1) + // { + // // this is a control endpoint + + // state->Data = hpcd->OUT_ep[epnum].xfer_buff; + // state->DataSize = hpcd->OUT_ep[epnum].xfer_count; + + // } + // else if(epnum == 2) + // { + // // this is a data endpoint + + // BOOL bufferIsFull; + // USB_PACKET64* usbPacket = USB_RxEnqueue(state, epnum, bufferIsFull); + + // if(usbPacket == NULL) + // { + // // should not happen + // //USB_Debug( '?' ); + // //_ASSERT( 0 ); + // } + + // // copy data from endpoint buffer to USB packet buffer + // memcpy(usbPacket->Buffer, hpcd->OUT_ep[epnum].xfer_buff, hpcd->OUT_ep[epnum].xfer_count); + // // set USB packet size + // usbPacket->Size = hpcd->OUT_ep[epnum].xfer_count; + // } } /** - * @brief SOF callback. + * @brief Data in callback. * @param hpcd: PCD handle * @param epnum: Endpoint Number * @retval None */ void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { - USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); + USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); + + // UINT32* ps = NULL; + // UINT32 count; + + // USB_CONTROLLER_STATE* state; + // USBD_HandleTypeDef *pdev = (USBD_HandleTypeDef*)hpcd->pData; + // state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + // if(epnum == 1 ) + // { + // // this is a control endpoint + + // if(state->DataCallback) + // { + // // data to send + // state->DataCallback(state); // this call can't fail + // ps = (UINT32*)state->Data; + // count = state->DataSize; + + // //USB_Debug( count ? 'x' : 'n' ); + // } + // } + // else if(state->Queues[epnum] != NULL && state->IsTxQueue[epnum]) + // { + // // this is a TX data endpoint + + // USB_PACKET64* usbPacket = USB_TxDequeue(state, epnum, TRUE); + // if(usbPacket) + // { + // // data to send + + // ps = (UINT32*)usbPacket->Buffer; + + // //USB_Debug( 's' ); + + // // copy data from USB packet buffer to endpoint buffer + // memcpy(hpcd->IN_ep[epnum].xfer_buff, usbPacket->Buffer, usbPacket->Size); + // } + // } + + // if(ps) + // { + // // data to send + // // enable endpoint + // //OTG->DIEP[ ep ].TSIZ = OTG_DIEPTSIZ_PKTCNT_1 | count; + // //OTG->DIEP[ ep ].CTL |= OTG_DIEPCTL_EPENA | OTG_DIEPCTL_CNAK; + + // // write data + // uint32_t volatile* pd = OTG->DFIFO[ep]; + // for( int c = count; c > 0; c -= 4 ) + // { + // *pd = *ps++; + // } + // } + // else + // { + // // no data + + // // disable endpoint + // OTG->DIEP[ ep ].CTL |= OTG_DIEPCTL_SNAK; + // } + } /** @@ -179,7 +275,7 @@ void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) } /** - * @brief SOF callback. + * @brief Reset callback. * @param hpcd: PCD handle * @retval None */ diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_conf.h b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_conf.h similarity index 100% rename from DeviceCode/Targets/CMSIS/USB/usbd_conf.h rename to DeviceCode/Targets/Native/STM32F4xx/USB/usbd_conf.h diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.cpp similarity index 100% rename from DeviceCode/Targets/CMSIS/USB/usbd_desc.cpp rename to DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.cpp diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_desc.h b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.h similarity index 100% rename from DeviceCode/Targets/CMSIS/USB/usbd_desc.h rename to DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.h diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp similarity index 89% rename from DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp rename to DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp index 9ce304fe0..711faf262 100644 --- a/DeviceCode/Targets/CMSIS/USB/usbd_winusb.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp @@ -47,6 +47,7 @@ /* Includes ------------------------------------------------------------------*/ #include +#include #include "usbd_winusb.h" #include "usbd_desc.h" @@ -87,8 +88,8 @@ /** * @} */ - - +static uint8_t buffer[80]; +static uint8_t outBuffer[80]; /** @defgroup USBD_WINUSB_Private_FunctionPrototypes @@ -304,17 +305,19 @@ static uint8_t USBD_WINUSB_Init (USBD_HandleTypeDef *pdev, USBD_EP_TYPE_BULK, WINUSB_MAX_FS_PACKET); - - state = (USB_CONTROLLER_STATE*)pdev->pUserData; + USBD_LL_FlushEP(pdev, WINUSB_EPOUT_ADDR); + USBD_LL_FlushEP(pdev, WINUSB_EPIN_ADDR); + + // state = (USB_CONTROLLER_STATE*)pdev->pUserData; /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, WINUSB_EPOUT_ADDR, - state->Data, + &buffer[0], WINUSB_MAX_FS_PACKET); - return ret; + return ret; } /** @@ -454,7 +457,24 @@ static uint8_t USBD_WINUSB_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) if(epnum == 1) { + // Tx data endpoint + USB_PACKET64* usbPacket = USB_TxDequeue(state, epnum, TRUE); + if(usbPacket) + { + // data to send + // Transmit next packet + + // copy packet data to out buffer + memcpy(usbPacket->Buffer, &outBuffer[0], usbPacket->Size); + + USBD_LL_Transmit(pdev, + epnum, + outBuffer, + usbPacket->Size); + // USB_Debug( 's' ); + } + } // if( ps ) @@ -632,11 +652,49 @@ static uint8_t USBD_WINUSB_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t * @param epnum: endpoint index * @retval status */ -static uint8_t USBD_WINUSB_DataOut (USBD_HandleTypeDef *pdev, - uint8_t epnum) +static uint8_t USBD_WINUSB_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) { - // FIXME - return USBD_OK; + USB_PACKET64* usbPacket; + USB_CONTROLLER_STATE* state; + state = (USB_CONTROLLER_STATE*)pdev->pUserData; + + if(epnum == WINUSB_EPOUT_ADDR) + { + // EP2 + + BOOL bufferIsFull; + usbPacket = USB_RxEnqueue(state, epnum, bufferIsFull); + + if(usbPacket == NULL) + { + // should not happen + //USB_Debug( '?' ); + //_ASSERT( 0 ); + } + + // get how many bytes are available in the buffer... + // ... and set USB packet size + usbPacket->Size = USBD_LL_GetRxDataSize (pdev , epnum); + + // copy received data to USB packet struct + memcpy(usbPacket->Buffer, &buffer[0], usbPacket->Size); + + // prepare WINUSB_EPOUT_ADDR endpoint to receive next packet + USBD_LL_PrepareReceive(pdev, epnum, &buffer[0], WINUSB_MAX_FS_PACKET); + + if(usbPacket->Buffer[0] == 'x') + { + // xx start of packet + debug_printf("dummy packet"); + } + else if(usbPacket->Buffer[0] == 'M') + { + // start of Msft debug packet + debug_printf("debug packet"); + } + } + + return USBD_OK; } /** diff --git a/DeviceCode/Targets/CMSIS/USB/usbd_winusb.h b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.h similarity index 100% rename from DeviceCode/Targets/CMSIS/USB/usbd_winusb.h rename to DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.h diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 5b0a33df4..33c1ba767 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -59,56 +59,56 @@ - + - + - + - + - + - + - + - + @@ -145,7 +145,7 @@ - + @@ -160,8 +160,8 @@ - - + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 359f43403..8bf68b19b 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -98,56 +98,56 @@ - + - + - + - + - + - + - + - + @@ -184,7 +184,7 @@ - + @@ -199,8 +199,8 @@ - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 185268b7d..2e67ddc51 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -151,7 +151,7 @@ - + From a04cb8700c9d1c21d43b07fcc29efbf04cc2d91f Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 5 Apr 2016 14:24:22 +0100 Subject: [PATCH 100/144] Cleanup unused defines --- Solutions/STM32F4DISCOVERY/platform_selector.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 79f6dcc88..899431824 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -58,15 +58,7 @@ #define SYSTEM_APB1_CLOCK_HZ 42000000 // 42 MHz #define SYSTEM_APB2_CLOCK_HZ 84000000 // 84 MHz -//#define SYSTEM_CRYSTAL_CLOCK_HZ 8000000 // 8 MHz external clock - -//#define SUPPLY_VOLTAGE_MV 3300 // 3.3V supply - -//#define CLOCK_COMMON_FACTOR 1000000 // GCD(SYSTEM_CLOCK_HZ, 1M) - #define SLOW_CLOCKS_PER_SECOND 1000000 // 1 MHz -// #define SLOW_CLOCKS_TEN_MHZ_GCD 1000000 // GCD(SLOW_CLOCKS_PER_SECOND, 10M) -// #define SLOW_CLOCKS_MILLISECOND_GCD 1000 // GCD(SLOW_CLOCKS_PER_SECOND, 1k) #define FLASH_MEMORY_Base 0x08000000 #define FLASH_MEMORY_Size 0x00100000 From 094fcc23e3e937e691fb71955f4ab7c766ef55ea Mon Sep 17 00:00:00 2001 From: sjmneves Date: Tue, 5 Apr 2016 17:33:49 +0100 Subject: [PATCH 101/144] Complete CMSIS DA driver --- .../Native/STM32F4xx/DA/DA_functions.cpp | 177 +++++++++++------- .../STM32F4DISCOVERY/platform_selector.h | 5 + 2 files changed, 117 insertions(+), 65 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/DA/DA_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/DA/DA_functions.cpp index c45c32781..556a3a819 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/DA/DA_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/DA/DA_functions.cpp @@ -16,8 +16,16 @@ /////////////////////////////////////////////////////////////////////////////// #define DA_CHANNELS 2 // number of channels -#define DA_FIRST_PIN 4 // channel 0 pin (A4) +#if (!defined(USE_DAC_CHANNEL_1) && !defined(USE_DAC_CHANNEL_2) && !defined(USE_BOTH_DAC_CHANNEL)) +#error "No DAC defines! Please go to platform_selector.h (in solution folder) and uncomment one and only one DAC define" +#endif +#if ((defined(USE_DAC_CHANNEL_2) && !defined(DAC_CHANNEL_2)) || (defined(USE_BOTH_DAC_CHANNEL) && !defined(DAC_CHANNEL_2))) +#error "DAC channel 2 doesn't exist! Please go to platform_selector.h (in solution folder) and comment defines USE_DAC_CHANNEL_2 and USE_BOTH_DAC_CHANNEL" +#endif +#if ((defined(USE_DAC_CHANNEL_1) && defined(USE_DAC_CHANNEL_2)) || (defined(USE_DAC_CHANNEL_1) && defined(USE_BOTH_DAC_CHANNEL)) || (defined(USE_DAC_CHANNEL_2) && defined(USE_BOTH_DAC_CHANNEL))) +#error "There can be only one define! Please go to platform_selector.h (in solution folder) and comment DAC defines less one" +#endif //--// DAC_HandleTypeDef DacHandle; @@ -41,11 +49,28 @@ void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) __HAL_RCC_GPIOA_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ - /* DAC Channel1 GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_4; + /* DAC Channels GPIO pin configuration */ +#ifdef USE_BOTH_DAC_CHANNEL GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; + // channel 1 in pin PA4 + GPIO_InitStruct.Pin = GPIO_PIN_4; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + // channel 2 in pin PA5 + GPIO_InitStruct.Pin = GPIO_PIN_5; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#else + #if USE_DAC_CHANNEL_2 + // channel 2 in pin PA5 + GPIO_InitStruct.Pin = GPIO_PIN_5; + #else + // channel 1 in pin PA4 + GPIO_InitStruct.Pin = GPIO_PIN_4; + #endif + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#endif } /** @@ -56,15 +81,20 @@ void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) */ void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) { - static DMA_HandleTypeDef hdma_dac1; - - /*##-1- Reset peripherals ##################################################*/ - __HAL_RCC_DAC_FORCE_RESET(); - __HAL_RCC_DAC_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* De-initialize the DAC Channel1 GPIO pin */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4); + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_DAC_FORCE_RESET(); + __HAL_RCC_DAC_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* De-initialize the DAC Channels GPIO pin */ +#ifdef USE_BOTH_DAC_CHANNEL + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5); +#elif USE_DAC_CHANNEL_2 + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5); +#else + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4); +#endif } BOOL DA_Initialize(DA_CHANNEL channel, INT32 precisionInBits) @@ -73,37 +103,32 @@ BOOL DA_Initialize(DA_CHANNEL channel, INT32 precisionInBits) if (precisionInBits != 12) return FALSE; - // FIXME *##-1- Configure the DAC peripheral #######################################*/ + // Configure the DAC peripheral DacHandle.Instance = DAC; - /*##-1- Initialize the DAC peripheral ######################################*/ + // Initialize the DAC peripheral if(HAL_DAC_Init(&DacHandle) != HAL_OK) { - /* Initialization Error */ + // Initialization Error return FALSE; } - /*##-2- Configure DAC channel1 #############################################*/ + // Configure DAC channel sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; +#ifdef USE_BOTH_DAC_CHANNEL if (channel) { // enable channel 2 if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_2) != HAL_OK) { - /* Channel configuration Error */ + // Channel configuration Error return FALSE; } - /*##-3- Set DAC Channel1 DHR register ######################################*/ - if (HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 0xFF) != HAL_OK) - { - /* Setting value Error */ - return FALSE; - } - /*##-4- Enable DAC Channel ################################################*/ + // Enable DAC Channel if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_2) != HAL_OK) { - /* Start Error */ + // Start Error return FALSE; } } @@ -112,87 +137,109 @@ BOOL DA_Initialize(DA_CHANNEL channel, INT32 precisionInBits) // enable channel 1 if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK) { - /* Channel configuration Error */ + // Channel configuration Error return FALSE; } - /*##-3- Set DAC Channel1 DHR register ######################################*/ - if (HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0xFF) != HAL_OK) + // Enable DAC Channel + if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK) { - /* Setting value Error */ + // Start Error return FALSE; } - /*##-4- Enable DAC Channel ################################################*/ + } +#else + #if USE_DAC_CHANNEL_2 + // enable channel 2 + if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_2) != HAL_OK) + { + // Channel configuration Error + return FALSE; + } + // Enable DAC Channel + if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_2) != HAL_OK) + { + // Start Error + return FALSE; + } + #else + // enable channel 1 + if(HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DAC_CHANNEL_1) != HAL_OK) + { + // Channel configuration Error + return FALSE; + } + // Enable DAC Channel if (HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1) != HAL_OK) { - /* Start Error */ + // Start Error return FALSE; } - } + #endif +#endif - // // enable DA clock - // RCC->APB1ENR |= RCC_APB1ENR_DACEN; - // // set pin as analog - // CPU_GPIO_DisablePin(DA_FIRST_PIN + channel, RESISTOR_DISABLED, 0, GPIO_ALT_MODE_1); - // if (channel) { - // DAC->CR |= DAC_CR_EN2; // enable channel 2 - // } else { - // DAC->CR |= DAC_CR_EN1; // enable channel 1 - // } return TRUE; } void DA_Uninitialize(DA_CHANNEL channel) { - // FIXME HAL_DAC_DeInit(&DacHandle); - - // if (channel) { - // DAC->CR &= ~DAC_CR_EN2; // disable channel 2 - // } else { - // DAC->CR &= ~DAC_CR_EN1; // disable channel 1 - // } - // // free pin - // CPU_GPIO_DisablePin(DA_FIRST_PIN + channel, RESISTOR_DISABLED, 0, GPIO_ALT_PRIMARY); - // if ((DAC->CR & (DAC_CR_EN1 | DAC_CR_EN2)) == 0) { // all channels off - // // disable DA clock - // RCC->APB1ENR &= ~RCC_APB1ENR_DACEN; - // } } // level is a 12 bit value void DA_Write(DA_CHANNEL channel, INT32 level) { + // set value +#ifdef USE_BOTH_DAC_CHANNEL if (channel) { - DAC->DHR12R2 = level; + HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, level); } else { - DAC->DHR12R1 = level; + HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, level); } +#else + #if USE_DAC_CHANNEL_2 + HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, level); + #else + HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, level); + #endif +#endif } UINT32 DA_DAChannels() { - return DA_CHANNELS; +#ifdef DAC_CHANNEL_2 + return 2; +#else + return 1; +#endif } GPIO_PIN DA_GetPinForChannel(DA_CHANNEL channel) { - if ((UINT32)channel >= DA_CHANNELS) +#ifdef USE_BOTH_DAC_CHANNEL + if (channel) + { + // DAC_CHANNEL_2 on PA5 + return GPIO_PIN_5; + } + else { - return GPIO_PIN_NONE; + // DAC_CHANNEL_2 on PA4 + return GPIO_PIN_4; } - return DA_FIRST_PIN + channel; +#elif USE_DAC_CHANNEL_2 + return GPIO_PIN_5; +#else + return GPIO_PIN_4; +#endif } BOOL DA_GetAvailablePrecisionsForChannel(DA_CHANNEL channel, INT32* precisions, UINT32& size) { - size = 0; - if (precisions == NULL || (UINT32)channel >= DA_CHANNELS) - { - return FALSE; - } + // FIXME - complete code with hardware availabel precisions + // Considering all channels with same precision precisions[0] = 12; size = 1; return TRUE; diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 79f6dcc88..529344ef7 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -116,6 +116,11 @@ startup delay is incurred when waking up from Stop mode. */ #define AD_CHANNELS {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} #define ADC_CHANNELS {ADC_CHANNEL_0,ADC_CHANNEL_1,ADC_CHANNEL_2,ADC_CHANNEL_3,ADC_CHANNEL_4,ADC_CHANNEL_5,ADC_CHANNEL_6,ADC_CHANNEL_7,ADC_CHANNEL_8,ADC_CHANNEL_9,ADC_CHANNEL_10,ADC_CHANNEL_11,ADC_CHANNEL_12,ADC_CHANNEL_13,ADC_CHANNEL_14,ADC_CHANNEL_15} +// Uncomment only one of the following defines for DAC +#define USE_DAC_CHANNEL_1 +//#define USE_DAC_CHANNEL_2 +//#define USE_BOTH_DAC_CHANNEL + #define PWM_TIMER {4,4,4,4} #define PWM_CHNL {0,1,2,3} #define PWM_PINS {60,61,62,63} // PD12-PD15 From 15e8f5337da1a3d5a1552c654ab4025c7e1f219d Mon Sep 17 00:00:00 2001 From: sjmneves Date: Wed, 6 Apr 2016 17:14:20 +0100 Subject: [PATCH 102/144] Complete CMSIS Analog driver --- .../Native/STM32F4xx/Analog/AD_functions.cpp | 353 +++++++++--------- .../STM32F4DISCOVERY/platform_selector.h | 11 +- 2 files changed, 192 insertions(+), 172 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/Analog/AD_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Analog/AD_functions.cpp index e71c3cbe7..2f697aa5e 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Analog/AD_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/Analog/AD_functions.cpp @@ -15,37 +15,79 @@ //--// +// indexed port configuration access +#define Port(port) ((GPIO_TypeDef *) (GPIOA_BASE + (port << 10))) #define AD_SAMPLE_TIME 2 // sample time = 28 cycles +#define ADC_CHANNELS {ADC_CHANNEL_0,ADC_CHANNEL_1,ADC_CHANNEL_2,ADC_CHANNEL_3,ADC_CHANNEL_4,ADC_CHANNEL_5,ADC_CHANNEL_6,ADC_CHANNEL_7,ADC_CHANNEL_8,ADC_CHANNEL_9,ADC_CHANNEL_10,ADC_CHANNEL_11,ADC_CHANNEL_12,ADC_CHANNEL_13,ADC_CHANNEL_14,ADC_CHANNEL_15,ADC_CHANNEL_VREFINT,ADC_CHANNEL_VBAT} + +#if defined (STM32F401xB) || defined(STM32F401xC) || defined(STM32F401xD) || defined (STM32F401xE) || defined (STM32F410Cx) || defined (STM32F410Rx) || defined (STM32F410Tx) || defined (STM32F411xC) || defined (STM32F411xE) +// these have 1 × 12-bit A/D converter + #if USER_ADC == 1 + #define ADCx ADC1 + #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC1EN + // ADC1 pins plus two internally connected channels thus the 0 for 'no pin' + // Vsense for temperature sensor @ ADC1_IN16 + // Vrefubt for internal voltage reference (1.21V) @ ADC1_IN17 + // to access the internal channels need to include '16' and/or '17' at the AD_CHANNELS array in 'platform_selector.h' + // PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1,PC0,PC1,PC2,PC3,PC4,PC5,INTERNAL_PIN,INTERNAL_PIN + #define ADC_PINS {0,1,2,3,4,5,6,7,16,17,32,33,34,35,36,37,0,0} + #else + #error "wrong USER_ADC value (only 1 is valid). Please go to platform_selector.h (in solution folder) and re-define USER_ADC" + #endif + +#endif // defined (STM32F401xC) || defined(STM32F401xD) || defined (STM32F401xE) || defined (STM32F410Cx) || defined (STM32F410Rx) || defined (STM32F411xC) || defined (STM32F411xE) || defined (STM32F410Tx) + +#if defined (STM32F405xx) || defined (STM32F407xx) || defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F446xx) || defined (STM32F469xx) || defined (STM32F479xx) +// these have 3 × 12-bit A/D converter + #if USER_ADC == 1 + #define ADCx ADC1 + #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC1EN + // ADC1 pins plus two internally connected channels thus the 0 for 'no pin' + // Vsense for temperature sensor @ ADC1_IN16 + // Vrefubt for internal voltage reference (1.21V) @ ADC1_IN17 + // to access the internal channels need to include '16' and/or '17' at the AD_CHANNELS array in 'platform_selector.h' + // PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1,PC0,PC1,PC2,PC3,PC4,PC5,INTERNAL_PIN,INTERNAL_PIN + #define ADC_PINS {0,1,2,3,4,5,6,7,16,17,32,33,34,35,36,37,0,0} + #elif (USER_ADC == 3 && defined(ADC3)) + #define ADCx ADC3 + #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC3EN + // PA0,PA1,PA2,PA3,PF6,PF7,PF8,PF9,PF10,PF3,PC0,PC1,PC2,PC3,PF4,PF5 + #define ADC_PINS {0,1,2,3,86,87,88,89,90,83,32,33,34,35,84,85} // ADC3 pins + #else + #error "wrong USER_ADC value (1 or 3). Please go to platform_selector.h (in solution folder) and re-define USER_ADC" + #endif + +#endif // defined (STM32F405xx) || defined (STM32F407xx) || defined (STM32F415xx) || defined (STM32F417xx) || defined (STM32F427xx) || defined (STM32F429xx) || defined (STM32F437xx) || defined (STM32F439xx) || defined (STM32F446xx) || defined (STM32F469xx) || defined (STM32F479xx) -#if USER_ADC == 1 - #define ADCx ADC1 - #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC1EN - // ADC1 pins plus two internally connected channels thus the 0 for 'no pin' - // Vsense for temperature sensor @ ADC1_IN16 - // Vrefubt for internal voltage reference (1.21V) @ ADC1_IN17 - // to access the internal channels need to include '16' and/or '17' at the AD_CHANNELS array in 'platform_selector.h' - #define ADC_PINS {0,1,2,3,4,5,6,7,16,17,32,33,34,35,36,37,0,0} -#elif USER_ADC == 3 - #define ADCx ADC3 - #define RCC_APB2ENR_ADCxEN RCC_APB2ENR_ADC3EN - #define ADC_PINS {0,1,2,3,86,87,88,89,90,83,32,33,34,35,84,85} // ADC3 pins -#else - #error "wrong USER_ADC value (1 or 3). Please go to platform_selector.h (in solution folder) and re-define USER_ADC" -#endif // Channels +#if !defined (AD_CHANNELS) + #error "AD_CHANNELS not defined. Please go to platform_selector.h (in solution folder) and define AD_CHANNELS" +#endif static const BYTE g_AD_Channel[] = AD_CHANNELS; +CT_ASSERT( sizeof( g_AD_Channel ) > 0 ) // at least one channel must be set, if you get error here, please go to platform_selector.h (in solution folder) and re-define AD_CHANNELS +CT_ASSERT( sizeof( g_AD_Channel ) <= 8 ) // maximum of 8 channels can be set, if you get error here, please go to platform_selector.h (in solution folder) and re-define AD_CHANNELS + static const uint32_t g_ADC_Channel[] = ADC_CHANNELS; static const BYTE g_AD_Pins[] = ADC_PINS; #define AD_NUM ARRAYSIZE_CONST_EXPR(g_AD_Channel) // number of channels +// GPIO PINs +static const GPIO_PIN g_GPIO_PINS[] = GPIO_PINS; -// ADC handler declaration -ADC_HandleTypeDef AdcHandle; - +// ADC handlers array declaration +ADC_HandleTypeDef AdcHandlers[AD_NUM]; //--// +/* + * + */ +void GetPortFromEncodedPIN(GPIO_TypeDef* port, GPIO_PIN pin) +{ + port = Port( pin >> 4 ); +} + /** * @brief ADC MSP Initialization * This function configures the hardware resources used in this example: @@ -56,50 +98,55 @@ ADC_HandleTypeDef AdcHandle; */ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { - GPIO_InitTypeDef GPIO_InitStruct; - static DMA_HandleTypeDef hdma_adc; - - /*##-1- Enable peripherals and GPIO Clocks #################################*/ - /* Enable GPIO clock */ - __HAL_RCC_GPIOB_CLK_ENABLE(); - /* ADC3 Periph clock enable */ - __HAL_RCC_ADC1_CLK_ENABLE(); - /* Enable DMA2 clock */ - __HAL_RCC_DMA2_CLK_ENABLE(); - - /*##-2- Configure peripheral GPIO ##########################################*/ - /* ADC3 Channel8 GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_0; // FIXME - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*##-3- Configure the DMA streams ##########################################*/ - /* Set the parameters to be configured */ - hdma_adc.Instance = DMA2_Stream0; - - hdma_adc.Init.Channel = DMA_CHANNEL_0; // FIXME - hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_adc.Init.MemInc = DMA_MINC_ENABLE; - hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; - hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - hdma_adc.Init.Mode = DMA_CIRCULAR; - hdma_adc.Init.Priority = DMA_PRIORITY_HIGH; - hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL; - hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE; - hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE; - - HAL_DMA_Init(&hdma_adc); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef* port;// pointer to the actual port registers - /* Associate the initialized DMA handle to the the ADC handle */ - __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc); + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /*##-2- Configure peripheral GPIO ##########################################*/ - /*##-4- Configure the NVIC for DMA #########################################*/ - /* NVIC configuration for DMA transfer complete interrupt */ - HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); + /* ADC Periph clock enable */ + __HAL_RCC_ADC1_CLK_ENABLE(); + + /* ADC Channel GPIO pin configuration */ + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + + for(int i = 0; i < ARRAYSIZE(g_AD_Channel); i++) + { + if(g_AD_Channel[i] < 16) // internal channels 16 and 17 doesn't have port + { + GetPortFromEncodedPIN(port, g_AD_Pins[g_AD_Channel[i]]); + GPIO_InitStruct.Pin = g_GPIO_PINS[g_AD_Channel[i]]; + if(port == GPIOA) + { + /* Enable GPIO clock ****************************************/ + __HAL_RCC_GPIOA_CLK_ENABLE(); + /* ADC Channel GPIO pin configuration */ + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + } + else if(port == GPIOB) + { + /* Enable GPIO clock ****************************************/ + __HAL_RCC_GPIOB_CLK_ENABLE(); + /* ADC Channel GPIO pin configuration */ + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } + else if(port == GPIOC) + { + /* Enable GPIO clock ****************************************/ + __HAL_RCC_GPIOC_CLK_ENABLE(); + /* ADC Channel GPIO pin configuration */ + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + } + else if(port == GPIOF) + { + /* Enable GPIO clock ****************************************/ + __HAL_RCC_GPIOF_CLK_ENABLE(); + /* ADC Channel GPIO pin configuration */ + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + } + } + } } /** @@ -112,49 +159,65 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) */ void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc) { - static DMA_HandleTypeDef hdma_adc; - - /*##-1- Reset peripherals ##################################################*/ - __HAL_RCC_ADC_FORCE_RESET(); - __HAL_RCC_ADC_RELEASE_RESET(); + GPIO_TypeDef* port;// pointer to the actual port registers - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* De-initialize the ADC3 Channel8 GPIO pin */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0); - - /*##-3- Disable the DMA Streams ############################################*/ - /* De-Initialize the DMA Stream associate to transmission process */ - HAL_DMA_DeInit(&hdma_adc); - - /*##-4- Disable the NVIC for DMA ###########################################*/ - HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn); + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_ADC_FORCE_RESET(); + __HAL_RCC_ADC_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + for(int i = 0; i < ARRAYSIZE(g_AD_Channel); i++) + { + if(g_AD_Channel[i] < 16) // internal channels 16 and 17 doesn't have port + { + GetPortFromEncodedPIN(port, g_AD_Pins[g_AD_Channel[i]]); + if(port == GPIOA) + { + /* De-initialize the ADC Channel GPIO pin */ + HAL_GPIO_DeInit(GPIOA, g_GPIO_PINS[g_AD_Channel[i]]); + } + else if(port == GPIOB) + { + /* De-initialize the ADC Channel GPIO pin */ + HAL_GPIO_DeInit(GPIOB, g_GPIO_PINS[g_AD_Channel[i]]); + } + else if(port == GPIOC) + { + /* De-initialize the ADC Channel GPIO pin */ + HAL_GPIO_DeInit(GPIOC, g_GPIO_PINS[g_AD_Channel[i]]); + } + else if(port == GPIOF) + { + /* De-initialize the ADC Channel GPIO pin */ + HAL_GPIO_DeInit(GPIOF, g_GPIO_PINS[g_AD_Channel[i]]); + } + } + } } BOOL AD_Initialize(ANALOG_CHANNEL channel, INT32 precisionInBits) { ADC_ChannelConfTypeDef sConfig; - int chNum = g_AD_Channel[channel]; - // init this channel if it's listed in the AD_CHANNELS array // FIXME /*##-1- Configure the ADC peripheral #######################################*/ - AdcHandle.Instance = ADCx; - - AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; - AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; - AdcHandle.Init.ScanConvMode = DISABLE; - AdcHandle.Init.ContinuousConvMode = ENABLE; - AdcHandle.Init.DiscontinuousConvMode = DISABLE; - AdcHandle.Init.NbrOfDiscConversion = 0; - AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; - AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; - AdcHandle.Init.NbrOfConversion = 1; - AdcHandle.Init.DMAContinuousRequests = ENABLE; - AdcHandle.Init.EOCSelection = DISABLE; + AdcHandlers[channel].Instance = ADCx; + + AdcHandlers[channel].Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; /* Asynchronous clock mode, input ADC clock not divided */ + AdcHandlers[channel].Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */ + AdcHandlers[channel].Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ + AdcHandlers[channel].Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandlers[channel].Init.EOCSelection = DISABLE; /* EOC flag picked-up to indicate conversion end */ + AdcHandlers[channel].Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ + AdcHandlers[channel].Init.NbrOfConversion = 1; /* Parameter discarded because sequencer is disabled */ + AdcHandlers[channel].Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ + AdcHandlers[channel].Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ + AdcHandlers[channel].Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; /* Software start to trig the 1st conversion manually, without external event */ + AdcHandlers[channel].Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */ + AdcHandlers[channel].Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */ - if(HAL_ADC_Init(&AdcHandle) != HAL_OK) + if(HAL_ADC_Init(&AdcHandlers[channel]) != HAL_OK) { // channel not available return FALSE; @@ -165,99 +228,53 @@ BOOL AD_Initialize(ANALOG_CHANNEL channel, INT32 precisionInBits) /* "uhADCxConvertedValue" ADC conversions (IT by DMA end */ /* of transfer), select sampling time and ADC clock with sufficient */ /* duration to not create an overhead situation in IRQHandler. */ - sConfig.Channel = g_ADC_Channel[chNum];//ADCx_CHANNEL; - sConfig.Rank = 1; - sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES; - sConfig.Offset = 0; + sConfig.Channel = g_ADC_Channel[g_AD_Channel[channel]];//ADCx_CHANNEL; /* Sampled channel number */ + sConfig.Rank = 1; /* Rank of sampled channel number ADCx_CHANNEL */ + sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; /* Sampling time (number of clock cycles unit) */ + sConfig.Offset = 0; /* Parameter discarded because offset correction is disabled */ - if(HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK) + if(HAL_ADC_ConfigChannel(&AdcHandlers[channel], &sConfig) != HAL_OK) { // channel not available return FALSE; } return TRUE; - - // FIXME - // /*##-3- Start the conversion process and enable interrupt ##################*/ - // /* Note: Considering IT occurring after each number of ADC conversions */ - // /* (IT by DMA end of transfer), select sampling time and ADC clock */ - // /* with sufficient duration to not create an overhead situation in */ - // /* IRQHandler. */ - // if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 1) != HAL_OK) - // { - // // channel not available - // return FALSE; - // } - - // for (int i = 0; i < AD_NUM ; i++) - // { - // if (g_AD_Channel[i] == chNum) - // { - // // valid channel - // if (!(RCC->APB2ENR & RCC_APB2ENR_ADCxEN)) { // not yet initialized - // RCC->APB2ENR |= RCC_APB2ENR_ADCxEN; // enable AD clock - // ADC->CCR = 0; // ADCCLK = PB2CLK / 2; - // ADCx->SQR1 = 0; // 1 conversion - // ADCx->CR1 = 0; - // ADCx->CR2 = ADC_CR2_ADON; // AD on - // ADCx->SMPR1 = 0x01249249 * AD_SAMPLE_TIME; - // ADCx->SMPR2 = 0x09249249 * AD_SAMPLE_TIME; - // } - - // // set pin as analog input if channel is not one of the internally connected - // if(chNum <= 15) { - // CPU_GPIO_DisablePin(AD_GetPinForChannel(channel), RESISTOR_DISABLED, 0, GPIO_ALT_MODE_1); - // return TRUE; - // } - // } - // } - - // // channel not available - // return FALSE; } void AD_Uninitialize(ANALOG_CHANNEL channel) { - // FIXME - HAL_ADC_DeInit(&AdcHandle); - - // int chNum = g_AD_Channel[channel]; - - // // free GPIO pin if this channel is listed in the AD_CHANNELS array - // // and if it's not one of the internally connected ones as these channels don't take any GPIO pins - // if(chNum <= 15) { - // CPU_GPIO_DisablePin(AD_GetPinForChannel(channel), RESISTOR_DISABLED, 0, GPIO_ALT_PRIMARY); - // } + HAL_ADC_DeInit(&AdcHandlers[channel]); } INT32 AD_Read(ANALOG_CHANNEL channel) { int chNum = g_AD_Channel[channel]; - // check if this channel is listed in the AD_CHANNELS array - for (int i = 0; i < AD_NUM ; i++) { - if (g_AD_Channel[i] == chNum) { - // valid channel - int x = ADCx->DR; // clear EOC flag + /*##-1- Start the conversion process #######################################*/ + if (HAL_ADC_Start(&AdcHandlers[channel]) != HAL_OK) + { + /* Start Conversation Error */ + return 0; + } - ADCx->SQR3 = chNum; // select channel - - // need to enable internal reference at ADC->CCR register to work with internally connected channels - if(chNum == 16 || chNum == 17) - { - ADC->CCR |= ADC_CCR_TSVREFE; // Enable internal reference to work with temperature sensor and VREFINT channels - } - - ADCx->CR2 |= ADC_CR2_SWSTART; // start AD - while (!(ADCx->SR & ADC_SR_EOC)); // wait for completion - - // disable internally reference - if(chNum == 16 || chNum == 17) { - ADC->CCR &= ~ADC_CCR_TSVREFE; - } - - return ADCx->DR; // read result - } + /*##-2- Wait for the end of conversion #####################################*/ + /* Before starting a new conversion, you need to check the current state of + the peripheral; if it�s busy you need to wait for the end of current + conversion before starting a new one. + For simplicity reasons, this example is just waiting till the end of the + conversion, but application may perform other tasks while conversion + operation is ongoing. */ + if (HAL_ADC_PollForConversion(&AdcHandlers[channel], 10) != HAL_OK) + { + /* End Of Conversion flag not set on time */ + return 0; + } + + /* Check if the continuous conversion of regular channel is finished */ + if ((HAL_ADC_GetState(&AdcHandlers[channel]) & HAL_ADC_STATE_EOC_REG) == HAL_ADC_STATE_EOC_REG) + { + /*##-3- Get the converted value of regular channel ########################*/ + return HAL_ADC_GetValue(&AdcHandlers[channel]); } // channel not available diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 8a010aca5..7a1803961 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -52,6 +52,8 @@ #define PORT_PIN(port,pin) ( ( (int)port) * 16 + ( pin ) ) +#define GPIO_PINS {GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2,GPIO_PIN_3,GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_7,GPIO_PIN_8,GPIO_PIN_9,GPIO_PIN_10,GPIO_PIN_11,GPIO_PIN_12,GPIO_PIN_13,GPIO_PIN_14,GPIO_PIN_15} + // System clock #define SYSTEM_CLOCK_HZ 168000000 // 168 MHz #define SYSTEM_CYCLE_CLOCK_HZ 168000000 // 168 MHz @@ -105,13 +107,14 @@ startup delay is incurred when waking up from Stop mode. */ // Pin Configuration #define USER_ADC 3 -#define AD_CHANNELS {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} -#define ADC_CHANNELS {ADC_CHANNEL_0,ADC_CHANNEL_1,ADC_CHANNEL_2,ADC_CHANNEL_3,ADC_CHANNEL_4,ADC_CHANNEL_5,ADC_CHANNEL_6,ADC_CHANNEL_7,ADC_CHANNEL_8,ADC_CHANNEL_9,ADC_CHANNEL_10,ADC_CHANNEL_11,ADC_CHANNEL_12,ADC_CHANNEL_13,ADC_CHANNEL_14,ADC_CHANNEL_15} +// choose a maximum of 8 channels and a minimum of one +// ** IMPORTANT ** internal channels 16 and 17 are not available in ADC3 +#define AD_CHANNELS {0,1,2,3,4,5,6,7}//,8,9,10,11,12,13,14,15,16,17} // Uncomment only one of the following defines for DAC -#define USE_DAC_CHANNEL_1 +//#define USE_DAC_CHANNEL_1 //#define USE_DAC_CHANNEL_2 -//#define USE_BOTH_DAC_CHANNEL +#define USE_BOTH_DAC_CHANNEL #define PWM_TIMER {4,4,4,4} #define PWM_CHNL {0,1,2,3} From dee9fdf9986d0a4575ef3a3565afa4f924b5d2c3 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Wed, 6 Apr 2016 18:24:22 +0100 Subject: [PATCH 103/144] Added missing lib I2C_pal --- Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 1 + Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj | 1 + 2 files changed, 2 insertions(+) diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index c54e9e9a9..52db07526 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -45,6 +45,7 @@ + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 2e67ddc51..6811b8a61 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -46,6 +46,7 @@ + From c70699cf6f2ff1b1303642b5214ce7d9987e3d1e Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 8 Apr 2016 13:05:52 +0100 Subject: [PATCH 104/144] Complete CMSIS I2C driver --- .../Native/STM32F4xx/I2C/i2c_functions.cpp | 372 ++++++++++-------- 1 file changed, 201 insertions(+), 171 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/I2C/i2c_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/I2C/i2c_functions.cpp index 1973fb82f..82e28523f 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/I2C/i2c_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/I2C/i2c_functions.cpp @@ -40,7 +40,7 @@ // #define I2C_SDA_PIN 41 // PC9 // #endif // #else // use I2C1 by default - #define I2Cx I2C1 + #define I2Cx I2C1 #define I2Cx_EV_IRQn I2C1_EV_IRQn #define I2Cx_ER_IRQn I2C1_ER_IRQn #define RCC_APB1ENR_I2CxEN RCC_APB1ENR_I2C1EN @@ -53,9 +53,20 @@ #endif // #endif +/* I2C handler declaration */ +I2C_HandleTypeDef I2cHandle; + static I2C_HAL_XACTION* currentI2CXAction; static I2C_HAL_XACTION_UNIT* currentI2CUnit; +// prototypes +void Start_Master_Transmit(I2C_HAL_XACTION_UNIT* unit, uint16_t I2CAddress); +void Start_Master_Receive(I2C_HAL_XACTION_UNIT* unit, uint16_t I2CAddress); +void I2C_Tx_Rx_Completed(); + +// RX buffer pointer +uint8_t * rxBuffer = NULL; + /** * @brief This function handles I2C event interrupt request. * @param None @@ -64,7 +75,7 @@ static I2C_HAL_XACTION_UNIT* currentI2CUnit; */ void I2C1_EV_IRQHandler(void) { - HAL_I2C_EV_IRQHandler(& I2cHandle); + HAL_I2C_EV_IRQHandler(&I2cHandle); } /** @@ -75,184 +86,142 @@ void I2C1_EV_IRQHandler(void) */ void I2C1_ER_IRQHandler(void) { - HAL_I2C_ER_IRQHandler(& I2cHandle); + HAL_I2C_ER_IRQHandler(&I2cHandle); } /** - * @brief Master Tx Transfer completed callbacks. + * @brief I2C error callbacks. * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains * the configuration information for I2C module * @retval None */ -void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) +void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) { + // free rx buffer + if(rxBuffer != NULL) + { + free(rxBuffer); + rxBuffer = NULL; + } + + I2C_HAL_XACTION* xAction = currentI2CXAction; + xAction->Signal(I2C_HAL_XACTION::c_Status_Aborted); // calls XActionStop() } /** - * @brief Master Rx Transfer completed callbacks. + * @brief Master Tx Transfer completed callbacks. * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains * the configuration information for I2C module * @retval None */ -void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) +void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) { + I2C_Tx_Rx_Completed(); } /** - * @brief I2C error callbacks. + * @brief Master Rx Transfer completed callbacks. * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains * the configuration information for I2C module * @retval None */ -void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) +void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) { -} + for(int i = 0; i < hi2c->XferSize; i++) + { + // save next data byte into queue + *(currentI2CUnit->m_dataQueue.Push()) = rxBuffer[i]; + } + // adjust counters + currentI2CUnit->m_bytesTransferred = hi2c->XferSize; + currentI2CUnit->m_bytesToTransfer -= hi2c->XferSize; -void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) -{ - GPIO_InitTypeDef GPIO_InitStruct; - - /*##-1- Enable peripherals and GPIO Clocks #################################*/ - /* Enable GPIO TX/RX clock */ - __HAL_RCC_GPIOB_CLK_ENABLE(); - /* Enable I2C1 clock */ - __HAL_RCC_I2C1_CLK_ENABLE(); - - /*##-2- Configure peripheral GPIO ##########################################*/ - /* I2C TX GPIO pin configuration */ - GPIO_InitStruct.Pin = I2C_SCL_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FAST; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C RX GPIO pin configuration */ - GPIO_InitStruct.Pin = I2C_SDA_PIN; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*##-3- Configure the NVIC for I2C #########################################*/ - /* NVIC for I2C1 */ - HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 1); - HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); - HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 2); - HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); -} + // free rx buffer + free(rxBuffer); + rxBuffer = NULL; -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) -{ - /*##-1- Reset peripherals ##################################################*/ - __HAL_RCC_I2C1_FORCE_RESET(); - __HAL_RCC_I2C1_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure I2C Tx as alternate function */ - HAL_GPIO_DeInit(GPIOB, I2C_SCL_PIN); - /* Configure I2C Rx as alternate function */ - HAL_GPIO_DeInit(GPIOB, I2C_SDA_PIN); - - /*##-3- Disable the NVIC for I2C ###########################################*/ - HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); - HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); + I2C_Tx_Rx_Completed(); } -void I2C_ER_Interrupt (void* param) // Error Interrupt Handler +void I2C_Tx_Rx_Completed() { - INTERRUPT_START - - // pre: - // I2C_SR1_BERR | I2C_SR1_ARLO | I2C_SR1_AF | I2C_SR1_TIMEOUT - I2C_HAL_XACTION* xAction = currentI2CXAction; - I2Cx->SR1 = 0; // reset errors - xAction->Signal(I2C_HAL_XACTION::c_Status_Aborted); // calls XActionStop() - - INTERRUPT_END -} - -void I2C_EV_Interrupt (void* param) // Event Interrupt Handler -{ - INTERRUPT_START - - // pre: - // I2C_SR1_SB | I2C_SR1_ADDR | I2C_SR1_BTF | I2C_CR2_ITBUFEN & (I2C_SR1_RXNE | I2C_SR1_TXE) - - I2C_HAL_XACTION* xAction = currentI2CXAction; - I2C_HAL_XACTION_UNIT* unit = currentI2CUnit; - - int todo = unit->m_bytesToTransfer; - int sr1 = I2Cx->SR1; // read status register - int sr2 = I2Cx->SR2; // clear ADDR bit - int cr1 = I2Cx->CR1; // initial control register - - if (unit->IsReadXActionUnit()) { // read transaction - if (sr1 & I2C_SR1_SB) { // start bit - if (todo == 1) { - I2Cx->CR1 = (cr1 &= ~I2C_CR1_ACK); // last byte nack - } else if (todo == 2) { - I2Cx->CR1 = (cr1 |= I2C_CR1_POS); // prepare 2nd byte nack - } - UINT8 addr = xAction->m_address << 1; // address bits - I2Cx->DR = addr + 1; // send header byte with read bit; - } else { - if (sr1 & I2C_SR1_ADDR) { // address sent - if (todo == 1) { - I2Cx->CR1 = (cr1 |= I2C_CR1_STOP); // send stop after single byte - } else if (todo == 2) { - I2Cx->CR1 = (cr1 &= ~I2C_CR1_ACK); // last byte nack - } - } else { - while (sr1 & I2C_SR1_RXNE) { // data available - if (todo == 2) { // 2 bytes remaining - I2Cx->CR1 = (cr1 |= I2C_CR1_STOP); // stop after last byte - } else if (todo == 3) { // 3 bytes remaining - if (!(sr1 & I2C_SR1_BTF)) break; // assure 2 bytes are received - I2Cx->CR1 = (cr1 &= ~I2C_CR1_ACK); // last byte nack - } - UINT8 data = I2Cx->DR; // read data - *(unit->m_dataQueue.Push()) = data; // save data - unit->m_bytesTransferred++; - unit->m_bytesToTransfer = --todo; // update todo - sr1 = I2Cx->SR1; // update status register copy - } - } - if (todo == 1) { - I2Cx->CR2 |= I2C_CR2_ITBUFEN; // enable I2C_SR1_RXNE interrupt - } - } - } else { // write transaction - if (sr1 & I2C_SR1_SB) { // start bit - UINT8 addr = xAction->m_address << 1; // address bits - I2Cx->DR = addr; // send header byte with write bit; - } else { - while (todo && (sr1 & I2C_SR1_TXE)) { - I2Cx->DR = *(unit->m_dataQueue.Pop()); // next data byte; - unit->m_bytesTransferred++; - unit->m_bytesToTransfer = --todo; // update todo - sr1 = I2Cx->SR1; // update status register copy - } - if (!(sr1 & I2C_SR1_BTF)) todo++; // last byte not yet sent + // all received or all sent + if (!xAction->ProcessingLastUnit()) + { + // get current unit + currentI2CUnit = xAction->m_xActionUnits[xAction->m_current++]; + + // start next unit + // what is the direction of the current I2C unit? + if (currentI2CUnit->IsReadXActionUnit()) + { + // read transaction + // get address from xAction + Start_Master_Receive(currentI2CUnit, xAction->m_address << 1); } - - } - - if (todo == 0) { // all received or all sent - if (!xAction->ProcessingLastUnit()) { // start next unit - I2Cx->CR2 &= ~I2C_CR2_ITBUFEN; // disable I2C_SR1_RXNE interrupt - currentI2CUnit = xAction->m_xActionUnits[ xAction->m_current++ ]; - I2Cx->CR1 = I2C_CR1_PE | I2C_CR1_START | I2C_CR1_ACK; // send restart - } else { - xAction->Signal(I2C_HAL_XACTION::c_Status_Completed); // calls XActionStop() + else + { + // write transaction + // get address from xAction + Start_Master_Transmit(currentI2CUnit, xAction->m_address << 1); } + } + else + { + xAction->Signal(I2C_HAL_XACTION::c_Status_Completed); // calls XActionStop() } - - INTERRUPT_END } +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO TX/RX clock */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + /* Enable I2C1 clock */ + __HAL_RCC_I2C1_CLK_ENABLE(); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* I2C TX GPIO pin configuration */ + GPIO_InitStruct.Pin = I2C_SCL_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C RX GPIO pin configuration */ + GPIO_InitStruct.Pin = I2C_SDA_PIN; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*##-3- Configure the NVIC for I2C #########################################*/ + /* NVIC priority for I2C1 */ + HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 1); + HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 2); +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) +{ + /*##-1- Reset peripherals ##################################################*/ + __HAL_RCC_I2C1_FORCE_RESET(); + __HAL_RCC_I2C1_RELEASE_RESET(); + + /*##-2- Disable peripherals and GPIO Clocks ################################*/ + /* Configure I2C Tx as alternate function */ + HAL_GPIO_DeInit(GPIOB, I2C_SCL_PIN); + /* Configure I2C Rx as alternate function */ + HAL_GPIO_DeInit(GPIOB, I2C_SDA_PIN); + + /*##-3- Disable the NVIC for I2C ###########################################*/ + HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); + HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); +} BOOL I2C_Internal_Initialize() { @@ -312,45 +281,45 @@ void I2C_Internal_XActionStart( I2C_HAL_XACTION* xAction, bool repeatedStart ) I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9; I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - I2cHandle.Init.OwnAddress1 = xAction->m_address;//I2C_ADDRESS; + I2cHandle.Init.OwnAddress1 = xAction->m_address << 1;//I2C_ADDRESS; I2cHandle.Init.OwnAddress2 = 0xFE; if(HAL_I2C_Init(&I2cHandle) != HAL_OK) { // Initialization Error - return FALSE; + return; } - + // set vars for latter use currentI2CXAction = xAction; - currentI2CUnit = xAction->m_xActionUnits[ xAction->m_current++ ]; - - UINT32 ccr = xAction->m_clockRate + (xAction->m_clockRate2 << 8); - if (I2Cx->CCR != ccr) { // set clock rate and rise time - UINT32 trise; - if (ccr & I2C_CCR_FS) { // fast => 0.3ns rise time - trise = SYSTEM_APB1_CLOCK_HZ / (1000 * 3333) + 1; // PCLK1 / 3333kHz - } else { // slow => 1.0ns rise time - trise = SYSTEM_APB1_CLOCK_HZ / (1000 * 1000) + 1; // PCLK1 / 1000kHz - } - I2Cx->CR1 = 0; // disable peripheral - I2Cx->CCR = ccr; - I2Cx->TRISE = trise; + currentI2CUnit = xAction->m_xActionUnits[xAction->m_current++]; + + // enable interrupts + HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); + HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); + + // what is the direction of the current I2C unit? + if (currentI2CUnit->IsReadXActionUnit()) + { + // read transaction + // get address from xAction + Start_Master_Receive(currentI2CUnit, xAction->m_address << 1); } - - I2Cx->CR1 = I2C_CR1_PE; // enable and reset special flags - I2Cx->SR1 = 0; // reset error flags - I2Cx->CR2 |= I2C_CR2_ITEVTEN | I2C_CR2_ITERREN; // enable interrupts - I2Cx->CR1 = I2C_CR1_PE | I2C_CR1_START | I2C_CR1_ACK; // send start + else + { + // write transaction + // get address from xAction + Start_Master_Transmit(currentI2CUnit, xAction->m_address << 1); + } } void I2C_Internal_XActionStop() { NATIVE_PROFILE_HAL_PROCESSOR_I2C(); - if (I2Cx->SR2 & I2C_SR2_BUSY && !(I2Cx->CR1 & I2C_CR1_STOP)) { - I2Cx->CR1 |= I2C_CR1_STOP; // send stop - } - I2Cx->CR2 &= ~(I2C_CR2_ITBUFEN | I2C_CR2_ITEVTEN | I2C_CR2_ITERREN); // disable interrupts + // disable interrupts + HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); + HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); + // null vars currentI2CXAction = NULL; currentI2CUnit = NULL; } @@ -360,10 +329,15 @@ void I2C_Internal_GetClockRate( UINT32 rateKhz, UINT8& clockRate, UINT8& clockRa NATIVE_PROFILE_HAL_PROCESSOR_I2C(); if (rateKhz > 400) rateKhz = 400; // upper limit UINT32 ccr; - if (rateKhz <= 100) { // slow clock + if (rateKhz <= 100) + { + // slow clock ccr = (SYSTEM_APB1_CLOCK_HZ / 1000 / 2 - 1) / rateKhz + 1; // round up if (ccr > 0xFFF) ccr = 0xFFF; // max divider - } else { // fast clock + } + else + { + // fast clock ccr = (SYSTEM_APB1_CLOCK_HZ / 1000 / 3 - 1) / rateKhz + 1; // round up ccr |= 0x8000; // set fast mode (duty cycle 1:2) } @@ -376,3 +350,59 @@ void I2C_Internal_GetPins(GPIO_PIN& scl, GPIO_PIN& sda) scl = I2C_SCL_PIN; sda = I2C_SDA_PIN; } + +void Start_Master_Transmit(I2C_HAL_XACTION_UNIT* unit, uint16_t I2CAddress) +{ + // fill tx buffer + uint8_t aTxBuffer[unit->m_bytesToTransfer]; + uint8_t counter = unit->m_bytesToTransfer; + + for(int i = 0; i < counter; i++) + { + // get next data byte from queue + aTxBuffer[i] = *(unit->m_dataQueue.Pop()); + } + + while(HAL_I2C_Master_Transmit_IT(&I2cHandle, (uint16_t)I2CAddress, (uint8_t*)aTxBuffer, unit->m_bytesToTransfer) != HAL_OK) + { + /* When Acknowledge failure occurs (Slave don't acknowledge it's address) + Master restarts communication */ + if (HAL_I2C_GetError(&I2cHandle) != HAL_I2C_ERROR_AF) + { + // couldn't start the transmission because of a timeout error + // nothing else to do because the caller will handle the timeout error + + // done here + return; + } + } + + // transmission started correctly + // adjust counters + unit->m_bytesTransferred = unit->m_bytesToTransfer; + unit->m_bytesToTransfer = 0; +} + +void Start_Master_Receive(I2C_HAL_XACTION_UNIT* unit, uint16_t I2CAddress) +{ + // allocate rx buffer + rxBuffer = (uint8_t *) malloc(unit->m_bytesToTransfer); + + while(HAL_I2C_Master_Receive_IT(&I2cHandle, (uint16_t)I2CAddress, (uint8_t *)rxBuffer, unit->m_bytesToTransfer) != HAL_OK) + { + /* When Acknowledge failure occurs (Slave don't acknowledge it's address) + Master restarts communication */ + if (HAL_I2C_GetError(&I2cHandle) != HAL_I2C_ERROR_AF) + { + // couldn't start the receive because of a timeout error + // nothing else to do because the caller will handle the timeout error + + // free rx buffer + free(rxBuffer); + rxBuffer = NULL; + + // done here + return; + } + } +} From c05cce5ff3b02b2eedb99484124b0921d11d370f Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 8 Apr 2016 17:49:18 +0100 Subject: [PATCH 105/144] Correct path --- DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 33c1ba767..b4018a95f 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -87,23 +87,23 @@ - + - + - + - + From 2d26cae75b26c2fcf3fa79c0ef515cba53ca6e94 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 00:15:57 +0100 Subject: [PATCH 106/144] Replace Simple heap calls with standard C malloc() and free() --- ..._hardware_native_Microsoft_SPOT_Hardware_LargeBuffer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CLR/Libraries/SPOT_Hardware/spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer.cpp b/CLR/Libraries/SPOT_Hardware/spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer.cpp index 7a5b4f522..b647ed4c9 100644 --- a/CLR/Libraries/SPOT_Hardware/spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer.cpp +++ b/CLR/Libraries/SPOT_Hardware/spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer.cpp @@ -17,7 +17,7 @@ HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer::Create reflex.m_levels = 1; reflex.m_data.m_type = g_CLR_RT_WellKnownTypes.m_UInt8; - CLR_RT_HeapBlock_Array* pData = (CLR_RT_HeapBlock_Array*)SimpleHeap_Allocate(size + sizeof(CLR_RT_HeapBlock_Array)); CHECK_ALLOCATION(pData); + CLR_RT_HeapBlock_Array* pData = (CLR_RT_HeapBlock_Array*)malloc(size + sizeof(CLR_RT_HeapBlock_Array)); CHECK_ALLOCATION(pData); CLR_RT_Memory::ZeroFill(pData, size + sizeof(CLR_RT_HeapBlock_Array)); @@ -57,7 +57,7 @@ HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer::Intern CLR_RT_HeapBlock_Array* hbRef = hbBytes.DereferenceArray(); FAULT_ON_NULL(hbRef); - SimpleHeap_Release(hbRef); + free(hbRef); hbBytes.SetObjectReference( NULL ); @@ -112,7 +112,7 @@ HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_LargeBufferMarshall if(array->m_numOfElements != size) { - SimpleHeap_Release(array); + free(array); TINYCLR_CHECK_HRESULT(Library_spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer::CreateBufferHelper( pLB[Library_spot_hardware_native_Microsoft_SPOT_Hardware_LargeBuffer::FIELD__m_bytes], size )); From eb1ddd8752e75299ef0f51a4b2f28e5450109098 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 00:22:17 +0100 Subject: [PATCH 107/144] Correct flash field names in HalSystemConfig struct --- CLR/Debugger/Debugger.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CLR/Debugger/Debugger.cpp b/CLR/Debugger/Debugger.cpp index 2cdada787..5049d6041 100644 --- a/CLR/Debugger/Debugger.cpp +++ b/CLR/Debugger/Debugger.cpp @@ -905,8 +905,8 @@ bool CLR_DBG_Debugger::Monitor_MemoryMap( WP_Message* msg, void* owner ) map[0].m_length = HalSystemConfig.RAM1.Size; map[0].m_flags = CLR_DBG_Commands::Monitor_MemoryMap::c_RAM; - map[1].m_address = HalSystemConfig.FLASH.Base; - map[1].m_length = HalSystemConfig.FLASH.Size; + map[1].m_address = HalSystemConfig.FLASH1.Base; + map[1].m_length = HalSystemConfig.FLASH1.Size; map[1].m_flags = CLR_DBG_Commands::Monitor_MemoryMap::c_FLASH; dbg->m_messaging->ReplyToCommand( msg, true, false, map, sizeof(map) ); From 1e457e767095695809b06f7ad6b78bf2bbe78c75 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 00:23:29 +0100 Subject: [PATCH 108/144] Add extern declaration for SystemClock_Config --- DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp index 128ca8e8c..d296f0a67 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/Power/Power_functions.cpp @@ -15,6 +15,8 @@ //--// +extern "C" void SystemClock_Config(void); + void HAL_AssertEx() { __BKPT(0); From 8970159f684ac974a9285dc77875ac4471cf5e30 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 00:49:59 +0100 Subject: [PATCH 109/144] Remove reference to HAL_DECLARE_CUSTOM_HEAP --- CLR/Core/CLR_RT_Memory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLR/Core/CLR_RT_Memory.cpp b/CLR/Core/CLR_RT_Memory.cpp index 0b9998bc0..2039c288d 100644 --- a/CLR/Core/CLR_RT_Memory.cpp +++ b/CLR/Core/CLR_RT_Memory.cpp @@ -16,7 +16,7 @@ static int s_PreHeapInitIndex = 0; //////////////////////////////////////////////////////////// -HAL_DECLARE_CUSTOM_HEAP( CLR_RT_Memory::Allocate, CLR_RT_Memory::Release, CLR_RT_Memory::ReAllocate ); +//HAL_DECLARE_CUSTOM_HEAP( CLR_RT_Memory::Allocate, CLR_RT_Memory::Release, CLR_RT_Memory::ReAllocate ); //--// From c28dd4f097a65a6e9698eaaaea394d5a24f16bdf Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 01:28:30 +0100 Subject: [PATCH 110/144] Remove implementation of HAL_CPU_Sleep (is now in Power project) --- Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp b/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp index 2e123ba90..ed5c7ca58 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/tinyclr.cpp @@ -8,12 +8,6 @@ extern GenericPortTableEntry const Itm0GenericPort; extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; -extern void HAL_CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents); -void CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) -{ - HAL_CPU_Sleep(level, wakeEvents); -} - //////////////////////////////////////////////////////////////////////////////// void ApplicationEntryPoint() { From 99ce2430a4af437cc1135588186fa44e19e7a793 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 13:32:51 +0100 Subject: [PATCH 111/144] Add missing projects and correct identation --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 151 ++++++++++++------ .../Native/STM32F4xx/dotNetMF_loader.proj | 10 +- 2 files changed, 111 insertions(+), 50 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index b4018a95f..caf252d79 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -1,54 +1,97 @@ - - - TinyHal_STM32F4xx - {49A36823-B4BC-439C-9223-E5395314A422} - - - STM32F4xx HAL library - HAL - TinyHal_STM32F4xx.$(LIB_EXT) - $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\dotNetMF.proj - TinyHal_STM32F4xx.$(LIB_EXT).manifest - HAL - - - False - - - False - False - False - DeviceCode\Targets\Native\STM32F4xx - false - 4.0.0.0 - - - - - Library - + + + + TinyHAL_STM32F4xx + {49A36823-B4BC-439C-9223-E5395314A422} + + + STM32F4xx HAL library + HAL + TinyHAL_STM32F4xx.$(LIB_EXT) + $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\dotNetMF.proj + TinyHAL_STM32F4xx.$(LIB_EXT).manifest + HAL + + + False + + + False + False + False + DeviceCode\Targets\Native\STM32F4xx + false + 4.0.0.0 + + + + + + + Library + - - - - - - - - - - - + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @@ -152,9 +195,10 @@ + - + @@ -182,8 +226,17 @@ + + + + + + - + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 8bf68b19b..0cb6027ca 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -71,6 +71,7 @@ + @@ -191,6 +192,7 @@ + @@ -220,7 +222,13 @@ - + + + + + + + From 939a0c29dc84fb6a80651fefce8e9ba448f1a394 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 13:33:29 +0100 Subject: [PATCH 112/144] Add missing ref to CRC project --- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 1 - Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 1 - 2 files changed, 2 deletions(-) diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 64bbaf970..9c59df9da 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -158,7 +158,6 @@ - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 2b76a8a0d..561411325 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -146,7 +146,6 @@ - From 8fd2e18113760c5b9268dcc9c14eacc1871985ce Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 13:35:56 +0100 Subject: [PATCH 113/144] Several corrections to TinyCLR - correct path for settings file - enabled newlib nano compilation - add missing projects - remove unused features for testing - add missing I2C projects/lib refs --- .../TinyBooter/TinyBooter.proj | 3 +- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 96 ++++++++++--------- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 6811b8a61..dd933c9c1 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -49,6 +49,8 @@ + + @@ -122,7 +124,6 @@ - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 9f41fbc1b..6394a3ba6 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -9,7 +9,7 @@ True - $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\TinyBooter.settings + $(SPOCLIENT)\Solutions\STM32F4DISCOVERY\TinyCLR\TinyCLR.settings True false @@ -30,8 +30,7 @@ EntryPoint TinyClr_Dat_Start g_ConfigurationSector - - false + true @@ -40,30 +39,32 @@ - - - + + + + - - + + - - + + + @@ -75,6 +76,8 @@ + + @@ -85,7 +88,9 @@ - + + + @@ -116,37 +121,37 @@ - + - + - + - + - + - + - + - + + - @@ -159,7 +164,7 @@ - + @@ -171,6 +176,7 @@ + @@ -209,38 +215,34 @@ - - - - - + + + + - - + + - + @@ -262,8 +264,8 @@ - - + + @@ -317,18 +319,18 @@ - + + + @@ -341,10 +343,10 @@ - + From 409d18a4991db527ca919b0392fdc678f7e0264d Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 13:37:54 +0100 Subject: [PATCH 114/144] Corrections of I2C projects/lib refs --- Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj | 4 +++- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 4 +++- Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index 52db07526..d8701d577 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -47,7 +47,9 @@ - + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 9c59df9da..fdca9ced7 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -84,7 +84,9 @@ - + + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 561411325..bfdd02dd1 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -73,6 +73,8 @@ + + From 7dbce697d0ca411ef3a51674fbb2b6a2e5fd0cfb Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 19:03:52 +0100 Subject: [PATCH 115/144] Revert changes with SimpleHeap - declaration must be in tinyhal.h oterwise the framework doesn't compile - remove weak declarations from grahpics and time stubs oterwise the framework doesn't compile --- DeviceCode/include/tinyhal.h | 174 +++++++++--------- .../pal/graphics/stubs/graphics_stubs.cpp | 26 +-- DeviceCode/pal/time/stubs/time_stubs.cpp | 40 ++-- 3 files changed, 120 insertions(+), 120 deletions(-) diff --git a/DeviceCode/include/tinyhal.h b/DeviceCode/include/tinyhal.h index 3ac8ddf57..552bf7533 100644 --- a/DeviceCode/include/tinyhal.h +++ b/DeviceCode/include/tinyhal.h @@ -1191,94 +1191,94 @@ UINT32 Stack_MaxUsed(); #endif // defined(PLATFORM_ARM) -// //--// +//--// + +// Simple Heap is for use by Porting Kit users who need private memory allocation. +/************************************************************************************* +** +** Function: SimpleHeap_Allocate +** +** Synopsis: Initializes simple heap from supplied buffer. +** Pointer to buffer is saved in global variable. +** Later is used for allocation of blocks by SimpleHeap_Allocate +** +** Arguments: [pHeapBuffer] - Pointer to heap buffer. This pointer is saved in global variable, +** later used by SimpleHeap_* function. +** [pHeapBuffer] - Size of memory block pointed by pHeapBuffer +** +**************************************************************************************/ +void SimpleHeap_Initialize( void* pHeapBuffer, UINT32 heapBuufferSize ); + +/********************************************************************** +** +** Function: SimpleHeap_Allocate +** +** Synopsis: Allocates block of memory from heap buffer initialized by SimpleHeap_Initialize +** +** +** Arguments: [len] - Size of block to allocate. +** +** Returns: Pointer to newly allocated memory + or NULL if there is no free memory to accomodate block of size len +**********************************************************************/ +void* SimpleHeap_Allocate ( size_t len ); + +/********************************************************************** +** +** Function: SimpleHeap_Release +** +** Synopsis: Releases memory block allocated by SimpleHeap_Allocate +** +** +** Arguments: [pHeapBlock] - Memory block to release. +** +**********************************************************************/ +void SimpleHeap_Release ( void* pHeapBlock ); + + +/********************************************************************** +** +** Function: SimpleHeap_ReAllocate +** +** Synopsis: Reallocates memory on an existing pointer and copies bck the +** data +** +** Arguments: [pHeapBlock] - Memory block to reallocate. +** Arguments: [len] - Size of block to allocate. +** +**********************************************************************/ +void* SimpleHeap_ReAllocate( void* pHeapBlock, size_t len ); + +/********************************************************************** +** +** Function: SimpleHeap_IsAllocated +** +** Synopsis: Checks if pHeapBlock points to memory block allocated by SimpleHeap_Allocate +** +** Arguments: [pHeapBlock] - Memory block to release. +** +** Returns: TRUE if pHeapBlock points to memory allocated, FALSE otherwise. +**********************************************************************/ +BOOL SimpleHeap_IsAllocated( void* pHeapBlock ); + +/********************************************************************** +** +** Function: HAL_Init_Custom_Heap +** +** Synopsis: Initializes simple heap with memory buffer provided by CustomHeapLocation function. +** +**********************************************************************/ +inline void HAL_Init_Custom_Heap() +{ + UINT8* BaseAddress = 0; + UINT32 SizeInBytes = 0; + + // Retrieve location for Custom Heap. The location is defined in scatter file. + CustomHeapLocation( BaseAddress, SizeInBytes ); -// // Simple Heap is for use by Porting Kit users who need private memory allocation. -// /************************************************************************************* -// ** -// ** Function: SimpleHeap_Allocate -// ** -// ** Synopsis: Initializes simple heap from supplied buffer. -// ** Pointer to buffer is saved in global variable. -// ** Later is used for allocation of blocks by SimpleHeap_Allocate -// ** -// ** Arguments: [pHeapBuffer] - Pointer to heap buffer. This pointer is saved in global variable, -// ** later used by SimpleHeap_* function. -// ** [pHeapBuffer] - Size of memory block pointed by pHeapBuffer -// ** -// **************************************************************************************/ -// void SimpleHeap_Initialize( void* pHeapBuffer, UINT32 heapBuufferSize ); - -// /********************************************************************** -// ** -// ** Function: SimpleHeap_Allocate -// ** -// ** Synopsis: Allocates block of memory from heap buffer initialized by SimpleHeap_Initialize -// ** -// ** -// ** Arguments: [len] - Size of block to allocate. -// ** -// ** Returns: Pointer to newly allocated memory -// or NULL if there is no free memory to accomodate block of size len -// **********************************************************************/ -// void* SimpleHeap_Allocate ( size_t len ); - -// /********************************************************************** -// ** -// ** Function: SimpleHeap_Release -// ** -// ** Synopsis: Releases memory block allocated by SimpleHeap_Allocate -// ** -// ** -// ** Arguments: [pHeapBlock] - Memory block to release. -// ** -// **********************************************************************/ -// void SimpleHeap_Release ( void* pHeapBlock ); - - -// /********************************************************************** -// ** -// ** Function: SimpleHeap_ReAllocate -// ** -// ** Synopsis: Reallocates memory on an existing pointer and copies bck the -// ** data -// ** -// ** Arguments: [pHeapBlock] - Memory block to reallocate. -// ** Arguments: [len] - Size of block to allocate. -// ** -// **********************************************************************/ -// void* SimpleHeap_ReAllocate( void* pHeapBlock, size_t len ); - -// /********************************************************************** -// ** -// ** Function: SimpleHeap_IsAllocated -// ** -// ** Synopsis: Checks if pHeapBlock points to memory block allocated by SimpleHeap_Allocate -// ** -// ** Arguments: [pHeapBlock] - Memory block to release. -// ** -// ** Returns: TRUE if pHeapBlock points to memory allocated, FALSE otherwise. -// **********************************************************************/ -// BOOL SimpleHeap_IsAllocated( void* pHeapBlock ); - -// /********************************************************************** -// ** -// ** Function: HAL_Init_Custom_Heap -// ** -// ** Synopsis: Initializes simple heap with memory buffer provided by CustomHeapLocation function. -// ** -// **********************************************************************/ -// inline void HAL_Init_Custom_Heap() -// { -// UINT8* BaseAddress = 0; -// UINT32 SizeInBytes = 0; - -// // Retrieve location for Custom Heap. The location is defined in scatter file. -// CustomHeapLocation( BaseAddress, SizeInBytes ); - -// // Initialize custom heap with heap block returned from CustomHeapLocation -// SimpleHeap_Initialize( BaseAddress, SizeInBytes ); -// } + // Initialize custom heap with heap block returned from CustomHeapLocation + SimpleHeap_Initialize( BaseAddress, SizeInBytes ); +} // //--// diff --git a/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp b/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp index c0824e489..f3a1483d1 100644 --- a/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp +++ b/DeviceCode/pal/graphics/stubs/graphics_stubs.cpp @@ -6,71 +6,71 @@ //--// -__weak int Graphics_GetSize( int width, int height ) +int Graphics_GetSize( int width, int height ) { NATIVE_PROFILE_PAL_GRAPHICS(); return 0; } -__weak int Graphics_GetWidthInWords( int width ) +int Graphics_GetWidthInWords( int width ) { NATIVE_PROFILE_PAL_GRAPHICS(); return 0; } -__weak void Graphics_Clear( const PAL_GFX_Bitmap& bitmap ) +void Graphics_Clear( const PAL_GFX_Bitmap& bitmap ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak UINT32 Graphics_GetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y ) +UINT32 Graphics_GetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y ) { NATIVE_PROFILE_PAL_GRAPHICS(); return 0; } -__weak void Graphics_SetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y, UINT32 color ) +void Graphics_SetPixel( const PAL_GFX_Bitmap& bitmap, int x, int y, UINT32 color ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_DrawLine( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) +void Graphics_DrawLine( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_DrawLineRaw( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) +void Graphics_DrawLineRaw( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, int x0, int y0, int x1, int y1 ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_DrawRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle ) +void Graphics_DrawRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_DrawRoundedRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle, +void Graphics_DrawRoundedRectangle( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, const GFX_Rect& rectangle, int radiusX, int radiusY ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_DrawEllipse( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, int x, int y, int radiusX, int radiusY ) +void Graphics_DrawEllipse( const PAL_GFX_Bitmap& bitmap, const GFX_Pen& pen, const GFX_Brush& brush, int x, int y, int radiusX, int radiusY ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_DrawImage( const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) +void Graphics_DrawImage( const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_RotateImage( int angle, const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) +void Graphics_RotateImage( int angle, const PAL_GFX_Bitmap& bitmapDst, const GFX_Rect& dst, const PAL_GFX_Bitmap& bitmapSrc, const GFX_Rect& src, UINT16 opacity ) { NATIVE_PROFILE_PAL_GRAPHICS(); } -__weak void Graphics_SetPixelsHelper( const PAL_GFX_Bitmap& bitmap, const GFX_Rect& rect, UINT32 config, GFX_SetPixelsCallback callback, void* param ) +void Graphics_SetPixelsHelper( const PAL_GFX_Bitmap& bitmap, const GFX_Rect& rect, UINT32 config, GFX_SetPixelsCallback callback, void* param ) { NATIVE_PROFILE_PAL_GRAPHICS(); } diff --git a/DeviceCode/pal/time/stubs/time_stubs.cpp b/DeviceCode/pal/time/stubs/time_stubs.cpp index 9aaea1814..396fb53c0 100644 --- a/DeviceCode/pal/time/stubs/time_stubs.cpp +++ b/DeviceCode/pal/time/stubs/time_stubs.cpp @@ -4,102 +4,102 @@ #include -__weak HRESULT Time_Initialize() +HRESULT Time_Initialize() { return CLR_E_NOTIMPL; } -__weak HRESULT Time_Uninitialize() +HRESULT Time_Uninitialize() { return CLR_E_NOTIMPL; } -__weak INT64 Time_GetUtcTime() +INT64 Time_GetUtcTime() { return 0; } -__weak INT64 Time_SetUtcTime( INT64 UtcTime, bool calibrate ) +INT64 Time_SetUtcTime( INT64 UtcTime, bool calibrate ) { return 0; } -__weak INT64 Time_GetLocalTime() +INT64 Time_GetLocalTime() { return 0; } -__weak INT32 Time_GetTimeZoneOffset() +INT32 Time_GetTimeZoneOffset() { return 0; } -__weak INT32 Time_SetTimeZoneOffset(INT32 offset) +INT32 Time_SetTimeZoneOffset(INT32 offset) { return 0; } -__weak INT64 Time_GetTickCount() +INT64 Time_GetTickCount() { return 0; } -__weak INT64 Time_GetMachineTime() +INT64 Time_GetMachineTime() { return 0; } -__weak BOOL Time_ToSystemTime(INT64 time, SYSTEMTIME* systemTime) +BOOL Time_ToSystemTime(INT64 time, SYSTEMTIME* systemTime) { return FALSE; } -__weak INT64 Time_FromSystemTime(const SYSTEMTIME* systemTime) +INT64 Time_FromSystemTime(const SYSTEMTIME* systemTime) { return 0; } -__weak HRESULT Time_DaysInMonth(INT32 year, INT32 month, INT32* days) +HRESULT Time_DaysInMonth(INT32 year, INT32 month, INT32* days) { return CLR_E_NOTIMPL; } -__weak HRESULT Time_AccDaysInMonth(INT32 year, INT32 month, INT32* days) +HRESULT Time_AccDaysInMonth(INT32 year, INT32 month, INT32* days) { return CLR_E_NOTIMPL; } -__weak BOOL Utility_SafeSprintfV( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, va_list arg ) +BOOL Utility_SafeSprintfV( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, va_list arg ) { return FALSE; } -__weak BOOL Utility_SafeSprintf( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, ... ) +BOOL Utility_SafeSprintf( LPSTR& szBuffer, size_t& iBuffer, LPCSTR format, ... ) { return FALSE; } -__weak BOOL Time_TimeSpanToStringEx( const INT64& ticks, LPSTR& buf, size_t& len ) +BOOL Time_TimeSpanToStringEx( const INT64& ticks, LPSTR& buf, size_t& len ) { return FALSE; } -__weak LPCSTR Time_TimeSpanToString( const INT64& ticks ) +LPCSTR Time_TimeSpanToString( const INT64& ticks ) { return NULL; } -__weak BOOL Time_DateTimeToStringEx( const INT64& time, LPSTR& buf, size_t& len ) +BOOL Time_DateTimeToStringEx( const INT64& time, LPSTR& buf, size_t& len ) { return FALSE; } -__weak LPCSTR Time_DateTimeToString( const INT64& time) +LPCSTR Time_DateTimeToString( const INT64& time) { return NULL; } -__weak LPCSTR Time_CurrentDateTimeToString() +LPCSTR Time_CurrentDateTimeToString() { return NULL; } From b16be4273bbde54173f9314559df46eac865f4b9 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 11 Apr 2016 19:04:47 +0100 Subject: [PATCH 116/144] Remove weak declarations from simple heap stubs otherwise the framework doesn't compile --- DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp b/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp index 87eb9aa71..05c40f48c 100644 --- a/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp +++ b/DeviceCode/pal/SimpleHeap/stubs/SimpleHeap_stubs.cpp @@ -6,20 +6,20 @@ //--// -__weak void SimpleHeap_Initialize( void* buffer, UINT32 length ) +void SimpleHeap_Initialize( void* buffer, UINT32 length ) { } -__weak void* SimpleHeap_Allocate( size_t len ) +void* SimpleHeap_Allocate( size_t len ) { return NULL; } -__weak void SimpleHeap_Release( void* ptr ) +void SimpleHeap_Release( void* ptr ) { } -__weak void* SimpleHeap_ReAllocate( void* ptr, size_t len ) +void* SimpleHeap_ReAllocate( void* ptr, size_t len ) { return NULL; } From ad44f7477b5729deb8740ec1d6fafe4b2a2f90c6 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 12 Apr 2016 08:47:45 +0100 Subject: [PATCH 117/144] Remove unused code and headers from HAL prjs and HAL configuration file at solution level --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 13 -------- .../Native/STM32F4xx/dotNetMF_loader.proj | 13 -------- Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h | 30 +++++++++---------- .../STM32F4DISCOVERY/stm32f4xx_hal_conf.h | 30 +++++++++---------- 4 files changed, 30 insertions(+), 56 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index caf252d79..90cca4d5a 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -55,7 +55,6 @@ - @@ -64,12 +63,6 @@ - - - - - - @@ -77,17 +70,11 @@ - - - - - - diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 0cb6027ca..9071adc96 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -53,7 +53,6 @@ - @@ -62,12 +61,6 @@ - - - - - - @@ -75,17 +68,11 @@ - - - - - - diff --git a/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h b/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h index eb0c9c508..a1d9445f4 100644 --- a/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h +++ b/Solutions/MCBSTM32F400/stm32f4xx_hal_conf.h @@ -54,43 +54,43 @@ #define HAL_CEC_MODULE_ENABLED #define HAL_CRYP_MODULE_ENABLED #define HAL_DAC_MODULE_ENABLED -#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED #define HAL_DMA2D_MODULE_ENABLED #define HAL_ETH_MODULE_ENABLED #define HAL_FLASH_MODULE_ENABLED -#define HAL_NAND_MODULE_ENABLED -#define HAL_NOR_MODULE_ENABLED -#define HAL_PCCARD_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED #define HAL_HASH_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED #define HAL_I2C_MODULE_ENABLED -#define HAL_I2S_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED //#define HAL_IWDG_MODULE_ENABLED #define HAL_LTDC_MODULE_ENABLED #define HAL_DSI_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED -#define HAL_QSPI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED #define HAL_RNG_MODULE_ENABLED #define HAL_RTC_MODULE_ENABLED -#define HAL_SAI_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED #define HAL_USART_MODULE_ENABLED -#define HAL_IRDA_MODULE_ENABLED -#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED //#define HAL_WWDG_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED #define HAL_PCD_MODULE_ENABLED #define HAL_HCD_MODULE_ENABLED -#define HAL_FMPI2C_MODULE_ENABLED -#define HAL_SPDIFRX_MODULE_ENABLED -#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** diff --git a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h index 084dba1c4..029fadc1c 100644 --- a/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h +++ b/Solutions/STM32F4DISCOVERY/stm32f4xx_hal_conf.h @@ -54,43 +54,43 @@ #define HAL_CEC_MODULE_ENABLED #define HAL_CRYP_MODULE_ENABLED #define HAL_DAC_MODULE_ENABLED -#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED #define HAL_DMA2D_MODULE_ENABLED #define HAL_ETH_MODULE_ENABLED #define HAL_FLASH_MODULE_ENABLED -#define HAL_NAND_MODULE_ENABLED -#define HAL_NOR_MODULE_ENABLED -#define HAL_PCCARD_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED #define HAL_HASH_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED #define HAL_I2C_MODULE_ENABLED -#define HAL_I2S_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED //#define HAL_IWDG_MODULE_ENABLED #define HAL_LTDC_MODULE_ENABLED #define HAL_DSI_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED -#define HAL_QSPI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED #define HAL_RNG_MODULE_ENABLED #define HAL_RTC_MODULE_ENABLED -#define HAL_SAI_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED #define HAL_USART_MODULE_ENABLED -#define HAL_IRDA_MODULE_ENABLED -#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED //#define HAL_WWDG_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED #define HAL_PCD_MODULE_ENABLED #define HAL_HCD_MODULE_ENABLED -#define HAL_FMPI2C_MODULE_ENABLED -#define HAL_SPDIFRX_MODULE_ENABLED -#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** From b3254aee1cc8ed8db3255de2cb63b1201f9cf28e Mon Sep 17 00:00:00 2001 From: sjmneves Date: Tue, 12 Apr 2016 17:31:45 +0100 Subject: [PATCH 118/144] Rework GPIO to improve performance and to use only HAL functions --- .../Native/STM32F4xx/GPIO/GPIO_functions.cpp | 496 +++++++++--------- 1 file changed, 246 insertions(+), 250 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp index 352f20c1e..b95e544fc 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp @@ -13,16 +13,20 @@ #include -#define Gpio_MaxPins (TOTAL_GPIO_PORT * 16) -#define Gpio_MaxInt 16 +// struct for pair GPIO and PIN +struct GPIOPortPin +{ + GPIO_TypeDef* port; + uint16_t pin; +} ; -// indexed port configuration access -#define Port(port) ((GPIO_TypeDef *) (GPIOA_BASE + (port << 10))) +const GPIOPortPin gpioPortPin[] = GPIO_PORT_PINS; +#define GPIO_PIN_COUNT ARRAYSIZE_CONST_EXPR(gpioPortPin) struct Int_State { HAL_COMPLETION completion; // debounce completion - BYTE packed_port_pin; // encoded number with port and pin number + BYTE pin; // gpio port pin index BYTE mode; // edge mode BYTE debounce; // debounce flag BYTE expected; // expected pin state @@ -31,10 +35,10 @@ struct Int_State UINT32 debounceTicks; }; -static Int_State g_int_state[Gpio_MaxInt]; // interrupt state +static Int_State g_int_state[GPIO_PIN_COUNT]; // interrupt state static UINT32 g_debounceTicks; -static UINT16 g_pinReserved[TOTAL_GPIO_PORT]; // 1 bit per pin +static UINT16 g_pinReserved[GPIO_PIN_COUNT]; // 1 bit per pin /* * Debounce Completion Handler @@ -44,10 +48,10 @@ void GPIO_DebounceHandler(void* arg) Int_State* state = (Int_State*)arg; if(state->ISR) { - UINT32 actual = CPU_GPIO_GetPinState(state->packed_port_pin); // get actual pin state + UINT32 actual = CPU_GPIO_GetPinState(state->pin); // get actual pin state if(actual == state->expected) { - state->ISR(state->packed_port_pin, actual, state->param); + state->ISR(state->pin, actual, state->param); if(state->mode == GPIO_INT_EDGE_BOTH) { // both edges state->expected ^= 1; // update expected state @@ -59,33 +63,34 @@ void GPIO_DebounceHandler(void* arg) /* * Interrupt Handler */ -void GlobalGPIOHandler(int num) // 0 <= num <= 15 +void GlobalGPIOHandler(int pin) // 0 <= num <= 15 { - Int_State* state = &g_int_state[num]; + Int_State* state = &g_int_state[pin]; state->completion.Abort(); - UINT32 gpio_pin = 1 << num; UINT32 actual; - HAL_GPIO_EXTI_IRQHandler(gpio_pin); + HAL_GPIO_EXTI_IRQHandler(gpioPortPin[pin].pin); - actual = CPU_GPIO_GetPinState(state->packed_port_pin); // get actual pin state + actual = CPU_GPIO_GetPinState(state->pin); // get actual pin state if(state->ISR) { if(state->debounce) - { // debounce enabled + { + // debounce enabled // for back compat treat state.debounceTicks == 0 as indication to use global debounce setting UINT32 debounceDeltaTicks = state->debounceTicks == 0 ? g_debounceTicks : state->debounceTicks; state->completion.EnqueueTicks(HAL_Time_CurrentTicks() + debounceDeltaTicks); } else { - state->ISR(state->packed_port_pin, state->expected, state->param); + state->ISR(state->pin, state->expected, state->param); if(state->mode == GPIO_INT_EDGE_BOTH) - { // both edges + { + // both edges if(actual != state->expected) { // fire another isr to keep in synch - state->ISR(state->packed_port_pin, actual, state->param); + state->ISR(state->pin, actual, state->param); } else { @@ -97,8 +102,6 @@ void GlobalGPIOHandler(int num) // 0 <= num <= 15 } - - void EXTI0_IRQHandler(void) // EXTI0 { GlobalGPIOHandler(0); @@ -158,86 +161,6 @@ void EXTI10_IRQHandler(void) // EXTI10 - EXTI15 while(pending); } -BOOL GPIO_Set_Interrupt(UINT32 pin - , GPIO_INTERRUPT_SERVICE_ROUTINE ISR - , void* ISR_Param - , GPIO_INT_EDGE mode - , BOOL GlitchFilterEnable - ) -{ - UINT32 num = pin & 0x0F; - UINT32 bit = 1 << num; - UINT32 shift = (num & 0x3) << 2; // 4 bit fields - UINT32 idx = num >> 2; - UINT32 mask = 0xF << shift; - UINT32 config = (pin >> 4) << shift; // port number configuration - - Int_State* state = &g_int_state[num]; - - GLOBAL_LOCK(irq); - - if(ISR) - { - if((SYSCFG->EXTICR[idx] & mask) != config) - { - if(EXTI->IMR & bit) - return FALSE; // interrupt in use - - SYSCFG->EXTICR[idx] = SYSCFG->EXTICR[idx] & ~mask | config; - } - state->packed_port_pin = (BYTE)pin; - state->mode = (BYTE)mode; - state->debounce = (BYTE)GlitchFilterEnable; - state->param = ISR_Param; - state->ISR = ISR; - state->completion.Abort(); - state->completion.SetArgument(state); - - EXTI->RTSR &= ~bit; - EXTI->FTSR &= ~bit; - switch(mode) - { - case GPIO_INT_EDGE_LOW: - case GPIO_INT_LEVEL_LOW: - EXTI->FTSR |= bit; - state->expected = FALSE; - break; - - case GPIO_INT_EDGE_HIGH: - case GPIO_INT_LEVEL_HIGH: - EXTI->RTSR |= bit; - state->expected = TRUE; - break; - - case GPIO_INT_EDGE_BOTH: - EXTI->FTSR |= bit; - EXTI->RTSR |= bit; - UINT32 actual; - do - { - EXTI->PR = bit; // remove pending interrupt - actual = CPU_GPIO_GetPinState(pin); // get actual pin state - } while(EXTI->PR & bit); // repeat if pending again - state->expected = (BYTE)(actual ^ 1); - } - - EXTI->IMR |= bit; // enable interrupt - // check for level interrupts - if(mode == GPIO_INT_LEVEL_HIGH && CPU_GPIO_GetPinState(pin) - || mode == GPIO_INT_LEVEL_LOW && !CPU_GPIO_GetPinState(pin)) - { - EXTI->SWIER = bit; // force interrupt - } - } - else if((SYSCFG->EXTICR[idx] & mask) == config) - { - EXTI->IMR &= ~bit; // disable interrupt - state->ISR = NULL; - state->completion.Abort(); - } - return TRUE; -} - void EnableIRQ(uint16_t gpio_pin) { if(gpio_pin == GPIO_PIN_0) @@ -306,115 +229,50 @@ void EnableIRQ(uint16_t gpio_pin) } } -// mode: 0: input, 1: output, 2: alternate, 3: analog -// alternate: od | AF << 4 | speed << 8 -void GPIO_Pin_Config(GPIO_PIN packed_port_pin, UINT32 mode, GPIO_RESISTOR resistor, UINT32 alternate) +void GPIO_Pin_Config(GPIO_PIN pin + , UINT32 mode + , GPIO_RESISTOR resistor + , GPIO_INT_EDGE edge + , GPIO_INTERRUPT_SERVICE_ROUTINE ISR) { GPIO_InitTypeDef GPIO_InitStructure; - GPIO_TypeDef* port = Port(packed_port_pin >> 4); // pointer to the actual port registers - packed_port_pin &= 0x0F; // bit number - UINT32 gpio_pin = 1 << packed_port_pin; + GPIO_InitStructure.Pin = gpioPortPin[pin].pin; - // Configure PA0 pin as input floating + // Configure pin mode GPIO_InitStructure.Mode = mode; - if(resistor == RESISTOR_PULLUP) - GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_0; - if(resistor == RESISTOR_PULLDOWN) - GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_1; - GPIO_InitStructure.Pin = gpio_pin; - // Enable GPIO clock - #if defined (RCC_AHB1ENR_GPIOAEN) - if(port == GPIOA) - { - __HAL_RCC_GPIOA_CLK_ENABLE(); - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIOBEN) - if(port == GPIOB) - { - __HAL_RCC_GPIOB_CLK_ENABLE(); - HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIOCEN) - if(port == GPIOC) - { - __HAL_RCC_GPIOC_CLK_ENABLE(); - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIODEN) - if(port == GPIOD) + // interrupt is defined? + if(ISR != NULL) { - __HAL_RCC_GPIOD_CLK_ENABLE(); - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIOEEN) - if(port == GPIOE) - { - __HAL_RCC_GPIOE_CLK_ENABLE(); - HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIOFEN) - if(port == GPIOF) - { - __HAL_RCC_GPIOF_CLK_ENABLE(); - HAL_GPIO_Init(GPIOF, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIOGEN) - if(port == GPIOG) - { - __HAL_RCC_GPIOG_CLK_ENABLE(); - HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); - } - #endif - #if defined (RCC_AHB1ENR_GPIOHEN) - if(port == GPIOH) - { - __HAL_RCC_GPIOH_CLK_ENABLE(); - HAL_GPIO_Init(GPIOH, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); + if(edge == GPIO_INT_EDGE_BOTH) + { + GPIO_InitStructure.Mode |= GPIO_MODE_IT_RISING_FALLING; + } + // falling edge or both + else if(edge == GPIO_INT_EDGE_LOW || edge == GPIO_INT_LEVEL_LOW) + { + GPIO_InitStructure.Mode |= GPIO_MODE_IT_FALLING; + } + // rising or both + else if(edge == GPIO_INT_EDGE_HIGH || edge == GPIO_INT_LEVEL_HIGH) + { + GPIO_InitStructure.Mode |= GPIO_MODE_IT_RISING; + } } - #endif - #if defined (RCC_AHB1ENR_GPIOIEN) - if(port == GPIOI) + + if(resistor == RESISTOR_PULLUP) { - __HAL_RCC_GPIOI_CLK_ENABLE(); - HAL_GPIO_Init(GPIOI, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); + GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_0; } - #endif - #if defined (RCC_AHB1ENR_GPIOJEN) - if(port == GPIOJ) + else if(resistor == RESISTOR_PULLDOWN) { - __HAL_RCC_GPIOJ_CLK_ENABLE(); - HAL_GPIO_Init(GPIOJ, &GPIO_InitStructure); - // Enable and set EXTI Line Interrupt - EnableIRQ(gpio_pin); + GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_1; } - #endif + + + // Init GPIO + HAL_GPIO_Init(gpioPortPin[pin].port, &GPIO_InitStructure); } BOOL CPU_GPIO_Initialize() @@ -425,16 +283,6 @@ BOOL CPU_GPIO_Initialize() CPU_GPIO_SetDebounce(20); // ??? - for(int i = 0; i < TOTAL_GPIO_PORT; i++) - { - g_pinReserved[i] = 0; - } - - for(int i = 0; i < Gpio_MaxInt; i++) - { - g_int_state[i].completion.InitializeForISR(&GPIO_DebounceHandler); - } - // Configure all GPIO as analog to reduce current consumption on non used IOs GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; @@ -498,6 +346,72 @@ BOOL CPU_GPIO_Initialize() __HAL_RCC_GPIOJ_CLK_DISABLE(); #endif + for(int i = 0; i < GPIO_PIN_COUNT; i++) + { + g_pinReserved[i] = FALSE; + g_int_state[i].completion.InitializeForISR(&GPIO_DebounceHandler); + + // Enable GPIO clock + if(gpioPortPin[i].port == GPIOA) + { + __HAL_RCC_GPIOA_CLK_ENABLE(); + } + #if defined (RCC_AHB1ENR_GPIOBEN) + else if(gpioPortPin[i].port == GPIOB) + { + __HAL_RCC_GPIOB_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOCEN) + else if(gpioPortPin[i].port == GPIOC) + { + __HAL_RCC_GPIOC_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIODEN) + else if(gpioPortPin[i].port == GPIOD) + { + __HAL_RCC_GPIOD_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOEEN) + else if(gpioPortPin[i].port == GPIOE) + { + __HAL_RCC_GPIOE_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOFEN) + else if(gpioPortPin[i].port == GPIOF) + { + __HAL_RCC_GPIOF_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOGEN) + else if(gpioPortPin[i].port == GPIOG) + { + __HAL_RCC_GPIOG_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOHEN) + else if(gpioPortPin[i].port == GPIOH) + { + __HAL_RCC_GPIOH_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOIEN) + else if(gpioPortPin[i].port == GPIOI) + { + __HAL_RCC_GPIOI_CLK_ENABLE(); + } + #endif + #if defined (RCC_AHB1ENR_GPIOJEN) + else if(gpioPortPin[i].port == GPIOJ) + { + __HAL_RCC_GPIOJ_CLK_ENABLE(); + } + #endif + } + return TRUE; } @@ -505,7 +419,7 @@ BOOL CPU_GPIO_Uninitialize() { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - for(int i = 0; i < Gpio_MaxInt; i++) + for(int i = 0; i < GPIO_PIN_COUNT; i++) { g_int_state[i].completion.Abort(); } @@ -558,7 +472,8 @@ BOOL CPU_GPIO_Uninitialize() UINT32 CPU_GPIO_Attributes(GPIO_PIN pin) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin < Gpio_MaxPins) + + if(pin < GPIO_PIN_COUNT) { return GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; } @@ -576,29 +491,45 @@ UINT32 CPU_GPIO_Attributes(GPIO_PIN pin) void CPU_GPIO_DisablePin(GPIO_PIN pin, GPIO_RESISTOR resistor, UINT32 output, GPIO_ALT_MODE alternate) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin < Gpio_MaxPins) + + if(pin < GPIO_PIN_COUNT) { - UINT32 mode = output; - UINT32 altMode = (UINT32)alternate & 0x0F; + // disable INT state for this pin + Int_State* state = &g_int_state[pin]; + + state->ISR = NULL; + state->completion.Abort(); + + // release pin + g_pinReserved[pin] = FALSE; - if(altMode == 1) - mode = 3; // analog - else if(altMode) - mode = 2; // alternate pin function + // de-init this pin and configure GPIOit as analog to reduce current consumption on non used IOs + GPIO_InitTypeDef GPIO_InitStruct; - GPIO_Pin_Config(pin, mode, resistor, (UINT32)alternate); - GPIO_Set_Interrupt(pin, NULL, 0, GPIO_INT_NONE, FALSE); // disable interrupt + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Pin = gpioPortPin[pin].pin; + + HAL_GPIO_Init(gpioPortPin[pin].port, &GPIO_InitStruct); } } void CPU_GPIO_EnableOutputPin(GPIO_PIN pin, BOOL initialState) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin < Gpio_MaxPins) + + if(pin < GPIO_PIN_COUNT) { - CPU_GPIO_SetPinState(pin, initialState); - GPIO_Pin_Config(pin, 1, RESISTOR_DISABLED, 0); // general purpose output - GPIO_Set_Interrupt(pin, NULL, 0, GPIO_INT_NONE, FALSE); // disable interrupt + CPU_GPIO_SetPinState(gpioPortPin[pin].pin, initialState); + // general purpose output, any edge, does matter + GPIO_Pin_Config(gpioPortPin[pin].pin, GPIO_MODE_OUTPUT_PP, RESISTOR_DISABLED, GPIO_INT_EDGE_BOTH, NULL); + + // disable INT state for this pin + Int_State* state = &g_int_state[pin]; + + state->ISR = NULL; + state->completion.Abort(); } } @@ -610,7 +541,8 @@ BOOL CPU_GPIO_EnableInputPin(GPIO_PIN pin ) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - return CPU_GPIO_EnableInputPin2(pin, GlitchFilterEnable, ISR, 0, edge, resistor); + + return CPU_GPIO_EnableInputPin2(gpioPortPin[pin].pin, GlitchFilterEnable, ISR, 0, edge, resistor); } BOOL CPU_GPIO_EnableInputPin2(GPIO_PIN pin @@ -622,78 +554,140 @@ BOOL CPU_GPIO_EnableInputPin2(GPIO_PIN pin ) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin >= Gpio_MaxPins) + + if(pin >= GPIO_PIN_COUNT) return FALSE; - GPIO_Pin_Config(pin, 0, resistor, 0); // input - return GPIO_Set_Interrupt(pin, ISR, ISR_Param, edge, GlitchFilterEnable); + GPIO_Pin_Config(gpioPortPin[pin].pin, GPIO_MODE_INPUT, resistor, edge, ISR); // input + + Int_State* state = &g_int_state[pin]; + + if(ISR) + { + state->pin = (BYTE)pin; + state->mode = (BYTE)edge; + state->debounce = (BYTE)GlitchFilterEnable; + state->param = ISR_Param; + state->ISR = ISR; + state->completion.Abort(); + state->completion.SetArgument(state); + + switch(edge) + { + case GPIO_INT_EDGE_LOW: + case GPIO_INT_LEVEL_LOW: + state->expected = FALSE; + break; + + case GPIO_INT_EDGE_HIGH: + case GPIO_INT_LEVEL_HIGH: + state->expected = TRUE; + break; + + case GPIO_INT_EDGE_BOTH: + UINT32 actual; + do + { + // clear pending interrupt + __HAL_GPIO_EXTI_CLEAR_FLAG(gpioPortPin[pin].pin); + actual = CPU_GPIO_GetPinState(pin); // get actual pin state + } while(__HAL_GPIO_EXTI_GET_IT(gpioPortPin[pin].pin)); // repeat if pending again + state->expected = (BYTE)(actual ^ 1); + } + + // Enable and set EXTI Line Interrupt + EnableIRQ(gpioPortPin[pin].pin); + + // check for level interrupts + if(edge == GPIO_INT_LEVEL_HIGH && CPU_GPIO_GetPinState(pin) + || edge == GPIO_INT_LEVEL_LOW && !CPU_GPIO_GetPinState(pin)) + { + // force interrupt + __HAL_GPIO_EXTI_GENERATE_SWIT(gpioPortPin[pin].pin); + } + } + else + { + // clear state, just in case + state->ISR = NULL; + state->completion.Abort(); + } } BOOL CPU_GPIO_GetPinState(GPIO_PIN pin) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin >= Gpio_MaxPins) + + if(pin >= GPIO_PIN_COUNT) return FALSE; - GPIO_TypeDef* port = Port(pin >> 4); // pointer to the actual port registers - return (port->IDR >> (pin & 0xF)) & 1; + return (gpioPortPin[pin].port->IDR >> gpioPortPin[pin].pin) & 1; } void CPU_GPIO_SetPinState(GPIO_PIN pin, BOOL pinState) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin < Gpio_MaxPins) + + if(pin < GPIO_PIN_COUNT) { - GPIO_TypeDef* port = Port(pin >> 4); // pointer to the actual port registers - UINT16 bit = 1 << (pin & 0x0F); if(pinState) - port->BSRR = bit; // set bit + gpioPortPin[pin].port->BSRR = gpioPortPin[pin].pin;//bit; // set bit else - port->BSRR = (uint32_t)bit << 16U; // reset bit + gpioPortPin[pin].port->BSRR = (uint32_t)gpioPortPin[pin].pin << 16U; // reset bit } } BOOL CPU_GPIO_PinIsBusy(GPIO_PIN pin) // busy == reserved { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin >= Gpio_MaxPins) + + if(pin >= GPIO_PIN_COUNT) return FALSE; - int port = pin >> 4, sh = pin & 0x0F; - return (g_pinReserved[port] >> sh) & 1; + return g_pinReserved[pin]; } BOOL CPU_GPIO_ReservePin(GPIO_PIN pin, BOOL fReserve) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - if(pin >= Gpio_MaxPins) + + if(pin >= GPIO_PIN_COUNT) return FALSE; - int port = pin >> 4, bit = 1 << (pin & 0x0F); GLOBAL_LOCK(irq); if(fReserve) { - if(g_pinReserved[port] & bit) - return FALSE; // already reserved - - g_pinReserved[port] |= bit; + if(g_pinReserved[pin]) + { + // already reserved + return FALSE; + } + else + { + // OK to reserve pin + g_pinReserved[pin] = TRUE; + } } else { - g_pinReserved[port] &= ~bit; + // release pin + g_pinReserved[pin] = FALSE; } + return TRUE; } UINT32 CPU_GPIO_GetDebounce() { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + return g_debounceTicks / (SLOW_CLOCKS_PER_SECOND / 1000); // ticks -> ms } BOOL CPU_GPIO_SetDebounce(INT64 debounceTimeMilliseconds) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); + if(debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000) { g_debounceTicks = CPU_MillisecondsToTicks((UINT32)debounceTimeMilliseconds); @@ -705,13 +699,15 @@ BOOL CPU_GPIO_SetDebounce(INT64 debounceTimeMilliseconds) INT32 CPU_GPIO_GetPinCount() { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - return Gpio_MaxPins; + + return GPIO_PIN_COUNT; } void CPU_GPIO_GetPinsMap(UINT8* pins, size_t size) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - for(int i = 0; i < size && i < Gpio_MaxPins; i++) + + for(int i = 0; i < size && i < GPIO_PIN_COUNT; i++) { pins[i] = GPIO_ATTRIBUTE_INPUT | GPIO_ATTRIBUTE_OUTPUT; } @@ -733,8 +729,8 @@ UINT8 CPU_GPIO_GetSupportedInterruptModes(GPIO_PIN pin) UINT32 CPU_GPIO_GetPinDebounce(GPIO_PIN pin) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - UINT32 num = pin & 0x0F; - Int_State& state = g_int_state[num]; + + Int_State& state = g_int_state[gpioPortPin[pin].pin]; return state.debounceTicks / (SLOW_CLOCKS_PER_SECOND / 1000); // ticks -> ms } @@ -742,8 +738,8 @@ UINT32 CPU_GPIO_GetPinDebounce(GPIO_PIN pin) BOOL CPU_GPIO_SetPinDebounce(GPIO_PIN pin, INT64 debounceTimeMilliseconds) { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - UINT32 num = pin & 0x0F; - Int_State& state = g_int_state[num]; + + Int_State& state = g_int_state[gpioPortPin[pin].pin]; if(debounceTimeMilliseconds > 0 && debounceTimeMilliseconds < 10000) { From c9dfc6a4242a4cfd28481e4f24ae592c71134568 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Tue, 12 Apr 2016 17:34:52 +0100 Subject: [PATCH 119/144] Added define for GPIO port pin structer --- Solutions/STM32F4DISCOVERY/platform_selector.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 7a1803961..846c4186f 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -105,12 +105,21 @@ When the voltage regulator operates in low power mode, an additional startup delay is incurred when waking up from Stop mode. */ //#define FAST_WAKEUP_FROM_STOP +/* GPIOs */ +#define GPIO_PORT_PINS \ +{\ + {GPIOA, GPIO_PIN_3},\ + {GPIOB, GPIO_PIN_13}\ +} + +/* ADC */ // Pin Configuration #define USER_ADC 3 // choose a maximum of 8 channels and a minimum of one // ** IMPORTANT ** internal channels 16 and 17 are not available in ADC3 #define AD_CHANNELS {0,1,2,3,4,5,6,7}//,8,9,10,11,12,13,14,15,16,17} +/* DAC */ // Uncomment only one of the following defines for DAC //#define USE_DAC_CHANNEL_1 //#define USE_DAC_CHANNEL_2 @@ -120,11 +129,13 @@ startup delay is incurred when waking up from Stop mode. */ #define PWM_CHNL {0,1,2,3} #define PWM_PINS {60,61,62,63} // PD12-PD15 +/* SPI */ // add to SPI_PORTS array the SPI ports that are available in the solution // please check which SPI ports are available in the device datasheet // uncomment the following define and leave the SPI ports that are available in your hardware #define SPI_PORTS {SPI1, SPI2, SPI3} +/* USART/UART */ // add to USART_PORTS array the USART ports that are available in the solution // please check which USART ports are available in the device datasheet // uncomment the following define and leave the USART ports that are available in your hardware and you intend to use From 758f2e3fa419be1d6c88fddb03ffeed21b1c6353 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 12 Apr 2016 18:44:35 +0100 Subject: [PATCH 120/144] Correction and improvements in GPIO HAL - correct bug with functions being called with GPIO defs instead of pin index - replace code with ST HAL calls - correct bug in CPU_GPIO_EnableOutputPin was setting the output state before configuring the pin - improve GPIO and LEDs definition in platform_selector.h --- .../Native/STM32F4xx/GPIO/GPIO_functions.cpp | 19 +++++---- Solutions/MCBSTM32F400/platform_selector.h | 40 +++++++++++++++---- .../STM32F4DISCOVERY/platform_selector.h | 35 ++++++++-------- 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp index b95e544fc..0609a3c36 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp @@ -269,7 +269,6 @@ void GPIO_Pin_Config(GPIO_PIN pin { GPIO_InitStructure.Pull = GPIO_PUPDR_PUPDR0_1; } - // Init GPIO HAL_GPIO_Init(gpioPortPin[pin].port, &GPIO_InitStructure); @@ -521,9 +520,10 @@ void CPU_GPIO_EnableOutputPin(GPIO_PIN pin, BOOL initialState) if(pin < GPIO_PIN_COUNT) { - CPU_GPIO_SetPinState(gpioPortPin[pin].pin, initialState); // general purpose output, any edge, does matter - GPIO_Pin_Config(gpioPortPin[pin].pin, GPIO_MODE_OUTPUT_PP, RESISTOR_DISABLED, GPIO_INT_EDGE_BOTH, NULL); + GPIO_Pin_Config(pin, GPIO_MODE_OUTPUT_PP, RESISTOR_DISABLED, GPIO_INT_EDGE_BOTH, NULL); + + CPU_GPIO_SetPinState(pin, initialState); // disable INT state for this pin Int_State* state = &g_int_state[pin]; @@ -542,7 +542,7 @@ BOOL CPU_GPIO_EnableInputPin(GPIO_PIN pin { NATIVE_PROFILE_HAL_PROCESSOR_GPIO(); - return CPU_GPIO_EnableInputPin2(gpioPortPin[pin].pin, GlitchFilterEnable, ISR, 0, edge, resistor); + return CPU_GPIO_EnableInputPin2(pin, GlitchFilterEnable, ISR, 0, edge, resistor); } BOOL CPU_GPIO_EnableInputPin2(GPIO_PIN pin @@ -558,7 +558,7 @@ BOOL CPU_GPIO_EnableInputPin2(GPIO_PIN pin if(pin >= GPIO_PIN_COUNT) return FALSE; - GPIO_Pin_Config(gpioPortPin[pin].pin, GPIO_MODE_INPUT, resistor, edge, ISR); // input + GPIO_Pin_Config(pin, GPIO_MODE_INPUT, resistor, edge, ISR); // input Int_State* state = &g_int_state[pin]; @@ -612,6 +612,8 @@ BOOL CPU_GPIO_EnableInputPin2(GPIO_PIN pin state->ISR = NULL; state->completion.Abort(); } + + return TRUE; } BOOL CPU_GPIO_GetPinState(GPIO_PIN pin) @@ -621,7 +623,7 @@ BOOL CPU_GPIO_GetPinState(GPIO_PIN pin) if(pin >= GPIO_PIN_COUNT) return FALSE; - return (gpioPortPin[pin].port->IDR >> gpioPortPin[pin].pin) & 1; + return (BOOL)HAL_GPIO_ReadPin(gpioPortPin[pin].port, gpioPortPin[pin].pin); } void CPU_GPIO_SetPinState(GPIO_PIN pin, BOOL pinState) @@ -630,10 +632,7 @@ void CPU_GPIO_SetPinState(GPIO_PIN pin, BOOL pinState) if(pin < GPIO_PIN_COUNT) { - if(pinState) - gpioPortPin[pin].port->BSRR = gpioPortPin[pin].pin;//bit; // set bit - else - gpioPortPin[pin].port->BSRR = (uint32_t)gpioPortPin[pin].pin << 16U; // reset bit + HAL_GPIO_WritePin(gpioPortPin[pin].port, gpioPortPin[pin].pin, (GPIO_PinState)pinState); } } diff --git a/Solutions/MCBSTM32F400/platform_selector.h b/Solutions/MCBSTM32F400/platform_selector.h index 15a631da6..ce69b6044 100644 --- a/Solutions/MCBSTM32F400/platform_selector.h +++ b/Solutions/MCBSTM32F400/platform_selector.h @@ -103,6 +103,29 @@ #define STM32F4_32B_TIMER 2 #define STM32F4_16B_TIMER 3 +/* GPIOs */ +// User button PG.15 +// LED1 PG.6 +// LED2 PG.7 +// LED3 PG.8 +// LED4 PH.2 +// LED5 PH.3 +// LED6 PH.6 +// LED7 PH.7 +// LED8 PI.10 + +#define GPIO_PORT_PINS \ +{\ + {GPIOG, GPIO_PIN_15},\ + {GPIOG, GPIO_PIN_6},\ + {GPIOG, GPIO_PIN_7},\ + {GPIOG, GPIO_PIN_8},\ + {GPIOH, GPIO_PIN_2},\ + {GPIOH, GPIO_PIN_3},\ + {GPIOH, GPIO_PIN_6},\ + {GPIOH, GPIO_PIN_7},\ +} + // Pin Configuration #define STM32F4_ADC 3 #define STM32F4_AD_CHANNELS {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} @@ -134,16 +157,17 @@ { 0, BUTTON_NONE }, /* Enter */ \ { PORT_PIN( GPIO_PORTG, 15 ), BUTTON_B5 }, /* User */ -#define LED1 PORT_PIN( GPIO_PORTG, 6 ) // PG.6 -#define LED2 PORT_PIN( GPIO_PORTG, 7 ) // PG.7 -#define LED3 PORT_PIN( GPIO_PORTG, 8 ) // PG.8 +// User LEDs are defined as GPIO ports above in GPIO_PORT_PINS @ the following indexes +#define LED1 1 +#define LED2 2 +#define LED3 3 -#define LED4 PORT_PIN( GPIO_PORTH, 2 ) // PH.2 -#define LED5 PORT_PIN( GPIO_PORTH, 3 ) // PH.3 -#define LED6 PORT_PIN( GPIO_PORTH, 6 ) // PH.6 -#define LED7 PORT_PIN( GPIO_PORTH, 7 ) // PH.7 +#define LED4 4 +#define LED5 5 +#define LED6 6 +#define LED7 7 -#define LED8 PORT_PIN( GPIO_PORTI, 10 ) // PI.10 +#define LED8 8 // // constants diff --git a/Solutions/STM32F4DISCOVERY/platform_selector.h b/Solutions/STM32F4DISCOVERY/platform_selector.h index 846c4186f..53db74aad 100644 --- a/Solutions/STM32F4DISCOVERY/platform_selector.h +++ b/Solutions/STM32F4DISCOVERY/platform_selector.h @@ -42,16 +42,6 @@ // constants // -#define GPIO_PORTA 0 -#define GPIO_PORTB 1 -#define GPIO_PORTC 2 -#define GPIO_PORTD 3 -#define GPIO_PORTE 4 -// The remaining ports are not broken out - except PH0 and PH1, -// which are deliberately omitted to keep the range continuous. - -#define PORT_PIN(port,pin) ( ( (int)port) * 16 + ( pin ) ) - #define GPIO_PINS {GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2,GPIO_PIN_3,GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_7,GPIO_PIN_8,GPIO_PIN_9,GPIO_PIN_10,GPIO_PIN_11,GPIO_PIN_12,GPIO_PIN_13,GPIO_PIN_14,GPIO_PIN_15} // System clock @@ -106,10 +96,19 @@ startup delay is incurred when waking up from Stop mode. */ //#define FAST_WAKEUP_FROM_STOP /* GPIOs */ +// PA.0 'User' button +// PD.13 LED3 (orange) +// PD.12 LED4 (green) +// PD.14 LED5 (red) +// PD.15 LED6 (blue) + #define GPIO_PORT_PINS \ {\ - {GPIOA, GPIO_PIN_3},\ - {GPIOB, GPIO_PIN_13}\ + {GPIOA, GPIO_PIN_0},\ + {GPIOD, GPIO_PIN_13},\ + {GPIOD, GPIO_PIN_12},\ + {GPIOD, GPIO_PIN_14},\ + {GPIOD, GPIO_PIN_15},\ } /* ADC */ @@ -151,14 +150,14 @@ startup delay is incurred when waking up from Stop mode. */ #define STM32F4_UART_CTS_PINS {(BYTE)GPIO_PIN_NONE, 51, 59} // GPIO_PIN_NONE, D3, D11 #define STM32F4_UART_RTS_PINS {(BYTE)GPIO_PIN_NONE, 52, 60} // GPIO_PIN_NONE, D4, D12 -// User LEDs -#define LED3 PORT_PIN(GPIO_PORTD, 13) // PD.13 (orange) -#define LED4 PORT_PIN(GPIO_PORTD, 12) // PD.12 (green) -#define LED5 PORT_PIN(GPIO_PORTD, 14) // PD.14 (red) -#define LED6 PORT_PIN(GPIO_PORTD, 15) // PD.15 (blue) +// User LEDs are defined as GPIO ports above in GPIO_PORT_PINS @ the following indexes +#define LED3 1 // (orange) +#define LED4 2 // (green) +#define LED5 3 // (red) +#define LED6 4 // (blue) // TinyBooter entry using GPIO -#define TINYBOOTER_ENTRY_GPIO_PIN PORT_PIN(GPIO_PORTA, 0) // 'User' button +#define TINYBOOTER_ENTRY_GPIO_PIN 0 // 'User' button being GPIO port @ index 0 above in GPIO_PORT_PINS #define TINYBOOTER_ENTRY_GPIO_STATE TRUE // Active high #define TINYBOOTER_ENTRY_GPIO_RESISTOR RESISTOR_DISABLED // No internal resistor, there is external pull-down (R39) From ccc9113ba7c769ee7ef484c943f20e84cfaac914 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 13 Apr 2016 12:38:41 +0100 Subject: [PATCH 121/144] Correct comment --- DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp index 89346b333..9dc2d1b91 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp @@ -30,7 +30,7 @@ The solution is to synchronize 2 timers: In previous NETMF HAL implementations the developer could choose which timers would be synchronized to implement the HAL timer. For the current HAL implementation (CMSIS based) we choose to go with a fixed configuration, for simplicity. -TIM2 will be used as "master" timer synchronized with TIM1 "slave". +TIM2 will be used as "master" timer synchronized with TIM3 "slave". */ BOOL HAL_Time_Initialize() @@ -46,7 +46,7 @@ BOOL HAL_Time_Initialize() // master (32 bit) timer is Timer 2 masterTimerHandle.Instance = TIM2; - // slave (16 bit) timer is Timer 2 + // slave (16 bit) timer is Timer 3 slaveTimerHandle.Instance = TIM3; // enable master clock From 23b96c9b9bd56cbb6aea552c298bec0cfbb96256 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 13 Apr 2016 12:47:49 +0100 Subject: [PATCH 122/144] Correct order of calls to timers init --- .../Native/STM32F4xx/Time/Time_functions.cpp | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp index 9dc2d1b91..34da136b4 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp @@ -90,9 +90,12 @@ BOOL HAL_Time_Initialize() masterTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; masterTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; - // Only counter overflow/underflow generates an update interrupt request - //masterTimerHandle.Instance->CR1 |= TIM_CR1_URS; - + if(HAL_TIM_Base_Init(&masterTimerHandle) != HAL_OK) + { + // something went wrong + return FALSE; + } + // master configration for the master timer sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; @@ -102,12 +105,7 @@ BOOL HAL_Time_Initialize() // FIXME //Error_Handler(); } - - if(HAL_TIM_Base_Init(&masterTimerHandle) != HAL_OK) - { - // something went wrong - return FALSE; - } + // slave timer slaveTimerHandle.Init.Period = 0; @@ -115,9 +113,12 @@ BOOL HAL_Time_Initialize() slaveTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; slaveTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; - // Only counter overflow/underflow generates an update interrupt request - //slaveTimerHandle.Instance->CR1 |= TIM_CR1_URS; - + if(HAL_TIM_Base_Init(&slaveTimerHandle) != HAL_OK) + { + // something went wrong + return FALSE; + } + // slave configuration for the slave timer sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; sSlaveConfig.InputTrigger = TIM_TS_ITR1; @@ -138,12 +139,6 @@ BOOL HAL_Time_Initialize() //Error_Handler(); } - if(HAL_TIM_Base_Init(&slaveTimerHandle) != HAL_OK) - { - // something went wrong - return FALSE; - } - // Starts the 32 bits timer Input Capture measurement in interrupt mode for channel 1 if(HAL_TIM_Base_Start(&slaveTimerHandle) == HAL_OK) From 0549be91a76cf831e8f3e8cb27879ff59e0a170a Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 15 Apr 2016 14:50:06 +0100 Subject: [PATCH 123/144] Further work of USB debug project - WinUSB classes are working - USB debug and communication with MFDeploy completed - Move USB config from solution\device code to solution settings file - Add line to targets in order to set defines required for USB config compilation - Rework TinyBooter and TinyCLR proj to include USB debug project/features - Add FEATURE_USB_DEBUG to solutions features settings files and STM32F4 HAL projects --- .../Targets/Native/STM32F4xx/Int_Handlers.c | 6 + .../Native/STM32F4xx/USB/USB_functions.cpp | 66 +-- .../Native/STM32F4xx/USB/dotNetMF.proj | 22 +- .../Targets/Native/STM32F4xx/USB/usb_conf.cpp | 122 +---- .../Targets/Native/STM32F4xx/USB/usbd_desc.h | 16 +- .../Native/STM32F4xx/USB/usbd_winusb.cpp | 352 +------------ .../Native/STM32F4xx/USB/usbd_winusb.h | 5 +- .../Targets/Native/STM32F4xx/dotNetMF.proj | 8 + .../Native/STM32F4xx/dotNetMF_loader.proj | 8 + DeviceCode/pal/COM/ComDirector.cpp | 30 +- DeviceCode/pal/COM/usb_cmsis/usb.cpp | 484 ++++-------------- Solutions/MCBSTM32F400/MCBSTM32F400.settings | 10 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 6 +- .../MCBSTM32F400/TinyBooter/features.settings | 1 + Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 6 +- .../MCBSTM32F400/TinyCLR/features.settings | 1 + .../TinyCLR_NONET/TinyCLR_NONET.proj | 8 +- .../TinyCLR_NONET/features.settings | 1 + .../DeviceCode/USB/dotNetMF.proj | 46 -- .../DeviceCode/USB/usb_config.cpp | 282 ---------- .../STM32F4DISCOVERY.settings | 10 +- .../TinyBooter/TinyBooter.proj | 14 +- .../TinyBooter/features.settings | 1 + .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 18 +- .../TinyCLR/features.settings | 1 + .../Targets/Microsoft.Spot.system.gcc.targets | 1 + .../Targets/Microsoft.Spot.system.mdk.targets | 1 + 27 files changed, 270 insertions(+), 1256 deletions(-) delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/USB/dotNetMF.proj delete mode 100644 Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c index a0f567442..3577049db 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c @@ -157,4 +157,10 @@ __weak void SysTick_Handler(void) HAL_SYSTICK_IRQHandler(); } +#ifndef FEATURE_USB_DEBUG +void OTG_FS_IRQHandler(void) +{ +} +#endif + /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp index 274a4a833..c2f6f033f 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/USB_functions.cpp @@ -22,7 +22,6 @@ //--// USB_CONTROLLER_STATE usbControlerState; -static UINT8 ep0Buffer[64]; static UINT16 endpointStatus[USB_MAX_QUEUES]; static UINT16 EP_Type; UINT8 previousDeviceState; @@ -32,10 +31,10 @@ Hal_Queue_KnownSize QueueBuffers[4]; USBD_HandleTypeDef USBD_Device; extern PCD_HandleTypeDef hpcd; +extern uint8_t txBuffer[80]; USB_CONTROLLER_STATE *CPU_USB_GetState(int Controller) { - //return NULL; return &usbControlerState; } @@ -115,60 +114,29 @@ BOOL CPU_USB_StartOutput(USB_CONTROLLER_STATE* state, int endpoint) { return FALSE; } - - //OTG_TypeDef* OTG = STM32F4_USB_REGS( State->ControllerNum ); - //USB_Debug( 't' ); - - //GLOBAL_LOCK(irq); - - // If endpoint is not an output + // endpoint is not an output if(state->Queues[endpoint] == NULL || !state->IsTxQueue[endpoint]) { return FALSE; } /* if the halt feature for this endpoint is set, then just clear all the characters */ - // if(state->EndpointStatus[endpoint] & USB_STATUS_ENDPOINT_HALT) - // { - // while(USB_TxDequeue(state, endpoint, TRUE) != NULL) - // { - // } // clear TX queue + if(state->EndpointStatus[endpoint] & USB_STATUS_ENDPOINT_HALT) + { + while(USB_TxDequeue(state, endpoint, TRUE) != NULL) + { + } // clear TX queue - // return TRUE; - // } + return TRUE; + } - //if(irq.WasDisabled()) - //{ - // // check all endpoints for pending actions - // //STM32F4_USB_Driver_Interrupt( OTG, state ); - // } - - // USBD_WINUSB_CLASS winUSBclass = (USBD_WINUSB_CLASS)USBD_Device.pClass; - - //winUSBclass->DataIn(&USBD_Device, endpoint); + // need to wait here for while to allow the USB IN operation to complete + // this seems to occurr only with MFDeploy + HAL_Time_Sleep_MicroSeconds_InterruptEnabled(250); - // write first packet if not done yet - //USBD_WINUSB_DataIn - //USBD_WINUSB_DataIn(&USBD_Device, endpoint); - USBD_LL_DataInStage(&USBD_Device, endpoint, NULL); - - - //USBD_WINUSB_CLASS.DataIn(&USBD_Device, endpoint); - - // // Tx data endpoint - // USB_PACKET64* usbPacket = USB_TxDequeue(state, ep, TRUE); - - // if(usbPacket) - // { - // // data to send - // // Transmit next packet - // USBD_LL_Transmit(&USBD_Device->pdev, - // 1, - // usbPacket->Buffer, - // usbPacket->Size); - // // USB_Debug( 's' ); - // } + // best way to start outputing data is to call the INT handler as if a DataIn interrupt occurred + USBD_Device.pClass->DataIn(&USBD_Device, endpoint); return TRUE; } @@ -181,11 +149,7 @@ BOOL CPU_USB_RxEnable(USB_CONTROLLER_STATE* state, int endpoint) return FALSE; } - //OTG_TypeDef* OTG = STM32F4_USB_REGS( State->ControllerNum ); - - //USB_Debug( 'e' ); - - //GLOBAL_LOCK(irq); + GLOBAL_LOCK(irq); // enable Rx // if( !( OTG->DOEP[ endpoint ].CTL & OTG_DOEPCTL_EPENA ) ) diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj index b0fe0a136..80e25453d 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj @@ -1,14 +1,14 @@ - + - CMSIS_USB + CMSIS_USB_DEBUG {4BA06E07-3576-4A8F-8DE6-DB2CFD370967} - CMSIS USB driver + CMSIS USB debug with WinUSB driver HAL - CMSIS_USB.$(LIB_EXT) + CMSIS_USB_DEBUG.$(LIB_EXT) $(SPOCLIENT)\DeviceCode\Targets\Native\STM32F4xx\USB\dotNetMF.proj - CMSIS_USB.$(LIB_EXT).manifest + CMSIS_USB_DEBUG.$(LIB_EXT).manifest False @@ -24,7 +24,9 @@ - + + + @@ -43,6 +45,14 @@ + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp index 5b9694c31..c696b7a70 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/usb_conf.cpp @@ -156,39 +156,6 @@ void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); - - // moving this to USBD_WINUSB_DataOut - // USB_CONTROLLER_STATE* state; - // USBD_HandleTypeDef *pdev = (USBD_HandleTypeDef*)hpcd->pData; - // state = (USB_CONTROLLER_STATE*)pdev->pUserData; - - // if(epnum == 1) - // { - // // this is a control endpoint - - // state->Data = hpcd->OUT_ep[epnum].xfer_buff; - // state->DataSize = hpcd->OUT_ep[epnum].xfer_count; - - // } - // else if(epnum == 2) - // { - // // this is a data endpoint - - // BOOL bufferIsFull; - // USB_PACKET64* usbPacket = USB_RxEnqueue(state, epnum, bufferIsFull); - - // if(usbPacket == NULL) - // { - // // should not happen - // //USB_Debug( '?' ); - // //_ASSERT( 0 ); - // } - - // // copy data from endpoint buffer to USB packet buffer - // memcpy(usbPacket->Buffer, hpcd->OUT_ep[epnum].xfer_buff, hpcd->OUT_ep[epnum].xfer_count); - // // set USB packet size - // usbPacket->Size = hpcd->OUT_ep[epnum].xfer_count; - // } } /** @@ -200,68 +167,6 @@ void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); - - // UINT32* ps = NULL; - // UINT32 count; - - // USB_CONTROLLER_STATE* state; - // USBD_HandleTypeDef *pdev = (USBD_HandleTypeDef*)hpcd->pData; - // state = (USB_CONTROLLER_STATE*)pdev->pUserData; - - // if(epnum == 1 ) - // { - // // this is a control endpoint - - // if(state->DataCallback) - // { - // // data to send - // state->DataCallback(state); // this call can't fail - // ps = (UINT32*)state->Data; - // count = state->DataSize; - - // //USB_Debug( count ? 'x' : 'n' ); - // } - // } - // else if(state->Queues[epnum] != NULL && state->IsTxQueue[epnum]) - // { - // // this is a TX data endpoint - - // USB_PACKET64* usbPacket = USB_TxDequeue(state, epnum, TRUE); - // if(usbPacket) - // { - // // data to send - - // ps = (UINT32*)usbPacket->Buffer; - - // //USB_Debug( 's' ); - - // // copy data from USB packet buffer to endpoint buffer - // memcpy(hpcd->IN_ep[epnum].xfer_buff, usbPacket->Buffer, usbPacket->Size); - // } - // } - - // if(ps) - // { - // // data to send - // // enable endpoint - // //OTG->DIEP[ ep ].TSIZ = OTG_DIEPTSIZ_PKTCNT_1 | count; - // //OTG->DIEP[ ep ].CTL |= OTG_DIEPCTL_EPENA | OTG_DIEPCTL_CNAK; - - // // write data - // uint32_t volatile* pd = OTG->DFIFO[ep]; - // for( int c = count; c > 0; c -= 4 ) - // { - // *pd = *ps++; - // } - // } - // else - // { - // // no data - - // // disable endpoint - // OTG->DIEP[ ep ].CTL |= OTG_DIEPCTL_SNAK; - // } - } /** @@ -283,8 +188,6 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) { USBD_SpeedTypeDef speed = USBD_SPEED_FULL; - //USB_Debug( '!' ); - /* Set USB Current Speed */ switch(hpcd->Init.speed) { @@ -304,15 +207,6 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) /* Reset Device */ USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); - - // /* clear all flags */ - // USB_ClearEvent( 0, USB_EVENT_ALL ); - - // usbControlerState.FirstGetDescriptor = TRUE; - - // usbControlerState.DeviceState = USB_DEVICE_STATE_DEFAULT; - // usbControlerState.Address = 0; - // USB_StateCallback(&usbControlerState); } /** @@ -322,8 +216,6 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) */ void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) { - //USB_Debug( 'S' ); - USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); previousDeviceState = usbControlerState.DeviceState; @@ -338,8 +230,6 @@ void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) */ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) { - //USB_Debug( 'R' ); - USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); usbControlerState.DeviceState = previousDeviceState; @@ -511,6 +401,12 @@ USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { HAL_PCD_EP_SetStall((PCD_HandleTypeDef*)pdev->pData, ep_addr); + + /* set the halt feature */ + USB_CONTROLLER_STATE* state; + state = (USB_CONTROLLER_STATE*)pdev->pUserData; + state->EndpointStatus[ep_addr & 0xFC] |= USB_STATUS_ENDPOINT_HALT; + return USBD_OK; } @@ -523,6 +419,12 @@ USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { HAL_PCD_EP_ClrStall((PCD_HandleTypeDef*)pdev->pData, ep_addr); + + /* clear the halt feature */ + USB_CONTROLLER_STATE* state; + state = (USB_CONTROLLER_STATE*)pdev->pUserData; + state->EndpointStatus[ep_addr & 0xFC] &= ~USB_STATUS_ENDPOINT_HALT; + return USBD_OK; } diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.h b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.h index 2c6fd628b..08758707a 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.h +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_desc.h @@ -33,12 +33,18 @@ #include "usbd_def.h" #include "usbd_winusb.h" -#define USBD_VID 0x0483 -#define USBD_PID 0xA08F +// definition @ 'solution'.settings +//#define USBD_VID 0x0483 +// definition @ 'solution'.settings +//#define USBD_PID 0xA08F +// definition @ 'solution'.settings +//#define USBD_MANUFACTURER_STRING "Microsoft OpenTech" +// definition @ 'solution'.settings +//#define USBD_PRODUCT_HS_STRING "STM32F4DISCOVERY" +// definition @ 'solution'.settings +//#define USBD_PRODUCT_FS_STRING "STM32F4DISCOVERY" + #define USBD_LANGID_STRING 0x409 -#define USBD_MANUFACTURER_STRING "Microsoft OpenTech" -#define USBD_PRODUCT_HS_STRING "STM32F4DISCOVERY" -#define USBD_PRODUCT_FS_STRING "STM32F4DISCOVERY" // not used #define USBD_CONFIGURATION_HS_STRING "STM32F4DISCOVERY" diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp index 711faf262..4174adaf1 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.cpp @@ -53,48 +53,8 @@ #include "usbd_desc.h" #include "usbd_ctlreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_WINUSB - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_WINUSB_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_WINUSB_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_WINUSB_Private_Macros - * @{ - */ - -/** - * @} - */ -static uint8_t buffer[80]; -static uint8_t outBuffer[80]; - - -/** @defgroup USBD_WINUSB_Private_FunctionPrototypes - * @{ - */ +uint8_t rxBuffer[80]; +uint8_t txBuffer[80]; static uint8_t USBD_WINUSB_Init (USBD_HandleTypeDef *pdev, @@ -136,14 +96,6 @@ static uint8_t USBD_WINUSB_GetMSExtendedPropertiesOSDescriptor (USBD_HandleType static uint8_t USBD_WINUSB_VendorRequestDevice(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); static uint8_t USBD_WINUSB_VendorRequestInterface(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -/** - * @} - */ - -/** @defgroup USBD_WINUSB_Private_Variables - * @{ - */ - USBD_ClassTypeDef USBD_WINUSB = { USBD_WINUSB_Init, @@ -199,7 +151,7 @@ const uint8_t USBD_WINUSB_CfgDesc[USB_WINUSB_CONFIG_DESC_SIZ]= // Endpoint 2 descriptor 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - WINUSB_EPOUT_ADDR, /*Endpoint address (IN, address 1) */ + WINUSB_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(WINUSB_MAX_FS_PACKET), HIBYTE(WINUSB_MAX_FS_PACKET), @@ -271,15 +223,6 @@ const WINUSB_ExtendedPropertiesDescStruct USBD_WINUSB_Extended_Properties_OS_Fea }, }; - -/** - * @} - */ - -/** @defgroup USBD_WINUSB_Private_Functions - * @{ - */ - /** * @brief USBD_WINUSB_Init * Initialize the WINUSB interface @@ -291,32 +234,28 @@ static uint8_t USBD_WINUSB_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { uint8_t ret = 0; - USB_CONTROLLER_STATE* state; - + + USBD_LL_FlushEP(pdev, WINUSB_EPOUT_ADDR); + USBD_LL_FlushEP(pdev, WINUSB_EPIN_ADDR); + /* Open EP OUT */ USBD_LL_OpenEP(pdev, - WINUSB_EPOUT_ADDR, - USBD_EP_TYPE_BULK, - WINUSB_MAX_FS_PACKET); + WINUSB_EPOUT_ADDR, + USBD_EP_TYPE_BULK, + WINUSB_MAX_FS_PACKET); /* Open EP IN */ USBD_LL_OpenEP(pdev, - WINUSB_EPIN_ADDR, - USBD_EP_TYPE_BULK, - WINUSB_MAX_FS_PACKET); + WINUSB_EPIN_ADDR, + USBD_EP_TYPE_BULK, + WINUSB_MAX_FS_PACKET); - USBD_LL_FlushEP(pdev, WINUSB_EPOUT_ADDR); - USBD_LL_FlushEP(pdev, WINUSB_EPIN_ADDR); - - // state = (USB_CONTROLLER_STATE*)pdev->pUserData; - /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, - WINUSB_EPOUT_ADDR, - &buffer[0], - WINUSB_MAX_FS_PACKET); - - + WINUSB_EPOUT_ADDR, + &rxBuffer[0], + WINUSB_MAX_FS_PACKET); + return ret; } @@ -340,11 +279,6 @@ static uint8_t USBD_WINUSB_DeInit (USBD_HandleTypeDef *pdev, return USBD_OK; } -// static void USBD_WINUSB_UpdateState(SWinUSBCommSTM32F4 *psWinUSBCommSTM32F4) -// { -// USB_CONTROLLER_STATE* state -// } - /** * @brief USBD_WINUSB_Setup * Handle the WINUSB specific requests @@ -354,7 +288,6 @@ static uint8_t USBD_WINUSB_DeInit (USBD_HandleTypeDef *pdev, */ static uint8_t USBD_WINUSB_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - switch (req->bmRequest & USB_REQ_TYPE_MASK) { case USB_REQ_TYPE_CLASS : @@ -411,50 +344,6 @@ static uint8_t USBD_WINUSB_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { USB_CONTROLLER_STATE* state = (USB_CONTROLLER_STATE*)pdev->pUserData; - ASSERT_IRQ_MUST_BE_OFF( ); - - // UINT32 bits = OTG->DIEP[epnum].INT; - // if( bits & OTG_DIEPINT_XFRC ) - // { - // // transfer completed - // //USB_Debug( '3' ); - // OTG->DIEP[epnum].INT = OTG_DIEPINT_XFRC; // clear interrupt - // } - - // if( !( OTG->DIEP[epnum].CTL & OTG_DIEPCTL_EPENA ) ) - // { - // // Tx idle - - // UINT32* ps = NULL; - // UINT32 count; - - // if(epnum== 0 ) - // { - // // control endpoint - // if( state->DataCallback ) - // { - // // data to send - // state->DataCallback( state ); // this call can't fail - // ps = ( UINT32* )state->Data; - // count = state->DataSize; - - // //USB_Debug( count ? 'x' : 'n' ); - // } - // } - // else if( state->Queues[epnum] != NULL && state->IsTxQueue[epnum] ) - // { - // // Tx data endpoint - // USB_PACKET64* Packet64 = USB_TxDequeue( state, ep, TRUE ); - // if( Packet64 ) - // { - // // data to send - // ps = ( UINT32* )Packet64->Buffer; - // count = Packet64->Size; - - // //USB_Debug( 's' ); - // } - // } - if(epnum == 1) { // Tx data endpoint @@ -464,41 +353,16 @@ static uint8_t USBD_WINUSB_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { // data to send // Transmit next packet - - // copy packet data to out buffer - memcpy(usbPacket->Buffer, &outBuffer[0], usbPacket->Size); - - USBD_LL_Transmit(pdev, - epnum, - outBuffer, - usbPacket->Size); + + // copy data to be transmitted from USB packet struct to tx buffer + memcpy(&txBuffer[0], usbPacket->Buffer, usbPacket->Size); + + USBD_LL_Transmit(pdev, WINUSB_EPIN_ADDR, &txBuffer[0], usbPacket->Size); // USB_Debug( 's' ); } - } - - // if( ps ) - // { - // // data to send - // // enable endpoint - // OTG->DIEP[epnum].TSIZ = OTG_DIEPTSIZ_PKTCNT_1 | count; - // OTG->DIEP[epnum].CTL |= OTG_DIEPCTL_EPENA | OTG_DIEPCTL_CNAK; - - // // write data - // uint32_t volatile* pd = OTG->DFIFO[epnum]; - // for( int c = count; c > 0; c -= 4 ) - // { - // *pd = *ps++; - // } - // } - // else - // { // no data - // // disable endpoint - // OTG->DIEP[epnum].CTL |= OTG_DIEPCTL_SNAK; - // } - // } - - // FIXME + } + return USBD_OK; } @@ -510,48 +374,6 @@ static uint8_t USBD_WINUSB_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) */ static uint8_t USBD_WINUSB_EP0_RxReady (USBD_HandleTypeDef *pdev) { - USB_CONTROLLER_STATE* state = (USB_CONTROLLER_STATE*)pdev->pUserData; - - ASSERT_IRQ_MUST_BE_OFF( ); - - UINT32* pd; - - // if(epnum== 0 ) - // { - // // control endpoint - // //USB_Debug( count ? 'c' : '0' ); - - // pd = ( UINT32* )( ( STM32F4_USB_STATE* )state )->ep0Buffer; - // state->Data = ( BYTE* )pd; - // state->DataSize = count; - // } - // else - // { - // // data endpoint - // //USB_Debug( 'r' ); - - // BOOL full; - // USB_PACKET64* Packet64 = USB_RxEnqueue( state, ep, full ); - // if( Packet64 == NULL ) - // { - // // should not happen - // //USB_Debug( '?' ); - // _ASSERT( 0 ); - // } - // pd = ( UINT32* )Packet64->Buffer; - // Packet64->Size = count; - // } - - // // read data - // uint32_t volatile* ps = OTG->DFIFO[epnum]; - // for( int c = count; c > 0; c -= 4 ) - // { - // *pd++ = *ps; - // } - - // data handling & Rx reenabling delayed to transfer completed interrupt - - // FIXME return USBD_OK; } @@ -563,51 +385,6 @@ static uint8_t USBD_WINUSB_EP0_RxReady (USBD_HandleTypeDef *pdev) */ static uint8_t USBD_WINUSB_EP0_TxReady(USBD_HandleTypeDef *pdev) { - USB_CONTROLLER_STATE* state = (USB_CONTROLLER_STATE*)pdev->pUserData; - - ASSERT_IRQ_MUST_BE_OFF( ); - - // UINT32 bits = OTG->DOEP[epnum].INT; - - // if( bits & OTG_DOEPINT_XFRC ) - // { - // // transfer completed - // //USB_Debug( '1' ); - // OTG->DOEP[epnum].INT = OTG_DOEPINT_XFRC; // clear interrupt - // } - - // if( bits & OTG_DOEPINT_STUP ) - // { - // // setup phase done - // //USB_Debug( '2' ); - // OTG->DOEP[epnum].INT = OTG_DOEPINT_STUP; // clear interrupt - // } - - // if(epnum == 0 ) - // { - // // control endpoint - // //USB_Debug( '$' ); - // // enable endpoint - // OTG->DOEP[ 0 ].TSIZ = OTG_DOEPTSIZ_STUPCNT | OTG_DOEPTSIZ_PKTCNT_1 | state->PacketSize; - // OTG->DOEP[ 0 ].CTL |= OTG_DOEPCTL_EPENA | OTG_DOEPCTL_CNAK; - // // Handle Setup data in upper layer - // STM32F4_USB_Driver_Handle_Setup( OTG, state ); - // } - // else if( !state->Queues[epnum]->IsFull( ) ) - // { - // // enable endpoint - // OTG->DOEP[epnum].TSIZ = OTG_DOEPTSIZ_PKTCNT_1 | state->MaxPacketSize[epnum]; - // OTG->DOEP[epnum].CTL |= OTG_DOEPCTL_EPENA | OTG_DOEPCTL_CNAK; - // //USB_Debug( 'E' ); - // } - // else - // { - // // disable endpoint - // OTG->DOEP[epnum].CTL |= OTG_DOEPCTL_SNAK; - // //USB_Debug( 'v' ); - // } - - // FIXME return USBD_OK; } /** @@ -658,7 +435,7 @@ static uint8_t USBD_WINUSB_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) USB_CONTROLLER_STATE* state; state = (USB_CONTROLLER_STATE*)pdev->pUserData; - if(epnum == WINUSB_EPOUT_ADDR) + if(epnum == 2) { // EP2 @@ -677,21 +454,10 @@ static uint8_t USBD_WINUSB_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) usbPacket->Size = USBD_LL_GetRxDataSize (pdev , epnum); // copy received data to USB packet struct - memcpy(usbPacket->Buffer, &buffer[0], usbPacket->Size); + memcpy(usbPacket->Buffer, &rxBuffer[0], usbPacket->Size); // prepare WINUSB_EPOUT_ADDR endpoint to receive next packet - USBD_LL_PrepareReceive(pdev, epnum, &buffer[0], WINUSB_MAX_FS_PACKET); - - if(usbPacket->Buffer[0] == 'x') - { - // xx start of packet - debug_printf("dummy packet"); - } - else if(usbPacket->Buffer[0] == 'M') - { - // start of Msft debug packet - debug_printf("debug packet"); - } + USBD_LL_PrepareReceive(pdev, epnum, &rxBuffer[0], WINUSB_MAX_FS_PACKET); } return USBD_OK; @@ -745,18 +511,12 @@ static uint8_t *USBD_WINUSB_ExtendedCompatIDOSDescriptor(USBD_SpeedTypeDef speed static uint8_t USBD_WINUSB_StandardRequest(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - //SSTM32F4USB *psSTM32F4USB = (SSTM32F4USB *)pdev->pUserData; - switch (req->bRequest) { case USB_REQ_GET_INTERFACE : - //USBD_CtlSendData (pdev, (uint8_t *)&psSTM32F4USB->m_eCurrentInterface, 1); - //while(1); break; case USB_REQ_SET_INTERFACE : - //psSTM32F4USB->m_eCurrentInterface = (uint8_t)(req->wValue); - //while(1); break; case USB_REQ_CLEAR_FEATURE: @@ -773,7 +533,7 @@ static uint8_t USBD_WINUSB_StandardRequest(USBD_HandleTypeDef *pdev, USBD_Setup } else { - /* Open EP IN */ + /* Open EP OUT */ USBD_LL_OpenEP(pdev, WINUSB_EPOUT_ADDR, USBD_EP_TYPE_BULK, WINUSB_MAX_FS_PACKET); } break; @@ -860,46 +620,6 @@ static uint8_t USBD_WINUSB_VendorRequestDevice(USBD_HandleTypeDef *pdev, USBD_S static uint8_t USBD_WINUSB_VendorRequestInterface(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { -// SSTM32F4USB *psSTM32F4USB = (SSTM32F4USB *)pdev->pUserData; -// SWINUSBSTM32F4 *psWINUSBSTM32F4 = &psSTM32F4USB->m_sWINUSBSTM32F4; - -// switch ( req->wIndex ) -// { -// case stm32f4usbinterface_WINUSB: -// switch ( req->bRequest ) -// { -// case WINUSB2commandReset: -// psWINUSBSTM32F4->m_dwExpectedByteCountUSB = 0; -// psWINUSBSTM32F4->m_pbyReceivePtrUSB = psWINUSBSTM32F4->m_pbyBuffer; -// psWINUSBSTM32F4->m_dwSendByteCountUSB = 0; -// break; -// case WINUSB2commandGetVersion: USBD_CtlSendData(pdev, &s_byWINUSBVersion, 1); break; -// case WINUSB2commandGetState: USBD_CtlSendData(pdev, &psWINUSBSTM32F4->m_byStateUSB, 1); break; -// case WINUSB2commandGetBufferSize: USBD_CtlSendData(pdev, (uint8_t*)(&psWINUSBSTM32F4->m_dwBufferSizeInBytes), 4); break; -// case WINUSB2commandGetReturnSize: -// if ( psWINUSBSTM32F4->m_dwSendByteCountUSB ) -// { -// if ( psWINUSBSTM32F4->m_pbyWritePtr > psWINUSBSTM32F4->m_pbyBuffer ) -// { -// USBD_LL_Transmit(pdev, WINUSB_EPIN_ADDR, psWINUSBSTM32F4->m_pbySendPtrUSB, psWINUSBSTM32F4->m_dwSendByteCountUSB); -// } -// psWINUSBSTM32F4->m_pbyReceivePtrUSB = psWINUSBSTM32F4->m_pbyBuffer; -// psWINUSBSTM32F4->m_pbyWritePtr = psWINUSBSTM32F4->m_pbyBuffer; -// } -// USBD_CtlSendData(pdev, (uint8_t*)(&psWINUSBSTM32F4->m_dwSendByteCountUSB), 4); -// break; -// case WINUSB2commandFollowingPacketSize: -// psWINUSBSTM32F4->m_pbyReceivePtrUSB = psWINUSBSTM32F4->m_pbyBuffer; -// USBD_CtlPrepareRx(pdev, (uint8_t*)(&psWINUSBSTM32F4->m_dwExpectedByteCountUSB), 4); -// break; -// default: USBD_CtlError(pdev , req); return USBD_FAIL; -// } -// //USBD_WINUSB_UpdateState(psWINUSBSTM32F4); -// break; -// default: -// USBD_CtlError(pdev , req); -// return USBD_FAIL; -// } return USBD_OK; } @@ -943,19 +663,3 @@ static uint8_t USBD_WINUSB_GetMSExtendedPropertiesOSDescriptor(USBD_HandleTypeDe return USBD_OK; } - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.h b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.h index 84ed99920..12a39927d 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.h +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/usbd_winusb.h @@ -50,10 +50,10 @@ * @{ */ #define WINUSB_EPIN_ADDR 0x81 -#define WINUSB_EPIN_SIZE 0x10 +//#define WINUSB_EPIN_SIZE 0x10 #define WINUSB_EPOUT_ADDR 0x02 -#define WINUSB_EPOUT_SIZE 0x10 +//#define WINUSB_EPOUT_SIZE 0x10 #define USB_WINUSB_CONFIG_DESC_SIZ (9 + 9 + 7 + 7) @@ -204,6 +204,7 @@ extern USBD_ClassTypeDef USBD_WINUSB; /** * @} */ + #ifdef __cplusplus } diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 90cca4d5a..789228165 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -187,6 +187,14 @@ + + + + + + + + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 9071adc96..3541485a3 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -184,6 +184,14 @@ + + + + + + + + diff --git a/DeviceCode/pal/COM/ComDirector.cpp b/DeviceCode/pal/COM/ComDirector.cpp index 7321f3883..9bebcc8dd 100644 --- a/DeviceCode/pal/COM/ComDirector.cpp +++ b/DeviceCode/pal/COM/ComDirector.cpp @@ -14,6 +14,7 @@ BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) return USART_Initialize( ConvertCOM_ComPort(ComPortNum), HalSystemConfig.USART_DefaultBaudRate, USART_PARITY_NONE, 8, USART_STOP_BITS_ONE, USART_FLOW_NONE ); #endif +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: if(USB_CONFIG_ERR_OK != USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) return FALSE; @@ -22,6 +23,7 @@ BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) return FALSE; return USB_OpenStream( ConvertCOM_UsbStream(ComPortNum), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); +#endif #ifdef FEATURE_SOCKETS case SOCKET_TRANSPORT: @@ -45,9 +47,11 @@ BOOL DebuggerPort_Uninitialize( COM_HANDLE ComPortNum ) return USART_Uninitialize( ConvertCOM_ComPort(ComPortNum) ); #endif +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: USB_CloseStream( ConvertCOM_UsbStream(ComPortNum) ); return USB_Uninitialize( ConvertCOM_UsbController(ComPortNum) ); +#endif #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: @@ -81,11 +85,13 @@ int DebuggerPort_Write( COM_HANDLE ComPortNum, const char* Data, size_t size, in ret = USART_Write( ConvertCOM_ComPort( ComPortNum ), dataTmp, size ); break; #endif - + +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: ret = USB_Write( ConvertCOM_UsbStream( ComPortNum ), dataTmp, size ); break; - +#endif + #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: ret = SOCKETS_Write( ConvertCOM_SockPort(ComPortNum), dataTmp, size ); @@ -137,9 +143,11 @@ int DebuggerPort_Read( COM_HANDLE ComPortNum, char* Data, size_t size ) break; #endif +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: ret = USB_Read( ConvertCOM_UsbStream( ComPortNum ), Data, size ); break; +#endif #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: @@ -165,8 +173,10 @@ BOOL DebuggerPort_Flush( COM_HANDLE ComPortNum ) return USART_Flush( ConvertCOM_ComPort( ComPortNum ) ); #endif +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: return USB_Flush( ConvertCOM_UsbStream( ComPortNum ) ); +#endif #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: @@ -195,8 +205,12 @@ BOOL DebuggerPort_IsSslSupported( COM_HANDLE ComPortNum ) #ifdef FEATURE_USART case USART_TRANSPORT: - #endif + #endif + +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: +#endif + default: break; } @@ -267,9 +281,11 @@ void InitializePort( COM_HANDLE ComPortNum ) break; #endif +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: USB_Initialize( ConvertCOM_UsbStream( ComPortNum ) ); break; +#endif #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: @@ -293,6 +309,7 @@ void UninitializePort( COM_HANDLE ComPortNum ) break; #endif +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: if(USB_CONFIG_ERR_OK == USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) { @@ -300,6 +317,7 @@ void UninitializePort( COM_HANDLE ComPortNum ) USB_OpenStream( ConvertCOM_UsbStream(ComPortNum), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); } break; +#endif #ifdef FEATURE_SOCKET case SOCKET_TRANSPORT: @@ -333,6 +351,7 @@ void CPU_UninitializeCommunication() UninitializePort( HalSystemConfig.DebugTextPort ); UninitializePort( HalSystemConfig.stdio ); +#ifdef FEATURE_USB_DEBUG // if USB is not defined, the STUB_USB will be set // Do not uninitialize the USB on soft reboot if USB is our debugger link // Close all streams on USB controller 0 except debugger (if it uses a USB stream) @@ -347,6 +366,7 @@ void CPU_UninitializeCommunication() } } USB_Uninitialize(0); // USB_Uninitialize will only stop USB controller 0 if it has no open streams +#endif #ifdef FEATURE_SOCKET Network_Uninitialize(); @@ -365,10 +385,12 @@ void CPU_ProtectCommunicationGPIOs( BOOL On ) CPU_USART_ProtectPins( ConvertCOM_ComPort(HalSystemConfig.DebugTextPort), On ); return ; #endif - + +#ifdef FEATURE_USB_DEBUG case USB_TRANSPORT: CPU_USB_ProtectPins( ConvertCOM_UsbController(HalSystemConfig.DebugTextPort), On ); return; +#endif case GENERIC_TRANSPORT: GenericPort_ProtectPins( ConvertCOM_GenericPort(HalSystemConfig.DebugTextPort), On ); diff --git a/DeviceCode/pal/COM/usb_cmsis/usb.cpp b/DeviceCode/pal/COM/usb_cmsis/usb.cpp index 5223ea4fd..300c3ca20 100644 --- a/DeviceCode/pal/COM/usb_cmsis/usb.cpp +++ b/DeviceCode/pal/COM/usb_cmsis/usb.cpp @@ -37,33 +37,6 @@ void USB_debug_printf( const char*format, ... ) {} //--// -// This version of the USB code supports only one language - which -// is not specified by USB configuration records - it is defined here. -// This is the String 0 descriptor.This array includes the String descriptor -// header and exactly one language. - -//#define USB_LANGUAGE_DESCRIPTOR_SIZE 4 - -// UINT8 USB_LanguageDescriptor[USB_LANGUAGE_DESCRIPTOR_SIZE] = -// { -// USB_LANGUAGE_DESCRIPTOR_SIZE, -// USB_STRING_DESCRIPTOR_TYPE, -// 0x09, 0x04 // U.S. English -// }; - -// // This provides storage for the "friendly name" (String 5) if it is specified -// // by the Flash configuration sector -// ADS_PACKED struct GNU_PACKED -// { -// UINT8 bLength; -// UINT8 bDescriptorType; -// UINT8 sFriendlyName[USB_FRIENDLY_NAME_LENGTH * sizeof(USB_STRING_CHAR)]; -// static LPCSTR GetDriverName() { return "USB_NAME_CONFIG"; } -// }FriendlyNameString; - -//USB_SETUP_PACKET RequestPacket = { 0, 0, 0, 0, 0 }; - -//--// int USB_GetControllerCount() { @@ -147,28 +120,35 @@ int USB_Driver::GetControllerCount() return TOTAL_USB_CONTROLLER; } -BOOL USB_Driver::Initialize( int Controller ) +BOOL USB_Driver::Initialize(int controller) { NATIVE_PROFILE_PAL_COM(); - //char szFriendlyName[USB_FRIENDLY_NAME_LENGTH]; - - USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); - - GLOBAL_LOCK(irq); + USB_CONTROLLER_STATE *state = CPU_USB_GetState(controller); USB_CONFIGURATION_DESCRIPTOR * Config; - if(State == NULL) return FALSE; + if(state == NULL) return FALSE; + // Set all streams to unused + for( int stream = 0; stream < USB_MAX_QUEUES; stream++ ) + { + state->streams[stream].RxEP = USB_NULL_ENDPOINT; + state->streams[stream].TxEP = USB_NULL_ENDPOINT; + } + state->ControllerNum = controller; + state->CurrentState = USB_DEVICE_STATE_UNINITIALIZED; + state->DeviceStatus |= USB_STATUS_DEVICE_SELF_POWERED; + state->DeviceStatus &= ~USB_STATUS_DEVICE_REMOTE_WAKEUP; + // #if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) // // // // If initialized, uninitilize the current usb stack so that we can override it with a new configuration // // -// if(State->Initialized && COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && Controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) +// if(State->Initialized && COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && controller == ConvertCOM_Usbcontroller(HalSystemConfig.DebuggerPorts[0])) // { -// USB_Driver::Uninitialize( Controller ); +// USB_Driver::Uninitialize( controller ); // } // #endif @@ -254,24 +234,22 @@ BOOL USB_Driver::Initialize( int Controller ) // } // #endif -// FIXME -// USB init is not working when called here... issue with bad timmer configuration? - // if( S_OK != CPU_USB_Initialize( Controller ) ) - // { - // return FALSE; // If Hardware initialization fails - // } + if(CPU_USB_Initialize(controller) != S_OK) + { + return FALSE; + } #if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) // // Re-initialize the Debugger stream // - if(COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && Controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) + if(COM_IsUsb(HalSystemConfig.DebuggerPorts[0]) && controller == ConvertCOM_UsbController(HalSystemConfig.DebuggerPorts[0])) { USB_OpenStream( ConvertCOM_UsbStream(HalSystemConfig.DebuggerPorts[0]), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); } #endif - State->Initialized = TRUE; + state->Initialized = TRUE; return TRUE; // } @@ -422,8 +400,7 @@ BOOL USB_Driver::Uninitialize( int Controller ) USB_CONTROLLER_STATE *State = CPU_USB_GetState( Controller ); if(NULL == State) return FALSE; - - GLOBAL_LOCK(irq); + if(State->Initialized == FALSE) return FALSE; @@ -469,52 +446,66 @@ BOOL USB_Driver::Uninitialize( int Controller ) return TRUE; } -BOOL USB_Driver::OpenStream( int UsbStream, int writeEP, int readEP ) +BOOL USB_Driver::OpenStream(int UsbStream, int writeEP, int readEP) { NATIVE_PROFILE_PAL_COM(); - int Controller = ConvertCOM_UsbController ( UsbStream ); - int StreamIndex = ConvertCOM_UsbStreamIndex( UsbStream ); + int controller = ConvertCOM_UsbController (UsbStream); + int streamIndex = ConvertCOM_UsbStreamIndex(UsbStream); - USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); + USB_CONTROLLER_STATE * state = CPU_USB_GetState(controller); - if( NULL == State || !State->Initialized ) // If no such controller exists (or it is not initialized) + if( NULL == state || !state->Initialized ) + { + // If no such controller exists (or it is not initialized) return FALSE; + } // Check the StreamIndex and the two endpoint numbers for validity (both endpoints cannot be zero) - if( StreamIndex >= USB_MAX_QUEUES + if(streamIndex >= USB_MAX_QUEUES || (readEP == USB_NULL_ENDPOINT && writeEP == USB_NULL_ENDPOINT) || (readEP != USB_NULL_ENDPOINT && (readEP < 1 || readEP >= USB_MAX_QUEUES)) - || (writeEP != USB_NULL_ENDPOINT && (writeEP < 1 || writeEP >= USB_MAX_QUEUES)) ) + || (writeEP != USB_NULL_ENDPOINT && (writeEP < 1 || writeEP >= USB_MAX_QUEUES))) + { return FALSE; + } // The Stream must be currently closed - if( State->streams[StreamIndex].RxEP != USB_NULL_ENDPOINT || State->streams[StreamIndex].TxEP != USB_NULL_ENDPOINT ) + if(state->streams[streamIndex].RxEP != USB_NULL_ENDPOINT || state->streams[streamIndex].TxEP != USB_NULL_ENDPOINT) + { return FALSE; - + } + // The requested endpoints must have been configured - if( (readEP != USB_NULL_ENDPOINT && State->Queues[readEP] == NULL) || (writeEP != USB_NULL_ENDPOINT && State->Queues[writeEP] == NULL) ) - return FALSE; + if((readEP != USB_NULL_ENDPOINT && state->Queues[readEP] == NULL) || (writeEP != USB_NULL_ENDPOINT && state->Queues[writeEP] == NULL)) + { + return FALSE; + } // The requested endpoints can only be used in the direction specified by the configuration - if( (readEP != USB_NULL_ENDPOINT && State->IsTxQueue[readEP]) || (writeEP != USB_NULL_ENDPOINT && !State->IsTxQueue[writeEP]) ) + if((readEP != USB_NULL_ENDPOINT && state->IsTxQueue[readEP]) || (writeEP != USB_NULL_ENDPOINT && !state->IsTxQueue[writeEP])) + { return FALSE; + } // The specified endpoints must not be in use by another stream - for( int stream = 0; stream < USB_MAX_QUEUES; stream++ ) + for(int stream = 0; stream < USB_MAX_QUEUES; stream++) { - if( readEP != USB_NULL_ENDPOINT && (State->streams[stream].RxEP == readEP || State->streams[stream].TxEP == readEP) ) + if(readEP != USB_NULL_ENDPOINT && (state->streams[stream].RxEP == readEP || state->streams[stream].TxEP == readEP)) + { return FALSE; - if( writeEP != USB_NULL_ENDPOINT && (State->streams[stream].RxEP == writeEP || State->streams[stream].TxEP == writeEP) ) + } + + if(writeEP != USB_NULL_ENDPOINT && (state->streams[stream].RxEP == writeEP || state->streams[stream].TxEP == writeEP)) + { return FALSE; + } } // All tests pass, assign the endpoints to the stream { - GLOBAL_LOCK(irq); - - State->streams[StreamIndex].RxEP = readEP; - State->streams[StreamIndex].TxEP = writeEP; + state->streams[streamIndex].RxEP = readEP; + state->streams[streamIndex].TxEP = writeEP; } return TRUE; @@ -537,7 +528,6 @@ BOOL USB_Driver::CloseStream ( int UsbStream ) { int endpoint; - GLOBAL_LOCK(irq); // Close the Rx stream endpoint = State->streams[StreamIndex].RxEP; @@ -569,10 +559,10 @@ int USB_Driver::Write( int UsbStream, const char* Data, size_t size ) int totWrite = 0; USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); - if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) - { - return -1; - } + // if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) + // { + // return -1; + // } if(size == 0 ) return 0; if(Data == NULL) @@ -580,12 +570,12 @@ int USB_Driver::Write( int UsbStream, const char* Data, size_t size ) return -1; } - // If the Controller is not yet initialized - if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) - { - // No data can be sent until the controller is initialized - return -1; - } + // // If the Controller is not yet initialized + // if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + // { + // // No data can be sent until the controller is initialized + // return -1; + // } endpoint = State->streams[StreamIndex].TxEP; // If no Write side to stream (or if not yet open) @@ -671,7 +661,7 @@ int USB_Driver::Write( int UsbStream, const char* Data, size_t size ) if(irq.WasDisabled()) // @todo - this really needs more checks to be totally valid { - return totWrite; + return totWrite; } if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) @@ -691,11 +681,11 @@ int USB_Driver::Write( int UsbStream, const char* Data, size_t size ) } // here we have a post-condition that IRQs are disabled for all paths through conditional block above - - if(State->DeviceState == USB_DEVICE_STATE_CONFIGURED) - { + + //if(State->DeviceState == USB_DEVICE_STATE_CONFIGURED) + // { CPU_USB_StartOutput( State, endpoint ); - } + //} return totWrite; } @@ -710,16 +700,16 @@ int USB_Driver::Read( int UsbStream, char* Data, size_t size ) int endpoint; USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); - if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) - { - return 0; - } + // if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) + // { + // return 0; + // } - /* not configured, no data can go in or out */ - if( State->DeviceState != USB_DEVICE_STATE_CONFIGURED ) - { - return 0; - } + // /* not configured, no data can go in or out */ + // if( State->DeviceState != USB_DEVICE_STATE_CONFIGURED ) + // { + // return 0; + // } endpoint = State->streams[StreamIndex].RxEP; // If no Read side to stream (or if not yet open) @@ -785,23 +775,23 @@ BOOL USB_Driver::Flush( int UsbStream ) int queueCnt; USB_CONTROLLER_STATE * State = CPU_USB_GetState( Controller ); - if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) - { - return FALSE; - } + // if( NULL == State || StreamIndex >= USB_MAX_QUEUES ) + // { + // return FALSE; + // } - /* not configured, no data can go in or out */ - if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) - { - return TRUE; - } + // /* not configured, no data can go in or out */ + // if(State->DeviceState != USB_DEVICE_STATE_CONFIGURED) + // { + // return TRUE; + // } - endpoint = State->streams[StreamIndex].TxEP; - // If no Write side to stream (or if not yet open) - if( endpoint == USB_NULL_ENDPOINT || State->Queues[endpoint] == NULL ) - { - return FALSE; - } + // endpoint = State->streams[StreamIndex].TxEP; + // // If no Write side to stream (or if not yet open) + // if( endpoint == USB_NULL_ENDPOINT || State->Queues[endpoint] == NULL ) + // { + // return FALSE; + // } queueCnt = State->Queues[endpoint]->NumberOfElements(); @@ -1294,174 +1284,6 @@ UINT8 USB_HandleSetAddress( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup return USB_STATE_ADDRESS; } -// UINT8 USB_HandleConfigurationRequests( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) -// { -// const USB_DESCRIPTOR_HEADER * header; -// UINT8 type; -// UINT8 DescriptorIndex; - -// /* this request is valid regardless of device state */ -// type = ((Setup->wValue & 0xFF00) >> 8); -// DescriptorIndex = (Setup->wValue & 0x00FF); -// State->Expected = Setup->wLength; - -// if(State->Expected == 0) -// { -// // just return an empty Status packet -// State->ResidualCount = 0; -// State->DataCallback = USB_DataCallback; -// return USB_STATE_DATA; -// } - -// // -// // The very first GET_DESCRIPTOR command out of reset should always return at most PacketSize bytes. -// // After that, you can return as many as the host has asked. -// // -// if(State->DeviceState <= USB_DEVICE_STATE_DEFAULT) -// { -// if(State->FirstGetDescriptor) -// { -// State->FirstGetDescriptor = FALSE; - -// State->Expected = __min(State->Expected, State->PacketSize); -// } -// } - -// State->ResidualData = NULL; -// State->ResidualCount = 0; - -// if( Setup->bRequest == USB_GET_DESCRIPTOR ) -// { -// switch(type) -// { -// case USB_DEVICE_DESCRIPTOR_TYPE: -// header = USB_FindRecord( State, USB_DEVICE_DESCRIPTOR_MARKER, Setup ); -// if( header ) -// { -// const USB_DEVICE_DESCRIPTOR * device = (USB_DEVICE_DESCRIPTOR *)header; -// State->ResidualData = (UINT8 *)&device->bLength; // Start of the device descriptor -// State->ResidualCount = __min(State->Expected, device->bLength); -// } -// break; - -// case USB_CONFIGURATION_DESCRIPTOR_TYPE: -// header = USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, Setup ); -// if( header ) -// { -// const USB_CONFIGURATION_DESCRIPTOR * Config = (USB_CONFIGURATION_DESCRIPTOR *)header; -// State->ResidualData = (UINT8 *)&Config->bLength; -// State->ResidualCount = __min(State->Expected, Config->wTotalLength); -// } -// break; - -// case USB_STRING_DESCRIPTOR_TYPE: -// if(DescriptorIndex == 0) // If host is requesting the language list -// { -// State->ResidualData = USB_LanguageDescriptor; -// State->ResidualCount = __min(State->Expected, USB_LANGUAGE_DESCRIPTOR_SIZE); -// } -// else if( DescriptorIndex == USB_FRIENDLY_STRING_NUM && FriendlyNameString.bLength != 0 ) // If "friendly name" was changed by Flash Config sector -// { -// State->ResidualData = (UINT8 *)&FriendlyNameString; -// State->ResidualCount = __min(State->Expected, FriendlyNameString.bLength); -// } -// else if( NULL != (header = USB_FindRecord( State, USB_STRING_DESCRIPTOR_MARKER, Setup )) ) -// { -// const USB_STRING_DESCRIPTOR_HEADER * string = (USB_STRING_DESCRIPTOR_HEADER *)header; -// State->ResidualData = (UINT8 *)&string->bLength; -// State->ResidualCount = __min(State->Expected, string->bLength); -// } -// break; - -// default: -// break; -// } -// } - -// // If the request was not recognized, the generic types should be searched -// if( State->ResidualData == NULL ) -// { -// if( NULL != (header = USB_FindRecord( State, USB_GENERIC_DESCRIPTOR_MARKER, Setup )) ) -// { -// State->ResidualData = (UINT8 *)header; -// State->ResidualData += sizeof(USB_GENERIC_DESCRIPTOR_HEADER); // Data is located right after the header -// State->ResidualCount = __min(State->Expected, header->size - sizeof(USB_GENERIC_DESCRIPTOR_HEADER)); -// } -// else -// return USB_STATE_STALL; -// } - -// State->DataCallback = USB_DataCallback; - -// return USB_STATE_DATA; -// } - -// UINT8 USB_HandleGetConfiguration( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup ) -// { -// /* validate setup packet */ -// if(Setup->wValue != 0 || Setup->wIndex != 0 || Setup->wLength != 1) -// { -// return USB_STATE_STALL; -// } - -// /* validate based on device state */ -// if(State->DeviceState == USB_DEVICE_STATE_DEFAULT) -// { -// return USB_STATE_STALL; -// } - -// State->ResidualData = &State->ConfigurationNum; -// State->ResidualCount = 1; -// State->Expected = 1; -// State->DataCallback = USB_DataCallback; - -// return USB_STATE_DATA; -// } - -// UINT8 USB_HandleSetConfiguration( USB_CONTROLLER_STATE* State, USB_SETUP_PACKET* Setup, BOOL DataPhase ) -// { -// /* validate setup packet */ -// if(Setup->wIndex != 0 || Setup->wLength != 0) -// { -// return USB_STATE_STALL; -// } - -// /* validate based on device state */ -// if(State->DeviceState == USB_DEVICE_STATE_DEFAULT) -// { -// return USB_STATE_STALL; -// } - -// /* we only support one configuration */ -// if(Setup->wValue > 1) -// { -// return USB_STATE_STALL; -// } - -// State->ConfigurationNum = Setup->wValue; - -// /* catch state changes */ -// if(State->ConfigurationNum == 0) -// { -// State->DeviceState = USB_DEVICE_STATE_ADDRESS; -// } -// else -// { -// State->DeviceState = USB_DEVICE_STATE_CONFIGURED; -// } - -// USB_StateCallback( State ); - -// if (DataPhase) -// { -// /* send zero-length packet to tell host we're done */ -// State->ResidualCount = 0; -// State->DataCallback = USB_DataCallback; -// } - -// return USB_STATE_CONFIGURATION; -// } - //--// // Searches through the USB Configuration records for the requested type @@ -1515,38 +1337,6 @@ const USB_DESCRIPTOR_HEADER * USB_FindRecord( USB_CONTROLLER_STATE* State, UINT8 return header; } -// UINT8 USB_ControlCallback( USB_CONTROLLER_STATE* State ) -// { -// USB_SETUP_PACKET* Setup; - -// if(State->DataSize == 0) -// { -// return USB_STATE_DONE; -// } - -// Setup = (USB_SETUP_PACKET*)State->Data; - -// switch(Setup->bRequest) -// { -// case USB_GET_STATUS: -// return USB_HandleGetStatus ( State, Setup ); -// case USB_CLEAR_FEATURE: -// return USB_HandleClearFeature ( State, Setup ); -// case USB_SET_FEATURE: -// return USB_HandleSetFeature ( State, Setup ); -// case USB_SET_ADDRESS: -// return USB_HandleSetAddress ( State, Setup ); -// case USB_GET_CONFIGURATION: -// return USB_HandleGetConfiguration ( State, Setup ); -// case USB_SET_CONFIGURATION: -// return USB_HandleSetConfiguration ( State, Setup, TRUE ); -// default: -// return USB_HandleConfigurationRequests( State, Setup ); -// } - -// return USB_STATE_STALL; -// } - USB_PACKET64* USB_RxEnqueue( USB_CONTROLLER_STATE* State, int endpoint, BOOL& DisableRx ) { ASSERT_IRQ_MUST_BE_OFF(); @@ -1586,6 +1376,10 @@ USB_PACKET64* USB_TxDequeue( USB_CONTROLLER_STATE* State, int endpoint, BOOL Don // NOTE: TODO: Endpoints need to be checked for overlap (must not be used more than once). int UsbConfigurationCheck( const USB_DYNAMIC_CONFIGURATION *firstRecord ) { + return USB_CONFIG_ERR_OK; + + ///////// + const UINT8 *next; const USB_DESCRIPTOR_HEADER *record; @@ -1812,85 +1606,6 @@ int UsbConfigurationCheck( const USB_DYNAMIC_CONFIGURATION *firstRecord ) return recordError; } - -// USB_NextEndpoint() -// Returns a pointer to the next endpoint descriptor in the USB configuration list along with -// a pointer to its interface descriptor. Returns FALSE if ep or itfc are bogus pointers or -// if the end of the configuration list has been reached (no more endpoints). -// To get the first endpoint and its interface, this should be called with ep = NULL. - -// BOOL USB_NextEndpoint( USB_CONTROLLER_STATE* State, const USB_ENDPOINT_DESCRIPTOR * &ep, const USB_INTERFACE_DESCRIPTOR* &itfc ) -// { -// const UINT8 *next; -// const UINT8 *end; -// const USB_CONFIGURATION_DESCRIPTOR *Config; - -// // Locate the configuration descriptor -// Config = (const USB_CONFIGURATION_DESCRIPTOR *)USB_FindRecord( State, USB_CONFIGURATION_DESCRIPTOR_MARKER, NULL ); -// if( NULL == Config ) // If configuration is bogus -// return FALSE; - -// // Calculate the range of addresses where endpoint descriptors may be found -// next = (const UINT8 *)&Config[1]; -// end = ((const UINT8 *)Config) + Config->header.size; - -// // If requesting the first endpoint -// if( NULL == ep ) -// { -// // Possible location of first endpoint descriptor - actually, this will -// // always be the first interface descriptor, but it doesn't matter. -// ep = (const USB_ENDPOINT_DESCRIPTOR *)next; -// itfc = NULL; -// } -// // If not, make sure that both pointers are good -// else if( (UINT8 *)ep > next -// && (UINT8 *)ep < end -// && (UINT8 *)itfc >= next -// && (UINT8 *)itfc < end -// && USB_ENDPOINT_DESCRIPTOR_TYPE == ep->bDescriptorType -// && sizeof(USB_ENDPOINT_DESCRIPTOR) == ep->bLength -// && USB_INTERFACE_DESCRIPTOR_TYPE == itfc->bDescriptorType -// && sizeof(USB_INTERFACE_DESCRIPTOR) == itfc->bLength ) -// { -// // Possible location of next endpoint descriptor is right after -// // the current endpoint descriptor -// ep = &ep[1]; -// } -// else -// { -// // If ep or itfc are bad -// return FALSE; -// } - -// // While still within the configuration descriptor -// while( (const UINT8 *)ep < end ) -// { -// // Check for interfaces -// if( USB_INTERFACE_DESCRIPTOR_TYPE == ep->bDescriptorType -// && sizeof(USB_INTERFACE_DESCRIPTOR) == ep->bLength ) -// { -// itfc = (const USB_INTERFACE_DESCRIPTOR *)ep; // Remember the interface -// } -// // If current points to an endpoint descriptor -// else if( USB_ENDPOINT_DESCRIPTOR_TYPE == ep->bDescriptorType -// && sizeof(USB_ENDPOINT_DESCRIPTOR) == ep->bLength ) -// { -// // Found next endpoint descriptor -// return TRUE; -// } - -// // For all configuration descriptors, the first byte is its size. -// // Use this to find the next descriptor in the list -// next = (const UINT8 *)ep; -// next += ep->bLength; -// ep = (const USB_ENDPOINT_DESCRIPTOR *)next; -// } - -// // If we've run past the end of the configuration descriptor, -// // then there are no more endpoints -// return FALSE; -// } - //--// STREAM_DRIVER_DETAILS* USB1_driver_details( UINT32 handle ) @@ -1918,4 +1633,3 @@ int USB1_write( char* buffer, size_t size ) { return USB_Write( ConvertCOM_UsbStream(USB1), buffer, size ); } - diff --git a/Solutions/MCBSTM32F400/MCBSTM32F400.settings b/Solutions/MCBSTM32F400/MCBSTM32F400.settings index 7aacd0090..4c455a82c 100644 --- a/Solutions/MCBSTM32F400/MCBSTM32F400.settings +++ b/Solutions/MCBSTM32F400/MCBSTM32F400.settings @@ -25,7 +25,15 @@ F4 1.11.0 - + + + + 0x0483 + 0xA08F + Microsoft OpenTech + MCBSTM32F400 + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index d8701d577..e2a514d22 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -62,6 +62,8 @@ + + @@ -194,10 +196,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 66dd6f1d8..2410acd09 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -25,6 +25,7 @@ False True False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index fdca9ced7..fa71de92e 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -99,6 +99,8 @@ + + @@ -473,10 +475,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index 9ee190005..a829bb61d 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -25,6 +25,7 @@ False True False + True False False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index bfdd02dd1..4050d40dc 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -87,7 +87,9 @@ - + + + @@ -350,10 +352,6 @@ - - - - diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index 900542c6e..0e5cb48e8 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -25,6 +25,7 @@ False True False + True False False diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/USB/dotNetMF.proj b/Solutions/STM32F4DISCOVERY/DeviceCode/USB/dotNetMF.proj deleted file mode 100644 index 268123ba2..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/USB/dotNetMF.proj +++ /dev/null @@ -1,46 +0,0 @@ - - - usb_pal_config_STM32F4DISCOVERY - - - {1E492742-72F7-4F15-B682-3508D973F136} - USB PAL configuration for STM32F4DISCOVERY solution - PAL - usb_pal_config_STM32F4DISCOVERY.$(LIB_EXT) - usb_pal_config_STM32F4DISCOVERY.$(LIB_EXT).manifest - Solutions\STM32F4DISCOVERY - - - - 4 - 0 - 0 - 0 - - 2009-04-30 - - LibraryCategory - - - - - False - - - False - False - False - Solutions\STM32F4DISCOVERY\DeviceCode\USB - Library - false - 4.0.0.0 - - - - - - - - - - diff --git a/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp b/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp deleted file mode 100644 index 0e0c417fd..000000000 --- a/Solutions/STM32F4DISCOVERY/DeviceCode/USB/usb_config.cpp +++ /dev/null @@ -1,282 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. -// -// *** STM32F4DISCOVERY USB Configuration *** -// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#include - -//--// - -//string descriptor -#define MANUFACTURER_NAME_SIZE 19 // "Microsoft OpenTech " -// NOTE: Having more than (probably) 32 characters causes the MFUSB KERNEL driver -// to *CRASH* which, of course, causes Windows to crash -#define PRODUCT_NAME_SIZE 16 // "STM32F4DISCOVERY" -// NOTE: If these two strings are not present, the MFUSB KERNEL driver will *CRASH* -// which, of course, causes Windows to crash -#define DISPLAY_NAME_SIZE 16 // "STM32F4DISCOVERY" -#define FRIENDLY_NAME_SIZE 8 // "a7e70ea2" -// index for the strings -#define MANUFACTURER_NAME_INDEX 1 -#define PRODUCT_NAME_INDEX 2 -#define SERIAL_NUMBER_INDEX 0 -// device descriptor -#define VENDOR_ID 0x0483 // STM32F4 Test VID -#define PRODUCT_ID 0xA08F // STM32F4 Test PID -#define MAX_EP0_SIZE 8 -//configuration descriptor -#define USB_MAX_CURRENT (100/USB_CURRENT_UNIT) - -#define USB_ATTRIBUTES (USB_ATTRIBUTE_BASE | USB_ATTRIBUTE_SELF_POWER) - -// Configuration for extended descriptor -#define OS_DESCRIPTOR_EX_VERSION 0x0100 - -///////////////////////////////////////////////////////////// -// The following structure defines the USB descriptor -// for a basic device with a USB debug interface via the -// WinUSB extended Compat ID. -// -// This USB configuration is always used to define the USB -// configuration for TinyBooter. It is also the default for -// the runtime if there is no USB configuration in the Flash -// configuration sector. - -ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION -{ - USB_DEVICE_DESCRIPTOR device; - USB_CONFIGURATION_DESCRIPTOR config; - USB_INTERFACE_DESCRIPTOR itfc0; - USB_ENDPOINT_DESCRIPTOR ep1; - USB_ENDPOINT_DESCRIPTOR ep2; - USB_STRING_DESCRIPTOR_HEADER manHeader; - USB_STRING_CHAR manString[MANUFACTURER_NAME_SIZE]; - USB_STRING_DESCRIPTOR_HEADER prodHeader; - USB_STRING_CHAR prodString[PRODUCT_NAME_SIZE]; - USB_STRING_DESCRIPTOR_HEADER string4; - USB_STRING_CHAR displayString[DISPLAY_NAME_SIZE]; - USB_STRING_DESCRIPTOR_HEADER string5; - USB_STRING_CHAR friendlyString[FRIENDLY_NAME_SIZE]; - USB_OS_STRING_DESCRIPTOR OS_String; - USB_XCOMPATIBLE_OS_ID OS_XCompatible_ID; - USB_XPROPERTIES_OS_WINUSB OS_XProperty; - USB_DESCRIPTOR_HEADER endList; -}; - -extern const ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration; - - -const struct USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration = -{ - // Device descriptor - { - { - USB_DEVICE_DESCRIPTOR_MARKER, - 0, - sizeof(USB_DEVICE_DESCRIPTOR) - }, - USB_DEVICE_DESCRIPTOR_LENGTH, // Length of device descriptor - USB_DEVICE_DESCRIPTOR_TYPE, // USB device descriptor type - 0x0200, // USB Version 2.00 (BCD) (2.0 required for Extended ID recognition) - 0, // Device class (none) - 0, // Device subclass (none) - 0, // Device protocol (none) - MAX_EP0_SIZE, // Endpoint 0 size - VENDOR_ID, // Vendor ID - PRODUCT_ID, // Product ID - DEVICE_RELEASE_VERSION, // Product version 1.00 (BCD) - MANUFACTURER_NAME_INDEX, // Manufacturer name string index - PRODUCT_NAME_INDEX, // Product name string index - 0, // Serial number string index (none) - 1 // Number of configurations - }, - - // Configuration descriptor - { - { - USB_CONFIGURATION_DESCRIPTOR_MARKER, - 0, - sizeof(USB_CONFIGURATION_DESCRIPTOR) - + sizeof(USB_INTERFACE_DESCRIPTOR) - + sizeof(USB_ENDPOINT_DESCRIPTOR) - + sizeof(USB_ENDPOINT_DESCRIPTOR) - }, - USB_CONFIGURATION_DESCRIPTOR_LENGTH, - USB_CONFIGURATION_DESCRIPTOR_TYPE, - USB_CONFIGURATION_DESCRIPTOR_LENGTH - + sizeof(USB_INTERFACE_DESCRIPTOR) - + sizeof(USB_ENDPOINT_DESCRIPTOR) - + sizeof(USB_ENDPOINT_DESCRIPTOR), - 1, // Number of interfaces - 1, // Number of this configuration - 0, // Config descriptor string index (none) - USB_ATTRIBUTES, // Config attributes - USB_MAX_CURRENT // Device max current draw - }, - - // Interface 0 descriptor - { - sizeof(USB_INTERFACE_DESCRIPTOR), - USB_INTERFACE_DESCRIPTOR_TYPE, - 0, // Interface number - 0, // Alternate number (main) - 2, // Number of endpoints - 0xFF, // Interface class (vendor) - 1, // Interface subclass - 1, // Interface protocol - 0 // Interface descriptor string index (none) - }, - - // Endpoint 1 descriptor - { - sizeof(USB_ENDPOINT_DESCRIPTOR), - USB_ENDPOINT_DESCRIPTOR_TYPE, - USB_ENDPOINT_DIRECTION_IN + 1, - USB_ENDPOINT_ATTRIBUTE_BULK, - 64, // Endpoint 1 packet size - 0 // Endpoint 1 interval - }, - - // Endpoint 2 descriptor - { - sizeof(USB_ENDPOINT_DESCRIPTOR), - USB_ENDPOINT_DESCRIPTOR_TYPE, - USB_ENDPOINT_DIRECTION_OUT + 2, - USB_ENDPOINT_ATTRIBUTE_BULK, - 64, // Endpoint 2 packet size - 0 // Endpoint 2 interval - }, - - // Manufacturer name string descriptor - { - { - USB_STRING_DESCRIPTOR_MARKER, - MANUFACTURER_NAME_INDEX, - sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * MANUFACTURER_NAME_SIZE) - }, - USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * MANUFACTURER_NAME_SIZE), - USB_STRING_DESCRIPTOR_TYPE - }, - { 'M', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', ' ', 'O', 'p', 'e', 'n', 'T', 'e', 'c', 'h', ' ' }, - - // Product name string descriptor - { - { - USB_STRING_DESCRIPTOR_MARKER, - PRODUCT_NAME_INDEX, - sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * PRODUCT_NAME_SIZE) - }, - USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * PRODUCT_NAME_SIZE), - USB_STRING_DESCRIPTOR_TYPE - }, - { 'S', 'T', 'M', '3', '2', 'F', '4', 'D', 'I', 'S', 'C', 'O', 'V', 'E', 'R', 'Y' }, - - // String 4 descriptor (display name) - { - { - USB_STRING_DESCRIPTOR_MARKER, - USB_DISPLAY_STRING_NUM, - sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * DISPLAY_NAME_SIZE) - }, - USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * DISPLAY_NAME_SIZE), - USB_STRING_DESCRIPTOR_TYPE - }, - { 'S', 'T', 'M', '3', '2', 'F', '4', 'D', 'I', 'S', 'C', 'O', 'V', 'E', 'R', 'Y' }, - - // String 5 descriptor (friendly name) - { - { - USB_STRING_DESCRIPTOR_MARKER, - USB_FRIENDLY_STRING_NUM, - sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * FRIENDLY_NAME_SIZE) - }, - USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * FRIENDLY_NAME_SIZE), - USB_STRING_DESCRIPTOR_TYPE - }, - { 'a', '7', 'e', '7', '0', 'e', 'a', '2' }, - - // OS Descriptor string for Extended OS Compat ID - { - { - USB_STRING_DESCRIPTOR_MARKER, - OS_DESCRIPTOR_STRING_INDEX, - sizeof(USB_DESCRIPTOR_HEADER) + OS_DESCRIPTOR_STRING_SIZE - }, - OS_DESCRIPTOR_STRING_SIZE, - USB_STRING_DESCRIPTOR_TYPE, - { 'M', 'S', 'F', 'T', '1', '0', '0' }, - OS_DESCRIPTOR_STRING_VENDOR_CODE, - 0x00 - }, - - // OS Extended Compatible ID for WinUSB - { - // Generic Descriptor header - { - { - USB_GENERIC_DESCRIPTOR_MARKER, - 0, - sizeof(USB_GENERIC_DESCRIPTOR_HEADER) + USB_XCOMPATIBLE_OS_SIZE - }, - USB_REQUEST_TYPE_IN | USB_REQUEST_TYPE_VENDOR, - OS_DESCRIPTOR_STRING_VENDOR_CODE, - 0, // Intfc # << 8 + Page # - USB_XCOMPATIBLE_OS_REQUEST // Extended Compatible OS ID request - }, - USB_XCOMPATIBLE_OS_SIZE, // Size of this descriptor - OS_DESCRIPTOR_EX_VERSION, // Version 1.00 (BCD) - USB_XCOMPATIBLE_OS_REQUEST, // Extended Compatible OS ID response - 1, // Only 1 function record - { 0, 0, 0, 0, 0, 0, 0 }, // (padding) - // Extended Compatible OS ID function record - 0, // Interface 0 - 1, // (reserved) - { 'W', 'I', 'N', 'U', 'S', 'B', 0, 0 }, // Compatible ID - { 0, 0, 0, 0, 0, 0, 0, 0 }, // Sub-compatible ID - { 0, 0, 0, 0, 0, 0 } // Padding - }, - - // OS Extended Property - { - // Generic Descriptor header - { - { - USB_GENERIC_DESCRIPTOR_MARKER, - 0, - sizeof(USB_GENERIC_DESCRIPTOR_HEADER) + USB_XPROPERTY_OS_SIZE_WINUSB - }, - USB_REQUEST_TYPE_IN | USB_REQUEST_TYPE_VENDOR | USB_REQUEST_TYPE_INTERFACE, - OS_DESCRIPTOR_STRING_VENDOR_CODE, - 0, // Intfc # << 8 + Page # - USB_XPROPERTY_OS_REQUEST // Extended Property OS ID request - }, - USB_XPROPERTY_OS_SIZE_WINUSB, // Size of this descriptor (78 bytes for guid + 40 bytes for the property name + 24 bytes for other fields = 142 bytes) - OS_DESCRIPTOR_EX_VERSION, // Version 1.00 (BCD) - USB_XPROPERTY_OS_REQUEST, // Extended Compatible OS ID response - 1, // Only 1 ex property record - // Extended Property OS ID function record - 0x00000084, // size in bytes - EX_PROPERTY_DATA_TYPE__REG_SZ, // data type (unicode string) - 40, // name length - // property name (null -terminated unicode string: 'DeviceInterfaceGuid\0') - { 'D','\0', 'e','\0', 'v','\0', 'i','\0', 'c','\0', 'e','\0', 'I','\0', 'n','\0', 't','\0', 'e','\0', 'r','\0', 'f','\0', 'a','\0', 'c','\0', 'e','\0', 'G','\0', 'u','\0', 'i','\0', 'd','\0', '\0','\0' }, - 78, // data length - // data ({D32D1D64-963D-463E-874A-8EC8C8082CBF}) - { '{','\0', 'D','\0', '3','\0', '2','\0', 'D','\0', '1','\0', 'D','\0', '6','\0', '4','\0', '-','\0', '9','\0', '6','\0', '3','\0', 'D','\0', '-','\0', '4','\0', '6','\0', '3','\0', 'E','\0', '-','\0', '8','\0', '7','\0', '4','\0', 'A','\0', '-','\0', '8','\0', 'E','\0', 'C','\0', '8','\0', 'C','\0', '8','\0', '0','\0', '8','\0', '2','\0', 'C','\0', 'B','\0', 'F','\0', '}','\0', '\0','\0' } - }, - - // End of configuration marker - { - USB_END_DESCRIPTOR_MARKER, - 0, - 0 - }, -}; diff --git a/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings b/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings index 2b2c03ca2..9c454ddb3 100644 --- a/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings +++ b/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings @@ -29,7 +29,15 @@ F4 1.11.0 - + + + + 0x0483 + 0xA08F + Microsoft OpenTech + STM32F4DISCOVERY + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index dd933c9c1..96a4fcd13 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -63,6 +63,8 @@ + + @@ -151,14 +153,6 @@ - - - - - - - - @@ -171,10 +165,6 @@ - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index c89e50e67..98b1d4ce9 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -25,6 +25,7 @@ False True False + True False False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 6394a3ba6..c4eac93f2 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -90,6 +90,8 @@ + + @@ -235,10 +237,6 @@ - - - - @@ -347,10 +341,6 @@ --> - - - - diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 03c3de650..4177af040 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -25,6 +25,7 @@ False True False + True False False diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index b5be1785d..34bad28b7 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -163,6 +163,7 @@ $(CC_CPP_COMMON_FLAGS) @(TinyCLR_Defines->'-D%(filename)',' ') $(CC_CPP_COMMON_FLAGS) @(CC_CPP_Defines->'-D%(filename)',' ') + $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" $(CC_CPP_INCS) -I$(CLRROOT)\$(Directory) $(CC_CPP_INCS) -I$(SPO_SDK)\DeviceCode\include diff --git a/tools/Targets/Microsoft.Spot.system.mdk.targets b/tools/Targets/Microsoft.Spot.system.mdk.targets index 5936b2436..8d5232cde 100644 --- a/tools/Targets/Microsoft.Spot.system.mdk.targets +++ b/tools/Targets/Microsoft.Spot.system.mdk.targets @@ -196,6 +196,7 @@ $(CC_CPP_COMMON_FLAGS) @(TinyCLR_Defines->'-D%(filename)',' ') $(CC_CPP_COMMON_FLAGS) @(CC_CPP_Defines->'-D%(filename)',' ') + $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" $(CC_CPP_INCS) -I$(CLRROOT)\$(Directory) $(CC_CPP_INCS) -I$(SPO_SDK)\DeviceCode\include From 2d61ab26cfc9acdf2d96a64d4c495a8cf425a74d Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 15 Apr 2016 14:57:55 +0100 Subject: [PATCH 124/144] Add flag to force c11 and c++11 code and missing air quotes in include paths --- .../Targets/Microsoft.Spot.system.gcc.targets | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index 34bad28b7..eacf67e0b 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -52,7 +52,7 @@ $(CC_CPP_TARGETTYPE_FLAGS) -O0 $(CC_CPP_TARGETTYPE_FLAGS) -Os - $(CC_FLAGS)-xc + $(CC_FLAGS)-std=c11 -xc -O3 -Og -femit-class-debug-always -g3 -ggdb @@ -67,7 +67,7 @@ NETMF already builds under two other compilers, so warnings from yet another compiler aren't really that valuable anyway. --> - $(CPP_FLAGS)-xc++ -w -fcheck-new -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics + $(CPP_FLAGS)-std=c++11 -xc++ -w -fcheck-new -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 @@ -165,20 +165,20 @@ $(CC_CPP_COMMON_FLAGS) @(CC_CPP_Defines->'-D%(filename)',' ') $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" - $(CC_CPP_INCS) -I$(CLRROOT)\$(Directory) - $(CC_CPP_INCS) -I$(SPO_SDK)\DeviceCode\include - $(CC_CPP_INCS) -I$(SPO_SDK)\DeviceCode\Cores\arm - $(CC_CPP_INCS) -I$(SPO_SDK)\Support\Include - $(CC_CPP_INCS) -I$(SPO_SDK)\crypto\inc - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Include - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\CorLib - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Hardware - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Graphics - $(CC_CPP_INCS) -I$(SPO_SDK)\CLR\Libraries\SPOT_Net + $(CC_CPP_INCS) -I"$(CLRROOT)\$(Directory)" + $(CC_CPP_INCS) -I"$(SPO_SDK)\DeviceCode\include" + $(CC_CPP_INCS) -I"$(SPO_SDK)\DeviceCode\Cores\arm" + $(CC_CPP_INCS) -I"$(SPO_SDK)\Support\Include" + $(CC_CPP_INCS) -I"$(SPO_SDK)\crypto\inc" + $(CC_CPP_INCS) -I"$(SPO_SDK)\CLR\Include" + $(CC_CPP_INCS) -I"$(SPO_SDK)\CLR\Libraries\CorLib" + $(CC_CPP_INCS) -I"$(SPO_SDK)\CLR\Libraries\SPOT" + $(CC_CPP_INCS) -I"$(SPO_SDK)\CLR\Libraries\SPOT_Hardware" + $(CC_CPP_INCS) -I"$(SPO_SDK)\CLR\Libraries\SPOT_Graphics" + $(CC_CPP_INCS) -I"$(SPO_SDK)\CLR\Libraries\SPOT_Net" $(CC_CPP_INCS) -I"$(ARMINC)" - $(CC_CPP_INCS) @(IncludePaths->'-I$(CLRROOT)\%(relativedir)%(filename)',' ') - $(CC_CPP_INCS) @(DirectIncludePaths->'-I%(FullPath)',' ') + $(CC_CPP_INCS) @(IncludePaths->'-I"$(CLRROOT)\%(relativedir)%(filename)"',' ') + $(CC_CPP_INCS) @(DirectIncludePaths->'-I"%(FullPath)"',' ') $(CC_CPP_COMMON_FLAGS) $(AS_CC_CPP_COMMON_FLAGS) $(CC_CPP_TARGETTYPE_FLAGS) $(CC_CPP_INCS) $(ExtraFlags) From 97558f37a4172eac85914bc398f0f7a9ab7d51d3 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 15 Apr 2016 15:23:44 +0100 Subject: [PATCH 125/144] Correct interrupt handler function names to match declaration of startup code --- DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp index 0609a3c36..00de30bbc 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp @@ -127,7 +127,7 @@ void EXTI4_IRQHandler(void) // EXTI4 GlobalGPIOHandler(4); } -void EXTI5_IRQHandler(void) // EXTI5 - EXTI9 +void EXTI9_5_IRQHandler(void) // EXTI5 - EXTI9 { UINT32 pending = EXTI->PR & EXTI->IMR & 0x03E0; // pending bits 5..9 int num = 5; @@ -144,7 +144,7 @@ void EXTI5_IRQHandler(void) // EXTI5 - EXTI9 while(pending); } -void EXTI10_IRQHandler(void) // EXTI10 - EXTI15 +void EXTI15_10_IRQHandler(void) // EXTI10 - EXTI15 { UINT32 pending = EXTI->PR & EXTI->IMR & 0xFC00; // pending bits 10..15 int num = 10; From 8bac2f53977f406f66330cda87ca3be4119d9478 Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 15 Apr 2016 15:41:41 +0100 Subject: [PATCH 126/144] Add missing extern "C" decoration to interrupt handlers --- .../Native/STM32F4xx/GPIO/GPIO_functions.cpp | 21 ++++++++++++------- .../STM32F4xx/USART/USART_functions.cpp | 21 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp index 00de30bbc..fb875af20 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp @@ -102,32 +102,38 @@ void GlobalGPIOHandler(int pin) // 0 <= num <= 15 } -void EXTI0_IRQHandler(void) // EXTI0 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI0_IRQHandler(void) // EXTI0 { GlobalGPIOHandler(0); } -void EXTI1_IRQHandler(void) // EXTI1 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI1_IRQHandler(void) // EXTI1 { GlobalGPIOHandler(1); } -void EXTI2_IRQHandler(void) // EXTI2 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI2_IRQHandler(void) // EXTI2 { GlobalGPIOHandler(2); } -void EXTI3_IRQHandler(void) // EXTI3 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI3_IRQHandler(void) // EXTI3 { GlobalGPIOHandler(3); } -void EXTI4_IRQHandler(void) // EXTI4 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI4_IRQHandler(void) // EXTI4 { GlobalGPIOHandler(4); } -void EXTI9_5_IRQHandler(void) // EXTI5 - EXTI9 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI9_5_IRQHandler(void) // EXTI5 - EXTI9 { UINT32 pending = EXTI->PR & EXTI->IMR & 0x03E0; // pending bits 5..9 int num = 5; @@ -144,7 +150,8 @@ void EXTI9_5_IRQHandler(void) // EXTI5 - EXTI9 while(pending); } -void EXTI15_10_IRQHandler(void) // EXTI10 - EXTI15 +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void EXTI15_10_IRQHandler(void) // EXTI10 - EXTI15 { UINT32 pending = EXTI->PR & EXTI->IMR & 0xFC00; // pending bits 10..15 int num = 10; diff --git a/DeviceCode/Targets/Native/STM32F4xx/USART/USART_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/USART/USART_functions.cpp index 6101be32c..fdaee9226 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USART/USART_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/USART/USART_functions.cpp @@ -1033,43 +1033,50 @@ void GlobalUsartHandler(USART_TypeDef* uart) } #ifdef USART1 -void USART1_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void USART1_IRQHandler(void) { GlobalUsartHandler(USART1); } #endif #ifdef USART2 -void USART2_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void USART2_IRQHandler(void) { GlobalUsartHandler(USART2); } #endif #ifdef USART3 -void USART3_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void USART3_IRQHandler(void) { GlobalUsartHandler(USART3); } #endif #ifdef UART4 -void UART4_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void UART4_IRQHandler(void) { GlobalUsartHandler(UART4); } #endif #ifdef USART6 -void USART6_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void USART6_IRQHandler(void) { GlobalUsartHandler(USART6); } #endif #ifdef UART7 -void UART7_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void UART7_IRQHandler(void) { GlobalUsartHandler(UART7); } #endif #ifdef UART8 -void UART8_IRQHandler(void) +// must declare this as extern C funtion otherwise it won't be recognized by the linker as a valid interrupt handler +extern "C" void UART8_IRQHandler(void) { GlobalUsartHandler(UART8); } From 7d2e5d90b15e1a0ea2769e955ca70666954fa19a Mon Sep 17 00:00:00 2001 From: sjmneves Date: Fri, 15 Apr 2016 15:43:04 +0100 Subject: [PATCH 127/144] Move declaration of weak interrupt handlers from startup code to Int_Handlers --- .../STM32F4xx/GNU_S/startup_tinyBooter.s | 64 +++++----- .../Native/STM32F4xx/GNU_S/startup_tinyCLR.s | 112 +++++++----------- .../Targets/Native/STM32F4xx/Int_Handlers.c | 68 +++++++++++ 3 files changed, 142 insertions(+), 102 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s index 1596d9b84..6be38f832 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s @@ -304,20 +304,20 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler + /*.weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler*/ - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler + /*.weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler*/ - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler + /*.weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler*/ - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler + /*.weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler*/ - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler + /*.weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler*/ .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -355,8 +355,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler + /*.weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -380,11 +380,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler + /*.weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler + /*.weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -398,17 +398,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler + /*.weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler*/ - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler + */.weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler*/ - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler + */.weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler*/ - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler + /*.weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -443,11 +443,11 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler + /*.weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler*/ - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler + /*.weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler*/ .weak TIM6_DAC_IRQHandler .thumb_set TIM6_DAC_IRQHandler,Default_Handler @@ -470,8 +470,8 @@ ARM_Vectors: .weak DMA2_Stream4_IRQHandler .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler + /*.weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler*/ .weak ETH_WKUP_IRQHandler .thumb_set ETH_WKUP_IRQHandler,Default_Handler @@ -500,8 +500,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler + /*.weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler*/ .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s index 2d1101fa3..d4adb3121 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s +++ b/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s @@ -48,18 +48,10 @@ .global ARM_Vectors .global Default_Handler - - .global EntryPoint - - .global StackBottom - .global StackTop - .global HeapBegin - .global HeapEnd - .global CustomHeapBegin - .global CustomHeapEnd - .global __initial_sp - -.external FAULT_SubHandler +.global HeapBegin +.global HeapEnd +.global _end +.extern FAULT_SubHandler /* start address for the initialization values of the .data section. defined in linker script */ @@ -74,30 +66,10 @@ defined in linker script */ .word _ebss /* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - .section SectionForStackBottom, "w", %nobits -StackBottom: - .word 0 - - .section SectionForStackTop, "w", %nobits -__initial_sp: -StackTop: - .word 0 - - .section SectionForHeapBegin, "w", %nobits -HeapBegin: - .word 0 - - .section SectionForHeapEnd, "w", %nobits -HeapEnd: - .word 0 - - .section SectionForCustomHeapBegin, "w", %nobits -CustomHeapBegin: - .word 0 - - .section SectionForCustomHeapEnd, "w", %nobits -CustomHeapEnd: - .word 0 +/* start address of managed heap */ +.word HeapBegin +/* end address of managed heap */ +.word HeapEnd /** @@ -348,22 +320,22 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler + + /*.weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler*/ - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler + /*.weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler*/ - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler + /*.weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler*/ - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler + /*.weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler*/ - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - + /*.weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler*/ + .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -400,8 +372,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler + /*.weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -425,11 +397,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler + /*.weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler + /*.weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -443,17 +415,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler + /*.weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler*/ - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler + /*.weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler*/ - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler + /*.weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler*/ - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler + /*.weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -488,11 +460,11 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler + /*.weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler*/ - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler + /*.weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler*/ .weak TIM6_DAC_IRQHandler .thumb_set TIM6_DAC_IRQHandler,Default_Handler @@ -515,8 +487,8 @@ ARM_Vectors: .weak DMA2_Stream4_IRQHandler .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler + /*.weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler*/ .weak ETH_WKUP_IRQHandler .thumb_set ETH_WKUP_IRQHandler,Default_Handler @@ -545,8 +517,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler + /*.weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler*/ .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c index 3577049db..c26af93e4 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c @@ -163,4 +163,72 @@ void OTG_FS_IRQHandler(void) } #endif + +#ifndef FEATURE_GPIO +void EXTI0_IRQHandler(void) // EXTI0 +{} + +void EXTI1_IRQHandler(void) // EXTI1 +{} + +void EXTI2_IRQHandler(void) // EXTI2 +{} + +void EXTI3_IRQHandler(void) // EXTI3 +{} + +void EXTI4_IRQHandler(void) // EXTI4 +{} + +void EXTI9_5_IRQHandler(void) // EXTI5 - EXTI9 +{} + +void EXTI15_10_IRQHandler(void) // EXTI10 - EXTI15 +{} +#endif + +#ifndef FEATURE_I2C +/** + * @brief This function handles I2C event interrupt request. + * @param None + * @retval None + * @Note This function is redefined in "main.h" and related to I2C data transmission + */ +void I2C1_EV_IRQHandler(void) +{} + +/** + * @brief This function handles I2C error interrupt request. + * @param None + * @retval None + * @Note This function is redefined in "main.h" and related to I2C error + */ +void I2C1_ER_IRQHandler(void) +{} +#endif + +#ifndef FEATURE_USART +void USART1_IRQHandler(void) +{} + +void USART2_IRQHandler(void) +{} + +void USART3_IRQHandler(void) +{} + +void UART4_IRQHandler(void) +{} + +void USART6_IRQHandler(void) +{} + +void UART7_IRQHandler(void) +{} + +void UART8_IRQHandler(void) +{} +#endif + + /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From 3b2523f0bed6ad8a841119ba54819f74d7f70fc7 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Fri, 15 Apr 2016 17:00:44 +0100 Subject: [PATCH 128/144] Correct property definition to properly add USB config defines --- DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj | 2 +- tools/Targets/Microsoft.Spot.system.gcc.targets | 2 +- tools/Targets/Microsoft.Spot.system.mdk.targets | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj index 80e25453d..21bae342f 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/USB/dotNetMF.proj @@ -25,7 +25,7 @@ - + True diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index eacf67e0b..619e9fd29 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -163,7 +163,7 @@ $(CC_CPP_COMMON_FLAGS) @(TinyCLR_Defines->'-D%(filename)',' ') $(CC_CPP_COMMON_FLAGS) @(CC_CPP_Defines->'-D%(filename)',' ') - $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" + $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" $(CC_CPP_INCS) -I"$(CLRROOT)\$(Directory)" $(CC_CPP_INCS) -I"$(SPO_SDK)\DeviceCode\include" diff --git a/tools/Targets/Microsoft.Spot.system.mdk.targets b/tools/Targets/Microsoft.Spot.system.mdk.targets index 8d5232cde..128de62f1 100644 --- a/tools/Targets/Microsoft.Spot.system.mdk.targets +++ b/tools/Targets/Microsoft.Spot.system.mdk.targets @@ -196,7 +196,7 @@ $(CC_CPP_COMMON_FLAGS) @(TinyCLR_Defines->'-D%(filename)',' ') $(CC_CPP_COMMON_FLAGS) @(CC_CPP_Defines->'-D%(filename)',' ') - $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" + $(CC_CPP_COMMON_FLAGS) -DUSBD_VID=$(USB_VID) -DUSBD_PID=$(USB_PID) -DUSBD_MANUFACTURER_STRING="\"$(USB_MANUFACTURER)\"" -DUSBD_PRODUCT_HS_STRING="\"$(USB_PRODUCT)\"" -DUSBD_PRODUCT_FS_STRING="\"$(USB_PRODUCT)\"" $(CC_CPP_INCS) -I$(CLRROOT)\$(Directory) $(CC_CPP_INCS) -I$(SPO_SDK)\DeviceCode\include From b3687a65b6790022bf2d7210f9d8ba7d84707340 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 18 Apr 2016 09:53:39 +0100 Subject: [PATCH 129/144] Move startup code to solution folder (only GCC, still missing RVD version) --- .../TinyBooter}/GNU_S/startup_tinyBooter.s | 12 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 1 + .../TinyCLR}/GNU_S/startup_tinyCLR.s | 10 +- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 1 + .../TinyCLR_NONET/GNU_S/startup_tinyCLR.s | 550 ++++++++++++++++++ .../TinyCLR_NONET/TinyCLR_NONET.proj | 1 + .../TinyBooter/GNU_S/startup_tinyBooter.s | 533 +++++++++++++++++ .../TinyBooter/TinyBooter.proj | 1 + .../TinyCLR/GNU_S/startup_tinyCLR.s | 550 ++++++++++++++++++ .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 1 + 10 files changed, 1649 insertions(+), 11 deletions(-) rename {DeviceCode/Targets/Native/STM32F4xx => Solutions/MCBSTM32F400/TinyBooter}/GNU_S/startup_tinyBooter.s (96%) rename {DeviceCode/Targets/Native/STM32F4xx => Solutions/MCBSTM32F400/TinyCLR}/GNU_S/startup_tinyCLR.s (97%) create mode 100644 Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s create mode 100644 Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s create mode 100644 Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s b/Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s similarity index 96% rename from DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s rename to Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s index 6be38f832..b699480c9 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyBooter.s +++ b/Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s @@ -401,10 +401,10 @@ ARM_Vectors: /*.weak USART1_IRQHandler .thumb_set USART1_IRQHandler,Default_Handler*/ - */.weak USART2_IRQHandler + /*.weak USART2_IRQHandler .thumb_set USART2_IRQHandler,Default_Handler*/ - */.weak USART3_IRQHandler + /*.weak USART3_IRQHandler .thumb_set USART3_IRQHandler,Default_Handler*/ /*.weak EXTI15_10_IRQHandler @@ -446,8 +446,8 @@ ARM_Vectors: /*.weak UART4_IRQHandler .thumb_set UART4_IRQHandler,Default_Handler*/ - /*.weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler*/ + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler .weak TIM6_DAC_IRQHandler .thumb_set TIM6_DAC_IRQHandler,Default_Handler @@ -470,8 +470,8 @@ ARM_Vectors: .weak DMA2_Stream4_IRQHandler .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - /*.weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler*/ + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler .weak ETH_WKUP_IRQHandler .thumb_set ETH_WKUP_IRQHandler,Default_Handler diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index e2a514d22..ff313f903 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -28,6 +28,7 @@ + diff --git a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s b/Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s similarity index 97% rename from DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s rename to Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s index d4adb3121..9bc400484 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GNU_S/startup_tinyCLR.s +++ b/Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s @@ -100,7 +100,7 @@ PowerOnReset: .type Reset_Handler, %function .section i.EntryPoint, "ax", %progbits -EntryPoint: +//EntryPoint: Reset_Handler: ldr sp, =_estack /* set stack pointer */ @@ -463,8 +463,8 @@ ARM_Vectors: /*.weak UART4_IRQHandler .thumb_set UART4_IRQHandler,Default_Handler*/ - /*.weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler*/ + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler .weak TIM6_DAC_IRQHandler .thumb_set TIM6_DAC_IRQHandler,Default_Handler @@ -487,8 +487,8 @@ ARM_Vectors: .weak DMA2_Stream4_IRQHandler .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - /*.weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler*/ + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler .weak ETH_WKUP_IRQHandler .thumb_set ETH_WKUP_IRQHandler,Default_Handler diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index fa71de92e..1ec887fe6 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -45,6 +45,7 @@ + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s b/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s new file mode 100644 index 000000000..9bc400484 --- /dev/null +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s @@ -0,0 +1,550 @@ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author Eclo Solutions + * @brief STM32F407xx Devices vector table for GCC based toolchains. Based in startup_stm32f407xx.s V2.4.3 + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global ARM_Vectors +.global Default_Handler +.global HeapBegin +.global HeapEnd +.global _end +.extern FAULT_SubHandler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/* start address of managed heap */ +.word HeapBegin +/* end address of managed heap */ +.word HeapEnd + + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + +.section SectionForPowerOnReset, "ax", %progbits +PowerOnReset: + + .word __initial_sp + .word Reset_Handler @ Reset + .word Fault_Handler @ NMI + .word Fault_Handler @ Hard Fault + .word Fault_Handler @ MMU Fault + .word Fault_Handler @ Bus Fault + .word Fault_Handler @ Usage Fault + + .text + .thumb + .thumb_func + .align 2 + .weak Reset_Handler + .type Reset_Handler, %function + + .section i.EntryPoint, "ax", %progbits +//EntryPoint: +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .VectorTable,"a",%progbits + .type ARM_Vectors, %object + .size ARM_Vectors, .-ARM_Vectors + + +ARM_Vectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,FAULT_SubHandler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,FAULT_SubHandler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + /*.weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler*/ + + /*.weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler*/ + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + /* implemented at Int_Handlers.c */ + /*.weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler*/ + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + /*.weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler*/ + + /*.weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler*/ + + /*.weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler*/ + + /*.weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler*/ + + /*.weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler*/ + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + /*.weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + /* implemented at Time_functions.cpp */ + /*.weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler*/ + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + /*.weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + + /*.weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + /*.weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler*/ + + /*.weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler*/ + + /*.weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler*/ + + /*.weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + /*.weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler*/ + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + /*.weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + /*.weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler*/ + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 4050d40dc..1a4dbf737 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -41,6 +41,7 @@ + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s b/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s new file mode 100644 index 000000000..b699480c9 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s @@ -0,0 +1,533 @@ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author Eclo Solutions + * @brief STM32F407xx Devices vector table for GCC based toolchains. Based in startup_stm32f407xx.s V2.4.3 + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global ARM_Vectors +.global Default_Handler +.global HeapBegin +.global HeapEnd +.global _end +.extern FAULT_SubHandler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/* start address of managed heap */ +.word HeapBegin +/* end address of managed heap */ +.word HeapEnd + + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type ARM_Vectors, %object + .size ARM_Vectors, .-ARM_Vectors + +ARM_Vectors: + .long _estack + .long Reset_Handler + .long NMI_Handler + .long HardFault_Handler + .long MemManage_Handler + .long BusFault_Handler + .long UsageFault_Handler + .long 0 + .long 0 + .long 0 + .long 0 + .long SVC_Handler + .long DebugMon_Handler + .long 0 + .long PendSV_Handler + .long SysTick_Handler + + /* External Interrupts */ + .long WWDG_IRQHandler /* Window WatchDog */ + .long PVD_IRQHandler /* PVD through EXTI Line detection */ + .long TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .long RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .long FLASH_IRQHandler /* FLASH */ + .long RCC_IRQHandler /* RCC */ + .long EXTI0_IRQHandler /* EXTI Line0 */ + .long EXTI1_IRQHandler /* EXTI Line1 */ + .long EXTI2_IRQHandler /* EXTI Line2 */ + .long EXTI3_IRQHandler /* EXTI Line3 */ + .long EXTI4_IRQHandler /* EXTI Line4 */ + .long DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .long DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .long DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .long DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .long DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .long DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .long DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .long ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .long CAN1_TX_IRQHandler /* CAN1 TX */ + .long CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .long CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .long CAN1_SCE_IRQHandler /* CAN1 SCE */ + .long EXTI9_5_IRQHandler /* External Line[9:5]s */ + .long TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .long TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .long TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .long TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .long TIM2_IRQHandler /* TIM2 */ + .long TIM3_IRQHandler /* TIM3 */ + .long TIM4_IRQHandler /* TIM4 */ + .long I2C1_EV_IRQHandler /* I2C1 Event */ + .long I2C1_ER_IRQHandler /* I2C1 Error */ + .long I2C2_EV_IRQHandler /* I2C2 Event */ + .long I2C2_ER_IRQHandler /* I2C2 Error */ + .long SPI1_IRQHandler /* SPI1 */ + .long SPI2_IRQHandler /* SPI2 */ + .long USART1_IRQHandler /* USART1 */ + .long USART2_IRQHandler /* USART2 */ + .long USART3_IRQHandler /* USART3 */ + .long EXTI15_10_IRQHandler /* External Line[15:10]s */ + .long RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .long OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .long TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .long TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .long TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .long TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .long DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .long FSMC_IRQHandler /* FSMC */ + .long SDIO_IRQHandler /* SDIO */ + .long TIM5_IRQHandler /* TIM5 */ + .long SPI3_IRQHandler /* SPI3 */ + .long UART4_IRQHandler /* UART4 */ + .long UART5_IRQHandler /* UART5 */ + .long TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .long TIM7_IRQHandler /* TIM7 */ + .long DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .long DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .long DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .long DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .long DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .long ETH_IRQHandler /* Ethernet */ + .long ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .long CAN2_TX_IRQHandler /* CAN2 TX */ + .long CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .long CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .long CAN2_SCE_IRQHandler /* CAN2 SCE */ + .long OTG_FS_IRQHandler /* USB OTG FS */ + .long DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .long DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .long DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .long USART6_IRQHandler /* USART6 */ + .long I2C3_EV_IRQHandler /* I2C3 event */ + .long I2C3_ER_IRQHandler /* I2C3 error */ + .long OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .long OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .long OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .long OTG_HS_IRQHandler /* USB OTG HS */ + .long DCMI_IRQHandler /* DCMI */ + .long 0 /* CRYP crypto */ + .long HASH_RNG_IRQHandler /* Hash and Rng */ + .long FPU_IRQHandler /* FPU */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,FAULT_SubHandler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,FAULT_SubHandler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + /*.weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler*/ + + /*.weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler*/ + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + /* implemented at Int_Handlers.c */ + /*.weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler*/ + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + /*.weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler*/ + + /*.weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler*/ + + /*.weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler*/ + + /*.weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler*/ + + /*.weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler*/ + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + /*.weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + /* implemented at Time_functions.cpp */ + /*.weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler*/ + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + /*.weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + + /*.weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + /*.weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler*/ + + /*.weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler*/ + + /*.weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler*/ + + /*.weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + /*.weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler*/ + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + /*.weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + /*.weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler*/ + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 96a4fcd13..199bfc994 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -29,6 +29,7 @@ + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s b/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s new file mode 100644 index 000000000..9bc400484 --- /dev/null +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s @@ -0,0 +1,550 @@ +/** + ****************************************************************************** + * @file startup_stm32f407xx.s + * @author Eclo Solutions + * @brief STM32F407xx Devices vector table for GCC based toolchains. Based in startup_stm32f407xx.s V2.4.3 + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * 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 STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global ARM_Vectors +.global Default_Handler +.global HeapBegin +.global HeapEnd +.global _end +.extern FAULT_SubHandler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/* start address of managed heap */ +.word HeapBegin +/* end address of managed heap */ +.word HeapEnd + + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + +.section SectionForPowerOnReset, "ax", %progbits +PowerOnReset: + + .word __initial_sp + .word Reset_Handler @ Reset + .word Fault_Handler @ NMI + .word Fault_Handler @ Hard Fault + .word Fault_Handler @ MMU Fault + .word Fault_Handler @ Bus Fault + .word Fault_Handler @ Usage Fault + + .text + .thumb + .thumb_func + .align 2 + .weak Reset_Handler + .type Reset_Handler, %function + + .section i.EntryPoint, "ax", %progbits +//EntryPoint: +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2], #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .VectorTable,"a",%progbits + .type ARM_Vectors, %object + .size ARM_Vectors, .-ARM_Vectors + + +ARM_Vectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word ETH_IRQHandler /* Ethernet */ + .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* CRYP crypto */ + .word HASH_RNG_IRQHandler /* Hash and Rng */ + .word FPU_IRQHandler /* FPU */ + + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,FAULT_SubHandler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,FAULT_SubHandler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + /*.weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler*/ + + /*.weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler*/ + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + /* implemented at Int_Handlers.c */ + /*.weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler*/ + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + /*.weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler*/ + + /*.weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler*/ + + /*.weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler*/ + + /*.weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler*/ + + /*.weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler*/ + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + /*.weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + /* implemented at Time_functions.cpp */ + /*.weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler*/ + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + /*.weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + + /*.weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + /*.weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler*/ + + /*.weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler*/ + + /*.weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler*/ + + /*.weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + /*.weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler*/ + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak ETH_IRQHandler + .thumb_set ETH_IRQHandler,Default_Handler + + .weak ETH_WKUP_IRQHandler + .thumb_set ETH_WKUP_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + /*.weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + /*.weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler*/ + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_OUT_IRQHandler + .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler + + .weak OTG_HS_EP1_IN_IRQHandler + .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler + + .weak OTG_HS_WKUP_IRQHandler + .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler + + .weak OTG_HS_IRQHandler + .thumb_set OTG_HS_IRQHandler,Default_Handler + + .weak DCMI_IRQHandler + .thumb_set DCMI_IRQHandler,Default_Handler + + .weak HASH_RNG_IRQHandler + .thumb_set HASH_RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index c4eac93f2..11c8443aa 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -42,6 +42,7 @@ + From 95bd0ac60a34ae8ea1fe518627bfe2cc271d96b4 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 18 Apr 2016 09:55:26 +0100 Subject: [PATCH 130/144] Move compiler defines of HAL/PAL features to Microsoft.SPOT.Features.Settings --- .../Targets/Native/STM32F4xx/dotNetMF.proj | 17 ---- .../Native/STM32F4xx/dotNetMF_loader.proj | 17 ---- .../Targets/Microsoft.SPOT.Features.Settings | 90 +++++++++++++++++++ tools/Targets/Microsoft.SPOT.System.Settings | 2 + 4 files changed, 92 insertions(+), 34 deletions(-) create mode 100644 tools/Targets/Microsoft.SPOT.Features.Settings diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index 789228165..bb85c9ab5 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -88,100 +88,85 @@ - - - - - - - - - - - - - - - @@ -190,7 +175,6 @@ - @@ -228,7 +212,6 @@
- diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 3541485a3..710d072c2 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -85,100 +85,85 @@ - - - - - - - - - - - - - - - @@ -187,7 +172,6 @@ - @@ -225,7 +209,6 @@ - diff --git a/tools/Targets/Microsoft.SPOT.Features.Settings b/tools/Targets/Microsoft.SPOT.Features.Settings new file mode 100644 index 000000000..6ca4a5599 --- /dev/null +++ b/tools/Targets/Microsoft.SPOT.Features.Settings @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/Targets/Microsoft.SPOT.System.Settings b/tools/Targets/Microsoft.SPOT.System.Settings index e43137fc0..17d12c437 100644 --- a/tools/Targets/Microsoft.SPOT.System.Settings +++ b/tools/Targets/Microsoft.SPOT.System.Settings @@ -1,3 +1,4 @@ + @@ -131,4 +132,5 @@ + \ No newline at end of file From 398b75b24240ed03687412cb32980ab96710a8cf Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 18 Apr 2016 10:21:12 +0100 Subject: [PATCH 131/144] Rename CRC feature definition to make it clearer --- DeviceCode/Initialization/tinyhal.cpp | 4 +- .../Targets/Native/STM32F4xx/dotNetMF.proj | 10 +- .../Native/STM32F4xx/dotNetMF_loader.proj | 10 +- .../MCBSTM32F400/TinyBooter/TinyBooter.proj | 4 +- .../MCBSTM32F400/TinyBooter/features.settings | 4 +- Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj | 4 +- .../MCBSTM32F400/TinyCLR/features.settings | 4 +- .../TinyCLR_NONET/TinyCLR_NONET.proj | 4 +- .../TinyCLR_NONET/features.settings | 4 +- .../TinyBooter/TinyBooter.proj | 4 +- .../TinyBooter/features.settings | 4 +- .../STM32F4DISCOVERY/TinyCLR/TinyCLR.proj | 4 +- .../TinyCLR/features.settings | 4 +- .../TinyCLR/scatterfile_tinyclr_gcc.xml | 275 ++++-------------- Solutions/STM32F4DISCOVERY/dotnetmf.proj | 2 +- .../Targets/Microsoft.SPOT.Features.Settings | 10 +- 16 files changed, 98 insertions(+), 253 deletions(-) diff --git a/DeviceCode/Initialization/tinyhal.cpp b/DeviceCode/Initialization/tinyhal.cpp index eb8ae3bc0..17e0216d2 100644 --- a/DeviceCode/Initialization/tinyhal.cpp +++ b/DeviceCode/Initialization/tinyhal.cpp @@ -274,7 +274,7 @@ void HAL_Initialize() Native_Profiler_Init(); #endif -#ifdef FEATURE_CORTEX_CRC +#ifdef FEATURE_HARDWARE_CRC // enable clock for the CRC calculation module __HAL_RCC_CRC_CLK_ENABLE(); #endif @@ -309,7 +309,7 @@ void HAL_Uninitialize() } } -#ifdef FEATURE_CORTEX_CRC +#ifdef FEATURE_HARDWARE_CRC // disable clock for the CRC calculation module __HAL_RCC_CRC_CLK_DISABLE(); #endif diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj index bb85c9ab5..5ea33e1e8 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF.proj @@ -159,18 +159,18 @@
- - + + - - + + - + diff --git a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj index 710d072c2..d96af7f34 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj +++ b/DeviceCode/Targets/Native/STM32F4xx/dotNetMF_loader.proj @@ -156,18 +156,18 @@ - - + + - - + + - + diff --git a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj index ff313f903..2117d3664 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj +++ b/Solutions/MCBSTM32F400/TinyBooter/TinyBooter.proj @@ -61,8 +61,8 @@ - - + + diff --git a/Solutions/MCBSTM32F400/TinyBooter/features.settings b/Solutions/MCBSTM32F400/TinyBooter/features.settings index 2410acd09..ecd704af1 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/features.settings +++ b/Solutions/MCBSTM32F400/TinyBooter/features.settings @@ -23,8 +23,8 @@ False False False - True - False + True + False True False diff --git a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj index 1ec887fe6..ab995ceab 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj +++ b/Solutions/MCBSTM32F400/TinyCLR/TinyCLR.proj @@ -98,8 +98,8 @@ - - + + diff --git a/Solutions/MCBSTM32F400/TinyCLR/features.settings b/Solutions/MCBSTM32F400/TinyCLR/features.settings index a829bb61d..9870f3a52 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR/features.settings @@ -23,8 +23,8 @@ False False False - True - False + True + False True False diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj index 1a4dbf737..baa53b70b 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/TinyCLR_NONET.proj @@ -86,8 +86,8 @@ - - + + diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings index 0e5cb48e8..6b319dea8 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/features.settings @@ -23,8 +23,8 @@ False False False - True - False + True + False True False diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj index 199bfc994..61c3ddaee 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/TinyBooter.proj @@ -62,8 +62,8 @@ - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings index 98b1d4ce9..9b750585d 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/features.settings @@ -23,8 +23,8 @@ False False False - True - False + True + False True False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj index 11c8443aa..f55a5e401 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/TinyCLR.proj @@ -89,8 +89,8 @@ - - + + diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings index 4177af040..73d7cbf20 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/features.settings @@ -23,8 +23,8 @@ False False False - True - False + True + False True False diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml b/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml index 190adef3d..d994e909f 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml @@ -46,18 +46,14 @@ - - - - - + + - - + - + @@ -68,7 +64,7 @@ - + @@ -76,38 +72,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -116,63 +85,50 @@ - - - - - - + - + + + + + + + + + + - - - - - - - - - - - + + + + - - - + - + + + - - - - - + - - - - + + - - - - + - @@ -180,7 +136,6 @@ - @@ -192,92 +147,57 @@ (See Section 4.4.4 of the ARM Cortex-M4 Generic User Guide [ ARM DUI 0553A (ID121610) ] ) Since this starts the SRAM block, it's aligned just fine for any size table. --> - - + + + + + - + - - - - - - - - + + + - - + - - - + - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -295,104 +215,31 @@ puts the end outside of physical memory it will generate an imprecise abort. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - + + - - - - - - - - --> - - - - - - - + - - - + + + diff --git a/Solutions/STM32F4DISCOVERY/dotnetmf.proj b/Solutions/STM32F4DISCOVERY/dotnetmf.proj index 9f1b38c9c..6857e72f9 100644 --- a/Solutions/STM32F4DISCOVERY/dotnetmf.proj +++ b/Solutions/STM32F4DISCOVERY/dotnetmf.proj @@ -8,7 +8,7 @@ - + diff --git a/tools/Targets/Microsoft.SPOT.Features.Settings b/tools/Targets/Microsoft.SPOT.Features.Settings index 6ca4a5599..b51917852 100644 --- a/tools/Targets/Microsoft.SPOT.Features.Settings +++ b/tools/Targets/Microsoft.SPOT.Features.Settings @@ -69,17 +69,15 @@ - - + + - - + + - - From fa4321a01750d28a1be5e0a4332bdd1da929c51d Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 18 Apr 2016 11:10:59 +0100 Subject: [PATCH 132/144] Remove comments from interrupt handlers at startup code (weak declaration is now being correctly replaced with strong implementation by linker) --- .../Targets/Native/STM32F4xx/Int_Handlers.c | 74 ------------------- .../TinyBooter/GNU_S/startup_tinyBooter.s | 65 ++++++++-------- .../TinyCLR/GNU_S/startup_tinyCLR.s | 65 ++++++++-------- .../TinyCLR_NONET/GNU_S/startup_tinyCLR.s | 65 ++++++++-------- .../TinyBooter/GNU_S/startup_tinyBooter.s | 65 ++++++++-------- .../TinyCLR/GNU_S/startup_tinyCLR.s | 65 ++++++++-------- 6 files changed, 160 insertions(+), 239 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c index c26af93e4..a0f567442 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c +++ b/DeviceCode/Targets/Native/STM32F4xx/Int_Handlers.c @@ -157,78 +157,4 @@ __weak void SysTick_Handler(void) HAL_SYSTICK_IRQHandler(); } -#ifndef FEATURE_USB_DEBUG -void OTG_FS_IRQHandler(void) -{ -} -#endif - - -#ifndef FEATURE_GPIO -void EXTI0_IRQHandler(void) // EXTI0 -{} - -void EXTI1_IRQHandler(void) // EXTI1 -{} - -void EXTI2_IRQHandler(void) // EXTI2 -{} - -void EXTI3_IRQHandler(void) // EXTI3 -{} - -void EXTI4_IRQHandler(void) // EXTI4 -{} - -void EXTI9_5_IRQHandler(void) // EXTI5 - EXTI9 -{} - -void EXTI15_10_IRQHandler(void) // EXTI10 - EXTI15 -{} -#endif - -#ifndef FEATURE_I2C -/** - * @brief This function handles I2C event interrupt request. - * @param None - * @retval None - * @Note This function is redefined in "main.h" and related to I2C data transmission - */ -void I2C1_EV_IRQHandler(void) -{} - -/** - * @brief This function handles I2C error interrupt request. - * @param None - * @retval None - * @Note This function is redefined in "main.h" and related to I2C error - */ -void I2C1_ER_IRQHandler(void) -{} -#endif - -#ifndef FEATURE_USART -void USART1_IRQHandler(void) -{} - -void USART2_IRQHandler(void) -{} - -void USART3_IRQHandler(void) -{} - -void UART4_IRQHandler(void) -{} - -void USART6_IRQHandler(void) -{} - -void UART7_IRQHandler(void) -{} - -void UART8_IRQHandler(void) -{} -#endif - - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s b/Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s index b699480c9..7c0806631 100644 --- a/Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s +++ b/Solutions/MCBSTM32F400/TinyBooter/GNU_S/startup_tinyBooter.s @@ -304,20 +304,20 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler - /*.weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler*/ + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler - /*.weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler*/ + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler - /*.weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler*/ + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler - /*.weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler*/ + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler - /*.weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler*/ + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -355,8 +355,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - /*.weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -370,9 +370,8 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - /* implemented at Time_functions.cpp */ - /*.weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler*/ + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler @@ -380,11 +379,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - /*.weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler - /*.weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -398,17 +397,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - /*.weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler*/ + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler - /*.weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler*/ + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler - /*.weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler*/ + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler - /*.weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -443,8 +442,8 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - /*.weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler*/ + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler .weak UART5_IRQHandler .thumb_set UART5_IRQHandler,Default_Handler @@ -488,8 +487,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - /*.weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler @@ -500,8 +499,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - /*.weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler*/ + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler diff --git a/Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s b/Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s index 9bc400484..e4c8e0821 100644 --- a/Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s +++ b/Solutions/MCBSTM32F400/TinyCLR/GNU_S/startup_tinyCLR.s @@ -321,20 +321,20 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler - /*.weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler*/ + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler - /*.weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler*/ + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler - /*.weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler*/ + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler - /*.weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler*/ + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler - /*.weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler*/ + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -372,8 +372,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - /*.weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -387,9 +387,8 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - /* implemented at Time_functions.cpp */ - /*.weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler*/ + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler @@ -397,11 +396,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - /*.weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler - /*.weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -415,17 +414,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - /*.weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler*/ + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler - /*.weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler*/ + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler - /*.weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler*/ + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler - /*.weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -460,8 +459,8 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - /*.weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler*/ + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler .weak UART5_IRQHandler .thumb_set UART5_IRQHandler,Default_Handler @@ -505,8 +504,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - /*.weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler @@ -517,8 +516,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - /*.weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler*/ + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler diff --git a/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s b/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s index 9bc400484..e4c8e0821 100644 --- a/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s +++ b/Solutions/MCBSTM32F400/TinyCLR_NONET/GNU_S/startup_tinyCLR.s @@ -321,20 +321,20 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler - /*.weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler*/ + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler - /*.weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler*/ + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler - /*.weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler*/ + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler - /*.weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler*/ + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler - /*.weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler*/ + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -372,8 +372,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - /*.weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -387,9 +387,8 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - /* implemented at Time_functions.cpp */ - /*.weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler*/ + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler @@ -397,11 +396,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - /*.weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler - /*.weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -415,17 +414,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - /*.weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler*/ + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler - /*.weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler*/ + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler - /*.weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler*/ + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler - /*.weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -460,8 +459,8 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - /*.weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler*/ + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler .weak UART5_IRQHandler .thumb_set UART5_IRQHandler,Default_Handler @@ -505,8 +504,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - /*.weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler @@ -517,8 +516,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - /*.weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler*/ + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler diff --git a/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s b/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s index b699480c9..7c0806631 100644 --- a/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s +++ b/Solutions/STM32F4DISCOVERY/TinyBooter/GNU_S/startup_tinyBooter.s @@ -304,20 +304,20 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler - /*.weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler*/ + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler - /*.weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler*/ + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler - /*.weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler*/ + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler - /*.weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler*/ + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler - /*.weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler*/ + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -355,8 +355,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - /*.weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -370,9 +370,8 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - /* implemented at Time_functions.cpp */ - /*.weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler*/ + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler @@ -380,11 +379,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - /*.weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler - /*.weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -398,17 +397,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - /*.weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler*/ + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler - /*.weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler*/ + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler - /*.weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler*/ + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler - /*.weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -443,8 +442,8 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - /*.weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler*/ + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler .weak UART5_IRQHandler .thumb_set UART5_IRQHandler,Default_Handler @@ -488,8 +487,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - /*.weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler @@ -500,8 +499,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - /*.weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler*/ + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler diff --git a/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s b/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s index 9bc400484..e4c8e0821 100644 --- a/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s +++ b/Solutions/STM32F4DISCOVERY/TinyCLR/GNU_S/startup_tinyCLR.s @@ -321,20 +321,20 @@ ARM_Vectors: .weak RCC_IRQHandler .thumb_set RCC_IRQHandler,Default_Handler - /*.weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler*/ + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler - /*.weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler*/ + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler - /*.weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler*/ + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler - /*.weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler*/ + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler - /*.weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler*/ + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler .weak DMA1_Stream0_IRQHandler .thumb_set DMA1_Stream0_IRQHandler,Default_Handler @@ -372,8 +372,8 @@ ARM_Vectors: .weak CAN1_SCE_IRQHandler .thumb_set CAN1_SCE_IRQHandler,Default_Handler - /*.weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler*/ + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler .weak TIM1_BRK_TIM9_IRQHandler .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler @@ -387,9 +387,8 @@ ARM_Vectors: .weak TIM1_CC_IRQHandler .thumb_set TIM1_CC_IRQHandler,Default_Handler - /* implemented at Time_functions.cpp */ - /*.weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler*/ + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler .weak TIM3_IRQHandler .thumb_set TIM3_IRQHandler,Default_Handler @@ -397,11 +396,11 @@ ARM_Vectors: .weak TIM4_IRQHandler .thumb_set TIM4_IRQHandler,Default_Handler - /*.weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler*/ + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler - /*.weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler*/ + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler .weak I2C2_EV_IRQHandler .thumb_set I2C2_EV_IRQHandler,Default_Handler @@ -415,17 +414,17 @@ ARM_Vectors: .weak SPI2_IRQHandler .thumb_set SPI2_IRQHandler,Default_Handler - /*.weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler*/ + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler - /*.weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler*/ + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler - /*.weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler*/ + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler - /*.weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler*/ + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler .weak RTC_Alarm_IRQHandler .thumb_set RTC_Alarm_IRQHandler,Default_Handler @@ -460,8 +459,8 @@ ARM_Vectors: .weak SPI3_IRQHandler .thumb_set SPI3_IRQHandler,Default_Handler - /*.weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler*/ + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler .weak UART5_IRQHandler .thumb_set UART5_IRQHandler,Default_Handler @@ -505,8 +504,8 @@ ARM_Vectors: .weak CAN2_SCE_IRQHandler .thumb_set CAN2_SCE_IRQHandler,Default_Handler - /*.weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler*/ + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler .weak DMA2_Stream5_IRQHandler .thumb_set DMA2_Stream5_IRQHandler,Default_Handler @@ -517,8 +516,8 @@ ARM_Vectors: .weak DMA2_Stream7_IRQHandler .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - /*.weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler*/ + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler .weak I2C3_EV_IRQHandler .thumb_set I2C3_EV_IRQHandler,Default_Handler From b8980a5529824d37211ad3729a5d8f4c7309ce4f Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 19 Apr 2016 09:52:40 +0100 Subject: [PATCH 133/144] Add missing ifdef FEATURE_LCD wrapping call to lcd_printf --- DeviceCode/pal/COM/usart/usart.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DeviceCode/pal/COM/usart/usart.cpp b/DeviceCode/pal/COM/usart/usart.cpp index 3b1729af9..dcfcd381f 100644 --- a/DeviceCode/pal/COM/usart/usart.cpp +++ b/DeviceCode/pal/COM/usart/usart.cpp @@ -556,7 +556,9 @@ BOOL USART_Driver::AddCharToRxBuffer( int ComPortNum, char c ) SetEvent( ComPortNum, USART_EVENT_ERROR_RXOVER ); #if !defined(BUILD_RTM) +#ifdef FEATURE_LCD lcd_printf("\fBuffer OVFLW\r\n"); +#endif hal_printf("Buffer OVFLW\r\n"); #endif return FALSE; From efd9b01e3d2cee339b8420e0d7f126a4254be0be Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 20 Apr 2016 15:09:34 +0100 Subject: [PATCH 134/144] Correct code with wrong call to USB_OpenStream - see PR #439 --- DeviceCode/pal/COM/ComDirector.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/DeviceCode/pal/COM/ComDirector.cpp b/DeviceCode/pal/COM/ComDirector.cpp index 9bebcc8dd..367ec214a 100644 --- a/DeviceCode/pal/COM/ComDirector.cpp +++ b/DeviceCode/pal/COM/ComDirector.cpp @@ -19,10 +19,17 @@ BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) if(USB_CONFIG_ERR_OK != USB_Configure( ConvertCOM_UsbController(ComPortNum), NULL )) return FALSE; - if(!USB_Initialize( ConvertCOM_UsbController(ComPortNum) )) - return FALSE; - - return USB_OpenStream( ConvertCOM_UsbStream(ComPortNum), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); + if(USB_Initialize(ConvertCOM_UsbController(ComPortNum))) + { +#if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) + // because it was called from debugger port USB_Initialize alreadt opened the USB stream + return TRUE; +#else + return USB_OpenStream( ConvertCOM_UsbStream(HalSystemConfig.DebuggerPorts[0]), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); +#endif + + } + break; #endif #ifdef FEATURE_SOCKETS From b13ff6696237bb60519a283e6c6b260f391ac79f Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 20 Apr 2016 15:10:58 +0100 Subject: [PATCH 135/144] Correct comment --- DeviceCode/pal/COM/ComDirector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeviceCode/pal/COM/ComDirector.cpp b/DeviceCode/pal/COM/ComDirector.cpp index 367ec214a..01abb2798 100644 --- a/DeviceCode/pal/COM/ComDirector.cpp +++ b/DeviceCode/pal/COM/ComDirector.cpp @@ -22,7 +22,7 @@ BOOL DebuggerPort_Initialize( COM_HANDLE ComPortNum ) if(USB_Initialize(ConvertCOM_UsbController(ComPortNum))) { #if defined(USB_ALLOW_CONFIGURATION_OVERRIDE) - // because it was called from debugger port USB_Initialize alreadt opened the USB stream + // because the call is from a debugger port USB_Initialize has already opened the USB stream return TRUE; #else return USB_OpenStream( ConvertCOM_UsbStream(HalSystemConfig.DebuggerPorts[0]), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); From e8275c6023133b6b55183f184a1048088ae16cef Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 25 Aug 2016 18:22:04 +0100 Subject: [PATCH 136/144] Missed last commit --- .../ScatterfileWrapper.cs | 76 +++++++++---------- .../PlatformDesigner/PlatformDesigner.sln | 4 +- DeviceCode/pal/graphics/graphics.cpp | 2 +- 3 files changed, 42 insertions(+), 40 deletions(-) diff --git a/CLR/Tools/PlatformDesigner/ComponentObjectModel/ScatterfileWrapper.cs b/CLR/Tools/PlatformDesigner/ComponentObjectModel/ScatterfileWrapper.cs index 26135fc35..9356bc6ea 100644 --- a/CLR/Tools/PlatformDesigner/ComponentObjectModel/ScatterfileWrapper.cs +++ b/CLR/Tools/PlatformDesigner/ComponentObjectModel/ScatterfileWrapper.cs @@ -1,13 +1,13 @@ using System; -using System.Reflection; using System.Collections; using System.Collections.Generic; -using System.Text; +using System.Diagnostics; using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; using System.Xml; -using System.Xml.XPath; using System.Xml.Serialization; -using System.Text.RegularExpressions; +using System.Xml.XPath; using XsdInventoryFormatObject; using XsdScatterfileSchemaObject; @@ -22,22 +22,22 @@ public class ScatterfileWrapper const string ScatterfileNamespace = "http://schemas.microsoft.com/netmf/ScatterfileSchema.xsd"; - const string IfInFormat = "If Name=\"{0}\" In=\"{1}\""; - const string IfEqFormat = "If Name=\"{0}\" Value=\"{1}\""; - const string IfDefFormat = "IfDefined Name=\"{0}\""; - const string IfNotDefFormat= "IfNotDefined Name=\"{0}\""; + const string IfInFormat = "If Name=\"{0}\" In=\"{1}\""; + const string IfEqFormat = "If Name=\"{0}\" Value=\"{1}\""; + const string IfDefFormat = "IfDefined Name=\"{0}\""; + const string IfNotDefFormat = "IfNotDefined Name=\"{0}\""; - const string RegExIfIn = "If\\s+Name\\s*=\\s*\"(\\S+)\"\\s+In\\s*=\\s*\"([\\S\\s]*)\""; - const string RegExIfEq = "If\\s+Name\\s*=\\s*\"(\\S+)\"\\s+Value\\s*=\\s*\"([\\S\\s]*)\""; - const string RegExIfDef = "IfDefined\\s+Name\\s*=\\s*\"(\\S+)\""; + const string RegExIfIn = "If\\s+Name\\s*=\\s*\"(\\S+)\"\\s+In\\s*=\\s*\"([\\S\\s]*)\""; + const string RegExIfEq = "If\\s+Name\\s*=\\s*\"(\\S+)\"\\s+Value\\s*=\\s*\"([\\S\\s]*)\""; + const string RegExIfDef = "IfDefined\\s+Name\\s*=\\s*\"(\\S+)\""; const string RegExIfNotDef = "IfNotDefined\\s+Name\\s*=\\s*\"(\\S+)\""; - Regex m_expIfIn = new Regex(RegExIfIn, RegexOptions.IgnoreCase); - Regex m_expIfEq = new Regex(RegExIfEq, RegexOptions.IgnoreCase); - Regex m_expIfDef = new Regex(RegExIfDef, RegexOptions.IgnoreCase); + Regex m_expIfIn = new Regex(RegExIfIn, RegexOptions.IgnoreCase); + Regex m_expIfEq = new Regex(RegExIfEq, RegexOptions.IgnoreCase); + Regex m_expIfDef = new Regex(RegExIfDef, RegexOptions.IgnoreCase); Regex m_expIfNotDef = new Regex(RegExIfNotDef, RegexOptions.IgnoreCase); - Hashtable m_execRegionOrderMap = new Hashtable(); + Hashtable m_execRegionOrderMap = new Hashtable(); Hashtable m_execRegionsToNavNode = new Hashtable(); //Hashtable m_symOrderMap = new Hashtable(); @@ -64,7 +64,7 @@ private object AddConditional(object owner, string conditional) cond.Value = m.Groups[2].Value; (owner.GetType().GetProperty(typeof(List).Name).GetValue(owner, null) as IList).Add(cond); - + ret = cond; } else if (m_expIfIn.IsMatch(conditional)) @@ -113,7 +113,7 @@ private ICollection CreateSortedList(IList list) { int order = 0; object val = o.GetType().GetProperty("Order").GetValue(o, null); - if(val != null) + if (val != null) { order = (int)val; } @@ -142,7 +142,7 @@ private object GetObjectFromProperty(object o, Type propType) private IList GetCollectionFromObject(object o, Type collectionType) { - foreach(PropertyInfo pi in o.GetType().GetProperties()) + foreach (PropertyInfo pi in o.GetType().GetProperties()) { if (pi.PropertyType == collectionType) { @@ -384,12 +384,12 @@ private void WriteNextNode(XmlWriter writer, XPathNavigator nav, bool iterateSib enum MemberPrecidence : int { - Unknown = -1, + Unknown = -1, ErrorMember = 0, - EnvMember = 1, - SetMember = 2, - LoadRegion = 3, - ExecRegion = 3, + EnvMember = 1, + SetMember = 2, + LoadRegion = 3, + ExecRegion = 3, FileMapping = 3, }; @@ -411,17 +411,17 @@ private string GetConditionalValue(object cond) { string ret = ""; - If ifCond = cond as If; - IfDefined ifDef = cond as IfDefined; + If ifCond = cond as If; + IfDefined ifDef = cond as IfDefined; IfNotDefined ifNotDef = cond as IfNotDefined; if (ifCond != null) { - if(ifCond.In != null) + if (ifCond.In != null) { ret = string.Format(IfInFormat, ifCond.Name, ifCond.In); } - else if(ifCond.Value != null) + else if (ifCond.Value != null) { ret = string.Format(IfEqFormat, ifCond.Name, ifCond.Value); } @@ -498,7 +498,7 @@ private MemberPrecidence LoadScatterElements(object owner, object conditional, L region.Address = lr.Base; region.Options = lr.Options; region.Size = lr.Size; -// region.Order = regionSet.Count; + // region.Order = regionSet.Count; region.Conditional = GetConditionalValue(conditional); regionSet.Add(region); @@ -517,11 +517,11 @@ private MemberPrecidence LoadScatterElements(object owner, object conditional, L foreach (ExecRegion er in erCollection) { MemorySection section = new MemorySection(); - section.Name = er.Name; - section.Address = er.Base; - section.Options = er.Options; - section.Size = er.Size; - section.Order = (int)m_execRegionOrderMap[(owner as MemoryRegion).Name + ":" + er.Name]; + section.Name = er.Name; + section.Address = er.Base; + section.Options = er.Options; + section.Size = er.Size; + section.Order = (int)m_execRegionOrderMap[(owner as MemoryRegion).Name + ":" + er.Name]; section.Conditional = GetConditionalValue(conditional); sectionSet.Add(section); @@ -541,8 +541,8 @@ private MemberPrecidence LoadScatterElements(object owner, object conditional, L foreach (FileMapping fm in fileCollection) { MemorySymbol sym = new MemorySymbol(); - sym.Name = fm.Name; - sym.Options = fm.Options; + sym.Name = fm.Name; + sym.Options = fm.Options; sym.Conditional = GetConditionalValue(conditional); symSet.Add(sym); @@ -562,7 +562,7 @@ private MemberPrecidence LoadScatterElements(object owner, object conditional, L EnvVars envSet = null; // conditional belongs to the map if we have a load region in this conditional - if(conditionalStack.Count == 0) + if (conditionalStack.Count == 0) { envSet = FindMatchingSet(envSets, "Global"); @@ -579,9 +579,9 @@ private MemberPrecidence LoadScatterElements(object owner, object conditional, L { object cond = conditionalStack[i]; - if (i == (conditionalStack.Count-1) && owner is MemoryMap && ret >= MemberPrecidence.LoadRegion) + if (i == (conditionalStack.Count - 1) && owner is MemoryMap && ret >= MemberPrecidence.LoadRegion) { - ((MemoryMap)owner).Name = GetConditionalName(conditional); + ((MemoryMap)owner).Name = GetConditionalName(conditional); ((MemoryMap)owner).Conditional = GetConditionalValue(conditional); } else diff --git a/CLR/Tools/PlatformDesigner/PlatformDesigner.sln b/CLR/Tools/PlatformDesigner/PlatformDesigner.sln index a03eea4b1..bf1a5305f 100644 --- a/CLR/Tools/PlatformDesigner/PlatformDesigner.sln +++ b/CLR/Tools/PlatformDesigner/PlatformDesigner.sln @@ -1,5 +1,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentBuilder", "ComponentBuilder\ComponentBuilder.csproj", "{AB5C04D8-DDE9-4AAA-831E-C51F5EACB612}" ProjectSection(ProjectDependencies) = postProject {E0580777-E882-46C9-82B5-947D7A69586A} = {E0580777-E882-46C9-82B5-947D7A69586A} diff --git a/DeviceCode/pal/graphics/graphics.cpp b/DeviceCode/pal/graphics/graphics.cpp index 20ffb3f3f..42162184a 100644 --- a/DeviceCode/pal/graphics/graphics.cpp +++ b/DeviceCode/pal/graphics/graphics.cpp @@ -1144,7 +1144,7 @@ UINT32* Graphics_Driver::ComputePosition( const PAL_GFX_Bitmap& bitmap, int x, i { NATIVE_PROFILE_PAL_GRAPHICS(); -#if !defined(BIG_ENDIAN) +#if !defined(NETMF_TARGET_BIG_ENDIAN) shift = (x % 2) * 16; mask = 0x0000FFFF << shift; #else From 3059af03581893bb7e9f5c8e4627b4441cdc5278 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Thu, 25 Aug 2016 18:55:19 +0100 Subject: [PATCH 137/144] Added STM32F429IDISCOVERY solution from https://github.com/NETMF/netmf-interpreter --- .../Blockstorage/STM32F4/STM32F4_BlConfig.cpp | 200 +++++ .../Blockstorage/STM32F4/dotNetMF.proj | 45 ++ .../Blockstorage/addDevices/Bl_addDevices.cpp | 27 + .../Blockstorage/addDevices/dotNetMF.proj | 45 ++ .../DeviceCode/Blockstorage/dotNetMF.proj | 17 + .../DeviceCode/Init/IO_Init.cpp | 105 +++ .../DeviceCode/Init/dotNetMF.proj | 36 + .../DeviceCode/Initialization/MasterConfig.h | 23 + .../OEM_Model_SKU_NetworkID.cpp | 212 +++++ .../DeviceCode/Initialization/SystemState.cpp | 48 ++ .../DeviceCode/Initialization/dotNetMF.proj | 61 ++ .../Initialization/dotNetMF_loader.proj | 63 ++ .../DeviceCode/Initialization/tinyhal.cpp | 760 ++++++++++++++++++ .../DeviceCode/USB/dotNetMF.proj | 47 ++ .../DeviceCode/USB/usb_config.cpp | 281 +++++++ .../STM32F429IDISCOVERY.settings | 27 + .../TinyBooter/TinyBooter.proj | 274 +++++++ .../TinyBooter/TinyBooterEntry.cpp | 280 +++++++ .../TinyBooter/allocator.cpp | 43 + .../TinyBooter/scatterfile_bootloader_gcc.xml | 173 ++++ .../TinyBooter/scatterfile_bootloader_mdk.xml | 125 +++ .../TinyCLR/GNU_S/tinyclr_dat.s | 16 + .../TinyCLR/RVD_S/tinyclr_dat.s | 21 + .../STM32F429IDISCOVERY/TinyCLR/TinyCLR.proj | 429 ++++++++++ .../STM32F429IDISCOVERY/TinyCLR/allocator.cpp | 31 + .../TinyCLR/scatterfile_tinyclr_gcc.xml | 183 +++++ .../TinyCLR/scatterfile_tinyclr_mdk.xml | 147 ++++ .../STM32F429IDISCOVERY/TinyCLR/tinyclr.cpp | 43 + Solutions/STM32F429IDISCOVERY/dotnetmf.proj | 14 + .../STM32F429IDISCOVERY/platform_selector.h | 150 ++++ .../scatterfile_gcc_missing_symbols.xml | 18 + 31 files changed, 3944 insertions(+) create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/STM32F4_BlConfig.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/dotNetMF.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/dotNetMF.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/dotNetMF.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Init/IO_Init.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Init/dotNetMF.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/MasterConfig.h create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/SystemState.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/tinyhal.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/USB/dotNetMF.proj create mode 100644 Solutions/STM32F429IDISCOVERY/DeviceCode/USB/usb_config.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/STM32F429IDISCOVERY.settings create mode 100644 Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooter.proj create mode 100644 Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooterEntry.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/TinyBooter/allocator.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml create mode 100644 Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_mdk.xml create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/GNU_S/tinyclr_dat.s create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/RVD_S/tinyclr_dat.s create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/TinyCLR.proj create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/allocator.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_mdk.xml create mode 100644 Solutions/STM32F429IDISCOVERY/TinyCLR/tinyclr.cpp create mode 100644 Solutions/STM32F429IDISCOVERY/dotnetmf.proj create mode 100644 Solutions/STM32F429IDISCOVERY/platform_selector.h create mode 100644 Solutions/STM32F429IDISCOVERY/scatterfile_gcc_missing_symbols.xml diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/STM32F4_BlConfig.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/STM32F4_BlConfig.cpp new file mode 100644 index 000000000..a258d8444 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/STM32F4_BlConfig.cpp @@ -0,0 +1,200 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. +// +// *** STM32F429IDISCOVERY Block Storage Configuration *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +#define FLASH_MANUFACTURER_CODE 0x0000 // not used +#define FLASH_DEVICE_CODE 0x0000 // not used + +#define FLASH_BASE_ADDRESS1 0x08000000 // 4x 16KB +#define FLASH_BLOCK_COUNT1 4 +#define FLASH_BYTES_PER_BLOCK1 0x04000 +#define FLASH_BASE_ADDRESS2 0x08010000 // 1x 64KB +#define FLASH_BLOCK_COUNT2 1 +#define FLASH_BYTES_PER_BLOCK2 0x10000 +#define FLASH_BASE_ADDRESS3 0x08020000 // 7x 128KB +#define FLASH_BLOCK_COUNT3 7 +#define FLASH_BYTES_PER_BLOCK3 0x20000 +#define FLASH_BASE_ADDRESS4 0x08100000 // 4x 16KB +#define FLASH_BLOCK_COUNT4 4 +#define FLASH_BYTES_PER_BLOCK4 0x04000 +#define FLASH_BASE_ADDRESS5 0x08110000 // 1x 64KB +#define FLASH_BLOCK_COUNT5 1 +#define FLASH_BYTES_PER_BLOCK5 0x10000 +#define FLASH_BASE_ADDRESS6 0x08120000 // 7x 128KB +#define FLASH_BLOCK_COUNT6 7 +#define FLASH_BYTES_PER_BLOCK6 0x20000 + +#define FLASH_BYTES_PER_SECTOR 2 +#define FLASH_BLOCK_ERASE_TYPICAL_TIME_USEC 1000000 // not used +#define FLASH_SECTOR_WRITE_TYPICAL_TIME_USEC 10 // not used +#define FLASH_BLOCK_ERASE_MAX_TIME_USEC 4000000 // not used +#define FLASH_SECTOR_WRITE_MAX_TIME_USEC 100 // not used +#define FLASH_BLOCK_ERASE_ACTUAL_TIME_USEC 10000 // not used + +// EBIU Information + +#define STM32F4__CHIP_SELECT 0 +#define STM32F4__WAIT_STATES 5 // not used +#define STM32F4__RELEASE_COUNTS 0 +#define STM32F4__BIT_WIDTH 16 +#define STM32F4__BASE_ADDRESS 0x08000000 +#define STM32F4__SIZE_IN_BYTES 0x00100000 +#define STM32F4__WP_GPIO_PIN GPIO_PIN_NONE +#define STM32F4__WP_ACTIVE FALSE + +// BlockDeviceInformation + +#define STM32F4__IS_REMOVABLE FALSE +#define STM32F4__SUPPORTS_XIP TRUE +#define STM32F4__WRITE_PROTECTED FALSE +#define STM32F4__SUPP_COPY_BACK FALSE +#define STM32F4__NUM_REGIONS 6 + + + +//--// + + +const BlockRange g_STM32F4_BlockRange1[] = +{ + { BlockRange::BLOCKTYPE_BOOTSTRAP , 0, 2 }, // 08000000 bootloader 48k + { BlockRange::BLOCKTYPE_CONFIG , 3, 3 }, // 0800C000 config 16k +}; + +const BlockRange g_STM32F4_BlockRange2[] = +{ + { BlockRange::BLOCKTYPE_CODE , 0, 0 }, // 08010000 CLR 64k +}; + +const BlockRange g_STM32F4_BlockRange3[] = +{ + { BlockRange::BLOCKTYPE_CODE , 0, 6 }, // 08020000 CLR 896k +}; + +const BlockRange g_STM32F4_BlockRange4[] = +{ + { BlockRange::BLOCKTYPE_DEPLOYMENT, 0, 3 }, // 08100000 deployment 64k +}; + +const BlockRange g_STM32F4_BlockRange5[] = +{ + { BlockRange::BLOCKTYPE_DEPLOYMENT, 0, 0 }, // 08110000 deployment 64k +}; + +const BlockRange g_STM32F4_BlockRange6[] = +{ + { BlockRange::BLOCKTYPE_DEPLOYMENT, 0, 6 }, // 08120000 deployment 896k + //{ BlockRange::BLOCKTYPE_UPDATE, 3, 6 }, +}; + + +const BlockRegionInfo g_STM32F4_BlkRegion[STM32F4__NUM_REGIONS] = +{ + { + FLASH_BASE_ADDRESS1, // ByteAddress Start; // Starting Sector address + FLASH_BLOCK_COUNT1, // UINT32 NumBlocks; // total number of blocks in this region + FLASH_BYTES_PER_BLOCK1, // UINT32 BytesPerBlock; // Total number of bytes per block + ARRAYSIZE_CONST_EXPR(g_STM32F4_BlockRange1), + g_STM32F4_BlockRange1, + }, + + { + FLASH_BASE_ADDRESS2, // ByteAddress Start; // Starting Sector address + FLASH_BLOCK_COUNT2, // UINT32 NumBlocks; // total number of blocks in this region + FLASH_BYTES_PER_BLOCK2, // UINT32 BytesPerBlock; // Total number of bytes per block + ARRAYSIZE_CONST_EXPR(g_STM32F4_BlockRange2), + g_STM32F4_BlockRange2, + }, + + { + FLASH_BASE_ADDRESS3, // ByteAddress Start; // Starting Sector address + FLASH_BLOCK_COUNT3, // UINT32 NumBlocks; // total number of blocks in this region + FLASH_BYTES_PER_BLOCK3, // UINT32 BytesPerBlock; // Total number of bytes per block + ARRAYSIZE_CONST_EXPR(g_STM32F4_BlockRange3), + g_STM32F4_BlockRange3, + }, + { + FLASH_BASE_ADDRESS4, // ByteAddress Start; // Starting Sector address + FLASH_BLOCK_COUNT4, // UINT32 NumBlocks; // total number of blocks in this region + FLASH_BYTES_PER_BLOCK4, // UINT32 BytesPerBlock; // Total number of bytes per block + ARRAYSIZE_CONST_EXPR(g_STM32F4_BlockRange4), + g_STM32F4_BlockRange4, + }, + + { + FLASH_BASE_ADDRESS5, // ByteAddress Start; // Starting Sector address + FLASH_BLOCK_COUNT5, // UINT32 NumBlocks; // total number of blocks in this region + FLASH_BYTES_PER_BLOCK5, // UINT32 BytesPerBlock; // Total number of bytes per block + ARRAYSIZE_CONST_EXPR(g_STM32F4_BlockRange5), + g_STM32F4_BlockRange5, + }, + + { + FLASH_BASE_ADDRESS6, // ByteAddress Start; // Starting Sector address + FLASH_BLOCK_COUNT6, // UINT32 NumBlocks; // total number of blocks in this region + FLASH_BYTES_PER_BLOCK6, // UINT32 BytesPerBlock; // Total number of bytes per block + ARRAYSIZE_CONST_EXPR(g_STM32F4_BlockRange6), + g_STM32F4_BlockRange6, + } +}; + +const BlockDeviceInfo g_STM32F4_DeviceInfo= +{ + { + STM32F4__IS_REMOVABLE, // BOOL Removable; + STM32F4__SUPPORTS_XIP, // BOOL SupportsXIP; + STM32F4__WRITE_PROTECTED, // BOOL WriteProtected; + STM32F4__SUPP_COPY_BACK // BOOL SupportsCopyBack + }, + FLASH_SECTOR_WRITE_TYPICAL_TIME_USEC, // UINT32 MaxSectorWrite_uSec; + FLASH_BLOCK_ERASE_ACTUAL_TIME_USEC, // UINT32 MaxBlockErase_uSec; + FLASH_BYTES_PER_SECTOR, // UINT32 BytesPerSector; + + FLASH_MEMORY_Size, // UINT32 Size; + + STM32F4__NUM_REGIONS, // UINT32 NumRegions; + g_STM32F4_BlkRegion, // const BlockRegionInfo* pRegions; +}; + +struct MEMORY_MAPPED_NOR_BLOCK_CONFIG g_STM32F4_BS_Config = +{ + { // BLOCK_CONFIG + { + STM32F4__WP_GPIO_PIN, // GPIO_PIN Pin; + STM32F4__WP_ACTIVE, // BOOL ActiveState; + }, + + &g_STM32F4_DeviceInfo, // BlockDeviceinfo + }, + + { // CPU_MEMORY_CONFIG + STM32F4__CHIP_SELECT, // UINT8 CPU_MEMORY_CONFIG::ChipSelect; + TRUE, // UINT8 CPU_MEMORY_CONFIG::ReadOnly; + STM32F4__WAIT_STATES, // UINT32 CPU_MEMORY_CONFIG::WaitStates; + STM32F4__RELEASE_COUNTS, // UINT32 CPU_MEMORY_CONFIG::ReleaseCounts; + STM32F4__BIT_WIDTH, // UINT32 CPU_MEMORY_CONFIG::BitWidth; + STM32F4__BASE_ADDRESS, // UINT32 CPU_MEMORY_CONFIG::BaseAddress; + STM32F4__SIZE_IN_BYTES, // UINT32 CPU_MEMORY_CONFIG::SizeInBytes; + 0, // UINT8 CPU_MEMORY_CONFIG::XREADYEnable + 0, // UINT8 CPU_MEMORY_CONFIG::ByteSignalsForRead + 0, // UINT8 CPU_MEMORY_CONFIG::ExternalBufferEnable + }, + + 0, // UINT32 ChipProtection; + FLASH_MANUFACTURER_CODE, // UINT32 ManufacturerCode; + FLASH_DEVICE_CODE, // UINT32 DeviceCode; +}; + +struct BlockStorageDevice g_STM32F4_BS; + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/dotNetMF.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/dotNetMF.proj new file mode 100644 index 000000000..22a7c52d5 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/STM32F4/dotNetMF.proj @@ -0,0 +1,45 @@ + + + STM32F4_blconfig_STM32F429IDISCOVERY + + + {9DF67033-DC20-426A-B499-2A600BE0E134} + Block storage configuration for STM32F429IDISCOVERY + HAL + STM32F4_blconfig_STM32F429IDISCOVERY.$(LIB_EXT) + $(MSBuildThisFileFullPath) + STM32F4_blconfig_STM32F429IDISCOVERY.$(LIB_EXT).manifest + Solutions\STM32F429IDISCOVERY + + + + 4 + 0 + 0 + 0 + + 2009-08-12 + + LibraryCategory + + + + + False + STM32F429IDISCOVERY + False + False + False + Solutions\STM32F429IDISCOVERY\DeviceCode\BlockStorage\STM32F4 + Library + false + 4.0.0.0 + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp new file mode 100644 index 000000000..3018ea0df --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/Bl_addDevices.cpp @@ -0,0 +1,27 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. +// +// *** STM32F429IDISCOVERY Block Storage AddDevice Configuration *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + + +extern struct BlockStorageDevice g_STM32F4_BS; +extern struct IBlockStorageDevice g_STM32F4_Flash_DeviceTable; +extern struct BLOCK_CONFIG g_STM32F4_BS_Config; + + + +void BlockStorage_AddDevices() +{ + BlockStorageList::AddDevice( &g_STM32F4_BS, &g_STM32F4_Flash_DeviceTable, &g_STM32F4_BS_Config, FALSE ); +} + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/dotNetMF.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/dotNetMF.proj new file mode 100644 index 000000000..7ed17c96e --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/addDevices/dotNetMF.proj @@ -0,0 +1,45 @@ + + + BlockStorage_AddDevices_STM32F429IDISCOVERY + + + {A3E9B868-E484-4A15-B4CC-6CEFB50352B1} + Block storage add device driver for STM32F429IDISCOVERY + HAL + BlockStorage_AddDevices_STM32F429IDISCOVERY.$(LIB_EXT) + $(MSBuildThisFileFullPath) + BlockStorage_AddDevices_STM32F429IDISCOVERY.$(LIB_EXT).manifest + Solutions\STM32F429IDISCOVERY + + + + 4 + 0 + 0 + 0 + + 2009-08-12 + + LibraryCategory + + + + + False + STM32F429IDISCOVERY + False + False + False + Solutions\STM32F429IDISCOVERY\DeviceCode\BlockStorage\AddDevices + Library + false + 4.0.0.0 + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/dotNetMF.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/dotNetMF.proj new file mode 100644 index 000000000..1092d144e --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Blockstorage/dotNetMF.proj @@ -0,0 +1,17 @@ + + + + Solutions\STM32F429IDISCOVERY\DeviceCode\BlockStorage + + + + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Init/IO_Init.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/Init/IO_Init.cpp new file mode 100644 index 000000000..a71cea48d --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Init/IO_Init.cpp @@ -0,0 +1,105 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. +// +// *** STM32F429IDISCOVERY Board specific IO Port Initialization *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include "..\..\..\..\DeviceCode\Targets\Native\STM32F4\DeviceCode\stm32f4xx.h" + +// Define the generic port table, only one generic extensionn port type supported +// and that is the ITM hardware trace port on Channel 0. +extern GenericPortTableEntry const Itm0GenericPort; +extern GenericPortTableEntry const* const g_GenericPorts[TOTAL_GENERIC_PORTS] = { &Itm0GenericPort }; + +// Workaround, since CPU_GPIO_DisablePin() does not correctly initialize pin speeds +extern void STM32F4_GPIO_Pin_Config(GPIO_PIN pin, UINT32 mode, GPIO_RESISTOR resistor, UINT32 alternate); + + +///////////////////////////////////////////////////////////////////////////// +// IS42S16400J 64Mb (1M x 16 x 4 bits) + +void __section("SectionForBootstrapOperations") InitSram() +{ + // FMC - 429, vs. FMSC - 40x only + + RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN; + +//#if defined (STM32F427_437xx) || defined (STM32F429_439xx) +//#define RCC_AHB3ENR_FMCEN ((uint32_t)0x00000001) +//#endif /* STM32F427_437xx || STM32F429_439xx */ + + + /* Setup SRAM control register*/ + //sram_fsmc_bcr1 |= FSMC_BCR1_MWID_0; /* 16-bit data bus */ + //sram_fsmc_bcr1 |= FSMC_BCR1_WREN; /* Write enable */ + // + //FSMC_Bank1->BTCR[4] = sram_fsmc_bcr1; + // + ///* Setup SRAM timing register*/ + //sram_fsmc_btr1 |= 0x02 << 0; /* Address setup phase duration should be >8nS. With the value set to 0x02 and a 168Mhz clock, the duration becomes 11.9nS */ + //sram_fsmc_btr1 |= 0x01 << 8; /* Data-phase duration should be >8nS. With the value set to 0x01 and a 168Mhz clock, the duration becomes 11.9nS */ + // + //FSMC_Bank1->BTCR[5] = sram_fsmc_btr1; + // + ///* Enable memory bank 3 for SRAM*/ + //FSMC_Bank1->BTCR[4] |= FSMC_BCR1_MBKEN; +} + +void __section("SectionForBootstrapOperations") BootstrapCode_GPIO() +{ + // GPIO pins connected to SRAM + const BYTE pins[] = { + // PB5, 6 + PORT_PIN(GPIO_PORTB, 5), PORT_PIN(GPIO_PORTB, 6), + // PC0 + PORT_PIN(GPIO_PORTC, 0), + // PD0, 1, 8-10, 14, 15 + PORT_PIN(GPIO_PORTD, 0), PORT_PIN(GPIO_PORTD, 1), PORT_PIN(GPIO_PORTD, 8), PORT_PIN(GPIO_PORTD, 9), + PORT_PIN(GPIO_PORTD, 10), PORT_PIN(GPIO_PORTD, 14), PORT_PIN(GPIO_PORTD, 15), + // PE0, 1, 7-15 + PORT_PIN(GPIO_PORTE, 0), PORT_PIN(GPIO_PORTE, 1), PORT_PIN(GPIO_PORTE, 7), PORT_PIN(GPIO_PORTE, 8), + PORT_PIN(GPIO_PORTE, 9), PORT_PIN(GPIO_PORTE, 10), PORT_PIN(GPIO_PORTE, 11), PORT_PIN(GPIO_PORTE, 12), + PORT_PIN(GPIO_PORTE, 13), PORT_PIN(GPIO_PORTE, 14), PORT_PIN(GPIO_PORTE, 15), + // PF0-5, 11-15 + PORT_PIN(GPIO_PORTF, 0), PORT_PIN(GPIO_PORTF, 1), PORT_PIN(GPIO_PORTF, 2), PORT_PIN(GPIO_PORTF, 3), + PORT_PIN(GPIO_PORTF, 4), PORT_PIN(GPIO_PORTF, 5), PORT_PIN(GPIO_PORTF, 11), PORT_PIN(GPIO_PORTF, 12), + PORT_PIN(GPIO_PORTF, 13), PORT_PIN(GPIO_PORTF, 14), PORT_PIN(GPIO_PORTF, 15), + // PG0, 1, 4, 5, 8, 15 + PORT_PIN(GPIO_PORTG, 0), PORT_PIN(GPIO_PORTG, 1), PORT_PIN(GPIO_PORTG, 4), PORT_PIN(GPIO_PORTG, 5), + PORT_PIN(GPIO_PORTG, 8), PORT_PIN(GPIO_PORTG, 15) + }; + + // Enable GPIO clocks for ports A - G + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN + | RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN + | RCC_AHB1ENR_GPIOGEN; + + // Initialize SRAM pins + for(int i = 0; i < ARRAYSIZE(pins); i++) + { + const uint32_t pinConfig = 0x3C2; // Speed 100Mhz, AF12 FSMC, Alternate Mode + const uint32_t pinMode = pinConfig & 0xF; + const GPIO_ALT_MODE alternateMode = (GPIO_ALT_MODE)pinConfig; + const GPIO_RESISTOR resistorConfig = RESISTOR_PULLUP; + + // TODO: Why RESISTOR_PULLUP? Why not disabled? + + CPU_GPIO_ReservePin(pins[i], TRUE); + CPU_GPIO_DisablePin(pins[i], resistorConfig, 0, alternateMode); + STM32F4_GPIO_Pin_Config(pins[i], pinMode, resistorConfig, pinConfig); // Workaround, since CPU_GPIO_DisablePin() does not correctly initialize pin speeds + } + + InitSram(); + + // TODO: Restore at the end of bootloader? + CPU_GPIO_EnableOutputPin(LED3, FALSE); + CPU_GPIO_EnableOutputPin(LED4, FALSE); +} diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Init/dotNetMF.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/Init/dotNetMF.proj new file mode 100644 index 000000000..22f285813 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Init/dotNetMF.proj @@ -0,0 +1,36 @@ + + + $(MSBuildThisFileFullPath) + IO_Init_STM32F429IDISCOVERY + + + {425406B0-06AF-450F-B5E3-C650078FA643} + IO port initialization for STM32F429IDISCOVERY solution + HAL + IO_Init_STM32F429IDISCOVERY.$(LIB_EXT) + IO_Init_STM32F429IDISCOVERY.$(LIB_EXT).manifest + Solutions\STM32F429IDISCOVERY + + + + + False + + + False + False + False + Solutions\STM32F429IDISCOVERY\DeviceCode\Init + Library + false + 4.0.0.0 + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/MasterConfig.h b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/MasterConfig.h new file mode 100644 index 000000000..d4ce06bf0 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/MasterConfig.h @@ -0,0 +1,23 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//--// + +#ifndef _MASTER_CONFIG_H_ +#define _MASTER_CONFIG_H_ 1 + +//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// + +#include + +//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// + +#define NUM_DEBUGGERS 1 +#define NUM_MESSAGING 1 + +#define DEBUGGER_PORT_INDEX 0 + +//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--// + +#endif // _MASTER_CONFIG_H_ diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp new file mode 100644 index 000000000..19fecc373 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/OEM_Model_SKU_NetworkID.cpp @@ -0,0 +1,212 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +HAL_SYSTEM_CONFIG HalSystemConfig = +{ + { TRUE }, // HAL_DRIVER_CONFIG_HEADER Header; + { DEBUGGER_PORT }, // UINT32 DebuggerPorts[MAX_DEBUGGERS]; + { MESSAGING_PORT }, // UINT32 MessagingPorts[MAX_MESSAGING]; + DEBUG_TEXT_PORT, // UINT32 DebugTextPort; + 115200, // UINT32 USART_DefaultBaudRate; + STDIO, // FILE* stdio; + { SRAM1_MEMORY_Base, SRAM1_MEMORY_Size }, // HAL_SYSTEM_MEMORY_CONFIG RAM1; + { FLASH_MEMORY_Base, FLASH_MEMORY_Size }, // HAL_SYSTEM_MEMORY_CONFIG FLASH; +}; + +/***************************************************************************/ + +const char HalName[] = HAL_SYSTEM_NAME; + +OEM_MODEL_SKU OEM_Model_SKU; + +#define OEM_ALL 0 +#define OEM_MS 0xFF + +#pragma arm section rodata = "SectionForConfig" + +const ConfigurationSector __section("SectionForConfig") g_ConfigurationSector = +{ + // ConfigurationLength + offsetof(ConfigurationSector, FirstConfigBlock), + + //CONFIG_SECTOR_VERSION + { + ConfigurationSector::c_CurrentVersionMajor, + ConfigurationSector::c_CurrentVersionMinor, + ConfigurationSector::c_CurrentVersionTinyBooter, + 0, // extra + }, + + // backwards compatibility buffer (88 bytes to put booterflagarray at offset 96) + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + }, + + // BooterFlagArray - determines if we enter the tinybooter or not + { + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + }, + + // UINT32 SectorSignatureCheck[9*8]; // 287 sectors max * 8 changes before erase + { + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, + }, + + //TINYBOOTER_KEY_CONFIG DeploymentKey = + { + {// ODM key configuration for programming firmware (non deployment sectors) + { // ODM public key for firware sectors + // exponent length + 0xFF,0xFF,0xFF, 0xFF, + + // module + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // exponent + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + } + }, + {// OEM key configuration for programming Deployment sector + { // OEM public key for Deployment sector + // exponent length + 0xFF,0xFF,0xFF, 0xFF, + + // module + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // exponent + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + } + } + }, + + // OEM_MODEL_SKU OEM_Model_SKU; + { + OEM_MS, // UINT8 OEM; + 0, // UINT8 Model; + 0xFFFF, // UINT16 SKU; + }, + + // OEM_SERIAL_NUMBERS OemSerialNumbers + { + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // UINT8 module_serial_number[32]; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }, + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, } // UINT8 system_serial_number[16]; + }, + + // CLR Config Data + { + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + }, + + // HAL_CONFIG_BLOCK FirstConfigBlock; + { + HAL_CONFIG_BLOCK::c_Version_V2, // UINT32 Signature; + 0x8833794c, // UINT32 HeaderCRC; + 0x00000000, // UINT32 DataCRC; + 0x00000000, // UINT32 Size; + // char DriverName[64]; + }, +}; +#pragma arm section rodata diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/SystemState.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/SystemState.cpp new file mode 100644 index 000000000..3b16d355c --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/SystemState.cpp @@ -0,0 +1,48 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing +// permissions and limitations under the License. +// +#include + +volatile INT32 SystemStates[SYSTEM_STATE_TOTAL_STATES]; + +void SystemState_SetNoLock( SYSTEM_STATE State ) +{ + InterlockedIncrement( &SystemStates[State] ); +} + +void SystemState_ClearNoLock( SYSTEM_STATE State ) +{ + InterlockedDecrement( &SystemStates[State] ); +} + +BOOL SystemState_QueryNoLock( SYSTEM_STATE State ) +{ + return (SystemStates[State] > 0) ? TRUE : FALSE; +} + +// since the no-lock versions are now using InterlockedXXX +// there is no reason to distinguish between locked or unlocked +void SystemState_Set( SYSTEM_STATE State ) +{ + SystemState_SetNoLock( State ); +} + +void SystemState_Clear( SYSTEM_STATE State ) +{ + SystemState_ClearNoLock( State ); +} + +BOOL SystemState_Query( SYSTEM_STATE State ) +{ + return SystemState_QueryNoLock( State ); +} diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF.proj new file mode 100644 index 000000000..d81a4f2c7 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF.proj @@ -0,0 +1,61 @@ + + + + STM32F429IDISCOVERY_initialization_hal + {F9CBA879-3388-47DF-A5F5-841005890135} + + + System initialization library for STM32F429IDISCOVERY + HAL + STM32F429IDISCOVERY_initialization_hal.$(LIB_EXT) + $(MSBuildThisFileFullPath) + STM32F429IDISCOVERY_initialization_hal.$(LIB_EXT).manifest + System + + + + 4 + 0 + 0 + 0 + + 2009-04-30 + + LibraryCategory + + + + + False + + + False + False + False + DeviceCode\Targets\Native\STM32F4\DeviceCode\Initialization + false + 4.0.0.0 + + + + + + + + + + + + + + + Library + + + + + + + + + \ No newline at end of file diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj new file mode 100644 index 000000000..ad8277939 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/dotNetMF_loader.proj @@ -0,0 +1,63 @@ + + + + STM32F429IDISCOVERY_initialization_hal_loader + {2EC0E622-7818-4E83-8B20-C6C4899AD278} + + + System initialization library for STM32F429IDISCOVERY (for boot loaders) + HAL + STM32F429IDISCOVERY_initialization_hal_loader.$(LIB_EXT) + $(MSBuildThisFileFullPath) + STM32F429IDISCOVERY_initialization_hal_loader.$(LIB_EXT).manifest + System + + + + 4 + 0 + 0 + 0 + + 2009-04-30 + + LibraryCategory + + + + + False + + + False + False + False + DeviceCode\Targets\Native\STM32F4\DeviceCode\Initialization\reducesize + true + false + 4.0.0.0 + + + + + + + + + + + + + + + + Library + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/tinyhal.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/tinyhal.cpp new file mode 100644 index 000000000..a81e9ebdf --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/Initialization/tinyhal.cpp @@ -0,0 +1,760 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing +// permissions and limitations under the License. +// +#include +#include "stm32f4xx.h" + +#if defined(PLATFORM_ARM_OS_PORT) +#include +#include +#endif + +#undef TRACE_ALWAYS +#define TRACE_ALWAYS 0x00000001 + +#undef DEBUG_TRACE +#define DEBUG_TRACE (TRACE_ALWAYS) +// these define the region to zero initialize +extern UINT32 Image$$ER_RAM_RW$$ZI$$Base; +extern UINT32 Image$$ER_RAM_RW$$ZI$$Length; + +// here is the execution address/length of code to move from FLASH to RAM +#define IMAGE_RAM_RO_BASE Image$$ER_RAM_RO$$Base +#define IMAGE_RAM_RO_LENGTH Image$$ER_RAM_RO$$Length + +extern UINT32 IMAGE_RAM_RO_BASE; +extern UINT32 IMAGE_RAM_RO_LENGTH; + +// here is the execution address/length of data to move from FLASH to RAM +extern UINT32 Image$$ER_RAM_RW$$Base; +extern UINT32 Image$$ER_RAM_RW$$Length; + +// here is the load address of the RAM code/data +#define LOAD_RAM_RO_BASE Load$$ER_RAM_RO$$Base + +extern UINT32 LOAD_RAM_RO_BASE; +extern UINT32 Load$$ER_RAM_RW$$Base; + +#if defined(TARGETLOCATION_RAM) + +extern UINT32 Load$$ER_RAM$$Base; +extern UINT32 Image$$ER_RAM$$Length; + +#elif defined(TARGETLOCATION_FLASH) + +extern UINT32 Load$$ER_FLASH$$Base; +extern UINT32 Image$$ER_FLASH$$Length; + +#else + !ERROR +#endif + +UINT32 LOAD_IMAGE_Start; +UINT32 LOAD_IMAGE_Length; +UINT32 LOAD_IMAGE_CalcCRC; + +#if defined(PLATFORM_ARM_OS_PORT) && defined(TCPIP_LWIP_OS) +extern UINT32 Load$$ER_LWIP_OS$$RW$$Base; +extern UINT32 Image$$ER_LWIP_OS$$RW$$Base; +extern UINT32 Image$$ER_LWIP_OS$$RW$$Length; +extern UINT32 Image$$ER_LWIP_OS$$ZI$$Base; +extern UINT32 Image$$ER_LWIP_OS$$ZI$$Length; +#endif + +#pragma arm section code = "SectionForBootstrapOperations" + +static void __section("SectionForBootstrapOperations") Prepare_Copy( UINT32* src, UINT32* dst, UINT32 len ) +{ + if(dst != src) + { + INT32 extraLen = len & 0x00000003; + len = len & 0xFFFFFFFC; + + while(len != 0) + { + *dst++ = *src++; + + len -= 4; + } + + // thumb2 code can be multiples of 2... + + UINT8 *dst8 = (UINT8*) dst, *src8 = (UINT8*) src; + + while (extraLen > 0) + { + *dst8++ = *src8++; + + extraLen--; + } + } +} + +static void __section("SectionForBootstrapOperations") Prepare_Zero( UINT32* dst, UINT32 len ) +{ + INT32 extraLen = len & 0x00000003; + len = len & 0xFFFFFFFC; + + while(len != 0) + { + *dst++ = 0; + + len -= 4; + } + + // thumb2 code can be multiples of 2... + + UINT8 *dst8 = (UINT8*) dst; + + while (extraLen > 0) + { + *dst8++ = 0; + + extraLen--; + } +} + +#if !defined(PLATFORM_ARM_OS_PORT) || defined(__GNUC__) +void __section("SectionForBootstrapOperations") PrepareImageRegions() +{ + // + // Copy RAM RO regions into proper location. + // + { + UINT32* src = (UINT32*)&LOAD_RAM_RO_BASE; + UINT32* dst = (UINT32*)&IMAGE_RAM_RO_BASE; + UINT32 len = (UINT32 )&IMAGE_RAM_RO_LENGTH; + + Prepare_Copy( src, dst, len ); + } + + // + // Copy RAM RW regions into proper location. + // + { + UINT32* src = (UINT32*)&Load$$ER_RAM_RW$$Base; + UINT32* dst = (UINT32*)&Image$$ER_RAM_RW$$Base; + UINT32 len = (UINT32)&Image$$ER_RAM_RW$$Length; + + Prepare_Copy( src, dst, len ); + } + + // + // Initialize RAM ZI regions. + // + { + UINT32* dst = (UINT32*)&Image$$ER_RAM_RW$$ZI$$Base; + UINT32 len = (UINT32 )&Image$$ER_RAM_RW$$ZI$$Length; + + Prepare_Zero( dst, len ); + } +} +#else +extern "C" void PrepareImageRegions() +{ + // This space intentionally left blank... 8^) + // + // The OS boot of CLR on CMSIS-RTX doesn't + // use this as it relies on the C/C++ runtime + // to handle initialization. However, to keep + // from adding more libraries or #if checks + // in code this is defined to allow normal + // linking with the same HAL libs used in a + // boot loader. +} +#endif + +#pragma arm section code + +//--// + +#if !defined(BUILD_RTM) +static UINT32 g_Boot_RAMConstants_CRC = 0; +#endif + +static ON_SOFT_REBOOT_HANDLER s_rebootHandlers[16] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + +void HAL_AddSoftRebootHandler(ON_SOFT_REBOOT_HANDLER handler) +{ + for(int i=0; iGetDeviceInfo(); + + ByteAddress configSectAddress; + UINT32 iRegion, iRange; + + pBlockDevice->FindForBlockUsage(BlockUsage::CONFIG, configSectAddress, iRegion, iRange ); + + // if non-XIP, load data + if (!deviceInfo->Attribute.SupportsXIP) + { + pBlockDevice->Read(configSectAddress, sizeof(ConfigurationSector), (BYTE*)&g_ConfigurationSector); + } + + + for(int i=0; !bDone && iAttribute.SupportsXIP) + { + + // will be either directly read from NOR + dataAddress = (volatile UINT32*)CPU_GetUncachableAddress(&pAddr[i]); + + // write directly + bRet = (TRUE == pBlockDevice->Write( (UINT32)dataAddress, sizeof(UINT32), (PBYTE)&c_Key, FALSE )); + } + else + { + // updated the g_ConfigurationSector with the latest value + // as the g_ConfigurationSector must be at the RAM area, so it should be ok to write to it. + + dataAddress =(volatile UINT32 *) &(g_ConfigurationSector.BooterFlagArray[i]); + (*dataAddress) = c_Key; + + // write back to sector, as we only change one bit from 0 to 1, no need to erase sector + bRet = (TRUE == pBlockDevice->Write( configSectAddress, sizeof(ConfigurationSector), (BYTE*)&g_ConfigurationSector, FALSE )); + + } + + bDone = true; + break; + + case ConfigurationSector::c_BootEntryKey: // looks like we already have a key set + bDone = true; + break; + } + } + + if(!bDone) // we must be full, so rewrite sector + { + // reading whole block, not just the configurationsector + const BlockRegionInfo * pBlockRegionInfo = &deviceInfo->Regions[iRegion]; + + ::Watchdog_ResetCounter(); + + BYTE *data = (BYTE*) private_malloc(pBlockRegionInfo->BytesPerBlock); + + if(data != NULL) + { + ConfigurationSector *pCfg; + + if(deviceInfo->Attribute.SupportsXIP) + { + memcpy(data, (void*)configSectAddress, pBlockRegionInfo->BytesPerBlock); + } + else + { + pBlockDevice->Read(configSectAddress, pBlockRegionInfo->BytesPerBlock, data); + } + + pCfg = (ConfigurationSector *)data; + memset( (void*)&pCfg->BooterFlagArray[0], 0xFF, sizeof(pCfg->BooterFlagArray) ); + + // updated the g_ConfigurationSector with the latest value + // as the g_ConfigurationSector must be at the RAM area, so it should be ok to write to it. + pCfg->BooterFlagArray[0] = c_Key; + + pBlockDevice->EraseBlock(configSectAddress); + + ::Watchdog_ResetCounter(); + + // write back to sector, as we only change one bit from 0 to 1, no need to erase sector + bRet = (TRUE == pBlockDevice->Write( configSectAddress, pBlockRegionInfo->BytesPerBlock, data, FALSE )); + + private_free(data); + } + } + + CPU_Reset(); + } +} + +bool g_fDoNotUninitializeDebuggerPort = false; + +void HAL_Initialize() +{ +#if defined(PLATFORM_ARM_OS_PORT) + // Interrupts must be enabled to handle calls to OS + // (Network stack uses the CMSIS-RTX OS, which uses + // SVC calls, which will hard fault if the interrupts + // are disabled at the Svc instruction ) + // SystemInit handles this for the startup from reset + // However, this is also called from the CLR when doing + // a soft reboot. + __enable_irq(); +#endif + + HAL_CONTINUATION::InitializeList(); + HAL_COMPLETION ::InitializeList(); + + HAL_Init_Custom_Heap(); + + Time_Initialize(); + Events_Initialize(); + + CPU_GPIO_Initialize(); + CPU_SPI_Initialize(); + +#if !defined(PLATFORM_ARM_OS_PORT) + // this is the place where interrupts are enabled after boot for the first time after boot + ENABLE_INTERRUPTS(); +#endif + + // have to initialize the blockstorage first, as the USB device needs to update the configure block + + BlockStorageList::Initialize(); + + BlockStorage_AddDevices(); + + BlockStorageList::InitializeDevices(); + + //FS_Initialize(); + + //FileSystemVolumeList::Initialize(); + + //FS_AddVolumes(); + + //FileSystemVolumeList::InitializeVolumes(); + + //LCD_Initialize(); + +#if !defined(HAL_REDUCESIZE) + CPU_InitializeCommunication(); +#endif + + I2C_Initialize(); + + Buttons_Initialize(); + + // Initialize the backlight to a default off state + //BackLight_Initialize(); + + //Piezo_Initialize(); + + //Battery_Initialize(); + + //Charger_Initialize(); + + PalEvent_Initialize(); + //Gesture_Initialize(); + //Ink_Initialize(); + TimeService_Initialize(); + +#if defined(ENABLE_NATIVE_PROFILER) + Native_Profiler_Init(); +#endif +} + +void HAL_UnReserveAllGpios() +{ + for(INT32 i = CPU_GPIO_GetPinCount()-1; i >=0; i--) + { + CPU_GPIO_ReservePin((GPIO_PIN)i, false); + } +} + +#if defined(PLATFORM_ARM_OS_PORT) && defined(TCPIP_LWIP_OS) +// Hack: refer to work item #2374 +// For reasons unknown, the ARM linker is getting the +// fixup for the LoadRegion symbol incorrect. The data +// is located correctly but the fixed up pointer stored +// in the literal pool that this code loads for the address +// of the load base (src) is off by some factor. In initial +// testing it was always 0x90, unfortunately it turns out +// not to be consistent and bumped up to 0xED0, and is now +// back at 0x90... Sigh... Hope to hear back from ARM support +// on this soon. ARM has confirmed the bug as related to the +// use of a non-compressed region in the scatter file. Since +// the code here doesn't understand the linker compression +// the region is uncompressed, however the linker bug is +// that an uncompressed region that follows after a compressed +// one will get the invalid Load$$xxx$$Base value. If the +// scatter file is updated to ensure all regions occuring +// before this one are also uncompressed it works ok. +const UINT32 ArmLinkerLoadRegionOffsetHack = 0x00000000; +void LwipRegionInit() +{ + // Copy RAM RW regions into proper location. + { + UINT32* src = &Load$$ER_LWIP_OS$$RW$$Base; + UINT32* dst = &Image$$ER_LWIP_OS$$RW$$Base; + UINT32 len = (UINT32) &Image$$ER_LWIP_OS$$RW$$Length; + + // Hack: refer to work item #2374 + src = reinterpret_cast(reinterpret_cast(src) - ArmLinkerLoadRegionOffsetHack ); + + Prepare_Copy( src, dst, len ); + } + + // Initialize RAM ZI regions. + { + UINT32* dst = &Image$$ER_LWIP_OS$$ZI$$Base; + UINT32 len = (UINT32) &Image$$ER_LWIP_OS$$ZI$$Length; + + Prepare_Zero( dst, len ); + } +} +#endif + +void HAL_Uninitialize() +{ + int i; + +#if defined(ENABLE_NATIVE_PROFILER) + Native_Profiler_Stop(); +#endif + + for(i=0; i= end) + { + *ptr-- = 0xBAADF00D; + } + } +#endif + + // these are needed for patch access + +#if defined(TARGETLOCATION_RAM) + + LOAD_IMAGE_Start = (UINT32)&Load$$ER_RAM$$Base; + LOAD_IMAGE_Length = (UINT32)&Image$$ER_RAM$$Length; + +#elif defined(TARGETLOCATION_FLASH) + + LOAD_IMAGE_Start = (UINT32)&Load$$ER_FLASH$$Base; + LOAD_IMAGE_Length = (UINT32)&Image$$ER_FLASH$$Length; + +#else + !ERROR +#endif + + LOAD_IMAGE_Length += (UINT32)&IMAGE_RAM_RO_LENGTH + (UINT32)&Image$$ER_RAM_RW$$Length; + +#if !defined(BUILD_RTM) + g_Boot_RAMConstants_CRC = Checksum_RAMConstants(); +#endif + + + CPU_Initialize(); + + HAL_Time_Initialize(); + + HAL_Initialize(); + +#if !defined(BUILD_RTM) + DEBUG_TRACE4( STREAM_LCD, ".NetMF v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + DEBUG_TRACE3(TRACE_ALWAYS, "%s, Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__); +#if defined(__GNUC__) + DEBUG_TRACE1(TRACE_ALWAYS, "GNU Compiler version %d\r\n", __GNUC__); +#else + DEBUG_TRACE1(TRACE_ALWAYS, "ARM Compiler version %d\r\n", __ARMCC_VERSION); +#endif + + UINT8* BaseAddress; + UINT32 SizeInBytes; + + HeapLocation( BaseAddress, SizeInBytes ); + memset ( BaseAddress, 0, SizeInBytes ); + + debug_printf("\f"); + + debug_printf("%-15s\r\n", HalName); + debug_printf("%-15s\r\n", "Build Date:"); + debug_printf(" %-13s\r\n", __DATE__); + debug_printf(" %-13s\r\n", __TIME__); + +#endif // !defined(BUILD_RTM) + + /***********************************************************************************/ + + { +#if defined(FIQ_SAMPLING_PROFILER) + FIQ_Profiler_Init(); +#endif + } + + // the runtime is by default using a watchdog + + Watchdog_GetSetTimeout ( WATCHDOG_TIMEOUT , TRUE ); + Watchdog_GetSetBehavior( WATCHDOG_BEHAVIOR, TRUE ); + Watchdog_GetSetEnabled ( WATCHDOG_ENABLE, TRUE ); + + + // HAL initialization completed. Interrupts are enabled. Jump to the Application routine + ApplicationEntryPoint(); + + debug_printf("main exited!!???. Halting CPU\r\n"); + +#if defined(BUILD_RTM) + CPU_Reset(); +#else + CPU_Halt(); +#endif +} +#endif + +} // extern "C" + + +#if defined(PLATFORM_ARM_OS_PORT) +extern "C" void STM32F4_BootstrapCode(); + +// performs base level system initialization +// This typically consists of setting up clocks +// and PLLs along with any external memory needed +// to boot. +// NOTE: +// It is important to keep in mind that this is +// called *BEFORE* any C/C++ runtime initialization +// That is, zero init of uninitialied writeable data +// and copying of initialized values for initialized +// writeable data have not yet occured. Thus, any code +// called from SystemInit must not use or rely on +// initializtion having occured. This also precludes +// the use of any OS provided primitives and support +// as the kernel isn't initialized yet either. +extern "C" void SystemInit() +{ + STM32F4_BootstrapCode(); + CPU_Initialize(); + __enable_irq(); +} + +#endif //PLATFORM_ARM_OS_PORT + +#if !defined(BUILD_RTM) + +void debug_printf( const char* format, ... ) +{ + char buffer[256] = {0}; + va_list arg_ptr; + + va_start( arg_ptr, format ); + + int len = hal_vsnprintf( buffer, sizeof(buffer)-1, format, arg_ptr ); + + { // take CLR lock to send whole message + GLOBAL_LOCK(clrLock); + // send characters directly to the trace port + for( char* p = buffer; *p != '\0' || p-buffer >= 256; ++p ) + ITM_SendChar( *p ); + } + + va_end( arg_ptr ); +} + +void lcd_printf( const char* format, ... ) +{ + va_list arg_ptr; + + va_start( arg_ptr, format ); + + hal_vfprintf( STREAM_LCD, format, arg_ptr ); +} + +#endif // !defined(BUILD_RTM) + +#if !defined(BUILD_RTM) + +UINT32 Checksum_RAMConstants() +{ + UINT32* RAMConstants = (UINT32*)&IMAGE_RAM_RO_BASE; + UINT32 Length = (UINT32 )&IMAGE_RAM_RO_LENGTH; + + UINT32 crc; + + // start with Vector area CRC + crc = SUPPORT_ComputeCRC(NULL, 0x00000020, 0); + + // add the big block of RAM constants to CRC + crc = SUPPORT_ComputeCRC(RAMConstants, Length, crc); + + return crc; +} + +void Verify_RAMConstants( void* arg ) +{ + BOOL BreakpointOnError = (BOOL)arg; + + //debug_printf("RAMC\r\n"); + + UINT32 crc = Checksum_RAMConstants(); + + if (crc != g_Boot_RAMConstants_CRC) + { + hal_printf("RAMC CRC:%08x!=%08x\r\n", crc, g_Boot_RAMConstants_CRC); + + UINT32* ROMConstants = (UINT32*)&LOAD_RAM_RO_BASE; + UINT32* RAMConstants = (UINT32*)&IMAGE_RAM_RO_BASE; + UINT32 Length = (UINT32 )&IMAGE_RAM_RO_LENGTH; + BOOL FoundMismatch = FALSE; + + for(int i = 0; i < Length; i += 4) + { + if(*RAMConstants != *ROMConstants) + { + hal_printf( "RAMC %08x:%08x!=%08x\r\n", (UINT32) RAMConstants, *RAMConstants, *ROMConstants ); + + if(!FoundMismatch) lcd_printf( "\fRAMC:%08x\r\n", (UINT32)RAMConstants ); // first one only to LCD + FoundMismatch = TRUE; + } + + RAMConstants++; + ROMConstants++; + } + + if(!FoundMismatch) + { + // the vector area must have been trashed + lcd_printf("\fRAMC:%08x\r\n", (UINT32) NULL); + RAMConstants = (UINT32*)NULL; + + for(int i = 0; i < 32; i += 4) + { + hal_printf( "RAMC %02x:%08x\r\n", i, *RAMConstants ); + lcd_printf( "%02x:%08x\r\n" , i, *RAMConstants++ ); + } + } + + DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); + + if(BreakpointOnError) + { + HARD_BREAKPOINT(); + } + } +} + +#endif // !defined(BUILD_RTM) diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/USB/dotNetMF.proj b/Solutions/STM32F429IDISCOVERY/DeviceCode/USB/dotNetMF.proj new file mode 100644 index 000000000..15454d198 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/USB/dotNetMF.proj @@ -0,0 +1,47 @@ + + + usb_pal_config_STM32F429IDISCOVERY + + + {BB5F6C03-580D-4E33-ABBC-10B0371E5466} + USB PAL configuration for STM32F429IDISCOVERY solution + PAL + usb_pal_config_STM32F429IDISCOVERY.$(LIB_EXT) + $(MSBuildThisFileFullPath) + usb_pal_config_STM32F429IDISCOVERY.$(LIB_EXT).manifest + Solutions\STM32F429IDISCOVERY + + + + 4 + 0 + 0 + 0 + + 2009-04-30 + + LibraryCategory + + + + + False + + + False + False + False + Solutions\STM32F429IDISCOVERY\DeviceCode\USB + Library + false + 4.0.0.0 + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/DeviceCode/USB/usb_config.cpp b/Solutions/STM32F429IDISCOVERY/DeviceCode/USB/usb_config.cpp new file mode 100644 index 000000000..f9af5f125 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/DeviceCode/USB/usb_config.cpp @@ -0,0 +1,281 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. +// +// *** STM32F429IDISCOVERY USB Configuration *** +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +//--// + +//string descriptor +#define MANUFACTURER_NAME_SIZE 19 // "Microsoft OpenTech " +// NOTE: Having more than (probably) 32 characters causes the MFUSB KERNEL driver +// to *CRASH* which, of course, causes Windows to crash +#define PRODUCT_NAME_SIZE 19 // "STM32F429IDISCOVERY" +// NOTE: If these two strings are not present, the MFUSB KERNEL driver will *CRASH* +// which, of course, causes Windows to crash +#define DISPLAY_NAME_SIZE 19 // "STM32F429IDISCOVERY" +#define FRIENDLY_NAME_SIZE 8 // "a7e70ea2" +// index for the strings +#define MANUFACTURER_NAME_INDEX 1 +#define PRODUCT_NAME_INDEX 2 +#define SERIAL_NUMBER_INDEX 0 +// device descriptor +#define VENDOR_ID 0x0483 // STM32F4 Test VID +#define PRODUCT_ID 0xA08F // STM32F4 Test PID +#define MAX_EP0_SIZE 8 +//configuration descriptor +#define USB_MAX_CURRENT (100/USB_CURRENT_UNIT) + +#define USB_ATTRIBUTES (USB_ATTRIBUTE_BASE | USB_ATTRIBUTE_SELF_POWER) + +// Configuration for extended descriptor +#define OS_DESCRIPTOR_EX_VERSION 0x0100 + +///////////////////////////////////////////////////////////// +// The following structure defines the USB descriptor +// for a basic device with a USB debug interface via the +// WinUSB extended Compat ID. +// +// This USB configuration is always used to define the USB +// configuration for TinyBooter. It is also the default for +// the runtime if there is no USB configuration in the Flash +// configuration sector. + +ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION +{ + USB_DEVICE_DESCRIPTOR device; + USB_CONFIGURATION_DESCRIPTOR config; + USB_INTERFACE_DESCRIPTOR itfc0; + USB_ENDPOINT_DESCRIPTOR ep1; + USB_ENDPOINT_DESCRIPTOR ep2; + USB_STRING_DESCRIPTOR_HEADER manHeader; + USB_STRING_CHAR manString[MANUFACTURER_NAME_SIZE]; + USB_STRING_DESCRIPTOR_HEADER prodHeader; + USB_STRING_CHAR prodString[PRODUCT_NAME_SIZE]; + USB_STRING_DESCRIPTOR_HEADER string4; + USB_STRING_CHAR displayString[DISPLAY_NAME_SIZE]; + USB_STRING_DESCRIPTOR_HEADER string5; + USB_STRING_CHAR friendlyString[FRIENDLY_NAME_SIZE]; + USB_OS_STRING_DESCRIPTOR OS_String; + USB_XCOMPATIBLE_OS_ID OS_XCompatible_ID; + USB_XPROPERTIES_OS_WINUSB OS_XProperty; + USB_DESCRIPTOR_HEADER endList; +}; + +extern const ADS_PACKED struct GNU_PACKED USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration; + +const struct USB_DYNAMIC_CONFIGURATION UsbDefaultConfiguration = +{ + // Device descriptor + { + { + USB_DEVICE_DESCRIPTOR_MARKER, + 0, + sizeof(USB_DEVICE_DESCRIPTOR) + }, + USB_DEVICE_DESCRIPTOR_LENGTH, // Length of device descriptor + USB_DEVICE_DESCRIPTOR_TYPE, // USB device descriptor type + 0x0200, // USB Version 2.00 (BCD) (2.0 required for Extended ID recognition) + 0, // Device class (none) + 0, // Device subclass (none) + 0, // Device protocol (none) + MAX_EP0_SIZE, // Endpoint 0 size + VENDOR_ID, // Vendor ID + PRODUCT_ID, // Product ID + DEVICE_RELEASE_VERSION, // Product version 1.00 (BCD) + MANUFACTURER_NAME_INDEX, // Manufacturer name string index + PRODUCT_NAME_INDEX, // Product name string index + 0, // Serial number string index (none) + 1 // Number of configurations + }, + + // Configuration descriptor + { + { + USB_CONFIGURATION_DESCRIPTOR_MARKER, + 0, + sizeof(USB_CONFIGURATION_DESCRIPTOR) + + sizeof(USB_INTERFACE_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR) + }, + USB_CONFIGURATION_DESCRIPTOR_LENGTH, + USB_CONFIGURATION_DESCRIPTOR_TYPE, + USB_CONFIGURATION_DESCRIPTOR_LENGTH + + sizeof(USB_INTERFACE_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR), + 1, // Number of interfaces + 1, // Number of this configuration + 0, // Config descriptor string index (none) + USB_ATTRIBUTES, // Config attributes + USB_MAX_CURRENT // Device max current draw + }, + + // Interface 0 descriptor + { + sizeof(USB_INTERFACE_DESCRIPTOR), + USB_INTERFACE_DESCRIPTOR_TYPE, + 0, // Interface number + 0, // Alternate number (main) + 2, // Number of endpoints + 0xFF, // Interface class (vendor) + 1, // Interface subclass + 1, // Interface protocol + 0 // Interface descriptor string index (none) + }, + + // Endpoint 1 descriptor + { + sizeof(USB_ENDPOINT_DESCRIPTOR), + USB_ENDPOINT_DESCRIPTOR_TYPE, + USB_ENDPOINT_DIRECTION_IN + 1, + USB_ENDPOINT_ATTRIBUTE_BULK, + 64, // Endpoint 1 packet size + 0 // Endpoint 1 interval + }, + + // Endpoint 2 descriptor + { + sizeof(USB_ENDPOINT_DESCRIPTOR), + USB_ENDPOINT_DESCRIPTOR_TYPE, + USB_ENDPOINT_DIRECTION_OUT + 2, + USB_ENDPOINT_ATTRIBUTE_BULK, + 64, // Endpoint 2 packet size + 0 // Endpoint 2 interval + }, + + // Manufacturer name string descriptor + { + { + USB_STRING_DESCRIPTOR_MARKER, + MANUFACTURER_NAME_INDEX, + sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * MANUFACTURER_NAME_SIZE) + }, + USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * MANUFACTURER_NAME_SIZE), + USB_STRING_DESCRIPTOR_TYPE + }, + { 'M', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', ' ', 'O', 'p', 'e', 'n', 'T', 'e', 'c', 'h', ' ' }, + + // Product name string descriptor + { + { + USB_STRING_DESCRIPTOR_MARKER, + PRODUCT_NAME_INDEX, + sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * PRODUCT_NAME_SIZE) + }, + USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * PRODUCT_NAME_SIZE), + USB_STRING_DESCRIPTOR_TYPE + }, + { 'S', 'T', 'M', '3', '2', 'F', '4', '2', '9', 'I', 'D', 'I', 'S', 'C', 'O', 'V', 'E', 'R', 'Y' }, + + // String 4 descriptor (display name) + { + { + USB_STRING_DESCRIPTOR_MARKER, + USB_DISPLAY_STRING_NUM, + sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * DISPLAY_NAME_SIZE) + }, + USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * DISPLAY_NAME_SIZE), + USB_STRING_DESCRIPTOR_TYPE + }, + { 'S', 'T', 'M', '3', '2', 'F', '4', '2', '9', 'I', 'D', 'I', 'S', 'C', 'O', 'V', 'E', 'R', 'Y' }, + + // String 5 descriptor (friendly name) + { + { + USB_STRING_DESCRIPTOR_MARKER, + USB_FRIENDLY_STRING_NUM, + sizeof(USB_STRING_DESCRIPTOR_HEADER) + (sizeof(USB_STRING_CHAR) * FRIENDLY_NAME_SIZE) + }, + USB_STRING_DESCRIPTOR_HEADER_LENGTH + (sizeof(USB_STRING_CHAR) * FRIENDLY_NAME_SIZE), + USB_STRING_DESCRIPTOR_TYPE + }, + { 'a', '7', 'e', '7', '0', 'e', 'a', '2' }, + + // OS Descriptor string for Extended OS Compat ID + { + { + USB_STRING_DESCRIPTOR_MARKER, + OS_DESCRIPTOR_STRING_INDEX, + sizeof(USB_DESCRIPTOR_HEADER) + OS_DESCRIPTOR_STRING_SIZE + }, + OS_DESCRIPTOR_STRING_SIZE, + USB_STRING_DESCRIPTOR_TYPE, + { 'M', 'S', 'F', 'T', '1', '0', '0' }, + OS_DESCRIPTOR_STRING_VENDOR_CODE, + 0x00 + }, + + // OS Extended Compatible ID for WinUSB + { + // Generic Descriptor header + { + { + USB_GENERIC_DESCRIPTOR_MARKER, + 0, + sizeof(USB_GENERIC_DESCRIPTOR_HEADER) + USB_XCOMPATIBLE_OS_SIZE + }, + USB_REQUEST_TYPE_IN | USB_REQUEST_TYPE_VENDOR, + OS_DESCRIPTOR_STRING_VENDOR_CODE, + 0, // Intfc # << 8 + Page # + USB_XCOMPATIBLE_OS_REQUEST // Extended Compatible OS ID request + }, + USB_XCOMPATIBLE_OS_SIZE, // Size of this descriptor + OS_DESCRIPTOR_EX_VERSION, // Version 1.00 (BCD) + USB_XCOMPATIBLE_OS_REQUEST, // Extended Compatible OS ID response + 1, // Only 1 function record + { 0, 0, 0, 0, 0, 0, 0 }, // (padding) + // Extended Compatible OS ID function record + 0, // Interface 0 + 1, // (reserved) + { 'W', 'I', 'N', 'U', 'S', 'B', 0, 0 }, // Compatible ID + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Sub-compatible ID + { 0, 0, 0, 0, 0, 0 } // Padding + }, + + // OS Extended Property + { + // Generic Descriptor header + { + { + USB_GENERIC_DESCRIPTOR_MARKER, + 0, + sizeof(USB_GENERIC_DESCRIPTOR_HEADER) + USB_XPROPERTY_OS_SIZE_WINUSB + }, + USB_REQUEST_TYPE_IN | USB_REQUEST_TYPE_VENDOR | USB_REQUEST_TYPE_INTERFACE, + OS_DESCRIPTOR_STRING_VENDOR_CODE, + 0, // Intfc # << 8 + Page # + USB_XPROPERTY_OS_REQUEST // Extended Property OS ID request + }, + USB_XPROPERTY_OS_SIZE_WINUSB, // Size of this descriptor (78 bytes for guid + 40 bytes for the property name + 24 bytes for other fields = 142 bytes) + OS_DESCRIPTOR_EX_VERSION, // Version 1.00 (BCD) + USB_XPROPERTY_OS_REQUEST, // Extended Compatible OS ID response + 1, // Only 1 ex property record + // Extended Property OS ID function record + 0x00000084, // size in bytes + EX_PROPERTY_DATA_TYPE__REG_SZ, // data type (unicode string) + 40, // name length + // property name (null -terminated unicode string: 'DeviceInterfaceGuid\0') + { 'D','\0', 'e','\0', 'v','\0', 'i','\0', 'c','\0', 'e','\0', 'I','\0', 'n','\0', 't','\0', 'e','\0', 'r','\0', 'f','\0', 'a','\0', 'c','\0', 'e','\0', 'G','\0', 'u','\0', 'i','\0', 'd','\0', '\0','\0' }, + 78, // data length + // data ({D32D1D64-963D-463E-874A-8EC8C8082CBF}) + { '{','\0', 'D','\0', '3','\0', '2','\0', 'D','\0', '1','\0', 'D','\0', '6','\0', '4','\0', '-','\0', '9','\0', '6','\0', '3','\0', 'D','\0', '-','\0', '4','\0', '6','\0', '3','\0', 'E','\0', '-','\0', '8','\0', '7','\0', '4','\0', 'A','\0', '-','\0', '8','\0', 'E','\0', 'C','\0', '8','\0', 'C','\0', '8','\0', '0','\0', '8','\0', '2','\0', 'C','\0', 'B','\0', 'F','\0', '}','\0', '\0','\0' } + }, + + // End of configuration marker + { + USB_END_DESCRIPTOR_MARKER, + 0, + 0 + }, +}; diff --git a/Solutions/STM32F429IDISCOVERY/STM32F429IDISCOVERY.settings b/Solutions/STM32F429IDISCOVERY/STM32F429IDISCOVERY.settings new file mode 100644 index 000000000..e3f266ea0 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/STM32F429IDISCOVERY.settings @@ -0,0 +1,27 @@ + + + + CW2 + + + + + {5FEA6C70-21AF-4B94-B797-42978B8EDC60} + STM32F429IDISCOVERY + STM32F429IDISCOVERY + True + le + true + + + STM32F429IDISCOVERY by CW2 + + + + + + \ No newline at end of file diff --git a/Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooter.proj b/Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooter.proj new file mode 100644 index 000000000..d26cd7174 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooter.proj @@ -0,0 +1,274 @@ + + + + Tinybooter + {56448D57-5012-48F2-B20C-4EDA3157F6B8} + + + Solutions\STM32F429IDISCOVERY\TinyBooter + False + + + $(MSBuildThisFileFullPath) + $(SPOCLIENT)\Solutions\STM32F429IDISCOVERY\STM32F429IDISCOVERY.settings + True + true + + + + True + Executable + false + TinyBooter + BuildSigFiles + $(ExtraTargets);CompressBin + scatterfile_bootloader_$(COMPILER_TOOL).$(SCATTER_EXT) + scatterfile_bootloader_$(COMPILER_TOOL).$(SCATTER_EXT) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooterEntry.cpp b/Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooterEntry.cpp new file mode 100644 index 000000000..85f29c910 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyBooter/TinyBooterEntry.cpp @@ -0,0 +1,280 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Implementation for the MCBSTM32F400 board (STM32F4): Copyright (c) Oberon microsystems, Inc. +// +// Customized for STM32F429IDISCOVERY board +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +// boot loader doesn't use the CMSIS-RTOS kernel, so sleep goes direct +// to the low level support +extern void HAL_CPU_Sleep( SLEEP_LEVEL level, UINT64 wakeEvents ); + +void CPU_Sleep( SLEEP_LEVEL level, UINT64 wakeEvents ) +{ + HAL_CPU_Sleep( level, wakeEvents ); +} + +//////////////////////////////////////////////////////////////////////////////// +// Tinybooter_ProgramWordCheck +// +// Returns the value of the first binary word of an application in FLASH +// Tinybooter will search for this value at the beginning of each flash sector +// at boot time and will execute the first instance. +//////////////////////////////////////////////////////////////////////////////// +UINT32 Tinybooter_ProgramWordCheck() +{ + return 0x2000E00C; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Tinybooter_ImageIsCompressed +// +// Returns true if the image is compressed in flash and needs to be decompressed +// and run from ram. The image must be compressed by the BuildHelper tool. +//////////////////////////////////////////////////////////////////////////////// +bool Tinybooter_ImageIsCompressed() +{ + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +// Tinybooter_CompressedImageStart +// +// Returns the address of the entry point after the image is decompressed into +// RAM. +//////////////////////////////////////////////////////////////////////////////// +UINT32 Tinybooter_CompressedImageStart( const CompressedImage_Header& header ) +{ + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// Tinybooter_PrepareForDecompressedLaunch +// +// Some platforms require some initialzation before they can be executed after +// decompression. +//////////////////////////////////////////////////////////////////////////////// +void Tinybooter_PrepareForDecompressedLaunch() +{ +} + + +//////////////////////////////////////////////////////////////////////////////// +// The WaitForTinyBooterUpload method was designed to allow porting kit partners +// to define how/when tinybooter mode is entered as well as configure default +// timeout values. +// +// timeout_ms - this parameter determines the time in milliseconds TinyBooter is +// supposed to wait for commands from the host. A -1 value will +// indicate to wait forever. +// return value - the boolean return value indicates whether TinyBooter should enter +// upload mode. If false is returned the booter will attempt to +// launch the first application in FLASH that it finds. If the return +// value is true, TinyBooter will wait for the given timeout value +// (parameter timeout_ms) for valid commands before launching the first +// application +//////////////////////////////////////////////////////////////////////////////// +bool WaitForTinyBooterUpload( INT32 &timeout_ms ) +{ + bool enterBooterMode = false; + +#if defined(TARGETLOCATION_RAM) + // Wait forever when using RAM build + enterBooterMode = true; + timeout_ms = -1; +#elif defined(TINYBOOTER_ENTRY_GPIO_PIN) + + if(!CPU_GPIO_EnableInputPin(TINYBOOTER_ENTRY_GPIO_PIN, FALSE, NULL, GPIO_INT_NONE, TINYBOOTER_ENTRY_GPIO_RESISTOR)) + { + ASSERT(FALSE); + } + if(CPU_GPIO_GetPinState(TINYBOOTER_ENTRY_GPIO_PIN) == TINYBOOTER_ENTRY_GPIO_STATE) + { + // User override, so let's stay forever + enterBooterMode = true; + timeout_ms = -1; + } + +#endif + return enterBooterMode; +} + +//////////////////////////////////////////////////////////////////////////////// +// The TinyBooter_OnStateChange method is an event handler for state changes in +// the TinyBooter. It is designed to help porting kit users control the tinybooter +// execution and allow them to add diagnostics. +//////////////////////////////////////////////////////////////////////////////// +void TinyBooter_OnStateChange( TinyBooterState state, void* data, void ** retData ) +{ + switch(state) + { + //////////////////////////////////////////////////////////////////////////////////// + // State_EnterBooterMode - TinyBooter has entered upload mode + //////////////////////////////////////////////////////////////////////////////////// + case State_EnterBooterMode: + // Turn on all user LEDs + CPU_GPIO_EnableOutputPin(LED3, TRUE); + CPU_GPIO_EnableOutputPin(LED4, TRUE); + + hal_fprintf( STREAM_LCD, "Waiting\r" ); + break; + + //////////////////////////////////////////////////////////////////////////////////// + // State_ButtonPress - A button was pressed while Tinybooter + // The data parameter is a pointer to the timeout value for the booter mode. + //////////////////////////////////////////////////////////////////////////////////// + case State_ButtonPress: + break; + + //////////////////////////////////////////////////////////////////////////////////// + // State_ValidCommunication - TinyBooter has received valid communication from the host + // The data parameter is a pointer to the timeout value for the booter mode. + //////////////////////////////////////////////////////////////////////////////////// + case State_ValidCommunication: + if(NULL != data) + { + INT32* timeout_ms = (INT32*)data; + + // if we received any com/usb data then let's change the timeout to at least 20 seconds + if(*timeout_ms != -1 && *timeout_ms < 20000) + { + *timeout_ms = 20000; + } + } + break; + + //////////////////////////////////////////////////////////////////////////////////// + // State_Timeout - The default timeout for TinyBooter has expired and TinyBooter will + // perform an EnumerateAndLaunch + //////////////////////////////////////////////////////////////////////////////////// + case State_Timeout: + break; + + //////////////////////////////////////////////////////////////////////////////////// + // State_MemoryXXX - Identifies memory accesses. + //////////////////////////////////////////////////////////////////////////////////// + case State_MemoryWrite: + hal_fprintf( STREAM_LCD, "Wr: 0x%08x\r", (UINT32)data ); + break; + case State_MemoryErase: + hal_fprintf( STREAM_LCD, "Er: 0x%08x\r", (UINT32)data ); + break; + + + //////////////////////////////////////////////////////////////////////////////////// + // State_CryptoXXX - Start and result of Crypto signature check + //////////////////////////////////////////////////////////////////////////////////// + case State_CryptoStart: + hal_fprintf( STREAM_LCD, "Chk signature \r" ); + hal_printf( "Chk signature \r" ); + break; + // The data parameter is a boolean that represents signature PASS/FAILURE + case State_CryptoResult: + if((bool)data) + { + hal_fprintf( STREAM_LCD, "Signature PASS\r\n\r\n" ); + hal_printf( "Signature PASS\r\n\r\n" ); + } + else + { + hal_fprintf( STREAM_LCD, "Signature FAIL\r\n\r\n" ); + hal_printf( "Signature FAIL\r\n\r\n" ); + } + DebuggerPort_Flush(HalSystemConfig.DebugTextPort); + break; + + //////////////////////////////////////////////////////////////////////////////////// + // State_Launch - The host has requested to launch an application at a given address, + // or a timeout has occured and TinyBooter is about to launch the + // first application it finds in FLASH. + // + // The data parameter is a UINT32 value representing the launch address + //////////////////////////////////////////////////////////////////////////////////// + case State_Launch: + if(NULL != data) + { + hal_fprintf( STREAM_LCD, "Starting application at 0x%08x\r\n", (UINT32)data ); + // copy the native code from the Load area to execute area. + // set the *retAddres to real execute address after loading the data + // *retData = exeAddress + *retData =(void*) ((UINT32)data | 1); // set Thumb bit! + } + break; + } + +} + + +//////////////////////////////////////////////////////////////////////////////// +// The SectorOverlapsBootstrapRegion method enables you to deny access for writing +// certain sectors. Returning true does not guarrantee that Tinybooter will be +// able to write to the sector. It performes other checks (including signature +// validation) to determine if the write operation is valid. +//////////////////////////////////////////////////////////////////////////////// +bool CheckFlashSectorPermission( BlockStorageDevice *pDevice, ByteAddress address ) +{ + bool fAllowWrite = false; + UINT32 iRegion, iRange; + + + if(pDevice->FindRegionFromAddress(address, iRegion, iRange)) + { + const BlockRange& range = pDevice->GetDeviceInfo()->Regions[iRegion].BlockRanges[iRange]; + + if (range.IsBootstrap()) + { +#if defined(TARGETLOCATION_RAM) // do not allow overwriting the bootstrap sector unless Tinybooter is RAM build. + fAllowWrite = true; +#else + hal_printf( "Trying to write to bootstrap region\r\n" ); + fAllowWrite = false; +#endif + } + else + { + fAllowWrite = true; + } + } + + return fAllowWrite; +} + + +//////////////////////////////////////////////////////////////////////////////// +// TinyBooter_GetOemInfo +// +// Return in version and oeminfostring the compile-time values of some OEM-specific +// data, which you provide in the ReleaseInfo.settings file to apply to all projects +// built in this Porting Kit, or in the settings file specific to this solution. +// +// The properties to set are +// MajorVersion, MinorVersion, BuildNumber, RevisionNumber, and OEMSystemInfoString. +// If OEMSystemInfoString is not provided, it will be created by concatenating your +// settings for MFCompanyName and MFCopyright, also defined in ReleaseInfo.settings +// or your solution's own settings file. +// +// It is typically not necessary actually to modify this function. If you do, note +// that the return value indicates to the caller whether the releaseInfo structure +// has been fully initialized and is valid. It is safe to return false if +// there is no useful build information you wish to report. +//////////////////////////////////////////////////////////////////////////////// +BOOL TinyBooter_GetReleaseInfo(MfReleaseInfo& releaseInfo) +{ + MfReleaseInfo::Init( + releaseInfo, + VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION, + OEMSYSTEMINFOSTRING, hal_strlen_s(OEMSYSTEMINFOSTRING) + ); + return TRUE; +} + diff --git a/Solutions/STM32F429IDISCOVERY/TinyBooter/allocator.cpp b/Solutions/STM32F429IDISCOVERY/TinyBooter/allocator.cpp new file mode 100644 index 000000000..59ddd068e --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyBooter/allocator.cpp @@ -0,0 +1,43 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// + +static void RuntimeFault( LPCSTR szText ) +{ + lcd_printf("\014ERROR:\r\n%s\r\n", szText ); + debug_printf( "ERROR: %s\r\n", szText ); + + // let watchdog take over + CPU_Halt(); +} + +void *operator new(size_t) +{ + RuntimeFault( "new(size_t)" ); + + return NULL; +} + +void *operator new[](size_t) +{ + RuntimeFault( "new[](size_t)" ); + + return NULL; +} + +void operator delete (void*) +{ + RuntimeFault( "delete(void*)" ); +} + +void operator delete[] (void*) +{ + RuntimeFault( "delete[](void*)" ); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml b/Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml new file mode 100644 index 000000000..a43701875 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_gcc.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_mdk.xml b/Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_mdk.xml new file mode 100644 index 000000000..d3378e58b --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyBooter/scatterfile_bootloader_mdk.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/GNU_S/tinyclr_dat.s b/Solutions/STM32F429IDISCOVERY/TinyCLR/GNU_S/tinyclr_dat.s new file mode 100644 index 000000000..2bd2dc26f --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/GNU_S/tinyclr_dat.s @@ -0,0 +1,16 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Copyright (c) Microsoft Corporation. All rights reserved. +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section tinyclr_metadata, "a", %progbits + .align 4 + + .global TinyClr_Dat_Start + .global TinyClr_Dat_End + +TinyClr_Dat_Start: + .incbin "tinyclr.dat" +TinyClr_Dat_End: + + .end + diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/RVD_S/tinyclr_dat.s b/Solutions/STM32F429IDISCOVERY/TinyCLR/RVD_S/tinyclr_dat.s new file mode 100644 index 000000000..4ced63a7c --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/RVD_S/tinyclr_dat.s @@ -0,0 +1,21 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright (c) Microsoft Corporation. All rights reserved. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + AREA |.text|, CODE, READONLY + + ; has to keep it as ARM code, otherwise the the label TinyClr_Dat_Start and TinyClr_Dat_End are 1 word shift. + + ; ARM directive is only valid for ARM/THUMB processor, but not CORTEX + IF :DEF:COMPILE_ARM :LOR: :DEF:COMPILE_THUMB + ARM + ENDIF + + EXPORT TinyClr_Dat_Start + EXPORT TinyClr_Dat_End + +TinyClr_Dat_Start DATA + INCBIN tinyclr.dat +TinyClr_Dat_End + + END diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/TinyCLR.proj b/Solutions/STM32F429IDISCOVERY/TinyCLR/TinyCLR.proj new file mode 100644 index 000000000..144360047 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/TinyCLR.proj @@ -0,0 +1,429 @@ + + + + tinyclr + {68A2217E-E7AB-470D-B191-68C3C9BDF966} + + + Solutions\STM32F429IDISCOVERY\TinyCLR + True + + + $(MSBuildThisFileFullPath) + $(SPOCLIENT)\Solutions\STM32F429IDISCOVERY\STM32F429IDISCOVERY.settings + True + false + + + + + True + Executable + true + true + BuildSigFiles;CompressImage + MetaDataProcessorDat;TinyClrDat + \ER_FLASH + $(LINK_FLAGS) --verbose $(SWTC)keep *(.init_array) + false + $(BIN_DIR)\tinyclr.dat + $(SRC_DIR)\scatterfile_tinyclr_$(COMPILER_TOOL).$(SCATTER_EXT) + EntryPoint + TinyClr_Dat_Start + g_ConfigurationSector + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/allocator.cpp b/Solutions/STM32F429IDISCOVERY/TinyCLR/allocator.cpp new file mode 100644 index 000000000..372f95138 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/allocator.cpp @@ -0,0 +1,31 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// + + +void *operator new( size_t n ) +{ + return private_malloc( n ); +} + +void *operator new[]( size_t n ) +{ + return private_malloc( n ); +} + +void operator delete( void* p ) +{ + return private_free( p ); +} + +void operator delete[]( void* p ) +{ + return private_free( p ); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml b/Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml new file mode 100644 index 000000000..df984719e --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_gcc.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_mdk.xml b/Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_mdk.xml new file mode 100644 index 000000000..6eeb586cc --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/scatterfile_tinyclr_mdk.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Solutions/STM32F429IDISCOVERY/TinyCLR/tinyclr.cpp b/Solutions/STM32F429IDISCOVERY/TinyCLR/tinyclr.cpp new file mode 100644 index 000000000..14990758b --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/TinyCLR/tinyclr.cpp @@ -0,0 +1,43 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) Microsoft Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +extern void HAL_CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents); +void CPU_Sleep(SLEEP_LEVEL level, UINT64 wakeEvents) +{ + HAL_CPU_Sleep(level, wakeEvents); +} + +//////////////////////////////////////////////////////////////////////////////// +void ApplicationEntryPoint() +{ + CLR_SETTINGS clrSettings; + + memset(&clrSettings, 0, sizeof(CLR_SETTINGS)); + + clrSettings.MaxContextSwitches = 50; + clrSettings.WaitForDebugger = false; + clrSettings.EnterDebuggerLoopAfterExit = true; + + + ClrStartup( clrSettings ); + +#if !defined(BUILD_RTM) + debug_printf( "Exiting.\r\n" ); +#else + ::CPU_Reset(); +#endif +} + +BOOL Solution_GetReleaseInfo(MfReleaseInfo& releaseInfo) +{ + MfReleaseInfo::Init(releaseInfo, + VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION, + OEMSYSTEMINFOSTRING, hal_strlen_s(OEMSYSTEMINFOSTRING) + ); + return TRUE; // alternatively, return false if you didn't initialize the releaseInfo structure. +} + diff --git a/Solutions/STM32F429IDISCOVERY/dotnetmf.proj b/Solutions/STM32F429IDISCOVERY/dotnetmf.proj new file mode 100644 index 000000000..6f09ca245 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/dotnetmf.proj @@ -0,0 +1,14 @@ + + + + Solutions\STM32F429IDISCOVERY + $(SPOCLIENT)\Solutions\STM32F429IDISCOVERY\STM32F429IDISCOVERY.settings + + + + + + + + + \ No newline at end of file diff --git a/Solutions/STM32F429IDISCOVERY/platform_selector.h b/Solutions/STM32F429IDISCOVERY/platform_selector.h new file mode 100644 index 000000000..d70627cc2 --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/platform_selector.h @@ -0,0 +1,150 @@ +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// This file is part of the Microsoft .NET Micro Framework Porting Kit Code Samples and is unsupported. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing +// permissions and limitations under the License. +// +// Based on the Implementation for (STM32F4) by Oberon microsystems, Inc. +// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef _PLATFORM_STM32F429IDISCOVERY_SELECTOR_H_ +#define _PLATFORM_STM32F429IDISCOVERY_SELECTOR_H_ + +///////////////////////////////////////////////////////// +// +// processor and features +// + +#if defined(PLATFORM_ARM_STM32F429IDISCOVERY) + +#define HAL_SYSTEM_NAME "STM32F429IDISCOVERY" + +#define PLATFORM_ARM_STM32F4 1 + +#define USB_ALLOW_CONFIGURATION_OVERRIDE 1 + +#define STM32F429_439xx + +// +// processor and features +// +///////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////// +// +// constants +// + +// System clock +#define SYSTEM_CLOCK_HZ 168000000 // 168 MHz +#define SYSTEM_CYCLE_CLOCK_HZ 168000000 // 168 MHz +#define SYSTEM_APB1_CLOCK_HZ 42000000 // 42 MHz +#define SYSTEM_APB2_CLOCK_HZ 84000000 // 84 MHz + +#define SYSTEM_CRYSTAL_CLOCK_HZ 8000000 // 8 MHz external clock + +#define SUPPLY_VOLTAGE_MV 3000 // 3.0V supply + +#define CLOCK_COMMON_FACTOR 1000000 // GCD(SYSTEM_CLOCK_HZ, 1M) + +#define SLOW_CLOCKS_PER_SECOND 1000000 // 1 MHz +#define SLOW_CLOCKS_TEN_MHZ_GCD 1000000 // GCD(SLOW_CLOCKS_PER_SECOND, 10M) +#define SLOW_CLOCKS_MILLISECOND_GCD 1000 // GCD(SLOW_CLOCKS_PER_SECOND, 1k) + +// Memory +#define FLASH_MEMORY_Base 0x08000000 +#define FLASH_MEMORY_Size 0x00200000 // 2 MB +#define SRAM1_MEMORY_Base 0x20000000 +#define SRAM1_MEMORY_Size 0x00030000 // 192 KB + +// System Timer Configuration +#define STM32F4_32B_TIMER 2 // or 5 +#define STM32F4_16B_TIMER 3 // or 1 + +// Peripherals and Pin Configuration + +#define TOTAL_GENERIC_PORTS 1 // 1 generic port extensions (ITM channel 0) +#define ITM_GENERIC_PORTNUM 0 // ITM0 is index 0 in generic port interface table + +#define TOTAL_USB_CONTROLLER 1 +#define STM32F4_USB_HS 1 // USB device on USB HS (PB12-15) +#define USB_MAX_QUEUES 4 // 4 endpoints (EP0 + 3) + +#define DEBUG_TEXT_PORT ITM0 +#define STDIO ITM0 +#define DEBUGGER_PORT USB1 +#define MESSAGING_PORT USB1 + +// General I/O +#define GPIO_PORTA 0 +#define GPIO_PORTB 1 +#define GPIO_PORTC 2 +#define GPIO_PORTD 3 +#define GPIO_PORTE 4 +#define GPIO_PORTF 5 +#define GPIO_PORTG 6 +// Ports H - K are not supported: pins PH0, PH1 were deliberately omitted, +// ports I, J and K are not available (broken out) on the board connectors. + +#define TOTAL_GPIO_PORT (GPIO_PORTG + 1) +#define TOTAL_GPIO_PINS (TOTAL_GPIO_PORT*16) + +#define INSTRUMENTATION_H_GPIO_PIN GPIO_PIN_NONE + +#define PORT_PIN(port,pin) (((int)port)*16 + (pin)) +#define _P(port, pin) PORT_PIN(GPIO_PORT##port, pin) +#define _P_NONE_ GPION_PIN_NONE + +// USART/UART +#define TOTAL_USART_PORT 4 // of 8 (4x USART + 4x UART) +// USART1 USART2 USART3 UART4 +#define STM32F4_UART_RXD_PINS { _P(A,10), _P(D, 6), _P(B,11), _P(C,11) } +#define STM32F4_UART_TXD_PINS { _P(A, 9), _P(D, 5), _P(B,10), _P(C,10) } + +#define USART_DEFAULT_PORT COM1 +#define USART_DEFAULT_BAUDRATE 115200 + +// I2C (STMPE811 touchscreen controller on I2C3) +#define STM32F4_I2C_PORT 3 +#define STM32F4_I2C_SCL_PIN _P(A, 8) +#define STM32F4_I2C_SDA_PIN _P(C, 9) + +// SPI (LCD-SPI and L3GD20 gyroscope on SPI5) +// SPI1 SPI2 SPI3 SPI4 SPI5 SPI6 +#define STM32F4_SPI_SCLK_PINS { _P(A, 5), _P_NONE_,_P_NONE_, _P_NONE_, _P(F, 7), _P_NONE_ } +#define STM32F4_SPI_MISO_PINS { _P(A, 6), _P_NONE_,_P_NONE_, _P_NONE_, _P(F, 8), _P_NONE_ } +#define STM32F4_SPI_MOSI_PINS { _P(A, 7), _P_NONE_,_P_NONE_, _P_NONE_, _P(F, 9), _P_NONE_ } +// +// Note: ACP/RF is not supported due to conflict with SPI1_MOSI on PA7. +// + +// User & Wake-up Button +#define USER_BUTTON _P(A, 0) // Blue + +// User LEDs +#define LED3 _P(G, 13) // Green +#define LED4 _P(G, 14) // Red + + +// TinyBooter entry using GPIO +#define TINYBOOTER_ENTRY_GPIO_PIN USER_BUTTON +#define TINYBOOTER_ENTRY_GPIO_STATE TRUE // Active high +#define TINYBOOTER_ENTRY_GPIO_RESISTOR RESISTOR_DISABLED // No internal resistor, there is external pull-down (R22) + +// +// constants +///////////////////////////////////////////////////////// + +#include + +#endif // PLATFORM_ARM_STM32F429IDISCOVERY + +#endif // _PLATFORM_STM32F429IDISCOVERY_SELECTOR_H_ diff --git a/Solutions/STM32F429IDISCOVERY/scatterfile_gcc_missing_symbols.xml b/Solutions/STM32F429IDISCOVERY/scatterfile_gcc_missing_symbols.xml new file mode 100644 index 000000000..424b8c97f --- /dev/null +++ b/Solutions/STM32F429IDISCOVERY/scatterfile_gcc_missing_symbols.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + From 0c9e4028baf8f64713227520add2346fdc1db4a6 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Mon, 5 Sep 2016 17:15:32 +0100 Subject: [PATCH 138/144] Several updates and improvements in script - add code and validation to accept all possible versions - correct download URL - add code to handle patch packages --- Install-CMSIS-STM32.ps1 | 146 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 140 insertions(+), 6 deletions(-) diff --git a/Install-CMSIS-STM32.ps1 b/Install-CMSIS-STM32.ps1 index e0122cab4..4e0a69241 100644 --- a/Install-CMSIS-STM32.ps1 +++ b/Install-CMSIS-STM32.ps1 @@ -14,7 +14,7 @@ Install-CMSIS-STM32.ps1 F4 1.11.00 STM32 series name. Valid series are: F0, F1, F2, F3, F4, F7, L0, L1 and L4. .PARAMETER packVersion -The pack version to donwload. Format is N.NN.N. Example: 1.11.0 +The pack version to donwload. Format is N.N.N. Example: 1.1.0 #> @@ -38,10 +38,10 @@ if($spotClientPath.Path.Contains("Solutions")) } # validate pack version -if(-not ($packVersion -match "\d{1}.\d{2}.\d{1}$")) +if(-not ($packVersion -match "\d{1}.\d{1,2}.\d{1}$")) { # path includes 'Solutions' so presume that this is being called from a solution project, repository home must be two levels up - throw "Pack version is invalid. Must have format N.NN.N" + throw "Pack version is invalid. Must have format N.N.N" } # validate series name @@ -51,9 +51,24 @@ if(-not ($seriesName -match "(^F0$|^F1$|^F2$|^F3$|^F4$|^F7$|^L0$|^L1$|^L4$)")) throw "Unsupported series. Valid series are: F0, F1, F2, F3, F4, F7, L0, L1 and L4." } - Write-Host "Installing STM32Cube CMSIS pack v$packVersion for STM32$seriesName series" +# check if this a patch +$PatchVersion = $packVersion.Substring($packVersion.LastIndexOf('.') + 1) + +$IsPatch = $false +if( [system.int32]::Parse($PatchVersion) -gt 0) +{ + # this is patch, meaning that the base package needs to be downloaded and then the patch applied on top of it + + # update patch flag + $IsPatch = $true + + # get the base package name + $packVersion = $packVersion.Substring(0, $packVersion.LastIndexOf('.')) + ".0" +} + + # pack file name $packFileName = "stm32cube_fw_" + $seriesName.ToLower() + "_v" + ($packVersion -replace "[.]","") + ".zip" @@ -81,7 +96,7 @@ else if(-not (Test-Path ([System.IO.Path]::Combine( $stmCubePath , $packFileName ))) ) { # base URL to download the pack file from - $packSourceURL = "http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/" + $packFileName + $packSourceURL = "http://www.st.com/resource/en/firmware2/" + $packFileName # download the pack... Write-Host "Downloading pack from ST web site. This will take a while, be patient..." @@ -177,8 +192,127 @@ Get-childItem -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Src") ) *.c Remove-Item -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Src\usbd_conf_template.cpp") ) -Force Remove-Item -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Inc\usbd_conf_template.h") ) -Force -# delete source folder in STM32Cube becasause we don't need it anymore +# delete source folder in STM32Cube as they aren't needed it anymore Remove-Item -Path $seriesPath -Force -Recurse -ErrorAction Ignore +# if this a patch them go through all the above replacing the existing files +if($IsPatch) +{ + # get the patch package name + $packVersion = $packVersion.Substring(0, $packVersion.LastIndexOf('.')) + "." + $PatchVersion + + # pack file name + $packFileName = "stm32cube_fw_" + $seriesName.ToLower() + "_v" + ($packVersion -replace "[.]","") + ".zip" + + # zip folder name + $zipPackFileName = "STM32Cube_FW_" + $seriesName + "_V" + $packVersion + + # directory for the SMT32Cube + $stmCubePath = [System.IO.Path]::Combine( $spotClientPath, "STM32Cube" ) + + # directory for the series under STM32Cube folder + $seriesPath = [System.IO.Path]::Combine( $stmCubePath, $seriesName ) + + # check is pack file is already there + if(-not (Test-Path ([System.IO.Path]::Combine( $stmCubePath , $packFileName ))) ) + { + # base URL to download the pack file from + $packSourceURL = "http://www.st.com/resource/en/firmware2/" + $packFileName + + # download the pack... + Write-Host "Downloading pack from ST web site. This will take a while, be patient..." + + # must use WebClient because the pack file is huge + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile( $packSourceURL , [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) + } + else + { + # pack is available... + Write-Host "Pack already available, skipping download" + } + + # ... and extract the files into the series directory + Write-Host "Extracting pack..." + + # must load this type to open Zip files + Add-Type -assembly System.IO.Compression.FileSystem + + $zipArchive = [IO.Compression.ZipFile]::OpenRead( [System.IO.Path]::Combine( $stmCubePath , $packFileName ) ) + + try + { + # source folders and files that are to be copied + $cmsisDeviceFolder = $zipPackFileName + "/Drivers/CMSIS/Device/ST/" + $halDriverIncFolder = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Inc/" + $halDriverSrcFolder = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Src/" + $halDriverReleaseNotes = $zipPackFileName + "/Drivers/STM32" + $seriesName + "xx_HAL_Driver/Release_Notes.html" + $cmsisUSBClientLib = $zipPackFileName + "/Middlewares/ST/STM32_USB_Device_Library/" + + foreach($zipItem in $zipArchive.Entries) + { + + if($zipItem.FullName.StartsWith( $cmsisDeviceFolder ) -Or + $zipItem.FullName.StartsWith( $halDriverIncFolder ) -Or + $zipItem.FullName.StartsWith( $halDriverSrcFolder ) -Or + $zipItem.FullName.StartsWith( $halDriverReleaseNotes ) -Or + $zipItem.FullName.StartsWith( $cmsisUSBClientLib )) + { + $destinationFile = [System.IO.Path]::Combine( $seriesPath, $zipItem.FullName.Replace($zipPackFileName, "").Replace("/", "\").SubString(1)) + $parentDir = [System.IO.Path]::GetDirectoryName( $destinationFile ) + + # create directory if it doesn't exist + if((-not [System.IO.Path]::HasExtension($parentDir)) -And (-not (Test-Path -Path $parentDir)) ) + { + New-Item -Path $parentDir -Force -ItemType directory | Out-Null + } + else + { + [IO.Compression.ZipFileExtensions]::ExtractToFile($zipItem, $destinationFile, $true) + } + } + } + } + finally + { + # free file + $zipArchive.Dispose() + } + + # move CMSIS folder for this series from STM32Cube folder to the respective Device folder in CMSIS folder + # first clear the destination directory before copying as we don't want to mix versions + Write-Host "Copying CMSIS driver..." + + $cmsisPathForSeries = [System.IO.Path]::Combine($spotClientPath , "CMSIS\Device\ST") + New-Item -Path $cmsisPathForSeries -Force -ItemType directory -ErrorAction Ignore | Out-Null + Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\CMSIS\Device\ST\*") ) -Destination $cmsisPathForSeries -Force -ErrorAction Ignore + + # move HAL drivers for this series from STM32Cube folder to the respective DeviceCode folder + # first clear the destination directory before copying as we don't want to mix versions + Write-Host "Copying HAL driver..." + + $deviceCodePathForSeries = [System.IO.Path]::Combine( $spotClientPath, "DeviceCode\Targets\Native\STM32" + $seriesName + "xx\HAL_Driver") + New-Item -Path $deviceCodePathForSeries -Force -ItemType directory -ErrorAction Ignore | Out-Null + Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Drivers\STM32" + $seriesName + "xx_HAL_Driver\*") ) -Destination $deviceCodePathForSeries -Force -ErrorAction Ignore + + # move USB device client library from STM32Cube folder to USB DeviceCode folder + # first clear the destination directory before copying as we don't want to mix versions + Write-Host "Copying USB device client library..." + + $usbClientLibPath = [System.IO.Path]::Combine( $spotClientPath, "DeviceCode\Targets\Native\STM32" + $seriesName + "xx\USB\STM32_USB_Device_Library") + New-Item -Path $usbClientLibPath -Force -ItemType directory -ErrorAction Ignore | Out-Null + Move-Item -Path ( [System.IO.Path]::Combine($seriesPath, "Middlewares\ST\STM32_USB_Device_Library\Core\*") ) -Destination $usbClientLibPath -Force -ErrorAction Ignore + + # rename the USB device client library source files to cpp extension so they get compiled as CPP code + Get-childItem -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Src") ) *.c | rename-item -newname { $_.name -replace '\.c','.cpp' } + + # delete the template files from USB device client library destination folder + Remove-Item -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Src\usbd_conf_template.cpp") ) -Force -ErrorAction Ignore + Remove-Item -Path ( [System.IO.Path]::Combine($usbClientLibPath, "Inc\usbd_conf_template.h") ) -Force -ErrorAction Ignore + + # delete source folder in STM32Cube as they aren't needed it anymore + Remove-Item -Path $seriesPath -Force -Recurse -ErrorAction Ignore +} + # done here Write-Host "Installation of STM32Cube CMSIS pack v$packVersion for STM32$seriesName series completed" From 9a57217e997078f2704d0b22d989110a25d0278a Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 7 Sep 2016 10:54:51 +0100 Subject: [PATCH 139/144] Add gitignore for Visual Studio Code --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index f0305c5cd..54ec7938a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,12 @@ ipch/ *.VC.db +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json + !/tools/bin/ #uVision From 3e6e14525f111f76ad2207294ce17ffe76afc952 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 7 Sep 2016 10:55:49 +0100 Subject: [PATCH 140/144] Update CMSIS package number to 1.13.0 --- Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings b/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings index 9c454ddb3..46cf3cd70 100644 --- a/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings +++ b/Solutions/STM32F4DISCOVERY/STM32F4DISCOVERY.settings @@ -27,7 +27,7 @@ STM32F407xx F4 - 1.11.0 + 1.13.0 From 019b9a15638f41868b12ed824421a386190530f1 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Wed, 7 Sep 2016 10:59:13 +0100 Subject: [PATCH 141/144] Add nosys.specs for new lib nano --- tools/Targets/Microsoft.Spot.system.gcc.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Targets/Microsoft.Spot.system.gcc.targets b/tools/Targets/Microsoft.Spot.system.gcc.targets index 3c9703b40..e2f9f994f 100644 --- a/tools/Targets/Microsoft.Spot.system.gcc.targets +++ b/tools/Targets/Microsoft.Spot.system.gcc.targets @@ -222,7 +222,7 @@ -lstdc++ -lsupc++ -lm -lgcc -lc - -specs="$(GNU_LIBGCC_DIR)\nano.specs" + -specs="$(GNU_LIBGCC_DIR)\nano.specs" -specs="$(GNU_LIBGCC_DIR)\nosys.specs" From bbcb10924aa2e4f065d59356780fb1481feb3f81 Mon Sep 17 00:00:00 2001 From: Jose Simoes Date: Tue, 20 Sep 2016 13:28:18 +0100 Subject: [PATCH 142/144] Rework code to support debug scenarious - add support for SWO - rework code to properly handle pin configs --- .../Native/STM32F4xx/GPIO/GPIO_functions.cpp | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp index fb875af20..d0f8ee5f6 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/GPIO/GPIO_functions.cpp @@ -296,21 +296,46 @@ BOOL CPU_GPIO_Initialize() GPIO_InitStruct.Pin = GPIO_PIN_All; #if defined (RCC_AHB1ENR_GPIOAEN) + #if !defined(BUILD_RTM) // don't change PA13 and PA14 as they maybe used in JTAG GPIO_InitStruct.Pin = GPIO_PIN_All & (~GPIO_PIN_13) & (~GPIO_PIN_14); #endif + __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + // disable Port A clock only if this not RTM, otherwise keep it active for JTAG and debug #if defined(BUILD_RTM) __HAL_RCC_GPIOA_CLK_DISABLE(); #endif + #endif + + #if !defined(BUILD_RTM) && (TOTAL_GENERIC_PORTS == 1) + // don't change PB3 if it's being used as ITM port for SWO + GPIO_InitStruct.Pin = GPIO_PIN_All & (~GPIO_PIN_3); + #else + // reset pin structure to ALL + GPIO_InitStruct.Pin = GPIO_PIN_All & (~GPIO_PIN_13) & (~GPIO_PIN_14); + #endif + #if defined (RCC_AHB1ENR_GPIOBEN) __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - __HAL_RCC_GPIOB_CLK_DISABLE(); + + // turn off clock only for Port B only if ITM port for SWO it's not being used + #if !(TOTAL_GENERIC_PORTS == 1) + __HAL_RCC_GPIOB_CLK_DISABLE(); + #endif + #endif + + #if !defined(BUILD_RTM) + // reset pin structure to ALL + GPIO_InitStruct.Pin = GPIO_PIN_All & (~GPIO_PIN_13) & (~GPIO_PIN_14); + #endif + #if defined (RCC_AHB1ENR_GPIOCEN) __HAL_RCC_GPIOC_CLK_ENABLE(); HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); From f329bc850c4c4f4472978a455af3e36d8e039f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Tue, 4 Oct 2016 15:04:39 +0100 Subject: [PATCH 143/144] =?UTF-8?q?=EF=BB=BFCorrect=20implementation=20of?= =?UTF-8?q?=20cascading=20timers=20for=20NETMF=20time=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - set proper reload values for timers - remove wrong/duplicated config code - correct code to read current ticks from cascaded timers - correct typos --- .../Native/STM32F4xx/Time/Time_functions.cpp | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp index 34da136b4..a5c3bc6e6 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/Time/Time_functions.cpp @@ -21,11 +21,11 @@ TIM_HandleTypeDef slaveTimerHandle; /* NETMF time base requires a resolution of 100ns (1MHz). -That requires a timer with 48 bits resolution, which doesn't exit in the supported Cortex M platforms. +That requires a timer with 48 bits resolution, which doesn't exist in the supported Cortex M platforms. The solution is to synchronize 2 timers: - MASTER with 32 bits resolution (lower bits) - SLAVE with 16 bits resolution (upper bits) - (32+16=48, check!) + (16+32=48, check!) In previous NETMF HAL implementations the developer could choose which timers would be synchronized to implement the HAL timer. For the current HAL implementation (CMSIS based) we choose to go with a fixed configuration, for simplicity. @@ -66,7 +66,7 @@ BOOL HAL_Time_Initialize() /* Get APB1 prescaler */ uwAPB1Prescaler = clkconfig.APB1CLKDivider; - /* Compute TIM6 clock */ + /* Compute TIM clock */ if (uwAPB1Prescaler == RCC_HCLK_DIV1) { uwTimclock = HAL_RCC_GetPCLK1Freq(); @@ -85,7 +85,7 @@ BOOL HAL_Time_Initialize() ClockDivision = 0 Counter direction = Up */ - masterTimerHandle.Init.Period = (1000000U / 1000U) - 1U; + masterTimerHandle.Init.Period = 0xFFFFFFFF; masterTimerHandle.Init.Prescaler = uwPrescalerValue; masterTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; masterTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; @@ -108,7 +108,7 @@ BOOL HAL_Time_Initialize() // slave timer - slaveTimerHandle.Init.Period = 0; + slaveTimerHandle.Init.Period = 0xFFFF; slaveTimerHandle.Init.Prescaler = 0; slaveTimerHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; slaveTimerHandle.Init.CounterMode = TIM_COUNTERMODE_UP; @@ -129,16 +129,6 @@ BOOL HAL_Time_Initialize() //Error_Handler(); } - // config master sync for slave - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE; - if(HAL_TIMEx_MasterConfigSynchronization(&slaveTimerHandle, &sMasterConfig) != HAL_OK) - { - /* Configuration Error */ - // FIXME - //Error_Handler(); - } - // Starts the 32 bits timer Input Capture measurement in interrupt mode for channel 1 if(HAL_TIM_Base_Start(&slaveTimerHandle) == HAL_OK) @@ -168,15 +158,16 @@ BOOL HAL_Time_Uninitialize() #pragma arm section code = "SectionForFlashOperations" UINT64 __section("SectionForFlashOperations") HAL_Time_CurrentTicks() { - UINT32 t2, t3; // cascaded timers - do - { - t3 = slaveTimerHandle.Instance->CNT; - t2 = masterTimerHandle.Instance->CNT; - } - while (t3 != slaveTimerHandle.Instance->CNT); // asure consistent values + UINT64 ticks, lowerTicks; // cascaded timers + + // read counters from timers + ticks = (UINT64)__HAL_TIM_GET_COUNTER(&slaveTimerHandle); + lowerTicks = (UINT64)__HAL_TIM_GET_COUNTER(&masterTimerHandle); - return t2 | (UINT64)t3 << 32; + ticks = ticks << 32; + ticks = ticks | lowerTicks; + + return ticks; } #pragma arm section code From 7d24e1e1f1f1da782c81b6d9749aad59b70a6df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Thu, 10 Nov 2016 17:28:08 +0000 Subject: [PATCH 144/144] Update CRC code to match PR #526 --- .../Native/STM32F4xx/CRC/CRC_functions.cpp | 116 ++++++++++++++---- 1 file changed, 89 insertions(+), 27 deletions(-) diff --git a/DeviceCode/Targets/Native/STM32F4xx/CRC/CRC_functions.cpp b/DeviceCode/Targets/Native/STM32F4xx/CRC/CRC_functions.cpp index 0ab429349..662916d43 100644 --- a/DeviceCode/Targets/Native/STM32F4xx/CRC/CRC_functions.cpp +++ b/DeviceCode/Targets/Native/STM32F4xx/CRC/CRC_functions.cpp @@ -13,6 +13,15 @@ #include +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000U) +#define CRC ((CRC_TypeDef *) CRC_BASE) + +typedef struct +{ + CRC_TypeDef *Instance; /*!< Register base address */ +}CRC_HandleTypeDef; + + /* Interface to Cortex-M CRC calculation unit that implements the equivalent to the software implementation at Support\CRC project. CRC-32 (Ethernet) polynomial: 0x4C11DB7. @@ -20,65 +29,118 @@ size: lenght of buffer to compute CRC crc: previous CRC value to start CRC computing */ + +/* NOTE: is good for F1, L1, F2 and F4 units series, other have diferent configurations and polynomial coefficients */ + +static UINT32 ReverseCRC32(UINT32 targetCRC) +{ + // nibble lookup table for _REVERSE_ CRC32 polynomial 0x4C11DB7 + static const UINT32 crc32NibbleTable[16] = + { + 0x00000000, 0xB2B4BCB6, 0x61A864DB, 0xD31CD86D, 0xC350C9B6, 0x71E47500, 0xA2F8AD6D, 0x104C11DB, + 0x82608EDB, 0x30D4326D, 0xE3C8EA00, 0x517C56B6, 0x4130476D, 0xF384FBDB, 0x209823B6, 0x922C9F00 + }; + UINT8 counter = 8; + + while(counter--) + { + targetCRC = (targetCRC >> 4) ^ crc32NibbleTable[targetCRC & 0x0F]; + } + + return targetCRC; +} + +UINT32 FastCRC32(UINT32 initial_crc, uint8_t data) +{ + // nibble lookup table for CRC32 polynomial 0x4C11DB7 + static const UINT32 crc32NibbleTable[16] = + { + 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, + 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD + }; + + initial_crc = crc32NibbleTable[(initial_crc >> 28) ^ (data >> 4)] ^ (initial_crc << 4) ; + initial_crc = crc32NibbleTable[(initial_crc >> 28) ^ (data & 0xF)] ^ (initial_crc << 4) ; + + return initial_crc; +} + UINT32 SUPPORT_ComputeCRC(const void* buffer, int size, UINT32 initCrc) { CRC_HandleTypeDef hcrc; - + uint32_t index = 0U; uint32_t arg1; - UINT32 crc; - + uint32_t size_remainder = 0U; + volatile UINT32 crc, crc_temp; + volatile UINT32 targetCRC; + volatile UINT32 currentCRC; + // anything to do here? if(size == 0) { return initCrc; } - - // init CRC unit + + // init CRC unit hcrc.Instance = CRC; - HAL_CRC_Init(&hcrc); - - // Reset CRC Calculation Unit - __HAL_CRC_DR_RESET(&hcrc); - - // // if crc (argument for initial value) is not 0, init the CRC calculation unit with this value - // if(crc != 0) - // { - // // init CRC value - // hcrc.Instance->DR = __RBIT(crc); - // } + // get pointer to buffer uint8_t* ptr = (uint8_t*)buffer; - // CRC calculation unit is initialed with 0xFFFFFFFF which is not good for our CRC calculations - // feeding 0xFFFFFFFF to the calculation unit will set the register to 0x00000000 - - while(hcrc.Instance->DR != 0x0) + // need to reset CRC peripheral if: + // - CRC initial value is 0 + // - the initial CRC is NOT already loaded in the calculation register + if(initCrc == 0 || (hcrc.Instance->DR != initCrc)) { - hcrc.Instance->DR = 0xFFFFFFFF; - } + // Reset CRC Calculation Unit + (&hcrc)->Instance->CR |= CRC_CR_RESET; + + // CRC calculation unit is initiated with 0xFFFFFFFF which is not a initial value for our CRC calculation + // feeding 0xFFFFFFFF to the calculation unit will set the register to 0x00000000 + while(hcrc.Instance->DR != 0x0) + { + hcrc.Instance->DR = hcrc.Instance->DR; + } + } + + if(initCrc != 0 && hcrc.Instance->DR != initCrc) + { + // we have an initial value for CRC calculation and that is not loaded in the CRC calculation register + // load calculation register with REVERSE initial CRC32 value (because of STM32F4 shift order) + hcrc.Instance->DR = ReverseCRC32(initCrc); + } + + // set variable to hold how many bytes remain after processing the buffer in steps of 4 bytes + size_remainder = size & 3; // we'll be reading the buffer in steps of 4 bytes, so the size must be recalculated accordingly size = size >> 2; - // Enter Data to the CRC calculator + // feed data into the CRC calculator for(index = 0U; index < size; index++) { // take the next 4 bytes as if they were a UINT32 - // because the CRC calculation unit expects the bytes in reverse order, reverse the byte order first + // because the CRC calculation unit expects the bytes in reverse order, reverse the byte order first arg1 = __REV(*(uint32_t*)(ptr)); - // feed the bytes to the CRC + // feed the bytes to the CRC hcrc.Instance->DR = arg1; // copy to return value crc = (uint32_t)hcrc.Instance->DR; // increase pointer by 4 to the next position - // we are reading UINT32 from a UINT8 pointer + // !! we are reading UINT32 from a UINT8 pointer!! ptr +=4; } + // compute CRC for remaining bytes, if any + while(size_remainder--) + { + crc = FastCRC32(crc, *(uint8_t*)(ptr++)); + } + // Return the CRC computed value - return crc; + return crc; }