22 Commits
2.84 ... master

Author SHA1 Message Date
atc1441
eb0064363f Better HD150 5,83" Content design 2026-03-19 09:30:14 +01:00
atc1441
c1324c5089 Better HD150 5.83" Design 2026-03-19 08:54:52 +01:00
Skip Hansen
df3c615eef Update README.md 2026-03-14 08:49:11 -07:00
Nick Waterton
d5e19d20fa Fix buffer size truncation for non-8-aligned image dimensions (#561)
Integer division (w*h)/8 truncates when w*h is not a multiple of 8,
allocating one byte too few. spr2color then writes past the end of
the buffer, corrupting the heap. Use (w*h+7)/8 to round up correctly.

Triggered by any tag whose width*height is not divisible by 8.
2026-03-13 11:35:17 -07:00
alienkenny
e62a1b07bf Missed erase function (#549)
* Update swd.h

* Update swd.cpp

* Update usbflasher.cpp
2026-03-06 10:44:23 -08:00
Skip Hansen
4d06ef546d Point to Wiki for EFR32 tag flashing info from Tag Flasher readme.md. 2026-03-05 06:54:33 -08:00
Ruud
7096f7e756 Created new AP setup using the Lilygo T-Display-S3 board (#423)
* Created new AP setup using the Lilygo T-Display-S3 board

* Updated UseGhz setting
2026-03-04 12:57:48 -08:00
atc1441
1abedff388 Added 2.9 and 2.13 High Res 2026-02-27 14:16:53 +01:00
Steven Cooreman
8d2546a2aa Merge pull request #553 from stevew817/add_m3_42_bwry_definition
Add definition for M3 4.2 BWRY
2026-02-27 01:24:42 +01:00
atc1441
c5a8058d62 Merge branch 'master' of https://github.com/OpenEPaperLink/OpenEPaperLink 2026-02-26 14:21:39 +01:00
atc1441
ef59b87ae0 Update 3C.json 2026-02-26 14:21:38 +01:00
Skip Hansen
d526c43fd8 Added 91.json for the EL016F6W4A M3 1.6" BWRY variant. 2026-02-23 07:13:06 -08:00
Steven
86abc112dd Add definition for M3 4.2 BWRY
https://github.com/OpenEPaperLink/Shared_OEPL_Definitions/pull/5
https://github.com/OpenEPaperLink/Tag_FW_EFR32xG22/pull/16
2026-02-13 20:36:24 +01:00
Skip Hansen
af50f96671 Added 4F for 2.6" BWRY M3. 2026-02-13 07:45:17 -08:00
atc1441
46c8b73fa0 Added V2 ATC_BLE_OEPL Advertising Handling 2026-01-18 14:53:44 +01:00
Steven Cooreman
c65c8b749e Merge pull request #518 from stevew817/master
Add boilerplate definitions for more now-known Solum BWRY tags
2025-12-14 20:06:22 +01:00
atc1441
f61c2e3d04 Update 4E.json 2025-12-11 16:21:05 +01:00
atc1441
0dc406b865 Added M3 2.6" BW 2025-12-11 12:37:56 +01:00
Steven
25b185da28 Use correct base templates for BWRY variants 2025-12-07 19:36:58 +01:00
atc1441
496d4d382f Update contentmanager.cpp 2025-12-03 21:34:48 +01:00
Steven
0e8e7b5b75 Add 11.6" BWRY and fix previous BWRY definitions 2025-10-28 23:18:15 +01:00
Steven
e8a92c4fcb Add definitions for more now-known Solum BWRY tags
https://github.com/OpenEPaperLink/Tag_FW_EFR32xG22/issues/11
2025-10-22 01:09:26 +02:00
24 changed files with 529 additions and 40 deletions

View File

@@ -196,6 +196,24 @@ jobs:
cp ESP32_S3_16_8_LILYGO_AP/firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_AP.bin cp ESP32_S3_16_8_LILYGO_AP/firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_AP.bin
cp ESP32_S3_16_8_LILYGO_AP/merged-firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_AP_full.bin cp ESP32_S3_16_8_LILYGO_AP/merged-firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_AP_full.bin
- name: Build firmware for ESP32_S3_16_8_LILYGO_T3
run: |
cd ESP32_AP-Flasher
export PLATFORMIO_BUILD_FLAGS="-D BUILD_VERSION=${{ github.ref_name }} -D SHA=$GITHUB_SHA"
pio run --environment ESP32_S3_16_8_LILYGO_T3
pio run --target buildfs --environment ESP32_S3_16_8_LILYGO_T3
mkdir /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3
cp ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/boot_app0.bin
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/firmware.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/firmware.bin
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/bootloader.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/bootloader.bin
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/partitions.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/partitions.bin
cp .pio/build/ESP32_S3_16_8_LILYGO_T3/littlefs.bin /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3/littlefs.bin
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink/ESP32_S3_16_8_LILYGO_T3
esptool.py --chip esp32-s3 merge_bin -o merged-firmware.bin --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0000 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin 0x00910000 littlefs.bin
cd /home/runner/work/OpenEPaperLink/OpenEPaperLink
cp ESP32_S3_16_8_LILYGO_T3/firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_T3.bin
cp ESP32_S3_16_8_LILYGO_T3/merged-firmware.bin espbinaries/ESP32_S3_16_8_LILYGO_T3_full.bin
- name: Build firmware for OpenEPaperLink_Nano_TLSR - name: Build firmware for OpenEPaperLink_Nano_TLSR
run: | run: |
cd ESP32_AP-Flasher cd ESP32_AP-Flasher

View File

@@ -56,6 +56,7 @@ class nrfswd : protected swd {
uint8_t nrf_read_bank(uint32_t address, uint32_t buffer[], int size); uint8_t nrf_read_bank(uint32_t address, uint32_t buffer[], int size);
uint8_t nrf_write_bank(uint32_t address, uint32_t buffer[], int size); uint8_t nrf_write_bank(uint32_t address, uint32_t buffer[], int size);
uint8_t nrf_erase_all();
uint8_t erase_all_flash(); uint8_t erase_all_flash();
uint8_t erase_uicr(); uint8_t erase_uicr();
uint8_t erase_page(uint32_t page); uint8_t erase_page(uint32_t page);

View File

@@ -287,6 +287,95 @@ board_upload.maximum_ram_size = 327680
board_upload.flash_size = 16MB board_upload.flash_size = 16MB
; ---------------------------------------------------------------------------------------- ; ----------------------------------------------------------------------------------------
; !!! this configuration expects an ESP32-S3 16MB Flash 8MB RAM ; !!! this configuration expects an ESP32-S3 16MB Flash 8MB RAM
; !!! Dedicated pinout for using the Lilygo T-Display-S3 board.
; ----------------------------------------------------------------------------------------
[env:ESP32_S3_16_8_LILYGO_T3]
board = esp32-s3-devkitc-1
board_build.partitions = large_spiffs_16MB.csv
monitor_dtr = 0
monitor_rts = 0
build_unflags =
-std=gnu++11
-D CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
-D ILI9341_DRIVER
lib_deps = ${env.lib_deps}
build_flags =
-std=gnu++17
${env.build_flags}
-D HAS_TFT
-D CORE_DEBUG_LEVEL=1
-D ARDUINO_USB_CDC_ON_BOOT=1
-D CONFIG_ESP32S3_SPIRAM_SUPPORT=1
-D CONFIG_SPIRAM_USE_MALLOC=1
-D POWER_NO_SOFT_POWER
-D BOARD_HAS_PSRAM
-D CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
-D HAS_BLE_WRITER
-D FLASHER_AP_SS=-1
-D FLASHER_AP_CLK=-1
-D FLASHER_AP_MOSI=-1
-D FLASHER_AP_MISO=-1
-D FLASHER_AP_RESET=44 ;47 ;purple RST
-D FLASHER_AP_POWER={-1}
-D FLASHER_AP_TEST=-1
-D FLASHER_AP_TXD=17 ;white 2
-D FLASHER_AP_RXD=18 ;orange 3
-D FLASHER_DEBUG_TXD=12 ;15 ;yellow TX
-D FLASHER_DEBUG_RXD=13 ;7 ;blue RX
-D FLASHER_DEBUG_PROG=21 ;green 9
-D FLASHER_LED=-1
-D HAS_RGB_LED
-D FLASHER_RGB_LED=48
-D ST7789_DRIVER
;-D ST7735_DRIVER
;-D ST7735_GREENTAB160x80
-D TFT_INVERSION_ON
-D TFT_PARALLEL_8_BIT
-D TFT_WIDTH=170 ;80
-D TFT_HEIGHT=320 ;160
;-D TFT_MISO=-1
;-D TFT_MOSI=13
;-D TFT_SCLK=12
-D TFT_WR=8
-D TFT_RD=9
-D TFT_CS=6 ;10
-D TFT_DC=7 ;11
-D TFT_RST=5 ;1
-D TFT_D0=39
-D TFT_D1=40
-D TFT_D2=41
-D TFT_D3=42
-D TFT_D4=45
-D TFT_D5=46
-D TFT_D6=47
-D TFT_D7=48
-D TFT_BL=38
-D TFT_RGB_ORDER=TFT_BGR
-D USE_HSPI_PORT
-D LOAD_FONT2
-D LOAD_FONT4
-D LOAD_GLCD
;-D LOAD_FONT6
;-D LOAD_FONT7
;-D LOAD_FONT8
;-D LOAD_GFXFF
;-D SMOOTH_FONT
-D MD5_ENABLED=1
-D SERIAL_FLASHER_INTERFACE_UART=1
-D SERIAL_FLASHER_BOOT_HOLD_TIME_MS=200
-D SERIAL_FLASHER_RESET_HOLD_TIME_MS=200
-D C6_OTA_FLASHING
-D HAS_SUBGHZ ; previously disabled but now enabled. Disabling causes the Channel chooser to disfunction.
build_src_filter =
+<*>-<usbflasher.cpp>-<swd.cpp>-<webflasher.cpp>
board_build.flash_mode=qio
board_build.arduino.memory_type = qio_opi
board_build.psram_type=qspi_opi
board_upload.maximum_size = 16777216
board_upload.maximum_ram_size = 327680
board_upload.flash_size = 16MB
; ----------------------------------------------------------------------------------------
; !!! this configuration expects an ESP32-S3 16MB Flash 8MB RAM
; ---------------------------------------------------------------------------------------- ; ----------------------------------------------------------------------------------------
[env:ESP32_S3_C6_BIG_AP] [env:ESP32_S3_C6_BIG_AP]
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1

View File

@@ -64,7 +64,7 @@ uint8_t gicToOEPLtype(uint8_t gicType) {
} }
} }
struct BleAdvDataStruct { struct BleAdvDataStructV1 {
uint16_t manu_id; // 0x1337 for us uint16_t manu_id; // 0x1337 for us
uint8_t version; uint8_t version;
uint16_t hw_type; uint16_t hw_type;
@@ -73,6 +73,16 @@ struct BleAdvDataStruct {
uint16_t battery_mv; uint16_t battery_mv;
uint8_t counter; uint8_t counter;
} __packed; } __packed;
struct BleAdvDataStructV2 {
uint16_t manu_id; // 0x1337 for us
uint8_t version;
uint16_t hw_type;
uint16_t fw_version;
uint16_t capabilities;
uint16_t battery_mv;
int8_t temperature;
uint8_t counter;
} __packed;
bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) { bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
Serial.print("BLE Advertised Device found: "); Serial.print("BLE Advertised Device found: ");
@@ -91,16 +101,16 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
uint8_t manuData[100]; uint8_t manuData[100];
if (manuDatalen > sizeof(manuData)) if (manuDatalen > sizeof(manuData))
return false; // Manu data too big, could never happen but better make sure here return false; // Manu data too big, could never happen but better make sure here
Serial.printf(" Address type: %02X Manu data: ", advertisedDevice.getAddressType());
for (int i = 0; i < advertisedDevice.getManufacturerData().length(); i++)
Serial.printf("%02X", manuData[i]);
Serial.printf("\r\n");
#if ESP_ARDUINO_VERSION_MAJOR == 2 #if ESP_ARDUINO_VERSION_MAJOR == 2
memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().data(), manuDatalen); memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().data(), manuDatalen);
#else #else
// [Nic] suggested fix for arduino 3.x by copilot, but I cannot test it // [Nic] suggested fix for arduino 3.x by copilot, but I cannot test it
memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().c_str(), manuDatalen); memcpy(&manuData, (uint8_t*)advertisedDevice.getManufacturerData().c_str(), manuDatalen);
#endif #endif
Serial.printf(" Address type: %02X Manu data: ", advertisedDevice.getAddressType());
for (int i = 0; i < advertisedDevice.getManufacturerData().length(); i++)
Serial.printf("%02X", manuData[i]);
Serial.printf("\r\n");
if (manuDatalen == 7 && manuData[0] == 0x53 && manuData[1] == 0x50) { // Lets check for a Gicisky E-Paper display if (manuDatalen == 7 && manuData[0] == 0x53 && manuData[1] == 0x50) { // Lets check for a Gicisky E-Paper display
struct espAvailDataReq theAdvData; struct espAvailDataReq theAdvData;
@@ -125,24 +135,64 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
processDataReq(&theAdvData, true); processDataReq(&theAdvData, true);
return true; return true;
} else if (manuDatalen >= sizeof(BleAdvDataStruct) && manuData[0] == 0x37 && manuData[1] == 0x13) { // Lets check for a Gicisky E-Paper display } else if (manuDatalen >= 3 && manuData[0] == 0x37 && manuData[1] == 0x13) { // Lets check for a Gicisky E-Paper display
Serial.printf("ATC BLE OEPL Detected\r\n"); Serial.printf("ATC BLE OEPL Detected\r\n");
struct espAvailDataReq theAdvData; struct espAvailDataReq theAdvData;
struct BleAdvDataStruct inAdvData;
memset((uint8_t*)&theAdvData, 0x00, sizeof(espAvailDataReq)); memset((uint8_t*)&theAdvData, 0x00, sizeof(espAvailDataReq));
memcpy(&inAdvData, manuData, sizeof(BleAdvDataStruct)); uint8_t versionAdvData = manuData[2];
switch (versionAdvData) {
case 1: {
if (manuDatalen >= sizeof(BleAdvDataStructV1)) {
struct BleAdvDataStructV1 inAdvData;
memcpy(&inAdvData, manuData, sizeof(BleAdvDataStructV1));
printf("Version 1 ATC_BLE_OEPL Received\r\n");
/*Serial.printf("manu_id %04X\r\n", inAdvData.manu_id); /*Serial.printf("manu_id %04X\r\n", inAdvData.manu_id);
Serial.printf("version %04X\r\n", inAdvData.version); Serial.printf("version %02X\r\n", inAdvData.version);
Serial.printf("hw_type %04X\r\n", inAdvData.hw_type); Serial.printf("hw_type %04X\r\n", inAdvData.hw_type);
Serial.printf("fw_version %04X\r\n", inAdvData.fw_version); Serial.printf("fw_version %04X\r\n", inAdvData.fw_version);
Serial.printf("capabilities %04X\r\n", inAdvData.capabilities); Serial.printf("capabilities %04X\r\n", inAdvData.capabilities);
Serial.printf("battery_mv %u\r\n", inAdvData.battery_mv); Serial.printf("battery_mv %u\r\n", inAdvData.battery_mv);
Serial.printf("counter %u\r\n", inAdvData.counter);*/ Serial.printf("counter %u\r\n", inAdvData.counter);*/
if (inAdvData.version != 1) { theAdvData.adr.batteryMv = inAdvData.battery_mv;
printf("Version currently not supported!\r\n"); theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI();
theAdvData.adr.hwType = inAdvData.hw_type & 0xff;
theAdvData.adr.tagSoftwareVersion = inAdvData.fw_version;
theAdvData.adr.capabilities = inAdvData.capabilities & 0xff;
} else {
printf("Version 1 data length incorrect!\r\n");
return false; return false;
} }
} break;
case 2: {
if (manuDatalen >= sizeof(BleAdvDataStructV2)) {
struct BleAdvDataStructV2 inAdvData;
memcpy(&inAdvData, manuData, sizeof(BleAdvDataStructV2));
printf("Version 2 ATC_BLE_OEPL Received\r\n");
/*Serial.printf("manu_id %04X\r\n", inAdvData.manu_id);
Serial.printf("version %02X\r\n", inAdvData.version);
Serial.printf("hw_type %04X\r\n", inAdvData.hw_type);
Serial.printf("fw_version %04X\r\n", inAdvData.fw_version);
Serial.printf("capabilities %04X\r\n", inAdvData.capabilities);
Serial.printf("battery_mv %u\r\n", inAdvData.battery_mv);
Serial.printf("temperature %i\r\n", inAdvData.temperature);
Serial.printf("counter %u\r\n", inAdvData.counter);*/
theAdvData.adr.batteryMv = inAdvData.battery_mv;
theAdvData.adr.temperature = inAdvData.temperature;
theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI();
theAdvData.adr.hwType = inAdvData.hw_type & 0xff;
theAdvData.adr.tagSoftwareVersion = inAdvData.fw_version;
theAdvData.adr.capabilities = inAdvData.capabilities & 0xff;
} else {
printf("Version 2 data length incorrect!\r\n");
return false;
}
} break;
default:
printf("Version %02X currently not supported!\r\n", versionAdvData);
return false;
break;
}
uint8_t macReversed[6]; uint8_t macReversed[6];
memcpy(&macReversed, (uint8_t*)advertisedDevice.getAddress().getNative(), 6); memcpy(&macReversed, (uint8_t*)advertisedDevice.getAddress().getNative(), 6);
theAdvData.src[0] = macReversed[5]; theAdvData.src[0] = macReversed[5];
@@ -153,11 +203,6 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) {
theAdvData.src[5] = macReversed[0]; theAdvData.src[5] = macReversed[0];
theAdvData.src[6] = manuData[0]; // We use this do find out what type of display we got for compression^^ theAdvData.src[6] = manuData[0]; // We use this do find out what type of display we got for compression^^
theAdvData.src[7] = manuData[1]; theAdvData.src[7] = manuData[1];
theAdvData.adr.batteryMv = inAdvData.battery_mv;
theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI();
theAdvData.adr.hwType = inAdvData.hw_type & 0xff;
theAdvData.adr.tagSoftwareVersion = inAdvData.fw_version;
theAdvData.adr.capabilities = inAdvData.capabilities & 0xff;
processDataReq(&theAdvData, true); processDataReq(&theAdvData, true);
return true; return true;
} }

View File

@@ -3135,7 +3135,7 @@ uint32_t convert_tm_to_seconds(struct tm *t) {
void prepareTIME_RAW(const uint8_t *dst, time_t now) { void prepareTIME_RAW(const uint8_t *dst, time_t now) {
uint8_t *data; uint8_t *data;
size_t len = 1 + 4 + 4; size_t len = 1 + 4 + 4 + 1;
struct tm timeinfo; struct tm timeinfo;
localtime_r(&now, &timeinfo); localtime_r(&now, &timeinfo);
uint32_t local_time = convert_tm_to_seconds(&timeinfo) + 20;// Adding 20 seconds for the average of upload time uint32_t local_time = convert_tm_to_seconds(&timeinfo) + 20;// Adding 20 seconds for the average of upload time
@@ -3151,6 +3151,7 @@ void prepareTIME_RAW(const uint8_t *dst, time_t now) {
data[7] = ((uint8_t*)&unix_time)[1]; data[7] = ((uint8_t*)&unix_time)[1];
data[8] = ((uint8_t*)&unix_time)[2]; data[8] = ((uint8_t*)&unix_time)[2];
data[9] = ((uint8_t*)&unix_time)[3]; data[9] = ((uint8_t*)&unix_time)[3];
data[10] = 1; // Design, 1 = Full DateTime 2 = Just Time Segment Style
prepareDataAvail(data, len + 1, DATATYPE_TIME_RAW_DATA, dst); prepareDataAvail(data, len + 1, DATATYPE_TIME_RAW_DATA, dst);
} }
#endif #endif

View File

@@ -461,7 +461,7 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
case 1: case 1:
case 2: { case 2: {
long bufw = spr.width(), bufh = spr.height(); long bufw = spr.width(), bufh = spr.height();
size_t buffer_size = (bufw * bufh) / 8; size_t buffer_size = ((bufw * bufh) + 7) / 8; // round up: not all dimensions are multiples of 8
#ifdef BOARD_HAS_PSRAM #ifdef BOARD_HAS_PSRAM
uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size); uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size);
#else #else
@@ -585,7 +585,7 @@ void spr2buffer(TFT_eSprite &spr, String &fileout, imgParam &imageParams) {
case 3: case 3:
case 4: { case 4: {
long bufw = spr.width(), bufh = spr.height(); long bufw = spr.width(), bufh = spr.height();
size_t buffer_size = (bufw * bufh) / 8 * imageParams.bpp; size_t buffer_size = ((bufw * bufh) + 7) / 8 * imageParams.bpp;
uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size); uint8_t *buffer = (uint8_t *)ps_malloc(buffer_size);
if (!buffer) { if (!buffer) {
Serial.println("Failed to allocate buffer"); Serial.println("Failed to allocate buffer");

View File

@@ -264,7 +264,19 @@ void nrfswd::write_register(uint32_t address, uint32_t value) {
bool state3 = DP_Read(DP_RDBUFF, temp); bool state3 = DP_Read(DP_RDBUFF, temp);
// if (showDebug) Serial.printf("%i%i%i Write Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, address, value); // if (showDebug) Serial.printf("%i%i%i Write Register: 0x%08x : 0x%08x\r\n", state1, state2, state3, address, value);
} }
uint8_t nrfswd::nrf_erase_all() {
nrf_port_selection(1);
nrf_write_port(1, AP_NRF_ERASEALL, 1);
long timeout = millis();
while (nrf_read_port(1, AP_NRF_ERASEALLSTATUS)) {
if (millis() - timeout > 1000) return 1;
}
nrf_write_port(1, AP_NRF_ERASEALL, 0);
nrf_port_selection(0);
nrf_soft_reset();
init();
return 0;
}
uint8_t nrfswd::erase_all_flash() { uint8_t nrfswd::erase_all_flash() {
write_register(0x4001e504, 2); write_register(0x4001e504, 2);
long timeout = millis(); long timeout = millis();

View File

@@ -306,6 +306,7 @@ typedef enum {
CMD_ERASE_FLASH = 26, CMD_ERASE_FLASH = 26,
CMD_ERASE_INFOPAGE = 27, CMD_ERASE_INFOPAGE = 27,
CMD_ERASE_ALL = 28,
CMD_SAVE_MAC_FROM_FW = 40, CMD_SAVE_MAC_FROM_FW = 40,
CMD_PASS_THROUGH = 50, CMD_PASS_THROUGH = 50,
@@ -420,6 +421,16 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) {
} }
sendFlasherAnswer(CMD_ERASE_INFOPAGE, NULL, 0, transportType); sendFlasherAnswer(CMD_ERASE_INFOPAGE, NULL, 0, transportType);
break; break;
case CMD_ERASE_ALL:
if (selectedController == CONTROLLER_NRF82511) {
if (nrfflasherp == nullptr) return;
nrfflasherp->nrf_erase_all();
} else if (selectedController == CONTROLLER_CC) {
if (ccflasherp == nullptr) return;
ccflasherp->erase_chip();
}
sendFlasherAnswer(CMD_ERASE_ALL, NULL, 0, transportType);
break;
case CMD_SELECT_PORT: case CMD_SELECT_PORT:
wsSerial("> select port"); wsSerial("> select port");
selectedFlasherPort = cmd->data[0]; selectedFlasherPort = cmd->data[0];
@@ -453,7 +464,7 @@ void processFlasherCommand(struct flasherCommand* cmd, uint8_t transportType) {
break; break;
} }
nrfflasherp->init(); nrfflasherp->init();
temp_buff[0] = (nrfflasherp->isConnected && !nrfflasherp->isLocked); temp_buff[0] = nrfflasherp->isConnected ? (nrfflasherp->isLocked ? 2 : 1) : 0;
sendFlasherAnswer(CMD_SELECT_NRF82511, temp_buff, 1, transportType); sendFlasherAnswer(CMD_SELECT_NRF82511, temp_buff, 1, transportType);
currentFlasherOffset = 0; currentFlasherOffset = 0;
selectedController = CONTROLLER_NRF82511; selectedController = CONTROLLER_NRF82511;

View File

@@ -5,6 +5,13 @@ This is an alternative firmware and protocol for the multiple Electronic Shelf L
The software in this project consists of two parts: Accesspoint-firmware and Tag firmware. The software in this project consists of two parts: Accesspoint-firmware and Tag firmware.
Additionally, there are various hardware designs for accesspoints and flasher-interfaces to program the tags, preferably using programming jigs Additionally, there are various hardware designs for accesspoints and flasher-interfaces to program the tags, preferably using programming jigs
>[!Note]
>Please refer to the [Wiki](https://github.com/jjwbruijn/OpenEPaperLink/wiki) for the latest information.
>
>Much of this README is now obsolete, but it has been retained for historical reference.
>
>For example the use of tags as RF coprocessors is no longer supported.
## Aims ## Aims
- Low power (currently around 9µA with a minimum of 40 second latency) - Low power (currently around 9µA with a minimum of 40 second latency)
- Even lower power when there's no AP around - Even lower power when there's no AP around

View File

@@ -120,6 +120,9 @@ python3 OEPL-Flasher.py -e -c -p COM31 read blaat.bin --flash
See this [page](https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/Chroma-Series-SubGhz-Tags#flashing-cc1110-based-chroma-tags) See this [page](https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/Chroma-Series-SubGhz-Tags#flashing-cc1110-based-chroma-tags)
on the Wiki for additional information. on the Wiki for additional information.
## EFR32-based
This flasher does **NOT** support tags based on the EFR32. See the [wiki](https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/Flashing-SiLabs-based-M3-Newton-Displays) for information on how to flash those.
## Credits ## Credits
Much code was reused from ATC1441's various flashers Much code was reused from ATC1441's various flashers

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"name": "M3 2.9\" BWRY",
"width": 384,
"height": 168,
"rotatebuffer": 3,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 16, 17, 18, 19, 20, 21, 27 ],
"usetemplate": 51
}

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"name": "M3 4.3\" BWRY",
"width": 522,
"height": 152,
"rotatebuffer": 3,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 16, 17, 18, 19, 20, 21, 27 ],
"usetemplate": 47
}

View File

@@ -1,5 +1,5 @@
{ {
"version": 3, "version": 4,
"name": "M3 4.2\" BWY", "name": "M3 4.2\" BWY",
"width": 400, "width": 400,
"height": 300, "height": 300,
@@ -15,6 +15,7 @@
"black": [ 0, 0, 0 ], "black": [ 0, 0, 0 ],
"yellow": [ 200, 200, 0 ] "yellow": [ 200, 200, 0 ]
}, },
"highlight_color": 3,
"shortlut": 0, "shortlut": 0,
"zlib_compression": "27", "zlib_compression": "27",
"options": [ "button", "led" ], "options": [ "button", "led" ],

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"name": "M3 1.6\" 200px BWRY",
"width": 200,
"height": 200,
"rotatebuffer": 0,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 16, 17, 18, 19, 20, 21, 27 ],
"usetemplate": 48
}

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"name": "M3 2.2\" BWRY",
"width": 296,
"height": 160,
"rotatebuffer": 3,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 16, 17, 18, 19, 20, 21, 27 ],
"usetemplate": 49
}

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"name": "M3 7.5\" BWRY",
"width": 800,
"height": 480,
"rotatebuffer": 0,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "led" ],
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ],
"usetemplate": 54
}

View File

@@ -0,0 +1,25 @@
{
"version": 3,
"name": "M3 11.6\" BWRY",
"width": 960,
"height": 640,
"rotatebuffer": 0,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "led" ],
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20 ],
"usetemplate": 55
}

View File

@@ -0,0 +1,18 @@
{
"version": 2,
"name": "M3 2.6\" BW",
"width": 360,
"height": 184,
"rotatebuffer": 3,
"bpp": 1,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ]
},
"highlight_color": 5,
"shortlut": 0,
"zlib_compression": "27",
"options": [ "button", "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
"usetemplate": 1
}

25
resources/tagtypes/4F.json Executable file
View File

@@ -0,0 +1,25 @@
{
"version": 1,
"name": "M3 2.6\" BWRY",
"width": 360,
"height": 184,
"rotatebuffer": 3,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "button", "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
"usetemplate": 1
}

View File

@@ -1,5 +1,5 @@
{ {
"version": 2, "version": 4,
"name": "HD150 5.83\" BWR", "name": "HD150 5.83\" BWR",
"width": 648, "width": 648,
"height": 480, "height": 480,
@@ -21,21 +21,44 @@
"month": [ 300, 310, "Signika-SB.ttf", 110 ], "month": [ 300, 310, "Signika-SB.ttf", 110 ],
"day": [ 300, 75, "Signika-SB.ttf", 250 ] "day": [ 300, 75, "Signika-SB.ttf", 250 ]
}, },
"10": { "4": {
"title": [ 300, 10, "fonts/bahnschrift30" ], "location": [ 41, 25, "fonts/calibrib80" ],
"pos": [ 300, 50 ] "wind": [ 177, 225, "fonts/calibrib30" ],
"temp": [ 46, 300, "fonts/calibrib100" ],
"icon": [ 527, 100, 150, 2 ],
"dir": [ 122, 75, 180 ],
"umbrella": [ 582, 313, 102 ]
},
"8": {
"location": [ 10, 0, "fonts/calibrib80" ],
"column": [ 7, 92 ],
"day": [ 43, 138, "fonts/calibrib30", 188, 356 ],
"rain": [ 49, 425 ],
"icon": [ 46, 225, 60 ],
"wind": [ 17, 150 ],
"line": [ 96, 463 ]
}, },
"9": { "9": {
"title": [ 6, 0, "Signika-SB.ttf", 32 ], "title": [ 6, 0, "Signika-SB.ttf", 32 ],
"items": 6, "items": 6,
"line": [ 9, 40, "calibrib16.vlw" ], "line": [ 9, 50, "calibrib16.vlw" ],
"desc": [ 2, 8, "REFSAN12.vlw", 1.2 ] "desc": [ 2, 10, "REFSAN12.vlw", 1.2 ]
},
"10": {
"title": [ 324, 13, "fonts/bahnschrift20" ],
"pos": [ 324, 50 ]
}, },
"11": { "11": {
"rotate": 0, "rotate": 0,
"mode": 1, "mode": 1,
"days": 7, "days": 7,
"gridparam": [ 7, 17, 30, "calibrib16.vlw", "tahoma9.vlw", 14 ] "gridparam": [ 3, 21, 38, "calibrib16.vlw", "tahoma9.vlw", 14 ]
},
"27": {
"bars": [ 18, 620, 413, 20, 22 ],
"time": [ "calibrib16.vlw" ],
"yaxis": [ "calibrib16.vlw", 1, 12 ],
"head": [ "calibrib30.vlw" ]
} }
} }
} }

View File

@@ -0,0 +1,18 @@
{
"version": 1,
"name": "HS 2.9\" HighRes",
"width": 384,
"height": 168,
"rotatebuffer": 1,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "button", "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 26, 27 ],
"usetemplate": 51
}

View File

@@ -0,0 +1,18 @@
{
"version": 1,
"name": "HS 2.13\" BWR High Res",
"width": 296,
"height": 144,
"rotatebuffer": 1,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ]
},
"zlib_compression": "27",
"shortlut": 2,
"options": [ "button" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21, 27 ],
"usetemplate": 1
}

View File

@@ -0,0 +1,25 @@
{
"version": 3,
"name": "M3 4.2\" BWRY",
"width": 400,
"height": 300,
"rotatebuffer": 0,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"zlib_compression": "27",
"options": [ "button", "led" ],
"contentids": [ 22, 23, 1, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20, 27 ],
"usetemplate": 2
}

24
resources/tagtypes/91.json Executable file
View File

@@ -0,0 +1,24 @@
{
"version": 1,
"name": "M3 1.6\" 200px BWRY",
"width": 200,
"height": 200,
"rotatebuffer": 3,
"bpp": 2,
"colortable": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 255, 255, 0 ]
},
"perceptual": {
"white": [ 255, 255, 255 ],
"black": [ 0, 0, 0 ],
"red": [ 255, 0, 0 ],
"yellow": [ 200, 200, 0 ]
},
"shortlut": 0,
"options": [ "button", "led" ],
"contentids": [ 22, 23, 1, 2, 3, 4, 5, 7, 10, 14, 17, 18, 19, 20, 21 ],
"usetemplate": 48
}