Add the ability to read a per-user config file located at
$HOME/.avrduderc. Entries from .avrduderc take precedence over those from the system wide config file in ${PREFIX}/etc/avrdude.conf. Track and display the config file name and line number when we print out the available parts and programmers. This is useful in case someone has overridden a definition in their .avrduderc file and is wondering why the definition in the system wide config file is not being used. Remove the default programmer 'stk500' from the distributed config file. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@222 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
2c3d88da51
commit
66d2a710db
2
avr.c
2
avr.c
|
@ -60,6 +60,8 @@ AVRPART * avr_new_part(void)
|
||||||
p->reset_disposition = RESET_DEDICATED;
|
p->reset_disposition = RESET_DEDICATED;
|
||||||
p->retry_pulse = PIN_AVR_SCK;
|
p->retry_pulse = PIN_AVR_SCK;
|
||||||
p->flags = AVRPART_SERIALOK | AVRPART_PARALLELOK;
|
p->flags = AVRPART_SERIALOK | AVRPART_PARALLELOK;
|
||||||
|
p->config_file[0] = 0;
|
||||||
|
p->lineno = 0;
|
||||||
|
|
||||||
p->mem = lcreat(NULL, 0);
|
p->mem = lcreat(NULL, 0);
|
||||||
|
|
||||||
|
|
|
@ -174,7 +174,6 @@
|
||||||
#
|
#
|
||||||
default_parallel = "/dev/ppi0";
|
default_parallel = "/dev/ppi0";
|
||||||
default_serial = "/dev/cuaa0";
|
default_serial = "/dev/cuaa0";
|
||||||
default_programmer = "stk500";
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#ifndef __avrpart_h__
|
#ifndef __avrpart_h__
|
||||||
#define __avrpart_h__
|
#define __avrpart_h__
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -91,6 +93,8 @@ typedef struct avrpart {
|
||||||
OPCODE * op[AVR_OP_MAX]; /* opcodes */
|
OPCODE * op[AVR_OP_MAX]; /* opcodes */
|
||||||
|
|
||||||
LISTID mem; /* avr memory definitions */
|
LISTID mem; /* avr memory definitions */
|
||||||
|
char config_file[PATH_MAX]; /* config file where defined */
|
||||||
|
int lineno; /* config file line number */
|
||||||
} AVRPART;
|
} AVRPART;
|
||||||
|
|
||||||
#define AVR_MEMDESCLEN 64
|
#define AVR_MEMDESCLEN 64
|
||||||
|
|
|
@ -154,7 +154,10 @@ def :
|
||||||
|
|
||||||
prog_def :
|
prog_def :
|
||||||
K_PROGRAMMER
|
K_PROGRAMMER
|
||||||
{ current_prog = pgm_new(); }
|
{ current_prog = pgm_new();
|
||||||
|
strcpy(current_prog->config_file, infile);
|
||||||
|
current_prog->lineno = lineno;
|
||||||
|
}
|
||||||
prog_parms
|
prog_parms
|
||||||
{
|
{
|
||||||
if (lsize(current_prog->id) == 0) {
|
if (lsize(current_prog->id) == 0) {
|
||||||
|
@ -168,7 +171,7 @@ prog_def :
|
||||||
progname, infile, lineno);
|
progname, infile, lineno);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
ladd(programmers, current_prog);
|
PUSH(programmers, current_prog);
|
||||||
current_prog = NULL;
|
current_prog = NULL;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -176,7 +179,11 @@ prog_def :
|
||||||
|
|
||||||
part_def :
|
part_def :
|
||||||
K_PART
|
K_PART
|
||||||
{ current_part = avr_new_part(); }
|
{
|
||||||
|
current_part = avr_new_part();
|
||||||
|
strcpy(current_part->config_file, infile);
|
||||||
|
current_part->lineno = lineno;
|
||||||
|
}
|
||||||
part_parms
|
part_parms
|
||||||
{
|
{
|
||||||
LNODEID ln;
|
LNODEID ln;
|
||||||
|
@ -226,7 +233,7 @@ part_def :
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ladd(part_list, current_part);
|
PUSH(part_list, current_part);
|
||||||
current_part = NULL;
|
current_part = NULL;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
118
main.c
118
main.c
|
@ -39,6 +39,8 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "avr.h"
|
#include "avr.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -59,8 +61,6 @@ char progbuf[PATH_MAX]; /* temporary buffer of spaces the same
|
||||||
|
|
||||||
PROGRAMMER * pgm = NULL;
|
PROGRAMMER * pgm = NULL;
|
||||||
|
|
||||||
PROGRAMMER * compiled_in_pgm;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* global options
|
* global options
|
||||||
*/
|
*/
|
||||||
|
@ -72,7 +72,7 @@ int do_cycles; /* track erase-rewrite cycles */
|
||||||
*/
|
*/
|
||||||
void usage(void)
|
void usage(void)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"Usage: %s [options]\n"
|
"Usage: %s [options]\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -p <partno> Required. Specify AVR device.\n"
|
" -p <partno> Required. Specify AVR device.\n"
|
||||||
|
@ -140,6 +140,7 @@ int read_config(char * file)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lineno = 1;
|
||||||
infile = file;
|
infile = file;
|
||||||
yyin = f;
|
yyin = f;
|
||||||
|
|
||||||
|
@ -155,7 +156,8 @@ int read_config(char * file)
|
||||||
|
|
||||||
void programmer_display(char * p)
|
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);
|
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)) {
|
for (ln1=lfirst(parts); ln1; ln1=lnext(ln1)) {
|
||||||
p = ldata(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;
|
return;
|
||||||
|
@ -252,6 +270,7 @@ int main(int argc, char * argv [])
|
||||||
int ppidata; /* cached value of the ppi data register */
|
int ppidata; /* cached value of the ppi data register */
|
||||||
int vsize=-1; /* number of bytes to verify */
|
int vsize=-1; /* number of bytes to verify */
|
||||||
AVRMEM * sig; /* signature data */
|
AVRMEM * sig; /* signature data */
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
/* options / operating mode variables */
|
/* options / operating mode variables */
|
||||||
char * memtype; /* "flash", "eeprom", etc */
|
char * memtype; /* "flash", "eeprom", etc */
|
||||||
|
@ -270,10 +289,12 @@ int main(int argc, char * argv [])
|
||||||
char * exitspecs; /* exit specs string from command line */
|
char * exitspecs; /* exit specs string from command line */
|
||||||
char * programmer; /* programmer id */
|
char * programmer; /* programmer id */
|
||||||
char * partdesc; /* part 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 cycles; /* erase-rewrite cycles */
|
||||||
int set_cycles; /* value to set the erase-rewrite cycles to */
|
int set_cycles; /* value to set the erase-rewrite cycles to */
|
||||||
char * e; /* for strtol() error checking */
|
char * e; /* for strtol() error checking */
|
||||||
|
char * homedir;
|
||||||
|
|
||||||
progname = rindex(argv[0],'/');
|
progname = rindex(argv[0],'/');
|
||||||
if (progname)
|
if (progname)
|
||||||
|
@ -309,11 +330,21 @@ int main(int argc, char * argv [])
|
||||||
do_cycles = 0;
|
do_cycles = 0;
|
||||||
set_cycles = -1;
|
set_cycles = -1;
|
||||||
|
|
||||||
strcpy(configfile, CONFIG_DIR);
|
strcpy(sys_config, CONFIG_DIR);
|
||||||
i = strlen(configfile);
|
i = strlen(sys_config);
|
||||||
if (i && (configfile[i-1] != '/'))
|
if (i && (sys_config[i-1] != '/'))
|
||||||
strcat(configfile, "/");
|
strcat(sys_config, "/");
|
||||||
strcat(configfile, "avrdude.conf");
|
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;
|
len = strlen(progname) + 2;
|
||||||
for (i=0; i<len; i++)
|
for (i=0; i<len; i++)
|
||||||
|
@ -339,9 +370,9 @@ int main(int argc, char * argv [])
|
||||||
programmer = optarg;
|
programmer = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'C': /* pin configuration file */
|
case 'C': /* system wide configuration file */
|
||||||
strncpy(configfile, optarg, PATH_MAX);
|
strncpy(sys_config, optarg, PATH_MAX);
|
||||||
configfile[PATH_MAX-1] = 0;
|
sys_config[PATH_MAX-1] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'm': /* select memory type to operate on */
|
case 'm': /* select memory type to operate on */
|
||||||
|
@ -481,13 +512,48 @@ int main(int argc, char * argv [])
|
||||||
progname, version, progbuf);
|
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) {
|
if (rc) {
|
||||||
fprintf(stderr, "%s: error reading configuration file \"%s\"\n",
|
fprintf(stderr,
|
||||||
progname, configfile);
|
"%s: error reading system wide configuration file \"%s\"\n",
|
||||||
|
progname, sys_config);
|
||||||
exit(1);
|
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) {
|
if (programmer[0] == 0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\n%s: no programmer has been specified on the command line "
|
"\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);
|
pgm = locate_programmer(programmers, programmer);
|
||||||
if (pgm == NULL) {
|
if (pgm == NULL) {
|
||||||
|
fprintf(stderr,"\n");
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s: Can't find programmer id \"%s\"\n",
|
"%s: Can't find programmer id \"%s\"\n",
|
||||||
progname, programmer);
|
progname, programmer);
|
||||||
|
fprintf(stderr,"\nValid programmers are:\n");
|
||||||
|
list_programmers(stderr, " ", programmers);
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -516,12 +585,10 @@ int main(int argc, char * argv [])
|
||||||
|
|
||||||
if (partdesc == NULL) {
|
if (partdesc == NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s: No AVR part has been specified, use \"-p Part\"\n\n"
|
"%s: No AVR part has been specified, use \"-p Part\"\n\n",
|
||||||
" Valid Parts are:\n\n",
|
|
||||||
progname);
|
progname);
|
||||||
list_parts(stderr, " ", part_list);
|
fprintf(stderr,"Valid parts are:\n");
|
||||||
fprintf(stderr, "\n");
|
list_parts(stderr, " ", part_list);
|
||||||
fprintf(stderr, "(These come from the config file \"%s\")\n", configfile);
|
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -530,11 +597,10 @@ int main(int argc, char * argv [])
|
||||||
p = locate_part(part_list, partdesc);
|
p = locate_part(part_list, partdesc);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s: AVR Part \"%s\" not found. Valid parts are:\n\n",
|
"%s: AVR Part \"%s\" not found.\n\n",
|
||||||
progname, partdesc);
|
progname, partdesc);
|
||||||
list_parts(stderr, " ", part_list);
|
fprintf(stderr,"Valid parts are:\n");
|
||||||
fprintf(stderr, "\n");
|
list_parts(stderr, " ", part_list);
|
||||||
fprintf(stderr, "(These come from the config file \"%s\")\n", configfile);
|
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
4
par.c
4
par.c
|
@ -553,10 +553,6 @@ static void par_display(PROGRAMMER * pgm, char * p)
|
||||||
strcpy(buffpins, " (not used)");
|
strcpy(buffpins, " (not used)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fprintf(stderr, "%sProgrammer Pin Configuration: %s (%s)\n", p,
|
|
||||||
(char *)ldata(lfirst(pgm->id)), pgm->desc);
|
|
||||||
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s VCC = 0x%02x%s\n"
|
"%s VCC = 0x%02x%s\n"
|
||||||
"%s BUFF = 0x%02x%s\n"
|
"%s BUFF = 0x%02x%s\n"
|
||||||
|
|
2
pgm.c
2
pgm.c
|
@ -55,6 +55,8 @@ PROGRAMMER * pgm_new(void)
|
||||||
pgm->id = lcreat(NULL, 0);
|
pgm->id = lcreat(NULL, 0);
|
||||||
pgm->desc[0] = 0;
|
pgm->desc[0] = 0;
|
||||||
pgm->type[0] = 0;
|
pgm->type[0] = 0;
|
||||||
|
pgm->config_file[0] = 0;
|
||||||
|
pgm->lineno = 0;
|
||||||
|
|
||||||
for (i=0; i<N_PINS; i++)
|
for (i=0; i<N_PINS; i++)
|
||||||
pgm->pinno[i] = 0;
|
pgm->pinno[i] = 0;
|
||||||
|
|
2
pgm.h
2
pgm.h
|
@ -66,6 +66,8 @@ typedef struct programmer_t {
|
||||||
int page_size, int n_bytes);
|
int page_size, int n_bytes);
|
||||||
int (*paged_load) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
int (*paged_load) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
|
||||||
int page_size, int n_bytes);
|
int page_size, int n_bytes);
|
||||||
|
char config_file[PATH_MAX]; /* config file where defined */
|
||||||
|
int lineno; /* config file line number */
|
||||||
} PROGRAMMER;
|
} PROGRAMMER;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue