mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
New flasher, much more paranoid and much more correct.
Knows how to merge segments to solve the "data overwrites last text block" issue. Removed "partition" stuff. Now it just flashes any elf file you pass, though there's still a -b option required to explicitly enable flashing the bootloader.
This commit is contained in:
+420
-219
File diff suppressed because it is too large
Load Diff
+17
-13
@@ -10,22 +10,26 @@
|
||||
#define __FLASH_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include "elf.h"
|
||||
|
||||
struct partition {
|
||||
int start;
|
||||
int end;
|
||||
int precious;
|
||||
const char *name;
|
||||
};
|
||||
typedef struct {
|
||||
void *data;
|
||||
uint32_t start;
|
||||
uint32_t length;
|
||||
} flash_seg_t;
|
||||
|
||||
void FlushPrevious(int translate);
|
||||
void GotByte(uint32_t where, uint8_t which, int start_addr, int end_addr, int translate);
|
||||
unsigned int EnterFlashState(void);
|
||||
int PrepareFlash(struct partition *p, const char *filename, unsigned int state);
|
||||
int find_next_area(const char *str, int *offset, int *length);
|
||||
typedef struct {
|
||||
const char *filename;
|
||||
int can_write_bl;
|
||||
int num_segs;
|
||||
flash_seg_t *segments;
|
||||
} flash_file_t;
|
||||
|
||||
#define PHYSICAL_FLASH_START 0x100000
|
||||
void do_flash(char **argv);
|
||||
int flash_load(flash_file_t *ctx, const char *name, int can_write_bl);
|
||||
int flash_start_flashing(int enable_bl_writes);
|
||||
int flash_write(flash_file_t *ctx);
|
||||
void flash_free(flash_file_t *ctx);
|
||||
int flash_stop_flashing(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+65
-38
@@ -3,64 +3,91 @@
|
||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||
// the license.
|
||||
//-----------------------------------------------------------------------------
|
||||
// Flashing binary
|
||||
// Flasher frontend tool
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "sleep.h"
|
||||
#include "proxusb.h"
|
||||
#include "flash.h"
|
||||
|
||||
unsigned int current_command = CMD_UNKNOWN;
|
||||
|
||||
extern struct partition partitions[];
|
||||
|
||||
static void usage(char **argv)
|
||||
static void usage(char *argv0)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s areas image [image [image]]\n", argv[0]);
|
||||
fprintf(stderr, " areas is a comma-separated list of areas to flash, with no spaces\n");
|
||||
fprintf(stderr, " Known areas are:");
|
||||
|
||||
for (int i = 0; partitions[i].name != NULL; ++i) {
|
||||
fprintf(stderr, " %s", partitions[i].name);
|
||||
}
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, " image is the path to the corresponding image\n\n");
|
||||
fprintf(stderr, "Example: %s os,fpga path/to/osimage.elf path/to/fpgaimage.elf\n", argv[0]);
|
||||
fprintf(stderr, "Usage: %s [-b] image.elf [image.elf...]\n\n", argv0);
|
||||
fprintf(stderr, "\t-b\tEnable flashing of bootloader area (DANGEROUS)\n\n");
|
||||
fprintf(stderr, "Example: %s path/to/osimage.elf path/to/fpgaimage.elf\n", argv0);
|
||||
}
|
||||
|
||||
#define MAX_FILES 4
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc < 2) {
|
||||
usage(argv);
|
||||
exit(-1);
|
||||
}
|
||||
int can_write_bl = 0;
|
||||
int num_files = 0;
|
||||
int res;
|
||||
flash_file_t files[MAX_FILES];
|
||||
|
||||
/* Count area arguments */
|
||||
int areas = 0, offset=-1, length=0;
|
||||
while (find_next_area(argv[1], &offset, &length)) areas++;
|
||||
memset(files, 0, sizeof(files));
|
||||
|
||||
if (areas != argc - 2) {
|
||||
usage(argv);
|
||||
exit(-1);
|
||||
}
|
||||
if (argc < 2) {
|
||||
usage(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
usb_init();
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (argv[i][0] == '-') {
|
||||
if (!strcmp(argv[i], "-b")) {
|
||||
can_write_bl = 1;
|
||||
} else {
|
||||
usage(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
res = flash_load(&files[num_files], argv[i], can_write_bl);
|
||||
if (res < 0) {
|
||||
fprintf(stderr, "Error while loading %s\n", argv[i]);
|
||||
return -1;
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
num_files++;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr,"Waiting for Proxmark to appear on USB... ");
|
||||
while (!OpenProxmark(0)) { sleep(1); }
|
||||
fprintf(stderr,"Found.\n");
|
||||
usb_init();
|
||||
|
||||
do_flash(argv);
|
||||
fprintf(stderr, "Waiting for Proxmark to appear on USB...");
|
||||
while (!OpenProxmark(0)) {
|
||||
sleep(1);
|
||||
fprintf(stderr, ".");
|
||||
}
|
||||
fprintf(stderr, " Found.\n");
|
||||
|
||||
UsbCommand c = {CMD_HARDWARE_RESET};
|
||||
SendCommand(&c);
|
||||
res = flash_start_flashing(can_write_bl);
|
||||
if (res < 0)
|
||||
return -1;
|
||||
|
||||
CloseProxmark();
|
||||
fprintf(stderr, "\nFlashing...\n");
|
||||
|
||||
fprintf(stderr,"Have a nice day!\n");
|
||||
for (int i = 0; i < num_files; i++) {
|
||||
res = flash_write(&files[i]);
|
||||
if (res < 0)
|
||||
return -1;
|
||||
flash_free(&files[i]);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
fprintf(stderr, "Resetting hardware...\n");
|
||||
|
||||
res = flash_stop_flashing();
|
||||
if (res < 0)
|
||||
return -1;
|
||||
|
||||
CloseProxmark();
|
||||
|
||||
fprintf(stderr, "All done.\n\n");
|
||||
fprintf(stderr, "Have a nice day!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user