Testing, reading and writing bytes

This commit is contained in:
maddiebaka
2024-02-16 15:33:42 -05:00
parent 0ca6818a67
commit 282bc84e35
3 changed files with 262 additions and 104 deletions

View File

@@ -1,106 +1,27 @@
#define OE 3 #include "ROMWireProtocol.h"
// PGM is also WE# according to data sheet
#define PGM 2
// 18 pin address line #include "XModem.h"
#define Addr0 22
#define Addr18 40
// 8 pin data line enum {
#define Data0 44 CMD_INVALID,
#define Data7 51 CMD_WRITE,
CMD_TEST,
CMD_DUMP
};
void setCtrlPins() { char line[120];
pinMode(OE, OUTPUT); byte cmd = NULL;
pinMode(PGM, OUTPUT);
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 setAddrPinsOut() { cmd = NULL;
for(int a = Addr0; a <= Addr18; a++) { return true;
pinMode(a, OUTPUT);
digitalWrite(a, LOW);
}
}
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);
} }
void setup() { void setup() {
@@ -111,21 +32,126 @@ void setup() {
setCtrlPins(); setCtrlPins();
setAddrPinsOut(); setAddrPinsOut();
setDataPinsOut(); setDataPinsIn();
//setDataPinsOut();
Serial.begin(9600); Serial.begin(9600, SERIAL_8N1);
xmodem.begin(Serial, XModem::ProtocolType::XMODEM);
xmodem.setRecieveBlockHandler(receiveBlockHandler);
delay(2); delay(2);
Serial.println("Started Serial COM."); 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() { void loop() {
// put your main code here, to run repeatedly: // 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: ");
Serial.print("Data returned: "); //Serial.print("Data returned: ");
Serial.println(data, HEX); //Serial.println(data, HEX);
// Serial.println("\n"); // 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);
}
} }

99
ROMWireProtocol.cpp Normal file
View File

@@ -0,0 +1,99 @@
#include "ROMWireProtocol.h"
//#include <Arduino.h>
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);
}

33
ROMWireProtocol.h Normal file
View File

@@ -0,0 +1,33 @@
#include <Arduino.h>
#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);