diff --git a/ChangeLog b/ChangeLog index 1612b9c7..f329df12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-01-22 Rene Liebscher + + patch #7688: Implement parent programmers feature + * avrdude.conf.in: updated documentation comment and some programmers + have now parents + * config_gram.y: initpgm will now called at first use of programmer + in main. parser sets only the function pointer in the pgm structure. + Pin and pin lists definitions can now be empty to remove the parents + setting. + * doc/avrdude.texi: updated documentation + * main.c: added call to pgm->initpgm after locate_programmer + * pgm.[hc]: added field initpgm in structure, added function pgm_dup + 2012-01-21 Rene Liebscher bug #21797: AT90PWM316: New part description diff --git a/avrdude.conf.in b/avrdude.conf.in index a99261f4..f8d36bf8 100644 --- a/avrdude.conf.in +++ b/avrdude.conf.in @@ -13,6 +13,7 @@ # Possible entry formats are: # # programmer +# parent # optional parent # id = [, [, ] ...] ; # are quoted strings # desc = ; # quoted string # type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | @@ -454,22 +455,13 @@ programmer # http://armwerks.com/catalog/o-link-debugger-copy/ # or just have a look at ebay ... # It is basically the same entry as jtagkey with different usb ids. -programmer +programmer parent "jtagkey" id = "o-link"; desc = "O-Link, OpenJTAG from www.100ask.net"; - type = avrftdi; usbvid = 0x1457; usbpid = 0x5118; - usbdev = "A"; usbvendor = "www.100ask.net"; usbproduct = "USB<=>JTAG&RS232"; - usbsn = ""; -# for pin connections see jtagkey - reset = 4; - sck = 1; - mosi = 2; - miso = 3; - buff = 5; ; programmer @@ -490,10 +482,8 @@ programmer type = stk500v2; ; -programmer +programmer parent "avrispmkII" id = "avrisp2"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; ; programmer @@ -641,10 +631,8 @@ programmer type = butterfly_mk; ; -programmer +programmer parent "mkbutterfly" id = "butterfly_mk"; - desc = "Mikrokopter.de Butterfly"; - type = butterfly_mk; ; programmer @@ -655,19 +643,14 @@ programmer ; # easier to type -programmer +programmer parent "jtagmkI" id = "jtag1"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; ; # easier to type -programmer +programmer parent "jtag1" id = "jtag1slow"; - desc = "Atmel JTAG ICE (mkI)"; baudrate = 19200; - type = jtagmki; ; programmer @@ -678,27 +661,19 @@ programmer ; # easier to type -programmer +programmer parent "jtagmkII" id = "jtag2slow"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; ; # JTAG ICE mkII @ 115200 Bd -programmer +programmer parent "jtag2slow" id = "jtag2fast"; - desc = "Atmel JTAG ICE mkII"; baudrate = 115200; - type = jtagmkii; ; # make the fast one the default, people will love that -programmer +programmer parent "jtag2fast" id = "jtag2"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; ; # JTAG ICE mkII in ISP mode @@ -825,15 +800,9 @@ programmer # except that there is a LED indicating that the # programming is currently in progress. -programmer +programmer parent "stk200" id = "pony-stk200"; desc = "Pony Prog STK200"; - type = par; - buff = 4, 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; pgmled = 8; ; @@ -847,14 +816,9 @@ programmer miso = 11; ; -programmer +programmer parent "dt006" id = "bascom"; desc = "Bascom SAMPLE programming cable"; - type = par; - reset = 4; - sck = 5; - mosi = 2; - miso = 11; ; programmer @@ -979,16 +943,11 @@ programmer # It is almost same as pony-stk200, except vcc on pin 5 to auto # disconnect port (download on http://electropol.free.fr) -programmer +programmer parent "pony-stk200" id = "frank-stk200"; desc = "Frank STK200"; - type = par; + buff = ; # delete buff pin assignment vcc = 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; - pgmled = 8; ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. @@ -1040,14 +999,9 @@ programmer # Same as above, different name # reset=!txd sck=rts mosi=dtr miso=cts -programmer +programmer parent "ponyser" id = "siprog"; desc = "Lancos SI-Prog "; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; ; # unknown (dasa in uisp) diff --git a/config_gram.y b/config_gram.y index 45f0ce30..de794490 100644 --- a/config_gram.y +++ b/config_gram.y @@ -298,7 +298,7 @@ prog_def : progname, infile, lineno); exit(1); } - if (current_prog->type[0] == 0) { + if (current_prog->initpgm == NULL) { fprintf(stderr, "%s: error at %s:%d: programmer type not specified\n", progname, infile, lineno); exit(1); @@ -325,6 +325,21 @@ prog_decl : strcpy(current_prog->config_file, infile); current_prog->lineno = lineno; } + | + K_PROGRAMMER K_PARENT TKN_STRING + { + struct programmer_t * pgm = locate_programmer(programmers, $3->value.string); + if (pgm == NULL) { + fprintf(stderr, + "%s: error at %s:%d: parent programmer %s not found\n", + progname, infile, lineno, $3->value.string); + exit(1); + } + current_prog = pgm_dup(pgm); + strcpy(current_prog->config_file, infile); + current_prog->lineno = lineno; + free_token($3); + } ; @@ -469,37 +484,37 @@ prog_parm_type: ; prog_parm_type_id: - K_PAR { par_initpgm(current_prog); } | - K_SERBB { serbb_initpgm(current_prog); } | - K_STK500 { stk500_initpgm(current_prog); } | - K_STK500V2 { stk500v2_initpgm(current_prog); } | - K_WIRING { wiring_initpgm(current_prog); } | - K_STK500HVSP { stk500hvsp_initpgm(current_prog); } | - K_STK500PP { stk500pp_initpgm(current_prog); } | - K_STK500GENERIC { stk500generic_initpgm(current_prog); } | - K_ARDUINO { arduino_initpgm(current_prog); } | - K_AVRFTDI { avrftdi_initpgm(current_prog); } | - K_BUSPIRATE { buspirate_initpgm(current_prog); } | - K_STK600 { stk600_initpgm(current_prog); } | - K_STK600HVSP { stk600hvsp_initpgm(current_prog); } | - K_STK600PP { stk600pp_initpgm(current_prog); } | - K_AVR910 { avr910_initpgm(current_prog); } | - K_USBASP { usbasp_initpgm(current_prog); } | - K_USBTINY { usbtiny_initpgm(current_prog); } | - K_BUTTERFLY { butterfly_initpgm(current_prog); } | - K_BUTTERFLY_MK { butterfly_mk_initpgm(current_prog); } | - K_JTAG_MKI { jtagmkI_initpgm(current_prog); } | - K_JTAG_MKII { jtagmkII_initpgm(current_prog); } | - K_JTAG_MKII_AVR32 { jtagmkII_avr32_initpgm(current_prog); } | - K_JTAG_MKII_DW { jtagmkII_dw_initpgm(current_prog); } | - K_JTAG_MKII_ISP { stk500v2_jtagmkII_initpgm(current_prog); } | - K_JTAG_MKII_PDI { jtagmkII_pdi_initpgm(current_prog); } | - K_DRAGON_DW { jtagmkII_dragon_dw_initpgm(current_prog); } | - K_DRAGON_HVSP { stk500v2_dragon_hvsp_initpgm(current_prog); } | - K_DRAGON_ISP { stk500v2_dragon_isp_initpgm(current_prog); } | - K_DRAGON_JTAG { jtagmkII_dragon_initpgm(current_prog); } | - K_DRAGON_PDI { jtagmkII_dragon_pdi_initpgm(current_prog); } | - K_DRAGON_PP { stk500v2_dragon_pp_initpgm(current_prog); } + K_PAR { current_prog->initpgm = par_initpgm; } | + K_SERBB { current_prog->initpgm = serbb_initpgm; } | + K_STK500 { current_prog->initpgm = stk500_initpgm; } | + K_STK500V2 { current_prog->initpgm = stk500v2_initpgm; } | + K_WIRING { current_prog->initpgm = wiring_initpgm; } | + K_STK500HVSP { current_prog->initpgm = stk500hvsp_initpgm; } | + K_STK500PP { current_prog->initpgm = stk500pp_initpgm; } | + K_STK500GENERIC { current_prog->initpgm = stk500generic_initpgm; } | + K_ARDUINO { current_prog->initpgm = arduino_initpgm; } | + K_AVRFTDI { current_prog->initpgm = avrftdi_initpgm; } | + K_BUSPIRATE { current_prog->initpgm = buspirate_initpgm; } | + K_STK600 { current_prog->initpgm = stk600_initpgm; } | + K_STK600HVSP { current_prog->initpgm = stk600hvsp_initpgm; } | + K_STK600PP { current_prog->initpgm = stk600pp_initpgm; } | + K_AVR910 { current_prog->initpgm = avr910_initpgm; } | + K_USBASP { current_prog->initpgm = usbasp_initpgm; } | + K_USBTINY { current_prog->initpgm = usbtiny_initpgm; } | + K_BUTTERFLY { current_prog->initpgm = butterfly_initpgm; } | + K_BUTTERFLY_MK { current_prog->initpgm = butterfly_mk_initpgm; } | + K_JTAG_MKI { current_prog->initpgm = jtagmkI_initpgm; } | + K_JTAG_MKII { current_prog->initpgm = jtagmkII_initpgm; } | + K_JTAG_MKII_AVR32 { current_prog->initpgm = jtagmkII_avr32_initpgm; } | + K_JTAG_MKII_DW { current_prog->initpgm = jtagmkII_dw_initpgm; } | + K_JTAG_MKII_ISP { current_prog->initpgm = stk500v2_jtagmkII_initpgm; } | + K_JTAG_MKII_PDI { current_prog->initpgm = jtagmkII_pdi_initpgm; } | + K_DRAGON_DW { current_prog->initpgm = jtagmkII_dragon_dw_initpgm; } | + K_DRAGON_HVSP { current_prog->initpgm = stk500v2_dragon_hvsp_initpgm; } | + K_DRAGON_ISP { current_prog->initpgm = stk500v2_dragon_isp_initpgm; } | + K_DRAGON_JTAG { current_prog->initpgm = jtagmkII_dragon_initpgm; } | + K_DRAGON_PDI { current_prog->initpgm = jtagmkII_dragon_pdi_initpgm; } | + K_DRAGON_PP { current_prog->initpgm = stk500v2_dragon_pp_initpgm; } ; prog_parm_usb: @@ -549,6 +564,8 @@ pin_number: TKN_NUMBER { assign_pin(pin_name, $1, 0); } | TKN_TILDE TKN_NUMBER { assign_pin(pin_name, $2, 1); } + | + /* empty */ { current_prog->pinno[pin_name] = 0; } ; pin_list: @@ -568,6 +585,10 @@ pin_list: } } } + | + /* empty */ { + current_prog->pinno[pin_name] = 0; + } ; prog_parm_pins: diff --git a/doc/avrdude.texi b/doc/avrdude.texi index 5e047273..9135c91d 100644 --- a/doc/avrdude.texi +++ b/doc/avrdude.texi @@ -1432,6 +1432,7 @@ The format of the programmer definition is as follows: @smallexample programmer + parent # is a quoted string id = [, [, ] ...] ; # are quoted strings desc = ; # quoted string type = par | stk500 | ... ; # programmer type (see below for a list) @@ -1455,6 +1456,10 @@ programmer ; @end smallexample +@noindent +If a parent is specified, all settings of it (except its ids) are used for the new +programmer. These values can be changed by new setting them for the new programmer. + @noindent To invert a bit in the pin definitions, use @code{= ~ }. diff --git a/main.c b/main.c index 5999abf1..469e22f8 100644 --- a/main.c +++ b/main.c @@ -727,6 +727,15 @@ int main(int argc, char * argv []) exit(1); } + if (pgm->initpgm) { + pgm->initpgm(pgm); + } else { + fprintf(stderr, + "\n%s: Can't initialize the programmer.\n\n", + progname); + exit(1); + } + if (pgm->setup) { pgm->setup(pgm); } diff --git a/pgm.c b/pgm.c index 41fa68ed..f0e3b5b3 100644 --- a/pgm.c +++ b/pgm.c @@ -82,6 +82,7 @@ PROGRAMMER * pgm_new(void) pgm->config_file[0] = 0; pgm->lineno = 0; pgm->baudrate = 0; + pgm->initpgm = NULL; for (i=0; ipinno[i] = 0; @@ -147,6 +148,25 @@ void pgm_free(PROGRAMMER * const p) free(p); } +PROGRAMMER * pgm_dup(const PROGRAMMER const * src) +{ + PROGRAMMER * pgm; + + pgm = (PROGRAMMER *)malloc(sizeof(*pgm)); + if (pgm == NULL) { + fprintf(stderr, "%s: out of memory allocating programmer structure\n", + progname); + exit(1); + } + + memcpy(pgm, src, sizeof(*pgm)); + + pgm->id = lcreat(NULL, 0); + + return pgm; +} + + static void pgm_default(void) { fprintf(stderr, "%s: programmer operation not supported\n", progname); diff --git a/pgm.h b/pgm.h index 812a35f3..969fe272 100644 --- a/pgm.h +++ b/pgm.h @@ -61,6 +61,7 @@ typedef struct programmer_t { char desc[PGM_DESCLEN]; char type[PGM_TYPELEN]; char port[PGM_PORTLEN]; + void (*initpgm)(struct programmer_t * pgm); unsigned int pinno[N_PINS]; exit_vcc_t exit_vcc; exit_reset_t exit_reset; @@ -131,6 +132,7 @@ extern "C" { #endif PROGRAMMER * pgm_new(void); +PROGRAMMER * pgm_dup(const PROGRAMMER const * src); void pgm_free(PROGRAMMER * const p); void programmer_display(PROGRAMMER * pgm, const char * p);