Merge pull request #1781 from stefanrueger/stk500generic

make programmer stk500generic libavrdude ready
This commit is contained in:
Stefan Rueger
2024-04-25 16:46:47 +00:00
committed by GitHub
3 changed files with 50 additions and 49 deletions

View File

@@ -1066,6 +1066,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);

View File

@@ -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; i<N_PINS; i++) {
pgm->pinno[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; i<N_PINS; i++) {
pgm->pinno[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;

View File

@@ -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;