Rework the exit specs so they actually work again. It should be
possible to extend them for other programmers than PPI now (serbb, stk500*). * pgm.h: Keep the exit specs in an abstract form inside struct programmer_t. (Should be moved out into some programmer-specific structure.) Rename the getexitspecs() method into parseexitspecs(). * main.c: Move the exit specs stuff out to the programmer implementation. * par.c: Implement the new exit spec handling. Everything is now done using the generic abstraction layer. Closes bug #16443: No disable Resetsignal at the end of Programming Session Obviates need for patch #5057: quick and dirty Hack to unset Reset after Programming git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@629 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
e97524fa3b
commit
fb795d21f9
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
||||||
|
2006-08-30 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
|
Rework the exit specs so they actually work again. It should be
|
||||||
|
possible to extend them for other programmers than PPI now (serbb,
|
||||||
|
stk500*).
|
||||||
|
* pgm.h: Keep the exit specs in an abstract form inside struct
|
||||||
|
programmer_t. (Should be moved out into some programmer-specific
|
||||||
|
structure.) Rename the getexitspecs() method into
|
||||||
|
parseexitspecs().
|
||||||
|
* main.c: Move the exit specs stuff out to the programmer
|
||||||
|
implementation.
|
||||||
|
* par.c: Implement the new exit spec handling. Everything is now
|
||||||
|
done using the generic abstraction layer.
|
||||||
|
Closes bug #16443: No disable Resetsignal at the end of
|
||||||
|
Programming Session
|
||||||
|
Obviates need for patch #5057: quick and dirty Hack to unset Reset
|
||||||
|
after Programming
|
||||||
|
|
||||||
2006-08-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
2006-08-29 Joerg Wunsch <j@uriah.heep.sax.de>
|
||||||
|
|
||||||
This patch has been contributed by an anonymous developer
|
This patch has been contributed by an anonymous developer
|
||||||
|
|
16
main.c
16
main.c
|
@ -673,8 +673,6 @@ int main(int argc, char * argv [])
|
||||||
int terminal; /* 1=enter terminal mode, 0=don't */
|
int terminal; /* 1=enter terminal mode, 0=don't */
|
||||||
int nowrite; /* don't actually write anything to the chip */
|
int nowrite; /* don't actually write anything to the chip */
|
||||||
int verify; /* perform a verify operation */
|
int verify; /* perform a verify operation */
|
||||||
int ppisetbits; /* bits to set in ppi data register at exit */
|
|
||||||
int ppiclrbits; /* bits to clear in ppi data register at exit */
|
|
||||||
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 */
|
||||||
|
@ -733,8 +731,6 @@ int main(int argc, char * argv [])
|
||||||
nowrite = 0;
|
nowrite = 0;
|
||||||
verify = 1; /* on by default */
|
verify = 1; /* on by default */
|
||||||
quell_progress = 0;
|
quell_progress = 0;
|
||||||
ppisetbits = 0;
|
|
||||||
ppiclrbits = 0;
|
|
||||||
exitspecs = NULL;
|
exitspecs = NULL;
|
||||||
pgm = NULL;
|
pgm = NULL;
|
||||||
programmer = default_programmer;
|
programmer = default_programmer;
|
||||||
|
@ -1074,13 +1070,13 @@ int main(int argc, char * argv [])
|
||||||
|
|
||||||
|
|
||||||
if (exitspecs != NULL) {
|
if (exitspecs != NULL) {
|
||||||
if (pgm->getexitspecs == NULL) {
|
if (pgm->parseexitspecs == NULL) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s: WARNING: -E option not supported by this programmer type\n",
|
"%s: WARNING: -E option not supported by this programmer type\n",
|
||||||
progname);
|
progname);
|
||||||
exitspecs = NULL;
|
exitspecs = NULL;
|
||||||
}
|
}
|
||||||
else if (pgm->getexitspecs(pgm, exitspecs, &ppisetbits, &ppiclrbits) < 0) {
|
else if (pgm->parseexitspecs(pgm, exitspecs) < 0) {
|
||||||
usage();
|
usage();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -1152,14 +1148,6 @@ int main(int argc, char * argv [])
|
||||||
|
|
||||||
exitrc = 0;
|
exitrc = 0;
|
||||||
|
|
||||||
/*
|
|
||||||
* handle exit specs. FIXME: this should be moved to "par.c"
|
|
||||||
*/
|
|
||||||
if (strcmp(pgm->type, "PPI") == 0) {
|
|
||||||
pgm->ppidata &= ~ppiclrbits;
|
|
||||||
pgm->ppidata |= ppisetbits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* enable the programmer
|
* enable the programmer
|
||||||
*/
|
*/
|
||||||
|
|
65
par.c
65
par.c
|
@ -180,17 +180,6 @@ static int par_highpulsepin(PROGRAMMER * pgm, int pin)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int par_getpinmask(int pin)
|
|
||||||
{
|
|
||||||
pin &= PIN_MASK;
|
|
||||||
|
|
||||||
if (pin < 1 || pin > 17)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return ppipins[pin-1].bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char * pins_to_str(unsigned int pmask)
|
static char * pins_to_str(unsigned int pmask)
|
||||||
{
|
{
|
||||||
static char buf[64];
|
static char buf[64];
|
||||||
|
@ -291,14 +280,46 @@ static int par_open(PROGRAMMER * pgm, char * port)
|
||||||
|
|
||||||
static void par_close(PROGRAMMER * pgm)
|
static void par_close(PROGRAMMER * pgm)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restore pin values before closing,
|
* Restore pin values before closing,
|
||||||
* but ensure that buffers are turned off.
|
* but ensure that buffers are turned off.
|
||||||
*/
|
*/
|
||||||
pgm->ppidata |= pgm->pinno[PPI_AVR_BUFF];
|
|
||||||
ppi_setall(pgm->fd, PPIDATA, pgm->ppidata);
|
ppi_setall(pgm->fd, PPIDATA, pgm->ppidata);
|
||||||
ppi_setall(pgm->fd, PPICTRL, pgm->ppictrl);
|
ppi_setall(pgm->fd, PPICTRL, pgm->ppictrl);
|
||||||
|
|
||||||
|
par_setpin(pgm, pgm->pinno[PPI_AVR_BUFF], 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle exit specs.
|
||||||
|
*/
|
||||||
|
switch (pgm->exit_reset) {
|
||||||
|
case EXIT_RESET_ENABLED:
|
||||||
|
par_setpin(pgm, pgm->pinno[PIN_AVR_RESET], 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXIT_RESET_DISABLED:
|
||||||
|
par_setpin(pgm, pgm->pinno[PIN_AVR_RESET], 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXIT_RESET_UNSPEC:
|
||||||
|
/* Leave it alone. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (pgm->exit_vcc) {
|
||||||
|
case EXIT_VCC_ENABLED:
|
||||||
|
par_setmany(pgm, pgm->pinno[PPI_AVR_VCC], 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXIT_VCC_DISABLED:
|
||||||
|
par_setmany(pgm, pgm->pinno[PPI_AVR_VCC], 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXIT_VCC_UNSPEC:
|
||||||
|
/* Leave it alone. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ppi_close(pgm->fd);
|
ppi_close(pgm->fd);
|
||||||
pgm->fd = -1;
|
pgm->fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -348,27 +369,26 @@ static void par_display(PROGRAMMER * pgm, char * p)
|
||||||
p, pgm->pinno[PIN_LED_VFY]);
|
p, pgm->pinno[PIN_LED_VFY]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* parse the -E string
|
* parse the -E string
|
||||||
*/
|
*/
|
||||||
static int par_getexitspecs(PROGRAMMER * pgm, char *s, int *set, int *clr)
|
static int par_parseexitspecs(PROGRAMMER * pgm, char *s)
|
||||||
{
|
{
|
||||||
char *cp;
|
char *cp;
|
||||||
|
|
||||||
while ((cp = strtok(s, ","))) {
|
while ((cp = strtok(s, ","))) {
|
||||||
if (strcmp(cp, "reset") == 0) {
|
if (strcmp(cp, "reset") == 0) {
|
||||||
*clr |= par_getpinmask(pgm->pinno[PIN_AVR_RESET]);
|
pgm->exit_reset = EXIT_RESET_ENABLED;
|
||||||
}
|
}
|
||||||
else if (strcmp(cp, "noreset") == 0) {
|
else if (strcmp(cp, "noreset") == 0) {
|
||||||
*set |= par_getpinmask(pgm->pinno[PIN_AVR_RESET]);
|
pgm->exit_reset = EXIT_RESET_DISABLED;
|
||||||
}
|
}
|
||||||
else if (strcmp(cp, "vcc") == 0) {
|
else if (strcmp(cp, "vcc") == 0) {
|
||||||
if (pgm->pinno[PPI_AVR_VCC])
|
pgm->exit_vcc = EXIT_VCC_ENABLED;
|
||||||
*set |= pgm->pinno[PPI_AVR_VCC];
|
|
||||||
}
|
}
|
||||||
else if (strcmp(cp, "novcc") == 0) {
|
else if (strcmp(cp, "novcc") == 0) {
|
||||||
if (pgm->pinno[PPI_AVR_VCC])
|
pgm->exit_vcc = EXIT_VCC_DISABLED;
|
||||||
*clr |= pgm->pinno[PPI_AVR_VCC];
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -379,12 +399,13 @@ static int par_getexitspecs(PROGRAMMER * pgm, char *s, int *set, int *clr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void par_initpgm(PROGRAMMER * pgm)
|
void par_initpgm(PROGRAMMER * pgm)
|
||||||
{
|
{
|
||||||
strcpy(pgm->type, "PPI");
|
strcpy(pgm->type, "PPI");
|
||||||
|
|
||||||
|
pgm->exit_vcc = EXIT_VCC_UNSPEC;
|
||||||
|
pgm->exit_reset = EXIT_RESET_UNSPEC;
|
||||||
|
|
||||||
pgm->rdy_led = bitbang_rdy_led;
|
pgm->rdy_led = bitbang_rdy_led;
|
||||||
pgm->err_led = bitbang_err_led;
|
pgm->err_led = bitbang_err_led;
|
||||||
pgm->pgm_led = bitbang_pgm_led;
|
pgm->pgm_led = bitbang_pgm_led;
|
||||||
|
@ -403,7 +424,7 @@ void par_initpgm(PROGRAMMER * pgm)
|
||||||
pgm->setpin = par_setpin;
|
pgm->setpin = par_setpin;
|
||||||
pgm->getpin = par_getpin;
|
pgm->getpin = par_getpin;
|
||||||
pgm->highpulsepin = par_highpulsepin;
|
pgm->highpulsepin = par_highpulsepin;
|
||||||
pgm->getexitspecs = par_getexitspecs;
|
pgm->parseexitspecs = par_parseexitspecs;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !HAVE_PARPORT */
|
#else /* !HAVE_PARPORT */
|
||||||
|
|
16
pgm.h
16
pgm.h
|
@ -38,12 +38,26 @@
|
||||||
|
|
||||||
extern LISTID programmers;
|
extern LISTID programmers;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EXIT_VCC_UNSPEC,
|
||||||
|
EXIT_VCC_ENABLED,
|
||||||
|
EXIT_VCC_DISABLED
|
||||||
|
} exit_vcc_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EXIT_RESET_UNSPEC,
|
||||||
|
EXIT_RESET_ENABLED,
|
||||||
|
EXIT_RESET_DISABLED
|
||||||
|
} exit_reset_t;
|
||||||
|
|
||||||
typedef struct programmer_t {
|
typedef struct programmer_t {
|
||||||
LISTID id;
|
LISTID id;
|
||||||
char desc[PGM_DESCLEN];
|
char desc[PGM_DESCLEN];
|
||||||
char type[PGM_TYPELEN];
|
char type[PGM_TYPELEN];
|
||||||
char port[PGM_PORTLEN];
|
char port[PGM_PORTLEN];
|
||||||
unsigned int pinno[N_PINS];
|
unsigned int pinno[N_PINS];
|
||||||
|
exit_vcc_t exit_vcc;
|
||||||
|
exit_reset_t exit_reset;
|
||||||
int ppidata;
|
int ppidata;
|
||||||
int ppictrl;
|
int ppictrl;
|
||||||
int baudrate;
|
int baudrate;
|
||||||
|
@ -85,7 +99,7 @@ typedef struct programmer_t {
|
||||||
int (*setpin) (struct programmer_t * pgm, int pin, int value);
|
int (*setpin) (struct programmer_t * pgm, int pin, int value);
|
||||||
int (*getpin) (struct programmer_t * pgm, int pin);
|
int (*getpin) (struct programmer_t * pgm, int pin);
|
||||||
int (*highpulsepin) (struct programmer_t * pgm, int pin);
|
int (*highpulsepin) (struct programmer_t * pgm, int pin);
|
||||||
int (*getexitspecs) (struct programmer_t * pgm, char *s, int *set, int *clr);
|
int (*parseexitspecs) (struct programmer_t * pgm, char *s);
|
||||||
char config_file[PATH_MAX]; /* config file where defined */
|
char config_file[PATH_MAX]; /* config file where defined */
|
||||||
int lineno; /* config file line number */
|
int lineno; /* config file line number */
|
||||||
char flag; /* for private use of the programmer */
|
char flag; /* for private use of the programmer */
|
||||||
|
|
Loading…
Reference in New Issue