diff --git a/avr.c b/avr.c index 4ef15439..77bbc96a 100644 --- a/avr.c +++ b/avr.c @@ -60,6 +60,8 @@ AVRPART * avr_new_part(void) p->reset_disposition = RESET_DEDICATED; p->retry_pulse = PIN_AVR_SCK; p->flags = AVRPART_SERIALOK | AVRPART_PARALLELOK; + p->config_file[0] = 0; + p->lineno = 0; p->mem = lcreat(NULL, 0); diff --git a/avrdude.conf.sample b/avrdude.conf.sample index f232bbe2..ceafe60f 100644 --- a/avrdude.conf.sample +++ b/avrdude.conf.sample @@ -174,7 +174,6 @@ # default_parallel = "/dev/ppi0"; default_serial = "/dev/cuaa0"; -default_programmer = "stk500"; # diff --git a/avrpart.h b/avrpart.h index 3bc452e8..b8c01c0b 100644 --- a/avrpart.h +++ b/avrpart.h @@ -22,6 +22,8 @@ #ifndef __avrpart_h__ #define __avrpart_h__ +#include <limits.h> + #include "lists.h" /* @@ -91,6 +93,8 @@ typedef struct avrpart { OPCODE * op[AVR_OP_MAX]; /* opcodes */ LISTID mem; /* avr memory definitions */ + char config_file[PATH_MAX]; /* config file where defined */ + int lineno; /* config file line number */ } AVRPART; #define AVR_MEMDESCLEN 64 diff --git a/config_gram.y b/config_gram.y index ef9471d6..6417892b 100644 --- a/config_gram.y +++ b/config_gram.y @@ -154,7 +154,10 @@ def : prog_def : K_PROGRAMMER - { current_prog = pgm_new(); } + { current_prog = pgm_new(); + strcpy(current_prog->config_file, infile); + current_prog->lineno = lineno; + } prog_parms { if (lsize(current_prog->id) == 0) { @@ -168,7 +171,7 @@ prog_def : progname, infile, lineno); exit(1); } - ladd(programmers, current_prog); + PUSH(programmers, current_prog); current_prog = NULL; } ; @@ -176,7 +179,11 @@ prog_def : part_def : K_PART - { current_part = avr_new_part(); } + { + current_part = avr_new_part(); + strcpy(current_part->config_file, infile); + current_part->lineno = lineno; + } part_parms { LNODEID ln; @@ -226,7 +233,7 @@ part_def : } } - ladd(part_list, current_part); + PUSH(part_list, current_part); current_part = NULL; } ; diff --git a/main.c b/main.c index 173c5ae7..29dea339 100644 --- a/main.c +++ b/main.c @@ -39,6 +39,8 @@ #include <time.h> #include <unistd.h> #include <ctype.h> +#include <sys/types.h> +#include <sys/stat.h> #include "avr.h" #include "config.h" @@ -59,8 +61,6 @@ char progbuf[PATH_MAX]; /* temporary buffer of spaces the same PROGRAMMER * pgm = NULL; -PROGRAMMER * compiled_in_pgm; - /* * global options */ @@ -72,7 +72,7 @@ int do_cycles; /* track erase-rewrite cycles */ */ void usage(void) { - printf( + printf( "Usage: %s [options]\n" "Options:\n" " -p <partno> Required. Specify AVR device.\n" @@ -140,6 +140,7 @@ int read_config(char * file) return -1; } + lineno = 1; infile = file; yyin = f; @@ -155,7 +156,8 @@ int read_config(char * file) void programmer_display(char * p) { - fprintf(stderr, "%sProgrammer Type: %s\n", p, pgm->type); + fprintf(stderr, "%sProgrammer Type : %s\n", p, pgm->type); + fprintf(stderr, "%sDescription : %s\n", p, pgm->desc); pgm->display(pgm, p); } @@ -227,7 +229,23 @@ void list_parts(FILE * f, char * prefix, LISTID parts) for (ln1=lfirst(parts); ln1; ln1=lnext(ln1)) { p = ldata(ln1); - fprintf(f, "%s%-4s = %s\n", prefix, p->id, p->desc); + fprintf(f, "%s%-4s = %-15s [%s:%d]\n", + prefix, p->id, p->desc, p->config_file, p->lineno); + } + + return; +} + +void list_programmers(FILE * f, char * prefix, LISTID programmers) +{ + LNODEID ln1; + PROGRAMMER * p; + + for (ln1=lfirst(programmers); ln1; ln1=lnext(ln1)) { + p = ldata(ln1); + fprintf(f, "%s%-8s = %-30s [%s:%d]\n", + prefix, (char *)ldata(lfirst(p->id)), p->desc, + p->config_file, p->lineno); } return; @@ -252,6 +270,7 @@ int main(int argc, char * argv []) int ppidata; /* cached value of the ppi data register */ int vsize=-1; /* number of bytes to verify */ AVRMEM * sig; /* signature data */ + struct stat sb; /* options / operating mode variables */ char * memtype; /* "flash", "eeprom", etc */ @@ -270,10 +289,12 @@ int main(int argc, char * argv []) char * exitspecs; /* exit specs string from command line */ char * programmer; /* programmer id */ char * partdesc; /* part id */ - char configfile[PATH_MAX]; /* pin configuration file */ + char sys_config[PATH_MAX]; /* system wide config file */ + char usr_config[PATH_MAX]; /* per-user config file */ int cycles; /* erase-rewrite cycles */ int set_cycles; /* value to set the erase-rewrite cycles to */ char * e; /* for strtol() error checking */ + char * homedir; progname = rindex(argv[0],'/'); if (progname) @@ -309,11 +330,21 @@ int main(int argc, char * argv []) do_cycles = 0; set_cycles = -1; - strcpy(configfile, CONFIG_DIR); - i = strlen(configfile); - if (i && (configfile[i-1] != '/')) - strcat(configfile, "/"); - strcat(configfile, "avrdude.conf"); + strcpy(sys_config, CONFIG_DIR); + i = strlen(sys_config); + if (i && (sys_config[i-1] != '/')) + strcat(sys_config, "/"); + strcat(sys_config, "avrdude.conf"); + + usr_config[0] = 0; + homedir = getenv("HOME"); + if (homedir != NULL) { + strcpy(usr_config, homedir); + i = strlen(usr_config); + if (i && (usr_config[i-1] != '/')) + strcat(usr_config, "/"); + strcat(usr_config, ".avrduderc"); + } len = strlen(progname) + 2; for (i=0; i<len; i++) @@ -339,9 +370,9 @@ int main(int argc, char * argv []) programmer = optarg; break; - case 'C': /* pin configuration file */ - strncpy(configfile, optarg, PATH_MAX); - configfile[PATH_MAX-1] = 0; + case 'C': /* system wide configuration file */ + strncpy(sys_config, optarg, PATH_MAX); + sys_config[PATH_MAX-1] = 0; break; case 'm': /* select memory type to operate on */ @@ -481,13 +512,48 @@ int main(int argc, char * argv []) progname, version, progbuf); } - rc = read_config(configfile); + if (verbose) { + fprintf(stderr, "%sSystem wide configuration file is \"%s\"\n", + progbuf, sys_config); + } + + rc = read_config(sys_config); if (rc) { - fprintf(stderr, "%s: error reading configuration file \"%s\"\n", - progname, configfile); + fprintf(stderr, + "%s: error reading system wide configuration file \"%s\"\n", + progname, sys_config); exit(1); } + if (usr_config[0] != 0) { + if (verbose) { + fprintf(stderr, "%sUser configuration file is \"%s\"\n", + progbuf, usr_config); + } + + rc = stat(usr_config, &sb); + if ((rc < 0) || ((sb.st_mode & S_IFREG) == 0)) { + if (verbose) { + fprintf(stderr, + "%sUser configuration file does not exist or is not a " + "regular file, skipping\n", + progbuf); + } + } + else { + rc = read_config(usr_config); + if (rc) { + fprintf(stderr, "%s: error reading user configuration file \"%s\"\n", + progname, usr_config); + exit(1); + } + } + } + + if (verbose) { + fprintf(stderr, "\n"); + } + if (programmer[0] == 0) { fprintf(stderr, "\n%s: no programmer has been specified on the command line " @@ -501,9 +567,12 @@ int main(int argc, char * argv []) pgm = locate_programmer(programmers, programmer); if (pgm == NULL) { + fprintf(stderr,"\n"); fprintf(stderr, "%s: Can't find programmer id \"%s\"\n", progname, programmer); + fprintf(stderr,"\nValid programmers are:\n"); + list_programmers(stderr, " ", programmers); fprintf(stderr,"\n"); exit(1); } @@ -516,12 +585,10 @@ int main(int argc, char * argv []) if (partdesc == NULL) { fprintf(stderr, - "%s: No AVR part has been specified, use \"-p Part\"\n\n" - " Valid Parts are:\n\n", + "%s: No AVR part has been specified, use \"-p Part\"\n\n", progname); - list_parts(stderr, " ", part_list); - fprintf(stderr, "\n"); - fprintf(stderr, "(These come from the config file \"%s\")\n", configfile); + fprintf(stderr,"Valid parts are:\n"); + list_parts(stderr, " ", part_list); fprintf(stderr, "\n"); exit(1); } @@ -530,11 +597,10 @@ int main(int argc, char * argv []) p = locate_part(part_list, partdesc); if (p == NULL) { fprintf(stderr, - "%s: AVR Part \"%s\" not found. Valid parts are:\n\n", + "%s: AVR Part \"%s\" not found.\n\n", progname, partdesc); - list_parts(stderr, " ", part_list); - fprintf(stderr, "\n"); - fprintf(stderr, "(These come from the config file \"%s\")\n", configfile); + fprintf(stderr,"Valid parts are:\n"); + list_parts(stderr, " ", part_list); fprintf(stderr, "\n"); exit(1); } diff --git a/par.c b/par.c index f28fbb27..85807236 100644 --- a/par.c +++ b/par.c @@ -553,10 +553,6 @@ static void par_display(PROGRAMMER * pgm, char * p) strcpy(buffpins, " (not used)"); } - - fprintf(stderr, "%sProgrammer Pin Configuration: %s (%s)\n", p, - (char *)ldata(lfirst(pgm->id)), pgm->desc); - fprintf(stderr, "%s VCC = 0x%02x%s\n" "%s BUFF = 0x%02x%s\n" diff --git a/pgm.c b/pgm.c index 21ab9bb1..b65da69e 100644 --- a/pgm.c +++ b/pgm.c @@ -55,6 +55,8 @@ PROGRAMMER * pgm_new(void) pgm->id = lcreat(NULL, 0); pgm->desc[0] = 0; pgm->type[0] = 0; + pgm->config_file[0] = 0; + pgm->lineno = 0; for (i=0; i<N_PINS; i++) pgm->pinno[i] = 0; diff --git a/pgm.h b/pgm.h index ea47f5e3..5dcde7be 100644 --- a/pgm.h +++ b/pgm.h @@ -66,6 +66,8 @@ typedef struct programmer_t { int page_size, int n_bytes); int (*paged_load) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m, int page_size, int n_bytes); + char config_file[PATH_MAX]; /* config file where defined */ + int lineno; /* config file line number */ } PROGRAMMER;