fixed flasher, DMA handling

This commit is contained in:
Jelmer
2023-03-27 17:13:12 +02:00
parent 5057bb7627
commit d92681ef02
3 changed files with 37 additions and 21 deletions

View File

@@ -1,4 +1,4 @@
#include <Arduino.h>
String lookupFirmwareFile(uint16_t &version);
void performDeviceFlash();
bool performDeviceFlash();

View File

@@ -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;
}

View File

@@ -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");
}