From 282bc84e35b4bdade560ebea1974857b33e26a3e Mon Sep 17 00:00:00 2001 From: maddiebaka Date: Fri, 16 Feb 2024 15:33:42 -0500 Subject: [PATCH] Testing, reading and writing bytes --- NORFlasherFirmware.ino | 234 +++++++++++++++++++++++------------------ ROMWireProtocol.cpp | 99 +++++++++++++++++ ROMWireProtocol.h | 33 ++++++ 3 files changed, 262 insertions(+), 104 deletions(-) create mode 100644 ROMWireProtocol.cpp create mode 100644 ROMWireProtocol.h diff --git a/NORFlasherFirmware.ino b/NORFlasherFirmware.ino index 6505d08..3e8ee73 100644 --- a/NORFlasherFirmware.ino +++ b/NORFlasherFirmware.ino @@ -1,106 +1,27 @@ -#define OE 3 -// PGM is also WE# according to data sheet -#define PGM 2 +#include "ROMWireProtocol.h" -// 18 pin address line -#define Addr0 22 -#define Addr18 40 +#include "XModem.h" -// 8 pin data line -#define Data0 44 -#define Data7 51 +enum { + CMD_INVALID, + CMD_WRITE, + CMD_TEST, + CMD_DUMP +}; -void setCtrlPins() { - pinMode(OE, OUTPUT); - pinMode(PGM, OUTPUT); -} +char line[120]; +byte cmd = NULL; -void setAddrPinsOut() { - for(int a = Addr0; a <= Addr18; a++) { - pinMode(a, OUTPUT); - digitalWrite(a, LOW); +XModem xmodem; + +bool receiveBlockHandler(void *blk_id, size_t idSize, byte *data, size_t dataSize) { + for (int i = 0; i < dataSize; i++) { + programData(data[i], i); } -} + Serial.println("."); -void setDataPinsOut() { - for(int d = Data0; d <= Data7; d++) { - pinMode(d, OUTPUT); - digitalWrite(Data0 + d, LOW); - } -} - -void setDataPinsIn() { - for(int d = Data0; d <= Data7; d++) { - pinMode(Data0 + d, INPUT); - } -} - -void setByte(byte out) { - for(int i = 0; i < 8; i++) { - digitalWrite(Data0 + i, bitRead(out,i)); - } -} - -void setAddress(unsigned long addr) { - for(int i = 0; i < 19; i++) { - digitalWrite(Addr0 + i, bitRead(addr, i) ); - } -} - -byte readByte() { - byte temp_in = 0; - for(int i = 0; i < 8; i++) { - if(digitalRead(Data0 + i)) { - bitSet(temp_in, i); - } - } - - return temp_in; -} - -byte readData(unsigned long address) { - byte temp_read; - setDataPinsIn(); - - digitalWrite(PGM, HIGH); - digitalWrite(OE, HIGH); - - setAddress(address); - - digitalWrite(OE, LOW); - delayMicroseconds(1); - - temp_read = readByte(); - - return temp_read; -} - -void writeByte(byte data, unsigned long address) { - setAddress(address); - setByte(data); - - digitalWrite(OE, HIGH); - digitalWrite(PGM, HIGH); - - delayMicroseconds(2); - - digitalWrite(PGM, LOW); - delayMicroseconds(1); - digitalWrite(PGM, HIGH); -} - -void programData(byte data, unsigned long address) { - setDataPinsOut(); - - writeByte(0xAA, 0x5555); - writeByte(0x55, 0x2AAA); - writeByte(0xA0, 0x5555); - writeByte(data, address); - - delayMicroseconds(30); - - Serial.println(data, HEX); - Serial.println(address, HEX); + cmd = NULL; + return true; } void setup() { @@ -111,21 +32,126 @@ void setup() { setCtrlPins(); setAddrPinsOut(); - setDataPinsOut(); + setDataPinsIn(); + //setDataPinsOut(); - Serial.begin(9600); + Serial.begin(9600, SERIAL_8N1); + xmodem.begin(Serial, XModem::ProtocolType::XMODEM); + xmodem.setRecieveBlockHandler(receiveBlockHandler); delay(2); Serial.println("Started Serial COM."); } + +/* + * Function grabbed from TommyPROM library + * Copyright Tom Nisbet + */ +char *readLine(char *buffer, int len) { + for (int ix = 0; ix < len; ix++) { + buffer[ix] = 0; + } + + char c = ' '; + int ix = 0; + do { + if (Serial.available()) { + c = Serial.read(); + if ((c == '\b') && (ix > 0)) { + --ix; + } + buffer[ix++] = c; + Serial.write(c); + } + } while ((c != '\n') && (c != '\r') && (ix < len)); + + buffer[ix - 1] = 0; + return buffer; +} + +/* + * Function modified from TommyPROM library + * Copyright Tom Nisbet + */ +byte parseCommand(char c) { + byte cmd = CMD_INVALID; + + if ((c >= 'A') && (c <= 'Z')) { + c |= 0x20; + } + + switch (c) { + case 'w': cmd = CMD_WRITE; break; + case 't': cmd = CMD_TEST; break; + case 'd': cmd = CMD_DUMP; break; + default: cmd = CMD_INVALID; break; + } + + return cmd; +} + + + void loop() { // put your main code here, to run repeatedly: - programData(0x3F, 0x0000); + //programData(0x3F, 0x0000); - byte data = readData(0x0000); + //byte data = readData(0x0000); // Serial.print("data: "); - Serial.print("Data returned: "); - Serial.println(data, HEX); + //Serial.print("Data returned: "); + //Serial.println(data, HEX); // Serial.println("\n"); - delay(1); + //delay(1); + + Serial.print("\n>"); + readLine(line, sizeof(line)); + Serial.flush(); + + //if(cmd == NULL) { + cmd = parseCommand(line[0]); + //} + + switch (cmd) { + case CMD_WRITE: + Serial.println("Burn new ROM: Waiting for an xmodem transfer.."); + xmodem.receive(); + break; + case CMD_TEST: + Serial.println("Testing with a read/write cycle"); + programData(0x3F, 0x0000); + Serial.println("Wrote: 0x3F"); + setDataPinsIn(); + delay(500); + Serial.println("Received: "); + Serial.println(readData(0x0000), HEX); + cmd = NULL; + break; + case CMD_DUMP: + setDataPinsIn(); + delay(500); + Serial.println("Dumping ROM..."); + dumpROM(); + // for(int i = 0; i < 20; i++) { + // Serial.println(readData(0x1000), HEX); + // } + cmd = NULL; + break; + + case CMD_INVALID: + default: + Serial.println("NOR Flasher v1.0 Alpha"); + Serial.println(); + Serial.println("Commands: "); + Serial.println("w\twrite new firmware"); + Serial.println("d\tdump firmware"); + Serial.println(); + break; + } } + +void dumpROM() { + for(int i = 0; i < 10; i++) { + byte data = readData(0x0000 | i); + Serial.println(data, HEX); + } +} \ No newline at end of file diff --git a/ROMWireProtocol.cpp b/ROMWireProtocol.cpp new file mode 100644 index 0000000..516dee8 --- /dev/null +++ b/ROMWireProtocol.cpp @@ -0,0 +1,99 @@ +#include "ROMWireProtocol.h" + +//#include + +void setCtrlPins() { + pinMode(OE, OUTPUT); + pinMode(PGM, OUTPUT); +} + +void setAddrPinsOut() { + for(int a = Addr0; a <= Addr18; a++) { + pinMode(a, OUTPUT); + digitalWrite(a, LOW); + } +} + +void setDataPinsOut() { + for(int d = Data0; d <= Data7; d++) { + pinMode(d, OUTPUT); + digitalWrite(d, LOW); + } +} + +void setDataPinsIn() { + for(int d = Data0; d <= Data7; d++) { + digitalWrite(d, LOW); + pinMode(d, INPUT); + } +} + +void setByte(byte out) { + for(int i = 0; i < 8; i++) { + digitalWrite(Data0 + i, bitRead(out,i)); + } +} + +void setAddress(unsigned long addr) { + for(int i = 0; i < 19; i++) { + digitalWrite(Addr0 + i, bitRead(addr, i) ); + } +} + +byte readByte() { + byte temp_in = 0; + for(int i = 0; i < 8; i++) { + if(digitalRead(Data0 + i)) { + bitSet(temp_in, i); + } + } + + return temp_in; +} + +byte readData(unsigned long address) { + byte temp_read; + setByte(0); + setDataPinsIn(); + + digitalWrite(PGM, HIGH); + digitalWrite(OE, HIGH); + + setAddress(address); + delayMicroseconds(3); + + digitalWrite(OE, LOW); + delayMicroseconds(3); + + temp_read = readByte(); + + return temp_read; +} + +void writeByte(byte data, unsigned long address) { + setAddress(address); + setByte(data); + + digitalWrite(OE, HIGH); + digitalWrite(PGM, HIGH); + + delayMicroseconds(2); + + digitalWrite(PGM, LOW); + delayMicroseconds(1); + digitalWrite(PGM, HIGH); +} + +void programData(byte data, unsigned long address) { + setDataPinsOut(); + + writeByte(0xAA, 0x5555); + writeByte(0x55, 0x2AAA); + writeByte(0xA0, 0x5555); + writeByte(data, address); + + delayMicroseconds(30); + + //Serial.println(data, HEX); + //Serial.println(address, HEX); +} \ No newline at end of file diff --git a/ROMWireProtocol.h b/ROMWireProtocol.h new file mode 100644 index 0000000..d03515a --- /dev/null +++ b/ROMWireProtocol.h @@ -0,0 +1,33 @@ +#include + +#define OE 3 +// PGM is also WE# according to data sheet +#define PGM 2 + +// 18 pin address line +#define Addr0 22 +#define Addr18 40 + +// 8 pin data line +#define Data0 44 +#define Data7 51 + +void setCtrlPins(); + +void setAddrPinsOut(); + +void setDataPinsOut(); + +void setDataPinsIn(); + +void setByte(byte out); + +void setAddress(unsigned long addr); + +byte readByte(); + +byte readData(unsigned long address); + +void writeByte(byte data, unsigned long address); + +void programData(byte data, unsigned long address); \ No newline at end of file