in common/recipes-utils/jbi/files/code/jbistub.c [1136:1720]
int main(int argc, char **argv)
{
BOOL help = FALSE;
BOOL error = FALSE;
char *filename = NULL;
long offset = 0L;
long error_address = 0L;
JBI_RETURN_TYPE crc_result = JBIC_SUCCESS;
JBI_RETURN_TYPE exec_result = JBIC_SUCCESS;
unsigned short expected_crc = 0;
unsigned short actual_crc = 0;
char key[33] = {0};
char value[257] = {0};
int exit_status = 0;
int arg = 0;
int exit_code = 0;
int format_version = 0;
time_t start_time = 0;
time_t end_time = 0;
int time_delta = 0;
char *workspace = NULL;
char *action = NULL;
char *init_list[10];
int init_count = 0;
FILE *fp = NULL;
struct stat sbuf;
long workspace_size = 0;
char *exit_string = NULL;
int reset_jtag = 1;
int execute_program = 1;
int action_count = 0;
int procedure_count = 0;
int index = 0;
char *action_name = NULL;
char *description = NULL;
JBI_PROCINFO *procedure_list = NULL;
JBI_PROCINFO *procptr = NULL;
char *endptr;
verbose = FALSE;
init_list[0] = NULL;
/* print out the version string and copyright message */
fprintf(stderr, "Jam STAPL ByteCode Player Version 2.2\nCopyright (C) 1998-2001 Altera Corporation\n\n");
for (arg = 1; arg < argc; arg++)
{
#if PORT == UNIX
if (argv[arg][0] == '-')
#else
if ((argv[arg][0] == '-') || (argv[arg][0] == '/'))
#endif
{
switch(toupper(argv[arg][1]))
{
case 'A': /* set action name */
if (action == NULL)
{
action = &argv[arg][2];
}
else
{
error = TRUE;
}
break;
#if PORT == WINDOWS || PORT == DOS
case 'C': /* Use alternative ISP download cable */
if(toupper(argv[arg][2]) == 'L')
alternative_cable_l = TRUE;
else if(toupper(argv[arg][2]) == 'X')
alternative_cable_x = TRUE;
break;
#endif
case 'D': /* initialization list */
if (argv[arg][2] == '"')
{
init_list[init_count] = &argv[arg][3];
}
else
{
init_list[init_count] = &argv[arg][2];
}
init_list[++init_count] = NULL;
break;
#if PORT == WINDOWS || PORT == DOS
case 'P': /* set LPT port address */
specified_lpt_port = TRUE;
if (sscanf(&argv[arg][2], "%d", &lpt_port) != 1) error = TRUE;
if ((lpt_port < 1) || (lpt_port > 3)) error = TRUE;
if (error)
{
if (sscanf(&argv[arg][2], "%x", &lpt_port) == 1)
{
if ((lpt_port == 0x3bc) ||
(lpt_port == 0x378) ||
(lpt_port == 0x278))
{
error = FALSE;
specified_lpt_addr = TRUE;
lpt_addr = (WORD) lpt_port;
lpt_port = 1;
}
}
}
break;
#endif
case 'R': /* don't reset the JTAG chain after use */
reset_jtag = 0;
break;
#ifdef OPENBMC
case 'G': /* GPIO directory */
switch (toupper(argv[arg][2])) {
case 'C':
g_tck_offset = strtol(&argv[arg][3], &endptr, 0);
if (endptr == &argv[arg][3])
g_tck_shadow = &argv[arg][3];
break;
case 'S':
g_tms_offset = strtol(&argv[arg][3], &endptr, 0);
if (endptr == &argv[arg][3])
g_tms_shadow = &argv[arg][3];
break;
case 'I':
g_tdi_offset = strtol(&argv[arg][3], &endptr, 0);
if (endptr == &argv[arg][3])
g_tdi_shadow = &argv[arg][3];
break;
case 'O':
g_tdo_offset = strtol(&argv[arg][3], &endptr, 0);
if (endptr == &argv[arg][3])
g_tdo_shadow = &argv[arg][3];
break;
}
jtag_io_func = jbi_jtag_gpio;
break;
case 'W': /* use software mode to control jtag pins */
g_swio = 1;
jtag_io_func = jbi_jtag_swio;
break;
#else
case 'S': /* set serial port address */
serial_port_name = &argv[arg][2];
specified_com_port = TRUE;
break;
#endif
case 'M': /* set memory size */
if (sscanf(&argv[arg][2], "%ld", &workspace_size) != 1)
error = TRUE;
if (workspace_size == 0) error = TRUE;
break;
case 'H': /* help */
help = TRUE;
break;
case 'V': /* verbose */
verbose = TRUE;
break;
case 'I': /* show info only, do not execute */
verbose = TRUE;
execute_program = 0;
break;
default:
error = TRUE;
break;
}
}
else
{
/* it's a filename */
if (filename == NULL)
{
filename = argv[arg];
}
else
{
/* error -- we already found a filename */
error = TRUE;
}
}
if (error)
{
fprintf(stderr, "Illegal argument: \"%s\"\n", argv[arg]);
help = TRUE;
error = FALSE;
}
}
#if PORT == WINDOWS || PORT == DOS
if (specified_lpt_port && specified_com_port)
{
fprintf(stderr, "Error: -s and -p options may not be used together\n\n");
help = TRUE;
}
#endif
#ifdef OPENBMC
if (execute_program) {
int pins = 0;
if (g_tck_shadow != NULL || g_tck_offset >= 0)
pins++;
if (g_tms_shadow != NULL || g_tms_offset >= 0)
pins++;
if (g_tdi_shadow != NULL || g_tdi_offset >= 0)
pins++;
if (g_tdo_shadow != NULL || g_tdo_offset >= 0)
pins++;
if (!g_swio && (pins < 4)) {
fprintf(stderr, "Error: -gc, -gs, -gi, and -go must be specified\n");
help = TRUE;
}
}
#endif
if (help || (filename == NULL))
{
fprintf(stderr, "Usage: jbi [options] <filename>\n");
fprintf(stderr, "\nAvailable options:\n");
fprintf(stderr, " -h : show help message\n");
fprintf(stderr, " -v : show verbose messages\n");
fprintf(stderr, " -i : show file info only - does not execute any action\n");
fprintf(stderr, " -a<action> : specify an action name (Jam STAPL)\n");
fprintf(stderr, " -d<var=val> : initialize variable to specified value (Jam 1.1)\n");
fprintf(stderr, " -d<proc=1> : enable optional procedure (Jam STAPL)\n");
fprintf(stderr, " -d<proc=0> : disable recommended procedure (Jam STAPL)\n");
#if PORT == WINDOWS || PORT == DOS
fprintf(stderr, " -p<port> : parallel port number or address (for ByteBlaster)\n");
fprintf(stderr, " -c<cable> : alternative download cable compatibility: -cl or -cx\n");
#endif
#ifdef OPENBMC
fprintf(stderr, " -gc<clock> : GPIO directory for TCK\n");
fprintf(stderr, " -gs<clock> : GPIO directory for TMS\n");
fprintf(stderr, " -gi<clock> : GPIO directory for TDI\n");
fprintf(stderr, " -go<clock> : GPIO directory for TDO\n");
#else
fprintf(stderr, " -s<port> : serial port name (for BitBlaster)\n");
#endif
fprintf(stderr, " -r : don't reset JTAG TAP after use\n");
exit_status = 1;
}
else if ((workspace_size > 0) &&
((workspace = (char *) jbi_malloc((size_t) workspace_size)) == NULL))
{
fprintf(stderr, "Error: can't allocate memory (%d Kbytes)\n",
(int) (workspace_size / 1024L));
exit_status = 1;
}
else if (access(filename, 0) != 0)
{
fprintf(stderr, "Error: can't access file \"%s\"\n", filename);
exit_status = 1;
}
else
{
/* get length of file */
if (stat(filename, &sbuf) == 0) file_length = sbuf.st_size;
if ((fp = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "Error: can't open file \"%s\"\n", filename);
exit_status = 1;
}
else
{
/*
* Read entire file into a buffer
*/
#if PORT == DOS
int pages = 1 + (int) (file_length >> 14L);
int page;
file_buffer = (unsigned char **) jbi_malloc(
(size_t) (pages * sizeof(char *)));
for (page = 0; page < pages; ++page)
{
/* allocate enough 16K blocks to store the file */
file_buffer[page] = (unsigned char *) jbi_malloc (0x4000);
if (file_buffer[page] == NULL)
{
/* flag error and break out of loop */
file_buffer = NULL;
page = pages;
}
}
#else
file_buffer = (unsigned char *) jbi_malloc((size_t) file_length);
#endif
if (file_buffer == NULL)
{
fprintf(stderr, "Error: can't allocate memory (%d Kbytes)\n",
(int) (file_length / 1024L));
exit_status = 1;
}
else
{
#if PORT == DOS
int pages = 1 + (int) (file_length >> 14L);
int page;
size_t page_size = 0x4000;
for (page = 0; (page < pages) && (exit_status == 0); ++page)
{
if (page == (pages - 1))
{
/* last page may not be full 16K bytes */
page_size = (size_t) (file_length & 0x3fffL);
}
if (fread(file_buffer[page], 1, page_size, fp) != page_size)
{
fprintf(stderr, "Error reading file \"%s\"\n", filename);
exit_status = 1;
}
}
#else
if (fread(file_buffer, 1, (size_t) file_length, fp) !=
(size_t) file_length)
{
fprintf(stderr, "Error reading file \"%s\"\n", filename);
exit_status = 1;
}
#endif
}
fclose(fp);
}
if (exit_status == 0)
{
/*
* Get Operating System type
*/
#if PORT == WINDOWS
windows_nt = !(GetVersion() & 0x80000000);
#endif
/*
* Calibrate the delay loop function
*/
calibrate_delay();
/*
* Check CRC
*/
crc_result = jbi_check_crc(file_buffer, file_length,
&expected_crc, &actual_crc);
if (verbose || (crc_result == JBIC_CRC_ERROR))
{
switch (crc_result)
{
case JBIC_SUCCESS:
printf("CRC matched: CRC value = %04X\n", actual_crc);
break;
case JBIC_CRC_ERROR:
printf("CRC mismatch: expected %04X, actual %04X\n",
expected_crc, actual_crc);
break;
case JBIC_UNEXPECTED_END:
printf("Expected CRC not found, actual CRC value = %04X\n",
actual_crc);
break;
case JBIC_IO_ERROR:
printf("Error: File format is not recognized.\n");
exit(1);
break;
default:
printf("CRC function returned error code %d\n", crc_result);
break;
}
}
if (verbose)
{
/*
* Display file format version
*/
jbi_get_file_info(file_buffer, file_length,
&format_version, &action_count, &procedure_count);
printf("File format is %s ByteCode format\n",
(format_version == 2) ? "Jam STAPL" : "pre-standardized Jam 1.1");
/*
* Dump out NOTE fields
*/
while (jbi_get_note(file_buffer, file_length,
&offset, key, value, 256) == 0)
{
printf("NOTE \"%s\" = \"%s\"\n", key, value);
}
/*
* Dump the action table
*/
if ((format_version == 2) && (action_count > 0))
{
printf("\nActions available in this file:\n");
for (index = 0; index < action_count; ++index)
{
jbi_get_action_info(file_buffer, file_length,
index, &action_name, &description, &procedure_list);
if (description == NULL)
{
printf("%s\n", action_name);
}
else
{
printf("%s \"%s\"\n", action_name, description);
}
#if PORT == DOS
if (action_name != NULL) jbi_free(action_name);
if (description != NULL) jbi_free(description);
#endif
procptr = procedure_list;
while (procptr != NULL)
{
if (procptr->attributes != 0)
{
printf(" %s (%s)\n", procptr->name,
(procptr->attributes == 1) ?
"optional" : "recommended");
}
#if PORT == DOS
if (procptr->name != NULL) jbi_free(procptr->name);
#endif
procedure_list = procptr->next;
jbi_free(procptr);
procptr = procedure_list;
}
}
/* add a blank line before execution messages */
if (execute_program) printf("\n");
}
}
if (execute_program)
{
/*
* Execute the Jam STAPL ByteCode program
*/
time(&start_time);
exec_result = jbi_execute(file_buffer, file_length, workspace,
workspace_size, action, init_list, reset_jtag,
&error_address, &exit_code, &format_version);
time(&end_time);
if (exec_result == JBIC_SUCCESS)
{
if (format_version == 2)
{
switch (exit_code)
{
case 0: exit_string = "Success"; break;
case 1: exit_string = "Checking chain failure"; break;
case 2: exit_string = "Reading IDCODE failure"; break;
case 3: exit_string = "Reading USERCODE failure"; break;
case 4: exit_string = "Reading UESCODE failure"; break;
case 5: exit_string = "Entering ISP failure"; break;
case 6: exit_string = "Unrecognized device"; break;
case 7: exit_string = "Device revision is not supported"; break;
case 8: exit_string = "Erase failure"; break;
case 9: exit_string = "Device is not blank"; break;
case 10: exit_string = "Device programming failure"; break;
case 11: exit_string = "Device verify failure"; break;
case 12: exit_string = "Read failure"; break;
case 13: exit_string = "Calculating checksum failure"; break;
case 14: exit_string = "Setting security bit failure"; break;
case 15: exit_string = "Querying security bit failure"; break;
case 16: exit_string = "Exiting ISP failure"; break;
case 17: exit_string = "Performing system test failure"; break;
default: exit_string = "Unknown exit code"; break;
}
}
else
{
switch (exit_code)
{
case 0: exit_string = "Success"; break;
case 1: exit_string = "Illegal initialization values"; break;
case 2: exit_string = "Unrecognized device"; break;
case 3: exit_string = "Device revision is not supported"; break;
case 4: exit_string = "Device programming failure"; break;
case 5: exit_string = "Device is not blank"; break;
case 6: exit_string = "Device verify failure"; break;
case 7: exit_string = "SRAM configuration failure"; break;
default: exit_string = "Unknown exit code"; break;
}
}
printf("Exit code = %d... %s\n", exit_code, exit_string);
}
else if ((format_version == 2) &&
(exec_result == JBIC_ACTION_NOT_FOUND))
{
if ((action == NULL) || (*action == '\0'))
{
printf("Error: no action specified for Jam STAPL file.\nProgram terminated.\n");
}
else
{
printf("Error: action \"%s\" is not supported for this Jam STAPL file.\nProgram terminated.\n", action);
}
}
else if (exec_result < MAX_ERROR_CODE)
{
printf("Error at address %ld: %s.\nProgram terminated.\n",
error_address, error_text[exec_result]);
}
else
{
printf("Unknown error code %ld\n", exec_result);
}
/*
* Print out elapsed time
*/
if (verbose)
{
time_delta = (int) (end_time - start_time);
printf("Elapsed time = %02u:%02u:%02u\n",
time_delta / 3600, /* hours */
(time_delta % 3600) / 60, /* minutes */
time_delta % 60); /* seconds */
}
}
}
}
if (jtag_hardware_initialized) close_jtag_hardware();
if (workspace != NULL) jbi_free(workspace);
if (file_buffer != NULL) jbi_free(file_buffer);
#if defined(MEM_TRACKER)
if (verbose)
{
#if defined(USE_STATIC_MEMORY)
fprintf(stdout, "Memory Usage Info: static memory size = %ud (%dKB)\n", N_STATIC_MEMORY_BYTES, N_STATIC_MEMORY_KBYTES);
#endif /* USE_STATIC_MEMORY */
fprintf(stdout, "Memory Usage Info: peak memory usage = %ud (%dKB)\n", peak_memory_usage, (peak_memory_usage + 1023) / 1024);
fprintf(stdout, "Memory Usage Info: peak allocations = %d\n", peak_allocations);
#if defined(USE_STATIC_MEMORY)
if ((n_bytes_allocated - n_bytes_not_recovered) != 0)
{
fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", (n_bytes_allocated - n_bytes_not_recovered), ((n_bytes_allocated - n_bytes_not_recovered) + 1023) / 1024);
}
#else /* USE_STATIC_MEMORY */
if (n_bytes_allocated != 0)
{
fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", n_bytes_allocated, (n_bytes_allocated + 1023) / 1024);
}
#endif /* USE_STATIC_MEMORY */
if (n_allocations != 0)
{
fprintf(stdout, "Memory Usage Info: allocations not freed = %d\n", n_allocations);
}
}
#endif /* MEM_TRACKER */
return (exit_status);
}