#include "ROMWireProtocol.h" #include "XModem.h" enum { CMD_INVALID, CMD_WRITE, CMD_TEST, CMD_DUMP }; char line[120]; byte cmd = NULL; 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("."); cmd = NULL; return true; } void setup() { // Debug trigger pinMode(10, OUTPUT); digitalWrite(10, LOW); // put your setup code here, to run once: setCtrlPins(); setAddrPinsOut(); setDataPinsIn(); //setDataPinsOut(); 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); //byte data = readData(0x0000); // Serial.print("data: "); //Serial.print("Data returned: "); //Serial.println(data, HEX); // Serial.println("\n"); //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); } }