ADD: 'mem' commands. For RDV40 devices only.

If you don't have one,  comment out inside client/Makefile this line

CFLAGS += -DWITH_FLASH
This commit is contained in:
iceman1001
2018-05-03 12:15:03 +02:00
parent d0b9d12bde
commit 021c0a1349
11 changed files with 394 additions and 123 deletions

View File

@@ -1127,18 +1127,65 @@ void UsbPacketReceived(uint8_t *packet, int len) {
}
case CMD_WRITE_FLASH_MEM: {
LED_B_ON();
uint8_t isok = 0;
uint16_t res = 0;
uint32_t startidx = c->arg[0];
uint16_t len = c->arg[1];
uint16_t res = Flash_WriteData(startidx, c->d.asBytes, len);
uint8_t isok = (res == len) ? 1 : 0;
Dbprintf("FlashMem init idx | %u | len %u ", startidx, len );
uint32_t tmp = startidx + len;
// inside 256b page?
if ( (tmp & 0xFF) != 0) {
// is offset+len larger than a page?
tmp = (startidx & 0xFF ) + len;
if (tmp > 0xFF ) {
// offset xxxx10,
uint8_t first_len = (~startidx & 0xFF)+1;
// first mem page
res = Flash_WriteData(startidx, c->d.asBytes, first_len);
Dbprintf("after 1. offset and larger A | %u | %u | %u == %u", startidx , len, first_len, res);
// second mem page (should be a mod 256)
res = Flash_WriteData(startidx + first_len, c->d.asBytes + first_len, len - first_len);
Dbprintf("after 2. offset and larger B | %u | %u | %u == %u", startidx + first_len, len, len-first_len, res);
isok = (res == (len - first_len)) ? 1 : 0;
} else {
res = Flash_WriteData(startidx, c->d.asBytes, len);
Dbprintf("offset and within | %u | %u | %u", startidx, len, res);
isok = (res == len) ? 1 : 0;
}
} else {
res = Flash_WriteData(startidx, c->d.asBytes, len);
Dbprintf("writing idx | %u | len %u ", startidx, len );
isok = (res == len) ? 1 : 0;
}
cmd_send(CMD_ACK, isok, 0, 0, 0, 0);
LED_B_OFF();
break;
}
case CMD_UPLOAD_FLASH_MEM:
case CMD_WIPE_FLASH_MEM:
LED_B_ON();
uint8_t page = c->arg[0];
uint8_t initalwipe = c->arg[1];
bool isok = false;
if ( initalwipe ) {
isok = Flash_WipeMemory();
cmd_send(CMD_ACK, isok, 0, 0, 0, 0);
LED_B_OFF();
break;
}
if ( page >= 0 && page < 3)
isok = Flash_WipeMemoryPage(page);
cmd_send(CMD_ACK, 1, 0, 0, 0, 0);
cmd_send(CMD_ACK, isok, 0, 0, 0, 0);
LED_B_OFF();
break;
case CMD_DOWNLOAND_FLASH_MEM: {

View File

@@ -240,8 +240,8 @@ uint16_t Flash_WriteData(uint32_t address, uint8_t *in, uint16_t len) {
return 0;
// Max 256 bytes write
if (((address & 255) + len) > 256) {
Dbprintf("Flash_WriteData 256 fail");
if (((address & 0xFF) + len) > 256) {
Dbprintf("Flash_WriteData 256 fail [ 0x%02x ] [ %u ]", (address & 0xFF)+len, len );
return 0;
}
@@ -279,6 +279,19 @@ uint16_t Flash_WriteData(uint32_t address, uint8_t *in, uint16_t len) {
return len;
}
bool Flash_WipeMemoryPage(uint8_t page) {
if (!FlashInit()) {
Dbprintf("Flash_WriteData init fail");
return false;
}
Flash_ReadStat1();
// Each block is 64Kb. One block erase takes 1s ( 1000ms )
Flash_WriteEnable(); Flash_Erase64k(page); Flash_CheckBusy(1000);
FlashStop();
return true;
}
// Wipes flash memory completely, fills with 0xFF
bool Flash_WipeMemory() {
if (!FlashInit()) {

View File

@@ -122,6 +122,7 @@ uint8_t Flash_ReadStat2(void);
uint16_t FlashSendByte(uint32_t data);
void Flash_WriteEnable();
bool Flash_WipeMemoryPage(uint8_t page);
bool Flash_WipeMemory();
bool Flash_Erase4k(uint8_t block, uint8_t sector);
//bool Flash_Erase32k(uint32_t address);