Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCan Geliş <geliscan@gmail.com>2017-08-01 12:04:34 +0300
committerdc42 <dcrocker@eschertech.com>2017-08-01 12:04:34 +0300
commit3247390f323c07d5c834b206103397f295a95378 (patch)
tree1a0a2e81a6d59287a377450abf0917af04422bad /src/Storage
parent74890fbe742c1e4a96f862174260767d0b7daad2 (diff)
Support for binary write for M559 and M560 (#125)
* Support for binary write M560 and M559 now supports binary uploads. Size in bytes of the file can be supplied to the GCode with S parameter to indicate end of file otherwise upload will continue until the EOF is encountered. M560 writes www folder by default M559 writes sys folder by default Default folders can be changed by supplying the absolute path of the file. For example: M560 P/sys/firmware.bin * code refactoring * CRC32 checksum verification for binary uploads In this implementation CRC32 checksum should be supplied with "C" parameter with 0x prefix. Example: M559 C0xabcdef Ptest.bin S123 * code refactoring
Diffstat (limited to 'src/Storage')
-rw-r--r--src/Storage/CRC32.cpp74
-rw-r--r--src/Storage/CRC32.h27
-rw-r--r--src/Storage/FileStore.cpp39
-rw-r--r--src/Storage/FileStore.h9
4 files changed, 127 insertions, 22 deletions
diff --git a/src/Storage/CRC32.cpp b/src/Storage/CRC32.cpp
new file mode 100644
index 00000000..88142ac9
--- /dev/null
+++ b/src/Storage/CRC32.cpp
@@ -0,0 +1,74 @@
+#include "CRC32.h"
+
+const uint32_t CRC32::CRC_32_TAB[256] = {
+ /*
+ CRC polynomial 0xedb88320
+ This table can also be generated in runtime
+ */
+ 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
+};
+
+CRC32::CRC32()
+{
+ Reset();
+}
+
+void CRC32::Update(char c)
+{
+ crc = (CRC_32_TAB[(crc ^ c) & 0xFF] ^ (crc >> 8));
+}
+
+void CRC32::Update(const char *c, size_t len)
+{
+ for (size_t i = 0; i < len; ++i)
+ {
+ Update(c[i]);
+ }
+}
+
+void CRC32::Reset()
+{
+ crc = 0xffffffff;
+} \ No newline at end of file
diff --git a/src/Storage/CRC32.h b/src/Storage/CRC32.h
new file mode 100644
index 00000000..06bcfe13
--- /dev/null
+++ b/src/Storage/CRC32.h
@@ -0,0 +1,27 @@
+#ifndef CRC32_H
+#define CRC32_H
+
+#include <cstdint> // for uint32_t
+#include <cstddef> // for size_t
+
+class CRC32
+{
+private:
+ static const uint32_t CRC_32_TAB[];
+ uint32_t crc;
+
+public:
+ CRC32();
+ void Update(char c);
+ void Update(const char *c, size_t len);
+ void Reset();
+ uint32_t Get() const;
+
+};
+
+inline uint32_t CRC32::Get() const
+{
+ return ~crc;
+}
+
+#endif \ No newline at end of file
diff --git a/src/Storage/FileStore.cpp b/src/Storage/FileStore.cpp
index d73a6f5f..4087787b 100644
--- a/src/Storage/FileStore.cpp
+++ b/src/Storage/FileStore.cpp
@@ -89,7 +89,7 @@ bool FileStore::Open(const char* directory, const char* fileName, bool write)
}
return false;
}
-
+ crc.Reset();
inUse = true;
openCount = 1;
return true;
@@ -268,6 +268,19 @@ int FileStore::ReadLine(char* buf, size_t nBytes)
return i;
}
+FRESULT FileStore::Store(const char *s, size_t len, size_t *bytesWritten)
+{
+ uint32_t time = micros();
+ crc.Update(s, len);
+ FRESULT writeStatus = f_write(&file, s, len, bytesWritten);
+ time = micros() - time;
+ if (time > longestWriteTime)
+ {
+ longestWriteTime = time;
+ }
+ return writeStatus;
+}
+
bool FileStore::Write(char b)
{
return Write(&b, sizeof(char));
@@ -290,13 +303,7 @@ bool FileStore::Write(const char *s, size_t len)
FRESULT writeStatus = FR_OK;
if (writeBuffer == nullptr)
{
- uint32_t time = micros();
- writeStatus = f_write(&file, s, len, &totalBytesWritten);
- time = micros() - time;
- if (time > longestWriteTime)
- {
- longestWriteTime = time;
- }
+ writeStatus = Store(s, len, &totalBytesWritten);
}
else
{
@@ -306,13 +313,7 @@ bool FileStore::Write(const char *s, size_t len)
if (writeBuffer->BytesLeft() == 0)
{
size_t bytesToWrite = writeBuffer->BytesStored(), bytesWritten;
- uint32_t time = micros();
- writeStatus = f_write(&file, writeBuffer->Data(), bytesToWrite, &bytesWritten);
- time = micros() - time;
- if (time > longestWriteTime)
- {
- longestWriteTime = time;
- }
+ writeStatus = Store(writeBuffer->Data(), bytesToWrite, &bytesWritten);
writeBuffer->DataTaken();
if (bytesToWrite != bytesWritten)
@@ -345,13 +346,7 @@ bool FileStore::Flush()
if (writeBuffer != nullptr)
{
size_t bytesToWrite = writeBuffer->BytesStored(), bytesWritten;
- uint32_t time = micros();
- FRESULT writeStatus = f_write(&file, writeBuffer->Data(), bytesToWrite, &bytesWritten);
- time = micros() - time;
- if (time > longestWriteTime)
- {
- longestWriteTime = time;
- }
+ FRESULT writeStatus = Store(writeBuffer->Data(), bytesToWrite, &bytesWritten);
writeBuffer->DataTaken();
if ((writeStatus != FR_OK) || (bytesToWrite != bytesWritten))
diff --git a/src/Storage/FileStore.h b/src/Storage/FileStore.h
index 778c7513..c0db51a6 100644
--- a/src/Storage/FileStore.h
+++ b/src/Storage/FileStore.h
@@ -5,6 +5,7 @@
#include "Core.h"
#include "Libraries/Fatfs/ff.h"
+#include "CRC32.h"
class Platform;
class FileWriteBuffer;
@@ -31,6 +32,7 @@ public:
bool Flush(); // Write remaining buffer data
void Invalidate(const FATFS *fs); // Invalidate the file if it uses the specified FATFS object
bool IsOpenOn(const FATFS *fs) const; // Return true if the file is open on the specified file system
+ uint32_t GetCRC32() const;
#if 0 // not currently used
bool SetClusterMap(uint32_t[]); // Provide a cluster map for fast seeking
@@ -44,6 +46,7 @@ protected:
FileStore(Platform* p);
void Init();
bool Open(const char* directory, const char* fileName, bool write);
+ FRESULT Store(const char *s, size_t len, size_t *bytesWritten); // Write data to the non-volatile storage
private:
Platform* platform;
@@ -55,10 +58,16 @@ private:
bool inUse;
bool writing;
+ CRC32 crc;
static uint32_t longestWriteTime;
};
inline bool FileStore::Write(const uint8_t *s, size_t len) { return Write(reinterpret_cast<const char *>(s), len); }
+inline uint32_t FileStore::GetCRC32() const
+{
+ return crc.Get();
+}
+
#endif