From d331c703f2881f5fcfb5dd6a63daab79857ff9cf Mon Sep 17 00:00:00 2001 From: Jelmer Date: Mon, 6 Mar 2023 11:52:41 +0100 Subject: [PATCH] moved ssd1619 support, power needs checking --- tag_fw/board/ssd1619.c | 817 +++++++++++++++++++++++++++++++ tag_fw/board/ssd1619.h | 76 +++ tag_fw/board/zbs154v033/screen.c | 1 + tag_fw/board/zbs154v033/screen.h | 3 +- tag_fw/board/zbs29v033/screen.c | 1 + tag_fw/board/zbs29v033/screen.h | 4 +- tag_fw/board/zbs42v033/screen.c | 1 + tag_fw/board/zbs42v033/screen.h | 4 +- tag_fw/buildfw.sh | 7 + tag_fw/cpu/8051/printf.c | 1 - tag_fw/drawing.c | 1 - tag_fw/fw154.bin | Bin 55407 -> 55407 bytes tag_fw/fw29-uc8151.bin | Bin 0 -> 53990 bytes tag_fw/fw29.bin | Bin 55353 -> 55353 bytes tag_fw/fw42.bin | Bin 55369 -> 55369 bytes tag_fw/powermgt.c | 1 - tag_fw/userinterface.c | 1 - 17 files changed, 911 insertions(+), 7 deletions(-) create mode 100644 tag_fw/board/ssd1619.c create mode 100644 tag_fw/board/ssd1619.h create mode 100644 tag_fw/board/zbs154v033/screen.c create mode 100644 tag_fw/board/zbs29v033/screen.c create mode 100644 tag_fw/board/zbs42v033/screen.c create mode 100644 tag_fw/fw29-uc8151.bin diff --git a/tag_fw/board/ssd1619.c b/tag_fw/board/ssd1619.c new file mode 100644 index 00000000..89530ec6 --- /dev/null +++ b/tag_fw/board/ssd1619.c @@ -0,0 +1,817 @@ +#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/tag_fw/board/ssd1619.h b/tag_fw/board/ssd1619.h new file mode 100644 index 00000000..a94bb934 --- /dev/null +++ b/tag_fw/board/ssd1619.h @@ -0,0 +1,76 @@ +#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/tag_fw/board/zbs154v033/screen.c b/tag_fw/board/zbs154v033/screen.c new file mode 100644 index 00000000..9494884c --- /dev/null +++ b/tag_fw/board/zbs154v033/screen.c @@ -0,0 +1 @@ +#include "../ssd1619.c" diff --git a/tag_fw/board/zbs154v033/screen.h b/tag_fw/board/zbs154v033/screen.h index 034fd430..a08dfdd8 100644 --- a/tag_fw/board/zbs154v033/screen.h +++ b/tag_fw/board/zbs154v033/screen.h @@ -3,6 +3,7 @@ #include #include +#include "../ssd1619.h" #define SCREEN_WIDTH 152 #define SCREEN_HEIGHT 152 @@ -22,4 +23,4 @@ #define SCREEN_DATA_PASSES 2 -#endif \ No newline at end of file +#endif diff --git a/tag_fw/board/zbs29v033/screen.c b/tag_fw/board/zbs29v033/screen.c new file mode 100644 index 00000000..9494884c --- /dev/null +++ b/tag_fw/board/zbs29v033/screen.c @@ -0,0 +1 @@ +#include "../ssd1619.c" diff --git a/tag_fw/board/zbs29v033/screen.h b/tag_fw/board/zbs29v033/screen.h index a7352485..6569cd44 100644 --- a/tag_fw/board/zbs29v033/screen.h +++ b/tag_fw/board/zbs29v033/screen.h @@ -3,6 +3,8 @@ #include #include +#include "../ssd1619.h" + #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 296 @@ -21,4 +23,4 @@ #define SCREEN_DATA_PASSES 2 -#endif \ No newline at end of file +#endif diff --git a/tag_fw/board/zbs42v033/screen.c b/tag_fw/board/zbs42v033/screen.c new file mode 100644 index 00000000..9494884c --- /dev/null +++ b/tag_fw/board/zbs42v033/screen.c @@ -0,0 +1 @@ +#include "../ssd1619.c" diff --git a/tag_fw/board/zbs42v033/screen.h b/tag_fw/board/zbs42v033/screen.h index 96501a0e..8b8c147a 100644 --- a/tag_fw/board/zbs42v033/screen.h +++ b/tag_fw/board/zbs42v033/screen.h @@ -3,6 +3,8 @@ #include #include +#include "../ssd1619.h" + #define SCREEN_WIDTH 400 #define SCREEN_HEIGHT 300 @@ -22,4 +24,4 @@ #define SCREEN_DATA_PASSES 2 -#endif \ No newline at end of file +#endif diff --git a/tag_fw/buildfw.sh b/tag_fw/buildfw.sh index ca362ff3..2bd37a88 100644 --- a/tag_fw/buildfw.sh +++ b/tag_fw/buildfw.sh @@ -1,11 +1,18 @@ #!/bin/bash make clean + make BUILD=zbs154v033 CPU=8051 SOC=zbs243 mv main.bin fw154.bin make clean + make BUILD=zbs29v033 CPU=8051 SOC=zbs243 mv main.bin fw29.bin make clean + make BUILD=zbs42v033 CPU=8051 SOC=zbs243 mv main.bin fw42.bin make clean + +make BUILD=zbs29_uc8151 CPU=8051 SOC=zbs243 +mv main.bin fw29-uc8151.bin +make clean diff --git a/tag_fw/cpu/8051/printf.c b/tag_fw/cpu/8051/printf.c index 357e2818..37223677 100644 --- a/tag_fw/cpu/8051/printf.c +++ b/tag_fw/cpu/8051/printf.c @@ -5,7 +5,6 @@ #include #include "board.h" -//#include "epd.h" #include "screen.h" #include "uart.h" #include "zbs243.h" diff --git a/tag_fw/drawing.c b/tag_fw/drawing.c index d62920cc..8e57f8b1 100644 --- a/tag_fw/drawing.c +++ b/tag_fw/drawing.c @@ -6,7 +6,6 @@ #include "board.h" #include "cpu.h" #include "eeprom.h" -//#include "epd.h" #include "screen.h" #include "printf.h" #include "proto.h" diff --git a/tag_fw/fw154.bin b/tag_fw/fw154.bin index 0f94c4b14d172408832c4376cb4ed33d63b87eb8..c378db661595ce2f4cc9a7ff354c072816585e5a 100644 GIT binary patch delta 16486 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 diff --git a/tag_fw/fw29-uc8151.bin b/tag_fw/fw29-uc8151.bin new file mode 100644 index 0000000000000000000000000000000000000000..abf073b846338d4bdec6c3ed790c1aab277a7c73 GIT binary patch literal 53990 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ëmfRxzZO6cz~ zrN1YX{`%>8cJryym&;qG6An(~{F5f!wPj800^aBm2qv?5J)H8Fvfeu&zSqBD)M&m; zap_-&S>Y;DooAyBSP_jdYesqd+%nVy;~_~fJfNP_7fm42!f12hn-G2AB(EKe()Xs4 z$C7^1kbG^&V^qxcI@HXQlF=X70sF_l-7&x$h~xZ`&f@u>qu6tD<0vNk7G-2Qo^8XL z_Ch_{{j;1pm7e$jq9;tz{W;ldvxnV1fJE9CC7T^3k{!+2VHCUIk2?-z-uYBhc=xl+ zPc@%q7H58ziRI!mM|I9DZts>#3FEYKrs6 zJw((6WgOEGytRe8@M;2W&Rip3^OA)^H;&Fi9#g?l>KPuvvBkrt;Mht%jAI)N%k%Kt z4!<4n+rlnx&W*x%zAhik!;RwH#CQR35oAHj*aac-fE?yDOvNc7(sc;sDe%*C`i2vb z=#@)Vko@c<$xAYHJG&w2A}g1S)H}*CDDNWsmQ2;{?70KApD!_F9KwYO{cADC0)K4g zrQ}B`nPo~ewShH@hOx{d8B3DbC5JUTRd-Ul+a~thG3@Mytcw&bO--d_yAQ!^64yGSj|&=v+lQ;rWNPZK*wmknV{`MHf=K4V3Il$IKc)3GQegth@=7EDIG5 z-5f)Yz~NI~B+HCyF*io>D|CZsDGX7?w8!-ATspqgT6GU=!! zIfXNm9hKrEuxqC=GJKo>A5K_$KoW!oSvj}gAS=nq!iS#tPmyg>EdR<7rt&Y?FQny_ zbFps_zH%{2}cEdQ=;J5i=!YD?W>gx*^uqO2Ri|K#qQKD+jQ4{%K_NE zC{5@vWOo6?bw@j<%a-G*9wg*A_Hs;$#9t8{FTi2LgGjv~c8B}Y8lli4q01sBI9`zW zudqA8vCrF@N{5Gg5c+_w2s3}5=xX?N{tl3gEMFGOIx4^;dem;!fPiH0vXN%T&Vkh+ zruVOsC=CN6F?*a;Kj6D%{V>V|#p@lG zy`B!8w60N)EqX36OOZbQ5#T}fA%;sB1ISvm>^}z{w5RTFzP~C4<@|ro`JV_2Fb-1_V z^-xOENrR1?$8dTjR6NKju?OFVTbOWD0CEHdcQFj`L<=f?*y97y+f4&!$H?C9sr$Vh z1Pl<3h8lG;jc(JyRM7D$iSHcW#Fxfok6uB?IBRFoNH$vD?I7>07#36ZoZT`z1cMM!|Gw#1-TV8u4XRuIyZE@eToM&t_snNiENLW@L)2<{ MBTS__-irVKFKB0iPyhe` delta 16430 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 E0bxxTN&o-= diff --git a/tag_fw/fw42.bin b/tag_fw/fw42.bin index a688ab2a6ad3615d2ae18463a4e3e44c651873db..2197c5e4661cd3d0b95ee371fe8f9115d02e0b4e 100644 GIT binary patch delta 16493 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 aWXNk{gO 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 R*Xy)@`I0VQ5*`$8`+uv=2_FCe diff --git a/tag_fw/powermgt.c b/tag_fw/powermgt.c index bae18c26..6f5e68f3 100644 --- a/tag_fw/powermgt.c +++ b/tag_fw/powermgt.c @@ -12,7 +12,6 @@ #include "cpu.h" #include "drawing.h" #include "eeprom.h" -//#include "epd.h" #include "screen.h" #include "i2c.h" #include "printf.h" diff --git a/tag_fw/userinterface.c b/tag_fw/userinterface.c index e8590e2a..11b994c0 100644 --- a/tag_fw/userinterface.c +++ b/tag_fw/userinterface.c @@ -10,7 +10,6 @@ #include "board.h" #include "comms.h" #include "cpu.h" -//#include "epd.h" #include "font.h" #include "lut.h" #include "powermgt.h"