From 569e74365f99fbfd7cdd22847d24a7adbaece568 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 11:33:20 +0100 Subject: [PATCH 1/2] Separate function pointer initialisation out from pgm_new() ... so that an existing programmer can be re-initialised with different functions. --- src/libavrdude.h | 1 + src/pgm.c | 76 ++++++++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/src/libavrdude.h b/src/libavrdude.h index 453b22a0..a5ab67ba 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -1065,6 +1065,7 @@ void serialadapter_not_found(const char *sea_id); extern "C" { #endif +void pgm_init_functions(PROGRAMMER *pgm); PROGRAMMER * pgm_new(void); PROGRAMMER * pgm_dup(const PROGRAMMER *src); void pgm_free(PROGRAMMER *p); diff --git a/src/pgm.c b/src/pgm.c index 03f7ee80..639e0e9d 100644 --- a/src/pgm.c +++ b/src/pgm.c @@ -63,40 +63,7 @@ static void pgm_default_powerup_powerdown(const PROGRAMMER *pgm) { } -PROGRAMMER *pgm_new(void) { - PROGRAMMER *pgm = (PROGRAMMER *) cfg_malloc("pgm_new()", sizeof(*pgm)); - const char *nulp = cache_string(""); - - // Initialise const char * and LISTID entities - pgm->id = lcreat(NULL, 0); - pgm->usbpid = lcreat(NULL, 0); - pgm->hvupdi_support = lcreat(NULL, 0); - pgm->desc = nulp; - pgm->parent_id = nulp; - pgm->usbdev = nulp; - pgm->usbsn = nulp; - pgm->usbvendor = nulp; - pgm->usbproduct = nulp; - pgm->config_file = nulp; - - // Allocate cache structures for flash and EEPROM, *do not* free in pgm_free() - pgm->cp_flash = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); - pgm->cp_eeprom = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); - pgm->cp_bootrow = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); - pgm->cp_usersig = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); - - // Default values - pgm->initpgm = NULL; - pgm->lineno = 0; - pgm->baudrate = 0; - - // Clear pin array - for(int i=0; ipinno[i] = NO_PIN; - pin_clear_all(&(pgm->pin[i])); - } - - pgm->leds = cfg_malloc(__func__, sizeof(leds_t)); +void pgm_init_functions(PROGRAMMER *pgm) { /* * mandatory functions - these are called without checking to see * whether they are assigned or not @@ -144,7 +111,9 @@ PROGRAMMER *pgm_new(void) { pgm->write_setup = NULL; pgm->read_sig_bytes = NULL; pgm->read_sib = NULL; + pgm->read_chip_rev = NULL; pgm->term_keep_alive= NULL; + pgm->end_programming= NULL; pgm->print_parms = NULL; pgm->set_vtarget = NULL; pgm->get_vtarget = NULL; @@ -164,6 +133,45 @@ PROGRAMMER *pgm_new(void) { pgm->teardown = NULL; pgm->readonly = NULL; pgm->flash_readhook = NULL; +} + + +PROGRAMMER *pgm_new(void) { + PROGRAMMER *pgm = (PROGRAMMER *) cfg_malloc("pgm_new()", sizeof(*pgm)); + const char *nulp = cache_string(""); + + // Initialise const char * and LISTID entities + pgm->id = lcreat(NULL, 0); + pgm->usbpid = lcreat(NULL, 0); + pgm->hvupdi_support = lcreat(NULL, 0); + pgm->desc = nulp; + pgm->parent_id = nulp; + pgm->usbdev = nulp; + pgm->usbsn = nulp; + pgm->usbvendor = nulp; + pgm->usbproduct = nulp; + pgm->config_file = nulp; + + // Allocate cache structures for flash and EEPROM, *do not* free in pgm_free() + pgm->cp_flash = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); + pgm->cp_eeprom = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); + pgm->cp_bootrow = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); + pgm->cp_usersig = cfg_malloc("pgm_new()", sizeof(AVR_Cache)); + + // Default values + pgm->initpgm = NULL; + pgm->lineno = 0; + pgm->baudrate = 0; + + // Clear pin array + for(int i=0; ipinno[i] = NO_PIN; + pin_clear_all(&(pgm->pin[i])); + } + + pgm->leds = cfg_malloc(__func__, sizeof(leds_t)); + + pgm_init_functions(pgm); // For allocating "global" memory by the programmer pgm->cookie = NULL; From 28a95878580218218357feb2cc745722879a442f Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 11:54:43 +0100 Subject: [PATCH 2/2] Remove static variable in stk500generic.c --- src/stk500generic.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/stk500generic.c b/src/stk500generic.c index d5ce7f73..2aa331be 100644 --- a/src/stk500generic.c +++ b/src/stk500generic.c @@ -41,36 +41,28 @@ #include "stk500.h" #include "stk500v2.h" -static PROGRAMMER *stk500vn; -static void stk500vn_exithook(void) { - if(stk500vn && stk500vn->teardown) - stk500vn->teardown(stk500vn); -} - static int stk500generic_open(PROGRAMMER *pgm, const char *port) { + // First try stk500 v2 programmer stk500v2_initpgm(pgm); if(pgm->setup) pgm->setup(pgm); if(pgm->open(pgm, port) >= 0) { - stk500vn = pgm; - atexit(stk500vn_exithook); - pmsg_info("successfully opened stk500v2 device; please use -c stk500v2\n"); + pmsg_info("successfully opened stk500v2 device\n"); + imsg_info("in future, please use -c stk500v2, so -x parameters are available\n"); return 0; } if(pgm->teardown) pgm->teardown(pgm); - stk500_initpgm(pgm); + pgm_init_functions(pgm); // Overwrite stk500v2_initpgm(pgm) setup + stk500_initpgm(pgm); // Now try engaging the v1 programmer if(pgm->setup) pgm->setup(pgm); if(pgm->open(pgm, port) >= 0) { - stk500vn = pgm; - atexit(stk500vn_exithook); - pmsg_info("successfully opened stk500v1 device; please use -c stk500v1\n"); + pmsg_info("successfully opened stk500v1 device\n"); + imsg_info("in future, please use -c stk500v1, so -x parameters are available\n"); return 0; } - if(pgm->teardown) - pgm->teardown(pgm); pmsg_error("probing stk500v2 failed, as did stk500v1; perhaps try -c stk500v1\n"); return -1;