WIP: match board with bitfile filename or userid

This commit is contained in:
Jeff Epler 2016-11-21 21:35:05 -06:00
parent 934769e0cc
commit 676a63d241
8 changed files with 95 additions and 10 deletions

View file

@ -334,6 +334,7 @@ void anyio_dev_print_sserial_info(board_t *board) {
void anyio_bitfile_print_info(char *bitfile_name, int verbose_flag) { void anyio_bitfile_print_info(char *bitfile_name, int verbose_flag) {
FILE *fp; FILE *fp;
char part_name[32]; char part_name[32];
char board_name[5];
if (bitfile_name == NULL) { if (bitfile_name == NULL) {
return; return;
@ -343,6 +344,6 @@ void anyio_bitfile_print_info(char *bitfile_name, int verbose_flag) {
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return; return;
} }
print_bitfile_header(fp, (char*) &part_name, verbose_flag); print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, verbose_flag);
fclose(fp); fclose(fp);
} }

View file

@ -22,12 +22,15 @@
#include "bitfile.h" #include "bitfile.h"
// prints info about bitfile and returns header length or -1 when error // prints info about bitfile and returns header length or -1 when error
int print_bitfile_header(FILE *fp, char *part_name, int verbose_flag) { int print_bitfile_header(FILE *fp, char *part_name, char *board_id, int verbose_flag) {
u8 buff[256]; u8 buff[256];
int sleng; int sleng;
int bytesread, conflength; int bytesread, conflength;
int ret = 0; int ret = 0;
if(board_id)
strcpy(board_id, "");
printf("Checking file... "); printf("Checking file... ");
bytesread = fread(&buff, 1, 14, fp); bytesread = fread(&buff, 1, 14, fp);
ret += bytesread; ret += bytesread;
@ -49,6 +52,20 @@ int print_bitfile_header(FILE *fp, char *part_name, int verbose_flag) {
if (verbose_flag == 1) { if (verbose_flag == 1) {
printf(" Design name: %s\n", buff); printf(" Design name: %s\n", buff);
} }
char *id = strstr(buff, "UserID=");
if(id && board_id) {
int id_hex = -1;
sscanf(id+7, "%x", &id_hex);
if(id_hex != 0xffffffff)
{
board_id[0] = (id_hex >> 24) & 0xff;
board_id[1] = (id_hex >> 16) & 0xff;
board_id[2] = (id_hex >> 8) & 0xff;
board_id[3] = id_hex & 0xff;
board_id[4] = 0;
}
fprintf(stderr, "note: board_id = %s\n", board_id);
}
bytesread = fread(&buff, 1, 3, fp); bytesread = fread(&buff, 1, 3, fp);
ret += bytesread; ret += bytesread;
@ -125,3 +142,40 @@ u8 bitfile_reverse_bits(u8 data) {
}; };
return swaptab[data]; return swaptab[data];
} }
static const char *bitfile_basename(const char *filename) {
const char *s = strrchr(filename, '/');
if(!s) s = filename;
else s = s + 1;
#ifdef _WIN32
s = strrchr(filename, '\\');
if(!s) s = filename;
else s = s + 1;
#endif
return s;
}
int check_board_name(char *llio_board_name, const char *bitfile_board_name, const char *filename)
{
fprintf(stderr, "check_board_name %s %s %s\n",
llio_board_name, filename, bitfile_board_name);
if(!llio_board_name) {
fprintf(stderr, "LLIO: no boardname, cannot check that bitfile matches\n");
return 1;
}
if(bitfile_board_name && *bitfile_board_name) {
fprintf(stderr, "NOTE: comparing llio board name '%s' with bitfile board name '%s'\n", llio_board_name, bitfile_board_name);
int result = !strncasecmp(llio_board_name, bitfile_board_name, 4);
if(!result)
fprintf(stderr, "Error: wrong bitfile destination card: Detected %s, bitfile ID is %s\n", llio_board_name, bitfile_board_name);
return result;
}
if(filename) {
filename = bitfile_basename(filename);
int result = !strncasecmp(llio_board_name, filename, 4);
if(!result)
fprintf(stderr, "Error: wrong bitfile destination card: Detected %s, filename is %.4s\n", llio_board_name, filename);
return result;
}
}

View file

@ -22,7 +22,8 @@
#include <stdio.h> #include <stdio.h>
#include "types.h" #include "types.h"
int print_bitfile_header(FILE *fp, char *part_name, int verbose_flag); int print_bitfile_header(FILE *fp, char *part_name, char *board_id, int verbose_flag);
int check_board_name(char *llio_board_name, const char *filename, const char *bitfile_board_name);
u8 bitfile_reverse_bits(u8 data); u8 bitfile_reverse_bits(u8 data);
#endif #endif

View file

@ -155,6 +155,7 @@ int eeprom_write(llio_t *self, char *bitfile_name, u32 start_address, int fix_bo
int bytesread, i; int bytesread, i;
u32 eeprom_addr; u32 eeprom_addr;
char part_name[32]; char part_name[32];
char board_name[32];
struct stat file_stat; struct stat file_stat;
FILE *fp; FILE *fp;
struct timeval tv1, tv2; struct timeval tv1, tv2;
@ -169,7 +170,7 @@ int eeprom_write(llio_t *self, char *bitfile_name, u32 start_address, int fix_bo
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return -1; return -1;
} }
if (print_bitfile_header(fp, (char*) &part_name, board->llio.verbose) == -1) { if (print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, board->llio.verbose) == -1) {
fclose(fp); fclose(fp);
return -1; return -1;
} }
@ -181,6 +182,10 @@ int eeprom_write(llio_t *self, char *bitfile_name, u32 start_address, int fix_bo
return -1; return -1;
} }
} }
if (!check_board_name(self->board_name, board_name, bitfile_name)) {
fclose(fp);
return -1;
}
} }
// if board doesn't support fallback there is no boot block // if board doesn't support fallback there is no boot block
if (board->fallback_support == 1) { if (board->fallback_support == 1) {
@ -239,6 +244,7 @@ int eeprom_verify(llio_t *self, char *bitfile_name, u32 start_address) {
int bytesread, i, bindex; int bytesread, i, bindex;
u32 eeprom_addr; u32 eeprom_addr;
char part_name[32]; char part_name[32];
char board_name[32];
struct stat file_stat; struct stat file_stat;
FILE *fp; FILE *fp;
struct timeval tv1, tv2; struct timeval tv1, tv2;
@ -253,7 +259,7 @@ int eeprom_verify(llio_t *self, char *bitfile_name, u32 start_address) {
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return -1; return -1;
} }
if (print_bitfile_header(fp, (char*) &part_name, board->llio.verbose) == -1) { if (print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, board->llio.verbose) == -1) {
fclose(fp); fclose(fp);
return -1; return -1;
} }
@ -264,6 +270,10 @@ int eeprom_verify(llio_t *self, char *bitfile_name, u32 start_address) {
return -1; return -1;
} }
} }
if (!check_board_name(self->board_name, board_name, bitfile_name)) {
fclose(fp);
return -1;
}
// if board doesn't support fallback there is no boot block // if board doesn't support fallback there is no boot block
if (board->fallback_support == 1) { if (board->fallback_support == 1) {
if (check_boot(self) == -1) { if (check_boot(self) == -1) {

View file

@ -192,6 +192,7 @@ static int epp_program_fpga(llio_t *self, char *bitfile_name) {
board_t *board = self->board; board_t *board = self->board;
int bindex, bytesread; int bindex, bytesread;
char part_name[32]; char part_name[32];
char board_name[32];
struct stat file_stat; struct stat file_stat;
FILE *fp; FILE *fp;
@ -204,7 +205,11 @@ static int epp_program_fpga(llio_t *self, char *bitfile_name) {
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return -1; return -1;
} }
if (print_bitfile_header(fp, (char*) &part_name, board->llio.verbose) == -1) { if (print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, board->llio.verbose) == -1) {
fclose(fp);
return -1;
}
if (!check_board_name(self->board_name, board_name, bitfile_name)) {
fclose(fp); fclose(fp);
return -1; return -1;
} }

View file

@ -414,6 +414,7 @@ static int plx9030_program_fpga(llio_t *self, char *bitfile_name) {
int bindex, bytesread; int bindex, bytesread;
u32 status, control; u32 status, control;
char part_name[32]; char part_name[32];
char board_name[32];
struct stat file_stat; struct stat file_stat;
FILE *fp; FILE *fp;
struct timeval tv1, tv2; struct timeval tv1, tv2;
@ -427,10 +428,15 @@ static int plx9030_program_fpga(llio_t *self, char *bitfile_name) {
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return -1; return -1;
} }
if (print_bitfile_header(fp, (char*) &part_name, board->llio.verbose) == -1) { if (print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, board->llio.verbose) == -1) {
fclose(fp); fclose(fp);
return -1; return -1;
} }
if (!check_board_name(self->board_name, board_name, bitfile_name)) {
fclose(fp);
return -1;
}
// set /WRITE low for data transfer, and turn on LED // set /WRITE low for data transfer, and turn on LED
status = inl(board->ctrl_base_addr + PLX9030_CTRL_STAT_OFFSET); status = inl(board->ctrl_base_addr + PLX9030_CTRL_STAT_OFFSET);
control = status & ~PLX9030_WRITE_MASK & ~PLX9030_LED_MASK; control = status & ~PLX9030_WRITE_MASK & ~PLX9030_LED_MASK;
@ -570,6 +576,7 @@ static int plx905x_program_fpga(llio_t *self, char *bitfile_name) {
int bindex, bytesread, i; int bindex, bytesread, i;
u32 status; u32 status;
char part_name[32]; char part_name[32];
char board_name[32];
struct stat file_stat; struct stat file_stat;
FILE *fp; FILE *fp;
struct timeval tv1, tv2; struct timeval tv1, tv2;
@ -583,7 +590,11 @@ static int plx905x_program_fpga(llio_t *self, char *bitfile_name) {
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return -1; return -1;
} }
if (print_bitfile_header(fp, (char*) &part_name, board->llio.verbose) == -1) { if (print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, board->llio.verbose) == -1) {
fclose(fp);
return -1;
}
if (!check_board_name(self->board_name, board_name, bitfile_name)) {
fclose(fp); fclose(fp);
return -1; return -1;
} }

View file

@ -35,7 +35,6 @@
#include "eeprom_local.h" #include "eeprom_local.h"
#include "spi_boards.h" #include "spi_boards.h"
#include "common.h" #include "common.h"
extern board_t boards[MAX_BOARDS]; extern board_t boards[MAX_BOARDS];
extern int boards_count; extern int boards_count;

View file

@ -57,6 +57,7 @@ static int usb_program_fpga(llio_t *self, char *bitfile_name) {
board_t *board = self->board; board_t *board = self->board;
int bindex, bytesread; int bindex, bytesread;
char part_name[32]; char part_name[32];
char board_name[32];
struct stat file_stat; struct stat file_stat;
FILE *fp; FILE *fp;
u8 cmd = '0'; u8 cmd = '0';
@ -70,10 +71,13 @@ static int usb_program_fpga(llio_t *self, char *bitfile_name) {
printf("Can't open file %s: %s\n", bitfile_name, strerror(errno)); printf("Can't open file %s: %s\n", bitfile_name, strerror(errno));
return -1; return -1;
} }
if (print_bitfile_header(fp, (char*) &part_name, board->llio.verbose) == -1) { if (print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, board->llio.verbose) == -1) {
fclose(fp); fclose(fp);
return -1; return -1;
} }
if (!check_board_name(self->board_name, board_name, bitfile_name)) {
return -1;
}
printf("Programming FPGA...\n"); printf("Programming FPGA...\n");
printf(" |"); printf(" |");