mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-01-07 16:48:15 +08:00
chg: spiffs load - broke out load
This commit is contained in:
parent
15b4b198b0
commit
5a33dca1a3
2 changed files with 70 additions and 60 deletions
|
@ -314,11 +314,69 @@ static int CmdFlashMemSpiFFSDump(const char *Cmd) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int flashmem_spiffs_load(uint8_t *destfn, uint8_t *data, size_t datalen) {
|
||||||
|
|
||||||
|
int ret_val = PM3_SUCCESS;
|
||||||
|
|
||||||
|
// We want to mount before multiple operation so the lazy writes/append will not
|
||||||
|
// trigger a mount + umount each loop iteration (lazy ops device side)
|
||||||
|
SendCommandNG(CMD_SPIFFS_MOUNT, NULL, 0);
|
||||||
|
|
||||||
|
// Send to device
|
||||||
|
uint32_t bytes_sent = 0;
|
||||||
|
uint32_t bytes_remaining = datalen;
|
||||||
|
uint32_t append = 0;
|
||||||
|
|
||||||
|
// fast push mode
|
||||||
|
conn.block_after_ACK = true;
|
||||||
|
|
||||||
|
while (bytes_remaining > 0) {
|
||||||
|
uint32_t bytes_in_packet = MIN(FLASH_MEM_BLOCK_SIZE, bytes_remaining);
|
||||||
|
|
||||||
|
clearCommandBuffer();
|
||||||
|
|
||||||
|
char fdata[32 + bytes_in_packet];
|
||||||
|
memset(fdata, 0, sizeof(fdata));
|
||||||
|
memcpy(fdata, destfn, 32);
|
||||||
|
memcpy(fdata + 32, data + bytes_sent, bytes_in_packet);
|
||||||
|
|
||||||
|
if (bytes_sent > 0)
|
||||||
|
append = 1;
|
||||||
|
|
||||||
|
SendCommandOLD(CMD_SPIFFS_WRITE, append, bytes_in_packet, 0, fdata, 32 + bytes_in_packet);
|
||||||
|
|
||||||
|
bytes_remaining -= bytes_in_packet;
|
||||||
|
bytes_sent += bytes_in_packet;
|
||||||
|
|
||||||
|
PacketResponseNG resp;
|
||||||
|
if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) {
|
||||||
|
PrintAndLogEx(WARNING, "timeout while waiting for reply.");
|
||||||
|
ret_val = PM3_ETIMEOUT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t isok = resp.oldarg[0] & 0xFF;
|
||||||
|
if (!isok) {
|
||||||
|
PrintAndLogEx(FAILED, "Flash write fail [offset %u]", bytes_sent);
|
||||||
|
ret_val = PM3_EFLASH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// turn off fast push mode
|
||||||
|
conn.block_after_ACK = false;
|
||||||
|
|
||||||
|
// We want to unmount after these to set things back to normal but more than this
|
||||||
|
// unmouting ensure that SPIFFS CACHES are all flushed so our file is actually written on memory
|
||||||
|
SendCommandNG(CMD_SPIFFS_UNMOUNT, NULL, 0);
|
||||||
|
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
||||||
|
|
||||||
uint32_t append = 0;
|
|
||||||
char filename[FILE_PATH_SIZE] = {0};
|
char filename[FILE_PATH_SIZE] = {0};
|
||||||
char destfilename[32] = {0};
|
uint8_t destfilename[32] = {0};
|
||||||
bool errors = false;
|
bool errors = false;
|
||||||
uint8_t cmdp = 0;
|
uint8_t cmdp = 0;
|
||||||
|
|
||||||
|
@ -334,8 +392,8 @@ static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
||||||
cmdp += 2;
|
cmdp += 2;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
param_getstr(Cmd, cmdp + 1, destfilename, 32);
|
param_getstr(Cmd, cmdp + 1, (char*)destfilename, 32);
|
||||||
if (strlen(destfilename) == 0) {
|
if (strlen((char*)destfilename) == 0) {
|
||||||
PrintAndLogEx(FAILED, "Destination Filename missing or invalid");
|
PrintAndLogEx(FAILED, "Destination Filename missing or invalid");
|
||||||
errors = true;
|
errors = true;
|
||||||
}
|
}
|
||||||
|
@ -362,63 +420,14 @@ static int CmdFlashMemSpiFFSLoad(const char *Cmd) {
|
||||||
return PM3_EFILE;
|
return PM3_EFILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We want to mount before multiple operation so the lazy writes/append will not
|
res = flashmem_spiffs_load(destfilename, data, datalen);
|
||||||
// trigger a mount + umount each loop iteration (lazy ops device side)
|
|
||||||
SendCommandNG(CMD_SPIFFS_MOUNT, NULL, 0);
|
|
||||||
|
|
||||||
// Send to device
|
|
||||||
uint32_t bytes_sent = 0;
|
|
||||||
uint32_t bytes_remaining = datalen;
|
|
||||||
|
|
||||||
// fast push mode
|
|
||||||
conn.block_after_ACK = true;
|
|
||||||
|
|
||||||
// SendCommandMIX(CMD_SPIFFS_COPY, 0, 0, 0, (uint8_t *)data, 65);
|
|
||||||
|
|
||||||
while (bytes_remaining > 0) {
|
|
||||||
uint32_t bytes_in_packet = MIN(FLASH_MEM_BLOCK_SIZE, bytes_remaining);
|
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
char fdata[32 + bytes_in_packet];
|
|
||||||
memset(fdata, 0, sizeof(fdata));
|
|
||||||
memcpy(fdata, destfilename, 32);
|
|
||||||
memcpy(fdata + 32, data + bytes_sent, bytes_in_packet);
|
|
||||||
// sprintf(fdata, "%s%s", destfilename, data + bytes_sent);
|
|
||||||
|
|
||||||
if (bytes_sent > 0)
|
|
||||||
append = 1;
|
|
||||||
|
|
||||||
SendCommandOLD(CMD_SPIFFS_WRITE, append, bytes_in_packet, 0, fdata, 32 + bytes_in_packet);
|
|
||||||
|
|
||||||
bytes_remaining -= bytes_in_packet;
|
|
||||||
bytes_sent += bytes_in_packet;
|
|
||||||
|
|
||||||
PacketResponseNG resp;
|
|
||||||
if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) {
|
|
||||||
PrintAndLogEx(WARNING, "timeout while waiting for reply.");
|
|
||||||
conn.block_after_ACK = false;
|
|
||||||
free(data);
|
|
||||||
return PM3_ETIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t isok = resp.oldarg[0] & 0xFF;
|
|
||||||
if (!isok) {
|
|
||||||
conn.block_after_ACK = false;
|
|
||||||
PrintAndLogEx(FAILED, "Flash write fail [offset %u]", bytes_sent);
|
|
||||||
free(data);
|
|
||||||
return PM3_EFLASH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
conn.block_after_ACK = false;
|
|
||||||
free(data);
|
free(data);
|
||||||
PrintAndLogEx(SUCCESS, "Wrote "_GREEN_("%zu") "bytes to file "_GREEN_("%s"), datalen, destfilename);
|
|
||||||
|
if ( res == PM3_SUCCESS )
|
||||||
// We want to unmount after these to set things back to normal but more than this
|
PrintAndLogEx(SUCCESS, "Wrote "_GREEN_("%zu") "bytes to file "_GREEN_("%s"), datalen, destfilename);
|
||||||
// unmouting ensure that SPIFFS CACHES are all flushed so our file is actually written on memory
|
|
||||||
SendCommandNG(CMD_SPIFFS_UNMOUNT, NULL, 0);
|
return res;
|
||||||
return PM3_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
|
|
|
@ -14,5 +14,6 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
int CmdFlashMemSpiFFS(const char *Cmd);
|
int CmdFlashMemSpiFFS(const char *Cmd);
|
||||||
|
int flashmem_spiffs_load(uint8_t *destfn, uint8_t *data, size_t datalen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue