diff --git a/binaries/Tag_FW_1.54.bin b/binaries/Tag_FW_1.54.bin index 97603658..7a43a504 100644 Binary files a/binaries/Tag_FW_1.54.bin and b/binaries/Tag_FW_1.54.bin differ diff --git a/binaries/Tag_FW_2.9-uc8151.bin b/binaries/Tag_FW_2.9-uc8151.bin index 081fe4fa..5912d861 100644 Binary files a/binaries/Tag_FW_2.9-uc8151.bin and b/binaries/Tag_FW_2.9-uc8151.bin differ diff --git a/binaries/Tag_FW_2.9.bin b/binaries/Tag_FW_2.9.bin index b8331b58..f64f1a36 100644 Binary files a/binaries/Tag_FW_2.9.bin and b/binaries/Tag_FW_2.9.bin differ diff --git a/binaries/Tag_FW_4.2.bin b/binaries/Tag_FW_4.2.bin index 508b0085..b3bac449 100644 Binary files a/binaries/Tag_FW_4.2.bin and b/binaries/Tag_FW_4.2.bin differ diff --git a/binaries/zigbeebase000F.bin b/binaries/zigbeebase000E.bin similarity index 100% rename from binaries/zigbeebase000F.bin rename to binaries/zigbeebase000E.bin diff --git a/zbs243_AP_FW/ap_fw.bin b/zbs243_AP_FW/ap_fw.bin deleted file mode 100644 index 54037282..00000000 Binary files a/zbs243_AP_FW/ap_fw.bin and /dev/null differ diff --git a/zbs243_Tag_FW/asmUtil.h b/zbs243_Tag_FW/asmUtil.h deleted file mode 100644 index 423c20b6..00000000 --- a/zbs243_Tag_FW/asmUtil.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef _ASM_UTIL_H_ -#define _ASM_UTIL_H_ - - -#include -#include "cpu.h" - - - -//SDCC may have uint64_t support, but it is so shitty, we're better off not using it -//sdcc is brain dead when compiling multiplication, so we write our own asm code to make it better...le sigh... -//SDCC also has issues managing xdata memory ops, we write our own - -#pragma callee_saves u64_copy -#pragma callee_saves u64_isLt -#pragma callee_saves u64_isEq -#pragma callee_saves u64_sub -#pragma callee_saves u64_add -#pragma callee_saves u64_inc -#pragma callee_saves u64_dec - -#pragma callee_saves xMemSet -#pragma callee_saves xMemEqual -#pragma callee_saves xMemEqual4 -#pragma callee_saves xMemCopy -#pragma callee_saves xMemCopyShort -#pragma callee_saves xMemCopy8 -#pragma callee_saves xStrLen - -#pragma callee_saves rngGen - -#pragma callee_saves mathPrvMul8x8 -#pragma callee_saves mathPrvMul16x8 -#pragma callee_saves mathPrvMul16x16 -#pragma callee_saves mathPrvMul32x8 -#pragma callee_saves mathPrvDiv32x8 -#pragma callee_saves mathPrvDiv32x16 -#pragma callee_saves mathPrvMod32x16 -#pragma callee_saves mathPrvDiv16x8 -#pragma callee_saves mathPrvMod16x8 -#pragma callee_saves mathPrvCopyPostinc - -#pragma callee_saves mathPrvI16Asr1 - -#pragma callee_saves mathPrvU8bitswap - -#pragma callee_saves charsPrvDerefAndIncGenericPtr //return *(*generic_charPtr)++ - - -//it saddens me that i need these....but i do -#pragma callee_saves mathPrvU16from2xU8 -#pragma callee_saves mathPrvU32from4xU8 -#pragma callee_saves u32minusU16 -#pragma callee_saves u32plusU16 -#pragma callee_saves u32Nonzero -#pragma callee_saves i32Negative - - -__bit u32minusU16(uint32_t __xdata *u32, uint16_t u16) __reentrant; //sets carry -__bit u32plusU16(uint32_t __xdata *u32, uint16_t u16) __reentrant; //sets carry -uint8_t u32Nonzero(uint32_t __xdata *u32) __reentrant; -__bit i32Negative(uint32_t __xdata *u32) __reentrant; - - -void u64_copy(uint64_t __xdata *dst, const uint64_t __xdata *src) __reentrant; -void u64_copyFromCode(uint64_t __xdata *dst, const uint64_t __code *src) __reentrant; -__bit u64_isLt(const uint64_t __xdata *lhs, const uint64_t __xdata *rhs) __reentrant; -__bit u64_isEq(const uint64_t __xdata *lhs, const uint64_t __xdata *rhs) __reentrant; -void u64_sub(uint64_t __xdata *lhs, const uint64_t __xdata *rhs) __reentrant; -void u64_add(uint64_t __xdata *lhs, const uint64_t __xdata *rhs) __reentrant; -void u64_and(uint64_t __xdata *lhs, const uint64_t __xdata *rhs) __reentrant; -void u64_inc(uint64_t __xdata *dst) __reentrant; -void u64_dec(uint64_t __xdata *dst) __reentrant; - -#define U64FMT "%04x%04x%04x%04x" -#define U64CVT(v) ((uint16_t __xdata*)&v)[3], ((uint16_t __xdata*)&v)[2], ((uint16_t __xdata*)&v)[1], ((uint16_t __xdata*)&v)[0] - -int16_t mathPrvI16Asr1(int16_t val) __reentrant; - -uint16_t mathPrvMul8x8(uint8_t a, uint8_t b) __reentrant; -uint32_t mathPrvMul16x8(uint16_t a, uint8_t b) __reentrant; -uint32_t mathPrvMul16x16(uint16_t a, uint16_t b) __reentrant; -uint32_t mathPrvMul32x8(uint32_t a, uint8_t b) __reentrant; -uint32_t mathPrvDiv32x8(uint32_t num, uint8_t denom) __reentrant; -uint32_t mathPrvDiv32x16(uint32_t num, uint16_t denom) __reentrant; -uint16_t mathPrvMod32x16(uint32_t num, uint16_t denom) __reentrant; -uint16_t mathPrvDiv16x8(uint16_t num, uint8_t denom) __reentrant; -uint8_t mathPrvMod16x8(uint16_t num, uint8_t denom) __reentrant; - -uint8_t mathPrvU8bitswap(uint8_t val) __reentrant; - -uint16_t mathPrvU16from2xU8(uint8_t hi, uint8_t lo) __reentrant; -uint32_t mathPrvU32from4xU8(uint8_t hi, uint8_t midhi, uint8_t midlo, uint8_t lo) __reentrant; - -char charsPrvDerefAndIncGenericPtr(const char * __xdata* __xdata str); - -void xMemSet(void __xdata* mem, uint8_t val, uint16_t num) __reentrant; -__bit xMemEqual(const void __xdata* memA, const void __xdata* memB, uint8_t num) __reentrant; -__bit xMemEqual4(const void __xdata* memA, const void __xdata* memB) __reentrant; -void xMemCopy(void __xdata* dst, const void __xdata* src, uint16_t num) __reentrant; -void xMemCopyShort(void __xdata* dst, const void __xdata* src, uint8_t num) __reentrant; -uint16_t xStrLen(const char __xdata *str) __reentrant; - -#define xMemCopy8(_dst, _src) u64_copy((uint64_t __xdata*)(_dst), (const uint64_t __xdata*)(_src)) - - -void mathPrvCopyPostinc(uint32_t __xdata *dst, uint32_t __xdata *src) __reentrant; //*dst = (*src)++ - -//private -void mathPrvSwapDptrR1R0(void) __reentrant; - - - -#endif diff --git a/zbs243_Tag_FW/asmUtil.h b/zbs243_Tag_FW/asmUtil.h new file mode 120000 index 00000000..d26a7877 --- /dev/null +++ b/zbs243_Tag_FW/asmUtil.h @@ -0,0 +1 @@ +../zbs243_shared/asmUtil.h \ No newline at end of file diff --git a/zbs243_Tag_FW/barcode.c b/zbs243_Tag_FW/barcode.c deleted file mode 100644 index c431d148..00000000 --- a/zbs243_Tag_FW/barcode.c +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include "barcode.h" -#include "asmUtil.h" - -//code128 generator (c) 2021 Dmitry Grinberg https://dmitry.gr -//non-commercial use only, contact licensing@dmitry.gr for other options - -#pragma nogcse - -static const uint16_t __code mCode128[] = { - 0b00110011011, 0b00110110011, 0b01100110011, 0b00011001001, 0b00110001001, 0b00110010001, 0b00010011001, 0b00100011001, - 0b00100110001, 0b00010010011, 0b00100010011, 0b00100100011, 0b00111001101, 0b00111011001, 0b01110011001, 0b00110011101, - 0b00110111001, 0b01100111001, 0b01001110011, 0b00111010011, 0b01110010011, 0b00100111011, 0b00101110011, 0b01110110111, - 0b00110010111, 0b00110100111, 0b01100100111, 0b00100110111, 0b00101100111, 0b01001100111, 0b00011011011, 0b01100011011, - 0b01101100011, 0b00011000101, 0b00011010001, 0b01100010001, 0b00010001101, 0b00010110001, 0b01000110001, 0b00010001011, - 0b00010100011, 0b01000100011, 0b00011101101, 0b01110001101, 0b01110110001, 0b00011011101, 0b01100011101, 0b01101110001, - 0b01101110111, 0b01110001011, 0b01110100011, 0b00010111011, 0b01000111011, 0b01110111011, 0b00011010111, 0b01100010111, - 0b01101000111, 0b00010110111, 0b01000110111, 0b01011000111, 0b01011110111, 0b01000010011, 0b01010001111, 0b00001100101, - 0b00110000101, 0b00001101001, 0b01100001001, 0b00110100001, 0b01100100001, 0b00001001101, 0b00100001101, 0b00001011001, - 0b01000011001, 0b00101100001, 0b01001100001, 0b01001000011, 0b00001010011, 0b01011101111, 0b00101000011, 0b01011110001, - 0b00111100101, 0b00111101001, 0b01111001001, 0b00100111101, 0b00101111001, 0b01001111001, 0b00100101111, 0b00101001111, - 0b01001001111, 0b01111011011, 0b01101111011, 0b01101101111, 0b00011110101, 0b01111000101, 0b01111010001, 0b00010111101, - 0b01000111101, 0b00010101111, 0b01000101111, 0b01111011101, 0b01110111101, 0b01111010111, 0b01110101111 -}; - - -#define CODE128_START_B (0b00001001011) -#define CODE128_STOP (0b1101011100011) - -#define CODE128_IDX_START_A (103) -#define CODE128_IDX_START_B (104) -#define CODE128_IDX_START_C (105) -#define CODE128_IDX_CODE_STOP (106) - - -enum BarCodeState { - BarCodeInit, - BarCodeEmittingChar, - BarCodeEmittingChecksum, - BarCodeEmittingStop, - BarCodeDone, -}; - - - - -__bit barcodeIsDone(struct BarcodeInfo __xdata *bci) -{ - return bci->state == BarCodeDone; -} - -__bit barcodeNextBar(struct BarcodeInfo __xdata *bci) -{ - uint8_t t; - __bit ret; - - if (!bci->barsLeft) switch (bci->state) { - case BarCodeInit: - bci->curBars = CODE128_START_B; - bci->barsLeft = 11; - bci->state = BarCodeEmittingChar; - bci->csum = CODE128_IDX_START_B; - break; - - case BarCodeEmittingChar: - t = charsPrvDerefAndIncGenericPtr(&bci->str); - if (t) { - t -= 0x20; - if (t >= 0x60) - t = '?' - 0x20; - bci->csum = mathPrvMod16x8(mathPrvMul8x8(++bci->csumMul, t) + bci->csum, 103); - } - else { - - bci->state = BarCodeEmittingChecksum; - t = bci->csum; - } - bci->curBars = mCode128[t]; - bci->barsLeft = 11; - break; - - case BarCodeEmittingChecksum: - bci->state = BarCodeEmittingStop; - bci->curBars = CODE128_STOP; - bci->barsLeft = 13; - break; - - case BarCodeEmittingStop: - bci->state = BarCodeDone; - //fallthrough - - case BarCodeDone: - default: - return false; - } - - ret = bci->curBars & 1; - bci->curBars >>= 1; - bci->barsLeft--; - return ret; -} diff --git a/zbs243_Tag_FW/barcode.c b/zbs243_Tag_FW/barcode.c new file mode 120000 index 00000000..c94aa5e4 --- /dev/null +++ b/zbs243_Tag_FW/barcode.c @@ -0,0 +1 @@ +../zbs243_shared/barcode.c \ No newline at end of file diff --git a/zbs243_Tag_FW/barcode.h b/zbs243_Tag_FW/barcode.h deleted file mode 100644 index f6d784b9..00000000 --- a/zbs243_Tag_FW/barcode.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _BARCODE_H_ -#define _BARCODE_H_ - -#include - -//code128 generator (c) 2021 Dmitry Grinberg https://dmitry.gr -//non-commercial use only, contact licensing@dmitry.gr for other options - - -struct BarcodeInfo { //zero-init this except the string ptr - const char *str; - uint16_t curBars; - uint8_t barsLeft; - uint8_t state; - uint8_t csum; - uint8_t csumMul; -}; - -#define barcodeWidth(nChars) (11 * (nChars) + 11 /*start */+ 11 /*check sum */ + 13 /* stop */) - -#pragma callee_saves barcodeIsDone -__bit barcodeIsDone(struct BarcodeInfo __xdata *bci); - -#pragma callee_saves barcodeNextBar -__bit barcodeNextBar(struct BarcodeInfo __xdata *bci); - - - -#endif diff --git a/zbs243_Tag_FW/barcode.h b/zbs243_Tag_FW/barcode.h new file mode 120000 index 00000000..d98efd2b --- /dev/null +++ b/zbs243_Tag_FW/barcode.h @@ -0,0 +1 @@ +../zbs243_shared/barcode.h \ No newline at end of file diff --git a/zbs243_Tag_FW/bitmaps.h b/zbs243_Tag_FW/bitmaps.h deleted file mode 100644 index 049ecd9f..00000000 --- a/zbs243_Tag_FW/bitmaps.h +++ /dev/null @@ -1,298 +0,0 @@ -#ifndef _BITMAPS_H_ -#define _BITMAPS_H_ - -// images generated by https://lvgl.io/tools/imageconverter, prepended with width, height. "CF_INDEXED_1_BIT"-mode, little-endian -#include - -#include "screen.h" - -static const uint8_t __code oepli[] = { - 128, 26, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0xc0, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0xc0, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0xc0, - 0xf7, 0x80, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0xc0, - 0xe3, 0x80, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0xc0, - 0xe3, 0x9d, 0xc1, 0xc7, 0x70, 0x1f, 0x9c, 0xe7, 0x73, 0xb8, 0x71, 0xd0, 0x38, 0x73, 0xb9, 0xc7, - 0xe3, 0x9f, 0xe3, 0xe7, 0xf8, 0x1f, 0x9f, 0xef, 0xf3, 0xfc, 0xf9, 0xf0, 0x38, 0x73, 0xfd, 0xce, - 0xe3, 0x9f, 0xe7, 0x77, 0xf8, 0x1f, 0x9f, 0xcf, 0xf3, 0xfd, 0xdd, 0xf0, 0x38, 0x73, 0xfd, 0xdc, - 0xe3, 0x9c, 0xe7, 0xf7, 0x38, 0x1c, 0x1f, 0x8e, 0x73, 0x9d, 0xfd, 0xc0, 0x38, 0x73, 0x9d, 0xf8, - 0xe3, 0x9c, 0xe7, 0xf7, 0x38, 0x1c, 0x1c, 0x0e, 0x73, 0x9d, 0xfd, 0xc0, 0x38, 0x73, 0x9d, 0xf8, - 0xf7, 0x9c, 0xe7, 0x07, 0x38, 0x1c, 0x1c, 0x0e, 0x73, 0x9d, 0xc1, 0xc0, 0x38, 0x73, 0x9d, 0xdc, - 0x7f, 0x1f, 0xe7, 0xf7, 0x38, 0x1f, 0x9c, 0x0f, 0xf3, 0xfd, 0xfd, 0xc0, 0x3f, 0x73, 0x9d, 0xdc, - 0x7f, 0x1f, 0xe3, 0xe7, 0x38, 0x1f, 0x9c, 0x0f, 0xf3, 0xfc, 0xf9, 0xc0, 0x3f, 0x73, 0x9d, 0xce, - 0x1e, 0x1d, 0xc1, 0xc7, 0x38, 0x1f, 0x9c, 0x07, 0x73, 0xb8, 0x71, 0xc0, 0x3f, 0x73, 0x9d, 0xc7, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; - -static const uint8_t __code cloud[] = { - 128, 50, - 0x00, 0x08, 0x82, 0xa2, 0xab, 0x55, 0xbf, 0xff, 0xff, 0xff, 0x7d, 0xb4, 0x62, 0x28, 0x00, 0x00, - 0x00, 0x10, 0x10, 0x11, 0x76, 0xff, 0x7b, 0xff, 0xff, 0x7f, 0xb7, 0xa9, 0x55, 0x50, 0x51, 0x00, - 0x00, 0x29, 0x22, 0x96, 0x6f, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xea, 0xe6, 0x22, 0xaa, 0x08, 0x00, - 0x00, 0x02, 0x54, 0x2a, 0xbf, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x59, 0xb4, 0x10, 0x20, 0x00, - 0x00, 0x24, 0x23, 0xb5, 0xb5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xae, 0x48, 0x55, 0x10, 0x00, - 0x00, 0x88, 0x90, 0x54, 0x6a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf5, 0xa3, 0x82, 0x00, 0x00, - 0x00, 0x01, 0x2d, 0xa3, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xbe, 0x4e, 0x52, 0x09, 0x00, - 0x04, 0x90, 0x02, 0x0d, 0x55, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0x68, 0xa9, 0x00, 0x10, - 0x00, 0x49, 0x0c, 0xfb, 0xab, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xeb, 0x95, 0x5a, 0x00, 0x20, - 0x00, 0x12, 0x91, 0x22, 0xbf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x65, 0x81, 0x40, 0x40, - 0x00, 0x28, 0x12, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xab, 0x28, 0x00, 0x00, - 0x00, 0x42, 0x0a, 0x97, 0x75, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x4a, 0xc2, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x02, 0x9c, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6a, 0x6a, 0x8d, 0x00, 0x20, - 0x00, 0x04, 0x4d, 0x72, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xd5, 0x74, 0x80, 0x00, - 0x02, 0x40, 0x12, 0x8e, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xaa, 0x0a, 0x11, 0x20, - 0x00, 0x20, 0x52, 0x5f, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, 0x94, 0xaa, 0x24, 0x00, - 0x00, 0x01, 0x0a, 0xab, 0x6f, 0x77, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0x54, 0x54, 0x88, 0x00, - 0x00, 0x04, 0x80, 0x4d, 0x95, 0xeb, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x58, 0xb5, 0x51, 0x40, 0x00, - 0x00, 0x08, 0x08, 0xa6, 0xb3, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xad, 0x4a, 0xa0, 0x10, 0x00, - 0x00, 0x02, 0x96, 0x41, 0xdc, 0xae, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xea, 0x48, 0x02, 0x00, - 0x00, 0x00, 0x09, 0x3e, 0xab, 0x75, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xb1, 0x21, 0x08, 0x00, - 0x00, 0x00, 0x0a, 0xc3, 0x5d, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xef, 0xef, 0x44, 0x4a, 0x64, 0x80, - 0x00, 0x00, 0xa1, 0x52, 0xa6, 0xef, 0xef, 0xff, 0xff, 0xff, 0xd6, 0xca, 0xf5, 0x10, 0x18, 0x00, - 0x00, 0x00, 0x02, 0x15, 0x4b, 0xd5, 0xdf, 0xff, 0xff, 0xf7, 0xeb, 0xd4, 0xd8, 0x85, 0x00, 0x00, -}; - -static const uint8_t __code receive[] = { - 56, 56, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 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, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, - 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, - 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xe0, - 0x00, 0x00, 0x7f, 0x80, 0x00, 0x7f, 0xf0, - 0x00, 0x00, 0xfe, 0x00, 0x03, 0xff, 0xf0, - 0x00, 0x01, 0xfc, 0x00, 0x0f, 0xff, 0xf0, - 0x00, 0x01, 0xf8, 0x00, 0x3f, 0xff, 0xf0, - 0x00, 0x03, 0xf8, 0x00, 0xff, 0xff, 0x80, - 0x00, 0x07, 0xf0, 0x01, 0xff, 0xe0, 0x00, - 0x00, 0x0f, 0xe0, 0x03, 0xff, 0x00, 0x00, - 0x00, 0x0f, 0xc0, 0x0f, 0xf8, 0x00, 0x00, - 0x00, 0x1f, 0x80, 0x1f, 0xf0, 0x00, 0x00, - 0x00, 0x1f, 0x80, 0x3f, 0xc0, 0x00, 0x00, - 0x00, 0x3f, 0x00, 0x3f, 0x80, 0x00, 0x00, - 0x00, 0x3f, 0x00, 0x7f, 0x00, 0x00, 0x00, - 0x00, 0x7e, 0x00, 0xfe, 0x00, 0x07, 0xe0, - 0x00, 0x7e, 0x01, 0xfc, 0x00, 0x1f, 0xf0, - 0x00, 0xfc, 0x01, 0xf8, 0x00, 0x7f, 0xf0, - 0x00, 0xfc, 0x03, 0xf0, 0x01, 0xff, 0xf0, - 0x00, 0xf8, 0x03, 0xf0, 0x03, 0xff, 0xf0, - 0x01, 0xf8, 0x07, 0xe0, 0x07, 0xff, 0x00, - 0x01, 0xf8, 0x07, 0xe0, 0x0f, 0xf0, 0x00, - 0x01, 0xf0, 0x0f, 0xc0, 0x1f, 0xe0, 0x00, - 0x01, 0xf0, 0x0f, 0xc0, 0x3f, 0x80, 0x00, - 0x03, 0xf0, 0x0f, 0x80, 0x3f, 0x00, 0x00, - 0x03, 0xf0, 0x1f, 0x80, 0x7e, 0x00, 0x00, - 0x03, 0xe0, 0x1f, 0x80, 0x7e, 0x00, 0x00, - 0x03, 0xe0, 0x1f, 0x00, 0xfc, 0x01, 0xe0, - 0x03, 0xe0, 0x1f, 0x00, 0xfc, 0x07, 0xf8, - 0x03, 0xe0, 0x1f, 0x00, 0xf8, 0x0f, 0xfc, - 0x03, 0xe0, 0x3f, 0x00, 0xf8, 0x0f, 0xfc, - 0x03, 0xe0, 0x3f, 0x01, 0xf8, 0x1f, 0xfe, - 0x03, 0xe0, 0x3f, 0x01, 0xf8, 0x1f, 0xfe, - 0x03, 0xe0, 0x3f, 0x01, 0xf8, 0x1f, 0xfe, - 0x03, 0xc0, 0x3e, 0x01, 0xf0, 0x1f, 0xfe, - 0x01, 0xc0, 0x1e, 0x00, 0xf0, 0x0f, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - - -static const uint8_t __code failed[] = { - 48, 48, - 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, - 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, - 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x00, - 0x00, 0x7f, 0xf0, 0x0f, 0xfe, 0x00, - 0x00, 0xff, 0x80, 0x01, 0xff, 0x00, - 0x01, 0xfe, 0x00, 0x00, 0x7f, 0x80, - 0x03, 0xf8, 0x00, 0x00, 0x1f, 0xc0, - 0x07, 0xf0, 0x00, 0x00, 0x3f, 0xe0, - 0x0f, 0xe0, 0x00, 0x00, 0x7f, 0xf0, - 0x0f, 0xc0, 0x00, 0x00, 0xff, 0xf0, - 0x1f, 0x80, 0x00, 0x01, 0xff, 0xf8, - 0x1f, 0x00, 0x00, 0x03, 0xff, 0xf8, - 0x3f, 0x00, 0x00, 0x07, 0xfe, 0xfc, - 0x3e, 0x00, 0x00, 0x0f, 0xfc, 0x7c, - 0x7e, 0x00, 0x00, 0x1f, 0xf8, 0x7e, - 0x7c, 0x00, 0x00, 0x3f, 0xf0, 0x3e, - 0x7c, 0x00, 0x00, 0x7f, 0xe0, 0x3e, - 0xfc, 0x00, 0x00, 0xff, 0xc0, 0x3f, - 0xf8, 0x00, 0x01, 0xff, 0x80, 0x1f, - 0xf8, 0x00, 0x03, 0xff, 0x00, 0x1f, - 0xf8, 0x00, 0x07, 0xfe, 0x00, 0x1f, - 0xf8, 0x00, 0x0f, 0xfc, 0x00, 0x1f, - 0xf8, 0x00, 0x1f, 0xf8, 0x00, 0x1f, - 0xf8, 0x00, 0x3f, 0xf0, 0x00, 0x1f, - 0xf8, 0x00, 0x7f, 0xe0, 0x00, 0x1f, - 0xf8, 0x00, 0xff, 0xc0, 0x00, 0x1f, - 0xfc, 0x01, 0xff, 0x80, 0x00, 0x3f, - 0x7c, 0x03, 0xff, 0x00, 0x00, 0x3e, - 0x7c, 0x07, 0xfe, 0x00, 0x00, 0x3e, - 0x7e, 0x0f, 0xfc, 0x00, 0x00, 0x7e, - 0x3e, 0x1f, 0xf8, 0x00, 0x00, 0x7c, - 0x3f, 0x3f, 0xf0, 0x00, 0x00, 0xfc, - 0x3f, 0x7f, 0xe0, 0x00, 0x00, 0xfc, - 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xf8, - 0x0f, 0xff, 0x80, 0x00, 0x03, 0xf0, - 0x0f, 0xff, 0x00, 0x00, 0x07, 0xf0, - 0x07, 0xfe, 0x00, 0x00, 0x0f, 0xe0, - 0x03, 0xfc, 0x00, 0x00, 0x1f, 0xc0, - 0x01, 0xfe, 0x00, 0x00, 0x7f, 0x80, - 0x00, 0xff, 0x80, 0x01, 0xff, 0x00, - 0x00, 0x7f, 0xf0, 0x0f, 0xfe, 0x00, - 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x00, - 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, - 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, -}; - -#if (SCREEN_WIDTH != 128) -static const uint8_t __code ant[] = { - 16, 16, - 0x00, 0x40, - 0x02, 0x20, - 0x01, 0x20, - 0x11, 0x20, - 0x11, 0x20, - 0x12, 0x20, - 0x28, 0x40, - 0x28, 0x00, - 0x28, 0x00, - 0x44, 0x00, - 0x44, 0x00, - 0x44, 0x00, - 0x44, 0x00, - 0x82, 0x00, - 0x82, 0x00, - 0xfe, 0x00, -}; -#else -static const uint8_t __code ant[] = { - // rotated 90 degrees - 16,16, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x7c, 0x00, - 0x82, 0x00, - 0x00, 0x00, - 0x38, 0x00, - 0x44, 0x07, - 0x00, 0x79, - 0x03, 0x81, - 0x1c, 0x01, - 0x03, 0x81, - 0x00, 0x79, - 0x00, 0x07, -}; -#endif -static const uint8_t __code cross[] = { - 8,8, - 0x00, - 0x63, - 0x77, - 0x3e, - 0x1c, - 0x3e, - 0x77, - 0x63 -}; - -#if (SCREEN_WIDTH != 128) -static const uint8_t __code battery[] = { - 16,10, - 0x00, 0x00, - 0x7f, 0xfc, - 0x40, 0x04, - 0x58, 0x06, - 0x58, 0x06, - 0x58, 0x06, - 0x58, 0x06, - 0x40, 0x04, - 0x7f, 0xfc, - 0x00, 0x00, -}; -#else -// this battery symbol is rotated 90' -static const uint8_t __code battery[] = { -16,16, - 0x00, 0x00, - 0x03, 0xc0, - 0x0f, 0xf0, - 0x08, 0x10, - 0x08, 0x10, - 0x08, 0x10, - 0x08, 0x10, - 0x08, 0x10, - 0x08, 0x10, - 0x08, 0x10, - 0x08, 0x10, - 0x0b, 0xd0, - 0x0b, 0xd0, - 0x08, 0x10, - 0x0f, 0xf0, - 0x00, 0x00, -}; - -#endif - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/bitmaps.h b/zbs243_Tag_FW/bitmaps.h new file mode 120000 index 00000000..1d4d18fd --- /dev/null +++ b/zbs243_Tag_FW/bitmaps.h @@ -0,0 +1 @@ +../zbs243_shared/bitmaps.h \ No newline at end of file diff --git a/zbs243_Tag_FW/board b/zbs243_Tag_FW/board new file mode 120000 index 00000000..af42b18b --- /dev/null +++ b/zbs243_Tag_FW/board @@ -0,0 +1 @@ +../zbs243_shared/board \ No newline at end of file diff --git a/zbs243_Tag_FW/board/boardCommon.h b/zbs243_Tag_FW/board/boardCommon.h deleted file mode 100644 index cef1474d..00000000 --- a/zbs243_Tag_FW/board/boardCommon.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _BOARD_COMMON_H_ -#define _BOARD_COMMON_H_ - -#include - -#pragma callee_saves powerPortsDownForSleep -void powerPortsDownForSleep(void); - -#pragma callee_saves boardInit -void boardInit(void); - -//late, after eeprom -#pragma callee_saves boardInit -__bit boardGetOwnMac(uint8_t __xdata *mac); - - -#ifndef AP_FW -//some sanity checks -#include "eeprom.h" - - -#if !EEPROM_SETTINGS_AREA_START - #error "settings cannot be at address 0" -#endif - -#if (EEPROM_SETTINGS_AREA_LEN % EEPROM_ERZ_SECTOR_SZ) != 0 - #error "settings area must be an integer number of eeprom blocks" -#endif - -#if (EEPROM_SETTINGS_AREA_START % EEPROM_ERZ_SECTOR_SZ) != 0 - #error "settings must begin at an integer number of eeprom blocks" -#endif - -#if (EEPROM_IMG_EACH % EEPROM_ERZ_SECTOR_SZ) != 0 - #error "each image must be an integer number of eeprom blocks" -#endif - -#if (EEPROM_IMG_START % EEPROM_ERZ_SECTOR_SZ) != 0 - #error "images must begin at an integer number of eeprom blocks" -#endif - -#if (EEPROM_UPDATE_AREA_LEN % EEPROM_ERZ_SECTOR_SZ) != 0 - #error "update must be an integer number of eeprom blocks" -#endif - -#if (EEPROM_UPDATA_AREA_START % EEPROM_ERZ_SECTOR_SZ) != 0 - #error "images must begin at an integer number of eeprom blocks" -#endif - -#endif - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/board/boardZBS29common.c b/zbs243_Tag_FW/board/boardZBS29common.c deleted file mode 100644 index 80667c6c..00000000 --- a/zbs243_Tag_FW/board/boardZBS29common.c +++ /dev/null @@ -1,160 +0,0 @@ -#include -#include "printf.h" -#include "screen.h" -#include "board.h" -#include "flash.h" -#include "uart.h" -#include "spi.h" -#include "cpu.h" -#include "wdt.h" -#include "i2c.h" - -//extern uint8_t __xdata* tempBuffer; -uint8_t __xdata tempBuffer[320]; - -void powerPortsDownForSleep(void) -{ - P0FUNC = 0; - P1FUNC = 0; - P2FUNC = 0; - P0DIR = 0; - P0 = 0; - P0PULL = 0; - P1DIR = 0; - P1 = 2; - P1PULL = 0; - P2DIR = 2; - P2 =1; - P2PULL = 0; -} - -void boardInit(void) -{ - //set up pins for spi(0.0,0.1,0.2), UART (0.6) - P0FUNC |= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 6); - P0DIR = (P0DIR &~ ((1 << 0) | (1 << 1) | (1 << 6))) | (1 << 2); - - //pulls for spi in - P0PULL = (P0PULL &~ ((1 << 0) | (1 << 1) | (1 << 6))) | (1 << 2); - - //setup 1.1(eeprom_nCS), 1.2(eink_BS1), 1.7(eink_nCS) - P1FUNC &=~ ((1 << 1) | (1 << 2) | (1 << 7)); - P1DIR &= ~((1 << 1) | (1 << 2) | (1 << 7)); - - //setup 2.0(eink_nRST), 2.1(eink_BUSY), 2.2(eink_D/nC) - P2FUNC &= ~((1 << 0) | (1 << 1) | (1 << 2)); - P2DIR = (P2DIR &~ ((1 << 0) | (1 << 2))) | (1 << 1); - - //raise chip select(s) - P1_1 = 1; - P1_7 = 1; - - //BS1 = low - P1_2 = 0; - - spiInit(); -} - - -__bit boardGetOwnMac(uint8_t __xdata *mac) -{ - return flashRead(FLASH_INFOPAGE_ADDR + 0x10, mac, 8); -} - -#pragma callee_saves prvUpdateApplierGet -static uint32_t prvUpdateApplierGet(void) __naked -{ - __asm__( - " mov DPTR, #00098$ \n" - " mov A, #00099$ \n" - " clr C \n" - " subb A, DPL \n" - " mov B, A \n" - " ret \n" - - ///actual updater code - "00098$: \n" - - - //copied to last page of flash for updating, called with ints off and eeprom ready to read update - //flashes 63 flash pages, uses xram for buffer. uses combined erase+flash flash op - - " mov _CLKSPEED, #0x21 \n" - " mov _CFGPAGE, #0x04 \n" - " mov R0, #0 \n" - - "00001$: \n" - - //read a page of update - " mov DPTR, #0xe000 \n" - " mov R1, #0x04 \n" - " mov R2, #0x00 \n" - "000010$: \n" - " mov _SPITX, #0x00 \n" - " mov _SPICFG, #0xa0 \n" - "000011$: \n" - " mov A, _SPICFG \n" - " jb A.5, 000011$ \n" - " mov A, _SPIRX \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz R2, 000010$ \n" - " djnz R1, 000010$ \n" - - //flash it - " clr A \n" - " orl _SETTINGS, #0x38 \n" - " mov _FWRTHREE, #0x03 \n" - " mov _FPGNO, R0 \n" - " mov _FWRDSTL, A \n" - " mov _FWRDSTH, A \n" - " mov _FWRLENL, #0xff \n" - " mov _FWRLENH, #0x03 \n" - " mov _FWRSRCL, A \n" - " mov _FWRSRCH, #0xe0 \n" - " orl _TRIGGER, #0x08 \n" - "00050$: \n" - " mov A, _TCON2 \n" - " jnb A.3, 00050$ \n" - " anl _TCON2, #~0x48 \n" - " anl _SETTINGS, #~0x10 \n" - - //go do next page - " inc R0 \n" - " cjne R0, #63, 00001$ \n" - - //done? reset - " mov _WDTCONF, #0x80 \n" - " mov _WDTENA, #0x01 \n" - " mov A, #0xff \n" - " mov _WDTRSTVALH, A \n" - " mov _WDTRSTVALM, A \n" - " mov _WDTRSTVALL, A \n" - "00090$: \n" - " sjmp 00090$ \n" - - "00099$: \n" - ); -} - -void selfUpdate(void) -{ - uint32_t updaterInfo = prvUpdateApplierGet(); - uint8_t __code *src = (uint8_t __code*)updaterInfo; - uint8_t i, len = updaterInfo >> 16; - uint8_t __xdata *dst = tempBuffer; - - for (i = len; i ; i--) - *dst++ = *src++; - - if (!flashWrite(0xfc00, tempBuffer, len, true)) - pr("failed to write updater\n"); - - IEN_EA = 0; //ints off - - __asm__( - " mov dptr, #0xfc00 \n" - " clr a \n" - " jmp @a+dptr \n" - ); -} \ No newline at end of file diff --git a/zbs243_Tag_FW/board/ssd1619.c b/zbs243_Tag_FW/board/ssd1619.c deleted file mode 100644 index 89530ec6..00000000 --- a/zbs243_Tag_FW/board/ssd1619.c +++ /dev/null @@ -1,817 +0,0 @@ -#include -#include - -#include "asmUtil.h" -#include "barcode.h" -#include "board.h" -#include "cpu.h" -#include "ssd1619.h" -#include "font.h" -#include "lut.h" -#include "printf.h" -#include "screen.h" -#include "settings.h" -#include "sleep.h" -#include "spi.h" -#include "timer.h" -#include "wdt.h" - -#define CMD_DRV_OUTPUT_CTRL 0x01 -#define CMD_SOFT_START_CTRL 0x0C -#define CMD_ENTER_SLEEP 0x10 -#define CMD_DATA_ENTRY_MODE 0x11 -#define CMD_SOFT_RESET 0x12 -#define CMD_SOFT_RESET2 0x13 -#define CMD_SETUP_VOLT_DETECT 0x15 -#define CMD_TEMP_SENSOR_CONTROL 0x18 -#define CMD_ACTIVATION 0x20 -#define CMD_DISP_UPDATE_CTRL 0x21 -#define CMD_DISP_UPDATE_CTRL2 0x22 -#define CMD_WRITE_FB_BW 0x24 -#define CMD_WRITE_FB_RED 0x26 -#define CMD_UNKNOWN_1 0x2B -#define CMD_LOAD_OTP_LUT 0x31 -#define CMD_WRITE_LUT 0x32 -#define CMD_BORDER_WAVEFORM_CTRL 0x3C -#define CMD_WINDOW_X_SIZE 0x44 -#define CMD_WINDOW_Y_SIZE 0x45 -#define CMD_WRITE_PATTERN_RED 0x46 -#define CMD_WRITE_PATTERN_BW 0x47 -#define CMD_XSTART_POS 0x4E -#define CMD_YSTART_POS 0x4F -#define CMD_ANALOG_BLK_CTRL 0x74 -#define CMD_DIGITAL_BLK_CTRL 0x7E - -#define SCREEN_CMD_CLOCK_ON 0x80 -#define SCREEN_CMD_CLOCK_OFF 0x01 -#define SCREEN_CMD_ANALOG_ON 0x40 -#define SCREEN_CMD_ANALOG_OFF 0x02 -#define SCREEN_CMD_LATCH_TEMPERATURE_VAL 0x20 -#define SCREEN_CMD_LOAD_LUT 0x10 -#define SCREEN_CMD_USE_MODE_2 0x08 // modified commands 0x10 and 0x04 -#define SCREEN_CMD_REFRESH 0xC7 - -#define commandEnd() \ - do { \ - P1_7 = 1; \ - } while (0) - -#define markCommand() \ - do { \ - P2_2 = 0; \ - } while (0) - -#define markData() \ - do { \ - P2_2 = 1; \ - } while (0) - -extern void dump(uint8_t* __xdata a, uint16_t __xdata l); // remove me when done - -static uint8_t __xdata epdCharSize = 1; // character size, 1 or 2 (doubled) -static bool __xdata directionY = true; // print direction, X or Y (true) -static uint8_t __xdata rbuffer[32]; // used to rotate bits around -static uint16_t __xdata fontCurXpos = 0; // current X value we're working with -static uint16_t __xdata fontCurYpos = 0; // current Y value we're working with -static uint8_t __xdata currentLut = 0; -static uint8_t __xdata dispLutSize = 0; - -static bool __xdata isInited = false; - -bool __xdata epdGPIOActive = false; - -#define LUT_BUFFER_SIZE 128 -uint8_t waveformbuffer[LUT_BUFFER_SIZE]; -struct waveform10* __xdata waveform10 = (struct waveform10*)waveformbuffer; // holds the LUT/waveform -struct waveform* __xdata waveform7 = (struct waveform*)waveformbuffer; // holds the LUT/waveform - -#pragma callee_saves epdBusySleep -#pragma callee_saves epdBusyWait -static void epdBusySleep(uint32_t timeout) { - uint8_t tmp_P2FUNC = P2FUNC; - uint8_t tmp_P2DIR = P2DIR; - uint8_t tmp_P2PULL = P2PULL; - uint8_t tmp_P2LVLSEL = P2LVLSEL; - P2FUNC &= 0xfd; - P2DIR |= 2; - P2PULL |= 2; - P2LVLSEL |= 2; - - P2CHSTA &= 0xfd; - P2INTEN |= 2; - P2CHSTA &= 0xfd; - sleepForMsec(timeout); - wdtOn(); - P2CHSTA &= 0xfd; - P2INTEN &= 0xfd; - - P2FUNC = tmp_P2FUNC; - P2DIR = tmp_P2DIR; - P2PULL = tmp_P2PULL; - P2LVLSEL = tmp_P2LVLSEL; - eepromPrvDeselect(); -} -static void epdBusyWait(uint32_t timeout) { - uint32_t __xdata start = timerGet(); - - while (timerGet() - start < timeout) { - if (!P2_1) - return; - } - pr("screen timeout %lu ticks :(\n", timerGet() - start); - while (1) - ; -} -static void commandReadBegin(uint8_t cmd) { - epdSelect(); - markCommand(); - spiByte(cmd); // dump LUT - - P0DIR = (P0DIR & ~(1 << 0)) | (1 << 1); - P0 &= ~(1 << 0); - P0FUNC &= ~((1 << 0) | (1 << 1)); - P2_2 = 1; -} -static void commandReadEnd() { - // set up pins for spi (0.0,0.1,0.2) - P0FUNC |= (1 << 0) | (1 << 1); - epdDeselect(); -} -#pragma callee_saves epdReadByte -static uint8_t epdReadByte() { - uint8_t val = 0, i; - - for (i = 0; i < 8; i++) { - P0_0 = 1; - __asm__("nop\nnop\nnop\nnop\nnop\nnop\n"); - val <<= 1; - if (P0_1) - val++; - P0_0 = 0; - __asm__("nop\nnop\nnop\nnop\nnop\nnop\n"); - } - - return val; -} -static void shortCommand(uint8_t cmd) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - epdDeselect(); -} -static void shortCommand1(uint8_t cmd, uint8_t arg) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - markData(); - spiTXByte(arg); - epdDeselect(); -} -static void shortCommand2(uint8_t cmd, uint8_t arg1, uint8_t arg2) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - markData(); - spiTXByte(arg1); - spiTXByte(arg2); - epdDeselect(); -} -static void commandBegin(uint8_t cmd) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - markData(); -} -static void epdReset() { - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - P2_0 = 0; - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - P2_0 = 1; - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - - shortCommand(CMD_SOFT_RESET); // software reset - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - shortCommand(CMD_SOFT_RESET2); - timerDelay(TIMER_TICKS_PER_SECOND / 1000); -} -void epdConfigGPIO(bool setup) { - // data / _command: 2.2 - // busy 2.1 - // reset 2.0 - // _select 1.7 - // bs1 1.2 - - // GENERIC SPI BUS PINS - // spi.clk 0.0 - // spi.mosi 0.1 - if (epdGPIOActive == setup) return; - if (setup) { - P2DIR |= (1 << 1); // busy as input - P2DIR &= ~((1 << 2) | (1 << 0)); // D/C and Reset as output - P1DIR &= ~((1 << 7) | (1 << 2)); // select and bs1 as output - P1_2 = 0; // select 4-wire SPI / BS1 = low - P1_7 = 1; // deselect EPD - } else { - P2DIR |= ((1 << 2) | (1 << 0)); // DC and Reset as input - P2 &= ~((1 << 2) | (1 << 0)); - P1DIR |= ((1 << 7) | (1 << 2)); // Select and BS1 as input - P2 &= ~((1 << 7)); - } - epdGPIOActive = setup; -} -void epdEnterSleep() { - P2_0 = 0; - timerDelay(10); - P2_0 = 1; - timerDelay(50); - shortCommand(CMD_SOFT_RESET2); - epdBusyWait(TIMER_TICKS_PER_MS * 15); - shortCommand1(CMD_ENTER_SLEEP, 0x03); - isInited = false; -} -void epdSetup() { - epdReset(); - shortCommand1(CMD_ANALOG_BLK_CTRL, 0x54); - shortCommand1(CMD_DIGITAL_BLK_CTRL, 0x3B); - shortCommand2(CMD_UNKNOWN_1, 0x04, 0x63); - - commandBegin(CMD_SOFT_START_CTRL); - epdSend(0x8f); - epdSend(0x8f); - epdSend(0x8f); - epdSend(0x3f); - commandEnd(); - - commandBegin(CMD_DRV_OUTPUT_CTRL); - epdSend((SCREEN_HEIGHT - 1) & 0xff); - epdSend((SCREEN_HEIGHT - 1) >> 8); - epdSend(0x00); - commandEnd(); - - // shortCommand1(CMD_DATA_ENTRY_MODE, 0x03); - shortCommand1(CMD_BORDER_WAVEFORM_CTRL, 0xC0); - shortCommand1(CMD_TEMP_SENSOR_CONTROL, 0x80); - shortCommand1(CMD_DISP_UPDATE_CTRL2, 0xB1); // mode 1 (i2C) - // shortCommand1(CMD_DISP_UPDATE_CTRL2, 0xB9); // mode 2? - shortCommand(CMD_ACTIVATION); - epdBusyWait(TIMER_TICKS_PER_SECOND); - isInited = true; - currentLut = EPD_LUT_DEFAULT; -} -static uint8_t epdGetStatus() { - uint8_t sta; - commandReadBegin(0x2F); - sta = epdReadByte(); - commandReadEnd(); - return sta; -} -uint16_t epdGetBattery(void) { - uint16_t voltage = 2600; - uint8_t val; - - timerDelay(50); - P2_0 = 0; - timerDelay(50); - P2_0 = 1; - timerDelay(50); - - shortCommand(CMD_SOFT_RESET); // software reset - epdBusyWait(TIMER_TICKS_PER_MS * 30); - shortCommand(CMD_SOFT_RESET2); - epdBusyWait(TIMER_TICKS_PER_MS * 30); - - shortCommand1(CMD_DISP_UPDATE_CTRL2, SCREEN_CMD_CLOCK_ON | SCREEN_CMD_ANALOG_ON); - shortCommand(CMD_ACTIVATION); - epdBusyWait(TIMER_TICKS_PER_MS * 100); - - for (val = 3; val < 8; val++) { - shortCommand1(CMD_SETUP_VOLT_DETECT, val); - epdBusyWait(TIMER_TICKS_PER_MS * 100); - if (epdGetStatus() & 0x10) { // set if voltage is less than threshold ( == 1.9 + val / 10) - voltage = 1850 + mathPrvMul8x8(val, 100); - break; - } - } - - shortCommand(CMD_SOFT_RESET2); - epdBusyWait(TIMER_TICKS_PER_MS * 15); - shortCommand1(CMD_ENTER_SLEEP, 0x03); - - return voltage; -} - -void loadFixedTempOTPLUT() { - shortCommand1(0x18, 0x48); // external temp sensor - shortCommand2(0x1A, 0x05, 0x00); // < temp register - shortCommand1(CMD_DISP_UPDATE_CTRL2, 0xB1); // mode 1 (i2C) - shortCommand(CMD_ACTIVATION); - epdBusyWait(TIMER_TICKS_PER_SECOND); -} -static void writeLut() { - commandBegin(CMD_WRITE_LUT); - for (uint8_t i = 0; i < (dispLutSize * 10); i++) - epdSend(waveformbuffer[i]); - commandEnd(); -} -static void readLut() { - commandReadBegin(0x33); - uint16_t checksum = 0; - uint16_t ident = 0; - uint16_t shortl = 0; - for (uint16_t c = 0; c < LUT_BUFFER_SIZE; c++) { - waveformbuffer[c] = epdReadByte(); - } - commandReadEnd(); -} -static uint8_t getLutSize() { - uint8_t ref = 0; - for (uint8_t c = (LUT_BUFFER_SIZE - 4); c > 16; c--) { - uint8_t check = waveformbuffer[c]; - for (uint8_t d = 1; d < 4; d++) { - if (waveformbuffer[c + d] != check) { - ref = c; - goto end; - } - } - } -end:; - return ref + 1; -} -static void lutGroupDisable(uint8_t group) { - if (dispLutSize == 7) { - memset(&(waveform7->group[group]), 0x00, 5); - } else { - memset(&(waveform10->group[group]), 0x00, 5); - } -} -static void lutGroupSpeedup(uint8_t group, uint8_t speed) { - if (dispLutSize == 7) { - for (uint8_t i = 0; i < 4; i++) { - waveform7->group[group].phaselength[i] = 1 + (waveform7->group[group].phaselength[i] / speed); - } - } else { - for (uint8_t i = 0; i < 4; i++) { - waveform10->group[group].phaselength[i] = 1 + (waveform10->group[group].phaselength[i] / speed); - } - } -} -static void lutGroupRepeat(uint8_t group, uint8_t repeat) { - if (dispLutSize == 7) { - waveform7->group[group].repeat = repeat; - } else { - waveform10->group[group].repeat = repeat; - } -} -static void lutGroupRepeatReduce(uint8_t group, uint8_t factor) { - if (dispLutSize == 7) { - waveform7->group[group].repeat = waveform7->group[group].repeat / factor; - } else { - waveform10->group[group].repeat = waveform10->group[group].repeat / factor; - } -} -void selectLUT(uint8_t lut) { - if (currentLut == lut) { - return; - } - - if (currentLut != EPD_LUT_DEFAULT) { - // load the 'default' LUT for the current temperature in the EPD lut register - shortCommand1(CMD_DISP_UPDATE_CTRL2, 0xB1); // mode 1? - shortCommand(CMD_ACTIVATION); - epdBusyWait(TIMER_TICKS_PER_SECOND); - } - - currentLut = lut; - - // if we're going to be using the default LUT, we're done here. - if (lut == EPD_LUT_DEFAULT) { - return; - } - - // download the current LUT from the waveform buffer - readLut(); - - if (dispLutSize == 0) { - dispLutSize = getLutSize(); - dispLutSize /= 10; - pr("lut size = %d\n", dispLutSize); -#ifdef PRINT_LUT - dump(waveformbuffer, LUT_BUFFER_SIZE); -#endif - } - - switch (lut) { - case EPD_LUT_NO_REPEATS: - lutGroupDisable(LUTGROUP_NEGATIVE); - lutGroupDisable(LUTGROUP_FASTBLINK); - lutGroupRepeat(LUTGROUP_SLOWBLINK, 0); - lutGroupSpeedup(LUTGROUP_SET, 2); - lutGroupSpeedup(LUTGROUP_IMPROVE_SHARPNESS, 2); - lutGroupRepeatReduce(LUTGROUP_IMPROVE_SHARPNESS, 2); - lutGroupSpeedup(LUTGROUP_IMPROVE_REDS, 2); - lutGroupRepeatReduce(LUTGROUP_IMPROVE_REDS, 2); - lutGroupDisable(LUTGROUP_UNUSED); - break; - case EPD_LUT_FAST_NO_REDS: - lutGroupDisable(LUTGROUP_NEGATIVE); - lutGroupDisable(LUTGROUP_FASTBLINK); - lutGroupDisable(LUTGROUP_SLOWBLINK); - lutGroupSpeedup(LUTGROUP_SET, 2); - lutGroupDisable(LUTGROUP_IMPROVE_REDS); - lutGroupDisable(LUTGROUP_IMPROVE_SHARPNESS); - lutGroupDisable(LUTGROUP_UNUSED); - break; - case EPD_LUT_FAST: - lutGroupDisable(LUTGROUP_NEGATIVE); - lutGroupDisable(LUTGROUP_FASTBLINK); - lutGroupDisable(LUTGROUP_SLOWBLINK); - lutGroupRepeat(LUTGROUP_SET, 1); - lutGroupSpeedup(LUTGROUP_SET, 2); - lutGroupDisable(LUTGROUP_IMPROVE_SHARPNESS); - lutGroupDisable(LUTGROUP_IMPROVE_REDS); - lutGroupDisable(LUTGROUP_UNUSED); - break; - } - - if (dispLutSize == 10) { - lutGroupDisable(LUTGROUP_UNUSED); - lutGroupDisable(LUTGROUP_UNKNOWN); - lutGroupDisable(LUTGROUP_UNUSED3); - lutGroupDisable(LUTGROUP_UNUSED4); - } - writeLut(); -} - -void setWindowX(uint16_t start, uint16_t end) { - shortCommand2(CMD_WINDOW_X_SIZE, start / 8, end / 8 - 1); -} -void setWindowY(uint16_t start, uint16_t end) { - commandBegin(CMD_WINDOW_Y_SIZE); - epdSend((start)&0xff); - epdSend((start) >> 8); - epdSend((end - 1) & 0xff); - epdSend((end - 1) >> 8); - commandEnd(); -} -void setPosXY(uint16_t x, uint16_t y) { - shortCommand1(CMD_XSTART_POS, (uint8_t)(x / 8)); - commandBegin(CMD_YSTART_POS); - epdSend((y)&0xff); - epdSend((y) >> 8); - commandEnd(); -} -void setColorMode(uint8_t red, uint8_t bw) { - shortCommand1(CMD_DISP_UPDATE_CTRL, (red << 4) | bw); -} -void fillWindowWithPattern(bool color) { - if (color == EPD_COLOR_RED) { - shortCommand1(CMD_WRITE_PATTERN_RED, 0x00); - } else { - shortCommand1(CMD_WRITE_PATTERN_BW, 0x00); - } -} -void clearWindow(bool color) { - if (color == EPD_COLOR_RED) { - shortCommand1(CMD_WRITE_PATTERN_RED, 0x66); - } else { - shortCommand1(CMD_WRITE_PATTERN_BW, 0x66); - } -} -void clearScreen() { - setWindowX(0, SCREEN_WIDTH); - setWindowY(0, SCREEN_HEIGHT); - setPosXY(0, 0); - shortCommand1(CMD_DATA_ENTRY_MODE, 3); // was 3 - shortCommand1(CMD_WRITE_PATTERN_BW, 0x66); - epdBusyWait(TIMER_TICKS_PER_MS * 100); - shortCommand1(CMD_WRITE_PATTERN_RED, 0x66); - epdBusyWait(TIMER_TICKS_PER_MS * 100); -} -void draw() { - shortCommand1(0x22, 0xCF); - // shortCommand1(0x22, SCREEN_CMD_REFRESH); - shortCommand(0x20); - epdBusyWait(TIMER_TICKS_PER_SECOND * 120); -} -void drawNoWait() { - shortCommand1(0x22, 0xCF); - // shortCommand1(0x22, SCREEN_CMD_REFRESH); - shortCommand(0x20); -} -void drawWithSleep() { - shortCommand1(0x22, 0xCF); - // shortCommand1(0x22, SCREEN_CMD_REFRESH); - shortCommand(0x20); - uint8_t tmp_P2FUNC = P2FUNC; - uint8_t tmp_P2DIR = P2DIR; - uint8_t tmp_P2PULL = P2PULL; - uint8_t tmp_P2LVLSEL = P2LVLSEL; - P2FUNC &= 0xfd; - P2DIR |= 2; - P2PULL |= 2; - P2LVLSEL |= 2; - - P2CHSTA &= 0xfd; - P2INTEN |= 2; - P2CHSTA &= 0xfd; - sleepForMsec(TIMER_TICKS_PER_SECOND * 120); - wdtOn(); - P2CHSTA &= 0xfd; - P2INTEN &= 0xfd; - - P2FUNC = tmp_P2FUNC; - P2DIR = tmp_P2DIR; - P2PULL = tmp_P2PULL; - P2LVLSEL = tmp_P2LVLSEL; - eepromPrvDeselect(); -} -void epdWaitRdy() { - epdBusyWait(TIMER_TICKS_PER_SECOND * 120); -} -void drawLineHorizontal(bool color, uint16_t x1, uint16_t x2, uint16_t y) { - setWindowX(x1, x2); - setWindowY(y, y + 1); - if (color) { - shortCommand1(CMD_WRITE_PATTERN_RED, 0xE6); - } else { - shortCommand1(CMD_WRITE_PATTERN_BW, 0xE6); - } - epdBusyWait(TIMER_TICKS_PER_MS * 100); -} -void drawLineVertical(bool color, uint16_t x, uint16_t y1, uint16_t y2) { - setWindowY(y1, y2); - setWindowX(x, x + 8); - shortCommand1(CMD_DATA_ENTRY_MODE, 3); - setPosXY(x, y1); - if (color) { - commandBegin(CMD_WRITE_FB_RED); - } else { - commandBegin(CMD_WRITE_FB_BW); - } - uint8_t __xdata c = 0x80; - c >>= (x % 8); - for (; y1 < y2; y1++) { - epdSend(c); - } - commandEnd(); -} -void beginFullscreenImage() { - setColorMode(EPD_MODE_NORMAL, EPD_MODE_INVERT); - setWindowX(0, SCREEN_WIDTH); - setWindowY(0, SCREEN_HEIGHT); - shortCommand1(CMD_DATA_ENTRY_MODE, 3); - setPosXY(0, 0); -} -void beginWriteFramebuffer(bool color) { - if (color == EPD_COLOR_RED) { - commandBegin(CMD_WRITE_FB_RED); - } else { - commandBegin(CMD_WRITE_FB_BW); - } - epdDeselect(); -} -void endWriteFramebuffer() { - commandEnd(); -} -void loadRawBitmap(uint8_t* bmp, uint16_t x, uint16_t y, bool color) { - uint16_t xsize = bmp[0] / 8; - if (bmp[0] % 8) xsize++; - uint16_t size = xsize * bmp[1]; - setWindowX(x, x + (xsize * 8)); - setWindowY(y, bmp[1] + y); - setPosXY(x, y); - shortCommand1(CMD_DATA_ENTRY_MODE, 3); - if (color) { - commandBegin(CMD_WRITE_FB_RED); - } else { - commandBegin(CMD_WRITE_FB_BW); - } - bmp += 2; - while (size--) { - epdSend(*(bmp++)); - } - commandEnd(); -} -void printBarcode(const uint8_t* string, uint16_t x, uint16_t y) { - setWindowY(y, 1); - setWindowX(x, x + 8); - setPosXY(x, y); - shortCommand1(CMD_DATA_ENTRY_MODE, 1); - commandBegin(CMD_WRITE_FB_BW); - struct BarcodeInfo __xdata bci = { - .str = string, - }; - while (!barcodeIsDone(&bci)) { - if (barcodeNextBar(&bci)) { - epdSend(0xFF); - } else { - epdSend(0x00); - } - } - commandEnd(); -} -// stuff for printing text -static void pushXFontBytesToEPD(uint8_t byte1, uint8_t byte2) { - if (epdCharSize == 1) { - uint8_t offset = 7 - (fontCurXpos % 8); - for (uint8_t c = 0; c < 8; c++) { - if (byte2 & (1 << (7 - c))) rbuffer[c] |= (1 << offset); - } - for (uint8_t c = 0; c < 8; c++) { - if (byte1 & (1 << (7 - c))) rbuffer[8 + c] |= (1 << offset); - } - fontCurXpos++; - } else { - uint8_t offset = 6 - (fontCurXpos % 8); - // double font size - for (uint8_t c = 0; c < 8; c++) { - if (byte2 & (1 << (7 - c))) { - rbuffer[c * 2] |= (3 << offset); - rbuffer[(c * 2) + 1] |= (3 << offset); - } - } - for (uint8_t c = 0; c < 8; c++) { - if (byte1 & (1 << (7 - c))) { - rbuffer[(c * 2) + 16] |= (3 << offset); - rbuffer[(c * 2) + 17] |= (3 << offset); - } - } - fontCurXpos += 2; - } - if (fontCurXpos % 8 == 0) { - // next byte, flush current byte to EPD - for (uint8_t i = 0; i < (16 * epdCharSize); i++) { - epdSend(rbuffer[i]); - } - memset(rbuffer, 0, 32); - } -} -static void bufferByteShift(uint8_t byte) { - /* - rbuffer[0] = 0; // previous value - rbuffer[1] = y%8; // offset - rbuffer[2] = 0; // current byte counter; - rbuffer[3] = 1+(epdCharsize*2); - */ - - if (rbuffer[1] == 0) { - epdSend(byte); - } else { - uint8_t offset = rbuffer[1]; - rbuffer[0] |= (byte >> offset); - epdSend(rbuffer[0]); - // epdSend(byte); - rbuffer[0] = (byte << (8 - offset)); - rbuffer[2]++; - if (rbuffer[2] == rbuffer[3]) { - epdSend(rbuffer[0]); - rbuffer[0] = 0; - rbuffer[2] = 0; - } - } -} -static void pushYFontBytesToEPD(uint8_t byte1, uint8_t byte2) { - if (epdCharSize == 2) { - for (uint8_t j = 0; j < 2; j++) { - uint8_t c = 0; - for (uint8_t i = 7; i != 255; i--) { - if (byte1 & (1 << i)) c |= (0x03 << ((i % 4) * 2)); - if ((i % 4) == 0) { - bufferByteShift(c); - c = 0; - } - } - for (uint8_t i = 7; i != 255; i--) { - if (byte2 & (1 << i)) c |= (0x03 << ((i % 4) * 2)); - if ((i % 4) == 0) { - bufferByteShift(c); - c = 0; - } - } - } - } else { - bufferByteShift(byte1); - bufferByteShift(byte2); - } -} -void writeCharEPD(uint8_t c) { - // Writes a single character to the framebuffer - bool empty = true; - for (uint8_t i = 0; i < 20; i++) { - if (font[c][i]) empty = false; - } - if (empty) { - for (uint8_t i = 0; i < 8; i++) { - if (directionY) { - pushYFontBytesToEPD(0x00, 0x00); - } else { - pushXFontBytesToEPD(0x00, 0x00); - } - } - return; - } - - uint8_t begin = 0; - while (font[c][begin] == 0x00 && font[c][begin + 1] == 0x00) { - begin += 2; - } - - uint8_t end = 20; - while (font[c][end - 1] == 0x00 && font[c][end - 2] == 0x00) { - end -= 2; - } - - for (uint8_t pos = begin; pos < end; pos += 2) { - if (directionY) { - pushYFontBytesToEPD(font[c][pos + 1], font[c][pos]); - } else { - pushXFontBytesToEPD(font[c][pos], font[c][pos + 1]); - } - } - - // spacing between characters - if (directionY) { - pushYFontBytesToEPD(0x00, 0x00); - } else { - pushXFontBytesToEPD(0x00, 0x00); - } -} - -// Print text to the EPD. Origin is top-left -void epdPrintBegin(uint16_t x, uint16_t y, bool direction, bool fontsize, bool color) { - directionY = direction; - epdCharSize = 1 + fontsize; - if (directionY) { - uint8_t extra = 0; - - // provisions for dealing with font in Y direction, byte-unaligned - if (x % 8) { - extra = 8; - rbuffer[0] = 0; // previous value - rbuffer[1] = x % 8; // offset - rbuffer[2] = 0; // current byte counter; - rbuffer[3] = (epdCharSize * 2); - } else { - rbuffer[1] = 0; - } - - setWindowY(y, 1); - if (epdCharSize == 2) { - setWindowX(x, x + 32 + extra); - setPosXY(x, y); - } else { - setWindowX(x, x + 16 + extra); - setPosXY(x, y); - } - shortCommand1(CMD_DATA_ENTRY_MODE, 1); // was 3 - } else { - if (epdCharSize == 2) { - x /= 2; - x *= 2; - setWindowY(y, y + 32); - } else { - setWindowY(y, y + 16); - } - setPosXY(x, y); - fontCurXpos = x; - setWindowX(x, SCREEN_WIDTH); - shortCommand1(CMD_DATA_ENTRY_MODE, 7); - memset(rbuffer, 0, 32); - } - - if (color) { - commandBegin(CMD_WRITE_FB_RED); - } else { - commandBegin(CMD_WRITE_FB_BW); - } -} -void epdPrintEnd() { - if (!directionY && ((fontCurXpos % 8) != 0)) { - for (uint8_t i = 0; i < (16 * epdCharSize); i++) { - epdSend(rbuffer[i]); - } - } - commandEnd(); -} - -extern uint8_t __xdata blockXferBuffer[]; - -void readRam() { - setWindowY(296, 0); - setWindowX(0, 8); - setPosXY(0, 296); - shortCommand1(CMD_DATA_ENTRY_MODE, 1); // was 3 - shortCommand1(0x41, 0x00); - commandReadBegin(0x27); - epdReadByte(); - - for (uint16_t c = 0; c < 293; c++) { - blockXferBuffer[c] = epdReadByte() | 0x10; - } - commandReadEnd(); - commandBegin(CMD_WRITE_FB_BW); - for (uint16_t c = 0; c < 296; c++) { - epdSend(blockXferBuffer[c]); - } - commandEnd(); -} diff --git a/zbs243_Tag_FW/board/ssd1619.h b/zbs243_Tag_FW/board/ssd1619.h deleted file mode 100644 index a94bb934..00000000 --- a/zbs243_Tag_FW/board/ssd1619.h +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef _JSCREEN_H_ -#define _JSCREEN_H_ - -#include -#include - -#define epdSend spiTXByte -#define EPD_DIRECTION_X false -#define EPD_DIRECTION_Y true -#define EPD_SIZE_SINGLE false -#define EPD_SIZE_DOUBLE true -#define EPD_COLOR_RED true -#define EPD_COLOR_BLACK false -#define EPD_LOAD_CUSTOM_LUT true -#define EPD_LOAD_OTP_LUT false -#define EPD_MODE_NORMAL 0x00 -#define EPD_MODE_INVERT 0x08 -#define EPD_MODE_IGNORE 0x04 - -#define EPD_LUT_DEFAULT 0 -#define EPD_LUT_NO_REPEATS 1 -#define EPD_LUT_FAST_NO_REDS 2 -#define EPD_LUT_FAST 3 - -#define epdSelect() \ - do { \ - P1_7 = 0; \ - } while (0) - -#define epdDeselect() \ - do { \ - P1_7 = 1; \ - } while (0) - -void epdSetup(); -void epdEnterSleep(); -uint16_t epdGetBattery(); -void epdConfigGPIO(bool setup); - -extern bool __xdata epdGPIOActive; - -void setWindowX(uint16_t start, uint16_t end); -void setWindowY(uint16_t start, uint16_t end); -void setPosXY(uint16_t x, uint16_t y); -void setColorMode(uint8_t red, uint8_t bw); -void fillWindowWithPattern(bool color); -void clearWindow(bool color); -void clearScreen(); -void draw(); -void drawNoWait(); -void drawWithSleep(); -void epdWaitRdy(); -void drawLineHorizontal(bool color, uint16_t x1, uint16_t x2, uint16_t y); -void drawLineVertical(bool color, uint16_t x, uint16_t y1, uint16_t y2); -void beginFullscreenImage(); -void beginWriteFramebuffer(bool color); -void endWriteFramebuffer(); -void loadRawBitmap(uint8_t* bmp, uint16_t x, uint16_t y, bool color); -void printBarcode(const uint8_t* string, uint16_t x, uint16_t y); - -void selectLUT(uint8_t lut); - -void ByteDecode(uint8_t byte); - -void epdPrintBegin(uint16_t x, uint16_t y, bool direction, bool fontsize, bool red); -void epdPrintEnd(); - -void beginFullscreenImage(); -void beginWriteFramebuffer(bool color); - -void lutTest(); - -// for printf.c -void writeCharEPD(uint8_t c); - -#endif diff --git a/zbs243_Tag_FW/board/uc8151.c b/zbs243_Tag_FW/board/uc8151.c deleted file mode 100644 index 9fe32796..00000000 --- a/zbs243_Tag_FW/board/uc8151.c +++ /dev/null @@ -1,787 +0,0 @@ -#include "uc8151.h" - -#include -#include - -#include "asmUtil.h" -#include "barcode.h" -#include "board.h" -#include "cpu.h" -#include "font.h" -#include "lut.h" -#include "printf.h" -#include "screen.h" -#include "settings.h" -#include "sleep.h" -#include "spi.h" -#include "timer.h" -#include "wdt.h" - -#define CMD_PANEL_SETTING 0x00 -#define CMD_POWER_SETTING 0x01 -#define CMD_POWER_OFF 0x02 -#define CMD_POWER_OFF_SEQUENCE 0x03 -#define CMD_POWER_ON 0x04 -#define CMD_POWER_ON_MEASURE 0x05 -#define CMD_BOOSTER_SOFT_START 0x06 -#define CMD_DEEP_SLEEP 0x07 -#define CMD_DISPLAY_START_TRANSMISSION_DTM1 0x10 -#define CMD_DATA_STOP 0x11 -#define CMD_DISPLAY_REFRESH 0x12 -#define CMD_DISPLAY_START_TRANSMISSION_DTM2 0x13 -#define CMD_PLL_CONTROL 0x30 -#define CMD_TEMPERATURE_CALIB 0x40 -#define CMD_TEMPERATURE_SELECT 0x41 -#define CMD_TEMPERATURE_WRITE 0x42 -#define CMD_TEMPERATURE_READ 0x43 -#define CMD_VCOM_INTERVAL 0x50 -#define CMD_LOWER_POWER_DETECT 0x51 -#define CMD_TCON_SETTING 0x60 -#define CMD_RESOLUTION_SETING 0x61 -#define CMD_REVISION 0x70 -#define CMD_STATUS 0x71 -#define CMD_AUTO_MEASUREMENT_VCOM 0x80 -#define CMD_READ_VCOM 0x81 -#define CMD_VCOM_DC_SETTING 0x82 -#define CMD_PARTIAL_WINDOW 0x90 -#define CMD_PARTIAL_IN 0x91 -#define CMD_PARTIAL_OUT 0x92 -#define CMD_PROGRAM_MODE 0xA0 -#define CMD_ACTIVE_PROGRAM 0xA1 -#define CMD_READ_OTP 0xA2 -#define CMD_CASCADE_SET 0xE0 -#define CMD_POWER_SAVING 0xE3 -#define CMD_FORCE_TEMPERATURE 0xE5 - -enum PSR_FLAGS { - RES_96x230 = 0b00000000, - RES_96x252 = 0b01000000, - RES_128x296 = 0b10000000, - RES_160x296 = 0b11000000, - - LUT_OTP = 0b00000000, - LUT_REG = 0b00100000, - - FORMAT_BWR = 0b00000000, - FORMAT_BW = 0b00010000, - - SCAN_DOWN = 0b00000000, - SCAN_UP = 0b00001000, - - SHIFT_LEFT = 0b00000000, - SHIFT_RIGHT = 0b00000100, - - BOOSTER_OFF = 0b00000000, - BOOSTER_ON = 0b00000010, - - RESET_SOFT = 0b00000000, - RESET_NONE = 0b00000001 -}; - -enum PWR_FLAGS_1 { - VDS_EXTERNAL = 0b00000000, - VDS_INTERNAL = 0b00000010, - - VDG_EXTERNAL = 0b00000000, - VDG_INTERNAL = 0b00000001 -}; - -enum PWR_FLAGS_2 { - VCOM_VD = 0b00000000, - VCOM_VG = 0b00000100, - - VGHL_16V = 0b00000000, - VGHL_15V = 0b00000001, - VGHL_14V = 0b00000010, - VGHL_13V = 0b00000011 -}; - -enum BOOSTER_FLAGS { - START_10MS = 0b00000000, - START_20MS = 0b01000000, - START_30MS = 0b10000000, - START_40MS = 0b11000000, - - STRENGTH_1 = 0b00000000, - STRENGTH_2 = 0b00001000, - STRENGTH_3 = 0b00010000, - STRENGTH_4 = 0b00011000, - STRENGTH_5 = 0b00100000, - STRENGTH_6 = 0b00101000, - STRENGTH_7 = 0b00110000, - STRENGTH_8 = 0b00111000, - - OFF_0_27US = 0b00000000, - OFF_0_34US = 0b00000001, - OFF_0_40US = 0b00000010, - OFF_0_54US = 0b00000011, - OFF_0_80US = 0b00000100, - OFF_1_54US = 0b00000101, - OFF_3_34US = 0b00000110, - OFF_6_58US = 0b00000111 -}; - -enum PFS_FLAGS { - FRAMES_1 = 0b00000000, - FRAMES_2 = 0b00010000, - FRAMES_3 = 0b00100000, - FRAMES_4 = 0b00110000 -}; - -enum TSE_FLAGS { - TEMP_INTERNAL = 0b00000000, - TEMP_EXTERNAL = 0b10000000, - - OFFSET_0 = 0b00000000, - OFFSET_1 = 0b00000001, - OFFSET_2 = 0b00000010, - OFFSET_3 = 0b00000011, - OFFSET_4 = 0b00000100, - OFFSET_5 = 0b00000101, - OFFSET_6 = 0b00000110, - OFFSET_7 = 0b00000111, - - OFFSET_MIN_8 = 0b00001000, - OFFSET_MIN_7 = 0b00001001, - OFFSET_MIN_6 = 0b00001010, - OFFSET_MIN_5 = 0b00001011, - OFFSET_MIN_4 = 0b00001100, - OFFSET_MIN_3 = 0b00001101, - OFFSET_MIN_2 = 0b00001110, - OFFSET_MIN_1 = 0b00001111 -}; - -enum PLL_FLAGS { - // other frequency options exist but there doesn't seem to be much - // point in including them - this is a fair range of options... - HZ_29 = 0b00111111, - HZ_33 = 0b00111110, - HZ_40 = 0b00111101, - HZ_50 = 0b00111100, - HZ_67 = 0b00111011, - HZ_100 = 0b00111010, - HZ_200 = 0b00111001 -}; - -#define commandEnd() \ - do { \ - P1_7 = 1; \ - } while (0) - -#define markCommand() \ - do { \ - P2_2 = 0; \ - } while (0) - -#define markData() \ - do { \ - P2_2 = 1; \ - } while (0) - -extern void dump(uint8_t* __xdata a, uint16_t __xdata l); // remove me when done - -static uint8_t __xdata epdCharSize = 1; // character size, 1 or 2 (doubled) -static bool __xdata directionY = true; // print direction, X or Y (true) -static uint8_t __xdata rbuffer[32]; // used to rotate bits around -static uint16_t __xdata fontCurXpos = 0; // current X value we're working with -static uint16_t __xdata fontCurYpos = 0; // current Y value we're working with -static uint8_t __xdata currentLut = 0; -static uint8_t __xdata dispLutSize = 0; -static bool __xdata drawDirection = false; -static bool __xdata isInited = false; - -bool __xdata epdGPIOActive = false; - -#define LUT_BUFFER_SIZE 128 -uint8_t waveformbuffer[LUT_BUFFER_SIZE]; -struct waveform10* __xdata waveform10 = (struct waveform10*)waveformbuffer; // holds the LUT/waveform -struct waveform* __xdata waveform7 = (struct waveform*)waveformbuffer; // holds the LUT/waveform - -#pragma callee_saves epdBusySleep -#pragma callee_saves epdBusyWait -static void epdBusySleep(uint32_t timeout) { - uint8_t tmp_P2FUNC = P2FUNC; - uint8_t tmp_P2DIR = P2DIR; - uint8_t tmp_P2PULL = P2PULL; - uint8_t tmp_P2LVLSEL = P2LVLSEL; - P2FUNC &= 0xfd; - P2DIR |= 2; - P2PULL |= 2; - P2LVLSEL &= ~(2); - - P2CHSTA &= 0xfd; - P2INTEN |= 2; - P2CHSTA &= 0xfd; - sleepForMsec(timeout); - wdtOn(); - P2CHSTA &= 0xfd; - P2INTEN &= 0xfd; - - P2FUNC = tmp_P2FUNC; - P2DIR = tmp_P2DIR; - P2PULL = tmp_P2PULL; - P2LVLSEL = tmp_P2LVLSEL; - eepromPrvDeselect(); -} -static void epdBusyWait(uint32_t timeout) { - uint32_t __xdata start = timerGet(); - - while (timerGet() - start < timeout) { - if (P2_1) - return; - } - pr("screen timeout %lu ticks :(\n", timerGet() - start); - while (1) - ; -} -static void commandReadBegin(uint8_t cmd) { - epdSelect(); - markCommand(); - spiByte(cmd); // dump LUT - - P0DIR = (P0DIR & ~(1 << 0)) | (1 << 1); - P0 &= ~(1 << 0); - P0FUNC &= ~((1 << 0) | (1 << 1)); - P2_2 = 1; -} -static void commandReadEnd() { - // set up pins for spi (0.0,0.1,0.2) - P0FUNC |= (1 << 0) | (1 << 1); - epdDeselect(); -} -#pragma callee_saves epdReadByte -static uint8_t epdReadByte() { - uint8_t val = 0, i; - - for (i = 0; i < 8; i++) { - P0_0 = 1; - __asm__("nop\nnop\nnop\nnop\nnop\nnop\n"); - val <<= 1; - if (P0_1) - val++; - P0_0 = 0; - __asm__("nop\nnop\nnop\nnop\nnop\nnop\n"); - } - - return val; -} -static void shortCommand(uint8_t cmd) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - epdDeselect(); -} -static void shortCommand1(uint8_t cmd, uint8_t arg) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - markData(); - spiTXByte(arg); - epdDeselect(); -} -static void shortCommand2(uint8_t cmd, uint8_t arg1, uint8_t arg2) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - markData(); - spiTXByte(arg1); - spiTXByte(arg2); - epdDeselect(); -} -static void commandBegin(uint8_t cmd) { - epdSelect(); - markCommand(); - spiTXByte(cmd); - markData(); -} -static void epdReset() { - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - P2_0 = 0; - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - P2_0 = 1; - timerDelay(TIMER_TICKS_PER_SECOND / 1000); -} -void epdConfigGPIO(bool setup) { - // data / _command: 2.2 - // busy 2.1 - // reset 2.0 - // _select 1.7 - // bs1 1.2 - - // GENERIC SPI BUS PINS - // spi.clk 0.0 - // spi.mosi 0.1 - if (epdGPIOActive == setup) return; - if (setup) { - P2DIR |= (1 << 1); // busy as input - P2DIR &= ~((1 << 2) | (1 << 0)); // D/C and Reset as output - P1DIR &= ~((1 << 7) | (1 << 2)); // select and bs1 as output - P1_2 = 0; // select 4-wire SPI / BS1 = low - P1_7 = 1; // deselect EPD - } else { - P2DIR |= ((1 << 2) | (1 << 0)); // DC and Reset as input - P2 &= ~((1 << 2) | (1 << 0)); - P1DIR |= ((1 << 7) | (1 << 2)); // Select and BS1 as input - P2 &= ~((1 << 7)); - } - epdGPIOActive = setup; -} -void epdEnterSleep() { - shortCommand1(CMD_VCOM_INTERVAL, 0x17); - shortCommand1(CMD_VCOM_DC_SETTING, 0x00); - // shortCommand(CMD_POWER_OFF); - // epdWaitRdy(); - shortCommand1(CMD_DEEP_SLEEP, 0xA5); - isInited = false; -} - -static void epdDrawDirection(bool direction) { - if (direction == drawDirection) return; - - drawDirection = direction; - - uint8_t psr_setting = RES_128x296 | FORMAT_BWR | BOOSTER_ON | RESET_NONE | LUT_OTP | SHIFT_RIGHT; - if (drawDirection) { - psr_setting |= SCAN_DOWN; - } else { - psr_setting |= SCAN_UP; - } - shortCommand1(CMD_PANEL_SETTING, psr_setting); -} - -void epdSetup() { - epdReset(); - - drawDirection = false; - epdDrawDirection(true); - - commandBegin(CMD_POWER_SETTING); - epdSend(VDS_INTERNAL | VDG_INTERNAL); - epdSend(VCOM_VD | VGHL_16V); - epdSend(0b101011); - epdSend(0b101011); - epdSend(0b101011); - commandEnd(); - - shortCommand(CMD_POWER_ON); - epdWaitRdy(); - - commandBegin(CMD_BOOSTER_SOFT_START); - epdSend(START_10MS | STRENGTH_3 | OFF_6_58US); - epdSend(START_10MS | STRENGTH_3 | OFF_6_58US); - epdSend(START_10MS | STRENGTH_3 | OFF_6_58US); - commandEnd(); - - commandBegin(CMD_RESOLUTION_SETING); - epdSend(SCREEN_WIDTH); - epdSend(SCREEN_HEIGHT >> 8); - epdSend(SCREEN_HEIGHT & 0xFF); - commandEnd(); - - shortCommand1(CMD_POWER_OFF_SEQUENCE, FRAMES_1); - shortCommand1(CMD_TEMPERATURE_SELECT, TEMP_INTERNAL | OFFSET_0); - shortCommand1(CMD_TCON_SETTING, 0x22); - shortCommand1(CMD_VCOM_INTERVAL, 0x8d); // 0x87 - shortCommand1(CMD_PLL_CONTROL, HZ_200); - epdWaitRdy(); - shortCommand(CMD_POWER_ON); - epdWaitRdy(); -} -static uint8_t epdGetStatus() { - uint8_t sta; - commandReadBegin(0x2F); - sta = epdReadByte(); - commandReadEnd(); - return sta; -} -uint16_t epdGetBattery(void) { - return 0; -} - -static void readLut() { - commandReadBegin(0x33); - uint16_t checksum = 0; - uint16_t ident = 0; - uint16_t shortl = 0; - for (uint16_t c = 0; c < LUT_BUFFER_SIZE; c++) { - waveformbuffer[c] = epdReadByte(); - } - commandReadEnd(); -} -static uint8_t getLutSize() { - uint8_t ref = 0; - for (uint8_t c = (LUT_BUFFER_SIZE - 4); c > 16; c--) { - uint8_t check = waveformbuffer[c]; - for (uint8_t d = 1; d < 4; d++) { - if (waveformbuffer[c + d] != check) { - ref = c; - goto end; - } - } - } -end:; - return ref + 1; -} -static void lutGroupDisable(uint8_t group) { - if (dispLutSize == 7) { - memset(&(waveform7->group[group]), 0x00, 5); - } else { - memset(&(waveform10->group[group]), 0x00, 5); - } -} -static void lutGroupSpeedup(uint8_t group, uint8_t speed) { - if (dispLutSize == 7) { - for (uint8_t i = 0; i < 4; i++) { - waveform7->group[group].phaselength[i] = 1 + (waveform7->group[group].phaselength[i] / speed); - } - } else { - for (uint8_t i = 0; i < 4; i++) { - waveform10->group[group].phaselength[i] = 1 + (waveform10->group[group].phaselength[i] / speed); - } - } -} -static void lutGroupRepeat(uint8_t group, uint8_t repeat) { - if (dispLutSize == 7) { - waveform7->group[group].repeat = repeat; - } else { - waveform10->group[group].repeat = repeat; - } -} -static void lutGroupRepeatReduce(uint8_t group, uint8_t factor) { - if (dispLutSize == 7) { - waveform7->group[group].repeat = waveform7->group[group].repeat / factor; - } else { - waveform10->group[group].repeat = waveform10->group[group].repeat / factor; - } -} -void selectLUT(uint8_t lut) { - // implement alternative LUTs here. Currently just reset the watchdog to two minutes, - // to ensure it doesn't reset during the much longer bootup procedure - wdtSetResetVal(0xFF8E797F); // 120 s - wdtOn(); - return; -} - -void setWindowXY(uint16_t xstart, uint16_t xend, uint16_t ystart, uint16_t yend) { - shortCommand(CMD_PARTIAL_IN); - commandBegin(CMD_PARTIAL_WINDOW); - epdSend((xstart / 8) << 3); - epdSend(((xend / 8 - 1) << 3) | 0x07); - epdSend(ystart >> 8); - epdSend(ystart & 0xFF); - epdSend((yend - 1) >> 8); - epdSend((yend - 1) & 0xff); - epdSend(0x01); - commandEnd(); -} - -void setColorMode(uint8_t red, uint8_t bw) { - return; -} -void clearScreen() { - shortCommand(CMD_PARTIAL_OUT); - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM2); - for (uint16_t c = 0; c < ((1UL * SCREEN_HEIGHT * SCREEN_WIDTH) / 8); c++) { - epdSend(0x00); - } - commandEnd(); - epdWaitRdy(); - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM1); - for (uint16_t c = 0; c < ((1UL * SCREEN_HEIGHT * SCREEN_WIDTH) / 8); c++) { - epdSend(0x00); - } - commandEnd(); -} -void draw() { - shortCommand(CMD_DISPLAY_REFRESH); - epdWaitRdy(); -} -void drawNoWait() { - shortCommand(CMD_DISPLAY_REFRESH); -} -void drawWithSleep() { - shortCommand(CMD_DISPLAY_REFRESH); - uint8_t tmp_P2FUNC = P2FUNC; - uint8_t tmp_P2DIR = P2DIR; - uint8_t tmp_P2PULL = P2PULL; - uint8_t tmp_P2LVLSEL = P2LVLSEL; - P2FUNC &= 0xfd; - P2DIR |= 2; - P2PULL |= 2; - P2LVLSEL &= ~(2); - - P2CHSTA &= 0xfd; - P2INTEN = 2; - P2CHSTA &= 0xfd; - sleepForMsec(TIMER_TICKS_PER_SECOND * 120); - wdtOn(); - P2CHSTA &= 0xfd; - P2INTEN &= 0xfd; - - P2FUNC = tmp_P2FUNC; - P2DIR = tmp_P2DIR; - P2PULL = tmp_P2PULL; - P2LVLSEL = tmp_P2LVLSEL; - eepromPrvDeselect(); -} -void epdWaitRdy() { - epdBusyWait(TIMER_TICKS_PER_SECOND * 120); -} -void beginFullscreenImage() { - shortCommand(CMD_PARTIAL_OUT); - epdDrawDirection(false); - // shortCommand1(CMD_DATA_ENTRY_MODE, 3); - // setPosXY(0, 0); -} -void beginWriteFramebuffer(bool color) { - if (color == EPD_COLOR_RED) { - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM2); - } else { - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM1); - } - epdDeselect(); -} -void endWriteFramebuffer() { - commandEnd(); -} - -void loadRawBitmap(uint8_t* bmp, uint16_t x, uint16_t y, bool color) __reentrant { - // this function is very badly hurt by the switch to UC8151, taking up LOTS of valuable idata space. Only defining variables - // as static, or the function as reentrant (relegating variables to the stack) seemed to fix the idata issue. Fix me, or put me out of my misery... - - uint16_t xsize = bmp[0] / 8; - if (bmp[0] % 8) xsize++; - uint16_t ysize = bmp[1]; - uint16_t size = xsize * bmp[1]; - - // shortCommand1(CMD_DATA_ENTRY_MODE, 3); - - bmp += 2; - - uint16_t c = 0; - uint16_t curY = y; - while (1) { - if (c % xsize == 0) { - commandEnd(); - if (drawDirection) { - setWindowXY(x, x + xsize * 8, SCREEN_HEIGHT - curY - 1, SCREEN_HEIGHT - curY); - } else { - setWindowXY(x, x + xsize * 8, curY - 1, curY); - } - curY++; - if (color) { - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM2); - } else { - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM1); - } - } - epdSend(*(bmp++)); - c++; - if (!size--) break; - } - commandEnd(); - shortCommand(CMD_PARTIAL_OUT); -} -void printBarcode(const uint8_t* string, uint16_t x, uint16_t y) { - setWindowXY(x, x + 8, SCREEN_HEIGHT - y, SCREEN_HEIGHT); - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM1); - struct BarcodeInfo __xdata bci = { - .str = string, - }; - while (!barcodeIsDone(&bci)) { - if (barcodeNextBar(&bci)) { - epdSend(0xFF); - } else { - epdSend(0x00); - } - } - commandEnd(); - shortCommand(CMD_PARTIAL_OUT); -} -// stuff for printing text -static void pushXFontBytesToEPD(uint8_t byte1, uint8_t byte2) { - if (epdCharSize == 1) { - uint8_t offset = 7 - (fontCurXpos % 8); - for (uint8_t c = 0; c < 8; c++) { - if (byte2 & (1 << (7 - c))) rbuffer[c] |= (1 << offset); - } - for (uint8_t c = 0; c < 8; c++) { - if (byte1 & (1 << (7 - c))) rbuffer[8 + c] |= (1 << offset); - } - fontCurXpos++; - } else { - uint8_t offset = 6 - (fontCurXpos % 8); - // double font size - for (uint8_t c = 0; c < 8; c++) { - if (byte2 & (1 << (7 - c))) { - rbuffer[c * 2] |= (3 << offset); - rbuffer[(c * 2) + 1] |= (3 << offset); - } - } - for (uint8_t c = 0; c < 8; c++) { - if (byte1 & (1 << (7 - c))) { - rbuffer[(c * 2) + 16] |= (3 << offset); - rbuffer[(c * 2) + 17] |= (3 << offset); - } - } - fontCurXpos += 2; - } - if (fontCurXpos % 8 == 0) { - // next byte, flush current byte to EPD - for (uint8_t i = 0; i < (16 * epdCharSize); i++) { - epdSend(rbuffer[i]); - } - memset(rbuffer, 0, 32); - } -} -static void bufferByteShift(uint8_t byte) { - /* - rbuffer[0] = 0; // previous value - rbuffer[1] = y%8; // offset - rbuffer[2] = 0; // current byte counter; - rbuffer[3] = 1+(epdCharsize*2); - */ - - if (rbuffer[1] == 0) { - epdSend(byte); - } else { - uint8_t offset = rbuffer[1]; - rbuffer[0] |= (byte >> offset); - epdSend(rbuffer[0]); - // epdSend(byte); - rbuffer[0] = (byte << (8 - offset)); - rbuffer[2]++; - if (rbuffer[2] == rbuffer[3]) { - epdSend(rbuffer[0]); - rbuffer[0] = 0; - rbuffer[2] = 0; - } - } -} -static void pushYFontBytesToEPD(uint8_t byte1, uint8_t byte2) { - if (epdCharSize == 2) { - for (uint8_t j = 0; j < 2; j++) { - uint8_t c = 0; - for (uint8_t i = 7; i != 255; i--) { - if (byte1 & (1 << i)) c |= (0x03 << ((i % 4) * 2)); - if ((i % 4) == 0) { - bufferByteShift(c); - c = 0; - } - } - for (uint8_t i = 7; i != 255; i--) { - if (byte2 & (1 << i)) c |= (0x03 << ((i % 4) * 2)); - if ((i % 4) == 0) { - bufferByteShift(c); - c = 0; - } - } - } - } else { - bufferByteShift(byte1); - bufferByteShift(byte2); - } -} -void writeCharEPD(uint8_t c) { - // Writes a single character to the framebuffer - bool empty = true; - for (uint8_t i = 0; i < 20; i++) { - if (font[c][i]) empty = false; - } - if (empty) { - for (uint8_t i = 0; i < 8; i++) { - if (directionY) { - pushYFontBytesToEPD(0x00, 0x00); - } else { - pushXFontBytesToEPD(0x00, 0x00); - } - } - return; - } - - uint8_t begin = 0; - while (font[c][begin] == 0x00 && font[c][begin + 1] == 0x00) { - begin += 2; - } - - uint8_t end = 20; - while (font[c][end - 1] == 0x00 && font[c][end - 2] == 0x00) { - end -= 2; - } - - for (uint8_t pos = begin; pos < end; pos += 2) { - if (directionY) { - pushYFontBytesToEPD(font[c][pos + 1], font[c][pos]); - } else { - pushXFontBytesToEPD(font[c][pos], font[c][pos + 1]); - } - } - - // spacing between characters - if (directionY) { - pushYFontBytesToEPD(0x00, 0x00); - } else { - pushXFontBytesToEPD(0x00, 0x00); - } -} - -// Print text to the EPD. Origin is top-left -void epdPrintBegin(uint16_t x, uint16_t y, bool direction, bool fontsize, bool color) { - directionY = direction; - epdCharSize = 1 + fontsize; - if (directionY) { - uint8_t extra = 0; - - // provisions for dealing with font in Y direction, byte-unaligned - if (x % 8) { - extra = 8; - rbuffer[0] = 0; // previous value - rbuffer[1] = x % 8; // offset - rbuffer[2] = 0; // current byte counter; - rbuffer[3] = (epdCharSize * 2); - } else { - rbuffer[1] = 0; - } - - // setWindowY(y, 1); - if (epdCharSize == 2) { - setWindowXY(x, x + 32 + extra, SCREEN_HEIGHT - y, SCREEN_HEIGHT); - // setPosXY(x, y); - } else { - setWindowXY(x, x + 16 + extra, SCREEN_HEIGHT - y, SCREEN_HEIGHT); - // setPosXY(x, y); - } - // shortCommand1(CMD_DATA_ENTRY_MODE, 1); // was 3 - } else { - if (epdCharSize == 2) { - x /= 2; - x *= 2; - setWindowXY(x, SCREEN_WIDTH, y, y + 32); - } else { - setWindowXY(x, SCREEN_WIDTH, y, y + 16); - } - // setPosXY(x, y); - fontCurXpos = x; - // setWindowXY(x, SCREEN_WIDTH); - // shortCommand1(CMD_DATA_ENTRY_MODE, 7); - memset(rbuffer, 0, 32); - } - - if (color) { - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM2); - } else { - commandBegin(CMD_DISPLAY_START_TRANSMISSION_DTM1); - } -} -void epdPrintEnd() { - if (!directionY && ((fontCurXpos % 8) != 0)) { - for (uint8_t i = 0; i < (16 * epdCharSize); i++) { - epdSend(rbuffer[i]); - } - } - commandEnd(); - shortCommand(CMD_PARTIAL_OUT); - epdDrawDirection(true); -} - -extern uint8_t __xdata blockXferBuffer[]; \ No newline at end of file diff --git a/zbs243_Tag_FW/board/uc8151.h b/zbs243_Tag_FW/board/uc8151.h deleted file mode 100644 index 0bf5de3b..00000000 --- a/zbs243_Tag_FW/board/uc8151.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _JSCREEN_H_ -#define _JSCREEN_H_ - -#include -#include - -#define epdSend spiTXByte -#define EPD_DIRECTION_X false -#define EPD_DIRECTION_Y true -#define EPD_SIZE_SINGLE false -#define EPD_SIZE_DOUBLE true -#define EPD_COLOR_RED true -#define EPD_COLOR_BLACK false -#define EPD_LOAD_CUSTOM_LUT true -#define EPD_LOAD_OTP_LUT false -#define EPD_MODE_NORMAL 0x00 -#define EPD_MODE_INVERT 0x08 -#define EPD_MODE_IGNORE 0x04 - -#define EPD_LUT_DEFAULT 0 -#define EPD_LUT_NO_REPEATS 1 -#define EPD_LUT_FAST_NO_REDS 2 -#define EPD_LUT_FAST 3 - - -#define epdSelect() \ - do { \ - P1_7 = 0; \ - } while (0) - -#define epdDeselect() \ - do { \ - P1_7 = 1; \ - } while (0) - -void epdSetup(); -void epdEnterSleep(); -uint16_t epdGetBattery(); -void epdConfigGPIO(bool setup); - -extern bool __xdata epdGPIOActive; - -void setColorMode(uint8_t red, uint8_t bw) ; -void clearWindow(bool color); -void clearScreen(); -void draw(); -void drawNoWait(); -void drawWithSleep(); -void epdWaitRdy(); - -void beginFullscreenImage(); -void beginWriteFramebuffer(bool color); -void endWriteFramebuffer(); -void loadRawBitmap(uint8_t* bmp, uint16_t x, uint16_t y, bool color) __reentrant; -void printBarcode(const uint8_t* string, uint16_t x, uint16_t y); - -void selectLUT(uint8_t lut); - -void ByteDecode(uint8_t byte); - -void epdPrintBegin(uint16_t x, uint16_t y, bool direction, bool fontsize, bool red); -void epdPrintEnd(); - -void beginFullscreenImage(); -void beginWriteFramebuffer(bool color); - -void lutTest(); - -void epdTest(); - -// for printf.c -void writeCharEPD(uint8_t c); - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs154v033/board.c b/zbs243_Tag_FW/board/zbs154v033/board.c deleted file mode 100644 index 15cf44cc..00000000 --- a/zbs243_Tag_FW/board/zbs154v033/board.c +++ /dev/null @@ -1 +0,0 @@ -#include "../boardZBS29common.c" diff --git a/zbs243_Tag_FW/board/zbs154v033/board.h b/zbs243_Tag_FW/board/zbs154v033/board.h deleted file mode 100644 index a31ce546..00000000 --- a/zbs243_Tag_FW/board/zbs154v033/board.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _BOARD_H_ -#define _BOARD_H_ - -#include -#include "proto.h" -#include "spi.h" - -#define eepromByte spiByte -#define eepromPrvSelect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 0; __asm__("nop\nnop\nnop\n"); } while(0) -#define eepromPrvDeselect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 1; __asm__("nop\nnop\nnop\n"); } while(0) - -//eeprom map -#define EEPROM_SETTINGS_AREA_START (0x01000UL) -#define EEPROM_SETTINGS_AREA_LEN (0x03000UL) -#define EEPROM_UPDATA_AREA_START (0x04000UL) -#define EEPROM_UPDATE_AREA_LEN (0x10000UL) -#define EEPROM_IMG_START (0x14000UL) -#define EEPROM_IMG_EACH (0x02000UL) -//till end of eeprom really. do not put anything after - it will be erased at pairing time!!! -#define EEPROM_PROGRESS_BYTES (128) - -//hw types -#define HW_TYPE SOLUM_154_033 - -#include "../boardCommon.h" - - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs154v033/make.mk b/zbs243_Tag_FW/board/zbs154v033/make.mk deleted file mode 100644 index d1083181..00000000 --- a/zbs243_Tag_FW/board/zbs154v033/make.mk +++ /dev/null @@ -1,7 +0,0 @@ -FLAGS += --code-size 0xfc00 - -SOC = zbs243 - -BARCODE = datamatrix - -# 0xfc00 and not 0x10000 to leave some space for update header and updater in flash \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs154v033/screen.c b/zbs243_Tag_FW/board/zbs154v033/screen.c deleted file mode 100644 index 9494884c..00000000 --- a/zbs243_Tag_FW/board/zbs154v033/screen.c +++ /dev/null @@ -1 +0,0 @@ -#include "../ssd1619.c" diff --git a/zbs243_Tag_FW/board/zbs154v033/screen.h b/zbs243_Tag_FW/board/zbs154v033/screen.h deleted file mode 100644 index a08dfdd8..00000000 --- a/zbs243_Tag_FW/board/zbs154v033/screen.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _SCREEN_H_ -#define _SCREEN_H_ - -#include -#include -#include "../ssd1619.h" - -#define SCREEN_WIDTH 152 -#define SCREEN_HEIGHT 152 - -#define SCREEN_NUM_GREYS 5 -#define SCREEN_FIRST_GREY_IDX 0 -#define SCREEN_EXTRA_COLOR_INDEX 5 //set to negative if nonexistent -#define SCREEN_TX_BPP 4 //in transit - -#define SCREEN_WIDTH_MM 27 -#define SCREEN_HEIGHT_MM 27 - -#define SCREEN_BYTE_FILL 0x44 //white - -#define SCREEN_TYPE TagScreenEink_BWR_6colors - -#define SCREEN_DATA_PASSES 2 - - -#endif diff --git a/zbs243_Tag_FW/board/zbs29_uc8151/board.c b/zbs243_Tag_FW/board/zbs29_uc8151/board.c deleted file mode 100644 index 15cf44cc..00000000 --- a/zbs243_Tag_FW/board/zbs29_uc8151/board.c +++ /dev/null @@ -1 +0,0 @@ -#include "../boardZBS29common.c" diff --git a/zbs243_Tag_FW/board/zbs29_uc8151/board.h b/zbs243_Tag_FW/board/zbs29_uc8151/board.h deleted file mode 100644 index 0a242e14..00000000 --- a/zbs243_Tag_FW/board/zbs29_uc8151/board.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _BOARD_H_ -#define _BOARD_H_ - -#include -#include "proto.h" -#include "spi.h" - -#define eepromByte spiByte -#define eepromPrvSelect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 0; __asm__("nop\nnop\nnop\n"); } while(0) -#define eepromPrvDeselect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 1; __asm__("nop\nnop\nnop\n"); } while(0) - -//eeprom map -#define EEPROM_SETTINGS_AREA_START (0x01000UL) -#define EEPROM_SETTINGS_AREA_LEN (0x03000UL) -#define EEPROM_UPDATA_AREA_START (0x04000UL) -#define EEPROM_UPDATE_AREA_LEN (0x10000UL) -#define EEPROM_IMG_START (0x14000UL) -#define EEPROM_IMG_EACH (0x04000UL) -//till end of eeprom really. do not put anything after - it will be erased at pairing time!!! -#define EEPROM_PROGRESS_BYTES (128) - -//hw types -#define HW_TYPE SOLUM_29_033 - -#include "../boardCommon.h" - - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs29_uc8151/make.mk b/zbs243_Tag_FW/board/zbs29_uc8151/make.mk deleted file mode 100644 index d1083181..00000000 --- a/zbs243_Tag_FW/board/zbs29_uc8151/make.mk +++ /dev/null @@ -1,7 +0,0 @@ -FLAGS += --code-size 0xfc00 - -SOC = zbs243 - -BARCODE = datamatrix - -# 0xfc00 and not 0x10000 to leave some space for update header and updater in flash \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs29_uc8151/screen.c b/zbs243_Tag_FW/board/zbs29_uc8151/screen.c deleted file mode 100644 index 9a7aabff..00000000 --- a/zbs243_Tag_FW/board/zbs29_uc8151/screen.c +++ /dev/null @@ -1 +0,0 @@ -#include "../uc8151.c" diff --git a/zbs243_Tag_FW/board/zbs29_uc8151/screen.h b/zbs243_Tag_FW/board/zbs29_uc8151/screen.h deleted file mode 100644 index 7a331014..00000000 --- a/zbs243_Tag_FW/board/zbs29_uc8151/screen.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _SCREEN_H_ -#define _SCREEN_H_ - -#include -#include -#include "../uc8151.h" - -#define SCREEN_WIDTH 128 -#define SCREEN_HEIGHT 296 - -#define SCREEN_NUM_GREYS 5 -#define SCREEN_FIRST_GREY_IDX 0 -#define SCREEN_EXTRA_COLOR_INDEX 5 //set to negative if nonexistent -#define SCREEN_TX_BPP 4 //in transit - -#define SCREEN_WIDTH_MM 29 -#define SCREEN_HEIGHT_MM 67 - -#define SCREEN_BYTE_FILL 0x44 //white - -#define SCREEN_TYPE TagScreenEink_BWR_6colors - -#define SCREEN_DATA_PASSES 2 - -#endif diff --git a/zbs243_Tag_FW/board/zbs29v033/board.c b/zbs243_Tag_FW/board/zbs29v033/board.c deleted file mode 100644 index 15cf44cc..00000000 --- a/zbs243_Tag_FW/board/zbs29v033/board.c +++ /dev/null @@ -1 +0,0 @@ -#include "../boardZBS29common.c" diff --git a/zbs243_Tag_FW/board/zbs29v033/board.h b/zbs243_Tag_FW/board/zbs29v033/board.h deleted file mode 100644 index 0a242e14..00000000 --- a/zbs243_Tag_FW/board/zbs29v033/board.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _BOARD_H_ -#define _BOARD_H_ - -#include -#include "proto.h" -#include "spi.h" - -#define eepromByte spiByte -#define eepromPrvSelect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 0; __asm__("nop\nnop\nnop\n"); } while(0) -#define eepromPrvDeselect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 1; __asm__("nop\nnop\nnop\n"); } while(0) - -//eeprom map -#define EEPROM_SETTINGS_AREA_START (0x01000UL) -#define EEPROM_SETTINGS_AREA_LEN (0x03000UL) -#define EEPROM_UPDATA_AREA_START (0x04000UL) -#define EEPROM_UPDATE_AREA_LEN (0x10000UL) -#define EEPROM_IMG_START (0x14000UL) -#define EEPROM_IMG_EACH (0x04000UL) -//till end of eeprom really. do not put anything after - it will be erased at pairing time!!! -#define EEPROM_PROGRESS_BYTES (128) - -//hw types -#define HW_TYPE SOLUM_29_033 - -#include "../boardCommon.h" - - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs29v033/make.mk b/zbs243_Tag_FW/board/zbs29v033/make.mk deleted file mode 100644 index d1083181..00000000 --- a/zbs243_Tag_FW/board/zbs29v033/make.mk +++ /dev/null @@ -1,7 +0,0 @@ -FLAGS += --code-size 0xfc00 - -SOC = zbs243 - -BARCODE = datamatrix - -# 0xfc00 and not 0x10000 to leave some space for update header and updater in flash \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs29v033/screen.c b/zbs243_Tag_FW/board/zbs29v033/screen.c deleted file mode 100644 index 9494884c..00000000 --- a/zbs243_Tag_FW/board/zbs29v033/screen.c +++ /dev/null @@ -1 +0,0 @@ -#include "../ssd1619.c" diff --git a/zbs243_Tag_FW/board/zbs29v033/screen.h b/zbs243_Tag_FW/board/zbs29v033/screen.h deleted file mode 100644 index 6569cd44..00000000 --- a/zbs243_Tag_FW/board/zbs29v033/screen.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _SCREEN_H_ -#define _SCREEN_H_ - -#include -#include -#include "../ssd1619.h" - - -#define SCREEN_WIDTH 128 -#define SCREEN_HEIGHT 296 - -#define SCREEN_NUM_GREYS 5 -#define SCREEN_FIRST_GREY_IDX 0 -#define SCREEN_EXTRA_COLOR_INDEX 5 //set to negative if nonexistent -#define SCREEN_TX_BPP 4 //in transit - -#define SCREEN_WIDTH_MM 29 -#define SCREEN_HEIGHT_MM 67 - -#define SCREEN_BYTE_FILL 0x44 //white - -#define SCREEN_TYPE TagScreenEink_BWR_6colors - -#define SCREEN_DATA_PASSES 2 - -#endif diff --git a/zbs243_Tag_FW/board/zbs42v033/board.c b/zbs243_Tag_FW/board/zbs42v033/board.c deleted file mode 100644 index 15cf44cc..00000000 --- a/zbs243_Tag_FW/board/zbs42v033/board.c +++ /dev/null @@ -1 +0,0 @@ -#include "../boardZBS29common.c" diff --git a/zbs243_Tag_FW/board/zbs42v033/board.h b/zbs243_Tag_FW/board/zbs42v033/board.h deleted file mode 100644 index fc2aec98..00000000 --- a/zbs243_Tag_FW/board/zbs42v033/board.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _BOARD_H_ -#define _BOARD_H_ - -#include -#include "proto.h" -#include "spi.h" - -#define eepromByte spiByte -#define eepromPrvSelect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 0; __asm__("nop\nnop\nnop\n"); } while(0) -#define eepromPrvDeselect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 1; __asm__("nop\nnop\nnop\n"); } while(0) - -//eeprom map -#define EEPROM_SETTINGS_AREA_START (0x01000UL) -#define EEPROM_SETTINGS_AREA_LEN (0x03000UL) -#define EEPROM_UPDATA_AREA_START (0x04000UL) -#define EEPROM_UPDATE_AREA_LEN (0x10000UL) -#define EEPROM_IMG_START (0x14000UL) -#define EEPROM_IMG_EACH (0x08000UL) -//till end of eeprom really. do not put anything after - it will be erased at pairing time!!! -#define EEPROM_PROGRESS_BYTES (128) - -//hw types -#define HW_TYPE SOLUM_42_033 - -#include "../boardCommon.h" - - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs42v033/make.mk b/zbs243_Tag_FW/board/zbs42v033/make.mk deleted file mode 100644 index d1083181..00000000 --- a/zbs243_Tag_FW/board/zbs42v033/make.mk +++ /dev/null @@ -1,7 +0,0 @@ -FLAGS += --code-size 0xfc00 - -SOC = zbs243 - -BARCODE = datamatrix - -# 0xfc00 and not 0x10000 to leave some space for update header and updater in flash \ No newline at end of file diff --git a/zbs243_Tag_FW/board/zbs42v033/screen.c b/zbs243_Tag_FW/board/zbs42v033/screen.c deleted file mode 100644 index 9494884c..00000000 --- a/zbs243_Tag_FW/board/zbs42v033/screen.c +++ /dev/null @@ -1 +0,0 @@ -#include "../ssd1619.c" diff --git a/zbs243_Tag_FW/board/zbs42v033/screen.h b/zbs243_Tag_FW/board/zbs42v033/screen.h deleted file mode 100644 index 8b8c147a..00000000 --- a/zbs243_Tag_FW/board/zbs42v033/screen.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _SCREEN_H_ -#define _SCREEN_H_ - -#include -#include -#include "../ssd1619.h" - - -#define SCREEN_WIDTH 400 -#define SCREEN_HEIGHT 300 - -#define SCREEN_NUM_GREYS 5 -#define SCREEN_FIRST_GREY_IDX 0 -#define SCREEN_EXTRA_COLOR_INDEX 5 //set to negative if nonexistent -#define SCREEN_TX_BPP 4 //in transit - -#define SCREEN_WIDTH_MM 84 -#define SCREEN_HEIGHT_MM 63 - -#define SCREEN_BYTE_FILL 0x44 //white - -#define SCREEN_TYPE TagScreenEink_BWR_6colors - -#define SCREEN_DATA_PASSES 2 - - -#endif diff --git a/zbs243_Tag_FW/buildfw.sh b/zbs243_Tag_FW/buildfw.sh old mode 100644 new mode 100755 diff --git a/zbs243_Tag_FW/cpu b/zbs243_Tag_FW/cpu new file mode 120000 index 00000000..b9d44d5c --- /dev/null +++ b/zbs243_Tag_FW/cpu @@ -0,0 +1 @@ +../zbs243_shared/cpu \ No newline at end of file diff --git a/zbs243_Tag_FW/cpu/8051/asmUtil.c b/zbs243_Tag_FW/cpu/8051/asmUtil.c deleted file mode 100644 index 37e7502e..00000000 --- a/zbs243_Tag_FW/cpu/8051/asmUtil.c +++ /dev/null @@ -1,1502 +0,0 @@ -#include "asmUtil.h" -#include "cpu.h" - - -#pragma callee_saves mathPrvU8bitswap -uint16_t mathPrvU16from2xU8(uint8_t hi, uint8_t lo) __reentrant __naked -{ - __asm__( - " mov DPH, DPL \n" - " pop B \n" - " pop A \n" - " pop DPL \n" - " push DPL \n" - " push A \n" - " push B \n" - " ret \n" - ); - (void)hi; - (void)lo; -} - -//a is hi -uint32_t mathPrvU32from4xU8(uint8_t hi, uint8_t midhi, uint8_t midlo, uint8_t lo) __reentrant __naked -{ - __asm__( - " push _R0 \n" - " mov A, #-5 \n" //point to first pushed arg (last param - lo) - " add A, sp \n" - " mov R0, A \n" - " mov A, DPL \n" - " mov DPL, @R0 \n" - " inc R0 \n" - " mov DPH, @R0 \n" - " inc R0 \n" - " mov B, @R0 \n" - " pop _R0 \n" - " ret \n" - ); - (void)hi; - (void)midhi; - (void)midlo; - (void)lo; -} - - -#pragma callee_saves mathPrvU8bitswap -uint8_t mathPrvU8bitswap(uint8_t val) __reentrant __naked -{ - __asm__( - " mov B, #8 \n" - "00003$: \n" - " xch A, DPL \n" - " rrc A \n" - " xch A, DPL \n" - " rlc A \n" - " djnz B, 00003$ \n" - " xch A, DPL \n" - " ret \n" - ); - (void)val; -} - - -#pragma callee_saves mathPrvI16Asr1 -int16_t mathPrvI16Asr1(int16_t val) __reentrant __naked -{ - __asm__( - " mov A, DPH \n" - " mov C, A.7 \n" - " rrc A \n" - " mov DPH, A \n" - " mov A, DPL \n" - " rrc A \n" - " mov DPL, A \n" - " ret \n" - ); - (void)val; -} - -#pragma callee_saves mathPrvMul8x8 -uint16_t mathPrvMul8x8(uint8_t a, uint8_t b) __reentrant __naked -{ - //return expected in DPTR, first param is in DPL, second on stack - __asm__( - //grab param into B - " pop DPH \n\t" - " pop A \n\t" - " pop B \n\t" - " push B \n\t" - " push A \n\t" - " push DPH \n\t" - - //second param into A - " mov A, DPL \n\t" - - //do the deed - " mul AB \n\t" - - //return results - " mov DPL, A \n\t" - " mov DPH, B \n\t" - - " ret \n\t" - ); - (void)a; - (void)b; -} - -#pragma callee_saves mathPrvMul16x8 -uint32_t mathPrvMul16x8(uint16_t a, uint8_t b) __reentrant __naked -{ - //return expected in A:B:DPTR, first param is in DPTR, second on stack - __asm__( - //save r0 - " push _R0 \n\t" - - //get 2nd param into a & r0 - " mov A, SP \n\t" - " add A, #-0x03 \n\t" - " mov R0, A \n\t" - " mov A, @R0 \n\t" - " mov R0, A \n\t" - - //get first param.lo into B - " mov B, DPL \n\t" - - //mul - " mul AB \n\t" - - //lower result byte is ready! - " mov DPL, A \n\t" - - //save upper in r0, get 2nd param into A - " mov A, R0 \n\t" - " mov R0, B \n\t" - - //get first param.hi into B - " mov B, DPH \n\t" - - //mul - " mul AB \n\t" - - //add in the carry from before - " add A, R0 \n\t" - - //produce middle byte - " mov DPH, A \n\t" - - //calc high byte - " mov A, B \n\t" - " addc A, #0 \n\t" - " mov B, A \n\t" - - //set high high byte to 0 (guaranteed) - " clr A \n\t" - - //get out - " pop _R0 \n\t" - " ret \n\t" - ); - (void)a; - (void)b; -} - -#pragma callee_saves mathPrvMul32x8 -uint32_t mathPrvMul32x8(uint32_t a, uint8_t b) __reentrant __naked -{ - //return expected in A:B:DPTR, first param is in DPTR, second on stack - __asm__( - //save r0 - " push _R0 \n\t" - " push _R1 \n\t" - - //save A and B - " push A \n" - " push B \n" - - //get second param into R0 - " mov A, #-6 \n" - " add A, sp \n" - " mov R0, A \n" - " mov _R0, @R0 \n" - - //low - " mov A, DPL \n" - " mov B, R0 \n" - " mul AB \n" - " mov DPL, A \n" - " mov R1, B \n" - - //mid.lo - " mov A, DPH \n" - " mov B, R0 \n" - " mul AB \n" - " add A, R1 \n" - " mov DPH, A \n" - " mov A, B \n" - " addc A, #0 \n" - " mov R1, A \n" - - //mid.hi - " pop A \n" - " mov B, R0 \n" - " mul AB \n" - " add A, R1 \n" - " xch A, B \n" - " addc A, #0 \n" - " mov R1, A \n" - - //hi - " pop A \n" - " push B \n" - " mov B, R0 \n" - " mul AB \n" - " add A, R1 \n" - " pop B \n" - - //get out - " pop _R1 \n\t" - " pop _R0 \n\t" - " ret \n\t" - ); - (void)a; - (void)b; -} - -#pragma callee_saves mathPrvMul16x16 -uint32_t mathPrvMul16x16(uint16_t a, uint16_t b) __reentrant __naked -{ - //return expected in A:B:DPTR, first param is in DPTR, second on stack (low byte was pushed first) - __asm__( - //save r0,r1,r2 - " push _R0 \n\t" - " push _R1 \n\t" - " push _R2 \n\t" - - //get 2nd param into r1:r0 - " mov A, SP \n\t" - " add A, #-0x05 \n\t" - " mov R0, A \n\t" - " mov A, @R0 \n\t" - " mov R1, A \n\t" - " dec R0 \n\t" - " mov A, @R0 \n\t" - " mov R0, A \n\t" - - //mul low bytes, save low result byte - " mov B, DPL \n\t" - " mul AB \n\t" - " push A \n\t" - - //save high byte - " mov R2, B \n\t" - - //mul p2.lo * p1.hi. add in high from the low multiplication. we know this fits in 16 bits! - " mov A, DPH \n\t" - " mov B, R0 \n\t" - " mul AB \n\t" - " add A, R2 \n\t" - " mov R0, A \n\t" //save intermediate's lo in R0 - " mov A, B \n\t" - " addc A, #0 \n\t" - " mov R2, A \n\t" //save intermediate's hi in R2 - - //mul p2.hi * p1.lo, add in intermediate result - " mov A, R1 \n\t" - " mov B, DPL \n\t" - " mul AB \n\t" - " add A, R0 \n\t" //calc intermediate's lo - " push A \n\t" //push it - " mov A, B \n\t" - " addc A, R2 \n\t" - " mov R2, A \n\t" //calc intermediate's hi in R2 - " mov A, #0 \n\t" - " addc A, #0 \n\t" //calc high byte so far - " mov R0, A \n\t" //store in R0 - - //mul high bytes - " mov A, R1 \n\t" - " mov B, DPH \n\t" - " mul AB \n\t" - " add A, R2 \n\t" - " mov R2, A \n\t" //final value for intermediate's high - " mov A, B \n\t" - " addc A, R0 \n\t" //final high value is ready - - //produce the rest of the result bytes - " mov B, R2 \n\t" - " pop DPH \n\t" - " pop DPL \n\t" - - //return - " pop _R2 \n\t" - " pop _R1 \n\t" - " pop _R0 \n\t" - " ret \n\t" - ); - (void)a; - (void)b; -} - -//pushes R0..R2, gets second param into r1:r0 -#pragma callee_saves u64_start -static void u64_start(void) __reentrant __naked -{ - __asm__( - " pop A \n" //get ret addr - " pop B \n" //get ret addr - - " push _R0 \n" - " push _R1 \n" - " push _R2 \n" - - " push B \n" //re-push ret addr - " push A \n" - - " mov a, #0xf8 \n" // DPTR = pushed_arg - " add a, sp \n" - " mov R1, a \n" - " mov a, @R1 \n" - " mov R0, a \n" - " inc R1 \n" - " mov a, @R1 \n" - " mov R1, a \n" - - " ret \n" - ); -} - -//jump to this, do not call it -//does not clobber anything -#pragma callee_saves u64_end -static void u64_end(void) __reentrant __naked -{ - __asm__( - " pop _R2 \n" - " pop _R1 \n" - " pop _R0 \n" - " ret \n" - ); -} - -#pragma callee_saves mathPrvSwapDptrR1R0 -void mathPrvSwapDptrR1R0(void) __reentrant __naked -{ - __asm__( - " xch A, R1 \n\t" - " xch A, DPH \n\t" - " xch A, R1 \n\t" - " xch A, R0 \n\t" - " xch A, DPL \n\t" - " xch A, R0 \n\t" - " ret \n\t" - ); -} - -#pragma callee_saves u64_copy -void u64_copy(uint64_t __xdata *dst, const uint64_t __xdata *src) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx @dptr, a \n" - " inc dptr \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)dst; - (void)src; -} - -void u64_copyFromCode(uint64_t __xdata *dst, const uint64_t __code *src) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " clr a \n" - " movc a, @a+dptr \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx @dptr, a \n" - " inc dptr \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)dst; - (void)src; -} - -#pragma callee_saves u64_add -void u64_add(uint64_t __xdata *lhsP, const uint64_t __xdata *rhsP) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - " clr C \n" - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " mov _R2, a \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " addc a, R2 \n" - " movx @dptr, a \n" - " inc dptr \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)lhsP; - (void)rhsP; -} - -#pragma callee_saves u64_and -void u64_and(uint64_t __xdata *lhsP, const uint64_t __xdata *rhsP) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " mov _R2, a \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " anl a, R2 \n" - " movx @dptr, a \n" - " inc dptr \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)lhsP; - (void)rhsP; -} - -#pragma callee_saves u64_sub -void u64_sub(uint64_t __xdata *lhsP, const uint64_t __xdata *rhsP) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - " clr C \n" - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " mov _R2, a \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " subb a, R2 \n" - " movx @dptr, a \n" - " inc dptr \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)lhsP; - (void)rhsP; -} - -#pragma callee_saves u64_isLt -__bit u64_isLt(const uint64_t __xdata *lhsP, const uint64_t __xdata *rhsP) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - " clr C \n" - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " mov _R2, a \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " subb a, R2 \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)lhsP; - (void)rhsP; -} - -#pragma callee_saves u64_isEq -__bit u64_isEq(const uint64_t __xdata *lhsP, const uint64_t __xdata *rhsP) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " mov _R2, a \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " xrl a, R2 \n" - " jnz 00004$ \n" - " djnz b, 00003$ \n" - - " setb C \n" - " ljmp _u64_end \n" - - "00004$: \n" - " clr C \n" - " ljmp _u64_end \n" - ); - (void)lhsP; - (void)rhsP; -} - -//c is set, A is what to add to each limb -#pragma callee_saves u64_incdec -static void u64_incdec(uint64_t __xdata *dst) __reentrant __naked -{ - __asm__( - " xch A, R0 \n" - " push A \n" - " mov b, #8 \n" //repeat 8 times: - "00003$: \n" - " movx a, @dptr \n" - " addc a, R0 \n" - " movx @dptr, a \n" - " inc dptr \n" - " djnz b, 00003$ \n" - " pop _R0 \n" - " ret \n" - ); - (void)dst; -} - -#pragma callee_saves u64_inc -void u64_inc(uint64_t __xdata *dst) __reentrant __naked -{ - __asm__( - " setb C \n" - " clr A \n" - " ljmp _u64_incdec \n" - ); - (void)dst; -} - -#pragma callee_saves u64_dec -void u64_dec(uint64_t __xdata *dst) __reentrant __naked -{ - __asm__( - " clr C \n" - " mov A, #0xFF \n" - " ljmp _u64_incdec \n" - ); - (void)dst; -} - - -#pragma callee_saves xMemSet -void xMemSet(void __xdata* mem, uint8_t val, uint16_t num) __reentrant __naked -{ - __asm__( - " push _R0 \n" - " push _R1 \n" - - " mov A, #-6 \n" - " add A, sp \n" - " mov R0, A \n" - " mov A, @R0 \n" //num.lo - " mov B, A \n" - " inc R0 \n" - " mov _R1, @R0 \n" //num.hi - " orl A, R1 \n" //zero check - " jz 00002$ \n" //num is R1:B - " inc R0 \n" - " mov _R0, @R0 \n" //val - "00003$: \n" - " mov A, R0 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " mov A, #0xff \n" - " add A, B \n" - " mov B, A \n" - " mov A, #0xff \n" - " addc A, R1 \n" - " mov _R1, A \n" - " orl A, B \n" - " jnz 00003$ \n" - "00002$: \n" - " pop _R1 \n" - " pop _R0 \n" - " ret \n" - ); - - (void)mem; - (void)val; - (void)num; -} - -#pragma callee_saves xMemEqual -__bit xMemEqual(const void __xdata* memA, const void __xdata* memB, uint8_t num) __reentrant __naked -{ - __asm__( - " push _R0 \n" - " push _R1 \n" - " push _R2 \n" - - " mov a, #-7 \n" - " add a, sp \n" - " mov R1, a \n" - " mov A, @R1 \n" - " setb C \n" //equal if len is zero - " jz 00004$ \n" - " mov B, A \n" - " inc R1 \n" - " mov _R0, @R1 \n" - " inc R1 \n" - " mov _R1, @R1 \n" - " clr C \n" - "00003$: \n" - " movx a, @dptr \n" - " mov _R2, a \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " xrl a, R2 \n" - " jnz 00004$ \n" - " djnz b, 00003$ \n" - " setb C \n" - "00004$: \n" - " pop _R2 \n" - " pop _R1 \n" - " pop _R0 \n" - " ret \n" - ); - - (void)memA; - (void)memB; - (void)num; -} - -#pragma callee_saves xMemCopy -void xMemCopy(void __xdata* dst, const void __xdata* src, uint16_t num) __reentrant __naked -{ - __asm__( - " push _R0 \n" - " push _R1 \n" - " push _R2 \n" - - " mov A, #-8 \n" - " add A, sp \n" - " mov R1, A \n" - " mov A, @R1 \n" - " mov B, A \n" - " inc R1 \n" - " mov _R2, @R1 \n" //R2:B is length - " orl A, R2 \n" - " jz 00004$ \n" //handle zero length - " inc R1 \n" - " mov _R0, @R1 \n" - " inc R1 \n" - " mov _R1, @R1 \n" //R1:R0 is src - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " mov A, #0xff \n" - " add A, B \n" - " mov B, A \n" - " mov A, #0xff \n" - " addc A, R2 \n" - " mov _R2, A \n" - " orl A, B \n" - " jnz 00003$ \n" - "00004$: \n" - " pop _R2 \n" - " pop _R1 \n" - " pop _R0 \n" - " ret \n" - ); - - (void)dst; - (void)src; - (void)num; -} - -#pragma callee_saves xMemCopyShort -void xMemCopyShort(void __xdata* dst, const void __xdata* src, uint8_t num) __reentrant __naked -{ - __asm__( - " push _R0 \n" - " push _R1 \n" - " push _R2 \n" - - " mov a, #-7 \n" - " add a, sp \n" - " mov R1, a \n" - " mov A, @R1 \n" - " jz 00004$ \n" - " mov B, A \n" - " inc R1 \n" - " mov _R0, @R1 \n" - " inc R1 \n" - " mov _R1, @R1 \n" - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx @dptr, a \n" - " inc dptr \n" - " djnz b, 00003$ \n" - "00004$: \n" - " pop _R2 \n" - " pop _R1 \n" - " pop _R0 \n" - " ret \n" - ); - - (void)dst; - (void)src; - (void)num; -} - -#pragma callee_saves xStrLen -uint16_t xStrLen(const char __xdata *str) __reentrant __naked -{ - __asm__( - " push DPH \n" - " push DPL \n" - "00003$: \n" - " movx a, @dptr \n" - " jz 00002$ \n" - " inc dptr \n" - " sjmp 00003$ \n" - "00002$: \n" - " clr C \n" - " mov A, DPL \n" - " pop B \n" - " subb A, B \n" - " mov DPL, A \n" - " mov A, DPH \n" - " pop B \n" - " subb A, B \n" - " mov DPH, A \n" - " ret \n" - ); - - (void)str; -} - -#pragma callee_saves static mathPrvDivMod32x16 -static uint32_t mathPrvDivMod32x16(uint32_t num, uint16_t denom) __reentrant __naked -{ - //PSW.5 determines if to produce quotient (0) or remainder(1) - - __asm__( - " push _R3 \n" - " push _R2 \n" - " push _R1 \n" - " push _R0 \n" - " push A \n" - " push B \n" - " push DPH \n" - " push DPL \n" - " mov R1, sp \n" //R1: point to bottom byte of numerator - - //get denom -> B:R0 - " mov A, #-10 \n" - " add A, sp \n" - " mov R0, A \n" //R0 = &denom.hi - " mov B, @R0 \n" //B = denom.hi - " dec R0 \n" - " mov _R0, @R0 \n" //R0 = denom.lo - - //shift it off (in B:R0), record how many iters we'll need (in DPL), generate proper top 8 bits for result mask (in R3:R2) - " mov _R2, #1 \n" - " mov _R3, #0 \n" - " mov DPL, #17 \n" - "00002$: \n" - " mov C, B.7 \n" - " jc 00003$ \n" - - " clr C \n" - " mov A, R0 \n" - " rlc A \n" - " mov R0, A \n" - " mov A, B \n" - " rlc A \n" - " mov B, A \n" - - " clr C \n" - " mov A, R2 \n" - " rlc A \n" - " mov R2, A \n" - " mov A, R3 \n" - " rlc A \n" - " mov R3, A \n" - - " inc DPL \n" - " sjmp 00002$ \n" - "00003$: \n" - - " clr A \n" - - //push result_mask to stack - " push _R3 \n" - " push _R2 \n" - " push A \n" - " push A \n" - " mov R2, sp \n" //R2: point to bottom byte of result_mask - - //push denom.shifted to stack - " push B \n" - " push _R0 \n" - " push A \n" - " push A \n" - " mov R0, sp \n" //R0: point to bottom byte of denom.shifted - - //push result to stack - " push A \n" - " push A \n" - " push A \n" - " push A \n" - " mov R3, sp \n" //R3: point to bottom byte of result - - //loop-divide - "00088$: \n" - - // check if denom.shifted >= num - " push _R0 \n" - " push _R1 \n" - " clr C \n" - " mov DPH, #4 \n" - "00001$: \n" - " mov B, @R0 \n" - " dec R0 \n" - " mov A, @R1 \n" - " dec R1 \n" - " subb A, B \n" - " djnz DPH, 00001$ \n" - " pop _R1 \n" - " pop _R0 \n" - " jc 00099$ \n" //no? skip this round - - //subtract - " push _R0 \n" - " push _R1 \n" - " clr C \n" - " mov DPH, #4 \n" - "00004$: \n" - " mov B, @R0 \n" - " dec R0 \n" - " mov A, @R1 \n" - " subb A, B \n" - " mov @R1, A \n" - " dec R1 \n" - " djnz DPH, 00004$ \n" - //keep r0 & r1 pushed - - //set bit in result - //r0 & r1 still pushed - " mov _R0, _R2 \n" - " mov _R1, _R3 \n" - " mov DPH, #4 \n" - "00005$: \n" - " mov B, @R0 \n" - " dec R0 \n" - " mov A, @R1 \n" - " orl A, B \n" - " mov @R1, A \n" - " dec R1 \n" - " djnz DPH, 00005$ \n" - " pop _R1 \n" - " pop _R0 \n" - - //set up next iteration - "00099$: \n" - - // shift denom right one (pointer ends up where needed) - " mov A, #0xfc \n" - " add A, R0 \n" - " mov R0, A \n" - " clr C \n" - " mov DPH, #4 \n" - "00006$: \n" - " inc R0 \n" - " mov A, @R0 \n" - " rrc A \n" - " mov @R0, A \n" - " djnz DPH, 00006$ \n" - - // shift result mask right one - " push _R0 \n" - " mov A, #0xfc \n" - " add A, R2 \n" - " mov R0, A \n" - " clr C \n" - " mov DPH, #4 \n" - "00007$: \n" - " inc R0 \n" - " mov A, @R0 \n" - " rrc A \n" - " mov @R0, A \n" - " djnz DPH, 00007$ \n" - " pop _R0 \n" - - //check on loop limit - " djnz DPL, 00088$ \n" - - //we're done. undo the terrible things we've done to the stack and get the result - - //quotient return? - " jb PSW.5, 00009$ \n" - //return quotient - " pop DPL \n" - " pop DPH \n" - " pop B \n" - " pop _R0 \n" - "00009$: \n" - - //now clear up the rest - " mov A, #-12 \n" - " add A, sp \n" - " mov sp, A \n" - - //remainder return? - " jnb PSW.5, 00010$ \n" - //return quotient - " pop DPL \n" - " pop DPH \n" - " pop B \n" - " pop _R0 \n" - "00010$: \n" - - " mov A, R0 \n" - - //pop off regs - " pop _R0 \n" - " pop _R1 \n" - " pop _R2 \n" - " pop _R3 \n" - - " ret \n" - - ); - - (void)num; - (void)denom; -} - -#pragma callee_saves static mathPrvDiv32x16 -uint32_t mathPrvDiv32x16(uint32_t num, uint16_t denom) __reentrant __naked -{ - __asm__( - " clr PSW.5 \n" - " ljmp _mathPrvDivMod32x16 \n" - ); - - (void)num; - (void)denom; -} - -#pragma callee_saves static mathPrvDiv32x16 -uint16_t mathPrvMod32x16(uint32_t num, uint16_t denom) __reentrant __naked -{ - __asm__( - " setb PSW.5 \n" - " ljmp _mathPrvDivMod32x16 \n" - ); - - (void)num; - (void)denom; -} - -#pragma callee_saves mathPrvDiv32x8 -uint32_t mathPrvDiv32x8(uint32_t num, uint8_t denom) __reentrant __naked -{ - __asm__( - " push _R3 \n" - " push _R2 \n" - " push _R1 \n" - " push _R0 \n" - " push A \n" - " push B \n" - " push DPH \n" - " push DPL \n" - " mov R1, sp \n" //R1: point to bottom byte of numerator - - //get denom -> B - " mov A, #0xf6 \n" - " add A, sp \n" - " mov R0, A \n" - " mov B, @R0 \n" - - //shift it off (in B), record how many iters we'll need (in DPL), generate proper top 8 bits for result mask (in A) - " mov A, #1 \n" - " mov DPL, #25 \n" - "00002$: \n" - " mov C, B.7 \n" - " jc 00003$ \n" - " rl A \n" - " xch A, B \n" - " rl A \n" - " xch A, B \n" - " inc DPL \n" - " sjmp 00002$ \n" - "00003$: \n" - - //push result_mask to stack - " push A \n" - " clr A \n" - " push A \n" - " push A \n" - " push A \n" - " mov R2, sp \n" //R2: point to bottom byte of result_mask - - //push denom.shifted to stack - " push B \n" - " push A \n" - " push A \n" - " push A \n" - " mov R0, sp \n" //R0: point to bottom byte of denom.shifted - - //push result to stack - " push A \n" - " push A \n" - " push A \n" - " push A \n" - " mov R3, sp \n" //R3: point to bottom byte of result - - //loop-divide - "00088$: \n" - - // check if denom.shifted >= num - " push _R0 \n" - " push _R1 \n" - " clr C \n" - " mov DPH, #4 \n" - "00001$: \n" - " mov B, @R0 \n" - " dec R0 \n" - " mov A, @R1 \n" - " dec R1 \n" - " subb A, B \n" - " djnz DPH, 00001$ \n" - " pop _R1 \n" - " pop _R0 \n" - " jc 00099$ \n" //no? skip this round - - //subtract - " push _R0 \n" - " push _R1 \n" - " clr C \n" - " mov DPH, #4 \n" - "00004$: \n" - " mov B, @R0 \n" - " dec R0 \n" - " mov A, @R1 \n" - " subb A, B \n" - " mov @R1, A \n" - " dec R1 \n" - " djnz DPH, 00004$ \n" - //keep r0 & r1 pushed - - //set bit in result - //r0 & r1 still pushed - " mov _R0, _R2 \n" - " mov _R1, _R3 \n" - " mov DPH, #4 \n" - "00005$: \n" - " mov B, @R0 \n" - " dec R0 \n" - " mov A, @R1 \n" - " orl A, B \n" - " mov @R1, A \n" - " dec R1 \n" - " djnz DPH, 00005$ \n" - " pop _R1 \n" - " pop _R0 \n" - - //set up next iteration - "00099$: \n" - - // shift denom right one (pointer ends up where needed) - " mov A, #0xfc \n" - " add A, R0 \n" - " mov R0, A \n" - " clr C \n" - " mov DPH, #4 \n" - "00006$: \n" - " inc R0 \n" - " mov A, @R0 \n" - " rrc A \n" - " mov @R0, A \n" - " djnz DPH, 00006$ \n" - - // shift result mask right one - " push _R0 \n" - " mov A, #0xfc \n" - " add A, R2 \n" - " mov R0, A \n" - " clr C \n" - " mov DPH, #4 \n" - "00007$: \n" - " inc R0 \n" - " mov A, @R0 \n" - " rrc A \n" - " mov @R0, A \n" - " djnz DPH, 00007$ \n" - " pop _R0 \n" - - //check on loop limit - " djnz DPL, 00088$ \n" - - //we're done. undo the terrible things we've done to the stack - - //first, get the result - " pop DPL \n" - " pop DPH \n" - " pop B \n" - " pop _R0 \n" - - //now clear up the rest - " mov A, #-12 \n" - " add A, sp \n" - " mov sp, A \n" - - " mov A, R0 \n" - - //pop off regs - " pop _R0 \n" - " pop _R1 \n" - " pop _R2 \n" - " pop _R3 \n" - - " ret \n" - ); - - (void)num; - (void)denom; -} - -#pragma callee_saves mathPrvDivMod16x8 -static uint16_t mathPrvDivMod16x8(uint16_t num, uint8_t denom) __reentrant __naked -{ - __asm__( - " push _R6 \n" - " push _R5 \n" - " push _R4 \n" - " push _R3 \n" - " push _R2 \n" - " push _R1 \n" - " push _R0 \n" - - //get denom -> B - " mov A, #-9 \n" - " add A, sp \n" - " mov R0, A \n" - " mov B, @R0 \n" - - //shift it off (in B), record how many iters we'll need (in R4), generate proper top 8 bits for result mask (in A) - " mov A, #1 \n" - " mov R4, #9 \n" - "00002$: \n" - " mov C, B.7 \n" - " jc 00003$ \n" - " rl A \n" - " xch A, B \n" - " rl A \n" - " xch A, B \n" - " inc R4 \n" - " sjmp 00002$ \n" - "00003$: \n" - - //result mask in R3:R2 \n" - " mov R3, A \n" - " clr A \n" - " mov R2, A \n" - - //quotient in R1:R0 \n" - " mov R1, B \n" - " mov R0, A \n" - - //iter count in B \n" - " mov B, DPL \n" - - //result in R6:R5 - " mov R5, A \n" - " mov R6, A \n" - - //loop-divide - "00088$: \n" - - // check if denom.shifted >= num - " clr C \n" - " mov A, DPL \n" - " subb A, R0 \n" - " mov A, DPH \n" - " subb A, R1 \n" - " jc 00099$ \n" //no? skip this round - - //subtract - " clr C \n" - " mov A, DPL \n" - " subb A, R0 \n" - " mov DPL, A \n" - " mov A, DPH \n" - " subb A, R1 \n" - " mov DPH, A \n" - - //set bit in result - " mov A, R2 \n" - " orl A, R5 \n" - " mov R5, A \n" - " mov A, R3 \n" - " orl A, R6 \n" - " mov R6, A \n" - - //set up next iteration - "00099$: \n" - - // shift denom right one - " clr C \n" - " mov A, R1 \n" - " rrc A \n" - " mov R1, A \n" - " mov A, R0 \n" - " rrc A \n" - " mov R0, A \n" - - // shift result mask right one - " clr C \n" - " mov A, R3 \n" - " rrc A \n" - " mov R3, A \n" - " mov A, R2 \n" - " rrc A \n" - " mov R2, A \n" - - //check on loop limit - " djnz R4, 00088$ \n" - - //we're done - produce the result (it is already in DPT Rif we want modulus) - " jb PSW.5, 00098$ \n" - " mov DPL, R5 \n" - " mov DPH, R6 \n" - "00098$: \n" - - //pop off regs - " pop _R0 \n" - " pop _R1 \n" - " pop _R2 \n" - " pop _R3 \n" - " pop _R4 \n" - " pop _R5 \n" - " pop _R6 \n" - - " ret \n" - ); - - (void)num; - (void)denom; -} - -#pragma callee_saves mathPrvDiv16x8 -uint16_t mathPrvDiv16x8(uint16_t num, uint8_t denom) __reentrant __naked -{ - __asm__( - " clr PSW.5 \n" - " ljmp _mathPrvDivMod16x8 \n" - ); - - (void)num; - (void)denom; -} - -#pragma callee_saves mathPrvMod16x8 -uint8_t mathPrvMod16x8(uint16_t num, uint8_t denom) __reentrant __naked -{ - __asm__( - " setb PSW.5 \n" - " ljmp _mathPrvDivMod16x8 \n" - ); - - (void)num; - (void)denom; -} - -char charsPrvDerefAndIncGenericPtr(const char * __xdata* __xdata str) __naked -{ - __asm__( - " movx A, @DPTR \n" - " push A \n" - " add A, #1 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " movx A, @DPTR \n" - " push A \n" - " addc A, #0 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " movx A, @DPTR \n" - " pop _DPH \n" - " pop _DPL \n" - " jz 00001$ \n" //check for xdata, taken if yes - " cjne A, #0x60, 00002$ \n" //check for pdata, taken if no - - //pdata - " push _R0 \n" - " mov R0, DPL \n" - " movx A, @R0 \n" - " pop _R0 \n" - " mov DPL, A \n" - " ret \n" - - "00002$: \n" - " jc 00003$ \n" //check for idata. taken if yes - - //code - " clr A \n" - " movc A, @A+DPTR \n" - " mov DPL, A \n" - " ret \n" - - //xdata - "00001$: \n" - " movx A, @DPTR \n" - " mov DPL, A \n" - " ret \n" - - //idata - "00003$: \n" - " push _R0 \n" - " mov R0, DPL \n" - " mov A, @R0 \n" - " pop _R0 \n" - " mov DPL, A \n" - " ret \n" - ); - - (void)str; -} - -void mathPrvCopyPostinc(uint32_t __xdata *dst, uint32_t __xdata *src) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - - " mov b, #4 \n" //repeat 4 times: - " setb C \n" - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " mov r2, a \n" - " addc a, #0 \n" - " movx @dptr, a \n" - " mov a, r2 \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx @dptr, a \n" - " inc dptr \n" - - " djnz b, 00003$ \n" - - " ljmp _u64_end \n" - ); - (void)dst; - (void)src; -} - -__bit xMemEqual4(const void __xdata* memA, const void __xdata* memB) __reentrant __naked -{ - __asm__( - " lcall _u64_start \n" //get second pointer into R1:R0 - " mov b, #4 \n" //repeat 4 times: - " clr C \n" - "00003$: \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " mov r2, a \n" - " inc dptr \n" - " lcall _mathPrvSwapDptrR1R0 \n" - " movx a, @dptr \n" - " inc dptr \n" - " xrl a, r2 \n" - " jnz 00004$ \n" - " djnz b, 00003$ \n" - " setb C \n" - "00004$: \n" - - " ljmp _u64_end \n" - ); - - (void)memA; - (void)memB; -} - -__bit u32minusU16(uint32_t __xdata *u32, uint16_t u16) __naked __reentrant -{ - __asm__( - " lcall _u64_start \n" - " clr C \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " subb A, R0 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " subb A, R1 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " subb A, #0 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " subb A, #0 \n" - " ljmp _u64_end \n" - ); - (void)u32; - (void)u16; -} - -__bit u32plusU16(uint32_t __xdata *u32, uint16_t u16) __naked __reentrant -{ - __asm__( - " lcall _u64_start \n" - " clr C \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " addc A, R0 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " addc A, R1 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " addc A, #0 \n" - " movx A, @DPTR \n" - " inc DPTR \n" - " addc A, #0 \n" - " ljmp _u64_end \n" - ); - (void)u32; - (void)u16; -} - -uint8_t u32Nonzero(uint32_t __xdata *u32) __naked __reentrant -{ - __asm__( - " mov B, #4 \n" - "00001$: \n" - " movx A, @DPTR \n" - " jnz 00002$ \n" - " inc DPTR \n" - " djnz B, 00001$ \n" - "00002$: \n" - " mov DPL, A \n" - " ret \n" - ); - (void)u32; -} - -__bit i32Negative(uint32_t __xdata *u32) __naked __reentrant -{ - __asm__( - " inc DPTR \n" - " inc DPTR \n" - " inc DPTR \n" - " movx A, @DPTR \n" - " rlc A \n" - " ret \n" - ); - (void)u32; -} - - diff --git a/zbs243_Tag_FW/cpu/8051/cpu.c b/zbs243_Tag_FW/cpu/8051/cpu.c deleted file mode 100644 index 254cdec1..00000000 --- a/zbs243_Tag_FW/cpu/8051/cpu.c +++ /dev/null @@ -1 +0,0 @@ -//nothing diff --git a/zbs243_Tag_FW/cpu/8051/cpu.h b/zbs243_Tag_FW/cpu/8051/cpu.h deleted file mode 100644 index f15e18f6..00000000 --- a/zbs243_Tag_FW/cpu/8051/cpu.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _CPUi_H_ -#define _CPUi_H_ - -#include - - -typedef uint16_t uintptr_near_t; - -#define VERSIONMARKER __at (0x008b) - -#define irqsOn() IEN_EA = 1 - - -#include "soc.h" - - - -#endif diff --git a/zbs243_Tag_FW/cpu/8051/make.mk b/zbs243_Tag_FW/cpu/8051/make.mk deleted file mode 100644 index 4482165d..00000000 --- a/zbs243_Tag_FW/cpu/8051/make.mk +++ /dev/null @@ -1,9 +0,0 @@ -FLAGS += -Icpu/8051 - -FLAGS += -mmcs51 --std-c2x --opt-code-size --peep-file cpu/8051/peep.def --fomit-frame-pointer -SOURCES += cpu/8051/asmUtil.c -CC = sdcc -TARGETS = main.ihx main.bin -OBJFILEEXT = rel - - diff --git a/zbs243_Tag_FW/cpu/8051/peep.def b/zbs243_Tag_FW/cpu/8051/peep.def deleted file mode 100644 index 6d3e47b9..00000000 --- a/zbs243_Tag_FW/cpu/8051/peep.def +++ /dev/null @@ -1,115 +0,0 @@ -replace restart { - movx a,@dptr - mov %1,a - inc dptr - movx a,@dptr - mov %2,a - inc dptr - movx a,@dptr - mov %3,a - inc dptr - movx a,@dptr - mov %4,a - clr c - mov a,%1 - subb a,#%5 - mov a,%2 - subb a,#%6 - mov a,%3 - subb a,#%7 - mov a,%4 - subb a,#%8 - DISABLED XXX -} by { - clr c - movx a,@dptr - mov %1,a - subb a,#%5 - inc dptr - movx a,@dptr - mov %2,a - subb a,#%6 - inc dptr - movx a,@dptr - mov %3,a - subb a,#%7 - inc dptr - movx a,@dptr - mov %4,a - subb a,#%8 ;dmitrygr - optimize dumb xdata handling -} if notSame(%1 %2),notSame(%1 %3),notSame(%1 %4),notSame(%2 %3),notSame(%3 %4),notSame(%3 %4) - -replace { - mov b,%1 - mov a,%2 - div ab - mov %3,b - mov b,%1 - mov a,%2 - div ab -} by { - mov b,%1 - mov a,%2 - div ab - mov %3,b ; Peephole dmitrygr.0006 - why divide twice? -} if notSame(%1 %3),notSame(%2 %3) - - -replace { - movx @dptr,a - movx a,@dptr -} by { - movx @dptr,a ; Peephole dmitrygr.0005 - SRSLY, WTF? -} - -replace restart { - mov r%1,%2 - mov r%3,%4 - mov r%5,%6 - mov r%7,%8 - push %9 - push %10 - mov %2,r%1 - mov %4,r%3 - mov %6,r%5 - mov %8,r%7 -} by { - mov r%1,%2 - mov r%3,%4 - mov r%5,%6 - mov r%7,%8 - push %9 - push %10; Peephole dmitrygr.000 - pointless shuffling when passing 32 from return to param -} if notSame(%1 %3),notSame(%1 %5),notSame(%1 %7),notSame(%3 %5),notSame(%3 %7),notSame(%5 %7),notSame(%2 %4),notSame(%2 %6),notSame(%2 %8),notSame(%4 %6),notSame(%4 %8),notSame(%6 %8) - - -replace restart { -%1: - mov dptr,#%2 - movx a,@dptr - mov %3,a - cjne %3,#%4,%1 -} by { - mov dptr,#%2 -%1: - movx a,@dptr - cjne a,#%4,%1 ; Peephole dmitrygr.001 - tighter loop, write extra var just once (i wish we knew if it were dead so we could write it zero times) - mov %3,a -} if labelRefCount(%1 1) - -replace restart { - mov a,#%1 - add a,#0x00 - mov %2,a - mov a,%3 -} by { - mov %2,#%1 - mov a,%3 - clr c ; Peephole dmitrygr.002 - remove pointless A-machinations -} - -replace restart { - add a,#0x00 -} by { - clr c ; Peephole dmitrygr.003 - adding zero is pointless, just clears C -} diff --git a/zbs243_Tag_FW/cpu/8051/printf.c b/zbs243_Tag_FW/cpu/8051/printf.c deleted file mode 100644 index 37223677..00000000 --- a/zbs243_Tag_FW/cpu/8051/printf.c +++ /dev/null @@ -1,799 +0,0 @@ -#include "printf.h" - -#include -#include -#include - -#include "board.h" -#include "screen.h" -#include "uart.h" -#include "zbs243.h" - -typedef void (*StrFormatOutputFunc)(uint32_t param /* low byte is data, bits 24..31 is char */) __reentrant; - -static __idata __at(0x00) unsigned char R0; -static __idata __at(0x01) unsigned char R1; -static __idata __at(0x02) unsigned char R2; -static __idata __at(0x03) unsigned char R3; -static __idata __at(0x04) unsigned char R4; -static __idata __at(0x05) unsigned char R5; -static __idata __at(0x06) unsigned char R6; -static __idata __at(0x07) unsigned char R7; - -static uint8_t __xdata mCvtBuf[18]; - -// callback must be reentrant and callee_saves -#pragma callee_saves prvPrintFormat -void prvPrintFormat(StrFormatOutputFunc formatF, uint16_t formatD, const char __code *fmt, va_list vl) __reentrant __naked { - // formatF is in DPTR - // sp[0..-1] is return addr - // sp[-2..-3] is formatD - // sp[-4..-5] is fmt - // sp[-6] is vl - - __asm__( - " push _R7 \n" - " push DPH \n" // push formatF - " push DPL \n" - " mov _R7, sp \n" // save place on stack where we stashed it so we can call it easily - " push _R4 \n" - " push _R3 \n" - " push _R2 \n" - " push _R1 \n" - " push _R0 \n" - - " mov A, #-12 \n" - " add A, sp \n" - " mov R0, A \n" - // R0 now points to pushed params, for large values, we see high bytes first - // to get next byte, we need to DECEREMENT R0 - - " mov DPH, @R0 \n" - " dec R0 \n" - " mov DPL, @R0 \n" - " dec R0 \n" - " mov _R0, @R0 \n" - " dec R0 \n" - - // now format string is in DPTR, and R0 points to the top byte of whatever was in the first param - - // main loop: get a byte of the format string - "00001$: \n" - " clr A \n" - " movc A, @A + DPTR \n" - " inc DPTR \n" - // if zero, we're done - " jz 00098$ \n" - // if not '%', print it - " cjne A, #'%', 00097$ \n" - - // we got a percent sign - init state for format processing - " mov R4, #0 \n" // bit flags: - // 0x01 = '*' = pointer provided instead of value (integers only) - // 0x02 = '0' = zero-pad (for numbers only) - // 0x04 = have pad-to length - // 0x08 = long - // 0x10 = long long - // 0x20 = signed print requested. also: need to print a negative (used to reuse hex printing for decimal once converted to bcd) - " mov R2, #0 \n" // padLen - - // loop for format string ingestion - "00002$: \n" - " clr A \n" - " movc A, @A + DPTR \n" - " inc DPTR \n" - // if zero, we're done - " jz 00098$ \n" - // check for percent sign - " cjne A, #'%', 00003$ \n" - // fallthrough to print it and go read next non-format byte - // print a char in A, go read next format byte - "00097$: \n" - " lcall 00060$ \n" - " sjmp 00001$ \n" - - // exit label - placed for easy jumping to - "00098$: \n" - " pop _R0 \n" - " pop _R1 \n" - " pop _R2 \n" - " pop _R3 \n" - " pop _R4 \n" - " pop DPL \n" - " pop DPH \n" - " pop _R7 \n" - " ret \n" - - // continue to process format string - handle %c - "00003$: \n" - " cjne A, #'c', 00004$ \n" - " dec R0 \n" // param is pushed as int (16 bits) - " mov A, @R0 \n" - " dec R0 \n" - " sjmp 00097$ \n" // print and go read next non-format byte - - // continue to process format string - handle %m - "00004$: \n" - " mov R3, A \n" - " orl A, #0x20 \n" - " cjne A, #'m', 00008$ \n" - - // sort out which hexch charset to use - " mov A, R3 \n" - " anl A, #0x20 \n" - " rr A \n" - " mov R1, A \n" - - // go, do - " push DPH \n" - " push DPL \n" - " lcall 00090$ \n" // read the short (__xdata) pointer - >DPTR - " mov R4, #8 \n" // byteSel - "00005$: \n" - " push DPH \n" - " push DPL \n" - " mov A, R4 \n" - " dec A \n" - " add A, DPL \n" - " mov DPL, A \n" - " mov A, DPH \n" - " addc A, #0 \n" - " mov DPH, A \n" - " movx A, @DPTR \n" - " mov R2, A \n" - " swap A \n" - " mov R3, #2 \n" - "00006$: \n" - " anl A, #0x0f \n" - " add A, R1 \n" - " mov DPTR, #00099$ \n" - " movc A, @A + DPTR \n" - " lcall 00060$ \n" - " mov A, R2 \n" - " djnz R3, 00006$ \n" - " pop DPL \n" - " pop DPH \n" - " djnz R4, 00007$ \n" - // done with mac addr - - "00055$: \n" - " pop DPL \n" - " pop DPH \n" - " sjmp 00001$ \n" - // print colon and contimue mac addr printing - "00007$: \n" - " mov A, #':' \n" - " lcall 00060$ \n" - " sjmp 00005$ \n" - - // continue to process format string - handle '*' - "00008$: \n" - " mov A, R3 \n" - " cjne A, #'*', 00009$ \n" - " cjne R2, #0, 00097$ \n" // only valid when no length/padding has been specified yet, else invalid specifier - " mov A, #0x01 \n" //"pointer mode" - "00010$: \n" - " orl A, R4 \n" - " mov R4, A \n" - " sjmp 00002$ \n" // get next format specifier now - - // continue to process format string - handle '0' - "00009$: \n" - " cjne A, #'0', 00011$ \n" - " cjne R2, #0, 00011$ \n" // setting "zero pad" is only valid when pad length is zero - " mov A, #0x06 \n" //"have pad length" | "zero-pad" - " sjmp 00010$ \n" // orr A into R4, get next format specifier now - - // continue to process format string - handle '1'...'9' - "00011$: \n" - " mov R3, A \n" - " add A, #-'0' \n" - " jnc 00012$ \n" // now 0..9 are valid - " add A, #-10 \n" - " jc 00012$ \n" - " add A, #10 \n" // get it back into 1..9 range - " mov R3, A \n" - " mov A, #10 \n" - " mov B, R2 \n" - " mul AB \n" - " add A, R3 \n" - " mov R2, A \n" - " mov A, #0x04 \n" //"have pad length" - " sjmp 00010$ \n" // orr A into R4, get next format specifier now - - // continue to process format string - handle 'l' - "00012$: \n" - " cjne R3, #'l', 00014$ \n" - " mov A, R4 \n" - " anl A, #0x08 \n" - " jz 00013$ \n" // no "long" yet? set that - // have long - set long log - " mov A, #0x10 \n" //"long long" - " sjmp 00010$ \n" // orr A into R4, get next format specifier now - // first 'l' - set long - "00013$: \n" - " mov A, #0x08 \n" //"long" - " sjmp 00010$ \n" // orr A into R4, get next format specifier now - - // continue to process format string - handle 's' - "00014$: \n" - " cjne R3, #'s', 00025$ \n" - " mov A, R4 \n" - " anl A, #0x08 \n" - " push DPH \n" - " push DPL \n" - " jnz 00015$ \n" - " lcall 00091$ \n" // get and resolve generic pointer into DPTR - " sjmp 00016$ \n" - "00015$: \n" // get short pointer into DPTR, record that it is to XRAM - " clr PSW.5 \n" - " clr PSW.1 \n" - " lcall 00090$ \n" - "00016$: \n" // pointer to string now in DPTR - // we have the string pointer in {DPTR,PSW}, let's see if we have padding to do - " mov A, R4 \n" - " anl A, #0x04 \n" - " jnz 00018$ \n" - // print string with no length restrictions - "00017$: \n" - " lcall 00095$ \n" - " jz 00055$ \n" - " lcall 00060$ \n" - " sjmp 00017$ \n" - - // print string with length restrictions and/or padding - "00018$: \n" - " cjne R2, #0, 00019$ \n" // verify reqested len was not zero - " sjmp 00055$ \n" - - "00019$: \n" - " lcall 00095$ \n" - " jz 00020$ \n" - " lcall 00060$ \n" - " djnz R2, 00019$ \n" - // we get here if we ran out of allowable bytes - we're done then - " ljmp 00055$ \n" - - // just a trampoline for range issues - "00035$: \n" - " ljmp 00036$ \n" - - // we need to pad with spaces - "00020$: \n" - " mov A, #' ' \n" - " lcall 00060$ \n" - " djnz R2, 00020$ \n" - " ljmp 00055$ \n" - - // continue to process format string - handle 'x'/'X' - "00025$: \n" - " mov A, R3 \n" - " orl A, #0x20 \n" - " cjne A, #'x', 00035$ \n" - " push DPH \n" - " push DPL \n" - " lcall 00080$ \n" // get pointer to the number in DPTR, length in bytes in B - // save it - - "00070$: \n" - " push DPH \n" - " push DPL \n" - - // sort out how long it would be if printed, first get a pointer to the highest - " mov A, B \n" - " rl A \n" - " mov R1, A \n" - " rr A \n" - " add A, #0xff \n" - " add A, DPL \n" - " mov DPL, A \n" - " mov A, DPH \n" - " addc A, #0x00 \n" - " mov DPH, A \n" - "00026$: \n" - " lcall 00079$ \n" - " anl A, #0xf0 \n" - " jnz 00028$ \n" - " dec R1 \n" - " lcall 00079$ \n" - " jnz 00028$ \n" - " dec R1 \n" - // dec DPTR - " dec DPL \n" - " mov A, DPL \n" - " cjne A, #0xff, 00027$ \n" - " dec DPH \n" - "00027$: \n" - " djnz B, 00026$ \n" - - // we now know how many digits the number is (in R1), except that it has "0" if the number if zero, we cannot have that - "00028$: \n" - " cjne R1, #0, 00029$ \n" - " inc R1 \n" - "00029$: \n" // we now finally have the full length of the digits - - // if the number is negative (happens when we're printing decimals) - // the length of it is one more, also in case of zero-padding, we need to print the minus sign here now - " mov A, R4 \n" - " anl A, #0x20 \n" - " jz 00051$ \n" - " inc R1 \n" // the length is one more - " mov A, R4 \n" - " anl A, #02 \n" // if zero-padding, the negative comes now - " jz 00051$ \n" - " mov A, #'-' \n" - " lcall 00060$ \n" - "00051$: \n" - - // sort out if we need padding at all and if there is space - " mov A, R4 \n" - " anl A, #0x04 \n" - " jz 00031$ \n" // no padding requested - // padding was requested len is in R2 - " mov A, R2 \n" - " clr C \n" - " subb A, R1 \n" - " jc 00031$ \n" // pad-to len < number_len -> no padding needed - " jz 00031$ \n" // pad-to len == number_len -> no padding needed - " mov R2, A \n" - - // sort out which character to use -> DPL - " mov A, R4 \n" // fancy way to create space/zero as needed - " anl A, #0x02 \n" - " swap A \n" - " rr A \n" - " add A, #0x20 \n" - " mov DPL, A \n" - - // pad! - "00030$: \n" - " mov A, DPL \n" - " lcall 00060$ \n" - " djnz R2, 00030$ \n" - "00031$: \n" - - // if the number is negative (happens when we're printing decimals) - // we made the length of it is one more, which we need to undo - // also in case of space-padding, we need to print the minus sign here now - " mov A, R4 \n" - " anl A, #0x20 \n" - " jz 00052$ \n" - " dec R1 \n" // the length is one less than we had increased it to - " mov A, R4 \n" - " anl A, #02 \n" // if space-padding, the negative comes now - " jnz 00052$ \n" - " mov A, #'-' \n" - " lcall 00060$ \n" - "00052$: \n" - - // time to print the number itself - // sort out which hexch charset to use -> R2 - " mov A, R3 \n" - " anl A, #0x20 \n" - " rr A \n" - " mov R2, A \n" - // re-get the number pointer - " pop DPL \n" - " pop DPH \n" - // currently DPTR points to the number low byte, R1 is now many digits we expect to print, R2 is the charset selection, R4 and R3 are free - // let's calculate how many bytes we expect to process -> R4 - " mov A, R1 \n" - " inc A \n" - " clr C \n" - " rrc A \n" - " mov R4, A \n" - // let's repoint DPTR to the first byte we'll print in (remember we print 2 digits per byte) - " dec A \n" - " add A, DPL \n" - " mov DPL, A \n" - " mov A, DPH \n" - " addc A, #0x00 \n" - " mov DPH, A \n" - - // decide if we need to print just a nibble of the high byte or the whole thing. Free up R1 - " mov A, R1 \n" - " anl A, #0x01 \n" - " jz 00032$ \n" - - // we're printing just the low nibble of the first byte - set up for it - " lcall 00079$ \n" - " mov R1, #1 \n" - " sjmp 00033$ \n" - - // print loop - "00032$: \n" - " lcall 00079$ \n" - " mov R1, #2 \n" - " mov R3, A \n" - " swap A \n" - "00033$: \n" - " anl A, #0x0f \n" - " add A, R2 \n" - " push DPH \n" - " push DPL \n" - " mov DPTR, #00099$ \n" - " movc A, @A + DPTR \n" - " pop DPL \n" - " pop DPH \n" - " lcall 00060$ \n" - " mov A, R3 \n" - " djnz R1, 00033$ \n" - - // dec DPTR - " dec DPL \n" - " mov A, DPL \n" - " cjne A, #0xff, 00034$ \n" - " dec DPH \n" - "00034$: \n" - " djnz R4, 00032$ \n" - - // done! - " ljmp 00055$ \n" - - // continue to process format string - handle 'd' - "00036$: \n" - " cjne R3, #'d', 00037$ \n" - " mov A, #0x20 \n" - " orl A, R4 \n" - " mov R4, A \n" - " sjmp 00040$ \n" - - // continue to process format string - handle 'u' - "00037$: \n" - " cjne R3, #'u', 00038$ \n" - " sjmp 00040$ \n" - - // no more format strings exist that we can handle - bail - "00038$: \n" - " ljmp 00001$ \n" - - // handle decimal printing - "00040$: \n" - " push DPH \n" - " push DPL \n" - " lcall 00080$ \n" // get pointer to the number in DPTR, length in bytes in B - " push B \n" - - // copy the number to the double-dabble storage at proper offset (0 for u64, 4 for u32, 6 for u16) - // we do this so that the dabble area always starts at the same place... - " mov A, #8 \n" - " clr C \n" - " subb A, B \n" - " add A, #_mCvtBuf \n" - " mov R1, A \n" - " clr A \n" - " addc A, #(_mCvtBuf >> 8) \n" - " mov R3, A \n" - "00041$: \n" - " lcall 00079$ \n" - " inc DPTR \n" - " lcall 00086$ \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " lcall 00086$ \n" - " djnz B, 00041$ \n" - // leave DPTR pointing to dabble storage, past the number - " lcall 00086$ \n" - - // we now have the top byte of the number in A, good time to check for negatives, if needed - " mov B, A \n" - " mov A, R4 \n" - " anl A, #0x20 \n" - " jz 00050$ \n" // unsigned printing requested - " mov A, B \n" - " anl A, #0x80 \n" - " jnz 00043$ \n" // is negative - we need to invert, 0x20 bit in R1 stays - // positive - 0x20 bit in R1 needs to go - " mov A, R4 \n" - " anl A, #~0x20 \n" - " mov R4, A \n" - " sjmp 00050$ \n" - - // we need to negate the number - // but first we need a pointer to it, and its size - "00043$: \n" - " pop B \n" - " push B \n" - " mov A, #8 \n" - " clr C \n" - " subb A, B \n" - " add A, #_mCvtBuf \n" - " mov DPL, A \n" - " clr A \n" - " addc A, #(_mCvtBuf >> 8) \n" - " mov DPH, A \n" - - // ok, now we are ready to negate it - " clr C \n" - "00049$: \n" - " movx A, @DPTR \n" - " mov R1, A \n" - " clr A \n" - " subb A, R1 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz B, 00049$ \n" - - // zero out the rest of the storage (10 bytes) - "00050$: \n" - " mov B, #10 \n" - " clr A \n" - "00042$: \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz B, 00042$ \n" - - // calculate number of dabble steps - " pop A \n" - " swap A \n" - " rr A \n" - " mov R3, A \n" - - // do the thing - "00044$: \n" - - // dabble (10 iters for simplicity) - " mov DPTR, #(_mCvtBuf + 8) \n" - " mov B, #10 \n" - "00046$: \n" - " movx A, @DPTR \n" - " mov R1, A \n" - " anl A, #0x0f \n" - " add A,#-0x05 \n" - " mov A, R1 \n" - " jnc 00047$ \n" - " add A, #0x03 \n" - "00047$: \n" - " mov R1, A \n" - " anl A, #0xf0 \n" - " add A,#-0x50 \n" - " mov A, R1 \n" - " jnc 00048$ \n" - " add A, #0x30 \n" - "00048$: \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz B, 00046$ \n" - - // double (18 iters for simplicity) - " mov DPTR, #_mCvtBuf \n" - " clr C \n" - " mov B, #18 \n" - "00045$: \n" - " movx A, @DPTR \n" - " rlc A \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz B, 00045$ \n" - - " djnz R3, 00044$ \n" - - // dabbling is done, print it now using hex routine - " mov DPTR, #(_mCvtBuf + 8) \n" - " mov B, #10 \n" - " clr PSW.5 \n" // it is now for sure in XRAM - " ljmp 00070$ \n" - - // read short pointer from param stack - "00090$: \n" - " mov DPH, @R0 \n" - "00093$: \n" - " dec R0 \n" - " mov DPL, @R0 \n" - " dec R0 \n" - " ret \n" - - // read and increment pointer of the type provided by 00091$ (in {DPTR,PSW}) into A. clobber nothing - "00095$: \n" - " jb PSW.5, 00066$ \n" - " jb PSW.1, 00067$ \n" - // XRAM - " movx A, @DPTR \n" - " inc DPTR \n" - " ret \n" - // CODE - "00066$: \n" - " clr A \n" - " movc A, @A+DPTR \n" - " inc DPTR \n" - " ret \n" - // IRAM - "00067$: \n" - " mov DPH, R0 \n" - " mov R0, DPL \n" - " mov A, @R0 \n" - " mov R0, DPH \n" - " inc DPL \n" - " ret \n" - - // resolve generic pointer on param stack to an pointer in DPTR and flags in PSW.5 and PSW.1 - // PSW.5 will be 0 and PSW.1 will be 0 for XRAM (PDATA goes here too) - // PSW.5 will be 1 and PSW.1 will be 0 for CODE - // PSW.5 will be 0 and PSW.1 will be 1 for IRAM - "00091$: \n" - " clr PSW.5 \n" - " clr PSW.1 \n" - " mov A, @R0 \n" - " dec R0 \n" - " jz 00090$ \n" // 0x00: pointer type: xdata - " xrl A, #0x80 \n" - " jz 00094$ \n" // 0x80: pointer type: code - " xrl A, #0xc0 \n" - " jz 00092$ \n" // 0x40: pointer type: idata - // pdata - " mov DPH, _XPAGE \n" - " sjmp 00093$ \n" - // idata - "00092$: \n" - " setb PSW.1 \n" - " sjmp 00093$ \n" - // code - "00094$: \n" - " setb PSW.5 \n" - " sjmp 00090$ \n" - - // read the pointer of the type that 00080$ returns (in DPTR) into A. clobber nothing - "00079$: \n" - " jnb PSW.5, 00078$ \n" - " push _R0 \n" - " mov R0, DPL \n" - " mov A, @R0 \n" - " pop _R0 \n" - " ret \n" - "00078$: \n" - " movx A, @DPTR \n" - " ret \n" - - // get pointer to a number, might be pushed or might be pointed to, size might vary. return pointer to number's LOW byte in DPTR - "00080$: \n" - " mov A, R4 \n" - " anl A, #0x01 \n" - " jnz 00083$ \n" - // param is itself on stack - now we care about size, but either way, PSW.5 will be 1 - " setb PSW.5 \n" - " mov B, #0 \n" - " mov A, R4 \n" - " anl A, #0x18 \n" - " jz 00081$ \n" - " anl A, #0x10 \n" - " jz 00082$ \n" - // long long (8 bytes) \n" - " setb B.2 \n" - " dec R0 \n" - " dec R0 \n" - " dec R0 \n" - " dec R0 \n" - // long (4 bytes) - "00082$: \n" - " setb B.1 \n" - " dec R0 \n" - " dec R0 \n" - // int (2 bytes) \n" - "00081$: \n" - " setb B.0 \n" - " dec R0 \n" - " mov DPL, R0 \n" - " dec R0 \n" - " inc B \n" - " ret \n" - // pointer it on stack itself, number is in xram, but we still need to provide the length - "00083$: \n" - " clr PSW.5 \n" // mark as "in xram" - " mov A, R4 \n" - " anl A, #0x18 \n" - " jz 00084$ \n" - " anl A, #0x10 \n" - " jz 00085$ \n" - // long long - " mov B, #8 \n" - " ljmp 00090$ \n" - // long - "00085$: \n" - " mov B, #4 \n" - " ljmp 00090$ \n" - // int - "00084$: \n" - " mov B, #2 \n" - " ljmp 00090$ \n" - - // swap R3:R1 <-> DPH:DPL - "00086$: \n" - " xch A, DPH \n" - " xch A, R3 \n" - " xch A, DPH \n" - " xch A, DPL \n" - " xch A, R1 \n" - " xch A, DPL \n" - " ret \n" - - /* putchar func - called via call. char is in A, R7 has pointer to stack as needed - can clobber B, CANNOT clobber DPTR - a mess because...8051 - */ - "00060$: \n" - " push DPH \n" - " push DPL \n" - " push _R1 \n" - " push _R0 \n" - " mov _R0, R7 \n" - " mov DPL, @R0 \n" - " dec R0 \n" - " mov DPH, @R0 \n" // DPTR is now func ptr - " dec R0 \n" - " dec R0 \n" - " dec R0 \n" - " dec R0 \n" - " mov _R1, @R0 \n" - " dec R0 \n" - " mov _R0, @R0 \n" // R1:R0 is now "formatD" - " lcall 00061$ \n" // to set ret addr - " pop _R0 \n" - " pop _R1 \n" - " pop DPL \n" - " pop DPH \n" - " ret \n" - "00061$: \n" - " push DPL \n" - " push DPH \n" - " mov DPL, _R0 \n" - " mov DPH, _R1 \n" - " ret \n" - - "00099$: \n" - " .ascii \"01234567\" \n" - " .ascii \"89ABCDEF\" \n" - " .ascii \"01234567\" \n" - " .ascii \"89abcdef\" \n"); - (void)fmt; - (void)vl; - (void)formatF; - (void)formatD; -} - -#pragma callee_saves prPrvPutchar -static void prPrvPutchar(uint32_t data) __reentrant { - char ch = data >> 24; - if (ch == '\n') - uartTx('\r'); - uartTx(ch); -} -#pragma callee_saves epdPutchar -static void epdPutchar(uint32_t data) __reentrant { - char ch = data >> 24; - writeCharEPD(ch); -} - -void pr(const char __code *fmt, ...) __reentrant { - va_list vl; - va_start(vl, fmt); - prvPrintFormat(prPrvPutchar, 0, fmt, vl); - va_end(vl); -} - -void epdpr(const char __code *fmt, ...) __reentrant { - va_list vl; - va_start(vl, fmt); - prvPrintFormat(epdPutchar, 0, fmt, vl); - va_end(vl); -} - -#pragma callee_saves prPrvPutS -static void prPrvPutS(uint32_t data) __reentrant { - char __xdata *__idata *strPP = (char __xdata *__idata *)data; - char ch = data >> 24; - - *(*strPP)++ = ch; -} - -void spr(char __xdata *out, const char __code *fmt, ...) __reentrant { - char __xdata *outStart = out; - - va_list vl; - - va_start(vl, fmt); - prvPrintFormat(prPrvPutS, (uint16_t)&out, fmt, vl); - va_end(vl); - - *out = 0; -} diff --git a/zbs243_Tag_FW/cpu/8051/random.c b/zbs243_Tag_FW/cpu/8051/random.c deleted file mode 100644 index 63e7be62..00000000 --- a/zbs243_Tag_FW/cpu/8051/random.c +++ /dev/null @@ -1,261 +0,0 @@ -#include "cpu.h" - - -struct RngState { - uint64_t a, b; - uint32_t c; -}; - -static struct RngState mState = {0, }; - -void rndSeed(uint8_t seedA, uint8_t seedB) -{ - mState.a = seedA; - mState.b = seedB; -} - -#pragma callee_saves rndPrvGen32 -static uint32_t rndPrvGen32(struct RngState __xdata *state) __naked -{ - // //xorshift128p with a small midification ( " retval ^= ++ c" ) - // - // state->a ^= state->a << 23; - // state->a ^= state->a >> 17; - // state->a ^= state->b; - // t = state->a; - // state->a = state->b; - // state->b >>= 26 - // state->b = t ^ state->b; - // state->c++; - // - // return (state->a + state->b) >> 32 + state->c; - - __asm__( - - " push _R0 \n" - - //state->a ^= state->a << 23 - " mov A, #5 \n" //point to a[5] - " lcall 00091$ \n" - " movx A, @DPTR \n" - " mov PSW.5, A.0 \n" - " mov B, #5 \n" - " mov A, #-1 \n" - "00001$: \n" - " lcall 00089$ \n" - " movx A, @DPTR \n" - " mov C, PSW.5 \n" - " rrc A \n" - " mov PSW.5, C \n" - " inc DPTR \n" - " inc DPTR \n" - " inc DPTR \n" - " mov _R0, A \n" - " movx A, @DPTR \n" - " xrl A, R0 \n" - " movx @DPTR, A \n" - " mov A, #-4 \n" - " djnz B, 00001$ \n" - - //repoint DPTR to state->a.8 - " mov A, #5 \n" - " lcall 00091$ \n" - - //state->a ^= state->a >> 17 - - " clr PSW.5 \n" - " mov B, #6 \n" - "00002$: \n" - " mov A, #-1 \n" - " lcall 00089$ \n" - " movx A, @DPTR \n" - " mov C, PSW.5 \n" - " rrc A \n" - " mov PSW.5, C \n" - " push A \n" - " djnz B, 00002$ \n" - - " mov A, #-2 \n" - " lcall 00089$ \n" - - " mov B, #6 \n" - "00003$: \n" - " movx A, @DPTR \n" - " pop _R0 \n" - " xrl A, R0 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz B, 00003$ \n" - - " inc DPTR \n" //point to B - " inc DPTR \n" - - // pushed_t = state->a ^ state->b //last pushe di nhigh byte - // state->a = state->b; - - " mov B, #8 \n" - "00004$: \n" - " movx A, @DPTR \n" - " mov _R0, A \n" //r0 = b[i] - " mov A, #-8 \n" - " lcall 00089$ \n" - " movx A, @DPTR \n" //a = a[i] - " xrl A, R0 \n" //a = a[i] ^ b[i] - " push A \n" - " mov A, R0 \n" - " movx @DPTR, A \n" - " mov A, #9 \n" - " lcall 00091$ \n" - " djnz B, 00004$ \n" - - //repoint DPTR to state->b.3 - " mov A, #-5 \n" - " lcall 00089$ \n" - - //state->b >>= 24 (top 3 bytes are garbage) - " mov B, #5 \n" - "00005$: \n" - " movx A, @DPTR \n" - " mov _R0, A \n" - " mov A, #-3 \n" - " lcall 00089$ \n" - " mov A, R0 \n" - " movx @DPTR, A \n" - " mov A, #4 \n" - " lcall 00091$ \n" - " djnz B, 00005$ \n" - - //state->b >>= 2 - " mov A, #-4 \n" - " lcall 00089$ \n" - - " mov B, #2 \n" - "00006$: \n" - " mov _R0, #5 \n" - " clr PSW.5 \n" - "00007$: \n" - " movx A, @DPTR \n" - " mov C, PSW.5 \n" - " rrc A \n" - " mov PSW.5, C \n" - " movx @DPTR, A \n" - " mov A, #-1 \n" - " lcall 00089$ \n" - " djnz _R0, 00007$ \n" - " mov A, #5 \n" - " lcall 00091$ \n" - " djnz B, 00006$ \n" - - //reset DPTR to end of state->b - " mov A, #3 \n" - " lcall 00091$ \n" - - //state->b = t ^ state->b - " mov B, #3 \n" - "00008$: \n" - " pop A \n" - " movx @DPTR, A \n" - " mov A, #-1 \n" - " lcall 00089$ \n" - " djnz B, 00008$ \n" - - " mov B, #5 \n" - "00009$: \n" - " movx A, @DPTR \n" - " pop _R0 \n" - " xrl A, R0 \n" - " movx @DPTR, A \n" - " mov A, #-1 \n" - " lcall 00089$ \n" - " djnz B, 00009$ \n" - - " mov A, #9 \n" - " lcall 00091$ \n" - - //state->c++ - " mov B, #4 \n" - " setb C \n" - "00010$: \n" - " movx A, @DPTR \n" - " addc A, #0 \n" - " movx @DPTR, A \n" - " inc DPTR \n" - " djnz B, 00010$ \n" - - " mov A, #-16 \n" //point to top 32 bits of A - " lcall 00089$ \n" - - // push (state->a + state->b) >> 32 ^ state->c - " mov B, #4 \n" - " clr PSW.5 \n" - "00011$: \n" - " movx A, @DPTR \n" - " mov _R0, A \n" - " mov A, #8 \n" - " lcall 00091$ \n" - " movx A, @DPTR \n" - " mov C, PSW.5 \n" - " addc A, R0 \n" - " mov PSW.5, C \n" - " mov _R0, A \n" - " mov A, #4 \n" - " lcall 00091$ \n" - " movx A, @DPTR \n" - " xrl A, R0 \n" - " push A \n" - " mov A, #-11 \n" - " lcall 00089$ \n" - " djnz B, 00011$ \n" - - //pop result (pop it large to small) - " pop A \n" - " pop B \n" - " pop DPH \n" - " pop DPL \n" - - " pop _R0 \n" - " ret \n" - - //sub from DPTR - "00089$: \n" - " add A, DPL \n" - " mov DPL, A \n" - " mov A, #0xff \n" - " addc A, DPH \n" - " mov DPH, A \n" - " ret \n" - - //add to DPTR - "00091$: \n" - " add A, DPL \n" - " mov DPL, A \n" - " clr A \n" - " addc A, DPH \n" - " mov DPH, A \n" - " ret \n" - ); - - (void)state; -} - -uint32_t rndGen32(void) __naked -{ - __asm__( - " mov DPTR, #_mState \n" - " ljmp _rndPrvGen32 \n" - ); -} - -uint8_t rndGen8(void) __naked -{ - __asm__( - " lcall _rndGen32 \n" - " rr A \n" - " xrl A, B \n" - " rr A \n" - " xrl A, DPH \n" - " rr A \n" - " xrl DPL, A \n" - " ret \n" - ); -} diff --git a/zbs243_Tag_FW/eeprom.c b/zbs243_Tag_FW/eeprom.c deleted file mode 100644 index ab01bbc7..00000000 --- a/zbs243_Tag_FW/eeprom.c +++ /dev/null @@ -1,324 +0,0 @@ -#include "asmUtil.h" -#include "screen.h" -#include "eeprom.h" -#include "printf.h" -#include "board.h" -#include "cpu.h" - -static uint32_t __xdata mEepromSize; -static uint8_t __xdata mOpcodeErz4K = 0, mOpcodeErz32K = 0, mOpcodeErz64K = 0; - -//extern uint8_t __xdata* tempBuffer; -uint8_t __xdata tempBufferE[320] = {0}; - -uint32_t eepromGetSize(void) -{ - return mEepromSize; -} - -void eepromReadStart(uint32_t addr) __reentrant -{ - eepromPrvSelect(); - eepromByte(0x03); - eepromByte(addr >> 16); - eepromByte(addr >> 8); - eepromByte(addr & 0xff); -} - -void eepromRead(uint32_t addr, void __xdata *dstP, uint16_t len) __reentrant -{ - uint8_t __xdata *dst = (uint8_t __xdata*)dstP; - - eepromPrvSelect(); - eepromByte(0x03); - eepromByte(addr >> 16); - eepromByte(addr >> 8); - eepromByte(addr & 0xff); - - while (len--) - *dst++ = eepromByte(0); - eepromPrvDeselect(); -} - -static void eepromPrvSimpleCmd(uint8_t cmd) -{ - eepromPrvSelect(); - eepromByte(cmd); - eepromPrvDeselect(); -} - -static bool eepromPrvBusyWait(void) -{ - uint8_t val; - - eepromPrvSelect(); - eepromByte(0x05); - while ((val = eepromByte(0x00)) & 1); - eepromPrvDeselect(); - - return true; -} - -static bool eepromWriteLL(uint32_t addr, const void __xdata *srcP, uint16_t len) -{ - const uint8_t __xdata *src = (const uint8_t __xdata*)srcP; - - eepromPrvSimpleCmd(0x06); - - eepromPrvSelect(); - eepromByte(0x02); - eepromByte(addr >> 16); - eepromByte(addr >> 8); - eepromByte(addr & 0xff); - - while (len--) - eepromByte(*src++); - eepromPrvDeselect(); - - return eepromPrvBusyWait(); -} - -void eepromDeepPowerDown(void) -{ - eepromPrvSimpleCmd(0xb9); -} - -static void eepromPrvWakeFromPowerdown(void) -{ - eepromPrvSimpleCmd(0xab); -} - -#pragma callee_saves eepromPrvSfdpRead -static void eepromPrvSfdpRead(uint16_t ofst, uint8_t __xdata *dst, uint8_t len) -{ - eepromPrvSelect(); - eepromByte(0x5a); //cmd - eepromByte(0); //addr - eepromByte(ofst >> 8); - eepromByte(ofst); - eepromByte(0x00); //dummy - while(len--) - *dst++ = eepromByte(0); - eepromPrvDeselect(); -} - -__bit eepromInit(void) -{ - uint8_t __xdata buf[8]; - uint8_t i, nParamHdrs; - - eepromPrvWakeFromPowerdown(); - - //process SFDP - - eepromPrvSfdpRead(0, buf, 8); - if (buf[0] != 0x53 || buf[1] != 0x46 || buf[2] != 0x44 || buf[3] != 0x50 || buf[7] != 0xff) { - pr("SFDP: header not found\n"); - - __bit valid = false; - - //try manual ID for chips we know of - eepromPrvSelect(); - eepromByte(0x90); - eepromByte(0x00); - eepromByte(0x00); - eepromByte(0x00); - if (eepromByte(0) == 0xc2) { //old macronix chips - valid = true; - mOpcodeErz4K = 0x20; - switch (eepromByte(0)) { - case 0x05: //MX25V512 - mEepromSize = 0x00010000ul; - break; - - case 0x12: //MX25V4005 - mEepromSize = 0x00080000ul; - break; - - default: - valid = false; - break; - } - } - eepromPrvDeselect(); - - return valid; - } - if (buf[5] != 0x01) { - pr("SFDP: version wrong: %u.%d\n", buf[5], buf[4]); - return false; - } - nParamHdrs = buf[6]; - if (nParamHdrs == 0xff) //that case is very unlikely and we just do not care - nParamHdrs--; - - //now we need to find the JEDEC parameter table header - for (i = 0; i <= nParamHdrs; i++) { - - eepromPrvSfdpRead(mathPrvMul8x8(i, 8) + 8, buf, 8); - if (buf[0] == 0x00 && buf[2] == 0x01 && buf[3] >= 9) { - - uint8_t j; - - eepromPrvSfdpRead(*(uint16_t __xdata*)(buf + 4), tempBufferE, 9 * 4); - if ((tempBufferE[0] & 3) != 1) { - pr("SFDP: no 4K ERZ\n"); - break; - } - if (!(tempBufferE[0] & 0x04)) { - pr("SFDP: no large write buf\n"); - break; - } - if ((tempBufferE[2] & 0x06)) { - pr("SFDP: addr.len != 3\n"); - break; - } - - if (!tempBufferE[1] || tempBufferE[1] == 0xff) { - pr("SFDP: 4K ERZ opcode invalid\n"); - break; - } - mOpcodeErz4K = tempBufferE[1]; - - if (tempBufferE[7] & 0x80) { - - pr("SFDP: device too big\n"); - break; - } - else { - - uint8_t t; - - if (t = tempBufferE[7]) - mEepromSize = 0x00200000UL; - else if (t = tempBufferE[6]) - mEepromSize = 0x00002000UL; - else if (t = tempBufferE[5]) - mEepromSize = 0x00000020UL; - else { - pr("SFDP: device so small?!\n"); - break; - } - - while (t) { - mEepromSize <<= 1; - t >>= 1; - } - } - - //get erase opcodes - for (j = 0x1c; j < 0x24; j += 2) { - uint8_t instr = tempBufferE[j + 1]; - - if (!instr || instr == 0xff) - continue; - - switch (tempBufferE[j]) { - case 0x0c: - if (mOpcodeErz4K != instr) { - pr("4K ERZ opcode disagreement\n"); - return false; - } - break; - - case 0x0f: //32K erase - mOpcodeErz32K = instr; - break; - - case 0x10: //64K erase - mOpcodeErz64K = instr; - break; - } - } - - /* - pr("EEPROM accepted\n"); - pr(" ERZ opcodes: \n"); - if (mOpcodeErz4K) - pr(" 4K: %02xh\n", mOpcodeErz4K); - if (mOpcodeErz32K) - pr(" 32K: %02xh\n", mOpcodeErz32K); - if (mOpcodeErz64K) - pr(" 64K: %02xh\n", mOpcodeErz64K); - pr(" Size: 0x%*08lx\n", (uint16_t)&mEepromSize); - */ - return true; - } - } - - pr("SFDP: no JEDEC table of expected version found\n"); - return false; -} - -bool eepromWrite(uint32_t addr, const void __xdata *srcP, uint16_t len) __reentrant -{ - const uint8_t __xdata *src = (const uint8_t __xdata*)srcP; - - while (len) { - - uint16_t lenNow = EEPROM_WRITE_PAGE_SZ - (addr & (EEPROM_WRITE_PAGE_SZ - 1)); - - if (lenNow > len) - lenNow = len; - - if (!eepromWriteLL(addr, src, lenNow)) - return false; - - addr += lenNow; - src += lenNow; - len -= lenNow; - } - return true; -} - -bool eepromErase(uint32_t addr, uint16_t nSec) __reentrant -{ - uint8_t now; - - if (((uint16_t)addr) & 0x0fff) - return false; - - for (;nSec; nSec -= now) { - - eepromPrvSimpleCmd(0x06); - eepromPrvSelect(); - - if (nSec >= 16 && !(uint16_t)addr && mOpcodeErz64K) { //erase 64K - - eepromByte(mOpcodeErz64K); - now = 16; - } - else if (nSec >= 8 && !(((uint16_t)addr) & 0x7fff) && mOpcodeErz32K) { //erase 32K - - eepromByte(mOpcodeErz32K); - now = 8; - } - else { //erase 4K - - eepromByte(mOpcodeErz4K); - now = 1; - } - - eepromByte(addr >> 16); - eepromByte(addr >> 8); - eepromByte(addr); - eepromPrvDeselect(); - - if (!eepromPrvBusyWait()) - return false; - - addr += mathPrvMul16x8(EEPROM_ERZ_SECTOR_SZ, now); - } - - return true; -} - -void eepromOtpModeEnter(void) -{ - eepromPrvSimpleCmd(0xb1); -} - -void eepromOtpModeExit(void) -{ - eepromPrvSimpleCmd(0xc1); -} \ No newline at end of file diff --git a/zbs243_Tag_FW/eeprom.c b/zbs243_Tag_FW/eeprom.c new file mode 120000 index 00000000..a36061b4 --- /dev/null +++ b/zbs243_Tag_FW/eeprom.c @@ -0,0 +1 @@ +../zbs243_shared/eeprom.c \ No newline at end of file diff --git a/zbs243_Tag_FW/eeprom.h b/zbs243_Tag_FW/eeprom.h deleted file mode 100644 index 59f36984..00000000 --- a/zbs243_Tag_FW/eeprom.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _EEPROM_H_ -#define _EEPROM_H_ - -#include -#include - -#define EEPROM_WRITE_PAGE_SZ 256 //max write size & alignment -#define EEPROM_ERZ_SECTOR_SZ 4096 //erase size and alignment - -//device has 256 sectors, so eepromErase() cannot erase thw whole device...i can live with that - -__bit eepromInit(void); -void eepromOtpModeEnter(void); -void eepromOtpModeExit(void); - -#pragma callee_saves eepromRead -void eepromRead(uint32_t addr, void __xdata *dst, uint16_t len) __reentrant; - -#pragma callee_saves eepromWrite -bool eepromWrite(uint32_t addr, const void __xdata *src, uint16_t len) __reentrant; - -#pragma callee_saves eepromErase -bool eepromErase(uint32_t addr, uint16_t numSectors) __reentrant; - -void eepromDeepPowerDown(void); - -#pragma callee_saves eepromGetSize -uint32_t eepromGetSize(void); - -//this is for firmware update use -void eepromReadStart(uint32_t addr) __reentrant; - -//structures -#define EEPROM_IMG_INPROGRESS (0x7fffffffUL) -#define EEPROM_IMG_VALID (0x494d4721UL) -#include "board.h" - -struct EepromImageHeader { //each image space is 0x17000 bytes, we have space for ten of them - uint64_t version; - uint32_t validMarker; - uint32_t size; - uint8_t dataType; - uint32_t id; - - //image data here - //we pre-erase so progress can be calculated by finding the first non-0xff byte -}; - - - -#endif diff --git a/zbs243_Tag_FW/eeprom.h b/zbs243_Tag_FW/eeprom.h new file mode 120000 index 00000000..4ebb90df --- /dev/null +++ b/zbs243_Tag_FW/eeprom.h @@ -0,0 +1 @@ +../zbs243_shared/eeprom.h \ No newline at end of file diff --git a/zbs243_Tag_FW/font.h b/zbs243_Tag_FW/font.h deleted file mode 100644 index 3dece553..00000000 --- a/zbs243_Tag_FW/font.h +++ /dev/null @@ -1,258 +0,0 @@ -static const uint8_t __code font[256][20]={ // https://raw.githubusercontent.com/basti79/LCD-fonts/master/10x16_vertikal_MSB_1.h -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x00 -{0xE0,0x01,0x30,0x03,0x50,0x02,0x28,0x05,0x28,0x04,0x28,0x04,0x28,0x05,0x50,0x02,0x30,0x03,0xE0,0x01}, // 0x01 -{0xE0,0x01,0xF0,0x03,0xB0,0x03,0xD8,0x06,0xD8,0x07,0xD8,0x07,0xD8,0x06,0xB0,0x03,0xF0,0x03,0xE0,0x01}, // 0x02 -{0x00,0x3E,0x80,0x7F,0xE0,0x7F,0xF0,0x7F,0xF8,0x3F,0xF8,0x3F,0xF0,0x7F,0xE0,0x7F,0x80,0x7F,0x00,0x3E}, // 0x03 -{0x00,0x01,0x80,0x03,0xC0,0x0F,0xE0,0x1F,0xF8,0x7F,0xF0,0x1F,0xE0,0x0F,0xC0,0x07,0x80,0x03,0x00,0x01}, // 0x04 -{0x80,0x03,0xC0,0x07,0xC0,0x07,0xC0,0x3F,0xF8,0x7F,0xB8,0x7F,0xC0,0x3F,0xC0,0x07,0xC0,0x07,0x80,0x03}, // 0x05 -{0x80,0x03,0xC0,0x07,0xC0,0x0F,0xC0,0x1F,0xF8,0x3F,0xB8,0x7F,0xC0,0x1F,0xC0,0x0F,0xC0,0x07,0x80,0x03}, // 0x06 -{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}, // 0x08 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x09 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x0A -{0xE0,0x01,0x10,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x24,0x10,0x2E,0xE0,0x71,0x00,0x70,0x00,0x18}, // 0x0B -{0x00,0x00,0x00,0x1E,0x20,0x21,0xA0,0x40,0xF8,0x40,0xA0,0x40,0xA0,0x41,0x00,0x21,0x00,0x1E,0x00,0x00}, // 0x0C -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x0D -{0x06,0x00,0x0E,0x00,0x0E,0x00,0xFC,0x1F,0x00,0x18,0x30,0x10,0x70,0x30,0x70,0x20,0xE0,0x7F,0x00,0x00}, // 0x0E -{0x00,0x01,0xC0,0x0F,0xC0,0x04,0x40,0x08,0x60,0x18,0x40,0x08,0x40,0x04,0xC0,0x0C,0xC0,0x0B,0x00,0x01}, // 0x0F -{0xF8,0x0F,0xF0,0x07,0xF0,0x07,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xC0,0x01,0xC0,0x01,0x80,0x00,0x80,0x00}, // 0x10 -{0x80,0x00,0x80,0x00,0xC0,0x01,0xC0,0x01,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xF0,0x07,0xF0,0x07,0xF8,0x0F}, // 0x11 -{0x00,0x00,0x00,0x00,0x08,0x10,0x04,0x20,0xFE,0x7F,0x04,0x20,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x12 -{0x00,0x00,0x00,0x00,0xD8,0x7F,0x00,0x00,0x00,0x00,0xD8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x13 -{0x00,0x00,0x00,0x38,0x00,0x7C,0x00,0x7E,0xFE,0x7F,0x00,0x40,0x00,0x40,0xFE,0x7F,0x00,0x00,0x00,0x00}, // 0x14 -{0x00,0x00,0x00,0x00,0x86,0x3B,0xC2,0x4C,0x42,0x44,0x62,0x46,0x32,0x42,0xDC,0x41,0x00,0x00,0x00,0x00}, // 0x15 -{0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00}, // 0x16 -{0x00,0x00,0x00,0x00,0x11,0x10,0x09,0x20,0xFD,0x7F,0x09,0x20,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x17 -{0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20,0xFE,0x7F,0x00,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x18 -{0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0xFE,0x7F,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x19 -{0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x02,0xC0,0x01,0x80,0x00,0x00,0x00}, // 0x1A -{0x00,0x00,0x80,0x00,0xC0,0x01,0xA0,0x02,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00}, // 0x1B -{0x00,0x00,0xF8,0x07,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00}, // 0x1C -{0x00,0x00,0x80,0x00,0xC0,0x01,0xA0,0x02,0x80,0x00,0x80,0x00,0xA0,0x02,0xC0,0x01,0x80,0x00,0x00,0x00}, // 0x1D -{0x08,0x00,0x18,0x00,0x78,0x00,0xF8,0x01,0xF8,0x03,0xF8,0x0F,0xF8,0x03,0xF8,0x00,0x38,0x00,0x08,0x00}, // 0x1E -{0x00,0x08,0x00,0x0C,0x00,0x0F,0xC0,0x0F,0xE0,0x0F,0xF8,0x0F,0xE0,0x0F,0x80,0x0F,0x00,0x0E,0x00,0x08}, // 0x1F -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x20 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x21 -{0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x22 -{0x80,0x00,0x98,0x04,0xE0,0x05,0x80,0x1E,0x98,0x64,0xE0,0x05,0x80,0x1E,0x80,0x64,0x80,0x04,0x00,0x00}, // 0x23 -{0x00,0x00,0x00,0x00,0x18,0x38,0x08,0x64,0x08,0x42,0xFC,0xFF,0x88,0x41,0xF0,0x40,0x00,0x00,0x00,0x00}, // 0x24 -{0x08,0x38,0x10,0x44,0x20,0x44,0xC0,0x44,0x00,0x39,0x70,0x02,0x88,0x0C,0x88,0x10,0x88,0x20,0x70,0x40}, // 0x25 -{0xE0,0x00,0x10,0x01,0x08,0x3A,0x08,0x46,0x88,0x45,0xC8,0x4C,0x38,0x38,0x18,0x00,0x68,0x00,0x80,0x01}, // 0x26 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x27 -{0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x18,0x18,0x0C,0x30,0x04,0x20,0x02,0x40,0x02,0x40,0x00,0x00}, // 0x28 -{0x00,0x00,0x02,0x40,0x02,0x40,0x04,0x20,0x0C,0x30,0x18,0x18,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x29 -{0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x0F,0x00,0x72,0x00,0x0F,0x00,0x18,0x00,0x10,0x00,0x00,0x00,0x00}, // 0x2A -{0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xF8,0x07,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00}, // 0x2B -{0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x2C -{0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00}, // 0x2D -{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x2E -{0x00,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0xC0,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x00}, // 0x2F -{0x00,0x00,0xC0,0x0F,0x30,0x30,0x08,0x40,0x08,0x40,0x08,0x40,0x30,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00}, // 0x30 -{0x00,0x00,0x08,0x20,0x08,0x20,0x08,0x20,0xF8,0x7F,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x31 -{0x00,0x00,0x18,0x60,0x28,0x40,0x48,0x40,0x88,0x40,0x08,0x43,0x08,0x3C,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x32 -{0x00,0x00,0x00,0x00,0x08,0x40,0x08,0x42,0x08,0x42,0x08,0x42,0xF0,0x3D,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x33 -{0xC0,0x00,0x40,0x03,0x40,0x04,0x40,0x18,0x40,0x20,0xF8,0x7F,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00}, // 0x34 -{0x00,0x00,0x00,0x00,0x08,0x7C,0x08,0x44,0x08,0x44,0x10,0x42,0xE0,0x41,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x35 -{0x00,0x00,0xE0,0x0F,0x10,0x32,0x08,0x44,0x08,0x44,0x08,0x44,0x10,0x42,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x36 -{0x00,0x00,0x00,0x40,0x18,0x40,0xE0,0x40,0x00,0x43,0x00,0x4C,0x00,0x50,0x00,0x60,0x00,0x00,0x00,0x00}, // 0x37 -{0x00,0x00,0xF0,0x38,0x08,0x45,0x08,0x42,0x08,0x42,0x08,0x45,0x90,0x45,0x60,0x38,0x00,0x00,0x00,0x00}, // 0x38 -{0x00,0x00,0x00,0x1E,0x08,0x21,0x88,0x40,0x88,0x40,0x88,0x40,0x30,0x21,0xC0,0x1F,0x00,0x00,0x00,0x00}, // 0x39 -{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x06,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x3A -{0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x06,0x1E,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x3B -{0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0x20,0x01,0x20,0x01,0x10,0x02,0x10,0x02,0x08,0x04,0x00,0x00}, // 0x3C -{0x00,0x00,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x01,0x00,0x00}, // 0x3D -{0x00,0x00,0x08,0x04,0x10,0x02,0x10,0x02,0x20,0x01,0x20,0x01,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00}, // 0x3E -{0x00,0x00,0x00,0x70,0x00,0x40,0xD8,0x40,0x00,0x41,0x00,0x42,0x00,0x64,0x00,0x38,0x00,0x00,0x00,0x00}, // 0x3F -{0xC0,0x0F,0x30,0x18,0x18,0x20,0xC8,0x47,0x28,0x48,0x68,0x50,0xD8,0x51,0xE0,0x3F,0x20,0x00,0x20,0x00}, // 0x40 -{0x08,0x00,0x70,0x00,0xC0,0x01,0x40,0x0E,0x40,0x18,0x40,0x0C,0x40,0x03,0xC0,0x00,0x30,0x00,0x08,0x00}, // 0x41 -{0x00,0x00,0xF8,0x1F,0x08,0x11,0x08,0x11,0x08,0x11,0x08,0x11,0x88,0x12,0x70,0x0C,0x00,0x00,0x00,0x00}, // 0x42 -{0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x18,0x00,0x00,0x00,0x00}, // 0x43 -{0x00,0x00,0xF8,0x1F,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0xE0,0x07,0x00,0x00,0x00,0x00}, // 0x44 -{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x08,0x10,0x00,0x00,0x00,0x00}, // 0x45 -{0x00,0x00,0xF8,0x1F,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x00,0x10,0x00,0x00,0x00,0x00}, // 0x46 -{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x88,0x10,0x88,0x10,0xF8,0x18,0x00,0x00}, // 0x47 -{0x00,0x00,0xF8,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00}, // 0x48 -{0x00,0x00,0x08,0x10,0x08,0x10,0x08,0x10,0xF8,0x1F,0x08,0x10,0x08,0x10,0x08,0x10,0x00,0x00,0x00,0x00}, // 0x49 -{0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x10,0x08,0x10,0x08,0x10,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x4A -{0x00,0x00,0xF8,0x1F,0x00,0x01,0x80,0x01,0x40,0x02,0x20,0x04,0x20,0x08,0x10,0x10,0x08,0x00,0x00,0x00}, // 0x4B -{0x00,0x00,0xF8,0x1F,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x4C -{0xF8,0x1F,0x00,0x1C,0x80,0x07,0xE0,0x00,0x60,0x00,0x80,0x03,0x00,0x1C,0xF8,0x1F,0x00,0x00,0x00,0x00}, // 0x4D -{0x00,0x00,0xF8,0x1F,0x00,0x08,0x00,0x06,0x80,0x01,0x60,0x00,0x10,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00}, // 0x4E -{0x00,0x00,0xE0,0x07,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0xE0,0x07,0x00,0x00}, // 0x4F -{0x00,0x00,0xF8,0x1F,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00}, // 0x50 -{0x00,0x00,0xE0,0x07,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x0C,0x10,0x12,0x08,0xE2,0x07,0x00,0x00}, // 0x51 -{0x00,0x00,0xF8,0x1F,0x80,0x10,0x80,0x10,0xC0,0x10,0x20,0x11,0x10,0x0E,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x52 -{0x00,0x00,0x18,0x0E,0x08,0x12,0x08,0x11,0x08,0x11,0x88,0x10,0x90,0x10,0x70,0x18,0x00,0x00,0x00,0x00}, // 0x53 -{0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0xF8,0x1F,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00}, // 0x54 -{0x00,0x00,0xE0,0x1F,0x18,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00}, // 0x55 -{0x00,0x10,0x00,0x0C,0x80,0x03,0x60,0x00,0x18,0x00,0x18,0x00,0xE0,0x00,0x00,0x03,0x00,0x0C,0x00,0x10}, // 0x56 -{0x00,0x18,0xC0,0x07,0x38,0x00,0xF0,0x00,0x00,0x07,0x80,0x03,0x70,0x00,0x38,0x00,0xC0,0x07,0x00,0x18}, // 0x57 -{0x08,0x10,0x10,0x08,0x20,0x04,0x40,0x02,0x80,0x01,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08,0x08,0x10}, // 0x58 -{0x00,0x10,0x00,0x08,0x00,0x06,0x00,0x01,0xF8,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10}, // 0x59 -{0x00,0x00,0x18,0x10,0x28,0x10,0x48,0x10,0x88,0x10,0x08,0x11,0x08,0x12,0x08,0x14,0x08,0x18,0x00,0x00}, // 0x5A -{0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x00,0x00,0x00}, // 0x5B -{0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0xC0,0x00,0x30,0x00,0x0C,0x00,0x02,0x00,0x00,0x00}, // 0x5C -{0x00,0x00,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x5D -{0x00,0x00,0x20,0x00,0xC0,0x00,0x00,0x07,0x00,0x1C,0x00,0x70,0x00,0x0E,0xC0,0x01,0x20,0x00,0x00,0x00}, // 0x5E -{0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}, // 0x5F -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x60 -{0x00,0x00,0x30,0x00,0x48,0x04,0x88,0x04,0x88,0x04,0x90,0x04,0xF8,0x03,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x61 -{0x00,0x00,0xF8,0x7F,0x10,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x10,0x06,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x62 -{0x00,0x00,0xE0,0x01,0x10,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x00,0x00,0x00,0x00}, // 0x63 -{0x00,0x00,0xE0,0x01,0x18,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x10,0x02,0xF8,0x7F,0x00,0x00,0x00,0x00}, // 0x64 -{0x00,0x00,0xE0,0x01,0x90,0x02,0x88,0x04,0x88,0x04,0x88,0x04,0x88,0x04,0x88,0x03,0x00,0x00,0x00,0x00}, // 0x65 -{0x00,0x00,0x00,0x04,0x00,0x04,0xF8,0x3F,0x00,0x24,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x00}, // 0x66 -{0x00,0x00,0xE0,0x01,0x19,0x02,0x09,0x04,0x09,0x04,0x09,0x04,0x12,0x02,0xFC,0x07,0x00,0x00,0x00,0x00}, // 0x67 -{0x00,0x00,0xF8,0x7F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0xF8,0x03,0x00,0x00,0x00,0x00}, // 0x68 -{0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x64,0xF8,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x69 -{0x00,0x00,0x01,0x00,0x01,0x04,0x01,0x04,0x01,0x64,0xFE,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x6A -{0x00,0x00,0xF8,0x7F,0x80,0x00,0xC0,0x00,0x20,0x01,0x20,0x02,0x10,0x02,0x08,0x04,0x00,0x00,0x00,0x00}, // 0x6B -{0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x6C -{0xF8,0x07,0x00,0x02,0x00,0x04,0x00,0x04,0xF8,0x03,0x00,0x02,0x00,0x04,0x00,0x04,0xF8,0x03,0x00,0x00}, // 0x6D -{0x00,0x00,0xF8,0x07,0x00,0x03,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0xF8,0x03,0x00,0x00,0x00,0x00}, // 0x6E -{0x00,0x00,0xE0,0x01,0x10,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x10,0x02,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x6F -{0x00,0x00,0xFF,0x07,0x10,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x10,0x06,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x70 -{0x00,0x00,0xE0,0x01,0x18,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x10,0x02,0xFF,0x07,0x00,0x00,0x00,0x00}, // 0x71 -{0x00,0x00,0x00,0x00,0xF8,0x07,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00}, // 0x72 -{0x00,0x00,0x18,0x03,0x88,0x04,0x88,0x04,0x48,0x04,0x48,0x04,0x30,0x04,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x73 -{0x00,0x00,0x00,0x04,0x00,0x04,0xF0,0x1F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x00,0x00,0x00,0x00}, // 0x74 -{0x00,0x00,0xF0,0x07,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x75 -{0x00,0x04,0x80,0x03,0x60,0x00,0x18,0x00,0x08,0x00,0x30,0x00,0xC0,0x00,0x00,0x03,0x00,0x04,0x00,0x00}, // 0x76 -{0x00,0x06,0xE0,0x01,0x18,0x00,0x70,0x00,0x80,0x03,0x80,0x01,0x70,0x00,0x18,0x00,0xE0,0x01,0x00,0x06}, // 0x77 -{0x00,0x00,0x08,0x04,0x10,0x02,0x20,0x01,0xC0,0x00,0xC0,0x00,0x20,0x01,0x10,0x02,0x08,0x04,0x00,0x00}, // 0x78 -{0x01,0x04,0x01,0x03,0xC1,0x00,0x62,0x00,0x1C,0x00,0x18,0x00,0x60,0x00,0x80,0x00,0x00,0x03,0x00,0x04}, // 0x79 -{0x00,0x00,0x08,0x04,0x18,0x04,0x28,0x04,0x48,0x04,0x88,0x04,0x08,0x05,0x08,0x06,0x08,0x04,0x00,0x00}, // 0x7A -{0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x7C,0x3F,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x00,0x00,0x00}, // 0x7B -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x7C -{0x00,0x00,0x00,0x00,0x02,0x40,0x02,0x40,0x02,0x40,0x7C,0x3F,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00}, // 0x7D -{0xC0,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x01}, // 0x7E -{0x00,0x00,0xF8,0x01,0x08,0x03,0x08,0x04,0x08,0x08,0x08,0x04,0x08,0x03,0xF8,0x01,0x00,0x00,0x00,0x00}, // 0x7F -{0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x09,0x10,0x0D,0x10,0x0B,0x18,0x00,0x00,0x00,0x00}, // 0x80 -{0x00,0x00,0xF0,0x07,0x08,0x20,0x08,0x00,0x08,0x00,0x10,0x20,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x81 -{0x00,0x00,0xE0,0x01,0x90,0x02,0x88,0x04,0x88,0x24,0x88,0x44,0x88,0x04,0x88,0x03,0x00,0x00,0x00,0x00}, // 0x82 -{0x00,0x00,0x30,0x00,0x48,0x24,0x88,0x44,0x88,0x44,0x90,0x24,0xF8,0x03,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x83 -{0x00,0x00,0x30,0x00,0x48,0x24,0x88,0x04,0x88,0x04,0x90,0x24,0xF8,0x03,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x84 -{0x00,0x00,0x30,0x00,0x48,0x44,0x88,0x24,0x88,0x04,0x90,0x04,0xF8,0x03,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x85 -{0x00,0x00,0x30,0x00,0x48,0x04,0x88,0x44,0x88,0xA4,0x90,0x44,0xF8,0x03,0x08,0x00,0x00,0x00,0x00,0x00}, // 0x86 -{0x00,0x00,0xE0,0x01,0x10,0x02,0x08,0x04,0x09,0x04,0x0D,0x04,0x0B,0x04,0x08,0x04,0x00,0x00,0x00,0x00}, // 0x87 -{0x00,0x00,0xE0,0x01,0x90,0x22,0x88,0x44,0x88,0x44,0x88,0x24,0x88,0x04,0x88,0x03,0x00,0x00,0x00,0x00}, // 0x88 -{0x00,0x00,0xE0,0x01,0x90,0x02,0x88,0x24,0x88,0x04,0x88,0x04,0x88,0x24,0x88,0x03,0x00,0x00,0x00,0x00}, // 0x89 -{0x00,0x00,0xE0,0x01,0x90,0x02,0x88,0x44,0x88,0x24,0x88,0x04,0x88,0x04,0x88,0x03,0x00,0x00,0x00,0x00}, // 0x8A -{0x00,0x00,0x00,0x04,0x00,0x24,0x00,0x04,0xF8,0x07,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x8B -{0x00,0x00,0x00,0x04,0x00,0x24,0x00,0x44,0xF8,0x47,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x8C -{0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x44,0xF8,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x8D -{0x08,0x00,0x70,0x00,0xC0,0x81,0x40,0x0E,0x40,0x18,0x40,0x0C,0x40,0x83,0xC0,0x00,0x30,0x00,0x08,0x00}, // 0x8E -{0x08,0x00,0x70,0x00,0xC0,0x01,0x40,0x4E,0x40,0xB0,0x40,0xB8,0x40,0x4F,0xC0,0x01,0x70,0x00,0x08,0x00}, // 0x8F -{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x50,0x88,0x90,0x88,0x10,0x08,0x10,0x00,0x00,0x00,0x00}, // 0x90 -{0x70,0x04,0xC8,0x04,0x88,0x04,0x88,0x04,0xF0,0x03,0x98,0x04,0x88,0x04,0x88,0x04,0x88,0x03,0x00,0x00}, // 0x91 -{0x08,0x00,0x30,0x00,0xE0,0x01,0x20,0x06,0x20,0x18,0xF8,0x1F,0x88,0x10,0x88,0x10,0x08,0x10,0x00,0x00}, // 0x92 -{0x00,0x00,0xE0,0x01,0x10,0x22,0x08,0x44,0x08,0x44,0x08,0x24,0x10,0x02,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x93 -{0x00,0x00,0xE0,0x01,0x10,0x22,0x08,0x04,0x08,0x04,0x08,0x24,0x10,0x02,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x94 -{0x00,0x00,0xE0,0x01,0x10,0x42,0x08,0x24,0x08,0x04,0x08,0x04,0x10,0x02,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0x95 -{0x00,0x00,0xF0,0x07,0x08,0x20,0x08,0x40,0x08,0x40,0x10,0x20,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x96 -{0x00,0x00,0xF0,0x07,0x08,0x40,0x08,0x20,0x08,0x00,0x10,0x00,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x97 -{0x01,0x04,0x01,0x03,0xC1,0x20,0x62,0x00,0x1C,0x00,0x18,0x20,0x60,0x00,0x80,0x00,0x00,0x03,0x00,0x04}, // 0x98 -{0x00,0x00,0xE0,0x07,0x10,0x88,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x90,0x10,0x08,0xE0,0x07,0x00,0x00}, // 0x99 -{0x00,0x00,0xE0,0x1F,0x18,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x80,0xE0,0x1F,0x00,0x00,0x00,0x00}, // 0x9A -{0x00,0x00,0xE8,0x01,0x10,0x02,0x28,0x04,0xC8,0x04,0x08,0x05,0x10,0x02,0xE0,0x05,0x00,0x00,0x00,0x00}, // 0x9B -{0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x02,0xE8,0x3F,0x08,0x42,0x08,0x42,0x08,0x40,0x00,0x00,0x00,0x00}, // 0x9C -{0x00,0x00,0xE8,0x07,0x30,0x08,0x68,0x10,0x88,0x10,0x08,0x11,0x08,0x16,0x10,0x0C,0xE0,0x17,0x00,0x00}, // 0x9D -{0x00,0x00,0x08,0x04,0x10,0x02,0x20,0x01,0xC0,0x00,0xC0,0x00,0x20,0x01,0x10,0x02,0x08,0x04,0x00,0x00}, // 0x9E -{0x00,0x00,0x01,0x00,0x01,0x04,0x01,0x04,0xFE,0x7F,0x00,0x84,0x00,0x84,0x00,0x80,0x00,0x00,0x00,0x00}, // 0x9F -{0x00,0x00,0x30,0x00,0x48,0x04,0x88,0x04,0x88,0x24,0x90,0x44,0xF8,0x03,0x08,0x00,0x00,0x00,0x00,0x00}, // 0xA0 -{0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0xF8,0x27,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xA1 -{0x00,0x00,0xE0,0x01,0x10,0x02,0x08,0x04,0x08,0x24,0x08,0x44,0x10,0x02,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0xA2 -{0x00,0x00,0xF0,0x07,0x08,0x00,0x08,0x00,0x08,0x20,0x10,0x40,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xA3 -{0x00,0x00,0xF8,0x07,0x00,0x23,0x00,0x42,0x00,0x24,0x00,0x24,0x00,0x44,0xF8,0x03,0x00,0x00,0x00,0x00}, // 0xA4 -{0x00,0x00,0xF8,0x1F,0x00,0x48,0x00,0x86,0x80,0xC1,0x60,0x40,0x10,0x80,0xF8,0x1F,0x00,0x00,0x00,0x00}, // 0xA5 -{0x00,0x00,0x00,0x00,0x00,0x4C,0x00,0x52,0x00,0x52,0x00,0x52,0x00,0x3E,0x00,0x02,0x00,0x00,0x00,0x00}, // 0xA6 -{0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00}, // 0xA7 -{0x00,0x00,0x0E,0x00,0x13,0x00,0x11,0x00,0x21,0x00,0xC1,0x06,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x00}, // 0xA8 -{0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x5D,0x00,0x55,0x00,0x5D,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00}, // 0xA9 -{0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xE0,0x01,0x00,0x00}, // 0xAA -{0x08,0x40,0x30,0x7E,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x08,0x08,0x31,0x38,0x41,0x28,0x01,0xC8,0x00}, // 0xAB -{0x08,0x40,0x30,0x7E,0x40,0x00,0x80,0x01,0x00,0x06,0x60,0x08,0xA0,0x30,0x20,0x41,0xF8,0x01,0x20,0x00}, // 0xAC -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xAD -{0x00,0x00,0x80,0x00,0x40,0x01,0x20,0x02,0x10,0x04,0x80,0x00,0x40,0x01,0x20,0x02,0x10,0x04,0x00,0x00}, // 0xAE -{0x00,0x00,0x10,0x04,0x20,0x02,0x40,0x01,0x80,0x00,0x10,0x04,0x20,0x02,0x40,0x01,0x80,0x00,0x00,0x00}, // 0xAF -{0x36,0xDB,0x36,0xDB,0x00,0x00,0x36,0xDB,0x36,0xDB,0x00,0x00,0x36,0xDB,0x36,0xDB,0x00,0x00,0x00,0x00}, // 0xB0 -{0xDB,0x36,0xDB,0x36,0x36,0xDB,0xFF,0xFF,0xDB,0x36,0x36,0xDB,0xFF,0xFF,0xDB,0x36,0x36,0xDB,0x36,0xDB}, // 0xB1 -{0xFF,0xFF,0xFF,0xFF,0x36,0xDB,0xFF,0xFF,0xFF,0xFF,0x36,0xDB,0xFF,0xFF,0xFF,0xFF,0x36,0xDB,0x36,0xDB}, // 0xB2 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xB3 -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xB4 -{0x08,0x00,0x70,0x00,0xC0,0x01,0x40,0x0E,0x40,0x58,0x40,0x8C,0x40,0x03,0xC0,0x00,0x30,0x00,0x08,0x00}, // 0xB5 -{0x08,0x00,0x70,0x00,0xC0,0x01,0x40,0x4E,0x40,0x98,0x40,0x8C,0x40,0x43,0xC0,0x00,0x30,0x00,0x08,0x00}, // 0xB6 -{0x08,0x00,0x70,0x00,0xC0,0x01,0x40,0x8E,0x40,0x58,0x40,0x0C,0x40,0x03,0xC0,0x00,0x30,0x00,0x08,0x00}, // 0xB7 -{0xC0,0x0F,0x30,0x30,0x98,0x67,0xC8,0x4C,0x48,0x48,0x48,0x48,0x58,0x68,0x30,0x30,0xC0,0x0F,0x00,0x00}, // 0xB8 -{0x40,0x01,0x40,0x01,0x40,0x01,0x7F,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xB9 -{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xBA -{0x40,0x01,0x40,0x01,0x40,0x01,0x7F,0x01,0x00,0x01,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xBB -{0x40,0x01,0x40,0x01,0x40,0x01,0x40,0xFF,0x40,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xBC -{0x00,0x00,0xC0,0x0F,0x20,0x10,0x30,0x20,0x10,0x20,0xF8,0x7F,0x10,0x20,0x10,0x20,0x00,0x00,0x00,0x00}, // 0xBD -{0x00,0x40,0x00,0x20,0x20,0x19,0x20,0x05,0xF8,0x03,0x20,0x05,0x20,0x09,0x00,0x10,0x00,0x20,0x00,0x40}, // 0xBE -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xBF -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xC0 -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xC1 -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xC2 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xC3 -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xC4 -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xC5 -{0x00,0x00,0x30,0x00,0x48,0x24,0x88,0x44,0x88,0x24,0x90,0x24,0xF8,0x43,0x08,0x00,0x00,0x00,0x00,0x00}, // 0xC6 -{0x08,0x00,0x70,0x00,0xC0,0x41,0x40,0x8E,0x40,0xD8,0x40,0x4C,0x40,0x83,0xC0,0x00,0x30,0x00,0x08,0x00}, // 0xC7 -{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x40,0x00,0x40,0xFF,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xC8 -{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x00,0x01,0x7F,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xC9 -{0x40,0x01,0x40,0x01,0x40,0x01,0x40,0xFF,0x40,0x00,0x40,0xFF,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xCA -{0x40,0x01,0x40,0x01,0x40,0x01,0x7F,0x01,0x00,0x01,0x7F,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xCB -{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x7F,0xFF,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xCC -{0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xCD -{0x40,0x01,0x40,0x01,0x40,0x01,0x7F,0xFF,0x00,0x00,0x7F,0xFF,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01}, // 0xCE -{0x00,0x00,0x20,0x10,0xC0,0x0F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0xC0,0x0F,0x20,0x10,0x00,0x00}, // 0xCF -{0x00,0x00,0xE0,0x41,0x10,0x52,0x08,0x74,0x08,0x24,0x08,0x54,0x10,0x0E,0xE0,0x03,0x00,0x00,0x00,0x00}, // 0xD0 -{0x00,0x01,0xF8,0x1F,0x08,0x11,0x08,0x11,0x08,0x10,0x08,0x10,0x10,0x08,0xE0,0x07,0x00,0x00,0x00,0x00}, // 0xD1 -{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x50,0x88,0x90,0x88,0x90,0x88,0x50,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xD2 -{0x00,0x00,0xF8,0x1F,0x88,0x90,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x90,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xD3 -{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x90,0x88,0x50,0x88,0x10,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xD4 -{0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0xF8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xD5 -{0x00,0x00,0x08,0x10,0x08,0x10,0x08,0x10,0xF8,0x5F,0x08,0x90,0x08,0x10,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xD6 -{0x00,0x00,0x08,0x10,0x08,0x10,0x08,0x50,0xF8,0x9F,0x08,0x90,0x08,0x50,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xD7 -{0x00,0x00,0x08,0x10,0x08,0x90,0x08,0x10,0xF8,0x1F,0x08,0x10,0x08,0x90,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xD8 -{0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xD9 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00}, // 0xDA -{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, // 0xDB -{0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00}, // 0xDC -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xDD -{0x00,0x00,0x08,0x10,0x08,0x10,0x08,0x90,0xF8,0x5F,0x08,0x10,0x08,0x10,0x08,0x10,0x00,0x00,0x00,0x00}, // 0xDE -{0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF}, // 0xDF -{0x00,0x00,0xE0,0x07,0x10,0x08,0x08,0x10,0x08,0x50,0x08,0x90,0x08,0x10,0x10,0x08,0xE0,0x07,0x00,0x00}, // 0xE0 -{0x00,0x00,0xF8,0x3F,0x00,0x40,0x00,0x40,0x08,0x47,0x88,0x38,0x48,0x00,0x30,0x00,0x00,0x00,0x00,0x00}, // 0xE1 -{0x00,0x00,0xE0,0x07,0x10,0x08,0x08,0x50,0x08,0x90,0x08,0x90,0x08,0x50,0x10,0x08,0xE0,0x07,0x00,0x00}, // 0xE2 -{0x00,0x00,0xE0,0x07,0x10,0x08,0x08,0x90,0x08,0x50,0x08,0x10,0x08,0x10,0x10,0x08,0xE0,0x07,0x00,0x00}, // 0xE3 -{0x00,0x00,0xE0,0x01,0x10,0x22,0x08,0x44,0x08,0x24,0x08,0x24,0x10,0x42,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0xE4 -{0x00,0x00,0xE0,0x07,0x10,0x48,0x08,0x90,0x08,0xD0,0x08,0x50,0x08,0x90,0x10,0x08,0xE0,0x07,0x00,0x00}, // 0xE5 -{0x00,0x00,0xFF,0x07,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0xF8,0x07,0x00,0x00,0x00,0x00}, // 0xE6 -{0x00,0x00,0xFF,0x7F,0x10,0x02,0x08,0x04,0x08,0x04,0x08,0x04,0x10,0x06,0xE0,0x01,0x00,0x00,0x00,0x00}, // 0xE7 -{0x00,0x00,0xF8,0x1F,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x40,0x04,0x80,0x03,0x00,0x00,0x00,0x00}, // 0xE8 -{0x00,0x00,0xE0,0x1F,0x18,0x00,0x08,0x00,0x08,0x40,0x08,0x80,0x10,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00}, // 0xE9 -{0x00,0x00,0xE0,0x1F,0x18,0x00,0x08,0x40,0x08,0x80,0x08,0x80,0x10,0x40,0xE0,0x1F,0x00,0x00,0x00,0x00}, // 0xEA -{0x00,0x00,0xE0,0x1F,0x18,0x00,0x08,0x80,0x08,0x40,0x08,0x00,0x10,0x00,0xE0,0x1F,0x00,0x00,0x00,0x00}, // 0xEB -{0x01,0x04,0x01,0x03,0xC1,0x00,0x62,0x00,0x1C,0x20,0x18,0x40,0x60,0x00,0x80,0x00,0x00,0x03,0x00,0x04}, // 0xEC -{0x00,0x10,0x00,0x08,0x00,0x06,0x00,0x01,0xF8,0x40,0x00,0x81,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10}, // 0xED -{0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80}, // 0xEE -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xEF -{0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00}, // 0xF0 -{0x00,0x00,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0xC8,0x07,0x08,0x01,0x08,0x01,0x08,0x01,0x00,0x00}, // 0xF1 -{0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00}, // 0xF2 -{0x08,0x42,0x10,0x52,0x20,0x5A,0xC0,0x6C,0x00,0x01,0x60,0x02,0xA0,0x0C,0x20,0x11,0xF8,0x21,0x20,0x40}, // 0xF3 -{0x00,0x00,0x00,0x38,0x00,0x7C,0x00,0x7E,0xFE,0x7F,0x00,0x40,0x00,0x40,0xFE,0x7F,0x00,0x00,0x00,0x00}, // 0xF4 -{0x00,0x00,0x00,0x00,0x86,0x3B,0xC2,0x4C,0x42,0x44,0x62,0x46,0x32,0x42,0xDC,0x41,0x00,0x00,0x00,0x00}, // 0xF5 -{0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x58,0x06,0x58,0x06,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00}, // 0xF6 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xF7 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x48,0x00,0x48,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xF8 -{0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xF9 -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xFA -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xFB -{0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x52,0x00,0x52,0x00,0x52,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xFC -{0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x46,0x00,0x4A,0x00,0x4A,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00}, // 0xFD -{0x00,0x00,0xF8,0x07,0xF8,0x07,0xF8,0x07,0xF8,0x07,0xF8,0x07,0xF8,0x07,0xF8,0x07,0xF8,0x07,0x00,0x00}, // 0xFE -{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // 0xFF -}; \ No newline at end of file diff --git a/zbs243_Tag_FW/font.h b/zbs243_Tag_FW/font.h new file mode 120000 index 00000000..995855e4 --- /dev/null +++ b/zbs243_Tag_FW/font.h @@ -0,0 +1 @@ +../zbs243_shared/font.h \ No newline at end of file diff --git a/zbs243_Tag_FW/fw154.bin b/zbs243_Tag_FW/fw154.bin deleted file mode 100644 index 81a5668a..00000000 Binary files a/zbs243_Tag_FW/fw154.bin and /dev/null differ diff --git a/zbs243_Tag_FW/fw29-uc8151.bin b/zbs243_Tag_FW/fw29-uc8151.bin deleted file mode 100644 index 081fe4fa..00000000 Binary files a/zbs243_Tag_FW/fw29-uc8151.bin and /dev/null differ diff --git a/zbs243_Tag_FW/fw29.bin b/zbs243_Tag_FW/fw29.bin deleted file mode 100644 index b8331b58..00000000 Binary files a/zbs243_Tag_FW/fw29.bin and /dev/null differ diff --git a/zbs243_Tag_FW/fw42.bin b/zbs243_Tag_FW/fw42.bin deleted file mode 100644 index 508b0085..00000000 Binary files a/zbs243_Tag_FW/fw42.bin and /dev/null differ diff --git a/zbs243_Tag_FW/lut.h b/zbs243_Tag_FW/lut.h deleted file mode 100644 index 4f9eba67..00000000 --- a/zbs243_Tag_FW/lut.h +++ /dev/null @@ -1,54 +0,0 @@ -#define __packed - -#include "screen.h" - -#define LUTGROUP_NEGATIVE 0 -#define LUTGROUP_FASTBLINK 1 -#define LUTGROUP_SLOWBLINK 2 -#define LUTGROUP_SET 3 -#define LUTGROUP_IMPROVE_SHARPNESS 4 -#define LUTGROUP_IMPROVE_REDS 5 -#define LUTGROUP_UNUSED 6 - -#define LUTGROUP_UNKNOWN 7 -#define LUTGROUP_UNUSED3 8 -#define LUTGROUP_UNUSED4 9 - - -struct vgroup { - uint8_t A : 2; - uint8_t B : 2; - uint8_t C : 2; - uint8_t D : 2; -} __packed; - -struct lut { - struct vgroup group[7]; -} __packed; - -struct lut10 { - struct vgroup group[10]; -} __packed; - -struct group { - uint8_t phaselength[4]; - uint8_t repeat; -} __packed; - -struct waveform { - struct lut lut[5]; - struct group group[7]; - uint8_t gatelevel; - uint8_t sourcelevel[3]; - uint8_t dummyline; - uint8_t gatewidth; -} __packed; - -struct waveform10 { - struct lut10 lut[5]; - struct group group[10]; - uint8_t gatelevel; - uint8_t sourcelevel[3]; - uint8_t dummyline; - uint8_t gatewidth; -} __packed; \ No newline at end of file diff --git a/zbs243_Tag_FW/lut.h b/zbs243_Tag_FW/lut.h new file mode 120000 index 00000000..64d1fa03 --- /dev/null +++ b/zbs243_Tag_FW/lut.h @@ -0,0 +1 @@ +../zbs243_shared/lut.h \ No newline at end of file diff --git a/zbs243_Tag_FW/printf.h b/zbs243_Tag_FW/printf.h deleted file mode 100644 index 8ca2eea5..00000000 --- a/zbs243_Tag_FW/printf.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _PRINTF_H_ -#define _PRINTF_H_ - - -//our printf has some special abilities -//for example "*" will modify the param to be a __xdata pointer to whatever it would have been instead -//it must then be paramed as "(uintptr_near_t)&value" -//for cc1110 (but not for ZBS) code and xdata addrs are the same, so __code pointers will also work! - -//"%s" param takes a generic pointer, but assumes it is an xdata/code (no string support in pdata/idata) -//"%ls" takes an xdata(/code in cc111x) pointer instead :) - -//"%m/%M" will print a mac, an __xdata pointer to which has been provided - -//no support for passing NULL to %s - -//not re-entrant if %d/%u are used - -#pragma callee_saves pr -void pr(const char __code *fmt, ...) __reentrant; - -#pragma callee_saves epdpr -void epdpr(const char __code *fmt, ...) __reentrant; - -#pragma callee_saves spr -void spr(char __xdata* out, const char __code *fmt, ...) __reentrant; - - - -#endif diff --git a/zbs243_Tag_FW/printf.h b/zbs243_Tag_FW/printf.h new file mode 120000 index 00000000..208adb6c --- /dev/null +++ b/zbs243_Tag_FW/printf.h @@ -0,0 +1 @@ +../zbs243_shared/printf.h \ No newline at end of file diff --git a/zbs243_Tag_FW/proto.h b/zbs243_Tag_FW/proto.h deleted file mode 100644 index 1a3e9f6e..00000000 --- a/zbs243_Tag_FW/proto.h +++ /dev/null @@ -1,188 +0,0 @@ -#ifndef _PROTO_H_ -#define _PROTO_H_ -#define __packed -#include - -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 SOLUM_154_033 0 -#define SOLUM_29_033 1 -#define SOLUM_42_033 2 - -#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; // undefined, as of now -} __packed; - -#define CAPABILITY_HAS_WAKE_BUTTON 0x20 -#define CAPABILITY_HAS_NFC 0x40 -#define CAPABILITY_NFC_WAKE 0x80 - -#define DATATYPE_NOUPDATE 0 -#define DATATYPE_IMG_BMP 2 -#define DATATYPE_FW_UPDATE 3 -#define DATATYPE_IMG_DIFF 0x10 // always 1BPP -#define DATATYPE_IMG_RAW_1BPP 0x20 // 2888 bytes for 1.54" / 4736 2.9" / 15000 4.2" -#define DATATYPE_IMG_RAW_2BPP 0x21 // 5776 bytes for 1.54" / 9472 2.9" / 30000 4.2" -#define DATATYPE_IMG_RAW_1BPP_DIRECT 0x3F // only for 1.54", don't write to EEPROM, but straightaway to the EPD -#define DATATYPE_NFC_RAW_CONTENT 0xA0 // raw memory content for the NT3H1101 -#define DATATYPE_NFC_URL_DIRECT 0xA1 // URL format for NT3H1101 - - - -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; - -#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] - -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/proto.h b/zbs243_Tag_FW/proto.h new file mode 120000 index 00000000..fed53c0e --- /dev/null +++ b/zbs243_Tag_FW/proto.h @@ -0,0 +1 @@ +../zbs243_shared/proto.h \ No newline at end of file diff --git a/zbs243_Tag_FW/sleep.h b/zbs243_Tag_FW/sleep.h deleted file mode 100644 index 02b06c46..00000000 --- a/zbs243_Tag_FW/sleep.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _SLEEP_H_ -#define _SLEEP_H_ - -#include - - -void sleepForMsec(uint32_t msec); -void sleepTillInt(void); //assumes you left only one int enabled! - -#endif diff --git a/zbs243_Tag_FW/sleep.h b/zbs243_Tag_FW/sleep.h new file mode 120000 index 00000000..110761e6 --- /dev/null +++ b/zbs243_Tag_FW/sleep.h @@ -0,0 +1 @@ +../zbs243_shared/sleep.h \ No newline at end of file diff --git a/zbs243_Tag_FW/soc b/zbs243_Tag_FW/soc new file mode 120000 index 00000000..18e4afb2 --- /dev/null +++ b/zbs243_Tag_FW/soc @@ -0,0 +1 @@ +../zbs243_shared/soc \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/radioCommon.h b/zbs243_Tag_FW/soc/radioCommon.h deleted file mode 100644 index 99937234..00000000 --- a/zbs243_Tag_FW/soc/radioCommon.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef _RADIO_COMMON_H_ -#define _RADIO_COMMON_H_ - -#include -#include - - -//radio cfg -#define RADIO_FIRST_CHANNEL (11) //2.4-GHz channels start at 11 -#define RADIO_NUM_CHANNELS (15) - - -#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 - - -void radioInit(void); -bool radioTx(const void __xdata* packet); //waits for tx end - -#pragma callee_saves radioRxAckReset -void radioRxAckReset(void); -#pragma callee_saves radioRxAckGetLast -int16_t radioRxAckGetLast(void); //get seq of lask ack we got or -1 if none -void radioRxFilterCfg(const uint8_t __xdata *filterForLong, uint32_t myShortMac, uint16_t myPan); -void radioRxEnable(__bit on, __bit autoAck); - -#pragma callee_saves radioSetTxPower -void radioSetTxPower(int8_t dBm); //-30..+10 dBm - -#pragma callee_saves radioSetChannel -void radioSetChannel(uint8_t ch); - -void radioRxFlush(void); -int8_t radioRxDequeuePktGet(const void __xdata * __xdata *dstBufP, uint8_t __xdata *lqiP, int8_t __xdata *rssiP); -void radioRxDequeuedPktRelease(void); - - - - - -#endif - - - - diff --git a/zbs243_Tag_FW/soc/zbs243/.uart.asm.swp b/zbs243_Tag_FW/soc/zbs243/.uart.asm.swp deleted file mode 100644 index 671c1db3..00000000 Binary files a/zbs243_Tag_FW/soc/zbs243/.uart.asm.swp and /dev/null differ diff --git a/zbs243_Tag_FW/soc/zbs243/flash.c b/zbs243_Tag_FW/soc/zbs243/flash.c deleted file mode 100644 index 69900a24..00000000 --- a/zbs243_Tag_FW/soc/zbs243/flash.c +++ /dev/null @@ -1,182 +0,0 @@ -#include -#include "asmUtil.h" -#include "printf.h" -#include "flash.h" -#include "cpu.h" - - - -#pragma callee_saves flashAddrCheck -static uint8_t flashAddrCheck(uint32_t flashAddr, uint16_t len) __reentrant /* to save ram space */ // return 0xff for error, pgNo -{ - uint16_t dstOfst; - uint8_t pgNo; - - if (!len) - return 0xff; - - //verify address - if ((uint8_t)(flashAddr >> 24)) - return 0xff; - - switch ((uint8_t)(flashAddr >> 16)) { - case 0x00: - pgNo = ((uint8_t)(flashAddr >> 8)) >> 2; - break; - - case 0x80: - if (pgNo) - return 0xff; - pgNo = 0x80; - break; - - default: - return 0xff; - } - - dstOfst = flashAddr & 0x3ff; - //verify no boundary crossing - if (((uint8_t)((dstOfst + len - 1) >> 8)) >> 2) //yeah...sdcc - return 0xff; - - return pgNo; -} - -//info page is "at" 0x10000 -#pragma callee_saves flashWrite -__bit flashWrite(uint32_t dstAddr, const void __xdata *src, uint16_t len, __bit alsoErase /*whole page */) -{ - uint8_t pgNo, cfgPg, speed; - __bit irq; - - pgNo = flashAddrCheck(dstAddr, len); - if (pgNo == 0xff) - return false; - - irq = IEN_EA; - IEN_EA = false; - - speed = CLKSPEED; - CLKSPEED = 0x21; //flash ops only work at this speed - - cfgPg = CFGPAGE; - CFGPAGE = 4; - - if (alsoErase) - SETTINGS |= 0x38; - else - SETTINGS = 0x18; - FWRTHREE = 3; - FPGNO = pgNo; - FWRDSTL = (uint8_t)dstAddr; - FWRDSTH = (((uint16_t)dstAddr) >> 8) & 0x03; - FWRLENL = (uint8_t)(len - 1); - FWRLENH = (len - 1) >> 8; - FWRSRCL = (uint8_t)src; - FWRSRCH = ((uint16_t)src) >> 8; - TRIGGER |= 8; //start - while (!(TCON2 & 0x08)); //wait - - TCON2 &=~ 0x48; - SETTINGS &=~ 0x10; - - CFGPAGE = cfgPg; - - CLKSPEED = speed; - - IEN_EA = irq; - - return true; -} - -#pragma callee_saves flashRead -__bit flashRead(uint32_t srcAddr, void __xdata *dst, uint16_t len) -{ - uint8_t pgNo, cfgPg, speed; - __bit irq; - - pgNo = flashAddrCheck(srcAddr, len); - if (pgNo == 0xff) - return false; - - irq = IEN_EA; - IEN_EA = false; - - speed = CLKSPEED; - CLKSPEED = 0x21; //flash ops only work at this speed - - cfgPg = CFGPAGE; - CFGPAGE = 4; - - SETTINGS = 0x8; - FWRTHREE = 3; - FPGNO = pgNo; - FWRDSTL = (uint8_t)dst; - FWRDSTH = ((uint16_t)dst) >> 8; - FWRSRCL = (uint8_t)srcAddr; - FWRSRCH = (((uint16_t)srcAddr) >> 8) & 0x03; - FWRLENL = (uint8_t)(len - 1); - FWRLENH = (len - 1) >> 8; - TRIGGER |= 8; //start - - while (!(TCON2 & 0x08)); //wait - - TCON2 &=~ 0x48; - SETTINGS &=~ 0x10; - - CFGPAGE = cfgPg; - - CLKSPEED = speed; - - IEN_EA = irq; - - return true; -} - -#pragma callee_saves flashErase -__bit flashErase(uint32_t dstAddr) -{ - uint8_t __xdata dummyByte = 0xff; - uint8_t pgNo, cfgPg, speed; - __bit irq; - - pgNo = flashAddrCheck(dstAddr, 1); - - if (pgNo == 0xff) - return false; - - irq = IEN_EA; - IEN_EA = false; - - speed = CLKSPEED; - CLKSPEED = 0x21; //flash ops only work at this speed - - cfgPg = CFGPAGE; - CFGPAGE = 4; - - //this command does an erase AND a write (erase of page, write up to a page at given offset and len) - // i found no way to JUST erase. As len is encoded at "minus one", we cannot ask the hardware to write - // zeor bytes, so we write one - a 0xFF dummy - SETTINGS |= 0x38; - FWRTHREE = 3; - FPGNO = pgNo; - FWRDSTL = 0; - FWRDSTH = 0; - FWRLENL = 0; - FWRLENH = 0; - FWRSRCL = (uint8_t)&dummyByte; - FWRSRCH = ((uint16_t)&dummyByte) >> 8; - TRIGGER |= 8; //start - while (!(TCON2 & 0x08)); //wait - - TCON2 &=~ 0x48; - SETTINGS &=~ 0x10; - - CFGPAGE = cfgPg; - - CLKSPEED = speed; - - IEN_EA = irq; - - return true; -} diff --git a/zbs243_Tag_FW/soc/zbs243/flash.h b/zbs243_Tag_FW/soc/zbs243/flash.h deleted file mode 100644 index 2c03e2cb..00000000 --- a/zbs243_Tag_FW/soc/zbs243/flash.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _FLASH_ZBS_H_ -#define _FLASH_ZBS_H_ - -#include - -#define FLASH_PAGE_SHIFT (10) -#define FLASH_PAGE_SIZE (1 << FLASH_PAGE_SHIFT) -#define FLASH_NUM_PAGES (64) - -#define FLASH_INFOPAGE_ADDR (0x00800000ul) - - - -#pragma callee_saves flashErase -__bit flashErase(uint32_t dstAddr); - -#pragma callee_saves flashRead -__bit flashRead(uint32_t srcAddr, void __xdata *dst, uint16_t len); - -#pragma callee_saves flashWrite -__bit flashWrite(uint32_t dstAddr, const void __xdata *src, uint16_t len, __bit alsoErase /*whole page */); - -#endif diff --git a/zbs243_Tag_FW/soc/zbs243/i2c.c b/zbs243_Tag_FW/soc/zbs243/i2c.c deleted file mode 100644 index 633f389d..00000000 --- a/zbs243_Tag_FW/soc/zbs243/i2c.c +++ /dev/null @@ -1,126 +0,0 @@ -#include "i2c.h" - -#include "printf.h" -#include "uart.h" -#include "zbs243.h" - -static volatile struct I2cTransaction __xdata *__xdata mCurTrans; -static volatile uint8_t __xdata mNumTrans; -static volatile uint8_t __xdata mResult; - -#pragma callee_saves i2cInit -void i2cInit(void) { - uint8_t bkp; - - CLKEN |= 0x10; - - bkp = CFGPAGE; - CFGPAGE = 0; - - IEN1 |= 4; // int on - I2CUNKNOWN |= 4; - - I2CCTL = 0x43; // master mode - I2CSPEED = 0x1a; // 100KHz - I2CCTL |= 0x80; // irq on - - CFGPAGE = bkp; -} - -// this code assumes HW stat emachine acts as it should. for this chip that seems to be true -// this is an 8051 so we value speed & code size over defensive programming. So sue me! -void I2C_IRQ(void) __interrupt(8) { - uint8_t bkp, sta; - - bkp = CFGPAGE; - CFGPAGE = 0; - - sta = I2CSTATE; - //pr("state=%02X\n", sta); - switch (sta >> 3) { - case 0x08 / 8: // start completed - case 0x10 / 8: // restart completed - I2CBUF = mCurTrans->deviceAddr; - break; - - case 0x30 / 8: // byte write was NAKed - if (mCurTrans->numBytes) { // we still had more bytes to send? - I2CCTL |= 0x10; // stop - mResult = I2cNonLastDataByteNAKed; - break; - } - // fallthough since it is ok to NAK last written byte - - case 0x28 / 8: // byte write was ACKed - case 0x18 / 8: // addr ACKED in write mode - if (mCurTrans->numBytes) { - mCurTrans->numBytes--; - I2CBUF = *mCurTrans->bytes++; - break; - } - transaction_over: - if (!--mNumTrans) { // byte(s)written and no more transactions? STOP - - mResult = I2cOK; - I2CCTL |= 0x10; // stop - } else { // we have another transaction? RESTART - - mCurTrans++; - I2CCTL |= 0x20; // do a restart - } - break; - - case 0x20 / 8: // addr NAKEd in write mode - mResult = I2cWrAddrNAKed; - I2CCTL |= 0x10; // stop - mNumTrans = 0; - break; - - case 0x48 / 8: // addr NACKed in read mode - mResult = I2cRdAddrNAKed; - I2CCTL |= 0x10; // stop - mNumTrans = 0; - break; - - case 0x58 / 8: // NAK to RXed byte sent (we still have th ebyte we got in buffer) - case 0x50 / 8: // got byte in read mode - *mCurTrans->bytes++ = I2CBUF; - mCurTrans->numBytes--; - // fallthrough - - case 0x40 / 8: // addr ACKED in read mode - if (!mCurTrans->numBytes) - goto transaction_over; - else if (mCurTrans->numBytes == 1) - I2CCTL &= ~0x04; // NAK - else - I2CCTL |= 0x04; // ACK - break; - - default: - mResult = I2cInternalError; - I2CCTL |= 0x10; // stop - mNumTrans = 0; - break; - } - - I2CCTL &= ~0x08; - CFGPAGE = bkp; -} - -#pragma callee_saves i2cTransact -enum I2cResult i2cTransact(struct I2cTransaction __xdata *trans, uint8_t nTrans) { - mCurTrans = trans; - mNumTrans = nTrans; - - mResult = I2cOK; - - if (nTrans) { - I2CCTL &= ~0x10; // clear stop - I2CCTL |= 0x20; // issue start - - while (mNumTrans) - ; // wait - } - return mResult; -} diff --git a/zbs243_Tag_FW/soc/zbs243/i2c.h b/zbs243_Tag_FW/soc/zbs243/i2c.h deleted file mode 100644 index 682209ce..00000000 --- a/zbs243_Tag_FW/soc/zbs243/i2c.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _I2C_H_ -#define _I2C_H_ - -#include - -enum I2cResult { - I2cOK, - I2cWrAddrNAKed, - I2cRdAddrNAKed, - I2cNonLastDataByteNAKed, - I2cInternalError, -}; - -struct I2cTransaction { - uint8_t deviceAddr; - uint8_t numBytes; //will be updated as we go along so you can figure out what was NAKed - uint8_t __xdata *bytes; -}; - -#pragma callee_saves i2cInit -void i2cInit(void); - -#pragma callee_saves i2cTransact -uint8_t i2cTransact(struct I2cTransaction __xdata *trans, uint8_t nTrans); //returns enum I2cResult - -void I2C_IRQ(void) __interrupt (8); - - - - - - -#endif - diff --git a/zbs243_Tag_FW/soc/zbs243/make.mk b/zbs243_Tag_FW/soc/zbs243/make.mk deleted file mode 100644 index 3b4f9da9..00000000 --- a/zbs243_Tag_FW/soc/zbs243/make.mk +++ /dev/null @@ -1,8 +0,0 @@ -FLAGS += -Isoc/zbs243 - -FLAGS += -DSOC_ZBS243 --xram-loc 0xe000 --xram-size 0x2000 --model-large - -SOURCES += soc/zbs243/soc.c soc/zbs243/wdt.c soc/zbs243/sleep.c soc/zbs243/spi.c soc/zbs243/uart.c soc/zbs243/timer.c soc/zbs243/radio.c -SOURCES += soc/zbs243/flash.c soc/zbs243/temperature.c cpu/8051/random.c cpu/8051/printf.c -SOURCES += soc/zbs243/i2c.c -CPU = 8051 diff --git a/zbs243_Tag_FW/soc/zbs243/radio.c b/zbs243_Tag_FW/soc/zbs243/radio.c deleted file mode 100644 index 802f2561..00000000 --- a/zbs243_Tag_FW/soc/zbs243/radio.c +++ /dev/null @@ -1,336 +0,0 @@ -#include "radio.h" - -#include "asmUtil.h" -#include "board.h" -#include "cpu.h" -#include "printf.h" -#include "timer.h" - -#define RX_BUFFER_SIZE (RADIO_MAX_PACKET_LEN + 1 /* len byte */ + 2 /* RSSI & LQI */) -#define RX_BUFFER_NUM 3 - -static volatile uint8_t __xdata mRxBufs[RX_BUFFER_NUM][RX_BUFFER_SIZE]; -static volatile uint8_t __xdata mLastRSSI, mLastTxedSeq, mRxOn, mRxBufNextR, mRxBufNextW, mRxBufNumFree; -static volatile __bit mAckTimePassed, mGotAck; - -// some things look like: https://www.ti.com/lit/ds/symlink/cc2430.pdf -// maybe a licensed and heavily modified version? - -// maybe rx on and tx cal? -// see segmented_ota.<> - -void RF_IRQ1(void) __interrupt(4) { - uint8_t cause = RADIO_IRQ4_pending; - static uint8_t __xdata lastRSSI; - - RADIO_IRQ4_pending = 0; - - if (cause & 0x40) { // ack time happened - - // radio will report ACK if we (1) got an ack or (2) sent a packet that did not require it - mAckTimePassed = true; - mGotAck = !!(cause & 0x10); - - } - if (cause & 0x20) { // radio has RXed a packet into its internal buffer. vet it quickly and set up DMA - - uint8_t len = RADIO_GOTLEN; - - if (len < 3 || len >= 0x80 || RADIO_rxFirstByte + 1 != len || !mRxOn || !mRxBufNumFree) { // detect invalid packets right away, or RX being off - - RADIO_command = RADIO_CMD_FLUSH_RX_FIFO; - } else { - uint8_t __xdata *buf = mRxBufs[mRxBufNextW]; - uint8_t bkp; - - buf[0] = len; - - bkp = CFGPAGE; - CFGPAGE = 4; - RADIO_RXLEN = len - 1; - RADIO_RXPTRL = ((uint16_t)(buf + 1)) & 0xff; - RADIO_RXPTRH = ((uint16_t)(buf + 1)) >> 8; - TRIGGER |= 4; // start rx dma - - TCON2 &= ~4; // without this we trigger next irq too fast and get garbage - - CFGPAGE = bkp; - } - } - if ((cause & 0x10) && !(RADIO_curRfState & 0x20)) { // radio got a valid preamble and is RXing a packet. this is our chance to sample some RSSI - uint8_t i; - - // we get here if radio is RXing a packet - tells us to capture some RSSI vals. - // Seems there is an offset. Value is signed and offset by 56 - for (i = 0; i < 0x3c; i++) - mLastRSSI = RADIO_currentRSSI; - } -} - -void RF_IRQ2(void) __interrupt(5) { - uint8_t bck = CFGPAGE; - CFGPAGE = 4; - - if (TCON2 & 0x04) { // RX dma over - time to check packet for valid CRC - - uint8_t __xdata *buf = mRxBufs[mRxBufNextW]; - uint8_t len; - - TCON2 &= ~0x04; - RADIO_command = RADIO_CMD_FLUSH_RX_FIFO; - - // last byte we got DMAed to us has top bit as flags for "crc ok" - - len = buf[0]; - - if (!(buf[len] & 0x80)) { - // CRC failed on packet - } else { - buf[len - 1] = mLastRSSI - 56; - - if (++mRxBufNextW == RX_BUFFER_NUM) - mRxBufNextW = 0; - mRxBufNumFree--; - } - } - if (TCON2 & 0x02) { // TX DMA completed - TCON2 &= ~2; - - // nothing to do here - } - if (TCON2 & 0x08) { // radio init over - TCON2 &= ~0x48; - SETTINGS &= ~0x10; - } - CFGPAGE = bck; -} - -bool radioTx(const void __xdata *packetP) // waits for tx end -{ - const uint8_t __xdata *packet = (const uint8_t __xdata *)packetP; - uint16_t bkp, wait; - __bit irqs; - - // this is how to do CCA. we do not bother because fuck it - // this is how WE do CCA. 'Fuck it' still somewhat applies if we don't get a clear channel in a reasonable amount of time - // okay fuck it. - /* - for (uint8_t i = 0; i < 0x80; i++) { - if (!(RADIO_curRfState & 1)) { - //pr("radio CCA fail\n"); - timerDelay(TIMER_TICKS_PER_SECOND / 2000); - //return; - } - } - */ - - mAckTimePassed = false; - mGotAck = false; - mLastTxedSeq = packet[3]; - - bkp = CFGPAGE; - CFGPAGE = 4; - - irqs = IEN_EA; - IEN_EA = 0; - - RADIO_TXLEN = packet[0] - 2; - RADIO_TXPTRL = ((uint16_t)packet) & 0xff; - RADIO_TXPTRH = ((uint16_t)packet) >> 8; - RADIO_command = RADIO_CMD_LOAD_TX_FIFO; - TRIGGER |= 2; // start TX fifo DMA - - IEN_EA = irqs; - - CFGPAGE = bkp; - - //RADIO_unk_C8 = 0xff; /// stock fw does this but seems unnecessary - - // wait for tx to start - wait = 0; - wait--; - do { - if (RADIO_curRfState & 0x80) - break; - } while (--wait); - - // wait for tx to end - if (wait) { - while (!mAckTimePassed) - ; - return true; - } else { - return false; - } - - //RADIO_unk_C8 = 0x7f; /// stock fw does this but seems unnecessary -} - -void radioRxAckReset(void) { - mGotAck = false; -} - -int16_t radioRxAckGetLast(void) { - if (mGotAck) - return (uint16_t)mLastTxedSeq; - else - return -1; -} - -void radioRxFilterCfg(const uint8_t __xdata *filterForLong, uint32_t myShortMac, uint16_t myPan) { - uint16_t shortMac = (myShortMac == SHORT_MAC_UNUSED) ? 0xffff : myShortMac; - uint8_t i; - - RADIO_PANID_Hi = myPan >> 8; - RADIO_PANID_Lo = myPan; - - RADIO_ownShortAddress_Hi = shortMac >> 8; - RADIO_ownShortAddress_Lo = shortMac; - - for (i = 0; i < 8; i++) - ((volatile uint8_t __xdata *)&RADIO_ownMac_7)[i] = filterForLong[(uint8_t)((uint8_t)7 - (uint8_t)i)]; -} - -void radioRxEnable(__bit on, __bit autoAck) { - if (!autoAck) { - pr("auto ack forced for now\n"); - while (1) - ; - } - mRxOn = on; -} - -void radioSetTxPower(int8_t dBm) { - if (dBm < -27) - dBm = -27; - else if (dBm > 8) - dBm = 8; - - dBm += 27; - - RADIO_txPower = (uint8_t)(((uint8_t)dBm) + 3) / 5; -} - -void radioSetChannel(uint8_t ch) { - static const uint8_t perChannelSetting1[] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33}; - static const uint8_t perChannelSetting2[] = {4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2}; - - if (ch < RADIO_FIRST_CHANNEL || ch >= RADIO_FIRST_CHANNEL + RADIO_NUM_CHANNELS) - return; - - RADIO_channel = ch; // configmed to be at least RX channel - RADIO_command = RADIO_CMD_RECEIVE; - RADIO_perChannelSetting1 = perChannelSetting1[ch - 11]; - RADIO_perChannelSetting2 = perChannelSetting2[ch - 11]; -} - -void radioRxFlush(void) { - mRxBufNumFree = RX_BUFFER_NUM; -} - -int8_t radioRxDequeuePktGet(const void __xdata *__xdata *dstBufP, uint8_t __xdata *lqiP, int8_t __xdata *rssiP) { - const uint8_t __xdata *buf = mRxBufs[mRxBufNextR]; - uint8_t lqi, len = buf[0]; - - if (mRxBufNumFree == RX_BUFFER_NUM) - return -1; - - lqi = (buf[len] & 0x7f); - - *lqiP = lqi; - *rssiP = buf[len - 1]; - *dstBufP = buf + 1; - - return len - 2; -} - -void radioRxDequeuedPktRelease(void) { - if (++mRxBufNextR == RX_BUFFER_NUM) - mRxBufNextR = 0; - - __critical { - mRxBufNumFree++; - } -} - -void radioInit(void) { - uint8_t bkp; - - mRxBufNextW = 0; - mRxBufNextR = 0; - mRxBufNumFree = RX_BUFFER_NUM; - - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - RADIO_unk_F0 |= 0x80; - timerDelay(TIMER_TICKS_PER_SECOND / 1000); - CFGPAGE = 0; - RESET &= ~4; - RESET |= 4; - RESET &= ~4; - timerDelay(TIMER_TICKS_PER_SECOND / 10000); - - RADIO_RadioPowerCtl |= 4; - - bkp = CFGPAGE; - CFGPAGE = 4; - SETTINGS |= 2; - RADIO_INITSEQ0 = 2; - RADIO_INITSEQ1 = 0xFA; - RADIO_INITSEQ2 = 0xDD; - SETTINGS |= 4; - RADIO_INITSEQ3 = 1; - RADIO_INITSEQ4 = 0xFA; - RADIO_INITSEQ5 = 0xDD; - IEN_RF2 = 1; - CFGPAGE = bkp; - - RADIO_command = 0xC1; - - RADIO_unk_C1 = 0x02; - RADIO_calibration_C2 = 0xf7; // mdmctrl0L? - RADIO_calibration_C3 = 0x05; - RADIO_calibration_C4 = 0x35; - RADIO_calibration_C5 = 0x24; - RADIO_calibration_C6 = 0x33; - RADIO_calibration_C7 = 0x70; - RADIO_unk_CA = 0x58; - RADIO_perChannelSetting2 = 0x02; - RADIO_unk_CD = (RADIO_unk_CD & ~7) | (0x11 & 7); - RADIO_txPower = 0; - RADIO_calibration_CF = 0x30; - RADIO_calibration_D0 = 0x00; - RADIO_calibration_D1 = 0x49; - RADIO_calibration_D2 = 0x06; - RADIO_unk_D7 = 0x43; - RADIO_unk_E2 = 0x08; // setting bit 0x40 breaks rx entirely - RADIO_unk_83 = 0xe5; // maybe sync word? - - RADIO_unk_C8 = 0x7f; // setting bit 0x80 breaks rx entirely - RADIO_calibration_81 = 0xf0; // removing bit 0x20 breask rx and tx - RADIO_FLAGS |= 0x08; - RADIO_unk_D8 = 0; - RADIO_calibration_9D = 0x3f; // firts untpouched calib val - RADIO_calibration_A1 = 0x04; - RADIO_calibration_94 = 0x7f; // IOCFG0 ? - RADIO_unk_CE = 0x55; - RADIO_calibration_D3 = 0x30; - RADIO_calibration_D4 = 0xcc; - RADIO_calibration_D5 = 0xf6; - RADIO_calibration_86 = 0x40; // setting this to values like 0x20, 0x80, and 0x60 breaks auto-ack and maybe tx - RADIO_calibration_95 = 0x08; - RADIO_calibration_96 = 0xd3; - RADIO_calibration_70 = 0x01; - RADIO_calibration_71 = 0x40; - - RADIO_unk_A6 = 0x00; - RADIO_command = 0xC8; - RADIO_command = 0xC7; - RADIO_command = 0xC6; - RADIO_unk_AF = 0x60; // int enable (we need 0x60) - - RADIO_unk_AF |= 0x10; - - IEN_RF1 = 1; - - RADIO_FLAGS |= 8; -} diff --git a/zbs243_Tag_FW/soc/zbs243/radio.h b/zbs243_Tag_FW/soc/zbs243/radio.h deleted file mode 100644 index d5922781..00000000 --- a/zbs243_Tag_FW/soc/zbs243/radio.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _RADIO_H_ -#define _RADIO_H_ - -#include -#include - - -void RF_IRQ1(void) __interrupt (4); -void RF_IRQ2(void) __interrupt (5); -#define RADIO_PAD_LEN_BY 2 - -#include "../radioCommon.h" - - - - - -#endif - - - - diff --git a/zbs243_Tag_FW/soc/zbs243/sleep.c b/zbs243_Tag_FW/soc/zbs243/sleep.c deleted file mode 100644 index fa7acae3..00000000 --- a/zbs243_Tag_FW/soc/zbs243/sleep.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "sleep.h" -#include "cpu.h" - -void sleepForMsec(uint32_t length) -{ - __bit irqEn = IEN_EA; - uint8_t prescaler, cfgPg; - IEN_EA = 0; - - if (!length) - length = 0xfffffffful; - - RADIO_IRQ4_pending = 0; - UNK_C1 &=~ 0x81; - TCON &=~ 0x20; - cfgPg = CFGPAGE; - CFGPAGE = 4; - RADIO_command = 0xCA; - RADIO_command = 0xC5; - - if (length <= 0x00008000ul) { - - length <<= 5; - prescaler = 0x56; //0x56 = one tick is 1/32k of sec - } - else { - if (length != 0xfffffffful) - length += 500; - - length /= 1000; - prescaler = 0x16; //0x16 = one tick is 1 second - } - - if (length > 0x000fffff) { - - RADIO_SleepTimerLo = 0xff; - RADIO_SleepTimerMid = 0xff; - RADIO_SleepTimerHi = 0x0f; - } - else { - - RADIO_SleepTimerLo = length; - RADIO_SleepTimerMid = length >> 8; - RADIO_SleepTimerHi = ((uint8_t)(length >> 16)) & 0x0f; - } - - __asm__("nop"); - RADIO_SleepTimerSettings = prescaler; - __asm__("nop\nnop\nnop\nnop\n"); - RADIO_SleepTimerSettings |= 0x80; - __asm__("nop\nnop\n"); - RADIO_RadioPowerCtl = 0x44; - __asm__("nop\nnop\n"); - - CFGPAGE = cfgPg; - - //make sure time does not run backwards - TL0 = 0x0; - TH0 = 0xFF; - while (TH0 == 0xFF); - - UNK_C1 |= 0x81; - TCON |= 0x20; - - IEN_EA = irqEn; -} \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/zbs243/soc.c b/zbs243_Tag_FW/soc/zbs243/soc.c deleted file mode 100644 index 36ab6f4e..00000000 --- a/zbs243_Tag_FW/soc/zbs243/soc.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "asmUtil.h" -#include "printf.h" -#include "screen.h" -#include "cpu.h" - - -void clockingAndIntsInit(void) -{ - IEN0 = 0; - CLKEN = 0x00; //timers only for now - CLKSPEED = 0x01; //fast crystal -} \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/zbs243/soc.h b/zbs243_Tag_FW/soc/zbs243/soc.h deleted file mode 100644 index a9f50fa1..00000000 --- a/zbs243_Tag_FW/soc/zbs243/soc.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _SOCi_H_ -#define _SOCi_H_ - -#define PDATA -#include "zbs243.h" - -#include -#include "i2c.h" - - -#pragma callee_saves clockingAndIntsInit -void clockingAndIntsInit(void); - -#pragma callee_saves rndGen8 -uint8_t rndGen8(void); - -#pragma callee_saves rndGen32 -uint32_t rndGen32(void); - -#pragma callee_saves rndSeed -void rndSeed(uint8_t seedA, uint8_t seedB); - -#pragma callee_saves selfUpdate -void selfUpdate(void); - - -void TEMP_ISR(void) __interrupt (10); -//extern void I2C_IRQ(void) __interrupt (8); - -#endif diff --git a/zbs243_Tag_FW/soc/zbs243/spi.c b/zbs243_Tag_FW/soc/zbs243/spi.c deleted file mode 100644 index e2a8f7f6..00000000 --- a/zbs243_Tag_FW/soc/zbs243/spi.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "spi.h" -#include "cpu.h" - - -void spiInit(void) -{ - uint8_t bcp; - - //clock it up - CLKEN |= 0x08; - - //enable the unit - bcp = CFGPAGE; - CFGPAGE = 4; - SPIENA = 0x81; - CFGPAGE = bcp; -} - -uint8_t spiByte(uint8_t val) -{ - uint8_t bcp = CFGPAGE; - CFGPAGE = 4; - - SPITX = val; - SPICFG = 0xa0; //spi at 4mhz, mode 0 - while(SPICFG & 0x20); - val = SPIRX; - - CFGPAGE = bcp; - - return val; -} - -void spiTXByte(uint8_t val) -{ - uint8_t bcp = CFGPAGE; - CFGPAGE = 4; - SPITX = val; - SPICFG = 0xa0; //spi at 4mhz, mode 0 - while(SPICFG & 0x20); - CFGPAGE = bcp; -} \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/zbs243/spi.h b/zbs243_Tag_FW/soc/zbs243/spi.h deleted file mode 100644 index b2aeb4aa..00000000 --- a/zbs243_Tag_FW/soc/zbs243/spi.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _SPI_ZBS_H_ -#define _SPI_ZBS_H_ - -#include - -//pre-configured for 4mhz mode 0, but can be changed - -#pragma callee_saves spiInit -void spiInit(void); - -#pragma callee_saves spiByte -uint8_t spiByte(uint8_t val); - -#pragma callee_saves spiTXByte -void spiTXByte(uint8_t val); - - - -#endif diff --git a/zbs243_Tag_FW/soc/zbs243/temperature.c b/zbs243_Tag_FW/soc/zbs243/temperature.c deleted file mode 100644 index 11b20544..00000000 --- a/zbs243_Tag_FW/soc/zbs243/temperature.c +++ /dev/null @@ -1,112 +0,0 @@ -#include "asmUtil.h" -#include "flash.h" -#include "timer.h" -#include "cpu.h" - -static volatile uint8_t __xdata mTempRet[4]; - - -void TEMP_ISR(void) __interrupt (10) -{ - uint8_t i; - - i = CFGPAGE; - CFGPAGE = 4; - mTempRet[0] = TEMPRETH; - mTempRet[1] = TEMPRETL; - CFGPAGE = i; - IEN1 &=~ 0x10; -} - -int8_t adcSampleTemperature(void) -{ - uint16_t sum = 0; - uint8_t i; - - CLKEN |= 0x80; - - //adcConfig - i = CFGPAGE; - CFGPAGE = 4; - TEMPCFG = 0x81; //0x08 set when done - TEMPCAL2 = 0x22; - TEMPCAL1 = 0x55; - TEMPCAL4 = 0; - TEMPCAL3 = 0; - TEMPCAL6 = 3; - TEMPCAL5 = 0xff; - TEMPCFG &=~ 0x08; - CFGPAGE = i; - IEN1 &=~ 0x10; - //adcConfig over - - /* - TEMPCAL2: (seemingly analog settings: gain + ???) - removing 0x02 lowers vals a little (9%) \__ these stack just as you'd expect - setting 0x04 moves the values up a bit (18%) / - setting 0x08 adds 2.5% or so - 0x30 is ADC gain/bitness. (x4 for each increment) - 0x80 seems to make no difference - - TEMPCAL1: (seemingly analog settings) - removing 1 decreases value by 5.7% \__ these stack - removing 4 decreases by 22% / - removing 0x10 increments value by 1% - removnig 0x40 increases by 5% - - using 0xaa increases width but decreases average - - other TEMPCALx values seem to have no effect - */ - - for (i = 0; i < 9; i++) { - - //int on - IEN1 |= 0x10; - - //wait for it to self-turn-off - while (IEN1 & 0x10); - - if (i) { //skip first - - sum += ((uint16_t)mathPrvU8bitswap(mTempRet[0])) << 2; - if (mTempRet[1] & 1) - sum += 2; - if (mTempRet[1] & 2) - sum += 1; - } - - timerDelay(TIMER_TICKS_PER_SECOND / 10000); - } - //turn it off - CLKEN &=~ 0x80; - - //reuse tempRet to get calib data - if (!flashRead(FLASH_INFOPAGE_ADDR + 0x0b, mTempRet, 4) || (mTempRet[0] == 0xff && mTempRet[1] == 0xff) || (mTempRet[2] == 0xff && mTempRet[3] == 0xff)) { - - //no calibration data - reporting 20 degrees, same as stock firmware - return 20; - } - else { - - uint16_t __xdata valB = mathPrvU16from2xU8(mTempRet[0], mTempRet[1]); //temp sensor reading at 30 degrees C - uint16_t __xdata valD = mathPrvU16from2xU8(mTempRet[2], mTempRet[3]); //temp sensor reading at 45 degrees C - uint16_t __xdata slope = valD - valB; - - sum = (sum + 4) / 8; //average it - - //we can get 1/10 degree accuracy as this is well calibrated, but our api only need degrees so let's do that - /* - //high-precision code is this: - if (sum > valB) //our math routines are unsigned - temp = (uint16_t)mathPrvDiv32x16(mathPrvMul16x16(sum - valB, 150) + (slope / 2), slope) + 300; - else - temp = 300 - (uint16_t)mathPrvDiv32x16(mathPrvMul16x16(valB - sum, 150) + (slope / 2), slope); - */ - - if (sum > valB) //our math routines are unsigned - return mathPrvDiv16x8(5 + (uint16_t)mathPrvDiv32x16(mathPrvMul16x16(sum - valB, 150) + (slope / 2), slope), 10) + 30; - else - return 30 - mathPrvDiv16x8(5 + (uint16_t)mathPrvDiv32x16(mathPrvMul16x16(valB - sum, 150) + (slope / 2), slope), 10); - } -} \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/zbs243/timer.c b/zbs243_Tag_FW/soc/zbs243/timer.c deleted file mode 100644 index 3f0d9ec1..00000000 --- a/zbs243_Tag_FW/soc/zbs243/timer.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "timer.h" -#include "cpu.h" - - -static volatile uint16_t mTmrHi; - -void T0_ISR(void) __interrupt (1) -{ - TCON &=~ 0x20; //clear flag - mTmrHi++; -} - -uint32_t timerGet(void) -{ - union { - struct { - uint8_t tL; - uint8_t tH; - uint16_t hi; - }; - uint32_t ret; - } val; - - do { - val.hi = mTmrHi; - val.tH = TH0; - val.tL = TL0; //read order is important due ot hardware buffering - } while (val.hi != mTmrHi || val.tH != TH0); - - return val.ret; -} - -uint8_t timerGetLowBits(void) -{ - return TL0; -} - -void timerInit(void) -{ - //clock up timers - CLKEN |= 0x01; - - - //stop and clear int flags - TCON &=~ 0xf0; - - //reset - mTmrHi = 0; - T0 = 0; - - //timer 0 in 16 bit mode, timer 1 off - TMOD = 0x31; - - //start - TCON |= 0x10; - - //int on - IEN_TMR0 = 1; -} - -void timerDelay(uint32_t ticks) -{ - uint32_t start = timerGet(); - while (timerGet() - start <= ticks); -} diff --git a/zbs243_Tag_FW/soc/zbs243/timer.h b/zbs243_Tag_FW/soc/zbs243/timer.h deleted file mode 100644 index 26aa216b..00000000 --- a/zbs243_Tag_FW/soc/zbs243/timer.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _TIMER_H_ -#define _TIMER_H_ - -#include - -#define TIMER_TICKS_PER_SECOND (16000000 / 12) //overflows every 53 minutes -#define TIMER_TICKS_PER_MS 1333UL -//this is a requirement by SDCC. is this prototype is missing when compiling main(), we get no irq handler -void T0_ISR(void) __interrupt (1); - - -void timerInit(void); - -#pragma callee_saves timerGet -uint32_t timerGet(void); - -#pragma callee_saves timerGetLowBits -uint8_t timerGetLowBits(void); //probaly only useful for random seeds - -void timerDelay(uint32_t ticks); - - - -#endif diff --git a/zbs243_Tag_FW/soc/zbs243/uart.c b/zbs243_Tag_FW/soc/zbs243/uart.c deleted file mode 100644 index 781ac714..00000000 --- a/zbs243_Tag_FW/soc/zbs243/uart.c +++ /dev/null @@ -1,102 +0,0 @@ -#include "uart.h" -#include "cpu.h" - -#ifdef AP_FW -#include "stdbool.h" -#include "string.h" -#endif - -void uartInit(void) { - // clock it up - CLKEN |= 0x20; - // configure baud rate - UARTBRGH = 0x00; -#ifdef AP_FW - UARTBRGL = 69; // nice. 230400 baud - IEN_UART0 = 1; -#else - UARTBRGL = 0x8A; // config for 115200 -#endif - UARTSTA = 0x12; // also set the "empty" bit else we wait forever for it to go up -} - -#ifndef AP_FW -void uartTx(uint8_t val) { - while (!(UARTSTA & (1 << 1))) - ; - UARTSTA &= ~(1 << 1); - UARTBUF = val; -} -#else -extern uint8_t __xdata blockbuffer[]; - -volatile uint8_t txtail = 0; -volatile uint8_t txhead = 0; -uint8_t __xdata txbuf[256] = {0}; - -volatile uint8_t __idata rxtail = 0; -volatile uint8_t __idata rxhead = 0; -uint8_t __xdata rxbuf[256] = {0}; - -void uartTx(uint8_t val) { - __critical { - txbuf[txhead] = val; - if (txhead == txtail) { - UARTBUF = val; - } - txhead++; - } -} - -uint8_t uartRx() { - if (rxhead == rxtail) { - return 0; - } else { - uint8_t ret = rxbuf[rxtail]; - rxtail++; - return ret; - } -} - -uint8_t uartBytesAvail() { - return rxhead - rxtail; -} - -uint8_t* __idata blockp; -uint8_t __idata cmd[3]; -volatile bool __idata serialBypassActive = false; - -void checkcommand(uint8_t rx) { - for (uint8_t c = 0; c < 2; c++) { - cmd[c] = cmd[c + 1]; - } - cmd[2] = rx; - if (strncmp(cmd, ">D>", 3) == 0) { - blockp = blockbuffer; - serialBypassActive = true; - } -} - -void UART_IRQ1(void) __interrupt(0) { - if (UARTSTA & 1) { // RXC - UARTSTA &= 0xfe; - if (serialBypassActive) { - *blockp++ = UARTBUF; - if (blockp == (blockbuffer + 4100)) { - serialBypassActive = false; - } - } else { - rxbuf[rxhead] = UARTBUF; - rxhead++; - checkcommand(UARTBUF); - } - } - if (UARTSTA & 2) { // TXC - UARTSTA &= 0xfd; - txtail++; - if (txhead != txtail) { - UARTBUF = txbuf[txtail]; - } - } -} -#endif \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/zbs243/uart.h b/zbs243_Tag_FW/soc/zbs243/uart.h deleted file mode 100644 index 3c389fec..00000000 --- a/zbs243_Tag_FW/soc/zbs243/uart.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _UART_ZBS_H_ -#define _UART_ZBS_H_ - -#include - -//pre-configured for 115200 8n1 -//RX can be done but i do not need it - -#pragma callee_saves uartInit -void uartInit(void); - -#pragma callee_saves uartTx -void uartTx(uint8_t val); - - -#ifdef AP_FW -void UART_IRQ1(void) __interrupt (0); - -#pragma callee_saves uartBytesAvail -uint8_t uartBytesAvail(void); - -#pragma callee_saves uartRX -uint8_t uartRx(); -#endif - -#endif - diff --git a/zbs243_Tag_FW/soc/zbs243/wdt.c b/zbs243_Tag_FW/soc/zbs243/wdt.c deleted file mode 100644 index f34887d7..00000000 --- a/zbs243_Tag_FW/soc/zbs243/wdt.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "cpu.h" -#include "wdt.h" - -void wdtOn(void) -{ - uint8_t cfgPageBck; - - cfgPageBck = CFGPAGE; - CFGPAGE = 4; - WDTCONF |= 0x80; - WDTENA = 1; - CFGPAGE = cfgPageBck; -} - -void wdtOff(void) -{ - uint8_t cfgPageBck; - - cfgPageBck = CFGPAGE; - CFGPAGE = 4; - WDTENA = 0; - WDTCONF &=~ 0x80; - CFGPAGE = cfgPageBck; -} - -void wdtPet(void) -{ - uint8_t cfgPageBck; - - cfgPageBck = CFGPAGE; - CFGPAGE = 4; - WDTPET = 0; - CFGPAGE = cfgPageBck; -} - -void wdtSetResetVal(uint32_t val) //also pets it -{ - uint8_t cfgPageBck; - - cfgPageBck = CFGPAGE; - CFGPAGE = 4; - WDTPET = 0; - WDTRSTVALH = val >> 16; - WDTRSTVALM = val >> 8; - WDTRSTVALL = val; - - CFGPAGE = cfgPageBck; -} - -void wdtDeviceReset(void) -{ - CFGPAGE = 4; - WDTCONF = 0x80; - WDTENA = 1; - WDTRSTVALH = 0xff; - WDTRSTVALM = 0xff; - WDTRSTVALL = 0xff; - while(1); -} \ No newline at end of file diff --git a/zbs243_Tag_FW/soc/zbs243/zbs243.h b/zbs243_Tag_FW/soc/zbs243/zbs243.h deleted file mode 100644 index 88315e3b..00000000 --- a/zbs243_Tag_FW/soc/zbs243/zbs243.h +++ /dev/null @@ -1,289 +0,0 @@ -#ifndef _ZBS243_H_ -#define _ZBS243_H_ - -#include - -//P2 selects XPAGE which sucks for us -//IRAM is not at all mapped into XRAM -//id page is not in xram either - - -static __idata __at (0x00) unsigned char R0; -static __idata __at (0x01) unsigned char R1; -static __idata __at (0x02) unsigned char R2; -static __idata __at (0x03) unsigned char R3; -static __idata __at (0x04) unsigned char R4; -static __idata __at (0x05) unsigned char R5; -static __idata __at (0x06) unsigned char R6; -static __idata __at (0x07) unsigned char R7; -__sfr __at (0xf0) B; -__sfr __at (0xe0) ACC; -__sfr __at (0x82) DPL; -__sfr __at (0x83) DPH; -__sfr __at (0x84) DPL1; -__sfr __at (0x85) DPH1; -__sfr __at (0x92) DPS; //low bit switched DPTR -__sfr __at (0x87) PCON; //lower 4 bits as per 8051 spec, bit4 set disables xram - -__sfr __at (0xb2) PERFMON0; -__sfr __at (0xb3) PERFMON1; -__sfr __at (0xb4) PCH; //current PC...yes... -__sfr __at (0xb5) PCL; -__sfr __at (0xb6) PERFMON4; - - - -__sbit __at (0x80) P0_0; -__sbit __at (0x81) P0_1; -__sbit __at (0x82) P0_2; -__sbit __at (0x83) P0_3; -__sbit __at (0x84) P0_4; -__sbit __at (0x85) P0_5; -__sbit __at (0x86) P0_6; -__sbit __at (0x87) P0_7; -__sbit __at (0x90) P1_0; -__sbit __at (0x91) P1_1; -__sbit __at (0x92) P1_2; -__sbit __at (0x93) P1_3; -__sbit __at (0x94) P1_4; -__sbit __at (0x95) P1_5; -__sbit __at (0x96) P1_6; -__sbit __at (0x97) P1_7; -__sbit __at (0xa0) P2_0; -__sbit __at (0xa1) P2_1; -__sbit __at (0xa2) P2_2; -__sbit __at (0xa3) P2_3; -__sbit __at (0xa4) P2_4; -__sbit __at (0xa5) P2_5; -__sbit __at (0xa6) P2_6; -__sbit __at (0xa7) P2_7; - -__sbit __at (0xA8) IEN_UART0; -__sbit __at (0xA9) IEN_TMR0; -__sbit __at (0xAB) IEN_TMR1; -__sbit __at (0xAC) IEN_RF1; //enable for RF interrupt #1 (irq #2) -__sbit __at (0xAD) IEN_RF2; //enable for RF interrupt #2 (irq #5) -__sbit __at (0xAF) IEN_EA; - -//gpio configs (all in cfg page 0 only) -__sfr __at (0x80) P0; //RO for input pins, WO for output pins (written state not read back) -__sfr __at (0x90) P1; -__sfr __at (0xA0) P2; //disabled ot avoid accidental use -__sfr __at (0xA3) P0LVLSEL; //pin change interrupt edge desired. 0 - rising 1 - falling -__sfr __at (0xA4) P1LVLSEL; -__sfr __at (0xA5) P2LVLSEL; -__sfr __at (0xA6) P0INTEN; //pin change interrupt enable (1 = enabled). will wake device from sleep -__sfr __at (0xA7) P1INTEN; -__sfr __at (0xA9) P2INTEN; -__sfr __at (0xAA) P0CHSTA; //pin change status 1 = changed (remember to clear in ISR & before enabling ISR) -__sfr __at (0xAB) P1CHSTA; -__sfr __at (0xAC) P2CHSTA; -__sfr __at (0xAD) P0FUNC; //1 = func, 0 = gpio -__sfr __at (0xAE) P1FUNC; -__sfr __at (0xAF) P2FUNC; -__sfr __at (0xB9) P0DIR; //1 = in, 0 = out -__sfr __at (0xBA) P1DIR; -__sfr __at (0xBB) P2DIR; -__sfr __at (0xBC) P0PULL; //1 = pull up -__sfr __at (0xBD) P1PULL; -__sfr __at (0xBE) P2PULL; - -__sfr __at (0xA0) XPAGE; //sadly this is accurate! same as P2 - -//these are both avail in both config pages -__sfr __at (0xA8) IEN0; -__sfr __at (0xA1) IEN1; //low 1, bits unknown, top 7 bits eable irqs (7..13) - - -__sfr __at (0x8E) CLKSPEED; //top bit likely selects osc (1 = crystal??), next 3 set divisor FOR CPU, not periphs, bottom 4 unknown - -__sfr __at (0xB7) CLKEN; //one bit per periph to enable clocks. 0x08 - spi, 0x10 - i2c, 0x20 - uart, 0x80 temp sensor, 0x01 - in-cpu-timers(T0 & T1) - -__sfr __at (0x8F) RESET; //resets periphs AND stores reset cause. bit 0x01 - we were reset due to WDT, 0x04 - resets radio (Active high), 0x02 resets cpu core - -//wdt (accessible in CFG page 4), runs at about 62KHz. counter counts up, overflow causes reset -__sfr __at (0xBA) WDTENA; //low bit is used for WDT off. same SFR addr used as P1DIR when cfg page 0 -__sfr __at (0xBB) WDTPET; //write 0 to pet, write 0xff to reset immediately. same SFR addr used as P2DIR when cfg page 0 -__sfr __at (0xBC) WDTRSTVALL; //wdt reset value low -__sfr __at (0xBD) WDTRSTVALM; //wdt reset value mid -__sfr __at (0xBE) WDTRSTVALH; //wdt reset value high -__sfr __at (0xBF) WDTCONF; //top bit enable, 0x08 to hang instead of reset. top bit only accessible in CFG page 4 - - -//SPI (accessible in CFG page 4) -__sfr __at (0xEB) SPIUNKNOWN; //existing code sets 0x08 after a byte tx. no idea why. not doing it works -__sfr __at (0xEC) SPICFG; //0x80 - 1, 0x40 - 0, 0x20 - do TX (cleared on done), {0x10,0x08}) - clock div {4mhz,2mhz,1mhz,500khz}, 0x04 - CPHA, 0x02 - CPOL, 0x01 ?? (breaks rx, maybe bidirectional or rx off) -__sfr __at (0xED) SPIENA; //0x80 - 1, 0x01 - unit enable. stock code also enables/disables after every byte but i do not think we need to -__sfr __at (0xEE) SPITX; //tx buffer -__sfr __at (0xEF) SPIRX; //rx buffer - -//I2C (accessible in CFG page 0) -//it is in theory possible to drive it without IRQs but there seem to be hw bugs in figuring out when handling is needed, so i wouldn't. stock also doesn't -__sfr __at (0x91) I2CSTATE; //top 5 bits are current state: {???, START_SENT, RESTART_SENT, WR_ADDR_ACKED, WR_ADDR_NAKED, TX_BYTE_ACKED, TX_BYTE_NAKED, unused, RD_ADDR_ACKED, RD_ADDR_NAKED, RXED_BYTE} -//0x93 written by 0xe0 by stock but seems not needed -__sfr __at (0x94) I2CBUF; //data for RX/TX -__sfr __at (0x95) I2CCTL; //0x80 = irqOn (#8), 0x40 = master(?), 0x20 = start/restart, 0x10 = stop, 0x08 = irqReqd, 0x04 = sendAck (to RXed btes) -__sfr __at (0x96) I2CSPEED; //bottom 3 bits = dividerA. next 4 are dividerB. clock = 16MHz / ((dividerB ? 10 *(1 + dividerB) : 12) << dividerA) -__sfr __at (0xA2) I2CUNKNOWN; //4 ORRED at init or it will not work - - -//uart is basically hard wired to be a uart. clock is divided from 16MHz. only bottom 4 bits of BRGH are used. divisor is (BRGH:BRGL + 1) -__sbit __at (0x98) UART_RXF; -__sbit __at (0x99) UART_TXE; -__sfr __at (0x98) UARTSTA; //0x10 needed. 0x02 - have tx space, 0x01 - have rx byte. both can cause interrupts. both need to be cleared in irq. flag bits do NOT work if accessed using "jbc" -__sfr __at (0x99) UARTBUF; //fifo access -__sfr __at (0x9A) UARTBRGL; -__sfr __at (0x9B) UARTBRGH; //divisor for uart - -//timers (same as 8051-classic) -__sfr __at (0x88) TCON; -__sfr __at (0x89) TMOD; -__sfr __at (0x8A) TL0; -__sfr __at (0x8B) TL1; -__sfr __at (0x8C) TH0; -__sfr __at (0x8D) TH1; -__sfr16 __at (0x8C8A) T0; -__sfr16 __at (0x8D8B) T1; //used by timer code for storage - -//flash writing (must be done with CFGPAGE == 4). each page is 0x400 bytes -__sfr __at (0xD8) FPGNO; //page number (0x00..0x3f for main flash, 0x80 for info block) -__sfr __at (0xD9) FWRSRCL; //(flash source data for write).lo for write, (flash start offset in page).lo for read -__sfr __at (0xDA) FWRSRCH; //(flash source data for write).hi for write, (flash start offset in page).hi for read -__sfr __at (0xDB) FWRDSTL; //(flash start offset in page).lo for write, (dest xram addr).lo for read -__sfr __at (0xDC) FWRDSTH; //(flash start offset in page).hi for write, (dest xram addr).hi for read -__sfr __at (0xDD) FWRLENL; //(num bytes to write minus 1).lo -__sfr __at (0xDE) FWRLENH; //(num bytes to write minus 1).hi -__sfr __at (0xDF) FWRTHREE; //always written to three - - -//temp sensor (CLKEN bit 0x80). these only accessible in config page 4 -__sfr __at (0xE6) TEMPCAL1; //purpose guessed -__sfr __at (0xE7) TEMPCAL2; //purpose guessed - -__sfr __at (0xF7) TEMPCFG; //purpose guessed - -__sfr __at (0xF8) TEMPRETH; //has high 8 bits of result. bitswapped -__sfr __at (0xF9) TEMPRETL; //has low two bits of result in lower 2 bits. bitswapped - -__sfr __at (0xFB) TEMPCAL3; //purpose guessed -__sfr __at (0xFC) TEMPCAL4; //purpose guessed -__sfr __at (0xFD) TEMPCAL5; //purpose guessed -__sfr __at (0xFE) TEMPCAL6; //purpose guessed - -//radio regs (cfg page 4) -__sfr __at (0xC9) RADIO_TXPTRL; //xram pointer to tx buffer's "length" byte. low byte -__sfr __at (0xCA) RADIO_TXPTRH; //xram pointer to tx buffer's "length" byte. high byte -__sfr __at (0xCB) RADIO_INITSEQ1; -__sfr __at (0xCC) RADIO_INITSEQ2; -__sfr __at (0xCD) RADIO_TXLEN; //data bytes to send (not incl "len" byte or crc) -__sfr __at (0xCE) RADIO_INITSEQ0; -__sfr __at (0xD1) RADIO_INITSEQ4; -__sfr __at (0xD2) RADIO_INITSEQ5; -__sfr __at (0xD3) RADIO_RXPTRL; //xram pointer to tx buffer's "length" byte. low byte -__sfr __at (0xD4) RADIO_RXPTRH; //xram pointer to tx buffer's "length" byte. high byte -__sfr __at (0xD5) RADIO_RXLEN; //data bytes to RX (not incl "len" byte or crc) 2 more than this will be RXed -__sfr __at (0xD6) RADIO_INITSEQ3; - -//radio regs (any cfg page) -__sfr __at (0xFA) RADIO_GOTLEN; //size packet we GOT (incl len byte) - - - -//shared regs -__sfr __at (0xC1) UNK_C1; //in cfg page 4 only, purpose unknown - -__sfr __at (0xD7) TRIGGER; //in both cfg page, seach bit starts something. 0x08 starts flash op, 0x04 - start radio rx fifo dma, 0x02 - start radio tx fifo dma - - -//in cfg page 4 -__sfr __at (0xC7) SETTINGS; //misc settings incl flasg access. 0x18 is flash write, 0x08 is flash read, -__sfr __at (0xCF) TCON2; //interrupt flags (0x08 is flash write) - - - -__sfr __at (0xFF) CFGPAGE; //partially swaps SFR set to another. only 0x04 bit is used - - -/* - 84 85 92 B2 B3 B4 B5 B6 B8 are visible on both pages - - 93 98 9D 9E 9F B9 C1-C7 E0-E9 are swapped - - 86 9C B0 B1 C0 C8 EA F1-F6 ?????? - -*/ - - - -//radio MMIO - -static __xdata __at (0xdf48) unsigned char RADIO_command; -static __xdata __at (0xdf70) unsigned char RADIO_calibration_70; -static __xdata __at (0xdf71) unsigned char RADIO_calibration_71; -static __xdata __at (0xdf80) unsigned char RADIO_FLAGS; -static __xdata __at (0xdf81) unsigned char RADIO_calibration_81; -static __xdata __at (0xdf83) unsigned char RADIO_unk_83; -static __xdata __at (0xdf84) unsigned char RADIO_currentRSSI; -static __xdata __at (0xdf86) unsigned char RADIO_calibration_86; -static __xdata __at (0xdf88) unsigned char RADIO_ownMac_7; -static __xdata __at (0xdf89) unsigned char RADIO_ownMac_6; -static __xdata __at (0xdf8a) unsigned char RADIO_ownMac_5; -static __xdata __at (0xdf8b) unsigned char RADIO_ownMac_4; -static __xdata __at (0xdf8c) unsigned char RADIO_ownMac_3; -static __xdata __at (0xdf8d) unsigned char RADIO_ownMac_2; -static __xdata __at (0xdf8e) unsigned char RADIO_ownMac_1; -static __xdata __at (0xdf8f) unsigned char RADIO_ownMac_0; -static __xdata __at (0xdf90) unsigned char RADIO_PANID_Hi; -static __xdata __at (0xdf91) unsigned char RADIO_PANID_Lo; -static __xdata __at (0xdf92) unsigned char RADIO_ownShortAddress_Hi; -static __xdata __at (0xdf93) unsigned char RADIO_ownShortAddress_Lo; -static __xdata __at (0xdf94) unsigned char RADIO_calibration_94; -static __xdata __at (0xdf95) unsigned char RADIO_calibration_95; -static __xdata __at (0xdf96) unsigned char RADIO_calibration_96; -static __xdata __at (0xdf98) unsigned char RADIO_rxFirstByte; // first byte of the message actualyl RXed -static __xdata __at (0xdf9b) unsigned char RADIO_curRfState; // RFSTATUS ? -static __xdata __at (0xdf9d) unsigned char RADIO_calibration_9D; -static __xdata __at (0xdfa1) unsigned char RADIO_calibration_A1; -static __xdata __at (0xdfa5) unsigned char RADIO_unk_rxAckSta; //in irqh4, when RADIO_IRQ4_pending has 0x40 set, this is 0x04 if we got ack, and 0x02 if not -static __xdata __at (0xdfa6) unsigned char RADIO_unk_A6; -static __xdata __at (0xdfad) unsigned char RADIO_IRQ4_pending; -static __xdata __at (0xdfaf) unsigned char RADIO_unk_AF; -static __xdata __at (0xdfc0) unsigned char RADIO_channel; -static __xdata __at (0xdfc1) unsigned char RADIO_unk_C1; -static __xdata __at (0xdfc2) unsigned char RADIO_calibration_C2; -static __xdata __at (0xdfc3) unsigned char RADIO_calibration_C3; -static __xdata __at (0xdfc4) unsigned char RADIO_calibration_C4; -static __xdata __at (0xdfc5) unsigned char RADIO_calibration_C5; -static __xdata __at (0xdfc6) unsigned char RADIO_calibration_C6; -static __xdata __at (0xdfc7) unsigned char RADIO_calibration_C7; -static __xdata __at (0xdfc8) unsigned char RADIO_unk_C8; -static __xdata __at (0xdfc9) unsigned char RADIO_txPower; // 0..7 for -5..+8 dBm -static __xdata __at (0xdfca) unsigned char RADIO_unk_CA; -static __xdata __at (0xdfcb) unsigned char RADIO_perChannelSetting2; //relevant for tx -static __xdata __at (0xdfcd) unsigned char RADIO_unk_CD; -static __xdata __at (0xdfce) unsigned char RADIO_unk_CE; -static __xdata __at (0xdfcf) unsigned char RADIO_calibration_CF; -static __xdata __at (0xdfd0) unsigned char RADIO_calibration_D0; -static __xdata __at (0xdfd1) unsigned char RADIO_calibration_D1; -static __xdata __at (0xdfd2) unsigned char RADIO_calibration_D2; -static __xdata __at (0xdfd3) unsigned char RADIO_calibration_D3; -static __xdata __at (0xdfd4) unsigned char RADIO_calibration_D4; -static __xdata __at (0xdfd5) unsigned char RADIO_calibration_D5; -static __xdata __at (0xdfd7) unsigned char RADIO_unk_D7; -static __xdata __at (0xdfd8) unsigned char RADIO_unk_D8; -static __xdata __at (0xdfd9) unsigned char RADIO_SleepTimerHi; //only bottom 4 bits implemented, counts down to wake -static __xdata __at (0xdfda) unsigned char RADIO_SleepTimerMid; -static __xdata __at (0xdfdb) unsigned char RADIO_SleepTimerLo; -static __xdata __at (0xdfe2) unsigned char RADIO_unk_E2; -static __xdata __at (0xdff0) unsigned char RADIO_unk_F0; -static __xdata __at (0xdff3) unsigned char RADIO_SleepTimerSettings; //0x16 for one second tick, 0x56 for 1/32k second tick -static __xdata __at (0xdff4) unsigned char RADIO_RadioPowerCtl; -static __xdata __at (0xdffd) unsigned char RADIO_perChannelSetting1; //relevant fo rRX - -#define RADIO_CMD_RECEIVE 0xc2 //tx always goes to RX anyways -#define RADIO_CMD_FLUSH_RX_FIFO 0xc6 -#define RADIO_CMD_FLUSH_TX_FIFO 0xc7 -#define RADIO_CMD_LOAD_TX_FIFO 0xcb - - -#endif diff --git a/zbs243_Tag_FW/wdt.h b/zbs243_Tag_FW/wdt.h deleted file mode 100644 index aa7b33d9..00000000 --- a/zbs243_Tag_FW/wdt.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _WDT_H_ -#define _WDT_H_ - -#include - - -#pragma callee_saves wdtOn -void wdtOn(void); - -#pragma callee_saves wdtOff -void wdtOff(void); - -#pragma callee_saves wdtPet -void wdtPet(void); - -#pragma callee_saves wdtSetResetVal -void wdtSetResetVal(uint32_t val); //speed is CPU-specific. On ZBS it is 62KHz or so - -#pragma callee_saves wdtDeviceReset -void wdtDeviceReset(void); - -#define wdt10s() \ - do { \ - wdtSetResetVal(0xFFF68A1F); \ - wdtOn(); \ - } while (0) - -#define wdt30s() \ - do { \ - wdtSetResetVal(0xFFE39E5F); \ - wdtOn(); \ - } while (0) - -#define wdt60s() \ - do { \ - wdtSetResetVal(0xFFC73CBF); \ - wdtOn(); \ - } while (0) - - -#define wdt120s() \ - do { \ - wdtSetResetVal(0xFF8E797F); \ - wdtOn(); \ - } while (0) - -#endif diff --git a/zbs243_Tag_FW/wdt.h b/zbs243_Tag_FW/wdt.h new file mode 120000 index 00000000..7992b8da --- /dev/null +++ b/zbs243_Tag_FW/wdt.h @@ -0,0 +1 @@ +../zbs243_shared/wdt.h \ No newline at end of file