diff --git a/README.md b/README.md index 5d01009..2c1c16b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,23 @@ Programming tool for parallel EEPROM chips, based on a ATmega16. Only supports AT28C256 EEPROM chips as of now. +## Usage + +### Using the python tool + +(TODO) + + +### Using the serial terminal + +The device uses a baud-rate of 38.4 kbps. +Output lines end with a line feed (LF), input lines may end with LF or CR+LF. + +Example for using `picocom` to access the device: + + picocom -b 38400 --imap lfcrlf --echo /dev/ttyUSB0 + + ## Development ### VS Code configuration diff --git a/firmware/Makefile b/firmware/Makefile index b04be63..1020d16 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -4,7 +4,7 @@ # Compiler and tools CC = avr-gcc OBJCOPY = avr-objcopy -AVRDUDE = avrdude +AVRDUDE ?= avrdude # Compiler and linker flags CFLAGS = -Wall -std=c11 -Os diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 5132acb..46c01e9 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -10,12 +10,22 @@ #include #include +// Internal function prototypes +void _uartPutAsciiBlock(DataBuffer buffer); + +// Mode: ASCII (false) or binary (true) +bool binary_mode = false; + // Execute a single parsed command void executeCommand(CommandLine cmdLine) { // Parse command if (strcmp(cmdLine.command, "INIT") == 0) { // INIT command: Initializes connection. - commandInit(); + commandInit(cmdLine.arg); + } + else if (strcmp(cmdLine.command, "HELP") == 0) { + // HELP command: Print a list of supported commands. + commandHelp(cmdLine.arg); } else if (strcmp(cmdLine.command, "READ") == 0) { // READ command: Takes a hex address range (or single address) as argument, @@ -40,8 +50,40 @@ void executeCommand(CommandLine cmdLine) { } } -void commandInit() { - // TODO init... or something? +void commandInit(char* arg) { + // (Re-)initialize EEPROM functions + eepromInit(); + + // Default mode: ASCII + binary_mode = false; + + if (arg != NULL) { + if (strcmp(arg, "BINARY") == 0) { + binary_mode = true; + } else if (strcmp(arg, "ASCII") == 0 || strcmp(arg, "TEXT") == 0) { + binary_mode = false; + } + } + + if (binary_mode) { + uartPutLine("OK (binary mode)"); + } else { + uartPutLine("OK (ASCII mode)"); + } +} + +void commandHelp() { + uartPutLine("HELP - Supported commands:"); + uartPutLine("HELP - HELP"); + uartPutLine("HELP - INIT [BINARY|ASCII]"); + uartPutLine("HELP - READ 0000:0FFF"); + uartPutLine("HELP - WRITE 0000"); + uartPutLine("HELP - ERASE 0000:0FFF"); + + // TODO remove those + uartPutLine("HELP - TESTREAD (only for testing)"); + uartPutLine("HELP - TESTWRITE (only for testing)"); + uartPutLine("OK"); } @@ -71,22 +113,35 @@ void commandRead(char* arg) { // Read a single block with up to DATA_BLOCK_SIZE bytes range.from = eepromReadBlock(range, &buffer); - // TODO binary output + if (binary_mode) { + // Send block as binary "package": + // First the size of the package (1 byte) followed by the data bytes + uartPutChar(buffer.bytes); - // ASCII output - char outBuffer[20]; - sprintf(outBuffer, "<%d>", buffer.bytes); - uartPutString(outBuffer); - - for (int i = 0; i < buffer.bytes; i++) { - sprintf(outBuffer, " %02X", buffer.data[i]); - uartPutString(outBuffer); + for (int i = 0; i < buffer.bytes; i++) { + uartPutChar(buffer.data[i]); + } + } else { + // Fancy ASCII output + _uartPutAsciiBlock(buffer); } - uartPutLine(NULL); } while (buffer.bytes > 0); } +void _uartPutAsciiBlock(DataBuffer buffer) { + char outBuffer[20]; + sprintf(outBuffer, "<%d>", buffer.bytes); + uartPutString(outBuffer); + + for (int i = 0; i < buffer.bytes; i++) { + sprintf(outBuffer, " %02X", buffer.data[i]); + uartPutString(outBuffer); + } + + uartPutLine(NULL); +} + void commandWrite(char* arg) { if (arg == NULL) { uartPutLine("ERR WRITE needs a start address"); @@ -100,6 +155,12 @@ void commandWrite(char* arg) { return; } + // Only binary mode + if (!binary_mode) { + uartPutLine("ERR WRITE in ASCII mode is not implemented"); + return; + } + // TODO read data from input and write to EEPROM uartPutLine("ERR not implemented"); } diff --git a/firmware/src/config.h b/firmware/src/config.h index 088d4d6..ee071d7 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -7,6 +7,6 @@ #endif // Set UART Baud rate -#define BAUD 9600UL +#define BAUD 38400UL #endif /* CONFIG_H_ */ diff --git a/firmware/src/main.c b/firmware/src/main.c index 056964f..cfd0404 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -15,7 +15,7 @@ int main(void) { _delay_ms(100); // Write initial message via UART - uartPutLine("INFO -- EEPROM programmer by binaryDiv"); + uartPutLine("INFO - EEPROM programmer by binaryDiv"); while(1) { // Run main loop endlessly