From 7823a48ea271c308b40fc23abbd69aad5b0c1bcf Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 18 Jun 2015 02:26:02 +1000 Subject: [PATCH 01/28] Added TFT_ILI9163C library from @Victor_pv --- .gitmodules | 3 +++ STM32F1/libraries/TFT_ILI9163C | 1 + 2 files changed, 4 insertions(+) create mode 160000 STM32F1/libraries/TFT_ILI9163C diff --git a/.gitmodules b/.gitmodules index f204a0e..584c53d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "STM32duino-bootloader"] path = STM32duino-bootloader url = https://github.com/rogerclarkmelbourne/STM32duino-bootloader.git +[submodule "STM32F1/libraries/TFT_ILI9163C"] + path = STM32F1/libraries/TFT_ILI9163C + url = https://github.com/victorpv/TFT_ILI9163C.git diff --git a/STM32F1/libraries/TFT_ILI9163C b/STM32F1/libraries/TFT_ILI9163C new file mode 160000 index 0000000..bbc39bb --- /dev/null +++ b/STM32F1/libraries/TFT_ILI9163C @@ -0,0 +1 @@ +Subproject commit bbc39bbb79edf95996da5733dadf293a0d5984ea From c0fd4e30388436ecd9a3a050676bad4d64bf2ff9 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 18 Jun 2015 02:29:32 +1000 Subject: [PATCH 02/28] Added Ethernet_STM library provided by Vasillis Serasidis (@Serasidis) --- .gitmodules | 3 +++ STM32F1/libraries/Ethernet_STM | 1 + 2 files changed, 4 insertions(+) create mode 160000 STM32F1/libraries/Ethernet_STM diff --git a/.gitmodules b/.gitmodules index 584c53d..b70d76a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,6 @@ [submodule "STM32F1/libraries/TFT_ILI9163C"] path = STM32F1/libraries/TFT_ILI9163C url = https://github.com/victorpv/TFT_ILI9163C.git +[submodule "STM32F1/libraries/Ethernet_STM"] + path = STM32F1/libraries/Ethernet_STM + url = https://github.com/Serasidis/Ethernet_STM diff --git a/STM32F1/libraries/Ethernet_STM b/STM32F1/libraries/Ethernet_STM new file mode 160000 index 0000000..5dd518a --- /dev/null +++ b/STM32F1/libraries/Ethernet_STM @@ -0,0 +1 @@ +Subproject commit 5dd518a193f5879744b1b3f5b112ee03c6ee14b2 From 501da92986e3885ac4c51fb05e4f84e342bed7ea Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 25 Jun 2015 09:36:23 +1000 Subject: [PATCH 03/28] Added a line in SPI.cpp to default the bitOrder to MSBFIRST --- STM32F1/libraries/SPI/src/SPI.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index 3d4d0c7..c394c8a 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -110,8 +110,11 @@ SPIClass::SPIClass(uint32 spi_num) { default: ASSERT(0); } + + bitOrder=MSBFIRST; +//pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); + - //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); } /* From 69420b429bbd72d32fd15bc63d14455dbb76ad75 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 27 Jun 2015 21:50:32 +1000 Subject: [PATCH 04/28] Added linux udev rules scripts and rules, taken from the leaflabs Linux IDE install file --- drivers/linux/45-maple.rules | 5 +++++ drivers/linux/install-udev-rules.sh | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 drivers/linux/45-maple.rules create mode 100755 drivers/linux/install-udev-rules.sh diff --git a/drivers/linux/45-maple.rules b/drivers/linux/45-maple.rules new file mode 100644 index 0000000..d1bda5f --- /dev/null +++ b/drivers/linux/45-maple.rules @@ -0,0 +1,5 @@ +ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" +ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" +ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" +ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" + diff --git a/drivers/linux/install-udev-rules.sh b/drivers/linux/install-udev-rules.sh new file mode 100755 index 0000000..df4a06d --- /dev/null +++ b/drivers/linux/install-udev-rules.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +if sudo [ -w /etc/udev/rules.d ]; then + echo "Copying Maple-specific udev rules..." + sudo cp -v 45-maple.rules /etc/udev/rules.d/45-maple.rules + sudo chown root:root /etc/udev/rules.d/45-maple.rules + sudo chmod 644 /etc/udev/rules.d/45-maple.rules +else + echo "Couldn't copy to /etc/udev/rules.d/; you probably have to run this script as root? Or your distribution of Linux doesn't include udev; try running the IDE itself as root." +fi From 3b2c87de5af78cc3aa7ee09bd04625fba81bb28f Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 28 Jun 2015 11:06:00 +1000 Subject: [PATCH 05/28] Updated linux tools to contain upload-reset (bin) utility, and modified maple-upload script to use this utility to reset the bootloader prior to upload. Also changed maple-upload so that it uses the pre-compiled dfu-util binary that is now part of the repo --- drivers/linux/install-udev-rules.sh | 3 +++ tools/linux/maple_upload | 21 +++++++++++++++++++-- tools/linux/upload-reset | Bin 0 -> 7946 bytes 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100755 tools/linux/upload-reset diff --git a/drivers/linux/install-udev-rules.sh b/drivers/linux/install-udev-rules.sh index df4a06d..db4c45a 100755 --- a/drivers/linux/install-udev-rules.sh +++ b/drivers/linux/install-udev-rules.sh @@ -5,6 +5,9 @@ if sudo [ -w /etc/udev/rules.d ]; then sudo cp -v 45-maple.rules /etc/udev/rules.d/45-maple.rules sudo chown root:root /etc/udev/rules.d/45-maple.rules sudo chmod 644 /etc/udev/rules.d/45-maple.rules + echo "Reloading udev rules" + sudo udevadm control --reload-rules else echo "Couldn't copy to /etc/udev/rules.d/; you probably have to run this script as root? Or your distribution of Linux doesn't include udev; try running the IDE itself as root." fi + diff --git a/tools/linux/maple_upload b/tools/linux/maple_upload index 598c981..67acdaf 100755 --- a/tools/linux/maple_upload +++ b/tools/linux/maple_upload @@ -1,20 +1,37 @@ #!/bin/bash -set -e +#set -e + + if [ $# -lt 4 ]; then echo "Usage: $0 $# " >&2 exit 1 fi -dummy_port=$1; altID=$2; usbID=$3; binfile=$4; +dummy_port=$1; altID=$2; usbID=$3; binfile=$4; dummy_port_fullpath="/dev/$1" if [ $# -eq 5 ]; then dfuse_addr="--dfuse-address $5" else dfuse_addr="" fi + +# Get the directory where the script is running. +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# ----------------- IMPORTANT ----------------- +# The 2nd parameter to upload-reset is the delay after resetting before it exits +# This value is in milliseonds +# You may need to tune this to your system +# 750ms to 1500ms seems to work on my Mac + + +${DIR}/upload-reset ${dummy_port_fullpath} 750 + + #DFU_UTIL=$(dirname $0)/dfu-util/dfu-util DFU_UTIL=/usr/bin/dfu-util +DFU_UTIL=${DIR}/dfu-util/dfu-util if [ ! -x ${DFU_UTIL} ]; then echo "$0: error: cannot find ${DFU_UTIL}" >&2 exit 2 diff --git a/tools/linux/upload-reset b/tools/linux/upload-reset new file mode 100755 index 0000000000000000000000000000000000000000..26985b857674d0c8d4999d53999a80f988591b96 GIT binary patch literal 7946 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 I$I+hrKXKN%tN;K2 literal 0 HcmV?d00001 From 1e4fdf743a8574dff45b8cba606dfbef72e12a1f Mon Sep 17 00:00:00 2001 From: Teguh Sobirin Date: Wed, 1 Jul 2015 20:16:27 +0700 Subject: [PATCH 06/28] FLAC decoder patch By uncommenting "#define USEFLAC" in VS1003_STM.h the FLAC patch will be loaded at begin time. --- .../Serasidis_VS1003B_STM/src/VS1003_STM.cpp | 8 + .../Serasidis_VS1003B_STM/src/VS1003_STM.h | 3 + .../Serasidis_VS1003B_STM/src/flac.h | 1078 +++++++++++++++++ 3 files changed, 1089 insertions(+) create mode 100644 STM32F1/libraries/Serasidis_VS1003B_STM/src/flac.h diff --git a/STM32F1/libraries/Serasidis_VS1003B_STM/src/VS1003_STM.cpp b/STM32F1/libraries/Serasidis_VS1003B_STM/src/VS1003_STM.cpp index 2f80b19..07540d5 100644 --- a/STM32F1/libraries/Serasidis_VS1003B_STM/src/VS1003_STM.cpp +++ b/STM32F1/libraries/Serasidis_VS1003B_STM/src/VS1003_STM.cpp @@ -10,11 +10,16 @@ email: avrsite@yahoo.gr 29 May 2015 - Added a fix for booting the VS1053B boards into mp3 decoding instead of booting into MID (modeSwitch function). + 01 July 2015 - Added a Flac decoder patch. */ //#include #include +#if defined(USEFLAC) +#include "flac.h" +#endif + #define vs1003_chunk_size 32 /****************************************************************************/ @@ -237,6 +242,9 @@ void VS1003::begin(void) write_register(SCI_MODE, (1< #include /** diff --git a/STM32F1/libraries/Serasidis_VS1003B_STM/src/flac.h b/STM32F1/libraries/Serasidis_VS1003B_STM/src/flac.h new file mode 100644 index 0000000..106483f --- /dev/null +++ b/STM32F1/libraries/Serasidis_VS1003B_STM/src/flac.h @@ -0,0 +1,1078 @@ +#define FLAC_PATCHLEN 8161 + //Taken from FLAC decoder patch 2015-05-25 v2.30 + const unsigned short flac_patch[FLAC_PATCHLEN] = + { + 0x0007,0x0001, /*copy 1*/ + 0x8050, + 0x0006,0x0002, /*copy 2*/ + 0x2a00,0xc000, + 0x0006, 0x801e, 0x0000, /*Rle(30)*/ + 0x0006,0x0540, /*copy 1344*/ + 0xf400,0x4095,0x0000,0x02c2,0x6124,0x0024,0x0000,0x0024, + 0x2800,0x1ac5,0x4192,0x4542,0x0000,0x0041,0x2000,0x0015, + 0x0030,0x0317,0x2000,0x0000,0x3f00,0x4024,0x2000,0x0000, + 0x0000,0x0000,0x3e12,0x3800,0x3e00,0xb804,0x0030,0x0015, + 0x0007,0x8257,0x3700,0x984c,0xf224,0x1444,0xf224,0x0024, + 0x0008,0x0002,0x2910,0x0181,0x0000,0x1bc8,0xb428,0x1402, + 0x0000,0x8004,0x2910,0x0195,0x0000,0x1bc8,0xb428,0x0024, + 0x0006,0x0095,0x2800,0x2945,0x3e13,0x780e,0x3e11,0x7803, + 0x3e13,0xf806,0x3e11,0xf801,0x3510,0xb808,0x003f,0xe004, + 0xfec4,0x3800,0x48be,0x17c3,0xfe46,0x41c2,0x48be,0x4497, + 0x4090,0x1c46,0xf06c,0x0024,0x2400,0x2580,0x6090,0x41c3, + 0x6628,0x1c47,0x0000,0x0024,0x2800,0x2449,0xf07e,0x0024, + 0xf400,0x4182,0x673a,0x1c46,0x0000,0x0024,0x2800,0x2589, + 0xf06c,0x0024,0xf400,0x41c3,0x0000,0x0024,0x4224,0x3442, + 0x2903,0xbe80,0x4336,0x37c3,0x0000,0x1805,0x2903,0xbe80, + 0x4508,0x40c2,0x450a,0x9808,0x0000,0x0207,0xa478,0x1bc0, + 0xc45a,0x1807,0x0030,0x03d5,0x3d01,0x5bc1,0x36f3,0xd806, + 0x3601,0x5803,0x36f3,0x0024,0x36f3,0x580e,0x0007,0x8257, + 0x0000,0x6004,0x3730,0x8024,0xb244,0x1c04,0xd428,0x3c02, + 0x0006,0xc717,0x2800,0x2d05,0x4284,0x0024,0x3613,0x3c02, + 0x0006,0xc357,0x2901,0x6780,0x3e11,0x5c05,0x4284,0x1bc5, + 0x0000,0x0024,0x2800,0x2fc5,0x0000,0x0024,0x3613,0x0024, + 0x3e10,0x3813,0x3e14,0x8024,0x3e04,0x8024,0x2900,0x4c00, + 0x0006,0x02d3,0x36e3,0x0024,0x3009,0x1bd3,0x0007,0x8257, + 0x3700,0x8024,0xf224,0x0024,0x0000,0x0024,0x2800,0x31d1, + 0x3600,0x9844,0x2900,0x3780,0x0000,0x3248,0x2911,0xf140, + 0x0000,0x0024,0x0030,0x0057,0x3700,0x0024,0xf200,0x4595, + 0x0fff,0xfe02,0xa024,0x164c,0x8000,0x17cc,0x3f00,0x0024, + 0x3500,0x0024,0x0021,0x6d82,0xd024,0x44c0,0x0006,0xa402, + 0x2800,0x3695,0xd024,0x0024,0x0000,0x0000,0x2800,0x3695, + 0x000b,0x6d57,0x3009,0x3c00,0x36f0,0x8024,0x36f2,0x1800, + 0x2000,0x0000,0x0000,0x0024,0x3e14,0x7810,0x3e13,0xb80d, + 0x3e13,0xf80a,0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807, + 0x3e14,0xf801,0x0001,0x000a,0x0006,0xc4d5,0xbf8e,0x9442, + 0x3e01,0x9403,0x0006,0xa017,0x0023,0xffd1,0x0000,0x0053, + 0x3281,0xf806,0x4091,0x2d64,0x2400,0x3d00,0x4efa,0x9c10, + 0xf1eb,0x6061,0xfe55,0x2f66,0x5653,0x2d64,0x48b2,0xa201, + 0x4efa,0xa201,0x36f3,0x3c10,0x36f4,0xd801,0x36f1,0x9807, + 0x36f1,0x1805,0x36f0,0x9803,0x36f3,0xd80a,0x36f3,0x980d, + 0x2000,0x0000,0x36f4,0x5810,0x3e12,0xb817,0x3e14,0xf812, + 0x3e01,0xb811,0x0007,0x9717,0x0020,0xffd2,0x0030,0x11d1, + 0x3111,0x8024,0x3704,0xc024,0x3b81,0x8024,0x3101,0x8024, + 0x3b81,0x8024,0x3f04,0xc024,0x2808,0x4800,0x36f1,0x9811, + 0x36f3,0x0024,0x3009,0x3848,0x3e14,0x3811,0x3e00,0x0024, + 0x0000,0x4000,0x0001,0x0010,0x2915,0x94c0,0x0001,0xcc11, + 0x36f0,0x0024,0x2927,0x9e40,0x3604,0x1811,0x3613,0x0024, + 0x3e14,0x3811,0x3e00,0x0024,0x0000,0x4000,0x0001,0x0010, + 0x2915,0x94c0,0x0001,0xcc11,0x36f0,0x0024,0x36f4,0x1811, + 0x3009,0x1808,0x2000,0x0000,0x0000,0x190d,0x3600,0x3840, + 0x3e13,0x780e,0x3e13,0xf808,0x3e00,0x0024,0x0000,0x430e, + 0x0027,0x9e0f,0x2922,0xb680,0x0000,0x190d,0x36f3,0x0024, + 0x36f3,0xd808,0x36f3,0x580e,0x2000,0x0000,0x3009,0x1800, + 0x3613,0x0024,0x3e22,0xb815,0x3e05,0xb814,0x3615,0x0024, + 0x0000,0x800a,0x3e13,0x7801,0x3e10,0xb803,0x3e11,0x3805, + 0x3e11,0xb807,0x3e14,0x3811,0x3e14,0xb813,0x3e03,0xf80e, + 0xb488,0x44d5,0x3543,0x134c,0x34e5,0xc024,0x3524,0x8024, + 0x35a4,0xc024,0x3710,0x8a0c,0x3540,0x4a0c,0x3d44,0x8024, + 0x3a10,0x8024,0x3590,0x0024,0x4010,0x15c1,0x6010,0x3400, + 0x3710,0x8024,0x2800,0x57c4,0x3af0,0x8024,0x3df0,0x0024, + 0x3591,0x4024,0x3530,0x4024,0x4192,0x4050,0x6100,0x1482, + 0x4020,0x1753,0xbf8e,0x1582,0x4294,0x4011,0xbd86,0x408e, + 0x2400,0x55ce,0xfe6d,0x2819,0x520e,0x0a00,0x5207,0x2819, + 0x4fbe,0x0024,0xad56,0x904c,0xaf5e,0x1010,0xf7d4,0x0024, + 0xf7fc,0x2042,0x6498,0x2046,0x3cf4,0x0024,0x3400,0x170c, + 0x4090,0x1492,0x35a4,0xc024,0x2800,0x5055,0x3c00,0x0024, + 0x4480,0x914c,0x36f3,0xd80e,0x36f4,0x9813,0x36f4,0x1811, + 0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803,0x36f3,0x5801, + 0x3405,0x9014,0x36e3,0x0024,0x2000,0x0000,0x36f2,0x9815, + 0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814,0x3625,0x0024, + 0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb803,0x3e11,0x3805, + 0x3e11,0xb807,0x3e14,0x3811,0x0006,0xa090,0x2912,0x0d00, + 0x3e14,0xc024,0x4088,0x8000,0x4080,0x0024,0x0007,0x90d1, + 0x2800,0x61c5,0x0000,0x0024,0x0007,0x9051,0x3100,0x4024, + 0x4100,0x0024,0x3900,0x0024,0x0007,0x90d1,0x0004,0x0000, + 0x31f0,0x4024,0x6014,0x0400,0x0000,0x0024,0x2800,0x6611, + 0x4080,0x0024,0x0000,0x0000,0x2800,0x6585,0x0000,0x0024, + 0x0007,0x9053,0x3300,0x0024,0x4080,0x0024,0x0000,0x0000, + 0x2800,0x6618,0x0000,0x0024,0x0007,0x9051,0x3900,0x0024, + 0x3200,0x504c,0x6410,0x0024,0x3cf0,0x0000,0x4080,0x0024, + 0x0006,0xc691,0x2800,0x7ec5,0x3009,0x0400,0x0007,0x9051, + 0x0000,0x1001,0x3100,0x0024,0x6012,0x0024,0x0006,0xc6d0, + 0x2800,0x7309,0x003f,0xe000,0x0006,0xc693,0x3900,0x0c00, + 0x3009,0x0001,0x6014,0x0024,0x0007,0x1ad0,0x2800,0x7315, + 0x3009,0x0000,0x4080,0x0024,0x0000,0x0301,0x2800,0x6d05, + 0x4090,0x0024,0x0000,0x0024,0x2800,0x6e15,0x0000,0x0024, + 0x3009,0x0000,0xc012,0x0024,0x2800,0x7300,0x3009,0x2001, + 0x3009,0x0000,0x6012,0x0024,0x0000,0x0341,0x2800,0x7015, + 0x0000,0x0024,0x6190,0x0024,0x2800,0x7300,0x3009,0x2000, + 0x6012,0x0024,0x0000,0x0381,0x2800,0x71d5,0x0000,0x0024, + 0x6190,0x0024,0x2800,0x7300,0x3009,0x2000,0x6012,0x0024, + 0x0000,0x00c0,0x2800,0x7315,0x0000,0x0024,0x3009,0x2000, + 0x0006,0xa090,0x3009,0x0000,0x4080,0x0024,0x0000,0x0081, + 0x2800,0x77d5,0x0007,0x8c13,0x3300,0x104c,0xb010,0x0024, + 0x0002,0x8001,0x2800,0x7a45,0x34f0,0x0024,0x2800,0x77c0, + 0x0000,0x0024,0x0006,0xc351,0x3009,0x0000,0x6090,0x0024, + 0x3009,0x2000,0x2900,0x0b80,0x3009,0x0405,0x0006,0xc690, + 0x0006,0xc6d1,0x3009,0x0000,0x3009,0x0401,0x6014,0x0024, + 0x0006,0xa093,0x2800,0x7651,0xb880,0x0024,0x2800,0x8780, + 0x3009,0x2c00,0x4040,0x0024,0x6012,0x0024,0x0006,0xc6d0, + 0x2800,0x8798,0x0000,0x0024,0x0006,0xc693,0x3009,0x0c00, + 0x3009,0x0001,0x6014,0x0024,0x0006,0xc350,0x2800,0x8781, + 0x0000,0x0024,0x6090,0x0024,0x3009,0x2c00,0x3009,0x0005, + 0x2900,0x0b80,0x0000,0x8788,0x3009,0x0400,0x4080,0x0024, + 0x0003,0x8000,0x2800,0x8785,0x0000,0x0024,0x6400,0x0024, + 0x0000,0x0081,0x2800,0x8789,0x0000,0x0024,0x0007,0x8c13, + 0x3300,0x0024,0xb010,0x0024,0x0006,0xc650,0x2800,0x8795, + 0x0000,0x0024,0x0001,0x0002,0x3413,0x0000,0x3009,0x0401, + 0x4010,0x8406,0x0000,0x0281,0xa010,0x13c1,0x4122,0x0024, + 0x0000,0x03c2,0x6122,0x8002,0x462c,0x0024,0x469c,0x0024, + 0xfee2,0x0024,0x48be,0x0024,0x6066,0x8400,0x0006,0xc350, + 0x2800,0x8781,0x0000,0x0024,0x4090,0x0024,0x3009,0x2400, + 0x2900,0x0b80,0x3009,0x0005,0x0007,0x1b50,0x2912,0x0d00, + 0x3613,0x0024,0x3a00,0x0380,0x4080,0x0024,0x0000,0x00c1, + 0x2800,0x9045,0x3009,0x0000,0xb010,0x008c,0x4192,0x0024, + 0x6012,0x0024,0x0006,0xf051,0x2800,0x8e58,0x3009,0x0400, + 0x0007,0x1fd1,0x30e3,0x0400,0x4080,0x0024,0x0000,0x0301, + 0x2800,0x9045,0x3009,0x0000,0xb010,0x0024,0x0000,0x0101, + 0x6012,0x0024,0x0006,0xf051,0x2800,0x9055,0x0000,0x0024, + 0x3023,0x0400,0xf200,0x184c,0xb880,0xa400,0x3009,0x2000, + 0x3009,0x0441,0x3e10,0x4402,0x2909,0xa9c0,0x3e10,0x8024, + 0x36e3,0x0024,0x36f4,0xc024,0x36f4,0x1811,0x36f1,0x9807, + 0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014, + 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, + 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, + 0x3615,0x0024,0x0000,0x800a,0x3e10,0xb803,0x0012,0x5103, + 0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x380d,0x0030,0x0250, + 0x3e13,0xf80e,0xbe8b,0x83e0,0x290c,0x4840,0x3613,0x0024, + 0x290c,0x4840,0x4086,0x984c,0x0000,0x00ce,0x2400,0x9a4e, + 0x3009,0x1bc0,0x0000,0x01c3,0xae3a,0x184c,0x0000,0x0043, + 0x3009,0x3842,0x290c,0x4840,0x3009,0x3840,0x4084,0x9bc0, + 0xfe26,0x9bc2,0xceba,0x0024,0x4e8e,0x0024,0x4e9a,0x0024, + 0x4f8e,0x0024,0x0000,0x0102,0x2800,0x9f85,0x0030,0x0010, + 0x0000,0x0206,0x3613,0x0024,0x290c,0x4840,0x3009,0x3840, + 0x3000,0xdbc0,0xb366,0x0024,0x0000,0x0024,0x2800,0x9f95, + 0x4e8e,0x0024,0x4e9a,0x0024,0x4f8e,0x0024,0x0030,0x0010, + 0x2800,0x9c55,0x0000,0x0206,0x36f3,0xd80e,0x36f4,0x180d, + 0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803,0x3405,0x9014, + 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, + 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, + 0x3635,0x0024,0x0000,0x800a,0x3e10,0x7802,0x3e14,0x0024, + 0x2903,0x5400,0x0000,0x0201,0x0000,0x0601,0x3413,0x184c, + 0x2903,0x5b40,0x3cf0,0x0024,0x3413,0x184c,0x3400,0x3040, + 0x3009,0x33c1,0x0000,0x1fc1,0xb010,0x0024,0x6014,0x9040, + 0x0006,0x8010,0x2800,0xa8d5,0x0000,0x0024,0x34e3,0x1bcc, + 0x6890,0x0024,0x2800,0xaa80,0xb880,0x2000,0x3e10,0x1381, + 0x2903,0x9d80,0x3e00,0x4024,0x003f,0xfe41,0x36e3,0x104c, + 0x34f0,0x0024,0xa010,0x0024,0x36f4,0x0024,0x36f0,0x5802, + 0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000, + 0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815, + 0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a,0x3e10,0xb804, + 0x3e01,0x534c,0xbe8a,0x10c0,0x4080,0x0024,0x0000,0x0024, + 0x2800,0xb3c5,0x0000,0x0024,0x2903,0x5b40,0x4082,0x184c, + 0x4c8a,0x134c,0x0000,0x0001,0x6890,0x10c2,0x4294,0x0024, + 0xac22,0x0024,0xbec2,0x0024,0x0000,0x0024,0x2800,0xb3c5, + 0x0000,0x0024,0x6890,0x134c,0xb882,0x10c2,0xac22,0x0024, + 0x4c92,0x0024,0xdc92,0x0024,0xceca,0x0024,0x4e82,0x1bc5, + 0x36f0,0x9804,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, + 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, + 0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a, + 0x3e10,0x3801,0x3e10,0xb804,0x3e11,0xb807,0x3e14,0x3811, + 0x3e04,0x934c,0x3430,0x0024,0x4080,0x0024,0x0000,0x0206, + 0x2800,0xbc05,0x0006,0x8151,0x3101,0x130c,0xff0c,0x1102, + 0x6408,0x0024,0x4204,0x0024,0xb882,0x4092,0x1005,0xfe02, + 0x48be,0x0024,0x4264,0x0024,0x2903,0xaa00,0xf400,0x4090, + 0x36f4,0x8024,0x36f4,0x1811,0x36f1,0x9807,0x36f0,0x9804, + 0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, + 0x2000,0x0000,0x36f2,0x9817,0x2a08,0x1b8e,0x2803,0x7140, + 0x0000,0xbe97,0x0006,0xd397,0x2000,0x0000,0x3f00,0x0024, + 0x0007,0x0001, /*copy 1*/ + 0x8300, + 0x0006,0x1844, /*copy 6212*/ + 0x0030,0x0055,0xb080,0x1402,0x0fdf,0xffc1,0x0007,0x9257, + 0xb212,0x3c00,0x3d00,0x4024,0x0030,0x0297,0x3f00,0x0024, + 0x0007,0x9017,0x3f00,0x0024,0x0007,0x81d7,0x3f10,0x0024, + 0xc090,0x3c00,0x0006,0x0297,0xb080,0x3c00,0x0000,0x0401, + 0x000a,0x1055,0x0006,0x0017,0x3f10,0x3401,0x000a,0x2795, + 0x3f00,0x3401,0x0001,0x6757,0xf400,0x55c0,0x0000,0x0817, + 0xb080,0x57c0,0x0006,0x01d7,0x3f00,0x0024,0x0000,0x190d, + 0x000f,0xf94f,0x0000,0xca0e,0x280f,0xe100,0x0006,0x2016, + 0x0000,0x0080,0x0005,0x4f92,0x2909,0xf840,0x3613,0x2800, + 0x0006,0x0197,0x0006,0xa115,0xb080,0x0024,0x3f00,0x3400, + 0x0007,0x8a57,0x3700,0x0024,0x4080,0x0024,0x0000,0x0040, + 0x2800,0xcbd5,0x0006,0xa2d7,0x3009,0x3c00,0x0006,0xa157, + 0x3009,0x1c00,0x0006,0x01d7,0x0000,0x190d,0x000a,0x708f, + 0x0000,0xd4ce,0x290b,0x1a80,0x3f00,0x184c,0x0030,0x0017, + 0x4080,0x1c01,0x0000,0x0200,0x2800,0xc815,0xb102,0x0024, + 0x0000,0xca08,0x2800,0xc815,0x0000,0xd0ce,0x0011,0x210f, + 0x0000,0x190d,0x280f,0xcb00,0x3613,0x0024,0x0006,0xa115, + 0x0006,0x01d7,0x37f0,0x1401,0x6100,0x1c01,0x4012,0x0024, + 0x0000,0x8000,0x6010,0x0024,0x34f3,0x0400,0x2800,0xd398, + 0x0000,0x0024,0x0000,0x8001,0x6010,0x3c01,0x0000,0x000d, + 0x2811,0x8259,0x0000,0x0024,0x2a11,0x2100,0x0030,0x0257, + 0x3700,0x0024,0x4080,0x0024,0x0000,0x0024,0x2800,0xd6d5, + 0x0006,0x0197,0x0006,0xa115,0x3f00,0x3400,0x003f,0xc000, + 0xb600,0x41c1,0x0012,0x5103,0x000c,0xc002,0xdcd6,0x0024, + 0x0019,0xd4c2,0x2800,0x9305,0x0001,0x0e48,0x0013,0xd9c3, + 0x6fd6,0x0024,0x0000,0x190d,0x2800,0xdc95,0x0014,0x1b01, + 0x0020,0x480f,0x0000,0xdb4e,0x0000,0x190d,0x2820,0x41c0, + 0x0001,0x0e48,0x0039,0x324f,0x0001,0x3b4e,0x2820,0x4a18, + 0xb882,0x0024,0x2a20,0x48c0,0x003f,0xfd00,0xb700,0x0024, + 0x003f,0xf901,0x6010,0x0024,0x0014,0x1b01,0x280a,0xc505, + 0x0000,0x190d,0x0015,0x59c0,0x6fc2,0x0024,0x0019,0x9301, + 0x2800,0xe695,0x0018,0x50c0,0x290c,0x4840,0x3613,0x0024, + 0x290c,0x4840,0x4086,0x184c,0x0000,0x18c2,0x6234,0x0024, + 0x0000,0x1d02,0x2800,0xe295,0x6234,0x0024,0x0030,0x0317, + 0x2800,0xe800,0x3f00,0x0024,0x0000,0x1d82,0x2800,0xe515, + 0x6234,0x0024,0x2912,0x0d00,0x4084,0x184c,0xf200,0x0024, + 0x6200,0x0024,0x0006,0x0017,0x2800,0xe200,0xb080,0x3c40, + 0x0000,0x0202,0x2800,0xe815,0xa024,0x0024,0xc020,0x0024, + 0x2800,0xe200,0x0030,0x02d7,0x6fc2,0x0024,0x0000,0x0024, + 0x2800,0xe815,0x0000,0x0024,0x2802,0xffc0,0x000a,0xcac8, + 0x000a,0x8c8f,0x0000,0xe94e,0x000c,0x0981,0x280a,0x71c0, + 0x002c,0x9d40,0x000a,0x708f,0x0000,0xd4ce,0x280a,0xc0d5, + 0x0012,0x5182,0x6fd6,0x0024,0x003f,0xfd81,0x280a,0x8e45, + 0xb710,0x0024,0xb710,0x0024,0x003f,0xfc01,0x6012,0x0024, + 0x0000,0x0101,0x2801,0x0515,0xffd2,0x0024,0x48b2,0x0024, + 0x4190,0x0024,0x0000,0x190d,0x2801,0x0515,0x0030,0x0250, + 0xb880,0x104c,0x3cf0,0x0024,0x0010,0x5500,0xb880,0x23c0, + 0xb882,0x2000,0x0007,0x8590,0x2914,0xbec0,0x0000,0x0440, + 0x0007,0x8b50,0xb880,0x0024,0x2920,0x0100,0x3800,0x0024, + 0x2920,0x0000,0x0006,0x8a91,0x0000,0x0800,0xb880,0xa440, + 0x003f,0xfd81,0xb710,0xa7c0,0x003f,0xfc01,0x6012,0x0024, + 0x0000,0x0101,0x2801,0x0e55,0x0000,0x0024,0xffe2,0x0024, + 0x48b2,0x0024,0x4190,0x0024,0x0000,0x0024,0x2801,0x0e55, + 0x0000,0x0024,0x2912,0x2d80,0x0000,0x0780,0x4080,0x0024, + 0x0006,0x8a90,0x2801,0x0e55,0x0000,0x01c2,0xb886,0x8040, + 0x3613,0x03c1,0xbcd2,0x0024,0x0030,0x0011,0x2800,0xfad5, + 0x003f,0xff42,0xb886,0x8040,0x3009,0x03c1,0x0000,0x0020, + 0xac22,0x0024,0x0000,0x0102,0x6cd2,0x0024,0x3e10,0x0024, + 0x2909,0x8c80,0x3e00,0x4024,0x36f3,0x0024,0x3e11,0x8024, + 0x3e01,0xc024,0x2901,0x3200,0x0000,0x0201,0xf400,0x4512, + 0x2900,0x0c80,0x3213,0x1b8c,0x3100,0x0024,0xb010,0x0024, + 0x0000,0x0024,0x2801,0x0e55,0x0000,0x0024,0x291a,0x8a40, + 0x0000,0x0100,0x2920,0x0200,0x3633,0x0024,0x2920,0x0280, + 0x0000,0x0401,0x408e,0x0024,0x2920,0x0280,0x0000,0x0401, + 0x003f,0xfd81,0xb710,0x4006,0x003f,0xfc01,0x6012,0x0024, + 0x0000,0x0101,0x2801,0x0e55,0x0000,0x0024,0xffe2,0x0024, + 0x48b2,0x0024,0x4190,0x0024,0x0000,0x0024,0x2801,0x0e55, + 0x0000,0x0024,0x2912,0x2d80,0x0000,0x0780,0x4080,0x0024, + 0x0000,0x01c2,0x2800,0xf6c5,0x0006,0x8a90,0x2a01,0x0e40, + 0x2920,0x0100,0x0000,0x0401,0x0000,0x0180,0x2920,0x0200, + 0x3613,0x0024,0x2920,0x0280,0x3613,0x0024,0x0000,0x0401, + 0x2920,0x0280,0x4084,0x984c,0x0019,0x9d01,0x6212,0x0024, + 0x001e,0x5c01,0x2801,0x0995,0x6012,0x0024,0x0000,0x0024, + 0x2801,0x0b85,0x0000,0x0024,0x001b,0x5bc1,0x6212,0x0024, + 0x001b,0xdd81,0x2801,0x0f55,0x6012,0x0024,0x0000,0x0024, + 0x2801,0x0f55,0x0000,0x0024,0x0000,0x004d,0x000a,0xbf4f, + 0x280a,0xb880,0x0001,0x0c8e,0x0020,0xfb4f,0x0000,0x190d, + 0x0001,0x138e,0x2920,0x0480,0x3009,0x2bc1,0x291a,0x8a40, + 0x36e3,0x0024,0x0000,0x190d,0x000a,0x708f,0x280a,0xcac0, + 0x0000,0xd4ce,0x0030,0x0017,0x3700,0x4024,0x0000,0x0200, + 0xb102,0x0024,0x0000,0x00c0,0x2801,0x1285,0x0005,0x4f92, + 0x2909,0xf840,0x3613,0x2800,0x0006,0x0197,0x0006,0xa115, + 0xb080,0x0024,0x3f00,0x3400,0x0000,0x190d,0x000a,0x708f, + 0x280a,0xc0c0,0x0000,0xd4ce,0x0000,0x004d,0x0020,0xfe0f, + 0x2820,0xfb40,0x0001,0x148e,0x2801,0x1655,0x3009,0x1000, + 0x6012,0x93cc,0x0000,0x0024,0x2801,0x3105,0x0000,0x0024, + 0x3413,0x0024,0x34b0,0x0024,0x4080,0x0024,0x0000,0x0200, + 0x2801,0x1955,0xb882,0x0024,0x3453,0x0024,0x3009,0x13c0, + 0x4080,0x0024,0x0000,0x0200,0x2801,0x3105,0x0000,0x0024, + 0xb882,0x130c,0x0000,0x004d,0x0021,0x058f,0x2821,0x0340, + 0x0001,0x1a4e,0x2801,0x2a95,0x6012,0x0024,0x0000,0x0024, + 0x2801,0x2a95,0x0000,0x0024,0x34c3,0x184c,0x3e13,0xb80f, + 0xf400,0x4500,0x0026,0x9dcf,0x0001,0x1e4e,0x0000,0xfa0d, + 0x2926,0x8e80,0x3e10,0x110c,0x36f3,0x0024,0x2801,0x2a80, + 0x36f3,0x980f,0x001c,0xdd00,0x001c,0xd901,0x6ec2,0x0024, + 0x001c,0xdd00,0x2801,0x2155,0x0018,0xdbc1,0x3413,0x184c, + 0xf400,0x4500,0x2926,0xc640,0x3e00,0x13cc,0x2801,0x2840, + 0x36f3,0x0024,0x6ec2,0x0024,0x003f,0xc000,0x2801,0x23d5, + 0x002a,0x4001,0x3413,0x184c,0xf400,0x4500,0x2926,0xafc0, + 0x3e00,0x13cc,0x2801,0x2840,0x36f3,0x0024,0xb400,0x0024, + 0xd100,0x0024,0x0000,0x0024,0x2801,0x2845,0x0000,0x0024, + 0x3613,0x0024,0x3e11,0x4024,0x2926,0x8540,0x3e01,0x0024, + 0x4080,0x1b8c,0x0000,0x0024,0x2801,0x2845,0x0000,0x0024, + 0x3413,0x184c,0xf400,0x4500,0x2926,0x8e80,0x3e10,0x13cc, + 0x36f3,0x0024,0x3110,0x8024,0x31f0,0xc024,0x0000,0x4000, + 0x0000,0x0021,0x6d06,0x0024,0x3110,0x8024,0x2826,0xa8c4, + 0x31f0,0xc024,0x2a26,0xad00,0x34c3,0x184c,0x3410,0x8024, + 0x3430,0xc024,0x0000,0x4000,0x0000,0x0021,0x6d06,0x0024, + 0x0000,0x0024,0x2801,0x3114,0x4d06,0x0024,0x0000,0x0200, + 0x2922,0x1885,0x0001,0x2f88,0x0000,0x0200,0x3e10,0x8024, + 0x2921,0xca80,0x3e00,0xc024,0x291a,0x8a40,0x0000,0x0024, + 0x2922,0x1880,0x36f3,0x0024,0x0000,0x004d,0x0021,0x0ecf, + 0x2821,0x0bc0,0x0001,0x308e,0x2801,0x1380,0x3c30,0x4024, + 0x0000,0x190d,0x0000,0x430e,0x2821,0x0f80,0x0027,0x9e0f, + 0x0020,0xcd4f,0x2820,0xc780,0x0001,0x32ce,0x0006,0xf017, + 0x0000,0x0015,0xb070,0xbc15,0x0000,0x430e,0x0027,0x9e0f, + 0x2820,0xcd80,0x0000,0x190d,0x3613,0x0024,0x3e10,0xb803, + 0x3e14,0x3811,0x3e11,0x3805,0x3e00,0x3801,0x0007,0xc390, + 0x0006,0xa011,0x3010,0x0444,0x3050,0x4405,0x6458,0x0302, + 0xff94,0x4081,0x0003,0xffc5,0x48b6,0x0024,0xff82,0x0024, + 0x42b2,0x0042,0xb458,0x0003,0x4cd6,0x9801,0xf248,0x1bc0, + 0xb58a,0x0024,0x6de6,0x1804,0x0006,0x0010,0x3810,0x9bc5, + 0x3800,0xc024,0x36f4,0x1811,0x36f0,0x9803,0x283e,0x2d80, + 0x0fff,0xffc3,0x2801,0x4900,0x0000,0x0024,0x3413,0x0024, + 0x2801,0x3d05,0xf400,0x4517,0x2801,0x4100,0x6894,0x13cc, + 0x37b0,0x184c,0x6090,0x1d51,0x0000,0x0910,0x3f00,0x060c, + 0x3100,0x4024,0x6016,0xb812,0x000c,0x8012,0x2801,0x3f91, + 0xb884,0x0024,0x6894,0x3002,0x0000,0x028d,0x003a,0x5e0f, + 0x0001,0x510e,0x2939,0xb0c0,0x3e10,0x93cc,0x4084,0x9bd2, + 0x4282,0x0024,0x0000,0x0040,0x2801,0x4305,0x4292,0x130c, + 0x3443,0x0024,0x2801,0x4445,0x000c,0x8390,0x2a01,0x47c0, + 0x3444,0x0024,0x3073,0x0024,0xc090,0x014c,0x2801,0x47c0, + 0x3800,0x0024,0x000c,0x4113,0xb880,0x2380,0x3304,0x4024, + 0x3800,0x05cc,0xcc92,0x05cc,0x3910,0x0024,0x3910,0x4024, + 0x000c,0x8110,0x3910,0x0024,0x39f0,0x4024,0x3810,0x0024, + 0x38d0,0x4024,0x3810,0x0024,0x38f0,0x4024,0x34c3,0x0024, + 0x3444,0x0024,0x3073,0x0024,0x3063,0x0024,0x3000,0x0024, + 0x4080,0x0024,0x0000,0x0024,0x2839,0x53d5,0x4284,0x0024, + 0x3613,0x0024,0x2801,0x4b05,0x6898,0xb804,0x0000,0x0084, + 0x293b,0x1cc0,0x3613,0x0024,0x000c,0x8117,0x3711,0x0024, + 0x37d1,0x4024,0x4e8a,0x0024,0x0000,0x0015,0x2801,0x4dc5, + 0xce9a,0x0024,0x3f11,0x0024,0x3f01,0x4024,0x000c,0x8197, + 0x408a,0x9bc4,0x3f15,0x4024,0x2801,0x5005,0x4284,0x3c15, + 0x6590,0x0024,0x0000,0x0024,0x2839,0x53d5,0x4284,0x0024, + 0x0000,0x0024,0x2801,0x3bd8,0x458a,0x0024,0x2a39,0x53c0, + 0x003e,0x2d4f,0x283a,0x5ed5,0x0001,0x348e,0x000c,0x4653, + 0x0000,0x0246,0xffac,0x0c01,0x48be,0x0024,0x4162,0x4546, + 0x6642,0x4055,0x3501,0x8024,0x0000,0x0087,0x667c,0x4057, + 0x000c,0x41d5,0x283a,0x62d5,0x3501,0x8024,0x667c,0x1c47, + 0x3701,0x8024,0x283a,0x62d5,0xc67c,0x0024,0x0000,0x0024, + 0x283a,0x62c5,0x0000,0x0024,0x2a3a,0x5ec0,0x3009,0x3851, + 0x3e14,0xf812,0x3e12,0xb817,0x3e11,0x8024,0x0006,0x0293, + 0x3301,0x8024,0x468c,0x3804,0x0006,0xa057,0x2801,0x5d04, + 0x0006,0x0011,0x469c,0x0024,0x3be1,0x8024,0x2801,0x5d15, + 0x0006,0xc392,0x3311,0x0024,0x33f1,0x2844,0x3009,0x2bc4, + 0x0030,0x04d2,0x3311,0x0024,0x3a11,0x0024,0x3201,0x8024, + 0x003f,0xfc04,0xb64c,0x0fc4,0xc648,0x0024,0x3a01,0x0024, + 0x3111,0x1fd3,0x6498,0x07c6,0x868c,0x2444,0x0023,0xffd2, + 0x3901,0x8e06,0x0030,0x0551,0x3911,0x8e06,0x3961,0x9c44, + 0xf400,0x44c6,0xd46c,0x1bc4,0x36f1,0xbc13,0x2801,0x6695, + 0x36f2,0x9817,0x002b,0xffd2,0x3383,0x188c,0x3e01,0x8c06, + 0x0006,0xa097,0x3009,0x1c12,0x3213,0x0024,0x468c,0xbc12, + 0x002b,0xffd2,0xf400,0x4197,0x2801,0x6384,0x3713,0x0024, + 0x2801,0x63c5,0x37e3,0x0024,0x3009,0x2c17,0x3383,0x0024, + 0x3009,0x0c06,0x468c,0x4197,0x0006,0xa052,0x2801,0x65c4, + 0x3713,0x2813,0x2801,0x6605,0x37e3,0x0024,0x3009,0x2c17, + 0x36f1,0x8024,0x36f2,0x9817,0x36f4,0xd812,0x2100,0x0000, + 0x3904,0x5bd1,0x2a01,0x56ce,0x3e11,0x7804,0x0030,0x0257, + 0x3701,0x0024,0x0013,0x4d05,0xd45b,0xe0e1,0x0007,0xc795, + 0x2801,0x6e15,0x0fff,0xff45,0x3511,0x184c,0x4488,0xb808, + 0x0006,0x8a97,0x2801,0x6dc5,0x3009,0x1c40,0x3511,0x1fc1, + 0x0000,0x0020,0xac52,0x1405,0x6ce2,0x0024,0x0000,0x0024, + 0x2801,0x6dc1,0x68c2,0x0024,0x291a,0x8a40,0x3e10,0x0024, + 0x2921,0xca80,0x3e00,0x4024,0x36f3,0x0024,0x3009,0x1bc8, + 0x36f0,0x1801,0x3601,0x5804,0x3e13,0x780f,0x3e13,0xb808, + 0x0008,0x9b0f,0x0001,0x70ce,0x2908,0x9300,0x0000,0x004d, + 0x36f3,0x9808,0x2000,0x0000,0x36f3,0x580f,0x0007,0x81d7, + 0x3711,0x8024,0x3711,0xc024,0x3700,0x0024,0x0000,0x2001, + 0xb012,0x0024,0x0034,0x0000,0x2801,0x7385,0x0000,0x01c1, + 0x0014,0xc000,0x0000,0x01c1,0x4fce,0x0024,0xffea,0x0024, + 0x48b6,0x0024,0x4384,0x4097,0xb886,0x45c6,0xfede,0x0024, + 0x4db6,0x0024,0x466c,0x0024,0x0006,0xc610,0x8dd6,0x8007, + 0x0000,0x00c6,0xff6e,0x0024,0x48b2,0x0024,0x0034,0x2406, + 0xffee,0x0024,0x2914,0xaa80,0x40b2,0x0024,0xf1c6,0x0024, + 0xf1d6,0x0024,0x0000,0x0201,0x8d86,0x0024,0x61de,0x0024, + 0x0006,0xc612,0x2801,0x7a01,0x0006,0xc713,0x4c86,0x0024, + 0x2912,0x1180,0x0006,0xc351,0x0006,0x0210,0x2912,0x0d00, + 0x3810,0x984c,0xf200,0x2043,0x2808,0xa000,0x3800,0x0024, + 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, + 0x3645,0x0024,0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb803, + 0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x104c,0x2903,0x5400, + 0x0000,0x0081,0x4080,0x3040,0x0000,0x0101,0x2801,0x8145, + 0x0000,0x0024,0x4090,0x0024,0x0006,0x8050,0x2801,0x9555, + 0x0000,0x0024,0x2903,0x5400,0x3613,0x0024,0xb880,0x3000, + 0x2801,0x9300,0x3009,0x3380,0x2903,0x5400,0x4122,0x10cc, + 0x3cf0,0x0024,0x3001,0x0024,0x3400,0x0024,0x6800,0x0024, + 0xa408,0x9040,0x4080,0x0024,0x0000,0x07c1,0x2801,0x86d5, + 0x6894,0x1380,0x6894,0x130c,0x3460,0x0024,0x6408,0x4481, + 0x4102,0x1380,0xf400,0x4052,0x0000,0x07c1,0x34f0,0xc024, + 0x6234,0x0024,0x6824,0x0024,0xa122,0x0024,0x6014,0x0024, + 0x0000,0x0141,0x2801,0x8dd5,0x0000,0x0024,0x2903,0x5400, + 0x3613,0x0024,0x2801,0x8c40,0xb88a,0x4002,0x2900,0xac40, + 0x3e00,0x8024,0x4c8e,0xa801,0x0000,0x0201,0x3a10,0x1bcc, + 0x3000,0x0024,0xb010,0x0024,0x0000,0x0024,0x2801,0x91d5, + 0x659a,0x0024,0x6540,0x184c,0x0030,0x0010,0x2801,0x89c8, + 0x0000,0x0024,0x2801,0x91c0,0x36f3,0x0024,0x2801,0x9080, + 0xb88a,0x0024,0x2903,0x1c40,0x34d0,0x4024,0x4c8f,0xa0a1, + 0x0000,0x0201,0x3000,0x084c,0xb010,0x0024,0x0000,0x0024, + 0x2801,0x91d5,0x659a,0x0024,0x6540,0x10cc,0x0030,0x0010, + 0x2801,0x8e48,0x0000,0x0024,0x34d3,0x0024,0x3423,0x0024, + 0xf400,0x4510,0x3009,0x1380,0x6090,0x0024,0x3009,0x2000, + 0x6892,0x108c,0x34f0,0x9000,0xa122,0x984c,0x6016,0x13c1, + 0x0000,0x0102,0x2801,0x8288,0x0006,0x8150,0x2801,0x95c0, + 0x3009,0x1bcc,0x6890,0x938c,0x3800,0x0024,0x36f4,0x0024, + 0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801, + 0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000, + 0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815, + 0x3e05,0xb814,0x3675,0x0024,0x3643,0x0024,0x0000,0x800a, + 0x3e10,0x3801,0x0000,0x0181,0x3e10,0xb803,0x3e11,0x3806, + 0x3e11,0xf810,0x3e14,0x7812,0x3e13,0xf80e,0x2903,0x2540, + 0x3e03,0x4024,0x2903,0x5400,0x4088,0x184c,0x3413,0x184c, + 0x2903,0x5400,0x6892,0x3040,0x4080,0x3040,0x0000,0x0000, + 0x2801,0xa345,0x0000,0x0024,0x6890,0x0024,0x2903,0x2540, + 0x3cd0,0x0024,0x4080,0x0024,0x0000,0x0024,0x2801,0xa395, + 0x0000,0x0024,0x3433,0x0024,0xf400,0x4510,0x34d0,0x0024, + 0x6090,0x0024,0x2903,0x2540,0x3800,0x0024,0x4080,0x10cc, + 0xf400,0x4510,0x2801,0xa105,0x34d0,0x0024,0x2801,0xa380, + 0x0000,0x0024,0x3cd0,0x0024,0x3433,0x0024,0x34a0,0x0024, + 0xf400,0x4510,0x3430,0x4024,0x6100,0x0024,0x0000,0x0341, + 0x3840,0x0024,0x3000,0x0024,0x6012,0x0024,0x0006,0x0581, + 0x2801,0xc101,0x4012,0x0024,0xf400,0x4057,0x3702,0x0024, + 0x2000,0x0000,0x0000,0x0024,0x34d3,0x184c,0x3430,0x8024, + 0x2900,0xac40,0x3e00,0x8024,0x36f3,0x11cc,0xb888,0x104c, + 0x3c10,0x0024,0x3c90,0x4024,0x2801,0xacc0,0x34e3,0x0024, + 0x3411,0x8024,0x3491,0xc024,0x4f82,0x128c,0x3400,0x4024, + 0x4142,0x0024,0xf400,0x4050,0x3800,0x0024,0x3440,0x4024, + 0x4142,0x0024,0x6498,0x4050,0x3009,0x2007,0x0006,0x8150, + 0x3000,0x11cc,0x6402,0x104c,0x0000,0x0024,0x2801,0xaa08, + 0x0000,0x0024,0x3493,0x0024,0x2801,0xdcc0,0x34f3,0x0024, + 0x2801,0xb440,0xb888,0x0024,0x3430,0x8024,0x2900,0xac40, + 0x3e00,0x8024,0x4c8e,0x130c,0x3400,0x5bcc,0x4142,0x0024, + 0xf400,0x4050,0x3800,0x0024,0x3440,0x4024,0x4142,0x0024, + 0xf400,0x4050,0x0000,0x0201,0x3009,0x2007,0x0030,0x0010, + 0x3000,0x0024,0xb010,0x0024,0x0000,0x0024,0x2801,0xdcd5, + 0x6498,0x0024,0x0006,0x8150,0x3000,0x134c,0x6402,0x984c, + 0x0000,0x0024,0x2801,0xaf88,0x0000,0x0024,0x2801,0xdcc0, + 0x3433,0x1bcc,0x0000,0x0201,0xb888,0x104c,0x3430,0x184c, + 0x6010,0x0024,0x6402,0x3000,0x0000,0x0201,0x2801,0xbcd8, + 0x0030,0x0010,0x4090,0x124c,0x2401,0xbbc0,0x0000,0x0024, + 0x3430,0x8024,0x2900,0xac40,0x3e00,0x8024,0x4c8e,0x130c, + 0x3400,0x4024,0x4142,0x0024,0xf400,0x4050,0x3800,0x0024, + 0x3410,0x4024,0x4142,0x0024,0x6498,0x4050,0x3009,0x2007, + 0x0030,0x0010,0x0000,0x0201,0x3473,0x0024,0x3490,0x0024, + 0x3e00,0x13cc,0x2901,0x7c00,0x3444,0x8024,0x3000,0x1bcc, + 0xb010,0x0024,0x0000,0x0024,0x2801,0xdcd5,0x0000,0x0024, + 0x34c3,0x184c,0x3470,0x0024,0x3e10,0x104c,0x34c0,0x4024, + 0x2900,0xb580,0x3e00,0x4024,0x2801,0xdcc0,0x36e3,0x0024, + 0x0000,0x0801,0x3413,0x0024,0x34f0,0x0024,0x6012,0x0024, + 0x0000,0x07c1,0x2801,0xdc08,0x0000,0x0024,0x6010,0x114c, + 0xb888,0x32c0,0x6402,0x0024,0x0000,0x0101,0x2801,0xc898, + 0x0000,0x0024,0x4090,0x134c,0x2401,0xc7c0,0x3009,0x184c, + 0x3430,0x8024,0x2900,0xac40,0x3e00,0x8024,0x4c8e,0x130c, + 0x3400,0x4024,0x4142,0x0024,0xf400,0x4050,0x3800,0x0024, + 0x3410,0x4024,0x4142,0x0024,0x6498,0x4050,0x3009,0x2007, + 0x0000,0x0101,0x3433,0x1bcc,0x2903,0x5400,0x3613,0x0024, + 0x0000,0x0141,0x6090,0x118c,0x2903,0x5400,0x3ca0,0x184c, + 0x3473,0x184c,0xb888,0x3380,0x3400,0x0024,0x6402,0x0024, + 0x0000,0x0201,0x2801,0xcf58,0x0000,0x0024,0x4090,0x104c, + 0x2401,0xce80,0x0000,0x0024,0x34a0,0x8024,0x2900,0xac40, + 0x3e00,0x8024,0x0006,0x8002,0x4244,0x118c,0x4244,0x0024, + 0x6498,0x4095,0x3009,0x3440,0x3009,0x37c1,0x0000,0x0201, + 0x34f3,0x0024,0x0030,0x0010,0x3490,0x0024,0x3e00,0x138c, + 0x2901,0x7c00,0x3444,0x8024,0x3000,0x1bcc,0xb010,0x0024, + 0x0000,0x0024,0x2801,0xdcd5,0x4112,0x0024,0x3463,0x0024, + 0x34a0,0x0024,0x6012,0x0024,0x0006,0x8111,0x2801,0xd899, + 0x0000,0x0024,0x3100,0x11cc,0x3490,0x4024,0x4010,0x0024, + 0x0000,0x0a01,0x6012,0x0024,0x0006,0x8151,0x2801,0xd898, + 0x0000,0x0024,0x3613,0x114c,0x3101,0x3804,0x3490,0x8024, + 0x6428,0x138c,0x3470,0x8024,0x3423,0x0024,0x3420,0xc024, + 0x4234,0x1241,0x4380,0x4092,0x2903,0xaa00,0x0006,0x8010, + 0x2801,0xdcc0,0x3009,0x1bcc,0x0006,0x8151,0x3613,0x114c, + 0x3101,0x3804,0x3490,0x8024,0x6428,0x138c,0x3470,0x8024, + 0x3423,0x0024,0x3420,0xc024,0x4234,0x1241,0x4380,0x4092, + 0x2903,0xb3c0,0x0006,0x8010,0x2801,0xdcc0,0x3009,0x1bcc, + 0x0006,0x8050,0x6890,0x0024,0x3800,0x0024,0x3433,0x0024, + 0x34d0,0x0024,0x4080,0x0024,0x0006,0x8150,0x2801,0xe245, + 0x0000,0x0024,0x3000,0x11cc,0xb888,0x10cc,0x6402,0x3240, + 0x3493,0x0024,0x3444,0x8024,0x2801,0xe258,0x4090,0x0024, + 0x2401,0xe200,0x0000,0x0024,0x6499,0x2620,0xb78e,0x4001, + 0x0000,0x0000,0x3433,0x0024,0xcfce,0x1340,0xaf0e,0x0024, + 0x3a11,0xa807,0x36f3,0x4024,0x36f3,0xd80e,0x36f4,0x5812, + 0x36f1,0xd810,0x36f1,0x1806,0x36f0,0x9803,0x36f0,0x1801, + 0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000, + 0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815, + 0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a,0x3e10,0x7802, + 0x3e10,0xf804,0x0000,0x3fc3,0x3e11,0x7806,0x3e11,0xf810, + 0xbc82,0x12cc,0x3404,0x0024,0x3023,0x0024,0x3810,0x0024, + 0x38f0,0x4024,0x3454,0x0024,0x3810,0x0024,0x38f0,0x4024, + 0x2903,0x5400,0x0000,0x0201,0x0006,0x9301,0x4088,0x134c, + 0x3400,0x8024,0xd204,0x0024,0xb234,0x0024,0x4122,0x0024, + 0xf400,0x4055,0x3500,0x0024,0x3c30,0x0024,0x0000,0x2000, + 0xb400,0x0024,0x0000,0x3001,0x2801,0xefd5,0x0000,0x3800, + 0x0000,0x0041,0xfe42,0x12cc,0x48b2,0x1090,0x3810,0x0024, + 0x38f0,0x4024,0x2802,0x10c0,0x3430,0x0024,0xb400,0x0024, + 0x6012,0x0024,0x0000,0x3801,0x2801,0xf315,0x0000,0x3c00, + 0x0000,0x07c0,0x0000,0x0041,0xb400,0x12cc,0xfe02,0x1150, + 0x48b2,0x0024,0x689a,0x2040,0x2802,0x0f80,0x38f0,0x4024, + 0xb400,0x0024,0x6012,0x0024,0x0000,0x3c01,0x2801,0xf695, + 0x0000,0x3e00,0x0000,0x03c0,0x0000,0x0085,0x4592,0x12cc, + 0xb400,0x1150,0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024, + 0x2802,0x0f80,0x38f0,0x4024,0xb400,0x0024,0x6012,0x0024, + 0x0000,0x3e01,0x2801,0xfa15,0x0000,0x3f00,0x0000,0x01c0, + 0xf20a,0x12cc,0xb400,0x1150,0xf252,0x0024,0xfe02,0x0024, + 0x48b2,0x0024,0x3810,0x0024,0x2802,0x0f80,0x38f0,0x4024, + 0xb400,0x130c,0x6012,0x0024,0x0000,0x3f01,0x2801,0xfd95, + 0x4390,0x0024,0x0000,0x0041,0x0000,0x0105,0x4590,0x13cc, + 0xb400,0x1150,0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024, + 0x2802,0x0f80,0x38f0,0x4024,0xb400,0x0024,0x6012,0x1100, + 0x0000,0x01c1,0x2802,0x0115,0x0000,0x0024,0x0000,0x0041, + 0x0000,0x0145,0x6890,0x12cc,0xb400,0x1150,0xfe02,0x0024, + 0x48b2,0x0024,0x3810,0x0024,0x2802,0x0f80,0x38f0,0x4024, + 0x6012,0x0024,0x0000,0x3f81,0x2802,0x0395,0xb430,0x0024, + 0x6012,0x0024,0x0000,0x0024,0x2802,0x0395,0x0000,0x0024, + 0x2802,0x0f80,0x0000,0x0185,0x2802,0x10c0,0xc890,0x0024, + 0x0000,0x3fc3,0x0000,0x0201,0x34d3,0x0024,0x2903,0x5400, + 0x3433,0x184c,0x0006,0x9301,0x4088,0x134c,0x3400,0x8024, + 0xd204,0x0024,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, + 0x0000,0x2001,0x3500,0x0024,0x3c30,0x0024,0x0000,0x3000, + 0xb400,0x0024,0x6012,0x0024,0x0000,0x0182,0x2802,0x09c5, + 0x0000,0x0024,0x2802,0x10c0,0xc890,0x0024,0x459a,0x12cc, + 0x3404,0x0024,0x3023,0x0024,0x3010,0x0024,0x30d0,0x4024, + 0xac22,0x0046,0x003f,0xf982,0x3011,0xc024,0x0000,0x0023, + 0xaf2e,0x0024,0x0000,0x0182,0xccf2,0x0024,0x0000,0x0fc6, + 0x0000,0x0047,0xb46c,0x2040,0xfe6e,0x23c1,0x3454,0x0024, + 0x3010,0x0024,0x30f0,0x4024,0xac22,0x0024,0xccb2,0x0024, + 0x3810,0x0024,0x38f0,0x4024,0x458a,0x134c,0x0000,0x0201, + 0x2802,0x04d5,0x0000,0x3fc3,0x3430,0x0024,0x36f1,0xd810, + 0x36f1,0x5806,0x36f0,0xd804,0x36f0,0x5802,0x3405,0x9014, + 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, + 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, + 0x3675,0x0024,0x3633,0x0024,0x0000,0x800a,0x3e10,0x3801, + 0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x3811, + 0x3e14,0xb813,0x3e13,0xf80e,0x3e03,0x4024,0x2903,0x9100, + 0x0000,0x0381,0x000f,0xff81,0x6012,0x184c,0x0000,0x0201, + 0x2802,0x1945,0x0000,0x0024,0x2903,0x5400,0x0002,0xfc88, + 0x3613,0x0024,0x0000,0x0401,0x0006,0x8a10,0x2900,0xbf40, + 0xb880,0x1bcc,0xb880,0x11cc,0x3413,0x184c,0x3c90,0x0024, + 0x2903,0x5400,0x34f3,0x0024,0x3473,0x184c,0x3c00,0x0000, + 0x4080,0x0024,0x0006,0x9301,0x2802,0x1ec5,0x003f,0xfe04, + 0x3490,0x8024,0xa244,0x0024,0x2903,0x7400,0xb880,0x0024, + 0x2900,0xbf40,0x003f,0xfe04,0x3473,0x184c,0x0006,0x8091, + 0x3413,0x0024,0x34f0,0x8024,0x3400,0xc024,0xa346,0x0024, + 0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024,0x4122,0x1042, + 0xf400,0x4055,0x0006,0x9301,0x3500,0x0024,0xd024,0x3000, + 0xb234,0x0024,0x4122,0x0024,0x6892,0x4055,0x3500,0x0024, + 0x3cf0,0x0024,0x34a0,0x0024,0xf100,0x0024,0xb010,0x0024, + 0x3c60,0x0024,0x34b0,0x0024,0xb010,0x0024,0x0000,0x0201, + 0x2903,0x5400,0x3ce0,0x0024,0x0006,0x9301,0x3473,0x184c, + 0x3c10,0x0024,0x34f0,0x8024,0x3410,0xc024,0xd234,0x0024, + 0x0000,0x3fc3,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, + 0x003f,0xff01,0x3500,0x0024,0x3cf0,0x0024,0x34c0,0x0024, + 0xa010,0x0024,0x0000,0x03c1,0x3c40,0x0024,0x34d0,0x0024, + 0xb010,0x0024,0x0000,0x0201,0x2903,0x5400,0x3cc0,0x0024, + 0x0006,0x9301,0x3473,0x0024,0x3c10,0x0024,0x34f0,0x8024, + 0x3410,0xc024,0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024, + 0x4122,0x0024,0xf400,0x4055,0x003f,0xff01,0x3500,0x0024, + 0x3cf0,0x0024,0x3400,0x0024,0xa010,0x0024,0x0000,0x01c1, + 0x3900,0x0024,0x34e0,0x0024,0xf100,0x0024,0xb010,0x0024, + 0x6892,0x3080,0x34f0,0x0024,0xb010,0x0024,0x3cb0,0x0024, + 0x3450,0x0024,0x34a0,0x4024,0xc010,0x0024,0x0000,0x0181, + 0x2802,0x3345,0x3100,0x0024,0x6890,0x07cc,0x2802,0xfc80, + 0x3900,0x0024,0x6012,0x0024,0x0000,0x0201,0x2802,0x34d8, + 0x0000,0x0024,0x2802,0x37c0,0x6090,0x044c,0x6012,0x0024, + 0x0000,0x0281,0x2802,0x3708,0x6012,0x0024,0x0000,0x0080, + 0x2802,0x3719,0x0000,0x0024,0x2802,0x37c0,0x3113,0x0024, + 0x6890,0x07cc,0x2802,0xfc80,0x3900,0x0024,0x0000,0x0201, + 0x3900,0x114c,0x34b0,0x0024,0x6012,0x0024,0x0006,0x08c1, + 0x2802,0x4201,0x4012,0x0024,0xf400,0x4057,0x3702,0x0024, + 0x2000,0x0000,0x0000,0x0024,0x2802,0x4200,0x0000,0x0024, + 0x0000,0x0200,0x0006,0x8110,0x2802,0x4200,0x3800,0x0024, + 0x0000,0x0300,0x0006,0x8110,0x2802,0x4200,0x3800,0x0024, + 0x0006,0x8050,0x6890,0x0024,0x2802,0xfc80,0x3800,0x0024, + 0x0000,0x0400,0x0006,0x8110,0x2802,0x4200,0x3800,0x0024, + 0x0000,0x0500,0x0006,0x8110,0x2802,0x4200,0x3800,0x0024, + 0x0000,0x0600,0x0006,0x8110,0x2802,0x4200,0x3800,0x0024, + 0x0006,0x8050,0x6890,0x0024,0x2802,0xfc80,0x3800,0x0024, + 0x3423,0x184c,0x3460,0x0024,0x4080,0x0024,0x0006,0x8200, + 0x2802,0x4745,0x3e10,0x0024,0x0000,0x01c0,0x3e10,0x0024, + 0x3490,0x0024,0x2901,0xe540,0x3e00,0x13cc,0x36d3,0x11cc, + 0x3413,0x0024,0x4080,0x3240,0x34f3,0x0024,0x2802,0x4b18, + 0x0000,0x0024,0x0006,0x8010,0x6890,0x0024,0x2802,0xfc80, + 0x3800,0x0024,0x0000,0x0180,0x3e10,0x0024,0x3490,0x0024, + 0x2901,0xe540,0x3e00,0x13cc,0x36d3,0x11cc,0x3413,0x0024, + 0x4080,0x3240,0x34f3,0x0024,0x2802,0x4b18,0x0000,0x0024, + 0x0006,0x8010,0x6890,0x0024,0x2802,0xfc80,0x3800,0x0024, + 0x0000,0x0201,0x3433,0x0024,0x34d0,0x0024,0x6012,0x0024, + 0x0006,0x0ac1,0x2802,0x5d01,0x4012,0x0024,0xf400,0x4057, + 0x3702,0x0024,0x2000,0x0000,0x0000,0x0024,0x0006,0x8050, + 0x6890,0x0024,0x2802,0xfc80,0x3800,0x0024,0x0000,0x3000, + 0x2802,0x5ec0,0x0006,0x8150,0x0000,0x9000,0x0006,0x8150, + 0x3433,0x0024,0x34d0,0x4024,0x4192,0x0024,0x4192,0x0024, + 0x2802,0x5ec0,0xa010,0x0024,0x0000,0x0201,0x0006,0x8150, + 0x2903,0x5400,0x3613,0x0024,0x0006,0x9301,0x3473,0x0024, + 0x3c10,0x0024,0x34f0,0x8024,0x3410,0xc024,0xd234,0x0024, + 0x0000,0x3fc3,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, + 0x3500,0x0024,0x3cf0,0x0024,0x3490,0x0024,0x2802,0x5ec0, + 0x6090,0x0024,0x003f,0xfe04,0x0000,0x0401,0x0006,0x8150, + 0x2903,0x5400,0x3613,0x0024,0x0006,0x9301,0x3473,0x0024, + 0x3c10,0x0024,0x34f0,0x8024,0x3400,0xc024,0xa346,0x0024, + 0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024,0x4122,0x1042, + 0xf400,0x4055,0x0006,0x9301,0x3500,0x0024,0xd024,0x3000, + 0xb234,0x0024,0x4122,0x0024,0xf400,0x4055,0x3500,0x0024, + 0x3cf0,0x0024,0x3490,0x0024,0x2802,0x5ec0,0x6090,0x0024, + 0x0000,0x4000,0x0000,0x0202,0x0006,0x8150,0x3433,0x0024, + 0x34d0,0x4024,0x6122,0x0024,0xa010,0x0024,0x0004,0x8001, + 0x3800,0x110c,0x0006,0x8150,0x3000,0x0024,0x6012,0x1300, + 0x0000,0x0401,0x2802,0x6189,0x0000,0x0024,0x6890,0x82cc, + 0x2802,0xfc80,0x3800,0x0024,0x6012,0x0024,0x0006,0x0cc1, + 0x2802,0x8901,0x4012,0x0024,0xf400,0x4057,0x3702,0x0024, + 0x2000,0x0000,0x0000,0x0024,0x2802,0x8900,0x0000,0x0024, + 0x0016,0x2200,0x0006,0x8190,0x6892,0x2040,0x2802,0x8900, + 0x38f0,0x4024,0x002c,0x4400,0x0000,0x0081,0x0006,0x8190, + 0x3810,0x0024,0x2802,0x8900,0x38f0,0x4024,0x003b,0x8000, + 0x0000,0x0081,0x0006,0x8190,0x3810,0x0024,0x2802,0x8900, + 0x38f0,0x4024,0x0007,0xd000,0x0006,0x8190,0xb882,0x2040, + 0x2802,0x8900,0x38f0,0x4024,0x000f,0xa000,0x0006,0x8190, + 0xb882,0x2040,0x2802,0x8900,0x38f0,0x4024,0x0015,0x8880, + 0x0006,0x8190,0xb882,0x2040,0x2802,0x8900,0x38f0,0x4024, + 0x0017,0x7000,0x0006,0x8190,0xb882,0x2040,0x2802,0x8900, + 0x38f0,0x4024,0x001f,0x4000,0x0006,0x8190,0xb882,0x2040, + 0x2802,0x8900,0x38f0,0x4024,0x002b,0x1100,0x0006,0x8190, + 0xb882,0x2040,0x2802,0x8900,0x38f0,0x4024,0x002e,0xe000, + 0x0006,0x8190,0xb882,0x2040,0x2802,0x8900,0x38f0,0x4024, + 0x001d,0xc000,0x0006,0x8190,0x6892,0x2040,0x2802,0x8900, + 0x38f0,0x4024,0x0006,0x8190,0x0000,0x0201,0x0000,0xfa04, + 0x2903,0x5400,0x3613,0x0024,0x0006,0x9301,0xb88a,0x11cc, + 0x3c10,0x0024,0x34f0,0x8024,0x3410,0xc024,0xd234,0x0024, + 0x0000,0x3fc3,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, + 0x3500,0x0024,0x3cf0,0x0024,0x3490,0x0024,0xfe50,0x4005, + 0x48b2,0x0024,0xfeca,0x0024,0x40b2,0x0024,0x3810,0x0024, + 0x2802,0x8900,0x38f0,0x4024,0x003f,0xfe04,0x0000,0x0401, + 0x0006,0x8190,0x2903,0x5400,0x3613,0x0024,0x0006,0x9301, + 0x3473,0x0024,0x3c10,0x0024,0x34f0,0x8024,0x3400,0xc024, + 0xa346,0x0024,0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024, + 0x4122,0x1042,0xf400,0x4055,0x0006,0x9301,0x3500,0x0024, + 0xd024,0x3000,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, + 0x0000,0x0041,0x3500,0x0024,0x3cf0,0x0024,0x3490,0x0024, + 0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024,0x2802,0x8900, + 0x38f0,0x4024,0x003f,0xfe04,0x0000,0x0401,0x0006,0x8190, + 0x2903,0x5400,0x3613,0x0024,0x0006,0x9301,0x3473,0x0024, + 0x3c10,0x0024,0x34f0,0x8024,0x3400,0xc024,0xa346,0x0024, + 0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024,0x4122,0x1042, + 0xf400,0x4055,0x0006,0x9301,0x3500,0x0024,0xd024,0x3000, + 0xb234,0x0024,0x4122,0x0024,0xf400,0x4055,0x3500,0x0024, + 0x3cf0,0x0024,0x0000,0x0280,0x3490,0x4024,0xfe02,0x0024, + 0x48b2,0x0024,0x3810,0x0024,0x2802,0x8900,0x38f0,0x4024, + 0x0006,0x8010,0x6890,0x0024,0x2802,0xfc80,0x3800,0x0024, + 0x0000,0x0201,0x2903,0x5400,0x3613,0x11cc,0x3c10,0x0024, + 0x3490,0x4024,0x6014,0x13cc,0x0000,0x0081,0x2802,0x8c45, + 0x0006,0x80d0,0x0006,0x8010,0x6890,0x0024,0x2802,0xfc80, + 0x3800,0x0024,0x3010,0x0024,0x6012,0x0024,0x0000,0x0241, + 0x2802,0xabc9,0x0006,0x8112,0x0008,0x0001,0x3009,0x184c, + 0x3e10,0x4024,0x3000,0x8024,0x2901,0x9840,0x3e00,0x8024, + 0x36f3,0x004c,0x3000,0x3844,0x0008,0x0010,0xb884,0x3840, + 0x0000,0x0400,0x3e00,0x8024,0x3201,0x0024,0x2903,0x3400, + 0x6408,0x4091,0x0001,0x0000,0x000b,0x8011,0x0004,0x0010, + 0x36e3,0x0024,0x2915,0x8300,0x3009,0x1bc4,0x000b,0x8000, + 0x3613,0x0024,0x3e10,0x0024,0x3200,0xc024,0x2901,0x9840, + 0x3e00,0xc024,0x36f3,0x084c,0x32f0,0xf844,0x3e10,0xc024, + 0x3e00,0x8024,0x2b01,0x0091,0x0000,0x0400,0xf204,0x0804, + 0x2903,0x3400,0x6408,0x0024,0x000b,0x8011,0x0008,0x0010, + 0x0000,0x0084,0x36d3,0x0024,0x2915,0x8300,0x0003,0x8000, + 0x0005,0x0010,0x0001,0x0000,0x2915,0x8300,0x000f,0x0011, + 0x1006,0x0ac0,0x32f3,0x11cc,0x3200,0xd08c,0xff34,0x0024, + 0x48b6,0x0024,0x4020,0x0024,0x3c90,0x0024,0x2802,0xa800, + 0x34e3,0x0024,0x0006,0x8112,0x3613,0x0024,0x3e10,0x0024, + 0x3000,0x4024,0x2901,0x9840,0x3e00,0x4024,0x36f3,0x004c, + 0x3000,0x7844,0xb884,0x3841,0x2b01,0x0091,0x0000,0x0400, + 0x3e00,0x8024,0x3201,0x0024,0x2903,0x3400,0x6408,0x0024, + 0x0003,0x8000,0x000b,0x8011,0x0008,0x0010,0x36e3,0x11cc, + 0x3423,0x0024,0x3494,0xc024,0x2903,0x5f80,0x3301,0x138c, + 0x0001,0x0000,0x000f,0x0011,0x0004,0x0010,0x2903,0x64c0, + 0x3301,0x0024,0xf400,0x4510,0x000b,0x8011,0x3073,0x0024, + 0x3023,0x0024,0x3000,0x0024,0x6090,0x0024,0x3800,0x0024, + 0x0003,0x8000,0x3004,0xc024,0x0008,0x0010,0x2903,0x64c0, + 0x3301,0x0024,0x0001,0x0000,0x000f,0x0011,0x0005,0x0010, + 0x2903,0x64c0,0x3301,0x0024,0xf400,0x4510,0x3073,0x1bc4, + 0x6498,0x008c,0x3000,0x0024,0x6090,0x0024,0x3800,0x0024, + 0x0006,0x80d0,0x3000,0x0024,0x6402,0x0024,0x0006,0x8110, + 0x2802,0x9b48,0x000b,0x8000,0x000b,0x8010,0x0001,0x0000, + 0x2903,0xc580,0x0004,0x0011,0x0005,0x0011,0x000b,0x8010, + 0x0001,0x0000,0x291f,0xc6c0,0x0002,0xbd08,0x30e1,0x184c, + 0x3000,0x0024,0x6012,0x0024,0x0008,0x0001,0x2802,0xad95, + 0x0000,0x0024,0x6498,0x0024,0x3e10,0x4024,0x0000,0x0081, + 0x2901,0x9840,0x3e01,0x0024,0x36e3,0x004c,0x3000,0x0024, + 0x6012,0x0024,0x000b,0x8011,0x2802,0xb9d5,0x0006,0x8112, + 0x0000,0x0201,0x0004,0x0010,0x2915,0x8300,0x0001,0x0000, + 0x000b,0x8011,0x0005,0x0010,0x291f,0xc6c0,0x0001,0x0000, + 0x0006,0x8110,0x30e1,0x0024,0x3000,0x0024,0x6012,0x0024, + 0x0000,0x0281,0x2802,0xb4c5,0x6012,0x0024,0x000b,0x8001, + 0x2802,0xb555,0x3613,0x0024,0x36f3,0x0024,0x000b,0x8001, + 0x6498,0x184c,0x0006,0x8112,0x0003,0x8000,0x3e10,0x4024, + 0x2901,0x9840,0x3e01,0x0024,0x36f3,0x0024,0x3009,0x3844, + 0x3e10,0x0024,0x0000,0x0400,0x3000,0x8024,0x0008,0x0010, + 0x3e00,0x8024,0x3201,0x0024,0x2903,0x3400,0x6408,0x4051, + 0x36e3,0x0024,0x2802,0xbd00,0x3009,0x1bc4,0x0000,0x0400, + 0x0000,0x0011,0x3613,0x008c,0x30d0,0x7844,0x3e10,0x4024, + 0x3000,0x8024,0x0008,0x0010,0x3e00,0x8024,0x3201,0x0024, + 0x2903,0x3400,0x6408,0x0024,0x36e3,0x0024,0x3009,0x1bc4, + 0x0006,0x8a10,0x0000,0x01c1,0x3009,0x0000,0xb010,0x0024, + 0x0000,0x0024,0x2802,0xc105,0x6192,0x0024,0x2903,0x5400, + 0x6102,0x184c,0x4088,0x0024,0x0000,0x0024,0x2802,0xc105, + 0x0000,0x0024,0x0006,0x8051,0x6890,0x0024,0x3900,0x0024, + 0x3009,0x0000,0x4080,0x0024,0x0000,0x0024,0x2903,0x7345, + 0x0002,0xc5c8,0x0006,0x9f92,0x0000,0x4003,0x3009,0x0811, + 0x3100,0x8024,0xffa6,0x0024,0x48b6,0x0024,0x2903,0x7340, + 0x4384,0x0024,0x2903,0x7400,0x3613,0x0024,0x2900,0xbf40, + 0x0000,0x0024,0x2903,0x7340,0x0000,0x0024,0x0000,0x0401, + 0x3473,0x184c,0x2903,0x5400,0x3c10,0x0024,0x3c90,0x0024, + 0x290b,0x1400,0x34f3,0x0024,0x4080,0x0024,0x0000,0x0024, + 0x2802,0xf915,0x0000,0x0024,0x3473,0x0024,0x3410,0x0024, + 0x34a0,0x4024,0x6014,0x1380,0x0000,0x0024,0x2802,0xcdc5, + 0x4080,0x0024,0x0006,0x8011,0x6890,0x0024,0xb882,0x2400, + 0x0004,0x8000,0x2914,0xbec0,0x0008,0x0010,0x0000,0x0400, + 0x3143,0x108c,0x6890,0x27c0,0x3920,0x0024,0x0004,0x8000, + 0x3900,0x0024,0x34e0,0x0024,0x4080,0x0024,0x0006,0x8150, + 0x2802,0xd1c5,0x0000,0x3200,0x0000,0x0142,0x0006,0x8210, + 0x3613,0x0024,0x3e00,0x7800,0x3011,0x8024,0x30d1,0xc024, + 0xfef4,0x4087,0x48b6,0x0040,0xfeee,0x03c1,0x2914,0xa580, + 0x42b6,0x0024,0x2802,0xd5c0,0x0007,0x89d0,0x0000,0x0142, + 0x3613,0x0024,0x3e00,0x7800,0x3031,0x8024,0x3010,0x0024, + 0x30d0,0x4024,0xfe9c,0x4181,0x48be,0x0024,0xfe82,0x0040, + 0x46be,0x03c1,0xfef4,0x4087,0x48b6,0x0024,0xfeee,0x0024, + 0x2914,0xa580,0x42b6,0x0024,0x0007,0x89d0,0x0006,0x8191, + 0x4c8a,0x9800,0xfed0,0x4005,0x48b2,0x0024,0xfeca,0x0024, + 0x40b2,0x0024,0x3810,0x0024,0x38f0,0x4024,0x3111,0x8024, + 0x468a,0x0707,0x2908,0xbe80,0x3101,0x0024,0x3123,0x11cc, + 0x3100,0x108c,0x3009,0x3000,0x0004,0x8000,0x3009,0x1241, + 0x6014,0x138c,0x000b,0x8011,0x2802,0xdc01,0x0000,0x0024, + 0x3473,0x0024,0x3423,0x0024,0x3009,0x3240,0x34e3,0x0024, + 0x2802,0xf740,0x0008,0x0012,0x0000,0x0081,0x2802,0xdd89, + 0x0006,0x80d0,0xf400,0x4004,0x3000,0x0024,0x6012,0x0024, + 0x0000,0x0005,0x2802,0xe309,0x0000,0x0024,0x6540,0x0024, + 0x0000,0x0024,0x2802,0xf358,0x4490,0x0024,0x2402,0xe240, + 0x0000,0x0024,0x0006,0x8301,0x4554,0x0800,0x4122,0x0024, + 0x659a,0x4055,0x0006,0x8341,0x3d00,0x0840,0x4122,0x0024, + 0xf400,0x4055,0x3d00,0x0024,0x2802,0xf340,0x0000,0x0024, + 0x4090,0x0024,0xf400,0x4480,0x2802,0xe855,0x000b,0x8001, + 0x6540,0x0024,0x0000,0x0024,0x2802,0xf358,0x4490,0x0024, + 0x2402,0xe780,0x0000,0x0024,0x0006,0x8301,0x4554,0x0800, + 0x4122,0x0024,0x659a,0x4055,0x0006,0x8341,0x4122,0x3400, + 0xf400,0x4055,0x3210,0x0024,0x3d00,0x0024,0x2802,0xf340, + 0x0000,0x0024,0x6014,0x0024,0x0001,0x0000,0x2802,0xef95, + 0x0003,0x8001,0x0008,0x0012,0x0008,0x0010,0x0006,0x8153, + 0x3613,0x0024,0x3009,0x3811,0x2903,0xc580,0x0004,0x0011, + 0x0008,0x0010,0x0001,0x0000,0x291f,0xc6c0,0x0005,0x0011, + 0x000f,0x0011,0x0008,0x0010,0x33d0,0x184c,0x6010,0xb844, + 0x3e10,0x0024,0x0000,0x0400,0x3320,0x4024,0x3e00,0x4024, + 0x3301,0x0024,0x2903,0x3400,0x6408,0x0024,0x36e3,0x0024, + 0x3009,0x1bc4,0x3009,0x1bd1,0x6540,0x0024,0x0000,0x0024, + 0x2802,0xf358,0x4490,0x0024,0x2402,0xf300,0x0000,0x0024, + 0x0006,0x8301,0x4554,0x0840,0x4122,0x0024,0x659a,0x4055, + 0x0006,0x8341,0x4122,0x3400,0xf400,0x4055,0x3110,0x0024, + 0x3d00,0x0024,0xf400,0x4510,0x0030,0x0013,0x3073,0x184c, + 0x3e11,0x008c,0x3009,0x0001,0x6140,0x0024,0x0000,0x0201, + 0x3009,0x2000,0x0006,0x8300,0x290c,0x7300,0x3e10,0x0024, + 0x3300,0x1b8c,0xb010,0x0024,0x0000,0x0024,0x2802,0xf915, + 0x0000,0x0024,0x3473,0x0024,0x3423,0x0024,0x3009,0x1240, + 0x4080,0x138c,0x0000,0x0804,0x2802,0xdc95,0x6402,0x0024, + 0x0006,0xd312,0x0006,0xd310,0x0006,0x8191,0x3010,0x984c, + 0x30f0,0xc024,0x0000,0x0021,0xf2d6,0x07c6,0x290a,0xf5c0, + 0x4682,0x0400,0x6894,0x0840,0xb886,0x0bc1,0xbcd6,0x0024, + 0x3a10,0x8024,0x3af0,0xc024,0x36f3,0x4024,0x36f3,0xd80e, + 0x36f4,0x9813,0x36f4,0x1811,0x36f1,0x9807,0x36f1,0x1805, + 0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024, + 0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024, + 0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024, + 0x0000,0x800a,0x3e10,0x3801,0x0020,0x0001,0x3e14,0x3811, + 0x0030,0x0050,0x0030,0x0251,0x3e04,0xb813,0x3000,0x0024, + 0xc012,0x0024,0x0019,0x9300,0x3800,0x4024,0x2903,0x7100, + 0x3900,0x0024,0x2903,0x8500,0x0000,0x0300,0xb882,0x0024, + 0x2914,0xbec0,0x0006,0x8010,0x0000,0x1540,0x0007,0x8190, + 0x2900,0xa200,0x3800,0x0024,0x4080,0x0024,0x0000,0x0024, + 0x2803,0x0cd5,0x0000,0x0024,0x0006,0x8012,0x3200,0x0024, + 0x4080,0x0024,0x0030,0x0010,0x2803,0x0cd5,0x0000,0x0201, + 0x3000,0x0024,0xb010,0x0024,0x0000,0x0024,0x2803,0x0cd5, + 0x0000,0x0024,0x2900,0xa200,0x0000,0x0024,0x4080,0x0024, + 0x0006,0x8010,0x2803,0x0cd5,0x3000,0x0024,0x4080,0x0024, + 0x0000,0x0201,0x2803,0x0905,0x0030,0x0010,0x0030,0x0050, + 0xf292,0x0000,0xb012,0x0024,0x3800,0x4024,0x0030,0x0010, + 0x0000,0x0201,0x3000,0x0024,0xb010,0x0024,0x0000,0x0024, + 0x2900,0xbed5,0x0003,0x1688,0x0006,0x8011,0x3100,0x0024, + 0x4080,0x0024,0x0000,0x0024,0x2803,0x14c5,0x0000,0x0024, + 0x0007,0x8a52,0x3200,0x0024,0x4080,0x0024,0x0000,0x0024, + 0x2803,0x14c9,0x0000,0x0024,0xf292,0x0800,0x6012,0x0024, + 0x0000,0x0000,0x2803,0x1485,0x0000,0x0024,0x3200,0x0024, + 0x4090,0x0024,0xb880,0x2800,0x3900,0x0024,0x3100,0x0024, + 0x4080,0x0024,0x0000,0x0024,0x2902,0x1305,0x0003,0x0dc8, + 0x2900,0xbec0,0x0000,0x0024,0x0000,0x0010,0x0006,0x9f51, + 0x0006,0x9f92,0x0030,0x0493,0x0000,0x0201,0x6890,0xa410, + 0x3b00,0x2810,0x0006,0x8a10,0x3009,0x0000,0x6012,0x0024, + 0x0006,0x9fd0,0x2803,0x1a08,0xb880,0x0024,0x6890,0x0024, + 0x3009,0x2000,0x36f4,0x9813,0x36f4,0x1811,0x36f0,0x1801, + 0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000, + 0x36f2,0x9817,0x3613,0x0024,0x3e10,0xb810,0x3e11,0x3805, + 0x3e02,0x0024,0x0030,0x0010,0xce9a,0x0002,0x0000,0x0200, + 0x2903,0x2540,0xb024,0x0024,0xc020,0x0024,0x0000,0x0200, + 0x2803,0x1e05,0x6e9a,0x0002,0x4182,0x0024,0x0000,0x0400, + 0x2803,0x23c5,0xae1a,0x0024,0x6104,0x984c,0x0000,0x0024, + 0x2903,0x5409,0x0003,0x2388,0x6103,0xe4e5,0x2903,0x5400, + 0x408a,0x188c,0x2903,0x5400,0x408a,0x4141,0x4583,0x6465, + 0x2803,0x23c0,0xceca,0x1bcc,0xc408,0x0024,0xf2e2,0x1bc8, + 0x36f1,0x1805,0x2000,0x0011,0x36f0,0x9810,0x2000,0x0000, + 0xdc92,0x0024,0x0006,0x8a17,0x3613,0x1c00,0x6093,0xe1e3, + 0x0000,0x03c3,0x0006,0x9f95,0xb132,0x9415,0x3500,0xfc01, + 0x2803,0x3355,0xa306,0x0024,0x0006,0xd397,0x003f,0xc001, + 0x3500,0x184c,0xb011,0xe4e5,0xb182,0x1c04,0xd400,0x184c, + 0x0000,0x0205,0xac52,0x3802,0x0006,0xd3c2,0x4212,0x0024, + 0xf400,0x4057,0xb182,0x1c04,0xd400,0x0024,0xac52,0x1404, + 0xd142,0x0024,0x0000,0x3fc4,0xb142,0x0024,0x4122,0x1bc2, + 0xf400,0x4057,0x3700,0x4024,0xd101,0x6465,0x0006,0xd397, + 0x3f00,0x3814,0x0025,0xffd4,0x0006,0xd317,0x3710,0x160c, + 0x0006,0x9f94,0x37f0,0x73d5,0x6c92,0x3808,0x3f10,0x0024, + 0x3ff0,0x4024,0x3009,0x1040,0x3009,0x13c1,0x6010,0x0024, + 0x0000,0x0024,0x2903,0x8dc5,0x0003,0x2f48,0x2803,0x3194, + 0x0006,0x0001,0x4010,0x0024,0x0005,0xf601,0x6010,0x0024, + 0x0000,0x0040,0x2803,0x3314,0x0030,0x0497,0x3f00,0x0024, + 0x36f2,0x1814,0x4330,0x9803,0x2000,0x0000,0x8880,0x1bc1, + 0x3613,0x0024,0x3e22,0xb806,0x3e05,0xb814,0x3615,0x0024, + 0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb803,0x3e11,0x7807, + 0x6848,0x930c,0x3411,0x780d,0x459a,0x10c0,0x0000,0x0201, + 0x6012,0x384e,0x0000,0x0241,0x2803,0x3a95,0x6012,0x380f, + 0x2403,0x39c5,0x0000,0x0024,0x3000,0x0001,0x3101,0x8407, + 0x6cfe,0x0024,0xac42,0x0024,0xaf4e,0x2040,0x3911,0x8024, + 0x2803,0x4640,0x0000,0x0024,0x0000,0x0281,0x2803,0x3dd5, + 0x6012,0x4455,0x2403,0x3d05,0x0000,0x0024,0x3000,0x0001, + 0x3101,0x8407,0x4cf2,0x0024,0xac42,0x0024,0xaf4e,0x2040, + 0x3911,0x8024,0x2803,0x4640,0x0000,0x0024,0x0000,0x0024, + 0x2803,0x4215,0x4080,0x0024,0x3110,0x0401,0xf20f,0x0203, + 0x2403,0x4145,0x8dd6,0x0024,0x4dce,0x0024,0xf1fe,0x0024, + 0xaf4e,0x0024,0x6dc6,0x2046,0xf1df,0x0203,0xaf4f,0x1011, + 0xf20e,0x07cc,0x8dd6,0x2486,0x2803,0x4640,0x0000,0x0024, + 0x0000,0x0024,0x2803,0x4495,0x0000,0x0024,0x0fff,0xffd1, + 0x2403,0x43c5,0x3010,0x0001,0xac4f,0x0801,0x3821,0x8024, + 0x2803,0x4640,0x0000,0x0024,0x0fff,0xffd1,0x2403,0x4605, + 0x3010,0x0001,0x3501,0x9407,0xac47,0x0801,0xaf4e,0x2082, + 0x3d11,0x8024,0x36f3,0xc024,0x36f3,0x980d,0x36f1,0x5807, + 0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014,0x36e3,0x0024, + 0x2000,0x0000,0x36f2,0x9806,0x0006,0x9f97,0x3e00,0x5c15, + 0x0006,0xd397,0x003f,0xc001,0x3500,0x3840,0xb011,0xe4e5, + 0xb182,0x1c04,0xd400,0x184c,0x0000,0x0205,0xac52,0x3802, + 0x0006,0xd3c2,0x4212,0x0024,0xb182,0x4057,0x3701,0x0024, + 0xd400,0x0024,0xac52,0x1404,0xd142,0x0024,0x0000,0x3fc4, + 0xb142,0x0024,0x4122,0x1bc2,0xf400,0x4057,0x3700,0x4024, + 0xd101,0x6465,0x0006,0xd397,0x3f00,0x3814,0x0025,0xffd4, + 0x0006,0xd317,0x3710,0x160c,0x0006,0x9f94,0x37f0,0x73d5, + 0x6c92,0x0024,0x3f10,0x1040,0x3ff0,0x53c1,0x6010,0x0024, + 0x0000,0x0024,0x2803,0x5214,0x0006,0x0001,0x4010,0x0024, + 0x0005,0xf601,0x6010,0x9bd4,0x0000,0x0040,0x2803,0x5394, + 0x0030,0x0497,0x3f00,0x0024,0x2000,0x0000,0x36f0,0x5800, + 0x3e10,0xb812,0x3e11,0xb810,0x3e12,0x0024,0x0006,0x9f92, + 0x0025,0xffd0,0x3e04,0x4bd1,0x3181,0xf847,0xb68c,0x4440, + 0x3009,0x0802,0x6024,0x3806,0x0006,0x8a10,0x2903,0x8dc5, + 0x0003,0x5608,0x0000,0x0800,0x6101,0x1602,0xaf2e,0x0024, + 0x4214,0x1be3,0xaf0e,0x1811,0x0fff,0xfc00,0xb200,0x9bc7, + 0x0000,0x03c0,0x2803,0x5a45,0xb204,0xa002,0x2903,0x4880, + 0x3613,0x2002,0x4680,0x1bc8,0x36f1,0x9810,0x2000,0x0000, + 0x36f0,0x9812,0x0000,0x0400,0x6102,0x0024,0x3e11,0x3805, + 0x2803,0x5e49,0x3e02,0x0024,0x2903,0x5400,0x408a,0x188c, + 0x2903,0x5400,0x408a,0x4141,0x4582,0x1bc8,0x2000,0x0000, + 0x36f1,0x1805,0x2903,0x5400,0x4102,0x184c,0xb182,0x1bc8, + 0x2000,0x0000,0x36f1,0x1805,0x3613,0x0024,0x3e12,0xb815, + 0x3e11,0xb807,0x3e13,0xf80e,0x3e03,0x4024,0x680c,0x0024, + 0x0000,0x0024,0x2803,0x6398,0x409c,0x0024,0x2403,0x6346, + 0x0000,0x000a,0x3111,0xc024,0xfe4e,0x0007,0x47be,0x0024, + 0xf6fe,0x0024,0x3811,0xc024,0x36f3,0x4024,0x36f3,0xd80e, + 0x36f1,0x9807,0x2000,0x0000,0x36f2,0x9815,0x3613,0x0024, + 0x3e12,0xb815,0x3e11,0xb807,0x3e13,0xf80e,0x3e03,0x4024, + 0x680c,0x0024,0x0000,0x0024,0x2803,0x68d8,0x409c,0x0024, + 0x2403,0x6886,0x0000,0x000a,0x3111,0xc024,0xfe4e,0x8007, + 0x47be,0x0024,0xf6fe,0x0024,0x3009,0x2047,0x36f3,0x4024, + 0x36f3,0xd80e,0x36f1,0x9807,0x2000,0x0000,0x36f2,0x9815, + 0x2a03,0x6a4e,0x3e12,0xb817,0x3e10,0x3802,0x0000,0x800a, + 0x0006,0x9f97,0x3009,0x1fc2,0x3e04,0x5c00,0x6020,0xb810, + 0x0030,0x0451,0x2803,0x6d14,0x0006,0x0002,0x4020,0x0024, + 0x0005,0xfb02,0x6024,0x0024,0x0025,0xffd0,0x2803,0x6f51, + 0x3100,0x1c11,0xb284,0x0024,0x0030,0x0490,0x3800,0x8024, + 0x0025,0xffd0,0x3980,0x1810,0x36f4,0x7c11,0x36f0,0x1802, + 0x0030,0x0717,0x3602,0x8024,0x2100,0x0000,0x3f05,0xdbd7, + 0x0003,0x6a17,0x3613,0x0024,0x3e00,0x3801,0xf400,0x55c0, + 0x0000,0x0897,0xf400,0x57c0,0x0000,0x0024,0x2000,0x0000, + 0x36f0,0x1801,0x0006,0xd397,0x2000,0x0000,0x3700,0x0024, + 0xb183,0xe1e3,0x0000,0x0203,0xac32,0x40d5,0xd122,0x0024, + 0x0000,0x3fc3,0xb132,0x0024,0x0006,0xd3c3,0x4316,0x0024, + 0xf400,0x40d5,0x3500,0x5803,0x2000,0x0000,0xd010,0x1bc1, + 0x3613,0x0024,0x3e22,0xb815,0x3e05,0xb814,0x3615,0x0024, + 0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb803,0xb884,0xb805, + 0xb888,0x3844,0x3e11,0xb80d,0x3e03,0xf80e,0x0000,0x03ce, + 0xf400,0x4083,0x2403,0x7f8e,0xf400,0x4105,0x0000,0x0206, + 0xa562,0x0024,0x455a,0x0024,0x0020,0x0006,0xd312,0x0024, + 0xb16c,0x0024,0x0020,0x0006,0x2803,0x7e05,0xd342,0x0024, + 0x0000,0x01c6,0xd342,0x0024,0xd56a,0x0024,0x0020,0x0006, + 0x4448,0x0024,0xb16c,0x0024,0x0020,0x0146,0x2803,0x7f85, + 0x0000,0x0024,0xd468,0x0024,0x4336,0x0024,0x0000,0x4000, + 0x0006,0xd3c1,0x0006,0x9306,0x4122,0x0024,0x462c,0x4055, + 0x4092,0x3404,0xb512,0x4195,0x6294,0x3401,0x6200,0x0024, + 0x0000,0x03ce,0x2803,0x7a11,0xb888,0x0024,0x36f3,0xd80e, + 0x36f1,0x980d,0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801, + 0x3405,0x9014,0x36e3,0x0024,0x2000,0x0000,0x36f2,0x9815, + 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, + 0x3615,0x0024,0x0000,0x800a,0x3e10,0x3801,0xb880,0xb810, + 0x0006,0x9fd0,0x3e10,0x8001,0x4182,0x3811,0x0006,0xd311, + 0x2803,0x88c5,0x0006,0x8a10,0x0000,0x0200,0xbc82,0xa000, + 0x3910,0x0024,0x2903,0x7700,0x39f0,0x4024,0x0006,0x9f90, + 0x0006,0x9f51,0x3009,0x0000,0x3009,0x0401,0x6014,0x0024, + 0x0000,0x0024,0x2903,0x8dc5,0x0003,0x89c8,0x36f4,0x4024, + 0x36f0,0x9810,0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024, + 0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024, + 0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814,0x290a,0xd900, + 0x3605,0x0024,0x2910,0x0180,0x3613,0x0024,0x3405,0x9014, + 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, + 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, + 0x3615,0x0024,0x0000,0x800a,0x3e10,0xb803,0x0006,0x0002, + 0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x3811,0x0006,0x9f90, + 0x3e04,0xb813,0x3009,0x0012,0x3213,0x0024,0xf400,0x4480, + 0x6026,0x0024,0x0000,0x0024,0x2803,0x9655,0x0000,0x0024, + 0x0000,0x0012,0xf400,0x4480,0x0006,0x9f50,0x3009,0x0002, + 0x6026,0x0024,0x0000,0x0024,0x2903,0x8dc5,0x0003,0x9648, + 0x0006,0x9f93,0x3201,0x0c11,0xb58a,0x0406,0x0006,0x8a11, + 0x468e,0x8400,0xb68c,0x9813,0xcfee,0x1bd2,0x0000,0x0804, + 0xaf0e,0x9811,0x4f86,0x1bd0,0x0000,0x0021,0x6418,0x9807, + 0x6848,0x1bc6,0xad46,0x9805,0xf400,0x4080,0x36f1,0x0024, + 0x36f0,0x9803,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, + 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, + 0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a, + 0x3e10,0x3801,0x3e10,0xb803,0x3e11,0x3805,0x2803,0xa480, + 0x3e04,0x3811,0x0000,0x0401,0x2903,0x5400,0x3613,0x0024, + 0x0000,0x0080,0xb882,0x130c,0xf400,0x4510,0x3010,0x910c, + 0x30f0,0xc024,0x6dc2,0x0024,0x3810,0x0024,0x38f0,0x4024, + 0x0000,0x0201,0x3100,0x0024,0xb010,0x0024,0x0000,0x0024, + 0x2803,0xa7d5,0x0000,0x0024,0x6894,0x130c,0xb886,0x1040, + 0x3430,0x4024,0x6dca,0x0024,0x0030,0x0011,0x2803,0xa051, + 0x0000,0x0024,0xbcd2,0x0024,0x0000,0x0201,0x2803,0xa7c5, + 0x0000,0x0024,0x2903,0x5400,0x3613,0x0024,0x36f4,0x1811, + 0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014, + 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, + 0x3613,0x0024,0x3e12,0xb815,0x0000,0x800a,0x3e14,0x7813, + 0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807,0x3e13,0xf80e, + 0x6812,0x0024,0x3e03,0x7810,0x0fff,0xffd3,0x0000,0x0091, + 0xbd86,0x9850,0x3e10,0x3804,0x3e00,0x7812,0xbe8a,0x8bcc, + 0x409e,0x8086,0x2403,0xaf07,0xfe49,0x2821,0x526a,0x8801, + 0x5c87,0x280e,0x4eba,0x9812,0x4286,0x40e1,0xb284,0x1bc1, + 0x4de6,0x0024,0xad17,0x2627,0x4fde,0x9804,0x4498,0x1bc0, + 0x0000,0x0024,0x2803,0xad15,0x3a11,0xa807,0x36f3,0x4024, + 0x36f3,0xd80e,0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803, + 0x36f4,0x5813,0x2000,0x0000,0x36f2,0x9815,0x3613,0x0024, + 0x3e12,0xb815,0x0000,0x800a,0x3e10,0xb803,0x3e11,0x3805, + 0x3e11,0xb807,0x3e13,0xf80e,0x6812,0x0024,0x3e03,0x7810, + 0x3009,0x1850,0x3e10,0x3804,0x3e10,0x7812,0x32f3,0x0024, + 0xbd86,0x0024,0x4091,0xe2e3,0x3009,0x0046,0x2403,0xba80, + 0x3009,0x0047,0x32f0,0x0801,0xfe1f,0x6465,0x5e8a,0x0024, + 0x44ba,0x0024,0xfee2,0x0024,0x5d8a,0x1800,0x4482,0x4160, + 0x48ba,0x8046,0x4dc6,0x1822,0x4de6,0x8047,0x36f3,0x0024, + 0x36f0,0x5812,0xad17,0x2627,0x4fde,0x9804,0x4498,0x1bc0, + 0x0000,0x0024,0x2803,0xb615,0x3a11,0xa807,0x36f3,0x4024, + 0x36f3,0xd80e,0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803, + 0x2000,0x0000,0x36f2,0x9815,0xb386,0x40d7,0x4284,0x184c, + 0x0000,0x05c0,0x2803,0xc015,0xf5d8,0x3804,0x0000,0x0984, + 0x6400,0xb84a,0x3e13,0xf80d,0xa204,0x380e,0x0000,0x800a, + 0x0000,0x00ce,0x2403,0xc34e,0xffa4,0x0024,0x48b6,0x0024, + 0x0000,0x0024,0x2803,0xc344,0x4000,0x40c2,0x4224,0x0024, + 0x6090,0x0024,0xffa4,0x0024,0x0fff,0xfe83,0xfe86,0x1bce, + 0x36f3,0xd80d,0x48b6,0x0024,0x0fff,0xff03,0xa230,0x45c3, + 0x2000,0x0000,0x36f1,0x180a,0x4080,0x184c,0x3e13,0x780f, + 0x2803,0xc785,0x4090,0xb80e,0x2403,0xc700,0x3e04,0x0440, + 0x3810,0x0440,0x3604,0x0024,0x3009,0x1bce,0x3603,0x5bcf, + 0x2000,0x0000,0x0000,0x0024, + 0x0007,0x0001, /*copy 1*/ + 0x802e, + 0x0006,0x0002, /*copy 2*/ + 0x2801,0x6780, + 0x0007,0x0001, /*copy 1*/ + 0x8030, + 0x0006,0x0002, /*copy 2*/ + 0x2800,0x1b40, + 0x0007,0x0001, /*copy 1*/ + 0x8028, + 0x0006,0x0002, /*copy 2*/ + 0x2a00,0x3f8e, + 0x0007,0x0001, /*copy 1*/ + 0x8032, + 0x0006,0x0002, /*copy 2*/ + 0x2800,0x5c00, + 0x0007,0x0001, /*copy 1*/ + 0x3580, + 0x0006, 0x8038, 0x0000, /*Rle(56)*/ + 0x0007,0x0001, /*copy 1*/ + 0xfab3, + 0x0006,0x01a4, /*copy 420*/ + 0x0001,0x0001,0x0001,0x0001,0x0000,0xffff,0xfffe,0xfffb, + 0xfff9,0xfff5,0xfff2,0xffed,0xffe8,0xffe3,0xffde,0xffd8, + 0xffd3,0xffce,0xffca,0xffc7,0xffc4,0xffc4,0xffc5,0xffc7, + 0xffcc,0xffd3,0xffdc,0xffe6,0xfff3,0x0001,0x0010,0x001f, + 0x002f,0x003f,0x004e,0x005b,0x0066,0x006f,0x0074,0x0075, + 0x0072,0x006b,0x005f,0x004f,0x003c,0x0024,0x0009,0xffed, + 0xffcf,0xffb0,0xff93,0xff77,0xff5f,0xff4c,0xff3d,0xff35, + 0xff34,0xff3b,0xff4a,0xff60,0xff7e,0xffa2,0xffcd,0xfffc, + 0x002e,0x0061,0x0094,0x00c4,0x00f0,0x0114,0x0131,0x0144, + 0x014b,0x0146,0x0134,0x0116,0x00eb,0x00b5,0x0075,0x002c, + 0xffde,0xff8e,0xff3d,0xfeef,0xfea8,0xfe6a,0xfe39,0xfe16, + 0xfe05,0xfe06,0xfe1b,0xfe43,0xfe7f,0xfecd,0xff2a,0xff95, + 0x0009,0x0082,0x00fd,0x0173,0x01e1,0x0242,0x0292,0x02cc, + 0x02ec,0x02f2,0x02da,0x02a5,0x0253,0x01e7,0x0162,0x00c9, + 0x0021,0xff70,0xfebc,0xfe0c,0xfd68,0xfcd5,0xfc5b,0xfc00, + 0xfbc9,0xfbb8,0xfbd2,0xfc16,0xfc85,0xfd1b,0xfdd6,0xfeae, + 0xff9e,0x009c,0x01a0,0x02a1,0x0392,0x046c,0x0523,0x05b0, + 0x060a,0x062c,0x0613,0x05bb,0x0526,0x0456,0x0351,0x021f, + 0x00c9,0xff5a,0xfde1,0xfc6a,0xfb05,0xf9c0,0xf8aa,0xf7d0, + 0xf73d,0xf6fa,0xf70f,0xf77e,0xf848,0xf96b,0xfadf,0xfc9a, + 0xfe8f,0x00ad,0x02e3,0x051a,0x073f,0x0939,0x0af4,0x0c5a, + 0x0d59,0x0de1,0x0de5,0x0d5c,0x0c44,0x0a9e,0x0870,0x05c7, + 0x02b4,0xff4e,0xfbaf,0xf7f8,0xf449,0xf0c7,0xed98,0xeae0, + 0xe8c4,0xe765,0xe6e3,0xe756,0xe8d2,0xeb67,0xef19,0xf3e9, + 0xf9cd,0x00b5,0x088a,0x112b,0x1a72,0x2435,0x2e42,0x3866, + 0x426b,0x4c1b,0x553e,0x5da2,0x6516,0x6b6f,0x7087,0x7441, + 0x7686,0x774a,0x7686,0x7441,0x7087,0x6b6f,0x6516,0x5da2, + 0x553e,0x4c1b,0x426b,0x3866,0x2e42,0x2435,0x1a72,0x112b, + 0x088a,0x00b5,0xf9cd,0xf3e9,0xef19,0xeb67,0xe8d2,0xe756, + 0xe6e3,0xe765,0xe8c4,0xeae0,0xed98,0xf0c7,0xf449,0xf7f8, + 0xfbaf,0xff4e,0x02b4,0x05c7,0x0870,0x0a9e,0x0c44,0x0d5c, + 0x0de5,0x0de1,0x0d59,0x0c5a,0x0af4,0x0939,0x073f,0x051a, + 0x02e3,0x00ad,0xfe8f,0xfc9a,0xfadf,0xf96b,0xf848,0xf77e, + 0xf70f,0xf6fa,0xf73d,0xf7d0,0xf8aa,0xf9c0,0xfb05,0xfc6a, + 0xfde1,0xff5a,0x00c9,0x021f,0x0351,0x0456,0x0526,0x05bb, + 0x0613,0x062c,0x060a,0x05b0,0x0523,0x046c,0x0392,0x02a1, + 0x01a0,0x009c,0xff9e,0xfeae,0xfdd6,0xfd1b,0xfc85,0xfc16, + 0xfbd2,0xfbb8,0xfbc9,0xfc00,0xfc5b,0xfcd5,0xfd68,0xfe0c, + 0xfebc,0xff70,0x0021,0x00c9,0x0162,0x01e7,0x0253,0x02a5, + 0x02da,0x02f2,0x02ec,0x02cc,0x0292,0x0242,0x01e1,0x0173, + 0x00fd,0x0082,0x0009,0xff95,0xff2a,0xfecd,0xfe7f,0xfe43, + 0xfe1b,0xfe06,0xfe05,0xfe16,0xfe39,0xfe6a,0xfea8,0xfeef, + 0xff3d,0xff8e,0xffde,0x002c,0x0075,0x00b5,0x00eb,0x0116, + 0x0134,0x0146,0x014b,0x0144,0x0131,0x0114,0x00f0,0x00c4, + 0x0094,0x0061,0x002e,0xfffc,0xffcd,0xffa2,0xff7e,0xff60, + 0xff4a,0xff3b,0xff34,0xff35,0xff3d,0xff4c,0xff5f,0xff77, + 0xff93,0xffb0,0xffcf,0xffed,0x0009,0x0024,0x003c,0x004f, + 0x005f,0x006b,0x0072,0x0075,0x0074,0x006f,0x0066,0x005b, + 0x004e,0x003f,0x002f,0x001f,0x0010,0x0001,0xfff3,0xffe6, + 0xffdc,0xffd3,0xffcc,0xffc7,0xffc5,0xffc4,0xffc4,0xffc7, + 0xffca,0xffce,0xffd3,0xffd8,0xffde,0xffe3,0xffe8,0xffed, + 0xfff2,0xfff5,0xfff9,0xfffb,0xfffe,0xffff,0x0000,0x0001, + 0x0001,0x0001,0x0001,0x0000, + 0x0007,0x0001, /*copy 1*/ + 0x180b, + 0x0006,0x000d, /*copy 13*/ + 0x000f,0x0010,0x001c,0xfab3,0x3580,0x804b,0xa04b,0x0001, + 0x0000,0x3580,0x01a4,0x069e,0x06bc, + 0x0006, 0x8006, 0x0704, /*Rle(6)*/ + 0x0006,0x0027, /*copy 39*/ + 0x06d9,0x06d9,0x06d9,0x06d9,0x06d9,0x0908,0x08ec,0x08f0, + 0x08f4,0x08f8,0x08fc,0x0900,0x0904,0x0937,0x093b,0x093e, + 0x093e,0x093e,0x093e,0x0946,0x0959,0x0a24,0x0990,0x0995, + 0x099b,0x09a1,0x09a6,0x09ab,0x09b0,0x09b5,0x09ba,0x09bf, + 0x09c4,0x09c9,0x09e2,0x0a01,0x0a20,0x5a82,0x5a82, + 0x0006, 0x8006, 0x0000, /*Rle(6)*/ + 0x0006,0x0018, /*copy 24*/ + 0x6fb8,0xc180,0xc180,0x6fb8,0x0000,0x0000,0x0000,0x0000, + 0x5a82,0x5a82,0x6fb8,0xc180,0xc180,0x6fb8,0x0000,0x0000, + 0x5a82,0x5a82,0x5a82,0x5a82,0x6fb8,0xc180,0xc180,0x6fb8, + 0x0007,0x0001, /*copy 1*/ + 0x5800, + 0x0006,0x0001, /*copy 1*/ + 0x0001, + 0x0006, 0x8007, 0x0000, /*Rle(7)*/ + 0x0006,0x0018, /*copy 24*/ + 0x0002,0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000, + 0x0003,0x0000,0xfffd,0xffff,0x0001,0x0000,0x0000,0x0000, + 0x0004,0x0000,0xfffa,0xffff,0x0004,0x0000,0xffff,0xffff, + 0x000a,0x0001, /*copy 1*/ + 0x0300, + }; + + + + + + + + + + + + + + + + From cfa28a9a7533b6bc4e68b3fee3d8e314631f98d0 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Thu, 2 Jul 2015 13:09:38 -0400 Subject: [PATCH 07/28] add new arduino_uip + tweak variants for Netduino2Plus ENC28J60/SPI networking --- STM32F4/cores/maple/Client.h | 45 + STM32F4/cores/maple/IPAddress.cpp | 89 + STM32F4/cores/maple/IPAddress.h | 76 + STM32F4/cores/maple/Printable.h | 40 + STM32F4/cores/maple/Server.h | 30 + STM32F4/cores/maple/Udp.h | 88 + STM32F4/cores/maple/avr/dtostrf.c | 29 + STM32F4/cores/maple/avr/dtostrf.h | 29 + STM32F4/cores/maple/avr/pgmspace.h | 44 + STM32F4/cores/maple/libmaple/gpioF2.c | 12 + STM32F4/cores/maple/libmaple/rccF2.c | 24 +- STM32F4/cores/maple/libmaple/rccF2.h | 11 + STM32F4/libraries/arduino_uip/Dhcp.cpp | 478 +++++ STM32F4/libraries/arduino_uip/Dhcp.h | 178 ++ STM32F4/libraries/arduino_uip/Dns.cpp | 422 ++++ STM32F4/libraries/arduino_uip/Dns.h | 41 + STM32F4/libraries/arduino_uip/README | 227 ++ STM32F4/libraries/arduino_uip/UIPClient.cpp | 586 +++++ STM32F4/libraries/arduino_uip/UIPClient.h | 112 + STM32F4/libraries/arduino_uip/UIPEthernet.cpp | 486 +++++ STM32F4/libraries/arduino_uip/UIPEthernet.h | 129 ++ STM32F4/libraries/arduino_uip/UIPServer.cpp | 63 + STM32F4/libraries/arduino_uip/UIPServer.h | 40 + STM32F4/libraries/arduino_uip/UIPUdp.cpp | 385 ++++ STM32F4/libraries/arduino_uip/UIPUdp.h | 126 ++ STM32F4/libraries/arduino_uip/ethernet_comp.h | 9 + .../AdvancedChatServer/AdvancedChatServer.ino | 104 + .../examples/EchoServer/EchoServer.ino | 58 + .../examples/TcpClient/TcpClient.ino | 77 + .../examples/TcpServer/TcpServer.ino | 74 + .../examples/UdpClient/UdpClient.ino | 93 + .../examples/UdpServer/UdpServer.ino | 88 + STM32F4/libraries/arduino_uip/keywords.txt | 58 + .../libraries/arduino_uip/library.properties | 10 + .../arduino_uip/tests/perl/tcpclient.pl | 34 + .../arduino_uip/tests/perl/tcpserver.pl | 53 + .../arduino_uip/tests/perl/udpclient.pl | 26 + .../arduino_uip/tests/perl/udpserver.pl | 40 + .../arduino_uip/utility/Enc28J60Network.cpp | 646 ++++++ .../arduino_uip/utility/Enc28J60Network.h | 108 + .../arduino_uip/utility/clock-arch.cpp | 30 + .../arduino_uip/utility/clock-arch.h | 27 + .../libraries/arduino_uip/utility/enc28j60.h | 257 +++ .../libraries/arduino_uip/utility/mempool.cpp | 168 ++ .../libraries/arduino_uip/utility/mempool.h | 54 + .../arduino_uip/utility/mempool_conf.h | 34 + .../libraries/arduino_uip/utility/uip-conf.h | 185 ++ STM32F4/libraries/arduino_uip/utility/uip.c | 1897 +++++++++++++++++ STM32F4/libraries/arduino_uip/utility/uip.h | 1601 ++++++++++++++ .../libraries/arduino_uip/utility/uip_arch.h | 138 ++ .../libraries/arduino_uip/utility/uip_arp.c | 423 ++++ .../libraries/arduino_uip/utility/uip_arp.h | 144 ++ .../libraries/arduino_uip/utility/uip_clock.h | 88 + .../arduino_uip/utility/uip_debug.cpp | 170 ++ .../libraries/arduino_uip/utility/uip_debug.h | 18 + .../libraries/arduino_uip/utility/uip_timer.c | 127 ++ .../libraries/arduino_uip/utility/uip_timer.h | 86 + .../arduino_uip/utility/uipethernet-conf.h | 29 + .../libraries/arduino_uip/utility/uipopt.h | 543 +++++ STM32F4/libraries/arduino_uip/utility/util.h | 13 + .../variants/discovery_f407/discovery_f4.cpp | 12 +- .../variants/discovery_f407/discovery_f4.h | 12 + 62 files changed, 11319 insertions(+), 5 deletions(-) create mode 100644 STM32F4/cores/maple/Client.h create mode 100644 STM32F4/cores/maple/IPAddress.cpp create mode 100644 STM32F4/cores/maple/IPAddress.h create mode 100644 STM32F4/cores/maple/Printable.h create mode 100644 STM32F4/cores/maple/Server.h create mode 100644 STM32F4/cores/maple/Udp.h create mode 100644 STM32F4/cores/maple/avr/dtostrf.c create mode 100644 STM32F4/cores/maple/avr/dtostrf.h create mode 100644 STM32F4/cores/maple/avr/pgmspace.h create mode 100644 STM32F4/libraries/arduino_uip/Dhcp.cpp create mode 100644 STM32F4/libraries/arduino_uip/Dhcp.h create mode 100644 STM32F4/libraries/arduino_uip/Dns.cpp create mode 100644 STM32F4/libraries/arduino_uip/Dns.h create mode 100644 STM32F4/libraries/arduino_uip/README create mode 100644 STM32F4/libraries/arduino_uip/UIPClient.cpp create mode 100644 STM32F4/libraries/arduino_uip/UIPClient.h create mode 100644 STM32F4/libraries/arduino_uip/UIPEthernet.cpp create mode 100644 STM32F4/libraries/arduino_uip/UIPEthernet.h create mode 100644 STM32F4/libraries/arduino_uip/UIPServer.cpp create mode 100644 STM32F4/libraries/arduino_uip/UIPServer.h create mode 100644 STM32F4/libraries/arduino_uip/UIPUdp.cpp create mode 100644 STM32F4/libraries/arduino_uip/UIPUdp.h create mode 100644 STM32F4/libraries/arduino_uip/ethernet_comp.h create mode 100644 STM32F4/libraries/arduino_uip/examples/AdvancedChatServer/AdvancedChatServer.ino create mode 100644 STM32F4/libraries/arduino_uip/examples/EchoServer/EchoServer.ino create mode 100644 STM32F4/libraries/arduino_uip/examples/TcpClient/TcpClient.ino create mode 100644 STM32F4/libraries/arduino_uip/examples/TcpServer/TcpServer.ino create mode 100644 STM32F4/libraries/arduino_uip/examples/UdpClient/UdpClient.ino create mode 100644 STM32F4/libraries/arduino_uip/examples/UdpServer/UdpServer.ino create mode 100644 STM32F4/libraries/arduino_uip/keywords.txt create mode 100644 STM32F4/libraries/arduino_uip/library.properties create mode 100755 STM32F4/libraries/arduino_uip/tests/perl/tcpclient.pl create mode 100755 STM32F4/libraries/arduino_uip/tests/perl/tcpserver.pl create mode 100755 STM32F4/libraries/arduino_uip/tests/perl/udpclient.pl create mode 100755 STM32F4/libraries/arduino_uip/tests/perl/udpserver.pl create mode 100644 STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp create mode 100644 STM32F4/libraries/arduino_uip/utility/Enc28J60Network.h create mode 100644 STM32F4/libraries/arduino_uip/utility/clock-arch.cpp create mode 100644 STM32F4/libraries/arduino_uip/utility/clock-arch.h create mode 100644 STM32F4/libraries/arduino_uip/utility/enc28j60.h create mode 100644 STM32F4/libraries/arduino_uip/utility/mempool.cpp create mode 100644 STM32F4/libraries/arduino_uip/utility/mempool.h create mode 100644 STM32F4/libraries/arduino_uip/utility/mempool_conf.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip-conf.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip.c create mode 100644 STM32F4/libraries/arduino_uip/utility/uip.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_arch.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_arp.c create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_arp.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_clock.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_debug.cpp create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_debug.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_timer.c create mode 100644 STM32F4/libraries/arduino_uip/utility/uip_timer.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uipethernet-conf.h create mode 100644 STM32F4/libraries/arduino_uip/utility/uipopt.h create mode 100644 STM32F4/libraries/arduino_uip/utility/util.h diff --git a/STM32F4/cores/maple/Client.h b/STM32F4/cores/maple/Client.h new file mode 100644 index 0000000..b8e5d93 --- /dev/null +++ b/STM32F4/cores/maple/Client.h @@ -0,0 +1,45 @@ +/* + Client.h - Base class that provides Client + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef client_h +#define client_h +#include "Print.h" +#include "Stream.h" +#include "IPAddress.h" + +class Client : public Stream { + +public: + virtual int connect(IPAddress ip, uint16_t port) =0; + virtual int connect(const char *host, uint16_t port) =0; + virtual size_t write(uint8_t) =0; + virtual size_t write(const uint8_t *buf, size_t size) =0; + virtual int available() = 0; + virtual int read() = 0; + virtual int read(uint8_t *buf, size_t size) = 0; + virtual int peek() = 0; + virtual void flush() = 0; + virtual void stop() = 0; + virtual uint8_t connected() = 0; + virtual operator bool() = 0; +protected: + uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; +}; + +#endif diff --git a/STM32F4/cores/maple/IPAddress.cpp b/STM32F4/cores/maple/IPAddress.cpp new file mode 100644 index 0000000..a8ed095 --- /dev/null +++ b/STM32F4/cores/maple/IPAddress.cpp @@ -0,0 +1,89 @@ +/* + IPAddress.cpp - Base class that provides IPAddress + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include + +IPAddress::IPAddress() +{ + _address.dword = 0; +} + +IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) +{ + _address.bytes[0] = first_octet; + _address.bytes[1] = second_octet; + _address.bytes[2] = third_octet; + _address.bytes[3] = fourth_octet; +} + +IPAddress::IPAddress(uint32_t address) +{ + _address.dword = address; +} + +IPAddress::IPAddress(const uint8_t *address) +{ + memcpy(_address.bytes, address, sizeof(_address.bytes)); +} + +IPAddress& IPAddress::operator=(const uint8_t *address) +{ + memcpy(_address.bytes, address, sizeof(_address.bytes)); + return *this; +} + +IPAddress& IPAddress::operator=(uint32_t address) +{ + _address.dword = address; + return *this; +} + +bool IPAddress::operator==(const uint8_t* addr) const +{ + return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0; +} + +size_t IPAddress::printTo(Print& p) const +{ + size_t n = 0; + for (int i =0; i < 3; i++) + { + n += p.print(_address.bytes[i], DEC); + n += p.print('.'); + } + n += p.print(_address.bytes[3], DEC); + return n; +} + +char *IPAddress::toCharArray() +{ + static char szRet[20]; + String str = String(_address.bytes[0]); + str += "."; + str += String(_address.bytes[1]); + str += "."; + str += String(_address.bytes[2]); + str += "."; + str += String(_address.bytes[3]); + str.toCharArray(szRet, 20); + return szRet; +} + diff --git a/STM32F4/cores/maple/IPAddress.h b/STM32F4/cores/maple/IPAddress.h new file mode 100644 index 0000000..eb8a7c0 --- /dev/null +++ b/STM32F4/cores/maple/IPAddress.h @@ -0,0 +1,76 @@ +/* + IPAddress.h - Base class that provides IPAddress + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef IPAddress_h +#define IPAddress_h + +#include +#include + +// A class to make it easier to handle and pass around IP addresses + +class IPAddress : public Printable { +private: + union { + uint8_t bytes[4]; // IPv4 address + uint32_t dword; + } _address; + + // Access the raw byte array containing the address. Because this returns a pointer + // to the internal structure rather than a copy of the address this function should only + // be used when you know that the usage of the returned uint8_t* will be transient and not + // stored. + uint8_t* raw_address() { return _address.bytes; }; + +public: + // Constructors + IPAddress(); + IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); + IPAddress(uint32_t address); + IPAddress(const uint8_t *address); + + // Overloaded cast operator to allow IPAddress objects to be used where a pointer + // to a four-byte uint8_t array is expected + operator uint32_t() const { return _address.dword; }; + bool operator==(const IPAddress& addr) const { return _address.dword == addr._address.dword; }; + bool operator==(const uint8_t* addr) const; + + // Overloaded index operator to allow getting and setting individual octets of the address + uint8_t operator[](int index) const { return _address.bytes[index]; }; + uint8_t& operator[](int index) { return _address.bytes[index]; }; + + // Overloaded copy operators to allow initialisation of IPAddress objects from other types + IPAddress& operator=(const uint8_t *address); + IPAddress& operator=(uint32_t address); + + virtual size_t printTo(Print& p) const; + char * toCharArray(); + + friend class EthernetClass; + friend class UDP; + friend class Client; + friend class Server; + friend class DhcpClass; + friend class DNSClient; +}; + +const IPAddress INADDR_NONE(0,0,0,0); + + +#endif diff --git a/STM32F4/cores/maple/Printable.h b/STM32F4/cores/maple/Printable.h new file mode 100644 index 0000000..2a1b2e9 --- /dev/null +++ b/STM32F4/cores/maple/Printable.h @@ -0,0 +1,40 @@ +/* + Printable.h - Interface class that allows printing of complex types + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Printable_h +#define Printable_h + +#include + +class Print; + +/** The Printable class provides a way for new classes to allow themselves to be printed. + By deriving from Printable and implementing the printTo method, it will then be possible + for users to print out instances of this class by passing them into the usual + Print::print and Print::println methods. +*/ + +class Printable +{ + public: + virtual size_t printTo(Print& p) const = 0; +}; + +#endif + diff --git a/STM32F4/cores/maple/Server.h b/STM32F4/cores/maple/Server.h new file mode 100644 index 0000000..69e3e39 --- /dev/null +++ b/STM32F4/cores/maple/Server.h @@ -0,0 +1,30 @@ +/* + Server.h - Base class that provides Server + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef server_h +#define server_h + +#include "Print.h" + +class Server : public Print { +public: + virtual void begin() =0; +}; + +#endif diff --git a/STM32F4/cores/maple/Udp.h b/STM32F4/cores/maple/Udp.h new file mode 100644 index 0000000..dc5644b --- /dev/null +++ b/STM32F4/cores/maple/Udp.h @@ -0,0 +1,88 @@ +/* + * Udp.cpp: Library to send/receive UDP packets. + * + * NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these) + * 1) UDP does not guarantee the order in which assembled UDP packets are received. This + * might not happen often in practice, but in larger network topologies, a UDP + * packet can be received out of sequence. + * 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being + * aware of it. Again, this may not be a concern in practice on small local networks. + * For more information, see http://www.cafeaulait.org/course/week12/35.html + * + * MIT License: + * Copyright (c) 2008 Bjoern Hartmann + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * bjoern@cs.stanford.edu 12/30/2008 + */ + +#ifndef udp_h +#define udp_h + +#include +#include + +class UDP : public Stream { + +public: + virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual void stop() =0; // Finish with the UDP socket + + // Sending UDP packets + + // Start building up a packet to send to the remote host specific in ip and port + // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port + virtual int beginPacket(IPAddress ip, uint16_t port) =0; + // Start building up a packet to send to the remote host specific in host and port + // Returns 1 if successful, 0 if there was a problem resolving the hostname or port + virtual int beginPacket(const char *host, uint16_t port) =0; + // Finish off this packet and send it + // Returns 1 if the packet was sent successfully, 0 if there was an error + virtual int endPacket() =0; + // Write a single byte into the packet + virtual size_t write(uint8_t) =0; + // Write size bytes from buffer into the packet + virtual size_t write(const uint8_t *buffer, size_t size) =0; + + // Start processing the next available incoming packet + // Returns the size of the packet in bytes, or 0 if no packets are available + virtual int parsePacket() =0; + // Number of bytes remaining in the current packet + virtual int available() =0; + // Read a single byte from the current packet + virtual int read() =0; + // Read up to len bytes from the current packet and place them into buffer + // Returns the number of bytes read, or 0 if none are available + virtual int read(unsigned char* buffer, size_t len) =0; + // Read up to len characters from the current packet and place them into buffer + // Returns the number of characters read, or 0 if none are available + virtual int read(char* buffer, size_t len) =0; + // Return the next byte from the current packet without moving on to the next byte + virtual int peek() =0; + virtual void flush() =0; // Finish reading the current packet + + // Return the IP address of the host who sent the current incoming packet + virtual IPAddress remoteIP() =0; + // Return the port of the host who sent the current incoming packet + virtual uint16_t remotePort() =0; +protected: + uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; +}; + +#endif diff --git a/STM32F4/cores/maple/avr/dtostrf.c b/STM32F4/cores/maple/avr/dtostrf.c new file mode 100644 index 0000000..7f90154 --- /dev/null +++ b/STM32F4/cores/maple/avr/dtostrf.c @@ -0,0 +1,29 @@ +/* + dtostrf - Emulation for dtostrf function from avr-libc + Copyright (c) 2013 Arduino. All rights reserved. + Written by Cristian Maglie + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +char *dtostrf (double val, signed char width, unsigned char prec, char *sout) { + char fmt[20]; + sprintf(fmt, "%%%d.%df", width, prec); + sprintf(sout, fmt, val); + return sout; +} + diff --git a/STM32F4/cores/maple/avr/dtostrf.h b/STM32F4/cores/maple/avr/dtostrf.h new file mode 100644 index 0000000..0bf9f57 --- /dev/null +++ b/STM32F4/cores/maple/avr/dtostrf.h @@ -0,0 +1,29 @@ +/* + dtostrf - Emulation for dtostrf function from avr-libc + Copyright (c) 2013 Arduino. All rights reserved. + Written by Cristian Maglie + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +char *dtostrf (double val, signed char width, unsigned char prec, char *sout); + +#ifdef __cplusplus +} +#endif diff --git a/STM32F4/cores/maple/avr/pgmspace.h b/STM32F4/cores/maple/avr/pgmspace.h new file mode 100644 index 0000000..9b344c9 --- /dev/null +++ b/STM32F4/cores/maple/avr/pgmspace.h @@ -0,0 +1,44 @@ +#ifndef __PGMSPACE_H_ +#define __PGMSPACE_H_ 1 + +#include + +#define PROGMEM +#define PGM_P const char * +#define PSTR(str) (str) + +#define _SFR_BYTE(n) (n) + +typedef void prog_void; +typedef char prog_char; +typedef unsigned char prog_uchar; +typedef int8_t prog_int8_t; +typedef uint8_t prog_uint8_t; +typedef int16_t prog_int16_t; +typedef uint16_t prog_uint16_t; +typedef int32_t prog_int32_t; +typedef uint32_t prog_uint32_t; + +#define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) +#define strcpy_P(dest, src) strcpy((dest), (src)) +#define strcat_P(dest, src) strcat((dest), (src)) +#define strcmp_P(a, b) strcmp((a), (b)) +#define strstr_P(a, b) strstr((a), (b)) +#define strlen_P(a) strlen((a)) +#define sprintf_P(s, f, ...) sprintf((s), (f), __VA_ARGS__) + +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#define pgm_read_word(addr) (*(const unsigned short *)(addr)) +#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) +#define pgm_read_float(addr) (*(const float *)(addr)) + +#define pgm_read_byte_near(addr) pgm_read_byte(addr) +#define pgm_read_word_near(addr) pgm_read_word(addr) +#define pgm_read_dword_near(addr) pgm_read_dword(addr) +#define pgm_read_float_near(addr) pgm_read_float(addr) +#define pgm_read_byte_far(addr) pgm_read_byte(addr) +#define pgm_read_word_far(addr) pgm_read_word(addr) +#define pgm_read_dword_far(addr) pgm_read_dword(addr) +#define pgm_read_float_far(addr) pgm_read_float(addr) + +#endif diff --git a/STM32F4/cores/maple/libmaple/gpioF2.c b/STM32F4/cores/maple/libmaple/gpioF2.c index 47f3754..b04c7e9 100644 --- a/STM32F4/cores/maple/libmaple/gpioF2.c +++ b/STM32F4/cores/maple/libmaple/gpioF2.c @@ -126,6 +126,18 @@ void gpio_init_all(void) { gpio_init(GPIOF); gpio_init(GPIOG); #endif + +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS + // PA8 Output the Master Clock MCO1 + gpio_set_af_mode(GPIOA, 8, 0); + gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); + // PB4 as alternate MISO Input + gpio_set_af_mode(GPIOB, 4, 5); + // PA5 as alternate SCK Output + gpio_set_af_mode(GPIOA, 5, 5); + // PA7 as alternate MOSI Output + gpio_set_af_mode(GPIOA, 7, 5); +#endif } /** diff --git a/STM32F4/cores/maple/libmaple/rccF2.c b/STM32F4/cores/maple/libmaple/rccF2.c index 40816c4..5b3b8ec 100644 --- a/STM32F4/cores/maple/libmaple/rccF2.c +++ b/STM32F4/cores/maple/libmaple/rccF2.c @@ -34,6 +34,7 @@ #include "libmaple.h" #include "flash.h" +#include "gpio.h" #include "rcc.h" #include "bitband.h" @@ -167,6 +168,18 @@ typedef struct typedef uint32 uint32_t; +void InitMCO1() +{ + rcc_reg_map *RCC = RCC_BASE; + // Turn MCO1 Master Clock Output mode + RCC->CFGR &= RCC_CFGR_MCO1_RESET_MASK; + RCC->CFGR |= RCC_CFGR_MCO1Source_HSE | RCC_CFGR_MCO1Div_1; + // PA8 Output the Master Clock MCO1 + gpio_set_af_mode(GPIOA, 8, 0); + gpio_set_mode(GPIOA, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); +} + + void SetupClock72MHz() { uint32_t SystemCoreClock = 72000000; @@ -377,6 +390,10 @@ void SetupClock168MHz() uint32 StartUpCounter = 0, HSEStatus = 0; rcc_reg_map *RCC = RCC_BASE; +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS + InitMCO1(); +#endif + /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); @@ -447,20 +464,19 @@ void SetupClock168MHz() } - void rcc_clk_init(rcc_sysclk_src sysclk_src, rcc_pllsrc pll_src, rcc_pll_multiplier pll_mul) { //SetupClock72MHz(); #if STM32_TICKS_PER_US == 168 - SetupClock168MHz(); + SetupClock168MHz(); #endif #if STM32_TICKS_PER_US == 120 - SetupClock120MHz(); + SetupClock120MHz(); #endif #if STM32_TICKS_PER_US == 72 - SetupClock72MHz(); + SetupClock72MHz(); #endif } diff --git a/STM32F4/cores/maple/libmaple/rccF2.h b/STM32F4/cores/maple/libmaple/rccF2.h index 9982e55..597870b 100644 --- a/STM32F4/cores/maple/libmaple/rccF2.h +++ b/STM32F4/cores/maple/libmaple/rccF2.h @@ -125,6 +125,17 @@ typedef struct #define RCC_CFGR_SW_PLL 0x2 #define RCC_CFGR_SW_HSE 0x1 +#define RCC_CFGR_MCO1Source_HSI ((uint32_t)0x00000000) +#define RCC_CFGR_MCO1Source_LSE ((uint32_t)0x00200000) +#define RCC_CFGR_MCO1Source_HSE ((uint32_t)0x00400000) +#define RCC_CFGR_MCO1Source_PLLCLK ((uint32_t)0x00600000) +#define RCC_CFGR_MCO1Div_1 ((uint32_t)0x00000000) +#define RCC_CFGR_MCO1Div_2 ((uint32_t)0x04000000) +#define RCC_CFGR_MCO1Div_3 ((uint32_t)0x05000000) +#define RCC_CFGR_MCO1Div_4 ((uint32_t)0x06000000) +#define RCC_CFGR_MCO1Div_5 ((uint32_t)0x07000000) +#define RCC_CFGR_MCO1_RESET_MASK ((uint32_t)0xF89FFFFF) + /* Clock interrupt register */ #define RCC_CIR_CSSC_BIT 23 diff --git a/STM32F4/libraries/arduino_uip/Dhcp.cpp b/STM32F4/libraries/arduino_uip/Dhcp.cpp new file mode 100644 index 0000000..c15fe83 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/Dhcp.cpp @@ -0,0 +1,478 @@ +// DHCP Library v0.3 - April 25, 2009 +// Author: Jordan Terrell - blog.jordanterrell.com + +#include +#include +#include "Dhcp.h" +#include "Arduino.h" +#include "utility/util.h" + +int DhcpClass::beginWithDHCP(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) +{ + _dhcpLeaseTime=0; + _dhcpT1=0; + _dhcpT2=0; + _lastCheck=0; + _timeout = timeout; + _responseTimeout = responseTimeout; + + // zero out _dhcpMacAddr + memset(_dhcpMacAddr, 0, 6); + reset_DHCP_lease(); + + memcpy((void*)_dhcpMacAddr, (void*)mac, 6); + _dhcp_state = STATE_DHCP_START; + return request_DHCP_lease(); +} + +void DhcpClass::reset_DHCP_lease(){ + // zero out _dhcpSubnetMask, _dhcpGatewayIp, _dhcpLocalIp, _dhcpDhcpServerIp, _dhcpDnsServerIp + memset(_dhcpLocalIp, 0, 20); +} + +//return:0 on error, 1 if request is sent and response is received +int DhcpClass::request_DHCP_lease(){ + + uint8_t messageType = 0; + + + + // Pick an initial transaction ID + _dhcpTransactionId = random(1UL, 2000UL); + _dhcpInitialTransactionId = _dhcpTransactionId; + + _dhcpUdpSocket.stop(); + if (_dhcpUdpSocket.begin(DHCP_CLIENT_PORT) == 0) + { + // Couldn't get a socket + return 0; + } + + presend_DHCP(); + + int result = 0; + + unsigned long startTime = millis(); + + while(_dhcp_state != STATE_DHCP_LEASED) + { + if(_dhcp_state == STATE_DHCP_START) + { + _dhcpTransactionId++; + + send_DHCP_MESSAGE(DHCP_DISCOVER, ((millis() - startTime) / 1000)); + _dhcp_state = STATE_DHCP_DISCOVER; + } + else if(_dhcp_state == STATE_DHCP_REREQUEST){ + _dhcpTransactionId++; + send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime)/1000)); + _dhcp_state = STATE_DHCP_REQUEST; + } + else if(_dhcp_state == STATE_DHCP_DISCOVER) + { + uint32_t respId; + messageType = parseDHCPResponse(_responseTimeout, respId); + if(messageType == DHCP_OFFER) + { + // We'll use the transaction ID that the offer came with, + // rather than the one we were up to + _dhcpTransactionId = respId; + send_DHCP_MESSAGE(DHCP_REQUEST, ((millis() - startTime) / 1000)); + _dhcp_state = STATE_DHCP_REQUEST; + } + } + else if(_dhcp_state == STATE_DHCP_REQUEST) + { + uint32_t respId; + messageType = parseDHCPResponse(_responseTimeout, respId); + if(messageType == DHCP_ACK) + { + _dhcp_state = STATE_DHCP_LEASED; + result = 1; + //use default lease time if we didn't get it + if(_dhcpLeaseTime == 0){ + _dhcpLeaseTime = DEFAULT_LEASE; + } + //calculate T1 & T2 if we didn't get it + if(_dhcpT1 == 0){ + //T1 should be 50% of _dhcpLeaseTime + _dhcpT1 = _dhcpLeaseTime >> 1; + } + if(_dhcpT2 == 0){ + //T2 should be 87.5% (7/8ths) of _dhcpLeaseTime + _dhcpT2 = _dhcpT1 << 1; + } + _renewInSec = _dhcpT1; + _rebindInSec = _dhcpT2; + } + else if(messageType == DHCP_NAK) + _dhcp_state = STATE_DHCP_START; + } + + if(messageType == 255) + { + messageType = 0; + _dhcp_state = STATE_DHCP_START; + } + + if(result != 1 && ((millis() - startTime) > _timeout)) + break; + } + + // We're done with the socket now + _dhcpUdpSocket.stop(); + _dhcpTransactionId++; + + return result; +} + +void DhcpClass::presend_DHCP() +{ +} + +void DhcpClass::send_DHCP_MESSAGE(uint8_t messageType, uint16_t secondsElapsed) +{ + uint8_t buffer[32]; + memset(buffer, 0, 32); + IPAddress dest_addr( 255, 255, 255, 255 ); // Broadcast address + + if (-1 == _dhcpUdpSocket.beginPacket(dest_addr, DHCP_SERVER_PORT)) + { + // FIXME Need to return errors + return; + } + + buffer[0] = DHCP_BOOTREQUEST; // op + buffer[1] = DHCP_HTYPE10MB; // htype + buffer[2] = DHCP_HLENETHERNET; // hlen + buffer[3] = DHCP_HOPS; // hops + + // xid + unsigned long xid = htonl(_dhcpTransactionId); + memcpy(buffer + 4, &(xid), 4); + + // 8, 9 - seconds elapsed + buffer[8] = ((secondsElapsed & 0xff00) >> 8); + buffer[9] = (secondsElapsed & 0x00ff); + + // flags + unsigned short flags = htons(DHCP_FLAGSBROADCAST); + memcpy(buffer + 10, &(flags), 2); + + // ciaddr: already zeroed + // yiaddr: already zeroed + // siaddr: already zeroed + // giaddr: already zeroed + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 28); + + memset(buffer, 0, 32); // clear local buffer + + memcpy(buffer, _dhcpMacAddr, 6); // chaddr + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 16); + + memset(buffer, 0, 32); // clear local buffer + + // leave zeroed out for sname && file + // put in W5100 transmit buffer x 6 (192 bytes) + + for(int i = 0; i < 6; i++) { + _dhcpUdpSocket.write(buffer, 32); + } + + // OPT - Magic Cookie + buffer[0] = (uint8_t)((MAGIC_COOKIE >> 24)& 0xFF); + buffer[1] = (uint8_t)((MAGIC_COOKIE >> 16)& 0xFF); + buffer[2] = (uint8_t)((MAGIC_COOKIE >> 8)& 0xFF); + buffer[3] = (uint8_t)(MAGIC_COOKIE& 0xFF); + + // OPT - message type + buffer[4] = dhcpMessageType; + buffer[5] = 0x01; + buffer[6] = messageType; //DHCP_REQUEST; + + // OPT - client identifier + buffer[7] = dhcpClientIdentifier; + buffer[8] = 0x07; + buffer[9] = 0x01; + memcpy(buffer + 10, _dhcpMacAddr, 6); + + // OPT - host name + buffer[16] = hostName; + buffer[17] = strlen(HOST_NAME) + 6; // length of hostname + last 3 bytes of mac address + strcpy((char*)&(buffer[18]), HOST_NAME); + + printByte((char*)&(buffer[24]), _dhcpMacAddr[3]); + printByte((char*)&(buffer[26]), _dhcpMacAddr[4]); + printByte((char*)&(buffer[28]), _dhcpMacAddr[5]); + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 30); + + if(messageType == DHCP_REQUEST) + { + buffer[0] = dhcpRequestedIPaddr; + buffer[1] = 0x04; + buffer[2] = _dhcpLocalIp[0]; + buffer[3] = _dhcpLocalIp[1]; + buffer[4] = _dhcpLocalIp[2]; + buffer[5] = _dhcpLocalIp[3]; + + buffer[6] = dhcpServerIdentifier; + buffer[7] = 0x04; + buffer[8] = _dhcpDhcpServerIp[0]; + buffer[9] = _dhcpDhcpServerIp[1]; + buffer[10] = _dhcpDhcpServerIp[2]; + buffer[11] = _dhcpDhcpServerIp[3]; + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 12); + } + + buffer[0] = dhcpParamRequest; + buffer[1] = 0x06; + buffer[2] = subnetMask; + buffer[3] = routersOnSubnet; + buffer[4] = dns; + buffer[5] = domainName; + buffer[6] = dhcpT1value; + buffer[7] = dhcpT2value; + buffer[8] = endOption; + + //put data in W5100 transmit buffer + _dhcpUdpSocket.write(buffer, 9); + + _dhcpUdpSocket.endPacket(); +} + +uint8_t DhcpClass::parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId) +{ + uint8_t type = 0; + uint8_t opt_len = 0; + + unsigned long startTime = millis(); + + while(_dhcpUdpSocket.parsePacket() <= 0) + { + if((millis() - startTime) > responseTimeout) + { + return 255; + } + delay(50); + } + // start reading in the packet + RIP_MSG_FIXED fixedMsg; + _dhcpUdpSocket.read((uint8_t*)&fixedMsg, sizeof(RIP_MSG_FIXED)); + + if(fixedMsg.op == DHCP_BOOTREPLY && _dhcpUdpSocket.remotePort() == DHCP_SERVER_PORT) + { + transactionId = ntohl(fixedMsg.xid); + if(memcmp(fixedMsg.chaddr, _dhcpMacAddr, 6) != 0 || (transactionId < _dhcpInitialTransactionId) || (transactionId > _dhcpTransactionId)) + { + // Need to read the rest of the packet here regardless + _dhcpUdpSocket.flush(); + return 0; + } + + memcpy(_dhcpLocalIp, fixedMsg.yiaddr, 4); + + // Skip to the option part + // Doing this a byte at a time so we don't have to put a big buffer + // on the stack (as we don't have lots of memory lying around) + for (int i =0; i < (240 - (int)sizeof(RIP_MSG_FIXED)); i++) + { + _dhcpUdpSocket.read(); // we don't care about the returned byte + } + + while (_dhcpUdpSocket.available() > 0) + { + switch (_dhcpUdpSocket.read()) + { + case endOption : + break; + + case padOption : + break; + + case dhcpMessageType : + opt_len = _dhcpUdpSocket.read(); + type = _dhcpUdpSocket.read(); + break; + + case subnetMask : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpSubnetMask, 4); + break; + + case routersOnSubnet : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpGatewayIp, 4); + for (int i = 0; i < opt_len-4; i++) + { + _dhcpUdpSocket.read(); + } + break; + + case dns : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read(_dhcpDnsServerIp, 4); + for (int i = 0; i < opt_len-4; i++) + { + _dhcpUdpSocket.read(); + } + break; + + case dhcpServerIdentifier : + opt_len = _dhcpUdpSocket.read(); + if( *((uint32_t*)_dhcpDhcpServerIp) == 0 || + IPAddress(_dhcpDhcpServerIp) == _dhcpUdpSocket.remoteIP() ) + { + _dhcpUdpSocket.read(_dhcpDhcpServerIp, sizeof(_dhcpDhcpServerIp)); + } + else + { + // Skip over the rest of this option + while (opt_len--) + { + _dhcpUdpSocket.read(); + } + } + break; + + case dhcpT1value : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpT1, sizeof(_dhcpT1)); + _dhcpT1 = ntohl(_dhcpT1); + break; + + case dhcpT2value : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpT2, sizeof(_dhcpT2)); + _dhcpT2 = ntohl(_dhcpT2); + break; + + case dhcpIPaddrLeaseTime : + opt_len = _dhcpUdpSocket.read(); + _dhcpUdpSocket.read((uint8_t*)&_dhcpLeaseTime, sizeof(_dhcpLeaseTime)); + _dhcpLeaseTime = ntohl(_dhcpLeaseTime); + _renewInSec = _dhcpLeaseTime; + break; + + default : + opt_len = _dhcpUdpSocket.read(); + // Skip over the rest of this option + while (opt_len--) + { + _dhcpUdpSocket.read(); + } + break; + } + } + } + + // Need to skip to end of the packet regardless here + _dhcpUdpSocket.flush(); + + return type; +} + + +/* + returns: + 0/DHCP_CHECK_NONE: nothing happened + 1/DHCP_CHECK_RENEW_FAIL: renew failed + 2/DHCP_CHECK_RENEW_OK: renew success + 3/DHCP_CHECK_REBIND_FAIL: rebind fail + 4/DHCP_CHECK_REBIND_OK: rebind success +*/ +int DhcpClass::checkLease(){ + //this uses a signed / unsigned trick to deal with millis overflow + unsigned long now = millis(); + signed long snow = (long)now; + int rc=DHCP_CHECK_NONE; + if (_lastCheck != 0){ + signed long factor; + //calc how many ms past the timeout we are + factor = snow - (long)_secTimeout; + //if on or passed the timeout, reduce the counters + if ( factor >= 0 ){ + //next timeout should be now plus 1000 ms minus parts of second in factor + _secTimeout = snow + 1000 - factor % 1000; + //how many seconds late are we, minimum 1 + factor = factor / 1000 +1; + + //reduce the counters by that mouch + //if we can assume that the cycle time (factor) is fairly constant + //and if the remainder is less than cycle time * 2 + //do it early instead of late + if(_renewInSec < factor*2 ) + _renewInSec = 0; + else + _renewInSec -= factor; + + if(_rebindInSec < factor*2 ) + _rebindInSec = 0; + else + _rebindInSec -= factor; + } + + //if we have a lease but should renew, do it + if (_dhcp_state == STATE_DHCP_LEASED && _renewInSec <=0){ + _dhcp_state = STATE_DHCP_REREQUEST; + rc = 1 + request_DHCP_lease(); + } + + //if we have a lease or is renewing but should bind, do it + if( (_dhcp_state == STATE_DHCP_LEASED || _dhcp_state == STATE_DHCP_START) && _rebindInSec <=0){ + //this should basically restart completely + _dhcp_state = STATE_DHCP_START; + reset_DHCP_lease(); + rc = 3 + request_DHCP_lease(); + } + } + else{ + _secTimeout = snow + 1000; + } + + _lastCheck = now; + return rc; +} + +IPAddress DhcpClass::getLocalIp() +{ + return IPAddress(_dhcpLocalIp); +} + +IPAddress DhcpClass::getSubnetMask() +{ + return IPAddress(_dhcpSubnetMask); +} + +IPAddress DhcpClass::getGatewayIp() +{ + return IPAddress(_dhcpGatewayIp); +} + +IPAddress DhcpClass::getDhcpServerIp() +{ + return IPAddress(_dhcpDhcpServerIp); +} + +IPAddress DhcpClass::getDnsServerIp() +{ + return IPAddress(_dhcpDnsServerIp); +} + +void DhcpClass::printByte(char * buf, uint8_t n ) { + char *str = &buf[1]; + buf[0]='0'; + do { + unsigned long m = n; + n /= 16; + char c = m - 16 * n; + *str-- = c < 10 ? c + '0' : c + 'A' - 10; + } while(n); +} diff --git a/STM32F4/libraries/arduino_uip/Dhcp.h b/STM32F4/libraries/arduino_uip/Dhcp.h new file mode 100644 index 0000000..cc3cd35 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/Dhcp.h @@ -0,0 +1,178 @@ +// DHCP Library v0.3 - April 25, 2009 +// Author: Jordan Terrell - blog.jordanterrell.com + +#ifndef Dhcp_h +#define Dhcp_h + +#include "UIPUdp.h" + +/* DHCP state machine. */ +#define STATE_DHCP_START 0 +#define STATE_DHCP_DISCOVER 1 +#define STATE_DHCP_REQUEST 2 +#define STATE_DHCP_LEASED 3 +#define STATE_DHCP_REREQUEST 4 +#define STATE_DHCP_RELEASE 5 + +#define DHCP_FLAGSBROADCAST 0x8000 + +/* UDP port numbers for DHCP */ +#define DHCP_SERVER_PORT 67 /* from server to client */ +#define DHCP_CLIENT_PORT 68 /* from client to server */ + +/* DHCP message OP code */ +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +/* DHCP message type */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +#define DHCP_HTYPE10MB 1 +#define DHCP_HTYPE100MB 2 + +#define DHCP_HLENETHERNET 6 +#define DHCP_HOPS 0 +#define DHCP_SECS 0 + +#define MAGIC_COOKIE 0x63825363 +#define MAX_DHCP_OPT 16 + +#define HOST_NAME "ENC28J" +#define DEFAULT_LEASE (900) //default lease time in seconds + +#define DHCP_CHECK_NONE (0) +#define DHCP_CHECK_RENEW_FAIL (1) +#define DHCP_CHECK_RENEW_OK (2) +#define DHCP_CHECK_REBIND_FAIL (3) +#define DHCP_CHECK_REBIND_OK (4) + +enum +{ + padOption = 0, + subnetMask = 1, + timerOffset = 2, + routersOnSubnet = 3, + /* timeServer = 4, + nameServer = 5,*/ + dns = 6, + /*logServer = 7, + cookieServer = 8, + lprServer = 9, + impressServer = 10, + resourceLocationServer = 11,*/ + hostName = 12, + /*bootFileSize = 13, + meritDumpFile = 14,*/ + domainName = 15, + /*swapServer = 16, + rootPath = 17, + extentionsPath = 18, + IPforwarding = 19, + nonLocalSourceRouting = 20, + policyFilter = 21, + maxDgramReasmSize = 22, + defaultIPTTL = 23, + pathMTUagingTimeout = 24, + pathMTUplateauTable = 25, + ifMTU = 26, + allSubnetsLocal = 27, + broadcastAddr = 28, + performMaskDiscovery = 29, + maskSupplier = 30, + performRouterDiscovery = 31, + routerSolicitationAddr = 32, + staticRoute = 33, + trailerEncapsulation = 34, + arpCacheTimeout = 35, + ethernetEncapsulation = 36, + tcpDefaultTTL = 37, + tcpKeepaliveInterval = 38, + tcpKeepaliveGarbage = 39, + nisDomainName = 40, + nisServers = 41, + ntpServers = 42, + vendorSpecificInfo = 43, + netBIOSnameServer = 44, + netBIOSdgramDistServer = 45, + netBIOSnodeType = 46, + netBIOSscope = 47, + xFontServer = 48, + xDisplayManager = 49,*/ + dhcpRequestedIPaddr = 50, + dhcpIPaddrLeaseTime = 51, + /*dhcpOptionOverload = 52,*/ + dhcpMessageType = 53, + dhcpServerIdentifier = 54, + dhcpParamRequest = 55, + /*dhcpMsg = 56, + dhcpMaxMsgSize = 57,*/ + dhcpT1value = 58, + dhcpT2value = 59, + /*dhcpClassIdentifier = 60,*/ + dhcpClientIdentifier = 61, + endOption = 255 +}; + +typedef struct _RIP_MSG_FIXED +{ + uint8_t op; + uint8_t htype; + uint8_t hlen; + uint8_t hops; + uint32_t xid; + uint16_t secs; + uint16_t flags; + uint8_t ciaddr[4]; + uint8_t yiaddr[4]; + uint8_t siaddr[4]; + uint8_t giaddr[4]; + uint8_t chaddr[6]; +}RIP_MSG_FIXED; + +class DhcpClass { +private: + uint32_t _dhcpInitialTransactionId; + uint32_t _dhcpTransactionId; + uint8_t _dhcpMacAddr[6]; + uint8_t _dhcpLocalIp[4]; + uint8_t _dhcpSubnetMask[4]; + uint8_t _dhcpGatewayIp[4]; + uint8_t _dhcpDhcpServerIp[4]; + uint8_t _dhcpDnsServerIp[4]; + uint32_t _dhcpLeaseTime; + uint32_t _dhcpT1, _dhcpT2; + signed long _renewInSec; + signed long _rebindInSec; + signed long _lastCheck; + unsigned long _timeout; + unsigned long _responseTimeout; + unsigned long _secTimeout; + uint8_t _dhcp_state; + UIPUDP _dhcpUdpSocket; + + int request_DHCP_lease(); + void reset_DHCP_lease(); + void presend_DHCP(); + void send_DHCP_MESSAGE(uint8_t, uint16_t); + void printByte(char *, uint8_t); + + uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId); +public: + IPAddress getLocalIp(); + IPAddress getSubnetMask(); + IPAddress getGatewayIp(); + IPAddress getDhcpServerIp(); + IPAddress getDnsServerIp(); + + int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); + int checkLease(); +}; + +#endif diff --git a/STM32F4/libraries/arduino_uip/Dns.cpp b/STM32F4/libraries/arduino_uip/Dns.cpp new file mode 100644 index 0000000..2b97fb7 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/Dns.cpp @@ -0,0 +1,422 @@ +// Arduino DNS client for Enc28J60-based Ethernet shield +// (c) Copyright 2009-2010 MCQN Ltd. +// Released under Apache License, version 2.0 + +#include "Udp.h" +#include "utility/util.h" + +#include "Dns.h" +#include +//#include +#include "Arduino.h" + + +#define SOCKET_NONE 255 +// Various flags and header field values for a DNS message +#define UDP_HEADER_SIZE 8 +#define DNS_HEADER_SIZE 12 +#define TTL_SIZE 4 +#define QUERY_FLAG (0) +#define RESPONSE_FLAG (1<<15) +#define QUERY_RESPONSE_MASK (1<<15) +#define OPCODE_STANDARD_QUERY (0) +#define OPCODE_INVERSE_QUERY (1<<11) +#define OPCODE_STATUS_REQUEST (2<<11) +#define OPCODE_MASK (15<<11) +#define AUTHORITATIVE_FLAG (1<<10) +#define TRUNCATION_FLAG (1<<9) +#define RECURSION_DESIRED_FLAG (1<<8) +#define RECURSION_AVAILABLE_FLAG (1<<7) +#define RESP_NO_ERROR (0) +#define RESP_FORMAT_ERROR (1) +#define RESP_SERVER_FAILURE (2) +#define RESP_NAME_ERROR (3) +#define RESP_NOT_IMPLEMENTED (4) +#define RESP_REFUSED (5) +#define RESP_MASK (15) +#define TYPE_A (0x0001) +#define CLASS_IN (0x0001) +#define LABEL_COMPRESSION_MASK (0xC0) +// Port number that DNS servers listen on +#define DNS_PORT 53 + +// Possible return codes from ProcessResponse +#define SUCCESS 1 +#define TIMED_OUT -1 +#define INVALID_SERVER -2 +#define TRUNCATED -3 +#define INVALID_RESPONSE -4 + +void DNSClient::begin(const IPAddress& aDNSServer) +{ + iDNSServer = aDNSServer; + iRequestId = 0; +} + + +int DNSClient::inet_aton(const char* aIPAddrString, IPAddress& aResult) +{ + // See if we've been given a valid IP address + const char* p =aIPAddrString; + while (*p && + ( (*p == '.') || (*p >= '0') || (*p <= '9') )) + { + p++; + } + + if (*p == '\0') + { + // It's looking promising, we haven't found any invalid characters + p = aIPAddrString; + int segment =0; + int segmentValue =0; + while (*p && (segment < 4)) + { + if (*p == '.') + { + // We've reached the end of a segment + if (segmentValue > 255) + { + // You can't have IP address segments that don't fit in a byte + return 0; + } + else + { + aResult[segment] = (byte)segmentValue; + segment++; + segmentValue = 0; + } + } + else + { + // Next digit + segmentValue = (segmentValue*10)+(*p - '0'); + } + p++; + } + // We've reached the end of address, but there'll still be the last + // segment to deal with + if ((segmentValue > 255) || (segment > 3)) + { + // You can't have IP address segments that don't fit in a byte, + // or more than four segments + return 0; + } + else + { + aResult[segment] = (byte)segmentValue; + return 1; + } + } + else + { + return 0; + } +} + +int DNSClient::getHostByName(const char* aHostname, IPAddress& aResult) +{ + int ret =0; + + // See if it's a numeric IP address + if (inet_aton(aHostname, aResult)) + { + // It is, our work here is done + return 1; + } + + // Check we've got a valid DNS server to use + if (iDNSServer == INADDR_NONE) + { + return INVALID_SERVER; + } + + // Find a socket to use + if (iUdp.begin(1024+(millis() & 0xF)) == 1) + { + // Try up to three times + int retries = 0; +// while ((retries < 3) && (ret <= 0)) + { + // Send DNS request + ret = iUdp.beginPacket(iDNSServer, DNS_PORT); + if (ret != 0) + { + // Now output the request data + ret = BuildRequest(aHostname); + if (ret != 0) + { + // And finally send the request + ret = iUdp.endPacket(); + if (ret != 0) + { + // Now wait for a response + int wait_retries = 0; + ret = TIMED_OUT; + while ((wait_retries < 3) && (ret == TIMED_OUT)) + { + ret = ProcessResponse(5000, aResult); + wait_retries++; + } + } + } + } + retries++; + } + + // We're done with the socket now + iUdp.stop(); + } + + return ret; +} + +uint16_t DNSClient::BuildRequest(const char* aName) +{ + // Build header + // 1 1 1 1 1 1 + // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // | ID | + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // |QR| Opcode |AA|TC|RD|RA| Z | RCODE | + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // | QDCOUNT | + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // | ANCOUNT | + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // | NSCOUNT | + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // | ARCOUNT | + // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + // As we only support one request at a time at present, we can simplify + // some of this header + iRequestId = millis(); // generate a random ID + uint16_t twoByteBuffer; + + // FIXME We should also check that there's enough space available to write to, rather + // FIXME than assume there's enough space (as the code does at present) + iUdp.write((uint8_t*)&iRequestId, sizeof(iRequestId)); + + twoByteBuffer = htons(QUERY_FLAG | OPCODE_STANDARD_QUERY | RECURSION_DESIRED_FLAG); + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + + twoByteBuffer = htons(1); // One question record + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + + twoByteBuffer = 0; // Zero answer records + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + // and zero additional records + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + + // Build question + const char* start =aName; + const char* end =start; + uint8_t len; + // Run through the name being requested + while (*end) + { + // Find out how long this section of the name is + end = start; + while (*end && (*end != '.') ) + { + end++; + } + + if (end-start > 0) + { + // Write out the size of this section + len = end-start; + iUdp.write(&len, sizeof(len)); + // And then write out the section + iUdp.write((uint8_t*)start, end-start); + } + start = end+1; + } + + // We've got to the end of the question name, so + // terminate it with a zero-length section + len = 0; + iUdp.write(&len, sizeof(len)); + // Finally the type and class of question + twoByteBuffer = htons(TYPE_A); + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + + twoByteBuffer = htons(CLASS_IN); // Internet class of question + iUdp.write((uint8_t*)&twoByteBuffer, sizeof(twoByteBuffer)); + // Success! Everything buffered okay + return 1; +} + + +uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress) +{ + uint32_t startTime = millis(); + + // Wait for a response packet + while(iUdp.parsePacket() <= 0) + { + if((millis() - startTime) > aTimeout) + return TIMED_OUT; + delay(50); + } + + // We've had a reply! + // Read the UDP header + uint8_t header[DNS_HEADER_SIZE]; // Enough space to reuse for the DNS header + // Check that it's a response from the right server and the right port + if ( (iDNSServer != iUdp.remoteIP()) || + (iUdp.remotePort() != DNS_PORT) ) + { + // It's not from who we expected + return INVALID_SERVER; + } + + // Read through the rest of the response + if (iUdp.available() < DNS_HEADER_SIZE) + { + return TRUNCATED; + } + iUdp.read(header, DNS_HEADER_SIZE); + + uint16_t header_flags = htons(*((uint16_t*)&header[2])); + // Check that it's a response to this request + if ( ( iRequestId != (*((uint16_t*)&header[0])) ) || + ((header_flags & QUERY_RESPONSE_MASK) != (uint16_t)RESPONSE_FLAG) ) + { + // Mark the entire packet as read + iUdp.flush(); + return INVALID_RESPONSE; + } + // Check for any errors in the response (or in our request) + // although we don't do anything to get round these + if ( (header_flags & TRUNCATION_FLAG) || (header_flags & RESP_MASK) ) + { + // Mark the entire packet as read + iUdp.flush(); + return -5; //INVALID_RESPONSE; + } + + // And make sure we've got (at least) one answer + uint16_t answerCount = htons(*((uint16_t*)&header[6])); + if (answerCount == 0 ) + { + // Mark the entire packet as read + iUdp.flush(); + return -6; //INVALID_RESPONSE; + } + + // Skip over any questions + for (uint16_t i =0; i < htons(*((uint16_t*)&header[4])); i++) + { + // Skip over the name + uint8_t len; + do + { + iUdp.read(&len, sizeof(len)); + if (len > 0) + { + // Don't need to actually read the data out for the string, just + // advance ptr to beyond it + while(len--) + { + iUdp.read(); // we don't care about the returned byte + } + } + } while (len != 0); + + // Now jump over the type and class + for (int i =0; i < 4; i++) + { + iUdp.read(); // we don't care about the returned byte + } + } + + // Now we're up to the bit we're interested in, the answer + // There might be more than one answer (although we'll just use the first + // type A answer) and some authority and additional resource records but + // we're going to ignore all of them. + + for (uint16_t i =0; i < answerCount; i++) + { + // Skip the name + uint8_t len; + do + { + iUdp.read(&len, sizeof(len)); + if ((len & LABEL_COMPRESSION_MASK) == 0) + { + // It's just a normal label + if (len > 0) + { + // And it's got a length + // Don't need to actually read the data out for the string, + // just advance ptr to beyond it + while(len--) + { + iUdp.read(); // we don't care about the returned byte + } + } + } + else + { + // This is a pointer to a somewhere else in the message for the + // rest of the name. We don't care about the name, and RFC1035 + // says that a name is either a sequence of labels ended with a + // 0 length octet or a pointer or a sequence of labels ending in + // a pointer. Either way, when we get here we're at the end of + // the name + // Skip over the pointer + iUdp.read(); // we don't care about the returned byte + // And set len so that we drop out of the name loop + len = 0; + } + } while (len != 0); + + // Check the type and class + uint16_t answerType; + uint16_t answerClass; + iUdp.read((uint8_t*)&answerType, sizeof(answerType)); + iUdp.read((uint8_t*)&answerClass, sizeof(answerClass)); + + // Ignore the Time-To-Live as we don't do any caching + for (int i =0; i < TTL_SIZE; i++) + { + iUdp.read(); // we don't care about the returned byte + } + + // And read out the length of this answer + // Don't need header_flags anymore, so we can reuse it here + iUdp.read((uint8_t*)&header_flags, sizeof(header_flags)); + + if ( (htons(answerType) == TYPE_A) && (htons(answerClass) == CLASS_IN) ) + { + if (htons(header_flags) != 4) + { + // It's a weird size + // Mark the entire packet as read + iUdp.flush(); + return -9;//INVALID_RESPONSE; + } + iUdp.read(aAddress.raw_address(), 4); + return SUCCESS; + } + else + { + // This isn't an answer type we're after, move onto the next one + for (uint16_t i =0; i < htons(header_flags); i++) + { + iUdp.read(); // we don't care about the returned byte + } + } + } + + // Mark the entire packet as read + iUdp.flush(); + + // If we get here then we haven't found an answer + return -10;//INVALID_RESPONSE; +} + diff --git a/STM32F4/libraries/arduino_uip/Dns.h b/STM32F4/libraries/arduino_uip/Dns.h new file mode 100644 index 0000000..4ccb1e1 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/Dns.h @@ -0,0 +1,41 @@ +// Arduino DNS client for Enc28J60-based Ethernet shield +// (c) Copyright 2009-2010 MCQN Ltd. +// Released under Apache License, version 2.0 + +#ifndef DNSClient_h +#define DNSClient_h + +#include + +class DNSClient +{ +public: + // ctor + void begin(const IPAddress& aDNSServer); + + /** Convert a numeric IP address string into a four-byte IP address. + @param aIPAddrString IP address to convert + @param aResult IPAddress structure to store the returned IP address + @result 1 if aIPAddrString was successfully converted to an IP address, + else error code + */ + int inet_aton(const char *aIPAddrString, IPAddress& aResult); + + /** Resolve the given hostname to an IP address. + @param aHostname Name to be resolved + @param aResult IPAddress structure to store the returned IP address + @result 1 if aIPAddrString was successfully converted to an IP address, + else error code + */ + int getHostByName(const char* aHostname, IPAddress& aResult); + +protected: + uint16_t BuildRequest(const char* aName); + uint16_t ProcessResponse(uint16_t aTimeout, IPAddress& aAddress); + + IPAddress iDNSServer; + uint16_t iRequestId; + UIPUDP iUdp; +}; + +#endif diff --git a/STM32F4/libraries/arduino_uip/README b/STM32F4/libraries/arduino_uip/README new file mode 100644 index 0000000..321b334 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/README @@ -0,0 +1,227 @@ +This is UIPEthernet version 1.09 + +An plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS. +Just include 'UIPEthernet.h' instead of 'Ethernet.h' and use all your code written for the stock Arduino Ethernet lib! + +UIPEthernet is written as a wrapper around the mature uIP Stack by Adam Dunkels, which provides the low-level implementation for all supported protocols. To overcome the memory-constrains (a 'regular' uIP-application does all processing in RAM) the ENC28J60 internal memory is used for all stream buffers (in and out). Only 400-600 Bytes of Arduinos RAM are used (depending on the number of concurrently open connections). As of Flash-memory a ATmega368-based Arduino is the minimum requirenment. + +This library is written by Norbert Truchsess + +uIP was written by Adam Dunkels of the Networked Embedded Systems group at the Swedish Institute of Computer Science. + +This library was inspired by the SerialIP implementation by Adam Nielsen , actually I took this code as a starting point, but in the latest versions there are very few lines left. + +Installation +------------ + +To install the libraries, you need to place them into your "libraries" folder. You can find it within your Arduino IDE distribution within the "hardware" folder. + + C:\> cd [path to Arduino distribution]\libraries + C:\> git clone https://github.com/ntruchsess/arduino_uip UIPEthernet + +Be sure to restart the IDE if it was running. + +On a Mac, you will want to create a folder named "libraries" in in the "Documents" -> "Arduino" folder within your home directory. Clone the project there (and restart the IDE, if it was running during this process). + + $ cd ~/Documents/Arduino/libraries + $ git clone https://github.com/ntruchsess/arduino_uip UIPEthernet + +Or you download the zipped version of the library from https://github.com/ntruchsess/arduino_uip/releases, and copy the contained directory UIPEthernet to [path to Arduino distribution]\libraries\UIPEthernet. + +If you are running Arduino-IDE 1.5.x use release-version 1.59 or checkout branch 'Arduino_1.5.x' + +Additional information can be found on the Arduino website: http://www.arduino.cc/en/Hacking/Libraries + +Documentation +------------- + +For more information visit: + + - UIPEthernet Repository on github: + https://github.com/ntruchsess/arduino_uip + + - Arduino Ethernet library description + http://arduino.cc/en/Reference/Ethernet + (Arduino_uip uses the same API as that, just include "UIPEthernet.h", "UIPClient.h", "UIPServer.h" and "UIPUDP.h" instead of the stock "Ethernet.h", "EthernetClient.h", "EthernetServer.h " and "EthernetUDP.h") + + - uIP API reference: + http://www.sics.se/~adam/uip/uip-1.0-refman/ + + - Arduino forums + http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl + + - uIP homepage: + http://www.sics.se/~adam/uip/index.php/Main_Page + +Licenses +------------- + +UIPEthernet.h +UIPEthernet.cpp +UIPServer.h +UIPServer.cpp +UIPClient.h +UIPClient.cpp +UIPUdp.h +UIPUdp.cpp +utility/mempool.h +utility/mempool.cpp + +Copyright (c) 2013 Norbert Truchsess +All rights reserved. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +-------------- + +utility/enc28j60.h + +Author : Pascal Stang (c)2005 +Modified by Norbert Truchsess +Copyright: GPL V2 + +-------------- + +utility/Enc28J60Network.h +utility/Enc28J60Network.cpp + +Copyright (c) 2013 Norbert Truchsess +All rights reserved. + +inspired and based on enc28j60.c file from the AVRlib library by Pascal Stang. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +-------------- + +utility/uip.c +utility/uip_arp.h +utility/uip_arp.c +utility/uip_arch.h +utility/uip.h +utility/uipopt.h + +Copyright (c) 2001-2003, Adam Dunkels , . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the Institute nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +-------------- + +uip-conf.h +utility/uip-neighbor.h +utility/uip-neighbor.c +utility/uip_timer.h +utility/uip_timer.c +utility/uip_clock.h + +Author Adam Dunkels Adam Dunkels , +Copyright (c) 2004,2006, Swedish Institute of Computer Science. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the Institute nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +-------------- + +Dhcp.h +Dhcp.cpp + +DHCP Library v0.3 - April 25, 2009 +Author: Jordan Terrell - blog.jordanterrell.com +- as included in Arduinos stock Ethernet-library, no special licence mentioned here + +-------------- + +Dns.h +Dns.cpp + +(c) Copyright 2009-2010 MCQN Ltd. +Released under Apache License, version 2.0 + +-------------- + +clock-arch.h +clock-arch.c + +Copyright (c) 2010 Adam Nielsen +All rights reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/STM32F4/libraries/arduino_uip/UIPClient.cpp b/STM32F4/libraries/arduino_uip/UIPClient.cpp new file mode 100644 index 0000000..a1c0540 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPClient.cpp @@ -0,0 +1,586 @@ +/* + UIPClient.cpp - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +extern "C" +{ +#import "utility/uip-conf.h" +#import "utility/uip.h" +#import "utility/uip_arp.h" +#import "string.h" +} +#include "UIPEthernet.h" +#include "UIPClient.h" +#include "Dns.h" + +#ifdef UIPETHERNET_DEBUG_CLIENT +#include "HardwareSerial.h" +#endif + +#define Serial SerialUSB + + +#define UIP_TCP_PHYH_LEN UIP_LLH_LEN+UIP_IPTCPH_LEN + +uip_userdata_t UIPClient::all_data[UIP_CONNS]; + +UIPClient::UIPClient() : + data(NULL) +{ +} + +UIPClient::UIPClient(uip_userdata_t* conn_data) : + data(conn_data) +{ +} + +int +UIPClient::connect(IPAddress ip, uint16_t port) +{ + stop(); + uip_ipaddr_t ipaddr; + uip_ip_addr(ipaddr, ip); + struct uip_conn* conn = uip_connect(&ipaddr, htons(port)); + if (conn) + { +#if UIP_CONNECT_TIMEOUT > 0 + int32_t timeout = millis() + 1000 * UIP_CONNECT_TIMEOUT; +#endif + while((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) + { + UIPEthernetClass::tick(); + if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) + { + data = (uip_userdata_t*) conn->appstate; +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.print(F("connected, state: ")); + Serial.print(data->state); + Serial.print(F(", first packet in: ")); + Serial.println(data->packets_in[0]); +#endif + return 1; + } +#if UIP_CONNECT_TIMEOUT > 0 + if (((int32_t)(millis() - timeout)) > 0) + { + conn->tcpstateflags = UIP_CLOSED; + break; + } +#endif + } + } + return 0; +} + +int +UIPClient::connect(const char *host, uint16_t port) +{ + // Look up the host first + int ret = 0; +#if UIP_UDP + DNSClient dns; + IPAddress remote_addr; + + dns.begin(UIPEthernetClass::_dnsServerAddress); + ret = dns.getHostByName(host, remote_addr); + if (ret == 1) { + return connect(remote_addr, port); + } +#endif + return ret; +} + +void +UIPClient::stop() +{ + if (data && data->state) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("before stop(), with data")); + _dumpAllData(); +#endif + _flushBlocks(&data->packets_in[0]); + if (data->state & UIP_CLIENT_REMOTECLOSED) + { + data->state = 0; + } + else + { + data->state |= UIP_CLIENT_CLOSE; + } +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("after stop()")); + _dumpAllData(); +#endif + } +#ifdef UIPETHERNET_DEBUG_CLIENT + else + { + Serial.println(F("stop(), data: NULL")); + } +#endif + data = NULL; + UIPEthernetClass::tick(); +} + +uint8_t +UIPClient::connected() +{ + return (data && (data->packets_in[0] != NOBLOCK || (data->state & UIP_CLIENT_CONNECTED))) ? 1 : 0; +} + +bool +UIPClient::operator==(const UIPClient& rhs) +{ + return data && rhs.data && (data == rhs.data); +} + +UIPClient::operator bool() +{ + UIPEthernetClass::tick(); + return data && (!(data->state & UIP_CLIENT_REMOTECLOSED) || data->packets_in[0] != NOBLOCK); +} + +size_t +UIPClient::write(uint8_t c) +{ + return _write(data, &c, 1); +} + +size_t +UIPClient::write(const uint8_t *buf, size_t size) +{ + return _write(data, buf, size); +} + +size_t +UIPClient::_write(uip_userdata_t* u, const uint8_t *buf, size_t size) +{ + int remain = size; + uint16_t written; +#if UIP_ATTEMPTS_ON_WRITE > 0 + uint16_t attempts = UIP_ATTEMPTS_ON_WRITE; +#endif + repeat: + UIPEthernetClass::tick(); + if (u && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED))) + { + uint8_t p = _currentBlock(&u->packets_out[0]); + if (u->packets_out[p] == NOBLOCK) + { +newpacket: + u->packets_out[p] = Enc28J60Network::allocBlock(UIP_SOCKET_DATALEN); + if (u->packets_out[p] == NOBLOCK) + { +#if UIP_ATTEMPTS_ON_WRITE > 0 + if ((--attempts)>0) +#endif +#if UIP_ATTEMPTS_ON_WRITE != 0 + goto repeat; +#endif + goto ready; + } + u->out_pos = 0; + } +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.print(F("UIPClient.write: writePacket(")); + Serial.print(u->packets_out[p]); + Serial.print(F(") pos: ")); + Serial.print(u->out_pos); + Serial.print(F(", buf[")); + Serial.print(size-remain); + Serial.print(F("-")); + Serial.print(remain); + Serial.print(F("]: '")); + Serial.write((uint8_t*)buf+size-remain,remain); + Serial.println(F("'")); +#endif + written = Enc28J60Network::writePacket(u->packets_out[p],u->out_pos,(uint8_t*)buf+size-remain,remain); + remain -= written; + u->out_pos+=written; + if (remain > 0) + { + if (p == UIP_SOCKET_NUMPACKETS-1) + { +#if UIP_ATTEMPTS_ON_WRITE > 0 + if ((--attempts)>0) +#endif +#if UIP_ATTEMPTS_ON_WRITE != 0 + goto repeat; +#endif + goto ready; + } + p++; + goto newpacket; + } +ready: +#if UIP_CLIENT_TIMER >= 0 + u->timer = millis()+UIP_CLIENT_TIMER; +#endif + return size-remain; + } + return -1; +} + +int +UIPClient::available() +{ + if (*this) + return _available(data); + return 0; +} + +int +UIPClient::_available(uip_userdata_t *u) +{ + int len = 0; + for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++) + { + len += Enc28J60Network::blockSize(u->packets_in[i]); + } + return len; +} + +int +UIPClient::read(uint8_t *buf, size_t size) +{ + if (*this) + { + uint16_t remain = size; + if (data->packets_in[0] == NOBLOCK) + return 0; + uint16_t read; + do + { + read = Enc28J60Network::readPacket(data->packets_in[0],0,buf+size-remain,remain); + if (read == Enc28J60Network::blockSize(data->packets_in[0])) + { + remain -= read; + _eatBlock(&data->packets_in[0]); + if (uip_stopped(&uip_conns[data->state & UIP_CLIENT_SOCKETS]) && !(data->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED))) + data->state |= UIP_CLIENT_RESTART; + if (data->packets_in[0] == NOBLOCK) + { + if (data->state & UIP_CLIENT_REMOTECLOSED) + { + data->state = 0; + data = NULL; + } + return size-remain; + } + } + else + { + Enc28J60Network::resizeBlock(data->packets_in[0],read); + break; + } + } + while(remain > 0); + return size; + } + return -1; +} + +int +UIPClient::read() +{ + uint8_t c; + if (read(&c,1) < 0) + return -1; + return c; +} + +int +UIPClient::peek() +{ + if (*this) + { + if (data->packets_in[0] != NOBLOCK) + { + uint8_t c; + Enc28J60Network::readPacket(data->packets_in[0],0,&c,1); + return c; + } + } + return -1; +} + +void +UIPClient::flush() +{ + if (*this) + { + _flushBlocks(&data->packets_in[0]); + } +} + +void +uipclient_appcall(void) +{ + uint16_t send_len = 0; + uip_userdata_t *u = (uip_userdata_t*)uip_conn->appstate; + if (!u && uip_connected()) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("UIPClient uip_connected")); + UIPClient::_dumpAllData(); +#endif + u = (uip_userdata_t*) UIPClient::_allocateData(); + if (u) + { + uip_conn->appstate = u; +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.print(F("UIPClient allocated state: ")); + Serial.println(u->state,BIN); +#endif + } +#ifdef UIPETHERNET_DEBUG_CLIENT + else + Serial.println(F("UIPClient allocation failed")); +#endif + } + if (u) + { + if (uip_newdata()) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.print(F("UIPClient uip_newdata, uip_len:")); + Serial.println(uip_len); +#endif + if (uip_len && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED))) + { + for (uint8_t i=0; i < UIP_SOCKET_NUMPACKETS; i++) + { + if (u->packets_in[i] == NOBLOCK) + { + u->packets_in[i] = Enc28J60Network::allocBlock(uip_len); + if (u->packets_in[i] != NOBLOCK) + { + Enc28J60Network::copyPacket(u->packets_in[i],0,UIPEthernetClass::in_packet,((uint8_t*)uip_appdata)-uip_buf,uip_len); + if (i == UIP_SOCKET_NUMPACKETS-1) + uip_stop(); + goto finish_newdata; + } + } + } + UIPEthernetClass::packetstate &= ~UIPETHERNET_FREEPACKET; + uip_stop(); + } + } +finish_newdata: + if (u->state & UIP_CLIENT_RESTART) + { + u->state &= ~UIP_CLIENT_RESTART; + uip_restart(); + } + // If the connection has been closed, save received but unread data. + if (uip_closed() || uip_timedout()) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("UIPClient uip_closed")); + UIPClient::_dumpAllData(); +#endif + // drop outgoing packets not sent yet: + UIPClient::_flushBlocks(&u->packets_out[0]); + if (u->packets_in[0] != NOBLOCK) + { + ((uip_userdata_closed_t *)u)->lport = uip_conn->lport; + u->state |= UIP_CLIENT_REMOTECLOSED; + } + else + u->state = 0; + // disassociate appdata. +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("after UIPClient uip_closed")); + UIPClient::_dumpAllData(); +#endif + uip_conn->appstate = NULL; + goto finish; + } + if (uip_acked()) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("UIPClient uip_acked")); +#endif + UIPClient::_eatBlock(&u->packets_out[0]); + } + if (uip_poll() || uip_rexmit()) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + //Serial.println(F("UIPClient uip_poll")); +#endif + if (u->packets_out[0] != NOBLOCK) + { + if (u->packets_out[1] == NOBLOCK) + { + send_len = u->out_pos; + if (send_len > 0) + { + Enc28J60Network::resizeBlock(u->packets_out[0],0,send_len); + } + } + else + send_len = Enc28J60Network::blockSize(u->packets_out[0]); + if (send_len > 0) + { + UIPEthernetClass::uip_hdrlen = ((uint8_t*)uip_appdata)-uip_buf; + UIPEthernetClass::uip_packet = Enc28J60Network::allocBlock(UIPEthernetClass::uip_hdrlen+send_len); + if (UIPEthernetClass::uip_packet != NOBLOCK) + { + Enc28J60Network::copyPacket(UIPEthernetClass::uip_packet,UIPEthernetClass::uip_hdrlen,u->packets_out[0],0,send_len); + UIPEthernetClass::packetstate |= UIPETHERNET_SENDPACKET; + } + } + goto finish; + } + } + // don't close connection unless all outgoing packets are sent + if (u->state & UIP_CLIENT_CLOSE) + { +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("UIPClient state UIP_CLIENT_CLOSE")); + UIPClient::_dumpAllData(); +#endif + if (u->packets_out[0] == NOBLOCK) + { + u->state = 0; + uip_conn->appstate = NULL; + uip_close(); +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("no blocks out -> free userdata")); + UIPClient::_dumpAllData(); +#endif + } + else + { + uip_stop(); +#ifdef UIPETHERNET_DEBUG_CLIENT + Serial.println(F("blocks outstanding transfer -> uip_stop()")); +#endif + } + } + } + finish: + uip_send(uip_appdata,send_len); + uip_len = send_len; +} + +uip_userdata_t * +UIPClient::_allocateData() +{ + for ( uint8_t sock = 0; sock < UIP_CONNS; sock++ ) + { + uip_userdata_t* data = &UIPClient::all_data[sock]; + if (!data->state) + { + data->state = sock | UIP_CLIENT_CONNECTED; + memset(&data->packets_in[0],0,sizeof(uip_userdata_t)-sizeof(data->state)); + return data; + } + } + return NULL; +} + +uint8_t +UIPClient::_currentBlock(memhandle* block) +{ + for (uint8_t i = 1; i < UIP_SOCKET_NUMPACKETS; i++) + { + if (block[i] == NOBLOCK) + return i-1; + } + return UIP_SOCKET_NUMPACKETS-1; +} + +void +UIPClient::_eatBlock(memhandle* block) +{ +#ifdef UIPETHERNET_DEBUG_CLIENT + memhandle* start = block; + Serial.print(F("eatblock(")); + Serial.print(*block); + Serial.print(F("): ")); + for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++) + { + Serial.print(start[i]); + Serial.print(F(" ")); + } + Serial.print(F("-> ")); +#endif + Enc28J60Network::freeBlock(block[0]); + for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS-1; i++) + { + block[i] = block[i+1]; + } + block[UIP_SOCKET_NUMPACKETS-1] = NOBLOCK; +#ifdef UIPETHERNET_DEBUG_CLIENT + for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++) + { + Serial.print(start[i]); + Serial.print(F(" ")); + } + Serial.println(); +#endif +} + +void +UIPClient::_flushBlocks(memhandle* block) +{ + for (uint8_t i = 0; i < UIP_SOCKET_NUMPACKETS; i++) + { + Enc28J60Network::freeBlock(block[i]); + block[i] = NOBLOCK; + } +} + +#ifdef UIPETHERNET_DEBUG_CLIENT +void +UIPClient::_dumpAllData() { + for (uint8_t i=0; i < UIP_CONNS; i++) + { + Serial.print(F("UIPClient::all_data[")); + Serial.print(i); + Serial.print(F("], state:")); + Serial.println(all_data[i].state, BIN); + Serial.print(F("packets_in: ")); + for (uint8_t j=0; j < UIP_SOCKET_NUMPACKETS; j++) + { + Serial.print(all_data[i].packets_in[j]); + Serial.print(F(" ")); + } + Serial.println(); + if (all_data[i].state & UIP_CLIENT_REMOTECLOSED) + { + Serial.print(F("state remote closed, local port: ")); + Serial.println(htons(((uip_userdata_closed_t *)(&all_data[i]))->lport)); + } + else + { + Serial.print(F("packets_out: ")); + for (uint8_t j=0; j < UIP_SOCKET_NUMPACKETS; j++) + { + Serial.print(all_data[i].packets_out[j]); + Serial.print(F(" ")); + } + Serial.println(); + Serial.print(F("out_pos: ")); + Serial.println(all_data[i].out_pos); + } + } +} +#endif diff --git a/STM32F4/libraries/arduino_uip/UIPClient.h b/STM32F4/libraries/arduino_uip/UIPClient.h new file mode 100644 index 0000000..6c0c006 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPClient.h @@ -0,0 +1,112 @@ +/* + UIPClient.h - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef UIPCLIENT_H +#define UIPCLIENT_H + +#include "ethernet_comp.h" +#include "Print.h" +#import "Client.h" +#import "utility/mempool.h" + +extern "C" { + #import "utility/uip.h" +} + +#define UIP_SOCKET_DATALEN UIP_TCP_MSS +//#define UIP_SOCKET_NUMPACKETS UIP_RECEIVE_WINDOW/UIP_TCP_MSS+1 +#ifndef UIP_SOCKET_NUMPACKETS +#define UIP_SOCKET_NUMPACKETS 5 +#endif + +#define UIP_CLIENT_CONNECTED 0x10 +#define UIP_CLIENT_CLOSE 0x20 +#define UIP_CLIENT_REMOTECLOSED 0x40 +#define UIP_CLIENT_RESTART 0x80 +#define UIP_CLIENT_STATEFLAGS (UIP_CLIENT_CONNECTED | UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED | UIP_CLIENT_RESTART) +#define UIP_CLIENT_SOCKETS ~UIP_CLIENT_STATEFLAGS + +typedef uint8_t uip_socket_ptr; + +typedef struct { + uint8_t state; + memhandle packets_in[UIP_SOCKET_NUMPACKETS]; + uint16_t lport; /**< The local TCP port, in network byte order. */ +} uip_userdata_closed_t; + +typedef struct { + uint8_t state; + memhandle packets_in[UIP_SOCKET_NUMPACKETS]; + memhandle packets_out[UIP_SOCKET_NUMPACKETS]; + memaddress out_pos; +#if UIP_CLIENT_TIMER >= 0 + unsigned long timer; +#endif +} uip_userdata_t; + +class UIPClient : public Client { + +public: + UIPClient(); + int connect(IPAddress ip, uint16_t port); + int connect(const char *host, uint16_t port); + int read(uint8_t *buf, size_t size); + void stop(); + uint8_t connected(); + operator bool(); + virtual bool operator==(const EthernetClient&); + virtual bool operator!=(const EthernetClient& rhs) { return !this->operator==(rhs); }; + + size_t write(uint8_t); + size_t write(const uint8_t *buf, size_t size); + int available(); + int read(); + int peek(); + void flush(); + + using Print::write; + +private: + UIPClient(struct uip_conn *_conn); + UIPClient(uip_userdata_t* conn_data); + + uip_userdata_t* data; + + static uip_userdata_t all_data[UIP_CONNS]; + static uip_userdata_t* _allocateData(); + + static size_t _write(uip_userdata_t *,const uint8_t *buf, size_t size); + static int _available(uip_userdata_t *); + + static uint8_t _currentBlock(memhandle* blocks); + static void _eatBlock(memhandle* blocks); + static void _flushBlocks(memhandle* blocks); + +#ifdef UIPETHERNET_DEBUG_CLIENT + static void _dumpAllData(); +#endif + + friend class UIPEthernetClass; + friend class UIPServer; + + friend void uipclient_appcall(void); + +}; + +#endif diff --git a/STM32F4/libraries/arduino_uip/UIPEthernet.cpp b/STM32F4/libraries/arduino_uip/UIPEthernet.cpp new file mode 100644 index 0000000..397209a --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPEthernet.cpp @@ -0,0 +1,486 @@ +/* + UIPEthernet.cpp - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include +#include "UIPEthernet.h" +#include "utility/Enc28J60Network.h" + +#if(defined UIPETHERNET_DEBUG || defined UIPETHERNET_DEBUG_CHKSUM) +#include "HardwareSerial.h" +#endif + +#define Serial SerialUSB + +#include "UIPUdp.h" + +extern "C" +{ +#include "utility/uip-conf.h" +#include "utility/uip.h" +#include "utility/uip_arp.h" +#include "utility/uip_timer.h" +} + +#define ETH_HDR ((struct uip_eth_hdr *)&uip_buf[0]) + +memhandle UIPEthernetClass::in_packet(NOBLOCK); +memhandle UIPEthernetClass::uip_packet(NOBLOCK); +uint8_t UIPEthernetClass::uip_hdrlen(0); +uint8_t UIPEthernetClass::packetstate(0); + +IPAddress UIPEthernetClass::_dnsServerAddress; +DhcpClass* UIPEthernetClass::_dhcp(NULL); + +unsigned long UIPEthernetClass::periodic_timer; + +// Because uIP isn't encapsulated within a class we have to use global +// variables, so we can only have one TCP/IP stack per program. + +UIPEthernetClass::UIPEthernetClass() +{ +} + +#if UIP_UDP +int +UIPEthernetClass::begin(const uint8_t* mac) +{ + static DhcpClass s_dhcp; + _dhcp = &s_dhcp; + // Initialise the basic info + init(mac); + + // Now try to get our config info from a DHCP server + int ret = _dhcp->beginWithDHCP((uint8_t*)mac); + if(ret == 1) + { + // We've successfully found a DHCP server and got our configuration info, so set things + // accordingly + configure(_dhcp->getLocalIp(),_dhcp->getDnsServerIp(),_dhcp->getGatewayIp(),_dhcp->getSubnetMask()); + } + return ret; +} +#endif + +void +UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip) +{ + IPAddress dns = ip; + dns[3] = 1; + begin(mac, ip, dns); +} + +void +UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns) +{ + IPAddress gateway = ip; + gateway[3] = 1; + begin(mac, ip, dns, gateway); +} + +void +UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway) +{ + IPAddress subnet(255, 255, 255, 0); + begin(mac, ip, dns, gateway, subnet); +} + +void +UIPEthernetClass::begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) +{ + init(mac); + configure(ip,dns,gateway,subnet); +} + +int UIPEthernetClass::maintain(){ + tick(); + int rc = DHCP_CHECK_NONE; +#if UIP_UDP + if(_dhcp != NULL){ + //we have a pointer to dhcp, use it + rc = _dhcp->checkLease(); + switch ( rc ){ + case DHCP_CHECK_NONE: + //nothing done + break; + case DHCP_CHECK_RENEW_OK: + case DHCP_CHECK_REBIND_OK: + //we might have got a new IP. + configure(_dhcp->getLocalIp(),_dhcp->getDnsServerIp(),_dhcp->getGatewayIp(),_dhcp->getSubnetMask()); + break; + default: + //this is actually a error, it will retry though + break; + } + } + return rc; +#endif +} + +IPAddress UIPEthernetClass::localIP() +{ + IPAddress ret; + uip_ipaddr_t a; + uip_gethostaddr(a); + return ip_addr_uip(a); +} + +IPAddress UIPEthernetClass::subnetMask() +{ + IPAddress ret; + uip_ipaddr_t a; + uip_getnetmask(a); + return ip_addr_uip(a); +} + +IPAddress UIPEthernetClass::gatewayIP() +{ + IPAddress ret; + uip_ipaddr_t a; + uip_getdraddr(a); + return ip_addr_uip(a); +} + +IPAddress UIPEthernetClass::dnsServerIP() +{ + return _dnsServerAddress; +} + +void +UIPEthernetClass::tick() +{ + if (in_packet == NOBLOCK) + { + in_packet = Enc28J60Network::receivePacket(); +#ifdef UIPETHERNET_DEBUG + if (in_packet != NOBLOCK) + { + Serial.print(F("--------------\r\nreceivePacket: ")); + Serial.println(in_packet); + } +#endif + } + if (in_packet != NOBLOCK) + { + packetstate = UIPETHERNET_FREEPACKET; + uip_len = Enc28J60Network::blockSize(in_packet); + if (uip_len > 0) + { + Enc28J60Network::readPacket(in_packet,0,(uint8_t*)uip_buf,UIP_BUFSIZE); + if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_IP)) + { + uip_packet = in_packet; //required for upper_layer_checksum of in_packet! +#ifdef UIPETHERNET_DEBUG + Serial.print(F("readPacket type IP, uip_len: ")); + Serial.println(uip_len); +#endif + uip_arp_ipin(); + uip_input(); + if (uip_len > 0) + { + uip_arp_out(); + network_send(); + } + } + else if (ETH_HDR ->type == HTONS(UIP_ETHTYPE_ARP)) + { +#ifdef UIPETHERNET_DEBUG + Serial.print(F("readPacket type ARP, uip_len: ")); + Serial.println(uip_len); +#endif + uip_arp_arpin(); + if (uip_len > 0) + { + network_send(); + } + } + } + if (in_packet != NOBLOCK && (packetstate & UIPETHERNET_FREEPACKET)) + { +#ifdef UIPETHERNET_DEBUG + Serial.print(F("freeing packet: ")); + Serial.println(in_packet); +#endif + Enc28J60Network::freePacket(); + in_packet = NOBLOCK; + } + } + + unsigned long now = millis(); + +#if UIP_CLIENT_TIMER >= 0 + boolean periodic = (long)( now - periodic_timer ) >= 0; + for (int i = 0; i < UIP_CONNS; i++) + { +#else + if ((long)( now - periodic_timer ) >= 0) + { + periodic_timer = now + UIP_PERIODIC_TIMER; + + for (int i = 0; i < UIP_CONNS; i++) + { +#endif + uip_conn = &uip_conns[i]; +#if UIP_CLIENT_TIMER >= 0 + if (periodic) + { +#endif + uip_process(UIP_TIMER); +#if UIP_CLIENT_TIMER >= 0 + } + else + { + if ((long)( now - ((uip_userdata_t*)uip_conn->appstate)->timer) >= 0) + uip_process(UIP_POLL_REQUEST); + else + continue; + } +#endif + // If the above function invocation resulted in data that + // should be sent out on the Enc28J60Network, the global variable + // uip_len is set to a value > 0. + if (uip_len > 0) + { + uip_arp_out(); + network_send(); + } + } +#if UIP_CLIENT_TIMER >= 0 + if (periodic) + { + periodic_timer = now + UIP_PERIODIC_TIMER; +#endif +#if UIP_UDP + for (int i = 0; i < UIP_UDP_CONNS; i++) + { + uip_udp_periodic(i); + // If the above function invocation resulted in data that + // should be sent out on the Enc28J60Network, the global variable + // uip_len is set to a value > 0. */ + if (uip_len > 0) + { + UIPUDP::_send((uip_udp_userdata_t *)(uip_udp_conns[i].appstate)); + } + } +#endif /* UIP_UDP */ + } +} + +boolean UIPEthernetClass::network_send() +{ + if (packetstate & UIPETHERNET_SENDPACKET) + { +#ifdef UIPETHERNET_DEBUG + Serial.print(F("Enc28J60Network_send uip_packet: ")); + Serial.print(uip_packet); + Serial.print(F(", hdrlen: ")); + Serial.println(uip_hdrlen); +#endif + Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_hdrlen); + packetstate &= ~ UIPETHERNET_SENDPACKET; + goto sendandfree; + } + uip_packet = Enc28J60Network::allocBlock(uip_len); + if (uip_packet != NOBLOCK) + { +#ifdef UIPETHERNET_DEBUG + Serial.print(F("Enc28J60Network_send uip_buf (uip_len): ")); + Serial.print(uip_len); + Serial.print(F(", packet: ")); + Serial.println(uip_packet); +#endif + Enc28J60Network::writePacket(uip_packet,0,uip_buf,uip_len); + goto sendandfree; + } + return false; +sendandfree: + Enc28J60Network::sendPacket(uip_packet); + Enc28J60Network::freeBlock(uip_packet); + uip_packet = NOBLOCK; + return true; +} + +void UIPEthernetClass::init(const uint8_t* mac) { + periodic_timer = millis() + UIP_PERIODIC_TIMER; + + Enc28J60Network::init((uint8_t*)mac); + uip_seteth_addr(mac); + + uip_init(); + uip_arp_init(); +} + +void UIPEthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet) { + uip_ipaddr_t ipaddr; + + uip_ip_addr(ipaddr, ip); + uip_sethostaddr(ipaddr); + + uip_ip_addr(ipaddr, gateway); + uip_setdraddr(ipaddr); + + uip_ip_addr(ipaddr, subnet); + uip_setnetmask(ipaddr); + + _dnsServerAddress = dns; +} + +UIPEthernetClass UIPEthernet; + +/*---------------------------------------------------------------------------*/ +uint16_t +UIPEthernetClass::chksum(uint16_t sum, const uint8_t *data, uint16_t len) +{ + uint16_t t; + const uint8_t *dataptr; + const uint8_t *last_byte; + + dataptr = data; + last_byte = data + len - 1; + + while(dataptr < last_byte) { /* At least two more bytes */ + t = (dataptr[0] << 8) + dataptr[1]; + sum += t; + if(sum < t) { + sum++; /* carry */ + } + dataptr += 2; + } + + if(dataptr == last_byte) { + t = (dataptr[0] << 8) + 0; + sum += t; + if(sum < t) { + sum++; /* carry */ + } + } + + /* Return sum in host byte order. */ + return sum; +} + +/*---------------------------------------------------------------------------*/ + +uint16_t +UIPEthernetClass::ipchksum(void) +{ + uint16_t sum; + + sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN); + return (sum == 0) ? 0xffff : htons(sum); +} + +/*---------------------------------------------------------------------------*/ +uint16_t +#if UIP_UDP +UIPEthernetClass::upper_layer_chksum(uint8_t proto) +#else +uip_tcpchksum(void) +#endif +{ + uint16_t upper_layer_len; + uint16_t sum; + +#if UIP_CONF_IPV6 + upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]); +#else /* UIP_CONF_IPV6 */ + upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN; +#endif /* UIP_CONF_IPV6 */ + + /* First sum pseudoheader. */ + + /* IP protocol and length fields. This addition cannot carry. */ +#if UIP_UDP + sum = upper_layer_len + proto; +#else + sum = upper_layer_len + UIP_PROTO_TCP; +#endif + /* Sum IP source and destination addresses. */ + sum = UIPEthernetClass::chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t)); + + uint8_t upper_layer_memlen; +#if UIP_UDP + switch(proto) + { +// case UIP_PROTO_ICMP: +// case UIP_PROTO_ICMP6: +// upper_layer_memlen = upper_layer_len; +// break; + case UIP_PROTO_UDP: + upper_layer_memlen = UIP_UDPH_LEN; + break; + default: +// case UIP_PROTO_TCP: +#endif + upper_layer_memlen = (BUF->tcpoffset >> 4) << 2; +#if UIP_UDP + break; + } +#endif + sum = UIPEthernetClass::chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_memlen); +#ifdef UIPETHERNET_DEBUG_CHKSUM + Serial.print(F("chksum uip_buf[")); + Serial.print(UIP_IPH_LEN + UIP_LLH_LEN); + Serial.print(F("-")); + Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen); + Serial.print(F("]: ")); + Serial.println(htons(sum),HEX); +#endif + if (upper_layer_memlen < upper_layer_len) + { + sum = Enc28J60Network::chksum( + sum, + UIPEthernetClass::uip_packet, + UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen, + upper_layer_len - upper_layer_memlen + ); +#ifdef UIPETHERNET_DEBUG_CHKSUM + Serial.print(F("chksum uip_packet(")); + Serial.print(uip_packet); + Serial.print(F(")[")); + Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_memlen); + Serial.print(F("-")); + Serial.print(UIP_IPH_LEN + UIP_LLH_LEN + upper_layer_len); + Serial.print(F("]: ")); + Serial.println(htons(sum),HEX); +#endif + } + return (sum == 0) ? 0xffff : htons(sum); +} + +uint16_t +uip_ipchksum(void) +{ + return UIPEthernet.ipchksum(); +} + +#if UIP_UDP +uint16_t +uip_tcpchksum(void) +{ + uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_TCP); + return sum; +} + +uint16_t +uip_udpchksum(void) +{ + uint16_t sum = UIPEthernet.upper_layer_chksum(UIP_PROTO_UDP); + return sum; +} +#endif diff --git a/STM32F4/libraries/arduino_uip/UIPEthernet.h b/STM32F4/libraries/arduino_uip/UIPEthernet.h new file mode 100644 index 0000000..ff49707 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPEthernet.h @@ -0,0 +1,129 @@ +/* + UIPEthernet.h - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef UIPETHERNET_H +#define UIPETHERNET_H + +#define UIP_UDP 1 + +//#define UIPETHERNET_DEBUG +//#define UIPETHERNET_DEBUG_CHKSUM +//#define UIPETHERNET_DEBUG_UDP +//#define UIPETHERNET_DEBUG_CLIENT + +#include "ethernet_comp.h" +#include +#include "Dhcp.h" +#include "IPAddress.h" +#include "utility/Enc28J60Network.h" +#include "UIPClient.h" +#include "UIPServer.h" +#include "UIPUdp.h" + +extern "C" +{ +#include "utility/uip_timer.h" +#include "utility/uip.h" +} + +#define UIPETHERNET_FREEPACKET 1 +#define UIPETHERNET_SENDPACKET 2 +#define UIPETHERNET_BUFFERREAD 4 + +#define uip_ip_addr(addr, ip) do { \ + ((u16_t *)(addr))[0] = HTONS(((ip[0]) << 8) | (ip[1])); \ + ((u16_t *)(addr))[1] = HTONS(((ip[2]) << 8) | (ip[3])); \ + } while(0) + +#define ip_addr_uip(a) IPAddress(a[0] & 0xFF, a[0] >> 8 , a[1] & 0xFF, a[1] >> 8) //TODO this is not IPV6 capable + +#define uip_seteth_addr(eaddr) do {uip_ethaddr.addr[0] = eaddr[0]; \ + uip_ethaddr.addr[1] = eaddr[1];\ + uip_ethaddr.addr[2] = eaddr[2];\ + uip_ethaddr.addr[3] = eaddr[3];\ + uip_ethaddr.addr[4] = eaddr[4];\ + uip_ethaddr.addr[5] = eaddr[5];} while(0) + +#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) + +class UIPEthernetClass +{ +public: + UIPEthernetClass(); + + int begin(const uint8_t* mac); + void begin(const uint8_t* mac, IPAddress ip); + void begin(const uint8_t* mac, IPAddress ip, IPAddress dns); + void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway); + void begin(const uint8_t* mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet); + + // maintain() must be called at regular intervals to process the incoming serial + // data and issue IP events to the sketch. It does not return until all IP + // events have been processed. Renews dhcp-lease if required. + int maintain(); + + IPAddress localIP(); + IPAddress subnetMask(); + IPAddress gatewayIP(); + IPAddress dnsServerIP(); + +private: + static memhandle in_packet; + static memhandle uip_packet; + static uint8_t uip_hdrlen; + static uint8_t packetstate; + + static IPAddress _dnsServerAddress; + static DhcpClass* _dhcp; + + static unsigned long periodic_timer; + + static void init(const uint8_t* mac); + static void configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet); + + static void tick(); + + static boolean network_send(); + + friend class UIPServer; + + friend class UIPClient; + + friend class UIPUDP; + + static uint16_t chksum(uint16_t sum, const uint8_t* data, uint16_t len); + static uint16_t ipchksum(void); +#if UIP_UDP + static uint16_t upper_layer_chksum(uint8_t proto); +#endif + friend uint16_t uip_ipchksum(void); + friend uint16_t uip_tcpchksum(void); + friend uint16_t uip_udpchksum(void); + + friend void uipclient_appcall(void); + friend void uipudp_appcall(void); + +#if UIP_CONF_IPV6 + uint16_t uip_icmp6chksum(void); +#endif /* UIP_CONF_IPV6 */ +}; + +extern UIPEthernetClass UIPEthernet; + +#endif diff --git a/STM32F4/libraries/arduino_uip/UIPServer.cpp b/STM32F4/libraries/arduino_uip/UIPServer.cpp new file mode 100644 index 0000000..21c7ef5 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPServer.cpp @@ -0,0 +1,63 @@ +/* + UIPServer.cpp - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#include "UIPEthernet.h" +#include "UIPServer.h" +extern "C" { + #include "utility/uip-conf.h" +} + +UIPServer::UIPServer(uint16_t port) : _port(htons(port)) +{ +} + +UIPClient UIPServer::available() +{ + UIPEthernetClass::tick(); + for ( uip_userdata_t* data = &UIPClient::all_data[0]; data < &UIPClient::all_data[UIP_CONNS]; data++ ) + { + if (data->packets_in[0] != NOBLOCK + && (((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport ==_port) + || ((data->state & UIP_CLIENT_REMOTECLOSED) && ((uip_userdata_closed_t *)data)->lport == _port))) + return UIPClient(data); + } + return UIPClient(); +} + +void UIPServer::begin() +{ + uip_listen(_port); + UIPEthernetClass::tick(); +} + +size_t UIPServer::write(uint8_t c) +{ + return write(&c,1); +} + +size_t UIPServer::write(const uint8_t *buf, size_t size) +{ + size_t ret = 0; + for ( uip_userdata_t* data = &UIPClient::all_data[0]; data < &UIPClient::all_data[UIP_CONNS]; data++ ) + { + if ((data->state & UIP_CLIENT_CONNECTED) && uip_conns[data->state & UIP_CLIENT_SOCKETS].lport ==_port) + ret += UIPClient::_write(data,buf,size); + } + return ret; +} + diff --git a/STM32F4/libraries/arduino_uip/UIPServer.h b/STM32F4/libraries/arduino_uip/UIPServer.h new file mode 100644 index 0000000..0cc0619 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPServer.h @@ -0,0 +1,40 @@ +/* + UIPServer.h - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#ifndef UIPSERVER_H +#define UIPSERVER_H + +#include "ethernet_comp.h" +#import "Server.h" +#import "UIPClient.h" + +class UIPServer : public Server { + +public: + UIPServer(uint16_t); + UIPClient available(); + void begin(); + size_t write(uint8_t); + size_t write(const uint8_t *buf, size_t size); + using Print::write; + +private: + uint16_t _port; +}; + +#endif diff --git a/STM32F4/libraries/arduino_uip/UIPUdp.cpp b/STM32F4/libraries/arduino_uip/UIPUdp.cpp new file mode 100644 index 0000000..f9ba4e3 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPUdp.cpp @@ -0,0 +1,385 @@ +/* + UIPUdp.cpp - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "UIPEthernet.h" +#include "UIPUdp.h" +#include "Dns.h" + +#ifdef UIPETHERNET_DEBUG_UDP +#include "HardwareSerial.h" +#endif + +#define Serial SerialUSB + +extern "C" { +#include "utility/uip-conf.h" +#include "utility/uip.h" +#include "utility/uip_arp.h" +} + +#if UIP_UDP +#define UIP_ARPHDRSIZE 42 +#define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN]) + +// Constructor +UIPUDP::UIPUDP() : + _uip_udp_conn(NULL) +{ + memset(&appdata,0,sizeof(appdata)); +} + +// initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use +uint8_t +UIPUDP::begin(uint16_t port) +{ + if (!_uip_udp_conn) + { + _uip_udp_conn = uip_udp_new(NULL, 0); + } + if (_uip_udp_conn) + { + uip_udp_bind(_uip_udp_conn,htons(port)); + _uip_udp_conn->appstate = &appdata; + return 1; + } + return 0; +} + +// Finish with the UDP socket +void +UIPUDP::stop() +{ + if (_uip_udp_conn) + { + uip_udp_remove(_uip_udp_conn); + _uip_udp_conn->appstate = NULL; + _uip_udp_conn=NULL; + Enc28J60Network::freeBlock(appdata.packet_in); + Enc28J60Network::freeBlock(appdata.packet_next); + Enc28J60Network::freeBlock(appdata.packet_out); + memset(&appdata,0,sizeof(appdata)); + } +} + +// Sending UDP packets + +// Start building up a packet to send to the remote host specific in ip and port +// Returns 1 if successful, 0 if there was a problem with the supplied IP address or port +int +UIPUDP::beginPacket(IPAddress ip, uint16_t port) +{ + UIPEthernetClass::tick(); + if (ip && port) + { + uip_ipaddr_t ripaddr; + uip_ip_addr(&ripaddr, ip); +#ifdef UIPETHERNET_DEBUG_UDP + Serial.print(F("udp beginPacket, ")); +#endif + if (_uip_udp_conn) + { + _uip_udp_conn->rport = htons(port); + uip_ipaddr_copy(_uip_udp_conn->ripaddr, &ripaddr); + } + else + { + _uip_udp_conn = uip_udp_new(&ripaddr,htons(port)); + if (_uip_udp_conn) + { +#ifdef UIPETHERNET_DEBUG_UDP + Serial.print(F("new connection, ")); +#endif + _uip_udp_conn->appstate = &appdata; + } + else + { +#ifdef UIPETHERNET_DEBUG_UDP + Serial.println(F("failed to allocate new connection")); +#endif + return 0; + } + } +#ifdef UIPETHERNET_DEBUG_UDP + Serial.print(F("rip: ")); + Serial.print(ip); + Serial.print(F(", port: ")); + Serial.println(port); +#endif + } + if (_uip_udp_conn) + { + if (appdata.packet_out == NOBLOCK) + { + appdata.packet_out = Enc28J60Network::allocBlock(UIP_UDP_MAXPACKETSIZE); + appdata.out_pos = UIP_UDP_PHYH_LEN; + if (appdata.packet_out != NOBLOCK) + return 1; +#ifdef UIPETHERNET_DEBUG_UDP + else + Serial.println(F("failed to allocate memory for packet")); +#endif + } +#ifdef UIPETHERNET_DEBUG_UDP + else + Serial.println(F("previous packet on that connection not sent yet")); +#endif + } + return 0; +} + +// Start building up a packet to send to the remote host specific in host and port +// Returns 1 if successful, 0 if there was a problem resolving the hostname or port +int +UIPUDP::beginPacket(const char *host, uint16_t port) +{ + // Look up the host first + int ret = 0; + DNSClient dns; + IPAddress remote_addr; + + dns.begin(UIPEthernet.dnsServerIP()); + ret = dns.getHostByName(host, remote_addr); + if (ret == 1) { + return beginPacket(remote_addr, port); + } else { + return ret; + } +} + +// Finish off this packet and send it +// Returns 1 if the packet was sent successfully, 0 if there was an error +int +UIPUDP::endPacket() +{ + if (_uip_udp_conn && appdata.packet_out != NOBLOCK) + { + appdata.send = true; + Enc28J60Network::resizeBlock(appdata.packet_out,0,appdata.out_pos); + uip_udp_periodic_conn(_uip_udp_conn); + if (uip_len > 0) + { + _send(&appdata); + return 1; + } + } + return 0; +} + +// Write a single byte into the packet +size_t +UIPUDP::write(uint8_t c) +{ + return write(&c,1); +} + +// Write size bytes from buffer into the packet +size_t +UIPUDP::write(const uint8_t *buffer, size_t size) +{ + if (appdata.packet_out != NOBLOCK) + { + size_t ret = Enc28J60Network::writePacket(appdata.packet_out,appdata.out_pos,(uint8_t*)buffer,size); + appdata.out_pos += ret; + return ret; + } + return 0; +} + +// Start processing the next available incoming packet +// Returns the size of the packet in bytes, or 0 if no packets are available +int +UIPUDP::parsePacket() +{ + UIPEthernetClass::tick(); +#ifdef UIPETHERNET_DEBUG_UDP + if (appdata.packet_in != NOBLOCK) + { + Serial.print(F("udp parsePacket freeing previous packet: ")); + Serial.println(appdata.packet_in); + } +#endif + Enc28J60Network::freeBlock(appdata.packet_in); + + appdata.packet_in = appdata.packet_next; + appdata.packet_next = NOBLOCK; + +#ifdef UIPETHERNET_DEBUG_UDP + if (appdata.packet_in != NOBLOCK) + { + Serial.print(F("udp parsePacket received packet: ")); + Serial.print(appdata.packet_in); + } +#endif + int size = Enc28J60Network::blockSize(appdata.packet_in); +#ifdef UIPETHERNET_DEBUG_UDP + if (appdata.packet_in != NOBLOCK) + { + Serial.print(F(", size: ")); + Serial.println(size); + } +#endif + return size; +} + +// Number of bytes remaining in the current packet +int +UIPUDP::available() +{ + UIPEthernetClass::tick(); + return Enc28J60Network::blockSize(appdata.packet_in); +} + +// Read a single byte from the current packet +int +UIPUDP::read() +{ + unsigned char c; + if (read(&c,1) > 0) + { + return c; + } + return -1; +} + +// Read up to len bytes from the current packet and place them into buffer +// Returns the number of bytes read, or 0 if none are available +int +UIPUDP::read(unsigned char* buffer, size_t len) +{ + UIPEthernetClass::tick(); + if (appdata.packet_in != NOBLOCK) + { + memaddress read = Enc28J60Network::readPacket(appdata.packet_in,0,buffer,len); + if (read == Enc28J60Network::blockSize(appdata.packet_in)) + { + Enc28J60Network::freeBlock(appdata.packet_in); + appdata.packet_in = NOBLOCK; + } + else + Enc28J60Network::resizeBlock(appdata.packet_in,read); + return read; + } + return 0; +} + +// Return the next byte from the current packet without moving on to the next byte +int +UIPUDP::peek() +{ + UIPEthernetClass::tick(); + if (appdata.packet_in != NOBLOCK) + { + unsigned char c; + if (Enc28J60Network::readPacket(appdata.packet_in,0,&c,1) == 1) + return c; + } + return -1; +} + +// Finish reading the current packet +void +UIPUDP::flush() +{ + UIPEthernetClass::tick(); + Enc28J60Network::freeBlock(appdata.packet_in); + appdata.packet_in = NOBLOCK; +} + +// Return the IP address of the host who sent the current incoming packet +IPAddress +UIPUDP::remoteIP() +{ + return _uip_udp_conn ? ip_addr_uip(_uip_udp_conn->ripaddr) : IPAddress(); +} + +// Return the port of the host who sent the current incoming packet +uint16_t +UIPUDP::remotePort() +{ + return _uip_udp_conn ? ntohs(_uip_udp_conn->rport) : 0; +} + +// uIP callback function + +void +uipudp_appcall(void) { + if (uip_udp_userdata_t *data = (uip_udp_userdata_t *)(uip_udp_conn->appstate)) + { + if (uip_newdata()) + { + if (data->packet_next == NOBLOCK) + { + uip_udp_conn->rport = UDPBUF->srcport; + uip_ipaddr_copy(uip_udp_conn->ripaddr,UDPBUF->srcipaddr); + data->packet_next = Enc28J60Network::allocBlock(ntohs(UDPBUF->udplen)-UIP_UDPH_LEN); + //if we are unable to allocate memory the packet is dropped. udp doesn't guarantee packet delivery + if (data->packet_next != NOBLOCK) + { + //discard Linklevel and IP and udp-header and any trailing bytes: + Enc28J60Network::copyPacket(data->packet_next,0,UIPEthernetClass::in_packet,UIP_UDP_PHYH_LEN,Enc28J60Network::blockSize(data->packet_next)); + #ifdef UIPETHERNET_DEBUG_UDP + Serial.print(F("udp, uip_newdata received packet: ")); + Serial.print(data->packet_next); + Serial.print(F(", size: ")); + Serial.println(Enc28J60Network::blockSize(data->packet_next)); + #endif + } + } + } + if (uip_poll() && data->send) + { + //set uip_slen (uip private) by calling uip_udp_send +#ifdef UIPETHERNET_DEBUG_UDP + Serial.print(F("udp, uip_poll preparing packet to send: ")); + Serial.print(data->packet_out); + Serial.print(F(", size: ")); + Serial.println(Enc28J60Network::blockSize(data->packet_out)); +#endif + UIPEthernetClass::uip_packet = data->packet_out; + UIPEthernetClass::uip_hdrlen = UIP_UDP_PHYH_LEN; + uip_udp_send(data->out_pos - (UIP_UDP_PHYH_LEN)); + } + } +} + +void +UIPUDP::_send(uip_udp_userdata_t *data) { + uip_arp_out(); //add arp + if (uip_len == UIP_ARPHDRSIZE) + { + UIPEthernetClass::uip_packet = NOBLOCK; + UIPEthernetClass::packetstate &= ~UIPETHERNET_SENDPACKET; +#ifdef UIPETHERNET_DEBUG_UDP + Serial.println(F("udp, uip_poll results in ARP-packet")); +#endif + } + else + //arp found ethaddr for ip (otherwise packet is replaced by arp-request) + { + data->send = false; + data->packet_out = NOBLOCK; + UIPEthernetClass::packetstate |= UIPETHERNET_SENDPACKET; +#ifdef UIPETHERNET_DEBUG_UDP + Serial.print(F("udp, uip_packet to send: ")); + Serial.println(UIPEthernetClass::uip_packet); +#endif + } + UIPEthernetClass::network_send(); +} +#endif diff --git a/STM32F4/libraries/arduino_uip/UIPUdp.h b/STM32F4/libraries/arduino_uip/UIPUdp.h new file mode 100644 index 0000000..b007a3c --- /dev/null +++ b/STM32F4/libraries/arduino_uip/UIPUdp.h @@ -0,0 +1,126 @@ +/* + UIPUdp.h - Arduino implementation of a uIP wrapper class. + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef UIPUDP_H +#define UIPUDP_H + +#include "ethernet_comp.h" +#include "Arduino.h" +#include +#include "utility/mempool.h" +extern "C" { + #include "utility/uip.h" +} + +#define UIP_UDP_MAXDATALEN 1500 +#define UIP_UDP_PHYH_LEN UIP_LLH_LEN+UIP_IPUDPH_LEN +#define UIP_UDP_MAXPACKETSIZE UIP_UDP_MAXDATALEN+UIP_UDP_PHYH_LEN + +typedef struct { + memaddress out_pos; + memhandle packet_next; + memhandle packet_in; + memhandle packet_out; + boolean send; +} uip_udp_userdata_t; + +class UIPUDP : public UDP +{ + +private: + struct uip_udp_conn *_uip_udp_conn; + + uip_udp_userdata_t appdata; + +public: + UIPUDP(); // Constructor + uint8_t + begin(uint16_t);// initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + void + stop(); // Finish with the UDP socket + + // Sending UDP packets + + // Start building up a packet to send to the remote host specific in ip and port + // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port + int + beginPacket(IPAddress ip, uint16_t port); + // Start building up a packet to send to the remote host specific in host and port + // Returns 1 if successful, 0 if there was a problem resolving the hostname or port + int + beginPacket(const char *host, uint16_t port); + // Finish off this packet and send it + // Returns 1 if the packet was sent successfully, 0 if there was an error + int + endPacket(); + // Write a single byte into the packet + size_t + write(uint8_t); + // Write size bytes from buffer into the packet + size_t + write(const uint8_t *buffer, size_t size); + + using Print::write; + + // Start processing the next available incoming packet + // Returns the size of the packet in bytes, or 0 if no packets are available + int + parsePacket(); + // Number of bytes remaining in the current packet + int + available(); + // Read a single byte from the current packet + int + read(); + // Read up to len bytes from the current packet and place them into buffer + // Returns the number of bytes read, or 0 if none are available + int + read(unsigned char* buffer, size_t len); + // Read up to len characters from the current packet and place them into buffer + // Returns the number of characters read, or 0 if none are available + int + read(char* buffer, size_t len) + { + return read((unsigned char*) buffer, len); + } + ; + // Return the next byte from the current packet without moving on to the next byte + int + peek(); + void + flush(); // Finish reading the current packet + + // Return the IP address of the host who sent the current incoming packet + IPAddress + remoteIP(); + + // Return the port of the host who sent the current incoming packet + uint16_t + remotePort(); + +private: + + friend void uipudp_appcall(void); + + friend class UIPEthernetClass; + static void _send(uip_udp_userdata_t *data); + +}; + +#endif diff --git a/STM32F4/libraries/arduino_uip/ethernet_comp.h b/STM32F4/libraries/arduino_uip/ethernet_comp.h new file mode 100644 index 0000000..4cec2ab --- /dev/null +++ b/STM32F4/libraries/arduino_uip/ethernet_comp.h @@ -0,0 +1,9 @@ +#ifndef ETHERNET_COMP_H +#define ETHERNET_COMP_H + +#define Ethernet UIPEthernet +#define EthernetClient UIPClient +#define EthernetServer UIPServer +#define EthernetUDP UIPUDP + +#endif diff --git a/STM32F4/libraries/arduino_uip/examples/AdvancedChatServer/AdvancedChatServer.ino b/STM32F4/libraries/arduino_uip/examples/AdvancedChatServer/AdvancedChatServer.ino new file mode 100644 index 0000000..bc2f094 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/examples/AdvancedChatServer/AdvancedChatServer.ino @@ -0,0 +1,104 @@ +/* + Advanced Chat Server + + A simple server that distributes any incoming messages to all + connected clients but the client the message comes from. + To use telnet to your device's IP address and type. + You can see the client's input in the serial monitor as well. + Using an Arduino Wiznet Ethernet shield. + + Circuit: + * Ethernet shield attached to pins 10, 11, 12, 13 + * Analog inputs attached to pins A0 through A5 (optional) + + created 18 Dec 2009 + by David A. Mellis + modified 9 Apr 2012 + by Tom Igoe + redesigned to make use of operator== 25 Nov 2013 + by Norbert Truchsess + + */ + +#include + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network. + +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +IPAddress ip(192,168,0,6); + +// telnet defaults to port 23 +EthernetServer server(23); + +EthernetClient clients[4]; + +void setup() { + // initialize the ethernet device + Ethernet.begin(mac, ip); + // start listening for clients + server.begin(); + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for Leonardo only + } + + + Serial.print("Chat server address:"); + Serial.println(Ethernet.localIP()); +} + +void loop() { + // wait for a new client: + EthernetClient client = server.available(); + + if (client) { + + boolean newClient = true; + for (byte i=0;i<4;i++) { + //check whether this client refers to the same socket as one of the existing instances: + if (clients[i]==client) { + newClient = false; + break; + } + } + + if (newClient) { + //check which of the existing clients can be overridden: + for (byte i=0;i<4;i++) { + if (!clients[i] && clients[i]!=client) { + clients[i] = client; + // clead out the input buffer: + client.flush(); + // clead out the input buffer: + client.flush(); + Serial.println("We have a new client"); + client.println("Hello, client!"); + client.print("my IP: "); + client.println(Ethernet.localIP()); + break; + } + } + } + + if (client.available() > 0) { + // read the bytes incoming from the client: + char thisChar = client.read(); + // echo the bytes back to all other connected clients: + for (byte i=0;i<4;i++) { + if (clients[i] && clients[i]!=client) { + clients[i].write(thisChar); + } + } + // echo the bytes to the server as well: + Serial.write(thisChar); + } + } + for (byte i=0;i<4;i++) { + if (!(clients[i].connected())) { + // client.stop() invalidates the internal socket-descriptor, so next use of == will allways return false; + clients[i].stop(); + } + } +} diff --git a/STM32F4/libraries/arduino_uip/examples/EchoServer/EchoServer.ino b/STM32F4/libraries/arduino_uip/examples/EchoServer/EchoServer.ino new file mode 100644 index 0000000..62d66e4 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/examples/EchoServer/EchoServer.ino @@ -0,0 +1,58 @@ +/* + * UIPEthernet EchoServer example. + * + * UIPEthernet is a TCP/IP stack that can be used with a enc28j60 based + * Ethernet-shield. + * + * UIPEthernet uses the fine uIP stack by Adam Dunkels + * + * ----------------- + * + * This Hello World example sets up a server at 192.168.1.6 on port 1000. + * Telnet here to access the service. The uIP stack will also respond to + * pings to test if you have successfully established a TCP connection to + * the Arduino. + * + * This example was based upon uIP hello-world by Adam Dunkels + * Ported to the Arduino IDE by Adam Nielsen + * Adaption to Enc28J60 by Norbert Truchsess + */ + +#include +// The connection_data struct needs to be defined in an external file. +#include +#include + +EthernetServer server = EthernetServer(1000); + +void setup() +{ + Serial.begin(9600); + + uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; + IPAddress myIP(192,168,0,6); + + Ethernet.begin(mac,myIP); + + server.begin(); +} + +void loop() +{ + size_t size; + + if (EthernetClient client = server.available()) + { + if (client) + { + while((size = client.available()) > 0) + { + uint8_t* msg = (uint8_t*)malloc(size); + size = client.read(msg,size); + Serial.write(msg,size); + client.write(msg,size); + free(msg); + } + } + } +} diff --git a/STM32F4/libraries/arduino_uip/examples/TcpClient/TcpClient.ino b/STM32F4/libraries/arduino_uip/examples/TcpClient/TcpClient.ino new file mode 100644 index 0000000..444b36a --- /dev/null +++ b/STM32F4/libraries/arduino_uip/examples/TcpClient/TcpClient.ino @@ -0,0 +1,77 @@ +/* + * UIPEthernet TcpClient example. + * + * UIPEthernet is a TCP/IP stack that can be used with a enc28j60 based + * Ethernet-shield. + * + * UIPEthernet uses the fine uIP stack by Adam Dunkels + * + * ----------------- + * + * This TcpClient example gets its local ip-address via dhcp and sets + * up a tcp socket-connection to 192.168.0.1 port 5000 every 5 Seconds. + * After sending a message it waits for a response. After receiving the + * response the client disconnects and tries to reconnect after 5 seconds. + * + * Copyright (C) 2013 by Norbert Truchsess + */ + +#include +#include + +EthernetClient client; +signed long next; + +void setup() { + + Serial.begin(9600); + + uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; + Ethernet.begin(mac); + + Serial.print("localIP: "); + Serial.println(Ethernet.localIP()); + Serial.print("subnetMask: "); + Serial.println(Ethernet.subnetMask()); + Serial.print("gatewayIP: "); + Serial.println(Ethernet.gatewayIP()); + Serial.print("dnsServerIP: "); + Serial.println(Ethernet.dnsServerIP()); + + next = 0; +} + +void loop() { + + if (((signed long)(millis() - next)) > 0) + { + next = millis() + 5000; + Serial.println("Client connect"); + // replace hostname with name of machine running tcpserver.pl +// if (client.connect("server.local",5000)) + if (client.connect(IPAddress(192,168,0,1),5000)) + { + Serial.println("Client connected"); + client.println("DATA from Client"); + while(client.available()==0) + { + if (next - millis() < 0) + goto close; + } + int size; + while((size = client.available()) > 0) + { + uint8_t* msg = (uint8_t*)malloc(size); + size = client.read(msg,size); + Serial.write(msg,size); + free(msg); + } +close: + //disconnect client + Serial.println("Client disconnect"); + client.stop(); + } + else + Serial.println("Client connect failed"); + } +} diff --git a/STM32F4/libraries/arduino_uip/examples/TcpServer/TcpServer.ino b/STM32F4/libraries/arduino_uip/examples/TcpServer/TcpServer.ino new file mode 100644 index 0000000..ad91059 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/examples/TcpServer/TcpServer.ino @@ -0,0 +1,74 @@ +/* + * UIPEthernet EchoServer example. + * + * UIPEthernet is a TCP/IP stack that can be used with a enc28j60 based + * Ethernet-shield. + * + * UIPEthernet uses the fine uIP stack by Adam Dunkels + * + * ----------------- + * + * This Hello World example sets up a server at 192.168.1.6 on port 1000. + * Telnet here to access the service. The uIP stack will also respond to + * pings to test if you have successfully established a TCP connection to + * the Arduino. + * + * This example was based upon uIP hello-world by Adam Dunkels + * Ported to the Arduino IDE by Adam Nielsen + * Adaption to Enc28J60 by Norbert Truchsess + */ + +#include +#include +#include + + + +EthernetServer server = EthernetServer(23); + + +void setup() +{ + Serial.begin(115200); + delay(3000); + Serial.println("TCP Server starting ..."); + + uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; + IPAddress myIP(10,111,111,5); + + Ethernet.begin(mac, myIP); // Static IP +// Ethernet.begin(mac); // DHCP + Serial.print("localIP: "); + Serial.println(Ethernet.localIP().toCharArray()); + Serial.print("subnetMask: "); + Serial.println(Ethernet.subnetMask().toCharArray()); + Serial.print("gatewayIP: "); + Serial.println(Ethernet.gatewayIP().toCharArray()); + Serial.print("dnsServerIP: "); + Serial.println(Ethernet.dnsServerIP().toCharArray()); + + server.begin(); +} + +void loop() +{ + size_t size; + + if (EthernetClient client = server.available()) + { + Serial.println("Client connected !"); + while((size = client.available()) > 0) + { + uint8_t* msg = (uint8_t*)malloc(size); + size = client.read(msg, size); + Serial.print("Client Data received ! size="); + Serial.println(size); + Serial.write(msg, size); + free(msg); + } + client.println("DATA from Server!"); + client.stop(); + } + +} + diff --git a/STM32F4/libraries/arduino_uip/examples/UdpClient/UdpClient.ino b/STM32F4/libraries/arduino_uip/examples/UdpClient/UdpClient.ino new file mode 100644 index 0000000..aad56b4 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/examples/UdpClient/UdpClient.ino @@ -0,0 +1,93 @@ +/* + * UIPEthernet UdpClient example. + * + * UIPEthernet is a TCP/IP stack that can be used with a enc28j60 based + * Ethernet-shield. + * + * UIPEthernet uses the fine uIP stack by Adam Dunkels + * + * ----------------- + * + * This UdpClient example tries to send a packet via udp to 192.168.0.1 + * on port 5000 every 5 seconds. After successfully sending the packet it + * waits for up to 5 seconds for a response on the local port that has been + * implicitly opened when sending the packet. + * + * Copyright (C) 2013 by Norbert Truchsess (norbert.truchsess@t-online.de) + */ + +#include + +EthernetUDP udp; +unsigned long next; + +void setup() { + + Serial.begin(9600); + + uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; + + Ethernet.begin(mac,IPAddress(192,168,0,6)); + + next = millis()+5000; +} + +void loop() { + + int success; + int len = 0; + + if (((signed long)(millis()-next))>0) + { + do + { + success = udp.beginPacket(IPAddress(192,168,0,1),5000); + Serial.print("beginPacket: "); + Serial.println(success ? "success" : "failed"); + //beginPacket fails if remote ethaddr is unknown. In this case an + //arp-request is send out first and beginPacket succeeds as soon + //the arp-response is received. + } + while (!success && ((signed long)(millis()-next))<0); + if (!success ) + goto stop; + + success = udp.write("hello world from arduino"); + + Serial.print("bytes written: "); + Serial.println(success); + + success = udp.endPacket(); + + Serial.print("endPacket: "); + Serial.println(success ? "success" : "failed"); + + do + { + //check for new udp-packet: + success = udp.parsePacket(); + } + while (!success && ((signed long)(millis()-next))<0); + if (!success ) + goto stop; + + Serial.print("received: '"); + do + { + int c = udp.read(); + Serial.write(c); + len++; + } + while ((success = udp.available())>0); + Serial.print("', "); + Serial.print(len); + Serial.println(" bytes"); + + //finish reading this packet: + udp.flush(); + + stop: + udp.stop(); + next = millis()+5000; + } +} diff --git a/STM32F4/libraries/arduino_uip/examples/UdpServer/UdpServer.ino b/STM32F4/libraries/arduino_uip/examples/UdpServer/UdpServer.ino new file mode 100644 index 0000000..3b12d75 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/examples/UdpServer/UdpServer.ino @@ -0,0 +1,88 @@ +/* + * UIPEthernet UdpServer example. + * + * UIPEthernet is a TCP/IP stack that can be used with a enc28j60 based + * Ethernet-shield. + * + * UIPEthernet uses the fine uIP stack by Adam Dunkels + * + * ----------------- + * + * This UdpServer example sets up a udp-server at 192.168.0.6 on port 5000. + * send packet via upd to test + * + * Copyright (C) 2013 by Norbert Truchsess (norbert.truchsess@t-online.de) + */ + +#include + +EthernetUDP udp; + +void setup() { + + Serial.begin(9600); + + uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; + + Ethernet.begin(mac,IPAddress(192,168,0,6)); + + int success = udp.begin(5000); + + Serial.print("initialize: "); + Serial.println(success ? "success" : "failed"); + +} + +void loop() { + + //check for new udp-packet: + int size = udp.parsePacket(); + if (size > 0) { + do + { + char* msg = (char*)malloc(size+1); + int len = udp.read(msg,size+1); + msg[len]=0; + Serial.print("received: '"); + Serial.print(msg); + free(msg); + } + while ((size = udp.available())>0); + //finish reading this packet: + udp.flush(); + Serial.println("'"); + int success; + do + { + Serial.print("remote ip: "); + Serial.println(udp.remoteIP()); + Serial.print("remote port: "); + Serial.println(udp.remotePort()); + //send new packet back to ip/port of client. This also + //configures the current connection to ignore packets from + //other clients! + success = udp.beginPacket(udp.remoteIP(),udp.remotePort()); + Serial.print("beginPacket: "); + Serial.println(success ? "success" : "failed"); + //beginPacket fails if remote ethaddr is unknown. In this case an + //arp-request is send out first and beginPacket succeeds as soon + //the arp-response is received. + } + while (!success); + + success = udp.println("hello world from arduino"); + + Serial.print("bytes written: "); + Serial.println(success); + + success = udp.endPacket(); + + Serial.print("endPacket: "); + Serial.println(success ? "success" : "failed"); + + udp.stop(); + //restart with new connection to receive packets from other clients + Serial.print("restart connection: "); + Serial.println (udp.begin(5000) ? "success" : "failed"); + } +} diff --git a/STM32F4/libraries/arduino_uip/keywords.txt b/STM32F4/libraries/arduino_uip/keywords.txt new file mode 100644 index 0000000..83ff854 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/keywords.txt @@ -0,0 +1,58 @@ +####################################### +# Syntax Coloring Map for SerialIP +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +UIPEthernet KEYWORD1 +UIPServer KEYWORD1 +UIPClient KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +PSOCK_BEGIN KEYWORD2 +PSOCK_CLOSE KEYWORD2 +PSOCK_END KEYWORD2 +PSOCK_EXIT KEYWORD2 +PSOCK_INIT KEYWORD2 +PSOCK_READBUF KEYWORD2 +PSOCK_READTO KEYWORD2 +PSOCK_SEND KEYWORD2 +PSOCK_SEND_STR KEYWORD2 + +uip_listen KEYWORD2 +uip_unlisten KEYWORD2 +uip_connect KEYWORD2 +uip_outstanding KEYWORD2 +uip_send KEYWORD2 +uip_datalen KEYWORD2 +uip_close KEYWORD2 +uip_abort KEYWORD2 +uip_stop KEYWORD2 +uip_stopped KEYWORD2 +uip_restart KEYWORD2 +uip_acked KEYWORD2 +uip_connected KEYWORD2 +uip_closed KEYWORD2 +uip_aborted KEYWORD2 +uip_timedout KEYWORD2 +uip_rexmit KEYWORD2 +uip_poll KEYWORD2 +uip_initialmss KEYWORD2 +uip_mss KEYWORD2 +uip_ipaddr KEYWORD2 +uip_ipaddr_maskcmp KEYWORD2 +uip_ipaddr_mask KEYWORD2 +HTONS KEYWORD2 +htons KEYWORD2 + +use_device KEYWORD2 +set_uip_callback KEYWORD2 +set_gateway KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/STM32F4/libraries/arduino_uip/library.properties b/STM32F4/libraries/arduino_uip/library.properties new file mode 100644 index 0000000..8ee6394 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/library.properties @@ -0,0 +1,10 @@ +name=UIPEthernet +author=ntruchsess +email=Norbert Truchsess +sentence=Ethernet library for ENC28J60 +paragraph=implements the same API as stock Ethernet-lib. Just replace the include of Ethernet.h with UIPEthernet.h +url=https://github.com/ntruchsess/arduino_uip +architectures=STM32F1 +version=1.04 +dependencies= +core-dependencies=arduino (>=1.5.0) diff --git a/STM32F4/libraries/arduino_uip/tests/perl/tcpclient.pl b/STM32F4/libraries/arduino_uip/tests/perl/tcpclient.pl new file mode 100755 index 0000000..e6884dc --- /dev/null +++ b/STM32F4/libraries/arduino_uip/tests/perl/tcpclient.pl @@ -0,0 +1,34 @@ +#!/usr/bin/perl +#tcpclient.pl + +use IO::Socket::INET; + +# flush after every write +$| = 1; + +my ($socket,$client_socket); + +# creating object interface of IO::Socket::INET modules which internally creates +# socket, binds and connects to the TCP server running on the specific port. +$socket = new IO::Socket::INET ( +PeerHost => '192.168.0.6', +PeerPort => '1000', +Proto => 'tcp', +) or die "ERROR in Socket Creation : $!\n"; + +print "TCP Connection Success.\n"; + +# write on the socket to server. +$data = "DATA from Client"; +print $socket "$data\n"; +# we can also send the data through IO::Socket::INET module, +# $socket->send($data); + +# read the socket data sent by server. +$data = <$socket>; +# we can also read from socket through recv() in IO::Socket::INET +# $socket->recv($data,1024); +print "Received from Server : $data\n"; + +sleep (10); +$socket->close(); \ No newline at end of file diff --git a/STM32F4/libraries/arduino_uip/tests/perl/tcpserver.pl b/STM32F4/libraries/arduino_uip/tests/perl/tcpserver.pl new file mode 100755 index 0000000..17405a3 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/tests/perl/tcpserver.pl @@ -0,0 +1,53 @@ +#!/usr/bin/perl +#tcpserver.pl + +use IO::Socket::INET; + +# flush after every write +$| = 1; + +my ($socket,$client_socket); +my ($peeraddress,$peerport); + +# creating object interface of IO::Socket::INET modules which internally does +# socket creation, binding and listening at the specified port address. +$socket = new IO::Socket::INET ( +LocalHost => '192.168.0.1', +LocalPort => '5000', +Proto => 'tcp', +Listen => 5, +Reuse => 1 +) or die "ERROR in Socket Creation : $!\n"; + +print "SERVER Waiting for client connection on port 5000\n"; + +while(1) +{ + # waiting for new client connection. + $client_socket = $socket->accept(); + + # get the host and port number of newly connected client. + $peer_address = $client_socket->peerhost(); + $peer_port = $client_socket->peerport(); + + print "Accepted New Client Connection From : $peer_address, $peer_port\n "; + + # read operation on the newly accepted client + $data = <$client_socket>; + # we can also read from socket through recv() in IO::Socket::INET + # $client_socket->recv($data,1024); + print "Received from Client : $data\n"; + + # write operation on the newly accepted client. + $data = "DATA from Server"; + print $client_socket "$data\n"; + # we can also send the data through IO::Socket::INET module, + # $client_socket->send($data); + + sleep(1); + + $client_socket->close(); +} + +$socket->close(); + diff --git a/STM32F4/libraries/arduino_uip/tests/perl/udpclient.pl b/STM32F4/libraries/arduino_uip/tests/perl/udpclient.pl new file mode 100755 index 0000000..bc9e6a2 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/tests/perl/udpclient.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl +#udpclient.pl + +use IO::Socket::INET; + +# flush after every write +$| = 1; + +my ($socket,$data); + +# We call IO::Socket::INET->new() to create the UDP Socket +# and bind with the PeerAddr. +$socket = new IO::Socket::INET ( +PeerAddr => '192.168.0.6:5000', +Proto => 'udp' +) or die "ERROR in Socket Creation : $!\n"; +#send operation +$data = "data from client"; +$socket->send($data); + +#read operation +$data = <$socket>; +print "Data received from socket : $data\n "; + +sleep(10); +$socket->close(); diff --git a/STM32F4/libraries/arduino_uip/tests/perl/udpserver.pl b/STM32F4/libraries/arduino_uip/tests/perl/udpserver.pl new file mode 100755 index 0000000..e728a46 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/tests/perl/udpserver.pl @@ -0,0 +1,40 @@ +#!/usr/bin/perl +#udpserver.pl + +use IO::Socket::INET; + +# flush after every write +$| = 1; + +my ($socket,$received_data); +my ($peeraddress,$peerport); + +# we call IO::Socket::INET->new() to create the UDP Socket and bound +# to specific port number mentioned in LocalPort and there is no need to provide +# LocalAddr explicitly as in TCPServer. +$socket = new IO::Socket::INET ( +LocalPort => '5000', +Proto => 'udp', +) or die "ERROR in Socket Creation : $!\n"; + +while(1) +{ +# read operation on the socket +$socket->recv($recieved_data,1024); + +#get the peerhost and peerport at which the recent data received. +$peer_address = $socket->peerhost(); +$peer_port = $socket->peerport(); +print "($peer_address , $peer_port) said : $recieved_data\n"; + +#send the data to the client at which the read/write operations done recently. +$data = "data from server\n"; + +$socket->send($data); + +print $socket "$data"; + +} + +$socket->close(); + diff --git a/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp b/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp new file mode 100644 index 0000000..557e5a0 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp @@ -0,0 +1,646 @@ +/* + Enc28J60NetworkClass.h + UIPEthernet network driver for Microchip ENC28J60 Ethernet Interface. + + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + based on enc28j60.c file from the AVRlib library by Pascal Stang. + For AVRlib See http://www.procyonengineering.com/ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "Enc28J60Network.h" +#include "Arduino.h" + +extern "C" { +//#include +#include "enc28j60.h" +#include "uip.h" +} + +#ifdef ENC28J60DEBUG +#include "HardwareSerial.h" +#endif + +//#define Serial SerialUSB +//#define SPI SPIEth +extern SPIClass SPI; + +// set CS to 0 = active +#define CSACTIVE digitalWrite(ENC28J60_CONTROL_CS, LOW) +// set CS to 1 = passive +#define CSPASSIVE digitalWrite(ENC28J60_CONTROL_CS, HIGH) +// +#define waitspi() while(!(SPSR&(1< ip checksum for theses bytes=f7f9 + // in binary these poitions are:11 0000 0011 1111 + // This is hex 303F->EPMM0=0x3f,EPMM1=0x30 + //TODO define specific pattern to receive dhcp-broadcast packages instead of setting ERFCON_BCEN! +// enableBroadcast(); // change to add ERXFCON_BCEN recommended by epam + writeReg(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN|ERXFCON_BCEN); + writeRegPair(EPMM0, 0x303f); + writeRegPair(EPMCSL, 0xf7f9); + // + // + // do bank 2 stuff + // enable MAC receive + // and bring MAC out of reset (writes 0x00 to MACON2) + writeRegPair(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS); + //----------------writeRegPair(MACON2, 0x00); + // enable automatic padding to 60bytes and CRC operations + writeOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN); + // set inter-frame gap (non-back-to-back) + writeRegPair(MAIPGL, 0x0C12); + // set inter-frame gap (back-to-back) + writeReg(MABBIPG, 0x12); + // Set the maximum packet size which the controller will accept + // Do not send packets longer than MAX_FRAMELEN: + writeRegPair(MAMXFLL, MAX_FRAMELEN); + // do bank 3 stuff + // write MAC address + // NOTE: MAC address in ENC28J60 is byte-backward + writeReg(MAADR5, macaddr[0]); + writeReg(MAADR4, macaddr[1]); + writeReg(MAADR3, macaddr[2]); + writeReg(MAADR2, macaddr[3]); + writeReg(MAADR1, macaddr[4]); + writeReg(MAADR0, macaddr[5]); + // no loopback of transmitted frames + phyWrite(PHCON2, PHCON2_HDLDIS); + // switch to bank 0 + setBank(ECON1); + // enable interrutps + writeOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE); + // enable packet reception + writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN); + //Configure leds + phyWrite(PHLCON,0x476); + + byte rev = readReg(EREVID); + // microchip forgot to step the number on the silcon when they + // released the revision B7. 6 is now rev B7. We still have + // to see what they do when they release B8. At the moment + // there is no B8 out yet + if (rev > 5) ++rev; +#ifdef ENC28J60DEBUG + Serial.print("ENC28J60::initialize returns "); + Serial.println(rev); +#endif +// return rev; +} + + +memhandle +Enc28J60Network::receivePacket() +{ + uint8_t rxstat; + uint16_t len; + // check if a packet has been received and buffered + //if( !(readReg(EIR) & EIR_PKTIF) ){ + // The above does not work. See Rev. B4 Silicon Errata point 6. + if (readReg(EPKTCNT) != 0) + { + uint16_t readPtr = nextPacketPtr+6 > RXSTOP_INIT ? nextPacketPtr+6-RXSTOP_INIT+RXSTART_INIT : nextPacketPtr+6; + // Set the read pointer to the start of the received packet + writeRegPair(ERDPTL, nextPacketPtr); + // read the next packet pointer + nextPacketPtr = readOp(ENC28J60_READ_BUF_MEM, 0); + nextPacketPtr |= readOp(ENC28J60_READ_BUF_MEM, 0) << 8; + // read the packet length (see datasheet page 43) + len = readOp(ENC28J60_READ_BUF_MEM, 0); + len |= readOp(ENC28J60_READ_BUF_MEM, 0) << 8; + len -= 4; //remove the CRC count + // read the receive status (see datasheet page 43) + rxstat = readOp(ENC28J60_READ_BUF_MEM, 0); + //rxstat |= readOp(ENC28J60_READ_BUF_MEM, 0) << 8; +#ifdef ENC28J60DEBUG + Serial.print("receivePacket ["); + Serial.print(readPtr,HEX); + Serial.print("-"); + Serial.print((readPtr+len) % (RXSTOP_INIT+1),HEX); + Serial.print("], next: "); + Serial.print(nextPacketPtr,HEX); + Serial.print(", stat: "); + Serial.print(rxstat,HEX); + Serial.print(", count: "); + Serial.print(readReg(EPKTCNT)); + Serial.print(" -> "); + Serial.println((rxstat & 0x80)!=0 ? "OK" : "failed"); +#endif + // decrement the packet counter indicate we are done with this packet + writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC); + // check CRC and symbol errors (see datasheet page 44, table 7-3): + // The ERXFCON.CRCEN is set by default. Normally we should not + // need to check this. + if ((rxstat & 0x80) != 0) + { + receivePkt.begin = readPtr; + receivePkt.size = len; +#ifdef ENC28J60DEBUG + Serial.print("receivePkt.size="); + Serial.println(len); +#endif + return UIP_RECEIVEBUFFERHANDLE; + } + // Move the RX read pointer to the start of the next received packet + // This frees the memory we just read out + setERXRDPT(); + } + return (NOBLOCK); +} + +void +Enc28J60Network::setERXRDPT() +{ + writeRegPair(ERXRDPTL, nextPacketPtr == RXSTART_INIT ? RXSTOP_INIT : nextPacketPtr-1); +} + +memaddress +Enc28J60Network::blockSize(memhandle handle) +{ + return handle == NOBLOCK ? 0 : handle == UIP_RECEIVEBUFFERHANDLE ? receivePkt.size : blocks[handle].size; +} + +void +Enc28J60Network::sendPacket(memhandle handle) +{ + memblock *packet = &blocks[handle]; + uint16_t start = packet->begin-1; + uint16_t end = start + packet->size; + + // backup data at control-byte position + uint8_t data = readByte(start); + // write control-byte (if not 0 anyway) + if (data) + writeByte(start, 0); + +#ifdef ENC28J60DEBUG + Serial.print("sendPacket("); + Serial.print(handle); + Serial.print(") ["); + Serial.print(start,HEX); + Serial.print("-"); + Serial.print(end,HEX); + Serial.print("]: "); + for (uint16_t i=start; i<=end; i++) + { + Serial.print(readByte(i),HEX); + Serial.print(" "); + } + Serial.println(); +#endif + + // TX start + writeRegPair(ETXSTL, start); + // Set the TXND pointer to correspond to the packet size given + writeRegPair(ETXNDL, end); + // send the contents of the transmit buffer onto the network + writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS); + // Reset the transmit logic problem. See Rev. B4 Silicon Errata point 12. + if( (readReg(EIR) & EIR_TXERIF) ) + { + writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS); + } + + //restore data on control-byte position + if (data) + writeByte(start, data); +} + +uint16_t +Enc28J60Network::setReadPtr(memhandle handle, memaddress position, uint16_t len) +{ + memblock *packet = handle == UIP_RECEIVEBUFFERHANDLE ? &receivePkt : &blocks[handle]; + memaddress start = handle == UIP_RECEIVEBUFFERHANDLE && packet->begin + position > RXSTOP_INIT ? packet->begin + position-RXSTOP_INIT+RXSTART_INIT : packet->begin + position; + + writeRegPair(ERDPTL, start); + + if (len > packet->size - position) + len = packet->size - position; + return len; +} + +uint16_t +Enc28J60Network::readPacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len) +{ + len = setReadPtr(handle, position, len); + readBuffer(len, buffer); + return len; +} + +uint16_t +Enc28J60Network::writePacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len) +{ + memblock *packet = &blocks[handle]; + uint16_t start = packet->begin + position; + + writeRegPair(EWRPTL, start); + + if (len > packet->size - position) + len = packet->size - position; + writeBuffer(len, buffer); + return len; +} + + +void Enc28J60Network::enableBroadcast (bool temporary) { + writeRegByte(ERXFCON, readRegByte(ERXFCON) | ERXFCON_BCEN); + if(!temporary) + broadcast_enabled = true; +} + +void Enc28J60Network::disableBroadcast (bool temporary) { + if(!temporary) + broadcast_enabled = false; + if(!broadcast_enabled) + writeRegByte(ERXFCON, readRegByte(ERXFCON) & ~ERXFCON_BCEN); +} + +void Enc28J60Network::enableMulticast () { + writeRegByte(ERXFCON, readRegByte(ERXFCON) | ERXFCON_MCEN); +} + +void Enc28J60Network::disableMulticast () { + writeRegByte(ERXFCON, readRegByte(ERXFCON) & ~ERXFCON_MCEN); +} + +byte Enc28J60Network::readRegByte (uint8_t address) { + setBank(address); + return readOp(ENC28J60_READ_CTRL_REG, address); +} + +void Enc28J60Network::writeRegByte (uint8_t address, uint8_t data) { + setBank(address); + writeOp(ENC28J60_WRITE_CTRL_REG, address, data); +} + + +uint8_t Enc28J60Network::readByte(uint16_t addr) +{ + writeRegPair(ERDPTL, addr); + + CSACTIVE; + SPI.transfer(ENC28J60_READ_BUF_MEM); + uint8_t data = SPI.transfer(0x00); + CSPASSIVE; + return data; +} + +void Enc28J60Network::writeByte(uint16_t addr, uint8_t data) +{ + writeRegPair(EWRPTL, addr); + + CSACTIVE; + SPI.transfer(ENC28J60_WRITE_BUF_MEM); + SPI.transfer(data); + CSPASSIVE; +} + +void +Enc28J60Network::copyPacket(memhandle dest_pkt, memaddress dest_pos, memhandle src_pkt, memaddress src_pos, uint16_t len) +{ + memblock *dest = &blocks[dest_pkt]; + memblock *src = src_pkt == UIP_RECEIVEBUFFERHANDLE ? &receivePkt : &blocks[src_pkt]; + memaddress start = src_pkt == UIP_RECEIVEBUFFERHANDLE && src->begin + src_pos > RXSTOP_INIT ? src->begin + src_pos-RXSTOP_INIT+RXSTART_INIT : src->begin + src_pos; + enc28J60_mempool_block_move_callback(dest->begin+dest_pos,start,len); + // Move the RX read pointer to the start of the next received packet + // This frees the memory we just read out + setERXRDPT(); +} + +void +enc28J60_mempool_block_move_callback(memaddress dest, memaddress src, memaddress len) +{ +//void +//Enc28J60Network::memblock_mv_cb(uint16_t dest, uint16_t src, uint16_t len) +//{ + //as ENC28J60 DMA is unable to copy single bytes: + if (len == 1) + { + Enc28J60Network::writeByte(dest,Enc28J60Network::readByte(src)); + } + else + { + // calculate address of last byte + len += src - 1; + + /* 1. Appropriately program the EDMAST, EDMAND + and EDMADST register pairs. The EDMAST + registers should point to the first byte to copy + from, the EDMAND registers should point to the + last byte to copy and the EDMADST registers + should point to the first byte in the destination + range. The destination range will always be + linear, never wrapping at any values except from + 8191 to 0 (the 8-Kbyte memory boundary). + Extreme care should be taken when + programming the start and end pointers to + prevent a never ending DMA operation which + would overwrite the entire 8-Kbyte buffer. + */ + Enc28J60Network::writeRegPair(EDMASTL, src); + Enc28J60Network::writeRegPair(EDMADSTL, dest); + + if ((src <= RXSTOP_INIT)&& (len > RXSTOP_INIT))len -= (RXSTOP_INIT-RXSTART_INIT); + Enc28J60Network::writeRegPair(EDMANDL, len); + + /* + 2. If an interrupt at the end of the copy process is + desired, set EIE.DMAIE and EIE.INTIE and + clear EIR.DMAIF. + + 3. Verify that ECON1.CSUMEN is clear. */ + Enc28J60Network::writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_CSUMEN); + + /* 4. Start the DMA copy by setting ECON1.DMAST. */ + Enc28J60Network::writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_DMAST); + + // wait until runnig DMA is completed + while (Enc28J60Network::readOp(ENC28J60_READ_CTRL_REG, ECON1) & ECON1_DMAST); + } +} + +void +Enc28J60Network::freePacket() +{ + setERXRDPT(); +} + +uint8_t +Enc28J60Network::readOp(uint8_t op, uint8_t address) +{ + CSACTIVE; + // issue read command + SPI.transfer(op | (address & ADDR_MASK)); + byte result = SPI.transfer(0x00); + if (address & 0x80) + result = SPI.transfer(0x00); + CSPASSIVE; + return result; +} + +void +Enc28J60Network::writeOp(uint8_t op, uint8_t address, uint8_t data) +{ + CSACTIVE; + // issue write command + SPI.transfer(op | (address & ADDR_MASK)); + SPI.transfer(data); + CSPASSIVE; +} + +void +Enc28J60Network::readBuffer(uint16_t len, uint8_t* data) +{ + CSACTIVE; + // issue read command + SPI.transfer(ENC28J60_READ_BUF_MEM); + while (len--) { + *data++ = SPI.transfer(0x00); + } + CSPASSIVE; +} + +void +Enc28J60Network::writeBuffer(uint16_t len, uint8_t* data) +{ + CSACTIVE; + // issue write command + SPI.transfer(ENC28J60_WRITE_BUF_MEM); + while (len--) { + SPI.transfer(*data++); + } + CSPASSIVE; +} + +void +Enc28J60Network::setBank(uint8_t address) +{ + // set the bank (if needed) + if((address & BANK_MASK) != bank) + { + // set the bank + writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, (ECON1_BSEL1|ECON1_BSEL0)); + writeOp(ENC28J60_BIT_FIELD_SET, ECON1, (address & BANK_MASK)>>5); + bank = (address & BANK_MASK); + } +} + +uint8_t +Enc28J60Network::readReg(uint8_t address) +{ + // set the bank + setBank(address); + // do the read + return readOp(ENC28J60_READ_CTRL_REG, address); +} + +void +Enc28J60Network::writeReg(uint8_t address, uint8_t data) +{ + // set the bank + setBank(address); + // do the write + writeOp(ENC28J60_WRITE_CTRL_REG, address, data); +} + +void +Enc28J60Network::writeRegPair(uint8_t address, uint16_t data) +{ + // set the bank + setBank(address); + // do the write + writeOp(ENC28J60_WRITE_CTRL_REG, address, (data&0xFF)); + writeOp(ENC28J60_WRITE_CTRL_REG, address+1, (data) >> 8); +} + +void +Enc28J60Network::phyWrite(uint8_t address, uint16_t data) +{ + // set the PHY register address + writeReg(MIREGADR, address); + // write the PHY data + writeRegPair(MIWRL, data); + // wait until the PHY write completes + while(readReg(MISTAT) & MISTAT_BUSY){ + delayMicroseconds(15); + } +} + +uint16_t +Enc28J60Network::phyRead(uint8_t address) +{ + writeReg(MIREGADR,address); + writeReg(MICMD, MICMD_MIIRD); + // wait until the PHY read completes + while(readReg(MISTAT) & MISTAT_BUSY){ + delayMicroseconds(15); + } //and MIRDH + writeReg(MICMD, 0); + return (readReg(MIRDL) | readReg(MIRDH) << 8); +} + +void +Enc28J60Network::clkout(uint8_t clk) +{ + //setup clkout: 2 is 12.5MHz: + writeReg(ECOCON, clk & 0x7); +} + +// read the revision of the chip: +uint8_t +Enc28J60Network::getrev(void) +{ + return(readReg(EREVID)); +} + +uint16_t +Enc28J60Network::chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t len) +{ + uint16_t t; + len = setReadPtr(handle, pos, len)-1; + CSACTIVE; + // issue read command + SPI.transfer(ENC28J60_READ_BUF_MEM); + uint16_t i; + for (i = 0; i < len; i+=2) + { + // read data + t = SPI.transfer(0x00) << 8; + t += SPI.transfer(0x00); + sum += t; + if(sum < t) { + sum++; // carry + } + } + if(i == len) { + t = (SPI.transfer(0x00) << 8) + 0; + sum += t; + if(sum < t) { + sum++; // carry + } + } + CSPASSIVE; + + // Return sum in host byte order. + + return sum; +} + +void +Enc28J60Network::powerOff() +{ + writeOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_RXEN); + delay(50); + writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_VRPS); + delay(50); + writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PWRSV); +} + +void +Enc28J60Network::powerOn() +{ + writeOp(ENC28J60_BIT_FIELD_CLR, ECON2, ECON2_PWRSV); + delay(50); + writeOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN); + delay(50); +} + +bool +Enc28J60Network::linkStatus() +{ + return (phyRead(PHSTAT2) & 0x0400) > 0; +} + +Enc28J60Network Enc28J60; diff --git a/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.h b/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.h new file mode 100644 index 0000000..4aee588 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.h @@ -0,0 +1,108 @@ +/* + Enc28J60NetworkClass.h + UIPEthernet network driver for Microchip ENC28J60 Ethernet Interface. + + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + inspired by enc28j60.c file from the AVRlib library by Pascal Stang. + For AVRlib See http://www.procyonengineering.com/ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef Enc28J60Network_H_ +#define Enc28J60Network_H_ + +#include +#include "mempool.h" + +//#define ENC28J60_CONTROL_CS SS +//#define SPI_MOSI MOSI +//#define SPI_MISO MISO +//#define SPI_SCK SCK +//#define SPI_SS SS + +#define ENC28J60_CONTROL_CS PC8 +//#define SPI_MOSI PA7 +//#define SPI_MISO PA6 +//#define SPI_SCK PA5 +//#define SPI_SS PA8 + +#define UIP_RECEIVEBUFFERHANDLE 0xff + +//#define ENC28J60DEBUG + +/* + * Empfangen von ip-header, arp etc... + * wenn tcp/udp -> tcp/udp-callback -> assign new packet to connection + */ + +class Enc28J60Network : public MemoryPool +{ + +private: + static uint16_t nextPacketPtr; + static uint8_t bank; + + static struct memblock receivePkt; + + static bool broadcast_enabled; //!< True if broadcasts enabled (used to allow temporary disable of broadcast for DHCP or other internal functions) + + static uint8_t readOp(uint8_t op, uint8_t address); + static void writeOp(uint8_t op, uint8_t address, uint8_t data); + static uint16_t setReadPtr(memhandle handle, memaddress position, uint16_t len); + static void setERXRDPT(); + static void readBuffer(uint16_t len, uint8_t* data); + static void writeBuffer(uint16_t len, uint8_t* data); + static uint8_t readByte(uint16_t addr); + static void writeByte(uint16_t addr, uint8_t data); + static void setBank(uint8_t address); + static uint8_t readReg(uint8_t address); + static void writeReg(uint8_t address, uint8_t data); + static void writeRegPair(uint8_t address, uint16_t data); + static void phyWrite(uint8_t address, uint16_t data); + static uint16_t phyRead(uint8_t address); + static void clkout(uint8_t clk); + + static void enableBroadcast (bool temporary); + static void disableBroadcast (bool temporary); + static void enableMulticast (); + static void disableMulticast (); + + static uint8_t readRegByte (uint8_t address); + static void writeRegByte (uint8_t address, uint8_t data); + + friend void enc28J60_mempool_block_move_callback(memaddress,memaddress,memaddress); + +public: + + uint8_t getrev(void); + void powerOn(); + void powerOff(); + bool linkStatus(); + + static void init(uint8_t* macaddr); + static memhandle receivePacket(); + static void freePacket(); + static memaddress blockSize(memhandle handle); + static void sendPacket(memhandle handle); + static uint16_t readPacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len); + static uint16_t writePacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len); + static void copyPacket(memhandle dest, memaddress dest_pos, memhandle src, memaddress src_pos, uint16_t len); + static uint16_t chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t len); +}; + +extern Enc28J60Network Enc28J60; +#endif /* Enc28J60NetworkClass_H_ */ diff --git a/STM32F4/libraries/arduino_uip/utility/clock-arch.cpp b/STM32F4/libraries/arduino_uip/utility/clock-arch.cpp new file mode 100644 index 0000000..5f020ba --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/clock-arch.cpp @@ -0,0 +1,30 @@ +/* + clock-arch.c - Arduino implementation of uIP clock device. + Copyright (c) 2010 Adam Nielsen + All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "clock-arch.h" + +extern "C" { +clock_time_t +clock_time(void) +{ + return (clock_time_t) millis(); +} +} diff --git a/STM32F4/libraries/arduino_uip/utility/clock-arch.h b/STM32F4/libraries/arduino_uip/utility/clock-arch.h new file mode 100644 index 0000000..d7a828b --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/clock-arch.h @@ -0,0 +1,27 @@ +/* + clock-arch.h - Arduino implementation of uIP clock device. + Copyright (c) 2010 Adam Nielsen + All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef clock_h_ +#define clock_h_ + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND 1000 + +#endif diff --git a/STM32F4/libraries/arduino_uip/utility/enc28j60.h b/STM32F4/libraries/arduino_uip/utility/enc28j60.h new file mode 100644 index 0000000..3a45c59 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/enc28j60.h @@ -0,0 +1,257 @@ +/***************************************************************************** +* +* Title : Microchip ENC28J60 Ethernet Interface Driver +* Author : Pascal Stang (c)2005 +* Modified by Norbert Truchsess +* Copyright: GPL V2 +* +*This driver provides initialization and transmit/receive +*functions for the Microchip ENC28J60 10Mb Ethernet Controller and PHY. +*This chip is novel in that it is a full MAC+PHY interface all in a 28-pin +*chip, using an SPI interface to the host processor. +* +* +*****************************************************************************/ + +#ifndef ENC28J60_H +#define ENC28J60_H +#include + +// ENC28J60 Control Registers +// Control register definitions are a combination of address, +// bank number, and Ethernet/MAC/PHY indicator bits. +// - Register address (bits 0-4) +// - Bank number (bits 5-6) +// - MAC/PHY indicator (bit 7) +#define ADDR_MASK 0x1F +#define BANK_MASK 0x60 +#define SPRD_MASK 0x80 +// All-bank registers +#define EIE 0x1B +#define EIR 0x1C +#define ESTAT 0x1D +#define ECON2 0x1E +#define ECON1 0x1F +// Bank 0 registers +#define ERDPTL (0x00|0x00) +#define ERDPTH (0x01|0x00) +#define EWRPTL (0x02|0x00) +#define EWRPTH (0x03|0x00) +#define ETXSTL (0x04|0x00) +#define ETXSTH (0x05|0x00) +#define ETXNDL (0x06|0x00) +#define ETXNDH (0x07|0x00) +#define ERXSTL (0x08|0x00) +#define ERXSTH (0x09|0x00) +#define ERXNDL (0x0A|0x00) +#define ERXNDH (0x0B|0x00) +#define ERXRDPTL (0x0C|0x00) +#define ERXRDPTH (0x0D|0x00) +#define ERXWRPTL (0x0E|0x00) +#define ERXWRPTH (0x0F|0x00) +#define EDMASTL (0x10|0x00) +#define EDMASTH (0x11|0x00) +#define EDMANDL (0x12|0x00) +#define EDMANDH (0x13|0x00) +#define EDMADSTL (0x14|0x00) +#define EDMADSTH (0x15|0x00) +#define EDMACSL (0x16|0x00) +#define EDMACSH (0x17|0x00) +// Bank 1 registers +#define EHT0 (0x00|0x20) +#define EHT1 (0x01|0x20) +#define EHT2 (0x02|0x20) +#define EHT3 (0x03|0x20) +#define EHT4 (0x04|0x20) +#define EHT5 (0x05|0x20) +#define EHT6 (0x06|0x20) +#define EHT7 (0x07|0x20) +#define EPMM0 (0x08|0x20) +#define EPMM1 (0x09|0x20) +#define EPMM2 (0x0A|0x20) +#define EPMM3 (0x0B|0x20) +#define EPMM4 (0x0C|0x20) +#define EPMM5 (0x0D|0x20) +#define EPMM6 (0x0E|0x20) +#define EPMM7 (0x0F|0x20) +#define EPMCSL (0x10|0x20) +#define EPMCSH (0x11|0x20) +#define EPMOL (0x14|0x20) +#define EPMOH (0x15|0x20) +#define EWOLIE (0x16|0x20) +#define EWOLIR (0x17|0x20) +#define ERXFCON (0x18|0x20) +#define EPKTCNT (0x19|0x20) +// Bank 2 registers +#define MACON1 (0x00|0x40|0x80) +#define MACON2 (0x01|0x40|0x80) +#define MACON3 (0x02|0x40|0x80) +#define MACON4 (0x03|0x40|0x80) +#define MABBIPG (0x04|0x40|0x80) +#define MAIPGL (0x06|0x40|0x80) +#define MAIPGH (0x07|0x40|0x80) +#define MACLCON1 (0x08|0x40|0x80) +#define MACLCON2 (0x09|0x40|0x80) +#define MAMXFLL (0x0A|0x40|0x80) +#define MAMXFLH (0x0B|0x40|0x80) +#define MAPHSUP (0x0D|0x40|0x80) +#define MICON (0x11|0x40|0x80) +#define MICMD (0x12|0x40|0x80) +#define MIREGADR (0x14|0x40|0x80) +#define MIWRL (0x16|0x40|0x80) +#define MIWRH (0x17|0x40|0x80) +#define MIRDL (0x18|0x40|0x80) +#define MIRDH (0x19|0x40|0x80) +// Bank 3 registers +#define MAADR1 (0x00|0x60|0x80) +#define MAADR0 (0x01|0x60|0x80) +#define MAADR3 (0x02|0x60|0x80) +#define MAADR2 (0x03|0x60|0x80) +#define MAADR5 (0x04|0x60|0x80) +#define MAADR4 (0x05|0x60|0x80) +#define EBSTSD (0x06|0x60) +#define EBSTCON (0x07|0x60) +#define EBSTCSL (0x08|0x60) +#define EBSTCSH (0x09|0x60) +#define MISTAT (0x0A|0x60|0x80) +#define EREVID (0x12|0x60) +#define ECOCON (0x15|0x60) +#define EFLOCON (0x17|0x60) +#define EPAUSL (0x18|0x60) +#define EPAUSH (0x19|0x60) +// PHY registers +#define PHCON1 0x00 +#define PHSTAT1 0x01 +#define PHHID1 0x02 +#define PHHID2 0x03 +#define PHCON2 0x10 +#define PHSTAT2 0x11 +#define PHIE 0x12 +#define PHIR 0x13 +#define PHLCON 0x14 + +// ENC28J60 ERXFCON Register Bit Definitions +#define ERXFCON_UCEN 0x80 +#define ERXFCON_ANDOR 0x40 +#define ERXFCON_CRCEN 0x20 +#define ERXFCON_PMEN 0x10 +#define ERXFCON_MPEN 0x08 +#define ERXFCON_HTEN 0x04 +#define ERXFCON_MCEN 0x02 +#define ERXFCON_BCEN 0x01 +// ENC28J60 EIE Register Bit Definitions +#define EIE_INTIE 0x80 +#define EIE_PKTIE 0x40 +#define EIE_DMAIE 0x20 +#define EIE_LINKIE 0x10 +#define EIE_TXIE 0x08 +#define EIE_WOLIE 0x04 +#define EIE_TXERIE 0x02 +#define EIE_RXERIE 0x01 +// ENC28J60 EIR Register Bit Definitions +#define EIR_PKTIF 0x40 +#define EIR_DMAIF 0x20 +#define EIR_LINKIF 0x10 +#define EIR_TXIF 0x08 +#define EIR_WOLIF 0x04 +#define EIR_TXERIF 0x02 +#define EIR_RXERIF 0x01 +// ENC28J60 ESTAT Register Bit Definitions +#define ESTAT_INT 0x80 +#define ESTAT_LATECOL 0x10 +#define ESTAT_RXBUSY 0x04 +#define ESTAT_TXABRT 0x02 +#define ESTAT_CLKRDY 0x01 +// ENC28J60 ECON2 Register Bit Definitions +#define ECON2_AUTOINC 0x80 +#define ECON2_PKTDEC 0x40 +#define ECON2_PWRSV 0x20 +#define ECON2_VRPS 0x08 +// ENC28J60 ECON1 Register Bit Definitions +#define ECON1_TXRST 0x80 +#define ECON1_RXRST 0x40 +#define ECON1_DMAST 0x20 +#define ECON1_CSUMEN 0x10 +#define ECON1_TXRTS 0x08 +#define ECON1_RXEN 0x04 +#define ECON1_BSEL1 0x02 +#define ECON1_BSEL0 0x01 +// ENC28J60 MACON1 Register Bit Definitions +#define MACON1_LOOPBK 0x10 +#define MACON1_TXPAUS 0x08 +#define MACON1_RXPAUS 0x04 +#define MACON1_PASSALL 0x02 +#define MACON1_MARXEN 0x01 +// ENC28J60 MACON2 Register Bit Definitions +#define MACON2_MARST 0x80 +#define MACON2_RNDRST 0x40 +#define MACON2_MARXRST 0x08 +#define MACON2_RFUNRST 0x04 +#define MACON2_MATXRST 0x02 +#define MACON2_TFUNRST 0x01 +// ENC28J60 MACON3 Register Bit Definitions +#define MACON3_PADCFG2 0x80 +#define MACON3_PADCFG1 0x40 +#define MACON3_PADCFG0 0x20 +#define MACON3_TXCRCEN 0x10 +#define MACON3_PHDRLEN 0x08 +#define MACON3_HFRMLEN 0x04 +#define MACON3_FRMLNEN 0x02 +#define MACON3_FULDPX 0x01 +// ENC28J60 MICMD Register Bit Definitions +#define MICMD_MIISCAN 0x02 +#define MICMD_MIIRD 0x01 +// ENC28J60 MISTAT Register Bit Definitions +#define MISTAT_NVALID 0x04 +#define MISTAT_SCAN 0x02 +#define MISTAT_BUSY 0x01 +// ENC28J60 PHY PHCON1 Register Bit Definitions +#define PHCON1_PRST 0x8000 +#define PHCON1_PLOOPBK 0x4000 +#define PHCON1_PPWRSV 0x0800 +#define PHCON1_PDPXMD 0x0100 +// ENC28J60 PHY PHSTAT1 Register Bit Definitions +#define PHSTAT1_PFDPX 0x1000 +#define PHSTAT1_PHDPX 0x0800 +#define PHSTAT1_LLSTAT 0x0004 +#define PHSTAT1_JBSTAT 0x0002 +// ENC28J60 PHY PHCON2 Register Bit Definitions +#define PHCON2_FRCLINK 0x4000 +#define PHCON2_TXDIS 0x2000 +#define PHCON2_JABBER 0x0400 +#define PHCON2_HDLDIS 0x0100 + +// ENC28J60 Packet Control Byte Bit Definitions +#define PKTCTRL_PHUGEEN 0x08 +#define PKTCTRL_PPADEN 0x04 +#define PKTCTRL_PCRCEN 0x02 +#define PKTCTRL_POVERRIDE 0x01 + +// SPI operation codes +#define ENC28J60_READ_CTRL_REG 0x00 +#define ENC28J60_READ_BUF_MEM 0x3A +#define ENC28J60_WRITE_CTRL_REG 0x40 +#define ENC28J60_WRITE_BUF_MEM 0x7A +#define ENC28J60_BIT_FIELD_SET 0x80 +#define ENC28J60_BIT_FIELD_CLR 0xA0 +#define ENC28J60_SOFT_RESET 0xFF + + +// The RXSTART_INIT should be zero. See Rev. B4 Silicon Errata +// buffer boundaries applied to internal 8K ram +// the entire available packet buffer space is allocated +// +// start with recbuf at 0/ +#define RXSTART_INIT 0x0 +// receive buffer end. make sure this is an odd value ( See Rev. B1,B4,B5,B7 Silicon Errata 'Memory (Ethernet Buffer)') +#define RXSTOP_INIT (0x1FFF-0x1800) +// start TX buffer RXSTOP_INIT+1 +#define TXSTART_INIT (RXSTOP_INIT+1) +// stp TX buffer at end of mem +#define TXSTOP_INIT 0x1FFF +// +// max frame length which the conroller will accept: +#define MAX_FRAMELEN 1500 // (note: maximum ethernet frame length would be 1518) +//#define MAX_FRAMELEN 600 + +#endif diff --git a/STM32F4/libraries/arduino_uip/utility/mempool.cpp b/STM32F4/libraries/arduino_uip/utility/mempool.cpp new file mode 100644 index 0000000..c2f7abf --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/mempool.cpp @@ -0,0 +1,168 @@ +/* + mempool.cpp - sleek implementation of a memory pool + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "mempool.h" +#include + +#define POOLOFFSET 1 + +struct memblock MemoryPool::blocks[MEMPOOL_NUM_MEMBLOCKS+1]; + +void +MemoryPool::init() +{ + memset(&blocks[0], 0, sizeof(blocks)); + blocks[POOLSTART].begin = MEMPOOL_STARTADDRESS; + blocks[POOLSTART].size = 0; + blocks[POOLSTART].nextblock = NOBLOCK; +} + +memhandle +MemoryPool::allocBlock(memaddress size) +{ + memblock* best = NULL; + memhandle cur = POOLSTART; + memblock* block = &blocks[POOLSTART]; + memaddress bestsize = MEMPOOL_SIZE + 1; + + do + { + memhandle next = block->nextblock; + memaddress freesize = ( next == NOBLOCK ? blocks[POOLSTART].begin + MEMPOOL_SIZE : blocks[next].begin) - block->begin - block->size; + if (freesize == size) + { + best = &blocks[cur]; + goto found; + } + if (freesize > size && freesize < bestsize) + { + bestsize = freesize; + best = &blocks[cur]; + } + if (next == NOBLOCK) + { + if (best) + goto found; + else + goto collect; + } + block = &blocks[next]; + cur = next; + } + while (true); + + collect: + { + cur = POOLSTART; + block = &blocks[POOLSTART]; + memhandle next; + while ((next = block->nextblock) != NOBLOCK) + { + memaddress dest = block->begin + block->size; + memblock* nextblock = &blocks[next]; + memaddress* src = &nextblock->begin; + if (dest != *src) + { +#ifdef MEMPOOL_MEMBLOCK_MV + MEMPOOL_MEMBLOCK_MV(dest,*src,nextblock->size); +#endif + *src = dest; + } + block = nextblock; + } + if (blocks[POOLSTART].begin + MEMPOOL_SIZE - block->begin - block->size >= size) + best = block; + else + goto notfound; + } + + found: + { + block = &blocks[POOLOFFSET]; + for (cur = POOLOFFSET; cur < MEMPOOL_NUM_MEMBLOCKS + POOLOFFSET; cur++) + { + if (block->size) + { + block++; + continue; + } + memaddress address = best->begin + best->size; +#ifdef MEMBLOCK_ALLOC + MEMBLOCK_ALLOC(address,size); +#endif + block->begin = address; + block->size = size; + block->nextblock = best->nextblock; + best->nextblock = cur; + return cur; + } + } + + notfound: return NOBLOCK; +} + +void +MemoryPool::freeBlock(memhandle handle) +{ + if (handle == NOBLOCK) + return; + memblock *b = &blocks[POOLSTART]; + + do + { + memhandle next = b->nextblock; + if (next == handle) + { + memblock *f = &blocks[next]; +#ifdef MEMBLOCK_FREE + MEMBLOCK_FREE(f->begin,f->size); +#endif + b->nextblock = f->nextblock; + f->size = 0; + f->nextblock = NOBLOCK; + return; + } + if (next == NOBLOCK) + return; + b = &blocks[next]; + } + while (true); +} + +void +MemoryPool::resizeBlock(memhandle handle, memaddress position) +{ + memblock * block = &blocks[handle]; + block->begin += position; + block->size -= position; +} + +void +MemoryPool::resizeBlock(memhandle handle, memaddress position, memaddress size) +{ + memblock * block = &blocks[handle]; + block->begin += position; + block->size = size; +} + +memaddress +MemoryPool::blockSize(memhandle handle) +{ + return blocks[handle].size; +} diff --git a/STM32F4/libraries/arduino_uip/utility/mempool.h b/STM32F4/libraries/arduino_uip/utility/mempool.h new file mode 100644 index 0000000..2a1db21 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/mempool.h @@ -0,0 +1,54 @@ +/* + mempool.h - sleek implementation of a memory pool + Copyright (c) 2013 Norbert Truchsess + All rights reserved. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef MEMPOOL_H +#define MEMPOOL_H + +#include + +#define POOLSTART 0 +#define NOBLOCK 0 + +#include "mempool_conf.h" + +struct memblock +{ + memaddress begin; + memaddress size; + memhandle nextblock; +}; + +class MemoryPool +{ +#ifdef MEMPOOLTEST_H + friend class MemoryPoolTest; +#endif + +protected: + static struct memblock blocks[MEMPOOL_NUM_MEMBLOCKS+1]; + +public: + static void init(); + static memhandle allocBlock(memaddress); + static void freeBlock(memhandle); + static void resizeBlock(memhandle handle, memaddress position); + static void resizeBlock(memhandle handle, memaddress position, memaddress size); + static memaddress blockSize(memhandle); +}; +#endif diff --git a/STM32F4/libraries/arduino_uip/utility/mempool_conf.h b/STM32F4/libraries/arduino_uip/utility/mempool_conf.h new file mode 100644 index 0000000..9615f92 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/mempool_conf.h @@ -0,0 +1,34 @@ +#ifndef MEMPOOLCONF_H +#define MEMPOOLCONF_H +#include "uipethernet-conf.h" +extern "C" { + #include "uipopt.h" + #include "enc28j60.h" +} +#include + +typedef uint16_t memaddress; +typedef uint8_t memhandle; + +#if UIP_SOCKET_NUMPACKETS and UIP_CONNS +#define NUM_TCP_MEMBLOCKS (UIP_SOCKET_NUMPACKETS*2)*UIP_CONNS +#else +#define NUM_TCP_MEMBLOCKS 0 +#endif + +#if UIP_UDP and UIP_UDP_CONNS +#define NUM_UDP_MEMBLOCKS 3*UIP_UDP_CONNS +#else +#define NUM_UDP_MEMBLOCKS 0 +#endif + +#define MEMPOOL_NUM_MEMBLOCKS (NUM_TCP_MEMBLOCKS+NUM_UDP_MEMBLOCKS) + +#define MEMPOOL_STARTADDRESS TXSTART_INIT+1 +#define MEMPOOL_SIZE TXSTOP_INIT-TXSTART_INIT + +void enc28J60_mempool_block_move_callback(memaddress,memaddress,memaddress); + +#define MEMPOOL_MEMBLOCK_MV(dest,src,size) enc28J60_mempool_block_move_callback(dest,src,size) + +#endif diff --git a/STM32F4/libraries/arduino_uip/utility/uip-conf.h b/STM32F4/libraries/arduino_uip/utility/uip-conf.h new file mode 100644 index 0000000..814aeb9 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip-conf.h @@ -0,0 +1,185 @@ +/** + * UIPEthernet Project-specific configuration options + * Copyright (c) 2013 Norbert Truchsess + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include +#include "uipethernet-conf.h" + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * (see uipethernet-conf.h) + * \hideinitializer + * + * #define UIP_CONF_MAX_CONNECTIONS 4 + */ + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 4 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 98 +//#define UIP_CONF_BUFFER_SIZE 118 + +/** + * The TCP maximum segment size. + * + * This is should not be to set to more than + * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. + */ + +#define UIP_CONF_TCP_MSS 512 + +/** + * The size of the advertised receiver's window. + * + * Should be set low (i.e., to the size of the uip_buf buffer) is the + * application is slow to process incoming data, or high (32768 bytes) + * if the application processes data quickly. + * + * \hideinitializer + */ +#define UIP_CONF_RECEIVE_WINDOW 512 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * (see uipethernet-conf.h) + * \hideinitializer + * + * #define UIP_CONF_UDP 1 + * + * #define UIP_CONF_UDP_CONNS 4 + */ + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * UDP Broadcast (receive) on or off + * (see uipethernet-conf.h) + * \hideinitializer + * #define UIP_CONF_BROADCAST 1 + */ + + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 0 + +// SLIP +//#define UIP_CONF_LLH_LEN 0 + +typedef void* uip_tcp_appstate_t; + +void uipclient_appcall(void); + +#define UIP_APPCALL uipclient_appcall + +typedef void* uip_udp_appstate_t; + +void uipudp_appcall(void); + +#define UIP_UDP_APPCALL uipudp_appcall + +#define CC_REGISTER_ARG register + +#define UIP_ARCH_CHKSUM 1 + +#endif /* __UIP_CONF_H__ */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip.c b/STM32F4/libraries/arduino_uip/utility/uip.c new file mode 100644 index 0000000..84ea8c3 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip.c @@ -0,0 +1,1897 @@ +#define DEBUG_PRINTF(...) /*printf(__VA_ARGS__)*/ + +/** + * \defgroup uip The uIP TCP/IP stack + * @{ + * + * uIP is an implementation of the TCP/IP protocol stack intended for + * small 8-bit and 16-bit microcontrollers. + * + * uIP provides the necessary protocols for Internet communication, + * with a very small code footprint and RAM requirements - the uIP + * code size is on the order of a few kilobytes and RAM usage is on + * the order of a few hundred bytes. + */ + +/** + * \file + * The uIP TCP/IP stack code. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.c,v 1.65 2006/06/11 21:46:39 adam Exp $ + * + */ + +/* + * uIP is a small implementation of the IP, UDP and TCP protocols (as + * well as some basic ICMP stuff). The implementation couples the IP, + * UDP, TCP and the application layers very tightly. To keep the size + * of the compiled code down, this code frequently uses the goto + * statement. While it would be possible to break the uip_process() + * function into many smaller functions, this would increase the code + * size because of the overhead of parameter passing and the fact that + * the optimier would not be as efficient. + * + * The principle is that we have a small buffer, called the uip_buf, + * in which the device driver puts an incoming packet. The TCP/IP + * stack parses the headers in the packet, and calls the + * application. If the remote host has sent data to the application, + * this data is present in the uip_buf and the application read the + * data from there. It is up to the application to put this data into + * a byte stream if needed. The application will not be fed with data + * that is out of sequence. + * + * If the application whishes to send data to the peer, it should put + * its data into the uip_buf. The uip_appdata pointer points to the + * first available byte. The TCP/IP stack will calculate the + * checksums, and fill in the necessary header fields and finally send + * the packet back to the peer. +*/ + +#include "uip.h" +#include "uipopt.h" +#include "uip_arch.h" + +#if UIP_CONF_IPV6 +#include "uip-neighbor.h" +#endif /* UIP_CONF_IPV6 */ + +#include + +/*---------------------------------------------------------------------------*/ +/* Variable definitions. */ + + +/* The IP address of this host. If it is defined to be fixed (by + setting UIP_FIXEDADDR to 1 in uipopt.h), the address is set + here. Otherwise, the address */ +#if UIP_FIXEDADDR > 0 +const uip_ipaddr_t uip_hostaddr = + {HTONS((UIP_IPADDR0 << 8) | UIP_IPADDR1), + HTONS((UIP_IPADDR2 << 8) | UIP_IPADDR3)}; +const uip_ipaddr_t uip_draddr = + {HTONS((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1), + HTONS((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3)}; +const uip_ipaddr_t uip_netmask = + {HTONS((UIP_NETMASK0 << 8) | UIP_NETMASK1), + HTONS((UIP_NETMASK2 << 8) | UIP_NETMASK3)}; +#else +uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; +#endif /* UIP_FIXEDADDR */ + +static const uip_ipaddr_t all_ones_addr = +#if UIP_CONF_IPV6 + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; +#else /* UIP_CONF_IPV6 */ + {0xffff,0xffff}; +#endif /* UIP_CONF_IPV6 */ +static const uip_ipaddr_t all_zeroes_addr = +#if UIP_CONF_IPV6 + {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}; +#else /* UIP_CONF_IPV6 */ + {0x0000,0x0000}; +#endif /* UIP_CONF_IPV6 */ + + +#if UIP_FIXEDETHADDR +const struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0, + UIP_ETHADDR1, + UIP_ETHADDR2, + UIP_ETHADDR3, + UIP_ETHADDR4, + UIP_ETHADDR5}}; +#else +struct uip_eth_addr uip_ethaddr = {{0,0,0,0,0,0}}; +#endif + +#ifndef UIP_CONF_EXTERNAL_BUFFER +u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains + incoming packets. */ +#endif /* UIP_CONF_EXTERNAL_BUFFER */ + +void *uip_appdata; /* The uip_appdata pointer points to + application data. */ +void *uip_sappdata; /* The uip_appdata pointer points to + the application data which is to + be sent. */ +#if UIP_URGDATA > 0 +void *uip_urgdata; /* The uip_urgdata pointer points to + urgent data (out-of-band data), if + present. */ +u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + +u16_t uip_len, uip_slen; + /* The uip_len is either 8 or 16 bits, + depending on the maximum packet + size. */ + +u8_t uip_flags; /* The uip_flags variable is used for + communication between the TCP/IP stack + and the application program. */ +struct uip_conn *uip_conn; /* uip_conn always points to the current + connection. */ + +struct uip_conn uip_conns[UIP_CONNS]; + /* The uip_conns array holds all TCP + connections. */ +u16_t uip_listenports[UIP_LISTENPORTS]; + /* The uip_listenports list all currently + listning ports. */ +#if UIP_UDP +struct uip_udp_conn *uip_udp_conn; +struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +static u16_t ipid; /* Ths ipid variable is an increasing + number that is used for the IP ID + field. */ + +void uip_setipid(u16_t id) { ipid = id; } + +static u8_t iss[4]; /* The iss variable is used for the TCP + initial sequence number. */ + +#if UIP_ACTIVE_OPEN +static u16_t lastport; /* Keeps track of the last port used for + a new connection. */ +#endif /* UIP_ACTIVE_OPEN */ + +/* Temporary variables. */ +u8_t uip_acc32[4]; +static u8_t c, opt; +static u16_t tmp16; + +/* Structures and definitions. */ +#define TCP_FIN 0x01 +#define TCP_SYN 0x02 +#define TCP_RST 0x04 +#define TCP_PSH 0x08 +#define TCP_ACK 0x10 +#define TCP_URG 0x20 +#define TCP_CTL 0x3f + +#define TCP_OPT_END 0 /* End of TCP options list */ +#define TCP_OPT_NOOP 1 /* "No-operation" TCP option */ +#define TCP_OPT_MSS 2 /* Maximum segment size TCP option */ + +#define TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ + +#define ICMP_ECHO_REPLY 0 +#define ICMP_ECHO 8 + +#define ICMP6_ECHO_REPLY 129 +#define ICMP6_ECHO 128 +#define ICMP6_NEIGHBOR_SOLICITATION 135 +#define ICMP6_NEIGHBOR_ADVERTISEMENT 136 + +#define ICMP6_FLAG_S (1 << 6) + +#define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 +#define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 + + +/* Macros. */ +#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) +#define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0]) +#define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) +#define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN]) + + +#if UIP_STATISTICS == 1 +struct uip_stats uip_stat; +#define UIP_STAT(s) s +#else +#define UIP_STAT(s) +#endif /* UIP_STATISTICS == 1 */ + +#if UIP_LOGGING == 1 +#include +void uip_log(char *msg); +#define UIP_LOG(m) uip_log(m) +#else +#define UIP_LOG(m) +#endif /* UIP_LOGGING == 1 */ + +#if ! UIP_ARCH_ADD32 +void +uip_add32(u8_t *op32, u16_t op16) +{ + uip_acc32[3] = op32[3] + (op16 & 0xff); + uip_acc32[2] = op32[2] + (op16 >> 8); + uip_acc32[1] = op32[1]; + uip_acc32[0] = op32[0]; + + if(uip_acc32[2] < (op16 >> 8)) { + ++uip_acc32[1]; + if(uip_acc32[1] == 0) { + ++uip_acc32[0]; + } + } + + + if(uip_acc32[3] < (op16 & 0xff)) { + ++uip_acc32[2]; + if(uip_acc32[2] == 0) { + ++uip_acc32[1]; + if(uip_acc32[1] == 0) { + ++uip_acc32[0]; + } + } + } +} + +#endif /* UIP_ARCH_ADD32 */ + +#if ! UIP_ARCH_CHKSUM +/*---------------------------------------------------------------------------*/ +static u16_t +chksum(u16_t sum, const u8_t *data, u16_t len) +{ + u16_t t; + const u8_t *dataptr; + const u8_t *last_byte; + + dataptr = data; + last_byte = data + len - 1; + + while(dataptr < last_byte) { /* At least two more bytes */ + t = (dataptr[0] << 8) + dataptr[1]; + sum += t; + if(sum < t) { + sum++; /* carry */ + } + dataptr += 2; + } + + if(dataptr == last_byte) { + t = (dataptr[0] << 8) + 0; + sum += t; + if(sum < t) { + sum++; /* carry */ + } + } + + /* Return sum in host byte order. */ + return sum; +} +/*---------------------------------------------------------------------------*/ +u16_t +uip_chksum(u16_t *data, u16_t len) +{ + return htons(chksum(0, (u8_t *)data, len)); +} +/*---------------------------------------------------------------------------*/ +#ifndef UIP_ARCH_IPCHKSUM +u16_t +uip_ipchksum(void) +{ + u16_t sum; + + sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN); + DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum); + return (sum == 0) ? 0xffff : htons(sum); +} +#endif +/*---------------------------------------------------------------------------*/ +static u16_t +upper_layer_chksum(u8_t proto) +{ + u16_t upper_layer_len; + u16_t sum; + +#if UIP_CONF_IPV6 + upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]); +#else /* UIP_CONF_IPV6 */ + upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN; +#endif /* UIP_CONF_IPV6 */ + + /* First sum pseudoheader. */ + + /* IP protocol and length fields. This addition cannot carry. */ + sum = upper_layer_len + proto; + /* Sum IP source and destination addresses. */ + sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t)); + + /* Sum TCP header and data. */ + sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], + upper_layer_len); + + return (sum == 0) ? 0xffff : htons(sum); +} +/*---------------------------------------------------------------------------*/ +#if UIP_CONF_IPV6 +u16_t +uip_icmp6chksum(void) +{ + return upper_layer_chksum(UIP_PROTO_ICMP6); + +} +#endif /* UIP_CONF_IPV6 */ +/*---------------------------------------------------------------------------*/ +u16_t +uip_tcpchksum(void) +{ + return upper_layer_chksum(UIP_PROTO_TCP); +} +/*---------------------------------------------------------------------------*/ +#if UIP_UDP_CHECKSUMS +u16_t +uip_udpchksum(void) +{ + return upper_layer_chksum(UIP_PROTO_UDP); +} +#endif /* UIP_UDP_CHECKSUMS */ +#endif /* UIP_ARCH_CHKSUM */ +/*---------------------------------------------------------------------------*/ +void +uip_init(void) +{ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + uip_listenports[c] = 0; + } + for(c = 0; c < UIP_CONNS; ++c) { + uip_conns[c].tcpstateflags = UIP_CLOSED; + } +#if UIP_ACTIVE_OPEN + lastport = 1024; +#endif /* UIP_ACTIVE_OPEN */ + +#if UIP_UDP + for(c = 0; c < UIP_UDP_CONNS; ++c) { + uip_udp_conns[c].lport = 0; + } +#endif /* UIP_UDP */ + + + /* IPv4 initialization. */ +#if UIP_FIXEDADDR == 0 + /* uip_hostaddr[0] = uip_hostaddr[1] = 0;*/ +#endif /* UIP_FIXEDADDR */ + +} +/*---------------------------------------------------------------------------*/ +#if UIP_ACTIVE_OPEN +struct uip_conn * +uip_connect(uip_ipaddr_t *ripaddr, u16_t rport) +{ + register struct uip_conn *conn, *cconn; + + /* Find an unused local port. */ + again: + ++lastport; + + if(lastport >= 32000) { + lastport = 4096; + } + + /* Check if this port is already in use, and if so try to find + another one. */ + for(c = 0; c < UIP_CONNS; ++c) { + conn = &uip_conns[c]; + if(conn->tcpstateflags != UIP_CLOSED && + conn->lport == htons(lastport)) { + goto again; + } + } + + conn = 0; + for(c = 0; c < UIP_CONNS; ++c) { + cconn = &uip_conns[c]; + if(cconn->tcpstateflags == UIP_CLOSED) { + conn = cconn; + break; + } + if(cconn->tcpstateflags == UIP_TIME_WAIT) { + if(conn == 0 || + cconn->timer > conn->timer) { + conn = cconn; + } + } + } + + if(conn == 0) { + return 0; + } + + conn->tcpstateflags = UIP_SYN_SENT; + + conn->snd_nxt[0] = iss[0]; + conn->snd_nxt[1] = iss[1]; + conn->snd_nxt[2] = iss[2]; + conn->snd_nxt[3] = iss[3]; + + conn->initialmss = conn->mss = UIP_TCP_MSS; + + conn->len = 1; /* TCP length of the SYN is one. */ + conn->nrtx = 0; + conn->timer = 1; /* Send the SYN next time around. */ + conn->rto = UIP_RTO; + conn->sa = 0; + conn->sv = 16; /* Initial value of the RTT variance. */ + conn->lport = htons(lastport); + conn->rport = rport; + uip_ipaddr_copy(&conn->ripaddr, ripaddr); + + return conn; +} +#endif /* UIP_ACTIVE_OPEN */ +/*---------------------------------------------------------------------------*/ +#if UIP_UDP +struct uip_udp_conn * +uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) +{ + register struct uip_udp_conn *conn; + + /* Find an unused local port. */ + again: + ++lastport; + + if(lastport >= 32000) { + lastport = 4096; + } + + for(c = 0; c < UIP_UDP_CONNS; ++c) { + if(uip_udp_conns[c].lport == htons(lastport)) { + goto again; + } + } + + + conn = 0; + for(c = 0; c < UIP_UDP_CONNS; ++c) { + if(uip_udp_conns[c].lport == 0) { + conn = &uip_udp_conns[c]; + break; + } + } + + if(conn == 0) { + return 0; + } + + conn->lport = HTONS(lastport); + conn->rport = rport; + if(ripaddr == NULL) { + memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t)); + } else { + uip_ipaddr_copy(&conn->ripaddr, ripaddr); + } + conn->ttl = UIP_TTL; + + return conn; +} +#endif /* UIP_UDP */ +/*---------------------------------------------------------------------------*/ +void +uip_unlisten(u16_t port) +{ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + if(uip_listenports[c] == port) { + uip_listenports[c] = 0; + return; + } + } +} +/*---------------------------------------------------------------------------*/ +void +uip_listen(u16_t port) +{ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + if(uip_listenports[c] == 0) { + uip_listenports[c] = port; + return; + } + } +} +/*---------------------------------------------------------------------------*/ +/* XXX: IP fragment reassembly: not well-tested. */ + +#if UIP_REASSEMBLY && !UIP_CONF_IPV6 +#define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN) +static u8_t uip_reassbuf[UIP_REASS_BUFSIZE]; +static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)]; +static const u8_t bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f, + 0x0f, 0x07, 0x03, 0x01}; +static u16_t uip_reasslen; +static u8_t uip_reassflags; +#define UIP_REASS_FLAG_LASTFRAG 0x01 +static u8_t uip_reasstmr; + +#define IP_MF 0x20 + +static u8_t +uip_reass(void) +{ + u16_t offset, len; + u16_t i; + + /* If ip_reasstmr is zero, no packet is present in the buffer, so we + write the IP header of the fragment into the reassembly + buffer. The timer is updated with the maximum age. */ + if(uip_reasstmr == 0) { + memcpy(uip_reassbuf, &BUF->vhl, UIP_IPH_LEN); + uip_reasstmr = UIP_REASS_MAXAGE; + uip_reassflags = 0; + /* Clear the bitmap. */ + memset(uip_reassbitmap, 0, sizeof(uip_reassbitmap)); + } + + /* Check if the incoming fragment matches the one currently present + in the reasembly buffer. If so, we proceed with copying the + fragment into the buffer. */ + if(BUF->srcipaddr[0] == FBUF->srcipaddr[0] && + BUF->srcipaddr[1] == FBUF->srcipaddr[1] && + BUF->destipaddr[0] == FBUF->destipaddr[0] && + BUF->destipaddr[1] == FBUF->destipaddr[1] && + BUF->ipid[0] == FBUF->ipid[0] && + BUF->ipid[1] == FBUF->ipid[1]) { + + len = (BUF->len[0] << 8) + BUF->len[1] - (BUF->vhl & 0x0f) * 4; + offset = (((BUF->ipoffset[0] & 0x3f) << 8) + BUF->ipoffset[1]) * 8; + + /* If the offset or the offset + fragment length overflows the + reassembly buffer, we discard the entire packet. */ + if(offset > UIP_REASS_BUFSIZE || + offset + len > UIP_REASS_BUFSIZE) { + uip_reasstmr = 0; + goto nullreturn; + } + + /* Copy the fragment into the reassembly buffer, at the right + offset. */ + memcpy(&uip_reassbuf[UIP_IPH_LEN + offset], + (char *)BUF + (int)((BUF->vhl & 0x0f) * 4), + len); + + /* Update the bitmap. */ + if(offset / (8 * 8) == (offset + len) / (8 * 8)) { + /* If the two endpoints are in the same byte, we only update + that byte. */ + + uip_reassbitmap[offset / (8 * 8)] |= + bitmap_bits[(offset / 8 ) & 7] & + ~bitmap_bits[((offset + len) / 8 ) & 7]; + } else { + /* If the two endpoints are in different bytes, we update the + bytes in the endpoints and fill the stuff inbetween with + 0xff. */ + uip_reassbitmap[offset / (8 * 8)] |= + bitmap_bits[(offset / 8 ) & 7]; + for(i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) { + uip_reassbitmap[i] = 0xff; + } + uip_reassbitmap[(offset + len) / (8 * 8)] |= + ~bitmap_bits[((offset + len) / 8 ) & 7]; + } + + /* If this fragment has the More Fragments flag set to zero, we + know that this is the last fragment, so we can calculate the + size of the entire packet. We also set the + IP_REASS_FLAG_LASTFRAG flag to indicate that we have received + the final fragment. */ + + if((BUF->ipoffset[0] & IP_MF) == 0) { + uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; + uip_reasslen = offset + len; + } + + /* Finally, we check if we have a full packet in the buffer. We do + this by checking if we have the last fragment and if all bits + in the bitmap are set. */ + if(uip_reassflags & UIP_REASS_FLAG_LASTFRAG) { + /* Check all bytes up to and including all but the last byte in + the bitmap. */ + for(i = 0; i < uip_reasslen / (8 * 8) - 1; ++i) { + if(uip_reassbitmap[i] != 0xff) { + goto nullreturn; + } + } + /* Check the last byte in the bitmap. It should contain just the + right amount of bits. */ + if(uip_reassbitmap[uip_reasslen / (8 * 8)] != + (u8_t)~bitmap_bits[uip_reasslen / 8 & 7]) { + goto nullreturn; + } + + /* If we have come this far, we have a full packet in the + buffer, so we allocate a pbuf and copy the packet into it. We + also reset the timer. */ + uip_reasstmr = 0; + memcpy(BUF, FBUF, uip_reasslen); + + /* Pretend to be a "normal" (i.e., not fragmented) IP packet + from now on. */ + BUF->ipoffset[0] = BUF->ipoffset[1] = 0; + BUF->len[0] = uip_reasslen >> 8; + BUF->len[1] = uip_reasslen & 0xff; + BUF->ipchksum = 0; + BUF->ipchksum = ~(uip_ipchksum()); + + return uip_reasslen; + } + } + + nullreturn: + return 0; +} +#endif /* UIP_REASSEMBLY */ +/*---------------------------------------------------------------------------*/ +static void +uip_add_rcv_nxt(u16_t n) +{ + uip_add32(uip_conn->rcv_nxt, n); + uip_conn->rcv_nxt[0] = uip_acc32[0]; + uip_conn->rcv_nxt[1] = uip_acc32[1]; + uip_conn->rcv_nxt[2] = uip_acc32[2]; + uip_conn->rcv_nxt[3] = uip_acc32[3]; +} +/*---------------------------------------------------------------------------*/ +void +uip_process(u8_t flag) +{ + register struct uip_conn *uip_connr = uip_conn; + +#if UIP_UDP + if(flag == UIP_UDP_SEND_CONN) { + goto udp_send; + } +#endif /* UIP_UDP */ + + uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN]; + + /* Check if we were invoked because of a poll request for a + particular connection. */ + if(flag == UIP_POLL_REQUEST) { + if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED && + !uip_outstanding(uip_connr)) { + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + goto drop; + + /* Check if we were invoked because of the perodic timer fireing. */ + } else if(flag == UIP_TIMER) { +#if UIP_REASSEMBLY + if(uip_reasstmr != 0) { + --uip_reasstmr; + } +#endif /* UIP_REASSEMBLY */ + /* Increase the initial sequence number. */ + if(++iss[3] == 0) { + if(++iss[2] == 0) { + if(++iss[1] == 0) { + ++iss[0]; + } + } + } + + /* Reset the length variables. */ + uip_len = 0; + uip_slen = 0; + + /* Check if the connection is in a state in which we simply wait + for the connection to time out. If so, we increase the + connection's timer and remove the connection if it times + out. */ + if(uip_connr->tcpstateflags == UIP_TIME_WAIT || + uip_connr->tcpstateflags == UIP_FIN_WAIT_2) { + ++(uip_connr->timer); + if(uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) { + uip_connr->tcpstateflags = UIP_CLOSED; + } + } else if(uip_connr->tcpstateflags != UIP_CLOSED) { + /* If the connection has outstanding data, we increase the + connection's timer and see if it has reached the RTO value + in which case we retransmit. */ + if(uip_outstanding(uip_connr)) { + if(uip_connr->timer-- == 0) { + if(uip_connr->nrtx == UIP_MAXRTX || + ((uip_connr->tcpstateflags == UIP_SYN_SENT || + uip_connr->tcpstateflags == UIP_SYN_RCVD) && + uip_connr->nrtx == UIP_MAXSYNRTX)) { + uip_connr->tcpstateflags = UIP_CLOSED; + + /* We call UIP_APPCALL() with uip_flags set to + UIP_TIMEDOUT to inform the application that the + connection has timed out. */ + uip_flags = UIP_TIMEDOUT; + UIP_APPCALL(); + + /* We also send a reset packet to the remote host. */ + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + /* Exponential backoff. */ + uip_connr->timer = UIP_RTO << (uip_connr->nrtx > 4? + 4: + uip_connr->nrtx); + ++(uip_connr->nrtx); + + /* Ok, so we need to retransmit. We do this differently + depending on which state we are in. In ESTABLISHED, we + call upon the application so that it may prepare the + data for the retransmit. In SYN_RCVD, we resend the + SYNACK that we sent earlier and in LAST_ACK we have to + retransmit our FINACK. */ + UIP_STAT(++uip_stat.tcp.rexmit); + switch(uip_connr->tcpstateflags & UIP_TS_MASK) { + case UIP_SYN_RCVD: + /* In the SYN_RCVD state, we should retransmit our + SYNACK. */ + goto tcp_send_synack; + +#if UIP_ACTIVE_OPEN + case UIP_SYN_SENT: + /* In the SYN_SENT state, we retransmit out SYN. */ + BUF->flags = 0; + goto tcp_send_syn; +#endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application + to do the actual retransmit after which we jump into + the code for sending out the packet (the apprexmit + label). */ + uip_flags = UIP_REXMIT; + UIP_APPCALL(); + goto apprexmit; + + case UIP_FIN_WAIT_1: + case UIP_CLOSING: + case UIP_LAST_ACK: + /* In all these states we should retransmit a FINACK. */ + goto tcp_send_finack; + + } + } + } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) { + /* If there was no need for a retransmission, we poll the + application for new data. */ + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + } + goto drop; + } +#if UIP_UDP + if(flag == UIP_UDP_TIMER) { + if(uip_udp_conn->lport != 0) { + uip_conn = NULL; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_len = uip_slen = 0; + uip_flags = UIP_POLL; + UIP_UDP_APPCALL(); + goto udp_send; + } else { + goto drop; + } + } +#endif + + /* This is where the input processing starts. */ + UIP_STAT(++uip_stat.ip.recv); + + /* Start of IP input header processing code. */ + +#if UIP_CONF_IPV6 + /* Check validity of the IP header. */ + if((BUF->vtc & 0xf0) != 0x60) { /* IP version and header length. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.vhlerr); + UIP_LOG("ipv6: invalid version."); + goto drop; + } +#else /* UIP_CONF_IPV6 */ + /* Check validity of the IP header. */ + if(BUF->vhl != 0x45) { /* IP version and header length. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.vhlerr); + UIP_LOG("ip: invalid version or header length."); + goto drop; + } +#endif /* UIP_CONF_IPV6 */ + + /* Check the size of the packet. If the size reported to us in + uip_len is smaller the size reported in the IP header, we assume + that the packet has been corrupted in transit. If the size of + uip_len is larger than the size reported in the IP packet header, + the packet has been padded and we set uip_len to the correct + value.. */ + + if((BUF->len[0] << 8) + BUF->len[1] <= uip_len) { + uip_len = (BUF->len[0] << 8) + BUF->len[1]; +#if UIP_CONF_IPV6 + uip_len += 40; /* The length reported in the IPv6 header is the + length of the payload that follows the + header. However, uIP uses the uip_len variable + for holding the size of the entire packet, + including the IP header. For IPv4 this is not a + problem as the length field in the IPv4 header + contains the length of the entire packet. But + for IPv6 we need to add the size of the IPv6 + header (40 bytes). */ +#endif /* UIP_CONF_IPV6 */ + } else { + UIP_LOG("ip: packet shorter than reported in IP header."); + goto drop; + } + +#if !UIP_CONF_IPV6 + /* Check the fragment flag. */ + if((BUF->ipoffset[0] & 0x3f) != 0 || + BUF->ipoffset[1] != 0) { +#if UIP_REASSEMBLY + uip_len = uip_reass(); + if(uip_len == 0) { + goto drop; + } +#else /* UIP_REASSEMBLY */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.fragerr); + UIP_LOG("ip: fragment dropped."); + goto drop; +#endif /* UIP_REASSEMBLY */ + } +#endif /* UIP_CONF_IPV6 */ + + if(uip_ipaddr_cmp(uip_hostaddr, all_zeroes_addr)) { + /* If we are configured to use ping IP address configuration and + hasn't been assigned an IP address yet, we accept all ICMP + packets. */ +#if UIP_PINGADDRCONF && !UIP_CONF_IPV6 + if(BUF->proto == UIP_PROTO_ICMP) { + UIP_LOG("ip: possible ping config packet received."); + goto icmp_input; + } else { + UIP_LOG("ip: packet dropped since no address assigned."); + goto drop; + } +#endif /* UIP_PINGADDRCONF */ + + } else { + /* If IP broadcast support is configured, we check for a broadcast + UDP packet, which may be destined to us. */ +#if UIP_BROADCAST + DEBUG_PRINTF("UDP IP checksum 0x%04x\n", uip_ipchksum()); + if(BUF->proto == UIP_PROTO_UDP && + uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr) + /*&& + uip_ipchksum() == 0xffff*/) { + goto udp_input; + } +#endif /* UIP_BROADCAST */ + + /* Check if the packet is destined for our IP address. */ +#if !UIP_CONF_IPV6 + if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr)) { + UIP_STAT(++uip_stat.ip.drop); + goto drop; + } +#else /* UIP_CONF_IPV6 */ + /* For IPv6, packet reception is a little trickier as we need to + make sure that we listen to certain multicast addresses (all + hosts multicast address, and the solicited-node multicast + address) as well. However, we will cheat here and accept all + multicast packets that are sent to the ff02::/16 addresses. */ + if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr) && + BUF->destipaddr[0] != HTONS(0xff02)) { + UIP_STAT(++uip_stat.ip.drop); + goto drop; + } +#endif /* UIP_CONF_IPV6 */ + } + +#if !UIP_CONF_IPV6 + if(uip_ipchksum() != 0xffff) { /* Compute and check the IP header + checksum. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.chkerr); + UIP_LOG("ip: bad checksum."); + goto drop; + } +#endif /* UIP_CONF_IPV6 */ + + if(BUF->proto == UIP_PROTO_TCP) { /* Check for TCP packet. If so, + proceed with TCP input + processing. */ + goto tcp_input; + } + +#if UIP_UDP + if(BUF->proto == UIP_PROTO_UDP) { + goto udp_input; + } +#endif /* UIP_UDP */ + +#if !UIP_CONF_IPV6 + /* ICMPv4 processing code follows. */ + if(BUF->proto != UIP_PROTO_ICMP) { /* We only allow ICMP packets from + here. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.protoerr); + UIP_LOG("ip: neither tcp nor icmp."); + goto drop; + } + +#if UIP_PINGADDRCONF + icmp_input: +#endif /* UIP_PINGADDRCONF */ + UIP_STAT(++uip_stat.icmp.recv); + + /* ICMP echo (i.e., ping) processing. This is simple, we only change + the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP + checksum before we return the packet. */ + if(ICMPBUF->type != ICMP_ECHO) { + UIP_STAT(++uip_stat.icmp.drop); + UIP_STAT(++uip_stat.icmp.typeerr); + UIP_LOG("icmp: not icmp echo."); + goto drop; + } + + /* If we are configured to use ping IP address assignment, we use + the destination IP address of this ping packet and assign it to + ourself. */ +#if UIP_PINGADDRCONF + if((uip_hostaddr[0] | uip_hostaddr[1]) == 0) { + uip_hostaddr[0] = BUF->destipaddr[0]; + uip_hostaddr[1] = BUF->destipaddr[1]; + } +#endif /* UIP_PINGADDRCONF */ + + ICMPBUF->type = ICMP_ECHO_REPLY; + + if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) { + ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1; + } else { + ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8); + } + + /* Swap IP addresses. */ + uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr); + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + + UIP_STAT(++uip_stat.icmp.sent); + goto send; + + /* End of IPv4 input header processing code. */ +#else /* !UIP_CONF_IPV6 */ + + /* This is IPv6 ICMPv6 processing code. */ + DEBUG_PRINTF("icmp6_input: length %d\n", uip_len); + + if(BUF->proto != UIP_PROTO_ICMP6) { /* We only allow ICMPv6 packets from + here. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.protoerr); + UIP_LOG("ip: neither tcp nor icmp6."); + goto drop; + } + + UIP_STAT(++uip_stat.icmp.recv); + + /* If we get a neighbor solicitation for our address we should send + a neighbor advertisement message back. */ + if(ICMPBUF->type == ICMP6_NEIGHBOR_SOLICITATION) { + if(uip_ipaddr_cmp(ICMPBUF->icmp6data, uip_hostaddr)) { + + if(ICMPBUF->options[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS) { + /* Save the sender's address in our neighbor list. */ + uip_neighbor_add(ICMPBUF->srcipaddr, &(ICMPBUF->options[2])); + } + + /* We should now send a neighbor advertisement back to where the + neighbor solicication came from. */ + ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT; + ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */ + + ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0; + + uip_ipaddr_copy(ICMPBUF->destipaddr, ICMPBUF->srcipaddr); + uip_ipaddr_copy(ICMPBUF->srcipaddr, uip_hostaddr); + ICMPBUF->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS; + ICMPBUF->options[1] = 1; /* Options length, 1 = 8 bytes. */ + memcpy(&(ICMPBUF->options[2]), &uip_ethaddr, sizeof(uip_ethaddr)); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + goto send; + + } + goto drop; + } else if(ICMPBUF->type == ICMP6_ECHO) { + /* ICMP echo (i.e., ping) processing. This is simple, we only + change the ICMP type from ECHO to ECHO_REPLY and update the + ICMP checksum before we return the packet. */ + + ICMPBUF->type = ICMP6_ECHO_REPLY; + + uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr); + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + + UIP_STAT(++uip_stat.icmp.sent); + goto send; + } else { + DEBUG_PRINTF("Unknown icmp6 message type %d\n", ICMPBUF->type); + UIP_STAT(++uip_stat.icmp.drop); + UIP_STAT(++uip_stat.icmp.typeerr); + UIP_LOG("icmp: unknown ICMP message."); + goto drop; + } + + /* End of IPv6 ICMP processing. */ + +#endif /* !UIP_CONF_IPV6 */ + +#if UIP_UDP + /* UDP input processing. */ + udp_input: + /* UDP processing is really just a hack. We don't do anything to the + UDP/IP headers, but let the UDP application do all the hard + work. If the application sets uip_slen, it has a packet to + send. */ +#if UIP_UDP_CHECKSUMS + uip_len = uip_len - UIP_IPUDPH_LEN; + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + if(UDPBUF->udpchksum != 0 && uip_udpchksum() != 0xffff) { + UIP_STAT(++uip_stat.udp.drop); + UIP_STAT(++uip_stat.udp.chkerr); + UIP_LOG("udp: bad checksum."); + goto drop; + } +#else /* UIP_UDP_CHECKSUMS */ + uip_len = uip_len - UIP_IPUDPH_LEN; +#endif /* UIP_UDP_CHECKSUMS */ + + /* Demultiplex this UDP packet between the UDP "connections". */ + for(uip_udp_conn = &uip_udp_conns[0]; + uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS]; + ++uip_udp_conn) { + /* If the local UDP port is non-zero, the connection is considered + to be used. If so, the local port number is checked against the + destination port number in the received packet. If the two port + numbers match, the remote port number is checked if the + connection is bound to a remote port. Finally, if the + connection is bound to a remote IP address, the source IP + address of the packet is checked. */ + if(uip_udp_conn->lport != 0 && + UDPBUF->destport == uip_udp_conn->lport && + (uip_udp_conn->rport == 0 || + UDPBUF->srcport == uip_udp_conn->rport) && + (uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) || + uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) || + uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr))) { + goto udp_found; + } + } + UIP_LOG("udp: no matching connection found"); + goto drop; + + udp_found: + uip_conn = NULL; + uip_flags = UIP_NEWDATA; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_slen = 0; + UIP_UDP_APPCALL(); + udp_send: + if(uip_slen == 0) { + goto drop; + } + uip_len = uip_slen + UIP_IPUDPH_LEN; + +#if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); + BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); +#else /* UIP_CONF_IPV6 */ + BUF->len[0] = (uip_len >> 8); + BUF->len[1] = (uip_len & 0xff); +#endif /* UIP_CONF_IPV6 */ + + BUF->ttl = uip_udp_conn->ttl; + BUF->proto = UIP_PROTO_UDP; + + UDPBUF->udplen = HTONS(uip_slen + UIP_UDPH_LEN); + UDPBUF->udpchksum = 0; + + BUF->srcport = uip_udp_conn->lport; + BUF->destport = uip_udp_conn->rport; + + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + uip_ipaddr_copy(BUF->destipaddr, uip_udp_conn->ripaddr); + + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN]; + +#if UIP_UDP_CHECKSUMS + /* Calculate UDP checksum. */ + UDPBUF->udpchksum = ~(uip_udpchksum()); + if(UDPBUF->udpchksum == 0) { + UDPBUF->udpchksum = 0xffff; + } +#endif /* UIP_UDP_CHECKSUMS */ + + goto ip_send_nolen; +#endif /* UIP_UDP */ + + /* TCP input processing. */ + tcp_input: + UIP_STAT(++uip_stat.tcp.recv); + + /* Start of TCP input header processing code. */ + + if(uip_tcpchksum() != 0xffff) { /* Compute and check the TCP + checksum. */ + UIP_STAT(++uip_stat.tcp.drop); + UIP_STAT(++uip_stat.tcp.chkerr); + UIP_LOG("tcp: bad checksum."); + goto drop; + } + + + /* Demultiplex this segment. */ + /* First check any active connections. */ + for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1]; + ++uip_connr) { + if(uip_connr->tcpstateflags != UIP_CLOSED && + BUF->destport == uip_connr->lport && + BUF->srcport == uip_connr->rport && + uip_ipaddr_cmp(BUF->srcipaddr, uip_connr->ripaddr)) { + goto found; + } + } + + /* If we didn't find and active connection that expected the packet, + either this packet is an old duplicate, or this is a SYN packet + destined for a connection in LISTEN. If the SYN flag isn't set, + it is an old packet and we send a RST. */ + if((BUF->flags & TCP_CTL) != TCP_SYN) { + goto reset; + } + + tmp16 = BUF->destport; + /* Next, check listening connections. */ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + if(tmp16 == uip_listenports[c]) + goto found_listen; + } + + /* No matching connection found, so we send a RST packet. */ + UIP_STAT(++uip_stat.tcp.synrst); + reset: + + /* We do not send resets in response to resets. */ + if(BUF->flags & TCP_RST) { + goto drop; + } + + UIP_STAT(++uip_stat.tcp.rst); + + BUF->flags = TCP_RST | TCP_ACK; + uip_len = UIP_IPTCPH_LEN; + BUF->tcpoffset = 5 << 4; + + /* Flip the seqno and ackno fields in the TCP header. */ + c = BUF->seqno[3]; + BUF->seqno[3] = BUF->ackno[3]; + BUF->ackno[3] = c; + + c = BUF->seqno[2]; + BUF->seqno[2] = BUF->ackno[2]; + BUF->ackno[2] = c; + + c = BUF->seqno[1]; + BUF->seqno[1] = BUF->ackno[1]; + BUF->ackno[1] = c; + + c = BUF->seqno[0]; + BUF->seqno[0] = BUF->ackno[0]; + BUF->ackno[0] = c; + + /* We also have to increase the sequence number we are + acknowledging. If the least significant byte overflowed, we need + to propagate the carry to the other bytes as well. */ + if(++BUF->ackno[3] == 0) { + if(++BUF->ackno[2] == 0) { + if(++BUF->ackno[1] == 0) { + ++BUF->ackno[0]; + } + } + } + + /* Swap port numbers. */ + tmp16 = BUF->srcport; + BUF->srcport = BUF->destport; + BUF->destport = tmp16; + + /* Swap IP addresses. */ + uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr); + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + + /* And send out the RST packet! */ + goto tcp_send_noconn; + + /* This label will be jumped to if we matched the incoming packet + with a connection in LISTEN. In that case, we should create a new + connection and send a SYNACK in return. */ + found_listen: + /* First we check if there are any connections avaliable. Unused + connections are kept in the same table as used connections, but + unused ones have the tcpstate set to CLOSED. Also, connections in + TIME_WAIT are kept track of and we'll use the oldest one if no + CLOSED connections are found. Thanks to Eddie C. Dost for a very + nice algorithm for the TIME_WAIT search. */ + uip_connr = 0; + for(c = 0; c < UIP_CONNS; ++c) { + if(uip_conns[c].tcpstateflags == UIP_CLOSED) { + uip_connr = &uip_conns[c]; + break; + } + if(uip_conns[c].tcpstateflags == UIP_TIME_WAIT) { + if(uip_connr == 0 || + uip_conns[c].timer > uip_connr->timer) { + uip_connr = &uip_conns[c]; + } + } + } + + if(uip_connr == 0) { + /* All connections are used already, we drop packet and hope that + the remote end will retransmit the packet at a time when we + have more spare connections. */ + UIP_STAT(++uip_stat.tcp.syndrop); + UIP_LOG("tcp: found no unused connections."); + goto drop; + } + uip_conn = uip_connr; + + /* Fill in the necessary fields for the new connection. */ + uip_connr->rto = uip_connr->timer = UIP_RTO; + uip_connr->sa = 0; + uip_connr->sv = 4; + uip_connr->nrtx = 0; + uip_connr->lport = BUF->destport; + uip_connr->rport = BUF->srcport; + uip_ipaddr_copy(uip_connr->ripaddr, BUF->srcipaddr); + uip_connr->tcpstateflags = UIP_SYN_RCVD; + + uip_connr->snd_nxt[0] = iss[0]; + uip_connr->snd_nxt[1] = iss[1]; + uip_connr->snd_nxt[2] = iss[2]; + uip_connr->snd_nxt[3] = iss[3]; + uip_connr->len = 1; + + /* rcv_nxt should be the seqno from the incoming packet + 1. */ + uip_connr->rcv_nxt[3] = BUF->seqno[3]; + uip_connr->rcv_nxt[2] = BUF->seqno[2]; + uip_connr->rcv_nxt[1] = BUF->seqno[1]; + uip_connr->rcv_nxt[0] = BUF->seqno[0]; + uip_add_rcv_nxt(1); + + /* Parse the TCP MSS option, if present. */ + if((BUF->tcpoffset & 0xf0) > 0x50) { + for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) { + opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c]; + if(opt == TCP_OPT_END) { + /* End of options. */ + break; + } else if(opt == TCP_OPT_NOOP) { + ++c; + /* NOP option. */ + } else if(opt == TCP_OPT_MSS && + uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) { + /* An MSS option with the right option length. */ + tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) | + (u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = uip_connr->mss = + tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16; + + /* And we are done processing options. */ + break; + } else { + /* All other options have a length field, so that we easily + can skip past them. */ + if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + + /* Our response will be a SYNACK. */ +#if UIP_ACTIVE_OPEN + tcp_send_synack: + BUF->flags = TCP_ACK; + + tcp_send_syn: + BUF->flags |= TCP_SYN; +#else /* UIP_ACTIVE_OPEN */ + tcp_send_synack: + BUF->flags = TCP_SYN | TCP_ACK; +#endif /* UIP_ACTIVE_OPEN */ + + /* We send out the TCP Maximum Segment Size option with our + SYNACK. */ + BUF->optdata[0] = TCP_OPT_MSS; + BUF->optdata[1] = TCP_OPT_MSS_LEN; + BUF->optdata[2] = (UIP_TCP_MSS) / 256; + BUF->optdata[3] = (UIP_TCP_MSS) & 255; + uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN; + BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4; + goto tcp_send; + + /* This label will be jumped to if we found an active connection. */ + found: + uip_conn = uip_connr; + uip_flags = 0; + /* We do a very naive form of TCP reset processing; we just accept + any RST and kill our connection. We should in fact check if the + sequence number of this reset is wihtin our advertised window + before we accept the reset. */ + if(BUF->flags & TCP_RST) { + uip_connr->tcpstateflags = UIP_CLOSED; + UIP_LOG("tcp: got reset, aborting connection."); + uip_flags = UIP_ABORT; + UIP_APPCALL(); + goto drop; + } + /* Calculated the length of the data, if the application has sent + any data to us. */ + c = (BUF->tcpoffset >> 4) << 2; + /* uip_len will contain the length of the actual TCP data. This is + calculated by subtracing the length of the TCP header (in + c) and the length of the IP header (20 bytes). */ + uip_len = uip_len - c - UIP_IPH_LEN; + + /* First, check if the sequence number of the incoming packet is + what we're expecting next. If not, we send out an ACK with the + correct numbers in. */ + if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) && + ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) { + if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) && + (BUF->seqno[0] != uip_connr->rcv_nxt[0] || + BUF->seqno[1] != uip_connr->rcv_nxt[1] || + BUF->seqno[2] != uip_connr->rcv_nxt[2] || + BUF->seqno[3] != uip_connr->rcv_nxt[3])) { + goto tcp_send_ack; + } + } + + /* Next, check if the incoming segment acknowledges any outstanding + data. If so, we update the sequence number, reset the length of + the outstanding data, calculate RTT estimations, and reset the + retransmission timer. */ + if((BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) { + uip_add32(uip_connr->snd_nxt, uip_connr->len); + + if(BUF->ackno[0] == uip_acc32[0] && + BUF->ackno[1] == uip_acc32[1] && + BUF->ackno[2] == uip_acc32[2] && + BUF->ackno[3] == uip_acc32[3]) { + /* Update sequence number. */ + uip_connr->snd_nxt[0] = uip_acc32[0]; + uip_connr->snd_nxt[1] = uip_acc32[1]; + uip_connr->snd_nxt[2] = uip_acc32[2]; + uip_connr->snd_nxt[3] = uip_acc32[3]; + + + /* Do RTT estimation, unless we have done retransmissions. */ + if(uip_connr->nrtx == 0) { + signed char m; + m = uip_connr->rto - uip_connr->timer; + /* This is taken directly from VJs original code in his paper */ + m = m - (uip_connr->sa >> 3); + uip_connr->sa += m; + if(m < 0) { + m = -m; + } + m = m - (uip_connr->sv >> 2); + uip_connr->sv += m; + uip_connr->rto = (uip_connr->sa >> 3) + uip_connr->sv; + + } + /* Set the acknowledged flag. */ + uip_flags = UIP_ACKDATA; + /* Reset the retransmission timer. */ + uip_connr->timer = uip_connr->rto; + + /* Reset length of outstanding data. */ + uip_connr->len = 0; + } + + } + + /* Do different things depending on in what state the connection is. */ + switch(uip_connr->tcpstateflags & UIP_TS_MASK) { + /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not + implemented, since we force the application to close when the + peer sends a FIN (hence the application goes directly from + ESTABLISHED to LAST_ACK). */ + case UIP_SYN_RCVD: + /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and + we are waiting for an ACK that acknowledges the data we sent + out the last time. Therefore, we want to have the UIP_ACKDATA + flag set. If so, we enter the ESTABLISHED state. */ + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_flags = UIP_CONNECTED; + uip_connr->len = 0; + if(uip_len > 0) { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt(uip_len); + } + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + goto drop; +#if UIP_ACTIVE_OPEN + case UIP_SYN_SENT: + /* In SYN_SENT, we wait for a SYNACK that is sent in response to + our SYN. The rcv_nxt is set to sequence number in the SYNACK + plus one, and we send an ACK. We move into the ESTABLISHED + state. */ + if((uip_flags & UIP_ACKDATA) && + (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) { + + /* Parse the TCP MSS option, if present. */ + if((BUF->tcpoffset & 0xf0) > 0x50) { + for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) { + opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c]; + if(opt == TCP_OPT_END) { + /* End of options. */ + break; + } else if(opt == TCP_OPT_NOOP) { + ++c; + /* NOP option. */ + } else if(opt == TCP_OPT_MSS && + uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) { + /* An MSS option with the right option length. */ + tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) | + uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = + uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16; + + /* And we are done processing options. */ + break; + } else { + /* All other options have a length field, so that we easily + can skip past them. */ + if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_connr->rcv_nxt[0] = BUF->seqno[0]; + uip_connr->rcv_nxt[1] = BUF->seqno[1]; + uip_connr->rcv_nxt[2] = BUF->seqno[2]; + uip_connr->rcv_nxt[3] = BUF->seqno[3]; + uip_add_rcv_nxt(1); + uip_flags = UIP_CONNECTED | UIP_NEWDATA; + uip_connr->len = 0; + uip_len = 0; + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + /* Inform the application that the connection failed */ + uip_flags = UIP_ABORT; + UIP_APPCALL(); + /* The connection is closed after we send the RST */ + uip_conn->tcpstateflags = UIP_CLOSED; + goto reset; +#endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application to feed + data into the uip_buf. If the UIP_ACKDATA flag is set, the + application should put new data into the buffer, otherwise we are + retransmitting an old segment, and the application should put that + data into the buffer. + + If the incoming packet is a FIN, we should close the connection on + this side as well, and we send out a FIN and enter the LAST_ACK + state. We require that there is no outstanding data; otherwise the + sequence numbers will be screwed up. */ + + if(BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED)) { + if(uip_outstanding(uip_connr)) { + goto drop; + } + uip_add_rcv_nxt(1 + uip_len); + uip_flags |= UIP_CLOSE; + if(uip_len > 0) { + uip_flags |= UIP_NEWDATA; + } + UIP_APPCALL(); + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_LAST_ACK; + uip_connr->nrtx = 0; + tcp_send_finack: + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* Check the URG flag. If this is set, the segment carries urgent + data that we must pass to the application. */ + if((BUF->flags & TCP_URG) != 0) { +#if UIP_URGDATA > 0 + uip_urglen = (BUF->urgp[0] << 8) | BUF->urgp[1]; + if(uip_urglen > uip_len) { + /* There is more urgent data in the next segment to come. */ + uip_urglen = uip_len; + } + uip_add_rcv_nxt(uip_urglen); + uip_len -= uip_urglen; + uip_urgdata = uip_appdata; + uip_appdata += uip_urglen; + } else { + uip_urglen = 0; +#else /* UIP_URGDATA > 0 */ + uip_appdata = ((char *)uip_appdata) + ((BUF->urgp[0] << 8) | BUF->urgp[1]); + uip_len -= (BUF->urgp[0] << 8) | BUF->urgp[1]; +#endif /* UIP_URGDATA > 0 */ + } + + /* If uip_len > 0 we have TCP data in the packet, and we flag this + by setting the UIP_NEWDATA flag and update the sequence number + we acknowledge. If the application has stopped the dataflow + using uip_stop(), we must not accept any data packets from the + remote host. */ + if(uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED)) { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt(uip_len); + } + + /* Check if the available buffer space advertised by the other end + is smaller than the initial MSS for this connection. If so, we + set the current MSS to the window size to ensure that the + application does not send more data than the other end can + handle. + + If the remote host advertises a zero window, we set the MSS to + the initial MSS so that the application will send an entire MSS + of data. This data will not be acknowledged by the receiver, + and the application will retransmit it. This is called the + "persistent timer" and uses the retransmission mechanim. + */ + tmp16 = ((u16_t)BUF->wnd[0] << 8) + (u16_t)BUF->wnd[1]; + if(tmp16 > uip_connr->initialmss || + tmp16 == 0) { + tmp16 = uip_connr->initialmss; + } + uip_connr->mss = tmp16; + + /* If this packet constitutes an ACK for outstanding data (flagged + by the UIP_ACKDATA flag, we should call the application since it + might want to send more data. If the incoming packet had data + from the peer (as flagged by the UIP_NEWDATA flag), the + application must also be notified. + + When the application is called, the global variable uip_len + contains the length of the incoming data. The application can + access the incoming data through the global pointer + uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN + bytes into the uip_buf array. + + If the application wishes to send any data, this data should be + put into the uip_appdata and the length of the data should be + put into uip_len. If the application don't have any data to + send, uip_len must be set to 0. */ + if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) { + uip_slen = 0; + UIP_APPCALL(); + + appsend: + + if(uip_flags & UIP_ABORT) { + uip_slen = 0; + uip_connr->tcpstateflags = UIP_CLOSED; + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + if(uip_flags & UIP_CLOSE) { + uip_slen = 0; + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_FIN_WAIT_1; + uip_connr->nrtx = 0; + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* If uip_slen > 0, the application has data to be sent. */ + if(uip_slen > 0) { + + /* If the connection has acknowledged data, the contents of + the ->len variable should be discarded. */ + if((uip_flags & UIP_ACKDATA) != 0) { + uip_connr->len = 0; + } + + /* If the ->len variable is non-zero the connection has + already data in transit and cannot send anymore right + now. */ + if(uip_connr->len == 0) { + + /* The application cannot send more than what is allowed by + the mss (the minumum of the MSS and the available + window). */ + if(uip_slen > uip_connr->mss) { + uip_slen = uip_connr->mss; + } + + /* Remember how much data we send out now so that we know + when everything has been acknowledged. */ + uip_connr->len = uip_slen; + } else { + + /* If the application already had unacknowledged data, we + make sure that the application does not send (i.e., + retransmit) out more than it previously sent out. */ + uip_slen = uip_connr->len; + } + } + uip_connr->nrtx = 0; + apprexmit: + uip_appdata = uip_sappdata; + + /* If the application has data to be sent, or if the incoming + packet had new data in it, we must send out a packet. */ + if(uip_slen > 0 && uip_connr->len > 0) { + /* Add the length of the IP and TCP headers. */ + uip_len = uip_connr->len + UIP_TCPIP_HLEN; + /* We always set the ACK flag in response packets. */ + BUF->flags = TCP_ACK | TCP_PSH; + /* Send the packet. */ + goto tcp_send_noopts; + } + /* If there is no data to send, just send out a pure ACK if + there is newdata. */ + if(uip_flags & UIP_NEWDATA) { + uip_len = UIP_TCPIP_HLEN; + BUF->flags = TCP_ACK; + goto tcp_send_noopts; + } + } + goto drop; + case UIP_LAST_ACK: + /* We can close this connection if the peer has acknowledged our + FIN. This is indicated by the UIP_ACKDATA flag. */ + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_CLOSED; + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + } + break; + + case UIP_FIN_WAIT_1: + /* The application has closed the connection, but the remote host + hasn't closed its end yet. Thus we do nothing but wait for a + FIN from the other side. */ + if(uip_len > 0) { + uip_add_rcv_nxt(uip_len); + } + if(BUF->flags & TCP_FIN) { + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_connr->len = 0; + } else { + uip_connr->tcpstateflags = UIP_CLOSING; + } + uip_add_rcv_nxt(1); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } else if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_FIN_WAIT_2; + uip_connr->len = 0; + goto drop; + } + if(uip_len > 0) { + goto tcp_send_ack; + } + goto drop; + + case UIP_FIN_WAIT_2: + if(uip_len > 0) { + uip_add_rcv_nxt(uip_len); + } + if(BUF->flags & TCP_FIN) { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_add_rcv_nxt(1); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } + if(uip_len > 0) { + goto tcp_send_ack; + } + goto drop; + + case UIP_TIME_WAIT: + goto tcp_send_ack; + + case UIP_CLOSING: + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + } + } + goto drop; + + + /* We jump here when we are ready to send the packet, and just want + to set the appropriate TCP sequence numbers in the TCP header. */ + tcp_send_ack: + BUF->flags = TCP_ACK; + tcp_send_nodata: + uip_len = UIP_IPTCPH_LEN; + tcp_send_noopts: + BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4; + tcp_send: + /* We're done with the input processing. We are now ready to send a + reply. Our job is to fill in all the fields of the TCP and IP + headers before calculating the checksum and finally send the + packet. */ + BUF->ackno[0] = uip_connr->rcv_nxt[0]; + BUF->ackno[1] = uip_connr->rcv_nxt[1]; + BUF->ackno[2] = uip_connr->rcv_nxt[2]; + BUF->ackno[3] = uip_connr->rcv_nxt[3]; + + BUF->seqno[0] = uip_connr->snd_nxt[0]; + BUF->seqno[1] = uip_connr->snd_nxt[1]; + BUF->seqno[2] = uip_connr->snd_nxt[2]; + BUF->seqno[3] = uip_connr->snd_nxt[3]; + + BUF->proto = UIP_PROTO_TCP; + + BUF->srcport = uip_connr->lport; + BUF->destport = uip_connr->rport; + + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + uip_ipaddr_copy(BUF->destipaddr, uip_connr->ripaddr); + + if(uip_connr->tcpstateflags & UIP_STOPPED) { + /* If the connection has issued uip_stop(), we advertise a zero + window so that the remote host will stop sending data. */ + BUF->wnd[0] = BUF->wnd[1] = 0; + } else { + BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8); + BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff); + } + + tcp_send_noconn: + BUF->ttl = UIP_TTL; +#if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); + BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); +#else /* UIP_CONF_IPV6 */ + BUF->len[0] = (uip_len >> 8); + BUF->len[1] = (uip_len & 0xff); +#endif /* UIP_CONF_IPV6 */ + + BUF->urgp[0] = BUF->urgp[1] = 0; + + /* Calculate TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~(uip_tcpchksum()); + + ip_send_nolen: + +#if UIP_CONF_IPV6 + BUF->vtc = 0x60; + BUF->tcflow = 0x00; + BUF->flow = 0x00; +#else /* UIP_CONF_IPV6 */ + BUF->vhl = 0x45; + BUF->tos = 0; + BUF->ipoffset[0] = BUF->ipoffset[1] = 0; + ++ipid; + BUF->ipid[0] = ipid >> 8; + BUF->ipid[1] = ipid & 0xff; + /* Calculate IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~(uip_ipchksum()); + DEBUG_PRINTF("uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum()); +#endif /* UIP_CONF_IPV6 */ + + UIP_STAT(++uip_stat.tcp.sent); + send: + DEBUG_PRINTF("Sending packet with length %d (%d)\n", uip_len, + (BUF->len[0] << 8) | BUF->len[1]); + + UIP_STAT(++uip_stat.ip.sent); + /* Return and let the caller do the actual transmission. */ + uip_flags = 0; + return; + drop: + uip_len = 0; + uip_flags = 0; + return; +} +/*---------------------------------------------------------------------------*/ +u16_t +htons(u16_t val) +{ + return HTONS(val); +} +/*---------------------------------------------------------------------------*/ +void +uip_send(const void *data, int len) +{ + uip_slen = len; + if(len > 0) { + if(data != uip_sappdata) { + memcpy(uip_sappdata, (data), uip_slen); + } + } +} +/** @} */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip.h b/STM32F4/libraries/arduino_uip/utility/uip.h new file mode 100644 index 0000000..4fc0452 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip.h @@ -0,0 +1,1601 @@ + +/** + * \addtogroup uip + * @{ + */ + +/** + * \file + * Header file for the uIP TCP/IP stack. + * \author Adam Dunkels + * + * The uIP TCP/IP stack header file contains definitions for a number + * of C macros that are used by uIP programs as well as internal uIP + * structures, TCP/IP header structures and function declarations. + * + */ + + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.h,v 1.40 2006/06/08 07:12:07 adam Exp $ + * + */ + +#ifndef __UIP_H__ +#define __UIP_H__ + +#include "uipopt.h" + +/** + * Repressentation of an IP address. + * + */ +typedef u16_t uip_ip4addr_t[2]; +typedef u16_t uip_ip6addr_t[8]; +#if UIP_CONF_IPV6 +typedef uip_ip6addr_t uip_ipaddr_t; +#else /* UIP_CONF_IPV6 */ +typedef uip_ip4addr_t uip_ipaddr_t; +#endif /* UIP_CONF_IPV6 */ + +/*---------------------------------------------------------------------------*/ +/* First, the functions that should be called from the + * system. Initialization, the periodic timer and incoming packets are + * handled by the following three functions. + */ + +/** + * \defgroup uipconffunc uIP configuration functions + * @{ + * + * The uIP configuration functions are used for setting run-time + * parameters in uIP such as IP addresses. + */ + +/** + * Set the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + + uip_ipaddr_t addr; + + uip_ipaddr(&addr, 192,168,1,2); + uip_sethostaddr(&addr); + + \endcode + * \param addr A pointer to an IP address of type uip_ipaddr_t; + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_sethostaddr(addr) uip_ipaddr_copy(uip_hostaddr, (addr)) + +/** + * Get the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + uip_ipaddr_t hostaddr; + + uip_gethostaddr(&hostaddr); + \endcode + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the currently configured IP address. + * + * \hideinitializer + */ +#define uip_gethostaddr(addr) uip_ipaddr_copy((addr), uip_hostaddr) + +/** + * Set the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the default router. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setdraddr(addr) uip_ipaddr_copy(uip_draddr, (addr)) + +/** + * Set the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the netmask. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setnetmask(addr) uip_ipaddr_copy(uip_netmask, (addr)) + + +/** + * Get the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address of the default router. + * + * \hideinitializer + */ +#define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr) + +/** + * Get the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the value of the netmask. + * + * \hideinitializer + */ +#define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask) + +/** @} */ + +/** + * \defgroup uipinit uIP initialization functions + * @{ + * + * The uIP initialization functions are used for booting uIP. + */ + +/** + * uIP initialization function. + * + * This function should be called at boot up to initilize the uIP + * TCP/IP stack. + */ +void uip_init(void); + +/** + * uIP initialization function. + * + * This function may be used at boot time to set the initial ip_id. + */ +void uip_setipid(u16_t id); + +/** @} */ + +/** + * \defgroup uipdevfunc uIP device driver functions + * @{ + * + * These functions are used by a network device driver for interacting + * with uIP. + */ + +/** + * Process an incoming packet. + * + * This function should be called when the device driver has received + * a packet from the network. The packet from the device driver must + * be present in the uip_buf buffer, and the length of the packet + * should be placed in the uip_len variable. + * + * When the function returns, there may be an outbound packet placed + * in the uip_buf packet buffer. If so, the uip_len variable is set to + * the length of the packet. If no packet is to be sent out, the + * uip_len variable is set to 0. + * + * The usual way of calling the function is presented by the source + * code below. + \code + uip_len = devicedriver_poll(); + if(uip_len > 0) { + uip_input(); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uIP ARP code before calling + * this function: + \code + #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + uip_len = ethernet_devicedrver_poll(); + if(uip_len > 0) { + if(BUF->type == HTONS(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + if(uip_len > 0) { + ethernet_devicedriver_send(); + } + } + \endcode + * + * \hideinitializer + */ +#define uip_input() uip_process(UIP_DATA) + +/** + * Periodic processing for a connection identified by its number. + * + * This function does the necessary periodic processing (timers, + * polling) for a uIP TCP conneciton, and should be called when the + * periodic uIP timer goes off. It should be called for every + * connection, regardless of whether they are open of closed. + * + * When the function returns, it may have an outbound packet waiting + * for service in the uIP packet buffer, and if so the uip_len + * variable is set to a value larger than zero. The device driver + * should be called to send out the packet. + * + * The ususal way of calling the function is through a for() loop like + * this: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uip_arp_out() function before + * calling the device driver: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the connection which is to be periodically polled. + * + * \hideinitializer + */ +#define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \ + uip_process(UIP_TIMER); } while (0) + +/** + * + * + */ +#define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED) + +/** + * Perform periodic processing for a connection identified by a pointer + * to its structure. + * + * Same as uip_periodic() but takes a pointer to the actual uip_conn + * struct instead of an integer as its argument. This function can be + * used to force periodic processing of a specific connection. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_periodic_conn(conn) do { uip_conn = conn; \ + uip_process(UIP_TIMER); } while (0) + +/** + * Reuqest that a particular connection should be polled. + * + * Similar to uip_periodic_conn() but does not perform any timer + * processing. The application is polled for new data. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_poll_conn(conn) do { uip_conn = conn; \ + uip_process(UIP_POLL_REQUEST); } while (0) + + +#if UIP_UDP +/** + * Periodic processing for a UDP connection identified by its number. + * + * This function is essentially the same as uip_periodic(), but for + * UDP connections. It is called in a similar fashion as the + * uip_periodic() function: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note As for the uip_periodic() function, special care has to be + * taken when using uIP together with ARP and Ethernet: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the UDP connection to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \ + uip_process(UIP_UDP_TIMER); } while (0) + +/** + * Periodic processing for a UDP connection identified by a pointer to + * its structure. + * + * Same as uip_udp_periodic() but takes a pointer to the actual + * uip_conn struct instead of an integer as its argument. This + * function can be used to force periodic processing of a specific + * connection. + * + * \param conn A pointer to the uip_udp_conn struct for the connection + * to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \ + uip_process(UIP_UDP_TIMER); } while (0) + + +#endif /* UIP_UDP */ + +/** + * The uIP packet buffer. + * + * The uip_buf array is used to hold incoming and outgoing + * packets. The device driver should place incoming data into this + * buffer. When sending data, the device driver should read the link + * level headers and the TCP/IP headers from this buffer. The size of + * the link level headers is configured by the UIP_LLH_LEN define. + * + * \note The application data need not be placed in this buffer, so + * the device driver must read it from the place pointed to by the + * uip_appdata pointer as illustrated by the following example: + \code + void + devicedriver_send(void) + { + hwsend(&uip_buf[0], UIP_LLH_LEN); + if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { + hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); + } else { + hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); + hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); + } + } + \endcode + */ +extern u8_t uip_buf[UIP_BUFSIZE+2]; + +/** @} */ + +/*---------------------------------------------------------------------------*/ +/* Functions that are used by the uIP application program. Opening and + * closing connections, sending and receiving data, etc. is all + * handled by the functions below. +*/ +/** + * \defgroup uipappfunc uIP application functions + * @{ + * + * Functions used by an application running of top of uIP. + */ + +/** + * Start listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_listen(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_listen(u16_t port); + +/** + * Stop listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_unlisten(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_unlisten(u16_t port); + +/** + * Connect to a remote host using TCP. + * + * This function is used to start a new connection to the specified + * port on the specied host. It allocates a new connection identifier, + * sets the connection to the SYN_SENT state and sets the + * retransmission timer to 0. This will cause a TCP SYN segment to be + * sent out the next time this connection is periodically processed, + * which usually is done within 0.5 seconds after the call to + * uip_connect(). + * + * \note This function is avaliable only if support for active open + * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h. + * + * \note Since this function requires the port number to be in network + * byte order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_ipaddr_t ipaddr; + + uip_ipaddr(&ipaddr, 192,168,1,2); + uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param ripaddr The IP address of the remote hot. + * + * \param port A 16-bit port number in network byte order. + * + * \return A pointer to the uIP connection identifier for the new connection, + * or NULL if no connection could be allocated. + * + */ +struct uip_conn *uip_connect(uip_ipaddr_t *ripaddr, u16_t port); + + + +/** + * \internal + * + * Check if a connection has outstanding (i.e., unacknowledged) data. + * + * \param conn A pointer to the uip_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_outstanding(conn) ((conn)->len) + +/** + * Send data on the current connection. + * + * This function is used to send out a single segment of TCP + * data. Only applications that have been invoked by uIP for event + * processing can send data. + * + * The amount of data that actually is sent out after a call to this + * funcion is determined by the maximum amount of data TCP allows. uIP + * will automatically crop the data so that only the appropriate + * amount of data is sent. The function uip_mss() can be used to query + * uIP for the amount of data that actually will be sent. + * + * \note This function does not guarantee that the sent data will + * arrive at the destination. If the data is lost in the network, the + * application will be invoked with the uip_rexmit() event being + * set. The application will then have to resend the data using this + * function. + * + * \param data A pointer to the data which is to be sent. + * + * \param len The maximum amount of data bytes to be sent. + * + * \hideinitializer + */ +void uip_send(const void *data, int len); + +/** + * The length of any incoming data that is currently avaliable (if avaliable) + * in the uip_appdata buffer. + * + * The test function uip_data() must first be used to check if there + * is any data available at all. + * + * \hideinitializer + */ +/*void uip_datalen(void);*/ +#define uip_datalen() uip_len + +/** + * The length of any out-of-band data (urgent data) that has arrived + * on the connection. + * + * \note The configuration parameter UIP_URGDATA must be set for this + * function to be enabled. + * + * \hideinitializer + */ +#define uip_urgdatalen() uip_urglen + +/** + * Close the current connection. + * + * This function will close the current connection in a nice way. + * + * \hideinitializer + */ +#define uip_close() (uip_flags = UIP_CLOSE) + +/** + * Abort the current connection. + * + * This function will abort (reset) the current connection, and is + * usually used when an error has occured that prevents using the + * uip_close() function. + * + * \hideinitializer + */ +#define uip_abort() (uip_flags = UIP_ABORT) + +/** + * Tell the sending host to stop sending data. + * + * This function will close our receiver's window so that we stop + * receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED) + +/** + * Find out if the current connection has been previously stopped with + * uip_stop(). + * + * \hideinitializer + */ +#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED) + +/** + * Restart the current connection, if is has previously been stopped + * with uip_stop(). + * + * This function will open the receiver's window again so that we + * start receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_restart() do { uip_flags |= UIP_NEWDATA; \ + uip_conn->tcpstateflags &= ~UIP_STOPPED; \ + } while(0) + + +/* uIP tests that can be made to determine in what state the current + connection is, and what the application function should do. */ + +/** + * Is the current connection a UDP connection? + * + * This function checks whether the current connection is a UDP connection. + * + * \hideinitializer + * + */ +#define uip_udpconnection() (uip_conn == NULL) + +/** + * Is new incoming data available? + * + * Will reduce to non-zero if there is new data for the application + * present at the uip_appdata pointer. The size of the data is + * avaliable through the uip_len variable. + * + * \hideinitializer + */ +#define uip_newdata() (uip_flags & UIP_NEWDATA) + +/** + * Has previously sent data been acknowledged? + * + * Will reduce to non-zero if the previously sent data has been + * acknowledged by the remote host. This means that the application + * can send new data. + * + * \hideinitializer + */ +#define uip_acked() (uip_flags & UIP_ACKDATA) + +/** + * Has the connection just been connected? + * + * Reduces to non-zero if the current connection has been connected to + * a remote host. This will happen both if the connection has been + * actively opened (with uip_connect()) or passively opened (with + * uip_listen()). + * + * \hideinitializer + */ +#define uip_connected() (uip_flags & UIP_CONNECTED) + +/** + * Has the connection been closed by the other end? + * + * Is non-zero if the connection has been closed by the remote + * host. The application may then do the necessary clean-ups. + * + * \hideinitializer + */ +#define uip_closed() (uip_flags & UIP_CLOSE) + +/** + * Has the connection been aborted by the other end? + * + * Non-zero if the current connection has been aborted (reset) by the + * remote host. + * + * \hideinitializer + */ +#define uip_aborted() (uip_flags & UIP_ABORT) + +/** + * Has the connection timed out? + * + * Non-zero if the current connection has been aborted due to too many + * retransmissions. + * + * \hideinitializer + */ +#define uip_timedout() (uip_flags & UIP_TIMEDOUT) + +/** + * Do we need to retransmit previously data? + * + * Reduces to non-zero if the previously sent data has been lost in + * the network, and the application should retransmit it. The + * application should send the exact same data as it did the last + * time, using the uip_send() function. + * + * \hideinitializer + */ +#define uip_rexmit() (uip_flags & UIP_REXMIT) + +/** + * Is the connection being polled by uIP? + * + * Is non-zero if the reason the application is invoked is that the + * current connection has been idle for a while and should be + * polled. + * + * The polling event can be used for sending data without having to + * wait for the remote host to send data. + * + * \hideinitializer + */ +#define uip_poll() (uip_flags & UIP_POLL) + +/** + * Get the initial maxium segment size (MSS) of the current + * connection. + * + * \hideinitializer + */ +#define uip_initialmss() (uip_conn->initialmss) + +/** + * Get the current maxium segment size that can be sent on the current + * connection. + * + * The current maxiumum segment size that can be sent on the + * connection is computed from the receiver's window and the MSS of + * the connection (which also is available by calling + * uip_initialmss()). + * + * \hideinitializer + */ +#define uip_mss() (uip_conn->mss) + +/** + * Set up a new UDP connection. + * + * This function sets up a new UDP connection. The function will + * automatically allocate an unused local port for the new + * connection. However, another port can be chosen by using the + * uip_udp_bind() call, after the uip_udp_new() function has been + * called. + * + * Example: + \code + uip_ipaddr_t addr; + struct uip_udp_conn *c; + + uip_ipaddr(&addr, 192,168,2,1); + c = uip_udp_new(&addr, HTONS(12345)); + if(c != NULL) { + uip_udp_bind(c, HTONS(12344)); + } + \endcode + * \param ripaddr The IP address of the remote host. + * + * \param rport The remote port number in network byte order. + * + * \return The uip_udp_conn structure for the new connection or NULL + * if no connection could be allocated. + */ +struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport); + +/** + * Removed a UDP connection. + * + * \param conn A pointer to the uip_udp_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_udp_remove(conn) (conn)->lport = 0 + +/** + * Bind a UDP connection to a local port. + * + * \param conn A pointer to the uip_udp_conn structure for the + * connection. + * + * \param port The local port number, in network byte order. + * + * \hideinitializer + */ +#define uip_udp_bind(conn, port) (conn)->lport = port + +/** + * Send a UDP datagram of length len on the current connection. + * + * This function can only be called in response to a UDP event (poll + * or newdata). The data must be present in the uip_buf buffer, at the + * place pointed to by the uip_appdata pointer. + * + * \param len The length of the data in the uip_buf buffer. + * + * \hideinitializer + */ +#define uip_udp_send(len) uip_send((char *)uip_appdata, len) + +/** @} */ + +/* uIP convenience and converting functions. */ + +/** + * \defgroup uipconvfunc uIP conversion functions + * @{ + * + * These functions can be used for converting between different data + * formats used by uIP. + */ + +/** + * Construct an IP address from four bytes. + * + * This function constructs an IP address of the type that uIP handles + * internally from four bytes. The function is handy for specifying IP + * addresses to use with e.g. the uip_connect() function. + * + * Example: + \code + uip_ipaddr_t ipaddr; + struct uip_conn *c; + + uip_ipaddr(&ipaddr, 192,168,1,2); + c = uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address. + * + * \param addr0 The first octet of the IP address. + * \param addr1 The second octet of the IP address. + * \param addr2 The third octet of the IP address. + * \param addr3 The forth octet of the IP address. + * + * \hideinitializer + */ +#define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \ + ((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \ + ((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \ + } while(0) + +/** + * Construct an IPv6 address from eight 16-bit words. + * + * This function constructs an IPv6 address. + * + * \hideinitializer + */ +#define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \ + ((u16_t *)(addr))[0] = HTONS((addr0)); \ + ((u16_t *)(addr))[1] = HTONS((addr1)); \ + ((u16_t *)(addr))[2] = HTONS((addr2)); \ + ((u16_t *)(addr))[3] = HTONS((addr3)); \ + ((u16_t *)(addr))[4] = HTONS((addr4)); \ + ((u16_t *)(addr))[5] = HTONS((addr5)); \ + ((u16_t *)(addr))[6] = HTONS((addr6)); \ + ((u16_t *)(addr))[7] = HTONS((addr7)); \ + } while(0) + +/** + * Copy an IP address to another IP address. + * + * Copies an IP address from one place to another. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr_copy(&ipaddr2, &ipaddr1); + \endcode + * + * \param dest The destination for the copy. + * \param src The source from where to copy. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_copy(dest, src) do { \ + ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \ + ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \ + } while(0) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) +#endif /* !UIP_CONF_IPV6 */ + +/** + * Compare two IP addresses + * + * Compares two IP addresses. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \ + ((u16_t *)addr1)[1] == ((u16_t *)addr2)[1]) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0) +#endif /* !UIP_CONF_IPV6 */ + +/** + * Compare two IP addresses with netmasks + * + * Compares two IP addresses with netmasks. The masks are used to mask + * out the bits that are to be compared. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, mask; + + uip_ipaddr(&mask, 255,255,255,0); + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&ipaddr2, 192,16,1,3); + if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_maskcmp(addr1, addr2, mask) \ + (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \ + (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \ + ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \ + (((u16_t *)addr2)[1] & ((u16_t *)mask)[1]))) + + +/** + * Mask out the network part of an IP address. + * + * Masks out the network part of an IP address, given the address and + * the netmask. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, netmask; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&netmask, 255,255,255,0); + uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask); + \endcode + * + * In the example above, the variable "ipaddr2" will contain the IP + * address 192.168.1.0. + * + * \param dest Where the result is to be placed. + * \param src The IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_mask(dest, src, mask) do { \ + ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \ + ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \ + } while(0) + +/** + * Pick the first octet of an IP address. + * + * Picks out the first octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr1(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 1. + * + * \hideinitializer + */ +#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8) + +/** + * Pick the second octet of an IP address. + * + * Picks out the second octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr2(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 2. + * + * \hideinitializer + */ +#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff) + +/** + * Pick the third octet of an IP address. + * + * Picks out the third octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr3(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 3. + * + * \hideinitializer + */ +#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8) + +/** + * Pick the fourth octet of an IP address. + * + * Picks out the fourth octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr4(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 4. + * + * \hideinitializer + */ +#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff) + +/** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This macro is primarily used for converting constants from host + * byte order to network byte order. For converting variables to + * network byte order, use the htons() function instead. + * + * \hideinitializer + */ +#ifndef HTONS +# if UIP_BYTE_ORDER == UIP_BIG_ENDIAN +# define HTONS(n) (n) +# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) +# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +#else +#error "HTONS already defined!" +#endif /* HTONS */ + +/** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This function is primarily used for converting variables from host + * byte order to network byte order. For converting constants to + * network byte order, use the HTONS() macro instead. + */ +#ifndef htons +u16_t htons(u16_t val); +#endif /* htons */ +#ifndef ntohs +#define ntohs htons +#endif + +/** @} */ + +/** + * Pointer to the application data in the packet buffer. + * + * This pointer points to the application data when the application is + * called. If the application wishes to send data, the application may + * use this space to write the data into before calling uip_send(). + */ +extern void *uip_appdata; + +#if UIP_URGDATA > 0 +/* u8_t *uip_urgdata: + * + * This pointer points to any urgent data that has been received. Only + * present if compiled with support for urgent data (UIP_URGDATA). + */ +extern void *uip_urgdata; +#endif /* UIP_URGDATA > 0 */ + + +/** + * \defgroup uipdrivervars Variables used in uIP device drivers + * @{ + * + * uIP has a few global variables that are used in device drivers for + * uIP. + */ + +/** + * The length of the packet in the uip_buf buffer. + * + * The global variable uip_len holds the length of the packet in the + * uip_buf buffer. + * + * When the network device driver calls the uIP input function, + * uip_len should be set to the length of the packet in the uip_buf + * buffer. + * + * When sending packets, the device driver should use the contents of + * the uip_len variable to determine the length of the outgoing + * packet. + * + */ +extern u16_t uip_len; + +/** @} */ + +#if UIP_URGDATA > 0 +extern u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + + +/** + * Representation of a uIP TCP connection. + * + * The uip_conn structure is used for identifying a connection. All + * but one field in the structure are to be considered read-only by an + * application. The only exception is the appstate field whos purpose + * is to let the application store application-specific state (e.g., + * file pointers) for the connection. The type of this field is + * configured in the "uipopt.h" header file. + */ +struct uip_conn { + uip_ipaddr_t ripaddr; /**< The IP address of the remote host. */ + + u16_t lport; /**< The local TCP port, in network byte order. */ + u16_t rport; /**< The local remote TCP port, in network byte + order. */ + + u8_t rcv_nxt[4]; /**< The sequence number that we expect to + receive next. */ + u8_t snd_nxt[4]; /**< The sequence number that was last sent by + us. */ + u16_t len; /**< Length of the data that was previously sent. */ + u16_t mss; /**< Current maximum segment size for the + connection. */ + u16_t initialmss; /**< Initial maximum segment size for the + connection. */ + u8_t sa; /**< Retransmission time-out calculation state + variable. */ + u8_t sv; /**< Retransmission time-out calculation state + variable. */ + u8_t rto; /**< Retransmission time-out. */ + u8_t tcpstateflags; /**< TCP state and flags. */ + u8_t timer; /**< The retransmission timer. */ + u8_t nrtx; /**< The number of retransmissions for the last + segment sent. */ + + /** The application state. */ + uip_tcp_appstate_t appstate; +}; + + +/** + * Pointer to the current TCP connection. + * + * The uip_conn pointer can be used to access the current TCP + * connection. + */ +extern struct uip_conn *uip_conn; +/* The array containing all uIP connections. */ +extern struct uip_conn uip_conns[UIP_CONNS]; +/** + * \addtogroup uiparch + * @{ + */ + +/** + * 4-byte array used for the 32-bit sequence number calculations. + */ +extern u8_t uip_acc32[4]; + +/** @} */ + + +#if UIP_UDP +/** + * Representation of a uIP UDP connection. + */ +struct uip_udp_conn { + uip_ipaddr_t ripaddr; /**< The IP address of the remote peer. */ + u16_t lport; /**< The local port number in network byte order. */ + u16_t rport; /**< The remote port number in network byte order. */ + u8_t ttl; /**< Default time-to-live. */ + + /** The application state. */ + uip_udp_appstate_t appstate; +}; + +/** + * The current UDP connection. + */ +extern struct uip_udp_conn *uip_udp_conn; +extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +/** + * The structure holding the TCP/IP statistics that are gathered if + * UIP_STATISTICS is set to 1. + * + */ +struct uip_stats { + struct { + uip_stats_t drop; /**< Number of dropped packets at the IP + layer. */ + uip_stats_t recv; /**< Number of received packets at the IP + layer. */ + uip_stats_t sent; /**< Number of sent packets at the IP + layer. */ + uip_stats_t vhlerr; /**< Number of packets dropped due to wrong + IP version or header length. */ + uip_stats_t hblenerr; /**< Number of packets dropped due to wrong + IP length, high byte. */ + uip_stats_t lblenerr; /**< Number of packets dropped due to wrong + IP length, low byte. */ + uip_stats_t fragerr; /**< Number of packets dropped since they + were IP fragments. */ + uip_stats_t chkerr; /**< Number of packets dropped due to IP + checksum errors. */ + uip_stats_t protoerr; /**< Number of packets dropped since they + were neither ICMP, UDP nor TCP. */ + } ip; /**< IP statistics. */ + struct { + uip_stats_t drop; /**< Number of dropped ICMP packets. */ + uip_stats_t recv; /**< Number of received ICMP packets. */ + uip_stats_t sent; /**< Number of sent ICMP packets. */ + uip_stats_t typeerr; /**< Number of ICMP packets with a wrong + type. */ + } icmp; /**< ICMP statistics. */ + struct { + uip_stats_t drop; /**< Number of dropped TCP segments. */ + uip_stats_t recv; /**< Number of recived TCP segments. */ + uip_stats_t sent; /**< Number of sent TCP segments. */ + uip_stats_t chkerr; /**< Number of TCP segments with a bad + checksum. */ + uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK + number. */ + uip_stats_t rst; /**< Number of recevied TCP RST (reset) segments. */ + uip_stats_t rexmit; /**< Number of retransmitted TCP segments. */ + uip_stats_t syndrop; /**< Number of dropped SYNs due to too few + connections was avaliable. */ + uip_stats_t synrst; /**< Number of SYNs for closed ports, + triggering a RST. */ + } tcp; /**< TCP statistics. */ +#if UIP_UDP + struct { + uip_stats_t drop; /**< Number of dropped UDP segments. */ + uip_stats_t recv; /**< Number of recived UDP segments. */ + uip_stats_t sent; /**< Number of sent UDP segments. */ + uip_stats_t chkerr; /**< Number of UDP segments with a bad + checksum. */ + } udp; /**< UDP statistics. */ +#endif /* UIP_UDP */ +}; + +/** + * The uIP TCP/IP statistics. + * + * This is the variable in which the uIP TCP/IP statistics are gathered. + */ +extern struct uip_stats uip_stat; + + +/*---------------------------------------------------------------------------*/ +/* All the stuff below this point is internal to uIP and should not be + * used directly by an application or by a device driver. + */ +/*---------------------------------------------------------------------------*/ +/* u8_t uip_flags: + * + * When the application is called, uip_flags will contain the flags + * that are defined in this file. Please read below for more + * infomation. + */ +extern u8_t uip_flags; + +/* The following flags may be set in the global variable uip_flags + before calling the application callback. The UIP_ACKDATA, + UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time, + whereas the others are mutualy exclusive. Note that these flags + should *NOT* be accessed directly, but only through the uIP + functions/macros. */ + +#define UIP_ACKDATA 1 /* Signifies that the outstanding data was + acked and the application should send + out new data instead of retransmitting + the last data. */ +#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent + us new data. */ +#define UIP_REXMIT 4 /* Tells the application to retransmit the + data that was last sent. */ +#define UIP_POLL 8 /* Used for polling the application, to + check if the application has data that + it wants to send. */ +#define UIP_CLOSE 16 /* The remote host has closed the + connection, thus the connection has + gone away. Or the application signals + that it wants to close the + connection. */ +#define UIP_ABORT 32 /* The remote host has aborted the + connection, thus the connection has + gone away. Or the application signals + that it wants to abort the + connection. */ +#define UIP_CONNECTED 64 /* We have got a connection from a remote + host and have set up a new connection + for it, or an active connection has + been successfully established. */ + +#define UIP_TIMEDOUT 128 /* The connection has been aborted due to + too many retransmissions. */ + +/* uip_process(flag): + * + * The actual uIP function which does all the work. + */ +void uip_process(u8_t flag); + +/* The following flags are passed as an argument to the uip_process() + function. They are used to distinguish between the two cases where + uip_process() is called. It can be called either because we have + incoming data that should be processed, or because the periodic + timer has fired. These values are never used directly, but only in + the macrose defined in this file. */ + +#define UIP_DATA 1 /* Tells uIP that there is incoming + data in the uip_buf buffer. The + length of the data is stored in the + global variable uip_len. */ +#define UIP_TIMER 2 /* Tells uIP that the periodic timer + has fired. */ +#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should + be polled. */ +#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram + should be constructed in the + uip_buf buffer. */ +#if UIP_UDP +#define UIP_UDP_TIMER 5 +#endif /* UIP_UDP */ + +/* The TCP states used in the uip_conn->tcpstateflags. */ +#define UIP_CLOSED 0 +#define UIP_SYN_RCVD 1 +#define UIP_SYN_SENT 2 +#define UIP_ESTABLISHED 3 +#define UIP_FIN_WAIT_1 4 +#define UIP_FIN_WAIT_2 5 +#define UIP_CLOSING 6 +#define UIP_TIME_WAIT 7 +#define UIP_LAST_ACK 8 +#define UIP_TS_MASK 15 + +#define UIP_STOPPED 16 + +/* The TCP and IP headers. */ +struct uip_tcpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcflow; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* TCP header. */ + u16_t srcport, + destport; + u8_t seqno[4], + ackno[4], + tcpoffset, + flags, + wnd[2]; + u16_t tcpchksum; + u8_t urgp[2]; + u8_t optdata[4]; +}; + +/* The ICMP and IP headers. */ +struct uip_icmpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* ICMP (echo) header. */ + u8_t type, icode; + u16_t icmpchksum; +#if !UIP_CONF_IPV6 + u16_t id, seqno; +#else /* !UIP_CONF_IPV6 */ + u8_t flags, reserved1, reserved2, reserved3; + u8_t icmp6data[16]; + u8_t options[1]; +#endif /* !UIP_CONF_IPV6 */ +}; + + +/* The UDP and IP headers. */ +struct uip_udpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IP header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* UDP header. */ + u16_t srcport, + destport; + u16_t udplen; + u16_t udpchksum; +}; + + + +/** + * The buffer size available for user data in the \ref uip_buf buffer. + * + * This macro holds the available size for user data in the \ref + * uip_buf buffer. The macro is intended to be used for checking + * bounds of available user data. + * + * Example: + \code + snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i); + \endcode + * + * \hideinitializer + */ +#define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) + + +#define UIP_PROTO_ICMP 1 +#define UIP_PROTO_TCP 6 +#define UIP_PROTO_UDP 17 +#define UIP_PROTO_ICMP6 58 + +/* Header sizes. */ +#if UIP_CONF_IPV6 +#define UIP_IPH_LEN 40 +#else /* UIP_CONF_IPV6 */ +#define UIP_IPH_LEN 20 /* Size of IP header */ +#endif /* UIP_CONF_IPV6 */ +#define UIP_UDPH_LEN 8 /* Size of UDP header */ +#define UIP_TCPH_LEN 20 /* Size of TCP header */ +#define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN) /* Size of IP + + UDP + header */ +#define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN) /* Size of IP + + TCP + header */ +#define UIP_TCPIP_HLEN UIP_IPTCPH_LEN + + +#if UIP_FIXEDADDR +extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#else /* UIP_FIXEDADDR */ +extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#endif /* UIP_FIXEDADDR */ + + + +/** + * Representation of a 48-bit Ethernet address. + */ +struct uip_eth_addr { + u8_t addr[6]; +}; + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +/** + * Calculate the UDP checksum of the packet in uip_buf and uip_appdata. + * + * The UDP checksum is the Internet checksum of data contents of the + * UDP segment, and a pseudo-header as defined in RFC768. + * + * \return The UDP checksum of the UDP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_udpchksum(void); + + +#endif /* __UIP_H__ */ + + +/** @} */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip_arch.h b/STM32F4/libraries/arduino_uip/utility/uip_arch.h new file mode 100644 index 0000000..71fd84b --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip_arch.h @@ -0,0 +1,138 @@ +/** + * \addtogroup uip + * {@ + */ + +/** + * \defgroup uiparch Architecture specific uIP functions + * @{ + * + * The functions in the architecture specific module implement the IP + * check sum and 32-bit additions. + * + * The IP checksum calculation is the most computationally expensive + * operation in the TCP/IP stack and it therefore pays off to + * implement this in efficient assembler. The purpose of the uip-arch + * module is to let the checksum functions to be implemented in + * architecture specific assembler. + * + */ + +/** + * \file + * Declarations of architecture specific functions. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arch.h,v 1.2 2006/06/07 09:15:19 adam Exp $ + * + */ + +#ifndef __UIP_ARCH_H__ +#define __UIP_ARCH_H__ + +#include "uip.h" + +/** + * Carry out a 32-bit addition. + * + * Because not all architectures for which uIP is intended has native + * 32-bit arithmetic, uIP uses an external C function for doing the + * required 32-bit additions in the TCP protocol processing. This + * function should add the two arguments and place the result in the + * global variable uip_acc32. + * + * \note The 32-bit integer pointed to by the op32 parameter and the + * result in the uip_acc32 variable are in network byte order (big + * endian). + * + * \param op32 A pointer to a 4-byte array representing a 32-bit + * integer in network byte order (big endian). + * + * \param op16 A 16-bit integer in host byte order. + */ +void uip_add32(u8_t *op32, u16_t op16); + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \note This function is not called in the current version of uIP, + * but future versions might make use of it. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \note The uip_appdata pointer that points to the packet data may + * point anywhere in memory, so it is not possible to simply calculate + * the Internet checksum of the contents of the uip_buf buffer. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +u16_t uip_udpchksum(void); + +/** @} */ +/** @} */ + +#endif /* __UIP_ARCH_H__ */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip_arp.c b/STM32F4/libraries/arduino_uip/utility/uip_arp.c new file mode 100644 index 0000000..44ca7c4 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip_arp.c @@ -0,0 +1,423 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uiparp uIP Address Resolution Protocol + * @{ + * + * The Address Resolution Protocol ARP is used for mapping between IP + * addresses and link level addresses such as the Ethernet MAC + * addresses. ARP uses broadcast queries to ask for the link level + * address of a known IP address and the host which is configured with + * the IP address for which the query was meant, will respond with its + * link level address. + * + * \note This ARP implementation only supports Ethernet. + */ + +/** + * \file + * Implementation of the ARP Address Resolution Protocol. + * \author Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.c,v 1.8 2006/06/02 23:36:21 adam Exp $ + * + */ + + +#include "uip_arp.h" + +#include + +struct arp_hdr { + struct uip_eth_hdr ethhdr; + u16_t hwtype; + u16_t protocol; + u8_t hwlen; + u8_t protolen; + u16_t opcode; + struct uip_eth_addr shwaddr; + u16_t sipaddr[2]; + struct uip_eth_addr dhwaddr; + u16_t dipaddr[2]; +}; + +struct ethip_hdr { + struct uip_eth_hdr ethhdr; + /* IP header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +}; + +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +#define ARP_HWTYPE_ETH 1 + +struct arp_entry { + u16_t ipaddr[2]; + struct uip_eth_addr ethaddr; + u8_t time; +}; + +static const struct uip_eth_addr broadcast_ethaddr = + {{0xff,0xff,0xff,0xff,0xff,0xff}}; +static const u16_t broadcast_ipaddr[2] = {0xffff,0xffff}; + +static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; +static u16_t ipaddr[2]; +static u8_t i, c; + +static u8_t arptime; +static u8_t tmpage; + +#define BUF ((struct arp_hdr *)&uip_buf[0]) +#define IPBUF ((struct ethip_hdr *)&uip_buf[0]) +/*-----------------------------------------------------------------------------------*/ +/** + * Initialize the ARP module. + * + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_init(void) +{ + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + memset(arp_table[i].ipaddr, 0, 4); + } +} +/*-----------------------------------------------------------------------------------*/ +/** + * Periodic ARP processing function. + * + * This function performs periodic timer processing in the ARP module + * and should be called at regular intervals. The recommended interval + * is 10 seconds between the calls. + * + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_timer(void) +{ + struct arp_entry *tabptr; + + ++arptime; + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && + arptime - tabptr->time >= UIP_ARP_MAXAGE) { + memset(tabptr->ipaddr, 0, 4); + } + } + +} +/*-----------------------------------------------------------------------------------*/ +static void +uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr) +{ + register struct arp_entry *tabptr; + /* Walk through the ARP mapping table and try to find an entry to + update. If none is found, the IP -> MAC address mapping is + inserted in the ARP table. */ + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + + tabptr = &arp_table[i]; + /* Only check those entries that are actually in use. */ + if(tabptr->ipaddr[0] != 0 && + tabptr->ipaddr[1] != 0) { + + /* Check if the source IP address of the incoming packet matches + the IP address in this ARP table entry. */ + if(ipaddr[0] == tabptr->ipaddr[0] && + ipaddr[1] == tabptr->ipaddr[1]) { + + /* An old entry found, update this and return. */ + memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); + tabptr->time = arptime; + + return; + } + } + } + + /* If we get here, no existing ARP table entry was found, so we + create one. */ + + /* First, we try to find an unused entry in the ARP table. */ + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if(tabptr->ipaddr[0] == 0 && + tabptr->ipaddr[1] == 0) { + break; + } + } + + /* If no unused entry is found, we try to find the oldest entry and + throw it away. */ + if(i == UIP_ARPTAB_SIZE) { + tmpage = 0; + c = 0; + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if(arptime - tabptr->time > tmpage) { + tmpage = arptime - tabptr->time; + c = i; + } + } + i = c; + tabptr = &arp_table[i]; + } + + /* Now, i is the ARP table entry which we will fill with the new + information. */ + memcpy(tabptr->ipaddr, ipaddr, 4); + memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); + tabptr->time = arptime; +} +/*-----------------------------------------------------------------------------------*/ +/** + * ARP processing for incoming IP packets + * + * This function should be called by the device driver when an IP + * packet has been received. The function will check if the address is + * in the ARP cache, and if so the ARP cache entry will be + * refreshed. If no ARP cache entry was found, a new one is created. + * + * This function expects an IP packet with a prepended Ethernet header + * in the uip_buf[] buffer, and the length of the packet in the global + * variable uip_len. + */ +/*-----------------------------------------------------------------------------------*/ +//#if 0 +void +uip_arp_ipin(void) +{ + uip_len -= sizeof(struct uip_eth_hdr); + + /* Only insert/update an entry if the source IP address of the + incoming IP packet comes from a host on the local network. */ + if((IPBUF->srcipaddr[0] & uip_netmask[0]) != + (uip_hostaddr[0] & uip_netmask[0])) { + return; + } + if((IPBUF->srcipaddr[1] & uip_netmask[1]) != + (uip_hostaddr[1] & uip_netmask[1])) { + return; + } + uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src)); + + return; +} +//#endif /* 0 */ +/*-----------------------------------------------------------------------------------*/ +/** + * ARP processing for incoming ARP packets. + * + * This function should be called by the device driver when an ARP + * packet has been received. The function will act differently + * depending on the ARP packet type: if it is a reply for a request + * that we previously sent out, the ARP cache will be filled in with + * the values from the ARP reply. If the incoming ARP packet is an ARP + * request for our IP address, an ARP reply packet is created and put + * into the uip_buf[] buffer. + * + * When the function returns, the value of the global variable uip_len + * indicates whether the device driver should send out a packet or + * not. If uip_len is zero, no packet should be sent. If uip_len is + * non-zero, it contains the length of the outbound packet that is + * present in the uip_buf[] buffer. + * + * This function expects an ARP packet with a prepended Ethernet + * header in the uip_buf[] buffer, and the length of the packet in the + * global variable uip_len. + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_arpin(void) +{ + + if(uip_len < sizeof(struct arp_hdr)) { + uip_len = 0; + return; + } + uip_len = 0; + + switch(BUF->opcode) { + case HTONS(ARP_REQUEST): + /* ARP request. If it asked for our address, we send out a + reply. */ + if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) { + /* First, we register the one who made the request in our ARP + table, since it is likely that we will do more communication + with this host in the future. */ + uip_arp_update(BUF->sipaddr, &BUF->shwaddr); + + /* The reply opcode is 2. */ + BUF->opcode = HTONS(2); + + memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6); + memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); + memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6); + + BUF->dipaddr[0] = BUF->sipaddr[0]; + BUF->dipaddr[1] = BUF->sipaddr[1]; + BUF->sipaddr[0] = uip_hostaddr[0]; + BUF->sipaddr[1] = uip_hostaddr[1]; + + BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); + uip_len = sizeof(struct arp_hdr); + } + break; + case HTONS(ARP_REPLY): + /* ARP reply. We insert or update the ARP table if it was meant + for us. */ + if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) { + uip_arp_update(BUF->sipaddr, &BUF->shwaddr); + } + break; + } + + return; +} +/*-----------------------------------------------------------------------------------*/ +/** + * Prepend Ethernet header to an outbound IP packet and see if we need + * to send out an ARP request. + * + * This function should be called before sending out an IP packet. The + * function checks the destination IP address of the IP packet to see + * what Ethernet MAC address that should be used as a destination MAC + * address on the Ethernet. + * + * If the destination IP address is in the local network (determined + * by logical ANDing of netmask and our IP address), the function + * checks the ARP cache to see if an entry for the destination IP + * address is found. If so, an Ethernet header is prepended and the + * function returns. If no ARP cache entry is found for the + * destination IP address, the packet in the uip_buf[] is replaced by + * an ARP request packet for the IP address. The IP packet is dropped + * and it is assumed that they higher level protocols (e.g., TCP) + * eventually will retransmit the dropped packet. + * + * If the destination IP address is not on the local network, the IP + * address of the default router is used instead. + * + * When the function returns, a packet is present in the uip_buf[] + * buffer, and the length of the packet is in the global variable + * uip_len. + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_out(void) +{ + struct arp_entry *tabptr; + + /* Find the destination IP address in the ARP table and construct + the Ethernet header. If the destination IP addres isn't on the + local network, we use the default router's IP address instead. + + If not ARP table entry is found, we overwrite the original IP + packet with an ARP request for the IP address. */ + + /* First check if destination is a local broadcast. */ + if(uip_ipaddr_cmp(IPBUF->destipaddr, broadcast_ipaddr)) { + memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6); + } else { + /* Check if the destination address is on the local network. */ + if(!uip_ipaddr_maskcmp(IPBUF->destipaddr, uip_hostaddr, uip_netmask)) { + /* Destination address was not on the local network, so we need to + use the default router's IP address instead of the destination + address when determining the MAC address. */ + uip_ipaddr_copy(ipaddr, uip_draddr); + } else { + /* Else, we use the destination IP address. */ + uip_ipaddr_copy(ipaddr, IPBUF->destipaddr); + } + + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if(uip_ipaddr_cmp(ipaddr, tabptr->ipaddr)) { + break; + } + } + + if(i == UIP_ARPTAB_SIZE) { + /* The destination address was not in our ARP table, so we + overwrite the IP packet with an ARP request. */ + + memset(BUF->ethhdr.dest.addr, 0xff, 6); + memset(BUF->dhwaddr.addr, 0x00, 6); + memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); + + uip_ipaddr_copy(BUF->dipaddr, ipaddr); + uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr); + BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */ + BUF->hwtype = HTONS(ARP_HWTYPE_ETH); + BUF->protocol = HTONS(UIP_ETHTYPE_IP); + BUF->hwlen = 6; + BUF->protolen = 4; + BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); + + uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN]; + + uip_len = sizeof(struct arp_hdr); + return; + } + + /* Build an ethernet header. */ + memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6); + } + memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + + IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP); + + uip_len += sizeof(struct uip_eth_hdr); +} +/*-----------------------------------------------------------------------------------*/ + +/** @} */ +/** @} */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip_arp.h b/STM32F4/libraries/arduino_uip/utility/uip_arp.h new file mode 100644 index 0000000..ef93054 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip_arp.h @@ -0,0 +1,144 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \addtogroup uiparp + * @{ + */ + +/** + * \file + * Macros and definitions for the ARP module. + * \author Adam Dunkels + */ + + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.h,v 1.5 2006/06/11 21:46:39 adam Exp $ + * + */ + +#ifndef __UIP_ARP_H__ +#define __UIP_ARP_H__ + +#include "uip.h" + + +extern struct uip_eth_addr uip_ethaddr; + +/** + * The Ethernet header. + */ +struct uip_eth_hdr { + struct uip_eth_addr dest; + struct uip_eth_addr src; + u16_t type; +}; + +#define UIP_ETHTYPE_ARP 0x0806 +#define UIP_ETHTYPE_IP 0x0800 +#define UIP_ETHTYPE_IP6 0x86dd + + +/* The uip_arp_init() function must be called before any of the other + ARP functions. */ +void uip_arp_init(void); + +/* The uip_arp_ipin() function should be called whenever an IP packet + arrives from the Ethernet. This function refreshes the ARP table or + inserts a new mapping if none exists. The function assumes that an + IP packet with an Ethernet header is present in the uip_buf buffer + and that the length of the packet is in the uip_len variable. */ +void uip_arp_ipin(void); +//#define uip_arp_ipin() + +/* The uip_arp_arpin() should be called when an ARP packet is received + by the Ethernet driver. This function also assumes that the + Ethernet frame is present in the uip_buf buffer. When the + uip_arp_arpin() function returns, the contents of the uip_buf + buffer should be sent out on the Ethernet if the uip_len variable + is > 0. */ +void uip_arp_arpin(void); + +/* The uip_arp_out() function should be called when an IP packet + should be sent out on the Ethernet. This function creates an + Ethernet header before the IP header in the uip_buf buffer. The + Ethernet header will have the correct Ethernet MAC destination + address filled in if an ARP table entry for the destination IP + address (or the IP address of the default router) is present. If no + such table entry is found, the IP packet is overwritten with an ARP + request and we rely on TCP to retransmit the packet that was + overwritten. In any case, the uip_len variable holds the length of + the Ethernet frame that should be transmitted. */ +void uip_arp_out(void); + +/* The uip_arp_timer() function should be called every ten seconds. It + is responsible for flushing old entries in the ARP table. */ +void uip_arp_timer(void); + +/** @} */ + +/** + * \addtogroup uipconffunc + * @{ + */ + + +/** + * Specifiy the Ethernet MAC address. + * + * The ARP code needs to know the MAC address of the Ethernet card in + * order to be able to respond to ARP queries and to generate working + * Ethernet headers. + * + * \note This macro only specifies the Ethernet MAC address to the ARP + * code. It cannot be used to change the MAC address of the Ethernet + * card. + * + * \param eaddr A pointer to a struct uip_eth_addr containing the + * Ethernet MAC address of the Ethernet card. + * + * \hideinitializer + */ +#define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \ + uip_ethaddr.addr[1] = eaddr.addr[1];\ + uip_ethaddr.addr[2] = eaddr.addr[2];\ + uip_ethaddr.addr[3] = eaddr.addr[3];\ + uip_ethaddr.addr[4] = eaddr.addr[4];\ + uip_ethaddr.addr[5] = eaddr.addr[5];} while(0) + +/** @} */ +/** @} */ + +#endif /* __UIP_ARP_H__ */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip_clock.h b/STM32F4/libraries/arduino_uip/utility/uip_clock.h new file mode 100644 index 0000000..6dd72be --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip_clock.h @@ -0,0 +1,88 @@ +/** + * \defgroup clock Clock interface + * + * The clock interface is the interface between the \ref timer "timer library" + * and the platform specific clock functionality. The clock + * interface must be implemented for each platform that uses the \ref + * timer "timer library". + * + * The clock interface does only one this: it measures time. The clock + * interface provides a macro, CLOCK_SECOND, which corresponds to one + * second of system time. + * + * \sa \ref timer "Timer library" + * + * @{ + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: clock.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __UIP_CLOCK_H__ +#define __UIP_CLOCK_H__ + +#include "clock-arch.h" + +/** + * Initialize the clock library. + * + * This function initializes the clock library and should be called + * from the main() function of the system. + * + */ +void uip_clock_init(void); + +/** + * Get the current clock time. + * + * This function returns the current system clock time. + * + * \return The current clock time, measured in system ticks. + */ +clock_time_t clock_time(void); + +/** + * A second, measured in system clock time. + * + * \hideinitializer + */ +#ifdef CLOCK_CONF_SECOND +#define CLOCK_SECOND CLOCK_CONF_SECOND +#else +#define CLOCK_SECOND (clock_time_t)32 +#endif + +#endif /* __CLOCK_H__ */ + +/** @} */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip_debug.cpp b/STM32F4/libraries/arduino_uip/utility/uip_debug.cpp new file mode 100644 index 0000000..444bd0e --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip_debug.cpp @@ -0,0 +1,170 @@ +#include +#include +#include +#include +extern "C" { + #import "utility/uip.h" +} + +struct uip_conn con[UIP_CONNS]; + +void +UIPDebug::uip_debug_printconns() +{ + for(uint8_t i=0;iripaddr,rhs->ripaddr)) + { + Serial.print(" ripaddr: "); + uip_debug_printbytes((const uint8_t *)lhs->ripaddr,4); + Serial.print(" -> "); + uip_debug_printbytes((const uint8_t *)rhs->ripaddr,4); + Serial.println(); + uip_ipaddr_copy(lhs->ripaddr,rhs->ripaddr); + changed = true; + } + if (lhs->lport != rhs->lport) + { + Serial.print(" lport: "); + Serial.print(htons(lhs->lport)); + Serial.print(" -> "); + Serial.println(htons(rhs->lport)); + lhs->lport = rhs->lport; + changed = true; + } + if (lhs->rport != rhs->rport) + { + Serial.print(" rport: "); + Serial.print(htons(lhs->rport)); + Serial.print(" -> "); + Serial.println(htons(rhs->rport)); + lhs->rport = rhs->rport; + changed = true; + } + if ((uint32_t)lhs->rcv_nxt[0] != (uint32_t)rhs->rcv_nxt[0]) + { + Serial.print(" rcv_nxt: "); + uip_debug_printbytes(lhs->rcv_nxt,4); + Serial.print(" -> "); + uip_debug_printbytes(rhs->rcv_nxt,4); + *((uint32_t *)&lhs->rcv_nxt[0]) = (uint32_t)rhs->rcv_nxt[0]; + Serial.println(); + changed = true; + } + if ((uint32_t)lhs->snd_nxt[0] != (uint32_t)rhs->snd_nxt[0]) + { + Serial.print(" snd_nxt: "); + uip_debug_printbytes(lhs->snd_nxt,4); + Serial.print(" -> "); + uip_debug_printbytes(rhs->snd_nxt,4); + *((uint32_t *)&lhs->snd_nxt[0]) = (uint32_t)rhs->snd_nxt[0]; + Serial.println(); + changed = true; + } + if (lhs->len != rhs->len) + { + Serial.print(" len: "); + Serial.print(lhs->len); + Serial.print(" -> "); + Serial.println(rhs->len); + lhs->len = rhs->len; + changed = true; + } + if (lhs->mss != rhs->mss) + { + Serial.print(" mss: "); + Serial.print(lhs->mss); + Serial.print(" -> "); + Serial.println(rhs->mss); + lhs->mss = rhs->mss; + changed = true; + } + if (lhs->initialmss != rhs->initialmss) + { + Serial.print(" initialmss: "); + Serial.print(lhs->initialmss); + Serial.print(" -> "); + Serial.println(rhs->initialmss); + lhs->initialmss = rhs->initialmss; + changed = true; + } + if (lhs->sa != rhs->sa) + { + Serial.print(" sa: "); + Serial.print(lhs->sa); + Serial.print(" -> "); + Serial.println(rhs->sa); + lhs->sa = rhs->sa; + changed = true; + } + if (lhs->sv != rhs->sv) + { + Serial.print(" sv: "); + Serial.print(lhs->sv); + Serial.print(" -> "); + Serial.println(rhs->sv); + lhs->sv = rhs->sv; + changed = true; + } + if (lhs->rto != rhs->rto) + { + Serial.print(" rto: "); + Serial.print(lhs->rto); + Serial.print(" -> "); + Serial.println(rhs->rto); + lhs->rto = rhs->rto; + changed = true; + } + if (lhs->tcpstateflags != rhs->tcpstateflags) + { + Serial.print(" tcpstateflags: "); + Serial.print(lhs->tcpstateflags); + Serial.print(" -> "); + Serial.println(rhs->tcpstateflags); + lhs->tcpstateflags = rhs->tcpstateflags; + changed = true; + } + if (lhs->timer != rhs->timer) + { + Serial.print(" timer: "); + Serial.print(lhs->timer); + Serial.print(" -> "); + Serial.println(rhs->timer); + lhs->timer = rhs->timer; + changed = true; + } + if (lhs->nrtx != rhs->nrtx) + { + Serial.print(" nrtx: "); + Serial.print(lhs->nrtx); + Serial.print(" -> "); + Serial.println(rhs->nrtx); + lhs->nrtx = rhs->nrtx; + changed = true; + } + return changed; +} + +void +UIPDebug::uip_debug_printbytes(const uint8_t *data, uint8_t len) +{ + for(uint8_t i=0;i + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +#include "uip_clock.h" +#include "uip_timer.h" + +/*---------------------------------------------------------------------------*/ +/** + * Set a timer. + * + * This function is used to set a timer for a time sometime in the + * future. The function timer_expired() will evaluate to true after + * the timer has expired. + * + * \param t A pointer to the timer + * \param interval The interval before the timer expires. + * + */ +void +uip_timer_set(struct uip_timer *t, clock_time_t interval) +{ + t->interval = interval; + t->start = clock_time(); +} +/*---------------------------------------------------------------------------*/ +/** + * Reset the timer with the same interval. + * + * This function resets the timer with the same interval that was + * given to the timer_set() function. The start point of the interval + * is the exact time that the timer last expired. Therefore, this + * function will cause the timer to be stable over time, unlike the + * timer_rester() function. + * + * \param t A pointer to the timer. + * + * \sa timer_restart() + */ +void +uip_timer_reset(struct uip_timer *t) +{ + t->start += t->interval; +} +/*---------------------------------------------------------------------------*/ +/** + * Restart the timer from the current point in time + * + * This function restarts a timer with the same interval that was + * given to the timer_set() function. The timer will start at the + * current time. + * + * \note A periodic timer will drift if this function is used to reset + * it. For preioric timers, use the timer_reset() function instead. + * + * \param t A pointer to the timer. + * + * \sa timer_reset() + */ +void +uip_timer_restart(struct uip_timer *t) +{ + t->start = clock_time(); +} +/*---------------------------------------------------------------------------*/ +/** + * Check if a timer has expired. + * + * This function tests if a timer has expired and returns true or + * false depending on its status. + * + * \param t A pointer to the timer + * + * \return Non-zero if the timer has expired, zero otherwise. + * + */ +int +uip_timer_expired(struct uip_timer *t) +{ + return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval; +} +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/STM32F4/libraries/arduino_uip/utility/uip_timer.h b/STM32F4/libraries/arduino_uip/utility/uip_timer.h new file mode 100644 index 0000000..f260349 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uip_timer.h @@ -0,0 +1,86 @@ +/** + * \defgroup timer Timer library + * + * The timer library provides functions for setting, resetting and + * restarting timers, and for checking if a timer has expired. An + * application must "manually" check if its timers have expired; this + * is not done automatically. + * + * A timer is declared as a \c struct \c timer and all access to the + * timer is made by a pointer to the declared timer. + * + * \note The timer library uses the \ref clock "Clock library" to + * measure time. Intervals should be specified in the format used by + * the clock library. + * + * @{ + */ + + +/** + * \file + * Timer library header file. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __UIP_TIMER_H__ +#define __UIP_TIMER_H__ + +#include "uip_clock.h" + +/** + * A timer. + * + * This structure is used for declaring a timer. The timer must be set + * with timer_set() before it can be used. + * + * \hideinitializer + */ +struct uip_timer { + clock_time_t start; + clock_time_t interval; +}; + +void uip_timer_set(struct uip_timer *t, clock_time_t interval); +void uip_timer_reset(struct uip_timer *t); +void uip_timer_restart(struct uip_timer *t); +int uip_timer_expired(struct uip_timer *t); + +#endif /* __UIP_TIMER_H__ */ + +/** @} */ diff --git a/STM32F4/libraries/arduino_uip/utility/uipethernet-conf.h b/STM32F4/libraries/arduino_uip/utility/uipethernet-conf.h new file mode 100644 index 0000000..9dd8b27 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uipethernet-conf.h @@ -0,0 +1,29 @@ +#ifndef UIPETHERNET_CONF_H +#define UIPETHERNET_CONF_H + +/* for TCP */ +#define UIP_SOCKET_NUMPACKETS 5 +#define UIP_CONF_MAX_CONNECTIONS 4 + +/* for UDP + * set UIP_CONF_UDP to 0 to disable UDP (saves aprox. 5kb flash) */ +#define UIP_CONF_UDP 1 +#define UIP_CONF_BROADCAST 1 +#define UIP_CONF_UDP_CONNS 4 + +/* number of attempts on write before returning number of bytes sent so far + * set to -1 to block until connection is closed by timeout */ +#define UIP_ATTEMPTS_ON_WRITE -1 + +/* timeout after which UIPClient::connect gives up. The timeout is specified in seconds. + * if set to a number <= 0 connect will timeout when uIP does (which might be longer than you expect...) */ +#define UIP_CONNECT_TIMEOUT -1 + +/* periodic timer for uip (in ms) */ +#define UIP_PERIODIC_TIMER 250 + +/* timer to poll client for data after last write (in ms) + * set to -1 to disable fast polling and rely on periodic only (saves 100 bytes flash) */ +#define UIP_CLIENT_TIMER 10 + +#endif diff --git a/STM32F4/libraries/arduino_uip/utility/uipopt.h b/STM32F4/libraries/arduino_uip/utility/uipopt.h new file mode 100644 index 0000000..42badf8 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/uipopt.h @@ -0,0 +1,543 @@ +/** + * \defgroup uipopt Configuration options for uIP + * @{ + * + * uIP is configured using the per-project configuration file + * uipopt.h. This file contains all compile-time options for uIP and + * should be tweaked to match each specific project. The uIP + * distribution contains a documented example "uipopt.h" that can be + * copied and modified for each project. + * + * \note Most of the configuration options in the uipopt.h should not + * be changed, but rather the per-project uip-conf.h file. + */ + +/** + * \file + * Configuration options for uIP. + * \author Adam Dunkels + * + * This file is used for tweaking various configuration options for + * uIP. You should make a copy of this file into one of your project's + * directories instead of editing this example "uipopt.h" file that + * comes with the uIP distribution. + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uipopt.h,v 1.4 2006/06/12 08:00:31 adam Exp $ + * + */ + +#ifndef __UIPOPT_H__ +#define __UIPOPT_H__ + +#ifndef UIP_LITTLE_ENDIAN +#define UIP_LITTLE_ENDIAN 3412 +#endif /* UIP_LITTLE_ENDIAN */ +#ifndef UIP_BIG_ENDIAN +#define UIP_BIG_ENDIAN 1234 +#endif /* UIP_BIG_ENDIAN */ + +#include "uip-conf.h" + +/*------------------------------------------------------------------------------*/ + +/** + * \name Static configuration options + * @{ + * + * These configuration options can be used for setting the IP address + * settings statically, but only if UIP_FIXEDADDR is set to 1. The + * configuration options for a specific node includes IP address, + * netmask and default router as well as the Ethernet address. The + * netmask, default router and Ethernet address are appliciable only + * if uIP should be run over Ethernet. + * + * All of these should be changed to suit your project. +*/ + +/** + * Determines if uIP should use a fixed IP address or not. + * + * If uIP should use a fixed IP address, the settings are set in the + * uipopt.h file. If not, the macros uip_sethostaddr(), + * uip_setdraddr() and uip_setnetmask() should be used instead. + * + * \hideinitializer + */ +#define UIP_FIXEDADDR 0 + +/** + * Ping IP address asignment. + * + * uIP uses a "ping" packets for setting its own IP address if this + * option is set. If so, uIP will start with an empty IP address and + * the destination IP address of the first incoming "ping" (ICMP echo) + * packet will be used for setting the hosts IP address. + * + * \note This works only if UIP_FIXEDADDR is 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_PINGADDRCONF +#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF +#else /* UIP_CONF_PINGADDRCONF */ +#define UIP_PINGADDRCONF 0 +#endif /* UIP_CONF_PINGADDRCONF */ + + +/** + * Specifies if the uIP ARP module should be compiled with a fixed + * Ethernet MAC address or not. + * + * If this configuration option is 0, the macro uip_setethaddr() can + * be used to specify the Ethernet address at run-time. + * + * \hideinitializer + */ +#define UIP_FIXEDETHADDR 0 + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name IP configuration options + * @{ + * + */ +/** + * The IP TTL (time to live) of IP packets sent by uIP. + * + * This should normally not be changed. + */ +#define UIP_TTL 64 + +/** + * Turn on support for IP packet reassembly. + * + * uIP supports reassembly of fragmented IP packets. This features + * requires an additonal amount of RAM to hold the reassembly buffer + * and the reassembly code size is approximately 700 bytes. The + * reassembly buffer is of the same size as the uip_buf buffer + * (configured by UIP_BUFSIZE). + * + * \note IP packet reassembly is not heavily tested. + * + * \hideinitializer + */ +#define UIP_REASSEMBLY 0 + +/** + * The maximum time an IP fragment should wait in the reassembly + * buffer before it is dropped. + * + */ +#define UIP_REASS_MAXAGE 40 + +/** @} */ + +/*------------------------------------------------------------------------------*/ +/** + * \name UDP configuration options + * @{ + */ + +/** + * Toggles wether UDP support should be compiled in or not. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP +#define UIP_UDP UIP_CONF_UDP +#else /* UIP_CONF_UDP */ +#define UIP_UDP 0 +#endif /* UIP_CONF_UDP */ + +/** + * Toggles if UDP checksums should be used or not. + * + * \note Support for UDP checksums is currently not included in uIP, + * so this option has no function. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CHECKSUMS +#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS +#else +#define UIP_UDP_CHECKSUMS 0 +#endif + +/** + * The maximum amount of concurrent UDP connections. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CONNS +#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS +#else /* UIP_CONF_UDP_CONNS */ +#define UIP_UDP_CONNS 10 +#endif /* UIP_CONF_UDP_CONNS */ + +/** + * The name of the function that should be called when UDP datagrams arrive. + * + * \hideinitializer + */ + + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name TCP configuration options + * @{ + */ + +/** + * Determines if support for opening connections from uIP should be + * compiled in. + * + * If the applications that are running on top of uIP for this project + * do not need to open outgoing TCP connections, this configration + * option can be turned off to reduce the code size of uIP. + * + * \hideinitializer + */ +#define UIP_ACTIVE_OPEN 1 + +/** + * The maximum number of simultaneously open TCP connections. + * + * Since the TCP connections are statically allocated, turning this + * configuration knob down results in less RAM used. Each TCP + * connection requires approximatly 30 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_CONNECTIONS +#define UIP_CONNS 10 +#else /* UIP_CONF_MAX_CONNECTIONS */ +#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS +#endif /* UIP_CONF_MAX_CONNECTIONS */ + + +/** + * The maximum number of simultaneously listening TCP ports. + * + * Each listening TCP port requires 2 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_LISTENPORTS +#define UIP_LISTENPORTS 20 +#else /* UIP_CONF_MAX_LISTENPORTS */ +#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS +#endif /* UIP_CONF_MAX_LISTENPORTS */ + +/** + * Determines if support for TCP urgent data notification should be + * compiled in. + * + * Urgent data (out-of-band data) is a rarely used TCP feature that + * very seldom would be required. + * + * \hideinitializer + */ +#define UIP_URGDATA 0 + +/** + * The initial retransmission timeout counted in timer pulses. + * + * This should not be changed. + */ +#define UIP_RTO 3 + +/** + * The maximum number of times a segment should be retransmitted + * before the connection should be aborted. + * + * This should not be changed. + */ +#define UIP_MAXRTX 8 + +/** + * The maximum number of times a SYN segment should be retransmitted + * before a connection request should be deemed to have been + * unsuccessful. + * + * This should not need to be changed. + */ +#define UIP_MAXSYNRTX 5 + +/** + * The TCP maximum segment size. + * + * This is should not be to set to more than + * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. + */ +#ifndef UIP_CONF_TCP_MSS +#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) +#else +#define UIP_TCP_MSS UIP_CONF_TCP_MSS +#endif + +/** + * The size of the advertised receiver's window. + * + * Should be set low (i.e., to the size of the uip_buf buffer) is the + * application is slow to process incoming data, or high (32768 bytes) + * if the application processes data quickly. + * + * \hideinitializer + */ +#ifndef UIP_CONF_RECEIVE_WINDOW +#define UIP_RECEIVE_WINDOW UIP_TCP_MSS +#else +#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW +#endif + +/** + * How long a connection should stay in the TIME_WAIT state. + * + * This configiration option has no real implication, and it should be + * left untouched. + */ +#define UIP_TIME_WAIT_TIMEOUT 120 + + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name ARP configuration options + * @{ + */ + +/** + * The size of the ARP table. + * + * This option should be set to a larger value if this uIP node will + * have many connections from the local network. + * + * \hideinitializer + */ +#ifdef UIP_CONF_ARPTAB_SIZE +#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE +#else +#define UIP_ARPTAB_SIZE 8 +#endif + +/** + * The maxium age of ARP table entries measured in 10ths of seconds. + * + * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD + * default). + */ +#define UIP_ARP_MAXAGE 120 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \name General configuration options + * @{ + */ + +/** + * The size of the uIP packet buffer. + * + * The uIP packet buffer should not be smaller than 60 bytes, and does + * not need to be larger than 1500 bytes. Lower size results in lower + * TCP throughput, larger size results in higher TCP throughput. + * + * \hideinitializer + */ +#ifndef UIP_CONF_BUFFER_SIZE +#define UIP_BUFSIZE 400 +#else /* UIP_CONF_BUFFER_SIZE */ +#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE +#endif /* UIP_CONF_BUFFER_SIZE */ + + +/** + * Determines if statistics support should be compiled in. + * + * The statistics is useful for debugging and to show the user. + * + * \hideinitializer + */ +#ifndef UIP_CONF_STATISTICS +#define UIP_STATISTICS 0 +#else /* UIP_CONF_STATISTICS */ +#define UIP_STATISTICS UIP_CONF_STATISTICS +#endif /* UIP_CONF_STATISTICS */ + +/** + * Determines if logging of certain events should be compiled in. + * + * This is useful mostly for debugging. The function uip_log() + * must be implemented to suit the architecture of the project, if + * logging is turned on. + * + * \hideinitializer + */ +#ifndef UIP_CONF_LOGGING +#define UIP_LOGGING 0 +#else /* UIP_CONF_LOGGING */ +#define UIP_LOGGING UIP_CONF_LOGGING +#endif /* UIP_CONF_LOGGING */ + +/** + * Broadcast support. + * + * This flag configures IP broadcast support. This is useful only + * together with UDP. + * + * \hideinitializer + * + */ +#if UIP_UDP && UIP_CONF_BROADCAST +#define UIP_BROADCAST UIP_CONF_BROADCAST +#else /* UIP_CONF_BROADCAST */ +#define UIP_BROADCAST 0 +#endif /* UIP_CONF_BROADCAST */ + +/** + * Print out a uIP log message. + * + * This function must be implemented by the module that uses uIP, and + * is called by uIP whenever a log message is generated. + */ +void uip_log(char *msg); + +/** + * The link level header length. + * + * This is the offset into the uip_buf where the IP header can be + * found. For Ethernet, this should be set to 14. For SLIP, this + * should be set to 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_LLH_LEN +#define UIP_LLH_LEN UIP_CONF_LLH_LEN +#else /* UIP_CONF_LLH_LEN */ +#define UIP_LLH_LEN 14 +#endif /* UIP_CONF_LLH_LEN */ + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name CPU architecture configuration + * @{ + * + * The CPU architecture configuration is where the endianess of the + * CPU on which uIP is to be run is specified. Most CPUs today are + * little endian, and the most notable exception are the Motorolas + * which are big endian. The BYTE_ORDER macro should be changed to + * reflect the CPU architecture on which uIP is to be run. + */ + +/** + * The byte order of the CPU architecture on which uIP is to be run. + * + * This option can be either BIG_ENDIAN (Motorola byte order) or + * LITTLE_ENDIAN (Intel byte order). + * + * \hideinitializer + */ +#ifdef UIP_CONF_BYTE_ORDER +#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER +#else /* UIP_CONF_BYTE_ORDER */ +#define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN +#endif /* UIP_CONF_BYTE_ORDER */ + +/** @} */ +/*------------------------------------------------------------------------------*/ + +/** + * \name Appication specific configurations + * @{ + * + * An uIP application is implemented using a single application + * function that is called by uIP whenever a TCP/IP event occurs. The + * name of this function must be registered with uIP at compile time + * using the UIP_APPCALL definition. + * + * uIP applications can store the application state within the + * uip_conn structure by specifying the type of the application + * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. + * + * The file containing the definitions must be included in the + * uipopt.h file. + * + * The following example illustrates how this can look. + \code + +void httpd_appcall(void); +#define UIP_APPCALL httpd_appcall + +struct httpd_state { + u8_t state; + u16_t count; + char *dataptr; + char *script; +}; +typedef struct httpd_state uip_tcp_appstate_t + \endcode + */ + +/** + * \var #define UIP_APPCALL + * + * The name of the application function that uIP should call in + * response to TCP/IP events. + * + */ + +/** + * \var typedef uip_tcp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ + +/** + * \var typedef uip_udp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ +/** @} */ +/** @} */ + +#endif /* __UIPOPT_H__ */ diff --git a/STM32F4/libraries/arduino_uip/utility/util.h b/STM32F4/libraries/arduino_uip/utility/util.h new file mode 100644 index 0000000..5042e82 --- /dev/null +++ b/STM32F4/libraries/arduino_uip/utility/util.h @@ -0,0 +1,13 @@ +#ifndef UTIL_H +#define UTIL_H + +#define htons(x) ( ((x)<<8) | (((x)>>8)&0xFF) ) +#define ntohs(x) htons(x) + +#define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \ + ((x)<< 8 & 0x00FF0000UL) | \ + ((x)>> 8 & 0x0000FF00UL) | \ + ((x)>>24 & 0x000000FFUL) ) +#define ntohl(x) htonl(x) + +#endif diff --git a/STM32F4/variants/discovery_f407/discovery_f4.cpp b/STM32F4/variants/discovery_f407/discovery_f4.cpp index c508fa3..6f1b453 100644 --- a/STM32F4/variants/discovery_f407/discovery_f4.cpp +++ b/STM32F4/variants/discovery_f407/discovery_f4.cpp @@ -61,9 +61,19 @@ void boardInit(void) { gpio_set_af_mode(GPIOB, 0, 2); gpio_set_af_mode(GPIOB, 1, 2); - //gpio_set_af_mode(GPIOA, 2, 7); //gpio_set_af_mode(GPIOA, 3, 7); + +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS + // PA8 Output the Master Clock MCO1 + gpio_set_af_mode(GPIOA, 8, 0); + // PB4 as alternate MISO Input + gpio_set_af_mode(GPIOB, 4, 5); + // PA5 as alternate SCK Output + gpio_set_af_mode(GPIOA, 5, 5); + // PA7 as alternate MOSI Output + gpio_set_af_mode(GPIOA, 7, 5); +#endif return; } diff --git a/STM32F4/variants/discovery_f407/discovery_f4.h b/STM32F4/variants/discovery_f407/discovery_f4.h index c1f2384..d7bb679 100644 --- a/STM32F4/variants/discovery_f407/discovery_f4.h +++ b/STM32F4/variants/discovery_f407/discovery_f4.h @@ -63,9 +63,17 @@ #define BOARD_UART5_RX_PIN Port2Pin('D', 2) #define BOARD_NR_SPI 3 +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS +#define BOARD_SPI1_NSS_PIN Port2Pin('C', 8) +#else #define BOARD_SPI1_NSS_PIN Port2Pin('A', 4) +#endif #define BOARD_SPI1_MOSI_PIN Port2Pin('A', 7) +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS +#define BOARD_SPI1_MISO_PIN Port2Pin('B', 4) +#else #define BOARD_SPI1_MISO_PIN Port2Pin('A', 6) +#endif #define BOARD_SPI1_SCK_PIN Port2Pin('A', 5) #define BOARD_SPI2_NSS_PIN Port2Pin('B',12) #define BOARD_SPI2_MOSI_PIN Port2Pin('B',15) @@ -76,7 +84,11 @@ #define BOARD_SPI3_MISO_PIN Port2Pin('B', 4) #define BOARD_SPI3_SCK_PIN Port2Pin('B', 3) +#ifdef ARDUINO_STM32F4_NETDUINO2PLUS +#define BOARD_SPI3B_NSS_PIN Port2Pin('B', 0) +#else #define BOARD_SPI3B_NSS_PIN Port2Pin('B', 8) +#endif #define BOARD_SPI3B_MOSI_PIN Port2Pin('C',12) #define BOARD_SPI3B_MISO_PIN Port2Pin('C',11) #define BOARD_SPI3B_SCK_PIN Port2Pin('C',10) From 70403109c50c495b41686bb55f504448056c5962 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Fri, 3 Jul 2015 21:31:50 +1000 Subject: [PATCH 08/28] Updated Linux install script so that it also adds the current user to the dialout group. Also removed duplicate copy of the Linux install script from drivers/linux --- drivers/linux/45-maple.rules | 5 ----- drivers/linux/install-udev-rules.sh | 13 ------------- tools/linux/install-udev-rules.sh | 10 ---------- 3 files changed, 28 deletions(-) delete mode 100644 drivers/linux/45-maple.rules delete mode 100755 drivers/linux/install-udev-rules.sh delete mode 100755 tools/linux/install-udev-rules.sh diff --git a/drivers/linux/45-maple.rules b/drivers/linux/45-maple.rules deleted file mode 100644 index d1bda5f..0000000 --- a/drivers/linux/45-maple.rules +++ /dev/null @@ -1,5 +0,0 @@ -ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" -ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" -ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" -ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" - diff --git a/drivers/linux/install-udev-rules.sh b/drivers/linux/install-udev-rules.sh deleted file mode 100755 index db4c45a..0000000 --- a/drivers/linux/install-udev-rules.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -if sudo [ -w /etc/udev/rules.d ]; then - echo "Copying Maple-specific udev rules..." - sudo cp -v 45-maple.rules /etc/udev/rules.d/45-maple.rules - sudo chown root:root /etc/udev/rules.d/45-maple.rules - sudo chmod 644 /etc/udev/rules.d/45-maple.rules - echo "Reloading udev rules" - sudo udevadm control --reload-rules -else - echo "Couldn't copy to /etc/udev/rules.d/; you probably have to run this script as root? Or your distribution of Linux doesn't include udev; try running the IDE itself as root." -fi - diff --git a/tools/linux/install-udev-rules.sh b/tools/linux/install-udev-rules.sh deleted file mode 100755 index df4a06d..0000000 --- a/tools/linux/install-udev-rules.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -if sudo [ -w /etc/udev/rules.d ]; then - echo "Copying Maple-specific udev rules..." - sudo cp -v 45-maple.rules /etc/udev/rules.d/45-maple.rules - sudo chown root:root /etc/udev/rules.d/45-maple.rules - sudo chmod 644 /etc/udev/rules.d/45-maple.rules -else - echo "Couldn't copy to /etc/udev/rules.d/; you probably have to run this script as root? Or your distribution of Linux doesn't include udev; try running the IDE itself as root." -fi From 8c327aca05d7bfac4835466084b217e8edc60029 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sat, 4 Jul 2015 10:15:44 +1000 Subject: [PATCH 09/28] Added OSX DFU binaries and changed the OSX maple-upload script to use them. (This saves users having to install dfu-util themselves, e.g. via Homebrew --- tools/macosx/dfu-util/dfu-prefix | Bin 0 -> 22756 bytes tools/macosx/dfu-util/dfu-suffix | Bin 0 -> 22756 bytes tools/macosx/dfu-util/dfu-util | Bin 0 -> 48052 bytes tools/macosx/maple_upload | 3 ++- 4 files changed, 2 insertions(+), 1 deletion(-) create mode 100755 tools/macosx/dfu-util/dfu-prefix create mode 100755 tools/macosx/dfu-util/dfu-suffix create mode 100755 tools/macosx/dfu-util/dfu-util diff --git a/tools/macosx/dfu-util/dfu-prefix b/tools/macosx/dfu-util/dfu-prefix new file mode 100755 index 0000000000000000000000000000000000000000..5cbb2354ad3f8aa36c2a826ffb09c2b33e69caa2 GIT binary patch literal 22756 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 E1aYHwl>h($ literal 0 HcmV?d00001 diff --git a/tools/macosx/dfu-util/dfu-suffix b/tools/macosx/dfu-util/dfu-suffix new file mode 100755 index 0000000000000000000000000000000000000000..d10eb1026fda012691839b52fc685429c6fafa1a GIT binary patch literal 22756 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 literal 0 HcmV?d00001 diff --git a/tools/macosx/maple_upload b/tools/macosx/maple_upload index 50d849d..e198adb 100755 --- a/tools/macosx/maple_upload +++ b/tools/macosx/maple_upload @@ -39,7 +39,8 @@ else dfuse_addr="" fi -DFU_UTIL=/usr/local/bin/dfu-util +#DFU_UTIL=/usr/local/bin/dfu-util +DFU_UTIL=${DIR}/dfu-util/dfu-util if [ ! -x ${DFU_UTIL} ]; then DFU_UTIL=/opt/local/bin/dfu-util fi From 25e81d7cf1ca92af770ae315999921a00de38304 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Fri, 3 Jul 2015 23:04:22 -0400 Subject: [PATCH 10/28] fix DNS issue caused by HTON macro weirdness on 32bits + fix inet_aton() --- STM32F4/libraries/arduino_uip/Dns.cpp | 3 +-- STM32F4/libraries/arduino_uip/utility/util.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/STM32F4/libraries/arduino_uip/Dns.cpp b/STM32F4/libraries/arduino_uip/Dns.cpp index 2b97fb7..d6d31bd 100644 --- a/STM32F4/libraries/arduino_uip/Dns.cpp +++ b/STM32F4/libraries/arduino_uip/Dns.cpp @@ -58,8 +58,7 @@ int DNSClient::inet_aton(const char* aIPAddrString, IPAddress& aResult) { // See if we've been given a valid IP address const char* p =aIPAddrString; - while (*p && - ( (*p == '.') || (*p >= '0') || (*p <= '9') )) + while (*p && ( (*p == '.') || ((*p >= '0') && (*p <= '9')) )) { p++; } diff --git a/STM32F4/libraries/arduino_uip/utility/util.h b/STM32F4/libraries/arduino_uip/utility/util.h index 5042e82..06f3cee 100644 --- a/STM32F4/libraries/arduino_uip/utility/util.h +++ b/STM32F4/libraries/arduino_uip/utility/util.h @@ -1,7 +1,7 @@ #ifndef UTIL_H #define UTIL_H -#define htons(x) ( ((x)<<8) | (((x)>>8)&0xFF) ) +#define htons(x) ( ((x)<< 8 & 0xFF00) | ((x)>> 8 & 0x00FF) ) #define ntohs(x) htons(x) #define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \ From 1d7a0bc21be0df9e3d8feeaee2bfa5b28f4f7b08 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 5 Jul 2015 03:08:34 +1000 Subject: [PATCH 11/28] Fix issue with default SPI pin definitions in wirish.h being incorrect (as they were the pin definitions for AVR boards). wirish.h now uses the pin definitions defined in board.h for whatever variant is selected --- STM32F1/cores/maple/wirish.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/STM32F1/cores/maple/wirish.h b/STM32F1/cores/maple/wirish.h index c074528..a8264f2 100644 --- a/STM32F1/cores/maple/wirish.h +++ b/STM32F1/cores/maple/wirish.h @@ -74,11 +74,12 @@ #include -#warning these are just here to get SPI to compile they need to be changed and moved! -#define SS (1) -#define MOSI 2 -#define MISO 3 -#define SCK 4 + +#define SS BOARD_SPI1_NSS_PIN +#define MOSI BOARD_SPI1_MOSI_PIN +#define MISO BOARD_SPI1_MISO_PIN +#define SCK BOARD_SPI1_SCK_PIN + typedef unsigned int word; // typedef uint16 word;// definition from Arduino website, now appears to be incorrect for 32 bit devices From 3d51e8c5305ebe8f3bc532beb1ccf8ca4cdd68bf Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 5 Jul 2015 11:06:32 +1000 Subject: [PATCH 12/28] Tidied up names of Maple boards in boards.txt menu names --- STM32F1/boards.txt | 6 +++--- STM32F1/platform.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 59e476e..77ff7ba 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -6,7 +6,7 @@ menu.bootloader_version=Bootloader version menu.upload_method=Upload method ############################################################## -mapleMini.name=LeafLabs Maple Mini Rev 2 to Flash +mapleMini.name=Maple Mini mapleMini.build.board=MAPLE_MINI mapleMini.build.core=maple @@ -37,7 +37,7 @@ mapleMini.menu.bootloader_version.bootloader20.upload.maximum_size=122880 mapleMini.menu.bootloader_version.bootloader20.upload.altID=2 ############################################################## -maple.name=LeafLabs Maple Rev 3+ to Flash +maple.name=Maple (Rev 3) maple.upload.tool=maple_upload maple.upload.protocol=maple_dfu @@ -60,7 +60,7 @@ maple.build.vect=VECT_TAB_ADDR=0x8005000 ############################################################## -mapleRET6.name=LeafLabs Maple RET6 to Flash +mapleRET6.name=Maple (RET6) mapleRET6.build.board=MAPLE_RET6 mapleRET6.build.core=maple diff --git a/STM32F1/platform.txt b/STM32F1/platform.txt index f9979c9..e9c518c 100644 --- a/STM32F1/platform.txt +++ b/STM32F1/platform.txt @@ -3,7 +3,7 @@ # For more info: # https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification -name=STM32 Boards (stm32duino) +name=STM32 Boards (STM32duino.com) version=0.1.2 compiler.warning_flags=-w -DDEBUG_LEVEL=DEBUG_NONE From 6d18be66adccefea654060afa1fc46c7f468813e Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Sun, 5 Jul 2015 22:38:47 +1000 Subject: [PATCH 13/28] Move Timer ISR handlers from timer_f1.c to timer.c to resolve linker issue in which some ISR's were not being linked even though they were being used --- STM32F1/cores/maple/libmaple/timer.c | 100 ++++++++++++++++++++++++ STM32F1/cores/maple/libmaple/timer_f1.c | 95 ++-------------------- 2 files changed, 106 insertions(+), 89 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/timer.c b/STM32F1/cores/maple/libmaple/timer.c index 3eb3bbd..3c01474 100644 --- a/STM32F1/cores/maple/libmaple/timer.c +++ b/STM32F1/cores/maple/libmaple/timer.c @@ -1,3 +1,4 @@ + /****************************************************************************** * The MIT License * @@ -410,3 +411,102 @@ static void enable_bas_gen_irq(timer_dev *dev) { } nvic_irq_enable(irq_num); } + + +/* Note. + * + * 2015/07/06 Roger Clark + * + * The IRQ handlers were initially in timer_f1.c however this seems to cause problems + * in which the compiler / linker doesn't always link all the required handlers. + * The work around was to move the handlers into this file + */ + +/* + * IRQ handlers + * + * Defer to the timer_private dispatch API. + * + * FIXME: The names of these handlers are inaccurate since XL-density + * devices came out. Update these to match the STM32F2 names, maybe + * using some weak symbol magic to preserve backwards compatibility if + * possible. Once that's done, we can just move the IRQ handlers into + * the top-level libmaple/timer.c, and there will be no need for this + * file. + */ + +void __irq_tim1_brk(void) { + dispatch_adv_brk(TIMER1); +#if STM32_HAVE_TIMER(9) + dispatch_tim_9_12(TIMER9); +#endif +} + +void __irq_tim1_up(void) { + dispatch_adv_up(TIMER1); +#if STM32_HAVE_TIMER(10) + dispatch_tim_10_11_13_14(TIMER10); +#endif +} + +void __irq_tim1_trg_com(void) { + dispatch_adv_trg_com(TIMER1); +#if STM32_HAVE_TIMER(11) + dispatch_tim_10_11_13_14(TIMER11); +#endif +} + +void __irq_tim1_cc(void) { + dispatch_adv_cc(TIMER1); +} + +void __irq_tim2(void) { + dispatch_general(TIMER2); +} + +void __irq_tim3(void) { + dispatch_general(TIMER3); +} + +void __irq_tim4(void) { + dispatch_general(TIMER4); +} + +#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) +void __irq_tim5(void) { + dispatch_general(TIMER5); +} + +void __irq_tim6(void) { + dispatch_basic(TIMER6); +} + +void __irq_tim7(void) { + dispatch_basic(TIMER7); +} + +void __irq_tim8_brk(void) { + dispatch_adv_brk(TIMER8); +#if STM32_HAVE_TIMER(12) + dispatch_tim_9_12(TIMER12); +#endif +} + +void __irq_tim8_up(void) { + dispatch_adv_up(TIMER8); +#if STM32_HAVE_TIMER(13) + dispatch_tim_10_11_13_14(TIMER13); +#endif +} + +void __irq_tim8_trg_com(void) { + dispatch_adv_trg_com(TIMER8); +#if STM32_HAVE_TIMER(14) + dispatch_tim_10_11_13_14(TIMER14); +#endif +} + +void __irq_tim8_cc(void) { + dispatch_adv_cc(TIMER8); +} +#endif /* defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) */ \ No newline at end of file diff --git a/STM32F1/cores/maple/libmaple/timer_f1.c b/STM32F1/cores/maple/libmaple/timer_f1.c index 8b9e976..d67cf3f 100644 --- a/STM32F1/cores/maple/libmaple/timer_f1.c +++ b/STM32F1/cores/maple/libmaple/timer_f1.c @@ -30,95 +30,12 @@ * @brief STM32F1 timer. */ -#include -#include -#include "timer_private.h" - /* - * IRQ handlers - * - * Defer to the timer_private dispatch API. - * - * FIXME: The names of these handlers are inaccurate since XL-density - * devices came out. Update these to match the STM32F2 names, maybe - * using some weak symbol magic to preserve backwards compatibility if - * possible. Once that's done, we can just move the IRQ handlers into - * the top-level libmaple/timer.c, and there will be no need for this - * file. + * 2015/07/06 + * Note. The IRQ handlers which were initially in this file have been moved to timer.c + * to resolve a linker issue in where some IRQ handlers were not being linked even though + * they were being used. + * This file has been retains for historical reasons, but can be moved at some time in the future + * when full testing of the code in the new location has been completed. */ -void __irq_tim1_brk(void) { - dispatch_adv_brk(TIMER1); -#if STM32_HAVE_TIMER(9) - dispatch_tim_9_12(TIMER9); -#endif -} - -void __irq_tim1_up(void) { - dispatch_adv_up(TIMER1); -#if STM32_HAVE_TIMER(10) - dispatch_tim_10_11_13_14(TIMER10); -#endif -} - -void __irq_tim1_trg_com(void) { - dispatch_adv_trg_com(TIMER1); -#if STM32_HAVE_TIMER(11) - dispatch_tim_10_11_13_14(TIMER11); -#endif -} - -void __irq_tim1_cc(void) { - dispatch_adv_cc(TIMER1); -} - -void __irq_tim2(void) { - dispatch_general(TIMER2); -} - -void __irq_tim3(void) { - dispatch_general(TIMER3); -} - -void __irq_tim4(void) { - dispatch_general(TIMER4); -} - -#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) -void __irq_tim5(void) { - dispatch_general(TIMER5); -} - -void __irq_tim6(void) { - dispatch_basic(TIMER6); -} - -void __irq_tim7(void) { - dispatch_basic(TIMER7); -} - -void __irq_tim8_brk(void) { - dispatch_adv_brk(TIMER8); -#if STM32_HAVE_TIMER(12) - dispatch_tim_9_12(TIMER12); -#endif -} - -void __irq_tim8_up(void) { - dispatch_adv_up(TIMER8); -#if STM32_HAVE_TIMER(13) - dispatch_tim_10_11_13_14(TIMER13); -#endif -} - -void __irq_tim8_trg_com(void) { - dispatch_adv_trg_com(TIMER8); -#if STM32_HAVE_TIMER(14) - dispatch_tim_10_11_13_14(TIMER14); -#endif -} - -void __irq_tim8_cc(void) { - dispatch_adv_cc(TIMER8); -} -#endif /* defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) */ From d5dbdb685cd21518a98eba4dd131f25adda25e83 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Sun, 5 Jul 2015 10:15:33 -0400 Subject: [PATCH 14/28] fix HardwareSerial::begin by doing gpio_set_af_mode AF8 when devices are UART4 or UART5 --- STM32F4/cores/maple/libmaple/HardwareSerial.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp index a156770..f6fdcbb 100644 --- a/STM32F4/cores/maple/libmaple/HardwareSerial.cpp +++ b/STM32F4/cores/maple/libmaple/HardwareSerial.cpp @@ -94,8 +94,14 @@ void HardwareSerial::begin(uint32 baud) { const stm32_pin_info *rxi = &PIN_MAP[rx_pin]; #ifdef STM32F2 // int af = 7<<8; - gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 7); - gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 7); + if (usart_device == UART4 || usart_device == UART5) { + gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 8); + gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 8); + } + else { + gpio_set_af_mode(txi->gpio_device, txi->gpio_bit, 7); + gpio_set_af_mode(rxi->gpio_device, rxi->gpio_bit, 7); + } gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_AF_OUTPUT_PP | GPIO_PUPD_INPUT_PU | 0x700)); gpio_set_mode(rxi->gpio_device, rxi->gpio_bit, (gpio_pin_mode)(GPIO_MODE_AF | GPIO_PUPD_INPUT_PU | 0x700)); //gpio_set_mode(txi->gpio_device, txi->gpio_bit, (gpio_pin_mode)(GPIO_PUPD_INPUT_PU)); From 09fbe056625f1d015ff434474187fca8b6c0cc48 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Sun, 5 Jul 2015 17:13:01 -0400 Subject: [PATCH 15/28] fix Debugging print when different SPI is used --- STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp b/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp index 557e5a0..1b6b189 100644 --- a/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp +++ b/STM32F4/libraries/arduino_uip/utility/Enc28J60Network.cpp @@ -74,13 +74,13 @@ void Enc28J60Network::init(uint8_t* macaddr) #ifdef ENC28J60DEBUG Serial.println("ENC28J60::initialize / after initSPI()"); Serial.print("ENC28J60::initialize / csPin = "); - Serial.println(ENC28J60_CONTROL_CS); + Serial.println(SPI.nssPin()); Serial.print("ENC28J60::initialize / miso = "); - Serial.println(BOARD_SPI1_MISO_PIN); + Serial.println(SPI.misoPin()); Serial.print("ENC28J60::initialize / mosi = "); - Serial.println(BOARD_SPI1_MOSI_PIN); + Serial.println(SPI.mosiPin()); Serial.print("ENC28J60::initialize / sck = "); - Serial.println(BOARD_SPI1_SCK_PIN); + Serial.println(SPI.sckPin()); #endif selectPin = ENC28J60_CONTROL_CS; pinMode(selectPin, OUTPUT); From 58a5799ace056f78fb007413be3bb9cc11b5e1e0 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 6 Jul 2015 09:23:01 +1000 Subject: [PATCH 16/28] Added linux install file missing after previous name change to this file --- tools/linux/install.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100755 tools/linux/install.sh diff --git a/tools/linux/install.sh b/tools/linux/install.sh new file mode 100755 index 0000000..32870a1 --- /dev/null +++ b/tools/linux/install.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +if sudo [ -w /etc/udev/rules.d ]; then + echo "Copying Maple-specific udev rules..." + sudo cp -v 45-maple.rules /etc/udev/rules.d/45-maple.rules + sudo chown root:root /etc/udev/rules.d/45-maple.rules + sudo chmod 644 /etc/udev/rules.d/45-maple.rules + echo "Reloading udev rules" + sudo udevadm control --reload-rules + echo "Adding current user to dialout group" + sudo adduser $USER dialout +else + echo "Couldn't copy to /etc/udev/rules.d/; you probably have to run this script as root? Or your distribution of Linux doesn't include udev; try running the IDE itself as root." +fi + From 2e13a1d57eb2b40e949e2fbbf7c769ad4c2a9ac1 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 7 Jul 2015 07:27:09 +1000 Subject: [PATCH 17/28] Initial attempt at SPI setModule - but it doesn't seem to work for SPI2 etc, even when not using setModule to select the SPI channel, when I tested with a VS1053 board attached to SPI2 and SD on SPI1 --- STM32F1/libraries/SPI/src/SPI.cpp | 143 +++++++++++++----------------- STM32F1/libraries/SPI/src/SPI.h | 15 +++- 2 files changed, 74 insertions(+), 84 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index c394c8a..ef07963 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -91,30 +91,29 @@ static const spi_pins board_spi_pins[] __FLASH__ = { */ SPIClass::SPIClass(uint32 spi_num) { + + _currentSetting=&_settings[spi_num]; switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: - this->spi_d = SPI1; + _currentSetting->spi_d = SPI1; break; #endif #if BOARD_NR_SPI >= 2 case 2: - this->spi_d = SPI2; + _currentSetting->spi_d = SPI2; break; #endif #if BOARD_NR_SPI >= 3 case 3: - this->spi_d = SPI3; + _currentSetting->spi_d = SPI3; break; #endif default: ASSERT(0); } - - bitOrder=MSBFIRST; -//pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); - + //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); } /* @@ -123,45 +122,45 @@ SPIClass::SPIClass(uint32 spi_num) { void SPIClass::begin(void) { - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS); - spi_init(spi_d); - configure_gpios(spi_d, 1); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS); + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 1); #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(clockDivider); Serial.print(","); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_master_enable("); Serial.print(_currentSetting->clock); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_master_enable(spi_d, (spi_baud_rate)clockDivider, (spi_mode)dataMode, flags); + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clock, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::beginSlave(void) { - if (dataMode >= 4) { + if (_currentSetting->dataMode >= 4) { ASSERT(0); return; } - uint32 flags = ((bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE); - spi_init(spi_d); - configure_gpios(spi_d, 0); + uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE); + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 0); #ifdef SPI_DEBUG - Serial.print("spi_slave_enable("); Serial.print(dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_slave_enable(spi_d, (spi_mode)dataMode, flags); + spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::end(void) { - if (!spi_is_enabled(this->spi_d)) { + if (!spi_is_enabled(_currentSetting->spi_d)) { return; } // Follows RM0008's sequence for disabling a SPI in master/slave // full duplex mode. - while (spi_is_rx_nonempty(this->spi_d)) { + while (spi_is_rx_nonempty(_currentSetting->spi_d)) { // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16 rx __attribute__((unused)) = spi_rx_reg(this->spi_d); + volatile uint16 rx __attribute__((unused)) = spi_rx_reg(_currentSetting->spi_d); } - while (!spi_is_tx_empty(this->spi_d)) + while (!spi_is_tx_empty(_currentSetting->spi_d)) ; - while (spi_is_busy(this->spi_d)) + while (spi_is_busy(_currentSetting->spi_d)) ; - spi_peripheral_disable(this->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); } /* Roger Clark added 3 functions */ @@ -170,7 +169,7 @@ void SPIClass::setClockDivider(uint32_t clockDivider) #ifdef SPI_DEBUG Serial.print("Clock divider set to "); Serial.println(clockDivider); #endif - this->clockDivider = clockDivider; + _currentSetting->clock = clockDivider; this->begin(); } @@ -179,7 +178,7 @@ void SPIClass::setBitOrder(BitOrder bitOrder) #ifdef SPI_DEBUG Serial.print("Bit order set to "); Serial.println(bitOrder); #endif - this->bitOrder = bitOrder; + _currentSetting->bitOrder = bitOrder; this->begin(); } @@ -189,11 +188,11 @@ void SPIClass::setBitOrder(BitOrder bitOrder) */ void SPIClass::setDataSize(uint32 datasize) { - uint32 cr1 = this->spi_d->regs->CR1; + uint32 cr1 = _currentSetting->spi_d->regs->CR1; datasize &= SPI_CR1_DFF; cr1 &= ~(SPI_CR1_DFF); cr1 |= datasize; - this->spi_d->regs->CR1 = cr1; + _currentSetting->spi_d->regs->CR1 = cr1; } void SPIClass::setDataMode(uint8_t dataMode) @@ -228,7 +227,7 @@ If someone finds this is not the case or sees a logic error with this let me kno #ifdef SPI_DEBUG Serial.print("Data mode set to "); Serial.println(dataMode); #endif - this->dataMode = dataMode; + _currentSetting->dataMode = dataMode; this->begin(); } @@ -243,29 +242,9 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings) //digitalWrite(_SSPin,LOW); setBitOrder(settings.bitOrder); setDataMode(settings.dataMode); - setClockDivider(determine_baud_rate(spi_d, settings.clock)); + setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); begin(); -#if 0 -// code from SAM core - uint8_t mode = interruptMode; - if (mode > 0) { - if (mode < 16) { - if (mode & 1) PIOA->PIO_IDR = interruptMask[0]; - if (mode & 2) PIOB->PIO_IDR = interruptMask[1]; - if (mode & 4) PIOC->PIO_IDR = interruptMask[2]; - if (mode & 8) PIOD->PIO_IDR = interruptMask[3]; - } else { - interruptSave = interruptsStatus(); - noInterrupts(); - } - } - uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(pin); - bitOrder[ch] = settings.border; - SPI_ConfigureNPCS(spi, ch, settings.config); - //setBitOrder(pin, settings.border); - //setDataMode(pin, settings.datamode); - //setClockDivider(pin, settings.clockdiv); -#endif + } void SPIClass::endTransaction(void) @@ -304,9 +283,9 @@ uint8 SPIClass::read(void) { void SPIClass::read(uint8 *buf, uint32 len) { uint32 rxed = 0; while (rxed < len) { - while (!spi_is_rx_nonempty(this->spi_d)) + while (!spi_is_rx_nonempty(_currentSetting->spi_d)) ; - buf[rxed++] = (uint8)spi_rx_reg(this->spi_d); + buf[rxed++] = (uint8)spi_rx_reg(_currentSetting->spi_d); } } @@ -319,9 +298,9 @@ void SPIClass::write(uint16 data) { * This almost doubles the speed of this function. */ - spi_tx_reg(this->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_reg(_currentSetting->spi_d, data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." } //void SPIClass::write(uint8 byte) { @@ -333,27 +312,27 @@ void SPIClass::write(uint16 data) { * This almost doubles the speed of this function. */ -// spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." -// while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." -// while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." +// spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." +// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." +// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." //} void SPIClass::write(const uint8 *data, uint32 length) { uint32 txed = 0; while (txed < length) { - txed += spi_tx(this->spi_d, data + txed, length - txed); + txed += spi_tx(_currentSetting->spi_d, data + txed, length - txed); } - while (spi_is_tx_empty(this->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "4. After writing the last data item into the SPI_DR register, wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... then wait until BSY=0, this indicates that the transmission of the last data is complete." } uint8 SPIClass::transfer(uint8 byte) const { uint8 b; - spi_tx_reg(this->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)." + while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." + b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." return b; } /* Roger Clark and Victor Perez, 2015 @@ -365,7 +344,7 @@ uint8 SPIClass::transfer(uint8 byte) const { uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length) { if (length == 0) return 0; uint8 b; - if (spi_is_rx_nonempty(this->spi_d) == 1) b = spi_rx_reg(this->spi_d); //Clear the RX buffer in case a byte is waiting on it. + if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) b = spi_rx_reg(_currentSetting->spi_d); //Clear the RX buffer in case a byte is waiting on it. dma1_ch3_Active=true; dma_init(DMA1); dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); @@ -405,8 +384,8 @@ uint8 SPIClass::dmaTransfer(uint8 *transmitBuf, uint8 *receiveBuf, uint16 length } // } - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(DMA1, DMA_CH3); dma_disable(DMA1, DMA_CH2); spi_rx_dma_disable(SPI1); @@ -435,10 +414,10 @@ uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { dma_enable(DMA1, DMA_CH3);// enable transmit while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." + b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(DMA1, DMA_CH3); spi_tx_dma_disable(SPI1); return b; @@ -460,10 +439,10 @@ uint8 SPIClass::dmaSend(uint16 *transmitBuf, uint16 length, bool minc) { dma_enable(DMA1, DMA_CH3);// enable transmit while (dma1_ch3_Active); - while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." - b = spi_rx_reg(this->spi_d); // "... and read the last received data." - while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." - while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." + while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..." + b = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data." + while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..." + while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(DMA1, DMA_CH3); spi_tx_dma_disable(SPI1); return b; @@ -483,19 +462,19 @@ void SPIClass::detachInterrupt(void) { */ uint8 SPIClass::misoPin(void) { - return dev_to_spi_pins(this->spi_d)->miso; + return dev_to_spi_pins(_currentSetting->spi_d)->miso; } uint8 SPIClass::mosiPin(void) { - return dev_to_spi_pins(this->spi_d)->mosi; + return dev_to_spi_pins(_currentSetting->spi_d)->mosi; } uint8 SPIClass::sckPin(void) { - return dev_to_spi_pins(this->spi_d)->sck; + return dev_to_spi_pins(_currentSetting->spi_d)->sck; } uint8 SPIClass::nssPin(void) { - return dev_to_spi_pins(this->spi_d)->nss; + return dev_to_spi_pins(_currentSetting->spi_d)->nss; } /* diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 490d58b..0c05b62 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -118,6 +118,11 @@ private: uint32_t clock; BitOrder bitOrder; uint8_t dataMode; + + spi_dev *spi_d; + uint8_t _SSPin; + //uint32_t clockDivider; + friend class SPIClass; }; @@ -304,7 +309,7 @@ public: * @brief Get a pointer to the underlying libmaple spi_dev for * this HardwareSPI instance. */ - spi_dev* c_dev(void) { return this->spi_d; } + spi_dev* c_dev(void) { return _currentSetting->spi_d; } /* -- The following methods are deprecated --------------------------- */ @@ -338,7 +343,7 @@ public: */ uint8 recv(void); - spi_dev *dev(){ return spi_d;} + spi_dev *dev(){ return _currentSetting->spi_d;} @@ -351,11 +356,17 @@ private: // To Do. Need to wait for } + + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + /* spi_dev *spi_d; uint8_t _SSPin; uint32_t clockDivider; uint8_t dataMode; BitOrder bitOrder; + */ }; From 20a921429189da4c22dc400ebb258eff3c0c5494 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Tue, 7 Jul 2015 20:59:33 +1000 Subject: [PATCH 18/28] Some fixes. Works for SD example SPI 1, not tested with anything else. setModule not tested --- STM32F1/libraries/SPI/src/SPI.cpp | 18 ++++++++++++++---- STM32F1/libraries/SPI/src/SPI.h | 7 +++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index ef07963..e098d43 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -92,7 +92,9 @@ static const spi_pins board_spi_pins[] __FLASH__ = { SPIClass::SPIClass(uint32 spi_num) { - _currentSetting=&_settings[spi_num]; + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + + switch (spi_num) { #if BOARD_NR_SPI >= 1 case 1: @@ -113,6 +115,14 @@ SPIClass::SPIClass(uint32 spi_num) { ASSERT(0); } + // Hack to set the clock divider. + // This should really be done in the SPISetting + _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); +#if BOARD_NR_SPI >= 3 + _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); +#endif + //pinMode(BOARD_SPI_DEFAULT_SS,OUTPUT); } @@ -126,9 +136,9 @@ void SPIClass::begin(void) { spi_init(_currentSetting->spi_d); configure_gpios(_currentSetting->spi_d, 1); #ifdef SPI_DEBUG - Serial.print("spi_master_enable("); Serial.print(_currentSetting->clock); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); + Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")"); #endif - spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clock, (spi_mode)_currentSetting->dataMode, flags); + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); } void SPIClass::beginSlave(void) { @@ -169,7 +179,7 @@ void SPIClass::setClockDivider(uint32_t clockDivider) #ifdef SPI_DEBUG Serial.print("Clock divider set to "); Serial.println(clockDivider); #endif - _currentSetting->clock = clockDivider; + _currentSetting->clockDivider = clockDivider; this->begin(); } diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 0c05b62..0e69989 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -121,7 +121,7 @@ private: spi_dev *spi_d; uint8_t _SSPin; - //uint32_t clockDivider; + uint32_t clockDivider; friend class SPIClass; }; @@ -345,7 +345,10 @@ public: spi_dev *dev(){ return _currentSetting->spi_d;} - + void setModule(int spi_num) + { + _currentSetting=&_settings[spi_num-1];// SPI channels are called 1 2 and 3 but the array is zero indexed + } private: From fc50831843c3dcc928023bd4747f882ee08f7d7c Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 8 Jul 2015 11:14:57 +1000 Subject: [PATCH 19/28] Continued with SPI setModule - still doesnt work when I tried setModule(2); --- STM32F1/libraries/SPI/src/SPI.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.cpp b/STM32F1/libraries/SPI/src/SPI.cpp index e098d43..bb45682 100644 --- a/STM32F1/libraries/SPI/src/SPI.cpp +++ b/STM32F1/libraries/SPI/src/SPI.cpp @@ -115,11 +115,14 @@ SPIClass::SPIClass(uint32 spi_num) { ASSERT(0); } - // Hack to set the clock divider. - // This should really be done in the SPISetting + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. + _settings[0].spi_d = SPI1; _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + _settings[1].spi_d = SPI2; _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); #if BOARD_NR_SPI >= 3 + _settings[2].spi_d = SPI3; _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); #endif From 176db5f9d047d625e3688a5421ef08550e3afe01 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 8 Jul 2015 15:14:25 +1000 Subject: [PATCH 20/28] Fix issue on OSX (and other platforms) where stm32flash only works if the serial device name starts with /dev/tty, as on OSX some serial devices start with /dev/cu. Also corrected mistake about .a file in stm32 parsers folder, and hopefully removed the .a file from source control --- .gitignore | 2 +- tools/macosx/stm32flash/stm32flash | Bin 69824 -> 70448 bytes .../stm32flash_serial/src/parsers/parsers.a | Bin 13844 -> 0 bytes .../src/stm32flash_serial/src/serial_posix.c | 18 +++++++++++++++++- 4 files changed, 18 insertions(+), 2 deletions(-) delete mode 100644 tools/src/stm32flash_serial/src/parsers/parsers.a diff --git a/.gitignore b/.gitignore index f685d48..05bb0a5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ other/maple-bootloader/cscope.out other/maple-bootloader/build other/maple-bootloader/*~ *.o -tools/src/stm32flash/src/parsers/parsers.a +tools/src/stm32flash_serial/src/parsers/parsers.a diff --git a/tools/macosx/stm32flash/stm32flash b/tools/macosx/stm32flash/stm32flash index 92fb6ba57874c5961afc9a392dd33570a0dbb4ae..ac8636e50e8f83effd39d4582dfb025de35cb30c 100755 GIT binary patch delta 17234 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 b`)TEU_3)wgP2^^(LumWOMjLk+Was|@hZMyr diff --git a/tools/src/stm32flash_serial/src/parsers/parsers.a b/tools/src/stm32flash_serial/src/parsers/parsers.a deleted file mode 100644 index ac1b71587ca3b139cc60022629ef526c53e98e5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13844 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 diff --git a/tools/src/stm32flash_serial/src/serial_posix.c b/tools/src/stm32flash_serial/src/serial_posix.c index 30b5ff8..7013436 100644 --- a/tools/src/stm32flash_serial/src/serial_posix.c +++ b/tools/src/stm32flash_serial/src/serial_posix.c @@ -198,18 +198,34 @@ static port_err_t serial_setup(serial_t *h, const serial_baud_t baud, return PORT_ERR_OK; } +/* + * Roger clark. + * This function is no longer used. But has just been commented out in case it needs + * to be reinstated in the future + static int startswith(const char *haystack, const char *needle) { return strncmp(haystack, needle, strlen(needle)) == 0; } +*/ static int is_tty(const char *path) { char resolved[PATH_MAX]; if(!realpath(path, resolved)) return 0; + + /* + * Roger Clark + * Commented out this check, because on OSX some devices are /dev/cu + * and some users use symbolic links to devices, hence the name may not even start + * with /dev + if(startswith(resolved, "/dev/tty")) return 1; - + return 0; + */ + + return 1; } static port_err_t serial_posix_open(struct port_interface *port, From e0d6307685ba70366919d91e8407a1100db635a8 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Wed, 8 Jul 2015 19:48:57 +1000 Subject: [PATCH 21/28] Built Linux binary and also changed printed message to indicate this is a special version built for Arduino STM32 --- tools/linux/stm32flash/stm32flash | Bin 89096 -> 88981 bytes tools/src/stm32flash_serial/src/main.c | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/linux/stm32flash/stm32flash b/tools/linux/stm32flash/stm32flash index 5370150ea1c51116d3d3f4504df53ace0854a8d5..16872bba61573f09112823df05c9f4bc61d2dabd 100755 GIT binary patch delta 11748 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 Date: Thu, 9 Jul 2015 12:47:33 +1200 Subject: [PATCH 22/28] Update PIN_MAP to allow PWM on PB9 --- STM32F1/variants/generic_stm32f103c/board.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/STM32F1/variants/generic_stm32f103c/board.cpp b/STM32F1/variants/generic_stm32f103c/board.cpp index d19d965..95ea65b 100644 --- a/STM32F1/variants/generic_stm32f103c/board.cpp +++ b/STM32F1/variants/generic_stm32f103c/board.cpp @@ -56,13 +56,13 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {GPIOA, TIMER2, ADC1, 0, 1, 0}, /* PA0 */ - {GPIOA, TIMER2, ADC1, 1, 2, 1}, /* PA1 */ + {GPIOA, TIMER2, ADC1, 1, 2, 1}, /* PA1 */ {GPIOA, TIMER2, ADC1, 2, 3, 2}, /* PA2 */ {GPIOA, TIMER2, ADC1, 3, 4, 3}, /* PA3 */ - {GPIOA, NULL, ADC1, 4, 0, 4}, /* PA4 */ - {GPIOA, NULL, ADC1, 5, 0, 5}, /* PA5 */ - {GPIOA, TIMER3, ADC1, 6, 1, 6}, /* PA6 */ - {GPIOA, TIMER3, ADC1, 7, 2, 7}, /* PA7 */ + {GPIOA, NULL, ADC1, 4, 0, 4}, /* PA4 */ + {GPIOA, NULL, ADC1, 5, 0, 5}, /* PA5 */ + {GPIOA, TIMER3, ADC1, 6, 1, 6}, /* PA6 */ + {GPIOA, TIMER3, ADC1, 7, 2, 7}, /* PA7 */ {GPIOA, TIMER1, NULL, 8, 1, ADCx}, /* PA8 */ {GPIOA, TIMER1, NULL, 9, 2, ADCx}, /* PA9 */ {GPIOA, TIMER1, NULL, 10, 3, ADCx}, /* PA10 */ @@ -81,7 +81,7 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { {GPIOB, TIMER4, NULL, 6, 1, ADCx}, /* PB6 */ {GPIOB, TIMER4, NULL, 7, 2, ADCx}, /* PB7 */ {GPIOB, TIMER4, NULL, 8, 3, ADCx}, /* PB8 */ - {GPIOB, NULL, NULL, 9, 0, ADCx}, /* PB9 */ + {GPIOB, TIMER4, NULL, 9, 4, ADCx}, /* PB9 */ {GPIOB, NULL, NULL, 10, 0, ADCx}, /* PB10 */ {GPIOB, NULL, NULL, 11, 0, ADCx}, /* PB11 */ {GPIOB, NULL, NULL, 12, 0, ADCx}, /* PB12 */ From 9056c639776d47067b6c8e6be861342ae02ed503 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 9 Jul 2015 20:09:11 +1000 Subject: [PATCH 23/28] Removed submodule dfu-util --- .gitmodules | 3 --- tools/src/dfu-util | 1 - 2 files changed, 4 deletions(-) delete mode 160000 tools/src/dfu-util diff --git a/.gitmodules b/.gitmodules index b70d76a..8376e59 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "tools/src/texane-stlink"] path = tools/src/texane-stlink url = https://github.com/texane/stlink -[submodule "tools/src/dfu-util"] - path = tools/src/dfu-util - url = https://gitorious.org/dfu-util/dfu-util.git [submodule "STM32duino-bootloader"] path = STM32duino-bootloader url = https://github.com/rogerclarkmelbourne/STM32duino-bootloader.git diff --git a/tools/src/dfu-util b/tools/src/dfu-util deleted file mode 160000 index 604de4b..0000000 --- a/tools/src/dfu-util +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 604de4b1b39a16dbd57da5786d85ebd734cec339 From 8ab473457348990e7b72d9639712a2e0f763c321 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 9 Jul 2015 20:15:54 +1000 Subject: [PATCH 24/28] Add cached dfu-util sources, as the original remote repo is no longer available for use as the source to the dfu-util folder as a submodule --- tools/src/dfu-util/AUTHORS | 30 + tools/src/dfu-util/COPYING | 340 +++++++++ tools/src/dfu-util/ChangeLog | 93 +++ tools/src/dfu-util/DEVICES.txt | 20 + tools/src/dfu-util/Makefile.am | 3 + tools/src/dfu-util/README | 20 + tools/src/dfu-util/TODO | 14 + tools/src/dfu-util/autogen.sh | 2 + tools/src/dfu-util/configure.ac | 41 + tools/src/dfu-util/device-logs/README | 77 ++ tools/src/dfu-util/device-logs/dsonano.lsusb | 60 ++ tools/src/dfu-util/device-logs/lpclink.log | 59 ++ tools/src/dfu-util/device-logs/lpclink.lsusb | 58 ++ tools/src/dfu-util/device-logs/lpclink2.log | 59 ++ tools/src/dfu-util/device-logs/lpclink2.lsusb | 203 +++++ tools/src/dfu-util/device-logs/opc-20.lsusb | 60 ++ .../openmoko-freerunner-dfumode.lsusb | 109 +++ .../device-logs/openmoko-freerunner.lsusb | 179 +++++ .../device-logs/openmoko-neo1973.lsusb | 182 +++++ tools/src/dfu-util/device-logs/openpcd.lsusb | 60 ++ .../device-logs/qi-hardware-atusb.lsusb | 59 ++ tools/src/dfu-util/device-logs/simtrace.lsusb | 70 ++ .../src/dfu-util/device-logs/sparkcore.lsusb | 60 ++ .../device-logs/stm32f107.bin-download | 48 ++ .../src/dfu-util/device-logs/stm32f107.lsusb | 60 ++ .../device-logs/stm32f4discovery.bin-download | 36 + .../device-logs/stm32f4discovery.lsusb | 80 ++ .../dfu-util/device-logs/tdk-bluetooth.lsusb | 269 +++++++ tools/src/dfu-util/dfuse-pack.py | 121 +++ tools/src/dfu-util/doc/40-dfuse.rules | 4 + tools/src/dfu-util/doc/Makefile.am | 2 + tools/src/dfu-util/doc/SPEC-differences.txt | 21 + tools/src/dfu-util/doc/dfu-util.1 | 248 +++++++ tools/src/dfu-util/msvc/README_msvc.txt | 10 + .../src/dfu-util/msvc/dfu-suffix_2010.vcxproj | 100 +++ tools/src/dfu-util/msvc/dfu-util_2010.sln | 54 ++ tools/src/dfu-util/msvc/dfu-util_2010.vcxproj | 120 +++ tools/src/dfu-util/src/Makefile.am | 28 + tools/src/dfu-util/src/dfu.c | 357 +++++++++ tools/src/dfu-util/src/dfu.h | 133 ++++ tools/src/dfu-util/src/dfu_file.c | 444 +++++++++++ tools/src/dfu-util/src/dfu_file.h | 60 ++ tools/src/dfu-util/src/dfu_load.c | 196 +++++ tools/src/dfu-util/src/dfu_load.h | 7 + tools/src/dfu-util/src/dfu_util.c | 346 +++++++++ tools/src/dfu-util/src/dfu_util.h | 36 + tools/src/dfu-util/src/dfuse.c | 652 ++++++++++++++++ tools/src/dfu-util/src/dfuse.h | 35 + tools/src/dfu-util/src/dfuse_mem.c | 198 +++++ tools/src/dfu-util/src/dfuse_mem.h | 44 ++ tools/src/dfu-util/src/main.c | 699 ++++++++++++++++++ tools/src/dfu-util/src/portable.h | 72 ++ tools/src/dfu-util/src/prefix.c | 176 +++++ tools/src/dfu-util/src/quirks.c | 56 ++ tools/src/dfu-util/src/quirks.h | 27 + tools/src/dfu-util/src/suffix.c | 176 +++++ tools/src/dfu-util/src/usb_dfu.h | 99 +++ tools/src/dfu-util/www/build.html | 147 ++++ tools/src/dfu-util/www/dfu-util.1.html | 411 ++++++++++ tools/src/dfu-util/www/dfuse.html | 135 ++++ tools/src/dfu-util/www/index.html | 119 +++ tools/src/dfu-util/www/simple.css | 56 ++ 62 files changed, 7740 insertions(+) create mode 100755 tools/src/dfu-util/AUTHORS create mode 100755 tools/src/dfu-util/COPYING create mode 100755 tools/src/dfu-util/ChangeLog create mode 100755 tools/src/dfu-util/DEVICES.txt create mode 100755 tools/src/dfu-util/Makefile.am create mode 100755 tools/src/dfu-util/README create mode 100755 tools/src/dfu-util/TODO create mode 100755 tools/src/dfu-util/autogen.sh create mode 100755 tools/src/dfu-util/configure.ac create mode 100755 tools/src/dfu-util/device-logs/README create mode 100755 tools/src/dfu-util/device-logs/dsonano.lsusb create mode 100755 tools/src/dfu-util/device-logs/lpclink.log create mode 100755 tools/src/dfu-util/device-logs/lpclink.lsusb create mode 100755 tools/src/dfu-util/device-logs/lpclink2.log create mode 100755 tools/src/dfu-util/device-logs/lpclink2.lsusb create mode 100755 tools/src/dfu-util/device-logs/opc-20.lsusb create mode 100755 tools/src/dfu-util/device-logs/openmoko-freerunner-dfumode.lsusb create mode 100755 tools/src/dfu-util/device-logs/openmoko-freerunner.lsusb create mode 100755 tools/src/dfu-util/device-logs/openmoko-neo1973.lsusb create mode 100755 tools/src/dfu-util/device-logs/openpcd.lsusb create mode 100755 tools/src/dfu-util/device-logs/qi-hardware-atusb.lsusb create mode 100755 tools/src/dfu-util/device-logs/simtrace.lsusb create mode 100755 tools/src/dfu-util/device-logs/sparkcore.lsusb create mode 100755 tools/src/dfu-util/device-logs/stm32f107.bin-download create mode 100755 tools/src/dfu-util/device-logs/stm32f107.lsusb create mode 100755 tools/src/dfu-util/device-logs/stm32f4discovery.bin-download create mode 100755 tools/src/dfu-util/device-logs/stm32f4discovery.lsusb create mode 100755 tools/src/dfu-util/device-logs/tdk-bluetooth.lsusb create mode 100755 tools/src/dfu-util/dfuse-pack.py create mode 100755 tools/src/dfu-util/doc/40-dfuse.rules create mode 100755 tools/src/dfu-util/doc/Makefile.am create mode 100755 tools/src/dfu-util/doc/SPEC-differences.txt create mode 100755 tools/src/dfu-util/doc/dfu-util.1 create mode 100755 tools/src/dfu-util/msvc/README_msvc.txt create mode 100755 tools/src/dfu-util/msvc/dfu-suffix_2010.vcxproj create mode 100755 tools/src/dfu-util/msvc/dfu-util_2010.sln create mode 100755 tools/src/dfu-util/msvc/dfu-util_2010.vcxproj create mode 100755 tools/src/dfu-util/src/Makefile.am create mode 100755 tools/src/dfu-util/src/dfu.c create mode 100755 tools/src/dfu-util/src/dfu.h create mode 100755 tools/src/dfu-util/src/dfu_file.c create mode 100755 tools/src/dfu-util/src/dfu_file.h create mode 100755 tools/src/dfu-util/src/dfu_load.c create mode 100755 tools/src/dfu-util/src/dfu_load.h create mode 100755 tools/src/dfu-util/src/dfu_util.c create mode 100755 tools/src/dfu-util/src/dfu_util.h create mode 100755 tools/src/dfu-util/src/dfuse.c create mode 100755 tools/src/dfu-util/src/dfuse.h create mode 100755 tools/src/dfu-util/src/dfuse_mem.c create mode 100755 tools/src/dfu-util/src/dfuse_mem.h create mode 100755 tools/src/dfu-util/src/main.c create mode 100755 tools/src/dfu-util/src/portable.h create mode 100755 tools/src/dfu-util/src/prefix.c create mode 100755 tools/src/dfu-util/src/quirks.c create mode 100755 tools/src/dfu-util/src/quirks.h create mode 100755 tools/src/dfu-util/src/suffix.c create mode 100755 tools/src/dfu-util/src/usb_dfu.h create mode 100755 tools/src/dfu-util/www/build.html create mode 100755 tools/src/dfu-util/www/dfu-util.1.html create mode 100755 tools/src/dfu-util/www/dfuse.html create mode 100755 tools/src/dfu-util/www/index.html create mode 100755 tools/src/dfu-util/www/simple.css diff --git a/tools/src/dfu-util/AUTHORS b/tools/src/dfu-util/AUTHORS new file mode 100755 index 0000000..bc16c9c --- /dev/null +++ b/tools/src/dfu-util/AUTHORS @@ -0,0 +1,30 @@ +Authors ordered by first contribution. + +Harald Welte +Werner Almesberger +Michael Lauer +Jim Huang +Stefan Schmidt +Daniel Willmann +Mike Frysinger +Uwe Hermann +C. Scott Ananian +Bernard Blackham +Holger Freyther +Marc Singer +James Perkins +Tommi Keisala +Pascal Schweizer +Bradley Scott +Uwe Bonnes +Andrey Smirnov +Jussi Timperi +Hans Petter Selasky +Bo Shen +Henrique de Almeida Mendonca +Bernd Krumboeck +Dennis Meier +Veli-Pekka Peltola +Dave Hylands +Michael Grzeschik +Paul Fertser diff --git a/tools/src/dfu-util/COPYING b/tools/src/dfu-util/COPYING new file mode 100755 index 0000000..fbdd65f --- /dev/null +++ b/tools/src/dfu-util/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/tools/src/dfu-util/ChangeLog b/tools/src/dfu-util/ChangeLog new file mode 100755 index 0000000..35a1da7 --- /dev/null +++ b/tools/src/dfu-util/ChangeLog @@ -0,0 +1,93 @@ +0.8: + o New, separate dfu-prefix tool (Uwe Bonnes) + o Allow filtering on serial number (Uwe Bonnes) + o Improved VID/PID/serial filtering (Bradley Scott) + o Support reading firmware from stdin (Tormod Volden) + o Warn if missing DFU suffix (Tormod Volden) + o Improved progress bar (Hans Petter Selasky) + o Fix dfuse leave option (Uwe Bonnes) + o Major code rework (Hans Petter Selasky) + o MS Visual Studio build support (Henrique Mendonca) + o dfuse-pack.py tool for .dfu files (Antonio Galeo) + o Many other fixes from many people + +2014-09-13: Tormod Volden + +0.7: + o Support for TI Stellaris devices (Tommi Keisala) + o Fix libusb detection on MacOSX (Marc Singer) + o Fix libusb detection on FreeBSD (Tormod Volden) + o Improved DfuSe support (Tormod Volden) + o Support all special commands (leave, unprotect, mass-erase) + o Arbitrary upload lengths + o "force" option for various possible (dangerous) overrides + +2012-10-07: Tormod Volden + +0.6: + o Add detach mode (Stefan Schmidt) + o Check return value on all libusb calls (Tormod Volden) + o Fix segmentation fault with -s option (Tormod Volden) + o Add DFU suffix manipulation tool (Stefan Schmidt) + o Port to Windows: (Tormod Volden, some parts based on work from Satz + Klauer) + o Port file handling to stdio streams + o Sleep() macros + o C99 types + o Pack structs + o Detect DfuSe device correctly on big-endian architectures (Tormod + Volden) + o Add dfuse progress indication on download (Tormod Volden) + o Cleanup: gcc pedantic, gcc extension, ... (Tormod Volden) + o Rely on page size from functional descriptor. Please report if you get + an error about it. (Tormod Volden) + o Add quirk for Maple since it reports wrong DFU version (Tormod Volden) + +2012-04-22: Stefan Schmidt + +0.5: + o DfuSe extension support for ST devices (Tormod Volden) + o Add initial support for bitWillDetach flag from DFU 1.1 (Tormod + Volden) + o Internal cleanup and some manual page fixes (Tormod Volden) + +2011-11-02: Stefan Schmidt + +0.4: + o Rework to use libusb-1.0 (Stefan Schmidt) + o DFU suffix support (Tormod Volden, Stefan Schmidt) + o Sspeed up DFU downloads directly into memory (Bernard Blackham) + o More flexible -d vid:pid parsing (Tormod Volden) + o Many bug fixes and cleanups + +2011-07-20: Stefan Schmidt + +0.3: + o quirks: Add OpenOCD to the poll timeout quirk table. + +2010-12-22: Stefan Schmidt + +0.2: + o Fix some typos on the website and the README (Antonio Ospite, Uwe + Hermann) + o Remove build rule for a static binary. We can use autotools for this. + (Mike Frysinger) + o Fix infinite loop in download error path (C. Scott Ananian) + o Break out to show the 'finished' in upload (C. Scott Ananian) + o Add GPLv2+ headers (Harald Welte) + o Remove dead code (commands.[ch]) remnescent of dfu-programmer (Harald + Welte) + o Simple quirk system with Openmoko quirk for missing bwPollTimeout (Tormod Volden) + o New default (1024) and clamping of transfer size (Tormod Volden) + o Verify sending of completion packet (Tormod Volden) + o Look for DFU functional descriptor among all descriptors (Tormod + Volden) + o Print out in which direction we are transferring data + o Abort in upload if the file already exists + +2010-11-17 Stefan Schmidt + +0.1: + Initial release + +2010-05-23 Stefan Schmidt diff --git a/tools/src/dfu-util/DEVICES.txt b/tools/src/dfu-util/DEVICES.txt new file mode 100755 index 0000000..682e62c --- /dev/null +++ b/tools/src/dfu-util/DEVICES.txt @@ -0,0 +1,20 @@ +List of supported software and hardware products: + +Software user (bootloader, etc) +------------------------------- +- Sam7DFU: http://www.openpcd.org/Sam7dfu +- U-boot: DFU patches +- Barebox: http://www.barebox.org/ +- Leaflabs: http://code.google.com/p/leaflabs/ +- Blackmagic DFU + +Products using DFU +------------------ +- OpenPCD (sam7dfu) +- Openmoko Neo 1973 and Freerunner (u-boot with DFU patches) +- Leaflabs Maple +- ATUSB from Qi Hardware +- STM32F105/7, STM32F2/F3/F4 in System Bootloader +- Blackmagic debug probe +- NXP LPC31xx/LPC43XX, e.g. LPC-Link and LPC-Link2, need binaries + with LPC prefix and encoding (LPC-Link) diff --git a/tools/src/dfu-util/Makefile.am b/tools/src/dfu-util/Makefile.am new file mode 100755 index 0000000..7318dd8 --- /dev/null +++ b/tools/src/dfu-util/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = src doc + +EXTRA_DIST = autogen.sh TODO DEVICES.txt dfuse-pack.py diff --git a/tools/src/dfu-util/README b/tools/src/dfu-util/README new file mode 100755 index 0000000..acda06a --- /dev/null +++ b/tools/src/dfu-util/README @@ -0,0 +1,20 @@ +Dfu-util - Device Firmware Upgrade Utilities + +Dfu-util is the host side implementation of the DFU 1.0 [1] and DFU 1.1 [2] +specification of the USB forum. + +DFU is intended to download and upload firmware to devices connected over +USB. It ranges from small devices like micro-controller boards up to mobile +phones. With dfu-util you are able to download firmware to your device or +upload firmware from it. + +dfu-util has been tested with Openmoko Neo1973 and Freerunner and many +other devices. + +[1] DFU 1.0 spec: http://www.usb.org/developers/devclass_docs/usbdfu10.pdf +[2] DFU 1.1 spec: http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf + +The official website is: + + http://dfu-util.gnumonks.org/ + diff --git a/tools/src/dfu-util/TODO b/tools/src/dfu-util/TODO new file mode 100755 index 0000000..7574512 --- /dev/null +++ b/tools/src/dfu-util/TODO @@ -0,0 +1,14 @@ +DfuSe: +- Do erase and write in two separate passes when downloading +- Skip "Set Address" command when downloading contiguous blocks +- Implement "Get Commands" command + +Devices: +- Research iPhone/iPod/iPad support + Heavily modified dfu-util fork here: + https://github.com/planetbeing/xpwn/tree/master/dfu-util +- Test against Niftylights + +Non-Code: +- Logo +- Re-License as LGPL for usage as library? diff --git a/tools/src/dfu-util/autogen.sh b/tools/src/dfu-util/autogen.sh new file mode 100755 index 0000000..5959508 --- /dev/null +++ b/tools/src/dfu-util/autogen.sh @@ -0,0 +1,2 @@ +#! /bin/sh +autoreconf -v -i diff --git a/tools/src/dfu-util/configure.ac b/tools/src/dfu-util/configure.ac new file mode 100755 index 0000000..8810f56 --- /dev/null +++ b/tools/src/dfu-util/configure.ac @@ -0,0 +1,41 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) +AC_INIT([dfu-util],[0.8],[dfu-util@lists.gnumonks.org],,[http://dfu-util.gnumonks.org]) +AC_CONFIG_AUX_DIR(m4) +AM_INIT_AUTOMAKE([foreign]) +AC_CONFIG_HEADERS([config.h]) + +# Test for new silent rules and enable only if they are available +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. +# On FreeBSD the libusb-1.0 is called libusb and resides in system location +AC_CHECK_LIB([usb], [libusb_init],, [native_libusb=no],) +AS_IF([test x$native_libusb = xno], [ + PKG_CHECK_MODULES([USB], [libusb-1.0 >= 1.0.0],, + AC_MSG_ERROR([*** Required libusb-1.0 >= 1.0.0 not installed ***])) +]) +AC_CHECK_LIB([usbpath],[usb_path2devnum],,,-lusb) + +LIBS="$LIBS $USB_LIBS" +CFLAGS="$CFLAGS $USB_CFLAGS" + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([usbpath.h windows.h sysexits.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T + +# Checks for library functions. +AC_FUNC_MEMCMP +AC_CHECK_FUNCS([ftruncate getpagesize nanosleep err]) + +AC_CONFIG_FILES(Makefile src/Makefile doc/Makefile) +AC_OUTPUT diff --git a/tools/src/dfu-util/device-logs/README b/tools/src/dfu-util/device-logs/README new file mode 100755 index 0000000..c1de3e7 --- /dev/null +++ b/tools/src/dfu-util/device-logs/README @@ -0,0 +1,77 @@ +Device: +------- +qi-hardware-atusb: +- Qi Hardware ben-wpan +- DFU implementation: + http://projects.qi-hardware.com/index.php/p/ben-wpan/source/tree/master/atusb/fw/usb +- Tester: Stefan Schmidt + +openpcd: +- OpenPCD RFID reader +- DFU implementation: SAM7DFU + http://www.openpcd.org/Sam7dfu, git://git.gnumonks.org/openpcd.git +- Tester: Stefan Schmidt + +simtrace: +- Sysmocom SimTrace +- DFU implementation: SAM7DFU + http://www.openpcd.org/Sam7dfu, git://git.gnumonks.org/openpcd.git +- Tester: Stefan Schmidt + +openmoko-freerunner: +- Openmoko Freerunner +- DFU implementation: Old U-Boot + http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/mokopatches +- Tester: Stefan Schmidt + +openmoko-neo1973: +- Openmoko Neo1073 +- DFU implementation: Old U-Boot + http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/mokopatches +- Tester: Stefan Schmidt + +tdk-bluetooth: +- TDK Corp. Bluetooth Adapter +- DFU implementation: closed soure +- Only upload has been tested +- Tester: Stefan Schmidt + +stm32f107: +- STM32 microcontrollers with built-in (ROM) DFU loader +- DFU implementation: Closed source but probably similar to the one + in their USB device libraries. Some relevant application notes: + http://www.st.com -> AN3156 and AN2606 +- Tested by Uwe Bonnes + +stm32f4discovery: +- STM32 microcontroller board with built-in (ROM) DFU loader +- DFU implementation: Closed source, probably similar to stm32f107. +- Tested by Joe Rothweiler + +dso-nano: +- DSO Nano pocket oscilloscope +- DFU implementation: Based on ST Microelectronics USB FS Library 1.0 + http://dsonano.googlecode.com/files/DS0201_OpenSource.rar +- Tester: Tormod Volden + +opc-20: +- Custom devices based on STM32F1xx +- DFU implementation: ST Microelectronics USB FS Device Library 3.1.0 + http://www.st.com -> um0424.zip +- Tester: Tormod Volden + +lpc-link, lpclink2: +- NXP LPCXpresso debug adapters +- Proprietary DFU implementation, uses special download files with + LPC prefix and encoding of the target firmware code +- Tested by Uwe Bonnes + +Adding the lsusb output and a download log of your device here helps +us to avoid regressions for hardware we cannot test while working on +the code. To extract the lsusb output use this command: +sudo lsusb -v -d $USBID > $DEVICE.lsusb +Prepare a description snippet as above, and send it to us. A log +(copy-paste of the command window) of a firmware download is also +nice, please use the double verbose option -v -v and include the +command line in the log file. + diff --git a/tools/src/dfu-util/device-logs/dsonano.lsusb b/tools/src/dfu-util/device-logs/dsonano.lsusb new file mode 100755 index 0000000..44a5d28 --- /dev/null +++ b/tools/src/dfu-util/device-logs/dsonano.lsusb @@ -0,0 +1,60 @@ + +Bus 002 Device 004: ID 0483:df11 SGS Thomson Microelectronics +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x0483 SGS Thomson Microelectronics + idProduct 0xdf11 + bcdDevice 1.1a + iManufacturer 1 STMicroelectronics + iProduct 2 STM32 DFU + iSerial 3 001 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 36 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 64mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 0 + iInterface 4 @Internal Flash /0x08000000/12*001Ka,116*001Kg + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 0 + iInterface 5 @SPI Flash : M25P64/0x00000000/64*064Kg,64*064Kg + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 11 + Will Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 255 milliseconds + wTransferSize 1024 bytes + bcdDFUVersion 1.1a +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/lpclink.log b/tools/src/dfu-util/device-logs/lpclink.log new file mode 100755 index 0000000..f2a04f7 --- /dev/null +++ b/tools/src/dfu-util/device-logs/lpclink.log @@ -0,0 +1,59 @@ +(The on-board LPC3154 has some encryption key set and LPCXpressoWIN.enc +is encrypted.) + +$ lsusb | grep NXP +Bus 003 Device 011: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link + +$ dfu-util -v -v -v -R -D /opt/lpc/lpcxpresso/bin/LPCXpressoWIN.enc + +dfu-util 0.7 + +Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc. +Copyright 2010-2012 Tormod Volden and Stefan Schmidt +This program is Free Software and has ABSOLUTELY NO WARRANTY +Please report bugs to dfu-util@lists.gnumonks.org + +dfu-util: Invalid DFU suffix signature +dfu-util: A valid DFU suffix will be required in a future dfu-util release!!! +Deducing device DFU version from functional descriptor length +Opening DFU capable USB device... +ID 0471:df55 +Run-time device DFU version 0100 +Claiming USB DFU Runtime Interface... +Determining device status: +state = dfuIDLE, status = 0 +dfu-util: WARNING: Runtime device already in DFU state ?!? +Claiming USB DFU Interface... +Setting Alternate Setting #0 ... +Determining device status: +state = dfuIDLE, status = 0 +dfuIDLE, continuing +DFU mode device DFU version 0100 +Device returned transfer size 2048 +Copying data from PC to DFU device +Download [ ] 0% 0 bytes +Download [= ] 6% 2048 bytes +Download [=== ] 13% 4096 bytes +Download [==== ] 19% 6144 bytes +Download [====== ] 26% 8192 bytes +Download [======== ] 32% 10240 bytes +Download [========= ] 39% 12288 bytes +Download [=========== ] 45% 14336 bytes +Download [============= ] 52% 16384 bytes +Download [============== ] 59% 18432 bytes +Download [================ ] 65% 20480 bytes +Download [================== ] 72% 22528 bytes +Download [=================== ] 78% 24576 bytes +Download [===================== ] 85% 26624 bytes +Download [====================== ] 91% 28672 bytes +Download [======================== ] 98% 29192 bytes +Download [=========================] 100% 29192 bytes +Download done. +Sent a total of 29192 bytes +state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present +Done! +dfu-util: can't detach +Resetting USB to switch back to runtime mode + +$ lsusb | grep NXP +Bus 003 Device 012: ID 1fc9:0009 NXP Semiconductors diff --git a/tools/src/dfu-util/device-logs/lpclink.lsusb b/tools/src/dfu-util/device-logs/lpclink.lsusb new file mode 100755 index 0000000..c80d2b7 --- /dev/null +++ b/tools/src/dfu-util/device-logs/lpclink.lsusb @@ -0,0 +1,58 @@ + +Bus 003 Device 008: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 2.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x0471 Philips (or NXP) + idProduct 0xdf55 LPCXpresso LPC-Link + bcdDevice 0.01 + iManufacturer 0 + iProduct 0 + iSerial 0 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 25 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 0 + iInterface 0 + Device Firmware Upgrade Interface Descriptor: + bLength 7 + bDescriptorType 33 + bmAttributes 1 + Will Not Detach + Manifestation Intolerant + Upload Unsupported + Download Supported + wDetachTimeout 65535 milliseconds + wTransferSize 2048 bytes +Device Qualifier (for other device speed): + bLength 10 + bDescriptorType 6 + bcdUSB 2.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + bNumConfigurations 1 +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/lpclink2.log b/tools/src/dfu-util/device-logs/lpclink2.log new file mode 100755 index 0000000..f33e671 --- /dev/null +++ b/tools/src/dfu-util/device-logs/lpclink2.log @@ -0,0 +1,59 @@ +$ lsusb | grep NXP +Bus 003 Device 013: ID 1fc9:000c NXP Semiconductors + +$ dfu-util -D ~/devel/dfu-util/firmware.bin.qthdr + +dfu-util 0.7 + +Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc. +Copyright 2010-2012 Tormod Volden and Stefan Schmidt +This program is Free Software and has ABSOLUTELY NO WARRANTY +Please report bugs to dfu-util@lists.gnumonks.org + +dfu-util: Invalid DFU suffix signature +dfu-util: A valid DFU suffix will be required in a future dfu-util release!!! +Possible unencryptes NXP LPC DFU prefix with the following properties +Payload length: 39 kiByte +Opening DFU capable USB device... +ID 1fc9:000c +Run-time device DFU version 0100 +Claiming USB DFU Runtime Interface... +Determining device status: +state = dfuIDLE, status = 0 +dfu-util: WARNING: Runtime device already in DFU state ?!? +Claiming USB DFU Interface... +Setting Alternate Setting #0 ... +Determining device status: +state = dfuIDLE, status = 0 +dfuIDLE, continuing +DFU mode device DFU version 0100 +Device returned transfer size 2048 +Copying data from PC to DFU device +Download [ ] 0% 0 bytes +Download [= ] 4% 2048 bytes +Download [== ] 9% 4096 bytes +Download [=== ] 14% 6144 bytes +Download [==== ] 19% 8192 bytes +Download [====== ] 24% 10240 bytes +Download [======= ] 28% 12288 bytes +Download [======== ] 33% 14336 bytes +Download [========= ] 38% 16384 bytes +Download [========== ] 43% 18432 bytes +Download [============ ] 48% 20480 bytes +Download [============= ] 53% 22528 bytes +Download [============== ] 57% 24576 bytes +Download [=============== ] 62% 26624 bytes +Download [================ ] 67% 28672 bytes +Download [================== ] 72% 30720 bytes +Download [=================== ] 77% 32768 bytes +Download [==================== ] 82% 34816 bytes +Download [===================== ] 86% 36864 bytes +Download [====================== ] 91% 38912 bytes +Download [======================== ] 96% 40356 bytes +Download [=========================] 100% 40356 bytes +Download done. +Sent a total of 40356 bytes +dfu-util: unable to read DFU status + +$ lsusb | grep NXP +Bus 003 Device 014: ID 1fc9:0018 NXP Semiconductors diff --git a/tools/src/dfu-util/device-logs/lpclink2.lsusb b/tools/src/dfu-util/device-logs/lpclink2.lsusb new file mode 100755 index 0000000..d8d6e0c --- /dev/null +++ b/tools/src/dfu-util/device-logs/lpclink2.lsusb @@ -0,0 +1,203 @@ + +Bus 003 Device 007: ID 0c72:000c PEAK System PCAN-USB +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 16 + idVendor 0x0c72 PEAK System + idProduct 0x000c PCAN-USB + bcdDevice 1c.ff + iManufacturer 0 + iProduct 3 VER1:PEAK +VER2:02.8.01 +DAT :06.05.2004 +TIME:09:35:37 + ... + iSerial 0 + bNumConfigurations 3 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 46 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 200mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 4 + bInterfaceClass 0 (Defined at Interface level) + bInterfaceSubClass 0 + bInterfaceProtocol 0 + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 20 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x01 EP 1 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 20 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x82 EP 2 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 46 + bNumInterfaces 1 + bConfigurationValue 2 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 394mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 4 + bInterfaceClass 0 (Defined at Interface level) + bInterfaceSubClass 0 + bInterfaceProtocol 0 + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 20 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x01 EP 1 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 20 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x82 EP 2 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 46 + bNumInterfaces 1 + bConfigurationValue 3 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 200mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 4 + bInterfaceClass 0 (Defined at Interface level) + bInterfaceSubClass 0 + bInterfaceProtocol 0 + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x01 EP 1 OUT + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x82 EP 2 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 +Device Status: 0x0001 + Self Powered diff --git a/tools/src/dfu-util/device-logs/opc-20.lsusb b/tools/src/dfu-util/device-logs/opc-20.lsusb new file mode 100755 index 0000000..25ad12f --- /dev/null +++ b/tools/src/dfu-util/device-logs/opc-20.lsusb @@ -0,0 +1,60 @@ + +Bus 001 Device 004: ID 0483:df11 SGS Thomson Microelectronics +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x0483 SGS Thomson Microelectronics + idProduct 0xdf11 + bcdDevice 2.00 + iManufacturer 1 STMicroelectronics + iProduct 2 STM32 DFU + iSerial 3 ÿÿÿÿÿÿÿÿÿÿÿÿ + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 36 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0xc0 + Self Powered + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 4 @Internal Flash /0x08000000/12*001Ka,116*001Kg + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 5 @SPI Flash : M25P64/0x00000000/128*64Kg + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 11 + Will Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 255 milliseconds + wTransferSize 1024 bytes + bcdDFUVersion 1a.01 +Device Status: 0x0001 + Self Powered diff --git a/tools/src/dfu-util/device-logs/openmoko-freerunner-dfumode.lsusb b/tools/src/dfu-util/device-logs/openmoko-freerunner-dfumode.lsusb new file mode 100755 index 0000000..64bd018 --- /dev/null +++ b/tools/src/dfu-util/device-logs/openmoko-freerunner-dfumode.lsusb @@ -0,0 +1,109 @@ +Bus 003 Device 017: ID 1d50:5119 OpenMoko, Inc. GTA01/GTA02 U-Boot Bootloader +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 16 + idVendor 0x1d50 OpenMoko, Inc. + idProduct 0x5119 GTA01/GTA02 U-Boot Bootloader + bcdDevice 0.00 + iManufacturer 1 OpenMoko, Inc + iProduct 2 Neo1973 Bootloader U-Boot 1.3.2-moko12 + iSerial 3 0000000 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 81 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 7 USB Device Firmware Upgrade + bmAttributes 0x80 + (Bus Powered) + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 8 RAM 0x32000000 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 9 u-boot + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 2 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 10 u-boot_env + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 3 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 11 kernel + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 4 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 12 splash + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 5 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 13 factory + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 6 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 14 rootfs + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 7 + Will Not Detach + Manifestation Tolerant + Upload Supported + Download Supported + wDetachTimeout 65280 milliseconds + wTransferSize 4096 bytes + bcdDFUVersion 1.00 +Device Status: 0x0a00 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/openmoko-freerunner.lsusb b/tools/src/dfu-util/device-logs/openmoko-freerunner.lsusb new file mode 100755 index 0000000..cf148e5 --- /dev/null +++ b/tools/src/dfu-util/device-logs/openmoko-freerunner.lsusb @@ -0,0 +1,179 @@ +Bus 005 Device 033: ID 1d50:5119 OpenMoko, Inc. GTA01/GTA02 U-Boot Bootloader +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.10 + bDeviceClass 2 Communications + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 16 + idVendor 0x1d50 OpenMoko, Inc. + idProduct 0x5119 GTA01/GTA02 U-Boot Bootloader + bcdDevice 0.00 + iManufacturer 1 OpenMoko, Inc + iProduct 2 Neo1973 Bootloader U-Boot 1.3.2-moko12 + iSerial 3 0000000 + bNumConfigurations 2 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 85 + bNumInterfaces 3 + bConfigurationValue 1 + iConfiguration 4 TTY via USB + bmAttributes 0x80 + (Bus Powered) + MaxPower 500mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 2 Communications + bInterfaceSubClass 2 Abstract (modem) + bInterfaceProtocol 1 AT-commands (v.25ter) + iInterface 6 Control Interface + CDC Header: + bcdCDC 0.6e + CDC Call Management: + bmCapabilities 0x00 + bDataInterface 1 + CDC ACM: + bmCapabilities 0x00 + CDC Union: + bMasterInterface 0 + bSlaveInterface 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 2 + bInterfaceClass 10 CDC Data + bInterfaceSubClass 0 Unused + bInterfaceProtocol 0 + iInterface 5 Bulk Data Interface + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 2 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 1 + iInterface 7 USB Device Firmware Upgrade + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 7 + Will Not Detach + Manifestation Tolerant + Upload Supported + Download Supported + wDetachTimeout 65280 milliseconds + wTransferSize 4096 bytes + bcdDFUVersion 1.00 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 67 + bNumInterfaces 2 + bConfigurationValue 2 + iConfiguration 4 TTY via USB + bmAttributes 0x80 + (Bus Powered) + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 2 Communications + bInterfaceSubClass 2 Abstract (modem) + bInterfaceProtocol 1 AT-commands (v.25ter) + iInterface 6 Control Interface + CDC Header: + bcdCDC 0.6e + CDC Call Management: + bmCapabilities 0x00 + bDataInterface 1 + CDC ACM: + bmCapabilities 0x00 + CDC Union: + bMasterInterface 0 + bSlaveInterface 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 2 + bInterfaceClass 10 CDC Data + bInterfaceSubClass 0 Unused + bInterfaceProtocol 0 + iInterface 5 Bulk Data Interface + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 +Device Status: 0x9a00 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/openmoko-neo1973.lsusb b/tools/src/dfu-util/device-logs/openmoko-neo1973.lsusb new file mode 100755 index 0000000..dc1fe7c --- /dev/null +++ b/tools/src/dfu-util/device-logs/openmoko-neo1973.lsusb @@ -0,0 +1,182 @@ + +Bus 006 Device 020: ID 1457:5119 First International Computer, Inc. OpenMoko Neo1973 u-boot cdc_acm serial port +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.10 + bDeviceClass 2 Communications + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 16 + idVendor 0x1457 First International Computer, Inc. + idProduct 0x5119 OpenMoko Neo1973 u-boot cdc_acm serial port + bcdDevice 0.00 + iManufacturer 1 + iProduct 2 + iSerial 3 + bNumConfigurations 2 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 85 + bNumInterfaces 3 + bConfigurationValue 1 + iConfiguration 4 + bmAttributes 0x80 + (Bus Powered) + MaxPower 500mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 2 Communications + bInterfaceSubClass 2 Abstract (modem) + bInterfaceProtocol 1 AT-commands (v.25ter) + iInterface 6 + CDC Header: + bcdCDC 0.6e + CDC Call Management: + bmCapabilities 0x00 + bDataInterface 1 + CDC ACM: + bmCapabilities 0x00 + CDC Union: + bMasterInterface 0 + bSlaveInterface 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 2 + bInterfaceClass 10 CDC Data + bInterfaceSubClass 0 Unused + bInterfaceProtocol 0 + iInterface 5 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 2 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 1 + iInterface 7 + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 7 + Will Not Detach + Manifestation Tolerant + Upload Supported + Download Supported + wDetachTimeout 65280 milliseconds + wTransferSize 4096 bytes + bcdDFUVersion 1.00 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 67 + bNumInterfaces 2 + bConfigurationValue 2 + iConfiguration 4 + bmAttributes 0x80 + (Bus Powered) + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 2 Communications + bInterfaceSubClass 2 Abstract (modem) + bInterfaceProtocol 1 AT-commands (v.25ter) + iInterface 6 + CDC Header: + bcdCDC 0.6e + CDC Call Management: + bmCapabilities 0x00 + bDataInterface 1 + CDC ACM: + bmCapabilities 0x00 + CDC Union: + bMasterInterface 0 + bSlaveInterface 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 2 + bInterfaceClass 10 CDC Data + bInterfaceSubClass 0 Unused + bInterfaceProtocol 0 + iInterface 5 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 255 +Device Status: 0x0006 + (Bus Powered) + Remote Wakeup Enabled + Test Mode diff --git a/tools/src/dfu-util/device-logs/openpcd.lsusb b/tools/src/dfu-util/device-logs/openpcd.lsusb new file mode 100755 index 0000000..8618647 --- /dev/null +++ b/tools/src/dfu-util/device-logs/openpcd.lsusb @@ -0,0 +1,60 @@ + +Bus 006 Device 016: ID 16c0:076b VOTI OpenPCD 13.56MHz RFID Reader +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 8 + idVendor 0x16c0 VOTI + idProduct 0x076b OpenPCD 13.56MHz RFID Reader + bcdDevice 0.00 + iManufacturer 1 + iProduct 2 OpenPCD RFID Simulator - DFU Mode + iSerial 0 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 36 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 200mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 0 + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 3 + Will Not Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 65280 milliseconds + wTransferSize 256 bytes + bcdDFUVersion 1.00 +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/qi-hardware-atusb.lsusb b/tools/src/dfu-util/device-logs/qi-hardware-atusb.lsusb new file mode 100755 index 0000000..d1da57a --- /dev/null +++ b/tools/src/dfu-util/device-logs/qi-hardware-atusb.lsusb @@ -0,0 +1,59 @@ + +Bus 006 Device 013: ID 20b7:1540 Qi Hardware ben-wpan, AT86RF230-based +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 2.00 + bDeviceClass 255 Vendor Specific Class + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x20b7 Qi Hardware + idProduct 0x1540 ben-wpan, AT86RF230-based + bcdDevice 0.01 + iManufacturer 0 + iProduct 0 + iSerial 1 4630333438371508231a + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 34 + bNumInterfaces 2 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 40mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 1 + bInterfaceClass 255 Vendor Specific Class + bInterfaceSubClass 0 + bInterfaceProtocol 0 + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 0 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 1 + iInterface 0 +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/simtrace.lsusb b/tools/src/dfu-util/device-logs/simtrace.lsusb new file mode 100755 index 0000000..fd51539 --- /dev/null +++ b/tools/src/dfu-util/device-logs/simtrace.lsusb @@ -0,0 +1,70 @@ + +Bus 006 Device 017: ID 16c0:0762 VOTI +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 8 + idVendor 0x16c0 VOTI + idProduct 0x0762 + bcdDevice 0.00 + iManufacturer 1 sysmocom - systems for mobile communications GmbH + iProduct 2 SimTrace SIM Sniffer - DFU Mode + iSerial 0 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 45 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 3 SimTrace DFU Configuration + bmAttributes 0x80 + (Bus Powered) + MaxPower 200mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 4 SimTrace DFU Interface - Application Partition + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 5 SimTrace DFU Interface - Bootloader Partition + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 2 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 6 SimTrace DFU Interface - RAM + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 3 + Will Not Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 65280 milliseconds + wTransferSize 256 bytes + bcdDFUVersion 1.00 +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/sparkcore.lsusb b/tools/src/dfu-util/device-logs/sparkcore.lsusb new file mode 100755 index 0000000..79c529b --- /dev/null +++ b/tools/src/dfu-util/device-logs/sparkcore.lsusb @@ -0,0 +1,60 @@ + +Bus 001 Device 008: ID 1d50:607f OpenMoko, Inc. +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x1d50 OpenMoko, Inc. + idProduct 0x607f + bcdDevice 2.00 + iManufacturer 1 Spark Devices + iProduct 2 CORE DFU + iSerial 3 8D80527B5055 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 36 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0xc0 + Self Powered + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 4 @Internal Flash /0x08000000/20*001Ka,108*001Kg + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 5 @SPI Flash : SST25x/0x00000000/512*04Kg + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 11 + Will Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 255 milliseconds + wTransferSize 1024 bytes + bcdDFUVersion 1.1a +Device Status: 0x0001 + Self Powered diff --git a/tools/src/dfu-util/device-logs/stm32f107.bin-download b/tools/src/dfu-util/device-logs/stm32f107.bin-download new file mode 100755 index 0000000..4d803fb --- /dev/null +++ b/tools/src/dfu-util/device-logs/stm32f107.bin-download @@ -0,0 +1,48 @@ +> src/dfu-util --intf 0 --alt 0 -v -v -v -s 0x8000000 -D test3 +dfu-util 0.4 + +(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc. +(C) 2010-2011 Tormod Volden (DfuSe support) +This program is Free Software and has ABSOLUTELY NO WARRANTY + +dfu-util does currently only support DFU version 1.0 + +Opening DFU USB device... ID 0483:df11 +Run-time device DFU version 011a +Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/128*002Kg" +Claiming USB DFU Interface... +Setting Alternate Setting #0 ... +Determining device status: state = dfuIDLE, status = 0 +dfuIDLE, continuing +DFU mode device DFU version 011a +Device returned transfer size 2048 +No valid DFU suffix signature +Warning: File has no DFU suffix +DfuSe interface name: "Internal Flash " +Memory segment at 0x08000000 128 x 2048 = 262144 (rew) +Uploading to address = 0x08000000, size = 16384 +Erasing page size 2048 at address 0x08000000, page starting at 0x08000000 + Download from image offset 00000000 to memory 08000000-080007ff, size 2048 + Setting address pointer to 0x08000000 +Erasing page size 2048 at address 0x08000800, page starting at 0x08000800 + Download from image offset 00000800 to memory 08000800-08000fff, size 2048 + Setting address pointer to 0x08000800 +Erasing page size 2048 at address 0x08001000, page starting at 0x08001000 + Download from image offset 00001000 to memory 08001000-080017ff, size 2048 + Setting address pointer to 0x08001000 +Erasing page size 2048 at address 0x08001800, page starting at 0x08001800 + Download from image offset 00001800 to memory 08001800-08001fff, size 2048 + Setting address pointer to 0x08001800 +Erasing page size 2048 at address 0x08002000, page starting at 0x08002000 + Download from image offset 00002000 to memory 08002000-080027ff, size 2048 + Setting address pointer to 0x08002000 +Erasing page size 2048 at address 0x08002800, page starting at 0x08002800 + Download from image offset 00002800 to memory 08002800-08002fff, size 2048 + Setting address pointer to 0x08002800 +Erasing page size 2048 at address 0x08003000, page starting at 0x08003000 + Download from image offset 00003000 to memory 08003000-080037ff, size 2048 + Setting address pointer to 0x08003000 +Erasing page size 2048 at address 0x08003800, page starting at 0x08003800 + Download from image offset 00003800 to memory 08003800-08003fff, size 2048 + Setting address pointer to 0x08003800 + diff --git a/tools/src/dfu-util/device-logs/stm32f107.lsusb b/tools/src/dfu-util/device-logs/stm32f107.lsusb new file mode 100755 index 0000000..89d8d38 --- /dev/null +++ b/tools/src/dfu-util/device-logs/stm32f107.lsusb @@ -0,0 +1,60 @@ + +Bus 001 Device 028: ID 0483:df11 SGS Thomson Microelectronics STM Device in DFU Mode +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x0483 SGS Thomson Microelectronics + idProduct 0xdf11 STM Device in DFU Mode + bcdDevice 20.00 + iManufacturer 1 STMicroelectronics + iProduct 2 STM32 0x418 DFU Bootloader + iSerial 3 STM32 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 36 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0xc0 + Self Powered + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 4 @Internal Flash /0x08000000/128*002Kg + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 5 @Option Bytes /0x1FFFF800/01*016 g + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 11 + Will Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 255 milliseconds + wTransferSize 2048 bytes + bcdDFUVersion 1.1a +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/device-logs/stm32f4discovery.bin-download b/tools/src/dfu-util/device-logs/stm32f4discovery.bin-download new file mode 100755 index 0000000..d5a2679 --- /dev/null +++ b/tools/src/dfu-util/device-logs/stm32f4discovery.bin-download @@ -0,0 +1,36 @@ +dfu-util --device 0483:df11 --alt 0 \ + --dfuse-address 0x08000000 \ + -v -v -v \ + --download arm/iotoggle.bin +No valid DFU suffix signature +Warning: File has no DFU suffix +dfu-util 0.5 + +(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc. +(C) 2010-2011 Tormod Volden (DfuSe support) +This program is Free Software and has ABSOLUTELY NO WARRANTY + +dfu-util does currently only support DFU version 1.0 + +Filter on vendor = 0x0483 product = 0xdf11 +Opening DFU capable USB device... ID 0483:df11 +Run-time device DFU version 011a +Found DFU: [0483:df11] devnum=0, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg" +Claiming USB DFU Interface... +Setting Alternate Setting #0 ... +Determining device status: state = dfuERROR, status = 10 +dfuERROR, clearing status +Determining device status: state = dfuIDLE, status = 0 +dfuIDLE, continuing +DFU mode device DFU version 011a +Device returned transfer size 2048 +DfuSe interface name: "Internal Flash " +Memory segment at 0x08000000 4 x 16384 = 65536 (rew) +Memory segment at 0x08010000 1 x 65536 = 65536 (rew) +Memory segment at 0x08020000 7 x 131072 = 917504 (rew) +Uploading to address = 0x08000000, size = 2308 +Erasing page size 16384 at address 0x08000000, page starting at 0x08000000 + Download from image offset 00000000 to memory 08000000-080007ff, size 2048 + Setting address pointer to 0x08000000 + Download from image offset 00000800 to memory 08000800-08000903, size 260 + Setting address pointer to 0x08000800 diff --git a/tools/src/dfu-util/device-logs/stm32f4discovery.lsusb b/tools/src/dfu-util/device-logs/stm32f4discovery.lsusb new file mode 100755 index 0000000..c78530c --- /dev/null +++ b/tools/src/dfu-util/device-logs/stm32f4discovery.lsusb @@ -0,0 +1,80 @@ + +Bus 001 Device 010: ID 0483:df11 SGS Thomson Microelectronics STM Device in DFU Mode +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 1.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x0483 SGS Thomson Microelectronics + idProduct 0xdf11 STM Device in DFU Mode + bcdDevice 21.00 + iManufacturer 1 STMicroelectronics + iProduct 2 STM32 BOOTLOADER + iSerial 3 315A28A0B956 + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 54 + bNumInterfaces 1 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0xc0 + Self Powered + MaxPower 100mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 4 @Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 1 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 5 @Option Bytes /0x1FFFC000/01*016 g + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 2 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 6 @OTP Memory /0x1FFF7800/01*512 g,01*016 g + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 3 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 2 + iInterface 7 @Device Feature/0xFFFF0000/01*004 g + Device Firmware Upgrade Interface Descriptor: + bLength 9 + bDescriptorType 33 + bmAttributes 11 + Will Detach + Manifestation Intolerant + Upload Supported + Download Supported + wDetachTimeout 255 milliseconds + wTransferSize 2048 bytes + bcdDFUVersion 1.1a +Device Status: 0x0001 + Self Powered diff --git a/tools/src/dfu-util/device-logs/tdk-bluetooth.lsusb b/tools/src/dfu-util/device-logs/tdk-bluetooth.lsusb new file mode 100755 index 0000000..ac07bb7 --- /dev/null +++ b/tools/src/dfu-util/device-logs/tdk-bluetooth.lsusb @@ -0,0 +1,269 @@ + +Bus 006 Device 014: ID 04bf:0320 TDK Corp. Bluetooth Adapter +Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 2.00 + bDeviceClass 224 Wireless + bDeviceSubClass 1 Radio Frequency + bDeviceProtocol 1 Bluetooth + bMaxPacketSize0 64 + idVendor 0x04bf TDK Corp. + idProduct 0x0320 Bluetooth Adapter + bcdDevice 26.52 + iManufacturer 1 Ezurio + iProduct 2 Turbo Bluetooth Adapter + iSerial 3 008098D4FFBD + bNumConfigurations 1 + Configuration Descriptor: + bLength 9 + bDescriptorType 2 + wTotalLength 193 + bNumInterfaces 3 + bConfigurationValue 1 + iConfiguration 0 + bmAttributes 0x80 + (Bus Powered) + MaxPower 64mA + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 0 + bAlternateSetting 0 + bNumEndpoints 3 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x81 EP 1 IN + bmAttributes 3 + Transfer Type Interrupt + Synch Type None + Usage Type Data + wMaxPacketSize 0x0010 1x 16 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x02 EP 2 OUT + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x82 EP 2 IN + bmAttributes 2 + Transfer Type Bulk + Synch Type None + Usage Type Data + wMaxPacketSize 0x0040 1x 64 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 0 + bNumEndpoints 2 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x03 EP 3 OUT + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0000 1x 0 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0000 1x 0 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 1 + bNumEndpoints 2 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x03 EP 3 OUT + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0009 1x 9 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0009 1x 9 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 2 + bNumEndpoints 2 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x03 EP 3 OUT + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0011 1x 17 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0011 1x 17 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 3 + bNumEndpoints 2 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x03 EP 3 OUT + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0019 1x 25 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0019 1x 25 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 4 + bNumEndpoints 2 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x03 EP 3 OUT + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0021 1x 33 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0021 1x 33 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 1 + bAlternateSetting 5 + bNumEndpoints 2 + bInterfaceClass 224 Wireless + bInterfaceSubClass 1 Radio Frequency + bInterfaceProtocol 1 Bluetooth + iInterface 0 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x03 EP 3 OUT + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0031 1x 49 bytes + bInterval 1 + Endpoint Descriptor: + bLength 7 + bDescriptorType 5 + bEndpointAddress 0x83 EP 3 IN + bmAttributes 1 + Transfer Type Isochronous + Synch Type None + Usage Type Data + wMaxPacketSize 0x0031 1x 49 bytes + bInterval 1 + Interface Descriptor: + bLength 9 + bDescriptorType 4 + bInterfaceNumber 2 + bAlternateSetting 0 + bNumEndpoints 0 + bInterfaceClass 254 Application Specific Interface + bInterfaceSubClass 1 Device Firmware Update + bInterfaceProtocol 0 + iInterface 0 + Device Firmware Upgrade Interface Descriptor: + bLength 7 + bDescriptorType 33 + bmAttributes 7 + Will Not Detach + Manifestation Tolerant + Upload Supported + Download Supported + wDetachTimeout 5000 milliseconds + wTransferSize 1023 bytes +Device Status: 0x0000 + (Bus Powered) diff --git a/tools/src/dfu-util/dfuse-pack.py b/tools/src/dfu-util/dfuse-pack.py new file mode 100755 index 0000000..022df6a --- /dev/null +++ b/tools/src/dfu-util/dfuse-pack.py @@ -0,0 +1,121 @@ +#!/usr/bin/python + +# Written by Antonio Galea - 2010/11/18 +# Distributed under Gnu LGPL 3.0 +# see http://www.gnu.org/licenses/lgpl-3.0.txt + +import sys,struct,zlib,os +from optparse import OptionParser + +DEFAULT_DEVICE="0x0483:0xdf11" + +def named(tuple,names): + return dict(zip(names.split(),tuple)) +def consume(fmt,data,names): + n = struct.calcsize(fmt) + return named(struct.unpack(fmt,data[:n]),names),data[n:] +def cstring(string): + return string.split('\0',1)[0] +def compute_crc(data): + return 0xFFFFFFFF & -zlib.crc32(data) -1 + +def parse(file,dump_images=False): + print 'File: "%s"' % file + data = open(file,'rb').read() + crc = compute_crc(data[:-4]) + prefix, data = consume('<5sBIB',data,'signature version size targets') + print '%(signature)s v%(version)d, image size: %(size)d, targets: %(targets)d' % prefix + for t in range(prefix['targets']): + tprefix, data = consume('<6sBI255s2I',data,'signature altsetting named name size elements') + tprefix['num'] = t + if tprefix['named']: + tprefix['name'] = cstring(tprefix['name']) + else: + tprefix['name'] = '' + print '%(signature)s %(num)d, alt setting: %(altsetting)s, name: "%(name)s", size: %(size)d, elements: %(elements)d' % tprefix + tsize = tprefix['size'] + target, data = data[:tsize], data[tsize:] + for e in range(tprefix['elements']): + eprefix, target = consume('<2I',target,'address size') + eprefix['num'] = e + print ' %(num)d, address: 0x%(address)08x, size: %(size)d' % eprefix + esize = eprefix['size'] + image, target = target[:esize], target[esize:] + if dump_images: + out = '%s.target%d.image%d.bin' % (file,t,e) + open(out,'wb').write(image) + print ' DUMPED IMAGE TO "%s"' % out + if len(target): + print "target %d: PARSE ERROR" % t + suffix = named(struct.unpack('<4H3sBI',data[:16]),'device product vendor dfu ufd len crc') + print 'usb: %(vendor)04x:%(product)04x, device: 0x%(device)04x, dfu: 0x%(dfu)04x, %(ufd)s, %(len)d, 0x%(crc)08x' % suffix + if crc != suffix['crc']: + print "CRC ERROR: computed crc32 is 0x%08x" % crc + data = data[16:] + if data: + print "PARSE ERROR" + +def build(file,targets,device=DEFAULT_DEVICE): + data = '' + for t,target in enumerate(targets): + tdata = '' + for image in target: + tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data'] + tdata = struct.pack('<6sBI255s2I','Target',0,1,'ST...',len(tdata),len(target)) + tdata + data += tdata + data = struct.pack('<5sBIB','DfuSe',1,len(data)+11,len(targets)) + data + v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1)) + data += struct.pack('<4H3sB',0,d,v,0x011a,'UFD',16) + crc = compute_crc(data) + data += struct.pack(' and +Harald Welte . Over time, nearly complete +support of DFU 1.0, DFU 1.1 and DfuSe ("1.1a") has been added. +.SH LICENCE +.B dfu-util +is covered by the GNU General Public License (GPL), version 2 or later. +.SH COPYRIGHT +This manual page was originally written by Uwe Hermann , +and is now part of the dfu-util project. diff --git a/tools/src/dfu-util/msvc/README_msvc.txt b/tools/src/dfu-util/msvc/README_msvc.txt new file mode 100755 index 0000000..25aeeed --- /dev/null +++ b/tools/src/dfu-util/msvc/README_msvc.txt @@ -0,0 +1,10 @@ +# (C) Roger Meier +# (C) Pascal Schweizer +# msvc folder is GPL-2.0+, LGPL-2.1+, BSD-3-Clause or MIT license(SPDX) + +Building dfu-util native on Windows with Visual Studio + +3rd party dependencies: +- libusbx ( git clone https://github.com/libusbx/libusbx.git ) + - getopt (part of libusbx: libusbx/examples/getopt) + diff --git a/tools/src/dfu-util/msvc/dfu-suffix_2010.vcxproj b/tools/src/dfu-util/msvc/dfu-suffix_2010.vcxproj new file mode 100755 index 0000000..87b7ead --- /dev/null +++ b/tools/src/dfu-util/msvc/dfu-suffix_2010.vcxproj @@ -0,0 +1,100 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA} + dfusuffix + dfu-suffix + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath) + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\dll;$(LibraryPath) + $(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib + $(ExecutablePath) + + + $(ExecutablePath) + $(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath) + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\dll;$(LibraryPath) + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + + + + Level3 + Disabled + HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + true + + + + + Level3 + MaxSpeed + true + true + HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + {a2169bc8-cf99-40bf-83f3-b0e38f7067bd} + + + {349ee8f9-7d25-4909-aaf5-ff3fade72187} + + + + + + \ No newline at end of file diff --git a/tools/src/dfu-util/msvc/dfu-util_2010.sln b/tools/src/dfu-util/msvc/dfu-util_2010.sln new file mode 100755 index 0000000..e6c932c --- /dev/null +++ b/tools/src/dfu-util/msvc/dfu-util_2010.sln @@ -0,0 +1,54 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dfu-util", "dfu-util_2010.vcxproj", "{0E071A60-7EF2-4427-BAA8-9143CACB5BCB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C4F8746D-B27E-4806-95E5-2052174E923B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dfu-suffix", "dfu-suffix_2010.vcxproj", "{8F7600A2-3B37-4956-B39B-A1D43EF29EDA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "getopt_2010", "..\..\libusbx\msvc\getopt_2010.vcxproj", "{AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0 (static)", "..\..\libusbx\msvc\libusb_static_2010.vcxproj", "{349EE8F9-7D25-4909-AAF5-FF3FADE72187}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|Win32.Build.0 = Debug|Win32 + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Debug|x64.ActiveCfg = Debug|Win32 + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|Win32.ActiveCfg = Release|Win32 + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|Win32.Build.0 = Release|Win32 + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB}.Release|x64.ActiveCfg = Release|Win32 + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|Win32.ActiveCfg = Debug|Win32 + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|Win32.Build.0 = Debug|Win32 + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Debug|x64.ActiveCfg = Debug|Win32 + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|Win32.ActiveCfg = Release|Win32 + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|Win32.Build.0 = Release|Win32 + {8F7600A2-3B37-4956-B39B-A1D43EF29EDA}.Release|x64.ActiveCfg = Release|Win32 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|Win32.Build.0 = Debug|Win32 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|x64.ActiveCfg = Debug|x64 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Debug|x64.Build.0 = Debug|x64 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|Win32.ActiveCfg = Release|Win32 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|Win32.Build.0 = Release|Win32 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|x64.ActiveCfg = Release|x64 + {AE83E1B4-CE06-47EE-B7A3-C3A1D7C2D71E}.Release|x64.Build.0 = Release|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.ActiveCfg = Debug|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|Win32.Build.0 = Debug|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.Build.0 = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.ActiveCfg = Release|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|Win32.Build.0 = Release|Win32 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tools/src/dfu-util/msvc/dfu-util_2010.vcxproj b/tools/src/dfu-util/msvc/dfu-util_2010.vcxproj new file mode 100755 index 0000000..cb07b64 --- /dev/null +++ b/tools/src/dfu-util/msvc/dfu-util_2010.vcxproj @@ -0,0 +1,120 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0E071A60-7EF2-4427-BAA8-9143CACB5BCB} + dfuutil + dfu-util + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath) + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\$(Platform)\getopt\$(Configuration);$(LibraryPath) + $(VCInstallDir)atlmfc\lib;$(VCInstallDir)lib + $(ExecutablePath) + + + $(ExecutablePath) + $(SolutionDir)..\..\libusbx\examples\getopt;$(SolutionDir)..\..\libusbx\libusb;$(IncludePath) + $(SolutionDir)..\$(Platform)\getopt\$(Configuration);$(LibraryPath) + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + + + + Level3 + Disabled + HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + true + + + + + + + + + Level3 + MaxSpeed + true + true + HAVE_WINDOWS_H;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + copy $(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-1.0.dll $(SolutionDir)..\$(Platform)\$(ProjectName)\$(Configuration)\ + + + + + + + + + + + + + + + + + + + + + + + + + + {a2169bc8-cf99-40bf-83f3-b0e38f7067bd} + + + {349ee8f9-7d25-4909-aaf5-ff3fade72187} + + + + + + \ No newline at end of file diff --git a/tools/src/dfu-util/src/Makefile.am b/tools/src/dfu-util/src/Makefile.am new file mode 100755 index 0000000..b1f810a --- /dev/null +++ b/tools/src/dfu-util/src/Makefile.am @@ -0,0 +1,28 @@ +AM_CFLAGS = -Wall -Wextra + +bin_PROGRAMS = dfu-util dfu-suffix dfu-prefix +dfu_util_SOURCES = main.c \ + portable.h \ + dfu_load.c \ + dfu_load.h \ + dfu_util.c \ + dfu_util.h \ + dfuse.c \ + dfuse.h \ + dfuse_mem.c \ + dfuse_mem.h \ + dfu.c \ + dfu.h \ + usb_dfu.h \ + dfu_file.c \ + dfu_file.h \ + quirks.c \ + quirks.h + +dfu_suffix_SOURCES = suffix.c \ + dfu_file.h \ + dfu_file.c + +dfu_prefix_SOURCES = prefix.c \ + dfu_file.h \ + dfu_file.c diff --git a/tools/src/dfu-util/src/dfu.c b/tools/src/dfu-util/src/dfu.c new file mode 100755 index 0000000..050ad50 --- /dev/null +++ b/tools/src/dfu-util/src/dfu.c @@ -0,0 +1,357 @@ +/* + * Low-level DFU communication routines, originally taken from + * $Id: dfu.c,v 1.3 2006/06/20 06:28:04 schmidtw Exp $ + * (part of dfu-programmer). + * + * Copyright 2005-2006 Weston Schmidt + * Copyright 2011-2014 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include + +#include "portable.h" +#include "dfu.h" +#include "quirks.h" + +static int dfu_timeout = 5000; /* 5 seconds - default */ + +/* + * DFU_DETACH Request (DFU Spec 1.0, Section 5.1) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * timeout - the timeout in ms the USB device should wait for a pending + * USB reset before giving up and terminating the operation + * + * returns 0 or < 0 on error + */ +int dfu_detach( libusb_device_handle *device, + const unsigned short interface, + const unsigned short timeout ) +{ + return libusb_control_transfer( device, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_DETACH, + /* wValue */ timeout, + /* wIndex */ interface, + /* Data */ NULL, + /* wLength */ 0, + dfu_timeout ); +} + + +/* + * DFU_DNLOAD Request (DFU Spec 1.0, Section 6.1.1) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * length - the total number of bytes to transfer to the USB + * device - must be less than wTransferSize + * data - the data to transfer + * + * returns the number of bytes written or < 0 on error + */ +int dfu_download( libusb_device_handle *device, + const unsigned short interface, + const unsigned short length, + const unsigned short transaction, + unsigned char* data ) +{ + int status; + + status = libusb_control_transfer( device, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_DNLOAD, + /* wValue */ transaction, + /* wIndex */ interface, + /* Data */ data, + /* wLength */ length, + dfu_timeout ); + return status; +} + + +/* + * DFU_UPLOAD Request (DFU Spec 1.0, Section 6.2) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * length - the maximum number of bytes to receive from the USB + * device - must be less than wTransferSize + * data - the buffer to put the received data in + * + * returns the number of bytes received or < 0 on error + */ +int dfu_upload( libusb_device_handle *device, + const unsigned short interface, + const unsigned short length, + const unsigned short transaction, + unsigned char* data ) +{ + int status; + + status = libusb_control_transfer( device, + /* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_UPLOAD, + /* wValue */ transaction, + /* wIndex */ interface, + /* Data */ data, + /* wLength */ length, + dfu_timeout ); + return status; +} + + +/* + * DFU_GETSTATUS Request (DFU Spec 1.0, Section 6.1.2) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * status - the data structure to be populated with the results + * + * return the number of bytes read in or < 0 on an error + */ +int dfu_get_status( struct dfu_if *dif, struct dfu_status *status ) +{ + unsigned char buffer[6]; + int result; + + /* Initialize the status data structure */ + status->bStatus = DFU_STATUS_ERROR_UNKNOWN; + status->bwPollTimeout = 0; + status->bState = STATE_DFU_ERROR; + status->iString = 0; + + result = libusb_control_transfer( dif->dev_handle, + /* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_GETSTATUS, + /* wValue */ 0, + /* wIndex */ dif->interface, + /* Data */ buffer, + /* wLength */ 6, + dfu_timeout ); + + if( 6 == result ) { + status->bStatus = buffer[0]; + if (dif->quirks & QUIRK_POLLTIMEOUT) + status->bwPollTimeout = DEFAULT_POLLTIMEOUT; + else + status->bwPollTimeout = ((0xff & buffer[3]) << 16) | + ((0xff & buffer[2]) << 8) | + (0xff & buffer[1]); + status->bState = buffer[4]; + status->iString = buffer[5]; + } + + return result; +} + + +/* + * DFU_CLRSTATUS Request (DFU Spec 1.0, Section 6.1.3) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * + * return 0 or < 0 on an error + */ +int dfu_clear_status( libusb_device_handle *device, + const unsigned short interface ) +{ + return libusb_control_transfer( device, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT| LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_CLRSTATUS, + /* wValue */ 0, + /* wIndex */ interface, + /* Data */ NULL, + /* wLength */ 0, + dfu_timeout ); +} + + +/* + * DFU_GETSTATE Request (DFU Spec 1.0, Section 6.1.5) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * length - the maximum number of bytes to receive from the USB + * device - must be less than wTransferSize + * data - the buffer to put the received data in + * + * returns the state or < 0 on error + */ +int dfu_get_state( libusb_device_handle *device, + const unsigned short interface ) +{ + int result; + unsigned char buffer[1]; + + result = libusb_control_transfer( device, + /* bmRequestType */ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_GETSTATE, + /* wValue */ 0, + /* wIndex */ interface, + /* Data */ buffer, + /* wLength */ 1, + dfu_timeout ); + + /* Return the error if there is one. */ + if (result < 1) + return -1; + + /* Return the state. */ + return buffer[0]; +} + + +/* + * DFU_ABORT Request (DFU Spec 1.0, Section 6.1.4) + * + * device - the usb_dev_handle to communicate with + * interface - the interface to communicate with + * + * returns 0 or < 0 on an error + */ +int dfu_abort( libusb_device_handle *device, + const unsigned short interface ) +{ + return libusb_control_transfer( device, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_ABORT, + /* wValue */ 0, + /* wIndex */ interface, + /* Data */ NULL, + /* wLength */ 0, + dfu_timeout ); +} + + +const char* dfu_state_to_string( int state ) +{ + const char *message; + + switch (state) { + case STATE_APP_IDLE: + message = "appIDLE"; + break; + case STATE_APP_DETACH: + message = "appDETACH"; + break; + case STATE_DFU_IDLE: + message = "dfuIDLE"; + break; + case STATE_DFU_DOWNLOAD_SYNC: + message = "dfuDNLOAD-SYNC"; + break; + case STATE_DFU_DOWNLOAD_BUSY: + message = "dfuDNBUSY"; + break; + case STATE_DFU_DOWNLOAD_IDLE: + message = "dfuDNLOAD-IDLE"; + break; + case STATE_DFU_MANIFEST_SYNC: + message = "dfuMANIFEST-SYNC"; + break; + case STATE_DFU_MANIFEST: + message = "dfuMANIFEST"; + break; + case STATE_DFU_MANIFEST_WAIT_RESET: + message = "dfuMANIFEST-WAIT-RESET"; + break; + case STATE_DFU_UPLOAD_IDLE: + message = "dfuUPLOAD-IDLE"; + break; + case STATE_DFU_ERROR: + message = "dfuERROR"; + break; + default: + message = NULL; + break; + } + + return message; +} + +/* Chapter 6.1.2 */ +static const char *dfu_status_names[] = { + /* DFU_STATUS_OK */ + "No error condition is present", + /* DFU_STATUS_errTARGET */ + "File is not targeted for use by this device", + /* DFU_STATUS_errFILE */ + "File is for this device but fails some vendor-specific test", + /* DFU_STATUS_errWRITE */ + "Device is unable to write memory", + /* DFU_STATUS_errERASE */ + "Memory erase function failed", + /* DFU_STATUS_errCHECK_ERASED */ + "Memory erase check failed", + /* DFU_STATUS_errPROG */ + "Program memory function failed", + /* DFU_STATUS_errVERIFY */ + "Programmed memory failed verification", + /* DFU_STATUS_errADDRESS */ + "Cannot program memory due to received address that is out of range", + /* DFU_STATUS_errNOTDONE */ + "Received DFU_DNLOAD with wLength = 0, but device does not think that it has all data yet", + /* DFU_STATUS_errFIRMWARE */ + "Device's firmware is corrupt. It cannot return to run-time (non-DFU) operations", + /* DFU_STATUS_errVENDOR */ + "iString indicates a vendor specific error", + /* DFU_STATUS_errUSBR */ + "Device detected unexpected USB reset signalling", + /* DFU_STATUS_errPOR */ + "Device detected unexpected power on reset", + /* DFU_STATUS_errUNKNOWN */ + "Something went wrong, but the device does not know what it was", + /* DFU_STATUS_errSTALLEDPKT */ + "Device stalled an unexpected request" +}; + + +const char *dfu_status_to_string(int status) +{ + if (status > DFU_STATUS_errSTALLEDPKT) + return "INVALID"; + return dfu_status_names[status]; +} + +int dfu_abort_to_idle(struct dfu_if *dif) +{ + int ret; + struct dfu_status dst; + + ret = dfu_abort(dif->dev_handle, dif->interface); + if (ret < 0) { + errx(EX_IOERR, "Error sending dfu abort request"); + exit(1); + } + ret = dfu_get_status(dif, &dst); + if (ret < 0) { + errx(EX_IOERR, "Error during abort get_status"); + exit(1); + } + if (dst.bState != DFU_STATE_dfuIDLE) { + errx(EX_IOERR, "Failed to enter idle state on abort"); + exit(1); + } + milli_sleep(dst.bwPollTimeout); + return ret; +} diff --git a/tools/src/dfu-util/src/dfu.h b/tools/src/dfu-util/src/dfu.h new file mode 100755 index 0000000..39f18c3 --- /dev/null +++ b/tools/src/dfu-util/src/dfu.h @@ -0,0 +1,133 @@ +/* + * dfu-programmer + * + * $Id: dfu.h,v 1.2 2005/09/25 01:27:42 schmidtw Exp $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DFU_H +#define DFU_H + +#include +#include "usb_dfu.h" + +/* DFU states */ +#define STATE_APP_IDLE 0x00 +#define STATE_APP_DETACH 0x01 +#define STATE_DFU_IDLE 0x02 +#define STATE_DFU_DOWNLOAD_SYNC 0x03 +#define STATE_DFU_DOWNLOAD_BUSY 0x04 +#define STATE_DFU_DOWNLOAD_IDLE 0x05 +#define STATE_DFU_MANIFEST_SYNC 0x06 +#define STATE_DFU_MANIFEST 0x07 +#define STATE_DFU_MANIFEST_WAIT_RESET 0x08 +#define STATE_DFU_UPLOAD_IDLE 0x09 +#define STATE_DFU_ERROR 0x0a + + +/* DFU status */ +#define DFU_STATUS_OK 0x00 +#define DFU_STATUS_ERROR_TARGET 0x01 +#define DFU_STATUS_ERROR_FILE 0x02 +#define DFU_STATUS_ERROR_WRITE 0x03 +#define DFU_STATUS_ERROR_ERASE 0x04 +#define DFU_STATUS_ERROR_CHECK_ERASED 0x05 +#define DFU_STATUS_ERROR_PROG 0x06 +#define DFU_STATUS_ERROR_VERIFY 0x07 +#define DFU_STATUS_ERROR_ADDRESS 0x08 +#define DFU_STATUS_ERROR_NOTDONE 0x09 +#define DFU_STATUS_ERROR_FIRMWARE 0x0a +#define DFU_STATUS_ERROR_VENDOR 0x0b +#define DFU_STATUS_ERROR_USBR 0x0c +#define DFU_STATUS_ERROR_POR 0x0d +#define DFU_STATUS_ERROR_UNKNOWN 0x0e +#define DFU_STATUS_ERROR_STALLEDPKT 0x0f + +/* DFU commands */ +#define DFU_DETACH 0 +#define DFU_DNLOAD 1 +#define DFU_UPLOAD 2 +#define DFU_GETSTATUS 3 +#define DFU_CLRSTATUS 4 +#define DFU_GETSTATE 5 +#define DFU_ABORT 6 + +/* DFU interface */ +#define DFU_IFF_DFU 0x0001 /* DFU Mode, (not Runtime) */ + +/* This is based off of DFU_GETSTATUS + * + * 1 unsigned byte bStatus + * 3 unsigned byte bwPollTimeout + * 1 unsigned byte bState + * 1 unsigned byte iString +*/ + +struct dfu_status { + unsigned char bStatus; + unsigned int bwPollTimeout; + unsigned char bState; + unsigned char iString; +}; + +struct dfu_if { + struct usb_dfu_func_descriptor func_dfu; + uint16_t quirks; + uint16_t busnum; + uint16_t devnum; + uint16_t vendor; + uint16_t product; + uint16_t bcdDevice; + uint8_t configuration; + uint8_t interface; + uint8_t altsetting; + uint8_t flags; + uint8_t bMaxPacketSize0; + char *alt_name; + char *serial_name; + libusb_device *dev; + libusb_device_handle *dev_handle; + struct dfu_if *next; +}; + +int dfu_detach( libusb_device_handle *device, + const unsigned short interface, + const unsigned short timeout ); +int dfu_download( libusb_device_handle *device, + const unsigned short interface, + const unsigned short length, + const unsigned short transaction, + unsigned char* data ); +int dfu_upload( libusb_device_handle *device, + const unsigned short interface, + const unsigned short length, + const unsigned short transaction, + unsigned char* data ); +int dfu_get_status( struct dfu_if *dif, + struct dfu_status *status ); +int dfu_clear_status( libusb_device_handle *device, + const unsigned short interface ); +int dfu_get_state( libusb_device_handle *device, + const unsigned short interface ); +int dfu_abort( libusb_device_handle *device, + const unsigned short interface ); +int dfu_abort_to_idle( struct dfu_if *dif); + +const char *dfu_state_to_string( int state ); + +const char *dfu_status_to_string( int status ); + +#endif /* DFU_H */ diff --git a/tools/src/dfu-util/src/dfu_file.c b/tools/src/dfu-util/src/dfu_file.c new file mode 100755 index 0000000..2f5a585 --- /dev/null +++ b/tools/src/dfu-util/src/dfu_file.c @@ -0,0 +1,444 @@ +/* + * Load or store DFU files including suffix and prefix + * + * Copyright 2014 Tormod Volden + * Copyright 2012 Stefan Schmidt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "portable.h" +#include "dfu_file.h" + +#define DFU_SUFFIX_LENGTH 16 +#define LMDFU_PREFIX_LENGTH 8 +#define LPCDFU_PREFIX_LENGTH 16 +#define PROGRESS_BAR_WIDTH 25 +#define STDIN_CHUNK_SIZE 65536 + +static const unsigned long crc32_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d}; + +static uint32_t crc32_byte(uint32_t accum, uint8_t delta) +{ + return crc32_table[(accum ^ delta) & 0xff] ^ (accum >> 8); +} + +static int probe_prefix(struct dfu_file *file) +{ + uint8_t *prefix = file->firmware; + + if (file->size.total < LMDFU_PREFIX_LENGTH) + return 1; + if ((prefix[0] == 0x01) && (prefix[1] == 0x00)) { + file->prefix_type = LMDFU_PREFIX; + file->size.prefix = LMDFU_PREFIX_LENGTH; + file->lmdfu_address = 1024 * ((prefix[3] << 8) | prefix[2]); + } + else if (((prefix[0] & 0x3f) == 0x1a) && ((prefix[1] & 0x3f)== 0x3f)) { + file->prefix_type = LPCDFU_UNENCRYPTED_PREFIX; + file->size.prefix = LPCDFU_PREFIX_LENGTH; + } + + if (file->size.prefix + file->size.suffix > file->size.total) + return 1; + return 0; +} + +void dfu_progress_bar(const char *desc, unsigned long long curr, + unsigned long long max) +{ + static char buf[PROGRESS_BAR_WIDTH + 1]; + static unsigned long long last_progress = -1; + static time_t last_time; + time_t curr_time = time(NULL); + unsigned long long progress; + unsigned long long x; + + /* check for not known maximum */ + if (max < curr) + max = curr + 1; + /* make none out of none give zero */ + if (max == 0 && curr == 0) + max = 1; + + /* compute completion */ + progress = (PROGRESS_BAR_WIDTH * curr) / max; + if (progress > PROGRESS_BAR_WIDTH) + progress = PROGRESS_BAR_WIDTH; + if (progress == last_progress && + curr_time == last_time) + return; + last_progress = progress; + last_time = curr_time; + + for (x = 0; x != PROGRESS_BAR_WIDTH; x++) { + if (x < progress) + buf[x] = '='; + else + buf[x] = ' '; + } + buf[x] = 0; + + printf("\r%s\t[%s] %3lld%% %12lld bytes", desc, buf, + (100ULL * curr) / max, curr); + + if (progress == PROGRESS_BAR_WIDTH) + printf("\n%s done.\n", desc); +} + +void *dfu_malloc(size_t size) +{ + void *ptr = malloc(size); + if (ptr == NULL) + errx(EX_SOFTWARE, "Cannot allocate memory of size %d bytes", (int)size); + return (ptr); +} + +uint32_t dfu_file_write_crc(int f, uint32_t crc, const void *buf, int size) +{ + int x; + + /* compute CRC */ + for (x = 0; x != size; x++) + crc = crc32_byte(crc, ((uint8_t *)buf)[x]); + + /* write data */ + if (write(f, buf, size) != size) + err(EX_IOERR, "Could not write %d bytes to file %d", size, f); + + return (crc); +} + +void dfu_load_file(struct dfu_file *file, enum suffix_req check_suffix, enum prefix_req check_prefix) +{ + off_t offset; + int f; + int i; + int res; + + file->size.prefix = 0; + file->size.suffix = 0; + + /* default values, if no valid suffix is found */ + file->bcdDFU = 0; + file->idVendor = 0xffff; /* wildcard value */ + file->idProduct = 0xffff; /* wildcard value */ + file->bcdDevice = 0xffff; /* wildcard value */ + + /* default values, if no valid prefix is found */ + file->lmdfu_address = 0; + + free(file->firmware); + + if (!strcmp(file->name, "-")) { + int read_bytes; + +#ifdef WIN32 + _setmode( _fileno( stdin ), _O_BINARY ); +#endif + file->firmware = (uint8_t*) dfu_malloc(STDIN_CHUNK_SIZE); + read_bytes = fread(file->firmware, 1, STDIN_CHUNK_SIZE, stdin); + file->size.total = read_bytes; + while (read_bytes == STDIN_CHUNK_SIZE) { + file->firmware = (uint8_t*) realloc(file->firmware, file->size.total + STDIN_CHUNK_SIZE); + if (!file->firmware) + err(EX_IOERR, "Could not allocate firmware buffer"); + read_bytes = fread(file->firmware + file->size.total, 1, STDIN_CHUNK_SIZE, stdin); + file->size.total += read_bytes; + } + if (verbose) + printf("Read %i bytes from stdin\n", file->size.total); + /* Never require suffix when reading from stdin */ + check_suffix = MAYBE_SUFFIX; + } else { + f = open(file->name, O_RDONLY | O_BINARY); + if (f < 0) + err(EX_IOERR, "Could not open file %s for reading", file->name); + + offset = lseek(f, 0, SEEK_END); + + if ((int)offset < 0 || (int)offset != offset) + err(EX_IOERR, "File size is too big"); + + if (lseek(f, 0, SEEK_SET) != 0) + err(EX_IOERR, "Could not seek to beginning"); + + file->size.total = offset; + file->firmware = dfu_malloc(file->size.total); + + if (read(f, file->firmware, file->size.total) != file->size.total) { + err(EX_IOERR, "Could not read %d bytes from %s", + file->size.total, file->name); + } + close(f); + } + + /* Check for possible DFU file suffix by trying to parse one */ + { + uint32_t crc = 0xffffffff; + const uint8_t *dfusuffix; + int missing_suffix = 0; + const char *reason; + + if (file->size.total < DFU_SUFFIX_LENGTH) { + reason = "File too short for DFU suffix"; + missing_suffix = 1; + goto checked; + } + + dfusuffix = file->firmware + file->size.total - + DFU_SUFFIX_LENGTH; + + for (i = 0; i < file->size.total - 4; i++) + crc = crc32_byte(crc, file->firmware[i]); + + if (dfusuffix[10] != 'D' || + dfusuffix[9] != 'F' || + dfusuffix[8] != 'U') { + reason = "Invalid DFU suffix signature"; + missing_suffix = 1; + goto checked; + } + + file->dwCRC = (dfusuffix[15] << 24) + + (dfusuffix[14] << 16) + + (dfusuffix[13] << 8) + + dfusuffix[12]; + + if (file->dwCRC != crc) { + reason = "DFU suffix CRC does not match"; + missing_suffix = 1; + goto checked; + } + + /* At this point we believe we have a DFU suffix + so we require further checks to succeed */ + + file->bcdDFU = (dfusuffix[7] << 8) + dfusuffix[6]; + + if (verbose) + printf("DFU suffix version %x\n", file->bcdDFU); + + file->size.suffix = dfusuffix[11]; + + if (file->size.suffix < DFU_SUFFIX_LENGTH) { + errx(EX_IOERR, "Unsupported DFU suffix length %d", + file->size.suffix); + } + + if (file->size.suffix > file->size.total) { + errx(EX_IOERR, "Invalid DFU suffix length %d", + file->size.suffix); + } + + file->idVendor = (dfusuffix[5] << 8) + dfusuffix[4]; + file->idProduct = (dfusuffix[3] << 8) + dfusuffix[2]; + file->bcdDevice = (dfusuffix[1] << 8) + dfusuffix[0]; + +checked: + if (missing_suffix) { + if (check_suffix == NEEDS_SUFFIX) { + warnx("%s", reason); + errx(EX_IOERR, "Valid DFU suffix needed"); + } else if (check_suffix == MAYBE_SUFFIX) { + warnx("%s", reason); + warnx("A valid DFU suffix will be required in " + "a future dfu-util release!!!"); + } + } else { + if (check_suffix == NO_SUFFIX) { + errx(EX_SOFTWARE, "Please remove existing DFU suffix before adding a new one.\n"); + } + } + } + res = probe_prefix(file); + if ((res || file->size.prefix == 0) && check_prefix == NEEDS_PREFIX) + errx(EX_IOERR, "Valid DFU prefix needed"); + if (file->size.prefix && check_prefix == NO_PREFIX) + errx(EX_IOERR, "A prefix already exists, please delete it first"); + if (file->size.prefix && verbose) { + uint8_t *data = file->firmware; + if (file->prefix_type == LMDFU_PREFIX) + printf("Possible TI Stellaris DFU prefix with " + "the following properties\n" + "Address: 0x%08x\n" + "Payload length: %d\n", + file->lmdfu_address, + data[4] | (data[5] << 8) | + (data[6] << 16) | (data[7] << 14)); + else if (file->prefix_type == LPCDFU_UNENCRYPTED_PREFIX) + printf("Possible unencrypted NXP LPC DFU prefix with " + "the following properties\n" + "Payload length: %d kiByte\n", + data[2] >>1 | (data[3] << 7) ); + else + errx(EX_IOERR, "Unknown DFU prefix type"); + } +} + +void dfu_store_file(struct dfu_file *file, int write_suffix, int write_prefix) +{ + uint32_t crc = 0xffffffff; + int f; + + f = open(file->name, O_WRONLY | O_BINARY | O_TRUNC | O_CREAT, 0666); + if (f < 0) + err(EX_IOERR, "Could not open file %s for writing", file->name); + + /* write prefix, if any */ + if (write_prefix) { + if (file->prefix_type == LMDFU_PREFIX) { + uint8_t lmdfu_prefix[LMDFU_PREFIX_LENGTH]; + uint32_t addr = file->lmdfu_address / 1024; + + /* lmdfu_dfu_prefix payload length excludes prefix and suffix */ + uint32_t len = file->size.total - + file->size.prefix - file->size.suffix; + + lmdfu_prefix[0] = 0x01; /* STELLARIS_DFU_PROG */ + lmdfu_prefix[1] = 0x00; /* Reserved */ + lmdfu_prefix[2] = (uint8_t)(addr & 0xff); + lmdfu_prefix[3] = (uint8_t)(addr >> 8); + lmdfu_prefix[4] = (uint8_t)(len & 0xff); + lmdfu_prefix[5] = (uint8_t)(len >> 8) & 0xff; + lmdfu_prefix[6] = (uint8_t)(len >> 16) & 0xff; + lmdfu_prefix[7] = (uint8_t)(len >> 24); + + crc = dfu_file_write_crc(f, crc, lmdfu_prefix, LMDFU_PREFIX_LENGTH); + } + if (file->prefix_type == LPCDFU_UNENCRYPTED_PREFIX) { + uint8_t lpcdfu_prefix[LPCDFU_PREFIX_LENGTH] = {0}; + int i; + + /* Payload is firmware and prefix rounded to 512 bytes */ + uint32_t len = (file->size.total - file->size.suffix + 511) /512; + + lpcdfu_prefix[0] = 0x1a; /* Unencypted*/ + lpcdfu_prefix[1] = 0x3f; /* Reserved */ + lpcdfu_prefix[2] = (uint8_t)(len & 0xff); + lpcdfu_prefix[3] = (uint8_t)((len >> 8) & 0xff); + for (i = 12; i < LPCDFU_PREFIX_LENGTH; i++) + lpcdfu_prefix[i] = 0xff; + + crc = dfu_file_write_crc(f, crc, lpcdfu_prefix, LPCDFU_PREFIX_LENGTH); + } + } + /* write firmware binary */ + crc = dfu_file_write_crc(f, crc, file->firmware + file->size.prefix, + file->size.total - file->size.prefix - file->size.suffix); + + /* write suffix, if any */ + if (write_suffix) { + uint8_t dfusuffix[DFU_SUFFIX_LENGTH]; + + dfusuffix[0] = file->bcdDevice & 0xff; + dfusuffix[1] = file->bcdDevice >> 8; + dfusuffix[2] = file->idProduct & 0xff; + dfusuffix[3] = file->idProduct >> 8; + dfusuffix[4] = file->idVendor & 0xff; + dfusuffix[5] = file->idVendor >> 8; + dfusuffix[6] = file->bcdDFU & 0xff; + dfusuffix[7] = file->bcdDFU >> 8; + dfusuffix[8] = 'U'; + dfusuffix[9] = 'F'; + dfusuffix[10] = 'D'; + dfusuffix[11] = DFU_SUFFIX_LENGTH; + + crc = dfu_file_write_crc(f, crc, dfusuffix, + DFU_SUFFIX_LENGTH - 4); + + dfusuffix[12] = crc; + dfusuffix[13] = crc >> 8; + dfusuffix[14] = crc >> 16; + dfusuffix[15] = crc >> 24; + + crc = dfu_file_write_crc(f, crc, dfusuffix + 12, 4); + } + close(f); +} + +void show_suffix_and_prefix(struct dfu_file *file) +{ + if (file->size.prefix == LMDFU_PREFIX_LENGTH) { + printf("The file %s contains a TI Stellaris DFU prefix with the following properties:\n", file->name); + printf("Address:\t0x%08x\n", file->lmdfu_address); + } else if (file->size.prefix == LPCDFU_PREFIX_LENGTH) { + uint8_t * prefix = file->firmware; + printf("The file %s contains a NXP unencrypted LPC DFU prefix with the following properties:\n", file->name); + printf("Size:\t%5d kiB\n", prefix[2]>>1|prefix[3]<<7); + } else if (file->size.prefix != 0) { + printf("The file %s contains an unknown prefix\n", file->name); + } + if (file->size.suffix > 0) { + printf("The file %s contains a DFU suffix with the following properties:\n", file->name); + printf("BCD device:\t0x%04X\n", file->bcdDevice); + printf("Product ID:\t0x%04X\n",file->idProduct); + printf("Vendor ID:\t0x%04X\n", file->idVendor); + printf("BCD DFU:\t0x%04X\n", file->bcdDFU); + printf("Length:\t\t%i\n", file->size.suffix); + printf("CRC:\t\t0x%08X\n", file->dwCRC); + } +} diff --git a/tools/src/dfu-util/src/dfu_file.h b/tools/src/dfu-util/src/dfu_file.h new file mode 100755 index 0000000..31c90b8 --- /dev/null +++ b/tools/src/dfu-util/src/dfu_file.h @@ -0,0 +1,60 @@ + +#ifndef DFU_FILE_H +#define DFU_FILE_H + +#include + +struct dfu_file { + /* File name */ + const char *name; + /* Pointer to file loaded into memory */ + uint8_t *firmware; + /* Different sizes */ + struct { + int total; + int prefix; + int suffix; + } size; + /* From prefix fields */ + uint32_t lmdfu_address; + /* From prefix fields */ + uint32_t prefix_type; + + /* From DFU suffix fields */ + uint32_t dwCRC; + uint16_t bcdDFU; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; +}; + +enum suffix_req { + NO_SUFFIX, + NEEDS_SUFFIX, + MAYBE_SUFFIX +}; + +enum prefix_req { + NO_PREFIX, + NEEDS_PREFIX, + MAYBE_PREFIX +}; + +enum prefix_type { + ZERO_PREFIX, + LMDFU_PREFIX, + LPCDFU_UNENCRYPTED_PREFIX +}; + +extern int verbose; + +void dfu_load_file(struct dfu_file *file, enum suffix_req check_suffix, enum prefix_req check_prefix); +void dfu_store_file(struct dfu_file *file, int write_suffix, int write_prefix); + +void dfu_progress_bar(const char *desc, unsigned long long curr, + unsigned long long max); +void *dfu_malloc(size_t size); +uint32_t dfu_file_write_crc(int f, uint32_t crc, const void *buf, int size); +void show_suffix_and_prefix(struct dfu_file *file); + +#endif /* DFU_FILE_H */ diff --git a/tools/src/dfu-util/src/dfu_load.c b/tools/src/dfu-util/src/dfu_load.c new file mode 100755 index 0000000..d4ff51c --- /dev/null +++ b/tools/src/dfu-util/src/dfu_load.c @@ -0,0 +1,196 @@ +/* + * DFU transfer routines + * + * This is supposed to be a general DFU implementation, as specified in the + * USB DFU 1.0 and 1.1 specification. + * + * The code was originally intended to interface with a USB device running the + * "sam7dfu" firmware (see http://www.openpcd.org/) on an AT91SAM7 processor. + * + * Copyright 2007-2008 Harald Welte + * Copyright 2013 Hans Petter Selasky + * Copyright 2014 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include + +#include + +#include "portable.h" +#include "dfu.h" +#include "usb_dfu.h" +#include "dfu_file.h" +#include "dfu_load.h" +#include "quirks.h" + +int dfuload_do_upload(struct dfu_if *dif, int xfer_size, + int expected_size, int fd) +{ + int total_bytes = 0; + unsigned short transaction = 0; + unsigned char *buf; + int ret; + + buf = dfu_malloc(xfer_size); + + printf("Copying data from DFU device to PC\n"); + dfu_progress_bar("Upload", 0, 1); + + while (1) { + int rc; + rc = dfu_upload(dif->dev_handle, dif->interface, + xfer_size, transaction++, buf); + if (rc < 0) { + warnx("Error during upload"); + ret = rc; + goto out_free; + } + + dfu_file_write_crc(fd, 0, buf, rc); + total_bytes += rc; + + if (total_bytes < 0) + errx(EX_SOFTWARE, "Received too many bytes (wraparound)"); + + if (rc < xfer_size) { + /* last block, return */ + ret = total_bytes; + break; + } + dfu_progress_bar("Upload", total_bytes, expected_size); + } + ret = 0; + +out_free: + dfu_progress_bar("Upload", total_bytes, total_bytes); + if (total_bytes == 0) + printf("\nFailed.\n"); + free(buf); + if (verbose) + printf("Received a total of %i bytes\n", total_bytes); + if (expected_size != 0 && total_bytes != expected_size) + errx(EX_SOFTWARE, "Unexpected number of bytes uploaded from device"); + return ret; +} + +int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file) +{ + int bytes_sent; + int expected_size; + unsigned char *buf; + unsigned short transaction = 0; + struct dfu_status dst; + int ret; + + printf("Copying data from PC to DFU device\n"); + + buf = file->firmware; + expected_size = file->size.total - file->size.suffix; + bytes_sent = 0; + + dfu_progress_bar("Download", 0, 1); + while (bytes_sent < expected_size) { + int bytes_left; + int chunk_size; + + bytes_left = expected_size - bytes_sent; + if (bytes_left < xfer_size) + chunk_size = bytes_left; + else + chunk_size = xfer_size; + + ret = dfu_download(dif->dev_handle, dif->interface, + chunk_size, transaction++, chunk_size ? buf : NULL); + if (ret < 0) { + warnx("Error during download"); + goto out; + } + bytes_sent += chunk_size; + buf += chunk_size; + + do { + ret = dfu_get_status(dif, &dst); + if (ret < 0) { + errx(EX_IOERR, "Error during download get_status"); + goto out; + } + + if (dst.bState == DFU_STATE_dfuDNLOAD_IDLE || + dst.bState == DFU_STATE_dfuERROR) + break; + + /* Wait while device executes flashing */ + milli_sleep(dst.bwPollTimeout); + + } while (1); + if (dst.bStatus != DFU_STATUS_OK) { + printf(" failed!\n"); + printf("state(%u) = %s, status(%u) = %s\n", dst.bState, + dfu_state_to_string(dst.bState), dst.bStatus, + dfu_status_to_string(dst.bStatus)); + ret = -1; + goto out; + } + dfu_progress_bar("Download", bytes_sent, bytes_sent + bytes_left); + } + + /* send one zero sized download request to signalize end */ + ret = dfu_download(dif->dev_handle, dif->interface, + 0, transaction, NULL); + if (ret < 0) { + errx(EX_IOERR, "Error sending completion packet"); + goto out; + } + + dfu_progress_bar("Download", bytes_sent, bytes_sent); + + if (verbose) + printf("Sent a total of %i bytes\n", bytes_sent); + +get_status: + /* Transition to MANIFEST_SYNC state */ + ret = dfu_get_status(dif, &dst); + if (ret < 0) { + warnx("unable to read DFU status after completion"); + goto out; + } + printf("state(%u) = %s, status(%u) = %s\n", dst.bState, + dfu_state_to_string(dst.bState), dst.bStatus, + dfu_status_to_string(dst.bStatus)); + + milli_sleep(dst.bwPollTimeout); + + /* FIXME: deal correctly with ManifestationTolerant=0 / WillDetach bits */ + switch (dst.bState) { + case DFU_STATE_dfuMANIFEST_SYNC: + case DFU_STATE_dfuMANIFEST: + /* some devices (e.g. TAS1020b) need some time before we + * can obtain the status */ + milli_sleep(1000); + goto get_status; + break; + case DFU_STATE_dfuIDLE: + break; + } + printf("Done!\n"); + +out: + return bytes_sent; +} diff --git a/tools/src/dfu-util/src/dfu_load.h b/tools/src/dfu-util/src/dfu_load.h new file mode 100755 index 0000000..fe363aa --- /dev/null +++ b/tools/src/dfu-util/src/dfu_load.h @@ -0,0 +1,7 @@ +#ifndef DFU_LOAD_H +#define DFU_LOAD_H + +int dfuload_do_upload(struct dfu_if *dif, int xfer_size, int expected_size, int fd); +int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file); + +#endif /* DFU_LOAD_H */ diff --git a/tools/src/dfu-util/src/dfu_util.c b/tools/src/dfu-util/src/dfu_util.c new file mode 100755 index 0000000..d9ad2d0 --- /dev/null +++ b/tools/src/dfu-util/src/dfu_util.c @@ -0,0 +1,346 @@ +/* + * Functions for detecting DFU USB entities + * + * Written by Harald Welte + * Copyright 2007-2008 by OpenMoko, Inc. + * Copyright 2013 Hans Petter Selasky + * + * Based on existing code of dfu-programmer-0.4 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include "portable.h" +#include "dfu.h" +#include "usb_dfu.h" +#include "dfu_file.h" +#include "dfu_load.h" +#include "dfu_util.h" +#include "dfuse.h" +#include "quirks.h" + +#ifdef HAVE_USBPATH_H +#include +#endif + +/* + * Look for a descriptor in a concatenated descriptor list. Will + * return upon the first match of the given descriptor type. Returns length of + * found descriptor, limited to res_size + */ +static int find_descriptor(const uint8_t *desc_list, int list_len, + uint8_t desc_type, void *res_buf, int res_size) +{ + int p = 0; + + if (list_len < 2) + return (-1); + + while (p + 1 < list_len) { + int desclen; + + desclen = (int) desc_list[p]; + if (desclen == 0) { + warnx("Invalid descriptor list"); + return -1; + } + if (desc_list[p + 1] == desc_type) { + if (desclen > res_size) + desclen = res_size; + if (p + desclen > list_len) + desclen = list_len - p; + memcpy(res_buf, &desc_list[p], desclen); + return desclen; + } + p += (int) desc_list[p]; + } + return -1; +} + +static void probe_configuration(libusb_device *dev, struct libusb_device_descriptor *desc) +{ + struct usb_dfu_func_descriptor func_dfu; + libusb_device_handle *devh; + struct dfu_if *pdfu; + struct libusb_config_descriptor *cfg; + const struct libusb_interface_descriptor *intf; + const struct libusb_interface *uif; + char alt_name[MAX_DESC_STR_LEN + 1]; + char serial_name[MAX_DESC_STR_LEN + 1]; + int cfg_idx; + int intf_idx; + int alt_idx; + int ret; + int has_dfu; + + for (cfg_idx = 0; cfg_idx != desc->bNumConfigurations; cfg_idx++) { + memset(&func_dfu, 0, sizeof(func_dfu)); + has_dfu = 0; + + ret = libusb_get_config_descriptor(dev, cfg_idx, &cfg); + if (ret != 0) + return; + if (match_config_index > -1 && match_config_index != cfg->bConfigurationValue) { + libusb_free_config_descriptor(cfg); + continue; + } + + /* + * In some cases, noticably FreeBSD if uid != 0, + * the configuration descriptors are empty + */ + if (!cfg) + return; + + ret = find_descriptor(cfg->extra, cfg->extra_length, + USB_DT_DFU, &func_dfu, sizeof(func_dfu)); + if (ret > -1) + goto found_dfu; + + for (intf_idx = 0; intf_idx < cfg->bNumInterfaces; + intf_idx++) { + uif = &cfg->interface[intf_idx]; + if (!uif) + break; + + for (alt_idx = 0; alt_idx < cfg->interface[intf_idx].num_altsetting; + alt_idx++) { + intf = &uif->altsetting[alt_idx]; + + ret = find_descriptor(intf->extra, intf->extra_length, USB_DT_DFU, + &func_dfu, sizeof(func_dfu)); + if (ret > -1) + goto found_dfu; + + if (intf->bInterfaceClass != 0xfe || + intf->bInterfaceSubClass != 1) + continue; + + has_dfu = 1; + } + } + if (has_dfu) { + /* + * Finally try to retrieve it requesting the + * device directly This is not supported on + * all devices for non-standard types + */ + if (libusb_open(dev, &devh) == 0) { + ret = libusb_get_descriptor(devh, USB_DT_DFU, 0, + (void *)&func_dfu, sizeof(func_dfu)); + libusb_close(devh); + if (ret > -1) + goto found_dfu; + } + warnx("Device has DFU interface, " + "but has no DFU functional descriptor"); + + /* fake version 1.0 */ + func_dfu.bLength = 7; + func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100); + goto found_dfu; + } + libusb_free_config_descriptor(cfg); + continue; + +found_dfu: + if (func_dfu.bLength == 7) { + printf("Deducing device DFU version from functional descriptor " + "length\n"); + func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100); + } else if (func_dfu.bLength < 9) { + printf("Error obtaining DFU functional descriptor\n"); + printf("Please report this as a bug!\n"); + printf("Warning: Assuming DFU version 1.0\n"); + func_dfu.bcdDFUVersion = libusb_cpu_to_le16(0x0100); + printf("Warning: Transfer size can not be detected\n"); + func_dfu.wTransferSize = 0; + } + + for (intf_idx = 0; intf_idx < cfg->bNumInterfaces; + intf_idx++) { + if (match_iface_index > -1 && match_iface_index != intf_idx) + continue; + + uif = &cfg->interface[intf_idx]; + if (!uif) + break; + + for (alt_idx = 0; + alt_idx < uif->num_altsetting; alt_idx++) { + int dfu_mode; + + intf = &uif->altsetting[alt_idx]; + + if (intf->bInterfaceClass != 0xfe || + intf->bInterfaceSubClass != 1) + continue; + + dfu_mode = (intf->bInterfaceProtocol == 2); + /* e.g. DSO Nano has bInterfaceProtocol 0 instead of 2 */ + if (func_dfu.bcdDFUVersion == 0x011a && intf->bInterfaceProtocol == 0) + dfu_mode = 1; + + if (dfu_mode && + match_iface_alt_index > -1 && match_iface_alt_index != alt_idx) + continue; + + if (dfu_mode) { + if ((match_vendor_dfu >= 0 && match_vendor_dfu != desc->idVendor) || + (match_product_dfu >= 0 && match_product_dfu != desc->idProduct)) { + continue; + } + } else { + if ((match_vendor >= 0 && match_vendor != desc->idVendor) || + (match_product >= 0 && match_product != desc->idProduct)) { + continue; + } + } + + if (libusb_open(dev, &devh)) { + warnx("Cannot open DFU device %04x:%04x", desc->idVendor, desc->idProduct); + break; + } + if (intf->iInterface != 0) + ret = libusb_get_string_descriptor_ascii(devh, + intf->iInterface, (void *)alt_name, MAX_DESC_STR_LEN); + else + ret = -1; + if (ret < 1) + strcpy(alt_name, "UNKNOWN"); + if (desc->iSerialNumber != 0) + ret = libusb_get_string_descriptor_ascii(devh, + desc->iSerialNumber, (void *)serial_name, MAX_DESC_STR_LEN); + else + ret = -1; + if (ret < 1) + strcpy(serial_name, "UNKNOWN"); + libusb_close(devh); + + if (dfu_mode && + match_iface_alt_name != NULL && strcmp(alt_name, match_iface_alt_name)) + continue; + + if (dfu_mode) { + if (match_serial_dfu != NULL && strcmp(match_serial_dfu, serial_name)) + continue; + } else { + if (match_serial != NULL && strcmp(match_serial, serial_name)) + continue; + } + + pdfu = dfu_malloc(sizeof(*pdfu)); + + memset(pdfu, 0, sizeof(*pdfu)); + + pdfu->func_dfu = func_dfu; + pdfu->dev = libusb_ref_device(dev); + pdfu->quirks = get_quirks(desc->idVendor, + desc->idProduct, desc->bcdDevice); + pdfu->vendor = desc->idVendor; + pdfu->product = desc->idProduct; + pdfu->bcdDevice = desc->bcdDevice; + pdfu->configuration = cfg->bConfigurationValue; + pdfu->interface = intf->bInterfaceNumber; + pdfu->altsetting = intf->bAlternateSetting; + pdfu->devnum = libusb_get_device_address(dev); + pdfu->busnum = libusb_get_bus_number(dev); + pdfu->alt_name = strdup(alt_name); + if (pdfu->alt_name == NULL) + errx(EX_SOFTWARE, "Out of memory"); + pdfu->serial_name = strdup(serial_name); + if (pdfu->serial_name == NULL) + errx(EX_SOFTWARE, "Out of memory"); + if (dfu_mode) + pdfu->flags |= DFU_IFF_DFU; + if (pdfu->quirks & QUIRK_FORCE_DFU11) { + pdfu->func_dfu.bcdDFUVersion = + libusb_cpu_to_le16(0x0110); + } + pdfu->bMaxPacketSize0 = desc->bMaxPacketSize0; + + /* queue into list */ + pdfu->next = dfu_root; + dfu_root = pdfu; + } + } + libusb_free_config_descriptor(cfg); + } +} + +void probe_devices(libusb_context *ctx) +{ + libusb_device **list; + ssize_t num_devs; + ssize_t i; + + num_devs = libusb_get_device_list(ctx, &list); + for (i = 0; i < num_devs; ++i) { + struct libusb_device_descriptor desc; + struct libusb_device *dev = list[i]; + + if (match_bus > -1 && match_bus != libusb_get_bus_number(dev)) + continue; + if (match_device > -1 && match_device != libusb_get_device_address(dev)) + continue; + if (libusb_get_device_descriptor(dev, &desc)) + continue; + probe_configuration(dev, &desc); + } + libusb_free_device_list(list, 0); +} + +void disconnect_devices(void) +{ + struct dfu_if *pdfu; + struct dfu_if *prev = NULL; + + for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next) { + free(prev); + libusb_unref_device(pdfu->dev); + free(pdfu->alt_name); + free(pdfu->serial_name); + prev = pdfu; + } + free(prev); + dfu_root = NULL; +} + +void print_dfu_if(struct dfu_if *dfu_if) +{ + printf("Found %s: [%04x:%04x] ver=%04x, devnum=%u, cfg=%u, intf=%u, " + "alt=%u, name=\"%s\", serial=\"%s\"\n", + dfu_if->flags & DFU_IFF_DFU ? "DFU" : "Runtime", + dfu_if->vendor, dfu_if->product, + dfu_if->bcdDevice, dfu_if->devnum, + dfu_if->configuration, dfu_if->interface, + dfu_if->altsetting, dfu_if->alt_name, + dfu_if->serial_name); +} + +/* Walk the device tree and print out DFU devices */ +void list_dfu_interfaces(void) +{ + struct dfu_if *pdfu; + + for (pdfu = dfu_root; pdfu != NULL; pdfu = pdfu->next) + print_dfu_if(pdfu); +} diff --git a/tools/src/dfu-util/src/dfu_util.h b/tools/src/dfu-util/src/dfu_util.h new file mode 100755 index 0000000..24e50c1 --- /dev/null +++ b/tools/src/dfu-util/src/dfu_util.h @@ -0,0 +1,36 @@ +#ifndef DFU_UTIL_H +#define DFU_UTIL_H + +/* USB string descriptor should contain max 126 UTF-16 characters + * but 253 would even accomodate any UTF-8 encoding */ +#define MAX_DESC_STR_LEN 253 + +enum mode { + MODE_NONE, + MODE_VERSION, + MODE_LIST, + MODE_DETACH, + MODE_UPLOAD, + MODE_DOWNLOAD +}; + +extern struct dfu_if *dfu_root; +extern int match_bus; +extern int match_device; +extern int match_vendor; +extern int match_product; +extern int match_vendor_dfu; +extern int match_product_dfu; +extern int match_config_index; +extern int match_iface_index; +extern int match_iface_alt_index; +extern const char *match_iface_alt_name; +extern const char *match_serial; +extern const char *match_serial_dfu; + +void probe_devices(libusb_context *); +void disconnect_devices(void); +void print_dfu_if(struct dfu_if *); +void list_dfu_interfaces(void); + +#endif /* DFU_UTIL_H */ diff --git a/tools/src/dfu-util/src/dfuse.c b/tools/src/dfu-util/src/dfuse.c new file mode 100755 index 0000000..39bc72d --- /dev/null +++ b/tools/src/dfu-util/src/dfuse.c @@ -0,0 +1,652 @@ +/* + * DfuSe specific functions + * + * This implements the ST Microsystems DFU extensions (DfuSe) + * as per the DfuSe 1.1a specification (ST documents AN3156, AN2606) + * The DfuSe file format is described in ST document UM0391. + * + * Copyright 2010-2014 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include + +#include "portable.h" +#include "dfu.h" +#include "usb_dfu.h" +#include "dfu_file.h" +#include "dfuse.h" +#include "dfuse_mem.h" + +#define DFU_TIMEOUT 5000 + +extern int verbose; +static unsigned int last_erased_page = 1; /* non-aligned value, won't match */ +static struct memsegment *mem_layout; +static unsigned int dfuse_address = 0; +static unsigned int dfuse_length = 0; +static int dfuse_force = 0; +static int dfuse_leave = 0; +static int dfuse_unprotect = 0; +static int dfuse_mass_erase = 0; + +unsigned int quad2uint(unsigned char *p) +{ + return (*p + (*(p + 1) << 8) + (*(p + 2) << 16) + (*(p + 3) << 24)); +} + +void dfuse_parse_options(const char *options) +{ + char *end; + const char *endword; + unsigned int number; + + /* address, possibly empty, must be first */ + if (*options != ':') { + endword = strchr(options, ':'); + if (!endword) + endword = options + strlen(options); /* GNU strchrnul */ + + number = strtoul(options, &end, 0); + if (end == endword) { + dfuse_address = number; + } else { + errx(EX_IOERR, "Invalid dfuse address: %s", options); + } + options = endword; + } + + while (*options) { + if (*options == ':') { + options++; + continue; + } + endword = strchr(options, ':'); + if (!endword) + endword = options + strlen(options); + + if (!strncmp(options, "force", endword - options)) { + dfuse_force++; + options += 5; + continue; + } + if (!strncmp(options, "leave", endword - options)) { + dfuse_leave = 1; + options += 5; + continue; + } + if (!strncmp(options, "unprotect", endword - options)) { + dfuse_unprotect = 1; + options += 9; + continue; + } + if (!strncmp(options, "mass-erase", endword - options)) { + dfuse_mass_erase = 1; + options += 10; + continue; + } + + /* any valid number is interpreted as upload length */ + number = strtoul(options, &end, 0); + if (end == endword) { + dfuse_length = number; + } else { + errx(EX_IOERR, "Invalid dfuse modifier: %s", options); + } + options = endword; + } +} + +/* DFU_UPLOAD request for DfuSe 1.1a */ +int dfuse_upload(struct dfu_if *dif, const unsigned short length, + unsigned char *data, unsigned short transaction) +{ + int status; + + status = libusb_control_transfer(dif->dev_handle, + /* bmRequestType */ LIBUSB_ENDPOINT_IN | + LIBUSB_REQUEST_TYPE_CLASS | + LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_UPLOAD, + /* wValue */ transaction, + /* wIndex */ dif->interface, + /* Data */ data, + /* wLength */ length, + DFU_TIMEOUT); + if (status < 0) { + errx(EX_IOERR, "%s: libusb_control_msg returned %d", + __FUNCTION__, status); + } + return status; +} + +/* DFU_DNLOAD request for DfuSe 1.1a */ +int dfuse_download(struct dfu_if *dif, const unsigned short length, + unsigned char *data, unsigned short transaction) +{ + int status; + + status = libusb_control_transfer(dif->dev_handle, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT | + LIBUSB_REQUEST_TYPE_CLASS | + LIBUSB_RECIPIENT_INTERFACE, + /* bRequest */ DFU_DNLOAD, + /* wValue */ transaction, + /* wIndex */ dif->interface, + /* Data */ data, + /* wLength */ length, + DFU_TIMEOUT); + if (status < 0) { + errx(EX_IOERR, "%s: libusb_control_transfer returned %d", + __FUNCTION__, status); + } + return status; +} + +/* DfuSe only commands */ +/* Leaves the device in dfuDNLOAD-IDLE state */ +int dfuse_special_command(struct dfu_if *dif, unsigned int address, + enum dfuse_command command) +{ + const char* dfuse_command_name[] = { "SET_ADDRESS" , "ERASE_PAGE", + "MASS_ERASE", "READ_UNPROTECT"}; + unsigned char buf[5]; + int length; + int ret; + struct dfu_status dst; + int firstpoll = 1; + + if (command == ERASE_PAGE) { + struct memsegment *segment; + int page_size; + + segment = find_segment(mem_layout, address); + if (!segment || !(segment->memtype & DFUSE_ERASABLE)) { + errx(EX_IOERR, "Page at 0x%08x can not be erased", + address); + } + page_size = segment->pagesize; + if (verbose > 1) + printf("Erasing page size %i at address 0x%08x, page " + "starting at 0x%08x\n", page_size, address, + address & ~(page_size - 1)); + buf[0] = 0x41; /* Erase command */ + length = 5; + last_erased_page = address & ~(page_size - 1); + } else if (command == SET_ADDRESS) { + if (verbose > 2) + printf(" Setting address pointer to 0x%08x\n", + address); + buf[0] = 0x21; /* Set Address Pointer command */ + length = 5; + } else if (command == MASS_ERASE) { + buf[0] = 0x41; /* Mass erase command when length = 1 */ + length = 1; + } else if (command == READ_UNPROTECT) { + buf[0] = 0x92; + length = 1; + } else { + errx(EX_IOERR, "Non-supported special command %d", command); + } + buf[1] = address & 0xff; + buf[2] = (address >> 8) & 0xff; + buf[3] = (address >> 16) & 0xff; + buf[4] = (address >> 24) & 0xff; + + ret = dfuse_download(dif, length, buf, 0); + if (ret < 0) { + errx(EX_IOERR, "Error during special command \"%s\" download", + dfuse_command_name[command]); + } + do { + ret = dfu_get_status(dif, &dst); + if (ret < 0) { + errx(EX_IOERR, "Error during special command \"%s\" get_status", + dfuse_command_name[command]); + } + if (firstpoll) { + firstpoll = 0; + if (dst.bState != DFU_STATE_dfuDNBUSY) { + printf("state(%u) = %s, status(%u) = %s\n", dst.bState, + dfu_state_to_string(dst.bState), dst.bStatus, + dfu_status_to_string(dst.bStatus)); + errx(EX_IOERR, "Wrong state after command \"%s\" download", + dfuse_command_name[command]); + } + } + /* wait while command is executed */ + if (verbose) + printf(" Poll timeout %i ms\n", dst.bwPollTimeout); + milli_sleep(dst.bwPollTimeout); + if (command == READ_UNPROTECT) + return ret; + } while (dst.bState == DFU_STATE_dfuDNBUSY); + + if (dst.bStatus != DFU_STATUS_OK) { + errx(EX_IOERR, "%s not correctly executed", + dfuse_command_name[command]); + } + return ret; +} + +int dfuse_dnload_chunk(struct dfu_if *dif, unsigned char *data, int size, + int transaction) +{ + int bytes_sent; + struct dfu_status dst; + int ret; + + ret = dfuse_download(dif, size, size ? data : NULL, transaction); + if (ret < 0) { + errx(EX_IOERR, "Error during download"); + return ret; + } + bytes_sent = ret; + + do { + ret = dfu_get_status(dif, &dst); + if (ret < 0) { + errx(EX_IOERR, "Error during download get_status"); + return ret; + } + milli_sleep(dst.bwPollTimeout); + } while (dst.bState != DFU_STATE_dfuDNLOAD_IDLE && + dst.bState != DFU_STATE_dfuERROR && + dst.bState != DFU_STATE_dfuMANIFEST); + + if (dst.bState == DFU_STATE_dfuMANIFEST) + printf("Transitioning to dfuMANIFEST state\n"); + + if (dst.bStatus != DFU_STATUS_OK) { + printf(" failed!\n"); + printf("state(%u) = %s, status(%u) = %s\n", dst.bState, + dfu_state_to_string(dst.bState), dst.bStatus, + dfu_status_to_string(dst.bStatus)); + return -1; + } + return bytes_sent; +} + +int dfuse_do_upload(struct dfu_if *dif, int xfer_size, int fd, + const char *dfuse_options) +{ + int total_bytes = 0; + int upload_limit = 0; + unsigned char *buf; + int transaction; + int ret; + + buf = dfu_malloc(xfer_size); + + if (dfuse_options) + dfuse_parse_options(dfuse_options); + if (dfuse_length) + upload_limit = dfuse_length; + if (dfuse_address) { + struct memsegment *segment; + + mem_layout = parse_memory_layout((char *)dif->alt_name); + if (!mem_layout) + errx(EX_IOERR, "Failed to parse memory layout"); + + segment = find_segment(mem_layout, dfuse_address); + if (!dfuse_force && + (!segment || !(segment->memtype & DFUSE_READABLE))) + errx(EX_IOERR, "Page at 0x%08x is not readable", + dfuse_address); + + if (!upload_limit) { + upload_limit = segment->end - dfuse_address + 1; + printf("Limiting upload to end of memory segment, " + "%i bytes\n", upload_limit); + } + dfuse_special_command(dif, dfuse_address, SET_ADDRESS); + dfu_abort_to_idle(dif); + } else { + /* Boot loader decides the start address, unknown to us */ + /* Use a short length to lower risk of running out of bounds */ + if (!upload_limit) + upload_limit = 0x4000; + printf("Limiting default upload to %i bytes\n", upload_limit); + } + + dfu_progress_bar("Upload", 0, 1); + + transaction = 2; + while (1) { + int rc; + + /* last chunk can be smaller than original xfer_size */ + if (upload_limit - total_bytes < xfer_size) + xfer_size = upload_limit - total_bytes; + rc = dfuse_upload(dif, xfer_size, buf, transaction++); + if (rc < 0) { + ret = rc; + goto out_free; + } + + dfu_file_write_crc(fd, 0, buf, rc); + total_bytes += rc; + + if (total_bytes < 0) + errx(EX_SOFTWARE, "Received too many bytes"); + + if (rc < xfer_size || total_bytes >= upload_limit) { + /* last block, return successfully */ + ret = total_bytes; + break; + } + dfu_progress_bar("Upload", total_bytes, upload_limit); + } + + dfu_progress_bar("Upload", total_bytes, total_bytes); + + dfu_abort_to_idle(dif); + if (dfuse_leave) { + dfuse_special_command(dif, dfuse_address, SET_ADDRESS); + dfuse_dnload_chunk(dif, NULL, 0, 2); /* Zero-size */ + } + + out_free: + free(buf); + + return ret; +} + +/* Writes an element of any size to the device, taking care of page erases */ +/* returns 0 on success, otherwise -EINVAL */ +int dfuse_dnload_element(struct dfu_if *dif, unsigned int dwElementAddress, + unsigned int dwElementSize, unsigned char *data, + int xfer_size) +{ + int p; + int ret; + struct memsegment *segment; + + /* Check at least that we can write to the last address */ + segment = + find_segment(mem_layout, dwElementAddress + dwElementSize - 1); + if (!segment || !(segment->memtype & DFUSE_WRITEABLE)) { + errx(EX_IOERR, "Last page at 0x%08x is not writeable", + dwElementAddress + dwElementSize - 1); + } + + dfu_progress_bar("Download", 0, 1); + + for (p = 0; p < (int)dwElementSize; p += xfer_size) { + int page_size; + unsigned int erase_address; + unsigned int address = dwElementAddress + p; + int chunk_size = xfer_size; + + segment = find_segment(mem_layout, address); + if (!segment || !(segment->memtype & DFUSE_WRITEABLE)) { + errx(EX_IOERR, "Page at 0x%08x is not writeable", + address); + } + page_size = segment->pagesize; + + /* check if this is the last chunk */ + if (p + chunk_size > (int)dwElementSize) + chunk_size = dwElementSize - p; + + /* Erase only for flash memory downloads */ + if ((segment->memtype & DFUSE_ERASABLE) && !dfuse_mass_erase) { + /* erase all involved pages */ + for (erase_address = address; + erase_address < address + chunk_size; + erase_address += page_size) + if ((erase_address & ~(page_size - 1)) != + last_erased_page) + dfuse_special_command(dif, + erase_address, + ERASE_PAGE); + + if (((address + chunk_size - 1) & ~(page_size - 1)) != + last_erased_page) { + if (verbose > 2) + printf(" Chunk extends into next page," + " erase it as well\n"); + dfuse_special_command(dif, + address + chunk_size - 1, + ERASE_PAGE); + } + } + + if (verbose) { + printf(" Download from image offset " + "%08x to memory %08x-%08x, size %i\n", + p, address, address + chunk_size - 1, + chunk_size); + } else { + dfu_progress_bar("Download", p, dwElementSize); + } + + dfuse_special_command(dif, address, SET_ADDRESS); + + /* transaction = 2 for no address offset */ + ret = dfuse_dnload_chunk(dif, data + p, chunk_size, 2); + if (ret != chunk_size) { + errx(EX_IOERR, "Failed to write whole chunk: " + "%i of %i bytes", ret, chunk_size); + return -EINVAL; + } + } + if (!verbose) + dfu_progress_bar("Download", dwElementSize, dwElementSize); + return 0; +} + +static void +dfuse_memcpy(unsigned char *dst, unsigned char **src, int *rem, int size) +{ + if (size > *rem) { + errx(EX_IOERR, "Corrupt DfuSe file: " + "Cannot read %d bytes from %d bytes", size, *rem); + } + if (dst != NULL) + memcpy(dst, *src, size); + (*src) += size; + (*rem) -= size; +} + +/* Download raw binary file to DfuSe device */ +int dfuse_do_bin_dnload(struct dfu_if *dif, int xfer_size, + struct dfu_file *file, unsigned int start_address) +{ + unsigned int dwElementAddress; + unsigned int dwElementSize; + unsigned char *data; + int ret; + + dwElementAddress = start_address; + dwElementSize = file->size.total - + file->size.suffix - file->size.prefix; + + printf("Downloading to address = 0x%08x, size = %i\n", + dwElementAddress, dwElementSize); + + data = file->firmware + file->size.prefix; + + ret = dfuse_dnload_element(dif, dwElementAddress, dwElementSize, data, + xfer_size); + if (ret != 0) + goto out_free; + + printf("File downloaded successfully\n"); + ret = dwElementSize; + + out_free: + return ret; +} + +/* Parse a DfuSe file and download contents to device */ +int dfuse_do_dfuse_dnload(struct dfu_if *dif, int xfer_size, + struct dfu_file *file) +{ + uint8_t dfuprefix[11]; + uint8_t targetprefix[274]; + uint8_t elementheader[8]; + int image; + int element; + int bTargets; + int bAlternateSetting; + int dwNbElements; + unsigned int dwElementAddress; + unsigned int dwElementSize; + uint8_t *data; + int ret; + int rem; + int bFirstAddressSaved = 0; + + rem = file->size.total - file->size.prefix - file->size.suffix; + data = file->firmware + file->size.prefix; + + /* Must be larger than a minimal DfuSe header and suffix */ + if (rem < (int)(sizeof(dfuprefix) + + sizeof(targetprefix) + sizeof(elementheader))) { + errx(EX_SOFTWARE, "File too small for a DfuSe file"); + } + + dfuse_memcpy(dfuprefix, &data, &rem, sizeof(dfuprefix)); + + if (strncmp((char *)dfuprefix, "DfuSe", 5)) { + errx(EX_IOERR, "No valid DfuSe signature"); + return -EINVAL; + } + if (dfuprefix[5] != 0x01) { + errx(EX_IOERR, "DFU format revision %i not supported", + dfuprefix[5]); + return -EINVAL; + } + bTargets = dfuprefix[10]; + printf("file contains %i DFU images\n", bTargets); + + for (image = 1; image <= bTargets; image++) { + printf("parsing DFU image %i\n", image); + dfuse_memcpy(targetprefix, &data, &rem, sizeof(targetprefix)); + if (strncmp((char *)targetprefix, "Target", 6)) { + errx(EX_IOERR, "No valid target signature"); + return -EINVAL; + } + bAlternateSetting = targetprefix[6]; + dwNbElements = quad2uint((unsigned char *)targetprefix + 270); + printf("image for alternate setting %i, ", bAlternateSetting); + printf("(%i elements, ", dwNbElements); + printf("total size = %i)\n", + quad2uint((unsigned char *)targetprefix + 266)); + if (bAlternateSetting != dif->altsetting) + printf("Warning: Image does not match current alternate" + " setting.\n" + "Please rerun with the correct -a option setting" + " to download this image!\n"); + for (element = 1; element <= dwNbElements; element++) { + printf("parsing element %i, ", element); + dfuse_memcpy(elementheader, &data, &rem, sizeof(elementheader)); + dwElementAddress = + quad2uint((unsigned char *)elementheader); + dwElementSize = + quad2uint((unsigned char *)elementheader + 4); + printf("address = 0x%08x, ", dwElementAddress); + printf("size = %i\n", dwElementSize); + + if (!bFirstAddressSaved) { + bFirstAddressSaved = 1; + dfuse_address = dwElementAddress; + } + /* sanity check */ + if ((int)dwElementSize > rem) + errx(EX_SOFTWARE, "File too small for element size"); + + if (bAlternateSetting == dif->altsetting) { + ret = dfuse_dnload_element(dif, dwElementAddress, + dwElementSize, data, xfer_size); + } else { + ret = 0; + } + + /* advance read pointer */ + dfuse_memcpy(NULL, &data, &rem, dwElementSize); + + if (ret != 0) + return ret; + } + } + + if (rem != 0) + warnx("%d bytes leftover", rem); + + printf("done parsing DfuSe file\n"); + + return 0; +} + +int dfuse_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file, + const char *dfuse_options) +{ + int ret; + + if (dfuse_options) + dfuse_parse_options(dfuse_options); + mem_layout = parse_memory_layout((char *)dif->alt_name); + if (!mem_layout) { + errx(EX_IOERR, "Failed to parse memory layout"); + } + if (dfuse_unprotect) { + if (!dfuse_force) { + errx(EX_IOERR, "The read unprotect command " + "will erase the flash memory" + "and can only be used with force\n"); + } + dfuse_special_command(dif, 0, READ_UNPROTECT); + printf("Device disconnects, erases flash and resets now\n"); + exit(0); + } + if (dfuse_mass_erase) { + if (!dfuse_force) { + errx(EX_IOERR, "The mass erase command " + "can only be used with force"); + } + printf("Performing mass erase, this can take a moment\n"); + dfuse_special_command(dif, 0, MASS_ERASE); + } + if (dfuse_address) { + if (file->bcdDFU == 0x11a) { + errx(EX_IOERR, "This is a DfuSe file, not " + "meant for raw download"); + } + ret = dfuse_do_bin_dnload(dif, xfer_size, file, dfuse_address); + } else { + if (file->bcdDFU != 0x11a) { + warnx("Only DfuSe file version 1.1a is supported"); + errx(EX_IOERR, "(for raw binary download, use the " + "--dfuse-address option)"); + } + ret = dfuse_do_dfuse_dnload(dif, xfer_size, file); + } + free_segment_list(mem_layout); + + dfu_abort_to_idle(dif); + + if (dfuse_leave) { + dfuse_special_command(dif, dfuse_address, SET_ADDRESS); + dfuse_dnload_chunk(dif, NULL, 0, 2); /* Zero-size */ + } + return ret; +} diff --git a/tools/src/dfu-util/src/dfuse.h b/tools/src/dfu-util/src/dfuse.h new file mode 100755 index 0000000..e82f058 --- /dev/null +++ b/tools/src/dfu-util/src/dfuse.h @@ -0,0 +1,35 @@ +/* This implements the ST Microsystems DFU extensions (DfuSe) + * as per the DfuSe 1.1a specification (Document UM0391) + * + * (C) 2010-2012 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DFUSE_H +#define DFUSE_H + +#include "dfu.h" + +enum dfuse_command { SET_ADDRESS, ERASE_PAGE, MASS_ERASE, READ_UNPROTECT }; + +int dfuse_special_command(struct dfu_if *dif, unsigned int address, + enum dfuse_command command); +int dfuse_do_upload(struct dfu_if *dif, int xfer_size, int fd, + const char *dfuse_options); +int dfuse_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file *file, + const char *dfuse_options); + +#endif /* DFUSE_H */ diff --git a/tools/src/dfu-util/src/dfuse_mem.c b/tools/src/dfu-util/src/dfuse_mem.c new file mode 100755 index 0000000..ae339fb --- /dev/null +++ b/tools/src/dfu-util/src/dfuse_mem.c @@ -0,0 +1,198 @@ +/* + * Helper functions for reading the memory map of a device + * following the ST DfuSe 1.1a specification. + * + * Copyright 2011-2014 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include + +#include "portable.h" +#include "dfu_file.h" +#include "dfuse_mem.h" + +int add_segment(struct memsegment **segment_list, struct memsegment segment) +{ + struct memsegment *new_element; + + new_element = dfu_malloc(sizeof(struct memsegment)); + *new_element = segment; + new_element->next = NULL; + + if (*segment_list == NULL) + /* list can be empty on first call */ + *segment_list = new_element; + else { + struct memsegment *next_element; + + /* find last element in list */ + next_element = *segment_list; + while (next_element->next != NULL) + next_element = next_element->next; + next_element->next = new_element; + } + return 0; +} + +struct memsegment *find_segment(struct memsegment *segment_list, + unsigned int address) +{ + while (segment_list != NULL) { + if (segment_list->start <= address && + segment_list->end >= address) + return segment_list; + segment_list = segment_list->next; + } + return NULL; +} + +void free_segment_list(struct memsegment *segment_list) +{ + struct memsegment *next_element; + + while (segment_list->next != NULL) { + next_element = segment_list->next; + free(segment_list); + segment_list = next_element; + } + free(segment_list); +} + +/* Parse memory map from interface descriptor string + * encoded as per ST document UM0424 section 4.3.2. + */ +struct memsegment *parse_memory_layout(char *intf_desc) +{ + + char multiplier, memtype; + unsigned int address; + int sectors, size; + char *name, *typestring; + int ret; + int count = 0; + char separator; + int scanned; + struct memsegment *segment_list = NULL; + struct memsegment segment; + + name = dfu_malloc(strlen(intf_desc)); + + ret = sscanf(intf_desc, "@%[^/]%n", name, &scanned); + if (ret < 1) { + free(name); + warnx("Could not read name, sscanf returned %d", ret); + return NULL; + } + printf("DfuSe interface name: \"%s\"\n", name); + + intf_desc += scanned; + typestring = dfu_malloc(strlen(intf_desc)); + + while (ret = sscanf(intf_desc, "/0x%x/%n", &address, &scanned), + ret > 0) { + + intf_desc += scanned; + while (ret = sscanf(intf_desc, "%d*%d%c%[^,/]%n", + §ors, &size, &multiplier, typestring, + &scanned), ret > 2) { + intf_desc += scanned; + + count++; + memtype = 0; + if (ret == 4) { + if (strlen(typestring) == 1 + && typestring[0] != '/') + memtype = typestring[0]; + else { + warnx("Parsing type identifier '%s' " + "failed for segment %i", + typestring, count); + continue; + } + } + + /* Quirk for STM32F4 devices */ + if (strcmp(name, "Device Feature") == 0) + memtype = 'e'; + + switch (multiplier) { + case 'B': + break; + case 'K': + size *= 1024; + break; + case 'M': + size *= 1024 * 1024; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + if (!memtype) { + warnx("Non-valid multiplier '%c', " + "interpreted as type " + "identifier instead", + multiplier); + memtype = multiplier; + break; + } + /* fallthrough if memtype was already set */ + default: + warnx("Non-valid multiplier '%c', " + "assuming bytes", multiplier); + } + + if (!memtype) { + warnx("No valid type for segment %d\n", count); + continue; + } + + segment.start = address; + segment.end = address + sectors * size - 1; + segment.pagesize = size; + segment.memtype = memtype & 7; + add_segment(&segment_list, segment); + + if (verbose) + printf("Memory segment at 0x%08x %3d x %4d = " + "%5d (%s%s%s)\n", + address, sectors, size, sectors * size, + memtype & DFUSE_READABLE ? "r" : "", + memtype & DFUSE_ERASABLE ? "e" : "", + memtype & DFUSE_WRITEABLE ? "w" : ""); + + address += sectors * size; + + separator = *intf_desc; + if (separator == ',') + intf_desc += 1; + else + break; + } /* while per segment */ + + } /* while per address */ + free(name); + free(typestring); + + return segment_list; +} diff --git a/tools/src/dfu-util/src/dfuse_mem.h b/tools/src/dfu-util/src/dfuse_mem.h new file mode 100755 index 0000000..8fe7cc4 --- /dev/null +++ b/tools/src/dfu-util/src/dfuse_mem.h @@ -0,0 +1,44 @@ +/* Helper functions for reading the memory map in a device + * following the ST DfuSe 1.1a specification. + * + * (C) 2011 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DFUSE_MEM_H +#define DFUSE_MEM_H + +#define DFUSE_READABLE 1 +#define DFUSE_ERASABLE 2 +#define DFUSE_WRITEABLE 4 + +struct memsegment { + unsigned int start; + unsigned int end; + int pagesize; + int memtype; + struct memsegment *next; +}; + +int add_segment(struct memsegment **list, struct memsegment new_element); + +struct memsegment *find_segment(struct memsegment *list, unsigned int address); + +void free_segment_list(struct memsegment *list); + +struct memsegment *parse_memory_layout(char *intf_desc_str); + +#endif /* DFUSE_MEM_H */ diff --git a/tools/src/dfu-util/src/main.c b/tools/src/dfu-util/src/main.c new file mode 100755 index 0000000..f59d27d --- /dev/null +++ b/tools/src/dfu-util/src/main.c @@ -0,0 +1,699 @@ +/* + * dfu-util + * + * Copyright 2007-2008 by OpenMoko, Inc. + * Copyright 2013-2014 Hans Petter Selasky + * + * Written by Harald Welte + * + * Based on existing code of dfu-programmer-0.4 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "portable.h" +#include "dfu.h" +#include "usb_dfu.h" +#include "dfu_file.h" +#include "dfu_load.h" +#include "dfu_util.h" +#include "dfuse.h" +#include "quirks.h" + +#ifdef HAVE_USBPATH_H +#include +#endif + +int verbose = 0; + +struct dfu_if *dfu_root = NULL; + +int match_bus = -1; +int match_device = -1; +int match_vendor = -1; +int match_product = -1; +int match_vendor_dfu = -1; +int match_product_dfu = -1; +int match_config_index = -1; +int match_iface_index = -1; +int match_iface_alt_index = -1; +const char *match_iface_alt_name = NULL; +const char *match_serial = NULL; +const char *match_serial_dfu = NULL; + +static int parse_match_value(const char *str, int default_value) +{ + char *remainder; + int value; + + if (str == NULL) { + value = default_value; + } else if (*str == '*') { + value = -1; /* Match anything */ + } else if (*str == '-') { + value = 0x10000; /* Impossible vendor/product ID */ + } else { + value = strtoul(str, &remainder, 16); + if (remainder == str) { + value = default_value; + } + } + return value; +} + +static void parse_vendprod(const char *str) +{ + const char *comma; + const char *colon; + + /* Default to match any DFU device in runtime or DFU mode */ + match_vendor = -1; + match_product = -1; + match_vendor_dfu = -1; + match_product_dfu = -1; + + comma = strchr(str, ','); + if (comma == str) { + /* DFU mode vendor/product being specified without any runtime + * vendor/product specification, so don't match any runtime device */ + match_vendor = match_product = 0x10000; + } else { + colon = strchr(str, ':'); + if (colon != NULL) { + ++colon; + if ((comma != NULL) && (colon > comma)) { + colon = NULL; + } + } + match_vendor = parse_match_value(str, match_vendor); + match_product = parse_match_value(colon, match_product); + if (comma != NULL) { + /* Both runtime and DFU mode vendor/product specifications are + * available, so default DFU mode match components to the given + * runtime match components */ + match_vendor_dfu = match_vendor; + match_product_dfu = match_product; + } + } + if (comma != NULL) { + ++comma; + colon = strchr(comma, ':'); + if (colon != NULL) { + ++colon; + } + match_vendor_dfu = parse_match_value(comma, match_vendor_dfu); + match_product_dfu = parse_match_value(colon, match_product_dfu); + } +} + +static void parse_serial(char *str) +{ + char *comma; + + match_serial = str; + comma = strchr(str, ','); + if (comma == NULL) { + match_serial_dfu = match_serial; + } else { + *comma++ = 0; + match_serial_dfu = comma; + } + if (*match_serial == 0) match_serial = NULL; + if (*match_serial_dfu == 0) match_serial_dfu = NULL; +} + +#ifdef HAVE_USBPATH_H + +static int resolve_device_path(char *path) +{ + int res; + + res = usb_path2devnum(path); + if (res < 0) + return -EINVAL; + if (!res) + return 0; + + match_bus = atoi(path); + match_device = res; + + return 0; +} + +#else /* HAVE_USBPATH_H */ + +static int resolve_device_path(char *path) +{ + (void)path; /* Eliminate unused variable warning */ + errx(EX_SOFTWARE, "USB device paths are not supported by this dfu-util.\n"); +} + +#endif /* !HAVE_USBPATH_H */ + +static void help(void) +{ + fprintf(stderr, "Usage: dfu-util [options] ...\n" + " -h --help\t\t\tPrint this help message\n" + " -V --version\t\t\tPrint the version number\n" + " -v --verbose\t\t\tPrint verbose debug statements\n" + " -l --list\t\t\tList currently attached DFU capable devices\n"); + fprintf(stderr, " -e --detach\t\t\tDetach currently attached DFU capable devices\n" + " -E --detach-delay seconds\tTime to wait before reopening a device after detach\n" + " -d --device :[,:]\n" + "\t\t\t\tSpecify Vendor/Product ID(s) of DFU device\n" + " -p --path \tSpecify path to DFU device\n" + " -c --cfg \t\tSpecify the Configuration of DFU device\n" + " -i --intf \t\tSpecify the DFU Interface number\n" + " -S --serial [,]\n" + "\t\t\t\tSpecify Serial String of DFU device\n" + " -a --alt \t\tSpecify the Altsetting of the DFU Interface\n" + "\t\t\t\tby name or by number\n"); + fprintf(stderr, " -t --transfer-size \tSpecify the number of bytes per USB Transfer\n" + " -U --upload \t\tRead firmware from device into \n" + " -Z --upload-size \tSpecify the expected upload size in bytes\n" + " -D --download \t\tWrite firmware from into device\n" + " -R --reset\t\t\tIssue USB Reset signalling once we're finished\n" + " -s --dfuse-address

\tST DfuSe mode, specify target address for\n" + "\t\t\t\traw file download or upload. Not applicable for\n" + "\t\t\t\tDfuSe file (.dfu) downloads\n" + ); + exit(EX_USAGE); +} + +static void print_version(void) +{ + printf(PACKAGE_STRING "\n\n"); + printf("Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.\n" + "Copyright 2010-2014 Tormod Volden and Stefan Schmidt\n" + "This program is Free Software and has ABSOLUTELY NO WARRANTY\n" + "Please report bugs to " PACKAGE_BUGREPORT "\n\n"); +} + +static struct option opts[] = { + { "help", 0, 0, 'h' }, + { "version", 0, 0, 'V' }, + { "verbose", 0, 0, 'v' }, + { "list", 0, 0, 'l' }, + { "detach", 0, 0, 'e' }, + { "detach-delay", 1, 0, 'E' }, + { "device", 1, 0, 'd' }, + { "path", 1, 0, 'p' }, + { "configuration", 1, 0, 'c' }, + { "cfg", 1, 0, 'c' }, + { "interface", 1, 0, 'i' }, + { "intf", 1, 0, 'i' }, + { "altsetting", 1, 0, 'a' }, + { "alt", 1, 0, 'a' }, + { "serial", 1, 0, 'S' }, + { "transfer-size", 1, 0, 't' }, + { "upload", 1, 0, 'U' }, + { "upload-size", 1, 0, 'Z' }, + { "download", 1, 0, 'D' }, + { "reset", 0, 0, 'R' }, + { "dfuse-address", 1, 0, 's' }, + { 0, 0, 0, 0 } +}; + +int main(int argc, char **argv) +{ + int expected_size = 0; + unsigned int transfer_size = 0; + enum mode mode = MODE_NONE; + struct dfu_status status; + libusb_context *ctx; + struct dfu_file file; + char *end; + int final_reset = 0; + int ret; + int dfuse_device = 0; + int fd; + const char *dfuse_options = NULL; + int detach_delay = 5; + uint16_t runtime_vendor; + uint16_t runtime_product; + + memset(&file, 0, sizeof(file)); + + /* make sure all prints are flushed */ + setvbuf(stdout, NULL, _IONBF, 0); + + while (1) { + int c, option_index = 0; + c = getopt_long(argc, argv, "hVvleE:d:p:c:i:a:S:t:U:D:Rs:Z:", opts, + &option_index); + if (c == -1) + break; + + switch (c) { + case 'h': + help(); + break; + case 'V': + mode = MODE_VERSION; + break; + case 'v': + verbose++; + break; + case 'l': + mode = MODE_LIST; + break; + case 'e': + mode = MODE_DETACH; + match_iface_alt_index = 0; + match_iface_index = 0; + break; + case 'E': + detach_delay = atoi(optarg); + break; + case 'd': + parse_vendprod(optarg); + break; + case 'p': + /* Parse device path */ + ret = resolve_device_path(optarg); + if (ret < 0) + errx(EX_SOFTWARE, "Unable to parse '%s'", optarg); + if (!ret) + errx(EX_SOFTWARE, "Cannot find '%s'", optarg); + break; + case 'c': + /* Configuration */ + match_config_index = atoi(optarg); + break; + case 'i': + /* Interface */ + match_iface_index = atoi(optarg); + break; + case 'a': + /* Interface Alternate Setting */ + match_iface_alt_index = strtoul(optarg, &end, 0); + if (*end) { + match_iface_alt_name = optarg; + match_iface_alt_index = -1; + } + break; + case 'S': + parse_serial(optarg); + break; + case 't': + transfer_size = atoi(optarg); + break; + case 'U': + mode = MODE_UPLOAD; + file.name = optarg; + break; + case 'Z': + expected_size = atoi(optarg); + break; + case 'D': + mode = MODE_DOWNLOAD; + file.name = optarg; + break; + case 'R': + final_reset = 1; + break; + case 's': + dfuse_options = optarg; + break; + default: + help(); + break; + } + } + + print_version(); + if (mode == MODE_VERSION) { + exit(0); + } + + if (mode == MODE_NONE) { + fprintf(stderr, "You need to specify one of -D or -U\n"); + help(); + } + + if (match_config_index == 0) { + /* Handle "-c 0" (unconfigured device) as don't care */ + match_config_index = -1; + } + + if (mode == MODE_DOWNLOAD) { + dfu_load_file(&file, MAYBE_SUFFIX, MAYBE_PREFIX); + /* If the user didn't specify product and/or vendor IDs to match, + * use any IDs from the file suffix for device matching */ + if (match_vendor < 0 && file.idVendor != 0xffff) { + match_vendor = file.idVendor; + printf("Match vendor ID from file: %04x\n", match_vendor); + } + if (match_product < 0 && file.idProduct != 0xffff) { + match_product = file.idProduct; + printf("Match product ID from file: %04x\n", match_product); + } + } + + ret = libusb_init(&ctx); + if (ret) + errx(EX_IOERR, "unable to initialize libusb: %i", ret); + + if (verbose > 2) { + libusb_set_debug(ctx, 255); + } + + probe_devices(ctx); + + if (mode == MODE_LIST) { + list_dfu_interfaces(); + exit(0); + } + + if (dfu_root == NULL) { + errx(EX_IOERR, "No DFU capable USB device available"); + } else if (dfu_root->next != NULL) { + /* We cannot safely support more than one DFU capable device + * with same vendor/product ID, since during DFU we need to do + * a USB bus reset, after which the target device will get a + * new address */ + errx(EX_IOERR, "More than one DFU capable USB device found! " + "Try `--list' and specify the serial number " + "or disconnect all but one device\n"); + } + + /* We have exactly one device. Its libusb_device is now in dfu_root->dev */ + + printf("Opening DFU capable USB device...\n"); + ret = libusb_open(dfu_root->dev, &dfu_root->dev_handle); + if (ret || !dfu_root->dev_handle) + errx(EX_IOERR, "Cannot open device"); + + printf("ID %04x:%04x\n", dfu_root->vendor, dfu_root->product); + + printf("Run-time device DFU version %04x\n", + libusb_le16_to_cpu(dfu_root->func_dfu.bcdDFUVersion)); + + /* Transition from run-Time mode to DFU mode */ + if (!(dfu_root->flags & DFU_IFF_DFU)) { + int err; + /* In the 'first round' during runtime mode, there can only be one + * DFU Interface descriptor according to the DFU Spec. */ + + /* FIXME: check if the selected device really has only one */ + + runtime_vendor = dfu_root->vendor; + runtime_product = dfu_root->product; + + printf("Claiming USB DFU Runtime Interface...\n"); + if (libusb_claim_interface(dfu_root->dev_handle, dfu_root->interface) < 0) { + errx(EX_IOERR, "Cannot claim interface %d", + dfu_root->interface); + } + + if (libusb_set_interface_alt_setting(dfu_root->dev_handle, dfu_root->interface, 0) < 0) { + errx(EX_IOERR, "Cannot set alt interface zero"); + } + + printf("Determining device status: "); + + err = dfu_get_status(dfu_root, &status); + if (err == LIBUSB_ERROR_PIPE) { + printf("Device does not implement get_status, assuming appIDLE\n"); + status.bStatus = DFU_STATUS_OK; + status.bwPollTimeout = 0; + status.bState = DFU_STATE_appIDLE; + status.iString = 0; + } else if (err < 0) { + errx(EX_IOERR, "error get_status"); + } else { + printf("state = %s, status = %d\n", + dfu_state_to_string(status.bState), status.bStatus); + } + milli_sleep(status.bwPollTimeout); + + switch (status.bState) { + case DFU_STATE_appIDLE: + case DFU_STATE_appDETACH: + printf("Device really in Runtime Mode, send DFU " + "detach request...\n"); + if (dfu_detach(dfu_root->dev_handle, + dfu_root->interface, 1000) < 0) { + warnx("error detaching"); + } + if (dfu_root->func_dfu.bmAttributes & USB_DFU_WILL_DETACH) { + printf("Device will detach and reattach...\n"); + } else { + printf("Resetting USB...\n"); + ret = libusb_reset_device(dfu_root->dev_handle); + if (ret < 0 && ret != LIBUSB_ERROR_NOT_FOUND) + errx(EX_IOERR, "error resetting " + "after detach"); + } + break; + case DFU_STATE_dfuERROR: + printf("dfuERROR, clearing status\n"); + if (dfu_clear_status(dfu_root->dev_handle, + dfu_root->interface) < 0) { + errx(EX_IOERR, "error clear_status"); + } + /* fall through */ + default: + warnx("WARNING: Runtime device already in DFU state ?!?"); + libusb_release_interface(dfu_root->dev_handle, + dfu_root->interface); + goto dfustate; + } + libusb_release_interface(dfu_root->dev_handle, + dfu_root->interface); + libusb_close(dfu_root->dev_handle); + dfu_root->dev_handle = NULL; + + if (mode == MODE_DETACH) { + libusb_exit(ctx); + exit(0); + } + + /* keeping handles open might prevent re-enumeration */ + disconnect_devices(); + + milli_sleep(detach_delay * 1000); + + /* Change match vendor and product to impossible values to force + * only DFU mode matches in the following probe */ + match_vendor = match_product = 0x10000; + + probe_devices(ctx); + + if (dfu_root == NULL) { + errx(EX_IOERR, "Lost device after RESET?"); + } else if (dfu_root->next != NULL) { + errx(EX_IOERR, "More than one DFU capable USB device found! " + "Try `--list' and specify the serial number " + "or disconnect all but one device"); + } + + /* Check for DFU mode device */ + if (!(dfu_root->flags | DFU_IFF_DFU)) + errx(EX_SOFTWARE, "Device is not in DFU mode"); + + printf("Opening DFU USB Device...\n"); + ret = libusb_open(dfu_root->dev, &dfu_root->dev_handle); + if (ret || !dfu_root->dev_handle) { + errx(EX_IOERR, "Cannot open device"); + } + } else { + /* we're already in DFU mode, so we can skip the detach/reset + * procedure */ + /* If a match vendor/product was specified, use that as the runtime + * vendor/product, otherwise use the DFU mode vendor/product */ + runtime_vendor = match_vendor < 0 ? dfu_root->vendor : match_vendor; + runtime_product = match_product < 0 ? dfu_root->product : match_product; + } + +dfustate: +#if 0 + printf("Setting Configuration %u...\n", dfu_root->configuration); + if (libusb_set_configuration(dfu_root->dev_handle, dfu_root->configuration) < 0) { + errx(EX_IOERR, "Cannot set configuration"); + } +#endif + printf("Claiming USB DFU Interface...\n"); + if (libusb_claim_interface(dfu_root->dev_handle, dfu_root->interface) < 0) { + errx(EX_IOERR, "Cannot claim interface"); + } + + printf("Setting Alternate Setting #%d ...\n", dfu_root->altsetting); + if (libusb_set_interface_alt_setting(dfu_root->dev_handle, dfu_root->interface, dfu_root->altsetting) < 0) { + errx(EX_IOERR, "Cannot set alternate interface"); + } + +status_again: + printf("Determining device status: "); + if (dfu_get_status(dfu_root, &status ) < 0) { + errx(EX_IOERR, "error get_status"); + } + printf("state = %s, status = %d\n", + dfu_state_to_string(status.bState), status.bStatus); + + milli_sleep(status.bwPollTimeout); + + switch (status.bState) { + case DFU_STATE_appIDLE: + case DFU_STATE_appDETACH: + errx(EX_IOERR, "Device still in Runtime Mode!"); + break; + case DFU_STATE_dfuERROR: + printf("dfuERROR, clearing status\n"); + if (dfu_clear_status(dfu_root->dev_handle, dfu_root->interface) < 0) { + errx(EX_IOERR, "error clear_status"); + } + goto status_again; + break; + case DFU_STATE_dfuDNLOAD_IDLE: + case DFU_STATE_dfuUPLOAD_IDLE: + printf("aborting previous incomplete transfer\n"); + if (dfu_abort(dfu_root->dev_handle, dfu_root->interface) < 0) { + errx(EX_IOERR, "can't send DFU_ABORT"); + } + goto status_again; + break; + case DFU_STATE_dfuIDLE: + printf("dfuIDLE, continuing\n"); + break; + default: + break; + } + + if (DFU_STATUS_OK != status.bStatus ) { + printf("WARNING: DFU Status: '%s'\n", + dfu_status_to_string(status.bStatus)); + /* Clear our status & try again. */ + if (dfu_clear_status(dfu_root->dev_handle, dfu_root->interface) < 0) + errx(EX_IOERR, "USB communication error"); + if (dfu_get_status(dfu_root, &status) < 0) + errx(EX_IOERR, "USB communication error"); + if (DFU_STATUS_OK != status.bStatus) + errx(EX_SOFTWARE, "Status is not OK: %d", status.bStatus); + + milli_sleep(status.bwPollTimeout); + } + + printf("DFU mode device DFU version %04x\n", + libusb_le16_to_cpu(dfu_root->func_dfu.bcdDFUVersion)); + + if (dfu_root->func_dfu.bcdDFUVersion == libusb_cpu_to_le16(0x11a)) + dfuse_device = 1; + + /* If not overridden by the user */ + if (!transfer_size) { + transfer_size = libusb_le16_to_cpu( + dfu_root->func_dfu.wTransferSize); + if (transfer_size) { + printf("Device returned transfer size %i\n", + transfer_size); + } else { + errx(EX_IOERR, "Transfer size must be specified"); + } + } + +#ifdef HAVE_GETPAGESIZE +/* autotools lie when cross-compiling for Windows using mingw32/64 */ +#ifndef __MINGW32__ + /* limitation of Linux usbdevio */ + if ((int)transfer_size > getpagesize()) { + transfer_size = getpagesize(); + printf("Limited transfer size to %i\n", transfer_size); + } +#endif /* __MINGW32__ */ +#endif /* HAVE_GETPAGESIZE */ + + if (transfer_size < dfu_root->bMaxPacketSize0) { + transfer_size = dfu_root->bMaxPacketSize0; + printf("Adjusted transfer size to %i\n", transfer_size); + } + + switch (mode) { + case MODE_UPLOAD: + /* open for "exclusive" writing */ + fd = open(file.name, O_WRONLY | O_BINARY | O_CREAT | O_EXCL | O_TRUNC, 0666); + if (fd < 0) + err(EX_IOERR, "Cannot open file %s for writing", file.name); + + if (dfuse_device || dfuse_options) { + if (dfuse_do_upload(dfu_root, transfer_size, fd, + dfuse_options) < 0) + exit(1); + } else { + if (dfuload_do_upload(dfu_root, transfer_size, + expected_size, fd) < 0) { + exit(1); + } + } + close(fd); + break; + + case MODE_DOWNLOAD: + if (((file.idVendor != 0xffff && file.idVendor != runtime_vendor) || + (file.idProduct != 0xffff && file.idProduct != runtime_product)) && + ((file.idVendor != 0xffff && file.idVendor != dfu_root->vendor) || + (file.idProduct != 0xffff && file.idProduct != dfu_root->product))) { + errx(EX_IOERR, "Error: File ID %04x:%04x does " + "not match device (%04x:%04x or %04x:%04x)", + file.idVendor, file.idProduct, + runtime_vendor, runtime_product, + dfu_root->vendor, dfu_root->product); + } + if (dfuse_device || dfuse_options || file.bcdDFU == 0x11a) { + if (dfuse_do_dnload(dfu_root, transfer_size, &file, + dfuse_options) < 0) + exit(1); + } else { + if (dfuload_do_dnload(dfu_root, transfer_size, &file) < 0) + exit(1); + } + break; + case MODE_DETACH: + if (dfu_detach(dfu_root->dev_handle, dfu_root->interface, 1000) < 0) { + warnx("can't detach"); + } + break; + default: + errx(EX_IOERR, "Unsupported mode: %u", mode); + break; + } + + if (final_reset) { + if (dfu_detach(dfu_root->dev_handle, dfu_root->interface, 1000) < 0) { + /* Even if detach failed, just carry on to leave the + device in a known state */ + warnx("can't detach"); + } + printf("Resetting USB to switch back to runtime mode\n"); + ret = libusb_reset_device(dfu_root->dev_handle); + if (ret < 0 && ret != LIBUSB_ERROR_NOT_FOUND) { + errx(EX_IOERR, "error resetting after download"); + } + } + + libusb_close(dfu_root->dev_handle); + dfu_root->dev_handle = NULL; + libusb_exit(ctx); + + return (0); +} diff --git a/tools/src/dfu-util/src/portable.h b/tools/src/dfu-util/src/portable.h new file mode 100755 index 0000000..2609232 --- /dev/null +++ b/tools/src/dfu-util/src/portable.h @@ -0,0 +1,72 @@ + +#ifndef PORTABLE_H +#define PORTABLE_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# define PACKAGE "dfu-util" +# define PACKAGE_VERSION "0.8-msvc" +# define PACKAGE_STRING "dfu-util 0.8-msvc" +# define PACKAGE_BUGREPORT "dfu-util@lists.gnumonks.org" +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_FTRUNCATE +# include +#else +# include +#endif /* HAVE_FTRUNCATE */ + +#ifdef HAVE_NANOSLEEP +# include +# define milli_sleep(msec) do {\ + if (msec) {\ + struct timespec nanosleepDelay = { (msec) / 1000, ((msec) % 1000) * 1000000 };\ + nanosleep(&nanosleepDelay, NULL);\ + } } while (0) +#elif defined HAVE_WINDOWS_H +# define milli_sleep(msec) do {\ + if (msec) {\ + Sleep(msec);\ + } } while (0) +#else +# error "Can't get no sleep! Please report" +#endif /* HAVE_NANOSLEEP */ + +#ifdef HAVE_ERR +# include +#else +# include +# include +# define warnx(...) do {\ + fprintf(stderr, __VA_ARGS__);\ + fprintf(stderr, "\n"); } while (0) +# define errx(eval, ...) do {\ + warnx(__VA_ARGS__);\ + exit(eval); } while (0) +# define warn(...) do {\ + fprintf(stderr, "%s: ", strerror(errno));\ + warnx(__VA_ARGS__); } while (0) +# define err(eval, ...) do {\ + warn(__VA_ARGS__);\ + exit(eval); } while (0) +#endif /* HAVE_ERR */ + +#ifdef HAVE_SYSEXITS_H +# include +#else +# define EX_OK 0 /* successful termination */ +# define EX_USAGE 64 /* command line usage error */ +# define EX_SOFTWARE 70 /* internal software error */ +# define EX_IOERR 74 /* input/output error */ +#endif /* HAVE_SYSEXITS_H */ + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +#ifndef off_t +# define off_t long int +#endif + +#endif /* PORTABLE_H */ diff --git a/tools/src/dfu-util/src/prefix.c b/tools/src/dfu-util/src/prefix.c new file mode 100755 index 0000000..05692f9 --- /dev/null +++ b/tools/src/dfu-util/src/prefix.c @@ -0,0 +1,176 @@ +/* + * dfu-prefix + * + * Copyright 2011-2012 Stefan Schmidt + * Copyright 2013 Hans Petter Selasky + * Copyright 2014 Uwe Bonnes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include "portable.h" +#include "dfu_file.h" + +enum mode { + MODE_NONE, + MODE_ADD, + MODE_DEL, + MODE_CHECK +}; + +int verbose; + +static void help(void) +{ + fprintf(stderr, "Usage: dfu-prefix [options] ...\n" + " -h --help\t\t\tPrint this help message\n" + " -V --version\t\t\tPrint the version number\n" + " -c --check \t\tCheck DFU prefix of \n" + " -D --delete \t\tDelete DFU prefix from \n" + " -a --add \t\tAdd DFU prefix to \n" + "In combination with -a:\n" + ); + fprintf(stderr, " -s --stellaris-address
Add TI Stellaris address prefix to \n" + "In combination with -D or -c:\n" + " -T --stellaris\t\tAct on TI Stellaris address prefix of \n" + "In combination with -a or -D or -c:\n" + " -L --lpc-prefix\t\tUse NXP LPC DFU prefix format\n" + ); + exit(EX_USAGE); +} + +static void print_version(void) +{ + printf("dfu-prefix (%s) %s\n\n", PACKAGE, PACKAGE_VERSION); + printf("Copyright 2011-2012 Stefan Schmidt, 2014 Uwe Bonnes\n" + "This program is Free Software and has ABSOLUTELY NO WARRANTY\n" + "Please report bugs to %s\n\n", PACKAGE_BUGREPORT); + +} + +static struct option opts[] = { + { "help", 0, 0, 'h' }, + { "version", 0, 0, 'V' }, + { "check", 1, 0, 'c' }, + { "add", 1, 0, 'a' }, + { "delete", 1, 0, 'D' }, + { "stellaris-address", 1, 0, 's' }, + { "stellaris", 0, 0, 'T' }, + { "LPC", 0, 0, 'L' }, +}; +int main(int argc, char **argv) +{ + struct dfu_file file; + enum mode mode = MODE_NONE; + enum prefix_type type = ZERO_PREFIX; + uint32_t lmdfu_flash_address = 0; + char *end; + + /* make sure all prints are flushed */ + setvbuf(stdout, NULL, _IONBF, 0); + + print_version(); + + memset(&file, 0, sizeof(file)); + + while (1) { + int c, option_index = 0; + c = getopt_long(argc, argv, "hVc:a:D:p:v:d:s:TL", opts, + &option_index); + if (c == -1) + break; + + switch (c) { + case 'h': + help(); + break; + case 'V': + exit(0); + break; + case 'D': + file.name = optarg; + mode = MODE_DEL; + break; + case 'c': + file.name = optarg; + mode = MODE_CHECK; + break; + case 'a': + file.name = optarg; + mode = MODE_ADD; + break; + case 's': + lmdfu_flash_address = strtoul(optarg, &end, 0); + if (*end) { + errx(EX_IOERR, "Invalid lmdfu " + "address: %s", optarg); + } + /* fall-through */ + case 'T': + type = LMDFU_PREFIX; + break; + case 'L': + type = LPCDFU_UNENCRYPTED_PREFIX; + break; + default: + help(); + break; + } + } + + if (!file.name) { + fprintf(stderr, "You need to specify a filename\n"); + help(); + } + + switch(mode) { + case MODE_ADD: + if (type == ZERO_PREFIX) + errx(EX_IOERR, "Prefix type must be specified"); + dfu_load_file(&file, MAYBE_SUFFIX, NO_PREFIX); + file.lmdfu_address = lmdfu_flash_address; + file.prefix_type = type; + printf("Adding prefix to file\n"); + dfu_store_file(&file, file.size.suffix != 0, 1); + break; + + case MODE_CHECK: + dfu_load_file(&file, MAYBE_SUFFIX, MAYBE_PREFIX); + show_suffix_and_prefix(&file); + if (type > ZERO_PREFIX && file.prefix_type != type) + errx(EX_IOERR, "No prefix of requested type"); + break; + + case MODE_DEL: + dfu_load_file(&file, MAYBE_SUFFIX, NEEDS_PREFIX); + if (type > ZERO_PREFIX && file.prefix_type != type) + errx(EX_IOERR, "No prefix of requested type"); + printf("Removing prefix from file\n"); + /* if there was a suffix, rewrite it */ + dfu_store_file(&file, file.size.suffix != 0, 0); + break; + + default: + help(); + break; + } + return (0); +} diff --git a/tools/src/dfu-util/src/quirks.c b/tools/src/dfu-util/src/quirks.c new file mode 100755 index 0000000..c90e585 --- /dev/null +++ b/tools/src/dfu-util/src/quirks.c @@ -0,0 +1,56 @@ +/* + * Simple quirk system for dfu-util + * + * Copyright 2010-2014 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "quirks.h" + +uint16_t get_quirks(uint16_t vendor, uint16_t product, uint16_t bcdDevice) +{ + uint16_t quirks = 0; + + /* Device returns bogus bwPollTimeout values */ + if ((vendor == VENDOR_OPENMOKO || vendor == VENDOR_FIC) && + product >= PRODUCT_FREERUNNER_FIRST && + product <= PRODUCT_FREERUNNER_LAST) + quirks |= QUIRK_POLLTIMEOUT; + + if (vendor == VENDOR_VOTI && + product == PRODUCT_OPENPCD) + quirks |= QUIRK_POLLTIMEOUT; + + /* Reports wrong DFU version in DFU descriptor */ + if (vendor == VENDOR_LEAFLABS && + product == PRODUCT_MAPLE3 && + bcdDevice == 0x0200) + quirks |= QUIRK_FORCE_DFU11; + + /* old devices(bcdDevice == 0) return bogus bwPollTimeout values */ + if (vendor == VENDOR_SIEMENS && + (product == PRODUCT_PXM40 || product == PRODUCT_PXM50) && + bcdDevice == 0) + quirks |= QUIRK_POLLTIMEOUT; + + /* M-Audio Transit returns bogus bwPollTimeout values */ + if (vendor == VENDOR_MIDIMAN && + product == PRODUCT_TRANSIT) + quirks |= QUIRK_POLLTIMEOUT; + + return (quirks); +} diff --git a/tools/src/dfu-util/src/quirks.h b/tools/src/dfu-util/src/quirks.h new file mode 100755 index 0000000..3193f25 --- /dev/null +++ b/tools/src/dfu-util/src/quirks.h @@ -0,0 +1,27 @@ +#ifndef DFU_QUIRKS_H +#define DFU_QUIRKS_H + +#define VENDOR_OPENMOKO 0x1d50 /* Openmoko Freerunner / GTA02 */ +#define VENDOR_FIC 0x1457 /* Openmoko Freerunner / GTA02 */ +#define VENDOR_VOTI 0x16c0 /* OpenPCD Reader */ +#define VENDOR_LEAFLABS 0x1eaf /* Maple */ +#define VENDOR_SIEMENS 0x0908 /* Siemens AG */ +#define VENDOR_MIDIMAN 0x0763 /* Midiman */ + +#define PRODUCT_FREERUNNER_FIRST 0x5117 +#define PRODUCT_FREERUNNER_LAST 0x5126 +#define PRODUCT_OPENPCD 0x076b +#define PRODUCT_MAPLE3 0x0003 /* rev 3 and 5 */ +#define PRODUCT_PXM40 0x02c4 /* Siemens AG, PXM 40 */ +#define PRODUCT_PXM50 0x02c5 /* Siemens AG, PXM 50 */ +#define PRODUCT_TRANSIT 0x2806 /* M-Audio Transit (Midiman) */ + +#define QUIRK_POLLTIMEOUT (1<<0) +#define QUIRK_FORCE_DFU11 (1<<1) + +/* Fallback value, works for OpenMoko */ +#define DEFAULT_POLLTIMEOUT 5 + +uint16_t get_quirks(uint16_t vendor, uint16_t product, uint16_t bcdDevice); + +#endif /* DFU_QUIRKS_H */ diff --git a/tools/src/dfu-util/src/suffix.c b/tools/src/dfu-util/src/suffix.c new file mode 100755 index 0000000..ba02a01 --- /dev/null +++ b/tools/src/dfu-util/src/suffix.c @@ -0,0 +1,176 @@ +/* + * dfu-suffix + * + * Copyright 2011-2012 Stefan Schmidt + * Copyright 2013 Hans Petter Selasky + * Copyright 2014 Tormod Volden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include "portable.h" +#include "dfu_file.h" + +enum mode { + MODE_NONE, + MODE_ADD, + MODE_DEL, + MODE_CHECK +}; + +int verbose; + +static void help(void) +{ + fprintf(stderr, "Usage: dfu-suffix [options] ...\n" + " -h --help\t\t\tPrint this help message\n" + " -V --version\t\t\tPrint the version number\n" + " -c --check \t\tCheck DFU suffix of \n" + " -a --add \t\tAdd DFU suffix to \n" + " -D --delete \t\tDelete DFU suffix from \n" + " -p --pid \t\tAdd product ID into DFU suffix in \n" + " -v --vid \t\tAdd vendor ID into DFU suffix in \n" + " -d --did \t\tAdd device ID into DFU suffix in \n" + " -S --spec \t\tAdd DFU specification ID into DFU suffix in \n" + ); + exit(EX_USAGE); +} + +static void print_version(void) +{ + printf("dfu-suffix (%s) %s\n\n", PACKAGE, PACKAGE_VERSION); + printf("Copyright 2011-2012 Stefan Schmidt, 2013-2014 Tormod Volden\n" + "This program is Free Software and has ABSOLUTELY NO WARRANTY\n" + "Please report bugs to %s\n\n", PACKAGE_BUGREPORT); + +} + +static struct option opts[] = { + { "help", 0, 0, 'h' }, + { "version", 0, 0, 'V' }, + { "check", 1, 0, 'c' }, + { "add", 1, 0, 'a' }, + { "delete", 1, 0, 'D' }, + { "pid", 1, 0, 'p' }, + { "vid", 1, 0, 'v' }, + { "did", 1, 0, 'd' }, + { "spec", 1, 0, 'S' }, +}; + +int main(int argc, char **argv) +{ + struct dfu_file file; + int pid, vid, did, spec; + enum mode mode = MODE_NONE; + + /* make sure all prints are flushed */ + setvbuf(stdout, NULL, _IONBF, 0); + + print_version(); + + pid = vid = did = 0xffff; + spec = 0x0100; /* Default to bcdDFU version 1.0 */ + memset(&file, 0, sizeof(file)); + + while (1) { + int c, option_index = 0; + c = getopt_long(argc, argv, "hVc:a:D:p:v:d:S:s:T", opts, + &option_index); + if (c == -1) + break; + + switch (c) { + case 'h': + help(); + break; + case 'V': + exit(0); + break; + case 'D': + file.name = optarg; + mode = MODE_DEL; + break; + case 'p': + pid = strtol(optarg, NULL, 16); + break; + case 'v': + vid = strtol(optarg, NULL, 16); + break; + case 'd': + did = strtol(optarg, NULL, 16); + break; + case 'S': + spec = strtol(optarg, NULL, 16); + break; + case 'c': + file.name = optarg; + mode = MODE_CHECK; + break; + case 'a': + file.name = optarg; + mode = MODE_ADD; + break; + default: + help(); + break; + } + } + + if (!file.name) { + fprintf(stderr, "You need to specify a filename\n"); + help(); + } + + if (spec != 0x0100 && spec != 0x011a) { + fprintf(stderr, "Only DFU specification 0x0100 and 0x011a supported\n"); + help(); + } + + switch(mode) { + case MODE_ADD: + dfu_load_file(&file, NO_SUFFIX, MAYBE_PREFIX); + file.idVendor = vid; + file.idProduct = pid; + file.bcdDevice = did; + file.bcdDFU = spec; + /* always write suffix, rewrite prefix if there was one */ + dfu_store_file(&file, 1, file.size.prefix != 0); + printf("Suffix successfully added to file\n"); + break; + + case MODE_CHECK: + dfu_load_file(&file, NEEDS_SUFFIX, MAYBE_PREFIX); + show_suffix_and_prefix(&file); + break; + + case MODE_DEL: + dfu_load_file(&file, NEEDS_SUFFIX, MAYBE_PREFIX); + dfu_store_file(&file, 0, file.size.prefix != 0); + if (file.size.suffix) /* had a suffix */ + printf("Suffix successfully removed from file\n"); + break; + + default: + help(); + break; + } + return (0); +} diff --git a/tools/src/dfu-util/src/usb_dfu.h b/tools/src/dfu-util/src/usb_dfu.h new file mode 100755 index 0000000..f6fe270 --- /dev/null +++ b/tools/src/dfu-util/src/usb_dfu.h @@ -0,0 +1,99 @@ +#ifndef USB_DFU_H +#define USB_DFU_H +/* USB Device Firmware Update Implementation for OpenPCD + * (C) 2006 by Harald Welte + * + * Protocol definitions for USB DFU + * + * This ought to be compliant to the USB DFU Spec 1.0 as available from + * http://www.usb.org/developers/devclass_docs/usbdfu10.pdf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#define USB_DT_DFU 0x21 + +#ifdef _MSC_VER +# pragma pack(push) +# pragma pack(1) +#endif /* _MSC_VER */ +struct usb_dfu_func_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bmAttributes; +#define USB_DFU_CAN_DOWNLOAD (1 << 0) +#define USB_DFU_CAN_UPLOAD (1 << 1) +#define USB_DFU_MANIFEST_TOL (1 << 2) +#define USB_DFU_WILL_DETACH (1 << 3) + uint16_t wDetachTimeOut; + uint16_t wTransferSize; + uint16_t bcdDFUVersion; +#ifdef _MSC_VER +}; +# pragma pack(pop) +#elif defined __GNUC__ +} __attribute__ ((packed)); +#else + #warning "No way to pack struct on this compiler? This will break!" +#endif /* _MSC_VER */ + +#define USB_DT_DFU_SIZE 9 + +#define USB_TYPE_DFU (LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE) + +/* DFU class-specific requests (Section 3, DFU Rev 1.1) */ +#define USB_REQ_DFU_DETACH 0x00 +#define USB_REQ_DFU_DNLOAD 0x01 +#define USB_REQ_DFU_UPLOAD 0x02 +#define USB_REQ_DFU_GETSTATUS 0x03 +#define USB_REQ_DFU_CLRSTATUS 0x04 +#define USB_REQ_DFU_GETSTATE 0x05 +#define USB_REQ_DFU_ABORT 0x06 + +/* DFU_GETSTATUS bStatus values (Section 6.1.2, DFU Rev 1.1) */ +#define DFU_STATUS_OK 0x00 +#define DFU_STATUS_errTARGET 0x01 +#define DFU_STATUS_errFILE 0x02 +#define DFU_STATUS_errWRITE 0x03 +#define DFU_STATUS_errERASE 0x04 +#define DFU_STATUS_errCHECK_ERASED 0x05 +#define DFU_STATUS_errPROG 0x06 +#define DFU_STATUS_errVERIFY 0x07 +#define DFU_STATUS_errADDRESS 0x08 +#define DFU_STATUS_errNOTDONE 0x09 +#define DFU_STATUS_errFIRMWARE 0x0a +#define DFU_STATUS_errVENDOR 0x0b +#define DFU_STATUS_errUSBR 0x0c +#define DFU_STATUS_errPOR 0x0d +#define DFU_STATUS_errUNKNOWN 0x0e +#define DFU_STATUS_errSTALLEDPKT 0x0f + +enum dfu_state { + DFU_STATE_appIDLE = 0, + DFU_STATE_appDETACH = 1, + DFU_STATE_dfuIDLE = 2, + DFU_STATE_dfuDNLOAD_SYNC = 3, + DFU_STATE_dfuDNBUSY = 4, + DFU_STATE_dfuDNLOAD_IDLE = 5, + DFU_STATE_dfuMANIFEST_SYNC = 6, + DFU_STATE_dfuMANIFEST = 7, + DFU_STATE_dfuMANIFEST_WAIT_RST = 8, + DFU_STATE_dfuUPLOAD_IDLE = 9, + DFU_STATE_dfuERROR = 10 +}; + +#endif /* USB_DFU_H */ diff --git a/tools/src/dfu-util/www/build.html b/tools/src/dfu-util/www/build.html new file mode 100755 index 0000000..2e6de0c --- /dev/null +++ b/tools/src/dfu-util/www/build.html @@ -0,0 +1,147 @@ + + + + + + + Building dfu-util from source + + + + + + + + + +
+

How to build dfu-util from source

+ +

Prerequisites for building from git

+

Mac OS X

+

+First install MacPorts (and if you are on 10.6 or older, the Java Developer Package) and then run: +

+
+	sudo port install libusb-devel git-core
+
+ +

FreeBSD

+
+	sudo pkg_add -r git pkgconf
+
+ +

Ubuntu and Debian and derivatives

+
+	sudo apt-get build-dep dfu-util
+	sudo apt-get install libusb-1.0-0-dev
+
+ +

Get the source code and build it

+

+The first time you will have to clone the git repository: +

+
+	git clone git://gitorious.org/dfu-util/dfu-util.git
+	cd dfu-util
+
+

+If you later want to update to latest git version, just run this: +

+
+	make maintainer-clean
+	git pull
+
+

+To build the source: +

+
+	./autogen.sh
+	./configure  # on most systems
+	make
+
+ +

+If you are building on Mac OS X, replace the ./configure command with: +

+
+	./configure --libdir=/opt/local/lib --includedir=/opt/local/include  # on MacOSX only
+
+ +

+Your dfu-util binary will be inside the src folder. Use it from there, or install it to /usr/local/bin by running "sudo make install". +

+ +

Cross-building for Windows

+ +

+Windows binaries can be built in a MinGW +environment, on a Windows computer or cross-hosted in another OS. +To build it on a Debian or Ubuntu host, first install build dependencies: +

+
+	sudo apt-get build-dep libusb-1.0-0 dfu-util
+	sudo apt-get install mingw32
+
+ +

+The below example builds dfu-util 0.8 and libusb 1.0.19 from unpacked release +tarballs. If you instead build from git, you will have to run "./autogen.sh" +before running the "./configure" steps. +

+ +
+mkdir -p build
+cd libusb-1.0.19
+PKG_CONFIG_PATH=$PWD/../build/lib/pkgconfig ./configure \
+    --host=i586-mingw32msvc --prefix=$PWD/../build
+# WINVER workaround needed for 1.0.19 only
+make CFLAGS="-DWINVER=0x0501"
+make install
+cd ..
+
+cd dfu-util-0.8
+PKG_CONFIG_PATH=$PWD/../build/lib/pkgconfig ./configure \
+    --host=i586-mingw32msvc --prefix=$PWD/../build
+make
+make install
+cd ..
+
+The build files will now be in build/bin. +

+ +

Building on Windows using MinGW

+This assumes using release tarballs or having run ./autogen.sh on +the git sources. +
+cd libusb-1.0.19
+./configure --prefix=$HOME
+# WINVER workaround needed for 1.0.19 only
+# MKDIR_P setting should not really be needed...
+make CFLAGS="-DWINVER=0x0501" MKDIR_P="mkdir -p"
+make install
+cd ..
+
+cd dfu-util-0.8
+./configure USB_CFLAGS="-I$HOME/include/libusb-1.0" \
+            USB_LIBS="-L $HOME/lib -lusb-1.0" PKG_CONFIG=true
+make
+make install
+cd ..
+
+To link libusb statically into dfu-util.exe use instead of "make": +
+make LDFLAGS=-static
+
+The built executables (and DLL) will now be under $HOME/bin. + +

+[Back to dfu-util main page] +

+ +
+ + diff --git a/tools/src/dfu-util/www/dfu-util.1.html b/tools/src/dfu-util/www/dfu-util.1.html new file mode 100755 index 0000000..667a369 --- /dev/null +++ b/tools/src/dfu-util/www/dfu-util.1.html @@ -0,0 +1,411 @@ + + +Man page of DFU-UTIL + + +

DFU-UTIL(1)

+ +  +

NAME

+ +dfu-util - Device firmware update (DFU) USB programmer +  +

SYNOPSIS

+ + +
+
+dfu-util + +-l + +[-v] + +[-d + +vid:pid[,vid:pid]] + +[-p + +path] + +[-c + +configuration] + +[-i + +interface] + +[-a + +alt-intf] + +[-S + +serial[,serial]] + + +
+dfu-util + +[-v] + +[-d + +vid:pid[,vid:pid]] + +[-p + +path] + +[-c + +configuration] + +[-i + +interface] + +[-a + +alt-intf] + +[-S + +serial[,serial]] + +[-t + +size] + +[-Z + +size] + +[-s + +address] + +[-R] + +[-D|-U + +file] + + +
+dfu-util + +[-hV] + +
+  +

DESCRIPTION

+ +dfu-util + +is a program that implements the host (computer) side of the USB DFU +(Universal Serial Bus Device Firmware Upgrade) protocol. +

+dfu-util communicates with devices that implement the device side of the +USB DFU protocol, and is often used to upgrade the firmware of such +devices. +  +

OPTIONS

+ +
+
-l, --list + +
+List the currently attached DFU capable USB devices. +
-d, --device [Run-Time VENDOR]:[Run-Time PRODUCT][,[DFU Mode VENDOR]:[DFU Mode PRODUCT]] + +
+
+Specify run-time and/or DFU mode vendor and/or product IDs of the DFU device +to work with. VENDOR and PRODUCT are hexadecimal numbers (no prefix +needed), "*" (match any), or "-" (match nothing). By default, any DFU capable +device in either run-time or DFU mode will be considered. +

+If you only have one standards-compliant DFU device attached to your computer, +this parameter is optional. However, as soon as you have multiple DFU devices +connected, dfu-util will detect this and abort, asking you to specify which +device to use. +

+If only run-time IDs are specified (e.g. "--device 1457:51ab"), then in +addition to the specified run-time IDs, any DFU mode devices will also be +considered. This is beneficial to allow a DFU capable device to be found +again after a switch to DFU mode, since the vendor and/or product ID of a +device usually changes in DFU mode. +

+If only DFU mode IDs are specified (e.g. "--device ,951:26"), then all +run-time devices will be ignored, making it easy to target a specific device in +DFU mode. +

+If both run-time and DFU mode IDs are specified (e.g. "--device +1457:51ab,:2bc"), then unspecified DFU mode components will use the run-time +value specified. +

+Examples: +

+
--device 1457:51ab,951:26 + +
+
+ +Work with a device in run-time mode with +vendor ID 0x1457 and product ID 0x51ab, or in DFU mode with vendor ID 0x0951 +and product ID 0x0026 +

+

--device 1457:51ab,:2bc + +
+
+ +Work with a device in run-time mode with vendor ID 0x1457 and product ID +0x51ab, or in DFU mode with vendor ID 0x1457 and product ID 0x02bc +

+

--device 1457:51ab + +
+
+ +Work with a device in run-time mode with vendor ID 0x1457 and product ID +0x51ab, or in DFU mode with any vendor and product ID +

+

--device ,951:26 + +
+
+ +Work with a device in DFU mode with vendor ID 0x0951 and product ID 0x0026 +

+

--device *,- + +
+
+ +Work with any device in run-time mode, and ignore any device in DFU mode +

+

--device , + +
+
+ +Ignore any device in run-time mode, and Work with any device in DFU mode +
+
+ +
-p, --path BUS-PORT. ... .PORT + +
+Specify the path to the DFU device. +
-c, --cfg CONFIG-NR + +
+Specify the configuration of the DFU device. Note that this is only used for matching, the configuration is not set by dfu-util. +
-i, --intf INTF-NR + +
+Specify the DFU interface number. +
-a, --alt ALT + +
+Specify the altsetting of the DFU interface by name or by number. +
-S, --serial [Run-Time SERIAL][,[DFU Mode SERIAL]] + +
+Specify the run-time and DFU mode serial numbers used to further restrict +device matches. If multiple, identical DFU devices are simultaneously +connected to a system then vendor and product ID will be insufficient for +targeting a single device. In this situation, it may be possible to use this +parameter to specify a serial number which also must match. +

+If only a single serial number is specified, then the same serial number is +used in both run-time and DFU mode. An empty serial number will match any +serial number in the corresponding mode. +

-t, --transfer-size SIZE + +
+Specify the number of bytes per USB transfer. The optimal value is +usually determined automatically so this option is rarely useful. If +you need to use this option for a device, please report it as a bug. +
-Z, --upload-size SIZE + +
+Specify the expected upload size, in bytes. +
-U, --upload FILE + +
+Read firmware from device into +FILE. + +
-D, --download FILE + +
+Write firmware from +FILE + +into device. +
-R, --reset + +
+Issue USB reset signalling after upload or download has finished. +
-s, --dfuse-address address + +
+Specify target address for raw binary download/upload on DfuSe devices. Do +not + +use this for downloading DfuSe (.dfu) files. Modifiers can be added +to the address, separated by a colon, to perform special DfuSE commands such +as "leave" DFU mode, "unprotect" and "mass-erase" flash memory. +
-v, --verbose + +
+Print more information about dfu-util's operation. A second +-v + +will turn on verbose logging of USB requests. Repeat this option to further +increase verbosity. +
-h, --help + +
+Show a help text and exit. +
-V, --version + +
+Show version information and exit. +
+  +

EXAMPLES

+ +  +

Using dfu-util in the OpenMoko project

+ +(with the Neo1973 hardware) +

+ +Flashing the rootfs: +
+ + $ dfu-util -a rootfs -R -D /path/to/openmoko-devel-image.jffs2 + +

+ +Flashing the kernel: +
+ + $ dfu-util -a kernel -R -D /path/to/uImage + +

+ +Flashing the bootloader: +
+ + $ dfu-util -a u-boot -R -D /path/to/u-boot.bin + +

+ +Copying a kernel into RAM: +
+ + $ dfu-util -a 0 -R -D /path/to/uImage + +

+Once this has finished, the kernel will be available at the default load +address of 0x32000000 in Neo1973 RAM. +Note: + +You cannot transfer more than 2MB of data into RAM using this method. +

+  +

Using dfu-util with a DfuSe device

+ +

+ +Flashing a +.dfu + +(special DfuSe format) file to the device: +
+ + $ dfu-util -a 0 -D /path/to/dfuse-image.dfu + +

+ +Reading out 1 KB of flash starting at address 0x8000000: +
+ + $ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin + +

+ +Flashing a binary file to address 0x8004000 of device memory and +ask the device to leave DFU mode: +
+ + $ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin + + +  +

BUGS

+ +Please report any bugs to the dfu-util mailing list at +dfu-util@lists.gnumonks.org. + +Please use the +--verbose option (repeated as necessary) to provide more + +information in your bug report. +  +

SEE ALSO

+ +The dfu-util home page is +http://dfu-util.gnumonks.org + +  +

HISTORY

+ +dfu-util was originally written for the OpenMoko project by +Weston Schmidt <weston_schmidt@yahoo.com> and +Harald Welte <hwelte@hmw-consulting.de>. Over time, nearly complete +support of DFU 1.0, DFU 1.1 and DfuSe ("1.1a") has been added. +  +

LICENCE

+ +dfu-util + +is covered by the GNU General Public License (GPL), version 2 or later. +  +

COPYRIGHT

+ +This manual page was originally written by Uwe Hermann <uwe@hermann-uwe.de>, +and is now part of the dfu-util project. +

+ +


+ 

Index

+
+
NAME
+
SYNOPSIS
+
DESCRIPTION
+
OPTIONS
+
EXAMPLES
+
+
Using dfu-util in the OpenMoko project
+
Using dfu-util with a DfuSe device
+
+
BUGS
+
SEE ALSO
+
HISTORY
+
LICENCE
+
COPYRIGHT
+
+
+This document was created by man2html, +using the doc/dfu-util.1 manual page from dfu-util 0.8.
+Time: 14:40:57 GMT, September 13, 2014 + + diff --git a/tools/src/dfu-util/www/dfuse.html b/tools/src/dfu-util/www/dfuse.html new file mode 100755 index 0000000..ebb9784 --- /dev/null +++ b/tools/src/dfu-util/www/dfuse.html @@ -0,0 +1,135 @@ + + + + + + DfuSe and dfu-util + + + + + + + + + +
+

Using dfu-util with DfuSe devices

+

DfuSe

+

+ DfuSe (DFU with ST Microsystems extensions) is a protocol based on + DFU 1.1. However, in expanding the functionality of the DFU protocol, + ST Microsystems broke all compatibility with the DFU 1.1 standard. + DfuSe devices report the DFU version as "1.1a". +

+

+ DfuSe can be used to download firmware and other data + from a host computer to a conforming device (or upload in the + opposite direction) over USB similar to standard DFU. +

+

+ The main difference from standard DFU is that the target address in + the device (flash) memory is specified by the host, so that a + download can be performed to parts of the device memory. The host + program is also responsible for erasing flash pages before they + are written to. +

+

.dfu files

+

+ A special file format is defined by ST Microsystems to carry firmware + for DfuSe devices. The file contains target information such as address + and alternate interface information in addition to the binary data. + Several blocks of binary data can be combined in one .dfu file. +

+

Alternate interfaces

+

+ Different memory locations of the device may have different + characteristics that the host program (dfu-util) has to take + into considerations, such as flash memory page size, read-only + versus read-write segments, the need to erase, and so on. + These parameters are reported by the device in the string + descriptors meant for describing the USB interfaces. + The host program decodes these strings to build a memory map of + the device. Different memory units or address spaces are listed + in separate alternate interface settings that must be selected + according to the memory unit to access. +

+

+ Note that dfu-util leaves it to the user to select alternate + interface. When parsing a .dfu file it will skip file segments + not matching the selected alternate interface. Also, some + DfuSe device firmware implementations ignore the setting of + alternate interface and deduct the memory unit from the + address, since they have no address space overlap. +

+

DfuSe special commands

+

+ DfuSe special commands are used by the host program during normal + downloads or uploads, such as SET_ADDRESS and ERASE_PAGE. Also + the normal DFU_DNLOAD and DFU_UPLOAD commands have special + implementations in DfuSe. + Many DfuSe devices also support commands to leave DFU mode, + read unprotect the flash memory or mass erase the flash memory. + dfu-util (from version 0.7) + supports adding "leave", "unprotect", or "mass-erase" + to the -s option argument to send such requests in combination + with a download request. These modifiers are separated with a colon. +

+

+ Some DfuSe devices have their DfuSe bootloader running from flash + memory. Erasing the whole flash memory would therefore destroy + the DfuSe bootloader itself and practically brick the device + for most users. Any use of modifiers such as "unprotect" + and "mass-erase" therefore needs to be combined with the "force" + modifer. This is not included in the examples, to not encourage + ignorant users to copy and paste such instructions and shoot + themselves in the foot. +

+

+ Devices based on for instance STM32F103 all run the bootloader + from flash, since there is no USB bootloader in ROM. +

+

+ For instance STM32F107, STM32F2xx and STM32F4xx devices have a + DfuSe bootloader in ROM, so the flash can be erased while + keeping the device available for USB DFU transfers as long + as the device designers use this built-in bootloader and have + not implemented another DfuSe bootloader in flash that the user is + dependent upon. +

+

+ Well-written bootloaders running from flash will report their + own memory region as read-only and not eraseable, but this does + not prevent dfu-util from sending a "unprotect" or "mass-erase" + request which overrides this, if the user insists. +

+

Example usage

+

+ Flashing a .dfu (special DfuSe format) file to the device: +

+
+         $ dfu-util -a 0 -D /path/to/dfuse-image.dfu
+	
+

+ Reading out 1 KB of flash starting at address 0x8000000: +

+
+         $ dfu-util -a 0 -s 0x08000000:1024 -U newfile.bin
+	
+

+ Flashing a binary file to address 0x8004000 of device memory and ask + the device to leave DFU mode: +

+
+         $ dfu-util -a 0 -s 0x08004000:leave -D /path/to/image.bin
+	
+

+ [Back to dfu-util main page] +

+ +
+ + diff --git a/tools/src/dfu-util/www/index.html b/tools/src/dfu-util/www/index.html new file mode 100755 index 0000000..9bb3223 --- /dev/null +++ b/tools/src/dfu-util/www/index.html @@ -0,0 +1,119 @@ + + + + + + dfu-util Homepage + + + + + + + + + +
+

dfu-util - Device Firmware Upgrade Utilities

+

Description

+

+ dfu-util is a host side implementation of the DFU 1.0 and DFU 1.1 specifications of the USB forum. + + DFU is intended to download and upload firmware to/from devices connected + over USB. It ranges from small devices like micro-controller boards + to mobile phones. Using dfu-util you can download firmware to your + DFU-enabled device or upload firmware from it. dfu-util has been + tested with the Openmoko Neo1973 and Freerunner and many other devices. +

+

+ See the manual page for examples of use. +

+

Supported Devices

+ +

Releases

+

+ Releases of the dfu-util software can be found in the + releases folder. + The current release is 0.8. +

+

+ We offer binaries for Microsoft Windows and some other platforms. + dfu-util uses libusb 1.0 to access your device, so + on Windows you have to register the device with the WinUSB driver + (alternatively libusb-win32 or libusbK), please see the libusbx wiki + for more details. +

+

+ Mac OS X users can also get dfu-util from Homebrew with "brew install dfu-util" or from MacPorts. +

+

+ Most Linux distributions ship dfu-util in binary packages for those + who do not want to compile dfu-util from source. + On Debian, Ubuntu, Fedora and Gentoo you can install it through the + normal software package tools. For other distributions +(namely OpenSuSe, Mandriva, and CentOS) Holger Freyther was kind enough to +provide binary packages through the Open Build Service. +

+

Development

+

+ Development happens in a GIT repository. Browse it via the web +interface or clone it with: +

+
+	git clone git://gitorious.org/dfu-util/dfu-util.git
+	
+

+ See our build instructions for how to + build the source on different platforms. +

+

License

+

+ This software is licensed under the GPL version 2. +

+

Contact

+

+ If you have questions about the development or use of dfu-util please + send an e-mail to our dedicated +mailing list for dfu-util. +

+

People

+

+ dfu-util was originally written by + Harald Welte partially based on code from + dfu-programmer 0.4 and is currently maintained by Stefan Schmidt and + Tormod Volden. +

+ +
+ + diff --git a/tools/src/dfu-util/www/simple.css b/tools/src/dfu-util/www/simple.css new file mode 100755 index 0000000..10b7c1d --- /dev/null +++ b/tools/src/dfu-util/www/simple.css @@ -0,0 +1,56 @@ +body { + margin: 10px; + font-size: 0.82em; + background-color: #EEE; +} + +h1 { + clear: both; + padding: 0 0 12px 0; + margin: 0; + font-size: 2em; + font-weight: bold; +} + +h2 { + clear: both; + margin: 0; + font-size: 1.5em; + font-weight: normal; +} + +h3 { + clear: both; + margin: 15px 0 0 0; + font-size: 1.0em; + font-weight: bold; +} + +p { + line-height: 20px; + padding: 8px 0 8px 0; + margin: 0; + font-size: 1.1em; +} + +pre { + white-space: pre-wrap; + background-color: #CCC; + padding: 3px; +} + +a:hover { + background-color: #DDD; +} + +#middlebox { + width: 600px; + margin: 0px auto; + text-align: left; +} + +#footer { + height: 100px; + padding: 28px 3px 0 0; + margin: 20px 0 20px 0; +} From ce70ae4fcee762c94c6e80c3d63481f739897ff6 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 20 Jul 2015 06:38:38 +1000 Subject: [PATCH 25/28] Added source to maple_loader.jar --- tools/src/maple_loader/README.md | 5 + tools/src/maple_loader/build.xml | 73 + .../maple_loader/build/built-jar.properties | 4 + .../build/classes/CliTemplate/CliMain.class | Bin 0 -> 1753 bytes .../classes/CliTemplate/DFUUploader.class | Bin 0 -> 7476 bytes .../classes/CliTemplate/ExecCommand.class | Bin 0 -> 3243 bytes .../build/classes/processing/app/Base.class | Bin 0 -> 639 bytes .../classes/processing/app/Preferences.class | Bin 0 -> 2215 bytes .../build/classes/processing/app/Serial.class | Bin 0 -> 7732 bytes .../processing/app/SerialException.class | Bin 0 -> 735 bytes .../app/debug/MessageConsumer.class | Bin 0 -> 174 bytes .../processing/app/debug/MessageSiphon.class | Bin 0 -> 2325 bytes .../app/debug/RunnerException.class | Bin 0 -> 2509 bytes .../processing/app/helpers/ProcessUtils.class | Bin 0 -> 1399 bytes tools/src/maple_loader/dist/README.TXT | 32 + tools/src/maple_loader/dist/lib/jssc.jar | Bin 0 -> 152418 bytes tools/src/maple_loader/dist/maple_loader.jar | Bin 0 -> 32791 bytes tools/src/maple_loader/jars/jssc.jar | Bin 0 -> 152418 bytes tools/src/maple_loader/manifest.mf | 3 + .../src/maple_loader/nbproject/build-impl.xml | 1413 +++++++++++++++++ .../nbproject/genfiles.properties | 8 + .../nbproject/private/config.properties | 0 .../nbproject/private/private.properties | 6 + .../nbproject/private/private.xml | 10 + .../maple_loader/nbproject/project.properties | 79 + tools/src/maple_loader/nbproject/project.xml | 15 + .../maple_loader/src/CliTemplate/CliMain.java | 60 + .../src/CliTemplate/DFUUploader.java | 345 ++++ .../src/CliTemplate/ExecCommand.java | 119 ++ .../maple_loader/src/processing/app/Base.java | 53 + .../src/processing/app/Preferences.java | 157 ++ .../src/processing/app/Serial.java | 527 ++++++ .../src/processing/app/SerialException.java | 39 + .../processing/app/debug/MessageConsumer.java | 42 + .../processing/app/debug/MessageSiphon.java | 104 ++ .../processing/app/debug/RunnerException.java | 161 ++ .../processing/app/helpers/ProcessUtils.java | 32 + 37 files changed, 3287 insertions(+) create mode 100644 tools/src/maple_loader/README.md create mode 100644 tools/src/maple_loader/build.xml create mode 100644 tools/src/maple_loader/build/built-jar.properties create mode 100644 tools/src/maple_loader/build/classes/CliTemplate/CliMain.class create mode 100644 tools/src/maple_loader/build/classes/CliTemplate/DFUUploader.class create mode 100644 tools/src/maple_loader/build/classes/CliTemplate/ExecCommand.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/Base.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/Preferences.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/Serial.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/SerialException.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/debug/MessageConsumer.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/debug/MessageSiphon.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/debug/RunnerException.class create mode 100644 tools/src/maple_loader/build/classes/processing/app/helpers/ProcessUtils.class create mode 100644 tools/src/maple_loader/dist/README.TXT create mode 100644 tools/src/maple_loader/dist/lib/jssc.jar create mode 100644 tools/src/maple_loader/dist/maple_loader.jar create mode 100644 tools/src/maple_loader/jars/jssc.jar create mode 100644 tools/src/maple_loader/manifest.mf create mode 100644 tools/src/maple_loader/nbproject/build-impl.xml create mode 100644 tools/src/maple_loader/nbproject/genfiles.properties create mode 100644 tools/src/maple_loader/nbproject/private/config.properties create mode 100644 tools/src/maple_loader/nbproject/private/private.properties create mode 100644 tools/src/maple_loader/nbproject/private/private.xml create mode 100644 tools/src/maple_loader/nbproject/project.properties create mode 100644 tools/src/maple_loader/nbproject/project.xml create mode 100644 tools/src/maple_loader/src/CliTemplate/CliMain.java create mode 100644 tools/src/maple_loader/src/CliTemplate/DFUUploader.java create mode 100644 tools/src/maple_loader/src/CliTemplate/ExecCommand.java create mode 100644 tools/src/maple_loader/src/processing/app/Base.java create mode 100644 tools/src/maple_loader/src/processing/app/Preferences.java create mode 100644 tools/src/maple_loader/src/processing/app/Serial.java create mode 100644 tools/src/maple_loader/src/processing/app/SerialException.java create mode 100644 tools/src/maple_loader/src/processing/app/debug/MessageConsumer.java create mode 100644 tools/src/maple_loader/src/processing/app/debug/MessageSiphon.java create mode 100644 tools/src/maple_loader/src/processing/app/debug/RunnerException.java create mode 100644 tools/src/maple_loader/src/processing/app/helpers/ProcessUtils.java diff --git a/tools/src/maple_loader/README.md b/tools/src/maple_loader/README.md new file mode 100644 index 0000000..c6c9379 --- /dev/null +++ b/tools/src/maple_loader/README.md @@ -0,0 +1,5 @@ +These files build the maple_loader.jar file used on Windows to reset the Sketch via USB Serial, so that the bootloader will run in dfu upload mode, ready for a new sketch to be uploaded + +The files were written by @bobC (github) and have been slightly modified by me (Roger Clark), so that dfu-util no longer attempts to reset the board after upload. +This change to dfu-util's reset command line argument, was required because dfu-util was showing errors on some Windows systems, because the bootloader had reset its self after upload, +before dfu-util had chance to tell it to reset. \ No newline at end of file diff --git a/tools/src/maple_loader/build.xml b/tools/src/maple_loader/build.xml new file mode 100644 index 0000000..63ae9c2 --- /dev/null +++ b/tools/src/maple_loader/build.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + Builds, tests, and runs the project maple_loader. + + + diff --git a/tools/src/maple_loader/build/built-jar.properties b/tools/src/maple_loader/build/built-jar.properties new file mode 100644 index 0000000..94002ae --- /dev/null +++ b/tools/src/maple_loader/build/built-jar.properties @@ -0,0 +1,4 @@ +#Mon, 20 Jul 2015 11:21:26 +1000 + + +C\:\\Users\\rclark\\Desktop\\maple-asp-master\\installer\\maple_loader= diff --git a/tools/src/maple_loader/build/classes/CliTemplate/CliMain.class b/tools/src/maple_loader/build/classes/CliTemplate/CliMain.class new file mode 100644 index 0000000000000000000000000000000000000000..37ee63000b20df7528829288b7f0fbeb28eb3b98 GIT binary patch literal 1753 zcmZ`(?^7F96g^8e*(Ke!Bot_BEkSJ?Qc5V;R-jfb6dMgcG>{5a@g;erOE=l=X2Z~N zI-?()v44qQZ9mYCj{X7uQR;cgB4LP`%)9&UJMY|k&%L{U{r%gY0A}FDk-}_0<}h#K zP8=WNu8EK0_!ysNj62~BB)v{_}O_60{U^nDSt6rA=x+pvJBnxgu zI3?lRY9BiF;IZA*FjQD@>~&f991+MIpO=N*m?v4CR>N@SQDIl?iJT)EwOldq?M7{0 z1=Gko)OB=!zaqWBcH4J_UnBKkkE}dUI6;1gw$&`>7YQ%hjU`)E zajLr0+VC7#RHd&Wbu912rH#WQ=6<>uh{}^?;k8ROkTtMLX(_0Nc+qY771^P*!g?oF zA{H)T)WDX7NBCMpqAol~Zg=9P_ogOq82HA*x7cPXO-U`CNso0H_|AernPCsT6gqfD ziB{N*&{q|KDBD5PLIqWlAG&3^RonI{{SmYoxSoP)usq+b`J%ok9YH>;)vkUrROWE2 z1fx)i@Km${ciWdu8CZ~@l4rt$J?WR-CIgLhcf3nE3pG4u+m5>OUsEmEN|O=MNK4;$ z{j^)Dw0vJy$I{IU`M8_2<0+8CF&@gCoHaGY7pQPWHk+L4obWud${p#; z27L@k4K-ZtakV#DocMerkTo@*!#%F$RY--p=emv*?bquh)s{kq%`Mr24f>z_x0oWk zLCTs8mRW_UvAgFo<0m=Ux^{yCxgX?0=#uN#1q+Prgb%YlQtp0*JB^+1Ngr)XjWN8< zkD&VXK~wJ&*EDxIT8%cEeGTnp`*@6NtnD1eJAAe}0KAL$xa-GdT%jioXby1(eJ`?+ z=|WbYUd~3RSF*9`IsFy-l92=G$>_B=h$W4rsZ9R>O+0xjarp;jEnTgr6Z)^pp1H0d zXD8G;z>`EW8R7an1~*^h+*~vjP3Z?1diV=2&c$9~Bza!{1F6kODt3Si#W#5C02f~} zu__!6^)Mo=87N_h>m}%{*ksZcy$P0*Vi}_>IX literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/build/classes/CliTemplate/DFUUploader.class b/tools/src/maple_loader/build/classes/CliTemplate/DFUUploader.class new file mode 100644 index 0000000000000000000000000000000000000000..77087b052fbd03f77b9e1417f2754196beaf1844 GIT binary patch literal 7476 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 literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/build/classes/CliTemplate/ExecCommand.class b/tools/src/maple_loader/build/classes/CliTemplate/ExecCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..ad95f79845d3d1b0c1d2245d06800c06c37e8c08 GIT binary patch literal 3243 zcma)8TW}NS75;u{rC%0{F$RGJfhdV%e8DI8>iD5`@f$5 zobR0TowIuL-k)v*cpTT`Xu((=I*^sf#Sz9>9Ca|&Fun>Cm{fx$aYoHgOYE&f9t8WB885cO{+|kW;2R=9EkUaYA6t zxaF3-gRbkihn%vV6KE)zS;x-R9@UxCS+nR_jxEqKP;{NFSt?ofMA|48(>ZgjJdr+9 zwr$frxFEMnAiCSKEw5J~+}d_bK6Ts5zpt3hVZm@qR|ani9V8zv@!I)W%#c?OJOT$+=a;zC}UmqFTH zV?2m#49>}jGqW>Tz-F`Y~^#NtK+Bm8Ih%QT*6BdKiBapPV4xEf|14!9gks$#A`a{ z@XG~EOL@W!{XfN|<5vp$<4XIl@r1y`E52HiR*4sN{06^O&o1luom%}~A^U^!dF!H2 zD^XI%PIT$`gmS;(++*icuIZIs+sviT?L5CEVnbtR%&aGIMaNbAQQ~zS*HBSGI4w|b zPFr3o%ewDLQ42%)KGpnwaR@x>bL>*NV3MQti;1n4$l66m0`9Y3S?L9V^{s99bBPti zYM$^W{kFu44jVbv=n~phecIK=?x>ZlXGk{bIX;gBT9@>f1N} z$}HW*mNCrshI|tYLYF9FnPqJE{mK z6v5<_kuRG=8sTcI_HMSA5xSb;dhj19djx zgIwuVNxpfKJAoeTq6D>sPebyj48*Bh2#;QeHrR2v^LDou?v5lP3GEWLbtWQRJ<(*e zf=G3W&O+awjNXI{;rNA!n4AB{_U$(j6Lz106kD zQoG$933o>m(M04D+LKx$+SMbkLcfL8v|OK*6|8A&;84NZ3K}m&srv7{uV7t!_!`!$ zA<=OI8+x=kZ0?ENLepq6QbF=MHdUc*PDbzC!ULm8t%5BK%T^^+-9G4VqguC2$XRSv z?^4RCl#+d@H{31f=Ks|bo16b95kK-*#ME?Wi}orWyo%<=MqhnX3br`OQNu>~<~ z!&bE7QSLj@&bw{cO->APH$n~^B_ocrNuMSU&XNPqbG}F>yu$2WVpiuUeHr^{VGsLq zFEg+gf5ATd4SjeEAI97GDBeLo-o?l9Zw%lr25}EVLSR_bVN^8Wgh=3&*u*y84MX%` zOk|K1Pa!8xV%+D@n^;ebO|-NJQ8KKHcJ`8!^~AT2wl%CJmk)3iA;wL#yocN}=!=rm zsAZ=w7lFkWN-j#AF{10@>MGfK5Qh*EQAXq=#2X`m>TOK%GvKaT^-~|apcui&=nq*a zBJ^oLv0UaiZxDxR?JYdV=nWIg+nC~)ZJ0LRK?z4_TOvanswS#BMyTT`PmW;CJe`P2 z9FtfjahxMVgyy@5G|gijx0-$0j#Q*>R literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/build/classes/processing/app/Base.class b/tools/src/maple_loader/build/classes/processing/app/Base.class new file mode 100644 index 0000000000000000000000000000000000000000..4aa0bde02049fbb6c4e035d952edc3f002cba1e1 GIT binary patch literal 639 zcmaKp%TB^T6o&tSLZKAVg7^Ck!G)N(aDg#K6B84>Bp6NH4Q13pXq&cpc^a2)+_+KW z!Uyo7jHgH%(vSU{TL#iY#anNj3gnP^@bs|Q|HhKMoyE2H|Q1LIN$1qrOT-y|$C#{PD zcbvjD_e7B)F1=G}RqY$fA^jOcvg~v7YM(o8fhs+!)VyWT%68K=#jXsB#RI`gjbC#e zacB&x?X6h6Aymxhn8h5Cwpqozjs+|-MB1iwk7gM916!fasl&rcO_+WcD&Kj&XfPx$ zgn#7Pj&S`uhHS3%^Q!E-G+r_P8+DsnY1AJLE^ZIc>Fe~e?9mh|{hDBfK@&rxJwZ`{ zPDW>B`33BWE+Oc&M_X_PNxJLb3Ft$LqB#07KqPp)PT9fA7@=2$4doe;&^=V;0ZRCh ec&BR#29XFt##T^2{g)*ApJcUD!jNgz82kc&eSc^G literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/build/classes/processing/app/Preferences.class b/tools/src/maple_loader/build/classes/processing/app/Preferences.class new file mode 100644 index 0000000000000000000000000000000000000000..89cf0100455af1f41500150e545c8bbd12583674 GIT binary patch literal 2215 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 L#S!xqDulu}Wzd50 literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/build/classes/processing/app/debug/MessageConsumer.class b/tools/src/maple_loader/build/classes/processing/app/debug/MessageConsumer.class new file mode 100644 index 0000000000000000000000000000000000000000..37250e7704487822639cf03f4e4a333da994be50 GIT binary patch literal 174 zcmX^0Z`VEs1_omWPId-%b_Nbc2KL<4;^M^gR7M6-4WF#UvPAuy#JqI<;F6-uymV{L zFh&Nh;QZ2}36TD<=a zee$u-T}#4J*3vf~eDmkHmbdTB3`x3-T|Q)=efH(-y}z^fnf&_KPd@_~$Jc3`K|#YE z4ezEAM=^~U<~s2b<`r2`3FpOF@DY|1aeE`vQp>rz{0}ik26Y+<5P_3@WA4aH*G_Nr)yS)eXYYsjn$=fJOWF4tYZhC37l!#w}YMI5E!%pT%fP% z+dxal=PHf9X`?)_MwAB1vTAyk>pLES*6{_t)bW){_Z9doX zp*cQw*xW5Rg|$DEB4^Hd92&M1T~J--)m&ee8#S=#_5-Loy058<-UTH+9!Y~sI?QMy zn1HJE?|PQwSw7)TWD82zQS}XvWu(;85YEQY?D>`vXiP_vZ;Q0~d|YUa5UKy|5#2V& zD&;$eAPhYZ*KvUzx$BPrxE*8^HuS-Abd74{xS?(;X{fBvh&yULy=i|kxTlNf7 z;w+!=GZ1(g31n24^DB^1jm|Zu+BsO+^IQ|O%i=s~j=OJ>nhpw19x}OH;50efeMVe!jVSW-ua2gkw zO`dcdm+%Iz;Y~`x9D}Hok8;QOw0WI5DNf}bBYzQNVV2?>S|_O6VZ79L80C_z<4CD^ zfI;%wK6*-f=pC-(g-nK|j=mppG=?XC|CSTX_X(zo5p(&F87o^tr z9?2)rD19-q?V1mm3%@)Ksv5%;9Ag$^m_dKA7Fna(JET`I5v((~5v)b52P@x^V2u+I z;12HvxQ;$d({BZrQKIK8eOE9=eg?Pczk&k!BCY2zk3}rN#66z3f(qph*T;Ae;5fm_32#8&VW5Z_DWZjif-x5zCr=eMcl9{`-9>GD2Q?oaJ}>;w=qVZ)>>5-{ha@ zC)IHMcf={5(&)lhg-58CS>Z0m^@zIs;_yKL*=f}RVTnhAt9^(L80hAo19jc~p+^+7 zg8`@6lwrath(FM+v2>NRYR{Ye%`#rtqAGQjaxxcZ8#Y@_{ZRoV0mQotV5n6@E2k~%3N36at+NEB6-iZpQsd%&@c zA5A4Tuz*j%h6Rru8x|m8Sz^Hl;6tJQ&z#FqWkoT zMK-PSux61%52o=};bEPJ4IUoy@DZt?IbKWPfebnC6t{hn9-@}T2Yu_~Sl zGS`A;(5nc_7S3xI4+ZI)kPtM>f{*(rM}FtPJ8DRlR@G}9dYyph>Z9JP2VFsL?zKCu zDyTtN_S)_8v47OBl|St_n|^2OMb&Tjf>smk3khDIvfC>O3%k1#=<|Tx>kS#<)kHgK zXjWC=*OG0dpELW%Wb8=5OE#92@hTEq^Lvj*RhcgoV`foZtZvN4!3NHxs#B^^M5P>9 z#6Ic;$!!E-EuFg8jjdt}>NO(^_{eLkgxg9tthcQM)l3P5vl+EEYKIxMb2NuOg3i=~ zV?W*`vu(6lFaE{aZ}mG>e_NJeexjyJ+@KC+DaXSt9#$Nhp^QVbbjhJtc(}~N9L@9U zjzjO$ilE#7r(*=ojSoOn4?$!Z7 z;WTsKk=&3Rg9MWTqKiRx`z2eXhyHnb=qBD$(nntT@ZiJ1n(dZyi&;I%$qF{UC!H*ZrjZjn!nbMU#8yrqi8@^Z z7ANbLa`yv3Ot{OtLrS@&0qJgTK!&?GAk)q21C%6d3}|Yc!W&3B(JFM-5bOg~yMk1$ zgJ%Pt9!joCs2OqPBd&bJm5;dciVGAn>4qeHT@mhpkduXk3~Aa0QVb>|>$in8Y$GW< z(s|e;cI4cq+w=y+aADG0O0+EJXju0z(*J;Z*ls316FrtPj(j(ijG#i)trbON%6yG8 z6E^EUU=Cs+W&~nJ&00h|hn*h>F@B!_d6EcHqPNxNG01h)Y!c)dKt8(wXIWW>;Zp|t)R=_w{k$&(nS<|sy#QGvY!8-p}wg9Yy*v>)mJ{n9+<-P@KEO7OK70uz15(}q literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/build/classes/processing/app/helpers/ProcessUtils.class b/tools/src/maple_loader/build/classes/processing/app/helpers/ProcessUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..27eca62622c61bc21ae557714ca4fa2d4c1eb22b GIT binary patch literal 1399 zcmah}Sy$6Q7`@XLQbO2@A}XTd)|Mr1C|W=TH?$PBD#zs|q@zUJBqpiLyT8ImUwqXU z+>ZPJe~HJR;5jZgC15~3=A6vTcjucs_gj+BKRzr2ID)Gxx-g_-7$Yil91Mp;3J#}n zB#omgnlP&1n2Hu04~MZdPNZ?N6$Olk_Jo2-1*Zg>$1U3mCIyn&+)aVhv{R7+9YxEQ zrFv~ade@DGDv?alF^%d?!?Qv=0#m`F^CTYS6zNcsy3f#h~aIPY8?ejDTV~wVGj91iJrnHr%gOLdgON zcR^s=pJY>Yt6GsBIg`?U97foXP^UC~)^LgUtdH=SyBg)_de`w7c_jW%WRiq!<-jl> zlDv^E1^oi*xu>Rd1Iw{}1*d73ow{er^H!MRu6VjeLU|f8=vHt>!xW|!oYim+=QV7_ zHi6EKDP*Pw82{Y?4Hs}xp!c^!L>%QHWS!A)371*^>01}(XG)~Aor>e%qmUrTHOw;8oku}GFUSD$z#b&AmmXn=E66?~`-!w6+5R1hf&=0k Rugelj(J99_&vgQWzW|+SRY?E< literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/dist/README.TXT b/tools/src/maple_loader/dist/README.TXT new file mode 100644 index 0000000..795e0cf --- /dev/null +++ b/tools/src/maple_loader/dist/README.TXT @@ -0,0 +1,32 @@ +======================== +BUILD OUTPUT DESCRIPTION +======================== + +When you build an Java application project that has a main class, the IDE +automatically copies all of the JAR +files on the projects classpath to your projects dist/lib folder. The IDE +also adds each of the JAR files to the Class-Path element in the application +JAR files manifest file (MANIFEST.MF). + +To run the project from the command line, go to the dist folder and +type the following: + +java -jar "maple_loader.jar" + +To distribute this project, zip up the dist folder (including the lib folder) +and distribute the ZIP file. + +Notes: + +* If two JAR files on the project classpath have the same name, only the first +JAR file is copied to the lib folder. +* Only JAR files are copied to the lib folder. +If the classpath contains other types of files or folders, these files (folders) +are not copied. +* If a library on the projects classpath also has a Class-Path element +specified in the manifest,the content of the Class-Path element has to be on +the projects runtime path. +* To set a main class in a standard Java project, right-click the project node +in the Projects window and choose Properties. Then click Run and enter the +class name in the Main Class field. Alternatively, you can manually type the +class name in the manifest Main-Class element. diff --git a/tools/src/maple_loader/dist/lib/jssc.jar b/tools/src/maple_loader/dist/lib/jssc.jar new file mode 100644 index 0000000000000000000000000000000000000000..eb74f154a01c8c16712233cca36b65120ea47986 GIT binary patch literal 152418 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 @v>QJza{i z9+?V`_nojqxJp>3y-v8&YTelt zhE&r2BXt@UMxMnbZqC_j5#~H48{9O30Qw?gOwPvL?bDHQ>5Mi5S17P4t{MshaIpj0v6B5&f;p zqzz`NNbbitZ>d5DLH2BCfHa= zvqtjtn7zP0B_CH_3*JF@1Qn)?KP<2CD>Bm;o&O*%h=8SzdHHXGC|qU!@XjBWUb` zG2G>^!d_vjfPMs0WgdH6# zE_cT^n&OS@Mq65A*EN3hg;U|w>#?bucyok-U^wt*?LVGkCYYE+Uk@ej(wZvCbl`)% zxis#EBQV1vh=A55c*ZDyb^_OITI@PvufO$8u1sq-Qf$f2rXdUML}7kgW8DHLeh_a2 z6d@s?;nXvQPOOooxqubwoQT7C^PC`mMb`cNR))bCIU6L$)t@WJHU96GKT2aZ)&rdJ z=+TA_y}Aw$vdcHLQ2V@tr-8o`@6qs=-`ORN#6-IKIJ+yk$ULEWFRpw+J6;M|8o2@6 zoZN}!fxsh?Wf4)>k!5@0s@MqCDY*gNcp$X5Ai1?UF$yjbounMGYn@@W8 zz^*5VD<(aiZF~DR0SY!Rdua5x@tDMuky-yPF@D=<$CIB9DKra2VFEUrnAMLlV}@H{ z!LSS#SRNW65PH6{TRDcl7BX4@a+hKvJcD%d8$|T|bS?9+k#A7-pKmN{j~}8hslwZs z{xqInogpmQNXxu{cN1#MFjpaF|MzL?3zbHA{f2XX;NY8yuPIU(7r^p%i1Kh0KM0sB zEa-m8pUZS1bVh6`aYq>0ehTAIB^=IxZdz+H;14u+C3-X+1zgdrf8f(Pud6=AV80{apIoUvA%YBYK;bX}B4Av;y`1*Tgc1TYH3P<|F2t+2pZU+L$NGSu zPe5*#5JKG^y5`2oqbLS?G_t&3>pb!?_)9;HG772mpuENJnxg6H5!5#nJH|?poqzge zz;_30g!;#{#36k1>|0FL9$IZOztS?zm?B7?kfFT7dJ7l3#+~U1DH{)jQ}FJ>_JTAt zKha8w`cWjR)Lj=0eV4r3a(B|psGymc`Plbn zVDDj>=iCsXbScDq5E?E!XbnUOS_=Jq5j+Nm`o3)C$X80iIrnf3iFF#9oTH~1uTkdb zXdHE`gOC)w$n54rQlgN?isi`)9?$oL8W$nyrV8%ePZQzveG~NE$9Pfe8(CJL0j%^X z$yK^2YBF|&vm;brTgrZF0?=;X@F7L~XWfWMg`wl%`my~D=to2`9{@?QSq9yxQ?lGI2pxn902oNUD+?U3wp-u__N2Yi8ZRa90bZRM4rK=e< z-XZV!@8a7y4>NQf%r|hc-I=QWLXD+4&8wR&L2R z5^Hr7m89IV3-x+2)d3k9dk<#PMD$CXZg~nBa!;C+;i#G1UdSo*?!Dm{02X#@_t;B%faeWBweS0MnT*zj0r9ZkcJzxpE-rxW@nM_qJ0@UD$&Xw>RQ-M-o^} z?Zrh&%N@bQP4%-hi#mPKf7eA*RTqjF_%=Jdzj)is#`ny{>0D zTU`Z3a4xL+!e+v~ccb$=-m-iu#m#VJmkLUopuAZzj7v62X}q&m zcO|+m+cpJAW?Q#6EcqCiKw`~;adBlmTX;9#apqee#?Jw-t-8{djdg@X&XIL$OCMo$ zgrv_EbUfyGMa}_pKpLIT+~q8*cf@!2L4qD+huS`yo?xz+7q^BwyM+x8la0cbbYq_v zD7zjM8xBuBhhs87VTY``uiJh#%b(>9O%lKGpzbMQKw-8aC=xR-qWTs&+5geas*vZ2eCdYNoXc?XWg`rdas zZLSSFIpq-$8{TQ^f3%O?u{pns!uZqeGyR!#m_7tRpr@``=1k_z9KOtf?4U5q$wUKiXa15=5Oj#FiP0}hkU)*97^3A2HX$krOv2NjZqy*ZhGs;)cNcaGpJ ztL$X2UAPgS=M0*?2|1p?$$bw9*2TUu;+{5bHs5=G<|ZNpw$!7LhiGTN6ZQA7g3!-} z25&B||3%C5ZW|Wvd$9SkB|8{c~hGmo*1ZkD)oc9u1dGKL4xyUttfE`d)hAgp=&xvcUlg4M>1^X->gJLYAj5hU z7AT}e=W{rVeuN0}hMj&ha7Ye-XPsjB=v_=Jr&w%vj-p$K$CF*T+t3dA5Z)r)$?Hdj zdH-j6`mVb7#>j^TBDz2vUG&uLl2^^l_x+q-cR2Q0+~}Rmg>bM5xv)f_e_!vu5tXzq z8swX;?kZ@1>l*cTC@VM4zPK6RmOyfz6|R9|T>{|#N_-@n)e!4A!?n>ML-fp|_CybY zikb2hE>5+xL(N_?a_QYzC9X}>&~!|yC8XT?ZhQN7jy<0(aiiv}(#1r~<*XvsfFhFI z1E8J<%zbjoehC+a-FZw+*Cm0yfe<@uq4z|Y5)-L}I$@5=XuYRtoBdJ6<#t61``G4KM zG5q?4iW*}IS!|1{5~L~ktx=ncm8SVap8vj;;WgjDyaTEaxD;&dcDeT5 zYI~l}@hb8HxGpbg(WmJlpv@qH*ybz2glM_ukuA(+*N)dn-FZ^syCAmd{$=Y2tIz-R z+xN202+UwzNji#5s-%awGxJCOAWRfi%&=viS?nIjweA6{dr%lY`X1zd3~?yqHLWY& zb8N}NiO0>adlZzxbeKD`Y5^U34EY@NiDOjJ0oIBTU=JY(bT{$g2lnOnZXDlV7nnP5tw^lxuK-V63ha1^ zxS?NriE&Z@CA<|p0q7EtXxcIX5tTq*BDUCZ`=~!AtKiR<1W!yz`_xk==}ssxjDZF0 z4zatd6zmdnia?cK{Xo`0SH))38}r^@(g6~C93>yuFq@EC2(5~Dv|#G2`bdrtzsS1? zcOVuaIKj@q9s^-iv)IUUt@qaCPJJWCxQ_po=RuG92k)UYezi33>XCHvoo*{9_aEn@rv8(;_U6YbT$Xcj^qIazqP!Bw zo&O+OC&XJUQUkc7uciwd4%aMXk{w3=oqW&(;R1a!{s`S09lrNc?T&s<-`}rY{~I3x zkE0-USNdR3>OJBc^d)Ntf8bU1>B?XEb5bhY^5-N^hq6T|TjG;6+8_1-JDZ01t;2S_ zlt%!q&!|eA`Pi5eEAUE}@`&(JGn=igi_eAi_SZHdUu8aMV<-;P1}T<~W&(mhjC7 zZU|rNQy+oN;hxAlJ5P(T`+`5HB!j~Lt$z}nI6<+8ODyJv1nZaFQKV>59zFVshhZ#_ zJ+1^2{sg;BeC*2C%s9IiErduu@Xz?vpLIX!pp={)(7x<~^G+`R;6|mO^u|PN!il;Y zzfGIU)(haU3NQCfrpbH2gZO&cpBYs^p;6kNc%T^ATS&@hPSqC^VlG`IPkcyUrMp-w zn==cji{g#{^3kg?U&)Bjjp7ntK`>>_LEn54x7(xAAUL;4ofQ;=2et56_YfTk1cHu+PdDl zdQ^JLwJ;>#xwN~X4Z7@JCpJ5KatHD&8`f3Q?%fMQjE(bY^8ah6?A&VDavAW}^^=iz zu#$A6E)y5+dMscBxK>0UdQca#d$zn5YQ`5f7YwZ}E}q%nHoEFDt>~|*ZQS)fHq9>1 z>ut?nSlikei#RZ&Uw#QLN;HEvv@%fpk1wQ&Mkis;;iiezf=M{)?GPK9wI+my>6*6& zTOAG^Ol7^^T?J+FUdt;S8tThm`H2=(!>Zcq#}AGSTw+k$zT}u1g-ZomO4|AjZ1}`o zik9Nc=jub7)$->#xg~LDyq4x@Sr@*Y3y*|~ZseG@=kQK>_pbeBxx%w(w=gZh(X+!v z0q#xd2|j&lqE*bRt%Tc^C60xMn0Db=EW5BwQ{^M|)@Tn8m{fyNjEi<-NIgFlz+n#F z+%~UO2W`H1r8~!9b9D`zCq%;H)}q#>-pcyH!{QRBZQ0;Saa8SmY{S%o+DhkiRoGk4 zSDZAn7KMyhZO(LSp{5UrqiS|uS$k=9vA=bGHBL&n?e^eXsGo@7QTgBSxrO$!yW#fC z{KZDbUk>y@WCvjD~qeAuMdf4NF@=ALeCFVD`{wvj{`T5-{ z4^w2tUE71-{cAO75V#xEbAdPn92V@If|vJPNhmC}mA}%1i3f{pgvB+JqZjX&(F4dE z2kuWE^zyQF*uCXfzN5L~uDke}l zHVW8$g4w}AuXrZ|2}@+oPPX|qg`hzMa(5{`dZ*CAb8>fSJu0W@K>}1Ji01rc*8a)@ zvVNs$m40k-IOA`7lrhhOe2$DTE@0Q2Uf7c){YtaU#?+VJc1?!kehdpMerFuvgEywW zK{xK)k3kLVS40b&AO5yaaEEA2&7**QZDk23mbm}BAmaXaIvb}5_VDX(<}OIF8h-2z znbyGiMa7d?vd3U2!Zhz7h41evaxuj>ox*94s_uK_rDLT2CX``3@`QV(LXq#;C0rIl z8PxUZ3n>rD)~I6HCCSV}ZDNJ-3n_as6jz0S>(APja?9%W z;_zaVr`YlWEMuL=2z{5ha!b1py|OI=lzi=*2dDROsbBRU!$ZlyEG)n{Q6$GOQAriY zQ@=oM!ES4oD$n@5Cz9fnGCWFhgixsyrGErzI8&)KZV*lS^u%HVw7}49Xd&N}7cS`o zddEH&0!*3Og=VtNMvn!`k)9ZOtP?wKkM9m@GHWkJV$`p}o;cFfrzGPE&j+dRSt!7W%Kz!WSY(B3WV_Q78C>@7c<$E_M59q7uihn$SH&l%W*d ztIPrW=sBNM*M<|@`{?p(2VFL6HkgIf)0DC+{{+|~3VCu|tIWScpc52P9M_sZwOxSW zoD#n)DYe=kyqvEr)bg^hS?Kd*>s2Tm;BGOfP~9bzd{1bsMB|*(TjR*u7%=nk?M}hI zKP0+fH&pnA5_>vLx>~=3bZkvnz+21`**CRDJ|&I#Wj?i5GI2~!E0&j`w_lvmMJz(K zu~@$uLB!;`7-}?*9Fq5;w9_$h+V4)~WUO!XLMfe+rMKVdQN;VBwK+IbEH6jT>Kr`X z{5!`oXo!ITEsZjBW1Y%Yp1sArvW|0Z6HLL_p|EYJhn`-6z2z0v*rl*-$)SDy>>E_O zOJdy>wDr~it1=-)tO0o;N zzwpl&6dgHDZHYvA%>NMb7NPL&b6EvP&3@DD!_(SJhy56(!d2H}oZp9LjJu}G z-CGnp<)-Nz#~Efd-t@4mRwf0uCZSd)W+wH#wn3`o_XqR`PA@5mhA*mGH&T%?3sjHc z!)718iA09niIEFiq0uXmuW{QkYl3=4LD11pbG|B=7ezEOJ-Brt>;(upWMdH1s`k4- z^tdAh1P8Ec5g{wQfNNr zd~#c>pU>#ViXwP@O)USh9bPiZ6TP_j=;l=qplbkjOukKIYyvhVaE z)PCp8{?U6Hsc$^t6g-Zu!}E-6KzN9J;`|46o+}WHQW21AX^K=~m+0+2);FeAyOFbI zy!T!Rc%q>6ef@DZWK;s^`X;&?_;py6!$o`h z$`RB%PV}&qAkEsVV^K)vCxBKKP3bkv9J>P&`j3WW*M$*I4)|^V;LGFfcg&?4A?Z>3 zp3z602o)K?RvXU2@Rl8cEtTSM*F`3)xjW7T3Q1sCk8BFCkCvy7aAY0*`^5-inALNi zY7%zAu&$BFoG56E;#g6cQZH;9XJ4V6YWnH2RoO<%zQQ|oIIriHIZ@rF!>$>AwEnk^ z)24=T>TpG`E0eCO4L#~o&gJs25Fl{fs|QFN>zOA1aHY^Cb2o&NL$$^5%SN$FC%u3r zk}#{wR__xB$$AYV=COA9eohH(6@WZn*4=8EphNmL614+n$7=yx7}x}_0*aq4F(xAT zqu5AlK(_!P5`P4IDE4z~p9qPD<*b8KzM6Um_~%WLE(>1_{D8A|30a~Ge-7xsnGjho z(%k~ucYJ1TEk`}Q@NXM~qhu<}g+F|V}G2I3|ID|phqigAj#_xLU8b39I~O#wCI z0Jcd07_u{0Il-KzA$|b~9b26aX=Ea;m)2V{4_!E$14Sv4*T~+G%68J}=-ZJTe5(Ze z;j@crq$c&}N*fjdzT&lWu893-DmVGta0TS`qC>qQ$l;wjIQk3ofT12bSshw^tNZ$`iv5qf0jkUP zCkNx)<$ejXBJBtlzcf{pzVNyJXdC#qVSHK}O!xKE#F2(|A>m?|=2X+v&WCFXs z|BO2+Cc66clB2Q+6a#v2CO0`hM5wzEE|^d~&}I?R%w|(Htl*V9 zW_v~ixk0hbh=}VqDn?}pL=OJL=4#+Q(KQ>se;x$}cVpN;W7Mjl~ z%Dkr#u)wn=FnDzk?crU8o-q!<>wqJh&(JWJ$LFecIHRz+z(kZi0CA(ekoS|vZQa=& zqt%gOct+ub$sTW*z5?6@Y3`EaE7I}Bh3KpuJ}Gbs>chw@!Rfsj`Z-;g=AMI^;ekAb zvLYK$?~sK(VC#%0SdqC1xaX#b8w=^eHVqP>DLYxD9Ok{xe3w;u{z3n`SkKIj?d+&a z*!{pd&c(mo_R2!jOunEMO{=!mTEf$ugR(7G!3JmU0qmqVl5lT}&6~O;e9zU$tNsL? zn1UMoD@Kr}tjF$g9Rg8(<$wmgWk5>h@1;f=^jX@(Cubi}NW-QZvdUm+<#iE5AgdT1 z^|mCuT9uA|y&F+^HkI8QZHyVX5YC+94acDO5-#gWR{jr>tEXlQu>*Zf1Uy_B-te&b zD*HOuoaz3D7T~AR;r*8pKGtw1r94wDY+FqAp2$~Vpg_OPn@cs#4&9AN3B^Q>ri6Y` zGHqckuRV;$<*_uft)9lblvHho@q8=pR~cGfg~Fzqsz+`4L7)K~vtV#SEjI5m-h3%np61kHK zbn0abJO=;#=81H}x#QOx9*Ey*J_EZ6uLWKP!4BRGMjAK*J_D8ud!aYH>hDGMOJ4d& z6nm?Z?P^{A@j`M-o?7v_!GLwC=uJI(+CX|vy8l`JPiDwN1f$6r9)GclIgWnF1Hb2+#lE?_7Ke8f9&hbL)DSzH@x7wX7Ib*VC>Y(ek zqPL^$`sN4R^uJqB&izwWtlOxL4-WBJswnXV0Q8#~Vj&&PdiQaG=u@7nJK$%* zvHOAO53X=Gk|!rUVDUy5g1s2MP{b$Sd$2nZUKogjyS>3l9)5uR1xp9}Vk&!pZ9{`F zZ)9U`k$O!=9oh1U`~u$N@ZOSh?%}cD|LrH;lYWN_P3<6rM?RisOiL$%(JLBCxDaB&M2QIpKcPLRTR$tuw z^o@J$&S%BVxRm-MgYLXF@(gXojQpRNf+jS_BUN>58?Vq(&-H<8CN zEuN}Iy3AE@_><~>3Gdwk&8uAwzt0Xuh3f*C1upWG(_F!CQ*^c9F1yso`Eh zt8Oapa7D)N$I7WaiHpojox2Ah`(b?VHL?bfYM?{A1^N+Lap`oG*r+b96!>m z8naTvAanjTv13_(tl*{CtF6PS1A|YjxWt~zunX16|s#{5rp;e$!mM(DM}4zy_BjwZI{ zz+H(r(#@B7XeFt-9+JcXu(K_AP{#XWP-)tRr&#SS{|tc|Av@R;z7s~HnskTx&JT7l zec!YAk#QX==_LVBvn}{gKIUy}CC(^PI8yfQcyc?O)z-t@gq*2G9KBkwF(Y;I>E-xC zi2L0QZ35oja)&SRXA`Ud*gq4Y+D9G8?H#f=f6KFPvo5CPcsg!#;$FW%3QP;bEi`I1 zT$P5w4jJPZBp(>5avv}Q3D?%DJUU!k6vE24%T z@t1^KZ0`>$Ri5>tm{d7|?L7I0%{e)qx5x4KB)A+vSyv0&Va>)i^-dwkKjM}XXT!7| z%i-kOPnE#C{mP_jdyqLvnkGwZo=MCrAh!_k`TxlHG;$>EW;kGAW#V99r2mVI|DQ3o zdPuIiL#h5r=DO0hvg8G=@={RL6cmyBd4sL9b!m1yim{-OfL?w0s04HRItq2~aX<+% z*?g?mZ;lRztOnSpzYIRjYnP`MYlOJX?4#0FNzIMc`TD9)bqe{qJjjdW%(rS?MDe)81VQ>7~ghsbpIew?3T}IQnfO(dyD| zHy#Is_`1tDm#CTGUQw#xEWh~Vivjf>}n-D)y)Rc5aUw$oblMWxV{4#Q- z&Qsa;mT0HPtvCbn?_9WcWX+vVN=Rpua;EI2^Bs~!1!{t*25%wUBL#)@s zgNS(l{o;rr%ij_X5pDtBLRxIaJOkJ1bobWNZu{WN%wb5f&*BM)#L}}LOA7Yg51iIA zqG!j%kx%+P02P%u+$+QxXdfoTv>@F~>LTYrNBg0pAfI?hBPKsLF3`pyQLK2pgs%QB z(cRrymhqxb1&Z0RyliLxOmpvdV0-w1EFEVmU>FXt?=^%XK*Fn4SB$HmtDt;!`~yPt zx3E$|U{W;H7#sjE$qO-TNNvveo9tZrNCWoHse7umd}b|?^^H627P>dY(ZxZ>OI-0i zsc=3;k7|@4TLSs*iN@9MCX#^d@VEPdzc=(F^y^gn+CjNMRP=C#a$fu_Y+p<6qzcMr zTH&V32_DEYzu5nry8lITW|RfMd?$l;hPyL^0Yf< z#;rkDn0uKPR>XGEU?mcfKM5Mr3r|{*J*Y3KzsBh;{UWdwURwrgqi*voACP}KMF!u# zDU!F_mm7QLlyt_%jNiEQUPs@!z+YN@_e7M30cV5fpFR$qpF}7t7%64dLpHjYpnCe3d+nQdD5eyd z3@1a&7d-6)MYh*n=kd}b6oR4WR3(4D0j@L0?5yIGc2_T~uPQH``bXYGGyex_K$X9O zt6A`G=w?0};PuZ;&*0}M-@@>>nLgVDeLiCNQv!a2p5iANzMA1{3H~X`a(nvvu9C?g z6v}DWXV(8deP;b1X5}0e%6U3VInOcq0YUypM7}8XobV*Wk7TKLSWo+HjM+WTa8nK~ z|2d)jDu#bu!0*Y)tml_=GS}D2%E9U@6lUD@!9ZdefZIr*4 z;or>7+}^)uePa9}xPHdI!W1jV%6({LKCKCe!EpLc1>T@&!NnjFHNJSCIdL zF?0F0EV$I^3oC1Td=Ea{+FHA&yrj~#t*X*hxvnG}kUSy9R}z+LYbkZPyxUxz-jMep z$l?vT+zJ3b1#nNWClYpb`TV{V_;5JvDe(k@B)1=Odni#nT_D>ng}psq59TfNY;?J5 zLlOTMcX&eqm(Q<+E9-+>oUSb{$+O`j=-%RXVX3ZGZ^-BFX>=>TEnbHo zH0g4Cysog<-&qs#x*s8BmOp}pU>URJd&sNMgyuj|8`!*j_}-xJtc8}KWkKu<%U z(<_y9*sL`+Tg{ektGC7O+f-t|$5q$bk`ZrlG;V}`fKuFw5(0Hy-cZONko<0cAl&2i z1_5eqZ@kxKt8tV=-v(VlZzvq_yL)`f_F0t+MnVsHu`QYFcDB~dOmH-|*;`uLo7-GX z_ux(AOcC!EFIYx$c{|;TduDQTd&@?-f7$D za%^k_mYU9AS?_d#@vfz3J!G{@;4MDtLo)b~uQ%AUY1$Pl>*r{Gr_b*Vw}LSu;h9y| zJDcvUZE9?5X>z(cni@Nr>g!!i?QPf6t*t}q^7xe=$*r*QQRcZD>ZyaCtMMt}n(d8| z-pYEP%Qw4vq$i0rUEtr@``uR4)Y2xonp>J`?RD)fc9+x9xXA`dZMGVxJwsQ5FSK>o z8=Bj`bnP~`w6)f@wUQ>!J_2V93t|XqYsjZ~XU!f6di|OGR_iEm-_WvYPC7d>xbd`= zpdbe{o*Spe9qDWVgQbk)$lPgA@T@J_>h>viI$ko4!H!xPe0>hxS=ZJg`2rqrrE4^# zrp0dClxYy);Gly*@q~G>fiamHk+W$4(X_K>yW$ON!*l~FLFoS1>xDd5M74WJ%@g3c8A=(a~!sB9nwm&g7X)+Cvf4nzPoqOCq!6)CB&bjv^a%Rq7{D|tpvkh^fJTWq zGzv!0wR^L%snIUsh@~OBk%#R6zy6P3xSxkx8@MdReL`He;$9!_x8V{W_x76M*DBFH zFWe8reL~zT#r-ne>%{#}+|$B6RNPy{=LUQXz`ZDZti~-E+%v=dJKWpDbuI2i;@%|g zf8rV+_d0Pe68AlEpAnbmxcAm3(S0=B&%pgYT+ZXZrbVLrrhI?G!rnXaeMUr9 z+IIzeHTZ2Be4hr_?z?|SgKLf+NCz~y_LcoX4K8c&xCYnm&nMT`K#f@#mC(r`4fglk-_?Y1^syX_v^ zy>jeav8?`wQ_XRzXJqxVTyd)3X)SQ5AITMQTXI0o#kvx*ItBcpJg7QxD=6mlBpk7+ zr0I#LQI})KaDOea3=`Bbhk8{$_G5x91*E|<woW}yOt ziy(>d=nNI764wC|8@{ZbL_O5xA@qsFm8oQMG~aRTwJXq9P*37A0vqw}L%1X9iG0ji zWmZZPQ&V`SSC%I(kh?+Kx0WkD`5cB_sJ2@ew=*5KERv<{u;;|9Qf00+u-ZZG`m$ zOZRe1Z_~f1V(l=MjYXzeSo6 zLZ*H;Eq{WHhgdQ6;{01c;dNMgl#{AY#Y)1Uk;3 zyp(Ati6H?ZmVA#u#F79JQ~r`b#FPLLTOJ}1u_ZvnnEyy1VoZRDHTM#TSQ8);&~_1s zSk!1cL`)j#n@WiewfJeImPYioK z@L*WmA+*Iov}~QJZp;>&K=Zvlx(e>Vem^8-F9QY)_(NjA>wq!-kmRBk9O6OdCWP#31uNj9Z&JMbaV2l-gofAv`^=!x4PNrd~=&A7g^)sVAqQsYwcLMWbE@ zaX;MH)Hj7{mb=EiGS__`|3I;NRb%g};pRM0uwZ%HEhO4U6+A%(e9;M{RjvFu`c3K~s)JK3d61gAO zSr<$A_j;-VWT{?}yz={GY*MG(4Wi1OvB?}|MQqZbm~8zZvFn6s*DKgtHHDJSED_8W zE3leJ%L=8OG{91b>kAEFD#QiWGyq-aP~SXM1S{*rr3uo7o${VGYXJ$rQ-^NEDBVjE zc5Z?IF6)$epk)Ds=+S&~bKC%MGr+OoDJZsJ6k4Xo8*MS4!D2oO#SBg?-_xNR)mOX? zwn(f4#Pre;2(;!@m_>Xk;E7w|Pul418h~+Y93R9HqFg^dh@%cig+$`4$v!q(NI_*W z8N{;Z<3u@8-SqYNXrVe78`j58>lO@}z7aRQ6o*=kN7Bo0l|8=!jn&JCicsOmcrvM8 zPFx*lWk9C%X@JE0%mIrK5{s^p-r7#);XT+}p0nzd`j$*4KHBYC{+UN1IeE%v4>b<#ltc?`zunrf7Y7u|D@FtB=K7w$d1Js^{rq z!=YZJ3ynBmXe)>dZLWfG%TyY!?FQS!^pQBmOaOT zAx@EK@+mPh&yk=7`j=$r`IV!^dusA{YJt3VlXTsUv zX*D}NXXO6XR@w7GU4IV_kGh|gqTEV(&rWNpeC#kj(p6kaym}FrB#6%|hMtluPBdWm z%X<`SY2w9;7-z0H)NzOU>%{j_)Dzzoe{@mZs)S8_ZG6b-nSkavb9P!Spx9&Imeti( zrwY~AsaUCcL>@mWLyRewZ^HW328pimY}oHnVvHdtK`%f;gL;&tyTChJE3K(`sXiyjMWoMksugPcjGCu%!Gd6hMBeh;R^jMdn zI`P2;s4f*ut{e)ZAHH<~?X&!XY;*uEj`E!MuTAmW(cv`yWV@WIF+#KL*FILuOguiPz-^^K&yc+1?t4m3A7m~M6NYK zsMrayuc{(Wri7!gO4=pGCUlYOX?lossuK|PApAp0gZg7gBoU8< zXN-BoH7?6!c6F$~u&Hl?V+0|iEp}7~ohQd87MLD?=_-Z+jE>z|qBrdiC?pMK@!SHQ zi9rQA+AQzM%>xT{nF3Npyvy`!U6<(wn^BGpnqzSTOibsdTVc?&Vweq+snjqregKbc z7(j8X?8m18#Q@W*c|Z0yxm~V6ICp#QbZj305U3^Bw9dRD%I=Z(`_J|SS3<~MfZc}@VJin3QJncRQ z6X1uhjjTM&^sU6s8tSC#AZfAT*Nax-C@mRXt8C_<%s_}HW z?`A1)Opt5MBA3i?U8_BAe?W07-qfBuf1gp9C4E4XzMIt>m8Rc&@Qc5f5#Pt8&NEl0 z%NqsWEbzqw&)?(l@ zU--rV&4K>Q-$U~EkG@bKsN7*`jrc9Kf!?66#~Z?%-hkgyR$fwp2~DjoUqw}=rM$GP zY%Tt)gk0s_U7t8t;MSzgECjbQlahC*p03~N& zO2{F*5^|EOBov_M{~iheY>E#XP#E#fnN3cq5N<+D66<1l>Qqo^v;XPWPp!X@q1~DAkXI+er6dTkZ=s} z{Ni`a{QG5|Pt3oV>Ja4l#qXK<_se4a{JL4lKVV3wvhZEBm>kNlz(^4 zFL7CkXHGuU=+D2S=9GU&Ev_?o``yy?S{N_>T{NfNtU|H>xck>|zuanX)@vQz=h5S6ui{HhF_46wxPwI{)>>GpXV84`AY?PvHdR#`T2K0mfNL_mstO+e`J1qgK7LD^1nWv-~5N< ze`6X;>zcXd|96Jz{=oe2!f#yoKM=I}56%+5-_KAcUPJ8AQA3vJH-24`Xy01|dKvAiS&rB)pRz&43 z%QI+YHFRc_!)dxxX^(q*+3WVOvX}WvK@7C4(8^3q(X`HZ)O;d>FyC5h?=ufX%6@*o z?~jk)k2&Y;v-VnRuf6tKYd_B3*G={rq74Rv3H}2CgJG$G{bd>c_|FCZ-3Ki1Zulhb z>+_cy3%)*oe94_NlV;q1?;ZEw@~@;@Z@K55d&Q)G-kx;7^PZ$T?@7x2$GD__-Fw^Z zgS&N$w{skYc?Ls)G2U=&<=bO)ybXr#7j`v9^)Xc9lMw(6hG|x~#s4}?TUSE&QH*aR z=b!!-8|h)d^+qa}!H~rA;g6Mp&}Ev@P>%pJjE3jBbW+GyjE1_doxJxM4GA42&%V!S zuo+LEZLoOzY!T6~;tW-W7lQpwGZao6eA_MJEpTtf1S~t0*|0VeF3XTwIrx4CnAG2Z z0yG%Tga4ZLaMQ8|-(E7c7;0xe35Utbu=^BzS%d#Mb0*$@KMMKlxF9aWw93J^GrA

mhFsmsX9d$a>MaXRsrgg-tG*VvIe!0O=8-t06q1HrgSsf0k(%OV6)!rre>|J>YUZi~~a*;hrDYB=_qTQ~D_EdR} zJz1G!&yZS-VlF(G0l*}u+ttcf5#Hjdcb==WB)AnoBInu@)v8zvT0ojl*NX`YIE%-)D<8Yr~_*1m#;zAi{6A3 z{?^Fes%e~^O2PdQ(AMU9#fuGTm41AX8+rNEsX(-rvjb`aDGC@s!~c|SraCCxdNE^yya(zMYolRZiJA|{ z$3mGeL=4>_1u+aoiu=rv90zciF;KU@+DA5D^ZNk9O^6+?H%tV@C{S)P*XI3FR5ZA# zChs?c5{+CTtTMqWkB2%-vHpkN{55IqWqjyYzo|T8cr^noQ zL25XtHiM`KuJuAq%6WBit-SHb>&k@h37^BRCIK@*hMGTIZE(qgt2LTETX?#eU(woB zDu4${cl%NjpIoCvGlb@FKHp+|N^JpgDil5u>+Sux4Y# z7^x{r?7cLgV+cX}mbU4M+KLGz?G#Yz{E8y`w2EB&ZRNT40Xmm)$mJK|Tux_P&iPEQ z&U-;;3gtW#T*jB@^@Pi$@;n<{ipukPwS6Vbude#VRB>ILwA1C9V;^7?=C7&RWva+C zOAS(7owUwXo@b8xsr#vh@_DO4$Q|xL!GIkK! zAQdVF+acDMI!Pe0+D;McFH1NEVL_!_1M*a30EPB3$c*WIDztPgL^9Ur=V8#G_iJp1 zARN7aV+pA^e+x400EgT$jucWq2A6?wcj|CrJlYtvD^>$loOXocO$N!O8pZQa>rm}5 z+mKVx<6G2Kt)aMse6c)VREPOucs`~N4$y}}Wx9QmE>>grpjgu?t=W0=Kue~N%sImfERMqpS(7|Syronmqt6n$q@b zi;!0`9xSK-6J7Uq>9o99#kt&j09W4-h?ObV7ydi2y_Fh5w#-T9U_zZP&W|kZ#hI5N zRg#Ii;Z-tGbL=({%!GtsX)3u~^1lBg(GL7X7cB`fZ#QsiVW>!q%7i-fq!)a`CF#6Z zUGlLmfD3t{*Fwrf6xR+5+MDln^MUeeC!h5n>+-1%$|tWu7Z0bl=wmJ+@g<)U3v5^! zN0yLX|2|mOEUG!1e+HK$m!fE&1{I8cDFeyF)j@2;hWS;%krME2;KKR>WP%K-*V@m~DeAg8f&O08S#@nq}*r>32;I=B@ zD`4!Sk`?GSSIIFczRK4FwE8^+RHJ7=?lD9F!RDI(s#TD)kXx28>Dqf z`IW+w%ElbCNsN}(MK!L8!mCNzWyGr){T*_B3&@2T#U$Vw z1PQc%LDDuLoebevs;B;u%aO{hKxK@l@{tR$qHczVLQK8sLuRL622*F7ax=5RX~73( z@5=VQfC~76eKB6<+c74A3QmWLox~eh5sx;h^&T}-SZL?%7lJ`Mv|x--Om>WRz~vVv zp!$J={!wF{vzQsF0=r$#wt}@ot(-(!IUTeUD)ZIF!BFt>Xp+XHx3UD!iYP*sVrED) zy0B|%dl>jBki=tx6FdOh7f!*9TCWz?L3nhJ`H*JQY+ z!Zib~$#6}9Yeo%_G`?jOFUPFbKb4hbaS86-(Tt+2(`*2qY;0U>6bB$Ib`wv9Whj%x zz6g>OfsVa0ioNiaG5CtGz7-|*z~m^N%o0tafQjT+H&YUL%@l*+K{Eu;sU%-sdHMXB z%dc5@1^8ruFJCqO8K2 z1ugarX$=HO=KeccIo{jQZ2Ny}Bj2IcFXFCEaQ`c+qbdk?yCSLq`9nPFe;1L!W^^oM z4EVtxOz+Si=yj`$I2uxd{!SOMkBb;o+pgr1L(K=0peTV7|RcYdjrWDGF5M5PClIkq8#Kl3Ek2UxRd+{dP) zkKOie(4YO!K-O%U{6*D%leEW(4O?DQwKoQwfQ%?1J(i{CUxdZRwrHeYYZiKB*6Q39 zKu34;lcTA-!rlDu)Lk*RXCdufZcxP$%5^3vXtFZF3t zNDEM*^Wi@i{5~S(mpMka$>K8w6C8bD#FnugEs=vfP%Ty*WTvg zp5Pge=B3^X{>3ZWv#4IvQJ>(N$g_s`f$?hP0geS!n1yvn7Roc8&?bQ}2YKq9gRnUp zSiREghvD@^ct|N*i#(GOo6!g7XtGb~f=rG;m+9axQ|TKF=k@R!UOlBZOF)#?=v`#b zf@dvec;Dm43(w)EnXJq8%h_7=76^E z1#V9Jl5vFMV{yoYIzk4LLRG!+{;n);r5Gs-f|NpVOq0-}ab|SqpgR>u$cmdzF)-c` zIrXKt^iXOj2Ca>2tRmX4RJ31>Ym(?8ojqjHLk2#S?INRr&kpJ{p~*_sO_r$>lZ8F( zEEag-*o?FfOOc+OypDqKrC+Zr@nYwn#W`8UcBskQ?77sz1$kPZXAK+#3clQqBeVvs zcd>7w8OPTu#lJyf5+(-fsOdo#&zn>&3GntO9nH@SO@g#`(oNMkc7!ect?oGVRds)KEm)h>al2=Eu!AjKHBN9p-KAYwVjT4pzS|YIS-u(sRn6jJ zxkmm@{#G%fA}Uex#z3Lj&AaysjVQA2Gx7*kk;n&%P#{SD+B;mz7NJ}UA$_4zikjEUMx9KTwZwkd7B z{4=^p8T?K~LYBN$+Vv<(7G+*Pd%t{G)*$M)XpaNDuo{p>X=TD^c=eY;CHTDA(Ne=n z#VS>rPN6Ly_hVe()5}*2@n3;G5&h5?1~xD<0rd>hWMf62;jZR@;GPF>ge80BW?5C| zac-qGCXknWNL~Yp-=GVvspx~*%E#Ee!;Nig#Jkf1Y3sxI|B>@=tR?IZSSqXxzIPTv zMwGQZtW_@pJ!YFCNjVqbQ*AaGOzo|-No>l%_1bzS(?pQz4>(+dWK8?93iSX6ZKa3{cMx%qN34n;YLbc$HS#D^Yc6%sL^OwMz#!jHwHl^(kAs zh(}@7_=u_yWBB3wm1Ub&zVqQyaQIglrDnsdc!*DC#o#02#L2Q)!M)l@Jb#Z&+0Y1O zQE0j487f0ED&Y*)oue1t$L-}TKuv}MV=gtXm14C7VTs%Rf+2`aJ=6l}Zo7{;w>cE% zuq;^85lEm0jNcriwA~=J8HC3vZg+1ovO+;$et(3n{=oGQ6|*C~yx#eZtmVkq?}qkK z8bwv|98u3e2JN1D!Tq`s=RyScKck3I6oRx1BdiR;b3-(Bm#%`~^~Pw*jT4KF2I$sI z#OJI!z%pCOT8zFP#CSFI(V;$FET*ulw>2|CK$;r`Fdm*2_8!D9xO1_5PuvW@;N($? z>H$zLu_bxF9S3xF0lQZ=s`HBfNJvl6+ub}dCs@K+gvJYUsD(cmrjyV&qYBtK@6pK>Be-D;-$ynq1ZQ}Y+pH3k6dn6 z^S7Z{4YrE{NGePjOlEaF#ixMnf`3!}`gleDw>v3{FW5Hh{3UBQNx^s9c)OveVMnR2 zJ!}gL)+n%58!S|z>1gY*x}ZK{^2J+)t_qJ3FUNv(hY(*ecnb>=tT8LqD8{l_3-O>- zp|O{sCZtuWjmP-c3({ z&Ipb@7r-;g3a;bfY6F#?gq@6QdKe62faw(ZZ`h3FaVF3H*|!=Gq*Z2$b{pugH`is9 zb1dki*;sO-!8a6MiPr=3RwdsIfiK{K%r?L~USSb#A%u1XGSVJTZabF-{j&4{=|F=| zYHf4AQ=4OtV7kH8`BbiMl;)}2kT8bbYb z#R$QQl_s5gVOK)I-kpv0s4Y+>HmM<2YKj%RVvQwFfev^v_Ia#wG?thW@Y$RRX>42` zYZ&`{#UxkYA(=N5HHq;n4nS`#M?-DVs9g?CFCw~xDImRK>aWnP59>*7fqMG1`>FL* zc9_=_jp@tZpjjOXMHc_Y+kt#YeXl#yM;nbOCNN`es?8!j(Z})=S(&IGKc_q6aV3qr zV5UMdj%9^tBq8ky46idCdxz1b-E>qI>^~{dM2F2t$v*`OZP4!ydyhqB570&*pN#!k zXLL2qyFyz}f~KlI`7~cMG2sSj-}vy3^S*W+=WEg>XLZBk1T1uW;*U`I=e3ZQS~m0gO+b6-)isFm&Vtik@QVhNID~ ze~v|i6g(B!lRWFin2}U4@AH-TA?hoy*kg$>I$52G5w52*BJ~tOye7G-!4xwMp+glR&TB8jyL?QBcZbRF`jef> za2wE3zl-irN0Dv zqP?7>xMc1Llk>05oyl1={E@D1o_~t2eg~~ky%xeBAM;xUH1d~ZoOP~}{k``_9Hlma zEw95>f#`Moze3ooWN$-)?;5F2xxY)Q&3VPhS&(xUlQYWsWMK&_Uls(GIZGE#XHVDS z)5_YM2E%2S<<#cv&Y5uih}s;r2x?2x$kTM4M}xZRJkT5U8PuTbz-zvS*tAd7`|uud zX-k;DRWAn{s92$acs7Zt%BWOja(Y=64K{p-gAG!Pq4Yeq#?U)C6%j9y8G(zDz?B%$ zoG{M%`S@g;wjE+f@V_AC>ac5F3%e%M^U{4Rrd-;>uIR()6&k`Fd(lIK7vt%e71L|m zrK=qNgVUrxtEc<)m?8=KPsIHUnwL|?nZgECa4e-4j-_;0a;ScA4K2>+-C!_uG!~uG zuC0^}i8Mv-$0%N6!_DLE)6}6pUc2z}cSzOtpMulT4yV=*XDZ;-l^|ZBzUl338h~l& zbFq5G?mEpN^aY?8s`oI?+wHReTUK>8&ZzE7)HRKx-HsNeU#zY(dr!3$1?_lUGBnaw zxXVJkUZ_~9AApOcta@Q)Jr*{~PIE%65Z}e{La8;zMW`aI9a+YQk}Ph}Ny@TGTzO_mMiKyK=Ls zT`QXv1MR5P;@RX(lQYsParj-iez#}+?0()Gjq=UA1No-RAH^7XVuPHa3~$2sE0D2) zUuiql_h~+w+Ve~tG_gWsPVTrd_hF4$T7zM``qNy#m>C=K9%Ymb2wF#q{iG8C@nU(D zjoxKDk13O_a)NdM;<`~**~~M)0GYKaHLaEDl)4*9gCSw7{VX_kX=2oBX=#X|n#aW; zjU-Q_c$pFlwb0wAOtMOq6itr;jPe#wy>lP*Xp$)E^?&m?juX&*HIBrQPjvY>6LvCKy_w3dAzh%D)-{j3!u&OnfMhqoC5YEBmp~m1lij*=U5UD}g2&Vx zW?dxAxd`)~4%1!_r?=C?%l;nOo~JzmdN_^g;Vjo|lR>;ve;lvqzJ?UPxIf;7E^Sj*t;G> zUvdEFHQJSRPP?*tvLf4@_;9eSg8N$>;KcG~>gAmjS>8+M27|Y;I)>qo{BfDDXgh70 zhqmcuo(~m=^{19s1gT6437(A>m?9Zk@1YPR4H<|~Xa7xX?lok;T6H;|gL5NlUkE$Y zReGZK%4sB9UWWaZeP}YkPnuiNPo`Ds|JY;Z{taKDfBWp0aKDG$<;->BKxK@{HRMt; z0h*vI<5KZ_n#cv=eIe7ZVjRtLtT7pUH1+^DSvtgP1mWDS?a}d}qAdjO#v-JJ&s)|S zd_#~o-X5~DS$iZ=J1>KEns z%|jFUDug+Y!%Po@S%@%i0SxG7Nw{u4&UAB{uA38bBHQ7X2SFXLnE};f5IlzfRZR>& z7}XtoV&NKQ)Nt7YNR$^Y33@BGIZ6 zo1QP#5V2Tq5lW_SIqy)`fP+GFEp)dbgKAhBz{O+PH(=QC zBhc{Qip`UJRw_p2*gX2+Fs{?A7|?TppEF2mp>_z@pB}*RHyrqonupKo6|gTz+C^WY zn3Wl}p)(TZSkmg{E&BYSH>DKZnK$v>;qnX{1f9Rgz2wm*`5`k0fqZqIfVhF>eR!?* zO)<^?SM!8^UPq~tW%Zht4wq-*2#gtAxyiHM8Ove?!96Q_L{k#;VnElF#X4^E~M75h8^=V8Zi=Yh-v&O}WGo7B`#yhLj1>+DjSXE+Cg zjW0}@2gGlbe;JfKgVdA&Ry)stO|I}q}ne{OM3ahNZSzH$5OFU2B!XQiGy4uy!Z`KnG ze!cb$u1E3@r*(;G_5R7Ih)SUitS}C4%|*j8J3*dfwmV_43o#$K!JMIcIkt_>2`S*F5k7t_nPGgaGEGnnPCAHG~SpxbiCaxc&%up9AlMi zR4U31R;`6b#}I=&!z52K``6$s5a_`qv-U+=K>I|wFM-w{jj?I(V$48pR;2GP_RPBc`PVyxCAWvoe%E!$9=VwoEQ>Zg!pAM_3g<%zGmVSOZx^9p6Ih zR!~jgUA}QOjp|oH+ub=%$+r#7Pk8teZ{kR$5E|xxvgLeim_2Hv9i$T$)r~D7#{?}D z{4KU+j5DD{7FsHz98<+a$33Fen`2SY-YerQt|3!JE3MZ@_{w4OILnmkEbX|DnlWnd zc+rfl6?HgE&apsadk;xec`9fB7RX6f#@U9BOL%x2R%#B^%3?r)P5rA{11>+6^Gz%- zFo3koG~NU}4U-Ek$nW=1SI6tB)B!vmmaDy47Ijq{BOyFN6Sw0mN{(q@U1pW=Z;=E)-xAPX6blP$j!E z?9LTfFzr)c#W1sDuxJJ`nH+ZKX4ivp*E{Q!oK&f@&%kwZPU^DWKx26x64;{l0wmfp zw5gxL|6-IE^ml9^GipH0##Q?ewbWb!Hl(@Kxz9V(A|F&6aDhk;$abo8E6Mbr`ZXlc z*c{ePW$68Kd`~jdKJ+Q&_)#xd-K&(IN;Y)Ia6#JzQpRP@{?P4zw3}uFdj(Gdm|0;I zy>|XyEt)X)0=HjX>q;=PFRz(RnmBF@F1P~d{?gFA(j;Y^30V0xfb;%Ni!#LwotIx} z-T%$hUs2Fu6hZNkPlCORV8!i7^(O=h&hONuRk9BYf5h(yM~ZhVFVT|pAH6B@TEAkS zyfvrX)JLYo^10aNMr8gj=2dhlYrz)g+)*=^HNIy~X?*GQVMgE?YCOa=028n5#pky2R0&M_@ zcb&*{)?%`r6?i|WUWqG=YoX|iq>Kv%_cI0teU7W;9#Q=KYDCwPC%B)58+W}p&pXPf z#rv||^@1A*D&*@e75xCfxqskBK(-FtIGU6b@?LnFjDZ8EEO{wcb67kN^$rFUSC>$W&oT`hp6VZi2-a(E zeXV5@wDs93O1`DSD5)bI##yCc62TNyWE&k&idPMxIWw;aGEN5>Y*Eup6pN4Ij##c* zei>f2sLvhe-uQCw3^O!dusnI<^^TEqzI2RwWU!+^yvi}jxe9F!0AFsU2JRY?$Lfa` z>!E!ZXTiBlfVdGw@C^FYE$Top3|a-;Q|^aSl;Afm)lyZIJlYbB3Up?=0yElMA-%-N z!Yb`8a5Z-?y#U1hEPYa@3S#vlsXzfj5>(M!C*i?<|Kn zhh$vuk0;*`ERLb?#6kk_VPG>HE!)-X3o`lwK>{&C(w1ZF!`v!zn2>M>CR9tqQ=@r3 zcxHomXh{^h^5IEChua13b9g^7QBHge1eE0etc}zD0Rm#+awNk>?dYItLzJ~pO7UXC znI~rB%B$=^2;Y?fhR;FxNVNVpaJ|1=tJPFw86D%n4~Whe0o!mK==|@;dH$#HJtAtt z`a7t8elifC8r0?%`}E=%puYTfvG&K?-&`9wxPol9vKmat+l=+9quWBqw3F;Y%ohvnFq3kyeAX5mp%; z_lxI4h~M8aTI}a71T7vV%!3X*Z+07YldnlzPYq#+F+bLbpz|>P2ZK>#i(Qh`G z5?6Dcm>yiLQH@Cee#3E^is3ly49A-s2lO8*p+7V(Y3Mln!)uWb)01GSh!1TE06JS3 zp!TEpKBGL7EG+n+H^7}pYN{hnn70gWz1dN66*&H^iXPJ5RA}0z2L~RK4@3SJ53`CA zXDKr+u4|_{?}e@vvh_N*CnuI)%vkCLklK9C^xU>^rq5>(hYm4b{Q0P=*|;>t^?>n4 z!F^c_k7WT!44P-bJv@pwOu)6W9Pi)=yce)6&+B*(w&{4Gn7B&t156kb1*Th4hdWY* zc`vo$$~{~c-Lz+22}k-9wFvJVdm|3PRCC2henO>PY@QxXIE;vg?mVhAuT0`NQr_<|02 zq%{a=jsP6M0B7oeU&33E4{3i~sQ}SuS4quw^b_W-ize@}Mg4$Flqv$O*XMSfi&dNMX*jU1gmnpo$KS&#f-6lFZYmQ^#&M~L*}n)-q4)M5 zg&WrcQK0?D+t2g~4s0thOrW0#p@zczT>?mfp zp24xiVtKf^7#AH}Lt&IE;3C}NCR#B#!-N(49;9Fw=jVge{j7*WvtR^h)QGfA;3R2Q zBe7U6jQ2m*94b+Tp@R~|hL=di65)^E-lpe!c;YE}HW|Y5SW$ZT<3HHSMiz3|$O41? zZxB|VVe)4HNLs*;i%6B;Os)OP&^c4!>Ho5sTHI9LGY~wJn=wrHcWb6NWsCa2G2PLC z!9M}{GWrOfI=Jya4?k&}{L$!p8~tb$QAW!^xfPJK|08tORne?j228j%-M<-?mKvA; zm6JL{{!3fgdXunNHvuBWyLbRsXe=LZ9{~O>mW5}omQulk(LMB>22efD$_0-uq7kW5 zCfbHhOnA81n>bb(4pMmzIzia8p8y@uF|~%l=%rTyI`B|z2v56)t^XZhSe?n@-llm1b!dg z0nBULTrIac-@<)RN}UUV#ZM!=@Z~JrNz%aOEroW?IA4TyKb+M)asJ<00}j~AB_{1D z_N_;Ca48^;H@Yju0_dsaI|hrn)X(`_u`fjAQr1pa?B!v{`PjJu*M_5I{V`TZa5WDW zdjUwoaq2;@#WLY1APS2v4l0E>02<2^3r*6H3!R6-2uTlGQFX2p5ad6FEn(Elt`q%Ahj>SQ?mA%<=DverdozUgdoZ+bp5W{Ob?s`NF1QW! zMilQ&+mHJy1iuXdHh<6~&)rhSAm>hCNXbc!9%hy*yU01I$`z|u{<^M&0{0_tI@dsk zq65tQ`j@9MS$yC}4BDH#??cG_R~?}5R|~NNiM=4F2bGQN_ssp|eadHqnJWCc2nUZw zTfHeCQp4NN7r*5haECA4A%{EiOziAp3>_MaTECx_L2xIsxL`gb;Smtl%wuq!m+6A% z7`7#yp8#Ayqrc;=dQ`E!jSq)G(7LIOIVb>FvyU;nx-G=;$8F3~Aj8XahOx~8!&%6% z(5l!U^;GVT&td)j4{=L?gJJ!B$Gw6Z=l&gc3hs{) zo9Gf3V&Kg~#IJY*IwmKSa^6zEeqbn0kwfyr6so5yF zpTOM!o_HTWux*ZF;~r9TG#jH@{grMkz-1*Ic~fw&k7847u8eyG4^GfvmwJ|HcHAO( z`eKz%WlYb-;IBrH@oUMXf;ko3-{TNO^9;d#jBf4}JPp7XYsQ<~sI?z%)q6cx@%VR- z9wA=I5-fXko0ZNIT6U9+x*)0tjlkL@-Vug~^as{9f*of6a*g?J{rOiFpFu84yj);U zP)3<0f0S`_>gv_)O8;z?@Dx~maA1jo8&||BV=Xjdk=DrLTK5{p&*iKLPys!lBLBt` zC+==%Y4aG@V_JDEk+)ATClCDX3?Q|YiUkrXYo%b~AFX=n0O-+!6w+@|Up+yhW}O0> z7G}tJr|-vK2-zf?RW|jUgTHEV{KRLi6b6x#bLUw;@fXh&waFWG4tJkzw4O~XO z`isa^vCryt?ch9X8Q!DV&#BRyERJ45SA=>!TwIs@qKoSame7Y4-~#qd5_AYXZ=4LZ z7yt592KM_d0&8g@WxC~e!s5ryvR))VUTU;|qn@^K;XRBuwb(a?8~?+sqxH#NT@!hQ zJiUuydy{EuKIQi3aFKyPb6LiR_O`3Z$&9If0n&BQ`n@f>%hI_ThtfAu1xvUNUBnM# z6DoQ@YZ3dnn*SyCK)d332_XDlUT**}WQUu&7}}w0sXC{T|%<7?i=bmY0rv5A!h$nK>JNUF59f=-e_*uMm}55L&=QLe9S|R8$Ojdx)NB&mINo}{ zMcR7~+QYeT8+dmezdK|6MKk{9H6T`B$gqPADK#mv-ojrYXXz2CDayG^8Eyu&glkrJ zoUhTJN{>LdN?QYYMyGnm*kp9uuIBM#fvb6hD75nzEY_)@+2!5deC(M>d$Yl-&)Uq! z)arhvF*UZf&GR=5lSW{Z4a>KPX`8ecJon#by~Of8_gg5R7$ap|UTPt8L7O%JZ&rXQ zQ8^6GJZ;l<@cFERyKuJ~qwqu_#(fW2D*C$d15bDuAwPtZ%!21CWT7OW>mBp~x?s<6 z038+Z&oyvjZUOvJe4!e}yX zWG;rV>S)>?>WJYtlAisK>Ty1SWiqgh+o>TAZ{s$1*>B-4w-*Ci#DLCct^AqaxQ!UI zOIHCKgL5;u6WC}`N2W)N3H4?`QyI|rI3iRS1vMc^mC@+No9_|aIJ7}oBgdU`xcz5Y zpJztpnZ4m4-5H3Hfs`_knP_)vuzJSqWI^snt@@O(;CZt(7z2;O1;{z6F>Ls!E5r5a z&x8y6o6AdCQu8i0v~;&#MEPVm6IKQ_hh@Y;;^ieQsfuU3LeE$jkx^h!IV>Z7mPtSg z&vjByc#tP(dO}7E(n|c{fN>1)I|i6ffbk6Q?-79U4DcNW zIN&6SH8BFD8*l#%pB|fcV{bwle(h;=c3TxiL331T9Dc|0D6zJXp|G&b{kO$W00nxkn zY|>lY8NDi^cgxvq4{JK3w~gp+J)7;}=g#QuBYNY`CcXWg(KC>L*l;%6gRwLJ(1+-K zdp7Cy?~LAHqL+Vm=wV26pILc;CMQ$zdjcW`@y~h19n#O-F1Yc#g9_UKMttjECH^{# z2$ArwI5T)y>xO;jo*13|013({vuC~YcV(1GiSyp*ms+BPd7ndi<~rwAoEB8B*Tcgs zNcGQzpT=B!Qj*~L&p9kulO8Y`#IBf_CAd@0t%()M(m}k>c}f_=dK#w<1)ssu9-F@5R ztmw%C64iKnMy*FbA&7M6MiZ`5GbPaiN&G4w7f9lcEh#dK_lr7+?vp9PkCxPPa7(Fq z=h^9V^JxHQN8B{5LfdrDv8O0gh{CG_aID=VxQBvWR=kATEN`sZX)>OW+2bTrZ5G>% za)xD?RB2VZO8#@C6H%orW!%mqT55vqU!2djM)rJ!G;+*RMz-Mo@uVW!$)W-ioZd6XqDeE91Xg%PyN$Cz4} zxmx7oCMZLJa{T%1n`G?mjOb4r3)x4>byW?xpJ9r($Y_=~D?>d2v8SY2QJF6QpzATk zd4TB^DTv_y<$T;NH^z{Z#gwVWgUXboj6TUpP5@D9%as?A>vpP;Z6f6qtx78NRO6-D z=2*eK@jUE7^UTj33ItrABSr_K3TCW-koJIn1{}RZ@(y`Hh`NLI1@%IY3nIBzN79fO zMDk`r5XrUSNUoKMW&d@DLc1}l>bo1+kjWQdOtFLL{x94pFQS?%z2pU?t~&GeICns= z{N_Wvqj{f+u>d0VWMY&29u0R=$L(C%Vz|1bE&(SX$d$bQ}uv(a2O#|Z8l63|f$5Zt4z ztYR~J2<~gGm>0_O;Z< z9us?3d@I~`>U+UZBa?ers&9J=pVP&mN^-WAZH0lJUP51$&ng; z)Zb15{|X6hV0gZP(zO|ayI&uqXodi-w{Gh6!oLHU{67cLtyt2DZ(K|IH>=CpXdhv! zF*QWJ45?qxai6BFrGn^pKP&XZ37*a#FnXV!9ecndkw?s&^6buigNtZKMV&R;*ew4h zxYhWGX88-w7KR?b|Bb6Jw1Sal9BRjie30P2v>RUqbPR5S4RON2i1GIA@aTW?x1h1t zdHe{<;)MtZcLUm*k1JByM|V5uqdUQU^KZHW$UD60UC~Fa$to}E9WgdPBJ;T5P6x;e z?xO0?Y+Qbm_8yn~7oFAlwx+{Ne*L-j37HqyZg*V@u z{KF9RW>ZBkY40uc#ndOg?FI0O7UH{z@$cLP%YOMBYe!tt0qZ%=zid<`bg*c0*uEcs$gzVQ@jVNcL5+=`v( z(~NbLwcG)3#bJ7Vb*dMg)z=%5mE_wETvhLG&+G%3yl8j(68{sE7wit|epW}y|8rhD zvY6~WJ-NiIfs?wp~J0Fbm(Vgw}_8o-&d1rgvPh)b;&i1M? z2a`WI1uE*rEQ;=MZ$#(NdD~Pj7-8PWfKA$a zwYE9Zg7x{Cnsqws@=J4|t1oyme-2qReM*4Cf7urrNbcgjrOQ9 zOGB;_Jf9s5#pJXr7TOy+*KDkr#>{g}N@{3fJF++gO0)bqTa4h>6I)kIwk~bo zSs72mO=N$0S)YpvPC{)3L9FSkn|2ef-F$f~G%!rR8E*VfZpBX$O>{VceYFzQoth(W zI=c}%)VI62!bq9WC##DO>r)vML$d_091a9lKe0Eo-rSD0n+Tngh^73P>JbmO3nhNy z@=T79XL4A7?fswHWtqjZ42;M!(EoXRz<0WIh}%0_cZ7e(5$Et6BfFdi^&vdrv440K z@pEoj)zlI+{;^5|pSJ}n_|MvMw%Jjo|LVpw&vVb=GtV>dw=>VP_}4Sf(_{ac=XvKZ z$nC2mXP)P4?acFZJ$B}KN@!U3OeP8-h~l%#prVU6lb6vm@rjE~kg8k8(odj0--9vc zbbD%;(RzRLpJ%ov&oGebFlOai&su(l;JITT|AY@ca`Jm%qo{$d^k1 z)2Bb6U*f(x6Jyc86M_uE{Zwqwf!^=~#j{e2Nth?WeZc-=(Y|#h%U@xbT!`szNMHUU zOSl&kCS$^MCik|FAYmjXI9bAeOvu25*H{(@X1U}C_RR<$0l_AAdSgl<&Kb`7ls>?? z4Cfmz6Fk1(f^MlB^FpE(eN$K5k?MfpR%0SY#lHR?%6W$2qJRIMpeyTT>d=+>TSNWE zs_2eE7PRjX#>X(gDG`8EA|s~V-?hv22It_Wh+H@Mk9-%=yTE*WR?G81>z`LQDDEg+ zR6m8)&vhRL$Nod%Pa)u5eiH*o0RaEOzhHx3$KYp_NqPXa)qyKtMw(oi5HsN_nB~a~ z`!|b&u^w>X@7>7sVuoq;Wq$CIu`DX`oD=Ls>MXvu36NajCzbMl3@l>*_DosaeT2S4 z=ly&eNcAv=D>&YIkr*EmHa9*1v;={kKLd*gRCeKN9t>==j-FAz@}@HazoaR`e&BRO zFfzfZkg!1UAUrOg&)Vank0K()AK;b0d?R)I@qFQYFCMJR%y5ytz+b% zc$|FvjKG^vYcK={4SELe$3R?t5m>=SzLiB;WBb8{-dMCcR@UxRD)Q`;L!rcCc@zdq0g2x6oZ2L%Io*C}TzbgA2xu@9pia*BR zKKNoL2Is=E!n@h>5&u(%Xd_x$mEgZ>8?{q?{eO=z9l8)6{P%oIeINheZD&--lrxh_ zZ8J3PLCiudS_BlYH~S}_Aj%k9LV~r^~N&c9euEctgqL`D3^c)H3oVS88a|1zlMuOhcez7BbPgLv(6ws_U4A6>6g=j?uF z(Di0uxZVt;gD8uA5wI;m*h|AU+ErSO~xr4zMVyJ%F-`*7nT}E(|4Kjj%7&0!@0W%tg&;gowiA{O4+1#0-&J zg4UnSrzCcl>3#W2G|XNWz-7$h4f;^~Hho*%xu?iD-5$OruKvl~`;<={Pih%ESbm1o zk~Z8OteF&`j6-UZ%(xmM+ZnG-#kMfTq_0jcJwgEnmSAg*E;YThf0h@$zH#e5R{GV2 z`=Mo@OAT8u@H4!?H|?jnj=q1Qz|g2|9TXZGwM}~ybR}}$bG-c$wlTC#egBf+oQHy^ zZPF&i@;c=Sj^Hpf%5T%& zM(MA<86`2G10rRCTlS-gy9Z62PVC3ON^D_7jI~+*7EgMIwuU?CX3_rKX8iB~_oTri z1f0KzK8VkvohQegY-bn;8g*lr6mIO2^tGI?8rfP-Q?Dt^bhGzU6amNzgmd27b~uLw zao!Y;^QN$U6SAPcak1c@jV+0?e*Vw>r}f);Wv#cNI^|VNFz9n#CT5*=RLV|*?F7ViJ<&6;f+3a z^~PV&5%Di5{OrGwXT%@GD;@E6YcS?u`uU9#CuN#MtJ<;}_mBzJuksd&(G~RMEk;c>J;JygBb2@~>4d4DW-@36| zihE6-Vcp|K@>1p?v5UX^s<3@Bad7iNvvL>2l;RA9P60`)r!xvR4=cB%@^eAT`Lw@y zT}45EeTM(%KR6;Jp}ZjMn2?0K3YI%VRH_-9U!C1#o?wJQy+!uQ@yj_hadMu+I47VS7(|K-1j@dC-a6gSL2S60O z+Ces0ZHpA>52hTPYq?3r!gDk5*yox)wE1nm^1mgM}f59d{4siHUAZ{aHn}?gE z8EW#@!R`0NUfvdVX<(P#R97AnaNY*RGly>KYV)>H5k6gu&p)yKaSp0SmxCVVt*vp# zV7ft>P={I#m5k?k2PSNQYMihQBE|WY-rJ9Io0ArHUy&2%$Q9hlxL@H&!E;v|9aZsA z{8Y#x*KGXNKbh?<=z7RFS@0ym18IjpheQ!A%)`@syyLpc3$W;}hq_L6#=9P}Ocvb# zGlteFu|q|?pQEhgCUxEd9HdR#B(+5e3)V<$uGO7hlWJK&f+TDaxxKmZPy-#xHw8Dv z`Y-2`5~qr`wEEzC3%-AdcIh>86gft&w3D5irRpfIU&J5VRIf>W@MGkpk#x}L>=jwJ z{sB0)M_g7!u_SprsJRFCDXbV~^ycG+ufkm18y~g4%n;l#{(ZQuh?2i^40a}={EciQ zUz>MyR7FmdcM=^flq-Mb7%c9Re;T-v@dgZynXm6rHJowS@HFkS$GHIbxtxq^vlE$n+oJa~+6$~%?R4|-yBMhc$guFL@v0m1#0q20PTZ#H%o^M^*w9EC7o zjb6v~bIl2qKNkYmF8pMSuyZhQD?{y-Vjq9oO2;dNzt06sCcFAc0?qQ~%U5Vi0Ji>m zF%!Vs+JQs-R{#ZHFFr++JgHiRevY09`91rcUxDXZ2pN%UzZ3o4KHPxMioIMYZ9mT@ zu{YXbbxt$w$=0t@YG}h#;+7(3+A;is(ZJ44wBvcEQd6{OCI86}PxOix8))u{olloU z)&b~e#Bx8&;Jiyn@+)zVeFN>~CtZUFoJJvHF}^m29t`v`ve*+C5r;`@ZG>RT&5(bU z&9%Oy>;V2&wMBUvAK95!ub5uMXJ9KTP$yLzGmkj;MPvfp$+i4EJ#$>b6NZ2fqh`C(*dKouOW0&pH!VC7uj*+!nIB7@aWD&^=iIs z3H=|Vn~L&L{{iW0Jp6b+xj0N7(!L^`tdpw&JszrPPGk(5Fh71izFD4QA1{9^Pq$A} zwZ53af@-^*scnYTWO7~xAZFb93RUp;KBR&LplpSpn&Y9xOp?|XRdcd$&%=+$;W|Kd_rZ@O>;nwq6L2}tAkHHx|x8qa2^C6{MGTg05!N>K?fUH1B{P4ZW zD0oI-=v-|nYr#Z8!thF1GR~~bG$~!7bLyRIFaYo}{1x0!7}!UY?t^q=7Tlj0DCWa6 z8FNq25uIdr)RoYdhz>(MbFebbL|+1XA0vcM;cs*=sTx-qCgRy9svoj2==(R}0y$iJ z1~r)s4ZqsQc<$xd^Hv<)DuSQ{s)xAkrau~9FgO)-*%%CAF$~i34Sj@B)DygiB0KTPSL}%bj z5Pt&gMd)AFM)SQW2P?=yU3rp@e+~XEG}Q49{s7SAVqc(+QoMzYEl=C4~Rcxq1i{Mt;X9CiLz~<6Mau4Fi zh5Jl$jau1@Mx$vTJE#y0jOy5FX+P*#CNN;ODJh;y?!#k#!55@8g8G6fc6OH!LPg{8 z(Fu5HEVc{_YZ=IxY9|_UwKxLX7e^~cQ^U$Jse9n{LS#}VR%KA=eI}jwmR=ajK|(lz zRp=753SGX$5FI98>Ffd`Oskwyt>-Vt8t$1L{1i{%Uh){qqxPv0)ZQB z>LR8|O=jmMpnaDsv5Hyl?pg1AJFRj#9={lYSo|Nfou%Y-*%rL&y;e3~%FZI@F_V6# z@eFLr&v%bJ)3_bXg9zi)VNkE+>V+$rbO+*UQ#yTGo!SEhi)+Ko)LLndHerf?7Nf7e z46=C*vuR&(Ixj4XIA6I8>2%ZSuyfb@FGV`_;w{RRM6ppEp|)YwGzG+q=q^q zrT-_4#fdEVF^Ev#UBM2Wvv4UtK^)_Fw2ZS0NHE1dFW3{{_!=n4SWx*M+KAw|vswx4 zjzK>l?$1rrI@l|F$|4j~B=6r)Fix=c2(1$`1E$Rx%(|FUMmRgUN4Vaw@39c&>?pyP6d+1UUC9|foD$Q zjsFd(f1mp8NnM{mRPh`rihn@n16p-C=c1fdA^1F+o@buq52i_Qh>jDvGd<-pl(ag4Oq zp^y1;+ZcRC`>h}_NZDs*_M9Xdt7Ik9xQCtwT`KI7f{_lvL2Q#n_h!}#gSpN0hV~^7 z!b09ra-k`dH<9BH|0nUMLRgp;RQ7X>OxcC<3=A)HGBBJFF3u z|IM!04r;Iu@m*JJ2ckU%TFz+skhchGH#-5?Wwq1Z73sa9Fi#XKUV*i9I}{;BL7)`y zL@SoYkWf?GwV#+aH~ajA-l9-D)c1prKjLGr6MFkf_4i=={xW|Ib|p0^ycfA$nf;L7 zjvgUiueWC&*E-|hR6n{RZ3O z-$54Z(Vjosq}z=b)fIR!)I-c}{MMuwV&AA`^1=^4*v!r17%cU|E+3o#dP075))75aJzrg+HVusK3Qh@j;T_ zE?E3(EdKH?So|U={v0U&bh`->A!C2&$883|Uq#<*q1g?+bnc;7=c0Ax<6OFoMk@() zK00r|?5+CJF}<**SlO%b098CJK;3^#m(tbvxIOszcYMq_rpqjWoj&hlaTj)L>cv7n zh?TE^gAn8KQG>UeClB@}NJ0>D_xykDzAp8M#*R58S$g$jBZ zu#IYYEQ>mO$+2WB!6i?caV8j7o(4<(Qwp#u@u|kx$0PT7&|2TrvuDHX zE3P`Kp@9^DjX@r9=Y3SARCt)kj?+lS^SF7xDL51d@W*2Gm?f5BN8DCO)a6o(XDH!< zVha!D%{Y~z2g`cNHxn8w^fZI_BEaKo^GMTpW-Ar74eLL2DN-YMK_JgE*PI zO*(Ho5c)xYF68|(MgtVwL}$^btv@Jy7|)J{hxBk7xiM5}vo8zpjgU`gL{eh(;WCQq z+28=X_}a-Jay$4xkjPpSmxzVoVto)mrmmp_`KbIRR2B{VagA`m{>Or`6zkCYnP8tEVsJdf0sUefi7do4msUa$bXXSa&&Zn|IjXaYioV zU?4DXEkrezRnI|3jZQF@cN}@WCf9z>ATZSD%C(BqtX$V{Uyxj<8>NQBOc`Wg6qptKI3=l4^85~1rWX?s2 z=8;4(K!i3wp+Q<>l_xaFb;d2rP%yZr>F{@ZrCmlby2g;5HPU$yam)Z5V*!Ua48#h# za8=t0d8>+RDCFwQgW?E^O9=mN#6JQu6!QBEjcD1o=reX3v=u&v1!;3cmlGnbDy>pJ zu3Tq1@{V$y6}qh-;;~D4)|EIm{0gIzN^B)8i z2~xDFPg*&hD9NFcI6MD$XJ!`yq$DK?0!CVCmdWnGESde|?kph@Et*`UeK?QWXk$$+ zy{2unJeKC7avt@t65ZISY2@0}%jKv>4=tDG54ET~a_=`Y8zv-}c<23hp6AE+zVG*a z@AvP0zkjoty#15k!yd<2lzzW~&pdd2GrtjMpL3j#c~A7q7cx30Q`+da^(p+H!H@p* zR{JWqyW5I+`%c|Dh@Dl!FF-zeD8j(?*}0Fn{otqM-aY%5b>_xHT~M zK+Q&7i zBmat4e~sE4N*HRqOji;KH34aETaHj=X-)a9r8N}|#e;^tOB;#>45>WjRyWX$HohAYFdPl zs`;Ds=sHDDpim@afbL{OZHuV^Lk;>hB@)!txIdwR9J(kRiYSKa6r)%&t`e=GxRF$J zBCHx(G)M%XEov|a1yx-IHM2#d(;96N5m%upiBPMmZ^XBkXT>W`AR-Jc9^C+aPACx~ z6iFBgG@Xbx5r2;UJm>5@8$wWM(!hz8fC0LR)6LI81hGL=jH2s31Yz4pLwQQ;oPmZJ zsJ7ARpw9=KuWlC1rYBt%PSfS6OQ$1m*DUp#iRyFEGxJrKpSzvu^!_hatzKGMp=?J%9ji8g?eG@{s6`)^KZ7Xtkwu-6W6tVwCTH5Oe5 z;pUoir$1C<>AbZzrFGO=vPU622q>xp8>u@x&qvkan{^k4bEQ3(p4M4(YHL2aA7%sh z@5oc*DC-MA7v7rE#%x*VEh(+`mb3G`Zp(h|i2Lj<)8+pXw>Jc~g917V8YpI<+wpfu z{$5RKmj(Z0__nR%s2v)gfXFF+1HCFChI)pmXGT zq3Pr6!MG3dbwb!OJjp(+oqEjI$G)|y3b#)d2 z8xNS+k^#Ju63!HhLy^VE*cekok*266I?dtbVuq+GVhLbLS)AS}7+Ny2o-m>WI$IKm zwkq+E5;0)AU?k%aM-<+b5#~P5QrVnT;;{X|$xqiVt~ROWZiz6|a4Z^E;v0$UkQJwe zf;ZCRQi zkP<}AuVsaZ`g<@Q`+4dQkt&~)_K79?o4S<0=^SYX*rRUwh8bK;49IT_9DO& zOKFb*zHoa=`v%~BKubKOy#`p30Dp7fiO|`|YqyZ*BX^{sb%%xb?y~UHucfrFL%1980i?PA9;oAb zsH2|Jo(9|vW#0g8e7^kPR{hdz^9iVR#5ZiGkeH1Y7 zyReP}ssV!l=8?1W@3LiCknfJ5+N30P*k8w+uS0jjv_Y74-tuFx2^+&dng-^_95`2+ zbh<>SIRYja(3Ch@7me!XA61DUOR~{WQ81bW&qiRJ&4f)i=}`rrW6aP+2`CwHDhfr6 zX^E3Dl}tyOoZk;A&d_mMlF*`YhbD_{jfR3~11`sJSd}_ksU-pzhB4P^Dot@rn!?&O zMQ<{j>Eb{WCTI$XwBr{=V3LR#@$1hz-}e4%N}KBl&3z)!_-60t5MBZy#$H?Yq8;Mr z6`(J6g!l!4&w?WCQt z5_XDW!jxMM7gs_?!W4UL`RS4@DdDx$gg}F;gq=EV(MKwU>}Mpl@<(k3A*a6R$I%yc z>I+RPbk^@O zPgwIqKZMI1aUsBzP3N9WX)Xx8CoNyahuEr>#5QTuy%16m{_{zzPRc5@ zNJdI6fvm?5j4RqU%v0jEZ4>MR%d#8g!G4f{J|~b=z0*1`6GP zg1RjMK7p3pfR>czuoA&Mt} zMv2fS6?a5p6YL<7d0mE#4HiM1!zP^1&?(q|0q`7*@gmSKowDAyVEz@L@yDLh@%U51 z2km%_;ZxH*j{gnNubr~y2P}JI29Lj0{g$J=w}BpWrq{~pkjrz{)A z@fVK+JwBa&F3@@7*4&EuD}ny}_;migP=3Mqba__;y}-d=2lOIG`s;x%cEm3M+U1C6 zfaV=M{!TLfPEDp=z6auDM}GVnZ|d#o^gf7NI&S$T=9dAz+@Ws(>RUB#`5M+y5A6XZ#eo7^BaKPG(KJbJAv*Px7Ivd$E`qr-J!3`p%3G) zfWF_sZv*<__yj`-a`KjDaf3h1XD{r3#e&pPTq z(~$UD~|YsK>ve7|8Idl>?r>T(7$t}$6v%g>af4D@iX~9 z0DW?NdJi!H^atbC{_FIMN5|8*JEg6JrRHJ-qNg~25`=gG4!WDt1%NvCbX>or6LFa>8#luW38n@qImE&eDR#UWjDAh0;0 zh1Kw4BN&Fse)I!4JH4OMDkoD~353}IEbFjkgAn$;XVD1cD4o_pcR1*6HjQ=c{J;wL zd~o)=z*R2Nk6*1Q>q4zA7YoOTC>*(i{$ylBC=#rg5zhmSuN(Y$Q|`yt85QRkv)T2# zP5mk?T+=UQK3c;W`6-|ip^sICRqoSok0@rgH%uR)!I__%{q57N8fpy}J@Xw@t>JdO z0W*1LH0Dn?&Z%n`jDMRO>;TYHIz5)yE=FA`Z5+^70^w06DvU{8I}2vx-4LrQ?0{VUXtnKL+w@hkO*| zF{sN3pxZqy$G?M+psY#&bCaVyuyYO4r2w7ov+IF2# z#-LgB6mPeLv&Z^uxr}Ey+FXt5k8_9X$c}QF~cazDkHUHu=+Wa5#3#D_-KEU7c zAAvLl=jj8%E@v3hHl8&uRe1%=^N8xa0-#&Wzh!y3rS{O6^}yv!K;ABU%$IM?T()`6 z%{kATRY~L(+-z#8$Roa#^W5`h^~}D-wpIPa)Ks^#4b{+wGBcx9aKtL|wDc<`kFcE{ z0Q5lq?RL5KU~3gH3OIq^q#I27e0EZ>Z)z&Nzriv*_VYpZS@hrY{BhvXn{jxs(fX;_ zIB)yl`yVffOG5Tz~6u$hqPOuL509? z0r@rv-vB+ADH&)fAO`pW;2_|lbs1<0pdN4!pcn8eAR~~07{FSM} z*~9XPp~jmOSf>MeG@(}G>&o+`Y*vk>$)+aQ{Vm12$FeAFIWHtrMXMSy5-XL&`U^?D zOpk6Ti$;uiR9_i|llcW?sR~8ZL@n$qlZgvSZbjfGufji9IBym>*hem?gJQ{e^M!R~ zTvdW*C!RNDLX8BMLh|$XT|za=>uN3}*~b`=#K#{H$WpDumGFhM&8VrXJ#VrNO31GA z`IE*&hH7=}1wFyo^rxHl%@FL(a;2psGfb2vDnhz)jlmi+7all=G`v5xty8*ud90H62CIMF%P&Ysc zpdJtdbON>kdH{WZA;2);b-+nLRx$(40~7#?02H7EunN!!hygkP4<@ZT|Fs?VLijXb z2(TY83^)Q91sn%V;B?T3Ie>Y9s{us-3LpWN0jgUwKJAlP`ea*1joMrhNru-bdQvS# z-^KiDn0vmYZmei4g;~Ee7%VlS;ZlTFqcUAp;$_ir*qR(r^|YkI`oUifNMLHOG=H9l z?nY&h&`?cB0uA@t{IZY^WqrryRwfMuB+EyV&Aq32BAJaig$8lG2|2NC)ZORJQGVfV%5nZSddq;B^Il*VA$>Q*(b zE3udwtWgt5-9V*SS{;uDO0A0#gpOn`k3iEDJ+$epw*O0}Irrd`t{N;?193GB^+4$N zPWkf4Y59^lRjSf@mKt>5oNByw;C7+EnNtI;z~h3@%Rs}hCai&hJxZECJunEJoKtJ{ zh;0euY2NI`Kc+dmzuryrb)m2tO~Ra7mQ{O3Uv*^F>Z%$;-^!}f6Q$NEd>f{h#Z?tO zfGOxA(@4>Sn5#{5KhLsnoS^> zbuBpCsjOS^JZ^SD7+I4#-h=!7u%U@Y)V7d;o<#U+AreI>C&M3#u0!aHnaVo6_SR+w z?7M??nN3Z468|n$&uoe%jQ|RpVFKNr*@PQ|HfA>2+IMD#?Ocy$hShK&97E_alZrvT zpU#B7HKX@tCSvhW#Argl%uE<@Gu=xjh0~2?wl>+(2;p@EP+GpGw0b#BEh(?6!hSvv zWdED+rHYzW6;)7wyqm=PVvvOst%0~2;sY)i^+U)A?YC>B3~s($T!LLu7vAh*AHC3aJ}k! z)AfPtRSz;R1@S$K;<}jXrw8c+^n3JDW(8Bj46s!~ozN`Q%8l|5_ZJw;!_T*DYlJJZGN zVs}y+;6(e zJyo6t&vs9br_Zz3^QNajWW;i@N^B5s7atQx#8GiVyi8gq{aPNEukkMNmU(Nunm6X{ z@IK((>HV$uPu@J=wZ1xEgHQL}?c3&i$@hC7GA~E#Ajl;DjBFvlMm|RFC6~EsUF%$} zuFbCdT|b4sJ?@%tWm8vEH&WlAdZ}Mgf1s|S-Si#wL-Z5$Z|ExKT{fHhGxuHYJ3Vpv zZ@ma_bItp+d&#%SVd`Ne7 z%ZC~f!i#So`8;`ul$j*+5c9D6Tb?I98RFH@%KOCMi64qLOA+Z=>4@Z#SIOUpQM?@5 zdbjrx?+Iw1;=9ZDE8j8Pu9$W2TS~4ae@4DcE^v8W-*i3h%7Avku9hTHIURuewjVmwLV{?URm55xGNNTlQ`tXGwuEz^>E^|3^EprRAh1Ig;A zFVUm)XV}H;0qzgj(EAV?!S!@KMGa9$sduRNsV2IU-pl+7Eb}eq56oxT1?-J1$;xaE z+rq}!Z?QjQf5QG9*ywNB6YN}W5myHm`Y`u1u+LYxx43t?i}-7JieJjt^8x-5eh>dg zK3m8Wt`aJQ+k__Je(153a6))rxEL&Tf%`^xsk_$Q_M>1J>qj>zVtciT4{x}Mrx5ZO5c;7mkz=RPDxkF*UPuacgjD4aeP@mA|IDOlt1ge z)+>9z;%$OHgoX_wgufF#hx`KRB7aW4PZF-1U@UHRwYWCA_PLI@-UUy;lA@^<)K{q= zQhTX?gg$tWT1X4@m*{WOPtz~buhH+&g^b9oVxC}r!yE^1&0~G;t)BZl4|*Q){K)e- zSlBb3=RGe&{f~Iw@*MNL>-o@gv6v@b33j(gTq1I!S6n8p64!`p#U?Q#wu*O&TfrV5 z6dw_PBt9-aDLx}UFTO1PT0A1YB_0#s1v|Z1%9E~?u9g-_OC(P6f@iLR_OF$iz53K@YfOx4c}wS^lc5$%cHtyi?vK56L^c_%hf0NCUong+U(3La3f>AREab zsgXJvBMq{RY$rR&Eo3K2P=!q9ewby4=|l8kdW1d-mOe%wr^o3DdXh#= z7L(27GWpCrWFjsdo z+nDXl4yK3M3G;R@)5q*#`k4V{klD{1V1}7P%wcAPIm(POV_+fU%mg#ZAU2E5W^>tm zb{;#QEno?@kS$`1!Iv0TU?sMMEoUp)Dz=)fgPFep=Kdhe{yO-W!M3sOYzMoA?PR;y zZgv~Ho!!CqushjZY%kl#?qU1c0d^2(krcb1J-`mLhuFjH2z!(rWyjd#>^M8YPO^y0 z;JV)Dxn%y^Ln8{XcU5iCg?&;FoZUt zUFZy#2#^{xJ&F6`(XC#7YD>aaY#&w`^5v|uy{y346F4~Sg*&#>N%N%wiI57VBB@v+B}Nh?Nh*=brAnzvs+Q`cdZ|Hbl!B5b>Czsl zUmB1Gr6HJ2_Dct(Vd;=`SQ>#G&iAx%n1&XTj`TsdE!C(oA)WI`^Ki{xS% zmRMPkCAmZ{mn-Een0<6P1~X8b+zxBl7P(XIlDp+?@^*QL++)s4Bi>Q(xOdW@0Tp27E)l1HMDPqrNfUgby8ueHFewBP+>jn7@KB zUv-h&$sV$o+(QnMDRP)ROpcPr$w@NHmG7GGDs&aQ1Xqcx%2nrTbZM?Em}dx>T}WD@ z%jqh*9%dH}=9PAsQ@UX`>4AA<56mIhL$P;a&%|DdJra8(_C)N3*aNZmVb8-}hdmB^ z8}>BpW!S^8cVW-MUWGjhdlU8~>_ymvu=fmdL#F>=-@$%^eFpmr_7&_W*hjE`VBf%g zfqeq|1NH^%2iOO&{bSq5c8_fy+dH;(Z0Fd2L++G&zx#lD*nP--*gfJt>K=8ExsSWY-4pIfH}Yh8vOT$;wC$bC?$Wk)E*sk- zbxK`Qx3oj*k#dr9VAtDlUx#Y*){{I_LO9KQ7 z000OG0C{o2LXqUV)sVRW007E;e6yI5uB4 zG%jRpY}9=Tcoanz@N|+16Cm_(3C00RrMSJU84Tq|NZ$s znC_}qRj*#XdRJ9fm0VY8Nw!!lDe%uQESA+4_UE+x@4pK8*QMXuE|&kKy>r28!S~Ju z6KCBrH*?NicmDRS8*k4nyYY@Y?vyicnwfc*|BlRC?#OgsGa>W#J8zyjI6b{%7O$h! zW3k-4w3EfP{`qlcy@xG>FYJ_*)YCFpuvqrOzaAD#Cj7J5Df?FXAD@#L-uP$57pjmY zroWd&{eqH~D17`w^xb?+vV4pM>`9i-)8jf>C0GW=zdMsG3zB|>D7i_N?6V}x-IFZ# zn zL^3ho{Hs9xX0rN-=H@_dI7@xEFgO|$7#qTG(;0A8gNw&c#OEpaUuF_jY1!2l&RI2B zo=x~k_+KuE+kH0r&76H_nT3tDljFDdjCMz#wS)g3{Y{VpUuUkdK*zKrF#RQ^R#K|9 zo_~PH&^}4AcK%F&L~AC;@-*9KYyO7cf$ zN@_~~T+CJH*jT&6J*+;tKq{ycgSi4`_Wdw9$&zP8(y@P(o&o7mM4G8!XO74xdHYoB z@lO#IK@4UBpla1VrQQY)TkvhKnb{38L;L(4vFT;jt&l9K)@=n0f%Fn(|61fVNzsjl zfVJ#h!6LNni`Wn7rS~%oqg?D4r16u~^jn}NZDJTltV&YqWG|#m!!&1@4QL=@lL|hb z-(6C>OQA;jTTCz-A!*(rNjajWwE|eZb-<^LyWz1rf2_Cm=1&agUhviyr#JCkZ*DaV z8h0k72s zP9}@Ne_L<_#Na=X{SMb#e+>nJmvbKp(>@$zYGBU_vbZ24yK=e6)G@aEU(4A)Sfa7 zL^3oLhc{Y(w8ovU#$J>*Iz&Q z`Z~`BizlzjryP)!lSZXv#eQvc1N#PQQ#|1ZjMmmx*YQTr1v^|zKCOU1`7^h&$*1Vm zn%#B0x&knFi|$QQxHw4?-Mc-O%~D`rvXpaDD>{iR>Q1&xf&GWI?T^D-&IYftTT)tl zVL8j`!}$O(-f-t%`ILj26`nnLn*o`%(0#z@h*a;+%B9Hx9fThz{AQw1G#od#qO7c! z)YKA1Bjk@5m8DiBqG8B0*Yu&;RR@GOv}Z+u3ELA=J)d??8~-JHL{e(%ov5^-;;B^e z9+=*u=eXvjqKBpM%m!du*Y&Pxt{bM+^6@epSGS_PvC17lIF?t+U7$te@yIqdKkMsS z@ogQ4kI8F7Ph9m<)^hrNE2|QIeM+52*`_sh!6uI&!v7oFf1Rdjco%TM9C6izG-t(W zL0nPoR?1S!>x;WsY}KFQgWZx;SM2Dzyto?xE(jc`a8?*XU2)IuE^$Rw+7@VTd2tUl zn1yJ%s`sZXpO7XgdzTk?7grVA0{a8*w5q_Sisi*N!_lb~TlDt=4WjJPasXK%PfSFu zLEBLq(uIudE^&@;a8IF)A9QB1~qfkC! zR93{1km%=CHW-fooDeL&aLG0#qYGvVlFo-DJ7PE%5bFL}h9foF?@Jk}{3jTxHg|;L zK&rFKpE&A#!K$hu>UcI0aiE2DCumS!H7&m?&EH=lMQ=FL ziJ%~)Hsa`93QYl{n--0;sZNm70{gcGHf1g^PJ`DZIW@2aq^S*_Q{7N`e(kjFoCSYgli_&ncno!=CU79Pq9s#YQ6sKuRCWd4O=>E(rHJmM%27aI zWs>NjC)-K^o)GmpHZHgUb(5bMKAzBKz{ag?U3?iyqK-tO#TP1j49DPRLeX$+Y$EaW zL{+o~HyW;q^|^k-W*?2ylCL*W7q;^0w*mNR2C<4eYa#w>r#oQf8-IK{h8?T!7hVoa((ugR0QZ>3Gnt`GhP6*rY7+gvI;s%&v9)gEP&N7>;~ zj(U`DJj&^ncDX-?wf{J5-l3Hh@`W6hwDH?#g>Bj($o)7N+Wcp$a%HC6hl6CEt<{x+ z+?(eMXSB33N$$xrlM*vmrpVoSPD(UK+2slD6GLN@aqgn1aPpz`@n4Dmx=9BG4~e0L z09)tI8i}c;Ja;1hE#!ksnxt7ljx{Q0z=(vJK&pa!mxS$r1u{EpiZA?9Rs~I=?{)Ae zEOGt0a^{dgp^Xg4K&-uU`I$1m)?v{LbFp0 zzC*Y@ijI17W_hI;x(RZCFP#cQ%@Z`l;8IJh7KXS!fjkiG0Hz|TUF*|mEQl4?5gU_@ z;aWp%yc$Pp4RSGca2@%PSAe4h4nv``f*Pw>2xCF&M0D4fE$OXs{%<`?L=e3J-AQ$L z$uaQic9H55gCmpT293`|K5iUUgS?^*#xAITg(ZRFjN0H+`4Aq^cvGMV-(WkdknNqXNTky^)` zx)MEso%PFE$btO(iCJ?o{^@XbRE79X}Tn_kx9KgmDBpG%T=Dwaxxfzg4GapN0P4KTU@)iys zH)nbtrT&Iq2EuWJZy_0)fX~6hEU&Ny*f4xLjz1H$%?uJnRjxI?Eg11|EL(^jg$5<% z9jU$=7^?zt$}}9Ge#qKMS+E%2JR5A7imSC|M7`Pcv&yzZz|DsivWg6Pe_Hx#oL zuoS=*FEw@n(FTD)5AE|`%2FIpe2Xlp0ZSrwF_z@^OrTbXsFLbIbdTRlT%2d1tL*cI zpUs*9D1)Z+sgrPMfGTK`=q}^o8O&vmbO_W71)s=|khB%J^c5J^l24H_Zg6u}t}h(S znjyrYAH%#Qin;%F#DgZ6ZdB%z9K?33NzNT)4da}PJP?z&&{@4Ni6-_Qi#l+B2^_+$ zak|0XMmLbI;Bp{Lv5q=2x~jfmt_2{M+f;3rZCD3RfTrq9dU3NCC%s7cvgA{myZG)C zn4sb2Wy%jp6tad&VNhx-`Cp)A%={Tr*ct@ZaVd>gm-VRh2@S@6vwtO_&9c+2j>~qB z95-;$<=(OySD;4lh5I-q)s^X1#$}HUr|iav<9UkRr#NjsMY6}mv!J}cQ(jeV?7d1p z9Ifxm$jfc~8Mo?%EbqWY1H5I`u0XXQg&KX~9=tU#w$>nb#P+Nn7{X+zn%h!Jsm-l8 zq3yHA_n>?RjEtnb@5Uk8C9bkXJRq-vReoQ^iL1mAsvs#)oFN1Zp?71TxD*7-=|D{% zW_6)CxdX))hD1~4tEKQ9o1_+JKs6O7?h;p2Rh*a%hN=G*sv=k=_cE(VqiW8JyutWC z*eL%!G3)%u%5aJ6 zoQU{bZ=fp42MO-5v%yu-oHoA{tHb0bBTz$exJOlZVr7G?pke-EtPDy58RgDU zP$-;^MdjOEN<+A`p`s;i9{jGaXz4wF0x!2YQdc-#e#sq{)}!dEIMI9F`)<``cU5c2 zuE2gF)aVgcZSr3U@}c2;^ee67`U;k4e?}z9J}FR>?<=VBAIqzP4gfoj9G5@$7>sak zzy+OAQyOCSxd#ULKax5w1IAHY)h%$axS~aHiH}uB{!ZiJQ?JV|!5FSe%;(Am-W-@$ zrCyioDQH-f<1MRlLARvvFwTLlY$=>_m?G@;mYy`@r`VJ!b|9eyUWGi)r;g1~$7c%T zO7p6q3NidAjES;pVvOt}MwU?DEkK>htCDO=sa-FJ6hs5jiM#+6+SKv($iE0*lbe^2 z&{no8yQCrm#lQe5Tq-!14+Cf65zKQgf88cfWF5VgDE-zVaNQDvWV*TpS0ao@>}Z_@ z^5K8Bl#*8!`ES(!7Cd>4ZWvdt-OdJpO2Q;h zSOU&Dkv8u$rRMlvPpDD!)I|Mxz|!>^a9me6GF;@}(AJ)~`AVTf==Vt1z(vEQvIe4B z%6J&TOd?vJ8Y#3-?pB{%NOPb%L%R;7u~KZ4l-+FEC~sf%5#~45hvN^l5?3Vw>s?TI zhulpHdo#354ArX>GAc$)m(O3#1NT@1bxcwwWUzO@A##Z0&+8*$QjtGV7Re!`wpjm= zTVM)k0Tv9XUhr|C*eR$JvPVuBxTsMot0D230(?-MsZ2mNs6uX9U2j1v7C6AHE*6hN z^l6y{5$)18{)d=C_mC9V0OK5QsMh)s4DkyO#-ixME)QxYtm?!EU#G#nHv{mnNoBjF zoMs8Q_4iL=ve430Y)?S~_CgXkcK|!pxSy*6y(dW1tAm>rIrv;^BF_74F?!3Y}^cR?k zxJZXX=#x~ZP3;E%+wpaHApcT-ZlJ|-Uyn#;bi6R}{7|EO9)bl93b^JMIaVuoZNvfAeZNl)kWdN_ zOpRP(w&zo7P%lVGeGc z0?I`*A+Is=5|1}?t;y+U(#M>kJ~=(sWsnC_Sb~we3KVy#P|-3S*9IzDuJdQ3p2*I_ zXL(pfiwC=0O@M9q8Q|o>P)QQ6B#FxSw;?z#gh2tA40Y$T$fdZdYvff-=$~pXr;5SZ z=o;r=BnB&K3Qovae+B9uaaBhUns>-I!T%mH7^cQHi@_oQ_l3s_k*=u!z0i&)*eC`E zU@|lZ+On$)G5*4%Y;xr^U~6wQfk?zz3C65fIjr?+LjEOmXth@gj~1M7 z7J3(MEF8PIsL&^S3#a(kFsZT!ThlzN?Zl-da9F5Tkxt36JMUI|Mxq-Udrc3K4ZXl#Z@rLeHATT z<_$oR)7pitpsQm5O)m?MFm093*Ndfa`i*l1m<^yRdORcvJB&}U2gq6=oW^8mxAn$B znhce1tQY|VR>5U5RUWIPVu2uw!HWc(CA1!oqaSV5{|8JPP7AfWfj`J?!K9Of*xVw@;%_d$PozA%zUN zJMuANB(Ay+c{sSwAC$o0B{{cG*KmCpkzJn7H=@K5I<9|7CTVA+Q}Fe}-_eo@i-=#M=i-zd zf#%V&9rHRJr`5?|HcZL@(OvGOj>#T5X5hk$*rFScrXA6oN7x|5jcX+{8KrP%Fc~Lj zDr2&J;m%voiLG_j3oa<=Qtq~Um1}L0|H3S1Lq9n~d;fc~i|R$?dcYKz=fzWOKSDgv zoF;}^_!Mn3`Ny4Tu5{tZ6dyrktM#d*I03Ik7BN^xh6Bz!j~JSaFNmCaJ%|{fkuIEK zyHU>cSMyEbx=tvZEMHc5mwajARr1B;Q;nV1iNqW0F*r!_og^^4;JbT;2A8p)CM@?_ zPafv9u9G+8`(KTyfL$Z00Eb(6{;d}0k1Q@+^iR+dxxTV0z;dk8qgpA>=kky@7FCK+ z(bL~k+zMw!78lxBG~6M$V^#ID#1TEb(Mlxk{1nUEiA1*-Z_ z3$H5jc7jToE(TAh;-;@$kS5D6=|E0EQvCjwO-yT7gO|68!Oc6!_2LuXnzRsu4|3%T z7M&Pc61Ak6I+;h}@i2~?iQ{U zgJV;p6KIb%q`Qd#$hDOy#jEs=ZR-E#bhQ2pd9kaa^*_}bs~>3-1WJE~Hf?xZQa~G1 zm`g-k)<8*)d+$IdsRC>7eo3e?4p1}Ug~*Alt@{Da6!I-Zh>hC1Z(;mF@IwDyA>?6o6pD`;S1Q4IDy6`L4`lQO2kc5t4|{L9>LD_<;^>y&EJOm!n7NKBgUl)7PnfQE&WNV z-fsn_aE~k=DE=P9wvyVTzm0nf)q*L0blYFU@`W3>!swPYpK5?O5)Uh<=bk0epyf7;>;>kIfy z$!&=;nTK~Ve9#<+&*Cub^P`RYo;C7xVk6y+SosfyA1m);cROpZm}QF*xr;)U7~|9PtsI37JZ9_So>S8c6}SpguL5yg*kHlkJaHfwU?QRh27a>|$t|z!3PT8F3q9 z<7#Pv4V3J+n1*h8=^=(sUL*J<;HQbqDJz^y=&Y!rLgh+nH+@}mjCfC2evEh`d9;q1 zsR_h;?6g^aQP~fd-AOKwn&l7`h)it8Y6_FqPW*F;6sf3UZ*%6(#{iloBcohF-}eak435 zzF_N?`h{`W=#}v=J5SR3U!wmF-eradT!OnX?1y10an&5b8Elem%T3eI(s zC%@Le&4c!=JHJl8#+85gz8dHal=j!ehZdOq;jCz#=l?zQs?5I>yE3pTDg!Qyx{O#t zzyC{If8|`X>IeJxc)ev1>y|C@aCv2%cNz7nF|vsf`0?N+UtKs@9?Sgfp=iINZ+!`$ zz4kAorr*WrSF;5S3zW)%(*2?21qgOGbHM>+f3<07#^RAQ@c^$cVD{N9{{50#Y730G z$p3)^qBn3)pEUnF@Q?%gg0Hbg-ah+!j2V&*OAQq#z%#^k->`%ZFtUWg1Gb> zn0e{Swak4t>=APc3Cfp-r$-Jv;T zzoEy#l-y#SJci{{;)JyiVam3!(e{G8Vxv8Xm6a4n8&5W`G`ZZVY1ecQr3w&g|q!(PnE6+?Q=l!d;6_5s~P#&CE$_Lu9R z&M_S{a0{XQDp6xInB(vO=pz5RVKgMA#7;6F=Bvvt6qf?q>c2C1^F!F4h5P0e=HdR9 z*+1C$_#bV2nA!NHtnm)Mq6Ww<$Cc>9q4N2d{M{)tIkMEXn!a{u zZN(&HcO5yCr_MB@sUPvrA!740ZvSoE9K|_^p_jsmV(>-$1L<}`UQsQEdV!uHP7Utl8vn%;(aAgj zV+Di6AbuVZXdWyE=hBX+%UBJR^%43}O>J9(8t3?5gPA}or{bO@=*BYuseSwf=*TKT z-p0l7hO@BqFkt5<`Gxva+-n4;hdwO+dl}+@yTo7*?86)}di_ShqK>uu)C&W8l5kb2Px+GM(y`~nU^DKi8s8((B8b86Freatb=bd_Br%vy z56M6%axRM&+{on_l*gj!@a(E6%(_DieUF1Lu5xDyg*S?!nUJw|I#&d}QkWpa{lVWd zn@LjY!HfgbO$=TFpcO51#9$dc+#-fvXhlOG<;Rm;%)Cz_(`wuUbvdu}wNIi3{cxW2 z#3xaKIt=-8V0mR;Q*g5wx;)8Zi4#La9c@W6y6;rMz(nzjgQ$=H1m_G{>8-xpj=ZDORJf&+R|V)(!ZZ=(QSlb$%lo1h<^a>ebmr�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 literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/dist/maple_loader.jar b/tools/src/maple_loader/dist/maple_loader.jar new file mode 100644 index 0000000000000000000000000000000000000000..e1f9965c1ff0fe14384717ea4559c7f59e9a1ca6 GIT binary patch literal 32791 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 VEwG5^!#_X%TL6{zhrDw%{eMvMy}$qf literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/jars/jssc.jar b/tools/src/maple_loader/jars/jssc.jar new file mode 100644 index 0000000000000000000000000000000000000000..eb74f154a01c8c16712233cca36b65120ea47986 GIT binary patch literal 152418 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 @v>QJza{i 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�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 literal 0 HcmV?d00001 diff --git a/tools/src/maple_loader/manifest.mf b/tools/src/maple_loader/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/tools/src/maple_loader/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/tools/src/maple_loader/nbproject/build-impl.xml b/tools/src/maple_loader/nbproject/build-impl.xml new file mode 100644 index 0000000..080006a --- /dev/null +++ b/tools/src/maple_loader/nbproject/build-impl.xml @@ -0,0 +1,1413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/src/maple_loader/nbproject/genfiles.properties b/tools/src/maple_loader/nbproject/genfiles.properties new file mode 100644 index 0000000..1007bfc --- /dev/null +++ b/tools/src/maple_loader/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=2e6a03ba +build.xml.script.CRC32=4676ee6b +build.xml.stylesheet.CRC32=8064a381@1.75.2.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=2e6a03ba +nbproject/build-impl.xml.script.CRC32=392b3f79 +nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48 diff --git a/tools/src/maple_loader/nbproject/private/config.properties b/tools/src/maple_loader/nbproject/private/config.properties new file mode 100644 index 0000000..e69de29 diff --git a/tools/src/maple_loader/nbproject/private/private.properties b/tools/src/maple_loader/nbproject/private/private.properties new file mode 100644 index 0000000..ab05185 --- /dev/null +++ b/tools/src/maple_loader/nbproject/private/private.properties @@ -0,0 +1,6 @@ +compile.on.save=true +do.depend=false +do.jar=true +javac.debug=true +javadoc.preview=true +user.properties.file=C:\\Users\\rclark\\AppData\\Roaming\\NetBeans\\8.0.2\\build.properties diff --git a/tools/src/maple_loader/nbproject/private/private.xml b/tools/src/maple_loader/nbproject/private/private.xml new file mode 100644 index 0000000..9feb3fe --- /dev/null +++ b/tools/src/maple_loader/nbproject/private/private.xml @@ -0,0 +1,10 @@ + + + + + + file:/C:/Users/rclark/Desktop/maple-asp-master/installer/maple_loader/src/CliTemplate/CliMain.java + file:/C:/Users/rclark/Desktop/maple-asp-master/installer/maple_loader/src/CliTemplate/DFUUploader.java + + + diff --git a/tools/src/maple_loader/nbproject/project.properties b/tools/src/maple_loader/nbproject/project.properties new file mode 100644 index 0000000..984cc6a --- /dev/null +++ b/tools/src/maple_loader/nbproject/project.properties @@ -0,0 +1,79 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=maple_loader +application.vendor=bob +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# Files in build.classes.dir which should be excluded from distribution jar +dist.archive.excludes= +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/maple_loader.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.jssc.jar=dist/lib/jssc.jar +file.reference.jssc.jar-1=jars/jssc.jar +includes=** +jar.compress=false +javac.classpath=\ + ${file.reference.jssc.jar}:\ + ${file.reference.jssc.jar-1} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.7 +javac.target=1.7 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class=CliTemplate.CliMain +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/tools/src/maple_loader/nbproject/project.xml b/tools/src/maple_loader/nbproject/project.xml new file mode 100644 index 0000000..076fe22 --- /dev/null +++ b/tools/src/maple_loader/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + maple_loader + + + + + + + + + diff --git a/tools/src/maple_loader/src/CliTemplate/CliMain.java b/tools/src/maple_loader/src/CliTemplate/CliMain.java new file mode 100644 index 0000000..c7dc9f0 --- /dev/null +++ b/tools/src/maple_loader/src/CliTemplate/CliMain.java @@ -0,0 +1,60 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package CliTemplate; + +import java.io.IOException; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import processing.app.Preferences; + +//import processing.app.I18n; +import processing.app.helpers.ProcessUtils; + +/** + * + * @author cousinr + */ +public class CliMain { + + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + + String comPort = args[0]; // + String altIf = args[1]; // + String usbID = args[2]; // "1EAF:0003"; + String binFile = args[3]; // bin file + + System.out.println("maple_loader v0.1"); + + Preferences.set ("serial.port",comPort); + Preferences.set ("serial.parity","N"); + Preferences.setInteger ("serial.databits", 8); + Preferences.setInteger ("serial.debug_rate",9600); + Preferences.setInteger ("serial.stopbits",1); + + Preferences.setInteger ("programDelay",1200); + + Preferences.set ("upload.usbID", usbID); + Preferences.set ("upload.altID", altIf); + Preferences.setBoolean ("upload.auto_reset", true); + Preferences.setBoolean ("upload.verbose", false); + + // + DFUUploader dfuUploader = new DFUUploader(); + try { + //dfuUploader.uploadViaDFU(binFile); + dfuUploader.uploadViaDFU(binFile); + } catch (Exception e) + { + System.err.print (MessageFormat.format("an error occurred! {0}\n", e.getMessage())); + } + } +} diff --git a/tools/src/maple_loader/src/CliTemplate/DFUUploader.java b/tools/src/maple_loader/src/CliTemplate/DFUUploader.java new file mode 100644 index 0000000..3dee0b4 --- /dev/null +++ b/tools/src/maple_loader/src/CliTemplate/DFUUploader.java @@ -0,0 +1,345 @@ +/* + DFUUploader - uploader implementation using DFU + + Copyright (c) 2010 + Andrew Meyer + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +package CliTemplate; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import processing.app.Preferences; +import processing.app.Serial; +import processing.app.debug.MessageConsumer; +import processing.app.debug.MessageSiphon; +import processing.app.debug.RunnerException; + +/** + * + * @author bob + */ +public class DFUUploader implements MessageConsumer { + + boolean firstErrorFound; + boolean secondErrorFound; + // part of the PdeMessageConsumer interface + boolean notFoundError; + boolean verbose; + RunnerException exception; + + static final String SUPER_BADNESS = + "Compiler error!"; + + public boolean uploadUsingPreferences(String binPath, boolean verbose) + throws RunnerException { + + this.verbose = verbose; + + return uploadViaDFU(binPath); + } + + // works with old and new versions of dfu-util + private boolean found_device (String dfuData, String usbID) + { + return dfuData.contains(("Found DFU: [0x"+usbID.substring(0,4)).toUpperCase()) || + dfuData.contains(("Found DFU: ["+usbID.substring(0,4)).toUpperCase()); + } + + public boolean uploadViaDFU (String binPath) + throws RunnerException { + + this.verbose = Preferences.getBoolean ("upload.verbose"); + + /* todo, check for size overruns! */ + String fileType="bin"; + + if (fileType.equals("bin")) { + String usbID = Preferences.get("upload.usbID"); + if (usbID == null) { + /* fall back on default */ + /* this isnt great because is default Avrdude or dfu-util? */ + usbID = Preferences.get("upload.usbID"); + } + + /* if auto-reset, then emit the reset pulse on dtr/rts */ + if (Preferences.get("upload.auto_reset") != null) { + if (Preferences.get("upload.auto_reset").toLowerCase().equals("true")) { + System.out.println("Resetting to bootloader via DTR pulse"); + emitResetPulse(); + } + } else { + System.out.println("Resetting to bootloader via DTR pulse"); + emitResetPulse(); + } + + String dfuList = new String(); + List commandCheck = new ArrayList(); + commandCheck.add("dfu-util"); + commandCheck.add("-l"); + long startChecking = System.currentTimeMillis(); + System.out.println("Searching for DFU device [" + usbID + "]..."); + do { + try { + Thread.sleep(100); + } catch (InterruptedException e) {} + dfuList = executeCheckCommand(commandCheck); + //System.out.println(dfuList); + } + while ( !found_device (dfuList.toUpperCase(), usbID) && (System.currentTimeMillis() - startChecking < 7000)); + + if ( !found_device (dfuList.toUpperCase(), usbID) ) + { + System.out.println(dfuList); + System.err.println("Couldn't find the DFU device: [" + usbID + "]"); + return false; + } + System.out.println("Found it!"); + + /* todo, add handle to let user choose altIf at upload time! */ + String altIf = Preferences.get("upload.altID"); + + List commandDownloader = new ArrayList(); + commandDownloader.add("dfu-util"); + commandDownloader.add("-a "+altIf); + commandDownloader.add("-R"); + commandDownloader.add("-d "+usbID); + commandDownloader.add("-D"+ binPath); //"./thisbin.bin"); + + return executeUploadCommand(commandDownloader); + } + + System.err.println("Only .bin files are supported at this time"); + return false; + } + + /* we need to ensure both RTS and DTR are low to start, + then pulse DTR on its own. This is the reset signal + maple responds to + */ + private void emitResetPulse() throws RunnerException { + + /* wait a while for the device to reboot */ + int programDelay = Preferences.getInteger("programDelay"); + + try { + Serial serialPort = new Serial(); + + // try to toggle DTR/RTS (old scheme) + serialPort.setRTS(false); + serialPort.setDTR(false); + serialPort.setDTR(true); + try { + Thread.sleep(50); + } catch (InterruptedException e) {} + serialPort.setDTR(false); + + // try magic number + serialPort.setRTS(true); + serialPort.setDTR(true); + try { + Thread.sleep(50); + } catch (InterruptedException e) {} + serialPort.setDTR(false); + try { + Thread.sleep(50); + } catch (InterruptedException e) {} + serialPort.write("1EAF"); + try { + Thread.sleep(50); + } catch (InterruptedException e) {} + serialPort.dispose(); + + } catch(Exception e) { + System.err.println("Reset via USB Serial Failed! Did you select the right serial port?\nAssuming the board is in perpetual bootloader mode and continuing to attempt dfu programming...\n"); + } + } + + protected String executeCheckCommand(Collection commandDownloader) + throws RunnerException + { + firstErrorFound = false; // haven't found any errors yet + secondErrorFound = false; + notFoundError = false; + int result=0; // pre-initialized to quiet a bogus warning from jikes + + String userdir = System.getProperty("user.dir") + File.separator; + String returnStr = new String(); + + try { + String[] commandArray = new String[commandDownloader.size()]; + commandDownloader.toArray(commandArray); + + String armBasePath; + + //armBasePath = new String(Base.getHardwarePath() + "/tools/arm/bin/"); + armBasePath = ""; + + commandArray[0] = armBasePath + commandArray[0]; + + if (verbose || Preferences.getBoolean("upload.verbose")) { + for(int i = 0; i < commandArray.length; i++) { + System.out.print(commandArray[i] + " "); + } + System.out.println(); + } + + Process process = Runtime.getRuntime().exec(commandArray); + BufferedReader stdInput = new BufferedReader(new + InputStreamReader(process.getInputStream())); + BufferedReader stdError = new BufferedReader(new + InputStreamReader(process.getErrorStream())); + + // wait for the process to finish. if interrupted + // before waitFor returns, continue waiting + // + boolean busy = true; + while (busy) { + try { + result = process.waitFor(); + busy = false; + } catch (InterruptedException intExc) { + } + } + + String s; + while ((s = stdInput.readLine()) != null) { + returnStr += s + "\n"; + } + + process.destroy(); + + if(exception!=null) { + exception.hideStackTrace(); + throw exception; + } + if(result!=0) return "Error!"; + } catch (Exception e) { + e.printStackTrace(); + } + //System.out.println("result2 is "+result); + // if the result isn't a known, expected value it means that something + // is fairly wrong, one possibility is that jikes has crashed. + // + if (exception != null) throw exception; + + if ((result != 0) && (result != 1 )) { + exception = new RunnerException(SUPER_BADNESS); + } + + return returnStr; // ? true : false; + + } + + // Need to overload this from Uploader to use the system-wide dfu-util + protected boolean executeUploadCommand(Collection commandDownloader) + throws RunnerException + { + firstErrorFound = false; // haven't found any errors yet + secondErrorFound = false; + notFoundError = false; + int result=0; // pre-initialized to quiet a bogus warning from jikes + + String userdir = System.getProperty("user.dir") + File.separator; + + try { + String[] commandArray = new String[commandDownloader.size()]; + commandDownloader.toArray(commandArray); + + String armBasePath; + + //armBasePath = new String(Base.getHardwarePath() + "/tools/arm/bin/"); + armBasePath = ""; + + commandArray[0] = armBasePath + commandArray[0]; + + if (verbose || Preferences.getBoolean("upload.verbose")) { + for(int i = 0; i < commandArray.length; i++) { + System.out.print(commandArray[i] + " "); + } + System.out.println(); + } + + Process process = Runtime.getRuntime().exec(commandArray); + new MessageSiphon(process.getInputStream(), this); + new MessageSiphon(process.getErrorStream(), this); + + // wait for the process to finish. if interrupted + // before waitFor returns, continue waiting + // + boolean compiling = true; + while (compiling) { + try { + result = process.waitFor(); + compiling = false; + } catch (InterruptedException intExc) { + } + } + if(exception!=null) { + exception.hideStackTrace(); + throw exception; + } + if(result!=0) + return false; + } catch (Exception e) { + e.printStackTrace(); + } + //System.out.println("result2 is "+result); + // if the result isn't a known, expected value it means that something + // is fairly wrong, one possibility is that jikes has crashed. + // + if (exception != null) throw exception; + + if ((result != 0) && (result != 1 )) { + exception = new RunnerException(SUPER_BADNESS); + //editor.error(exception); + //PdeBase.openURL(BUGS_URL); + //throw new PdeException(SUPER_BADNESS); + } + + return (result == 0); // ? true : false; + + } + + // deal with messages from dfu-util... + public void message(String s) { + + if(s.indexOf("dfu-util - (C) ") != -1) { return; } + if(s.indexOf("This program is Free Software and has ABSOLUTELY NO WARRANTY") != -1) { return; } + + if(s.indexOf("No DFU capable USB device found") != -1) { + System.err.print(s); + exception = new RunnerException("Problem uploading via dfu-util: No Maple found"); + return; + } + + if(s.indexOf("Operation not perimitted") != -1) { + System.err.print(s); + exception = new RunnerException("Problem uploading via dfu-util: Insufficient privilages"); + return; + } + + // else just print everything... + System.out.print(s); + } + +} diff --git a/tools/src/maple_loader/src/CliTemplate/ExecCommand.java b/tools/src/maple_loader/src/CliTemplate/ExecCommand.java new file mode 100644 index 0000000..3d6c106 --- /dev/null +++ b/tools/src/maple_loader/src/CliTemplate/ExecCommand.java @@ -0,0 +1,119 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package CliTemplate; + +import java.io.IOException; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + +import processing.app.debug.MessageConsumer; +import processing.app.debug.MessageSiphon; +import processing.app.debug.RunnerException; +import processing.app.helpers.ProcessUtils; + +/** + * + * @author cousinr + */ +public class ExecCommand implements MessageConsumer { + + private boolean verbose = true; + private boolean firstErrorFound; + private boolean secondErrorFound; + private RunnerException exception; + + /** + * Either succeeds or throws a RunnerException fit for public consumption. + * + * @param command + * @throws RunnerException + */ + public void execAsynchronously(String[] command) throws RunnerException { + + // eliminate any empty array entries + List stringList = new ArrayList<>(); + for (String string : command) { + string = string.trim(); + if (string.length() != 0) + stringList.add(string); + } + command = stringList.toArray(new String[stringList.size()]); + if (command.length == 0) + return; + int result = 0; + + if (verbose) { + for (String c : command) + System.out.print(c + " "); + System.out.println(); + } + + firstErrorFound = false; // haven't found any errors yet + secondErrorFound = false; + + Process process; + try { + process = ProcessUtils.exec(command); + } catch (IOException e) { + RunnerException re = new RunnerException(e.getMessage()); + re.hideStackTrace(); + throw re; + } + + MessageSiphon in = new MessageSiphon(process.getInputStream(), this); + MessageSiphon err = new MessageSiphon(process.getErrorStream(), this); + + // wait for the process to finish. if interrupted + // before waitFor returns, continue waiting + boolean compiling = true; + while (compiling) { + try { + in.join(); + err.join(); + result = process.waitFor(); + //System.out.println("result is " + result); + compiling = false; + } catch (InterruptedException ignored) { } + } + + // an error was queued up by message(), barf this back to compile(), + // which will barf it back to Editor. if you're having trouble + // discerning the imagery, consider how cows regurgitate their food + // to digest it, and the fact that they have five stomaches. + // + //System.out.println("throwing up " + exception); + if (exception != null) + throw exception; + + if (result > 1) { + // a failure in the tool (e.g. unable to locate a sub-executable) + System.err.println(MessageFormat.format("{0} returned {1}", command[0], result)); + } + + if (result != 0) { + RunnerException re = new RunnerException(MessageFormat.format("exit code: {0}", result)); + re.hideStackTrace(); + throw re; + } + } + + /** + * Part of the MessageConsumer interface, this is called + * whenever a piece (usually a line) of error message is spewed + * out from the compiler. The errors are parsed for their contents + * and line number, which is then reported back to Editor. + * @param s + */ + @Override + public void message(String s) { + int i; + + + System.err.print(s); + } + +} diff --git a/tools/src/maple_loader/src/processing/app/Base.java b/tools/src/maple_loader/src/processing/app/Base.java new file mode 100644 index 0000000..c3a174d --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/Base.java @@ -0,0 +1,53 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2004-10 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2 + as published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app; + + +/** + * The base class for the main processing application. + * Primary role of this class is for platform identification and + * general interaction with the system (launching URLs, loading + * files and images, etc) that comes from that. + */ +public class Base { + + /** + * returns true if running on windows. + */ + static public boolean isWindows() { + //return PApplet.platform == PConstants.WINDOWS; + return System.getProperty("os.name").indexOf("Windows") != -1; + } + + + /** + * true if running on linux. + */ + static public boolean isLinux() { + //return PApplet.platform == PConstants.LINUX; + return System.getProperty("os.name").indexOf("Linux") != -1; + } + + + +} diff --git a/tools/src/maple_loader/src/processing/app/Preferences.java b/tools/src/maple_loader/src/processing/app/Preferences.java new file mode 100644 index 0000000..6368e38 --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/Preferences.java @@ -0,0 +1,157 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2004-09 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app; + +import java.io.*; +import java.util.*; + + +/** + * Storage class for user preferences and environment settings. + *

+ * This class no longer uses the Properties class, since + * properties files are iso8859-1, which is highly likely to + * be a problem when trying to save sketch folders and locations. + *

+ * The GUI portion in here is really ugly, as it uses exact layout. This was + * done in frustration one evening (and pre-Swing), but that's long since past, + * and it should all be moved to a proper swing layout like BoxLayout. + *

+ * This is very poorly put together, that the preferences panel and the actual + * preferences i/o is part of the same code. But there hasn't yet been a + * compelling reason to bother with the separation aside from concern about + * being lectured by strangers who feel that it doesn't look like what they + * learned in CS class. + *

+ * Would also be possible to change this to use the Java Preferences API. + * Some useful articles + * here and + * here. + * However, haven't implemented this yet for lack of time, but more + * importantly, because it would entail writing to the registry (on Windows), + * or an obscure file location (on Mac OS X) and make it far more difficult to + * find the preferences to tweak them by hand (no! stay out of regedit!) + * or to reset the preferences by simply deleting the preferences.txt file. + */ +public class Preferences { + + // what to call the feller + + static final String PREFS_FILE = "preferences.txt"; + + + // prompt text stuff + + static final String PROMPT_YES = "Yes"; + static final String PROMPT_NO = "No"; + static final String PROMPT_CANCEL = "Cancel"; + static final String PROMPT_OK = "OK"; + static final String PROMPT_BROWSE = "Browse"; + + /** + * Standardized width for buttons. Mac OS X 10.3 wants 70 as its default, + * Windows XP needs 66, and my Ubuntu machine needs 80+, so 80 seems proper. + */ + static public int BUTTON_WIDTH = 80; + + /** + * Standardized button height. Mac OS X 10.3 (Java 1.4) wants 29, + * presumably because it now includes the blue border, where it didn't + * in Java 1.3. Windows XP only wants 23 (not sure what default Linux + * would be). Because of the disparity, on Mac OS X, it will be set + * inside a static block. + */ + static public int BUTTON_HEIGHT = 24; + + // value for the size bars, buttons, etc + + static final int GRID_SIZE = 33; + + + // indents and spacing standards. these probably need to be modified + // per platform as well, since macosx is so huge, windows is smaller, + // and linux is all over the map + + static final int GUI_BIG = 13; + static final int GUI_BETWEEN = 10; + static final int GUI_SMALL = 6; + + + + // data model + + static Hashtable table = new Hashtable();; + static File preferencesFile; + + + static protected void init(String commandLinePrefs) { + + + } + + + public Preferences() { + + } + + // ................................................................. + + // ................................................................. + + // ................................................................. + + // ................................................................. + + + + static public String get(String attribute) { + return (String) table.get(attribute); + } + + static public void set(String attribute, String value) { + table.put(attribute, value); + } + + + static public boolean getBoolean(String attribute) { + String value = get(attribute); + return (new Boolean(value)).booleanValue(); + } + + + static public void setBoolean(String attribute, boolean value) { + set(attribute, value ? "true" : "false"); + } + + + static public int getInteger(String attribute) { + return Integer.parseInt(get(attribute)); + } + + + static public void setInteger(String key, int value) { + set(key, String.valueOf(value)); + } + +} diff --git a/tools/src/maple_loader/src/processing/app/Serial.java b/tools/src/maple_loader/src/processing/app/Serial.java new file mode 100644 index 0000000..04566a7 --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/Serial.java @@ -0,0 +1,527 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + PSerial - class for serial port goodness + Part of the Processing project - http://processing.org + + Copyright (c) 2004 Ben Fry & Casey Reas + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +package processing.app; +//import processing.core.*; + + +import java.io.*; +import java.text.MessageFormat; +import java.util.*; +import jssc.SerialPort; +import jssc.SerialPortEvent; +import jssc.SerialPortEventListener; +import jssc.SerialPortException; +import jssc.SerialPortList; +import processing.app.debug.MessageConsumer; + + +public class Serial implements SerialPortEventListener { + + //PApplet parent; + + // properties can be passed in for default values + // otherwise defaults to 9600 N81 + + // these could be made static, which might be a solution + // for the classloading problem.. because if code ran again, + // the static class would have an object that could be closed + + SerialPort port; + + int rate; + int parity; + int databits; + int stopbits; + boolean monitor = false; + + // read buffer and streams + + InputStream input; + OutputStream output; + + byte buffer[] = new byte[32768]; + int bufferIndex; + int bufferLast; + + MessageConsumer consumer; + + public Serial(boolean monitor) throws SerialException { + this(Preferences.get("serial.port"), + Preferences.getInteger("serial.debug_rate"), + Preferences.get("serial.parity").charAt(0), + Preferences.getInteger("serial.databits"), + new Float(Preferences.get("serial.stopbits")).floatValue()); + this.monitor = monitor; + } + + public Serial() throws SerialException { + this(Preferences.get("serial.port"), + Preferences.getInteger("serial.debug_rate"), + Preferences.get("serial.parity").charAt(0), + Preferences.getInteger("serial.databits"), + new Float(Preferences.get("serial.stopbits")).floatValue()); + } + + public Serial(int irate) throws SerialException { + this(Preferences.get("serial.port"), irate, + Preferences.get("serial.parity").charAt(0), + Preferences.getInteger("serial.databits"), + new Float(Preferences.get("serial.stopbits")).floatValue()); + } + + public Serial(String iname, int irate) throws SerialException { + this(iname, irate, Preferences.get("serial.parity").charAt(0), + Preferences.getInteger("serial.databits"), + new Float(Preferences.get("serial.stopbits")).floatValue()); + } + + public Serial(String iname) throws SerialException { + this(iname, Preferences.getInteger("serial.debug_rate"), + Preferences.get("serial.parity").charAt(0), + Preferences.getInteger("serial.databits"), + new Float(Preferences.get("serial.stopbits")).floatValue()); + } + + public Serial(String iname, int irate, + char iparity, int idatabits, float istopbits) + throws SerialException { + //if (port != null) port.close(); + //this.parent = parent; + //parent.attach(this); + + this.rate = irate; + + parity = SerialPort.PARITY_NONE; + if (iparity == 'E') parity = SerialPort.PARITY_EVEN; + if (iparity == 'O') parity = SerialPort.PARITY_ODD; + + this.databits = idatabits; + + stopbits = SerialPort.STOPBITS_1; + if (istopbits == 1.5f) stopbits = SerialPort.STOPBITS_1_5; + if (istopbits == 2) stopbits = SerialPort.STOPBITS_2; + + try { + port = new SerialPort(iname); + port.openPort(); + port.setParams(rate, databits, stopbits, parity, true, true); + port.addEventListener(this); + } catch (Exception e) { + throw new SerialException(MessageFormat.format("Error opening serial port ''{0}''.", iname), e); + } + + if (port == null) { + throw new SerialException("Serial port '" + iname + "' not found. Did you select the right one from the Tools > Serial Port menu?"); + } + } + + + public void setup() { + //parent.registerCall(this, DISPOSE); + } + + public void dispose() throws IOException { + if (port != null) { + try { + if (port.isOpened()) { + port.closePort(); // close the port + } + } catch (SerialPortException e) { + throw new IOException(e); + } finally { + port = null; + } + } + } + + public void addListener(MessageConsumer consumer) { + this.consumer = consumer; + } + + public synchronized void serialEvent(SerialPortEvent serialEvent) { + if (serialEvent.isRXCHAR()) { + try { + byte[] buf = port.readBytes(serialEvent.getEventValue()); + if (buf.length > 0) { + if (bufferLast == buffer.length) { + byte temp[] = new byte[bufferLast << 1]; + System.arraycopy(buffer, 0, temp, 0, bufferLast); + buffer = temp; + } + if (monitor) { + System.out.print(new String(buf)); + } + if (this.consumer != null) { + this.consumer.message(new String(buf)); + } + } + } catch (SerialPortException e) { + errorMessage("serialEvent", e); + } + } + } + + + /** + * Returns the number of bytes that have been read from serial + * and are waiting to be dealt with by the user. + */ + public synchronized int available() { + return (bufferLast - bufferIndex); + } + + + /** + * Ignore all the bytes read so far and empty the buffer. + */ + public synchronized void clear() { + bufferLast = 0; + bufferIndex = 0; + } + + + /** + * Returns a number between 0 and 255 for the next byte that's + * waiting in the buffer. + * Returns -1 if there was no byte (although the user should + * first check available() to see if things are ready to avoid this) + */ + public synchronized int read() { + if (bufferIndex == bufferLast) return -1; + + int outgoing = buffer[bufferIndex++] & 0xff; + if (bufferIndex == bufferLast) { // rewind + bufferIndex = 0; + bufferLast = 0; + } + return outgoing; + } + + + /** + * Returns the next byte in the buffer as a char. + * Returns -1, or 0xffff, if nothing is there. + */ + public synchronized char readChar() { + if (bufferIndex == bufferLast) return (char)(-1); + return (char) read(); + } + + + /** + * Return a byte array of anything that's in the serial buffer. + * Not particularly memory/speed efficient, because it creates + * a byte array on each read, but it's easier to use than + * readBytes(byte b[]) (see below). + */ + public synchronized byte[] readBytes() { + if (bufferIndex == bufferLast) return null; + + int length = bufferLast - bufferIndex; + byte outgoing[] = new byte[length]; + System.arraycopy(buffer, bufferIndex, outgoing, 0, length); + + bufferIndex = 0; // rewind + bufferLast = 0; + return outgoing; + } + + + /** + * Grab whatever is in the serial buffer, and stuff it into a + * byte buffer passed in by the user. This is more memory/time + * efficient than readBytes() returning a byte[] array. + *

+ * Returns an int for how many bytes were read. If more bytes + * are available than can fit into the byte array, only those + * that will fit are read. + */ + public synchronized int readBytes(byte outgoing[]) { + if (bufferIndex == bufferLast) return 0; + + int length = bufferLast - bufferIndex; + if (length > outgoing.length) length = outgoing.length; + System.arraycopy(buffer, bufferIndex, outgoing, 0, length); + + bufferIndex += length; + if (bufferIndex == bufferLast) { + bufferIndex = 0; // rewind + bufferLast = 0; + } + return length; + } + + + /** + * Reads from the serial port into a buffer of bytes up to and + * including a particular character. If the character isn't in + * the serial buffer, then 'null' is returned. + */ + public synchronized byte[] readBytesUntil(int interesting) { + if (bufferIndex == bufferLast) return null; + byte what = (byte)interesting; + + int found = -1; + for (int k = bufferIndex; k < bufferLast; k++) { + if (buffer[k] == what) { + found = k; + break; + } + } + if (found == -1) return null; + + int length = found - bufferIndex + 1; + byte outgoing[] = new byte[length]; + System.arraycopy(buffer, bufferIndex, outgoing, 0, length); + + bufferIndex = 0; // rewind + bufferLast = 0; + return outgoing; + } + + + /** + * Reads from the serial port into a buffer of bytes until a + * particular character. If the character isn't in the serial + * buffer, then 'null' is returned. + *

+ * If outgoing[] is not big enough, then -1 is returned, + * and an error message is printed on the console. + * If nothing is in the buffer, zero is returned. + * If 'interesting' byte is not in the buffer, then 0 is returned. + */ + public synchronized int readBytesUntil(int interesting, byte outgoing[]) { + if (bufferIndex == bufferLast) return 0; + byte what = (byte)interesting; + + int found = -1; + for (int k = bufferIndex; k < bufferLast; k++) { + if (buffer[k] == what) { + found = k; + break; + } + } + if (found == -1) return 0; + + int length = found - bufferIndex + 1; + if (length > outgoing.length) { + System.err.println("readBytesUntil() byte buffer is" + + " too small for the " + length + + " bytes up to and including char " + interesting); + return -1; + } + //byte outgoing[] = new byte[length]; + System.arraycopy(buffer, bufferIndex, outgoing, 0, length); + + bufferIndex += length; + if (bufferIndex == bufferLast) { + bufferIndex = 0; // rewind + bufferLast = 0; + } + return length; + } + + + /** + * Return whatever has been read from the serial port so far + * as a String. It assumes that the incoming characters are ASCII. + *

+ * If you want to move Unicode data, you can first convert the + * String to a byte stream in the representation of your choice + * (i.e. UTF8 or two-byte Unicode data), and send it as a byte array. + */ + public synchronized String readString() { + if (bufferIndex == bufferLast) return null; + return new String(readBytes()); + } + + + /** + * Combination of readBytesUntil and readString. See caveats in + * each function. Returns null if it still hasn't found what + * you're looking for. + *

+ * If you want to move Unicode data, you can first convert the + * String to a byte stream in the representation of your choice + * (i.e. UTF8 or two-byte Unicode data), and send it as a byte array. + */ + public synchronized String readStringUntil(int interesting) { + byte b[] = readBytesUntil(interesting); + if (b == null) return null; + return new String(b); + } + + + /** + * This will handle both ints, bytes and chars transparently. + */ + public void write(int what) { // will also cover char + try { + port.writeInt(what & 0xff); + } catch (SerialPortException e) { + errorMessage("write", e); + } + } + + + public void write(byte bytes[]) { + try { + port.writeBytes(bytes); + } catch (SerialPortException e) { + errorMessage("write", e); + } + } + + + /** + * Write a String to the output. Note that this doesn't account + * for Unicode (two bytes per char), nor will it send UTF8 + * characters.. It assumes that you mean to send a byte buffer + * (most often the case for networking and serial i/o) and + * will only use the bottom 8 bits of each char in the string. + * (Meaning that internally it uses String.getBytes) + *

+ * If you want to move Unicode data, you can first convert the + * String to a byte stream in the representation of your choice + * (i.e. UTF8 or two-byte Unicode data), and send it as a byte array. + */ + public void write(String what) { + write(what.getBytes()); + } + + public void setDTR(boolean state) { + try { + port.setDTR(state); + } catch (SerialPortException e) { + errorMessage("setDTR", e); + } + } + + public void setRTS(boolean state) { + try { + port.setRTS(state); + } catch (SerialPortException e) { + errorMessage("setRTS", e); + } + } + + static public List list() { + return Arrays.asList(SerialPortList.getPortNames()); + } + + + /** + * General error reporting, all corraled here just in case + * I think of something slightly more intelligent to do. + */ + static public void errorMessage(String where, Throwable e) { + System.err.println("Error inside Serial." + where + "()"); + e.printStackTrace(); + } +} + + + /* + class SerialMenuListener implements ItemListener { + //public SerialMenuListener() { } + + public void itemStateChanged(ItemEvent e) { + int count = serialMenu.getItemCount(); + for (int i = 0; i < count; i++) { + ((CheckboxMenuItem)serialMenu.getItem(i)).setState(false); + } + CheckboxMenuItem item = (CheckboxMenuItem)e.getSource(); + item.setState(true); + String name = item.getLabel(); + //System.out.println(item.getLabel()); + PdeBase.properties.put("serial.port", name); + //System.out.println("set to " + get("serial.port")); + } + } + */ + + + /* + protected Vector buildPortList() { + // get list of names for serial ports + // have the default port checked (if present) + Vector list = new Vector(); + + //SerialMenuListener listener = new SerialMenuListener(); + boolean problem = false; + + // if this is failing, it may be because + // lib/javax.comm.properties is missing. + // java is weird about how it searches for java.comm.properties + // so it tends to be very fragile. i.e. quotes in the CLASSPATH + // environment variable will hose things. + try { + //System.out.println("building port list"); + Enumeration portList = CommPortIdentifier.getPortIdentifiers(); + while (portList.hasMoreElements()) { + CommPortIdentifier portId = + (CommPortIdentifier) portList.nextElement(); + //System.out.println(portId); + + if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { + //if (portId.getName().equals(port)) { + String name = portId.getName(); + //CheckboxMenuItem mi = + //new CheckboxMenuItem(name, name.equals(defaultName)); + + //mi.addItemListener(listener); + //serialMenu.add(mi); + list.addElement(name); + } + } + } catch (UnsatisfiedLinkError e) { + e.printStackTrace(); + problem = true; + + } catch (Exception e) { + System.out.println("exception building serial menu"); + e.printStackTrace(); + } + + //if (serialMenu.getItemCount() == 0) { + //System.out.println("dimming serial menu"); + //serialMenu.setEnabled(false); + //} + + // only warn them if this is the first time + if (problem && PdeBase.firstTime) { + JOptionPane.showMessageDialog(this, //frame, + "Serial port support not installed.\n" + + "Check the readme for instructions\n" + + "if you need to use the serial port. ", + "Serial Port Warning", + JOptionPane.WARNING_MESSAGE); + } + return list; + } + */ + + + diff --git a/tools/src/maple_loader/src/processing/app/SerialException.java b/tools/src/maple_loader/src/processing/app/SerialException.java new file mode 100644 index 0000000..525c240 --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/SerialException.java @@ -0,0 +1,39 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Copyright (c) 2007 David A. Mellis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app; + +public class SerialException extends Exception { + public SerialException() { + super(); + } + + public SerialException(String message) { + super(message); + } + + public SerialException(String message, Throwable cause) { + super(message, cause); + } + + public SerialException(Throwable cause) { + super(cause); + } +} diff --git a/tools/src/maple_loader/src/processing/app/debug/MessageConsumer.java b/tools/src/maple_loader/src/processing/app/debug/MessageConsumer.java new file mode 100644 index 0000000..5e20429 --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/debug/MessageConsumer.java @@ -0,0 +1,42 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2004-06 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app.debug; + + +/** + * Interface for dealing with parser/compiler output. + *

+ * Different instances of MessageStream need to do different things with + * messages. In particular, a stream instance used for parsing output from + * the compiler compiler has to interpret its messages differently than one + * parsing output from the runtime. + *

+ * Classes which consume messages and do something with them + * should implement this interface. + */ +public interface MessageConsumer { + + public void message(String s); + +} diff --git a/tools/src/maple_loader/src/processing/app/debug/MessageSiphon.java b/tools/src/maple_loader/src/processing/app/debug/MessageSiphon.java new file mode 100644 index 0000000..26901c3 --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/debug/MessageSiphon.java @@ -0,0 +1,104 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2004-06 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app.debug; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.SocketException; + +/** + * Slurps up messages from compiler. + */ +public class MessageSiphon implements Runnable { + + private final BufferedReader streamReader; + private final MessageConsumer consumer; + + private Thread thread; + private boolean canRun; + + public MessageSiphon(InputStream stream, MessageConsumer consumer) { + this.streamReader = new BufferedReader(new InputStreamReader(stream)); + this.consumer = consumer; + this.canRun = true; + + thread = new Thread(this); + // don't set priority too low, otherwise exceptions won't + // bubble up in time (i.e. compile errors have a weird delay) + //thread.setPriority(Thread.MIN_PRIORITY); + thread.setPriority(Thread.MAX_PRIORITY - 1); + thread.start(); + } + + + public void run() { + try { + // process data until we hit EOF; this will happily block + // (effectively sleeping the thread) until new data comes in. + // when the program is finally done, null will come through. + // + String currentLine; + while (canRun && (currentLine = streamReader.readLine()) != null) { + // \n is added again because readLine() strips it out + //EditorConsole.systemOut.println("messaging in"); + consumer.message(currentLine + "\n"); + //EditorConsole.systemOut.println("messaging out"); + } + //EditorConsole.systemOut.println("messaging thread done"); + } catch (NullPointerException npe) { + // Fairly common exception during shutdown + } catch (SocketException e) { + // socket has been close while we were wainting for data. nothing to see here, move along + } catch (Exception e) { + // On Linux and sometimes on Mac OS X, a "bad file descriptor" + // message comes up when closing an applet that's run externally. + // That message just gets supressed here.. + String mess = e.getMessage(); + if ((mess != null) && + (mess.indexOf("Bad file descriptor") != -1)) { + //if (e.getMessage().indexOf("Bad file descriptor") == -1) { + //System.err.println("MessageSiphon err " + e); + //e.printStackTrace(); + } else { + e.printStackTrace(); + } + } finally { + thread = null; + } + } + + // Wait until the MessageSiphon thread is complete. + public void join() throws java.lang.InterruptedException { + // Grab a temp copy in case another thread nulls the "thread" + // member variable + Thread t = thread; + if (t != null) t.join(); + } + + public void stop() { + this.canRun = false; + } + +} diff --git a/tools/src/maple_loader/src/processing/app/debug/RunnerException.java b/tools/src/maple_loader/src/processing/app/debug/RunnerException.java new file mode 100644 index 0000000..0a67d1e --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/debug/RunnerException.java @@ -0,0 +1,161 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2004-08 Ben Fry and Casey Reas + Copyright (c) 2001-04 Massachusetts Institute of Technology + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +package processing.app.debug; + + +/** + * An exception with a line number attached that occurs + * during either compile time or run time. + */ +@SuppressWarnings("serial") +public class RunnerException extends Exception { + protected String message; + protected int codeIndex; + protected int codeLine; + protected int codeColumn; + protected boolean showStackTrace; + + + public RunnerException(String message) { + this(message, true); + } + + public RunnerException(String message, boolean showStackTrace) { + this(message, -1, -1, -1, showStackTrace); + } + + public RunnerException(String message, int file, int line) { + this(message, file, line, -1, true); + } + + + public RunnerException(String message, int file, int line, int column) { + this(message, file, line, column, true); + } + + + public RunnerException(String message, int file, int line, int column, + boolean showStackTrace) { + this.message = message; + this.codeIndex = file; + this.codeLine = line; + this.codeColumn = column; + this.showStackTrace = showStackTrace; + } + + + public RunnerException(Exception e) { + super(e); + this.showStackTrace = true; + } + + /** + * Override getMessage() in Throwable, so that I can set + * the message text outside the constructor. + */ + public String getMessage() { + return message; + } + + + public void setMessage(String message) { + this.message = message; + } + + + public int getCodeIndex() { + return codeIndex; + } + + + public void setCodeIndex(int index) { + codeIndex = index; + } + + + public boolean hasCodeIndex() { + return codeIndex != -1; + } + + + public int getCodeLine() { + return codeLine; + } + + + public void setCodeLine(int line) { + this.codeLine = line; + } + + + public boolean hasCodeLine() { + return codeLine != -1; + } + + + public void setCodeColumn(int column) { + this.codeColumn = column; + } + + + public int getCodeColumn() { + return codeColumn; + } + + + public void showStackTrace() { + showStackTrace = true; + } + + + public void hideStackTrace() { + showStackTrace = false; + } + + + /** + * Nix the java.lang crap out of an exception message + * because it scares the children. + *

+ * This function must be static to be used with super() + * in each of the constructors above. + */ + /* + static public final String massage(String msg) { + if (msg.indexOf("java.lang.") == 0) { + //int dot = msg.lastIndexOf('.'); + msg = msg.substring("java.lang.".length()); + } + return msg; + //return (dot == -1) ? msg : msg.substring(dot+1); + } + */ + + + public void printStackTrace() { + if (showStackTrace) { + super.printStackTrace(); + } + } +} diff --git a/tools/src/maple_loader/src/processing/app/helpers/ProcessUtils.java b/tools/src/maple_loader/src/processing/app/helpers/ProcessUtils.java new file mode 100644 index 0000000..c023f58 --- /dev/null +++ b/tools/src/maple_loader/src/processing/app/helpers/ProcessUtils.java @@ -0,0 +1,32 @@ +package processing.app.helpers; + +//import processing.app.Base; + +import java.io.IOException; +import java.util.Map; + +import processing.app.Base; + +public class ProcessUtils { + + public static Process exec(String[] command) throws IOException { + // No problems on linux and mac + if (!Base.isWindows()) { + return Runtime.getRuntime().exec(command); + } + + // Brutal hack to workaround windows command line parsing. + // http://stackoverflow.com/questions/5969724/java-runtime-exec-fails-to-escape-characters-properly + // http://msdn.microsoft.com/en-us/library/a1y7w461.aspx + // http://bugs.sun.com/view_bug.do?bug_id=6468220 + // http://bugs.sun.com/view_bug.do?bug_id=6518827 + String[] cmdLine = new String[command.length]; + for (int i = 0; i < command.length; i++) + cmdLine[i] = command[i].replace("\"", "\\\""); + + ProcessBuilder pb = new ProcessBuilder(cmdLine); + Map env = pb.environment(); + env.put("CYGWIN", "nodosfilewarning"); + return pb.start(); + } +} From d5986cce76f42c927dcd0bee4204fa6839a386a9 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Mon, 20 Jul 2015 10:20:04 +1000 Subject: [PATCH 26/28] Added lagacy windows xp drivers --- .../maple-dfu/amd64/WdfCoInstaller01011.dll | Bin 0 -> 1795952 bytes .../maple-dfu/amd64/install-filter.exe | Bin 0 -> 44544 bytes .../win_xp_legacy/maple-dfu/amd64/libusb0.dll | Bin 0 -> 76384 bytes .../win_xp_legacy/maple-dfu/amd64/libusb0.sys | Bin 0 -> 52832 bytes .../maple-dfu/amd64/libusb0_x86.dll | Bin 0 -> 46592 bytes .../win_xp_legacy/maple-dfu/amd64/libusbK.dll | Bin 0 -> 99128 bytes .../win_xp_legacy/maple-dfu/amd64/libusbK.sys | Bin 0 -> 47928 bytes .../maple-dfu/amd64/libusbK_x86.dll | Bin 0 -> 84280 bytes .../maple-dfu/amd64/winusbcoinstaller2.dll | Bin 0 -> 1002728 bytes .../win_xp_legacy/maple-dfu/installer_x64.exe | Bin 0 -> 106496 bytes .../win_xp_legacy/maple-dfu/installer_x86.exe | Bin 0 -> 92672 bytes .../license/libusb0/installer_license.txt | 851 ++++++++++++++++++ .../win_xp_legacy/maple-dfu/usb_device.cat | Bin 0 -> 5943 bytes .../win_xp_legacy/maple-dfu/usb_device.inf | Bin 0 -> 8422 bytes .../maple-dfu/x86/WdfCoInstaller01011.dll | Bin 0 -> 1629040 bytes .../maple-dfu/x86/install-filter.exe | Bin 0 -> 46592 bytes .../win_xp_legacy/maple-dfu/x86/libusb0.dll | Bin 0 -> 46592 bytes .../win_xp_legacy/maple-dfu/x86/libusb0.sys | Bin 0 -> 42592 bytes .../maple-dfu/x86/libusb0_x86.dll | Bin 0 -> 67680 bytes .../win_xp_legacy/maple-dfu/x86/libusbK.dll | Bin 0 -> 84280 bytes .../win_xp_legacy/maple-dfu/x86/libusbK.sys | Bin 0 -> 42552 bytes .../maple-dfu/x86/winusbcoinstaller2.dll | Bin 0 -> 851176 bytes .../amd64/WdfCoInstaller01011.dll | Bin 0 -> 1795952 bytes .../maple-serial/amd64/install-filter.exe | Bin 0 -> 44544 bytes .../maple-serial/amd64/libusb0.dll | Bin 0 -> 76384 bytes .../maple-serial/amd64/libusb0.sys | Bin 0 -> 52832 bytes .../maple-serial/amd64/libusb0_x86.dll | Bin 0 -> 46592 bytes .../maple-serial/amd64/libusbK.dll | Bin 0 -> 99128 bytes .../maple-serial/amd64/libusbK.sys | Bin 0 -> 47928 bytes .../maple-serial/amd64/libusbK_x86.dll | Bin 0 -> 84280 bytes .../maple-serial/amd64/winusbcoinstaller2.dll | Bin 0 -> 1002728 bytes .../maple-serial/installer_x64.exe | Bin 0 -> 106496 bytes .../maple-serial/installer_x86.exe | Bin 0 -> 92672 bytes .../license/libusb0/installer_license.txt | 851 ++++++++++++++++++ .../win_xp_legacy/maple-serial/usb_device.cat | Bin 0 -> 1896 bytes .../win_xp_legacy/maple-serial/usb_device.inf | Bin 0 -> 2486 bytes .../maple-serial/x86/WdfCoInstaller01011.dll | Bin 0 -> 1629040 bytes .../maple-serial/x86/install-filter.exe | Bin 0 -> 46592 bytes .../maple-serial/x86/libusb0.dll | Bin 0 -> 46592 bytes .../maple-serial/x86/libusb0.sys | Bin 0 -> 42592 bytes .../maple-serial/x86/libusb0_x86.dll | Bin 0 -> 67680 bytes .../maple-serial/x86/libusbK.dll | Bin 0 -> 84280 bytes .../maple-serial/x86/libusbK.sys | Bin 0 -> 42552 bytes .../maple-serial/x86/winusbcoinstaller2.dll | Bin 0 -> 851176 bytes 44 files changed, 1702 insertions(+) create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/WdfCoInstaller01011.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/install-filter.exe create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/libusb0.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/libusb0.sys create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/libusb0_x86.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/libusbK.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/libusbK.sys create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/libusbK_x86.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/amd64/winusbcoinstaller2.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/installer_x64.exe create mode 100644 drivers/win/win_xp_legacy/maple-dfu/installer_x86.exe create mode 100644 drivers/win/win_xp_legacy/maple-dfu/license/libusb0/installer_license.txt create mode 100644 drivers/win/win_xp_legacy/maple-dfu/usb_device.cat create mode 100644 drivers/win/win_xp_legacy/maple-dfu/usb_device.inf create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/WdfCoInstaller01011.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/install-filter.exe create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/libusb0.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/libusb0.sys create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/libusb0_x86.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/libusbK.dll create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/libusbK.sys create mode 100644 drivers/win/win_xp_legacy/maple-dfu/x86/winusbcoinstaller2.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/WdfCoInstaller01011.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/install-filter.exe create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/libusb0.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/libusb0.sys create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/libusb0_x86.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/libusbK.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/libusbK.sys create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/libusbK_x86.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/amd64/winusbcoinstaller2.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/installer_x64.exe create mode 100644 drivers/win/win_xp_legacy/maple-serial/installer_x86.exe create mode 100644 drivers/win/win_xp_legacy/maple-serial/license/libusb0/installer_license.txt create mode 100644 drivers/win/win_xp_legacy/maple-serial/usb_device.cat create mode 100644 drivers/win/win_xp_legacy/maple-serial/usb_device.inf create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/WdfCoInstaller01011.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/install-filter.exe create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/libusb0.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/libusb0.sys create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/libusb0_x86.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/libusbK.dll create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/libusbK.sys create mode 100644 drivers/win/win_xp_legacy/maple-serial/x86/winusbcoinstaller2.dll diff --git a/drivers/win/win_xp_legacy/maple-dfu/amd64/WdfCoInstaller01011.dll b/drivers/win/win_xp_legacy/maple-dfu/amd64/WdfCoInstaller01011.dll new file mode 100644 index 0000000000000000000000000000000000000000..d49d29132e86b6f3374739df5764f66afa1a0765 GIT binary patch literal 1795952 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%0AB`TAEn=^N+|+!hd-aKmz372LTrXc{O? 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

0WL&5HWr1{=}=jAod<%;$Yio@AsTnF@Q9X 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̱h&WQ3m~90FGR$FaM{?^vx`?NC?PY%y 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≪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ξr# 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

P6tx%?`e8A_kD_-#6ui*Ku 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%0AryrAoK$I1$`W*WTX* zMx=Tka9BWkoiDIg3_isx4A%d)Z?Q;y*B!P>oo^nvKZ@T{G= zeEZk0l_h`a{rtKZBlcBl!7%LcowJDhh|pJ%B3KzUg;q_6G%^Dyz4$ViVO^l5DbhG;vc~O&qn5|bReZ}OT;l6DO{mY`L!-F z@-JOnVRX-XFUReHuQoQ4-4(uhK6$~pyx)o2uJqUVEJ^9E_vmbvb0Q37T{+A(KgL(u zdtiulU@E{MZ$2Ij)d6^3}tv z`5QvOulFJ^`3Bn}h)D7f8q}Iy?Mj(CO0djCV&G~qb(b3mlbklPb1I*AXO*IJKjP zi<-*^nxWm(z?CPIc7*UHz||HR$K^f! zOEK|uaZClYAEip?A*b@?=x3V!;2hT|>OzYP)_qHMMJ()U~|udBUs^;phxC8Q^l{TIPo)X>G?My zPEwbGIN7Xxr2715*9olea)Xp7)?Q3K=tkF9sJ$4AV6I>n0c?iG!v6w&91;wy>|ec3 z^56SsxX9FaWc%}{*6{0uR58LalBt2lSD!zH4l9K7`KiJqZBHMXI@EyM1LtTejQn`W zxFVI3#|#(^}Z|1LsxvP^o*0BwQDPj7e>Zj~hPd=2O?|TTmL! zT`78td6(K?bY(5={=*;==KL~SYm1s&XN+!aNKzt;%f9G(OCj$0<%m)7eUj~RJ3HD{ zd1hFmnX*WVxfx&-JJpJ6AxCd94`)Jat+5&z%^CaSmpt%(eQrf*J2F&0U)-i*sjMWI zH9zY&O-VY`?>KhS4Tk3$@@84S+F^b_3!CWtf57X*R;=d zhZ}kgr6!fu&oNNu1Z)jW2XaPQNXQhVDQDpTpP^ZQzr{R-_j)G3gIwq4CwOyAFfi=Gg~8ZC|aVR^|%PeXoziA%ok`qKtK`48;JKOz5}K#DV<3JUuMk8j_aoEIz86P2lzO$-#=W5sZrWNOtc zTx><{xw{NkmR@!CG&S4tD^)p^kj&Xt_A=W$E*0QNus9-W-~wasOXyxaGTzhcaHvvW)6RCcXV8&qxlxgQh`EZyS>c~L!m#-&~fhE zK{r~)WP{szQo9sCU|^-sK@8~ZXA9clDkIr5Qs5KT#>X;yY40>=?{{&#t+(glGCLiz zUR~-ekUXTqRr|69|07W#-m%t7vCwIY#v`PH>;C4m^JjU7-llgTv1y|}8LQpmXaefz z)b|g_=}9N!zIci+3O5iOSJgRFvHZ<6+C|fi(SR)CkQOngk&jo6=OX%Lr3Jv3%ly&X z?LqllZR=sO0j8167)3c2ciq;&HP+AmEx7LW_g7}AZU4DnfCcXba}BzRTOB5h3%qQ- z33!+`K|Z`J$mt~VfjgZM4@Eh>-4cVEb5r+@1yM{lo~<#(hD-Qb747ldc&@6c{1x6` z2Lq3CCRm1}7G*;QkId>PIOdb@=g8XT^jLkBWrhBm^^+tzZ>yYW@Yh20*II6t>qa)RY$hn7E-3`njvQ+lO9&DA4{tHzRHAD zQJ00s;dTjoW@R$pQKsd4@eU84jA0_(HOE1At`N^C1#GDS-u)~2o6-`q^Y}-tHud8? z&>J>2GdEcw+Lm_3b}mzJui7Ph|OjzL5o4$Q-#U zou%%h$?Wf*FrId9Y1aQXLTXO4^}Z~ZB`O*eg>eGDsn=|YNi(?Mvq6~_=~ER;G^pzI z?99{|$04+4D8@|JZGej>*VIvUc%_6?J{4OES%zPg2qECZuOExA1KaKT|)!OoNu*Ddf7tAk*r1*n;~LItqs|I6-Zy4`#{sXgP#^gEdQ46jU2#T44@;PPtzVw%Tg zUp-_bIPf>$_n;hH-RW-}jp*u*HJMUFedgiP14U_C8DaTz+%%h$>~xoOm{La|-vz7h zp_S*R>>p$w&rRjif3B$UL(Z*AG};gKFPNP#x~4J=cnrlNy4~p-ApEqV_Q{QGJbvZj z$!yOOf{t{|q}r%>3fTDy__^SHbS;|LcPw&mY?L;P9taWTnw5cvrWjfc1K&e4+KlwMm zZw#hKqG38mE}Zo}Z=&q=L$!BCZLe>a7{+3Lu?_VP&pmob@#2pBRUE$5&*4Ha!W<(mBjfP7F65fxS$6Za*gLUsw^UJf*N#sa zwU#vthHp~3%j>Nxi2&tYX>D~?QKkk`R+Tb?>xzh*6qk!OY7djsHnAEJSLcrXOWyrM z)+6xy*GCfKakTrg#SaFyD;Kqd&Iq)1Tdg{??Ek8Q?I#uFY~Ubi#pyDcx!RA0^-2@ zn|mn1ZS~H%8OIMEiN&KI9z^5_vSY?H>VHFnHS)&V2U1kc7`zv1Z;#yW1LwzofX|M& zUQ(_Q%3J6D<^Gr31@Z2I>;!(FG51ds!H`n<^Yl~Aa&R-(eh%8F^#7(>J&?^W*RP*W zs-L4i%EWH0U4xPDOs6$?zA+jaAYhl=HwCHckDkmj>N2$6X)o_sgZf-!x@!3%W`a?T zz^=d+16wWLvx%u7u& z&xc1WdsNsb>?C|w@8(19Lg-nXFz4I1ReMvfuf32$NV8p}&pmvGdO6kjJ5nz+^apag za2EUwT&fm9Mfb>MGkA1zq? z64OkHjh45`&`-B9RetOUQ0W`pyt*m&S=BSDGF&+!S<6eh<;P?t3;DI`R!>cQ_~u$Z zuBxEZ*p!kQ^OTIpv{WdIzAJ#5;t(J7e3~i!6SJm-jbQ+(17tV)k-AsXW}}L| z4I4a{t#ru%3I#o9wTMZoguwA$VMVmo=diT2ixsoSaSWRE4Aiq-xof!@yuY!h4&tLe z8C(HeNHFVUSH1XEf1gR}9dD>AJ9j8TnG}g?)ITdbkxKt$LRWv^CpFA5J@_fl%&|f( z6XLyg#D_{hOLH^rpq+%7@?`w7B`~kfkl(D#Y!oZJbZo`G4?>C^a*#alKs6OQt2`p* z0gf~;{ZtsqF&%*@HweLtEem$@Mau=2LtV3nKqTS6HP-KZADL%Y`OT#*rAau^N&^sM z+gzsekkjfUxOY%UKK|jd@$SU&j6(7h5nMvGz>VKFA#f~hpQwN}nSlfvsK+m5w0XCH zdR0H>DXdTH0qy3_|DSf)|C{#>7w?z8QP2>5&xnn-m zHZfTPvYLrC!2@g<4D26KpZEX2Ely1+X+yE<%{7FG$+5~e2ip++Zu)Aa%vkPQTkAds zf=gXT7q#@Xg;5!iW={LBKOD4Nt*Qwz?Fo$H8tms-%a!3eOE$&b6?X_@Ly-mcP!Uu4 zMeCrVacsskBaFi=u6(*{Z}pxx1Vqw)r#H?5#xlJP6dJUzL`HJg(t}^$-Wn#yCMp$j zsmcn~HZxLw$GT4=haMJ*$tMgi>dMm{Ye*z{v+1CtN=axfMvWt6RG;2p$luamj;)7I z>{%6+Qu$M`w=CroZVup5r(8bNNVuehiQsXE=0yB>6eOO zYM=)-|8{8Mk?jeGTEv{7>c1Mk-={4@*)|iFAi$GgmL+0 z5t{+S4zeR!lkI%<^>iPDe49CYYNuOjqflg&>9RYVkJ{Kk^=jRIa~MgL2}v8pZV_g@*qn%`$=3kcy?hGa_w#^()9eB40I7?K_YPBH(@alz)zbBo~?zew2BD6AN7@&~;90qvgbG=fdCN zv0i!Plp$(A>qPk;q_x`zTypO*jATTVCl_m(a+4FWtv>5DS+-7?9~E20Yc*{RMsQl} zA}=iqy>&ZVTvd#l@OI9nEw%h$N!^hv^2KxY=&4c&BduH!aH}Y-lJDB+EG~vGUeFbG z6t$+>Mw%4iTjX22?B{9dwv-k5<=ix+>DHuddqy7Ait{e`;Q;QvhCBXBzoINylVgLj z{q?P|}+5odXm0Lx;}!}#2J_@54%C!VhM z|KogLR|95Z_=$>Y_~S-ziQ+G-p8i7Fy(bV(^&r&s3ambKLwnHdL=P zM8Z97{9T3nvT>bcxDL?edbXUrL-#w2T*y3?#dp$VS>#fowzYot>D+C2mjOn7J^{j* z9@K{alb~RgZ)jtLZ9eemwVA`VG!$c#9u=|(@3m4;WZm5&mupqLaGhbM^ znSqyEzr85f$;WY+{^l?GH%{D`F5xdT&RQD0rQIE4XZ<;pCUZUm@ZkkD{i#sCMVmli z9#G7hoNL;!JbAMsTN&vH9ZZ~tiP&8H*-8wY84l!_;hc|U7W>PyXnO4X0J|>WadmQT zc=_>2e-=shC^eqaNnl5WRZhuFFZ5%Jx$j&Wr0-|lsYhga@J z#kJf9$Wo3w5dQ%9YC+i%3c$-@7Q^5b+nY|FKi{vNy6bQewr`Z5)*=TgX_OqCd7Uxwpn5t-{esZJmXpg zLjhYd2Zsl{%Y8Yi^}VP3)031Pl`F{QcM@$}^8B@qf^@S@{Lnq!1n);Wa!d=k zeCla7VFAD#hOCt=BC{*rn%q2)^C5i-d&#S6gNWe6dibwWGDtA6&;L%cDnL7urE&>% z$7DZFpMu%ymQU)VMhVPg(NcL{cBbMS;t(!c?gj;+-LR$ycW768463K6Yv(801q7K5 zHaW%t4@7X~9QIJ`QZIPhyT5zA5k5N&iEq;yyF{P9)hOb z5_1xu6xVi}XZVm6h2gbg6GgXihCke4I%iiEx4nt@xI1Hp^cHO|m&wExQ&_Q;_Yv|( z8V|YPdJTPl@SGJS2Q}1B+&<46uWL_!$(OiEqk~BdY1Ft1(XP8q1+M7!lQRfGhgxAb zhkbl&v{3ErGP~V&0{CBcxx^qUSZEI3pXO>fMyd~;HB$ok7DoEDwg;zAcpk7CM=@Vv zY#zLhJ%MG)lR}cC(*es4J-lZU2h3e^VXP}f8S}% zS!cA$Zdl!4Msz&QG3hjV+t}i-D06g7uZxgGGO!Z$2#^$6EDZ5D2Ti);xNK>_S2@*w z9;oRABxMaQ6u10pa$Js{ZXt)N{1Ll}x0VWIkoCCO#z4$BrINV?am&@j>*QDt%*j`; zJCT51-ThRnMaQjKER?yEdSAi~;C7C4Oj0vTctD{+x|=3|wanJP5$YNDAC9*rg$sed z#yCG{y^IwqiyHeMX5;w8hlC1b>4wSH>mEw}hLtg@`)=|Kbfip5XwT?~nsl67i9cu*n z*rUtB*1>%er$T0Yld+?ELu1}aoR?glpW-{)1u`8-H9gkn_=l3*GQn}lEv@;AGPB&; z*Bu;wW2p*-`5VZ;y7(#w=^HJ5Hcqta`*mDtN)kEIM&waA~D|`p@G%P#oC#=}H zpMgk&6%LDw{nIo^_gazP2wlG#i0}w#{O;s|18F=Vj(6wvlC|Z7%`5ouRCcG8JpLoR z=Tg)$KMg= zM)YG{f9$;goOL_7nBPDY zNx4N%toi&pBaHn?a8GlS8~6Jy({^CqlR`mPkDMtoB}^0BA0k7OAMzGxbdQJg&o{7Erg;X z`{S+F$-of(zLqV+Xk!B(JO5uD^0gL$iP}~!L&xJSv#}gcp6Z0x+4RWb@xRgCCKNDG z4Evvs1np)X>zN1osF%to2eeypl=`KLG>xlCn+L4-wOKzBJ}llpBfjR~X-bvq3v9wi zROy{_>bH7@i||~ejqj)~R+HQ%1cxR0 z1KMvt=;^X0rfQ0b;B=HsP&5dFRW%t*pu-z}ZRTp|GF$8?6nCjk0*1pn=QEB(l7_9X zV=#5-m6thgiAc-L5lz=Gbz3H~E2dyY3_vC2HuG0BEHN;ZU3~# z!z9^GLyt@ZvA;i!Nm6dF#O%#EYd^_kRG6(vd$C%Y=^rzefsdTD$R*(}8R0wBJeRbEv(4N?PI()WlRb|L$DjVJ`GkH*`9WSNH6i0K7qej7V3 z(bnd8vRiT4ewsbrBPK(4l5&2wz({!pu&}&9ASi!5DiwJf^h~5Zz;UpFGn_~d**5ia z`Iy=7yC7;f;@@RgMq-Px+TFYQR))Nmvn!s5sctyUi^TP9Il=Ty>cplLdcyh!eYkTM zK}sBLi*hTkcgM*FGR#67iUheq|0hRF@~l6RenXT(vb*J{%t=q6{aS&?{wEyt*2F~4 zJp{f95n3^qo}tp%MDMa4S)`z2uciCp2eEvcg%}kV0^Me7cuFztPQL{$XdqDgx9=JRa^9DZ4kh%AEGv%n!ntY$&$OBI+0|N-IC=P15_g0 zByylwKW)kT_>->I;t028q{wCB|z_qI10(XE8>y9M@0((vTxa|cbf8X zP9R}Qv?*rLa?VFgY)ypS>UPG>Xo%VNj$^b|d;)+_{T3CW$?{@13s1lwY_azz9T=%VtH} zIX!vff;OSkI|Li6%*^#7Oc@W{S2!nmlVld_)5GAC)^?eoa7exuL~R`J zFrFL0CdMwq!>$L&5V2b6JgB>TlP;BCeB>-ODF`-H(r3~ei!bW#esz&uD@pUPsNSi! z)nDY0by!5Y5GBBxZRAM3v(l9hTR*3)UN-D!54E5?J z@N78dcrR#B@}JRasoBSkfB9U%-Wi)nz*mMu(Y7YVSFOQ!@{f`+VD|i0vu0$8w1&?_*oBHw zJrt`TR9`}z#oY@J3(gC?8iK=z#$evyNF2>ryW>;DR1fF! z>MpdspJ&YWDY=B?mJ;d!{79E0Qtd76mvUBhq2DuDOmSwkU;D6y{WT1oassK@L{mFJ z=1@}HRzx*m%S0)`19p{2C*X*#{S@C~#9Cz75WQ*Sk|9aGy!yn0Zi*nHG|7%8ctzErIQn2El9Gk-}qV=8O=O3;9 zO~q~#ko6oq0^i+EQCWKy!1A(6_3@xUj?LcBNW`JIXphv8gV8DpZT zv3~LC0Nk4|V?y{MF1AtEt?Ws&uCr0+{7!77qTwYHml@CM3}L%r<}!t4isT5JyJQf) z$Vr_`4nI8$a_)xecH4F0YQ4nLWS;%0 z#6F~)3mz~;{cCTk*;@)1^~|0`QPo^%|FYH*J-#Q2qG(__J%+%s?&Mc7oZCq(Df62N z7*kvS+pej)2c2AMzl@m?#0I!r(+4z4Y<&;g?hXPz7+72o9a!)GwsA~qwa0HcmnPLl z-vWkS)va99IMw&ylF&z1Br0_WrKQ!*<$&TTSNdk)r9%wkae(gug}I(hoF%%}bL{(y zK~5fxiIIvn#;xCD9Pay|RyR$`c#J6~NT+$Lg!_7n)Z5E28%q1_G_QvD#mqiifz4d+ zN2##G#PGiBG>kPZPt%z_>G=GbH`4{_Np~UmM%JxkasU^~YrOu@cxOsmg^?5LYtP@PO7(E_#l(X*?l$HZ%PN=2P|i&(x*o zXt5C<7DNRhltI0UNT0%$_Rz9_`)Bs;&o(^R_Ucu$37Eg}9eq!%L?A@!4}c~s6=5-U zYrw@YJ6B$`*?5a7k@MTLk_=wyMCC45b}Zrk|M z-(jdZm-&$DmPI!JI-lp8Z&F|s1_3H@F=M4U;;?U3Lw-^N0{C!CSMl?R}F+0pWAHgTRrDBhbt;G z#?~#YJ{n83A-<=d7_fd#bs%^Ea#($kyS|*gzn1GvK-Xfdpf>Z&N?*^dp_sA*@o%5g z#Z(W)l5UeD9}Y4W6G!V`ABsJr#5Ueh|_@ilPewA3EDDP`x2uc3KnEPZWWx@ zh^XGQa!!IqrdG@mJPZBZQoeY&Y#whDJ$nZEyUC04OTU&-_0mz_Wox$|ymYU?dnBAM zB@{4$S<2}$H|^zyon65t%zuY&l#js85gRPn?~PoW{-JjJf2jQ*dIyUV`S)h}8^Q}r zA00Zwy&DS5-xn8fpd`TG1ZGfug}P}!`N{2ivI>N{J!=$^d$mcTSWi=5F$ zqr%RMdlmVBjA|!%cCkhQP6}CBYT4$dM30*Y)l>^nGs2RfL_0LN1x?~0n+qT?dbq-dt!r^By6*h0T!y1mSa64Vq1ARAjgJpA zwAM_j*X!4YWxRkj`j%N{uoU68tVGj|zJsFTh@4%r7&E;ZYmvPItV)#)6fe6%fuok; zy20Z@tNXn+lqu+$3}gN?A5R>+I6&OEzH9;4iUUzL2Y7h6V6$t{>0rAB{8eNMYlT88 zqpE!-_0E$+3pU~QTckXYWEjwX<>1(ctLKziC_WjhAAwMnq-X_e*g zkc=j_N`C5Ft&7^3;NL^K&Z$JH*znM|ksElC-TjgO*>5rU)y9N&Ri9uf&2p0d&inoi zBU|B56X8<42F{nr$=qbNZOe6{aA$&2isJGnPRx25a=uZSl>08^@+NnLDtYFQ;k$7{ zk6mObjnvoF9~+HFyfpFDO%+Zdc26ECb7lpeiKje}!|#Ee&smeHW5o*Hr-PqYve^m= z#H=k+B`hH)IpT^Tf3)bTmvT;cYw!mjRT`fXm1yQPe9WMiWB?+FbKORbaj=-2lDSEY z&3HI+-6_C2G#yu$!gDH^Ja_&Ef7V|{pZjqmQoxJB75!7?*J7^gvFQ7^9&7psytg`Q z)~;VoPnT|9&Z^!cpNm17?5%b`3NI}hsgyZm?p)RUjFy@iwtX@QzOmkX^TUL+0&E8` z9C_{z?(rMi9)i5YOS{~@Si19bp%OQrlqwmbnGRXbTGKNOhEA_B^s?K-_@4|VdEs}A z{J^X(z*Yk@Ze~O9!O~{`w4|K?PF;%)(m4wuQ1hf<$wQSmqg!0h0Wgd6TxBKx|vGqBSq9FWy|L5 zEUuO0r;AS_J52>4ukbxB#?{tHx48||g98#v6)4A|B#n-)`f2a$2WB;%iliE}ZGwgT zGC3ID;F7br_urgKfnCI%+Y!N-zl6pXj+E-AI@=#V3_~J->$ujb+y;_NDw2}^Zlz7h zoz!DocvY7N_8Fzd!-NE|N2^*9o$uz2Pyj3?H?4H}UE8kOLbF<2_les_SxW8Nud%mo z)EwW5n7i|!r~FzNKy>WnCnj(lt5tQ;s2aCRHi{|aKhoo5O?8;A*vjHg<;_~tks_X(suJtH7;Mxz zSQMN4Vq)yAaE?4TV{jqoEMTx&@*aft%Q0L)&<*_jT}hQdUD2`;^5o*7#co@ys#dLm zb4O5tN7vz*n3ejcXS1b!(sq|R+}nfMMt|||3PWYDdd7^Dil*C@W$jVH5{t`ishstq zr-CHndI31eX?(T!YQ)-+gZS=`<_A&yT#XoOjMVH z1@HU9hE)z>mRIrYRtH9c#wnIcF))%O-oa2K&FQ{-JbMa=rytPTovT*}s1(1Sf4Yeu zWfU;*?)e(%d=A53|1|Z__iIYn@W1ocA=&82y*8Ve;A*k4Q@?)F5o}5q*l~@6Pxipa z;fPgFxP14=|KI$;=Im^yERxl``q#Lb-1qohHRWnn2UieLSi^Z0mo{=+x;(?w*;}G( zx<7KC`f(BnzVma-gvmA5lBXS08}!8&MxDi}kE^SdK2yh$8*Z3FWa)I;S|gNAH*Om` z(b1o@QVJ<6m8}-WzR+Xq9aMl~Z>nz~(?S57;;hX{-(wbHw8{s%dUPm7btv20_Oh+% z%a&ps-RqEIdB>kC`cnY5X9@%(pcpGl7p3AMrNRBm#|nao>_v1ayW^U(cm@0OB0x+0A&l?eOA-Q+bDIp^Cuzzb6qc;!c;pOA%& zX__-#B)GxMtz(}*st)4Ah8X@PS5IC$*K@bTW^Oz2*xY+Yd33B#+FC~~a4J;w@it~j zbiJBWnS`26gH+>&27;-2`VX9^ni)FJh+cFrgHa8VIdlm`hbU2@N4gk$CMg-I^m;99 zMH2?B$RoH^R>*p{7T~lI*XV_ZNn%NDfvb)AH&m^rM!03k(<2ls9h$*lW{_;v9QHGFM`WBXkho=4f;6NOny#d|FcEXPtGQ5?MvUO_;@YUpz!!-VY5}w zM&W-c_VES*MVmRX(F{>T*AV;rweM@E^}X%4;Md-q2d%MrW1b&^TPHn@kRWbcHuyV< z58_7y0U!I`TVGbImfSF2(_oVd&72EBC%B_4(}-_n<=h^dsH5Une^dRFE;+A#K0FxY zZ!q&21o)2s7zwPvz*POfZl>s#PA8%N)7f$L-!2+=GGC_CzC81%dJAG2JSrB@Q1sL! z5R@z`{(J`kgnxaX4$BgpjJi84*R_iH6rN|3XP~mQO!bZ;9OFY?X`^pF)k$+@6B?kE zcB5stl^4hME1}Wdee7WGGuu#uivJCLa6r!Tppa{kcV(Ssi@Fd!+3JZ!!Vd~&FI7#6 zmPf4azRE+DRV?ifUEjCfTj${;{SAz28p7=fQGjeW(y%%^(=Hov(OyOE56YRu`??i0 zTDUmp{n<{`uZ?ArG=b9+L``iu)d1v+vCP5kcvzjG|Kgu+>IY?LX%RKMp=Z=AnjUPCdWWRN6>a zm1}4p^EBOxxU+TZFgl~*kBT>-K$nf{1ceeL{T(!FRW?mua)`GJp;sOFnn*M0pPY8F zCu!KW&&1&<7Z=cIy=PQZr>0Xrpgd(@UTf`?%1Xv{qJ5j=amslq3jrU`$em_3W*{>d zDr8>*Phq;&Mt9j5s-LiKc0#o02lNke*yK~NvY(YG`&%TNb0{z7az&tCy3%2s$6DGQ z(0!~w+vq{>w)cwx=+G-mrVMB?jq&^H`MORp1P0@cmyzB5$iFO&@PkxF(}g;xMEE9W{{UGw<#KiKgKDW+}caj?)I-(A+2$oCq* z)l^GLFW|RDiY!>jG1#?*GAOXflgl`^hE7lp+*H$BFXa{Gp|LbS%_x6%`Q5^zV!bXg{F0+ctt-^Rf=p;b_RU?^8h}G{&I_ELJQmOJ+G(3kYWT2pA=1>T zrR2s#n^NQkArZKVqI3#8MIk=nnD`C5v|aktaH(rOr0CWYs_usqY{n!q#2YKFFOPq# zyA^VtTsuGcg)1U8dPV-rPXY!dGJM_q0c6_;MtVv7-Cn@~{iRA7iiEyi61yAF(7 zu^uVkpj~hrd~x^79SCru--LGiUMbAl5SZB^2sXpo%xQ8o2{`XGQPm>e^j3^-wMvn& zR9>bSYd`{H$(@k;7@u(=yy^1l*!uNyDa{dkT%B8lUzYR%;o(lPd14-~hZ`M!J8b-R#yfcDMwiVS_1<_|mjNm-+#LMnXP^952O-{b=6d|T zLbWmiocnoPs_kWW^U&JvbLXD(W~3Vb`NL9R<0dCpw66ZPr*N*(5AN>tN(+a{B!7lx zcjgW?vB>OPVb+VB%t0dm@%`J6w%o63Mq7g?up0fJaS*TH6jQGJh>6z)JY)nvcdjv} zWj;O-3<53n(hIK%`+fWPV{?R$mcPJ7Gqz84J|}08CUlM48^orgTAo)g5L*Q{O z-tR~!j^~RLf^IMJH*hi^?}%fKBmp9=^;(m=yQ*>4c}c{u%kgz7eEO0G?!;Oqqk9c* zN;%zEb{v+FC!Y6<2SIBAURxIdsjmKk07^i$zXT3Ni}89>HUe#P)$1AdwcuO)ptGtc`Uu{-}p;ZP71?B*{KdVDhzB~8kjGO4q~=!YMb~9 znoz2u24vpag=Fqc9(#0P**+`Pm$4ziA)A4|IGl6Kk11%bysH@y+&U3IEOI{NBYb+U z1CB;yab#|D-R&T&RYhNanAUt8+*v?hZ>TYD|GDP`u3_};u}4sgcurLi^LjOGKaY%H zOD=9KJa5jOanhugb=1+NxAUV0X(6Z_^9IiRf>NA}T}&8iu^;om7rT-Qw_l8qp^pmn z_8QJVnqzZpX7iThUp~y>CZvw?1-0i&l1G=iTd73qNz7BV1RSJPdzgRR6laIHtbw>3 z2|xIpd&-JpwKSNPB8%OP3Ia&O&p6xpmdr939Ya5KFl-+p3f{YYfked+p91LG5qz~H z-wymxmh8AT*FrLZ&(I;|02~vM+pwbWXWfc$Zr?^&j0qo0OUu3$DhBA0=pf=N@nAPh zzR6&+7z7l@)MD*4j2Cwp4&9f+^$`u!lGqGz3wA0}*0QbhnITlF!P;Vvc!@I`on1UG zJ1>0GnT&H`QU+)?9AKR5>k&=WAA6sh0(&@O)6Ge&-<*Eb@4>lQaz2M!8#kaQznQJ4 zg$=CjuddvV!~Kor4L{g^XuA~?yzIgu6Gt2+zplSy%Pd}KL5V$=xeI{+NCR515~*pd z58phNyQ_&YJ6}?y$15Y}t}jKOBu*sB*PHIrN85|{#n^lL))+t9ISP^vDAO}cf<(oh zI!MUY&jZX}2rw{iFvK0ky=2>Jxt9NT3rd^7zi-T7Kfi-zAmwEy%VDG@kdliTySWwZ zRnz33dR_c9%m!K#g1-J5fhT~2f~>nf8MhxFx|NX|m5+|0y~bupyzG{0n|%|g#JMCGhT?8$tY~nOV zP?J&w*Q%|p8#sfq0b$wm2JycpdbFVCPUnC3U^2K~JL3kOHnDn2Y$`PRsg55c0N8G?xV?)>2R~#JV#po=9e;4xZnoj8Pfak$&fK8izquiu?)ZjQkge53qJJ zh$kJur{JBBH%W~!*!c0S@E|x4;`kt_X~}(qzg{l3o&JX%YeHB}qVq-n9jcCdHWdWa z=3(bIMUeNml7?;aT6AodAxf3`3Bt#HLr(gEOmsT8^fEVWP>ncmG z^B%bLf1yv}|NR@7G?bX9NFz}yj8XQ<)L3OT`mei+PtFUTTeHIM_K~IOEKn19_pwAy z3_2dA@7z5JBLl*0X;wvT%ODbx$e!{I0x80Iv`E~v9HtWIg-JFk#6iCK8I^xr8=*Yupb*18#R z6O9rZV9Iv097~%{l)J+4To%lY92e9bqSDLiUf^hCXhESYLbYKH6IQoz;yw|a&)cFsa(-}neyo@B>q4{%hbMt8 z#No{Ggk=mMGZ@rDd{mqP=X$#CILPFMv~V9&4&p;_Ff|jUHasEMp=yB*f^#xi{~2j$ ztJISLYLJc-l&cb4Fi}AnrP|{2x)m|Ji5$S>2&7>=VT2Tu62^eLC{G*(A@Mhi+p_hS zO2v3HzpmLI#oa~UiU=XMxGYozM7XKXSnwE0G8O#(juG2TI^_9)){2F z9uE0R2@I1j)_8Q_K>E{dSjp;h3 zD&n3LtvkFz&C64qjnePgaDtpaFO)Ls1rWqcu94#%ruy`$``z-inwu#^hQwXVG?VZo zk4>qcXvDakpprir#PDPs=VGA7Q&s@zW+=fJ_X6RBOS`E^V!+A5x=hE3wrZ#&8^~8o zyqJSOxehptsP67|5r9&l-az+G-dkunFgS~2|@&XOrB;%c* z$gSgu7io5UGjp#9gUT}sX-?n2|MUvmSjq61#aL`4A+@>w^w|~wrVN+Hg{cT64W;F+SML;6upK!X$7oJ5Yb6c0%bR>}oc0 zg@xVxGB*UQk#X2K4P*T53~|xWSF&mmsHFf$&LwxNw80GLsN&t8y0#oz=XA-|qvZ~J zH**HK9?SvI5>oft0^rSzbZ;b?LvyUW7p4K4APuYLDvolKo`Qk+cqAxjkK%O(0zB_E zTZ0iZ$LpWq1nGv6x#z{AgjWKjTx>OlR=h8k(Ref;muQ~jf)oN5ytikjL;#-9IO#!( z^0L3jQO*@mANNa*t@0lJFamJCS#szc16;@Kv3?)^iGds=h;#ch+wC{5Ii0V4o(FFG zxpV6?+fF++d;*^jiM0NtkB}c$RD-&l75qOnaubQEjI)37`-6@8qwC>_-!}*})qnBI zp-T_G!=445*(r5@iY31nzURMO(AZ;qi5=c&o!EZisIW07Bd#b~XLjE5T)oIvy~<$o zxov}eZQgmFsJg05y6FF-UgSQ=HIVngD!>+AjJP%bVf8pLu%>^}Pm28S+3`CFEPz~> zL$+!~qs8x5EYtOhG3N!-_Zjwufh$%#MuW*!jwM@ede~KMG${4RO4hmcK(yYohh%t; z^=e8#V{Ox$=EvS>OJWqAPh}=kjlDPQ?!YXOsm=EX-+G`a@UV?pIBJ6}rpjkuZ6xdA z@5_QkZd#cd-q^1$ra+w8afHllZ9nKvS?s`z*^>RKhY|nTz{`}xT!|IwD0VBENdy?P zxA!e(XJxpJwponk{^()reo&Q8nyv;_bJC=L>{D9OjjEppj(d8#A0NzKL{@Cqy~I=N zL}uF`_cq>){lU)@riGwnXL7-Pj1M|bGfgY9Oxo#EHLmj$E2Z)sPU>H58dPy5Sv~Z+ z-09FtfWhi`*>b~n`vwhk1pG*l2QPxdbEh}ArVF!fo6$_umx<8*bjpNH<4)$H7ZkGe z4~i!FC~Z7bb#pOIn_QL!0AuH^0z6Nb6u212NhXADAv~;2h6a;D1xj_qJzg`Mw=2=J zwD?+Oq2y5Wv6mNPgEzEeFb@9}tN}gk-HYzO0wtH3LhuVYX8q zfG&@_a@vGCL<%_(llp5$w4xNlWoJ_82NXw+I8kP1yDnsNhV1kOz~l9JR3v36E?CBJ zqEO^XxOM8iSCNi@+CJ8IK&#Lvto@46T>#=3U)R930dZ>Q?A@UI zT~dW+hhu%Nn7m`PR(zEU74EV`p(c#uG~tqE?5(*l`UYVr;+d zr!gf%2>)y;j8Y%h@n>!a4~WO_<{#NUgZ1>hVcUIb<2^&DZP&`Vd#MTBPtlS8eXU8J zpyk4a9w_ydHMv(>$#j*EL$yr!>SMIN(t*wY`k5^ItL2kKz3=)n4)6WiR-g*>kZ~3F ztkV^<>LVCuy z1-*poIaKOsv1EB=-G@(u^`cjf!X;&*ExK#i)PKkrjYcd_@EoRFmpE^e1?d9Nw5 z{NX6#1Foj=f4|Nepwv7nggHev2dwvC8I+B+TWh=M@Ufb(e_1U}_3ng+>9O^T;zl~E3YcL6A&`(j_lB06m z%_%oLrlT*RBPaBmA26kGrF zr{Flnm}?!&ln2C%ZBskR23o#y4zIN?u15+jx#%KiPU95d-z6LUI%aohb&M>?Ig-d( zS?rAOY|-zW$(%A2QN1^upc7R-deWD8WueWHq(wa-?2=<1H0t;0E8i!9V=j!<6Bwjl zLT)0~GejZrgjZ|tl9W(0ufRyx?-pxM4H~vERy? z3w-!fv$yg%4(lTYt?cMV>CWs5*|?66egrQ6Ah?EWxq8Hn<`Pg+xJt1yqjIe)@5+XuQfu_Ocjk)|t^6 z?V^b+dnboB{9!&ABp2)_xFBvgr%inxQ9X+`tiUX!tj}y z>EwyIeF@3;0e12|E8tJVKRROs!M=Z^`DD1!iN8!JVm%&Rr=>sTF?8ELsm;l9&_8&| z>l%0BQV!>RR#S5DYpl5Yi$cNToa^BAMdx=dnq=qK0SAfSpzPo$?Th}`8!u}N23Ni5 zrU!H~9_f0%bEMln-)-Un5a6dz`=1n}{Xh7wiv#=bsZ1tP2kOK7Myp)!{%N_>EgP3j zvCF|0!2f(5o*;egI?L(BQry(ruQAd!j>BGY!Sez#qKZ)gxDeP3l|1DvcLhi&l?s59sCACzGGPpn z#ubO(E4#@}v0|JZ-SebJ3YA607XGOmLm^k_{+v*Jfm1E=FCqQ_7yHA&=B33su|=Cu z=aw3q#Z*7RyL>~sdF%2fVcdGEiQNQUjywEP1*O=A5OME>JO$%P$Z$?Q17R_CLw-K) zUAg&U`l$sN-I;T$U06Om#o#Qd82HJ{$u{6)lOe*NLb#e8o;jh9OHUs` zt2FgDUAz~#{ZuGFnFIH67MS5G475knkda#NtT{HMA)!u$3_5f(84bhgKR7GtYP*OB z->s$9HhcD-%e*rBnogGK+C%5=TKx$9|*?(&ey3v_~CAJR)vrNWOGY&_-=rsHg( z&ru)CVlKeEUe>D2zOA;-d9T3zV<@M-sRdlGeBRoMY$sCcJ6}9t;RD^H-A_CZt8Gr! z(3hU88uSKupoXd*u83V9!N(*`jyhzD;6pFhjy0qdBT^?Nv$4c~N#OL?P=rR0IjbPi zGcXnZWxOxa^e^kIeVPReVw&qAiHa1s4#!|bie99#CzsWrWPY9N#&MI) zRc`g$nGpj(iRq_1i7UM_atD8?hrU&QEzE{a(7 zS0DbrS;ya4-_ZV(bxbusJ@q_`jN~V#;QlM;(m?fdh6uI=Z_c9Gb}9jupeLjOCS$7` zL+T@hXm6TjE@4rkNt8=t6eUZHPAz8tZuo8#3YU#9A`S%U`{Y%wF4Zhsz_g*{9a7zj z4Q(6tHmADMJ4fJlh7MA4r|fcCg#uOx>vl*vh!9lg)Cs%BW2PO?J(&dj?tMGs)0vs0 zeV2&R?y*tMWf4u={a)@wD44PIboVMn<&>@*w#B;%^_^ms-)PZczjJ0v1d-m;?W-FZ zXwK#6EF0r;tzN;`=U$8l1?bQST{|A)R7Q4?T7xv^A5lY2#JSAbAzT)#+?Mj(r+3TG z`B-2HP>_5hv6F~Jq?y0G4P#MqDPVWVY!V+yn$z`S?E!y~K?qxgaQOHBYBd4$$*{dX z5r9n~!J)9W?%g91L$V}gUn7Y}8y9S6xEm1TS!Q>xZJB~;*Wr&n?~TVC&V^;S`J!FA z{MFu5I!$0ftxE@Fc|a}XZTe`m^~>FkS2zj}k8(m&u4qsnnp$G-z~$xxUpZm#;U+Gp zHH2$%v)bpXs`paFY>eBBl0FrdwuJX9h=%5M_xI|3!n$%&P@2Twr48?oLX#Pb5R?8QKE3U>8T zx4xO}+(qeY!W&yyGc*RDlo|qOFXAt;9QBfU&GX>H<(c8Ft9Z8*eFE;Mw!jYJO4$qM zm+S%Us6c*|p0)DODHWfhleg!a55rk-&kBC@94A}Ip5rgbDI4Ec+zCv-sVOc%eF z`z0(zmky*A-gne04{K+;g%R#Ns?)#`=yMvdx&96wxH?ANYff$9- z`5plS!@EzXP4$l=fo1g%9<7G==}@Pom)8Uv-b!vE363qv&6l4TVJ&ZV#~Xufp_bpQ zKSB6(|J+OeKetpe@~yo;N@%}|*?M5h-uRw`Gn$om-Ub0WCTDjeGUFxVvq#;v8-#?N zo<(+HmOxl(Q5If7-TbAu=n}3XPKtqU2zR?;V-iYdZaw8@Ua_Hle&!(<85id)AZxg@ zs~UV&x^1~#4#>hX=cz_*yG5=5V0mI{!j)UbM&wR423RZCUGD-HBr)bnJq|E^ zCW(d}OaqYg&*)B;&Z~j6X{8;*XzEzHhKt;Fo{=Z|T4*^-=(8*{c~Gm$#IAx9n?&`~ zz4w7d(G+Q@0navdjy>W%?fFc@Az@=awl^Kc4yVr?o+k39rmX;QTVm+_!E(mbV~<=E zJgJC?Rxxt$mh~lEZlyEO14HLroUHzf<+5!%kGeYPjLv=Q;mIh8en|tzZKjLj51{0B zXXv2kLG%xUMqre~9*bnMjyHwc-r@`gd2)&W@Tq%bbZbLwEH|SgwIbjGjmw496*rwK zCxq-xa^6db3nULyzHxU@|3~W%RvRH2mXDorT2WA^S%FUp&L~sW)G-z3+n1NDPpMy^N|wQ+<3Xf@(7tDh9^SW>7Z87N z?YEsbMytB-65z+*R{VOD8`}azkUy?T9;?2j^krVXx(8o;aLM-s?hw`4o4zKxK6#tF z9{*y7On;<_jI2p`;h{Nnbf0RzMNkD6!vk7M*-qYTYE71NZb63z5)&P$`oG^Ne`l_pb_-R%b?n(XNV?_^Tb{lpA3TgVw+n%bcygW^a zsz=S`o|Z5ftE^-jbc1ZSKPUcBkr^`lqRY78=r?Yq?EH=axWv$qwFx@C-+WbEYuR3g zz?S@^VP76{-+-qa`uqL6GeQptZ^h~z=geV5!)S0vYspT3yj;bbYp#sO^sDU+>a;O; zbn08*v3#viwA7>GR{RCC=A$SKbgcl@2q@Fp$& zcF8>2D<9b)V|Wk}D9+l}WYTs(#k2>9N_Uw(-A8=D{Hwks*Q@0Y=^`Jg_@##APxuE~ zv3fG;1;K`6N3$3vomzOFbhgRXudGmjllWchSR0nS8eiWX^RamQfexl#;G7hR-DEn_ z7_bgDaSD!~L0zRla-!7mp71gej>M{yBo=>=SO8Kj)qmGj!tn^589QF7G)&vz2Uk9E zvXh23R`+*)pFeoHl+u)0Zt5(JW@>alt#pou7>uaw#%9`2cgwxtwWsuNO&;u!8HeOg z>du){Pl7j9Lq9unr1dVf!daRQu$haQP$DNm4Zj8JXn6Uc{-6p?Hl)NF4?VDE7d*KT zGc~$zOZ{F6M1Tw~wR3x@wS`}K=>!&nvOafue4b(_-egc1x;4F9<+kk(1omx=rKsX7 z*rt*@!1};&aD`k~o2bo_6|iPViF&+%7e3bW>!UXNR0^^EAm9#c;D4LYDBu;xQ@Wu$ z)PE0Gb3#1bbbT%hdJ;+^1>5bM4BgiJ%}Zo_c46Qd+ou}Ah^}BYwxpdpL(mg>;Xr1p z_!56v&Yr;!IY1^^I-QAX0Iyg2GyoQzl&y@FzT5Fy#bL$dcTSaa%j10fIRDy3wnajk z{5Af`7ph4qR3c3iV?tA;q?U7TK@Ws=b+J^zJ{zros(&UYF#+f{dJ%SkUls%yO8RSF z7ypW1wi;TPTB!5XZN=C@$MFEDs&B|mo9H|{%8{w6F@K;CxfSL&0&MigR+eW(pIm^i zu#q#o=y(s=^^iJdB`l8Olf_I?T*obp^CEkHB&TM`hCMdQb~kSD*eL9l-jA!rp)oOM z4~B$vck_k(v|E1CvyIm|{HtTIa`u`e<3({R?+iXj4U?sW>wsEK+Y zx1|h&x(DATB}1pl=lS@h>g?orSv5V5QDj^0+L_AkR;;$dv2{Tn$?uI9-U_@Q3%=fF z`vOWCGt9s1cZ`GfHm6h*K?9eYZ9ocp!a%JI`UKQJ5qwu_!*vnWsjde|I zqO0VjGHnJU_nh`&U~F2jS$wkovT;uE&M-GrJ-y)-P+*}_Oq|-mO|NcOddS8{O9`MYRk0xMROYzjza)MaD+ehd?^Q0(eU>=M)GNm1E_O01r(_hA2 zTNoY;OrD5m&na#E|5oxuU|>2i7-7c$dJe$B1eb@=SH0oy+-q8I%e&tyr`j=>K_r3K z4q?HbSVx`}XH(xc=^w=-e8mEL9#-8RT4zq5-D&EgS^t7Z@q2jc`g!(vp?+#MF+SL@ zOa7Fx_jx8L@2OtNm#n?!j}Hy{>8xK6W8JRG4yqvUc9x7H?#i zBWk9$mBua?7jMy^;ew;$Y_Zs403k z=e88{5ys#+rFi(xD=+2P8^^qduVPn>6Le4r4AKk!#>Sy|3rSe^jGl;$2G$mQ#Z3}( zE}tSc7Uhlh-v|7H(^qO|5MzI#o$}Fvu5^{RLgK2YlP0s}Sx)LA$dG}yAeOedA9WADp})TJ z6JyNJKxPoxyMza^M2Me+1e3TL))$}m0z$&;+-0+$aa^&uCdlarqfA>1I;D^==LVYvGN7HzujeaC;pv0^umZe8ihpVcG~aI7 zb~`QGV-kzE%esRGUkp>cNa=$#r*ke%HTYf&yg>XP5{tcsF=Wx}4o|L6N2~u2EdiJ* zMt%T*LrZPFQ+TG&*6p3{*tYGYW4mM9ww)(VI=0P@ZM$RJwrxDY*Z;Nld#!ixZynrq zd>>TJ>sPbJ7&Di$#z{dtp`|k7G#FBGORM@82Jq&c5uhCDn72$-yU?1p*yHVVJViK* zc!k<%H+QVv_Oao^;)|6Vp{txxExl$FKJSyhHRhfK)RqB^Qh|PYDCY6e#vIR~AQq(i zEil-stTH#HE5=pmZT}%(*N5PX9>*Wvkudh+_o}VH6XyOFa7Js*I1?!(=u?Fz`9r~< zV&5c7YUi1lU)kHqo%K}o{K%8xr=mz&`)RhOL<42r2QN1EoqEjtyzYeSRtVFzY z%1WVX|Hx@=p8ga|pq!@)GD|dVUY}yMQEr3Rpmv6}@|wUdhr+oYDsv4}r+qscr+3Wi znl`NXvM~SbjH&3FE6=@SG(|}(hjOTnPjh~CD2Z2@g{UxK!b(BD5=Ay#NzIvUa_qMO zDW-~!jz&*+Z#YW=ugZU02A*oU)32n z?yPOmlYewH;Whv0XxJ&`Kc`y0*fH9sd#~((2aHhB(eL<#*$MKF+ibhsu&$@_`HEvR zVSARe*0?bad9mQfk6K^tU$6QT7|}ktynGv3f=gd_@~=5>La`#(U$2tH})Rj{bMdAPC3> zBaf>Ivj4m+RPPu`cGGp2PGX#oJdYp+1nQF&4E~YzyRrxly7u;K#OUm` zA32UlUAP{4sVHtWXA?p#4t0N+ZwqrtE3xdwA0@^q*86 z?cTH8d6AA?#R=SUyJs6Lk?~C!(*x*|Rm_#~-zB#l1xu&t2ME^=sj=b^BBw1o1Y&P< zbI<`{_;&0FG934YZf0iRlO;81hvlm~c8}pus47z>Tk?;@i=P~@$}~9{k-|Q-KL}!~ zFKxrUWNRr0PTO+BHz_=gxX|RJEqO;x0_D;rI%2~(a=-wQiWOs~y(&#*!Cp~84y~?q zt5IyI$kKU7E02=I({60gFs4t zRdEg_d(Jb@tQ%PpRY(1WCLn@YtGB_ z4=>cM0t_sSA-w;*vi{;eW+(Bw^1Io1D%q~PxNX_+o?m~-5oq1E`=O&eE9Ecp1(z7p+O4t7N<vYPqZmTQ=zGR5skN zz6XXw5-t%_59B5ZbfM=(gOv{I^deneq)Iv^8eK+anfut>ylml&!5LB?a_>>>HL+>V zwNJz4?ZREu_vvmdMb@mmt7VrbS|P9@r(hX5t?}+SMVrgqpZ(A`F_85#X^u@dXYQmy z8aP@{=iwgLROd(KP#_dk0+FM$hi9>BfwDE&O zY-&XAr8G%{DzxXzFOTSjhuZwb&v>n-a<*5NWefY;UOs8~A_T>IQLhKi9KT~)OmE8y zN&-5JQg!dI-wkYV`XQyAYBWoAFQ6o^5Z)2**AFeiJxVEdExxCxUf~HXdDJaRZtz2@ z>Q|P^XX(?HpigTIbZ$ft5UZOUj##m&QfMc_bB4X>%U`(%1;u61BzLJ)$Eymwi3K*f zL#nd9>O8v*dz=4cG89{;Cl{pMyqt@cf4KI_LD#Hl>EjD2Y&De@fds`LPIce6jrM?o zz}plyh;5$4PuIrGieJ*~S?c{0A1~1r| z;4tNbeAn*go$+CN65bz%sM3So-WS5d^1k*$B>FZ;40)j9%TnNMkLwKhhvwe~v)o_S z{XXY{+aPT&pYX1(YUN)78lUa~_%E46*S-hy8!fW#lfuFb>3hhm%39l}JrL~QbYlFd zMbF;dhPv)2b{yeRK?DtWEI?R62>rjNqxpy49LdU`5`0huv{Sh+$yWD27}Y^HJ{c(| zXvx)IEAGP{DR;+jIIr*T>x?`WD%qaKr(wTWk&tUM^-|n);I%M|^$_g5mBwe17~ zeV?lX`O7PW$NDu6INX#T$oHO$rIcXVRr!5>Kq3AebSs{`QAu7Tfof_@9_ZicOUEAieNpp^J;u@KcCwZEAQzoo|g{vu8quCUySIKWF&a5pSAVD zlL_0^Yij1APs{JCubhYOKIFO@BIik5QUK(wDWaDn1bn|<709xuP1SlApW)ecdA~LR zveUR?Cn@9y(7T8%KgHGMchc&4vDmF(ciTVuajw1>qo{)q!p^Fvw>XNpOO{nNG8Ubj1=RwL7jRu1HRrA%XCH{cTO$9YC|mq1g{tp=b!{?? z>?p`J&toGhpTsJp&s%{vo5Ni*d*Rs4`^Y0$B7as|9|2B-=0BpA-=iVkE!7Q$`~npT z;8ezmLNS?WO9TOan}EI4g4}f6XVh8occs+_Po3}w?mE5Fdwo9$><&HOi9aCOOJAee z%#FM~b{9U?L&((MBQ*Pbjzt)kEA`LTqj;?2yAjm3FlBk}w~FtDcb|DO(8~QtV-23-42D3lNr4KF z#$TMJuUPQgQde%_Ad|uH;-Pc01NIAbV- zDL^^%QMy;Y^K9gaIC@!Gk2$mXcwNoK7t&u6L2OIV_0*504Mo=1YTs|gDo1BJ=DIgP}T$~c1Z@nWsx;A1{ z7^$Gq~E`JGGToY->&0xm8&(mdx`lA7FA3i1UUA3sa#d96yyy!YP|-zxb_scZNtZ z>E`2s(2prEHX1aydwbR{<};?qnH2A7L-vuNr&g!ugKg|un&5dKcfl<&v*3)Kzk&JV zsq8j(yLWFswr0(JLs)ig#J>03yR@CQU~}86<5;1oh(Pd1_DIbp z=5KtSuh*~1x@5m);*YiW;8ER)uXh`qPY2K7CEc(#9X8|I}!cOCySV4ty#A%4tX*1_f9LSXir>*2{Gw6$ot+dKR>fdey{k8v!F{fy`v=nKBY`BtWYfLf{ZLlQnv1pU zt9$AL#*K(Q$^;A^m_9*K15{$Pi;XN98Xpx{!m}LWKHh{ro zPNKFS3^?Bs!J;AHP|{SaPPpBxcxEQ`XcBo4#ibf9nWt4vhq5WBb6@YXySpOA=!7x7>Ltr#P zV6@n2p!yrbFYWpiLz=qpR=-Don$&A+hvC{gSDxygSY9 z*o!r%PEzexSSE+-i_BZEgt4@iHfLTcD=FYB!Uk*@*fF};=b#@&2Wvds+P50-czf7O z^a)2))$UQSe|dB~g;6-SrsB43N%HYcShDMo>vD3EZJG3?A$J4989R%Snllekqza0Q zb(42I2_bl<{*t~S_i+GCBIC>Y+u?RML8takKQw;r|kSpsaqU@GT&(0$l2khMQTlyq7=lxChuC`KTUc+PNDV+_rz;EWqVfN*l98wkLp(O$-GLSoak* z?g*FP+ZN{Nz;AnIF7d?XV6(9G4j^6xR%g&-5s{p#TZGHN;H76_Hl8meDXBZH=ZrF= zapKOisCQ{@3LUau&DZlioh|ufa++@+U&SqDROQA|*aMXy2skr;RdUGVpjl4l5#mjS zRa(yus!d@j^4ww@&|}7xbv7d4RS!bZHl)$9URu+5b+OoOCEnW!B=+WEiTdl zHOz6gZF!mtX!BzYS^Jg5=P^<~>-R%J)Un{u6VemD0=Y&`50L7*%w3#QZJFb}P?ey} zIEN4@W9S7F?N_MM1^?fy5VG1<|Q>5YKwl;8|9$wD#&2eNkaGSw`0zr8_IVu)OA}3Yi3Y7 zpvgQFe-RO#y09pM@ayjh=QD3ZWfrkYkz_^Wi+1~V5h?kKt9S##=C^`I`}Sysnj?7f z6oQ$-WBm#JZP3|XWaKxM9iBIZmg8ekZe4ze>1lzirH}Vwi&0F!69%wrnd`a9Ck25%$_4WF368>Z0oHM9Qz@6y@EL3UqIYJ zK>pzW{b2sL66fBqY4I-G(>!p$&&4>IyJ?gBm$ddafcAhXjZR|F1 z%je+fw5)5Z=V#uO1$H#~mZZS%fWUiN-U%!!GHla^`rc09ovpM4_VuWCN%vw|iRE!M zaT0HC*S7rgkw*0~Z3LMM7oI%@d-7owg(f5F4Ao#{w;lqtefKEuU42;Sg28r2`{4qQ z))sM?r19HC85<8)zd2Lv=(6utFw@vlmZff>#l7Ub&h^ONY!5NPXt7CdX6c;GpcY;h?BQtyHrW8LuP>R7RV)#I9 zjw@1tr8iFgO^9(f-&w|$E6kU;Wdz!E`Z{2pq`B^Ztm8!m zP*0IVV|y~IPIPSm6J&SB!y&froV7&)yW!&q_-1ES1QJza+cRg%qmowXbP~s{gh%t> zx`BX)oAu?3QZRdDwWN3!(Nc4#8>y=r-Uy43J)3?wA4}x&IQz;oz?)x>fO`CE-J&>y zK{n)lujJ1E1)#B@O~*qv(FfZET73LbtaZg;K90R9!zb+)4PLuK$tCM`Jv1)sxu(~& z6Tz2+8!vs#;Nljw|E{&%$uuFuU{7_S(6QT(Q(}hV%3_YK?hRVL$yf|l5&DTKic;3- z6+nTbZXTW!UKUmWy*!~fq)%W%VmL0kcll7ttphgD3QfRHE|p+L!zu*U2JH(RUQi2$ zDuX=*Da+bm+>Gn*zkfGaD#R2q9{!5YWI2p{zPaf|{nMK}s(Vucy&4-kH@cZ?qBZgz zTD!J?0$fLGsPWItl&@#GV&C7sm9U>M>MM{D@z1fA zq`p(N1DAxMl(zzYiPKB|4?T6nfnSdVawgtU1MI|=j-HHvk~Ndz6NWht4KIA~qV;&G z9=ZJ=K0^~Re=G3&H=F#sp-B(@cQF7{_`5lEpW5#Saf) z$3iw+v9C=<{~qmR7a4m(?u3nfo_gyh4z6>VMF#(!yqx2&N_(-M`fXCOd0nqQiKwod z{tG7MKHUTyiUL=uOrwh5k_0DB>rg2fg=Rk{U2eee6%y8>UX8q`Q(N13*Mwby7x}hG zSsEk(3-mTvF6j=bYW{8MM|G3LAXIf z7s1*tIOr%_qHSKXdf1&jcaWy{j>hk7e)}417&t#6?8EaA`iOyLrph|P-}B~OY!`TW zjA?FB>Ktq4-Rkn8I_28JyD+NEC?UwnQhAdUvr#f%qvNwWE4$Tg?6pb?GrZXBWllm@ z({zcS(-oy~-QFHF82DErOxpi1?-yA=3e7Kcd)4yRoBLz&=H(B#qr=>6F zYIc*89XY&<=BBd{VgHHmxkaFU`;vaX@G}ZsoFRONeyH=yxDPvtm7oCs`oc46<9`nV zKlU;U8C0%=wC!L|QdQ0kqEJSpZEeXLpuOs?dn?Hd7K(C(!uj);`9XO8vi<+f_p3o| zpyKlxB;lKE=dTxh>~cKduG5q~KJWE2oo_KbqWZ%Ud=)KAZLQti$c& zrH;Y?H$ce0&5!YG{y<-!O>>N0#vciE;ww4W;7vZ%QUY8TS66Ur1RrFoesG$%4Q%d_ zX0V`f?PFA0i1Ix17HJ=ZR&|%q8v8`Z~4I4mhDJ2cM_myBjXy( zmnaLQnWP=sOe+}DC#cvG29I_W~B)^tmQFNSiWEWeKJqK^iqF$&$*b# zrzM-q_?{?ZCaEW14oh8Algu6%YM|FH=^8G>^!RE{g}lvQVp^4d`_?QM=MXf`xPopbspKIMR;QZFSEX5CS-;m@g(hbbPvAhwhxLL z9-JI1f{^iT=TKmR>Q`Uox(?ksl>!k^+O5i{E1REDAYyK)Tb7hNF*097^uyxRoq}h6 z<}?=8auk#UzAX<6#5n#Y-_@P+B)4Xa0pF{A8TSs5o#8XfKqdqVc4ox*WYMr32X`as zZk?A8A0Q^;EEvsU&>;$Dyn0J+7n)=aa|A^zpcMpKnIM{3K zteS!xN4WY0@(>w-FjMxb@-Z1z)4!_!G7YUW?pnWk6AP^q^Ra80!>`uzVkh6X?cp%A z&R2^!X(^&;Z4(f)zl#3`72nspx<56BxPx8z%+o3V&F_l}?MUFjbK>28`la#7vM(vd z?-MY}u;ZsM33c*?)TZtyPdoAqEFnLBK9al^^1`Z$;(4mt6?)1w?^+Kz>U!QG`){iH zbfkE$0TLraoNF~PEr1II_i~f$t#ax1!D1GGy587W&xB&*D$#0I z$zxnHRc8qWeW~tU)6KG^vQnP0yjOu%_hE*s6&ZWQ*#I5P<6zd;uG$xosRm*pH%{684LVY)9 z9N8N^5PM5ffc}G9e~@cbf+FmjRd#MNa{q5yiHOi zT}S>q<8=zzDnP{hL>7&UqBtJ5l5$}Hm;25M30DPI*ui4@p%X;=l4qOtM}rgPZv^V` zc1#dVCou@;?oMRgB5j6fz>)tqlNE&UhzElYL}>^YX@C=JLJs zN)s?d8kYSom zK)%~YfWep8yOHKGC!*Z0oLCqbi>(6k{@PzW{)rtL08#?HDpqWH-bcxMbWZ`=cR#L(AKlD(O|#=haTmV)2(K$}9citrxFfpn~vvyC7k zA@|TFk}LkN3LB*vyZP6(ZjQoVR@Dye8O#Tx>vx5-Z`xXjEL?A(&Y4e-=Q1G>(|5>Z z@~iIQ$GL-sXs37`7^s9SEN%7jQU9TfvW(nSN>zm?r$k5+}Dk+0gv&Y^46VY1XbWRQAA7*yU?dFZXc zbFOb(hP)hm4StqmBIQ00M?mQ2hG^F`Obt*Jh)M66F#_t{BS6Ww1fWN ztHsJj?Rlf;JFDBc`0KDh2d?>w$fH5REH4u^vO8N0#BKo^X_}_~UsovtI=Y3_ND>&? zultKP<hh-bMi?V# zeA7l)^M@Rjt@8tNc$;`4tIu!cERgYLE;qko;=#;1bX8C`j5K#Uu|D!RkS6Vbx zEIUSomasRv8HOqy@g(u>{IM0Z|7uYiG^B{qsE=piFmZ2m__VNBQRj}kxr9;{v&+M) z+^8JdJ&P;@bA+k4ahF9Vg$wL5<*S!9w5(zckpRR7jv^LS@M!dwwc4~D$ zQgw9oBbHjFASM&pt=yeBrS2fB&6ducQ-`48~Ksk>0=XxK4#pCWp~Z7ECxR>c zPUVti7-`w}sW~5!&I1SE$kA=DO6d}(EDz(iYXlalzTVfP7+D6eI~7qBVUQMu*)qm!npZ2&HJA>q7|G+%ugdIio}S~+Zcqz1dYD?I0kLi_HGI>hCChsD}Sug8x4T1}uguZh2>XME!cZXUJr zDrHzKz4FQ}Ni6dm?3jpA(+le!F7uWdy{To>CPvw0MOu(1kS(k`FNCEh!p}ZAvz)`~ zQWsFMzh85Sq}}M)xqe_{B49Wql{WQ0lbmBsh-+Z~^?*6Vvew7@qSUtM_1Cakkur|+wDPFgO_Ho^}RxGla%!Toh zGbWdtQfUo&nJL*hb}Un3g0#?TqW1dw;Gk|hpz%Gl6Tw&LnR{-S-l2k%O`He>?zNwI z_&~**2JLw3sDE1yq{%zz-sWW}NPlax0g@79`||W<9Z}AmXXT{J+=2uKQR4@>cv|ZG z$>FbDf>cP8YtWNz0s6=539Zk5rt`DMGN0^nANhXFm(O&dhIz>LFm*K~O7QEK61wSU zy6)$@??a>X*jTwCzoxP;^haFTCuYL5ql(D~hvHceq~zV8z>h5Ee{FVu46uLAIj8#9 z3?bHa+Cy2ras-)JPpyoOdb)*9UUJO2@>!UtY24P zevslm&T5XLVP{f^d(Y<>Q!T`g5Gbv;DRYgZh2SDQ6I`FVkhJN~t=GBNu+ZJcw4Kh@ z8RgP-L}@KB@S%&3h*A?zuEI;8Yjs8*RXT&S6VK^_8A0YG)y(hBVP z(G)C!In)KMRQ)thC=eTPPxrM7sWWpf0sS>`eA*G~o_o(D zCC0p)`+0r?YLx0_7-h>nV`PykYMRboX_!zcjCzG1 z!4z;iSpw*u_ioPJq|qA(ZvW{8=DmoE!R$f zTF*`P;n=h5=A$0qKdQ{O5LVbOcsY2Ql)|&Gwv7teJAkh9YZ|dZ=AVa4kZ=Bkrqs7R zT0>74EWf-=zx>FT1+l*bT=bPIz6c8;CoBCR(eJiRX$2&dd@sKj*H+LMIYI}Y)RFK?b33V9P8kYJlY}gAOnA4?xG0WT|v_W*Fz}T zCBY@bKxgHAO}aei9gCQRH=r#hvkgC<mU2dZLf`29SghAcS+iDc!YUObvzv^sDje{jR4JR6~VRh%!ShD$Xk zGl;Zjz1@fOPGEW9hWo0&s`X)0SaZ6+8BN^I6~Xa*ew}6Xd$=j;9wb^gWqUniQ3izK&tGZI>P%KUcu}qy_L|9s z?a1y843$`~d%kZz>IECEr1lT|^&?|B5}9nUo4vh+Vtv9nubyM4? zE-cy%0arbadVpS1u<4pR@rVDp+8g>V$)K!WypE=x+0QS8A>RQyLxk+vfVTaFOa^m> zRM+8B9Ayg|ND0dllam7vY|2+S&85YRMLy9~I8Y`btix4sLur8!_yar;M3<)Oc}Z;n z$;`$gRM*(B0zUxV>_ph5@m?K{tSOuqkbw73KNP69jlxt9eLv#=uJG3l^gkV6#DnZd zId?C4clHUD%^8!HMapIxZb=U>M3@{|d_vqoT7(D{Ax>A`8?aWcLH#j4pgyT%p09z^ zMe$L-zH{~uXVT*47oWK$>Ut`M*x6M&zLCox=E&w7KQg+)BGhpc9zR3Lt}{6$K|oml z(I(9xV_qvyr@BVT9*bKPP9hgM zu0?BjPh!_b5HlKf|K@SvbGF6T%&vVw>vB5<$NLtA%Oljjm>s%1!lvg%0)8juwA7Sn zt0`_2+^({ub{${r4!8uoGD3E6d@M)hT}j3$R1`PH_Y&fxL0IO%ZDTAMGS)}|kW|as z#?Nh2I1NS?Yiu6zcfIbJWTudG84Iwo66UVx?*wG_DtYofRpMXWYuanvq8?&hatwBU zKfTXk!fy$?13u@HhQUULy?Ve#7n6@t0@ZW?icZ#RkzDvpN22Dy6!#IF2%f2dPhV!cPB2kg*muQw6;{on*%qt5IJ59WDemq0?$(|H*b48zDFqHkv;%r=xM{N~PXi>GU(Nsz+s+1@TbI~a3MVblD zgRxGCaF)&@b*mQlINRBJR$jlg<-FCsS-MxRhZrG;R4KN}7@>Sh|gP>t(Uzf6cXb+O?}xaqS>p%=l7Yi*;)~J{~T&@kTU%xEL1negmd3M`=RQ zNFEP)1*|s!5D2I_SF`b^Z03u zXtN19GKcdq@hSRoMtb0Ic&(fI7<1m18zdjy%2Koh+klBGXG5_B#NCY8e+qz0B|!c2 z&s1oT*?+kVgT(&PF@PX_2Twu=d`Jje8sNA+5t?Z@j`KBUa=_N(sAnhc4lb_v&- z6u-UbuqJydUpU|c7Eg$M0TywE4dyo-YJfr82fih%@te!&Pm_5HdI zvR=@rTI=)v(c^G@4z@JOtJd2F9bQ=R-9=O8IzieP#L)V=wjC}VQ))ZZE=OVIQXGXS zK!>V&V=8(dS{GWlkapz@`UCl`pc-s#tx>vDcWR@&AD3^Uu*or!ByrUQhNIQ|Lf85l zh8DG%CJNc)=dvc|f`tsocF#d4FwC+87AmJ3n^tFT!H zjfNkOeTq(|%buV(aFsiS{W`PR$7gq8Y4J`c>@ZI}^-i}YDC#{qdABOtznJX^&mlN< zD!np)u_DXohJO=RU{83gM=BNL?8hA29Ex&|mS?Tqcu{mXrN#Ru?0iL4t=eYqgrq3d zb|!UPyMUds6A#3wPG~R0$~Hp~TK<%Dd*??IslUk6A8UXNaH7$f4~! z&~44Tr$qZ-d1t&u`$meBQb)jnW;` zCo=E358t*v0=;#;dQkTX->51a{4i(6uVa>a!;7nU1rKSKuL+e&7G$-c?m^48{JNU4 zhUn1#fd98VzZHrto1_dK_r4CfhIf-*l?8&F?PCG{o(xO(oYu(JvvFoR%vOAU^0Tes zgcC(aNAWRzMN+&AG!j=P=qKgfIOJ$hFIUuO7M8>ZyjQca2=S72_#%}glC&R-uRC)E zp`cR60bb}RQ>Y{Y^$#Mkoz zJM!LHe&zCSTj~E9EV$yj-vmJ2E+4`8s4-j3P9p9vBs$PSNw3x@74|9Hw%TNLrY}xt zKc5>U+{&$njfob|GA;4dWI-~mhtI@mNYW)t3}~%R0g^m=K0o7cC$mZ@xi->C7|&hJ z)zphaE0cU|I)vC3kFzCMTBL!Q;Oplmf(jZ^KVfX=?4a*QqOaarXRX^G zqco5Ju0NetI5^m)5!*0uT>|f8=1|pTrgj9R;|b_*(G1oqJnvns*XXStyuC}w50!oE z)w8`!BveA5v$#ppy#yHaneZe39Kh}qC*^ytz0HM2lo&N(eC}G?u^@EATyJ}ul=O-Z zFh)?{6~8-iIzvMH@LJu1mi9tVUNfpawB~Yi(q;&dEbjt>{;X@tz3O+<2kyxCpZT@b zBNQNa9H73_uAQ@cXLEIYSU&Om(T|zn2l>|j%I^o`tBjuM=rYW1-+(ywwa>8B%l>&n zjB>*>l2Wq^_de4z^8KCtVmdC$H|}ug3v{W2pQaa>Yeunrz61W|7n_Chdc7qMyEyKH zy0?%^7XPz?BPWlJKSrY1vcD-be+qhc7%ww+E@)5i0#xUvFzhoXctiC)vlZ}YYG)L`G zV&SU~+nA+~>u@4VGWn*6xn(?5$c3T#NEZw#U+cvK#-K;l3J5q8Sk*!xI5u3YKJx{B z2PAA@*bj^+?FWmdYD=CG>R(+08_gdfPv|pw#dj+?ETQ+8);dxv=SUcdbJbhalm@@p zojD__|I~5QE$L>h1~=w&a`ajBI}7gOniq-B=S9SXNmAccu7H&mX$EjqcObDCMI~d_ zNY_v&xMeqsTc7pHPEc5tj5#UH;Zlxvz9@ZJ$1?DkYAh4Aex2v_BVhk+CRMw}rheNxv<@=GjZnj^T zRyFOJ$wAS-kWl+h6b(ij&sd_|vZCL0^VBIXpW;&Tx>^Jv;qLet{bs95Zl_jvt5UUG zZY)G3hiJT=;&73>+H(+2Qb!5|$}MFhw^uXIb8#d|W_L@a!vi->bQcW1K8pb`U%1Z2 zVXp7ZL{%;W{$n+d!JEnysl&XTup0$4sIFNjYU!K1C1HHf+-rEs484)x&8;G||Kd$E z$1y-vwA|4NW0eK*C$NORYwbbmnK9=yM@T|3Kwq_}_7+9%%r!otx;iji3_G~;uwHy1 zCKVaVM5AzILA_^4kS4}a@2)9ZF_ufyln zm-GwUeqr^PRp=N0W_VK40*YqG%<;7ZFS5Yl!W-pCYrk)7IqrbikCwNO6<}Y-wL0+P z!@e+M=ZinLv4XXj(nq!Wwwq^x^Jj02ls!#*z?d%w-qi;rTT72`p7G;6@LGCBgvb*F zBf%MDFDr35&qlXjptkG zh=(Sz*^xh7S)XK(r|w3~`NWakVU=Z%%Ht`99G_yl@2D2$&Ba#S>4Cw8OE1gj86(dV zk9H|0$GAyVtfUppu-?m4*^}y1)(D$*6A^hTXC&~m3D@_-e4JksatsI-R6MdXB2;XCspdaopNy`hH^3EoHZ5Atej+aDK(U`fv&B zaaBF-9LT0W8?%vYaADcv#>18Ar|!C2Y#U{Ys(mFr_@B2A635~JEBX!$w>n-UKCwx| zHT?5pS1g{rk6GaZAu&7=i^RcZ(oA6Lnp7lS<|k3wK9jiTSz=!fTs!|kiL5^>uEu+F%YWezf&-7MT1&e@KB z#+VP8hkiJM9#Q$&bq|>s=gE|_2Q!jI_pL`6kHjkmDw;G*>#rJ-ARY3!w{t;Qzu4@- z+w)0UaqFl!HIi;?wm=39S^elXm&N~ux8Ju$qeeLTXk)=r42=9dnF{K29w6f|g^CE# zJvoVxR@lc&9Tr4d{JbMj;{=(JXOHzcTgQK$G?+TO>3TO(_*C4T%w5IP>uFpsTBXEa zxyvi@7Vtajd+omQ2AI3DeN}FfKaQ?fPr3SiW`G`k)jz+H=KDErQ*ZIXzCQk7Bx?!3 z#>5oKacH{UGrPa|dG`4-X@H;Y-NRx(>-d-*L+(Q;p{deUlQD+_>`u0R_&AsM^jvwi zoel9bFXc@RcMP(W4`~6F4B$5xkasyj;JU_*i(W5I?A*su0@?AmTK(n^``>(512T6O zN+TrHe#H1(UOc}_um=m)IzIRgh41<0_!px>*%Dr?&fEGqQbraW*t0hq#`LkZXk@M! zRW>)!Ofs0S+SPRz=1F?f>!3wr&!l2kP$Z+qSF_7lqqGG@DsMS;hHzlLym|OkgD}px zKb{j8N}Hm?`Bz&k7vTu0NB%g477dFaP1o-3v7@B4;Q&Wl?WLS@cnhDTLr|;UUEfoW zo&>*FxDIi7Fyhdz?~Pp3cT8d-k=o|SSIo`f^<3p9;z)DH6*)=Nt65E^qq(W(tSmR) zRK&ePc{0V?_Or6eLxEdKx(;mGx-{-)h5eFekcI}w={`bO6-si9P#~%^yDuh7oceJe zz-hc(nJnYlB#TY$A9-oAojyXz+_h7I2vE{z!%85XdTNn7yF0a@c2ir27R&>CO8s7wmiP)O^cppnnrqC5} zE3~oo)B3s6tnilDYo0VIgt39b_e->2Z#|290adyYJ7eHu;uRJ^liingtZ@IhOfLHH>fK+H*x^}MCpXx|06?*&2 zVzvbHH(t$7xpK`8llUuN^I=M#BF&YvsM;I(^ORX`77d(E^3e?7*LBVaEg}7|*}$ew z-baT@AJa^|x422xedda{a}eY5@n3LBMXmS4UB<4w`nE!EvKu5Dov`6qGeH9%+dWIk zo|1ZX*~Md!hXB$wyi4|w$0BgO*?Gm^0$4h+{~#~STj?>8dgDo^Li?ERpIrGG#B2fi zycUop6Ed)Qh908UshRqrRQ0Y?c2YXQ)JD{H{YB=0@wd8<2!IS+267m1kNvBc^Uomr z|EcI%M|xaTU`1kMuC6?;K_GHTG~CT|&$dE^^Ir|3$76ny zK|7xELGV6u3Ku7@0RmFj=+Vz-iY(D!%jf9k*Y)QcUa+SUxZG2!A~}@0@`dlC;*q5& z=V6#HjldvJooX@;1n0Z&?a>9s)2JeloJHab=%$JMgyq#MEtKMI{p+{p?0P%JTV;yy zgU3#Y5n|MxGwGPv+_0ic5k4L>D(LXpxTwi1QJZs8FwKHW&RO;zt8_WkCpwerL;=mx z2FGKk44kBJpPRub2Qg-MVmOno+of~ecUQ^Xj-OOTvh$qsda$w~sr}3VBbH8*&Dfiw zc!+?+SGgwAsdPnrai7>|Y--*y$QFE`T#w{M50V=MMpf?E_wiAiUid^5E4~-o3V7_ZZ#>+nWq{MHGEeFk4f_AE zRiWC|*4$Jz(T2GtPCLd^kE}&0Hk83BPG?g2U|7pXn|!FLcP(GtC}A1s(gYRb_Xq+< zX0WtX*6+ouU4N1hDew6cnh}s3y*aN0ua?IvoOZF~yxy*0UE;p>IvDCMrf6?n1B9bT zFL06`bzajPeN9%8j2+8MvdePe8PjBX43q7W;bE|QyFglI>HVgpd5Qg=pUgu>A~J0uW4l{TjQw z+xDlcSRzE*9s(+RpI3-YTn4Y+lmf7`u~oNRw9OcGD> zRh|Hn7*vX1U|k-wVVYniL)9Z>{%dOa;r6(LgL!tf*Y}QvQoZ@&)bWH!D42^DN63;Vp& zK7H+GU!#XSr^#y2T)@}a*+hpm@6E=Pip3nzTK01@*lHoL-3(E`v?Zw1xax_^p^fYP z`SE;Gr`v}0V?~MZKn23sD8SN4(EBTxIgxpBmY(q{kT#673`<1@72QMoXx{2>;Albn zgSt*L0qA7}ZkEBnb!;`R^s9`DdwM2NnWK0%r;1ypd+)Hd7N!4Dj+X2hJzb|5ZLe`$ z5cq2Eu)y@%WOMdH3`cOHb@rQ`9;(&bm1LBs3{x(% zc7QoDg)4O9rjnj)dTad3ZUjmBs^q1ekBwr~og)#YjZ2sk%$#hlZ%W`s$`j$!QZPM_ z4(_f|4*tX2tR4{DQ`CgUGik8(IFT=)ChCCj@+4;wIXiP)>Z$wAn}1N?q(w`%0^AZA zRGtrUcy<}CqZ&-*_C&JeiyO3`mN?2!6X|T4yXRD8<{Xr`+%wWXi-*F~-P@?{E6%v} zKjp*1ZE75WwX9efwa*sG@1AU@a@~;)L6F1(@rzS|7gl^n96j!S{O!D-n$;F6AP4ef zi{G7gGrs=%yx#NTE8p_3GzE`8LjujK(zsm8d-vi>L~&JqJ`;FXyVX31zxkjf&#n=~ zW=4V2?qnb8N@OdJKNG%QCSA&12+w}K2EKAD`w5JHum9A4)o45%TbMd|JuT=A(YuCE zCp?<7>aCOZ{|Ukl0LKK4U~&v0_D6vU+$i&5 z6%X+c!UL`0GcMdxA=xJ?b^6sR~?(ct(P7oj4%C^vB$+VhX zjMFrD=IELSD}C>a;DB_cKC+z`i2ep!RbRy--TGTwZrl|w{(QOl9La3{E}@!)%%)_7 z9&@dfRh<(4VqYxA0UUhWBwB;SG<=ri<<=_&>RsEMg480Moep}CU@C7_v-06)7{lW$ z_Aa+xaPt!V2<=twZGET(X1Y6BU+halgNkUZOM|5^JDlMGv%0enZV39+)Y%k&-9h=d zw!J#?yHZy1WUC>RF#OBCFs}$$9dI(j-tltN*m>zv5NH?HO^EPCeKLr*OG@=3$fu8= z2>;ze`^ffJITj#&Rll3 zv!vX}-83RF>8LK_YR>EEyFDHaU@Y*9T=3eGi z(#XwHoX0NX3HZS@K_I_cHu)#wF2bbEmk@E%?m8YR1nEOu|3le6fK!>vuVA*VMGKgn z+S_r8xb0Tk(u0>}pKC(z)NQ=E`8c{AhmHH%&(BSsyWj29E{zce?7aMJF4QvO74B8u zm3S9W65!JS0R{Oc_)w%H@a1n=_<;+IKBf7}wTnLcsz2LAtTy%|n=$w_jsLR^6mShZ z8r^hNSwK{th{3l9Qf`~D=Bd6dN zAb1cBp&aJCWKh4!m=S=Aja$FYzS+a|5KEk?d0!Q>;{B`ZinSk(Vyh=F}74_~ovcGAcJ*$E{dOi4dbF(;{ z#KTFpq!Cd&YQY`}eHMGuu0phosi{4J^r5*x)hauYvgvL(jBaxc!>2O{#V@G_*3;B` z7{Gy(@S`+Qe?CpN&EjM$N(^bO2AjXT+%azT%2{K}EF$U6He2xNHsZ3`xe#J>Z&E8@ zzp>oQgB^COCNjz#`&qi(C@;G4X3wa)F#((72eG0)5x=Xvo2!zs3JouOW?5kwA~TyM z1;4jdu7`+^Xugb7yJA6bec>Mvzy@2m|m=h358 zg-rM6SP00I>NAAulC8+72&hiwIjn}RjRqaRtS68P{VPOs4UdCEtOiT7P5rnsDKjaz z-!7f+VxQ*|j~IbOM%4o#-YCrf=Vf-;_WvkvdW=5@pS{{Y-2zd!rk=PGR}`%dz{{%n zBLib%=dTG99w5*CfcGk9XK(rONi#x!1k~bfUfa zi=(4UGniNVJ#bUoxWtUz4ECSEE4-%v*hb^K53_oo@jXjs6@q~L%P9Ew6a4;nTVsKs zL4jBbo0xrz9y+l%jrz_m5cXJ6C+iwN-3NPGirxuRQ&?T^uFjIBud1x;Q!s4Vg_HHW zD-QKA!&FoLRUB-%(Wk|_3N@+-I{!MU6T2tJl)7X2dO;k?nsBoUJ+pUw z!mlQ2nN7t^7p1BKG>s=dOJN2JF|Iz>c^wH$M|{9cBR!^`EG4Wbc)|h z5iFx_HdV7{Wg2zu0>RhVF^YGC)_wqES zQ=(X!ZY9QJ5_7Egn4)bJDR1z64u5y}Cn;jtcR?Q)2Y`DdF~BYEvO5#kz|@LqDSXG2 zt{KVcscQXQ`T-_2eU|da1Ma-%=`<%RD?|0f<%vrr(s6DU+$&V!Y0+O z!1o|EvQnuGU#xb7O}&;T?2Do6S4J;EYPC0l&7w_IN=`}Dw%x(z65=H))vJ3^9KfZ? za*Os)Tbz)4MfA|5k8b6ANJ5Ts!|!c9{7cPAg$ZsN)u{%@xeY7g0!?G5n*|C4HLdaR zT-m=n5nx|mVvHM{1}R22Xu@nvjr9R7xC6%d(=@@}6zGP?W!oF!ZqANzuw4~bf%TG> zte;fFb(X!mmZb7kE+vC@d{NqRRZlX?*0Av&HL1%vp=F8~XM(a#ErX`ex_>Yd6`~2v z-99*LU{qMFQ+N>fNl1}XR1eN9r!pq~^xX+=AYG1T{Cysc!@5P+a3S)Nq+gOI%c z`?SLdV*NKGx&x>jki*Pu`v_PSr`3bMPG}PJkZa$u?y#SjHQvK#AJ|q=QMLZn)=|rE z$Fn>1UiBQ4<_}mZQa0Kb~b<6o%%OOBO!azXaKtPE8M{jnu(8YzomQ%xy+>V5t5f~$| zkT6s8ivH(jVZz#p`QzA3#$8?3yg~;Kr#cV?ajk{1zca08!wU%z|JsTkAoJ&TO$R<(!S8MkGl_>q$L{VGJbyq zUIz=>+(}-X)_r5bv^7B;X^{7a6HH=)wdkb1yr7xeIdy`Ew+>9{Pw>3!v(9aim7L$L zSYvd;gJpM|9AxL7K)GMHdK`UM9OYBQ03qzZ7A(TdJH-MyA#iZt0R+ zF)bXIsgFj>d1yjExnR^StI8h^GSd3Mi@%=*2bVILSquzsYL%cd8ducH1t!@q{!)xi zeF}1;JMolq?cx*3a69KF4?c2{Lyh`OuQ8}Cs}DCzrYzxOn;QJtGtzTxk5@Ca>ETA$ zkXftOza$8h>^ZcW)D0NqEXWgH3Cr3Jr@B%a)V}DX0ZM^|h|d4kDYSGlLgrLt!C@_{ zs!e;3sYL1-bZKKMYCdV5-NNK{6-ZLD?9i6ow4(@d^|cH+Kj|HJJsx)=kr~7Br%Cd7a4Xx9XYf`^Uh}wn+?B9Ox+0yoIDcQB><=nqqX*MKBE0aL;jp=nZUeFSw zLOecLbr!zz@3te+6E6KrAw;l$5HCSyyjoz%k4k)|$Im~YO^&xG zeXbXn-wwq0spNg1zZpOH#Yt?9XE-Pa7?jTHtu>s8zqSH9f(GY^%C6h~Up3CZS*DgZ z_}34TUDIpSj*^6OH@%6&IrL5if=oOB*A`>r#I#M;76o9}gH&DG8qJ2}rRaI;OvCkO zcx=lJC3!O`XV^>a7RA*pyJ4y$lM|hD`Ki(Pk&uwjzMUwZ<$9?YmL_Vbi*nM!II-Y) zTAJiFLoV9;QJTrng+e#>ayL-OT23G1B1b$Xwn@z`+1j+{>IoxsmMqx~{x#mm`f?-G zHeU6q=P59K^7r1}xkx@@onu-l8QD{QBTUID9p}`Ri)jj_=bMAa?prPaH^2_trZ~`mMr)XPz98R_U-R0r@%UN0 zMg<&+irY2+v1R4XO%G>_FeX_2F7*5B%gNL{E4GJLu;2Hg4S?6Lp2O6eIG#u2-Hvdu zq;X$gbYhMrnRu$2m)pb&zxvrss^wCi73>C+XuYoNo5<9@NcWgTvMLTB3Kli?ej&*!bw=V0oL=Bn`_ z{uI?rbV7gj64i$>uVX?SBp03?*_ZDwVKj8yW(j!nFvXzFwz9aJ#kz=^!|6`aH|vXH}K5yb_*yxj~z0!mhgWWczl2=p@zo|2`vw(8Gmk)?B#cv z243D`&cyJDlpnX94t^jKZ5&j6$p7qIZdmQRlxNm`^Jxz8A)K0|%mtFbJC84}UG{Hm zs^{L)|D&#Fo_Ua`f5m@}8xU?6-=K5_`1$MChPh5PxYLhb5LAfQ)>m6i0nTfl zLiF}q56P|sgVg`&zY`JjfH?d&x437HrG~kKu0+xEx?B&HDaQWIPkP3QpFAfB%*d3+ zz~`ATD{>=<C%$`g@dm!prf&xuwwmrk%DA)m9~bw1%;#?4FZpBp z-pi`4vyxk*T^Ev{KRdFkd$rO#=)HdZ_VD4}O15S0h;eP4xhy+(^W`M2 zE+^>lx$yQiPB-ZPG!B(j%~Uh&_s#o0ow}pbGw-+~vr1Esn)y36axl3}bHI$x6^0Z> zgf96kCnSOQf?q7cM>yAy@y{VnpbDcQ7fJW;J+XxPA?P7Be3`y&J6>hFP+v12lMqx~ z{@qnj&FllBTKgd^KfWC^rXP4Nr;&K@;P#CpL(IAif-4fMp9 zI#TBmuZ_Dmr3-A+wkVt0wqO2aF90x zAisQq`7H?C|34XrjkvI1Zf`&1@rW4VyH_S3JWgsVD|;JeZJfITcG4#YA3*|4e@0W> z*&h#cCvf}tUSj>R)od!|yyE#SDQxpe<*7tmG}wygm6^*$d~{)$ z(P9Iq>Qc(4nv@3c?V)_?`|wmdwAu@5*GL8eS>^RYl0(Q`=7*eYru~f;+fHiXx^m@Q zJrd2Y<%-A-Y0*`IC%J{|;7Tpyolp+;>aqaJiVKUHs0UVs$Y+TP)dvjqjaKG`D=#^4 zucfV3{YhghwfxwjlOaZ059>&jImVF+4Vg784{L~;)*!IZ0U>o}>87MW zbf$+RuP%42%gd}YzmIM;f|`SiO(s>&6|8CNiD2tVQJ|+Tw&KL&7Rl|zhbfksgwjV= zb}8<)E^bMXrzH;FYWkdfIPhk)-zs{?v;GK^@HZz02Jf<%b+t#J4A??Zs)cN28mO+r zP={+;)OkjP;JHpw$-Gs)8$+SH&1T4fekg=%wECAz?)_)9O-jX9un%g#TZn_XkyY;wWG5ioTzII`!o_`;kR38`}F-b!j(zD98_lTc~xy zY8n#Uc!01<~5~`DGkC-idUIi=WJHI=j>N`_3-&M#D7;=x@G<(&m1v0 zkal*;lr;>-FZ-p12|JHIEkl8d@4A^

uxFJHqynhL#hwBwfQXtE^r-_dqb8(qxp3 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