64 lines
1.1 KiB
C++
64 lines
1.1 KiB
C++
#define ROM_SIZE (0xffff)
|
|
#define SER_BUF (1024)
|
|
|
|
#define SIG_RESET ('r')
|
|
#define SIG_WRITE ('w')
|
|
|
|
enum states {
|
|
IDLE,
|
|
WRITE // write rom to memory
|
|
};
|
|
|
|
void do_reset() {
|
|
SCB->AIRCR = 0x05fa0004;
|
|
}
|
|
|
|
enum states state = IDLE;
|
|
volatile static uint8_t rom[ROM_SIZE];
|
|
uint8_t buf[SER_BUF];
|
|
uint16_t rom_idx = 0;
|
|
uint32_t start = 0;
|
|
|
|
void setup() {
|
|
bzero(&buf, SER_BUF);
|
|
bzero((void*)&rom, ROM_SIZE);
|
|
|
|
Serial.begin(115200);
|
|
|
|
start = millis();
|
|
state = IDLE;
|
|
|
|
Serial.println("READY");
|
|
}
|
|
|
|
void flush_serial() {
|
|
while(Serial.available() > 0) Serial.read();
|
|
}
|
|
|
|
void loop() {
|
|
if(state == IDLE) {
|
|
char c = Serial.read();
|
|
|
|
if(c == SIG_RESET) {
|
|
Serial.println("resetting");
|
|
delay(1000);
|
|
do_reset();
|
|
} else if(c == SIG_WRITE) {
|
|
state = WRITE;
|
|
rom_idx = 0;
|
|
|
|
bzero((void*)&rom, ROM_SIZE);
|
|
|
|
start = millis();
|
|
|
|
Serial.println("Ready for ROM");
|
|
}
|
|
} else if(state == WRITE) {
|
|
while(true && rom_idx < 0x7ffe && millis() - start < 3000) {
|
|
while(Serial.available()) rom[rom_idx++] = Serial.read();
|
|
}
|
|
|
|
state = IDLE;
|
|
Serial.printf("Read 0x%04X bytes into memory\r\n", rom_idx);
|
|
}
|
|
}
|