Merge pull request #1790 from stefanrueger/libavrdude_exit

Remove calls to exit() from libavrdude library functions
This commit is contained in:
Stefan Rueger
2024-04-26 07:44:47 +00:00
committed by GitHub
9 changed files with 113 additions and 114 deletions

View File

@@ -471,7 +471,7 @@ int avr_read_mem(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *mem, con
if (mem_is_signature(mem)) {
if (pgm->read_sig_bytes) {
int rc = pgm->read_sig_bytes(pgm, p, mem);
if (rc < 0)
if (rc < 0 && rc != LIBAVRDUDE_EXIT)
led_set(pgm, LED_ERR);
led_clr(pgm, LED_PGM);
return rc;
@@ -1236,13 +1236,13 @@ int avr_signature(const PROGRAMMER *pgm, const AVRPART *p) {
if(verbose > 1)
report_progress(0, 1, "Reading");
rc = avr_read(pgm, p, "signature", 0);
if (rc < LIBAVRDUDE_SUCCESS) {
if (rc < LIBAVRDUDE_SUCCESS && rc != LIBAVRDUDE_EXIT) {
pmsg_error("unable to read signature data for part %s, rc=%d\n", p->desc, rc);
return rc;
}
report_progress(1, 1, NULL);
return LIBAVRDUDE_SUCCESS;
return rc < LIBAVRDUDE_SUCCESS? LIBAVRDUDE_EXIT: LIBAVRDUDE_SUCCESS;
}

View File

@@ -1208,10 +1208,9 @@ static void avrftdi_setup(PROGRAMMER * pgm) {
pdata->mpsse_pins[i] = valid_mpsse_pins[i];
pdata->ftdic = ftdi_new();
if(!pdata->ftdic)
{
pmsg_error("failed to allocate memory in ftdi_new()\n");
exit(1);
if(!pdata->ftdic) {
pmsg_ext_error("ftdi_new() failed to allocate memory\n");
exit(1); // pgm->setup() should return an int, but it doesn't
}
E_VOID(ftdi_init(pdata->ftdic), pdata->ftdic);

View File

@@ -33,22 +33,21 @@
***/
OPCODE *avr_new_opcode(void) {
return (OPCODE *) cfg_malloc("avr_new_opcode()", sizeof(OPCODE));
return (OPCODE *) mmt_malloc(sizeof(OPCODE));
}
static OPCODE *avr_dup_opcode(const OPCODE *op) {
if(op == NULL) // Caller wants NULL if op == NULL
return NULL;
OPCODE *m = (OPCODE *) cfg_malloc("avr_dup_opcode()", sizeof(*m));
OPCODE *m = (OPCODE *) mmt_malloc(sizeof(*m));
memcpy(m, op, sizeof(*m));
return m;
}
void avr_free_opcode(OPCODE *op) {
if(op)
free(op);
mmt_free(op);
}
@@ -296,7 +295,7 @@ int avr_get_output_index(const OPCODE *op) {
***/
AVRMEM *avr_new_mem(void) {
AVRMEM *m = (AVRMEM *) cfg_malloc("avr_new_mem()", sizeof(*m));
AVRMEM *m = (AVRMEM *) mmt_malloc(sizeof(*m));
m->desc = cache_string("");
m->page_size = 1; // Ensure not 0
m->initval = -1; // Unknown value represented as -1
@@ -306,7 +305,7 @@ AVRMEM *avr_new_mem(void) {
}
AVRMEM_ALIAS *avr_new_memalias(void) {
AVRMEM_ALIAS *m = (AVRMEM_ALIAS *) cfg_malloc("avr_new_memalias()", sizeof*m);
AVRMEM_ALIAS *m = (AVRMEM_ALIAS *) mmt_malloc(sizeof *m);
m->desc = cache_string("");
return m;
}
@@ -322,8 +321,8 @@ int avr_initmem(const AVRPART *p) {
for (LNODEID ln=lfirst(p->mem); ln; ln=lnext(ln)) {
AVRMEM *m = ldata(ln);
m->buf = (unsigned char *) cfg_malloc("avr_initmem()", m->size);
m->tags = (unsigned char *) cfg_malloc("avr_initmem()", m->size);
m->buf = mmt_malloc(m->size);
m->tags = mmt_malloc(m->size);
}
return 0;
@@ -337,12 +336,12 @@ AVRMEM *avr_dup_mem(const AVRMEM *m) {
*n = *m;
if(m->buf) {
n->buf = (unsigned char *) cfg_malloc("avr_dup_mem()", n->size);
n->buf = mmt_malloc(n->size);
memcpy(n->buf, m->buf, n->size);
}
if(m->tags) {
n->tags = (unsigned char *) cfg_malloc("avr_dup_mem()", n->size);
n->tags = (unsigned char *) mmt_malloc(n->size);
memcpy(n->tags, m->tags, n->size);
}
@@ -367,11 +366,11 @@ void avr_free_mem(AVRMEM * m) {
return;
if(m->buf) {
free(m->buf);
mmt_free(m->buf);
m->buf = NULL;
}
if(m->tags) {
free(m->tags);
mmt_free(m->tags);
m->tags = NULL;
}
for(size_t i=0; i<sizeof(m->op)/sizeof(m->op[0]); i++) {
@@ -380,12 +379,11 @@ void avr_free_mem(AVRMEM * m) {
m->op[i] = NULL;
}
}
free(m);
mmt_free(m);
}
void avr_free_memalias(AVRMEM_ALIAS *m) {
if(m)
free(m);
mmt_free(m);
}
AVRMEM_ALIAS *avr_locate_memalias(const AVRPART *p, const char *desc) {
@@ -602,7 +600,7 @@ const Register_file_t *avr_locate_register(const Register_file_t *rgf, int nr, c
const Register_file_t **avr_locate_registerlist(const Register_file_t *rgf, int nr, const char *reg,
int (*match)(const char *, const char*)) {
const Register_file_t **ret = cfg_malloc(__func__, sizeof rgf*(nr>0? nr+1: 1)), **r = ret;
const Register_file_t **ret = mmt_malloc(sizeof rgf*(nr>0? nr+1: 1)), **r = ret;
int eqmatch = match == str_eq;
if(rgf && reg && match)
@@ -617,7 +615,7 @@ const Register_file_t **avr_locate_registerlist(const Register_file_t *rgf, int
return ret;
}
if(!eqmatch && str_eq(p, reg)) { // reg same as segment: switch to str_eq() match
free(ret);
mmt_free(ret);
return avr_locate_registerlist(rgf, nr, reg, str_eq);
}
if(!reg_matched++) // Record a matching register only once
@@ -668,7 +666,7 @@ const Configitem_t *avr_locate_config(const Configitem_t *cfg, int nc, const cha
const Configitem_t **avr_locate_configlist(const Configitem_t *cfg, int nc, const char *name,
int (*match)(const char *, const char*)) {
const Configitem_t **ret = cfg_malloc(__func__, sizeof cfg*(nc>0? nc+1: 1)), **r = ret;
const Configitem_t **ret = mmt_malloc(sizeof cfg*(nc>0? nc+1: 1)), **r = ret;
if(cfg && name && match) {
for(int i = 0; i < nc; i++)
@@ -774,7 +772,7 @@ static char *print_num(const char *fmt, int n) {
static int num_len(const char *fmt, int n) {
char *p = print_num(fmt, n);
int ret = strlen(p);
free(p);
mmt_free(p);
return ret;
}
@@ -848,7 +846,7 @@ void avr_mem_display(FILE *f, const AVRPART *p, const char *prefix) {
m_char_max[1], m->size,
m_char_max[2], m->page_size,
m_char_max[3], m_offset);
free(m_offset);
mmt_free(m_offset);
} else {
fprintf(f, "%s%-*s %*d %*d\n",
prefix,
@@ -856,7 +854,7 @@ void avr_mem_display(FILE *f, const AVRPART *p, const char *prefix) {
m_char_max[1], m->size,
m_char_max[2], m->page_size);
}
free(m_desc_str);
mmt_free(m_desc_str);
}
}
@@ -922,7 +920,7 @@ int avr_variants_display(FILE *f, const AVRPART *p, const char *prefix) {
*/
AVRPART *avr_new_part(void) {
AVRPART *p = (AVRPART *) cfg_malloc("avr_new_part()", sizeof(AVRPART));
AVRPART *p = (AVRPART *) mmt_malloc(sizeof(AVRPART));
const char *nulp = cache_string("");
memset(p, 0, sizeof(*p));
@@ -986,13 +984,12 @@ AVRPART *avr_dup_part(const AVRPART *d) {
return p;
}
void avr_free_part(AVRPART * d)
{
ldestroy_cb(d->mem, (void(*)(void *))avr_free_mem);
void avr_free_part(AVRPART * d) {
ldestroy_cb(d->mem, (void(*)(void *)) avr_free_mem);
d->mem = NULL;
ldestroy_cb(d->mem_alias, (void(*)(void *))avr_free_memalias);
ldestroy_cb(d->mem_alias, (void(*)(void *)) avr_free_memalias);
d->mem_alias = NULL;
ldestroy_cb(d->variants, free);
ldestroy_cb(d->variants, cfg_free);
d->variants = NULL;
/* do not free d->parent_id and d->config_file */
@@ -1002,7 +999,7 @@ void avr_free_part(AVRPART * d)
d->op[i] = NULL;
}
}
free(d);
mmt_free(d);
}
AVRPART *locate_part(const LISTID parts, const char *partdesc) {
@@ -1159,7 +1156,7 @@ char *cmdbitstr(CMDBIT cb) {
else
space[1] = 0;
return cfg_strdup("cmdbitstr()", space);
return mmt_strdup(space);
}
@@ -1201,7 +1198,7 @@ char *opcode2str(const OPCODE *op, int opnum, int detailed) {
int compact = 1, printbit;
if(!op)
return cfg_strdup("opcode2str()", "NULL");
return mmt_strdup("NULL");
// Can the opcode be printed in a compact way? Only if i, o and a bits are systematic.
for(int i=31; i >= 0; i--)
@@ -1245,7 +1242,7 @@ char *opcode2str(const OPCODE *op, int opnum, int detailed) {
*sp++ = '"';
*sp = 0;
return cfg_strdup("opcode2str()", space);
return mmt_strdup(space);
}

View File

@@ -217,6 +217,11 @@ char *cfg_strdup(const char *funcname, const char *s) {
}
void cfg_free(void *ptr) {
mmt_free(ptr);
}
int yywrap()
{
return 1;

View File

@@ -93,10 +93,6 @@ static int opcodecmp(const OPCODE *op1, const OPCODE *op2, int opnum) {
opstr1 = opcode2str(op1, opnum, 1);
opstr2 = opcode2str(op2, opnum, 1);
if(!opstr1 || !opstr2) {
dev_info("%s: out of memory\n", progname);
exit(1);
}
// Don't care x and 0 are functionally equivalent
for(p=opstr1; *p; p++)
@@ -107,8 +103,8 @@ static int opcodecmp(const OPCODE *op1, const OPCODE *op2, int opnum) {
*p = '0';
cmp = strcmp(opstr1, opstr2);
free(opstr1);
free(opstr2);
mmt_free(opstr1);
mmt_free(opstr2);
return cmp;
}
@@ -210,7 +206,7 @@ static void checkaddr(int memsize, int pagesize, int opnum, const OPCODE *op, co
dev_info(".cmderr\t%s\t%s-%s\tbit %d outside addressable space should be x or 0 but is %s\n",
p->desc, m->desc, opstr, i+8, cbs? cbs: "NULL");
if(cbs)
free(cbs);
mmt_free(cbs);
}
} else {
if(op->bit[i+8].type != AVR_CMDBIT_ADDRESS)
@@ -237,10 +233,10 @@ static char *dev_sprintf(const char *fmt, ...) {
va_end(ap);
if(size < 0)
return cfg_strdup("dev_sprintf()", "");
return mmt_strdup("");
size++; // For terminating '\0'
p = cfg_malloc("dev_sprintf()", size);
p = mmt_malloc(size);
va_start(ap, fmt);
size = vsnprintf(p, size, fmt, ap);
@@ -337,8 +333,7 @@ static int dev_part_strct_entry(bool tsv, // Print as spreadsheet?
dev_cout(comms, n, 1, 1); // Print comments on rhs
}
if(cont)
free(cont);
mmt_free(cont);
return 1;
}
@@ -606,7 +601,7 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool
firstid = 0;
char *str = cfg_escape(ldata(ln));
dev_info("%*s%s", tsv? 0: 8, "", str);
free(str);
mmt_free(str);
}
if(tsv)
dev_info("\n");
@@ -625,9 +620,9 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool
}
_if_partout_str(strcmp, cfg_escape(p->family_id), family_id);
_if_partout_str(intcmp, cfg_strdup("dev_part_strct()", prog_modes_str(p->prog_modes)), prog_modes);
_if_partout_str(intcmp, mmt_strdup(prog_modes_str(p->prog_modes)), prog_modes);
if(p->mcuid == 21) {
_if_partout_str(intcmp, cfg_strdup(__func__, "XVII + IV"), mcuid);
_if_partout_str(intcmp, mmt_strdup("XVII + IV"), mcuid);
} else {
_if_partout(intcmp, "%d", mcuid);
}
@@ -645,13 +640,12 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool
_if_partout(intcmp, "0x%04x", usbpid);
if(!base || base->reset_disposition != p->reset_disposition)
_partout_str(cfg_strdup("dev_part_strct()",
p->reset_disposition == RESET_DEDICATED? "dedicated": p->reset_disposition == RESET_IO? "io": "unknown"),
_partout_str(mmt_strdup(p->reset_disposition == RESET_DEDICATED?
"dedicated": p->reset_disposition == RESET_IO? "io": "unknown"),
reset);
_if_partout_str(intcmp, cfg_strdup("dev_part_strct()",
p->retry_pulse == PIN_AVR_RESET? "reset": p->retry_pulse == PIN_AVR_SCK? "sck": "unknown"),
retry_pulse);
_if_partout_str(intcmp, mmt_strdup(p->retry_pulse == PIN_AVR_RESET?
"reset": p->retry_pulse == PIN_AVR_SCK? "sck": "unknown"), retry_pulse);
if(!base || base->flags != p->flags) {
if(tsv) {
@@ -664,9 +658,8 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool
if(!base || (base->flags & (AVRPART_PARALLELOK | AVRPART_PSEUDOPARALLEL)) != (p->flags & (AVRPART_PARALLELOK | AVRPART_PSEUDOPARALLEL))) {
int par = p->flags & (AVRPART_PARALLELOK | AVRPART_PSEUDOPARALLEL);
_partout_str(cfg_strdup("dev_part_strct()",
par == 0? "no": par == AVRPART_PSEUDOPARALLEL? "unknown": AVRPART_PARALLELOK? "yes": "pseudo"),
parallel);
_partout_str(mmt_strdup(par == 0? "no":
par == AVRPART_PSEUDOPARALLEL? "unknown": AVRPART_PARALLELOK? "yes": "pseudo"), parallel);
}
}
}
@@ -788,7 +781,7 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool
if(meminj[i].mcu && str_casematch(meminj[i].mcu, p->desc))
if(str_match(meminj[i].mem, m->desc)) {
dev_part_strct_entry(tsv, ".ptmm", p->desc, m->desc,
meminj[i].var, cfg_strdup("meminj", meminj[i].value), NULL);
meminj[i].var, mmt_strdup(meminj[i].value), NULL);
meminj[i].mcu = NULL;
}
@@ -824,14 +817,14 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool
if(ptinj[i].mcu)
if(str_casematch(ptinj[i].mcu, p->desc))
dev_part_strct_entry(tsv, ".pt", p->desc, NULL,
ptinj[i].var, cfg_strdup("ptinj", ptinj[i].value), NULL);
ptinj[i].var, mmt_strdup(ptinj[i].value), NULL);
for(size_t i=0; i<sizeof meminj/sizeof*meminj; i++)
if(meminj[i].mcu && str_casematch(meminj[i].mcu, p->desc)) {
if(!tsv)
dev_info(" memory \"%s\"\n", meminj[i].mem);
dev_part_strct_entry(tsv, ".ptmm", p->desc, meminj[i].mem,
meminj[i].var, cfg_strdup("meminj", meminj[i].value), NULL);
meminj[i].var, mmt_strdup(meminj[i].value), NULL);
meminj[i].mcu = NULL;
if(!tsv)
dev_info(" ;\n");
@@ -850,21 +843,21 @@ void dev_output_pgm_part(int dev_opt_c, const char *programmer, int dev_opt_p, c
char *p;
dev_print_comment(cfg_get_prologue());
dev_info("avrdude_conf_version = %s;\n\n", p = cfg_escape(avrdude_conf_version)); free(p);
dev_info("default_programmer = %s;\n", p = cfg_escape(default_programmer)); free(p);
dev_info("default_parallel = %s;\n", p = cfg_escape(default_parallel)); free(p);
dev_info("default_serial = %s;\n", p = cfg_escape(default_serial)); free(p);
dev_info("default_spi = %s;\n", p = cfg_escape(default_spi)); free(p);
dev_info("avrdude_conf_version = %s;\n\n", p = cfg_escape(avrdude_conf_version)); mmt_free(p);
dev_info("default_programmer = %s;\n", p = cfg_escape(default_programmer)); mmt_free(p);
dev_info("default_parallel = %s;\n", p = cfg_escape(default_parallel)); mmt_free(p);
dev_info("default_serial = %s;\n", p = cfg_escape(default_serial)); mmt_free(p);
dev_info("default_spi = %s;\n", p = cfg_escape(default_spi)); mmt_free(p);
dev_info("default_baudrate = %d;\n", default_baudrate);
dev_info("default_bitclock = %7.5f;\n", default_bitclock);
dev_info("default_linuxgpio = %s;\n", p = cfg_escape(default_linuxgpio)); free(p);
dev_info("default_linuxgpio = %s;\n", p = cfg_escape(default_linuxgpio)); mmt_free(p);
dev_info("allow_subshells = %s;\n", allow_subshells? "yes": "no");
dev_info("\n#\n# PROGRAMMER DEFINITIONS\n#\n\n");
}
if(dev_opt_c)
dev_output_pgm_defs(cfg_strdup("main()", programmer));
dev_output_pgm_defs(mmt_strdup(programmer));
if(dev_opt_p == 2 && dev_opt_c)
dev_info("\n");
@@ -872,7 +865,7 @@ void dev_output_pgm_part(int dev_opt_c, const char *programmer, int dev_opt_p, c
dev_info("#\n# PART DEFINITIONS\n#\n");
if(dev_opt_p)
dev_output_part_defs(cfg_strdup("main()", partdesc));
dev_output_part_defs(mmt_strdup(partdesc));
}
@@ -1250,7 +1243,7 @@ static char *dev_usbpid_liststr(const PROGRAMMER *pgm) {
sprintf(spc + strlen(spc), "0x%04x", *(unsigned int *) ldata(ln));
}
return cfg_strdup(__func__, *spc? spc: "NULL");
return mmt_strdup(*spc? spc: "NULL");
}
static char *dev_hvupdi_support_liststr(const PROGRAMMER *pgm) {
@@ -1267,7 +1260,7 @@ static char *dev_hvupdi_support_liststr(const PROGRAMMER *pgm) {
sprintf(spc + strlen(spc), "%d", *(unsigned int *) ldata(ln));
}
return cfg_strdup(__func__, *spc? spc: "NULL");
return mmt_strdup(*spc? spc: "NULL");
}
@@ -1313,7 +1306,7 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas
firstid = 0;
char *str = cfg_escape(ldata(ln));
dev_info("%s", str);
free(str);
mmt_free(str);
}
if(tsv)
dev_info("\n");
@@ -1325,9 +1318,9 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas
_if_pgmout_str(strcmp, cfg_escape(pgm->desc), desc);
if(!base || base->initpgm != pgm->initpgm)
_pgmout_fmt("type", "\"%s\"", locate_programmer_type_id(pgm->initpgm));
_if_pgmout_str(intcmp, cfg_strdup("dev_pgm_strct()", prog_modes_str(pgm->prog_modes)), prog_modes);
_if_pgmout_str(boolcmp, cfg_strdup("dev_pgm_strct()", pgm->is_serialadapter? "yes": "no"), is_serialadapter);
_if_pgmout_str(intcmp, cfg_strdup("dev_pgm_strct()", extra_features_str(pgm->extra_features)), extra_features);
_if_pgmout_str(intcmp, mmt_strdup(prog_modes_str(pgm->prog_modes)), prog_modes);
_if_pgmout_str(boolcmp, mmt_strdup(pgm->is_serialadapter? "yes": "no"), is_serialadapter);
_if_pgmout_str(intcmp, mmt_strdup(extra_features_str(pgm->extra_features)), extra_features);
if(!base || base->conntype != pgm->conntype)
_pgmout_fmt("connection_type", "%s", connstr(pgm->conntype));
_if_pgmout(intcmp, "%d", baudrate);
@@ -1340,12 +1333,12 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas
if(base) {
char *basestr = dev_usbpid_liststr(base);
show = !str_eq(basestr, pgmstr);
free(basestr);
mmt_free(basestr);
}
if(show)
dev_part_strct_entry(tsv, ".prog", id, NULL, "usbpid", pgmstr, pgm->comments);
else // dev_part_strct_entry() frees pgmstr
free(pgmstr);
mmt_free(pgmstr);
_if_pgmout_str(strcmp, cfg_escape(pgm->usbdev), usbdev);
_if_pgmout_str(strcmp, cfg_escape(pgm->usbsn), usbsn);
@@ -1358,9 +1351,8 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas
if(!base || !str_eq(bstr, str))
_pgmout_fmt(avr_pin_lcname(i), "%s", str);
free(str);
if(bstr)
free(bstr);
mmt_free(str);
mmt_free(bstr);
}
pgmstr = dev_hvupdi_support_liststr(pgm);
@@ -1369,12 +1361,12 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas
if(base) {
char *basestr = dev_hvupdi_support_liststr(base);
show = !str_eq(basestr, pgmstr);
free(basestr);
mmt_free(basestr);
}
if(show)
dev_part_strct_entry(tsv, ".prog", id, NULL, "hvupdi_support", pgmstr, pgm->comments);
else // dev_part_strct_entry() frees pgmstr
free(pgmstr);
mmt_free(pgmstr);
if(injct)
for(size_t i=0; i<sizeof pgminj/sizeof*pgminj; i++)
@@ -1382,7 +1374,7 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas
for(LNODEID *ln=lfirst(pgm->id); ln; ln=lnext(ln))
if(str_casematch(pgminj[i].pgmid, ldata(ln)))
dev_part_strct_entry(tsv, ".prog", ldata(ln), NULL,
pgminj[i].var, cfg_strdup("pgminj", pgminj[i].value), NULL);
pgminj[i].var, strdup(pgminj[i].value), NULL);
if(!tsv) {
dev_cout(pgm->comments, ";", 0, 0);

View File

@@ -281,8 +281,8 @@ int dfu_getstatus(struct dfu_dev *dfu, struct dfu_status *status)
}
if (result > (int) sizeof(struct dfu_status)) {
pmsg_error("oversize read (should not happen); exiting\n");
exit(1);
pmsg_error("oversize read (should not happen)\n");
return -1;
}
pmsg_trace("dfu_getstatus(): bStatus 0x%02x, bwPollTimeout %d, bState 0x%02x, iString %d\n",
@@ -382,8 +382,8 @@ int dfu_upload(struct dfu_dev *dfu, void *ptr, int size)
}
if (result > size) {
pmsg_error("oversize read (should not happen); exiting\n");
exit(1);
pmsg_error("oversize read (should not happen)\n");
return -1;
}
return 0;

View File

@@ -1790,17 +1790,15 @@ static int jtag3_open(PROGRAMMER *pgm, const char *port) {
if (rc < 0)
return rc;
if (jtag3_getsync(pgm, PARM3_CONN_JTAG) < 0)
return -1;
return 0;
return jtag3_getsync(pgm, PARM3_CONN_JTAG) < 0? -1: 0;
}
static int jtag3_open_dw(PROGRAMMER *pgm, const char *port) {
pmsg_notice2("jtag3_open_dw()\n");
if (jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode) < 0)
return -1;
int rc = jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode);
if (rc < 0)
return rc;
if (jtag3_getsync(pgm, PARM3_CONN_DW) < 0)
return -1;
@@ -1810,14 +1808,11 @@ static int jtag3_open_dw(PROGRAMMER *pgm, const char *port) {
static int jtag3_open_pdi(PROGRAMMER *pgm, const char *port) {
pmsg_notice2("jtag3_open_pdi()\n");
int rc = jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode);
if (rc < 0)
return rc;
if (jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode) < 0)
return -1;
if (jtag3_getsync(pgm, PARM3_CONN_PDI) < 0)
return -1;
return 0;
return jtag3_getsync(pgm, PARM3_CONN_PDI) < 0? -1: 0;
}
static int jtag3_open_updi(PROGRAMMER *pgm, const char *port) {
@@ -1829,13 +1824,11 @@ static int jtag3_open_updi(PROGRAMMER *pgm, const char *port) {
msg_notice2(" %d", *(int *) ldata(ln));
msg_notice2("\n");
if (jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode) < 0)
return -1;
int rc = jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode);
if (rc < 0)
return rc;
if (jtag3_getsync(pgm, PARM3_CONN_UPDI) < 0)
return -1;
return 0;
return jtag3_getsync(pgm, PARM3_CONN_UPDI) < 0? -1: 0;
}
void jtag3_close(PROGRAMMER * pgm) {
@@ -3118,9 +3111,7 @@ static int jtag3_chip_erase_tpi(const PROGRAMMER *pgm, const AVRPART *p) {
static int jtag3_open_tpi(PROGRAMMER *pgm, const char *port) {
pmsg_notice2("jtag3_open_tpi()\n");
if (jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode) < 0)
return -1;
return 0;
return jtag3_open_common(pgm, port, PDATA(pgm)->pk4_snap_mode);
}
void jtag3_close_tpi(PROGRAMMER *pgm) {

View File

@@ -1379,10 +1379,9 @@ extern "C" {
#endif
void *cfg_malloc(const char *funcname, size_t n);
void *cfg_realloc(const char *funcname, void *p, size_t n);
char *cfg_strdup(const char *funcname, const char *s);
void cfg_free(void *ptr);
int init_config(void);

View File

@@ -1243,7 +1243,10 @@ int main(int argc, char * argv [])
pmsg_error("programmer does not support extended parameter -x %s, option ignored\n", extended_param);
}
} else {
if (pgm->parseextparams(pgm, extended_params) < 0) {
int rc = pgm->parseextparams(pgm, extended_params);
if(rc == LIBAVRDUDE_EXIT)
exit(0);
if(rc < 0) {
pmsg_error("unable to parse extended parameter list\n");
exit(1);
}
@@ -1390,6 +1393,11 @@ int main(int argc, char * argv [])
rc = pgm->open(pgm, port);
if (rc < 0) {
if(rc == LIBAVRDUDE_EXIT) {
exitrc = 0;
goto main_exit;
}
pmsg_error("unable to open port %s for programmer %s\n", port, pgmid);
skipopen:
if (print_ports && pgm->conntype == CONNTYPE_SERIAL) {
@@ -1512,6 +1520,10 @@ skipopen:
*/
init_ok = (rc = pgm->initialize(pgm, p)) >= 0;
if (!init_ok) {
if(rc == LIBAVRDUDE_EXIT) {
exitrc = 0;
goto main_exit;
}
pmsg_error("initialization failed, rc=%d\n", rc);
if (rc == -2)
imsg_error("the programmer ISP clock is too fast for the target\n");
@@ -1549,6 +1561,10 @@ skipopen:
usleep(waittime);
if (init_ok) {
rc = avr_signature(pgm, p);
if (rc == LIBAVRDUDE_EXIT) {
exitrc = 0;
goto main_exit;
}
if (rc != LIBAVRDUDE_SUCCESS) {
if (rc == LIBAVRDUDE_SOFTFAIL && (p->prog_modes & PM_UPDI) && attempt < 1) {
attempt++;