From 33387cb0463191042c498d4c146fb4fbe16cc455 Mon Sep 17 00:00:00 2001 From: maddiebaka Date: Thu, 22 Feb 2024 12:12:04 -0500 Subject: [PATCH] sends and receives up to 32K work --- NORFlasherFirmware.ino | 111 ++++++++++++++++++++++++++++++++++------- ROMWireProtocol.cpp | 12 +++-- ROMWireProtocol.h | 5 ++ 3 files changed, 105 insertions(+), 23 deletions(-) diff --git a/NORFlasherFirmware.ino b/NORFlasherFirmware.ino index c6f1584..d9340d2 100644 --- a/NORFlasherFirmware.ino +++ b/NORFlasherFirmware.ino @@ -2,6 +2,10 @@ #include "XModem.h" +#define DATA_LEN 128 +#define CONTAINER_LEN 512 +#define ID_LEN 1 + enum { CMD_INVALID, CMD_WRITE, @@ -10,21 +14,37 @@ enum { CMD_ERASE }; + char line[120]; +byte* sendBuffer[64]; byte cmd = NULL; XModem xmodem; bool receiveBlockHandler(void *blk_id, size_t idSize, byte *data, size_t dataSize) { + unsigned int id = *((int *) blk_id); + unsigned long page = (id - 1) * DATA_LEN; for (int i = 0; i < dataSize; i++) { - programData(data[i], i); + unsigned long index = i + page; + programData(data[i], index); + //programData(id, i); } - Serial.println("."); - cmd = NULL; return true; } +void blockLookupHandler(void *blk_id, size_t idSize, byte *send_data, size_t dataSize) { + //uint8_t blkId = blk_id; + uint16_t id = *((uint16_t *) blk_id); + // TODO: This was close to working + //byte id = *((byte *) blk_id); + unsigned long page = (id - 1) * DATA_LEN; + for (int i = 0; i < dataSize; i++) { + unsigned long index = i + page; + send_data[i] = readData(index); + } +} + void setup() { // Debug trigger pinMode(10, OUTPUT); @@ -36,9 +56,12 @@ void setup() { setDataPinsOut(); //setDataPinsOut(); - Serial.begin(9600, SERIAL_8N1); + Serial.begin(4800, SERIAL_8N1); xmodem.begin(Serial, XModem::ProtocolType::XMODEM); xmodem.setRecieveBlockHandler(receiveBlockHandler); + xmodem.setBlockLookupHandler(blockLookupHandler); + xmodem.setIdSize(ID_LEN); + //xmodem.allowNonSequentailBlocks(true); delay(2); Serial.println("Started Serial COM."); } @@ -105,18 +128,22 @@ void loop() { // Serial.println("\n"); //delay(1); - Serial.print("\n>"); - readLine(line, sizeof(line)); - Serial.flush(); - - //if(cmd == NULL) { - cmd = parseCommand(line[0]); - //} + if (cmd == NULL) { + Serial.print("\n>"); + readLine(line, sizeof(line)); + Serial.flush(); + cmd = parseCommand(line[0]); + } switch (cmd) { case CMD_WRITE: + setDataPinsOut(); Serial.println("Burn new ROM: Waiting for an xmodem transfer.."); - xmodem.receive(); + if (xmodem.receive() == true) { + delay(1000); + Serial.println("Finished burning firmware."); + cmd = NULL; + } break; case CMD_TEST: Serial.println("Testing with a read/write cycle"); @@ -129,14 +156,14 @@ void loop() { cmd = NULL; break; case CMD_DUMP: - setDataPinsIn(); - delay(500); - Serial.println("Dumping ROM..."); + //setDataPinsIn(); + //delay(500); + Serial.println("Waiting to send dump via xmodem..."); dumpROM(); // for(int i = 0; i < 20; i++) { // Serial.println(readData(0x1000), HEX); // } - cmd = NULL; + //cmd = NULL; break; case CMD_ERASE: eraseROM(); @@ -158,10 +185,56 @@ void loop() { } void dumpROM() { - for(int i = 0; i < 10; i++) { - byte data = readData(0x0000 | i); - Serial.println(data, HEX); + setDataPinsIn(); + + struct XModem::bulk_data container; + + //byte *id = (byte *) malloc(2); + byte id[CONTAINER_LEN]; + size_t data_len[CONTAINER_LEN]; + byte * data_arr[CONTAINER_LEN]; + + // unsigned long long temp = 1; + // for(size_t i = 0; i < ID_LEN; ++i) { + // id[ID_LEN - i - 1] = (byte *) (temp & 0xFF); + // temp >>= 8; + // } + + //size_t * data_len = malloc(2); + for(int i = 0; i < CONTAINER_LEN; i++) { + id[i] = i + 1; + data_len[i] = DATA_LEN; + data_arr[i] = NULL; } + + container.data_arr = data_arr; + container.len_arr = data_len;//(size_t*) 512; + container.id_arr = id; + container.count = CONTAINER_LEN; + + xmodem.send_bulk_data(container); + + free(id); + free(data_len); + + delay(500); + Serial.println("Finished sending ROM dump."); + cmd = NULL; + // for(int i = 0; i < 512; i++) { + // for(int d = 0; d < 128; d++) { + // sendBuffer[d] = readData(d * i); + // } + // xmodem.send(sendBuffer, 64); + // } + // if(xmodem.lookup_send(1) == true) { + // delay(1000); + // Serial.println("Finished transferring firmware dump."); + // cmd = NULL; + // } + // for (int i = 0; i < 10; i++) { + // byte data = readData(0x0000 | i); + // //Serial.println(data, HEX); + // } } void eraseROM() { diff --git a/ROMWireProtocol.cpp b/ROMWireProtocol.cpp index 516dee8..3bb714a 100644 --- a/ROMWireProtocol.cpp +++ b/ROMWireProtocol.cpp @@ -15,17 +15,21 @@ void setAddrPinsOut() { } void setDataPinsOut() { + if(dataMode == MODE_OUTPUT) { return; } for(int d = Data0; d <= Data7; d++) { pinMode(d, OUTPUT); digitalWrite(d, LOW); } + dataMode = MODE_OUTPUT; } void setDataPinsIn() { + if(dataMode == MODE_INPUT) { return; } for(int d = Data0; d <= Data7; d++) { digitalWrite(d, LOW); pinMode(d, INPUT); } + dataMode = MODE_INPUT; } void setByte(byte out) { @@ -53,8 +57,8 @@ byte readByte() { byte readData(unsigned long address) { byte temp_read; - setByte(0); - setDataPinsIn(); + //setByte(0); + //setDataPinsIn(); digitalWrite(PGM, HIGH); digitalWrite(OE, HIGH); @@ -77,10 +81,10 @@ void writeByte(byte data, unsigned long address) { digitalWrite(OE, HIGH); digitalWrite(PGM, HIGH); - delayMicroseconds(2); + delayMicroseconds(10); digitalWrite(PGM, LOW); - delayMicroseconds(1); + delayMicroseconds(3); digitalWrite(PGM, HIGH); } diff --git a/ROMWireProtocol.h b/ROMWireProtocol.h index d03515a..d15acf4 100644 --- a/ROMWireProtocol.h +++ b/ROMWireProtocol.h @@ -1,5 +1,10 @@ #include +enum { + MODE_INPUT, + MODE_OUTPUT +} dataMode = NULL; + #define OE 3 // PGM is also WE# according to data sheet #define PGM 2