From 13683c1546150c29253a0a5c3d680c3889724ea7 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 11:52:49 +0100 Subject: [PATCH 1/7] Move developer options /c /r to /e /R --- src/developer_opts.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index fa8dd69c..db17d309 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -849,7 +849,7 @@ static int prog_modes_in_flags(int prog_modes, const char *flags) { return (prog_modes == 0 && quirky) || !pm || (prog_modes & pm); } -// -p /[cdoASsrw*tiBUPTIJWHQ] +// -p /[dsASReow*tiBUPTIJWHQ] void dev_output_part_defs(char *partdesc) { bool cmdok, waits, opspi, descs, astrc, strct, cmpst, injct, raw, all, tsv; char *flags; @@ -862,27 +862,27 @@ void dev_output_part_defs(char *partdesc) { if(!flags && str_eq(partdesc, "*")) // Treat -p * as if it was -p */s flags = "s"; - if(!*flags || !strchr("cdoASsrw*tiBUPTIJWHQ", *flags)) { + if(!*flags || !strchr("dsASReow*tiBUPTIJWHQ", *flags)) { dev_info("%s: flags for developer option -p / not recognised\n", progname); dev_info( "Wildcard examples (these need protecting in the shell through quoting):\n" - " * all known parts\n" - " ATtiny10 just this part\n" - " *32[0-9] matches ATmega329, ATmega325 and ATmega328\n" - " *32? matches ATmega329, ATmega32A, ATmega325 and ATmega328\n" + " * all known parts\n" + " ATtiny10 just this part\n" + " *32[0-9] matches ATmega329, ATmega325 and ATmega328\n" + " *32? matches ATmega329, ATmega32A, ATmega325 and ATmega328\n" "Flags (one or more of the characters below):\n" - " d description of core part features\n" - " A show entries of avrdude.conf parts with all values\n" - " S show entries of avrdude.conf parts with necessary values\n" - " s show short entries of avrdude.conf parts using parent\n" - " r show entries of avrdude.conf parts as raw dump\n" - " c check and report errors in address bits of SPI commands\n" - " o opcodes for SPI programming parts and memories\n" - " w wd_... constants for ISP parts\n" - " * as first character: all of the above except s and S\n" - " BUPTIJWHQ only Bootloader/UPDI/PDI/TPI/ISP/JTAG/debugWire/HV/quirky MUCs\n" - " t use tab separated values as much as possible\n" - " i inject assignments from source code table\n" + " d description of core part features\n" + " s show short entries of avrdude.conf parts using parent\n" + " A show entries of avrdude.conf parts with all values\n" + " S show entries of avrdude.conf parts with necessary values\n" + " R show entries of avrdude.conf parts as raw dump\n" + " e check and report errors in address bits of SPI commands\n" + " o opcodes for SPI programming parts and memories\n" + " w wd_... constants for ISP parts\n" + " * as first character: all of the above except s and S\n" + " BUPTIJWHQ only Bootloader/UPDI/PDI/TPI/ISP/JTAG/debugWire/HV/quirky MUCs\n" + " t use tab separated values as much as possible\n" + " i inject assignments from source code table\n" "Examples:\n" " $ avrdude -p ATmega328P/s\n" " $ avrdude -p m328*/st | grep chip_erase_delay\n" @@ -901,12 +901,12 @@ void dev_output_part_defs(char *partdesc) { } all = *flags == '*'; - cmdok = all || !!strchr(flags, 'c'); + cmdok = all || !!strchr(flags, 'e'); descs = all || !!strchr(flags, 'd'); opspi = all || !!strchr(flags, 'o'); waits = all || !!strchr(flags, 'w'); astrc = all || !!strchr(flags, 'A'); - raw = all || !!strchr(flags, 'r'); + raw = all || !!strchr(flags, 'R'); strct = !!strchr(flags, 'S'); cmpst = !!strchr(flags, 's'); tsv = !!strchr(flags, 't'); From 3990fdf84bf9108f8aec9ed7ba455f283748f380 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 11:54:15 +0100 Subject: [PATCH 2/7] Add only classic parts developer options /C --- src/developer_opts.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index db17d309..580316b6 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -834,6 +834,7 @@ static int prog_modes_in_flags(int prog_modes, const char *flags) { for(const char *p = flags; *p; p++) switch(*p) { case 'B': pm |= PM_SPM; break; + case 'C': pm |= PM_TPI | PM_ISP | PM_HVSP | PM_HVPP | PM_debugWIRE | PM_JTAG | PM_JTAGmkI; break; case 'U': pm |= PM_UPDI; break; case 'P': pm |= PM_PDI; break; case 'T': pm |= PM_TPI; break; @@ -849,7 +850,7 @@ static int prog_modes_in_flags(int prog_modes, const char *flags) { return (prog_modes == 0 && quirky) || !pm || (prog_modes & pm); } -// -p /[dsASReow*tiBUPTIJWHQ] +// -p /[dsASReow*tiBCUPTIJWHQ] void dev_output_part_defs(char *partdesc) { bool cmdok, waits, opspi, descs, astrc, strct, cmpst, injct, raw, all, tsv; char *flags; @@ -862,7 +863,7 @@ void dev_output_part_defs(char *partdesc) { if(!flags && str_eq(partdesc, "*")) // Treat -p * as if it was -p */s flags = "s"; - if(!*flags || !strchr("dsASReow*tiBUPTIJWHQ", *flags)) { + if(!*flags || !strchr("dsASReow*tiBCUPTIJWHQ", *flags)) { dev_info("%s: flags for developer option -p / not recognised\n", progname); dev_info( "Wildcard examples (these need protecting in the shell through quoting):\n" @@ -880,7 +881,7 @@ void dev_output_part_defs(char *partdesc) { " o opcodes for SPI programming parts and memories\n" " w wd_... constants for ISP parts\n" " * as first character: all of the above except s and S\n" - " BUPTIJWHQ only Bootloader/UPDI/PDI/TPI/ISP/JTAG/debugWire/HV/quirky MUCs\n" + " BCUPTIJWHQ only Boot/Classic/UPDI/PDI/TPI/ISP/JTAG/debugWire/HV/quirky MUCs\n" " t use tab separated values as much as possible\n" " i inject assignments from source code table\n" "Examples:\n" From bcf88e13d7b4e3bd744c65a56876cdb353b3cc01 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 12:32:37 +0100 Subject: [PATCH 3/7] Add developer option /v for listing interrupt vector names --- src/developer_opts.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index 580316b6..7fe483ca 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -850,9 +850,19 @@ static int prog_modes_in_flags(int prog_modes, const char *flags) { return (prog_modes == 0 && quirky) || !pm || (prog_modes & pm); } -// -p /[dsASReow*tiBCUPTIJWHQ] +// Return pointer to uP_table entry for part p +static const Avrintel *silent_locate_uP(const AVRPART *p) { + int bakverb = verbose, idx; + verbose = -123; + idx = avr_locate_upidx(p); + verbose = bakverb; + + return idx < 0? NULL: uP_table + idx; +} + +// -p /[dsASRveow*tiBCUPTIJWHQ] void dev_output_part_defs(char *partdesc) { - bool cmdok, waits, opspi, descs, astrc, strct, cmpst, injct, raw, all, tsv; + bool cmdok, waits, opspi, descs, vtabs, astrc, strct, cmpst, injct, raw, all, tsv; char *flags; int nprinted; AVRPART *nullpart = avr_new_part(); @@ -863,7 +873,7 @@ void dev_output_part_defs(char *partdesc) { if(!flags && str_eq(partdesc, "*")) // Treat -p * as if it was -p */s flags = "s"; - if(!*flags || !strchr("dsASReow*tiBCUPTIJWHQ", *flags)) { + if(!*flags || !strchr("dsASRveow*tiBCUPTIJWHQ", *flags)) { dev_info("%s: flags for developer option -p / not recognised\n", progname); dev_info( "Wildcard examples (these need protecting in the shell through quoting):\n" @@ -877,6 +887,7 @@ void dev_output_part_defs(char *partdesc) { " A show entries of avrdude.conf parts with all values\n" " S show entries of avrdude.conf parts with necessary values\n" " R show entries of avrdude.conf parts as raw dump\n" + " v show vector table list for parts\n" " e check and report errors in address bits of SPI commands\n" " o opcodes for SPI programming parts and memories\n" " w wd_... constants for ISP parts\n" @@ -902,8 +913,9 @@ void dev_output_part_defs(char *partdesc) { } all = *flags == '*'; - cmdok = all || !!strchr(flags, 'e'); descs = all || !!strchr(flags, 'd'); + vtabs = all || !!strchr(flags, 'v'); + cmdok = all || !!strchr(flags, 'e'); opspi = all || !!strchr(flags, 'o'); waits = all || !!strchr(flags, 'w'); astrc = all || !!strchr(flags, 'A'); @@ -979,6 +991,7 @@ void dev_output_part_defs(char *partdesc) { int ok, nfuses; AVRMEM *m; OPCODE *oc; + const Avrintel *up; ok = 2047; nfuses = 0; @@ -1112,6 +1125,10 @@ void dev_output_part_defs(char *partdesc) { p->config_file, p->lineno ); } + + if(vtabs && (up = silent_locate_uP(p)) && up->isrtable) + for(int i=0; i < up->ninterrupts; i++) + dev_info("%s\t%3d\t%s\n", p->desc, i, up->isrtable[i]); } if(opspi) { From e829a46a49660a9cff0cf4e9f8fc0eb2d3b24cc5 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 13:47:41 +0100 Subject: [PATCH 4/7] Add developer option /c for listing configuration options --- src/developer_opts.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index 7fe483ca..84ef3fb2 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -860,9 +860,9 @@ static const Avrintel *silent_locate_uP(const AVRPART *p) { return idx < 0? NULL: uP_table + idx; } -// -p /[dsASRveow*tiBCUPTIJWHQ] +// -p /[dsASRvceow*tiBCUPTIJWHQ] void dev_output_part_defs(char *partdesc) { - bool cmdok, waits, opspi, descs, vtabs, astrc, strct, cmpst, injct, raw, all, tsv; + bool cmdok, waits, opspi, descs, vtabs, confs, astrc, strct, cmpst, injct, raw, all, tsv; char *flags; int nprinted; AVRPART *nullpart = avr_new_part(); @@ -873,7 +873,7 @@ void dev_output_part_defs(char *partdesc) { if(!flags && str_eq(partdesc, "*")) // Treat -p * as if it was -p */s flags = "s"; - if(!*flags || !strchr("dsASRveow*tiBCUPTIJWHQ", *flags)) { + if(!*flags || !strchr("dsASRvceow*tiBCUPTIJWHQ", *flags)) { dev_info("%s: flags for developer option -p / not recognised\n", progname); dev_info( "Wildcard examples (these need protecting in the shell through quoting):\n" @@ -887,7 +887,8 @@ void dev_output_part_defs(char *partdesc) { " A show entries of avrdude.conf parts with all values\n" " S show entries of avrdude.conf parts with necessary values\n" " R show entries of avrdude.conf parts as raw dump\n" - " v show vector table list for parts\n" + " v list interrupt vector names for parts\n" + " c list configuration options for parts\n" " e check and report errors in address bits of SPI commands\n" " o opcodes for SPI programming parts and memories\n" " w wd_... constants for ISP parts\n" @@ -915,6 +916,7 @@ void dev_output_part_defs(char *partdesc) { all = *flags == '*'; descs = all || !!strchr(flags, 'd'); vtabs = all || !!strchr(flags, 'v'); + confs = all || !!strchr(flags, 'c'); cmdok = all || !!strchr(flags, 'e'); opspi = all || !!strchr(flags, 'o'); waits = all || !!strchr(flags, 'w'); @@ -1129,6 +1131,21 @@ void dev_output_part_defs(char *partdesc) { if(vtabs && (up = silent_locate_uP(p)) && up->isrtable) for(int i=0; i < up->ninterrupts; i++) dev_info("%s\t%3d\t%s\n", p->desc, i, up->isrtable[i]); + + if(confs && (up = silent_locate_uP(p)) && up->cfgtable) + for(int i=0; i < up->nconfigs; i++) { + const Configitem *cp = up->cfgtable+i; + unsigned c, n = cp->nvalues; + if(!n || !cp->vlist) { // Count bits set in mask + for(n = cp->mask, c=0; n; c++) + n &= n-1; + n = 1<desc, n, cp->name); + if(cp->vlist && verbose) + for(int k=0; k < cp->nvalues; k++) + dev_info("%s\t\tvalue\t%3d\t%s\n", p->desc, cp->vlist[k].value, cp->vlist[k].label); + } } if(opspi) { From 9a79a6866f168d3a55a3882e801540f7c73fbb72 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 13:54:30 +0100 Subject: [PATCH 5/7] Check dev_info() format at gnuc compile time --- src/developer_opts.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index 84ef3fb2..618c4476 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -214,6 +214,9 @@ static char *dev_sprintf(const char *fmt, ...) { static int dev_nprinted; +#if defined(__GNUC__) + __attribute__ ((format (printf, 2, 3))) +#endif int dev_message(int msglvl, const char *fmt, ...) { va_list ap; int rc = 0; @@ -530,7 +533,7 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool if(!cp || !dev_has_subsstr_comms(cp->comms, del)) { dev_info("%s\n", del); - dev_info("# %.*s\n", strlen(descstr)-2, descstr+1); // Remove double quotes + dev_info("# %.*s\n", (int) strlen(descstr)-2, descstr+1); // Remove double quotes dev_info("%s\n\n", del); } if(cp) @@ -689,7 +692,7 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool bm = base? dev_locate_mem(base, avr_mem_order[mi].str): NULL; if(!m && bm && !tsv) - dev_info("\n memory \"%s\" %*s= NULL;\n", bm->desc, 13 > strlen(bm->desc)? 13-strlen(bm->desc): 0, ""); + dev_info("\n memory \"%s\" %*s= NULL;\n", bm->desc, 13 > strlen(bm->desc)? 13 - (int) strlen(bm->desc): 0, ""); if(!m) continue; @@ -1298,7 +1301,7 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas if(!firstid) dev_info("/"); firstid = 0; - dev_info("%s", ldata(ln)); + dev_info("%s", (char *) ldata(ln)); } dev_info("\n%s\n\n", del); } @@ -1307,9 +1310,9 @@ static void dev_pgm_strct(const PROGRAMMER *pgm, bool tsv, const PROGRAMMER *bas const char *prog_sea = is_programmer(pgm)? "programmer": is_serialadapter(pgm)? "serialadapter": "programmer"; if(pgm->parent_id && *pgm->parent_id) - dev_info("%s parent \"%s\" # %s\n", prog_sea, pgm->parent_id, ldata(lfirst(pgm->id))); + dev_info("%s parent \"%s\" # %s\n", prog_sea, pgm->parent_id, (char *) ldata(lfirst(pgm->id))); else - dev_info("%s # %s\n", prog_sea, ldata(lfirst(pgm->id))); + dev_info("%s # %s\n", prog_sea, (char *) ldata(lfirst(pgm->id))); } if(tsv) From 95dac08ccd37a0f87965bef78457ea548e1eaa51 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 16:34:24 +0100 Subject: [PATCH 6/7] Add developer option /r for listing registers --- src/developer_opts.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index 618c4476..b24c8a07 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -863,9 +863,9 @@ static const Avrintel *silent_locate_uP(const AVRPART *p) { return idx < 0? NULL: uP_table + idx; } -// -p /[dsASRvceow*tiBCUPTIJWHQ] +// -p /[dsASRvcreow*tiBCUPTIJWHQ] void dev_output_part_defs(char *partdesc) { - bool cmdok, waits, opspi, descs, vtabs, confs, astrc, strct, cmpst, injct, raw, all, tsv; + bool cmdok, waits, opspi, descs, vtabs, confs, regis, astrc, strct, cmpst, injct, raw, all, tsv; char *flags; int nprinted; AVRPART *nullpart = avr_new_part(); @@ -876,7 +876,7 @@ void dev_output_part_defs(char *partdesc) { if(!flags && str_eq(partdesc, "*")) // Treat -p * as if it was -p */s flags = "s"; - if(!*flags || !strchr("dsASRvceow*tiBCUPTIJWHQ", *flags)) { + if(!*flags || !strchr("dsASRvcreow*tiBCUPTIJWHQ", *flags)) { dev_info("%s: flags for developer option -p / not recognised\n", progname); dev_info( "Wildcard examples (these need protecting in the shell through quoting):\n" @@ -890,8 +890,9 @@ void dev_output_part_defs(char *partdesc) { " A show entries of avrdude.conf parts with all values\n" " S show entries of avrdude.conf parts with necessary values\n" " R show entries of avrdude.conf parts as raw dump\n" - " v list interrupt vector names for parts\n" - " c list configuration options for parts\n" + " v list interrupt vector names\n" + " c list configuration options in fuses\n" + " r list registers with I/O address and size\n" " e check and report errors in address bits of SPI commands\n" " o opcodes for SPI programming parts and memories\n" " w wd_... constants for ISP parts\n" @@ -910,7 +911,7 @@ void dev_output_part_defs(char *partdesc) { " Leaving no space after -p can be an OK substitute for quoting in shells\n" " /s, /S and /A outputs are designed to be used as input in avrdude.conf\n" " Sorted /r output should stay invariant when rearranging avrdude.conf\n" - " The /c, /o and /w flags are less generic and may be removed sometime\n" + " The /e, /o and /w flags are less generic and may be removed sometime\n" " These options are just to help development, so not further documented\n" ); return; @@ -920,6 +921,7 @@ void dev_output_part_defs(char *partdesc) { descs = all || !!strchr(flags, 'd'); vtabs = all || !!strchr(flags, 'v'); confs = all || !!strchr(flags, 'c'); + regis = all || !!strchr(flags, 'r'); cmdok = all || !!strchr(flags, 'e'); opspi = all || !!strchr(flags, 'o'); waits = all || !!strchr(flags, 'w'); @@ -1149,6 +1151,10 @@ void dev_output_part_defs(char *partdesc) { for(int k=0; k < cp->nvalues; k++) dev_info("%s\t\tvalue\t%3d\t%s\n", p->desc, cp->vlist[k].value, cp->vlist[k].label); } + + if(regis && (up = silent_locate_uP(p)) && up->regf) + for(int i=0; i < up->nregisters; i++) + dev_info("%s\t0x%02x\t%d\t%s\n", p->desc, up->regf[i].addr, up->regf[i].size, up->regf[i].reg); } if(opspi) { From e3da82b1ec952fa26d82f23b42e1e32737235bb3 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Fri, 28 Jun 2024 16:35:32 +0100 Subject: [PATCH 7/7] Mark output of /vcr dev options for automated processing --- src/developer_opts.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/developer_opts.c b/src/developer_opts.c index b24c8a07..63bec49d 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -1135,7 +1135,7 @@ void dev_output_part_defs(char *partdesc) { if(vtabs && (up = silent_locate_uP(p)) && up->isrtable) for(int i=0; i < up->ninterrupts; i++) - dev_info("%s\t%3d\t%s\n", p->desc, i, up->isrtable[i]); + dev_info(".vtab\t%s\t%d\t%s\n", p->desc, i, up->isrtable[i]); if(confs && (up = silent_locate_uP(p)) && up->cfgtable) for(int i=0; i < up->nconfigs; i++) { @@ -1146,15 +1146,15 @@ void dev_output_part_defs(char *partdesc) { n &= n-1; n = 1<desc, n, cp->name); + dev_info(".cfgt\t%s\t%d\t%s\n", p->desc, n, cp->name); if(cp->vlist && verbose) for(int k=0; k < cp->nvalues; k++) - dev_info("%s\t\tvalue\t%3d\t%s\n", p->desc, cp->vlist[k].value, cp->vlist[k].label); + dev_info(".cfgv\t%s\t\tvalue\t%d\t%s\n", p->desc, cp->vlist[k].value, cp->vlist[k].label); } if(regis && (up = silent_locate_uP(p)) && up->regf) for(int i=0; i < up->nregisters; i++) - dev_info("%s\t0x%02x\t%d\t%s\n", p->desc, up->regf[i].addr, up->regf[i].size, up->regf[i].reg); + dev_info(".regf\t%s\t0x%02x\t%d\t%s\n", p->desc, up->regf[i].addr, up->regf[i].size, up->regf[i].reg); } if(opspi) {