mirror of
https://github.com/OpenEPaperLink/OpenEPaperLink.git
synced 2026-03-21 11:06:49 +01:00
fixed flasher, DMA handling
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
String lookupFirmwareFile(uint16_t &version);
|
||||
void performDeviceFlash();
|
||||
bool performDeviceFlash();
|
||||
|
||||
@@ -27,8 +27,7 @@ typedef enum {
|
||||
uint8_t *infoblock = nullptr;
|
||||
uint8_t *flashbuffer = nullptr;
|
||||
|
||||
static class ZBS_interface* zbs;
|
||||
|
||||
static class ZBS_interface *zbs;
|
||||
|
||||
// look for the latest version of the firmware file... It's supposed to be something like zigbeebase0003.bin
|
||||
String lookupFirmwareFile(uint16_t &version) {
|
||||
@@ -165,17 +164,20 @@ void writeFlashBlock(uint16_t size) {
|
||||
}
|
||||
|
||||
// perform device flash, save mac, everything
|
||||
void performDeviceFlash() {
|
||||
bool performDeviceFlash() {
|
||||
uint8_t interfaceWorking = 0;
|
||||
zbs = new ZBS_interface;
|
||||
interfaceWorking = zbs->begin(FLASHER_AP_SS, FLASHER_AP_CLK, FLASHER_AP_MOSI, FLASHER_AP_MISO, FLASHER_AP_RESET, FLASHER_AP_POWER, 8000000);
|
||||
|
||||
Serial.printf("Power cycling to get everything up and running...\n");
|
||||
zbs->set_power(0);
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
zbs->set_power(1);
|
||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||
interfaceWorking = zbs->begin(FLASHER_AP_SS, FLASHER_AP_CLK, FLASHER_AP_MOSI, FLASHER_AP_MISO, FLASHER_AP_RESET, FLASHER_AP_POWER, 8000000);
|
||||
if (!interfaceWorking) {
|
||||
Serial.print("I wasn't able to connect to a ZBS tag, please check wiring and definitions in the settings.h file.\n");
|
||||
return;
|
||||
delete zbs;
|
||||
return false;
|
||||
}
|
||||
|
||||
readInfoBlock();
|
||||
@@ -197,7 +199,8 @@ void performDeviceFlash() {
|
||||
File file = LittleFS.open(lookupFirmwareFile(version));
|
||||
if (!file) {
|
||||
// couldn't find a valid firmware version
|
||||
return;
|
||||
delete zbs;
|
||||
return false;
|
||||
} else {
|
||||
Serial.printf("Preparing to flash version %04X (%d bytes) to the tag\n", version, file.size());
|
||||
}
|
||||
@@ -224,4 +227,6 @@ void performDeviceFlash() {
|
||||
flashbuffer = nullptr;
|
||||
zbs->reset();
|
||||
zbs->set_power(1);
|
||||
delete zbs;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
#include "commstructs.h"
|
||||
#include "flasher.h"
|
||||
#include "newproto.h"
|
||||
#include "powermgt.h"
|
||||
#include "settings.h"
|
||||
#include "web.h"
|
||||
#include "zbs_interface.h"
|
||||
#include "powermgt.h"
|
||||
|
||||
#define ZBS_RX_WAIT_HEADER 0
|
||||
#define ZBS_RX_WAIT_PKT_LEN 1
|
||||
@@ -22,12 +22,15 @@
|
||||
#define ZBS_RX_WAIT_JOINNETWORK 10
|
||||
#define ZBS_RX_WAIT_XFERTIMEOUT 11
|
||||
|
||||
#define ZBS_DMA_PIN FLASHER_AP_MISO
|
||||
|
||||
uint8_t restartBlockRequest = 0;
|
||||
|
||||
uint16_t sendBlock(const void* data, const uint16_t len) {
|
||||
Serial1.print(">D>");
|
||||
delay(10);
|
||||
|
||||
delay(3);
|
||||
digitalWrite(ZBS_DMA_PIN, HIGH);
|
||||
delay(1);
|
||||
uint8_t blockbuffer[sizeof(struct blockData)];
|
||||
struct blockData* bd = (struct blockData*)blockbuffer;
|
||||
bd->size = len;
|
||||
@@ -52,10 +55,9 @@ uint16_t sendBlock(const void* data, const uint16_t len) {
|
||||
Serial1.write(0);
|
||||
}
|
||||
|
||||
Serial1.write(0x00);
|
||||
Serial1.write(0x00);
|
||||
Serial1.write(0x00);
|
||||
Serial1.write(0x00);
|
||||
Serial1.write(0xAA);
|
||||
delay(10);
|
||||
digitalWrite(ZBS_DMA_PIN, LOW);
|
||||
return bd->checksum;
|
||||
}
|
||||
|
||||
@@ -90,7 +92,7 @@ uint8_t pktlen = 0;
|
||||
uint8_t pktindex = 0;
|
||||
char lastchar = 0;
|
||||
uint8_t charindex = 0;
|
||||
uint64_t waitingForVersion = 0;
|
||||
uint64_t waitingForVersion = 0;
|
||||
uint8_t crashcounter = 0;
|
||||
uint16_t version;
|
||||
|
||||
@@ -114,7 +116,7 @@ void Ping() {
|
||||
void SerialRXLoop() {
|
||||
if (Serial1.available()) {
|
||||
lastchar = Serial1.read();
|
||||
//Serial.write(lastchar);
|
||||
// Serial.write(lastchar);
|
||||
switch (RXState) {
|
||||
case ZBS_RX_WAIT_HEADER:
|
||||
Serial.write(lastchar);
|
||||
@@ -221,6 +223,9 @@ void zbsRxTask(void* parameter) {
|
||||
Serial1.begin(228571, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD);
|
||||
|
||||
rampTagPower(FLASHER_AP_POWER, true);
|
||||
pinMode(ZBS_DMA_PIN, OUTPUT);
|
||||
digitalWrite(ZBS_DMA_PIN, LOW);
|
||||
|
||||
bool firstrun = true;
|
||||
|
||||
Serial1.print("VER?");
|
||||
@@ -235,15 +240,15 @@ void zbsRxTask(void* parameter) {
|
||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||
|
||||
if (waitingForVersion) {
|
||||
if (esp_timer_get_time() - waitingForVersion > 5000*1000ULL) {
|
||||
if (esp_timer_get_time() - waitingForVersion > 5000 * 1000ULL) {
|
||||
waitingForVersion = 0;
|
||||
wsLog("AP doesn't respond... "+String(crashcounter + 1));
|
||||
wsLog("AP doesn't respond... " + String(crashcounter + 1));
|
||||
if (++crashcounter >= 4) {
|
||||
crashcounter = 0;
|
||||
Serial.println("I wasn't able to connect to a ZBS tag, trying to reboot the tag.");
|
||||
Serial.println("If this problem persists, please check wiring and definitions in the settings.h file, and presence of the right firmware");
|
||||
rampTagPower(FLASHER_AP_POWER, false);
|
||||
vTaskDelay(2/portTICK_PERIOD_MS);
|
||||
vTaskDelay(2 / portTICK_PERIOD_MS);
|
||||
rampTagPower(FLASHER_AP_POWER, true);
|
||||
wsErr("The AP tag crashed. Restarting tag, regenerating all pending info.");
|
||||
refreshAllPending();
|
||||
@@ -252,7 +257,7 @@ void zbsRxTask(void* parameter) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (version && firstrun) {
|
||||
Serial.printf("ZBS/Zigbee FW version: %04X\n", version);
|
||||
uint16_t fsversion;
|
||||
@@ -261,7 +266,13 @@ void zbsRxTask(void* parameter) {
|
||||
Serial.printf("Firmware version on LittleFS: %04X\n", fsversion);
|
||||
Serial.printf("Performing flash update in about 30 seconds");
|
||||
vTaskDelay(30000 / portTICK_PERIOD_MS);
|
||||
performDeviceFlash();
|
||||
if (performDeviceFlash()) {
|
||||
rampTagPower(FLASHER_AP_POWER, true);
|
||||
pinMode(ZBS_DMA_PIN, OUTPUT);
|
||||
digitalWrite(ZBS_DMA_PIN, LOW);
|
||||
} else {
|
||||
Serial.println("Failed to update version on the AP :(");
|
||||
}
|
||||
} else if (!fsversion) {
|
||||
Serial.println("No ZBS/Zigbee FW binary found on SPIFFS, please upload a zigbeebase000X.bin - format binary to enable flashing");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user