Implement ERASE command
This commit is contained in:
parent
1f668b6032
commit
d898f6e518
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
|
|
@ -219,8 +220,30 @@ void commandWrite(char* arg) {
|
||||||
uartPutLine("OK END");
|
uartPutLine("OK END");
|
||||||
}
|
}
|
||||||
|
|
||||||
void commandErase() {
|
void commandErase(char* arg) {
|
||||||
uartPutLine("ERROR not implemented");
|
if (arg == NULL) {
|
||||||
|
uartPutLine("ERROR ERASE needs a start address");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse address(es)
|
||||||
|
AddressRange range = parseAddressRange(arg);
|
||||||
|
if (!range.isValid || range.to < range.from) {
|
||||||
|
uartPutLine("ERROR invalid address format");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bytesErased = eepromEraseBlock(range);
|
||||||
|
|
||||||
|
if (bytesErased == 0) {
|
||||||
|
uartPutLine("ERROR 0 bytes erased");
|
||||||
|
} else {
|
||||||
|
char outBuffer[16];
|
||||||
|
snprintf(outBuffer, 16, "%lu", bytesErased);
|
||||||
|
uartPutString("OK erased ");
|
||||||
|
uartPutString(outBuffer);
|
||||||
|
uartPutLine(" bytes");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TESTREAD command: for testing purposes, reads a few bytes and returns them in a human readable format.
|
// TESTREAD command: for testing purposes, reads a few bytes and returns them in a human readable format.
|
||||||
|
|
|
||||||
|
|
@ -172,3 +172,34 @@ Address eepromWriteBlock(Address startAddress, DataBuffer buffer) {
|
||||||
|
|
||||||
return (Address) {true, currentAddress};
|
return (Address) {true, currentAddress};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Erase block of data on the EEPROM
|
||||||
|
uint32_t eepromEraseBlock(AddressRange addressRange) {
|
||||||
|
// Set write mode
|
||||||
|
eepromSetWriteMode();
|
||||||
|
|
||||||
|
if (!addressRange.isValid) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
address_t currentAddress = addressRange.from;
|
||||||
|
address_t highestAddress = addressRange.to;
|
||||||
|
|
||||||
|
if (highestAddress > HIGHEST_VALID_ADDRESS) {
|
||||||
|
highestAddress = HIGHEST_VALID_ADDRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bytesErased = 0;
|
||||||
|
|
||||||
|
while (currentAddress <= highestAddress) {
|
||||||
|
eepromWriteByte(currentAddress++, 0x00);
|
||||||
|
bytesErased++;
|
||||||
|
|
||||||
|
// Handle integer overflow
|
||||||
|
if (currentAddress == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytesErased;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,4 +46,7 @@ Address eepromReadBlock(AddressRange addressRange, DataBuffer* buffer);
|
||||||
// Write multiple bytes from a buffer to EEPROM
|
// Write multiple bytes from a buffer to EEPROM
|
||||||
Address eepromWriteBlock(Address startAddress, DataBuffer buffer);
|
Address eepromWriteBlock(Address startAddress, DataBuffer buffer);
|
||||||
|
|
||||||
|
// Erase block of data on the EEPROM
|
||||||
|
uint32_t eepromEraseBlock(AddressRange addressRange);
|
||||||
|
|
||||||
#endif /* EEPROM_H_ */
|
#endif /* EEPROM_H_ */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue