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:
marcansoft
2010-02-26 14:03:43 +00:00
parent 98bf65a640
commit 8fe1a992c7
3 changed files with 502 additions and 270 deletions
+420 -219
View File
File diff suppressed because it is too large Load Diff
+17 -13
View File
@@ -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
View File
@@ -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;
}