WIP: match board with bitfile filename or userid
This commit is contained in:
parent
934769e0cc
commit
676a63d241
8 changed files with 95 additions and 10 deletions
3
anyio.c
3
anyio.c
|
|
@ -334,6 +334,7 @@ void anyio_dev_print_sserial_info(board_t *board) {
|
|||
void anyio_bitfile_print_info(char *bitfile_name, int verbose_flag) {
|
||||
FILE *fp;
|
||||
char part_name[32];
|
||||
char board_name[5];
|
||||
|
||||
if (bitfile_name == NULL) {
|
||||
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));
|
||||
return;
|
||||
}
|
||||
print_bitfile_header(fp, (char*) &part_name, verbose_flag);
|
||||
print_bitfile_header(fp, (char*) &part_name, (char*) &board_name, verbose_flag);
|
||||
fclose(fp);
|
||||
}
|
||||
|
|
|
|||
56
bitfile.c
56
bitfile.c
|
|
@ -22,12 +22,15 @@
|
|||
#include "bitfile.h"
|
||||
|
||||
// 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];
|
||||
int sleng;
|
||||
int bytesread, conflength;
|
||||
int ret = 0;
|
||||
|
||||
if(board_id)
|
||||
strcpy(board_id, "");
|
||||
|
||||
printf("Checking file... ");
|
||||
bytesread = fread(&buff, 1, 14, fp);
|
||||
ret += bytesread;
|
||||
|
|
@ -49,6 +52,20 @@ int print_bitfile_header(FILE *fp, char *part_name, int verbose_flag) {
|
|||
if (verbose_flag == 1) {
|
||||
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);
|
||||
ret += bytesread;
|
||||
|
|
@ -125,3 +142,40 @@ u8 bitfile_reverse_bits(u8 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@
|
|||
#include <stdio.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);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
14
eeprom.c
14
eeprom.c
|
|
@ -155,6 +155,7 @@ int eeprom_write(llio_t *self, char *bitfile_name, u32 start_address, int fix_bo
|
|||
int bytesread, i;
|
||||
u32 eeprom_addr;
|
||||
char part_name[32];
|
||||
char board_name[32];
|
||||
struct stat file_stat;
|
||||
FILE *fp;
|
||||
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));
|
||||
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;
|
||||
}
|
||||
|
|
@ -181,6 +182,10 @@ int eeprom_write(llio_t *self, char *bitfile_name, u32 start_address, int fix_bo
|
|||
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->fallback_support == 1) {
|
||||
|
|
@ -239,6 +244,7 @@ int eeprom_verify(llio_t *self, char *bitfile_name, u32 start_address) {
|
|||
int bytesread, i, bindex;
|
||||
u32 eeprom_addr;
|
||||
char part_name[32];
|
||||
char board_name[32];
|
||||
struct stat file_stat;
|
||||
FILE *fp;
|
||||
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));
|
||||
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;
|
||||
}
|
||||
|
|
@ -264,6 +270,10 @@ int eeprom_verify(llio_t *self, char *bitfile_name, u32 start_address) {
|
|||
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->fallback_support == 1) {
|
||||
if (check_boot(self) == -1) {
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@ static int epp_program_fpga(llio_t *self, char *bitfile_name) {
|
|||
board_t *board = self->board;
|
||||
int bindex, bytesread;
|
||||
char part_name[32];
|
||||
char board_name[32];
|
||||
struct stat file_stat;
|
||||
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));
|
||||
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);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
15
pci_boards.c
15
pci_boards.c
|
|
@ -414,6 +414,7 @@ static int plx9030_program_fpga(llio_t *self, char *bitfile_name) {
|
|||
int bindex, bytesread;
|
||||
u32 status, control;
|
||||
char part_name[32];
|
||||
char board_name[32];
|
||||
struct stat file_stat;
|
||||
FILE *fp;
|
||||
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));
|
||||
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);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// set /WRITE low for data transfer, and turn on LED
|
||||
status = inl(board->ctrl_base_addr + PLX9030_CTRL_STAT_OFFSET);
|
||||
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;
|
||||
u32 status;
|
||||
char part_name[32];
|
||||
char board_name[32];
|
||||
struct stat file_stat;
|
||||
FILE *fp;
|
||||
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));
|
||||
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);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
#include "eeprom_local.h"
|
||||
#include "spi_boards.h"
|
||||
#include "common.h"
|
||||
|
||||
extern board_t boards[MAX_BOARDS];
|
||||
extern int boards_count;
|
||||
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ static int usb_program_fpga(llio_t *self, char *bitfile_name) {
|
|||
board_t *board = self->board;
|
||||
int bindex, bytesread;
|
||||
char part_name[32];
|
||||
char board_name[32];
|
||||
struct stat file_stat;
|
||||
FILE *fp;
|
||||
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));
|
||||
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)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Programming FPGA...\n");
|
||||
printf(" |");
|
||||
|
|
|
|||
Loading…
Reference in a new issue