sends and receives up to 32K work

This commit is contained in:
maddiebaka
2024-02-22 12:12:04 -05:00
parent fad8ab3c4b
commit 33387cb046
3 changed files with 105 additions and 23 deletions

View File

@@ -2,6 +2,10 @@
#include "XModem.h" #include "XModem.h"
#define DATA_LEN 128
#define CONTAINER_LEN 512
#define ID_LEN 1
enum { enum {
CMD_INVALID, CMD_INVALID,
CMD_WRITE, CMD_WRITE,
@@ -10,21 +14,37 @@ enum {
CMD_ERASE CMD_ERASE
}; };
char line[120]; char line[120];
byte* sendBuffer[64];
byte cmd = NULL; byte cmd = NULL;
XModem xmodem; XModem xmodem;
bool receiveBlockHandler(void *blk_id, size_t idSize, byte *data, size_t dataSize) { 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++) { 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; 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() { void setup() {
// Debug trigger // Debug trigger
pinMode(10, OUTPUT); pinMode(10, OUTPUT);
@@ -36,9 +56,12 @@ void setup() {
setDataPinsOut(); setDataPinsOut();
//setDataPinsOut(); //setDataPinsOut();
Serial.begin(9600, SERIAL_8N1); Serial.begin(4800, SERIAL_8N1);
xmodem.begin(Serial, XModem::ProtocolType::XMODEM); xmodem.begin(Serial, XModem::ProtocolType::XMODEM);
xmodem.setRecieveBlockHandler(receiveBlockHandler); xmodem.setRecieveBlockHandler(receiveBlockHandler);
xmodem.setBlockLookupHandler(blockLookupHandler);
xmodem.setIdSize(ID_LEN);
//xmodem.allowNonSequentailBlocks(true);
delay(2); delay(2);
Serial.println("Started Serial COM."); Serial.println("Started Serial COM.");
} }
@@ -105,18 +128,22 @@ void loop() {
// Serial.println("\n"); // Serial.println("\n");
//delay(1); //delay(1);
Serial.print("\n>"); if (cmd == NULL) {
readLine(line, sizeof(line)); Serial.print("\n>");
Serial.flush(); readLine(line, sizeof(line));
Serial.flush();
//if(cmd == NULL) { cmd = parseCommand(line[0]);
cmd = parseCommand(line[0]); }
//}
switch (cmd) { switch (cmd) {
case CMD_WRITE: case CMD_WRITE:
setDataPinsOut();
Serial.println("Burn new ROM: Waiting for an xmodem transfer.."); 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; break;
case CMD_TEST: case CMD_TEST:
Serial.println("Testing with a read/write cycle"); Serial.println("Testing with a read/write cycle");
@@ -129,14 +156,14 @@ void loop() {
cmd = NULL; cmd = NULL;
break; break;
case CMD_DUMP: case CMD_DUMP:
setDataPinsIn(); //setDataPinsIn();
delay(500); //delay(500);
Serial.println("Dumping ROM..."); Serial.println("Waiting to send dump via xmodem...");
dumpROM(); dumpROM();
// for(int i = 0; i < 20; i++) { // for(int i = 0; i < 20; i++) {
// Serial.println(readData(0x1000), HEX); // Serial.println(readData(0x1000), HEX);
// } // }
cmd = NULL; //cmd = NULL;
break; break;
case CMD_ERASE: case CMD_ERASE:
eraseROM(); eraseROM();
@@ -158,10 +185,56 @@ void loop() {
} }
void dumpROM() { void dumpROM() {
for(int i = 0; i < 10; i++) { setDataPinsIn();
byte data = readData(0x0000 | i);
Serial.println(data, HEX); 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() { void eraseROM() {

View File

@@ -15,17 +15,21 @@ void setAddrPinsOut() {
} }
void setDataPinsOut() { void setDataPinsOut() {
if(dataMode == MODE_OUTPUT) { return; }
for(int d = Data0; d <= Data7; d++) { for(int d = Data0; d <= Data7; d++) {
pinMode(d, OUTPUT); pinMode(d, OUTPUT);
digitalWrite(d, LOW); digitalWrite(d, LOW);
} }
dataMode = MODE_OUTPUT;
} }
void setDataPinsIn() { void setDataPinsIn() {
if(dataMode == MODE_INPUT) { return; }
for(int d = Data0; d <= Data7; d++) { for(int d = Data0; d <= Data7; d++) {
digitalWrite(d, LOW); digitalWrite(d, LOW);
pinMode(d, INPUT); pinMode(d, INPUT);
} }
dataMode = MODE_INPUT;
} }
void setByte(byte out) { void setByte(byte out) {
@@ -53,8 +57,8 @@ byte readByte() {
byte readData(unsigned long address) { byte readData(unsigned long address) {
byte temp_read; byte temp_read;
setByte(0); //setByte(0);
setDataPinsIn(); //setDataPinsIn();
digitalWrite(PGM, HIGH); digitalWrite(PGM, HIGH);
digitalWrite(OE, HIGH); digitalWrite(OE, HIGH);
@@ -77,10 +81,10 @@ void writeByte(byte data, unsigned long address) {
digitalWrite(OE, HIGH); digitalWrite(OE, HIGH);
digitalWrite(PGM, HIGH); digitalWrite(PGM, HIGH);
delayMicroseconds(2); delayMicroseconds(10);
digitalWrite(PGM, LOW); digitalWrite(PGM, LOW);
delayMicroseconds(1); delayMicroseconds(3);
digitalWrite(PGM, HIGH); digitalWrite(PGM, HIGH);
} }

View File

@@ -1,5 +1,10 @@
#include <Arduino.h> #include <Arduino.h>
enum {
MODE_INPUT,
MODE_OUTPUT
} dataMode = NULL;
#define OE 3 #define OE 3
// PGM is also WE# according to data sheet // PGM is also WE# according to data sheet
#define PGM 2 #define PGM 2