Compare commits
2 Commits
3a07b3ab6f
...
1e644b9a5e
| Author | SHA1 | Date |
|---|---|---|
|
|
1e644b9a5e | |
|
|
55b08b7630 |
|
|
@ -1,11 +1,12 @@
|
|||
#include "config.h"
|
||||
#include "commands.h"
|
||||
#include "common.h"
|
||||
#include "parsing.h"
|
||||
#include "uart.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
|
|
@ -57,8 +58,33 @@ void commandRead(char* arg) {
|
|||
return;
|
||||
}
|
||||
|
||||
// TODO read data and output it
|
||||
uartPutString("ERR not implemented\n");
|
||||
uartPutString("OK\n");
|
||||
|
||||
uint8_t byteBuffer[DATA_BLOCK_SIZE];
|
||||
DataBuffer buffer = {
|
||||
.data = byteBuffer,
|
||||
.maxSize = DATA_BLOCK_SIZE,
|
||||
.bytes = 0
|
||||
};
|
||||
|
||||
do {
|
||||
// Read a single block with up to DATA_BLOCK_SIZE bytes
|
||||
range.from = eepromReadBlock(range, &buffer);
|
||||
|
||||
// TODO binary output
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
uartPutChar('\n');
|
||||
} while (buffer.bytes > 0);
|
||||
}
|
||||
|
||||
void commandWrite(char* arg) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef COMMANDS_H_
|
||||
#define COMMANDS_H_
|
||||
|
||||
#include "config.h"
|
||||
#include "common.h"
|
||||
#include "parsing.h"
|
||||
|
||||
void executeCommand(CommandLine cmdLine);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef COMMON_H_
|
||||
#define COMMON_H_
|
||||
|
||||
#include "config.h"
|
||||
#include <avr/io.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// Define macro for NOP instruction
|
||||
#define _NOP() __asm__ __volatile__ ("nop");
|
||||
|
||||
// Define type for EEPROM addresses
|
||||
typedef uint16_t address_t;
|
||||
|
||||
// Define highest valid address for the EEPROM
|
||||
#define HIGHEST_VALID_ADDRESS 0x7fff
|
||||
|
||||
// Type definition for address ranges (from-to)
|
||||
typedef struct {
|
||||
bool isValid;
|
||||
address_t from;
|
||||
address_t to;
|
||||
} AddressRange;
|
||||
|
||||
// Define type for a block of data (bytes)
|
||||
typedef struct {
|
||||
uint8_t* data;
|
||||
uint8_t maxSize;
|
||||
uint8_t bytes;
|
||||
} DataBuffer;
|
||||
|
||||
#define DATA_BLOCK_SIZE 64
|
||||
|
||||
#endif /* COMMON_H_ */
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
#include "config.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
#include <avr/io.h>
|
||||
|
|
@ -114,3 +113,37 @@ void eepromWriteByte(address_t address, uint8_t data) {
|
|||
// Write pulse width high (50ns)
|
||||
_NOP();
|
||||
}
|
||||
|
||||
// Read multiple bytes from EEPROM into a buffer
|
||||
address_t eepromReadBlock(AddressRange addressRange, DataBuffer* buffer) {
|
||||
// Set read mode
|
||||
eepromSetReadMode();
|
||||
|
||||
buffer->bytes = 0;
|
||||
|
||||
address_t currentAddress = addressRange.from;
|
||||
address_t highestAddress = addressRange.to;
|
||||
|
||||
if (highestAddress > HIGHEST_VALID_ADDRESS) {
|
||||
highestAddress = HIGHEST_VALID_ADDRESS;
|
||||
}
|
||||
|
||||
while (currentAddress <= highestAddress && buffer->bytes < buffer->maxSize) {
|
||||
buffer->data[buffer->bytes++] = eepromReadByte(currentAddress++);
|
||||
}
|
||||
|
||||
return currentAddress;
|
||||
}
|
||||
|
||||
// // Write multiple bytes from a buffer to EEPROM
|
||||
// address_t eepromWriteBlock(address_t currentAddress, DataBuffer buffer) {
|
||||
// // Set write mode
|
||||
// eepromSetWriteMode();
|
||||
|
||||
// for (uint8_t i = 0; currentAddress <= HIGHEST_VALID_ADDRESS && i < buffer.bytes; i++) {
|
||||
// eepromWriteByte(currentAddress++, buffer.data[i]);
|
||||
// // TODO address overflow
|
||||
// }
|
||||
|
||||
// return currentAddress;
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -2,14 +2,9 @@
|
|||
#define EEPROM_H_
|
||||
|
||||
#include "config.h"
|
||||
#include "common.h"
|
||||
#include <avr/io.h>
|
||||
|
||||
// Define macro for NOP instruction
|
||||
#define _NOP() __asm__ __volatile__ ("nop");
|
||||
|
||||
// Define type for (to be shifted) addresses
|
||||
typedef uint16_t address_t;
|
||||
|
||||
// Define address length
|
||||
// TODO 15 or 16?
|
||||
#define ADDRESS_LENGTH 15
|
||||
|
|
@ -45,4 +40,10 @@ uint8_t eepromReadByte(address_t address);
|
|||
// Write byte (assumes we're in write mode)
|
||||
void eepromWriteByte(address_t address, uint8_t data);
|
||||
|
||||
// Read multiple bytes from EEPROM into a buffer
|
||||
address_t eepromReadBlock(AddressRange addressRange, DataBuffer* buffer);
|
||||
|
||||
// // Write multiple bytes from a buffer to EEPROM
|
||||
// address_t eepromWriteBlock(address_t addressRange, DataBuffer buffer);
|
||||
|
||||
#endif /* EEPROM_H_ */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#include "config.h"
|
||||
#include "common.h"
|
||||
#include "uart.h"
|
||||
#include "eeprom.h"
|
||||
#include "parsing.h"
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
#ifndef PARSING_H_
|
||||
#define PARSING_H_
|
||||
|
||||
#include "config.h"
|
||||
#include "eeprom.h"
|
||||
#include "common.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
// Type definition for a command line with optional argument (actually just two pointers to strings)
|
||||
|
|
@ -11,13 +10,6 @@ typedef struct {
|
|||
char* arg;
|
||||
} CommandLine;
|
||||
|
||||
// Type definition for address ranges (from-to)
|
||||
typedef struct {
|
||||
bool isValid;
|
||||
address_t from;
|
||||
address_t to;
|
||||
} AddressRange;
|
||||
|
||||
void parseNextCommand();
|
||||
CommandLine readNextCommand(char* buffer, uint8_t bufferLength);
|
||||
CommandLine tokenizeCommand(char* cmd);
|
||||
|
|
|
|||
Loading…
Reference in New Issue