From aad5fe71eb3ba2e5f85719887e2eb55e5f30e937 Mon Sep 17 00:00:00 2001 From: jjwbruijn Date: Sat, 2 Sep 2023 12:26:40 +0200 Subject: [PATCH] updated beta 7.5" fw --- .../88MZ100_7.4_BETA-0.4.bin | Bin 0 -> 65264 bytes .../88MZ100_7.4_BETA-0.4_ota.bin | Bin 0 -> 65296 bytes .../88MZ100_OpenEpaperLink_7.4/Makefile | 6 +- .../88MZ100_OpenEpaperLink_7.4/bitmaps.h | 379 +++------- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.c | 96 --- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.h | 20 - ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.c | 410 ----------- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.h | 31 - ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.c | 4 +- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.h | 11 - .../88MZ100_OpenEpaperLink_7.4/compression.c | 116 --- .../88MZ100_OpenEpaperLink_7.4/compression.h | 9 - .../88MZ100_OpenEpaperLink_7.4/drawing.c | 110 ++- .../88MZ100_OpenEpaperLink_7.4/eeprom.h | 16 +- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.c | 139 +++- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.h | 9 +- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.c | 121 ++-- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.h | 10 +- .../88MZ100_OpenEpaperLink_7.4/powermgt.h | 2 +- ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/proto.h | 360 +--------- .../88MZ100_OpenEpaperLink_7.4/settings.c | 2 + .../88MZ100_OpenEpaperLink_7.4/settings.h | 15 - .../88MZ100_OpenEpaperLink_7.4/syncedproto.c | 15 +- .../userinterface.c | 71 +- .../uzlib/.github/workflows/stale.yml | 67 -- .../uzlib/.gitignore | 3 - .../88MZ100_OpenEpaperLink_7.4/uzlib/LICENSE | 65 -- .../88MZ100_OpenEpaperLink_7.4/uzlib/Makefile | 4 - .../uzlib/README.md | 325 --------- .../uzlib/bin/tgunzip.exe | Bin 7680 -> 0 bytes .../uzlib/examples/tgunzip/.gitignore | 1 - .../uzlib/examples/tgunzip/makefile | 31 - .../uzlib/examples/tgunzip/makefile.b32 | 31 - .../uzlib/examples/tgunzip/makefile.dj2 | 30 - .../uzlib/examples/tgunzip/makefile.dmc | 31 - .../uzlib/examples/tgunzip/makefile.mgw | 28 - .../uzlib/examples/tgunzip/makefile.vc | 28 - .../uzlib/examples/tgunzip/makefile.wat | 31 - .../uzlib/examples/tgunzip/tgunzip.c | 167 ----- .../uzlib/examples/tgzip/.gitignore | 1 - .../uzlib/examples/tgzip/makefile | 31 - .../uzlib/examples/tgzip/tgzip.c | 120 ---- .../uzlib/lib/empty.dir | 1 - .../uzlib/src/adler32.c | 78 -- .../uzlib/src/crc32.c | 63 -- .../uzlib/src/defl_static.c | 318 --------- .../uzlib/src/defl_static.h | 37 - .../uzlib/src/genlz77.c | 124 ---- .../uzlib/src/makefile | 36 - .../uzlib/src/makefile.b32 | 34 - .../uzlib/src/makefile.dj2 | 33 - .../uzlib/src/makefile.dmc | 32 - .../uzlib/src/makefile.mgw | 31 - .../uzlib/src/makefile.vc | 30 - .../uzlib/src/makefile.wat | 35 - .../uzlib/src/nasm/crc32.nas | 118 --- .../uzlib/src/nasm/nasmlcm.inc | 326 --------- .../uzlib/src/nasm/tinfzlib.nas | 160 ----- .../uzlib/src/tinf.h | 3 - .../uzlib/src/tinf_compat.h | 9 - .../uzlib/src/tinfgzip.c | 110 --- .../uzlib/src/tinflate.c | 673 ------------------ .../uzlib/src/tinfzlib.c | 66 -- .../uzlib/src/uzlib.h | 173 ----- .../uzlib/src/uzlib_conf.h | 32 - .../tag_types.h => oepl-definitions.h | 36 +- oepl-esp-ap-proto.h | 28 + oepl-proto.h | 180 +++++ 68 files changed, 577 insertions(+), 5135 deletions(-) create mode 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/88MZ100_7.4_BETA-0.4.bin create mode 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/88MZ100_7.4_BETA-0.4_ota.bin mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/bitmaps.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.c mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/drawing.c mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/eeprom.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/powermgt.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/proto.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.c mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.h mode change 100644 => 100755 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/syncedproto.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.github/workflows/stale.yml delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.gitignore delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/LICENSE delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/Makefile delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/README.md delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/bin/tgunzip.exe delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/.gitignore delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.b32 delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dj2 delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dmc delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.mgw delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.vc delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.wat delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/tgunzip.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/.gitignore delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/makefile delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/tgzip.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/lib/empty.dir delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/adler32.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/crc32.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/genlz77.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.b32 delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dj2 delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dmc delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.mgw delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.vc delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.wat delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/crc32.nas delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/nasmlcm.inc delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/tinfzlib.nas delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf_compat.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfgzip.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinflate.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfzlib.c delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib.h delete mode 100644 ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib_conf.h rename ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/tag_types.h => oepl-definitions.h (67%) mode change 100644 => 100755 create mode 100644 oepl-esp-ap-proto.h create mode 100644 oepl-proto.h diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/88MZ100_7.4_BETA-0.4.bin b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/88MZ100_7.4_BETA-0.4.bin new file mode 100755 index 0000000000000000000000000000000000000000..458083f1b72c2410b04e579c0fb9fd156e7189bd GIT binary patch literal 65264 zcmc${3w%`7xi`G`?3rY8A(>4EI3|1Qjw^LJ|hZpi!f(5k2`XWgFltYd71~URP`L{g9!d1i2 zZzJrZ$hW*(waI<#5ev8K(YT+&#`aJ2zw)z*{ym7l&TrxBVE+9_7Vd|&7ViC@BMf=# zVBWh@O}}r&#C!z%V&=iRi-%t`8_488{V~7Ja`7~lqe<%>Z579&!>6N0kM$Yj+NaNRe%|3|v7FH1 z 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 -#include "mz100.h" -#include "mz100_aes.h" -#include "mz100_driver.h" -#include "ccm.h" - - -static bool aesCcmOp(void* dst, const void *src, uint16_t authSrcLen, uint16_t encSrcLen, const void *key, const void *nonce, bool dec) -{ - uint32_t tempB, nBytesNoMic = authSrcLen + encSrcLen, nBytesIn, nBytesOut; - const uint32_t *inD = (const uint32_t*)src; - uint32_t *outD = (uint32_t*)dst; - uint_fast8_t i; - bool success; - - if (dec) { - nBytesIn = nBytesNoMic + AES_CCM_MIC_SIZE; - nBytesOut = nBytesNoMic; - } - else { - nBytesIn = nBytesNoMic; - nBytesOut = nBytesNoMic + AES_CCM_MIC_SIZE; - } - - do{ - AES->CTRL1.WORDVAL |= 2; - } while (!(AES->STATUS.WORDVAL & 2)); - - AES->CTRL2.WORDVAL |= 1; - (void)AES->CTRL2.WORDVAL; - AES->CTRL2.WORDVAL &=~ 1; - AES->CTRL1.WORDVAL = 0x0005501e + (dec ? 0x8000 : 0); - AES->IMR.WORDVAL = 0xffffffff; - - for(i = 0; i < 4; i++) - AES->KEY[7 - i].WORDVAL = ((uint32_t*)key)[i]; - - AES->MSTR_LEN.WORDVAL = encSrcLen; - AES->ASTR_LEN.WORDVAL = authSrcLen; - - for(i = 0; i < 3; i++) - AES->IV[i].WORDVAL = ((uint32_t*)nonce)[i]; - AES->IV[3].WORDVAL = ((uint8_t*)nonce)[12] + 0x200; //2 byte lengths - - AES->CTRL1.WORDVAL |= 1; - - while (nBytesIn || nBytesOut) { - - if (!(AES->STATUS.WORDVAL & 0x10) && nBytesIn) { - - if (nBytesIn >= 4) { - AES->STR_IN.WORDVAL = *inD++; - nBytesIn -= 4; - } - else { - memcpy(&tempB, inD, nBytesIn); - AES->STR_IN.WORDVAL = tempB; - nBytesIn = 0; - } - } - - if ((AES->STATUS.WORDVAL & 0x40) && nBytesOut) { - - if (nBytesOut >= 4) { - *outD++ = AES->STR_OUT.WORDVAL; - nBytesOut -= 4; - } - else { - tempB = AES->STR_OUT.WORDVAL; - memcpy(outD, &tempB, nBytesOut); - nBytesOut = 0; - } - - } - } - - success = !((AES->STATUS.WORDVAL >> 11) & 7); - - AES->CTRL1.WORDVAL = 0; - - return success; -} - -void aesCcmEnc(void* dst, const void *src, uint16_t authSrcLen, uint16_t encSrcLen, const void *key, const void *nonce) -{ - aesCcmOp(dst, src, authSrcLen, encSrcLen, key, nonce, false); -} - -bool aesCcmDec(void* dst, const void *src, uint16_t authSrcLen, uint16_t encSrcLen, const void *key, const void *nonce) -{ - return aesCcmOp(dst, src, authSrcLen, encSrcLen, key, nonce, true); -} - - - - diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.h deleted file mode 100644 index 61391740..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/ccm.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _CCM_H_ -#define _CCM_H_ - -//CCM defined for T = 4 (mic is 4 bytes), Q = 2 (max data len 65536), N = 13( nonse is 13 bytes), 128-bit AES (16 bytes of key) -//no more than 0xff00 auth data bytes allowed - -#include -#include - -#define AES_CCM_MIC_SIZE 4 -#define AES_CCM_NONCE_SIZE 13 - -//encrypted data follows auth data. both in and out. 4 bytes of MIC appended on the encrypt path, checke don the decrypt path - -void aesCcmEnc(void* dst, const void *src, uint16_t authSrcLen, uint16_t encSrcLen, const void *key, const void *nonce); -bool aesCcmDec(void* dst, const void *src, uint16_t authSrcLen, uint16_t encSrcLen, const void *key, const void *nonce); - - - -#endif diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.c deleted file mode 100644 index 9abc81a5..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.c +++ /dev/null @@ -1,410 +0,0 @@ -#include "eeprom.h" -#include "chars.h" -#include "mz100_flash.h" -#include "epd.h" - -#define NUM_CHARS 256 - -#define CANVAS_FLIP_H 1 -#define CANVAS_MSB_FIRST 1 - -const static uint8_t mCharsImgs[]; - -extern uint8_t mScreenRow[]; -static void charsPrvDrawCharRow(uint8_t ch, int16_t x, uint8_t imgRow, uint8_t foreColor, uint8_t backColor, uint8_t mag) -{ - uint8_t c, mc, charRow = imgRow / mag, bitMask = (1 << 4) - 1; - - for (c = 0; c < CHAR_WIDTH; c++) - { // iterate over the char's columns for this row - - uint8_t imgCol = ((uint8_t)((uint8_t)CHAR_WIDTH * (uint8_t)ch) & 7) + c; // sort out where in the row our data begins - uint8_t color = ((mCharsImgs[(((CHAR_WIDTH * NUM_CHARS + 7) / 8 * charRow) + (CHAR_WIDTH * ch) / 8) + (imgCol >> 3)] >> (7 - (imgCol % 8))) & 1) ? foreColor : backColor; // get the color - - if (color == CHAR_COLOR_TRANSPARENT) - continue; - - for (mc = 0; mc < mag; mc++, x++) - { // set the pixel - - uint8_t *dst = mScreenRow; - uint8_t bitOfst; - uint16_t c = x; - - if (x < 0) - continue; - if (x >= DISPLAY_WIDTH) - break; - -#if CANVAS_FLIP_H - c = DISPLAY_WIDTH - c - 1; -#endif - - dst += (c * 4) / 8; - bitOfst = (c * 4) % 8; - -#if CANVAS_MSB_FIRST - bitOfst = 8 - bitOfst - 4; -#endif - - *dst = ((*dst) & ~(bitMask << bitOfst)) | ((color & bitMask) << bitOfst); - } - } -} - -void charsDrawString(const struct CharDrawingParams *params) -{ - const char *s = params->str; - int16_t x = params->x; - uint8_t ch; - - while ((ch = *s++) != 0) - { - charsPrvDrawCharRow(ch, x, params->imgRow, params->foreColor, params->backColor, params->magnify); - x += (uint16_t)(uint8_t)(CHAR_WIDTH * params->magnify); - } -} - -const static uint8_t mCharsImgs[] = { - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0f, 0xf0, 0x0f, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x7e, 0x36, - 0x3c, 0xd8, 0x38, 0x1c, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x1e, 0x0c, 0x3c, 0x3c, 0x30, 0x7e, 0x1c, 0x7e, 0x3c, 0x3c, 0x00, 0x00, - 0x06, 0x00, 0x60, 0x3c, 0x7e, 0x18, 0x7c, 0x3c, 0x78, 0x7e, 0x7e, 0x3c, - 0x66, 0x3c, 0x06, 0x66, 0x60, 0x63, 0x63, 0x3c, 0x7c, 0x3c, 0x7c, 0x3c, - 0x7e, 0x66, 0x66, 0x63, 0x66, 0x66, 0x7e, 0x3c, 0x60, 0x3c, 0x66, 0x00, - 0x0c, 0x00, 0x60, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x60, 0x18, 0x0c, 0x60, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x30, 0x38, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3c, 0x7e, 0x36, 0x66, 0xda, 0x6c, 0x1c, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x33, 0x1c, 0x66, 0x66, 0x30, 0x60, 0x18, 0x06, - 0x66, 0x66, 0x00, 0x00, 0x0c, 0x00, 0x30, 0x66, 0xc3, 0x3c, 0x66, 0x66, - 0x6c, 0x60, 0x60, 0x66, 0x66, 0x18, 0x06, 0x66, 0x60, 0x63, 0x63, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x18, 0x66, 0x66, 0x63, 0x66, 0x66, 0x06, 0x30, - 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x30, 0x00, - 0x60, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xdb, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x40, - 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x7f, 0x60, 0x76, 0x6c, 0x0c, - 0x18, 0x18, 0x36, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x37, 0x7c, 0x66, 0x66, - 0x36, 0x60, 0x30, 0x0c, 0x66, 0x66, 0x1c, 0x1c, 0x18, 0x00, 0x18, 0x66, - 0xc3, 0x66, 0x66, 0x66, 0x66, 0x60, 0x60, 0x66, 0x66, 0x18, 0x06, 0x6c, - 0x60, 0x77, 0x73, 0x66, 0x66, 0x66, 0x66, 0x60, 0x18, 0x66, 0x66, 0x63, - 0x34, 0x66, 0x06, 0x30, 0x30, 0x0c, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x3c, - 0x3e, 0x3c, 0x30, 0x3e, 0x7c, 0x78, 0x3c, 0x66, 0x18, 0x7e, 0x7c, 0x3c, - 0x7c, 0x3e, 0x66, 0x3e, 0x7e, 0x66, 0x66, 0x63, 0x66, 0x66, 0x7e, 0x18, - 0x18, 0x18, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x87, 0xe1, 0x86, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x36, - 0x30, 0x0c, 0x38, 0x18, 0x30, 0x0c, 0x1c, 0x18, 0x00, 0x00, 0x00, 0x0c, - 0x37, 0x0c, 0x06, 0x06, 0x36, 0x60, 0x7c, 0x0c, 0x76, 0x66, 0x1c, 0x1c, - 0x30, 0x7e, 0x0c, 0x0c, 0xcf, 0x66, 0x66, 0x60, 0x66, 0x60, 0x60, 0x60, - 0x66, 0x18, 0x06, 0x6c, 0x60, 0x6b, 0x7b, 0x66, 0x66, 0x66, 0x66, 0x30, - 0x18, 0x66, 0x66, 0x6b, 0x18, 0x66, 0x0c, 0x30, 0x30, 0x0c, 0x00, 0x00, - 0x00, 0x06, 0x66, 0x66, 0x66, 0x66, 0x30, 0x66, 0x66, 0x18, 0x0c, 0x66, - 0x18, 0x6b, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x60, 0x30, 0x66, 0x66, 0x6b, - 0x66, 0x66, 0x06, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x19, 0xd8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x7e, 0x36, 0x18, 0x18, 0x60, 0x00, 0x30, 0x0c, 0x7f, 0x7e, - 0x00, 0x7e, 0x00, 0x18, 0x33, 0x0c, 0x0c, 0x1c, 0x36, 0x7c, 0x66, 0x18, - 0x3c, 0x66, 0x00, 0x00, 0x60, 0x00, 0x06, 0x18, 0xdb, 0x66, 0x7c, 0x60, - 0x66, 0x7c, 0x7c, 0x60, 0x7e, 0x18, 0x06, 0x78, 0x60, 0x6b, 0x6f, 0x66, - 0x7c, 0x66, 0x7c, 0x18, 0x18, 0x66, 0x66, 0x6b, 0x18, 0x3c, 0x18, 0x30, - 0x18, 0x0c, 0x00, 0x00, 0x00, 0x06, 0x66, 0x60, 0x66, 0x66, 0x7e, 0x66, - 0x66, 0x18, 0x0c, 0x6c, 0x18, 0x6b, 0x66, 0x66, 0x66, 0x66, 0x70, 0x60, - 0x30, 0x66, 0x66, 0x6b, 0x3c, 0x66, 0x0c, 0x30, 0x18, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x23, - 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x7e, 0x36, 0x0c, 0x30, 0x6f, 0x00, - 0x30, 0x0c, 0x1c, 0x18, 0x00, 0x00, 0x00, 0x18, 0x3b, 0x0c, 0x18, 0x06, - 0x66, 0x06, 0x66, 0x18, 0x6e, 0x3e, 0x00, 0x00, 0x30, 0x7e, 0x0c, 0x18, - 0xdb, 0x7e, 0x66, 0x60, 0x66, 0x60, 0x60, 0x6e, 0x66, 0x18, 0x06, 0x6c, - 0x60, 0x6b, 0x67, 0x66, 0x60, 0x66, 0x6c, 0x0c, 0x18, 0x66, 0x66, 0x6b, - 0x2c, 0x18, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x3e, 0x66, 0x60, - 0x66, 0x7e, 0x30, 0x66, 0x66, 0x18, 0x0c, 0x78, 0x18, 0x6b, 0x66, 0x66, - 0x66, 0x66, 0x60, 0x3c, 0x30, 0x66, 0x66, 0x6b, 0x18, 0x66, 0x18, 0x60, - 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x41, 0x82, 0x47, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7f, - 0x06, 0x6e, 0x66, 0x00, 0x30, 0x0c, 0x36, 0x18, 0x00, 0x00, 0x00, 0x30, - 0x3b, 0x0c, 0x30, 0x66, 0x7f, 0x06, 0x66, 0x30, 0x66, 0x0c, 0x00, 0x00, - 0x18, 0x00, 0x18, 0x00, 0xcf, 0x66, 0x66, 0x66, 0x66, 0x60, 0x60, 0x66, - 0x66, 0x18, 0x66, 0x6c, 0x60, 0x63, 0x63, 0x66, 0x60, 0x66, 0x66, 0x06, - 0x18, 0x66, 0x66, 0x36, 0x66, 0x18, 0x60, 0x30, 0x0c, 0x0c, 0x00, 0x00, - 0x00, 0x66, 0x66, 0x60, 0x66, 0x60, 0x30, 0x66, 0x66, 0x18, 0x0c, 0x6c, - 0x18, 0x6b, 0x66, 0x66, 0x66, 0x66, 0x60, 0x06, 0x30, 0x66, 0x66, 0x6b, - 0x3c, 0x66, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x61, 0x8e, 0x61, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x7e, 0x36, 0x66, 0x5b, 0x66, 0x00, 0x30, 0x0c, 0x00, 0x00, - 0x1c, 0x00, 0x1c, 0x30, 0x33, 0x0c, 0x60, 0x66, 0x06, 0x0c, 0x66, 0x30, - 0x66, 0x18, 0x1c, 0x1c, 0x0c, 0x00, 0x30, 0x18, 0xc0, 0x66, 0x66, 0x66, - 0x6c, 0x60, 0x60, 0x66, 0x66, 0x18, 0x66, 0x66, 0x60, 0x63, 0x63, 0x66, - 0x60, 0x66, 0x66, 0x66, 0x18, 0x66, 0x3c, 0x36, 0x66, 0x18, 0x60, 0x30, - 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x60, 0x30, 0x66, - 0x66, 0x18, 0x0c, 0x66, 0x18, 0x6b, 0x66, 0x66, 0x66, 0x66, 0x60, 0x06, - 0x30, 0x66, 0x3c, 0x36, 0x66, 0x66, 0x60, 0x18, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x11, 0x9c, - 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x7e, 0x36, 0x3c, 0x1b, 0x3b, 0x00, - 0x18, 0x18, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x60, 0x1e, 0x0c, 0x7e, 0x3c, - 0x06, 0x78, 0x3c, 0x30, 0x3c, 0x38, 0x1c, 0x1c, 0x06, 0x00, 0x60, 0x18, - 0x7f, 0x66, 0x7c, 0x3c, 0x78, 0x7e, 0x60, 0x3e, 0x66, 0x3c, 0x3c, 0x66, - 0x7e, 0x63, 0x63, 0x3c, 0x60, 0x3c, 0x66, 0x3c, 0x18, 0x3c, 0x18, 0x36, - 0x66, 0x18, 0x7e, 0x30, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x3e, 0x7c, 0x3c, - 0x3e, 0x3c, 0x30, 0x3e, 0x66, 0x7e, 0x0c, 0x66, 0x7e, 0x63, 0x66, 0x3c, - 0x7c, 0x3e, 0x60, 0x7c, 0x1e, 0x3e, 0x18, 0x36, 0x66, 0x3c, 0x7e, 0x18, - 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x08, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x0e, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x88, 0x71, 0x88, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0xe3, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xc0, 0x43, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.h deleted file mode 100644 index 71422453..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/chars.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _CHARS_H_ -#define _CHARS_H_ - -#include -#include - -#define CHAR_WIDTH 8 -#define CHAR_HEIGHT 16 - -#define CHAR_COLOR_TRANSPARENT (0xff) - -#define CHAR_SIGNAL_PT1 (1) -#define CHAR_SIGNAL_PT2 (2) - -#define CHAR_NO_SIGNAL_PT1 (3) -#define CHAR_NO_SIGNAL_PT2 (4) - -struct CharDrawingParams -{ - const char *str; - int16_t x; - uint8_t imgRow; - uint8_t foreColor; - uint8_t backColor; - uint8_t magnify; -}; - -void charsDrawString(const struct CharDrawingParams *params); - - -#endif diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.c old mode 100644 new mode 100755 index e6cb6ae2..fd315b03 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.c @@ -1,10 +1,8 @@ #include "comms.h" #include -//#include #include - -#include "ccm.h" +#include #include "proto.h" extern uint8_t Zigbee_tx_buffer(uint8_t tx_buffer[], int len); diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.h old mode 100644 new mode 100755 index a9c4d17b..8b706067 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/comms.h @@ -2,28 +2,17 @@ #define _COMMS_H_ #include -#include "ccm.h" extern uint8_t mLastLqi; extern int8_t mLastRSSI; -#define COMMS_MAX_RADIO_WAIT_MSEC 100 - -#define COMMS_IV_SIZE (4) //zeroes except these 4 counter bytes - #define COMMS_RX_ERR_NO_PACKETS (-1) -#define COMMS_RX_ERR_INVALID_PACKET (-2) -#define COMMS_RX_ERR_MIC_FAIL (-3) - -#define COMMS_MAX_PACKET_SZ (127 /* max phy len */ - 21 /* max mac frame with panID compression */ - 2 /* FCS len */ - AES_CCM_MIC_SIZE - COMMS_IV_SIZE) - uint8_t commsGetLastPacketLQI(void); int8_t commsGetLastPacketRSSI(void); int32_t commsRxUnenc(void *data); - void commsTxNoCpy(uint8_t *packetp); #endif diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.c deleted file mode 100644 index 0bc5d1d7..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.c +++ /dev/null @@ -1,116 +0,0 @@ - -#include "compression.h" -#include "uzlib/src/uzlib.h" -//#include -#include -#include -#include -#include "mz100_flash.h" -#include "mz100_wdt.h" -#include "util.h" -#include "eeprom.h" - -#define OUT_CHUNK_SIZE 0x100 -struct EepromImageHeader backup_header; - -uint8_t out_buffer[OUT_CHUNK_SIZE]; -uint8_t dict_buffer[32768]; - -uint32_t current_in_pos = 0; - -int callback_read_more_data(TINF_DATA *d) -{ - return FLASH_ByteRead(FLASH_NORMAL_READ, current_in_pos++); -} - -uint32_t decompress_file(uint32_t address_in, uint32_t size_compressed, uint32_t address_temp, uint32_t max_len_temp, char error_reason[100]) -{ - FLASH_Read(0, address_in - sizeof(struct EepromImageHeader), (uint8_t *)&backup_header, sizeof(struct EepromImageHeader)); // Save the image header to write it back later - int res; - struct uzlib_uncomp d; - uint32_t decomp_len; - uint32_t decomp_left; - uint32_t current_out_pos = 0; - current_in_pos = address_in; - FLASH_Read(0, address_in + size_compressed - 4, (uint8_t *)&decomp_len, 4); // Read the expected decompressed len - printf("Compressed size is: %i\r\n", size_compressed); - printf("Decompressed size is: %i\r\n", decomp_len); - - if (decomp_len + 1 > max_len_temp) - { - printf("Error decompiled file will get too big\r\n"); - sprintf(error_reason, "Out too big %i of max %i bytes", decomp_len, max_len_temp); - return 0; - } - - decomp_left = decomp_len + 1; - uzlib_init(); - uzlib_uncompress_init(&d, dict_buffer, 32768); - - d.source = NULL; - d.source_limit = 0; - d.source_read_cb = callback_read_more_data; // Read each byte in the callback to save RAM - - res = uzlib_gzip_parse_header(&d); - if (res != TINF_OK) - { - printf("Error parsing header: %d\r\n", res); - sprintf(error_reason, "Error parsing header %i", res); - return 0; - } - printf("Header parsed !\r\n"); - - qspiEraseRange(address_temp, max_len_temp); - printf("OTA Area erased\r\n"); - while (decomp_left) - { - WDT_RestartCounter(); - unsigned int chunk_len = decomp_left < OUT_CHUNK_SIZE ? decomp_left : OUT_CHUNK_SIZE; - d.dest = out_buffer; - d.dest_start = d.dest; - d.dest_limit = d.dest + sizeof(out_buffer); - // printf("One round: %i\r\n", decomp_left); - // printf("chunk_len: %i\r\n", chunk_len); - res = uzlib_uncompress_chksum(&d); - // printf("res: %i\r\n", res); - decomp_left -= chunk_len; - FLASH_Write(false, address_temp + current_out_pos, out_buffer, chunk_len); - current_out_pos += chunk_len; - - if (res == TINF_DONE) - { - break; - } - if (res != TINF_OK) - { - printf("Some error inner decomp %i\r\n", res); - sprintf(error_reason, "Inner decomp error %i", res); - return 0; - } - } - if (res != TINF_DONE) - { - printf("Some error in decomp %i\r\n", res); - sprintf(error_reason, "Decomp error %i", res); - return 0; - } - printf("Decompression done\r\n"); - printf("Writing image to correct position\r\n"); - qspiEraseRange(address_in, EEPROM_IMG_EACH); - uint32_t copy_left = decomp_len; - current_out_pos = 0; - while (copy_left) - { - WDT_RestartCounter(); - unsigned int chunk_len = copy_left < OUT_CHUNK_SIZE ? copy_left : OUT_CHUNK_SIZE; - FLASH_Read(0, address_temp + current_out_pos, (uint8_t *)&out_buffer, chunk_len); - FLASH_Write(false, address_in + current_out_pos, out_buffer, chunk_len); - current_out_pos += chunk_len; - copy_left -= chunk_len; - } - backup_header.size = decomp_len; - // Writing back the header of an uncompressed image - FLASH_Write(false, address_in - sizeof(struct EepromImageHeader), (uint8_t *)&backup_header, sizeof(struct EepromImageHeader)); - printf("Everything done\r\n"); - return decomp_len; -} \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.h deleted file mode 100644 index b059a007..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/compression.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "uzlib/src/uzlib.h" -//#include -#include -#include -#include - -uint32_t decompress_file(uint32_t address_in, uint32_t size_compressed, uint32_t address_temp, uint32_t max_len_temp, char error_reason[100]); \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/drawing.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/drawing.c old mode 100644 new mode 100755 index 20b01fd7..c8e47e13 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/drawing.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/drawing.c @@ -1,95 +1,67 @@ #include "drawing.h" #include -#include -#include "printf.h" #include "board.h" #include "eeprom.h" -#include "proto.h" -#include "timer.h" -#include "screen.h" -#include "util.h" #include "epd.h" +#include "printf.h" +#include "proto.h" +#include "screen.h" +#include "timer.h" +#include "util.h" - -struct BitmapClutEntry -{ +struct BitmapClutEntry { uint8_t b, g, r, x; }; - uint8_t mPassNo = 0; static uint8_t mClutMap[256]; static uint8_t mClutMapRed[256]; -void drawImageAtAddress(uint32_t addr, uint8_t lut) -{ +void drawImageAtAddress(uint32_t addr, uint8_t lut) { struct EepromImageHeader *eih = (struct EepromImageHeader *)mClutMap; eepromRead(addr, mClutMap, sizeof(struct EepromImageHeader)); - switch (eih->dataType) - { - case DATATYPE_IMG_RAW_1BPP: - printf("Doing raw 1bpp\n"); + switch (eih->dataType) { + case DATATYPE_IMG_RAW_1BPP: + printf("Doing raw 1bpp\n"); - init_epd(); - display_send_start(1); - for (uint32_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) - { - if (c % 256 == 0) - { - eepromRead(addr + sizeof(struct EepromImageHeader) + c, mClutMap, 256); + init_epd(); + display_send_start(1); + for (uint32_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) { + if (c % 256 == 0) { + eepromRead(addr + sizeof(struct EepromImageHeader) + c, mClutMap, 256); + } + + uint8_t curr_byte = mClutMap[c % 256]; // this one holds 8 pixel, we will translate them to 4 sendings + + interleaveColor(curr_byte, 0x00); } + display_send_stop(); + epd_refresh_and_sleep(lut); + break; + case DATATYPE_IMG_RAW_2BPP: + printf("Doing raw 2bpp\n"); + init_epd(); + display_send_start(1); + for (uint32_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) { + if (c % 256 == 0) { + eepromRead(addr + sizeof(struct EepromImageHeader) + c, mClutMap, 256); + eepromRead(addr + sizeof(struct EepromImageHeader) + (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)) + c, mClutMapRed, 256); + } - uint8_t curr_byte = mClutMap[c % 256]; // this one holds 8 pixel, we will translate them to 4 sendings + uint8_t curr_byte = mClutMap[c % 256]; // this one holds 8 pixel, we will translate them to 4 sendings + uint8_t curr_byteRed = mClutMapRed[c % 256]; // this one holds 8 pixel, we will translate them to 4 sendings - for (int pixI = 0; pixI < 4; pixI++) - { - uint8_t pixel1 = (curr_byte & 0x80) ? 0 : 3; - curr_byte <<= 1; - uint8_t pixel2 = (curr_byte & 0x80) ? 0 : 3; - curr_byte <<= 1; - display_tx_byte((pixel1 << 4) | pixel2); + interleaveColor(curr_byte, curr_byteRed); } - } - display_send_stop(); - epd_refresh_and_sleep(); - break; - case DATATYPE_IMG_RAW_2BPP: - printf("Doing raw 2bpp\n"); - init_epd(); - display_send_start(1); - for (uint32_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) - { - if (c % 256 == 0) - { - eepromRead(addr + sizeof(struct EepromImageHeader) + c, mClutMap, 256); - eepromRead(addr + sizeof(struct EepromImageHeader) + (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)) + c, mClutMapRed, 256); - } - - uint8_t curr_byte = mClutMap[c % 256]; // this one holds 8 pixel, we will translate them to 4 sendings - uint8_t curr_byteRed = mClutMapRed[c % 256]; // this one holds 8 pixel, we will translate them to 4 sendings - - for (int pixI = 0; pixI < 4; pixI++) - { - uint8_t pixel1 = (curr_byte & 0x80) ? 0 : 3; - pixel1 = (curr_byteRed & 0x80) ? 4 : pixel1; - curr_byte <<= 1; - curr_byteRed <<= 1; - uint8_t pixel2 = (curr_byte & 0x80) ? 0 : 3; - pixel2 = (curr_byteRed & 0x80) ? 4 : pixel1; - curr_byte <<= 1; - curr_byteRed <<= 1; - display_tx_byte((pixel1 << 4) | pixel2); - } - } - display_send_stop(); - epd_refresh_and_sleep(); - break; - default: // prevent drawing from an unknown file image type - printf("Image with type 0x%02X was requested, but we don't know what to do with that currently...\n", eih->dataType); - return; + display_send_stop(); + epd_refresh_and_sleep(lut); + break; + default: // prevent drawing from an unknown file image type + printf("Image with type 0x%02X was requested, but we don't know what to do with that currently...\n", eih->dataType); + return; } // addOverlay(); // drawWithSleep(); diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/eeprom.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/eeprom.h old mode 100644 new mode 100755 index 14a0f3ec..f048d116 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/eeprom.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/eeprom.h @@ -7,8 +7,7 @@ #define EEPROM_ERZ_SECTOR_SZ 4096 //erase size and alignment //pages are 4K in size //an update can be stored in any 2 image slots -#define EEPROM_UPDATA_AREA_START (0x17000UL) -#define EEPROM_UPDATE_AREA_LEN (0x10000UL) + #define EEPROM_PAGE_SIZE (0x01000UL) #define EEPROM_OS_START (0x00000UL) @@ -32,18 +31,7 @@ #define EEPROM_IMG_VALID (0x494d4721) -#define EEPROM_PIECE_SZ (88) -struct EepromImageHeaderOld { - uint64_t version; - uint32_t validMarker; - uint32_t size; - uint32_t rfu[8]; //zero-filled for now - uint8_t piecesMissing[256]; //each bit represents a 64-byte piece - - //image data here - //os update here possibly (EEPROM_OS_UPDATE_SZ_PER_IMG bytes each piece) - //we pre-erase so progress can be calculated by finding the first non-0xff byte -}; +//#define EEPROM_PIECE_SZ (88) struct EepromImageHeader { //each image space is 0x17000 bytes, we have space for ten of them uint64_t version; diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.c index 7998eccc..8e9e4c71 100755 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.c @@ -2,8 +2,7 @@ #include #include -//#include -#include "printf.h" +// #include #include #include @@ -16,6 +15,7 @@ #include "mz100_pinmux.h" #include "mz100_ssp.h" #include "mz100_wdt.h" +#include "printf.h" #include "stdarg.h" #include "util.h" @@ -63,6 +63,17 @@ static uint8_t EPDtempBracket = 0; +#define CHAR_WIDTH_BYTES 2 +#define CHAR_HEIGHT 20 +#define CHAR_WIDTH 12 +#define SCREEN_WIDTH 640 + +uint8_t buffer[CHAR_HEIGHT][640 / 8]; +uint8_t charbuffer[CHAR_HEIGHT][CHAR_WIDTH_BYTES + 1]; + +#define CHAR_SPACING 1 +#define EMPTY_SPACING 3 + struct epd_colorlutpart { uint8_t repeat; uint8_t lvl0 : 4; @@ -114,13 +125,39 @@ struct epd_xonlut { struct epd_xonlutpart part[20]; } __packed; -void interleaveColor(uint8_t b) { +void interleaveBW(uint8_t b) { b ^= 0xFF; uint8_t b_out = 0; for (uint8_t shift = 0; shift < 4; shift++) { b_out = 0; - if ((b >> 2 * shift) & 0x01) b_out |= 0x30; - if ((b >> 2 * shift) & 0x02) b_out |= 0x03; + if ((b >> 2 * shift) & 0x01) b_out |= 0x30; // 0x30 + if ((b >> 2 * shift) & 0x02) b_out |= 0x03; // 0x03 + display_tx_byte(b_out); + } +} + +void interleaveColor(uint8_t b, uint8_t r) { + b ^= 0xFF; + uint8_t b_out = 0; + for (int8_t shift = 3; shift >= 0; shift--) { + b_out = 0; + if (((b >> 2 * shift) & 0x01) && ((r >> 2 * shift) & 0x01)) { + b_out |= 0x04; // 0x30 + } else if ((b >> 2 * shift) & 0x01) { + b_out |= 0x03; // 0x30 + } else if ((r >> 2 * shift) & 0x01) { // 4 or 5 + b_out |= 0x04; // 0x30 + } else { + } + + if (((b >> 2 * shift) & 0x02) && ((r >> 2 * shift) & 0x02)) { + b_out |= 0x40; // 0x30 + } else if ((b >> 2 * shift) & 0x02) { + b_out |= 0x30; // 0x30 + } else if ((r >> 2 * shift) & 0x02) { + b_out |= 0x40; // 0x30 + } else { + } display_tx_byte(b_out); } } @@ -423,21 +460,9 @@ void shiftLeftByX(uint8_t *data, int X, int N) { data[i] = (data[i] << X) | ((data[i - 1] >> (8 - X)) & ((1 << X) - 1)); } } -#define CHAR_WIDTH_BYTES 2 -#define CHAR_HEIGHT 20 -#define CHAR_WIDTH 12 -#define SCREEN_WIDTH 640 - -uint8_t buffer[CHAR_HEIGHT][640 / 8]; -uint8_t charbuffer[CHAR_HEIGHT][CHAR_WIDTH_BYTES + 1]; - -// uint16_t curX = 0; -#define CHAR_SPACING 1 -#define EMPTY_SPACING 3 uint16_t loadCharacter(uint8_t currentChar, uint16_t curX, bool first) { - - currentChar-=0x20; + currentChar -= 0x20; memset(charbuffer, 0, sizeof(charbuffer)); for (uint8_t d = 0; d < CHAR_HEIGHT; d++) { @@ -507,19 +532,29 @@ void dumpBuffer(uint16_t xloc, uint16_t yloc, uint16_t width) { display_send_start(0); for (uint8_t curY = 0; curY < CHAR_HEIGHT; curY++) { for (uint16_t curX = 0; curX < width; curX += 8) { - interleaveColor(buffer[curY][curX / 8]); + interleaveBW(buffer[curY][curX / 8]); } } display_send_stop(); } -void loadLUTSfromEEPROM() { - uint8_t bracket = getTempBracket(); +void loadLUTSfromEEPROM(uint8_t bracket) { for (uint8_t c = EPD_LUT_B; c <= EPD_LUT_R3; c++) { struct epd_colorlut *colorlut = (struct epd_colorlut *)loadLUT(c, bracket); - for (uint8_t part = 0; part < 20; part++) { + + for (uint8_t d = 0; d < 8; d++) { + colorlut->part[1].length[d] = 1; + colorlut->part[0].length[d] = 1; + } + + for (uint8_t part = 0; part < 4; part++) { if (colorlut->part[part].repeat) colorlut->part[part].repeat = 1; } + + for (uint8_t part = 4; part < 20; part++) { + if (colorlut->part[part].repeat) colorlut->part[part].repeat = 0; + } + lutBeginTX(c); for (uint16_t d = 0; d < 260; d++) { display_tx_byte(((uint8_t *)colorlut)[d]); @@ -529,8 +564,9 @@ void loadLUTSfromEEPROM() { } struct epd_vcomlut *vcomlut = (struct epd_vcomlut *)loadLUT(EPD_LUT_VCOM, bracket); + for (uint8_t part = 0; part < 20; part++) { - if (vcomlut->part[part].repeat) vcomlut->part[part].repeat = 1; + if (vcomlut->part[part].repeat) vcomlut->part[part].repeat = 0; } lutBeginTX(EPD_LUT_VCOM); for (uint16_t d = 0; d < 220; d++) { @@ -540,8 +576,12 @@ void loadLUTSfromEEPROM() { if (vcomlut) free(vcomlut); struct epd_xonlut *xonlut = (struct epd_xonlut *)loadLUT(EPD_LUT_XON, bracket); + + // memset(&(xonlut->part[0].repeat), 0x00, sizeof(struct epd_xonlutpart)); + // memset(&(xonlut->part[1].repeat), 0x00, sizeof(struct epd_xonlutpart)); + for (uint8_t part = 0; part < 20; part++) { - if (xonlut->part[part].repeat) xonlut->part[part].repeat = 1; + if (xonlut->part[part].repeat) xonlut->part[part].repeat = 0; } lutBeginTX(EPD_LUT_XON); for (uint16_t d = 0; d < 200; d++) { @@ -595,31 +635,45 @@ void fillWindow(uint16_t x, uint16_t y, uint16_t xe, uint16_t ye, uint8_t color) display_send_start(0); for (uint32_t c = 0; c < (xe - x) * (ye - y) / 8; c++) { - interleaveColor(0x00); + interleaveBW(0x00); } display_send_stop(); } -void epd_refresh_and_sleep() { - loadLUTSfromEEPROM(EPDtempBracket); +void epd_refresh_and_sleep(uint8_t lut) { + if (lut) { + epdWrite(EPD_PANEL_SETTING, 2, 0xC3, 0x88); // 0xC3-0x88 // lut from register + loadLUTSfromEEPROM(EPDtempBracket); + } else { + epdWrite(EPD_PANEL_SETTING, 2, 0xC3, 0x08); // 0xC3-0x88 // lut from EEPROM + epdWrite(EPD_UNKNOWN_1, 1, 0x03); // load lut, probably + } // epdPrintf(50,100,false,"Blaat! Dit is een test %d", 6); EPD_cmd(EPD_REFRESH); - delay(100000); + + unsigned int v2 = 0; + while (GPIO_ReadPinLevel(EPD_BUSY) == GPIO_IO_HIGH) { + WDT_RestartCounter(); + delay(10000); + v2++; + if (v2 > 10) + break; + } do_sleeped_epd_refresh(); init_GPIO_EPD(); epd_reset(); - epd_reset(); + // epd_reset(); EPD_cmd(EPD_POWER_SETTING); EPD_data(2); EPD_data(0); EPD_data(0); EPD_data(0); - delay_us(500000); + delay_us(50000); EPD_cmd(EPD_POWER_OFF); - delay_us(1000000); + delay_us(100000); BUSY_wait(0x32u); EPD_cmd(EPD_SPI_FLASH_CONTROL); EPD_data(1); @@ -701,9 +755,9 @@ void init_epd(void) { epdWrite(EPD_SPI_FLASH_CONTROL, 1, 0x00); epdWrite(EPD_POWER_SETTING, 4, 0x37, 0x00, 0x05, 0x05); // 0x37 - 00- 05 05 - epdWrite(EPD_PANEL_SETTING, 2, 0xC3, 0x88); // CB-88 // CB-08 // C3-reverse + // epdWrite(EPD_POWER_SETTING, 4, 0x07, 0x00, 0x05, 0x05); // 0x37 - 00- 05 05 - // epdWrite(EPD_UNKNOWN_1, 1, 0x03); + epdWrite(EPD_PANEL_SETTING, 2, 0xC3, 0x08); // 0xC3-0x88 // lut from EEPROM epdWrite(EPD_POWER_OFF_SEQUENCE, 1, 0x00); epdWrite(EPD_BOOSTER_SOFT_START, 0x03, 199, 204, 45); @@ -714,12 +768,9 @@ void init_epd(void) { epdWrite(EPD_TCON_SET, 0x01, 34); epdWrite(EPD_TRES, 0x04, 2, 128, 1, 128); - //setDisplayWindow(96, 32, 496, 332); - EPDtempBracket = getTempBracket(); loadFrameRatePLL(EPDtempBracket); loadTempVCOMDC(EPDtempBracket); - printf("EPD Powerup complete\n"); } void epdPrintf(uint16_t x, uint16_t y, bool color, const char *c, ...) { @@ -731,7 +782,7 @@ void epdPrintf(uint16_t x, uint16_t y, bool color, const char *c, ...) { memset(charbuffer, 0, sizeof(charbuffer)); va_list lst; va_start(lst, c); - vsnprintf(out_buffer,256, c, lst); + vsnprintf(out_buffer, 256, c, lst); va_end(lst); curX = x % 8; @@ -750,4 +801,18 @@ void epdPrintf(uint16_t x, uint16_t y, bool color, const char *c, ...) { x /= 8; x *= 8; dumpBuffer(x, y, curX); +} + +void drawImg(uint16_t x, uint16_t y, const uint8_t *img) { + uint16_t width = img[0]; + uint16_t height = img[1]; + img += 2; + setDisplayWindow(x, y, x + width, y + height); + display_send_start(0); + for (uint8_t curY = 0; curY < height; curY++) { + for (uint16_t curX = 0; curX < width; curX += 8) { + interleaveColor(*(img++), 0x00); + } + } + display_send_stop(); } \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.h old mode 100644 new mode 100755 index 9b68d899..29f36499 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/epd.h @@ -32,7 +32,7 @@ void init_GPIO_EPD(); void display_send_buffer(); -void epd_refresh_and_sleep(); +void epd_refresh_and_sleep(uint8_t lut); void display_tx_byte(uint8_t data); void display_send_start(uint8_t inverted); @@ -50,4 +50,9 @@ void epd_pin_enable(int a1); void fillWindow(uint16_t x, uint16_t y, uint16_t xe, uint16_t ye, uint8_t color); -void epdPrintf(uint16_t x, uint16_t y, bool color, const char* c, ...); \ No newline at end of file +void epdPrintf(uint16_t x, uint16_t y, bool color, const char* c, ...); + +void interleaveColor(uint8_t b, uint8_t r); +void interleaveBW(uint8_t); + +void drawImg(uint16_t x, uint16_t y, const uint8_t *img); \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.c index 41be818d..53be5514 100755 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.c @@ -2,11 +2,8 @@ #include #include -// #include #include -#include "ccm.h" -#include "chars.h" #include "comms.h" #include "core_cm3.h" #include "eeprom.h" @@ -48,73 +45,24 @@ char macStr1[32]; __attribute__((section(".aon"))) uint8_t currentTagMode = TAG_MODE_CHANSEARCH; __attribute__((section(".aon"))) volatile struct zigbeeCalibDataStruct zigbeeCalibData; -void prvApplyUpdateIfNeeded() { - uint32_t ofst, now, size, pieceSz = 0x2000; - uint8_t chunkStore[0x2000]; - (*(volatile unsigned int *)0x130000) = 0; // Invalidate RAM in any case so the next boot will be a full one - (*(volatile unsigned int *)0x130400) = 0; - - printf("Applying update\r\n"); - qspiEraseRange(EEPROM_OS_START, EEPROM_OS_LEN); - - size = EEPROM_OS_LEN; - for (ofst = 0; ofst < size; ofst += now) { - now = size - ofst; - if (now > pieceSz) - now = pieceSz; - printf("Cpy 0x%06x + 0x%04x to 0x%06x\r\n", EEPROM_UPDATE_START + ofst, now, EEPROM_OS_START + ofst); - FLASH_Read(0, EEPROM_UPDATE_START + ofst, chunkStore, now); - FLASH_Write(false, EEPROM_OS_START + ofst, chunkStore, now); - WDT_RestartCounter(); - } - - // printf("Erz IMAGES\r\n"); - // qspiEraseRange(EEPROM_IMG_START, EEPROM_IMG_LEN); - // printf("Erz update\r\n"); - // qspiEraseRange(EEPROM_UPDATE_START, EEPROM_UPDATE_LEN); - sleep_with_with_wakeup(1000); -} - -void prvEepromIndex(struct EepromContentsInfo *eci) { - struct EepromImageHeader eih; - uint32_t addr; - - for (addr = EEPROM_IMG_START; addr - EEPROM_IMG_START < EEPROM_IMG_LEN; addr += EEPROM_IMG_EACH) { - uint32_t *addrP, *szP = NULL; - uint64_t *verP = NULL; - - FLASH_Read(0, addr, (uint8_t *)&eih, sizeof(struct EepromImageHeader)); - printf("DATA slot 0x%06x: type 0x%08x ver 0x%08x%08x\r\n", addr, eih.validMarker, (uint32_t)(eih.version >> 32), (uint32_t)eih.version); - - switch (eih.validMarker) { - case EEPROM_IMG_INPROGRESS: - verP = &eci->latestInprogressImgVer; - addrP = &eci->latestInprogressImgAddr; - break; - - case EEPROM_IMG_VALID: - verP = &eci->latestCompleteImgVer; - addrP = &eci->latestCompleteImgAddr; - szP = &eci->latestCompleteImgSize; - break; - } - - if (verP && eih.version >= *verP) { - *verP = eih.version; - *addrP = addr; - if (szP) - *szP = eih.size; +bool protectedFlashWrite(uint32_t address, uint8_t *buffer, uint32_t num) { + uint8_t attempt = 3; + uint8_t *buf2 = (uint8_t *)malloc(num); + while (attempt--) { + qspiEraseRange(address, num); + delay(50); + FLASH_Write(false, address, buffer, num); + FLASH_Read(0, address, buf2, num); + if (memcmp(buffer, buf2, num) == 0) { + printf("Flash block at %06X written successfully\n", address); + free(buf2); + return true; } + printf("Failed attempt to write flash block at %lu\n", address); } -} -void prvWriteNewHeader(struct EepromImageHeaderOld *eih, uint32_t addr, uint32_t eeSize, uint64_t ver, uint32_t size) { - qspiEraseRange(addr, eeSize); - // bzero(eih, sizeof(struct EepromImageHeaderOld)); - eih->version = ver; - eih->validMarker = EEPROM_IMG_INPROGRESS; - eih->size = size; - memset(eih->piecesMissing, 0xff, sizeof(eih->piecesMissing)); - FLASH_Write(false, addr, (uint8_t *)eih, sizeof(struct EepromImageHeaderOld)); + free(buf2); + printf("Giving up on writing block at %lu\n", address); + return false; } static void prvGetSelfMac(void) { @@ -158,6 +106,7 @@ uint8_t showChannelSelect() { // returns 0 if no accesspoints were found } uint8_t channelSelect() { // returns 0 if no accesspoints were found + printf("Doing chansearch...\n"); uint8_t result[16]; memset(result, 0, sizeof(result)); @@ -336,7 +285,6 @@ void TagAssociated() { if ((lowBattery && !lowBatteryShown && tagSettings.enableLowBatSymbol) || (noAPShown && tagSettings.enableNoRFSymbol)) { printf("For some reason, we're going to redraw the image. lowbat=%d, lowbatshown=%d, noAPShown=%d\n", lowBattery, lowBatteryShown, noAPShown); // Check if we were already displaying an image - /* if (curImgSlot != 0xFF) { powerUp(INIT_EEPROM | INIT_EPD); wdt60s(); @@ -347,7 +295,6 @@ void TagAssociated() { showAPFound(); powerDown(INIT_EPD); } - */ } powerUp(INIT_RADIO); @@ -473,6 +420,8 @@ int main(void) { printf("AON is not valid!\n"); setupRTC(); clearAonRam(); + + showSplashScreen(); currentChannel = 0; zigbeeCalibData.isValid = false; wakeUpReason = WAKEUP_REASON_FIRSTBOOT; @@ -483,8 +432,6 @@ int main(void) { loadDefaultSettings(); doVoltageReading(); - qspiEraseRange(EEPROM_IMG_START, EEPROM_IMG_LEN); - qspiEraseRange(EEPROM_UPDATE_START, EEPROM_UPDATE_LEN); qspiEraseRange(EEPROM_SETTINGS_AREA_START, EEPROM_SETTINGS_AREA_LEN); sprintf(macStr, "(" MACFMT ")", MACCVT(mSelfMac)); @@ -498,6 +445,7 @@ int main(void) { currentTagMode = TAG_MODE_ASSOCIATED; } else { printf("No AP found\r\n"); + showNoAP(); sleep_with_with_wakeup(120000UL); currentTagMode = TAG_MODE_CHANSEARCH; } @@ -511,8 +459,8 @@ int main(void) { memset(curBlock.requestedParts, 0x00, BLOCK_REQ_PARTS_BYTES); } + powerUp(INIT_UART); while (1) { - powerUp(INIT_UART); wdt10s(); switch (currentTagMode) { case TAG_MODE_ASSOCIATED: @@ -533,4 +481,29 @@ int _write(int file, char *ptr, int len) { void _putchar(char c) { _write(0, &c, 1); -} \ No newline at end of file +} + +void applyUpdate() { + uint32_t ofst, now, size, pieceSz = 0x2000; + uint8_t chunkStore[0x2000]; + + printf("Applying update\r\n"); + + // apparently, the flash process is more reliable if we do these two first + setupCLKCalib(); + setupRTC(); + + showApplyUpdate(); + + size = EEPROM_OS_LEN; + for (ofst = 0; ofst < size; ofst += now) { + now = size - ofst; + if (now > pieceSz) + now = pieceSz; + printf("Cpy 0x%06x + 0x%04x to 0x%06x\r\n", EEPROM_UPDATE_START + ofst, now, EEPROM_OS_START + ofst); + FLASH_Read(0, EEPROM_UPDATE_START + ofst, chunkStore, now); + protectedFlashWrite(EEPROM_OS_START + ofst, chunkStore, now); + WDT_RestartCounter(); + } + NVIC_SystemReset(); +} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.h old mode 100644 new mode 100755 index ab44cabd..91e07da8 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/main.h @@ -28,11 +28,7 @@ #define EPD_BUSY 27 #define EPD_HLT_CTRL 25 + #define RADIO_FIRST_CHANNEL (11) //2.4-GHz channels start at 11 -struct EepromContentsInfo -{ - uint32_t latestCompleteImgAddr, latestInprogressImgAddr, latestCompleteImgSize; - uint64_t latestCompleteImgVer, latestInprogressImgVer; -}; -void uiPrvFullscreenMsg(const char *str, const char *line2, const char *line3); -void prvApplyUpdateIfNeeded(); \ No newline at end of file + +void applyUpdate(); \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/powermgt.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/powermgt.h old mode 100644 new mode 100755 index eed0e059..f44632ef --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/powermgt.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/powermgt.h @@ -26,7 +26,7 @@ // power saving algorithm #define INTERVAL_BASE 40 // interval (in seconds) (when 1 packet is sent/received) for target current (7.2µA) -#define INTERVAL_AT_MAX_ATTEMPTS 600 // interval (in seconds) (at max attempts) for target average current +#define INTERVAL_AT_MAX_ATTEMPTS 300 // interval (in seconds) (at max attempts) for target average current #define DATA_REQ_RX_WINDOW_SIZE 5UL // How many milliseconds we should wait for a packet during the data_request. // If the AP holds a long list of data for tags, it may need a little more time to lookup the mac address #define DATA_REQ_MAX_ATTEMPTS 3 // How many attempts (at most) we should do to get something back from the AP diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/proto.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/proto.h old mode 100644 new mode 100755 index e87d7326..60d2e8f8 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/proto.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/proto.h @@ -3,364 +3,10 @@ #include -/* - All communications are direct from tag to station, EXCEPT association (tag will broadcast). - All comms shall be encrypted and authenticated with AES-CCM. Shared key shall be burned into the firmware. - Master shall provision new key at association. All non-bcast packets shall have pan id compression. - Master may skip "from" field. Tag checking in confirms it got the master's provisioning reply. - - Sadly filtering on MZ100 fails for long addr with no src addr. so short addr for src is used - - T = tag, S = station - - PACKET TYPE USE PAYLOAD STRUCT NOTES - ASSOC_REQ T2bcast TagInfo tag's info and assoc request (encrypted with shared key) - ASSOC_RESP S2T AssocInfo tag's association info (encrypted with shared key) - CHECKIN T2S CheckinInfo tag checking in occasionally - CHECKOUT S2T PendingInfo station's checkin reply telling tag what we have for it - CHUNK_REQ T2S ChunkReqInfo tag requesting a piece of data - CHUNK_RESP S2T ChunkInfo station provides chunk - -*/ - -#define PROTO_PRESHARED_KEY \ - { 0x34D906D3, 0xE3E5298E, 0x3429BF58, 0xC1022081 } - -#define PROTO_PAN_ID (0x4447) // PAN ID compression shall be used - -#define PKT_ASSOC_REQ (0xF0) -#define PKT_ASSOC_RESP (0xF1) -#define PKT_CHECKIN (0xF2) -#define PKT_CHECKOUT (0xF3) -#define PKT_CHUNK_REQ (0xF4) -#define PKT_CHUNK_RESP (0xF5) - -#define PROTO_VER_0 (0) -#define PROTO_VER_CURRENT (PROTO_VER_0) - -#define PROTO_COMPR_TYPE_LZ (0x0001) -#define PROTO_COMPR_TYPE_BITPACK (0x0002) - -#define PROTO_MAX_DL_LEN (88) - -//////////////// NEW - -#include "tag_types.h" -/* -// power saving algorithm -#define INTERVAL_BASE 40 // interval (in seconds) (when 1 packet is sent/received) for target current (7.2µA) -#define INTERVAL_AT_MAX_ATTEMPTS 600 // interval (in seconds) (at max attempts) for target average current -#define DATA_REQ_RX_WINDOW_SIZE 5UL // How many milliseconds we should wait for a packet during the data_request. - // If the AP holds a long list of data for tags, it may need a little more time to lookup the mac address -#define DATA_REQ_MAX_ATTEMPTS 14 // How many attempts (at most) we should do to get something back from the AP -#define POWER_SAVING_SMOOTHING 8 // How many samples we should use to smooth the data request interval -#define MINIMUM_INTERVAL 45 // IMPORTANT: Minimum interval for check-in; this determines overal battery life! -#define MAXIMUM_PING_ATTEMPTS 20 // How many attempts to discover an AP the tag should do - -#define LONG_DATAREQ_INTERVAL 300 // How often (in seconds, approximately) the tag should do a long datareq (including temperature) -#define VOLTAGE_CHECK_INTERVAL 288 // How often the tag should do a battery voltage check (multiplied by LONG_DATAREQ_INTERVAL) -#define BATTERY_VOLTAGE_MINIMUM 2450 // 2600 or below is the best we can do on the EPD - -// power saving when no AP's were found (scanning every X) -#define VOLTAGEREADING_DURING_SCAN_INTERVAL 2 // how often we should read voltages; this is done every scan attempt in interval bracket 3 -#define INTERVAL_1_TIME 3600UL // Try every hour -#define INTERVAL_1_ATTEMPTS 24 // for 24 attempts (an entire day) -#define INTERVAL_2_TIME 7200UL // Try every 2 hours -#define INTERVAL_2_ATTEMPTS 12 // for 12 attempts (an additional day) -#define INTERVAL_3_TIME 86400UL // Finally, try every day -*/ -#pragma pack(1) -enum TagScreenType { - TagScreenEink_BW_1bpp, - TagScreenEink_BW_2bpp, - TagScreenEink_BW_4bpp, - TagScreenEink_BWY_only, // 2bpp, but only 3 colors (BW?Y) - TagScreenEink_BWY_2bpp, - TagScreenEink_BWY_4bpp, - TagScreenEink_BWR_only, // 2bpp, but only 3 colors (BW?R) - TagScreenEink_BWR_2bpp, - TagScreenEink_BWR_4bpp, - - TagScreenEink_BWY_3bpp, - TagScreenEink_BWR_3bpp, - TagScreenEink_BW_3bpp, - - TagScreenPersistentLcd_1bpp, - - TagScreenEink_BWY_5colors, - TagScreenEink_BWR_5colors, - - TagScreenEink_BWY_6colors, - TagScreenEink_BWR_6colors, - - TagScreenTypeOther = 0x7f, -}; - -#define RADIO_MAX_PACKET_LEN (125) // useful payload, not including the crc - -#define ADDR_MODE_NONE (0) -#define ADDR_MODE_SHORT (2) -#define ADDR_MODE_LONG (3) - -#define FRAME_TYPE_BEACON (0) -#define FRAME_TYPE_DATA (1) -#define FRAME_TYPE_ACK (2) -#define FRAME_TYPE_MAC_CMD (3) - -#define SHORT_MAC_UNUSED (0x10000000UL) // for radioRxFilterCfg's myShortMac - -struct MacFcs { - uint8_t frameType : 3; - uint8_t secure : 1; - uint8_t framePending : 1; - uint8_t ackReqd : 1; - uint8_t panIdCompressed : 1; - uint8_t rfu1 : 1; - uint8_t rfu2 : 2; - uint8_t destAddrType : 2; - uint8_t frameVer : 2; - uint8_t srcAddrType : 2; -}; - -struct MacFrameFromMaster { - struct MacFcs fcs; - uint8_t seq; - uint16_t pan; - uint8_t dst[8]; - uint16_t from; -}; - -struct MacFrameNormal { - struct MacFcs fcs; - uint8_t seq; - uint16_t pan; - uint8_t dst[8]; - uint8_t src[8]; -}; - -struct MacFrameBcast { - struct MacFcs fcs; - uint8_t seq; - uint16_t dstPan; - uint16_t dstAddr; - uint16_t srcPan; - uint8_t src[8]; -}; - -#define PKT_AVAIL_DATA_SHORTREQ 0xE3 -#define PKT_AVAIL_DATA_REQ 0xE5 -#define PKT_AVAIL_DATA_INFO 0xE6 -#define PKT_BLOCK_PARTIAL_REQUEST 0xE7 -#define PKT_BLOCK_REQUEST_ACK 0xE9 -#define PKT_BLOCK_REQUEST 0xE4 -#define PKT_BLOCK_PART 0xE8 -#define PKT_XFER_COMPLETE 0xEA -#define PKT_XFER_COMPLETE_ACK 0xEB -#define PKT_CANCEL_XFER 0xEC -#define PKT_PING 0xED -#define PKT_PONG 0xEE - -struct AvailDataReq { - uint8_t checksum; - uint8_t lastPacketLQI; - int8_t lastPacketRSSI; - int8_t temperature; - uint16_t batteryMv; - uint8_t hwType; - uint8_t wakeupReason; - uint8_t capabilities; - uint16_t tagSoftwareVersion; - uint8_t currentChannel; - uint8_t customMode; - uint8_t reserved[8]; -}; - -struct oldAvailDataReq { - uint8_t checksum; - uint8_t lastPacketLQI; - int8_t lastPacketRSSI; - int8_t temperature; - uint16_t batteryMv; - uint8_t hwType; - uint8_t wakeupReason; - uint8_t capabilities; -}; - -struct AvailDataInfo { - uint8_t checksum; - uint64_t dataVer; // MD5 of potential traffic - uint32_t dataSize; - uint8_t dataType; - uint8_t dataTypeArgument; // extra specification or instruction for the tag (LUT to be used for drawing image) - uint16_t nextCheckIn; // when should the tag check-in again? Measured in minutes -} __attribute__((packed)) ; - -struct pendingData { - struct AvailDataInfo availdatainfo; - uint16_t attemptsLeft; - uint8_t targetMac[8]; -}; - -struct blockPart { - uint8_t checksum; - uint8_t blockId; - uint8_t blockPart; - uint8_t data[]; -}; - -struct blockData { - uint16_t size; - uint16_t checksum; - uint8_t data[]; -}; - -struct burstMacData { - uint16_t offset; - uint8_t targetMac[8]; -}; - -#define BLOCK_PART_DATA_SIZE 99 -#define BLOCK_MAX_PARTS 42 -#define BLOCK_DATA_SIZE 4096UL -#define BLOCK_XFER_BUFFER_SIZE BLOCK_DATA_SIZE + sizeof(struct blockData) -#define BLOCK_REQ_PARTS_BYTES 6 - -struct blockRequest { - uint8_t checksum; - uint64_t ver; - uint8_t blockId; - uint8_t type; - uint8_t requestedParts[BLOCK_REQ_PARTS_BYTES]; -} ; - -struct blockRequestAck { - uint8_t checksum; - uint16_t pleaseWaitMs; -}; - -struct espBlockRequest { - uint8_t checksum; - uint64_t ver; - uint8_t blockId; - uint8_t src[8]; -}; - -struct espXferComplete { - uint8_t checksum; - uint8_t src[8]; -}; - -struct espAvailDataReq { - uint8_t checksum; - uint8_t src[8]; - struct AvailDataReq adr; -}; - -struct espSetChannelPower { - uint8_t checksum; - uint8_t channel; - uint8_t power; -}; -#pragma pack(0) -///////////////// NEW END -#ifndef __packed -#define __packed __attribute__((packed)) -#endif -struct TagState { - uint64_t swVer; - uint16_t hwType; - uint16_t batteryMv; -} __packed; - -struct TagInfo { - uint8_t protoVer; // PROTO_VER_* - struct TagState state; - uint8_t rfu1[1]; // shall be ignored for now - uint16_t screenPixWidth; - uint16_t screenPixHeight; - uint16_t screenMmWidth; - uint16_t screenMmHeight; - uint16_t compressionsSupported; // COMPR_TYPE_* bitfield - uint16_t maxWaitMsec; // how long tag will wait for packets before going to sleep - uint8_t screenType; // enum TagScreenType - uint8_t rfu[11]; // shall be zero for now -} __packed; - -struct AssocInfo { - uint32_t checkinDelay; // space between checkins, in msec - uint32_t retryDelay; // if download fails mid-way wait thi smany msec to retry (IFF progress was made) - uint16_t failedCheckinsTillBlank; // how many fails till we go blank - uint16_t failedCheckinsTillDissoc; // how many fails till we dissociate - uint32_t newKey[4]; - uint8_t rfu[8]; // shall be zero for now -} __packed; - -#define CHECKIN_TEMP_OFFSET 0x7f - -struct CheckinInfo { - struct TagState state; - uint8_t lastPacketLQI; // zero if not reported/not supported to be reported - int8_t lastPacketRSSI; // zero if not reported/not supported to be reported - uint8_t temperature; // zero if not reported/not supported to be reported. else, this minus CHECKIN_TEMP_OFFSET is temp in degrees C - uint8_t rfu[6]; // shall be zero for now -} __packed; - -struct PendingInfo { - uint64_t imgUpdateVer; - uint32_t imgUpdateSize; - uint64_t osUpdateVer; // version of OS update avail - uint32_t osUpdateSize; - uint8_t rfu[8]; // shall be zero for now -} __packed; - -struct ChunkReqInfo { - uint64_t versionRequested; - uint32_t offset; - uint8_t len; - uint8_t osUpdatePlz : 1; - uint8_t rfu[6]; // shall be zero for now -} __packed; - -struct ChunkInfo { - uint32_t offset; - uint8_t osUpdatePlz : 1; - uint8_t rfu; // shall be zero for now - uint8_t data[]; // no data means request is out of bounds of this version no longer exists -} __packed; +#include "../../oepl-definitions.h" +#include "../../oepl-proto.h" #define MACFMT "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x" #define MACCVT(x) ((const uint8_t*)(x))[7], ((const uint8_t*)(x))[6], ((const uint8_t*)(x))[5], ((const uint8_t*)(x))[4], ((const uint8_t*)(x))[3], ((const uint8_t*)(x))[2], ((const uint8_t*)(x))[1], ((const uint8_t*)(x))[0] -#define VERSION_SIGNIFICANT_MASK (0x0000ffffffffffffull) - -#define HW_TYPE_42_INCH_SAMSUNG (1) -#define HW_TYPE_42_INCH_SAMSUNG_ROM_VER_OFST (0xEFF8) - -#define HW_TYPE_74_INCH_DISPDATA (2) -#define HW_TYPE_74_INCH_DISPDATA_FRAME_MODE (3) -#define HW_TYPE_74_INCH_DISPDATA_ROM_VER_OFST (0x008b) - -#define HW_TYPE_ZBD_EPOP50 (4) -#define HW_TYPE_ZBD_EPOP50_ROM_VER_OFST (0x008b) - -#define HW_TYPE_ZBD_EPOP900 (5) -#define HW_TYPE_ZBD_EPOP900_ROM_VER_OFST (0x008b) - -#define HW_TYPE_29_INCH_DISPDATA (6) -#define HW_TYPE_29_INCH_DISPDATA_FRAME_MODE (7) -#define HW_TYPE_29_INCH_DISPDATA_ROM_VER_OFST (0x008b) - -#define HW_TYPE_29_INCH_ZBS_026 (8) -#define HW_TYPE_29_INCH_ZBS_026_FRAME_MODE (9) -#define HW_TYPE_29_INCH_ZBS_025 (10) -#define HW_TYPE_29_INCH_ZBS_025_FRAME_MODE (11) -#define HW_TYPE_29_INCH_ZBS_ROM_VER_OFST (0x008b) - -#define HW_TYPE_74_INCH_BWR (40) -#define HW_TYPE_74_INCH_BWR_ROM_VER_OFST (0x0160) -#define HW_TYPE_58_INCH_BWR (41) -#define HW_TYPE_58_INCH_BWR_ROM_VER_OFST (0x0160) -#define HW_TYPE_42_INCH_BWR (42) -#define HW_TYPE_42_INCH_BWR_ROM_VER_OFST (0x0160) - -#endif +#endif \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.c old mode 100644 new mode 100755 index 44636885..7191d5f3 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.c @@ -1,10 +1,12 @@ #include "settings.h" +#include "proto.h" #include #include "eeprom.h" #include "util.h" #include "mz100_flash.h" #include "powermgt.h" + __attribute__((section(".aonshadow"))) struct tagsettings tagSettings = {0}; extern uint8_t blockXferBuffer[]; uint8_t* infopageTempBuffer = 1024 + blockXferBuffer; diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.h old mode 100644 new mode 100755 index d45efc05..4df94c04 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.h +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/settings.h @@ -17,21 +17,6 @@ #define DEFAULT_SETTING_LOWBATSYMBOL 1 #define DEFAULT_SETTING_NORFSYMBOL 1 -struct tagsettings { - uint8_t settingsVer; // the version of the struct as written to the infopage - uint8_t enableFastBoot; // default 0; if set, it will skip splashscreen - uint8_t enableRFWake; // default 0; if set, it will enable RF wake. This will add about ~0.9µA idle power consumption - uint8_t enableTagRoaming; // default 0; if set, the tag will scan for an accesspoint every few check-ins. This will increase power consumption quite a bit - uint8_t enableScanForAPAfterTimeout; // default 1; if a the tag failed to check in, after a few attempts it will try to find a an AP on other channels - uint8_t enableLowBatSymbol; // default 1; tag will show 'low battery' icon on screen if the battery is depleted - uint8_t enableNoRFSymbol; // default 1; tag will show 'no signal' icon on screen if it failed to check in for a longer period of time - uint8_t fastBootCapabilities; // holds the byte with 'capabilities' as detected during a normal tag boot; allows the tag to skip detecting buttons and NFC chip - uint8_t customMode; // default 0; if anything else, tag will bootup in a different 'mode' - uint16_t batLowVoltage; // Low battery threshold voltage (2450 for 2.45v). defaults to BATTERY_VOLTAGE_MINIMUM from powermgt.h - uint16_t minimumCheckInTime; // defaults to BASE_INTERVAL from powermgt.h - uint8_t fixedChannel; // default 0; if set to a valid channel number, the tag will stick to that channel -} __attribute__((packed)); - extern __attribute__((section(".aonshadow")))struct tagsettings tagSettings; void loadDefaultSettings(); diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/syncedproto.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/syncedproto.c old mode 100644 new mode 100755 index 75c2b0da..9f4893c8 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/syncedproto.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/syncedproto.c @@ -8,11 +8,11 @@ #include "main.h" #include "mz100_sleep.h" #include "powermgt.h" +#include "printf.h" #include "proto.h" #include "timer.h" #include "util.h" #include "zigbee.h" -#include "printf.h" // download-stuff uint8_t blockXferBuffer[BLOCK_XFER_BUFFER_SIZE] = {0}; @@ -438,11 +438,11 @@ static uint8_t findSlot(const uint8_t *ver) { return 0xFF; } static void eraseUpdateBlock() { - eepromErase(EEPROM_UPDATA_AREA_START, (uint16_t)EEPROM_UPDATE_AREA_LEN); + qspiEraseRange(EEPROM_UPDATE_START, EEPROM_UPDATE_LEN); } static void saveUpdateBlockData(uint8_t blockId) { printf("EEPROM writing UpdateBlock %i\n", blockId); - if (!eepromWrite(EEPROM_UPDATA_AREA_START + (blockId * BLOCK_DATA_SIZE), blockXferBuffer + sizeof(struct blockData), BLOCK_DATA_SIZE)) + if (!eepromWrite(EEPROM_UPDATE_START + (blockId * BLOCK_DATA_SIZE), blockXferBuffer + sizeof(struct blockData), BLOCK_DATA_SIZE)) printf("EEPROM write failed\n"); } static void saveImgBlockData(const uint8_t imgSlot, const uint8_t blockId) { @@ -478,11 +478,9 @@ static uint32_t getHighSlotId() { return temp; } -static uint8_t partsThisBlock = 0; -static uint8_t blockAttempts = 0; // these CAN be local to the function, but for some reason, they won't survive sleep? - // they get overwritten with 7F 32 44 20 00 00 00 00 11, I don't know why. - static bool getDataBlock(const uint16_t blockSize) { + static uint8_t partsThisBlock = 0; + static uint8_t blockAttempts = 0; blockAttempts = BLOCK_TRANSFER_ATTEMPTS; if (blockSize == BLOCK_DATA_SIZE) { partsThisBlock = BLOCK_MAX_PARTS; @@ -587,6 +585,7 @@ static bool downloadFWUpdate(const struct AvailDataInfo *avail) { curBlock.type = avail->dataType; memcpy(&curDataInfo, (void *)avail, sizeof(struct AvailDataInfo)); eraseUpdateBlock(); + delay(100); } while (curDataInfo.dataSize) { @@ -767,7 +766,7 @@ bool processAvailDataInfo(struct AvailDataInfo *avail) { powerUp(INIT_EEPROM); wdt60s(); - prvApplyUpdateIfNeeded(); + applyUpdate(); } else { return false; } diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/userinterface.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/userinterface.c index fc674ab1..a6f28ffa 100644 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/userinterface.c +++ b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/userinterface.c @@ -41,14 +41,13 @@ void addCapabilities() { void addOverlay() { if ((currentChannel == 0) && (tagSettings.enableNoRFSymbol)) { - // loadRawBitmap(ant, SCREEN_WIDTH - 24, 6, EPD_COLOR_BLACK); - // loadRawBitmap(cross, SCREEN_WIDTH - 16, 13, EPD_COLOR_RED); + drawImg(0, 3, norf); noAPShown = true; } else { noAPShown = false; } if ((batteryVoltage < tagSettings.batLowVoltage) && (tagSettings.enableLowBatSymbol)) { - // loadRawBitmap(battery, SCREEN_WIDTH - 16, SCREEN_HEIGHT - 10, EPD_COLOR_BLACK); + drawImg(0, 366, batlow); lowBatteryShown = true; } else { lowBatteryShown = false; @@ -68,65 +67,39 @@ void afterFlashScreenSaver() { } void showSplashScreen() { - // selectLUT(EPD_LUT_NO_REPEATS); - // clearScreen(); -#if (SCREEN_WIDTH == 400) // 4.2" - epdPrintBegin(3, 3, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); - epdpr("Starting"); - epdPrintEnd(); - - epdPrintBegin(2, 252, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - addCapabilities(); - epdPrintEnd(); - - epdPrintBegin(3, 268, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs42v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); - epdPrintEnd(); - epdPrintBegin(3, 284, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_RED); - epdpr("MAC: %02X:%02X", mSelfMac[7], mSelfMac[6]); - epdpr(":%02X:%02X", mSelfMac[5], mSelfMac[4]); - epdpr(":%02X:%02X", mSelfMac[3], mSelfMac[2]); - epdpr(":%02X:%02X", mSelfMac[1], mSelfMac[0]); - epdPrintEnd(); - - loadRawBitmap(oepli, 136, 22, EPD_COLOR_BLACK); - loadRawBitmap(cloud, 136, 10, EPD_COLOR_RED); - - uint8_t __xdata buffer[17]; - spr(buffer, "%02X%02X", mSelfMac[7], mSelfMac[6]); - spr(buffer + 4, "%02X%02X", mSelfMac[5], mSelfMac[4]); - spr(buffer + 8, "%02X%02X", mSelfMac[3], mSelfMac[2]); - spr(buffer + 12, "%02X%02X", mSelfMac[1], mSelfMac[0]); - printBarcode(buffer, 392, 264); - printBarcode(buffer, 384, 264); - -#endif - // drawWithSleep(); + init_epd(); + fillWindow(0, 0, 640, 384, 1); + epdPrintf(10, 10, 1, "OpenEPaperLink starting!"); + addOverlay(); + epd_refresh_and_sleep(1); } void showApplyUpdate() { - // selectLUT(1); - // clearScreen(); -#if (SCREEN_WIDTH == 400) - epdPrintBegin(136, 134, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); -#endif + init_epd(); - // epdpr("Updating!"); - // epdPrintEnd(); - // drawNoWait(); + fillWindow(0, 0, 640, 384, 1); + + + epdPrintf(90, 170, 1, "Performing update... This shouldn't take too long!"); + + + addOverlay(); + epd_refresh_and_sleep(1); } void showAPFound() { - init_epd(); + fillWindow(0, 0, 640, 384, 1); + epdPrintf(10, 10, 1, "OpenEPaperLink"); epdPrintf(10, 40, 1, "AP Found at channel %d", currentChannel); epdPrintf(10, 60, 1, "AP MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", APmac[7], APmac[6], APmac[5], APmac[4], APmac[3], APmac[2], APmac[1], APmac[0]); epdPrintf(10, 330, 1, "Battery: %d.%dV", batteryVoltage / 1000, batteryVoltage % 1000); epdPrintf(10, 350, 1, "Tag MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]); - epd_refresh_and_sleep(); + addOverlay(); + epd_refresh_and_sleep(1); } void showNoAP() { @@ -135,8 +108,8 @@ void showNoAP() { epdPrintf(10, 10, 1, "OpenEPaperLink "); epdPrintf(10, 40, 1, "No AP found... We'll try again in a little while though!"); epdPrintf(10, 350, 1, "Tag MAC: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", mSelfMac[7], mSelfMac[6], mSelfMac[5], mSelfMac[4], mSelfMac[3], mSelfMac[2], mSelfMac[1], mSelfMac[0]); - - epd_refresh_and_sleep(); + addOverlay(); + epd_refresh_and_sleep(1); } void showLongTermSleep() { diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.github/workflows/stale.yml b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.github/workflows/stale.yml deleted file mode 100644 index 119274ca..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.github/workflows/stale.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: "Close stale tickets" -on: - schedule: - - cron: "0 22 * * *" - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v3 - with: - days-before-stale: 15 - days-before-close: 15 - exempt-issue-labels: triaged - exempt-pr-labels: triaged,contrib - stale-issue-message: | - Thanks for your submission. However there was no (further) activity - on it for some time. Below are possible reasons and/or means to - proceed further: - - * Please make sure that your submission contains clear and complete - description of the issue and information required to understand and - reproduce it (exact version of all components involved, etc.). Please - refer to numerous guides on submitting helpful bugreports, e.g. - https://www.chiark.greenend.org.uk/~sgtatham/bugs.html - - * Please make sure that your feature request/suggestion/change aligns - well with the project purpose, goals, and process. - - * If you face the issue you report while working on a community-oriented - open-source project, feel free to provide additional context and - information - that may help to prioritize the issue better. - - * As many open-source projects, this project is severely under-staffed - and under-resourced. If you don't run a community-oriented open-source - project, and would like to get additional support/maintenance, feel - free to request a support contract. - - Thanks for your understanding! - stale-pr-message: | - Thanks for your submission. However there was no (further) activity - on it for some time. Below are possible reasons and/or means to - proceed further: - - * Please make sure that your submission contains clear and complete - description of the issue and information required to understand and - reproduce it (exact version of all components involved, etc.). Please - refer to numerous guides on submitting helpful bugreports, e.g. - https://www.chiark.greenend.org.uk/~sgtatham/bugs.html - - * Please make sure that your feature request/suggestion/change aligns - well with the project purpose, goals, and process. - - * If you face the issue you report while working on a community-oriented - open-source project, feel free to provide additional context and - information - that may help to prioritize the issue better. - - * As many open-source projects, this project is severely under-staffed - and under-resourced. If you don't run a community-oriented open-source - project, and would like to get additional support/maintenance, feel - free to request a support contract. - - Thanks for your understanding! - close-issue-message: > - Closing due to inactivity. - close-pr-message: > - Closing due to inactivity. diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.gitignore b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.gitignore deleted file mode 100644 index 29d8a166..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.o -*.map -*.a diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/LICENSE b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/LICENSE deleted file mode 100644 index c96e382d..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/LICENSE +++ /dev/null @@ -1,65 +0,0 @@ -Introduction ------------- - -uzlib as a whole is licensed under the terms of Zlib license, listed in -the next section. It consists of substantial works of individuals whose -copyrights listed in the next session. Some portions of the uzlib codebase -originally were licensed under different license(s), however compatible -with the Zlib license. Such license(s) are listed at the end of this file. - -License -------- - -uzlib - Deflate/Zlib-compatible LZ77 compression/decompression library - -Copyright (c) 2003 Joergen Ibsen -Copyright (c) 1997-2014 Simon Tatham -Copyright (c) 2014-2020 Paul Sokolovsky - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. - -------- -Original license for src/defl_static.c: - -PuTTY is copyright 1997-2014 Simon Tatham. - -Portions copyright Robert de Bath, Joris van Rantwijk, Delian -Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, -Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, Markus -Kuhn, Colin Watson, and CORE SDI S.A. - -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 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. diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/Makefile b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/Makefile deleted file mode 100644 index b5593199..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -all clean: - $(MAKE) -C src $@ - $(MAKE) -C examples/tgzip $@ - $(MAKE) -C examples/tgunzip $@ diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/README.md b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/README.md deleted file mode 100644 index 41dfa5d9..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/README.md +++ /dev/null @@ -1,325 +0,0 @@ -uzlib - Deflate/Zlib-compatible LZ77 compression/decompression library -====================================================================== - -uzlib is a library which can decompress any valid Deflate, Zlib, and Gzip -(further called just "Deflate") bitstream, and compress data to Deflate- -compatible bitstream, albeit with lower compression ratio than Zlib Deflate -algorithm (very basic LZ77 compression algorithm is used instead, static -Deflate Huffman tree encoding is used for bitstream). - -uzlib aims for minimal code size and runtime memory requirements, and thus -suitable for (deeply) embedded systems. - -uzlib is based on: - -* tinf library by Joergen Ibsen (Deflate decompression) -* Deflate Static Huffman tree routines by Simon Tatham -* LZ77 compressor by Paul Sokolovsky - -Library integrated and maintained by Paul Sokolovsky. - -(c) 2014-2020 Paul Sokolovsky - -uzlib library is licensed under Zlib license. - - -Decompressor features ---------------------- - -Handling of input (compressed) stream: - -* Can reside (fully) in memory. -* Can be received, byte by byte, from an application-defined callback - function (which e.g. can read it from file or another I/O device). -* Combination of the above: a chunk of input is buffered in memory, - when buffer is exhausted, the application callback is called to refill - it. - -Handling of output (decompressed) stream: - -* In-memory decompression, where output stream fully resides in memory. -* Streaming decompression, which allows to process arbitrary-sized streams - (longer than available memory), but requires in-memory buffer for Deflate - dictionary window. -* Application specifies number of output bytes it wants to decompress, - which can be as high as UINT_MAX to decompress everything into memory - at once, or as low as 1 to decompress byte by byte, or any other value - to decompress a chunk of that size. - -Note that in regard to input stream handling, uzlib employs callback-based, -"pull-style" design. The control flow looks as follows: - -1. Application requests uzlib to decompress given number of bytes. -2. uzlib performs decompression. -3. If more input is needed to decompress given number of bytes, uzlib - calls back into application to provide more input bytes. (An - implication of this is that uzlib will always return given number of - output bytes, unless end of stream (or error) happens). - -The original Zlib library instead features "push-style" design: - -1. An application prepares arbitrary number of input bytes in a buffer, - and free space in output buffer, and calls Zlib with these buffers. -2. Zlib tries to decode as much as possible input and produce as much - as possible output. It returns back to the application if input - buffer is exhausted, or output buffer is full, whatever happens - first. - -Currently, uzlib doesn't support push-style operation a-la Zlib. - -Compressor features -------------------- - -Compressor uses very basic implementation of LZ77 algorithm using hash -table to find repeating substrings. The size of the hash table (on which -compression efficiency depends), pointer to the hashtable memory, and -the size of LZ77 dictionary should be configured in `struct uzlib_comp`. - -Currently, compressor doesn't support streaming operation, both input and -output must reside in memory. Neither it supports incremental operation, -entire input buffer is compressed at once with a single call to uzlib. - -API and configuration ---------------------- - -The API is defined in the file [uzlib.h](src/uzlib.h) and should be largely -self-describing. There are also examples implementing gzip-compatible -compression and decompression applications in [examples/](examples/) for -further reference. (You may also refer to the original `tinf` README -below for additional information, but it's mostly provided for -historical reference, and `uzlib` largely evolved beyond it). - -There are some compile-time options for the library, defined in -the file [uzlib_conf.h](src/uzlib_conf.h). They can be altered directly -in the file, or passed as the compiler options (`-DXXX=YYY`) when -building library. - -Binary sizes ------------- - -To give an impression of code/data sizes of uzlib, the following figures -are provided. Numbers for *.o files are code sizes of individual -components (tinflate.o is decompressor, genlz77.o and defl_static.o - -compressor), and TINF_DATA is the size of the corresponding data -structure. These numbers are provided for different architectures, -with default uzlib configuration, and with compilers/their options -as specified. - -``` -gcc -m32 -Os -gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 -2891 src/tinflate.o -381 src/genlz77.o -1685 src/defl_static.o -1284 TINF_DATA - -arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -Os -arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] -1620 src/tinflate.o -180 src/genlz77.o -1131 src/defl_static.o -1284 TINF_DATA -``` - ---- - -Original tinf library README -============================ - -*For historical reference and to provide proper credit, the original `tinf` -library README follows. NOTE: Many parts no longer apply to `uzlib`. In -particular, API is different, features supported are largely extended, -and during decompression, there are checks to avoid erroneous/undefined -behavior on incorrect Deflate bitstreams.* - -tinf - tiny inflate library -=========================== - -Version 1.00 - -Copyright (c) 2003 Joergen Ibsen - - - - -About ------ - -tinf is a small library implementing the decompression algorithm for the -deflate compressed data format (called 'inflate'). Deflate compression is -used in e.g. zlib, gzip, zip and png. - -I wrote it because I needed a small in-memory zlib decompressor for a self- -extracting archive, and the zlib library added 15k to my program. The tinf -code added only 2k. - -Naturally the size difference is insignificant in most cases. Also, the -zlib library has many more features, is more secure, and mostly faster. -But if you have a project that calls for a small and simple deflate -decompressor, give it a try :-) - -While the implementation should be fairly compliant, it does assume it is -given valid compressed data, and that there is sufficient space for the -decompressed data. - -Simple wrappers for decompressing zlib streams and gzip'ed data in memory -are supplied. - -tgunzip, an example command-line gzip decompressor in C, is included. - -The inflate algorithm and data format are from 'DEFLATE Compressed Data -Format Specification version 1.3' ([RFC 1951][1]). - -The zlib data format is from 'ZLIB Compressed Data Format Specification -version 3.3' ([RFC 1950][2]). - -The gzip data format is from 'GZIP file format specification version 4.3' -([RFC 1952][3]). - -Ideas for future versions: - -- the fixed Huffman trees could be built by `tinf_decode_trees()` - using a small table -- memory for the `TINF_DATA` object should be passed, to avoid using - more than 1k of stack space -- wrappers for unpacking zip archives and png images -- implement more in x86 assembler -- more sanity checks -- in `tinf_uncompress`, the (entry value of) `destLen` and `sourceLen` - are not used -- blocking of some sort, so everything does not have to be in memory -- optional table-based huffman decoder - -[1]: http://www.rfc-editor.org/rfc/rfc1951.txt -[2]: http://www.rfc-editor.org/rfc/rfc1950.txt -[3]: http://www.rfc-editor.org/rfc/rfc1952.txt - - -Functionality -------------- - - void tinf_init(); - -Initialise the global uninitialised data used by the decompression code. -This function must be called once before any calls to the decompression -functions. - - int tinf_uncompress(void *dest, - unsigned int *destLen, - const void *source, - unsigned int sourceLen); - -Decompress data in deflate compressed format from `source[]` to `dest[]`. -`destLen` is set to the length of the decompressed data. Returns `TINF_OK` -on success, and `TINF_DATA_ERROR` on error. - - int tinf_gzip_uncompress(void *dest, - unsigned int *destLen, - const void *source, - unsigned int sourceLen); - -Decompress data in gzip compressed format from `source[]` to `dest[]`. -`destLen` is set to the length of the decompressed data. Returns `TINF_OK` -on success, and `TINF_DATA_ERROR` on error. - - int tinf_zlib_uncompress(void *dest, - unsigned int *destLen, - const void *source, - unsigned int sourceLen); - -Decompress data in zlib compressed format from `source[]` to `dest[]`. -`destLen` is set to the length of the decompressed data. Returns `TINF_OK` -on success, and `TINF_DATA_ERROR` on error. - - unsigned int tinf_adler32(const void *data, - unsigned int length); - -Computes the Adler-32 checksum of `length` bytes starting at `data`. Used by -`tinf_zlib_uncompress()`. - - unsigned int tinf_crc32(const void *data, - unsigned int length); - -Computes the CRC32 checksum of `length` bytes starting at `data`. Used by -`tinf_gzip_uncompress()`. - - -Source Code ------------ - -The source code is ANSI C, and assumes that int is 32-bit. It has been -tested on the x86 platform under Windows and Linux. - -The decompression functions should be endian-neutral, and also reentrant -and thread-safe (not tested). - -In src/nasm there are 32-bit x86 assembler (386+) versions of some of the -files. - -Makefiles (GNU Make style) for a number of compilers are included. - - -Frequently Asked Questions --------------------------- - -Q: Is it really free? Can I use it in my commercial ExpenZip software? - -A: It's open-source software, available under the zlib license (see - later), which means you can use it for free -- even in commercial - products. If you do, please be kind enough to add an acknowledgement. - -Q: Did you just strip stuff from the zlib source to make it smaller? - -A: No, tinf was written from scratch, using the RFC documentation of - the formats it supports. - -Q: What do you mean by: 'the zlib library .. is more secure'? - -A: The zlib decompression code checks the compressed data for validity - while decompressing, so even on corrupted data it will not crash. - The tinf code assumes it is given valid compressed data. - -Q: I'm a Delphi programmer, can I use tinf? - -A: Sure, the object files produced by both Borland C and Watcom C should - be linkable with Delphi. - -Q: Will tinf work on UltraSTRANGE machines running WhackOS? - -A: I have no idea .. please try it out and let me know! - -Q: Why are all the makefiles in GNU Make style? - -A: I'm used to GNU Make, and it has a number of features that are missing - in some of the other Make utilities. - -Q: This is the first release, how can there be frequently asked questions? - -A: Ok, ok .. I made the questions up ;-) - - -License -------- - -tinf - tiny inflate library - -Copyright (c) 2003 Joergen Ibsen - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/bin/tgunzip.exe b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/bin/tgunzip.exe deleted file mode 100644 index d0a9f821791bb6e9a21bf7733b5cdddd4283c85f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 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 diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/.gitignore b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/.gitignore deleted file mode 100644 index 37950749..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tgunzip diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile deleted file mode 100644 index e15ad716..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile +++ /dev/null @@ -1,31 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## GCC makefile (Linux, FreeBSD, BeOS and QNX) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = tgunzip -objects = tgunzip.o -libs = ../../lib/libtinf.a - -COPT = -Os -CFLAGS = -Wall -I../../src $(COPT) -LDFLAGS = $(CFLAGS) -s -Wl,-Map,ld.map - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) $(libs) - $(CC) $(LDFLAGS) -o $@ $^ $(libs) - -%.o : %.c - $(CC) $(CFLAGS) -c $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.b32 b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.b32 deleted file mode 100644 index 7b559c9a..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.b32 +++ /dev/null @@ -1,31 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## Borland C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = tgunzip.exe -objects = tgunzip.obj -libs = ..\..\lib\tinf.lib -temps = tgunzip.tds - -cflags = -a16 -K -O2 -OS -I..\..\src -ldflags = -C -q -Gn -x -Gz -ap -Tpe - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - ilink32 $(ldflags) c0x32 $(objects), $@ , , import32 cw32 $(libs) , , - -%.obj : %.c - bcc32 $(cflags) -c $< - -clean: - $(RM) $(objects) $(target) $(temps) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dj2 b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dj2 deleted file mode 100644 index c09312dc..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dj2 +++ /dev/null @@ -1,30 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## DJGPP makefile -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = tgunzip.exe -objects = tgunzip.o -libs = ../../lib/libtinf.a - -cflags = -s -Wall -Os -fomit-frame-pointer -I../../src -ldflags = $(cflags) - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - gcc $(ldflags) -o $@ $^ $(libs) - -%.o : %.c - gcc $(cflags) -o $@ -c $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dmc b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dmc deleted file mode 100644 index 4c3d0297..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.dmc +++ /dev/null @@ -1,31 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## Digital Mars C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = tgunzip.exe -objects = tgunzip.obj -libs = ..\..\lib\tinf.lib -temps = tgunzip.map - -cflags = -s -mn -o+all -I..\..\src -ldflags = $(cflags) - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - dmc $(ldflags) -o$@ $^ $(libs) - -%.obj : %.c - dmc $(cflags) -c $< - -clean: - $(RM) $(objects) $(target) $(temps) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.mgw b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.mgw deleted file mode 100644 index b48b4c10..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.mgw +++ /dev/null @@ -1,28 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## MinGW / Cygwin makefile -## -## Copyright (c) 1998-2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## - -target = tgunzip.exe -objects = tgunzip.o -libs = ../../lib/libtinf.a - -cflags = -s -Wall -Os -fomit-frame-pointer -I../../src -ldflags = $(cflags) - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - gcc $(ldflags) -o $@ $^ $(libs) - -%.o : %.c - gcc $(cflags) -o $@ -c $< - -clean: - $(RM) $(target) $(objects) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.vc b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.vc deleted file mode 100644 index 64dd2e6a..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.vc +++ /dev/null @@ -1,28 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## Visual C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## - -target = tgunzip.exe -objects = tgunzip.obj -libs = ../../lib/tinf.lib - -cflags = /nologo /W3 /O1 /G6 /W3 /Gy /GF /I..\..\src -ldflags = /nologo /release /opt:ref /opt:icf - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - link $(ldflags) /out:$@ $^ $(libs) - -%.obj : %.c - cl $(cflags) -c $< - -clean: - $(RM) $(target) $(objects) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.wat b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.wat deleted file mode 100644 index 2d27a985..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/makefile.wat +++ /dev/null @@ -1,31 +0,0 @@ -## -## tgunzip - gzip decompressor example -## -## Watcom / OpenWatcom C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = tgunzip.exe -objects = tgunzip.obj -libs = ../../lib/tinf.lib -system = nt - -cflags = -bt=$(system) -d0 -ox -I..\..\src -ldflags = system $(system) - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - wlink $(ldflags) name $@ file {$^} library {$(libs)} - -%.obj : %.c - wcc386 $(cflags) $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/tgunzip.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/tgunzip.c deleted file mode 100644 index 54fdc32f..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgunzip/tgunzip.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * tgunzip - gzip decompressor example - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2016 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include -#include - -#include "uzlib.h" - -/* produce decompressed output in chunks of this size */ -/* default is to decompress byte by byte; can be any other length */ -#define OUT_CHUNK_SIZE 1 - -void exit_error(const char *what) -{ - printf("ERROR: %s\n", what); - exit(1); -} - -int main(int argc, char *argv[]) -{ - FILE *fin, *fout; - unsigned int len, dlen, outlen; - const unsigned char *source; - unsigned char *dest; - int res; - - printf("tgunzip - example from the tiny inflate library (www.ibsensoftware.com)\n\n"); - - if (argc < 3) - { - printf( - "Syntax: tgunzip \n\n" - "Both input and output are kept in memory, so do not use this on huge files.\n"); - - return 1; - } - - uzlib_init(); - - /* -- open files -- */ - - if ((fin = fopen(argv[1], "rb")) == NULL) exit_error("source file"); - - if ((fout = fopen(argv[2], "wb")) == NULL) exit_error("destination file"); - - /* -- read source -- */ - - fseek(fin, 0, SEEK_END); - - len = ftell(fin); - - fseek(fin, 0, SEEK_SET); - - source = (unsigned char *)malloc(len); - - if (source == NULL) exit_error("memory"); - - if (fread((unsigned char*)source, 1, len, fin) != len) exit_error("read"); - - fclose(fin); - - if (len < 4) exit_error("file too small"); - - /* -- get decompressed length -- */ - - dlen = source[len - 1]; - dlen = 256*dlen + source[len - 2]; - dlen = 256*dlen + source[len - 3]; - dlen = 256*dlen + source[len - 4]; - - outlen = dlen; - - /* there can be mismatch between length in the trailer and actual - data stream; to avoid buffer overruns on overlong streams, reserve - one extra byte */ - dlen++; - - dest = (unsigned char *)malloc(dlen); - - if (dest == NULL) exit_error("memory"); - - /* -- decompress data -- */ - - struct uzlib_uncomp d; -// uzlib_uncompress_init(&d, malloc(32768), 32768); - uzlib_uncompress_init(&d, NULL, 0); - - /* all 3 fields below must be initialized by user */ - d.source = source; - d.source_limit = source + len - 4; - d.source_read_cb = NULL; - - res = uzlib_gzip_parse_header(&d); - if (res != TINF_OK) { - printf("Error parsing header: %d\n", res); - exit(1); - } - - d.dest_start = d.dest = dest; - - while (dlen) { - unsigned int chunk_len = dlen < OUT_CHUNK_SIZE ? dlen : OUT_CHUNK_SIZE; - d.dest_limit = d.dest + chunk_len; - res = uzlib_uncompress_chksum(&d); - dlen -= chunk_len; - if (res != TINF_OK) { - break; - } - } - - if (res != TINF_DONE) { - printf("Error during decompression: %d\n", res); - exit(-res); - } - - printf("decompressed %lu bytes\n", d.dest - dest); - -#if 0 - if (d.dest - dest != gz.dlen) { - printf("Invalid decompressed length: %lu vs %u\n", d.dest - dest, gz.dlen); - } - - if (tinf_crc32(dest, gz.dlen) != gz.crc32) { - printf("Invalid decompressed crc32\n"); - } -#endif - - /* -- write output -- */ - - fwrite(dest, 1, outlen, fout); - - fclose(fout); - - return 0; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/.gitignore b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/.gitignore deleted file mode 100644 index 98ea6d9f..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tgzip diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/makefile b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/makefile deleted file mode 100644 index 1e28ece0..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/makefile +++ /dev/null @@ -1,31 +0,0 @@ -## -## tgzip - gzip compressor example -## -## GCC makefile (Linux, FreeBSD, BeOS and QNX) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## Copyright (c) 2014 by Paul Sokolovsky -## -## http://www.ibsensoftware.com/ -## - -target = tgzip -objects = tgzip.o -libs = ../../lib/libtinf.a - -COPT = -Os -CFLAGS = -Wall -I../../src $(COPT) -LDFLAGS = $(CFLAGS) -s -Wl,-Map,ld.map - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) $(libs) - $(CC) $(LDFLAGS) -o $@ $^ $(libs) - -%.o : %.c - $(CC) $(CFLAGS) -c $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/tgzip.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/tgzip.c deleted file mode 100644 index d869d384..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/examples/tgzip/tgzip.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * tgzip - gzip compressor example - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * Copyright (c) 2014-2018 by Paul Sokolovsky - * - * http://www.ibsensoftware.com/ - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include -#include -#include - -#include "uzlib.h" - -void exit_error(const char *what) -{ - printf("ERROR: %s\n", what); - exit(1); -} - -int main(int argc, char *argv[]) -{ - FILE *fin, *fout; - unsigned int len; - unsigned char *source; - - printf("tgzip - example from the uzlib library\n\n"); - - if (argc < 3) - { - printf( - "Syntax: tgunzip \n\n" - "Both input and output are kept in memory, so do not use this on huge files.\n"); - - return 1; - } - - /* -- open files -- */ - - if ((fin = fopen(argv[1], "rb")) == NULL) exit_error("source file"); - - if ((fout = fopen(argv[2], "wb")) == NULL) exit_error("destination file"); - - /* -- read source -- */ - - fseek(fin, 0, SEEK_END); - - len = ftell(fin); - - fseek(fin, 0, SEEK_SET); - - source = (unsigned char *)malloc(len); - - if (source == NULL) exit_error("memory"); - - if (fread(source, 1, len, fin) != len) exit_error("read"); - - fclose(fin); - - /* -- compress data -- */ - - struct uzlib_comp comp = {0}; - comp.dict_size = 32768; - comp.hash_bits = 12; - size_t hash_size = sizeof(uzlib_hash_entry_t) * (1 << comp.hash_bits); - comp.hash_table = malloc(hash_size); - memset(comp.hash_table, 0, hash_size); - - zlib_start_block(&comp); - uzlib_compress(&comp, source, len); - zlib_finish_block(&comp); - - printf("compressed to %u raw bytes\n", comp.outlen); - - /* -- write output -- */ - - putc(0x1f, fout); - putc(0x8b, fout); - putc(0x08, fout); - putc(0x00, fout); // FLG - int mtime = 0; - fwrite(&mtime, sizeof(mtime), 1, fout); - putc(0x04, fout); // XFL - putc(0x03, fout); // OS - - fwrite(comp.outbuf, 1, comp.outlen, fout); - - unsigned crc = ~uzlib_crc32(source, len, ~0); - fwrite(&crc, sizeof(crc), 1, fout); - fwrite(&len, sizeof(len), 1, fout); - - fclose(fout); - - return 0; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/lib/empty.dir b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/lib/empty.dir deleted file mode 100644 index 70062289..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/lib/empty.dir +++ /dev/null @@ -1 +0,0 @@ ---- empty dir --- \ No newline at end of file diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/adler32.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/adler32.c deleted file mode 100644 index 5ee7b6cf..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/adler32.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Adler-32 checksum - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -/* - * Adler-32 algorithm taken from the zlib source, which is - * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - */ - -#include "tinf.h" - -#define A32_BASE 65521 -#define A32_NMAX 5552 - -uint32_t uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum /* 1 */) -{ - const unsigned char *buf = (const unsigned char *)data; - - unsigned int s1 = prev_sum & 0xffff; - unsigned int s2 = prev_sum >> 16; - - while (length > 0) - { - int k = length < A32_NMAX ? length : A32_NMAX; - int i; - - for (i = k / 16; i; --i, buf += 16) - { - s1 += buf[0]; s2 += s1; s1 += buf[1]; s2 += s1; - s1 += buf[2]; s2 += s1; s1 += buf[3]; s2 += s1; - s1 += buf[4]; s2 += s1; s1 += buf[5]; s2 += s1; - s1 += buf[6]; s2 += s1; s1 += buf[7]; s2 += s1; - - s1 += buf[8]; s2 += s1; s1 += buf[9]; s2 += s1; - s1 += buf[10]; s2 += s1; s1 += buf[11]; s2 += s1; - s1 += buf[12]; s2 += s1; s1 += buf[13]; s2 += s1; - s1 += buf[14]; s2 += s1; s1 += buf[15]; s2 += s1; - } - - for (i = k % 16; i; --i) { s1 += *buf++; s2 += s1; } - - s1 %= A32_BASE; - s2 %= A32_BASE; - - length -= k; - } - - return ((uint32_t)s2 << 16) | s1; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/crc32.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/crc32.c deleted file mode 100644 index 10231181..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/crc32.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * CRC32 checksum - * - * Copyright (c) 1998-2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -/* - * CRC32 algorithm taken from the zlib source, which is - * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - */ - -#include "tinf.h" - -static const uint32_t tinf_crc32tab[16] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, - 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344, - 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, - 0xbdbdf21c -}; - -/* crc is previous value for incremental computation, 0xffffffff initially */ -uint32_t uzlib_crc32(const void *data, unsigned int length, uint32_t crc) -{ - const unsigned char *buf = (const unsigned char *)data; - unsigned int i; - - for (i = 0; i < length; ++i) - { - crc ^= buf[i]; - crc = tinf_crc32tab[crc & 0x0f] ^ (crc >> 4); - crc = tinf_crc32tab[crc & 0x0f] ^ (crc >> 4); - } - - // return value suitable for passing in next time, for final value invert it - return crc/* ^ 0xffffffff*/; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.c deleted file mode 100644 index d6578b2c..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.c +++ /dev/null @@ -1,318 +0,0 @@ -/* - -Routines in this file are based on: -Zlib (RFC1950 / RFC1951) compression for PuTTY. - -PuTTY is copyright 1997-2014 Simon Tatham. - -Portions copyright Robert de Bath, Joris van Rantwijk, Delian -Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, -Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, Markus -Kuhn, Colin Watson, and CORE SDI S.A. - -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 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. -*/ - -#include -#include -#include -#include -#include "uzlib.h" -#include "defl_static.h" - -#define snew(type) ( (type *) malloc(sizeof(type)) ) -#define snewn(n, type) ( (type *) malloc((n) * sizeof(type)) ) -#define sresize(x, n, type) ( (type *) realloc((x), (n) * sizeof(type)) ) -#define sfree(x) ( free((x)) ) - -#ifndef FALSE -#define FALSE 0 -#define TRUE (!FALSE) -#endif - -/* ---------------------------------------------------------------------- - * Zlib compression. We always use the static Huffman tree option. - * Mostly this is because it's hard to scan a block in advance to - * work out better trees; dynamic trees are great when you're - * compressing a large file under no significant time constraint, - * but when you're compressing little bits in real time, things get - * hairier. - * - * I suppose it's possible that I could compute Huffman trees based - * on the frequencies in the _previous_ block, as a sort of - * heuristic, but I'm not confident that the gain would balance out - * having to transmit the trees. - */ - -void outbits(struct uzlib_comp *out, unsigned long bits, int nbits) -{ - assert(out->noutbits + nbits <= 32); - out->outbits |= bits << out->noutbits; - out->noutbits += nbits; - while (out->noutbits >= 8) { - if (out->outlen >= out->outsize) { - out->outsize = out->outlen + 64; - out->outbuf = sresize(out->outbuf, out->outsize, unsigned char); - } - out->outbuf[out->outlen++] = (unsigned char) (out->outbits & 0xFF); - out->outbits >>= 8; - out->noutbits -= 8; - } -} - -static const unsigned char mirrorbytes[256] = { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, -}; - -typedef struct { - uint8_t extrabits; - uint8_t min, max; -} len_coderecord; - -typedef struct { - uint8_t code, extrabits; - uint16_t min, max; -} dist_coderecord; - -#define TO_LCODE(x, y) x - 3, y - 3 -#define FROM_LCODE(x) (x + 3) - -static const len_coderecord lencodes[] = { - {0, TO_LCODE(3, 3)}, - {0, TO_LCODE(4, 4)}, - {0, TO_LCODE(5, 5)}, - {0, TO_LCODE(6, 6)}, - {0, TO_LCODE(7, 7)}, - {0, TO_LCODE(8, 8)}, - {0, TO_LCODE(9, 9)}, - {0, TO_LCODE(10, 10)}, - {1, TO_LCODE(11, 12)}, - {1, TO_LCODE(13, 14)}, - {1, TO_LCODE(15, 16)}, - {1, TO_LCODE(17, 18)}, - {2, TO_LCODE(19, 22)}, - {2, TO_LCODE(23, 26)}, - {2, TO_LCODE(27, 30)}, - {2, TO_LCODE(31, 34)}, - {3, TO_LCODE(35, 42)}, - {3, TO_LCODE(43, 50)}, - {3, TO_LCODE(51, 58)}, - {3, TO_LCODE(59, 66)}, - {4, TO_LCODE(67, 82)}, - {4, TO_LCODE(83, 98)}, - {4, TO_LCODE(99, 114)}, - {4, TO_LCODE(115, 130)}, - {5, TO_LCODE(131, 162)}, - {5, TO_LCODE(163, 194)}, - {5, TO_LCODE(195, 226)}, - {5, TO_LCODE(227, 257)}, - {0, TO_LCODE(258, 258)}, -}; - -static const dist_coderecord distcodes[] = { - {0, 0, 1, 1}, - {1, 0, 2, 2}, - {2, 0, 3, 3}, - {3, 0, 4, 4}, - {4, 1, 5, 6}, - {5, 1, 7, 8}, - {6, 2, 9, 12}, - {7, 2, 13, 16}, - {8, 3, 17, 24}, - {9, 3, 25, 32}, - {10, 4, 33, 48}, - {11, 4, 49, 64}, - {12, 5, 65, 96}, - {13, 5, 97, 128}, - {14, 6, 129, 192}, - {15, 6, 193, 256}, - {16, 7, 257, 384}, - {17, 7, 385, 512}, - {18, 8, 513, 768}, - {19, 8, 769, 1024}, - {20, 9, 1025, 1536}, - {21, 9, 1537, 2048}, - {22, 10, 2049, 3072}, - {23, 10, 3073, 4096}, - {24, 11, 4097, 6144}, - {25, 11, 6145, 8192}, - {26, 12, 8193, 12288}, - {27, 12, 12289, 16384}, - {28, 13, 16385, 24576}, - {29, 13, 24577, 32768}, -}; - -void zlib_literal(struct uzlib_comp *out, unsigned char c) -{ - if (out->comp_disabled) { - /* - * We're in an uncompressed block, so just output the byte. - */ - outbits(out, c, 8); - return; - } - - if (c <= 143) { - /* 0 through 143 are 8 bits long starting at 00110000. */ - outbits(out, mirrorbytes[0x30 + c], 8); - } else { - /* 144 through 255 are 9 bits long starting at 110010000. */ - outbits(out, 1 + 2 * mirrorbytes[0x90 - 144 + c], 9); - } -} - -void zlib_match(struct uzlib_comp *out, int distance, int len) -{ - const dist_coderecord *d; - const len_coderecord *l; - int i, j, k; - int lcode; - - assert(!out->comp_disabled); - - while (len > 0) { - int thislen; - - /* - * We can transmit matches of lengths 3 through 258 - * inclusive. So if len exceeds 258, we must transmit in - * several steps, with 258 or less in each step. - * - * Specifically: if len >= 261, we can transmit 258 and be - * sure of having at least 3 left for the next step. And if - * len <= 258, we can just transmit len. But if len == 259 - * or 260, we must transmit len-3. - */ - thislen = (len > 260 ? 258 : len <= 258 ? len : len - 3); - len -= thislen; - - /* - * Binary-search to find which length code we're - * transmitting. - */ - i = -1; - j = sizeof(lencodes) / sizeof(*lencodes); - while (1) { - assert(j - i >= 2); - k = (j + i) / 2; - if (thislen < FROM_LCODE(lencodes[k].min)) - j = k; - else if (thislen > FROM_LCODE(lencodes[k].max)) - i = k; - else { - l = &lencodes[k]; - break; /* found it! */ - } - } - - lcode = l - lencodes + 257; - - /* - * Transmit the length code. 256-279 are seven bits - * starting at 0000000; 280-287 are eight bits starting at - * 11000000. - */ - if (lcode <= 279) { - outbits(out, mirrorbytes[(lcode - 256) * 2], 7); - } else { - outbits(out, mirrorbytes[0xc0 - 280 + lcode], 8); - } - - /* - * Transmit the extra bits. - */ - if (l->extrabits) - outbits(out, thislen - FROM_LCODE(l->min), l->extrabits); - - /* - * Binary-search to find which distance code we're - * transmitting. - */ - i = -1; - j = sizeof(distcodes) / sizeof(*distcodes); - while (1) { - assert(j - i >= 2); - k = (j + i) / 2; - if (distance < distcodes[k].min) - j = k; - else if (distance > distcodes[k].max) - i = k; - else { - d = &distcodes[k]; - break; /* found it! */ - } - } - - /* - * Transmit the distance code. Five bits starting at 00000. - */ - outbits(out, mirrorbytes[d->code * 8], 5); - - /* - * Transmit the extra bits. - */ - if (d->extrabits) - outbits(out, distance - d->min, d->extrabits); - } -} - -void zlib_start_block(struct uzlib_comp *out) -{ -// outbits(out, 0x9C78, 16); - outbits(out, 1, 1); /* Final block */ - outbits(out, 1, 2); /* Static huffman block */ -} - -void zlib_finish_block(struct uzlib_comp *out) -{ - outbits(out, 0, 7); /* close block */ - outbits(out, 0, 7); /* Make sure all bits are flushed */ -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.h deleted file mode 100644 index cdfa973b..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/defl_static.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) uzlib authors - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -/* This files contains type declaration and prototypes for defl_static.c. - They may be altered/distinct from the originals used in PuTTY source - code. */ - -void outbits(struct uzlib_comp *ctx, unsigned long bits, int nbits); -void zlib_start_block(struct uzlib_comp *ctx); -void zlib_finish_block(struct uzlib_comp *ctx); -void zlib_literal(struct uzlib_comp *ctx, unsigned char c); -void zlib_match(struct uzlib_comp *ctx, int distance, int len); diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/genlz77.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/genlz77.c deleted file mode 100644 index ede1fc9e..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/genlz77.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * genlz77 - Generic LZ77 compressor - * - * Copyright (c) 2014 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ -#include -#include -#include -#include "uzlib.h" - -#if 0 -#define HASH_BITS 12 -#else -#define HASH_BITS data->hash_bits -#endif - -#define HASH_SIZE (1<dict_size -#endif - -/* Hash function can be defined as macro or as inline function */ - -/*#define HASH(p) (p[0] + p[1] + p[2])*/ - -/* This is hash function from liblzf */ -static inline int HASH(struct uzlib_comp *data, const uint8_t *p) { - int v = (p[0] << 16) | (p[1] << 8) | p[2]; - int hash = ((v >> (3*8 - HASH_BITS)) - v) & (HASH_SIZE - 1); - return hash; -} - -#ifdef DUMP_LZTXT - -/* Counter for approximate compressed length in LZTXT mode. */ -/* Literal is counted as 1, copy as 2 bytes. */ -unsigned approx_compressed_len; - -void literal(void *data, uint8_t val) -{ - printf("L%02x # %c\n", val, (val >= 0x20 && val <= 0x7e) ? val : '?'); - approx_compressed_len++; -} - -void copy(void *data, unsigned offset, unsigned len) -{ - printf("C-%u,%u\n", offset, len); - approx_compressed_len += 2; -} - -#else - -static inline void literal(void *data, uint8_t val) -{ - zlib_literal(data, val); -} - -static inline void copy(void *data, unsigned offset, unsigned len) -{ - zlib_match(data, offset, len); -} - -#endif - - -void uzlib_compress(struct uzlib_comp *data, const uint8_t *src, unsigned slen) -{ - const uint8_t *top = src + slen - MIN_MATCH; - while (src < top) { - int h = HASH(data, src); - const uint8_t **bucket = &data->hash_table[h & (HASH_SIZE - 1)]; - const uint8_t *subs = *bucket; - *bucket = src; - if (subs && src > subs && (src - subs) <= MAX_OFFSET && !memcmp(src, subs, MIN_MATCH)) { - src += MIN_MATCH; - const uint8_t *m = subs + MIN_MATCH; - int len = MIN_MATCH; - while (*src == *m && len < MAX_MATCH && src < top) { - src++; m++; len++; - } - copy(data, src - len - subs, len); - } else { - literal(data, *src++); - } - } - // Process buffer tail, which is less than MIN_MATCH - // (and so it doesn't make sense to look for matches there) - top += MIN_MATCH; - while (src < top) { - literal(data, *src++); - } -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile deleted file mode 100644 index 3ced616f..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile +++ /dev/null @@ -1,36 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## GCC makefile (Linux, FreeBSD, BeOS and QNX) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = ../lib/libtinf.a -objects = tinflate.o tinfgzip.o tinfzlib.o adler32.o crc32.o \ - defl_static.o genlz77.o - -COPT = -Os -CFLAGS = -Wall $(COPT) -LDFLAGS = $(CFLAGS) -s - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - ar -frs $@ $^ - ranlib $@ - -%.o : %.c - $(CC) $(CFLAGS) -o $@ -c $< - -%.o : %.nas - nasm -o $@ -f elf -D_ELF_ -O3 -Inasm/ $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.b32 b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.b32 deleted file mode 100644 index 52e17162..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.b32 +++ /dev/null @@ -1,34 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## Borland C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = ..\lib\tinf.lib -objects = tinflate.obj tinfgzip.obj tinfzlib.obj adler32.obj crc32.obj - -cflags = -a16 -K -O2 -OS - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - echo $(patsubst %,+%,$(objects)) >> lib.cmd - tlib $@ /C @lib.cmd - $(RM) lib.cmd - -%.obj : %.c - bcc32 $(cflags) -c $< - -%.obj : %.nas - nasm -o $@ -f obj -D_OBJ_ -O3 -Inasm/ $< - -clean: - $(RM) $(objects) $(target) $(temps) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dj2 b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dj2 deleted file mode 100644 index 856ecfd6..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dj2 +++ /dev/null @@ -1,33 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## DJGPP makefile -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = ../lib/libtinf.a -objects = tinflate.o tinfgzip.o tinfzlib.o adler32.o crc32.o - -cflags = -s -Wall -Os -fomit-frame-pointer - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - ar -frsv $@ $^ - ranlib $@ - -%.o : %.c - gcc $(cflags) -o $@ -c $< - -%.o : %.nas - nasm -o $@ -f coff -O3 -Inasm/ $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dmc b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dmc deleted file mode 100644 index 7629b8f3..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.dmc +++ /dev/null @@ -1,32 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## Digital Mars C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = ..\lib\tinf.lib -objects = tinflate.obj tinfgzip.obj tinfzlib.obj adler32.obj crc32.obj - -cflags = -s -mn -o+all - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - lib -c $@ $^ - -%.obj : %.c - dmc $(cflags) -c $< - -%.obj : %.nas - nasm -o $@ -f obj -D_OBJ_ -O3 $< - -clean: - $(RM) $(objects) $(target) $(temps) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.mgw b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.mgw deleted file mode 100644 index 020f1853..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.mgw +++ /dev/null @@ -1,31 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## MinGW / Cygwin makefile -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## - -target = ../lib/libtinf.a -objects = tinflate.o tinfgzip.o tinfzlib.o adler32.o crc32.o - -cflags = -s -Wall -Os -fomit-frame-pointer - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - ar -frsv $@ $^ - ranlib $@ - -%.o : %.c - gcc $(cflags) -o $@ -c $< - -%.o : %.nas - nasm -o $@ -f win32 -O3 -Inasm/ $< - -clean: - $(RM) $(target) $(objects) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.vc b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.vc deleted file mode 100644 index de37a20d..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.vc +++ /dev/null @@ -1,30 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## Visual C++ Makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## - -target = ../lib/tinf.lib -objects = tinflate.obj tinfgzip.obj tinfzlib.obj adler32.obj crc32.obj - -cflags = /nologo /W3 /O1 /G6 /W3 /Gy /GF - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - lib /OUT:$@ $^ - -%.obj : %.c - cl $(cflags) -c $< - -%.obj : %.nas - nasm -o $@ -f win32 -O3 -Inasm/ $< - -clean: - $(RM) $(target) $(objects) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.wat b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.wat deleted file mode 100644 index 573fb2d4..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/makefile.wat +++ /dev/null @@ -1,35 +0,0 @@ -## -## tinflib - tiny inflate library (inflate, gzip, zlib) -## -## Watcom / OpenWatcom C/C++ makefile (GNU Make) -## -## Copyright (c) 2003 by Joergen Ibsen / Jibz -## All Rights Reserved -## -## http://www.ibsensoftware.com/ -## - -target = ..\lib\tinf.lib -objects = tinflate.obj tinfgzip.obj tinfzlib.obj adler32.obj crc32.obj -system = nt - -cflags = -bt=$(system) -d0 -obmlrs -s -zl - -.PHONY: all clean - -all: $(target) - -$(target): $(objects) - $(RM) $@ - echo $(patsubst %,+%,$(objects)) >> lib.cmd - wlib -c -n -q -s -fo -io $@ @lib.cmd - $(RM) lib.cmd - -%.obj : %.c - wcc386 $(cflags) $< - -%.obj : %.nas - nasm -o $@ -f obj -D_OBJ_ -O3 -Inasm/ $< - -clean: - $(RM) $(objects) $(target) diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/crc32.nas b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/crc32.nas deleted file mode 100644 index bd91692b..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/crc32.nas +++ /dev/null @@ -1,118 +0,0 @@ -;; -;; NASM assembler crc32 -;; -;; Copyright (c) 1998-2003 by Joergen Ibsen / Jibz -;; All Rights Reserved -;; -;; http://www.ibsensoftware.com/ -;; -;; This software is provided 'as-is', without any express -;; or implied warranty. In no event will the authors be -;; held liable for any damages arising from the use of -;; this software. -;; -;; Permission is granted to anyone to use this software -;; for any purpose, including commercial applications, -;; and to alter it and redistribute it freely, subject to -;; the following restrictions: -;; -;; 1. The origin of this software must not be -;; misrepresented; you must not claim that you -;; wrote the original software. If you use this -;; software in a product, an acknowledgment in -;; the product documentation would be appreciated -;; but is not required. -;; -;; 2. Altered source versions must be plainly marked -;; as such, and must not be misrepresented as -;; being the original software. -;; -;; 3. This notice may not be removed or altered from -;; any source distribution. -;; - -; CRC32 algorithm taken from the zlib source, which is -; Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - -cpu 386 - -bits 32 - -%include "nasmlcm.inc" - -section lcmtext - -lcmglobal tinf_crc32,8 - -lcmexport tinf_crc32,8 - -; ============================================================= - -lcmlabel tinf_crc32,8 - ; tinf_crc32(const void *data, - ; unsigned int length); - - .len$ equ 2*4 + 4 + 4 - .dat$ equ 2*4 + 4 - - push esi - push edi - - mov esi, [esp + .dat$] ; esi -> buffer - mov ecx, [esp + .len$] ; ecx = length - - sub eax, eax ; crc = 0 - - test esi, esi - jz short .c_exit - - test ecx, ecx - jz short .c_exit - - dec eax ; crc = 0xffffffff - -%ifdef _OBJ_ - mov edi, tinf_crc32tab wrt FLAT ; edi -> crctab -%else - mov edi, tinf_crc32tab ; edi -> crctab -%endif - - .c_next_byte: - xor al, [esi] - inc esi - - mov edx, 0x0f - and edx, eax - - shr eax, 4 - - xor eax, [edi + edx*4] - - mov edx, 0x0f - and edx, eax - - shr eax, 4 - - xor eax, [edi + edx*4] - - dec ecx - jnz short .c_next_byte - - not eax - - .c_exit: - pop edi - pop esi - - lcmret 8 - -; ============================================================= - -section lcmdata - -tinf_crc32tab dd 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190 - dd 0x6b6b51f4, 0x4db26158, 0x5005713c, 0xedb88320, 0xf00f9344 - dd 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278 - dd 0xbdbdf21c - -; ============================================================= diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/nasmlcm.inc b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/nasmlcm.inc deleted file mode 100644 index 5cbe7e0d..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/nasmlcm.inc +++ /dev/null @@ -1,326 +0,0 @@ -;; -;; NASM linker compatibility macros 2002.07.24 -;; -;; Copyright (c) 2001-2003 by Joergen Ibsen / Jibz -;; All Rights Reserved -;; -;; http://www.ibsensoftware.com/ -;; - -; define _ELF_ for ELF32 object files -; define _OBJ_ for OMF object files -; define _OBJ_ and _DLL_ for OMF object files for a dll (stdcall) -; define _MSLIBS_ for MS style Win32 import libs (lcmwinextern) -; default is DJGPP/WIN32 COFF object files - -; remember to do lcm*extern before lcmimport - -; ==================================================================== -; -; There are differences between how the object formats that NASM -; supports work, and what features they support. Similarly there -; are differences between how complete and standard compliant the -; support for these formats are in linkers. -; -; The NASM linker compatibility macros (nasmlcm) were put together -; to ease my work by allowing a single source file to be assembled -; for use with a number of compilers/linkers. -; -; Currently obj/omf, win32/coff, djgpp/coff and elf32 output formats -; are supported. The following macros are available: -; -; lcmtext - section name for the code section -; lcmdata - section name for the initialized data section -; lcmbss - section name for the uninitialized data section -; -; lcmglobal - declare a function (two arguments) or data (one -; argument) as global in the current format -; lcmcglobal - same as lcmglobal, but uses C name decoration -; -; lcmextern - declare a function (two arguments) or data (one -; argument) as extern in the current format -; lcmcextern - same as lcmextern, but uses C name decoration -; lcmdllextern - same as lcmextern, but uses dll name decoration -; lcmwinextern - same as lcmextern, but uses name decoration for -; calling Win32 Api functions (see _MSLIBS_) -; -; lcmimport - declares a function (two arguments) or data (one -; argument) as imported in the current format -; lcmexport - declares a function (two arguments) or data (one -; argument) as exported in the current format -; -; lcmlabel - start label for a function in the current format -; lcmclabel - start label for a function with C name decoration -; lcmadjust - adjust stack after a function call in the current -; format -; lcmret - return from a function in the current format -; lcmcret - return from a C function -; -; The following defines change the format and behaviour: -; -; _ELF_ - the lcm*global macro adds :function and :data type -; specifiers -; -; _OBJ_ - section names are similar to those produced by -; Borland tools to increase compatibility with -; various OMF compatible linkers -; -; _DLL_ - functions are exported and imported with added -; size specifiers (_SomeFunction@12), lcmret adjusts -; stack (stdcall) -; -; _MSLIBS_ - the lcmwinextern macro prepends an underscore and -; adds size specification for functions, allowing -; the object file to be linked with MS libraries. -; -; ==================================================================== - -%ifndef NASMLCM_INC_INCLUDED -%define NASMLCM_INC_INCLUDED - -%ifdef _DLL_ - %ifndef _OBJ_ - %error "_DLL_ needs _OBJ_ defined!" - %endif -%endif - -; --- define lcm- section names --- -; -; a number of linkers require omf objects where the section -; names are equal to those produces by tasm. - -%ifdef _OBJ_ - - %define lcmtext _TEXT class=CODE public use32 align=4 FLAT - %define lcmdata _DATA class=DATA public use32 align=4 - %define lcmbss _BSS class=BSS public use32 align=4 FLAT - - group FLAT - group DGROUP _DATA - -%else ; _OBJ_ - - %define lcmtext .text - %define lcmdata .data - %define lcmbss .bss - -%endif ; _OBJ_ - -; --- define lcmglobal and lcm*extern macros --- -; -; special handling of functions and data for ELF32 - -%ifdef _ELF_ - - %macro lcmglobal 2 - global %{1}:function - %endmacro - %macro lcmglobal 1 - global %{1}:data - %endmacro - - %define lcmcglobal lcmglobal - - %macro lcmextern 1-2 - extern %1 - %endmacro - - %macro lcmcextern 0 - %error lcmcextern not supported in ELF format - %endmacro - - %macro lcmdllextern 0 - %error lcmdllextern not supported in ELF format - %endmacro - -%else ; _ELF_ - - %ifdef _DLL_ - - %macro lcmglobal 2 - global _%1 - global _%1@%2 - %endmacro - %macro lcmglobal 1 - global _%1 - %define %1 _%1 - %endmacro - - %macro lcmcglobal 2 - global _%1 - %endmacro - %macro lcmcglobal 1 - global _%1 - %define %1 _%1 - %endmacro - - %macro lcmextern 2 - extern _%1@%2 - %define %1 _%1@%2 - %endmacro - %macro lcmextern 1 - extern _%1 - %define %1 _%1 - %endmacro - - %else - - %macro lcmglobal 2 - global _%1 - %endmacro - %macro lcmglobal 1 - global _%1 - %define %1 _%1 - %endmacro - - %define lcmcglobal lcmglobal - - %macro lcmextern 1-2 - extern _%1 - %define %1 _%1 - %endmacro - - %endif - - %macro lcmcextern 1-2 - extern _%1 - %define %1 _%1 - %endmacro - - %macro lcmdllextern 2 - extern _%1@%2 - %define %1 _%1@%2 - %endmacro - %macro lcmdllextern 1 - extern _%1 - %define %1 _%1 - %endmacro - - %macro lcmwinextern 2 - %ifdef _MSLIBS_ - extern _%1@%2 - %define %1 _%1@%2 - %else - extern %1 - %endif - %endmacro - -%endif ; _ELF_ - -; --- define lcmimport and lcmexport --- -; - -%ifdef _OBJ_ - - %macro lcmimport 2-3 - import %1 %2 %3 - %rotate 1 - %endmacro - - %ifdef _DLL_ - - %macro lcmexport 2 - export _%1 - export _%1@%2 - %endmacro - %macro lcmexport 1 - export _%1 - %endmacro - - %else - - %macro lcmexport 1-2 - %endmacro - - %endif - -%else ; _OBJ_ - - %macro lcmimport 2-3 - %endmacro - - %macro lcmexport 1-2 - %endmacro - -%endif ; _OBJ_ - -; --- define lcmlabel, lcmadjust and lcmret macros --- -; -; we need special labels and stdcall calling convention when -; assembling for a dll - -%ifdef _ELF_ - - %macro lcmlabel 2 - %1: - %endmacro - - %define lcmclabel lcmlabel - - %macro lcmadjust 1 - %if %1 < 128 - add esp, byte %1 - %else - add esp, %1 - %endif - %endmacro - - %macro lcmret 1 - ret - %endmacro - - %define lcmcret lcmret - -%else ; _ELF_ - - %ifdef _DLL_ - %macro lcmlabel 2 - _%1: - _%1@%2: - %endmacro - - %macro lcmclabel 2 - _%1: - %endmacro - - %macro lcmadjust 1 - %endmacro - - %macro lcmret 1 - %if %1 > 0 - ret %1 - %else - ret - %endif - %endmacro - - %macro lcmcret 1 - ret - %endmacro - - %else - - %macro lcmlabel 2 - _%1: - %endmacro - - %define lcmclabel lcmlabel - - %macro lcmadjust 1 - %if %1 < 128 - add esp, byte %1 - %else - add esp, %1 - %endif - %endmacro - - %macro lcmret 1 - ret - %endmacro - - %define lcmcret lcmret - %endif - -%endif ; _ELF_ - -%endif ; NASMLCM_INC_INCLUDED diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/tinfzlib.nas b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/tinfzlib.nas deleted file mode 100644 index 1f9519eb..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/nasm/tinfzlib.nas +++ /dev/null @@ -1,160 +0,0 @@ -;; -;; tinfzlib - tiny zlib uncompress -;; -;; Copyright (c) 2003 by Joergen Ibsen / Jibz -;; All Rights Reserved -;; -;; http://www.ibsensoftware.com/ -;; -;; This software is provided 'as-is', without any express -;; or implied warranty. In no event will the authors be -;; held liable for any damages arising from the use of -;; this software. -;; -;; Permission is granted to anyone to use this software -;; for any purpose, including commercial applications, -;; and to alter it and redistribute it freely, subject to -;; the following restrictions: -;; -;; 1. The origin of this software must not be -;; misrepresented; you must not claim that you -;; wrote the original software. If you use this -;; software in a product, an acknowledgment in -;; the product documentation would be appreciated -;; but is not required. -;; -;; 2. Altered source versions must be plainly marked -;; as such, and must not be misrepresented as -;; being the original software. -;; -;; 3. This notice may not be removed or altered from -;; any source distribution. -;; - -TINF_OK equ 0 -TINF_DATA_ERROR equ (-3) - -cpu 386 - -bits 32 - -%include "nasmlcm.inc" - -section lcmtext - -lcmglobal tinf_zlib_uncompress,16 - -lcmexport tinf_zlib_uncompress,16 - -lcmextern tinf_uncompress,16 -lcmextern tinf_adler32,8 - -; ============================================================= - -lcmlabel tinf_zlib_uncompress,16 - ; tinf_zlib_uncompress(void *dest, - ; unsigned int *destLen, - ; const void *source, - ; unsigned int sourceLen) - - .slen$ equ 2*4 + 4 + 12 - .src$ equ 2*4 + 4 + 8 - .dlen$ equ 2*4 + 4 + 4 - .dst$ equ 2*4 + 4 - - push esi - push ebx - - mov esi, [esp + .src$] ; esi -> source - - ; -- get header bytes -- - - movzx eax, word [esi] ; al = cmf, ah = flg, - - ; -- check format -- - - ; check method is deflate - ; if ((cmf & 0x0f) != 8) return TINF_DATA_ERROR; - mov cl, 0x0f - and cl, al - cmp cl, 8 - jne short .return_error - - ; check window size is valid - ; if ((cmf >> 4) > 7) return TINF_DATA_ERROR; - mov ch, al - shr ch, 4 - cmp ch, cl ; cl = 8 from above - jae short .return_error - - ; check there is no preset dictionary - ; if (flg & 0x20) return TINF_DATA_ERROR; - test ah, 0x20 - jnz short .return_error - - ; check checksum - ; if ((256*cmf + flg) % 31) return TINF_DATA_ERROR; - xchg al, ah - xor edx, edx - lea ebx, [edx + 31] - div ebx - test edx, edx - jnz short .return_error - - ; -- get adler32 checksum -- - - mov ecx, [esp + .slen$] ; ecx = sourceLen - mov ebx, [esi + ecx - 4] - - %ifdef BSWAP_OK - bswap ebx - %else ; BSWAP_OK - xchg bl, bh - rol ebx, 16 - xchg bl, bh - %endif ; BSWAP_OK - - ; -- inflate -- - - ; res = tinf_uncompress(dst, destLen, src + 2, sourceLen - 6); - lea eax, [ecx - 6] - push eax - lea eax, [esi + 2] - push eax - push dword [esp + 8 + .dlen$] - push dword [esp + 12 + .dst$] - call tinf_uncompress - add esp, byte 16 - - ; if (res != TINF_OK) return TINF_DATA_ERROR; - test eax, eax - jnz short .return_error - - ; -- check adler32 checksum -- - - ; if (a32 != tinf_adler32(dst, *destLen)) return TINF_DATA_ERROR; - mov eax, [esp + .dlen$]; - push dword [eax] - push dword [esp + 4 + .dst$] - call tinf_adler32 - add esp, byte 8 - - sub eax, ebx - jz short .return_eax - - .return_error: - mov eax, TINF_DATA_ERROR - - .return_eax: - pop ebx - pop esi - - lcmret 16 - -; ============================================================= - -%ifdef _OBJ_ - section lcmdata -%endif - -; ============================================================= diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf.h deleted file mode 100644 index ae6e1c40..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Compatibility header for the original tinf lib/older versions of uzlib. - Note: may be removed in the future, please migrate to uzlib.h. */ -#include "uzlib.h" diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf_compat.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf_compat.h deleted file mode 100644 index f763804b..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinf_compat.h +++ /dev/null @@ -1,9 +0,0 @@ -/* This header contains compatibility defines for the original tinf API - and uzlib 2.x and below API. These defines are deprecated and going - to be removed in the future, so applications should migrate to new - uzlib API. */ -#define TINF_DATA struct uzlib_uncomp - -#define destSize dest_size -#define destStart dest_start -#define readSource source_read_cb diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfgzip.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfgzip.c deleted file mode 100644 index 22b000df..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfgzip.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2018 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include "tinf.h" - -#define FTEXT 1 -#define FHCRC 2 -#define FEXTRA 4 -#define FNAME 8 -#define FCOMMENT 16 - -void tinf_skip_bytes(TINF_DATA *d, int num); -uint16_t tinf_get_uint16(TINF_DATA *d); - -void tinf_skip_bytes(TINF_DATA *d, int num) -{ - while (num--) uzlib_get_byte(d); -} - -uint16_t tinf_get_uint16(TINF_DATA *d) -{ - unsigned int v = uzlib_get_byte(d); - v = (uzlib_get_byte(d) << 8) | v; - return v; -} - -int uzlib_gzip_parse_header(TINF_DATA *d) -{ - unsigned char flg; - - /* -- check format -- */ - - /* check id bytes */ - if (uzlib_get_byte(d) != 0x1f || uzlib_get_byte(d) != 0x8b) return TINF_DATA_ERROR; - - /* check method is deflate */ - if (uzlib_get_byte(d) != 8) return TINF_DATA_ERROR; - - /* get flag byte */ - flg = uzlib_get_byte(d); - - /* check that reserved bits are zero */ - if (flg & 0xe0) return TINF_DATA_ERROR; - - /* -- find start of compressed data -- */ - - /* skip rest of base header of 10 bytes */ - tinf_skip_bytes(d, 6); - - /* skip extra data if present */ - if (flg & FEXTRA) - { - unsigned int xlen = tinf_get_uint16(d); - tinf_skip_bytes(d, xlen); - } - - /* skip file name if present */ - if (flg & FNAME) { while (uzlib_get_byte(d)); } - - /* skip file comment if present */ - if (flg & FCOMMENT) { while (uzlib_get_byte(d)); } - - /* check header crc if present */ - if (flg & FHCRC) - { - /*unsigned int hcrc =*/ tinf_get_uint16(d); - - // TODO: Check! -// if (hcrc != (tinf_crc32(src, start - src) & 0x0000ffff)) -// return TINF_DATA_ERROR; - } - - /* initialize for crc32 checksum */ - d->checksum_type = TINF_CHKSUM_CRC; - d->checksum = ~0; - - return TINF_OK; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinflate.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinflate.c deleted file mode 100644 index 8d631fe7..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinflate.c +++ /dev/null @@ -1,673 +0,0 @@ -/* - * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2018 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include -#include -#include "tinf.h" - -#define UZLIB_DUMP_ARRAY(heading, arr, size) \ - { \ - printf("%s", heading); \ - for (int i = 0; i < size; ++i) { \ - printf(" %d", (arr)[i]); \ - } \ - printf("\n"); \ - } - -uint32_t tinf_get_le_uint32(TINF_DATA *d); -uint32_t tinf_get_be_uint32(TINF_DATA *d); - -/* --------------------------------------------------- * - * -- uninitialized global data (static structures) -- * - * --------------------------------------------------- */ - -#ifdef RUNTIME_BITS_TABLES - -/* extra bits and base tables for length codes */ -unsigned char length_bits[30]; -unsigned short length_base[30]; - -/* extra bits and base tables for distance codes */ -unsigned char dist_bits[30]; -unsigned short dist_base[30]; - -#else - -const unsigned char length_bits[30] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, - 5, 5, 5, 5 -}; -const unsigned short length_base[30] = { - 3, 4, 5, 6, 7, 8, 9, 10, - 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, - 131, 163, 195, 227, 258 -}; - -const unsigned char dist_bits[30] = { - 0, 0, 0, 0, 1, 1, 2, 2, - 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, - 11, 11, 12, 12, 13, 13 -}; -const unsigned short dist_base[30] = { - 1, 2, 3, 4, 5, 7, 9, 13, - 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, - 4097, 6145, 8193, 12289, 16385, 24577 -}; - -#endif - -/* special ordering of code length codes */ -const unsigned char clcidx[] = { - 16, 17, 18, 0, 8, 7, 9, 6, - 10, 5, 11, 4, 12, 3, 13, 2, - 14, 1, 15 -}; - -/* ----------------------- * - * -- utility functions -- * - * ----------------------- */ - -#ifdef RUNTIME_BITS_TABLES -/* build extra bits and base tables */ -static void tinf_build_bits_base(unsigned char *bits, unsigned short *base, int delta, int first) -{ - int i, sum; - - /* build bits table */ - for (i = 0; i < delta; ++i) bits[i] = 0; - for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta; - - /* build base table */ - for (sum = first, i = 0; i < 30; ++i) - { - base[i] = sum; - sum += 1 << bits[i]; - } -} -#endif - -/* build the fixed huffman trees */ -static void tinf_build_fixed_trees(TINF_TREE *lt, TINF_TREE *dt) -{ - int i; - - /* build fixed length tree */ - for (i = 0; i < 7; ++i) lt->table[i] = 0; - - lt->table[7] = 24; - lt->table[8] = 152; - lt->table[9] = 112; - - for (i = 0; i < 24; ++i) lt->trans[i] = 256 + i; - for (i = 0; i < 144; ++i) lt->trans[24 + i] = i; - for (i = 0; i < 8; ++i) lt->trans[24 + 144 + i] = 280 + i; - for (i = 0; i < 112; ++i) lt->trans[24 + 144 + 8 + i] = 144 + i; - - /* build fixed distance tree */ - for (i = 0; i < 5; ++i) dt->table[i] = 0; - - dt->table[5] = 32; - - for (i = 0; i < 32; ++i) dt->trans[i] = i; -} - -/* given an array of code lengths, build a tree */ -static void tinf_build_tree(TINF_TREE *t, const unsigned char *lengths, unsigned int num) -{ - unsigned short offs[16]; - unsigned int i, sum; - - /* clear code length count table */ - for (i = 0; i < 16; ++i) t->table[i] = 0; - - /* scan symbol lengths, and sum code length counts */ - for (i = 0; i < num; ++i) t->table[lengths[i]]++; - - #if UZLIB_CONF_DEBUG_LOG >= 2 - UZLIB_DUMP_ARRAY("codelen counts:", t->table, TINF_ARRAY_SIZE(t->table)); - #endif - - /* In the lengths array, 0 means unused code. So, t->table[0] now contains - number of unused codes. But table's purpose is to contain # of codes of - particular length, and there're 0 codes of length 0. */ - t->table[0] = 0; - - /* compute offset table for distribution sort */ - for (sum = 0, i = 0; i < 16; ++i) - { - offs[i] = sum; - sum += t->table[i]; - } - - #if UZLIB_CONF_DEBUG_LOG >= 2 - UZLIB_DUMP_ARRAY("codelen offsets:", offs, TINF_ARRAY_SIZE(offs)); - #endif - - /* create code->symbol translation table (symbols sorted by code) */ - for (i = 0; i < num; ++i) - { - if (lengths[i]) t->trans[offs[lengths[i]]++] = i; - } -} - -/* ---------------------- * - * -- decode functions -- * - * ---------------------- */ - -unsigned char uzlib_get_byte(TINF_DATA *d) -{ - /* If end of source buffer is not reached, return next byte from source - buffer. */ - if (d->source < d->source_limit) { - return *d->source++; - } - /* Otherwise if there's callback and we haven't seen EOF yet, try to - read next byte using it. (Note: the callback can also update ->source - and ->source_limit). */ - if (d->readSource && !d->eof) { - int val = d->readSource(d); - if (val >= 0) { - return (unsigned char)val; - } - } - - /* Otherwise, we hit EOF (either from ->readSource() or from exhaustion - of the buffer), and it will be "sticky", i.e. further calls to this - function will end up here too. */ - d->eof = true; - - return 0; -} - -uint32_t tinf_get_le_uint32(TINF_DATA *d) -{ - uint32_t val = 0; - int i; - for (i = 4; i--;) { - val = val >> 8 | ((uint32_t)uzlib_get_byte(d)) << 24; - } - return val; -} - -uint32_t tinf_get_be_uint32(TINF_DATA *d) -{ - uint32_t val = 0; - int i; - for (i = 4; i--;) { - val = val << 8 | uzlib_get_byte(d); - } - return val; -} - -/* get one bit from source stream */ -static int tinf_getbit(TINF_DATA *d) -{ - unsigned int bit; - - /* check if tag is empty */ - if (!d->bitcount--) - { - /* load next tag */ - d->tag = uzlib_get_byte(d); - d->bitcount = 7; - } - - /* shift bit out of tag */ - bit = d->tag & 0x01; - d->tag >>= 1; - - return bit; -} - -/* read a num bit value from a stream and add base */ -static unsigned int tinf_read_bits(TINF_DATA *d, int num, int base) -{ - unsigned int val = 0; - - /* read num bits */ - if (num) - { - unsigned int limit = 1 << (num); - unsigned int mask; - - for (mask = 1; mask < limit; mask *= 2) - if (tinf_getbit(d)) val += mask; - } - - return val + base; -} - -/* given a data stream and a tree, decode a symbol */ -static int tinf_decode_symbol(TINF_DATA *d, TINF_TREE *t) -{ - int sum = 0, cur = 0, len = 0; - - /* get more bits while code value is above sum */ - do { - - cur = 2*cur + tinf_getbit(d); - - if (++len == TINF_ARRAY_SIZE(t->table)) { - return TINF_DATA_ERROR; - } - - sum += t->table[len]; - cur -= t->table[len]; - - } while (cur >= 0); - - sum += cur; - #if UZLIB_CONF_PARANOID_CHECKS - if (sum < 0 || sum >= TINF_ARRAY_SIZE(t->trans)) { - return TINF_DATA_ERROR; - } - #endif - - return t->trans[sum]; -} - -/* given a data stream, decode dynamic trees from it */ -static int tinf_decode_trees(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) -{ - /* code lengths for 288 literal/len symbols and 32 dist symbols */ - unsigned char lengths[288+32]; - unsigned int hlit, hdist, hclen, hlimit; - unsigned int i, num, length; - - /* get 5 bits HLIT (257-286) */ - hlit = tinf_read_bits(d, 5, 257); - - /* get 5 bits HDIST (1-32) */ - hdist = tinf_read_bits(d, 5, 1); - - /* get 4 bits HCLEN (4-19) */ - hclen = tinf_read_bits(d, 4, 4); - - for (i = 0; i < 19; ++i) lengths[i] = 0; - - /* read code lengths for code length alphabet */ - for (i = 0; i < hclen; ++i) - { - /* get 3 bits code length (0-7) */ - unsigned int clen = tinf_read_bits(d, 3, 0); - - lengths[clcidx[i]] = clen; - } - - /* build code length tree, temporarily use length tree */ - tinf_build_tree(lt, lengths, 19); - - /* decode code lengths for the dynamic trees */ - hlimit = hlit + hdist; - for (num = 0; num < hlimit; ) - { - int sym = tinf_decode_symbol(d, lt); - unsigned char fill_value = 0; - int lbits, lbase = 3; - - /* error decoding */ - if (sym < 0) return sym; - - switch (sym) - { - case 16: - /* copy previous code length 3-6 times (read 2 bits) */ - if (num == 0) return TINF_DATA_ERROR; - fill_value = lengths[num - 1]; - lbits = 2; - break; - case 17: - /* repeat code length 0 for 3-10 times (read 3 bits) */ - lbits = 3; - break; - case 18: - /* repeat code length 0 for 11-138 times (read 7 bits) */ - lbits = 7; - lbase = 11; - break; - default: - /* values 0-15 represent the actual code lengths */ - lengths[num++] = sym; - /* continue the for loop */ - continue; - } - - /* special code length 16-18 are handled here */ - length = tinf_read_bits(d, lbits, lbase); - if (num + length > hlimit) return TINF_DATA_ERROR; - for (; length; --length) - { - lengths[num++] = fill_value; - } - } - - #if UZLIB_CONF_DEBUG_LOG >= 2 - printf("lit code lengths (%d):", hlit); - UZLIB_DUMP_ARRAY("", lengths, hlit); - printf("dist code lengths (%d):", hdist); - UZLIB_DUMP_ARRAY("", lengths + hlit, hdist); - #endif - - #if UZLIB_CONF_PARANOID_CHECKS - /* Check that there's "end of block" symbol */ - if (lengths[256] == 0) { - return TINF_DATA_ERROR; - } - #endif - - /* build dynamic trees */ - tinf_build_tree(lt, lengths, hlit); - tinf_build_tree(dt, lengths + hlit, hdist); - - return TINF_OK; -} - -/* ----------------------------- * - * -- block inflate functions -- * - * ----------------------------- */ - -/* given a stream and two trees, inflate next chunk of output (a byte or more) */ -static int tinf_inflate_block_data(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) -{ - if (d->curlen == 0) { - unsigned int offs; - int dist; - int sym = tinf_decode_symbol(d, lt); - //printf("huff sym: %02x\n", sym); - - if (d->eof) { - return TINF_DATA_ERROR; - } - - /* literal byte */ - if (sym < 256) { - TINF_PUT(d, sym); - return TINF_OK; - } - - /* end of block */ - if (sym == 256) { - return TINF_DONE; - } - - /* substring from sliding dictionary */ - sym -= 257; - if (sym >= 29) { - return TINF_DATA_ERROR; - } - - /* possibly get more bits from length code */ - d->curlen = tinf_read_bits(d, length_bits[sym], length_base[sym]); - - dist = tinf_decode_symbol(d, dt); - if (dist >= 30) { - return TINF_DATA_ERROR; - } - - /* possibly get more bits from distance code */ - offs = tinf_read_bits(d, dist_bits[dist], dist_base[dist]); - - /* calculate and validate actual LZ offset to use */ - if (d->dict_ring) { - if (offs > d->dict_size) { - return TINF_DICT_ERROR; - } - /* Note: unlike full-dest-in-memory case below, we don't - try to catch offset which points to not yet filled - part of the dictionary here. Doing so would require - keeping another variable to track "filled in" size - of the dictionary. Appearance of such an offset cannot - lead to accessing memory outside of the dictionary - buffer, and clients which don't want to leak unrelated - information, should explicitly initialize dictionary - buffer passed to uzlib. */ - - d->lzOff = d->dict_idx - offs; - if (d->lzOff < 0) { - d->lzOff += d->dict_size; - } - } else { - /* catch trying to point before the start of dest buffer */ - if (offs > d->dest - d->destStart) { - return TINF_DATA_ERROR; - } - d->lzOff = -offs; - } - } - - /* copy next byte from dict substring */ - if (d->dict_ring) { - TINF_PUT(d, d->dict_ring[d->lzOff]); - if ((unsigned)++d->lzOff == d->dict_size) { - d->lzOff = 0; - } - } else { - #if UZLIB_CONF_USE_MEMCPY - /* copy as much as possible, in one memcpy() call */ - unsigned int to_copy = d->curlen, dest_len = d->dest_limit - d->dest; - if (to_copy > dest_len) { - to_copy = dest_len; - } - memcpy(d->dest, d->dest + d->lzOff, to_copy); - d->dest += to_copy; - d->curlen -= to_copy; - return TINF_OK; - #else - d->dest[0] = d->dest[d->lzOff]; - d->dest++; - #endif - } - d->curlen--; - return TINF_OK; -} - -/* inflate next byte from uncompressed block of data */ -static int tinf_inflate_uncompressed_block(TINF_DATA *d) -{ - if (d->curlen == 0) { - unsigned int length, invlength; - - /* get length */ - length = uzlib_get_byte(d); - length += 256 * uzlib_get_byte(d); - /* get one's complement of length */ - invlength = uzlib_get_byte(d); - invlength += 256 * uzlib_get_byte(d); - /* check length */ - if (length != (~invlength & 0x0000ffff)) return TINF_DATA_ERROR; - - /* increment length to properly return TINF_DONE below, without - producing data at the same time */ - d->curlen = length + 1; - - /* make sure we start next block on a byte boundary */ - d->bitcount = 0; - } - - if (--d->curlen == 0) { - return TINF_DONE; - } - - unsigned char c = uzlib_get_byte(d); - TINF_PUT(d, c); - return TINF_OK; -} - -/* ---------------------- * - * -- public functions -- * - * ---------------------- */ - -/* initialize global (static) data */ -void uzlib_init(void) -{ -#ifdef RUNTIME_BITS_TABLES - /* build extra bits and base tables */ - tinf_build_bits_base(length_bits, length_base, 4, 3); - tinf_build_bits_base(dist_bits, dist_base, 2, 1); - - /* fix a special case */ - length_bits[28] = 0; - length_base[28] = 258; -#endif -} - -/* initialize decompression structure */ -void uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen) -{ - d->eof = 0; - d->bitcount = 0; - d->bfinal = 0; - d->btype = -1; - d->dict_size = dictLen; - d->dict_ring = dict; - d->dict_idx = 0; - d->curlen = 0; -} - -/* inflate next output bytes from compressed stream */ -int uzlib_uncompress(TINF_DATA *d) -{ - do { - int res; - - /* start a new block */ - if (d->btype == -1) { - int old_btype; -next_blk: - old_btype = d->btype; - /* read final block flag */ - d->bfinal = tinf_getbit(d); - /* read block type (2 bits) */ - d->btype = tinf_read_bits(d, 2, 0); - - #if UZLIB_CONF_DEBUG_LOG >= 1 - printf("Started new block: type=%d final=%d\n", d->btype, d->bfinal); - #endif - - if (d->btype == 1 && old_btype != 1) { - /* build fixed huffman trees */ - tinf_build_fixed_trees(&d->ltree, &d->dtree); - } else if (d->btype == 2) { - /* decode trees from stream */ - res = tinf_decode_trees(d, &d->ltree, &d->dtree); - if (res != TINF_OK) { - return res; - } - } - } - - /* process current block */ - switch (d->btype) - { - case 0: - /* decompress uncompressed block */ - res = tinf_inflate_uncompressed_block(d); - break; - case 1: - case 2: - /* decompress block with fixed/dynamic huffman trees */ - /* trees were decoded previously, so it's the same routine for both */ - res = tinf_inflate_block_data(d, &d->ltree, &d->dtree); - break; - default: - return TINF_DATA_ERROR; - } - - if (res == TINF_DONE && !d->bfinal) { - /* the block has ended (without producing more data), but we - can't return without data, so start procesing next block */ - goto next_blk; - } - - if (res != TINF_OK) { - return res; - } - - } while (d->dest < d->dest_limit); - - return TINF_OK; -} - -/* inflate next output bytes from compressed stream, updating - checksum, and at the end of stream, verify it */ -int uzlib_uncompress_chksum(TINF_DATA *d) -{ - int res; - unsigned char *data = d->dest; - - res = uzlib_uncompress(d); - - if (res < 0) return res; - - switch (d->checksum_type) { - - case TINF_CHKSUM_ADLER: - d->checksum = uzlib_adler32(data, d->dest - data, d->checksum); - break; - - case TINF_CHKSUM_CRC: - d->checksum = uzlib_crc32(data, d->dest - data, d->checksum); - break; - } - - if (res == TINF_DONE) { - unsigned int val; - - switch (d->checksum_type) { - - case TINF_CHKSUM_ADLER: - val = tinf_get_be_uint32(d); - if (d->checksum != val) { - return TINF_CHKSUM_ERROR; - } - break; - - case TINF_CHKSUM_CRC: - val = tinf_get_le_uint32(d); - if (~d->checksum != val) { - return TINF_CHKSUM_ERROR; - } - // Uncompressed size. TODO: Check - val = tinf_get_le_uint32(d); - break; - } - } - - return res; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfzlib.c b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfzlib.c deleted file mode 100644 index 5cb8852f..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/tinfzlib.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2018 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#include "tinf.h" - -int uzlib_zlib_parse_header(TINF_DATA *d) -{ - unsigned char cmf, flg; - - /* -- get header bytes -- */ - - cmf = uzlib_get_byte(d); - flg = uzlib_get_byte(d); - - /* -- check format -- */ - - /* check checksum */ - if ((256*cmf + flg) % 31) return TINF_DATA_ERROR; - - /* check method is deflate */ - if ((cmf & 0x0f) != 8) return TINF_DATA_ERROR; - - /* check window size is valid */ - if ((cmf >> 4) > 7) return TINF_DATA_ERROR; - - /* check there is no preset dictionary */ - if (flg & 0x20) return TINF_DATA_ERROR; - - /* initialize for adler32 checksum */ - d->checksum_type = TINF_CHKSUM_ADLER; - d->checksum = 1; - - return cmf >> 4; -} diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib.h deleted file mode 100644 index 681ad740..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) - * - * Copyright (c) 2003 by Joergen Ibsen / Jibz - * All Rights Reserved - * http://www.ibsensoftware.com/ - * - * Copyright (c) 2014-2018 by Paul Sokolovsky - * - * This software is provided 'as-is', without any express - * or implied warranty. In no event will the authors be - * held liable for any damages arising from the use of - * this software. - * - * Permission is granted to anyone to use this software - * for any purpose, including commercial applications, - * and to alter it and redistribute it freely, subject to - * the following restrictions: - * - * 1. The origin of this software must not be - * misrepresented; you must not claim that you - * wrote the original software. If you use this - * software in a product, an acknowledgment in - * the product documentation would be appreciated - * but is not required. - * - * 2. Altered source versions must be plainly marked - * as such, and must not be misrepresented as - * being the original software. - * - * 3. This notice may not be removed or altered from - * any source distribution. - */ - -#ifndef UZLIB_H_INCLUDED -#define UZLIB_H_INCLUDED - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#include "uzlib_conf.h" -#if UZLIB_CONF_DEBUG_LOG -#include -#endif - -/* calling convention */ -#ifndef TINFCC - #ifdef __WATCOMC__ - #define TINFCC __cdecl - #else - #define TINFCC - #endif -#endif - -/* ok status, more data produced */ -#define TINF_OK 0 -/* end of compressed stream reached */ -#define TINF_DONE 1 -#define TINF_DATA_ERROR (-3) -#define TINF_CHKSUM_ERROR (-4) -#define TINF_DICT_ERROR (-5) - -/* checksum types */ -#define TINF_CHKSUM_NONE 0 -#define TINF_CHKSUM_ADLER 1 -#define TINF_CHKSUM_CRC 2 - -/* helper macros */ -#define TINF_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*(arr))) - -/* data structures */ - -typedef struct { - unsigned short table[16]; /* table of code length counts */ - unsigned short trans[288]; /* code -> symbol translation table */ -} TINF_TREE; - -struct uzlib_uncomp { - /* Pointer to the next byte in the input buffer */ - const unsigned char *source; - /* Pointer to the next byte past the input buffer (source_limit = source + len) */ - const unsigned char *source_limit; - /* If source_limit == NULL, or source >= source_limit, this function - will be used to read next byte from source stream. The function may - also return -1 in case of EOF (or irrecoverable error). Note that - besides returning the next byte, it may also update source and - source_limit fields, thus allowing for buffered operation. */ - int (*source_read_cb)(struct uzlib_uncomp *uncomp); - - unsigned int tag; - unsigned int bitcount; - - /* Destination (output) buffer start */ - unsigned char *dest_start; - /* Current pointer in dest buffer */ - unsigned char *dest; - /* Pointer past the end of the dest buffer, similar to source_limit */ - unsigned char *dest_limit; - - /* Accumulating checksum */ - unsigned int checksum; - char checksum_type; - bool eof; - - int btype; - int bfinal; - unsigned int curlen; - int lzOff; - unsigned char *dict_ring; - unsigned int dict_size; - unsigned int dict_idx; - - TINF_TREE ltree; /* dynamic length/symbol tree */ - TINF_TREE dtree; /* dynamic distance tree */ -}; - -#include "tinf_compat.h" - -#define TINF_PUT(d, c) \ - { \ - *d->dest++ = c; \ - if (d->dict_ring) { d->dict_ring[d->dict_idx++] = c; if (d->dict_idx == d->dict_size) d->dict_idx = 0; } \ - } - -unsigned char TINFCC uzlib_get_byte(TINF_DATA *d); - -/* Decompression API */ - -void TINFCC uzlib_init(void); -void TINFCC uzlib_uncompress_init(TINF_DATA *d, void *dict, unsigned int dictLen); -int TINFCC uzlib_uncompress(TINF_DATA *d); -int TINFCC uzlib_uncompress_chksum(TINF_DATA *d); - -int TINFCC uzlib_zlib_parse_header(TINF_DATA *d); -int TINFCC uzlib_gzip_parse_header(TINF_DATA *d); - -/* Compression API */ - -typedef const uint8_t *uzlib_hash_entry_t; - -struct uzlib_comp { - unsigned char *outbuf; - int outlen, outsize; - unsigned long outbits; - int noutbits; - int comp_disabled; - - uzlib_hash_entry_t *hash_table; - unsigned int hash_bits; - unsigned int dict_size; -}; - -void TINFCC uzlib_compress(struct uzlib_comp *c, const uint8_t *src, unsigned slen); - -#include "defl_static.h" - -/* Checksum API */ - -/* prev_sum is previous value for incremental computation, 1 initially */ -uint32_t TINFCC uzlib_adler32(const void *data, unsigned int length, uint32_t prev_sum); -/* crc is previous value for incremental computation, 0xffffffff initially */ -uint32_t TINFCC uzlib_crc32(const void *data, unsigned int length, uint32_t crc); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* UZLIB_H_INCLUDED */ diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib_conf.h b/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib_conf.h deleted file mode 100644 index fd67dec8..00000000 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/uzlib/src/uzlib_conf.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * uzlib - tiny deflate/inflate library (deflate, gzip, zlib) - * - * Copyright (c) 2014-2018 by Paul Sokolovsky - */ - -#ifndef UZLIB_CONF_H_INCLUDED -#define UZLIB_CONF_H_INCLUDED - -#ifndef UZLIB_CONF_DEBUG_LOG -/* Debug logging level 0, 1, 2, etc. */ -#define UZLIB_CONF_DEBUG_LOG 0 -#endif - -#ifndef UZLIB_CONF_PARANOID_CHECKS -/* Perform extra checks on the input stream, even if they aren't proven - to be strictly required (== lack of them wasn't proven to lead to - crashes). */ -#define UZLIB_CONF_PARANOID_CHECKS 0 -#endif - -#ifndef UZLIB_CONF_USE_MEMCPY -/* Use memcpy() for copying data out of LZ window or uncompressed blocks, - instead of doing this byte by byte. For well-compressed data, this - may noticeably increase decompression speed. But for less compressed, - it can actually deteriorate it (due to the fact that many memcpy() - implementations are optimized for large blocks of data, and have - too much overhead for short strings of just a few bytes). */ -#define UZLIB_CONF_USE_MEMCPY 0 -#endif - -#endif /* UZLIB_CONF_H_INCLUDED */ diff --git a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/tag_types.h b/oepl-definitions.h old mode 100644 new mode 100755 similarity index 67% rename from ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/tag_types.h rename to oepl-definitions.h index 5c19575d..a86cc924 --- a/ARM_Tag_FW/88MZ100_OpenEpaperLink_7.4/tag_types.h +++ b/oepl-definitions.h @@ -1,11 +1,33 @@ #define SOLUM_154_SSD1619 0 #define SOLUM_29_SSD1619 0x01 -#define SOLUM_29_SSD1619_HIGH_RES 0x03 #define SOLUM_29_UC8151 0x11 #define SOLUM_42_SSD1619 0x02 #define SOLUM_SEG_UK 0xF0 #define SOLUM_SEG_EU 0xF1 #define SOLUM_NODISPLAY 0xFF +#define ESP32_C6 0xC6 + +#define SOLUM_M2_BWR_16 0x20 +#define SOLUM_M2_BWR_29 0x23 +#define SOLUM_M2_BWR_42 0x24 +#define SOLUM_M2_BWR_75 0x26 + +#define SOLUM_M3_BWR_16 0x30 +#define SOLUM_M3_BWY_16 0x38 +#define SOLUM_M3_BWR_22 0x31 +#define SOLUM_M3_BWY_22 0x39 +#define SOLUM_M3_BWR_26 0x32 +#define SOLUM_M3_BWY_26 0x3A +#define SOLUM_M3_BWR_29 0x33 +#define SOLUM_M3_BWY_29 0x3B +#define SOLUM_M3_BWR_42 0x34 +#define SOLUM_M3_BWY_42 0x3C +#define SOLUM_M3_BWR_60 0x35 +#define SOLUM_M3_BWY_60 0x3D +#define SOLUM_M3_BWR_75 0x36 +#define SOLUM_M3_BWY_75 0x3E +#define SOLUM_M3_BWR_116 0x37 +#define SOLUM_M3_BWY_116 0x3F #define CAPABILITY_SUPPORTS_COMPRESSION 0x02 #define CAPABILITY_SUPPORTS_CUSTOM_LUTS 0x04 @@ -33,10 +55,20 @@ #define CMD_DO_REBOOT 0 #define CMD_DO_SCAN 1 #define CMD_DO_RESET_SETTINGS 2 +#define CMD_DO_DEEPSLEEP 3 +#define CMD_DO_LEDFLASH 4 #define WAKEUP_REASON_TIMED 0 #define WAKEUP_REASON_GPIO 2 #define WAKEUP_REASON_NFC 3 +#define WAKEUP_REASON_BUTTON1 4 +#define WAKEUP_REASON_BUTTON2 5 #define WAKEUP_REASON_FIRSTBOOT 0xFC #define WAKEUP_REASON_NETWORK_SCAN 0xFD -#define WAKEUP_REASON_WDT_RESET 0xFE \ No newline at end of file +#define WAKEUP_REASON_WDT_RESET 0xFE + +#define EPD_LUT_DEFAULT 0 +#define EPD_LUT_NO_REPEATS 1 +#define EPD_LUT_FAST_NO_REDS 2 +#define EPD_LUT_FAST 3 +#define EPD_LUT_OTA 0x10 diff --git a/oepl-esp-ap-proto.h b/oepl-esp-ap-proto.h new file mode 100644 index 00000000..babb547a --- /dev/null +++ b/oepl-esp-ap-proto.h @@ -0,0 +1,28 @@ +#ifndef __packed +#define __packed __attribute__((packed)) +#endif + +struct espBlockRequest { + uint8_t checksum; + uint64_t ver; + uint8_t blockId; + uint8_t src[8]; +} __packed; + +struct espXferComplete { + uint8_t checksum; + uint8_t src[8]; +} __packed; + +struct espSetChannelPower { + uint8_t checksum; + uint8_t channel; + uint8_t power; +} __packed; + +struct espAvailDataReq { + uint8_t checksum; + uint8_t src[8]; + struct AvailDataReq adr; +} __packed; + diff --git a/oepl-proto.h b/oepl-proto.h new file mode 100644 index 00000000..fa93e374 --- /dev/null +++ b/oepl-proto.h @@ -0,0 +1,180 @@ + +#ifndef __packed +#define __packed __attribute__((packed)) +#endif + +#define PROTO_PAN_ID (0x4447) // PAN ID compression shall be used + +#define RADIO_MAX_PACKET_LEN (125) // useful payload, not including the crc + +#define ADDR_MODE_NONE (0) +#define ADDR_MODE_SHORT (2) +#define ADDR_MODE_LONG (3) + +#define FRAME_TYPE_BEACON (0) +#define FRAME_TYPE_DATA (1) +#define FRAME_TYPE_ACK (2) +#define FRAME_TYPE_MAC_CMD (3) + +#define SHORT_MAC_UNUSED (0x10000000UL) // for radioRxFilterCfg's myShortMac + +struct MacFcs { + uint8_t frameType : 3; + uint8_t secure : 1; + uint8_t framePending : 1; + uint8_t ackReqd : 1; + uint8_t panIdCompressed : 1; + uint8_t rfu1 : 1; + uint8_t rfu2 : 2; + uint8_t destAddrType : 2; + uint8_t frameVer : 2; + uint8_t srcAddrType : 2; +} __packed; + +struct MacFrameFromMaster { + struct MacFcs fcs; + uint8_t seq; + uint16_t pan; + uint8_t dst[8]; + uint16_t from; +} __packed; + +struct MacFrameNormal { + struct MacFcs fcs; + uint8_t seq; + uint16_t pan; + uint8_t dst[8]; + uint8_t src[8]; +} __packed; + +struct MacFrameBcast { + struct MacFcs fcs; + uint8_t seq; + uint16_t dstPan; + uint16_t dstAddr; + uint16_t srcPan; + uint8_t src[8]; +} __packed; + +#define PKT_AVAIL_DATA_SHORTREQ 0xE3 +#define PKT_AVAIL_DATA_REQ 0xE5 +#define PKT_AVAIL_DATA_INFO 0xE6 +#define PKT_BLOCK_PARTIAL_REQUEST 0xE7 +#define PKT_BLOCK_REQUEST_ACK 0xE9 +#define PKT_BLOCK_REQUEST 0xE4 +#define PKT_BLOCK_PART 0xE8 +#define PKT_XFER_COMPLETE 0xEA +#define PKT_XFER_COMPLETE_ACK 0xEB +#define PKT_CANCEL_XFER 0xEC +#define PKT_PING 0xED +#define PKT_PONG 0xEE + +struct AvailDataReq { + uint8_t checksum; + uint8_t lastPacketLQI; + int8_t lastPacketRSSI; + int8_t temperature; + uint16_t batteryMv; + uint8_t hwType; + uint8_t wakeupReason; + uint8_t capabilities; + uint16_t tagSoftwareVersion; + uint8_t currentChannel; + uint8_t customMode; + uint8_t reserved[8]; +} __packed; + +struct oldAvailDataReq { + uint8_t checksum; + uint8_t lastPacketLQI; + int8_t lastPacketRSSI; + int8_t temperature; + uint16_t batteryMv; + uint8_t hwType; + uint8_t wakeupReason; + uint8_t capabilities; +} __packed; + +struct AvailDataInfo { + uint8_t checksum; + uint64_t dataVer; // MD5 of potential traffic + uint32_t dataSize; + uint8_t dataType; + uint8_t dataTypeArgument; // extra specification or instruction for the tag (LUT to be used for drawing image) + uint16_t nextCheckIn; // when should the tag check-in again? Measured in minutes +} __packed; + +struct pendingData { + struct AvailDataInfo availdatainfo; + uint16_t attemptsLeft; + uint8_t targetMac[8]; +} __packed; + +struct blockPart { + uint8_t checksum; + uint8_t blockId; + uint8_t blockPart; + uint8_t data[]; +} __packed; + +struct blockData { + uint16_t size; + uint16_t checksum; + uint8_t data[]; +} __packed; + +struct burstMacData { + uint16_t offset; + uint8_t targetMac[8]; +} __packed; + +#define BLOCK_PART_DATA_SIZE 99 +#define BLOCK_MAX_PARTS 42 +#define BLOCK_DATA_SIZE 4096UL +#define BLOCK_XFER_BUFFER_SIZE BLOCK_DATA_SIZE + sizeof(struct blockData) +#define BLOCK_REQ_PARTS_BYTES 6 + +struct blockRequest { + uint8_t checksum; + uint64_t ver; + uint8_t blockId; + uint8_t type; + uint8_t requestedParts[BLOCK_REQ_PARTS_BYTES]; +} __packed; + +struct blockRequestAck { + uint8_t checksum; + uint16_t pleaseWaitMs; +} __packed; + +struct tagsettings { + uint8_t settingsVer; // the version of the struct as written to the infopage + uint8_t enableFastBoot; // default 0; if set, it will skip splashscreen + uint8_t enableRFWake; // default 0; if set, it will enable RF wake. This will add about ~0.9µA idle power consumption + uint8_t enableTagRoaming; // default 0; if set, the tag will scan for an accesspoint every few check-ins. This will increase power consumption quite a bit + uint8_t enableScanForAPAfterTimeout; // default 1; if a the tag failed to check in, after a few attempts it will try to find a an AP on other channels + uint8_t enableLowBatSymbol; // default 1; tag will show 'low battery' icon on screen if the battery is depleted + uint8_t enableNoRFSymbol; // default 1; tag will show 'no signal' icon on screen if it failed to check in for a longer period of time + uint8_t fastBootCapabilities; // holds the byte with 'capabilities' as detected during a normal tag boot; allows the tag to skip detecting buttons and NFC chip + uint8_t customMode; // default 0; if anything else, tag will bootup in a different 'mode' + uint16_t batLowVoltage; // Low battery threshold voltage (2450 for 2.45v). defaults to BATTERY_VOLTAGE_MINIMUM from powermgt.h + uint16_t minimumCheckInTime; // defaults to BASE_INTERVAL from powermgt.h + uint8_t fixedChannel; // default 0; if set to a valid channel number, the tag will stick to that channel +} __packed; + +struct ledFlash { + uint8_t mode : 4; + uint8_t flashDuration : 4; + uint8_t color1; + uint8_t flashCount1 : 4; + uint8_t delay1 : 4; + uint8_t color2; + uint8_t flashCount2 : 4; + uint8_t delay2 : 4; + uint8_t color3; + uint8_t flashCount3 : 4; + uint8_t delay3 : 4; + uint8_t repeats; + uint8_t spare; +} __packed; +