sends and receives up to 32K work
This commit is contained in:
@@ -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);
|
||||
|
||||
if (cmd == NULL) {
|
||||
Serial.print("\n>");
|
||||
readLine(line, sizeof(line));
|
||||
Serial.flush();
|
||||
|
||||
//if(cmd == NULL) {
|
||||
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() {
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,10 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
enum {
|
||||
MODE_INPUT,
|
||||
MODE_OUTPUT
|
||||
} dataMode = NULL;
|
||||
|
||||
#define OE 3
|
||||
// PGM is also WE# according to data sheet
|
||||
#define PGM 2
|
||||
|
Reference in New Issue
Block a user