diff options
author | Can Geliş <geliscan@gmail.com> | 2017-08-01 12:04:34 +0300 |
---|---|---|
committer | dc42 <dcrocker@eschertech.com> | 2017-08-01 12:04:34 +0300 |
commit | 3247390f323c07d5c834b206103397f295a95378 (patch) | |
tree | 1a0a2e81a6d59287a377450abf0917af04422bad /src/Storage | |
parent | 74890fbe742c1e4a96f862174260767d0b7daad2 (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.cpp | 74 | ||||
-rw-r--r-- | src/Storage/CRC32.h | 27 | ||||
-rw-r--r-- | src/Storage/FileStore.cpp | 39 | ||||
-rw-r--r-- | src/Storage/FileStore.h | 9 |
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 |