Add avrintel.[ch] to the project and warn if mcuid incompatible with avrintel.c

This commit is contained in:
Stefan Rueger 2022-08-30 19:48:17 +01:00
parent b0198a319f
commit 626a43b139
No known key found for this signature in database
GPG Key ID: B0B4F1FD86B1EC55
9 changed files with 6973 additions and 2 deletions

View File

@ -252,6 +252,8 @@ add_executable(avrdude
main.c main.c
term.c term.c
term.h term.h
avrintel.c
avrintel.h
developer_opts.c developer_opts.c
developer_opts.h developer_opts.h
developer_opts_private.h developer_opts_private.h

View File

@ -68,7 +68,7 @@
# id = <id> ; # quoted string # id = <id> ; # quoted string
# family_id = <id> ; # quoted string, eg, "megaAVR" or "tinyAVR" # family_id = <id> ; # quoted string, eg, "megaAVR" or "tinyAVR"
# prog_modes = PM_<i/f> {| PM_<i/f>} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE # prog_modes = PM_<i/f> {| PM_<i/f>} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE
# mcuid = <num>; # unique id in 0..2039 for urclock programmer # mcuid = <num>; # unique id in 0..2039 for 8-bit AVRs
# n_interrupts = <num>; # number of interrupts, used for vector bootloaders # n_interrupts = <num>; # number of interrupts, used for vector bootloaders
# n_page_erase = <num>; # if set, number of pages erased during NVM erase # n_page_erase = <num>; # if set, number of pages erased during NVM erase
# hvupdi_variant = <num> ; # numeric -1 (n/a) or 0..2 # hvupdi_variant = <num> ; # numeric -1 (n/a) or 0..2
@ -13169,6 +13169,7 @@ part
part parent ".reduced_core_tiny" part parent ".reduced_core_tiny"
desc = "ATtiny4"; desc = "ATtiny4";
id = "t4"; id = "t4";
mcuid = 0;
n_interrupts = 10; n_interrupts = 10;
signature = 0x1e 0x8f 0x0a; signature = 0x1e 0x8f 0x0a;

5447
src/avrintel.c Normal file

File diff suppressed because it is too large Load Diff

1477
src/avrintel.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -583,6 +583,7 @@ AVRPART *avr_new_part(void) {
p->mem_alias = lcreat(NULL, 0); p->mem_alias = lcreat(NULL, 0);
// Default values // Default values
p->mcuid = -1;
p->hvupdi_variant = -1; p->hvupdi_variant = -1;
memset(p->signature, 0xFF, 3); memset(p->signature, 0xFF, 3);
p->reset_disposition = RESET_DEDICATED; p->reset_disposition = RESET_DEDICATED;

View File

@ -31,6 +31,7 @@
#include "avrdude.h" #include "avrdude.h"
#include "libavrdude.h" #include "libavrdude.h"
#include "config.h" #include "config.h"
#include "avrintel.h"
#include "config_gram.h" #include "config_gram.h"
@ -834,3 +835,42 @@ void cfg_assign(char *sp, int strct, Component_t *cp, VALUE *v) {
cp->name, cfg_strct_name(strct), cfg_comp_type(cp->type)); cp->name, cfg_strct_name(strct), cfg_comp_type(cp->type));
} }
} }
// Automatically assign an mcuid if known from avrintel.c table
void cfg_update_mcuid(AVRPART *part) {
// Don't assign an mcuid for template parts that has a space in desc
if(!part->desc || *part->desc == 0 || strchr(part->desc, ' '))
return;
// Don't assign an mcuid for template parts where id starts with "."
if(!part->id || !*part->id || *part->id == '.')
return;
// Don't assign an mcuid for 32-bit AVR parts
if(part->prog_modes & PM_aWire)
return;
// Find an entry that shares the same name
for(int i=0; i < sizeof uP_table/sizeof *uP_table; i++) {
if(strcasecmp(part->desc, uP_table[i].name) == 0) {
if(part->mcuid != (int) uP_table[i].mcuid) {
part->mcuid = uP_table[i].mcuid;
yywarning("assigned mcuid = %d to part %s", part->mcuid, part->desc);
}
return;
}
}
// None have the same name: an entry with part->mcuid is an error
for(int i=0; i < sizeof uP_table/sizeof *uP_table; i++)
if(part->mcuid == (int) uP_table[i].mcuid) {
yywarning("mcuid %d is reserved for %s, use a free number >= %d",
part->mcuid, uP_table[i].name, sizeof uP_table/sizeof *uP_table);
return;
}
// Range check
if(part->mcuid < 0 || part->mcuid >= UB_N_MCU)
yywarning("mcuid %d for %s is out of range [0..%d], use a free number >= %d",
part->mcuid, part->desc, UB_N_MCU-1, sizeof uP_table/sizeof *uP_table);
}

View File

@ -161,6 +161,7 @@ const char *cfg_strct_name(int strct);
void cfg_assign(char *sp, int strct, Component_t *cp, VALUE *v); void cfg_assign(char *sp, int strct, Component_t *cp, VALUE *v);
void cfg_update_mcuid(AVRPART *part);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -374,6 +374,8 @@ part_def :
YYABORT; YYABORT;
} }
cfg_update_mcuid(current_part);
// Sanity checks for memory sizes and compute/override num_pages entry // Sanity checks for memory sizes and compute/override num_pages entry
for (ln=lfirst(current_part->mem); ln; ln=lnext(ln)) { for (ln=lfirst(current_part->mem); ln; ln=lnext(ln)) {
m = ldata(ln); m = ldata(ln);

View File

@ -1766,7 +1766,7 @@ part
id = <id> ; # quoted string id = <id> ; # quoted string
family_id = <id> ; # quoted string, eg, "megaAVR" or "tinyAVR" family_id = <id> ; # quoted string, eg, "megaAVR" or "tinyAVR"
prog_modes = PM_<i/f> @{ | PM_<i/f> @} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE prog_modes = PM_<i/f> @{ | PM_<i/f> @} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE
mcuid = <num>; # unique id in 0..2039 for urclock programmer mcuid = <num>; # unique id in 0..2039 for 8-bit AVRs
n_interrupts = <num>; # number of interrupts, used for vector bootloaders n_interrupts = <num>; # number of interrupts, used for vector bootloaders
n_page_erase = <num>; # if set, number of pages erased during NVM erase n_page_erase = <num>; # if set, number of pages erased during NVM erase
hvupdi_variant = <num> ; # numeric -1 (n/a) or 0..2 hvupdi_variant = <num> ; # numeric -1 (n/a) or 0..2