From 431ae7e0eb45db8cdc3a8097b1b642940586fe91 Mon Sep 17 00:00:00 2001 From: "adam@algroup.co.uk" Date: Fri, 24 Jul 2009 02:30:08 +0000 Subject: [PATCH] fast flash mode (button already held down) and both (os & fpga) flashing mode --- linux/flasher.c | 50 ++++++++++++++++++++++++++++++++--------------- linux/proxmark3.h | 3 +++ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/linux/flasher.c b/linux/flasher.c index 7cc8966f..beea754e 100644 --- a/linux/flasher.c +++ b/linux/flasher.c @@ -117,43 +117,61 @@ static void LoadFlashFromSRecords(char *file, int addr) int main(int argc, char **argv) { unsigned int addr = 0; + BOOL fastflash = 0, flashboth = 0; UsbCommand c; - if (argc != 3) { - fprintf(stderr,"Usage: %s {bootrom|os|fpga} image.s19\n", argv[0]); + if (argc != 3 && ! ((argc == 4 && *argv[3] == 'f') || (argc == 5 && *argv[4] == 'f'))) { + fprintf(stderr,"Usage: %s {bootrom|os|fpga} image.s19 [f]ast\n", argv[0]); + fprintf(stderr," %s {both} osimage.s19 fpgaimage.s19 [f]ast\n", argv[0]); exit(EXIT_FAILURE); } if (!strcmp(argv[1],"bootrom")) { addr = 0; } else if (!strcmp(argv[1],"os")) { - addr = 0x10000; + addr = FLASH_ADDR_OS; } else if (!strcmp(argv[1],"fpga")) { - addr = 0x2000; + addr = FLASH_ADDR_FPGA; + } else if (!strcmp(argv[1],"both")) { + flashboth = 1; } else { fprintf(stderr,"Unknown action '%s'!\n", argv[1]); exit(EXIT_FAILURE); } + if((argc == 4 && *argv[3] == 'f') || (argc == 5 && *argv[4] == 'f')) { + fastflash= 1; + fprintf(stderr,"Fastflash - device already in FLASH mode...\n"); + } + usb_init(); fprintf(stderr,"Waiting for Proxmark to appear on USB...\n"); while(!(devh=OpenProxmark(0))) { sleep(1); } fprintf(stderr,"Found...\n"); - fprintf(stderr,"Entering flash-mode...\n"); - bzero(&c, sizeof(c)); - c.cmd = CMD_START_FLASH; - SendCommand(&c, FALSE); - CloseProxmark(); - sleep(1); - - fprintf(stderr,"Waiting for Proxmark to reappear on USB...\n"); - fprintf(stderr,"(Press and hold down button NOW if your bootloader requires it)\n"); - while(!(devh=OpenProxmark(0))) { sleep(1); } - fprintf(stderr,"Found...\n"); + if(!fastflash){ + fprintf(stderr,"Entering flash-mode...\n"); + bzero(&c, sizeof(c)); + c.cmd = CMD_START_FLASH; + SendCommand(&c, FALSE); + CloseProxmark(); + sleep(1); + + fprintf(stderr,"Waiting for Proxmark to reappear on USB...\n"); + fprintf(stderr,"(Press and hold down button NOW if your bootloader requires it)\n"); + while(!(devh=OpenProxmark(0))) { sleep(1); } + fprintf(stderr,"Found...\n"); + } - LoadFlashFromSRecords(argv[2], addr); + if(!flashboth) + LoadFlashFromSRecords(argv[2], addr); + else { + fprintf(stderr,"Flashing os...\n"); + LoadFlashFromSRecords(argv[2],FLASH_ADDR_OS); + fprintf(stderr,"Flashing fpga...\n"); + LoadFlashFromSRecords(argv[3],FLASH_ADDR_FPGA); + } bzero(&c, sizeof(c)); c.cmd = CMD_HARDWARE_RESET; diff --git a/linux/proxmark3.h b/linux/proxmark3.h index 4868f256..67d80841 100644 --- a/linux/proxmark3.h +++ b/linux/proxmark3.h @@ -1,5 +1,8 @@ #define PROXPROMPT "proxmark3> " +#define FLASH_ADDR_OS 0x10000 +#define FLASH_ADDR_FPGA 0x2000 + extern usb_dev_handle *devh; extern unsigned char return_on_error; extern unsigned char error_occured; -- 2.39.2