From 4bf61c1dd0ec7f935590f4d8b020bc6f2a98cc24 Mon Sep 17 00:00:00 2001 From: Jelmer Date: Sat, 14 Oct 2023 22:59:11 +0200 Subject: [PATCH] added eeprom support for tag flasher --- Tag_Flasher/ESP32_Flasher/src/usbflasher.cpp | 161 ++++++++++++++++++- 1 file changed, 153 insertions(+), 8 deletions(-) diff --git a/Tag_Flasher/ESP32_Flasher/src/usbflasher.cpp b/Tag_Flasher/ESP32_Flasher/src/usbflasher.cpp index 37a75c7e..7a16fbd4 100644 --- a/Tag_Flasher/ESP32_Flasher/src/usbflasher.cpp +++ b/Tag_Flasher/ESP32_Flasher/src/usbflasher.cpp @@ -29,7 +29,7 @@ struct flasherCommand { uint8_t* data = nullptr; }; -int8_t powerPins2[] = {16,17,18,21}; +int8_t powerPins2[] = {16, 17, 18, 21}; bool autoFlash(flasher* f) { f->getFirmwareMD5(); @@ -98,7 +98,26 @@ void sendFlasherAnswer(uint8_t answer_cmd, uint8_t* ans_buff, uint32_t len) { answer_buffer[3 + 2 + 2 + len] = CRC_value >> 8; answer_buffer[3 + 2 + 2 + len + 1] = CRC_value; - USBSerial.write(answer_buffer, 3 + 2 + 2 + len + 2); + + uint16_t totallen = 3 + 2 + 2 + len + 2; + // USBSerial.write(answer_buffer, totallen); + + uint16_t offset = 0; + while (totallen) { + if (totallen > 256) { + USBSerial.availableForWrite(); + USBSerial.write(answer_buffer + offset, 256); + delay(1); + offset += 256; + totallen -= 256; + } else { + USBSerial.availableForWrite(); + USBSerial.write(answer_buffer + offset, totallen); + delay(1); + totallen = 0; + } + } + // for(uint16_t c = 0; c< 3+2+2+len+2; c++){ //} @@ -262,7 +281,6 @@ static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t eve case ARDUINO_USB_CDC_RX_OVERFLOW_EVENT: // Serial.printf("CDC RX Overflow of %d bytes", data->rx_overflow.dropped_bytes); break; - default: break; } @@ -274,6 +292,7 @@ typedef enum { CMD_RESET_ESP = 2, CMD_RESET = 11, CMD_SET_POWER = 13, + CMD_SET_TESTP = 14, CMD_ERASE_FLASH = 26, CMD_ERASE_INFOPAGE = 27, @@ -282,6 +301,7 @@ typedef enum { CMD_SELECT_ZBS243 = 60, CMD_SELECT_NRF82511 = 61, + CMD_SELECT_EEPROM_PT = 69, CMD_SELECT_PORT = 70, @@ -291,6 +311,8 @@ typedef enum { CMD_WRITE_FLASH = 83, CMD_AUTOFLASH = 87, CMD_COMPLETE = 88, + CMD_READ_EEPROM = 90, + CMD_WRITE_EEPROM = 91 } ZBS_UART_PROTO; uint32_t FLASHER_VERSION = 0x00000030; @@ -299,10 +321,118 @@ uint32_t FLASHER_VERSION = 0x00000030; #define CONTROLLER_NRF82511 1 uint8_t selectedController = 0; uint8_t selectedFlasherPort; -uint32_t currentFlasherOffset; +uint32_t currentFlasherOffset = 0; flasher* zbsflasherp; nrfswd* nrfflasherp; +uint8_t waitSerialReply() { + uint8_t cmd[4] = {0}; + uint32_t start = millis(); + while (millis() - start < 800) { + while (uint16_t len = Serial1.available()) { + uint8_t lastbyte = Serial1.read(); + // Serial0.write(lastbyte); + for (uint8_t c = 0; c < 3; c++) { + cmd[c] = cmd[c + 1]; + } + cmd[3] = lastbyte; + + if (strncmp((const char*)cmd, "ACK>", 4) == 0) { + return 1; + } + if (strncmp((const char*)cmd, "NOK>", 4) == 0) { + return 2; + } + } + } + return 0; +} + +void handleEepromRead() { + uint8_t temp_buff[16]; + uint8_t* ebufferp; + if (currentFlasherOffset == 256) { + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + } else { + for (uint8_t attempt = 0; attempt < 3; attempt++) { + Serial1.print("LDE"); + Serial1.write((uint8_t)currentFlasherOffset & 0xFF); + if (waitSerialReply() == 1) goto okayLDE; + } + sendFlasherAnswer(CMD_COMPLETE, temp_buff, 1); + return; + okayLDE: + for (uint8_t attempt = 0; attempt < 3; attempt++) { + Serial1.print(" left) len = left; + Serial1.read(curpointer, len); + curpointer += len; + left -= len; + } + } + uint16_t sum = *((uint16_t*)(ebufferp + 2)); + uint16_t sum2 = 0; + uint16_t structlen = *((uint16_t*)ebufferp); + + for (uint16_t c = 0; c < 4096; c++) { + sum2 += ebufferp[4 + c]; + } + if (sum != sum2) { + Serial0.printf("CRC FAIL! 0x%04X\n", sum2); + goto okayLDE; + } + + sendFlasherAnswer(CMD_READ_EEPROM, ebufferp + 4, 4096); + free(ebufferp); + currentFlasherOffset++; + } +} + +void handleEepromWrite(uint8_t* data) { + uint8_t* buffer = (uint8_t*)malloc(4100); + uint16_t* bsize = (uint16_t*)(buffer); + uint16_t* checksum = (uint16_t*)(buffer + 2); + *bsize = 4096; + *checksum = 0; + memcpy(buffer + 4, data, 4096); + for (uint16_t c = 4; c < 4100; c++) { + *checksum += buffer[c]; + } +startEepromSend: + Serial0.print("here.\n"); + Serial1.print(">D>"); + if (waitSerialReply() == 1) goto okaySend; + sendFlasherAnswer(CMD_COMPLETE, buffer, 1); + free(buffer); + return; +okaySend: + for (uint16_t c = 0; c < 4100; c++) { + Serial1.write(buffer[c] ^ 0xAA); + } + Serial1.print("-----"); + + if (waitSerialReply() != 1) goto startEepromSend; +attemptWriteEEP: + Serial1.print("STE"); + Serial1.write((uint8_t)currentFlasherOffset & 0xFF); + if (waitSerialReply() != 1) goto attemptWriteEEP; + currentFlasherOffset++; + sendFlasherAnswer(CMD_WRITE_EEPROM, buffer, 1); + free(buffer); +} + void processFlasherCommand(struct flasherCommand* cmd) { uint8_t* tempbuffer; uint8_t temp_buff[16]; @@ -324,11 +454,14 @@ void processFlasherCommand(struct flasherCommand* cmd) { ESP.restart(); break; case CMD_SET_POWER: - powerControl(cmd->data[0], (uint8_t*)powerPins2, 4); - sendFlasherAnswer(CMD_SET_POWER, NULL, 0); break; + case CMD_SET_TESTP: + pinMode(FLASHER_EXT_TEST, OUTPUT); + digitalWrite(FLASHER_EXT_TEST, cmd->data[0]); + sendFlasherAnswer(CMD_SET_TESTP, NULL, 0); + break; case CMD_RESET: if (zbsflasherp != nullptr) { zbsflasherp->zbs->reset(); @@ -376,7 +509,7 @@ void processFlasherCommand(struct flasherCommand* cmd) { break; case CMD_SELECT_NRF82511: - //powerControl(true, (uint8_t*)powerPins2, 4); + // powerControl(true, (uint8_t*)powerPins2, 4); nrfflasherp = new nrfswd(FLASHER_EXT_MISO, FLASHER_EXT_CLK); nrfflasherp->showDebug = false; nrfflasherp->init(); @@ -385,6 +518,18 @@ void processFlasherCommand(struct flasherCommand* cmd) { currentFlasherOffset = 0; selectedController = CONTROLLER_NRF82511; break; + case CMD_SELECT_EEPROM_PT: + currentFlasherOffset = 0; + Serial1.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); + delay(50); + sendFlasherAnswer(CMD_SELECT_EEPROM_PT, NULL, 0); + break; + case CMD_READ_EEPROM: + handleEepromRead(); + break; + case CMD_WRITE_EEPROM: + handleEepromWrite(cmd->data); + break; case CMD_READ_FLASH: uint8_t* bufferp; uint32_t cur_len; @@ -580,4 +725,4 @@ void usbFlasherTask(void* parameter) { } } } -} \ No newline at end of file +}