X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/3a8464f0679d86904aa4ae2abb0cafe02e222ce8..84c02e97e0925a44daece47ce19c265e22d5c772:/client/flasher.c?ds=inline diff --git a/client/flasher.c b/client/flasher.c index bcbe2d77..ebcd3391 100644 --- a/client/flasher.c +++ b/client/flasher.c @@ -2,19 +2,30 @@ #include #include #include +#include +#include #include #include #include #include -#include "translate.h" #include "prox.h" #include "proxmark3.h" -static DWORD ExpectedAddr; -static BYTE QueuedToSend[256]; -static BOOL AllWritten; +static uint32_t ExpectedAddr; +static uint8_t QueuedToSend[256]; +static bool AllWritten; #define PHYSICAL_FLASH_START 0x100000 +unsigned int current_command = CMD_UNKNOWN; + +void WaitForAck(void) { + UsbCommand ack; + ReceiveCommand(&ack); + if(ack.cmd != CMD_ACK) { + printf("bad ACK\n"); + exit(-1); + } +} struct partition { int start; @@ -43,7 +54,8 @@ static void FlushPrevious(int translate) c.cmd = CMD_SETUP_WRITE; memcpy(c.d.asBytes, QueuedToSend+i, 48); c.arg[0] = (i/4); - SendCommand(&c, TRUE); + SendCommand(&c); + WaitForAck(); } c.cmd = CMD_FINISH_WRITE; @@ -53,16 +65,17 @@ static void FlushPrevious(int translate) } printf("c.arg[0] = %08x\r", c.arg[0]); memcpy(c.d.asBytes, QueuedToSend+240, 16); - SendCommand(&c, TRUE); + SendCommand(&c); + WaitForAck(); - AllWritten = TRUE; + AllWritten = true; } /* Where must be between start_addr (inclusive) and end_addr (exclusive). */ -static void GotByte(DWORD where, BYTE which, int start_addr, int end_addr, int translate) +static void GotByte(uint32_t where, uint8_t which, int start_addr, int end_addr, int translate) { - AllWritten = FALSE; + AllWritten = false; if(where < start_addr || where >= end_addr) { printf("bad: got byte at %08x, outside of range %08x-%08x\n", where, start_addr, end_addr); @@ -95,7 +108,7 @@ static int HexVal(int c) } } -static BYTE HexByte(char *s) +static uint8_t HexByte(char *s) { return (HexVal(s[0]) << 4) | HexVal(s[1]); } @@ -120,7 +133,7 @@ static void LoadFlashFromSRecords(const char *file, int start_addr, int end_addr char addrStr[9]; memcpy(addrStr, s, 8); addrStr[8] = '\0'; - DWORD addr; + uint32_t addr; sscanf(addrStr, "%x", &addr); s += 8; @@ -160,7 +173,8 @@ static int PrepareFlash(struct partition *p, const char *filename, unsigned int } else { c.arg[2] = 0; } - SendCommand(&c, TRUE); + SendCommand(&c); + WaitForAck(); translate = 0; } else { fprintf(stderr, "Warning: Your bootloader does not understand the new START_FLASH command\n"); @@ -178,7 +192,7 @@ static unsigned int GetProxmarkState(void) UsbCommand c; c.cmd = CMD_DEVICE_INFO; - SendCommand(&c, FALSE); + SendCommand(&c); UsbCommand resp; ReceiveCommand(&resp); @@ -233,13 +247,13 @@ static unsigned int EnterFlashState(void) * enter the bootrom on the next boot. */ c.cmd = CMD_START_FLASH; - SendCommand(&c, FALSE); + SendCommand(&c); fprintf(stderr,"(You don't have to do anything. Press and release the button only if you want to abort)\n"); fprintf(stderr,"Waiting for Proxmark to reappear on USB... "); } else { /* Old style handover: Ask the user to press the button, then reset the board */ c.cmd = CMD_HARDWARE_RESET; - SendCommand(&c, FALSE); + SendCommand(&c); fprintf(stderr,"(Press and hold down button NOW if your bootloader requires it)\n"); fprintf(stderr,"Waiting for Proxmark to reappear on USB... "); } @@ -345,7 +359,7 @@ int main(int argc, char **argv) { UsbCommand c; bzero(&c, sizeof(c)); c.cmd = CMD_HARDWARE_RESET; - SendCommand(&c, FALSE); + SendCommand(&c); CloseProxmark();